@mocanvas/editor 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/geometry/index.ts","../src/records/base.ts","../src/records/binding.ts","../src/records/asset.ts","../src/editor/events.ts","../src/tools/StateNode.ts","../src/tools/RootState.ts","../src/editor/HandleTable.ts","../src/editor/TextureManager.ts","../src/records/presence.ts","../src/records/styles.ts","../src/records/styleProp.ts","../src/editor/HistoryManager.ts","../src/editor/SnapManager.ts","../src/editor/Editor.ts","../src/editor/createStore.ts","../src/editor/selectionHandles.ts","../src/records/normalize.ts","../src/bindings/BindingUtil.ts","../src/shapes/ShapeUtil.ts","../src/render/clip.ts","../src/render/webgl2.ts","../src/react/EditorContext.tsx","../src/react/useCanvasEvents.ts","../src/react/Canvas.tsx"],"names":["createRecordType","atom","transact","computed","b","sourceSize","reactSignal","OverlayLayer","OverlayShape","DefaultIndicators","SnapLines","DefaultBrush"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Shape geometry as seen by ShapeUtils. Every geometry serializes to the flat\n * path encoding the engine consumes, and offers a small set of TS-side helpers\n * for tools that need geometry without a round trip (e.g. handle placement).\n */\nimport { PATH_OP } from \"@mocanvas/wasm\"\n\nexport interface VecLike {\n x: number\n y: number\n}\n\nexport interface BoxLike {\n x: number\n y: number\n w: number\n h: number\n}\n\nexport class Vec {\n constructor(\n public x = 0,\n public y = 0,\n ) {}\n static From(p: VecLike): Vec {\n return new Vec(p.x, p.y)\n }\n static Add(a: VecLike, b: VecLike): Vec {\n return new Vec(a.x + b.x, a.y + b.y)\n }\n static Sub(a: VecLike, b: VecLike): Vec {\n return new Vec(a.x - b.x, a.y - b.y)\n }\n static Mul(a: VecLike, s: number): Vec {\n return new Vec(a.x * s, a.y * s)\n }\n static Div(a: VecLike, s: number): Vec {\n return new Vec(a.x / s, a.y / s)\n }\n static Dist(a: VecLike, b: VecLike): number {\n return Math.hypot(a.x - b.x, a.y - b.y)\n }\n static Dist2(a: VecLike, b: VecLike): number {\n const dx = a.x - b.x\n const dy = a.y - b.y\n return dx * dx + dy * dy\n }\n static Len(a: VecLike): number {\n return Math.hypot(a.x, a.y)\n }\n static Dot(a: VecLike, b: VecLike): number {\n return a.x * b.x + a.y * b.y\n }\n static Cross(a: VecLike, b: VecLike): number {\n return a.x * b.y - a.y * b.x\n }\n static Lrp(a: VecLike, b: VecLike, t: number): Vec {\n return new Vec(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t)\n }\n static Angle(a: VecLike, b: VecLike): number {\n return Math.atan2(b.y - a.y, b.x - a.x)\n }\n static Rot(a: VecLike, r: number): Vec {\n const s = Math.sin(r)\n const c = Math.cos(r)\n return new Vec(a.x * c - a.y * s, a.x * s + a.y * c)\n }\n static RotWith(a: VecLike, center: VecLike, r: number): Vec {\n const p = Vec.Rot(Vec.Sub(a, center), r)\n return new Vec(p.x + center.x, p.y + center.y)\n }\n static Uni(a: VecLike): Vec {\n const l = Vec.Len(a)\n return l === 0 ? new Vec() : Vec.Div(a, l)\n }\n static Per(a: VecLike): Vec {\n return new Vec(-a.y, a.x)\n }\n static Equals(a: VecLike, b: VecLike): boolean {\n return a.x === b.x && a.y === b.y\n }\n static NearestPointOnLineSegment(a: VecLike, b: VecLike, p: VecLike): Vec {\n const ab = Vec.Sub(b, a)\n const l2 = Vec.Dot(ab, ab)\n if (l2 === 0) return Vec.From(a)\n const t = Math.max(0, Math.min(1, Vec.Dot(Vec.Sub(p, a), ab) / l2))\n return Vec.Add(a, Vec.Mul(ab, t))\n }\n static DistanceToLineSegment(a: VecLike, b: VecLike, p: VecLike): number {\n return Vec.Dist(p, Vec.NearestPointOnLineSegment(a, b, p))\n }\n add(b: VecLike): this {\n this.x += b.x\n this.y += b.y\n return this\n }\n sub(b: VecLike): this {\n this.x -= b.x\n this.y -= b.y\n return this\n }\n mul(s: number): this {\n this.x *= s\n this.y *= s\n return this\n }\n clone(): Vec {\n return new Vec(this.x, this.y)\n }\n toJson(): VecLike {\n return { x: this.x, y: this.y }\n }\n}\n\nexport class Box {\n constructor(\n public x = 0,\n public y = 0,\n public w = 0,\n public h = 0,\n ) {}\n static From(b: BoxLike): Box {\n return new Box(b.x, b.y, b.w, b.h)\n }\n static FromPoints(points: VecLike[]): Box {\n if (points.length === 0) return new Box()\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const p of points) {\n if (p.x < minX) minX = p.x\n if (p.y < minY) minY = p.y\n if (p.x > maxX) maxX = p.x\n if (p.y > maxY) maxY = p.y\n }\n return new Box(minX, minY, maxX - minX, maxY - minY)\n }\n static FromMinMax(minX: number, minY: number, maxX: number, maxY: number): Box {\n return new Box(minX, minY, maxX - minX, maxY - minY)\n }\n static Common(boxes: BoxLike[]): Box {\n if (boxes.length === 0) return new Box()\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const b of boxes) {\n minX = Math.min(minX, b.x)\n minY = Math.min(minY, b.y)\n maxX = Math.max(maxX, b.x + b.w)\n maxY = Math.max(maxY, b.y + b.h)\n }\n return Box.FromMinMax(minX, minY, maxX, maxY)\n }\n static Contains(a: BoxLike, b: BoxLike): boolean {\n return b.x >= a.x && b.y >= a.y && b.x + b.w <= a.x + a.w && b.y + b.h <= a.y + a.h\n }\n static ContainsPoint(a: BoxLike, p: VecLike, margin = 0): boolean {\n return p.x >= a.x - margin && p.y >= a.y - margin && p.x <= a.x + a.w + margin && p.y <= a.y + a.h + margin\n }\n static Collides(a: BoxLike, b: BoxLike): boolean {\n return a.x <= b.x + b.w && a.x + a.w >= b.x && a.y <= b.y + b.h && a.y + a.h >= b.y\n }\n static Expand(a: BoxLike, d: number): Box {\n return new Box(a.x - d, a.y - d, a.w + 2 * d, a.h + 2 * d)\n }\n get minX(): number {\n return this.x\n }\n get minY(): number {\n return this.y\n }\n get maxX(): number {\n return this.x + this.w\n }\n get maxY(): number {\n return this.y + this.h\n }\n get width(): number {\n return this.w\n }\n get height(): number {\n return this.h\n }\n get center(): Vec {\n return new Vec(this.x + this.w / 2, this.y + this.h / 2)\n }\n get corners(): Vec[] {\n return [\n new Vec(this.x, this.y),\n new Vec(this.maxX, this.y),\n new Vec(this.maxX, this.maxY),\n new Vec(this.x, this.maxY),\n ]\n }\n clone(): Box {\n return new Box(this.x, this.y, this.w, this.h)\n }\n toJson(): BoxLike {\n return { x: this.x, y: this.y, w: this.w, h: this.h }\n }\n}\n\nexport interface Geometry2dOptions {\n isFilled: boolean\n isClosed: boolean\n isLabel?: boolean\n}\n\n/** Base class for shape geometry. */\nexport abstract class Geometry2d {\n readonly isFilled: boolean\n readonly isClosed: boolean\n readonly isLabel: boolean\n private _vertices: Vec[] | undefined\n private _bounds: Box | undefined\n\n constructor(opts: Geometry2dOptions) {\n this.isFilled = opts.isFilled\n this.isClosed = opts.isClosed\n this.isLabel = opts.isLabel ?? false\n }\n\n /** Flattened outline vertices in shape-local space. */\n abstract getVertices(): Vec[]\n /** Serialize to the engine's flat path encoding. */\n abstract toPathWords(): number[]\n\n get vertices(): Vec[] {\n return (this._vertices ??= this.getVertices())\n }\n\n get bounds(): Box {\n return (this._bounds ??= Box.FromPoints(this.vertices))\n }\n\n get center(): Vec {\n return this.bounds.center\n }\n\n nearestPoint(point: VecLike): Vec {\n const v = this.vertices\n if (v.length === 0) return new Vec()\n if (v.length === 1) return v[0]!.clone()\n let best = v[0]!\n let bestD = Infinity\n const n = this.isClosed ? v.length : v.length - 1\n for (let i = 0; i < n; i++) {\n const a = v[i]!\n const b = v[(i + 1) % v.length]!\n const p = Vec.NearestPointOnLineSegment(a, b, point)\n const d = Vec.Dist2(p, point)\n if (d < bestD) {\n bestD = d\n best = p\n }\n }\n return best\n }\n\n distanceToPoint(point: VecLike, hitInside = false): number {\n const d = Vec.Dist(point, this.nearestPoint(point))\n if (hitInside && this.isClosed && this.isFilled && pointInPolygon(point, this.vertices)) return -d\n return d\n }\n\n hitTestPoint(point: VecLike, margin = 0, hitInside = false): boolean {\n if (hitInside && this.isClosed && pointInPolygon(point, this.vertices)) return true\n return Vec.Dist(point, this.nearestPoint(point)) <= margin\n }\n}\n\nexport function pointInPolygon(p: VecLike, poly: VecLike[]): boolean {\n let inside = false\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n const a = poly[i]!\n const b = poly[j]!\n if (a.y > p.y !== b.y > p.y && p.x < ((b.x - a.x) * (p.y - a.y)) / (b.y - a.y) + a.x) inside = !inside\n }\n return inside\n}\n\nfunction polygonWords(points: VecLike[], close: boolean): number[] {\n const out: number[] = []\n if (points.length === 0) return out\n out.push(PATH_OP.MOVE, points[0]!.x, points[0]!.y)\n for (let i = 1; i < points.length; i++) out.push(PATH_OP.LINE, points[i]!.x, points[i]!.y)\n if (close) out.push(PATH_OP.CLOSE)\n return out\n}\n\nexport class Rectangle2d extends Geometry2d {\n readonly x: number\n readonly y: number\n readonly w: number\n readonly h: number\n constructor(opts: { x?: number; y?: number; width: number; height: number; isFilled: boolean; isLabel?: boolean }) {\n super({ isFilled: opts.isFilled, isClosed: true, ...(opts.isLabel !== undefined ? { isLabel: opts.isLabel } : {}) })\n this.x = opts.x ?? 0\n this.y = opts.y ?? 0\n this.w = opts.width\n this.h = opts.height\n }\n getVertices(): Vec[] {\n return new Box(this.x, this.y, this.w, this.h).corners\n }\n toPathWords(): number[] {\n return polygonWords(this.getVertices(), true)\n }\n}\n\nconst KAPPA = 0.5522848\n\nexport class Ellipse2d extends Geometry2d {\n readonly w: number\n readonly h: number\n constructor(opts: { width: number; height: number; isFilled: boolean }) {\n super({ isFilled: opts.isFilled, isClosed: true })\n this.w = opts.width\n this.h = opts.height\n }\n getVertices(): Vec[] {\n const rx = this.w / 2\n const ry = this.h / 2\n const n = Math.max(16, Math.min(128, Math.ceil((rx + ry) / 4)))\n const out: Vec[] = []\n for (let i = 0; i < n; i++) {\n const t = (i / n) * Math.PI * 2\n out.push(new Vec(rx + rx * Math.cos(t), ry + ry * Math.sin(t)))\n }\n return out\n }\n toPathWords(): number[] {\n const rx = this.w / 2\n const ry = this.h / 2\n const cx = rx\n const cy = ry\n const kx = KAPPA * rx\n const ky = KAPPA * ry\n const C = PATH_OP.CUBIC\n return [\n PATH_OP.MOVE, cx + rx, cy,\n C, cx + rx, cy + ky, cx + kx, cy + ry, cx, cy + ry,\n C, cx - kx, cy + ry, cx - rx, cy + ky, cx - rx, cy,\n C, cx - rx, cy - ky, cx - kx, cy - ry, cx, cy - ry,\n C, cx + kx, cy - ry, cx + rx, cy - ky, cx + rx, cy,\n PATH_OP.CLOSE,\n ]\n }\n}\n\nexport class Circle2d extends Ellipse2d {\n constructor(opts: { radius: number; isFilled: boolean }) {\n super({ width: opts.radius * 2, height: opts.radius * 2, isFilled: opts.isFilled })\n }\n}\n\nexport class Polygon2d extends Geometry2d {\n readonly points: Vec[]\n constructor(opts: { points: VecLike[]; isFilled: boolean }) {\n super({ isFilled: opts.isFilled, isClosed: true })\n this.points = opts.points.map(Vec.From)\n }\n getVertices(): Vec[] {\n return this.points\n }\n toPathWords(): number[] {\n return polygonWords(this.points, true)\n }\n}\n\nexport class Polyline2d extends Geometry2d {\n readonly points: Vec[]\n constructor(opts: { points: VecLike[] }) {\n super({ isFilled: false, isClosed: false })\n this.points = opts.points.map(Vec.From)\n }\n getVertices(): Vec[] {\n return this.points\n }\n toPathWords(): number[] {\n return polygonWords(this.points, false)\n }\n}\n\nexport class Edge2d extends Polyline2d {\n constructor(opts: { start: VecLike; end: VecLike }) {\n super({ points: [opts.start, opts.end] })\n }\n}\n\n/** Cubic bézier spline through control points, serialized natively. */\nexport class CubicSpline2d extends Geometry2d {\n readonly segments: { p0: Vec; c1: Vec; c2: Vec; p1: Vec }[]\n constructor(opts: { segments: { p0: VecLike; c1: VecLike; c2: VecLike; p1: VecLike }[]; isClosed?: boolean; isFilled?: boolean }) {\n super({ isFilled: opts.isFilled ?? false, isClosed: opts.isClosed ?? false })\n this.segments = opts.segments.map((s) => ({ p0: Vec.From(s.p0), c1: Vec.From(s.c1), c2: Vec.From(s.c2), p1: Vec.From(s.p1) }))\n }\n getVertices(): Vec[] {\n const out: Vec[] = []\n for (const s of this.segments) {\n const n = 12\n for (let i = 0; i < n; i++) {\n const t = i / n\n const u = 1 - t\n out.push(\n new Vec(\n u * u * u * s.p0.x + 3 * u * u * t * s.c1.x + 3 * u * t * t * s.c2.x + t * t * t * s.p1.x,\n u * u * u * s.p0.y + 3 * u * u * t * s.c1.y + 3 * u * t * t * s.c2.y + t * t * t * s.p1.y,\n ),\n )\n }\n }\n const last = this.segments.at(-1)\n if (last) out.push(last.p1.clone())\n return out\n }\n toPathWords(): number[] {\n const out: number[] = []\n const first = this.segments[0]\n if (!first) return out\n out.push(PATH_OP.MOVE, first.p0.x, first.p0.y)\n for (const s of this.segments) out.push(PATH_OP.CUBIC, s.c1.x, s.c1.y, s.c2.x, s.c2.y, s.p1.x, s.p1.y)\n if (this.isClosed) out.push(PATH_OP.CLOSE)\n return out\n }\n}\n\n/** Several geometries drawn as one shape (e.g. a geo shape and its label). */\nexport class Group2d extends Geometry2d {\n readonly children: Geometry2d[]\n constructor(opts: { children: Geometry2d[] }) {\n super({ isFilled: opts.children.some((c) => c.isFilled), isClosed: opts.children.some((c) => c.isClosed) })\n this.children = opts.children\n }\n getVertices(): Vec[] {\n return this.children.flatMap((c) => c.vertices)\n }\n toPathWords(): number[] {\n return this.children.filter((c) => !c.isLabel).flatMap((c) => c.toPathWords())\n }\n override nearestPoint(point: VecLike): Vec {\n let best = new Vec()\n let bestD = Infinity\n for (const c of this.children) {\n const p = c.nearestPoint(point)\n const d = Vec.Dist2(p, point)\n if (d < bestD) {\n bestD = d\n best = p\n }\n }\n return best\n }\n override hitTestPoint(point: VecLike, margin = 0, hitInside = false): boolean {\n return this.children.some((c) => c.hitTestPoint(point, margin, hitInside))\n }\n}\n","import type { IndexKey, RecordId } from \"@mocanvas/store\"\nimport { createRecordType } from \"@mocanvas/store\"\n\nexport type JsonPrimitive = string | number | boolean | null\nexport type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }\nexport type JsonObject = { [key: string]: JsonValue }\n\nexport interface Document {\n readonly id: DocumentId\n readonly typeName: \"document\"\n gridSize: number\n name: string\n meta: JsonObject\n}\nexport type DocumentId = RecordId<Document>\nexport const DocumentRecordType = createRecordType<Document>(\"document\", { scope: \"document\" }).withDefaultProperties(\n () => ({ gridSize: 10, name: \"\", meta: {} }),\n)\nexport const DOCUMENT_ID = DocumentRecordType.createId(\"document\")\n\nexport interface Page {\n readonly id: PageId\n readonly typeName: \"page\"\n name: string\n index: IndexKey\n meta: JsonObject\n}\nexport type PageId = RecordId<Page>\nexport const PageRecordType = createRecordType<Page>(\"page\", { scope: \"document\" }).withDefaultProperties(() => ({\n meta: {},\n}))\nexport function isPageId(id: string): id is PageId {\n return id.startsWith(\"page:\")\n}\n\nexport interface Camera {\n readonly id: CameraId\n readonly typeName: \"camera\"\n x: number\n y: number\n z: number\n meta: JsonObject\n}\nexport type CameraId = RecordId<Camera>\nexport const CameraRecordType = createRecordType<Camera>(\"camera\", { scope: \"session\" }).withDefaultProperties(() => ({\n x: 0,\n y: 0,\n z: 1,\n meta: {},\n}))\n\nexport interface Instance {\n readonly id: InstanceId\n readonly typeName: \"instance\"\n currentPageId: PageId\n followingUserId: string | null\n isFocusMode: boolean\n isDebugMode: boolean\n isToolLocked: boolean\n isGridMode: boolean\n isReadonly: boolean\n isFocused: boolean\n isPenMode: boolean\n isChangingStyle: boolean\n exportBackground: boolean\n screenBounds: { x: number; y: number; w: number; h: number }\n insets: boolean[]\n cursor: { type: string; rotation: number }\n scribbles: Scribble[]\n brush: { x: number; y: number; w: number; h: number } | null\n zoomBrush: { x: number; y: number; w: number; h: number } | null\n openMenus: string[]\n devicePixelRatio: number\n isCoarsePointer: boolean\n isHoveringCanvas: boolean | null\n stylesForNextShape: Record<string, unknown>\n duplicateProps: { shapeIds: string[]; offset: { x: number; y: number } } | null\n meta: JsonObject\n}\nexport type InstanceId = RecordId<Instance>\nexport interface Scribble {\n id: string\n points: { x: number; y: number; z?: number }[]\n size: number\n color: string\n opacity: number\n state: \"starting\" | \"paused\" | \"active\" | \"stopping\"\n delay: number\n shrink: number\n taper: boolean\n}\nexport const InstanceRecordType = createRecordType<Instance>(\"instance\", { scope: \"session\" }).withDefaultProperties(\n () => ({\n followingUserId: null,\n isFocusMode: false,\n isDebugMode: false,\n isToolLocked: false,\n isGridMode: false,\n isReadonly: false,\n isFocused: false,\n isPenMode: false,\n isChangingStyle: false,\n exportBackground: true,\n screenBounds: { x: 0, y: 0, w: 1080, h: 720 },\n insets: [false, false, false, false],\n cursor: { type: \"default\", rotation: 0 },\n scribbles: [],\n brush: null,\n zoomBrush: null,\n openMenus: [],\n devicePixelRatio: typeof window === \"undefined\" ? 1 : window.devicePixelRatio,\n isCoarsePointer: false,\n isHoveringCanvas: null,\n stylesForNextShape: {},\n duplicateProps: null,\n meta: {},\n }),\n)\nexport const INSTANCE_ID = InstanceRecordType.createId(\"instance\")\n\nexport interface InstancePageState {\n readonly id: InstancePageStateId\n readonly typeName: \"instance_page_state\"\n pageId: PageId\n selectedShapeIds: ShapeId[]\n hintingShapeIds: ShapeId[]\n erasingShapeIds: ShapeId[]\n hoveredShapeId: ShapeId | null\n editingShapeId: ShapeId | null\n croppingShapeId: ShapeId | null\n focusedGroupId: ShapeId | null\n meta: JsonObject\n}\nexport type InstancePageStateId = RecordId<InstancePageState>\nexport const InstancePageStateRecordType = createRecordType<InstancePageState>(\"instance_page_state\", {\n scope: \"session\",\n}).withDefaultProperties(() => ({\n selectedShapeIds: [],\n hintingShapeIds: [],\n erasingShapeIds: [],\n hoveredShapeId: null,\n editingShapeId: null,\n croppingShapeId: null,\n focusedGroupId: null,\n meta: {},\n}))\n\n// ---- shapes ----------------------------------------------------------------\n\nexport interface BaseShape<Type extends string, Props extends object> {\n readonly id: ShapeId\n readonly typeName: \"shape\"\n type: Type\n x: number\n y: number\n rotation: number\n index: IndexKey\n parentId: ParentId\n isLocked: boolean\n opacity: number\n props: Props\n meta: JsonObject\n}\nexport type UnknownShape = BaseShape<string, object>\nexport type Shape = UnknownShape\nexport type ShapeId = RecordId<UnknownShape>\nexport type ParentId = PageId | ShapeId\n\nexport const ShapeRecordType = createRecordType<UnknownShape>(\"shape\", { scope: \"document\" }).withDefaultProperties(\n () => ({ x: 0, y: 0, rotation: 0, isLocked: false, opacity: 1, meta: {} }),\n)\n\nexport function createShapeId(id?: string): ShapeId {\n return ShapeRecordType.createId(id) as ShapeId\n}\nexport function isShapeId(id: unknown): id is ShapeId {\n return typeof id === \"string\" && id.startsWith(\"shape:\")\n}\nexport function isShape(record: unknown): record is UnknownShape {\n return typeof record === \"object\" && record !== null && (record as { typeName?: string }).typeName === \"shape\"\n}\n\nexport type ShapePartial<T extends UnknownShape = UnknownShape> = {\n id: ShapeId\n type: T[\"type\"]\n} & Partial<Omit<T, \"id\" | \"type\" | \"props\" | \"meta\">> & {\n props?: Partial<T[\"props\"]>\n meta?: Partial<T[\"meta\"]>\n }\n\n/** A shape partial without a required id (id and index are assigned on create). */\nexport type ShapeCreate<T extends UnknownShape = UnknownShape> = Omit<ShapePartial<T>, \"id\"> & { id?: ShapeId }\n","import type { RecordId } from \"@mocanvas/store\"\nimport { createRecordType } from \"@mocanvas/store\"\nimport type { JsonObject, ShapeId } from \"./base\"\n\n/** A directed relationship between two shapes (e.g. an arrow end attached to a shape). */\nexport interface BaseBinding<Type extends string, Props extends object> {\n readonly id: BindingId\n readonly typeName: \"binding\"\n type: Type\n fromId: ShapeId\n toId: ShapeId\n props: Props\n meta: JsonObject\n}\nexport type UnknownBinding = BaseBinding<string, object>\nexport type Binding = UnknownBinding\nexport type BindingId = RecordId<UnknownBinding>\n\nexport const BindingRecordType = createRecordType<UnknownBinding>(\"binding\", { scope: \"document\" }).withDefaultProperties(\n () => ({ meta: {} }),\n)\n\nexport function createBindingId(id?: string): BindingId {\n return BindingRecordType.createId(id) as BindingId\n}\nexport function isBindingId(id: unknown): id is BindingId {\n return typeof id === \"string\" && id.startsWith(\"binding:\")\n}\nexport function isBinding(record: unknown): record is UnknownBinding {\n return typeof record === \"object\" && record !== null && (record as { typeName?: string }).typeName === \"binding\"\n}\n\nexport type BindingCreate<B extends UnknownBinding = UnknownBinding> = {\n id?: BindingId\n type: B[\"type\"]\n fromId: ShapeId\n toId: ShapeId\n props?: Partial<B[\"props\"]>\n meta?: Partial<B[\"meta\"]>\n}\n\nexport type BindingPartial<B extends UnknownBinding = UnknownBinding> = {\n id: BindingId\n type: B[\"type\"]\n} & Partial<Omit<B, \"id\" | \"type\" | \"props\" | \"meta\">> & {\n props?: Partial<B[\"props\"]>\n meta?: Partial<B[\"meta\"]>\n }\n","import type { RecordId } from \"@mocanvas/store\"\nimport { createRecordType } from \"@mocanvas/store\"\nimport type { JsonObject } from \"./base\"\n\n/** Pixel dimensions and source of an image file. `src` is a URL or data URL; `null` while uploading. */\nexport interface ImageAssetProps {\n w: number\n h: number\n name: string\n isAnimated: boolean\n mimeType: string | null\n src: string | null\n fileSize?: number\n}\n\nexport type VideoAssetProps = ImageAssetProps\n\nexport interface BookmarkAssetProps {\n title: string\n description: string\n image: string\n favicon: string\n src: string | null\n}\n\n/** A document-scoped record describing external media referenced by shapes (images, videos, bookmarks). */\nexport interface BaseAsset<Type extends string, Props extends object> {\n readonly id: AssetId\n readonly typeName: \"asset\"\n type: Type\n props: Props\n meta: JsonObject\n}\n\nexport type ImageAsset = BaseAsset<\"image\", ImageAssetProps>\nexport type VideoAsset = BaseAsset<\"video\", VideoAssetProps>\nexport type BookmarkAsset = BaseAsset<\"bookmark\", BookmarkAssetProps>\nexport type Asset = ImageAsset | VideoAsset | BookmarkAsset\nexport type AssetType = Asset[\"type\"]\nexport type AssetId = RecordId<Asset>\n\nexport const AssetRecordType = createRecordType<Asset>(\"asset\", { scope: \"document\" }).withDefaultProperties(() => ({\n meta: {},\n}))\n\nexport function createAssetId(id?: string): AssetId {\n return AssetRecordType.createId(id) as AssetId\n}\nexport function isAssetId(id: unknown): id is AssetId {\n return typeof id === \"string\" && id.startsWith(\"asset:\")\n}\nexport function isAsset(record: unknown): record is Asset {\n return typeof record === \"object\" && record !== null && (record as { typeName?: string }).typeName === \"asset\"\n}\n\n/** An asset to create: `id` and `meta` are optional, `props` must be complete. */\nexport type AssetCreate<A extends Asset = Asset> = {\n id?: AssetId\n type: A[\"type\"]\n props: A[\"props\"]\n meta?: Partial<A[\"meta\"]>\n}\n\nexport type AssetPartial<A extends Asset = Asset> = {\n id: AssetId\n type: A[\"type\"]\n props?: Partial<A[\"props\"]>\n meta?: Partial<A[\"meta\"]>\n}\n\n// ---- external content ------------------------------------------------------\n\n/** Content dropped or pasted onto the canvas. `point` is in page space; defaults to the viewport center. */\nexport type ExternalContent =\n | { type: \"files\"; files: File[]; point?: VecLikeJson }\n | { type: \"text\"; text: string; point?: VecLikeJson }\n | { type: \"url\"; url: string; point?: VecLikeJson }\n | { type: \"svg-text\"; text: string; point?: VecLikeJson }\nexport type ExternalContentType = ExternalContent[\"type\"]\n\n/** Something an asset can be produced from. */\nexport type ExternalAssetContent = { type: \"file\"; file: File } | { type: \"url\"; url: string }\nexport type ExternalAssetType = ExternalAssetContent[\"type\"]\n\nexport type ExternalContentHandler<T extends ExternalContentType = ExternalContentType> = (\n info: Extract<ExternalContent, { type: T }>,\n) => void | Promise<void>\n\nexport type ExternalAssetHandler<T extends ExternalAssetType = ExternalAssetType> = (\n info: Extract<ExternalAssetContent, { type: T }>,\n) => Asset | undefined | Promise<Asset | undefined>\n\n/** Plain `{ x, y }`; kept structural so records stay JSON-serializable. */\ninterface VecLikeJson {\n x: number\n y: number\n}\n","import type { ShapeId, UnknownShape } from \"../records/base\"\n\nexport interface VecModel {\n x: number\n y: number\n z?: number\n}\n\nexport type UiEventType = \"pointer\" | \"click\" | \"keyboard\" | \"wheel\" | \"pinch\" | \"cancel\" | \"complete\" | \"interrupt\" | \"tick\" | \"misc\"\n\nexport type PointerEventName = \"pointer_down\" | \"pointer_move\" | \"pointer_up\" | \"right_click\" | \"middle_click\"\nexport type ClickEventName = \"double_click\" | \"triple_click\" | \"quadruple_click\"\nexport type KeyboardEventName = \"key_down\" | \"key_up\" | \"key_repeat\"\n\nexport type PointerTarget =\n | { target: \"canvas\" }\n | { target: \"shape\"; shape: UnknownShape }\n | { target: \"selection\"; handle?: SelectionHandle }\n | { target: \"handle\"; shape: UnknownShape; handle: ShapeHandle }\n\nexport type SelectionHandle =\n | \"top\"\n | \"right\"\n | \"bottom\"\n | \"left\"\n | \"top_left\"\n | \"top_right\"\n | \"bottom_left\"\n | \"bottom_right\"\n | \"rotate\"\n | \"mobile_rotate\"\n | \"top_left_rotate\"\n | \"top_right_rotate\"\n | \"bottom_left_rotate\"\n | \"bottom_right_rotate\"\n\nexport interface ShapeHandle {\n id: string\n type: \"vertex\" | \"virtual\" | \"create\" | \"clone\"\n index: string\n x: number\n y: number\n}\n\nexport interface BaseEventInfo {\n type: UiEventType\n shiftKey: boolean\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n accelKey: boolean\n}\n\nexport type PointerEventInfo = BaseEventInfo &\n PointerTarget & {\n type: \"pointer\"\n name: PointerEventName\n point: VecModel\n pointerId: number\n button: number\n isPen: boolean\n }\n\nexport type ClickEventInfo = BaseEventInfo &\n PointerTarget & {\n type: \"click\"\n name: ClickEventName\n point: VecModel\n pointerId: number\n button: number\n isPen: boolean\n phase: \"down\" | \"up\" | \"settle\"\n }\n\nexport interface KeyboardEventInfo extends BaseEventInfo {\n type: \"keyboard\"\n name: KeyboardEventName\n key: string\n code: string\n}\n\nexport interface WheelEventInfo extends BaseEventInfo {\n type: \"wheel\"\n name: \"wheel\"\n delta: VecModel\n point: VecModel\n}\n\nexport interface PinchEventInfo extends BaseEventInfo {\n type: \"pinch\"\n name: \"pinch_start\" | \"pinch\" | \"pinch_end\"\n point: VecModel\n delta: VecModel\n}\n\nexport interface CancelEventInfo extends BaseEventInfo {\n type: \"cancel\"\n name: \"cancel\"\n}\nexport interface CompleteEventInfo extends BaseEventInfo {\n type: \"complete\"\n name: \"complete\"\n}\nexport interface InterruptEventInfo extends BaseEventInfo {\n type: \"interrupt\"\n name: \"interrupt\"\n}\nexport interface TickEventInfo extends BaseEventInfo {\n type: \"tick\"\n name: \"tick\"\n elapsed: number\n}\n\nexport type EventInfo =\n | PointerEventInfo\n | ClickEventInfo\n | KeyboardEventInfo\n | WheelEventInfo\n | PinchEventInfo\n | CancelEventInfo\n | CompleteEventInfo\n | InterruptEventInfo\n | TickEventInfo\n\nexport type EventHandlers = {\n onPointerDown?(info: PointerEventInfo): void\n onPointerMove?(info: PointerEventInfo): void\n onPointerUp?(info: PointerEventInfo): void\n onRightClick?(info: PointerEventInfo): void\n onMiddleClick?(info: PointerEventInfo): void\n onDoubleClick?(info: ClickEventInfo): void\n onTripleClick?(info: ClickEventInfo): void\n onQuadrupleClick?(info: ClickEventInfo): void\n onKeyDown?(info: KeyboardEventInfo): void\n onKeyUp?(info: KeyboardEventInfo): void\n onKeyRepeat?(info: KeyboardEventInfo): void\n onWheel?(info: WheelEventInfo): void\n onCancel?(info: CancelEventInfo): void\n onComplete?(info: CompleteEventInfo): void\n onInterrupt?(info: InterruptEventInfo): void\n onTick?(info: TickEventInfo): void\n}\n\nexport const EVENT_NAME_MAP: Record<string, keyof EventHandlers> = {\n pointer_down: \"onPointerDown\",\n pointer_move: \"onPointerMove\",\n pointer_up: \"onPointerUp\",\n right_click: \"onRightClick\",\n middle_click: \"onMiddleClick\",\n double_click: \"onDoubleClick\",\n triple_click: \"onTripleClick\",\n quadruple_click: \"onQuadrupleClick\",\n key_down: \"onKeyDown\",\n key_up: \"onKeyUp\",\n key_repeat: \"onKeyRepeat\",\n wheel: \"onWheel\",\n cancel: \"onCancel\",\n complete: \"onComplete\",\n interrupt: \"onInterrupt\",\n tick: \"onTick\",\n}\n\nexport interface EditorEvents {\n mount: () => void\n \"max-shapes\": (info: { name: string; pageId: string; count: number }) => void\n change: (info: { source: \"user\" | \"remote\" }) => void\n update: () => void\n event: (info: EventInfo) => void\n tick: (elapsed: number) => void\n frame: (info: { drawn: number; culled: number; ms: number }) => void\n \"select-all-text\": (info: { shapeId: ShapeId }) => void\n \"stop-camera-animation\": () => void\n \"stop-following\": () => void\n}\n\ntype Listener<T extends unknown[]> = (...args: T) => void\n\n/** Minimal typed event emitter. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class EventEmitter<Events extends { [K in keyof Events]: (...args: any[]) => void }> {\n private listeners = new Map<keyof Events, Set<Listener<never[]>>>()\n\n on<K extends keyof Events>(name: K, fn: Events[K]): () => void {\n let set = this.listeners.get(name)\n if (!set) {\n set = new Set()\n this.listeners.set(name, set)\n }\n set.add(fn as Listener<never[]>)\n return () => this.off(name, fn)\n }\n\n once<K extends keyof Events>(name: K, fn: Events[K]): () => void {\n const off = this.on(name, ((...args: never[]) => {\n off()\n ;(fn as Listener<never[]>)(...args)\n }) as Events[K])\n return off\n }\n\n off<K extends keyof Events>(name: K, fn: Events[K]): void {\n this.listeners.get(name)?.delete(fn as Listener<never[]>)\n }\n\n emit<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): void {\n const set = this.listeners.get(name)\n if (!set) return\n for (const fn of Array.from(set)) (fn as unknown as Listener<Parameters<Events[K]>>)(...args)\n }\n\n removeAllListeners(): void {\n this.listeners.clear()\n }\n}\n","import { atom, computed, type Atom, type Computed } from \"@mocanvas/state\"\nimport type { Editor } from \"../editor/Editor\"\nimport {\n EVENT_NAME_MAP,\n type CancelEventInfo,\n type ClickEventInfo,\n type CompleteEventInfo,\n type EventHandlers,\n type EventInfo,\n type InterruptEventInfo,\n type KeyboardEventInfo,\n type PointerEventInfo,\n type TickEventInfo,\n type WheelEventInfo,\n} from \"../editor/events\"\n\nexport type StateNodeType = \"branch\" | \"leaf\" | \"root\"\n\nexport interface StateNodeConstructor {\n new (editor: Editor, parent?: StateNode): StateNode\n id: string\n initial?: string\n children?(): StateNodeConstructor[]\n isLockable?: boolean\n useCoalescedEvents?: boolean\n}\n\n/**\n * A node in the tool state machine. Tools are trees of StateNodes: the root\n * holds one child per tool, each tool holds its own states.\n */\nexport abstract class StateNode {\n static id: string\n static initial?: string\n static children?: () => StateNodeConstructor[]\n static isLockable = true\n static useCoalescedEvents = false\n\n readonly id: string\n readonly type: StateNodeType\n readonly initial: string | undefined\n readonly children?: Record<string, StateNode>\n readonly parent: StateNode | undefined\n readonly editor: Editor\n private readonly _isActive: Atom<boolean>\n private readonly _current: Atom<StateNode | undefined>\n private readonly _path: Computed<string>\n /** Whether the shape kind this tool creates should be kept selected after creation etc. */\n shapeType?: string\n /** Tools can declare the interaction they perform when locked. */\n static get isLockableTool(): boolean {\n return this.isLockable\n }\n\n constructor(editor: Editor, parent?: StateNode) {\n const ctor = this.constructor as StateNodeConstructor\n this.editor = editor\n this.parent = parent\n this.id = ctor.id\n this._isActive = atom(`${this.id}.isActive`, false)\n this._current = atom<StateNode | undefined>(`${this.id}.current`, undefined)\n\n const childCtors = ctor.children?.()\n if (childCtors && childCtors.length > 0) {\n this.type = parent ? \"branch\" : \"root\"\n this.initial = ctor.initial\n const children: Record<string, StateNode> = {}\n for (const C of childCtors) {\n children[C.id] = new C(editor, this)\n }\n this.children = children\n if (this.type === \"branch\" && !this.initial) {\n throw new Error(`StateNode \"${this.id}\" has children but no initial state`)\n }\n } else {\n this.type = \"leaf\"\n }\n\n this._path = computed(`${this.id}.path`, () => {\n const cur = this._current.get()\n return `${this.id}${cur ? `.${cur.getPath()}` : \"\"}`\n })\n }\n\n getPath(): string {\n return this._path.get()\n }\n\n getCurrent(): StateNode | undefined {\n return this._current.get()\n }\n\n getIsActive(): boolean {\n return this._isActive.get()\n }\n\n getDescendant<T extends StateNode>(path: string): T | undefined {\n const [head, ...rest] = path.split(\".\")\n const child = head ? this.children?.[head] : undefined\n if (!child) return undefined\n return rest.length ? child.getDescendant<T>(rest.join(\".\")) : (child as T)\n }\n\n /** Dispatch an event to this node, then to its active child. */\n handleEvent(info: EventInfo): void {\n const handlerName = EVENT_NAME_MAP[info.name]\n const current = this._current.get()\n if (handlerName) {\n const handler = (this as unknown as Record<string, ((i: EventInfo) => void) | undefined>)[handlerName]\n handler?.call(this, info)\n }\n // The handler may have transitioned; only forward to the child that was active when we started.\n if (current && current === this._current.get() && current.getIsActive()) {\n current.handleEvent(info)\n }\n }\n\n /** Move this node's current child to `id`, exiting the old one and entering the new one. */\n transition(id: string, info: object = {}): this {\n if (!this.children) throw new Error(`StateNode \"${this.id}\" has no children to transition to`)\n const next = this.children[id]\n if (!next) throw new Error(`StateNode \"${this.id}\" has no child \"${id}\"`)\n const i = info as Record<string, unknown>\n const prev = this._current.get()\n if (prev) prev.exit(i, id)\n this._current.set(next)\n next.enter(i, prev?.id ?? \"initial\")\n return this\n }\n\n enter(info: Record<string, unknown>, from: string): void {\n this._isActive.set(true)\n this.onEnter?.(info, from)\n if (this.children && this.initial && this.getIsActive()) {\n const initialChild: StateNode | undefined = this.children[this.initial]\n if (!initialChild) throw new Error(`StateNode \"${this.id}\" initial child \"${this.initial}\" not found`)\n this._current.set(initialChild)\n initialChild.enter(info, from)\n }\n }\n\n exit(info: Record<string, unknown>, to: string): void {\n const cur = this._current.get()\n if (cur) cur.exit(info, to)\n this._current.set(undefined)\n this._isActive.set(false)\n this.onExit?.(info, to)\n }\n\n /** Change the active tool from anywhere in the tree. */\n setCurrentToolIdMask(_mask: string | undefined): void {\n // reserved for tools that mask their id (e.g. zoom tool inside select)\n }\n\n onEnter?(info: Record<string, unknown>, from: string): void\n onExit?(info: Record<string, unknown>, to: string): void\n\n // Event handlers (see EventHandlers). Declared optional so subclasses implement only what they need.\n onPointerDown?(info: PointerEventInfo): void\n onPointerMove?(info: PointerEventInfo): void\n onPointerUp?(info: PointerEventInfo): void\n onRightClick?(info: PointerEventInfo): void\n onMiddleClick?(info: PointerEventInfo): void\n onDoubleClick?(info: ClickEventInfo): void\n onTripleClick?(info: ClickEventInfo): void\n onQuadrupleClick?(info: ClickEventInfo): void\n onKeyDown?(info: KeyboardEventInfo): void\n onKeyUp?(info: KeyboardEventInfo): void\n onKeyRepeat?(info: KeyboardEventInfo): void\n onWheel?(info: WheelEventInfo): void\n onCancel?(info: CancelEventInfo): void\n onComplete?(info: CompleteEventInfo): void\n onInterrupt?(info: InterruptEventInfo): void\n onTick?(info: TickEventInfo): void\n}\n\nexport type { EventHandlers }\n\n/** Convenience for subclass typing. */\nexport type StateNodeClass = typeof StateNode & StateNodeConstructor\n","import { StateNode, type StateNodeConstructor } from \"./StateNode\"\nimport type { KeyboardEventInfo } from \"../editor/events\"\n\n/** The root of the tool tree. Its children are the tools. */\nexport class RootState extends StateNode {\n static override id = \"root\"\n static override initial = \"\"\n static override children = (): StateNodeConstructor[] => []\n\n override onKeyDown(info: KeyboardEventInfo): void {\n if (info.key === \"Escape\" && !this.editor.getEditingShapeId()) {\n this.editor.cancel()\n }\n }\n}\n\n/** Build a root state class with the given tools and initial tool id. */\nexport function createRootState(tools: readonly StateNodeConstructor[], initial: string): StateNodeConstructor {\n class Root extends RootState {\n static override id = \"root\"\n static override initial = initial\n static override children = (): StateNodeConstructor[] => [...tools]\n }\n return Root\n}\n","/** Interns string ids to dense u32 engine handles. Handle 0 is reserved. */\nexport class HandleTable {\n private toHandle = new Map<string, number>()\n private toId: (string | undefined)[] = [undefined]\n private free: number[] = []\n\n get size(): number {\n return this.toHandle.size\n }\n\n handle(id: string): number {\n const h = this.toHandle.get(id)\n if (h !== undefined) return h\n const nh = this.free.pop() ?? this.toId.length\n this.toId[nh] = id\n this.toHandle.set(id, nh)\n return nh\n }\n\n peek(id: string): number | undefined {\n return this.toHandle.get(id)\n }\n\n id(handle: number): string | undefined {\n return this.toId[handle]\n }\n\n release(id: string): number | undefined {\n const h = this.toHandle.get(id)\n if (h === undefined) return undefined\n this.toHandle.delete(id)\n this.toId[h] = undefined\n this.free.push(h)\n return h\n }\n\n clear(): void {\n this.toHandle.clear()\n this.toId = [undefined]\n this.free = []\n }\n}\n","import type { RenderBackend, TextureOptions, TextureSource } from \"../render/backend\"\n\n/** Produces the pixels for a texture. Rejecting marks the texture as failed. */\nexport type TextureLoader = () => Promise<TextureSource>\n\nexport type TextureState = \"pending\" | \"ready\" | \"error\"\n\nexport interface TextureInfo {\n /** Host texture id, `1`-based. `StyleWords.texture` references it. */\n readonly id: number\n /** Number of outstanding `acquire` calls. */\n readonly refs: number\n readonly state: TextureState\n /** Pixel size of the decoded source; `0` until it is ready. */\n readonly width: number\n readonly height: number\n}\n\ninterface Entry {\n key: string\n id: number\n refs: number\n state: TextureState\n width: number\n height: number\n /** The decoded source, kept so a new backend can be re-uploaded to. */\n source: TextureSource | null\n opts: TextureOptions | undefined\n}\n\nexport interface TextureManagerOptions {\n /**\n * Called (in a microtask) with the keys whose state just changed, so the host\n * can re-write the shapes holding them and redraw.\n */\n onChange?: (keys: readonly string[]) => void\n}\n\n/** Largest device-pixel scale a rasterized texture is rendered at. */\nexport const MAX_TEXTURE_RESOLUTION = 8\n/** Largest zoom factor that still increases texture resolution. */\nexport const MAX_TEXTURE_ZOOM = 4\nconst MIN_TEXTURE_ZOOM = 0.25\n\n/**\n * `dpr × min(MAX_TEXTURE_ZOOM, zoom)` snapped up to a power of two, so panning\n * and zooming only re-rasterize a texture when it crosses a bucket boundary.\n */\nexport function bucketTextureResolution(zoom: number, dpr = 1): number {\n const z = Number.isFinite(zoom) && zoom > 0 ? zoom : 1\n const clamped = Math.min(MAX_TEXTURE_ZOOM, Math.max(MIN_TEXTURE_ZOOM, z))\n const bucket = 2 ** Math.ceil(Math.log2(clamped))\n const d = Number.isFinite(dpr) && dpr > 0 ? dpr : 1\n return Math.min(MAX_TEXTURE_RESOLUTION, Math.max(MIN_TEXTURE_ZOOM, d * bucket))\n}\n\n/**\n * Owns the host's GPU textures: allocates ids, refcounts them by key, loads\n * their pixels asynchronously and uploads them through the current\n * `RenderBackend`.\n *\n * `acquire` hands back the id straight away so a shape can be written to the\n * engine in the same tick; the texture only appears once the load resolves, so\n * callers keep a DOM fallback until `isReady(key)`. A key whose load rejected\n * resolves to `0` (no texture — the shape falls back to its plain fill).\n *\n * Callers that re-derive their textures on every write (a `ShapeUtil` in\n * `getRenderStyle`) should acquire inside `withOwner`, which reconciles the\n * keys an owner holds instead of piling up references.\n */\nexport class TextureManager {\n private readonly entries = new Map<string, Entry>()\n /** owner id → keys that owner currently holds a reference to. */\n private readonly ownerKeys = new Map<string, Set<string>>()\n /** key → owner ids, so the host can find the shapes to re-write. */\n private readonly keyOwners = new Map<string, Set<string>>()\n private backend: RenderBackend | null = null\n private nextId = 1\n private disposed = false\n private owner: string | null = null\n private touched: Set<string> | null = null\n\n constructor(private readonly options: TextureManagerOptions = {}) {}\n\n /** Number of live texture entries. */\n get size(): number {\n return this.entries.size\n }\n\n getBackend(): RenderBackend | null {\n return this.backend\n }\n\n /**\n * Reference the texture for `key`, starting `load` the first time. Returns\n * the host texture id, or `0` when the key previously failed to load.\n */\n acquire(key: string, load: TextureLoader, opts?: TextureOptions): number {\n if (this.disposed) return 0\n let entry = this.entries.get(key)\n if (!entry) {\n entry = { key, id: this.nextId++, refs: 0, state: \"pending\", width: 0, height: 0, source: null, opts }\n this.entries.set(key, entry)\n this.load(entry, load)\n }\n const owner = this.owner\n if (owner === null) {\n entry.refs++\n } else {\n let held = this.ownerKeys.get(owner)\n if (!held) {\n held = new Set()\n this.ownerKeys.set(owner, held)\n }\n ;(this.touched ??= new Set()).add(key)\n if (!held.has(key)) {\n held.add(key)\n this.addOwner(key, owner)\n entry.refs++\n }\n }\n return entry.state === \"error\" ? 0 : entry.id\n }\n\n /** Drop one reference. The texture is deleted when the last one goes. */\n release(key: string): void {\n const entry = this.entries.get(key)\n if (!entry) return\n entry.refs--\n if (entry.refs > 0) return\n this.entries.delete(key)\n this.keyOwners.delete(key)\n this.destroy(entry)\n }\n\n /** Whether the texture for `key` is uploaded and safe to draw. */\n isReady(key: string): boolean {\n return this.entries.get(key)?.state === \"ready\"\n }\n\n getState(key: string): TextureState | undefined {\n return this.entries.get(key)?.state\n }\n\n /** Current id for `key`: `0` when unknown or failed. */\n getId(key: string): number {\n const entry = this.entries.get(key)\n if (!entry || entry.state === \"error\") return 0\n return entry.id\n }\n\n getInfo(key: string): TextureInfo | undefined {\n const e = this.entries.get(key)\n return e && { id: e.id, refs: e.refs, state: e.state, width: e.width, height: e.height }\n }\n\n /** Owners (shape ids) currently holding `key`. */\n getOwners(key: string): readonly string[] {\n const owners = this.keyOwners.get(key)\n return owners ? [...owners] : []\n }\n\n /** Every owner holding at least one texture. */\n getAllOwners(): readonly string[] {\n return [...this.ownerKeys.keys()]\n }\n\n /**\n * Run `fn` with every `acquire` inside it attributed to `owner`. Keys the\n * owner held before but did not acquire again are released, so re-deriving a\n * shape's style neither leaks references nor keeps a stale texture alive.\n */\n withOwner<T>(owner: string, fn: () => T): T {\n if (this.disposed) return fn()\n const prevOwner = this.owner\n const prevTouched = this.touched\n this.owner = owner\n this.touched = null\n try {\n return fn()\n } finally {\n // The callback may have populated it; TS narrows the field from the assignment above.\n const touched = this.touched as Set<string> | null\n const held = this.ownerKeys.get(owner)\n if (held) {\n for (const key of [...held]) {\n if (touched?.has(key)) continue\n held.delete(key)\n this.removeOwner(key, owner)\n this.release(key)\n }\n if (held.size === 0) this.ownerKeys.delete(owner)\n }\n this.owner = prevOwner\n this.touched = prevTouched\n }\n }\n\n /** Release every key an owner holds (the shape was deleted). */\n releaseOwner(owner: string): void {\n const held = this.ownerKeys.get(owner)\n if (!held) return\n this.ownerKeys.delete(owner)\n for (const key of held) {\n this.removeOwner(key, owner)\n this.release(key)\n }\n }\n\n /**\n * Point the manager at the backend that owns the GPU textures. Everything\n * already decoded is uploaded again; anything still loading uploads when it\n * resolves. The previous backend keeps (and frees) its own GL objects.\n */\n setBackend(backend: RenderBackend | null): void {\n if (this.disposed || this.backend === backend) return\n this.backend = backend\n if (!backend) return\n for (const entry of this.entries.values()) {\n if (entry.state === \"ready\" && entry.source) this.upload(entry)\n }\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n for (const entry of this.entries.values()) this.destroy(entry)\n this.entries.clear()\n this.ownerKeys.clear()\n this.keyOwners.clear()\n this.backend = null\n }\n\n private addOwner(key: string, owner: string): void {\n let owners = this.keyOwners.get(key)\n if (!owners) {\n owners = new Set()\n this.keyOwners.set(key, owners)\n }\n owners.add(owner)\n }\n\n private removeOwner(key: string, owner: string): void {\n const owners = this.keyOwners.get(key)\n if (!owners) return\n owners.delete(owner)\n if (owners.size === 0) this.keyOwners.delete(key)\n }\n\n private load(entry: Entry, load: TextureLoader): void {\n let promise: Promise<TextureSource>\n try {\n promise = load()\n } catch (err) {\n promise = Promise.reject(err instanceof Error ? err : new Error(String(err)))\n }\n void promise.then(\n (source) => {\n if (this.disposed || this.entries.get(entry.key) !== entry) {\n closeSource(source)\n return\n }\n const [w, h] = sourceSize(source)\n entry.source = source\n entry.width = w\n entry.height = h\n entry.state = \"ready\"\n this.upload(entry)\n this.options.onChange?.([entry.key])\n },\n () => {\n if (this.disposed || this.entries.get(entry.key) !== entry) return\n entry.state = \"error\"\n this.options.onChange?.([entry.key])\n },\n )\n }\n\n private upload(entry: Entry): void {\n if (!this.backend || !entry.source) return\n try {\n this.backend.uploadTexture(entry.id, entry.source, entry.opts)\n } catch {\n // A backend that cannot take the source (lost context, disposed) leaves\n // the entry ready but unbound; it draws white until the next upload.\n }\n }\n\n private destroy(entry: Entry): void {\n if (this.backend) {\n try {\n this.backend.deleteTexture(entry.id)\n } catch {\n // ignore: the backend may already be disposed\n }\n }\n closeSource(entry.source)\n entry.source = null\n }\n}\n\nfunction closeSource(source: TextureSource | null): void {\n if (source && typeof ImageBitmap !== \"undefined\" && source instanceof ImageBitmap) source.close()\n}\n\nfunction sourceSize(source: TextureSource): [number, number] {\n const s = source as { width?: number; height?: number; naturalWidth?: number; naturalHeight?: number; videoWidth?: number; videoHeight?: number }\n return [s.naturalWidth || s.videoWidth || s.width || 0, s.naturalHeight || s.videoHeight || s.height || 0]\n}\n","import { atom, type Atom } from \"@mocanvas/state\"\nimport type { RecordId } from \"@mocanvas/store\"\nimport { createRecordType, uniqueId } from \"@mocanvas/store\"\nimport type { JsonObject, PageId, Scribble, ShapeId } from \"./base\"\n\n/** Eight colours that stay readable on the canvas background in any order. */\nexport const PRESENCE_COLORS = [\n \"#e0575b\",\n \"#ef8b3a\",\n \"#d8a72e\",\n \"#4f9d55\",\n \"#2fa39a\",\n \"#3f86d8\",\n \"#7a63d8\",\n \"#c05aa8\",\n] as const\n\nexport function randomPresenceColor(): string {\n return PRESENCE_COLORS[Math.floor(Math.random() * PRESENCE_COLORS.length)]!\n}\n\n/**\n * What one other person is doing right now: where their cursor is, what they\n * have selected, which page they are on.\n *\n * Presence records live in the `presence` scope: they are shared with\n * collaborators but never written to a `.tldr` file and never enter history.\n */\nexport interface InstancePresence {\n readonly id: InstancePresenceId\n readonly typeName: \"instance_presence\"\n /** Stable id of the person (survives reconnects; one person may have many tabs). */\n userId: string\n userName: string\n /** CSS colour used for their cursor, name chip and selection outlines. */\n color: string\n currentPageId: PageId\n cursor: { x: number; y: number; type: string; rotation: number }\n camera: { x: number; y: number; z: number }\n selectedShapeIds: ShapeId[]\n brush: { x: number; y: number; w: number; h: number } | null\n scribbles: Scribble[]\n followingUserId: string | null\n /** `Date.now()` on the sender when the record was produced. */\n lastActivityTimestamp: number\n chatMessage: string\n meta: JsonObject\n}\n\nexport type InstancePresenceId = RecordId<InstancePresence>\n\nexport const InstancePresenceRecordType = createRecordType<InstancePresence>(\"instance_presence\", {\n scope: \"presence\",\n}).withDefaultProperties(() => ({\n userName: \"\",\n color: PRESENCE_COLORS[0]!,\n cursor: { x: 0, y: 0, type: \"default\", rotation: 0 },\n camera: { x: 0, y: 0, z: 1 },\n selectedShapeIds: [],\n brush: null,\n scribbles: [],\n followingUserId: null,\n lastActivityTimestamp: 0,\n chatMessage: \"\",\n meta: {},\n}))\n\nexport function isInstancePresenceId(id: string): id is InstancePresenceId {\n return id.startsWith(\"instance_presence:\")\n}\n\n/**\n * The local person's identity, held in a signal so that renaming or\n * recolouring re-renders anything that shows it. Session-only: nothing here is\n * persisted with the document.\n */\nexport interface UserPreferences {\n getId(): string\n getName(): string\n getColor(): string\n setName(name: string): void\n setColor(color: string): void\n}\n\nexport interface UserPreferencesInit {\n id?: string\n name?: string\n color?: string\n}\n\n/** Create a `UserPreferences` backed by one session atom. */\nexport function createUserPreferences(init: UserPreferencesInit = {}): UserPreferences {\n const id = init.id ?? `user:${uniqueId(12)}`\n const state: Atom<{ name: string; color: string }> = atom(\"editor.user\", {\n name: init.name ?? `User ${id.slice(-4)}`,\n color: init.color ?? randomPresenceColor(),\n })\n return {\n getId: () => id,\n getName: () => state.get().name,\n getColor: () => state.get().color,\n setName: (name: string) => state.update((s) => ({ ...s, name })),\n setColor: (color: string) => state.update((s) => ({ ...s, color })),\n }\n}\n","/** Style value unions shared by the default shapes. Kept identical for file compatibility. */\n\nexport const DEFAULT_COLORS = [\n \"black\",\n \"grey\",\n \"light-violet\",\n \"violet\",\n \"blue\",\n \"light-blue\",\n \"yellow\",\n \"orange\",\n \"green\",\n \"light-green\",\n \"light-red\",\n \"red\",\n \"white\",\n] as const\nexport type DefaultColorStyle = (typeof DEFAULT_COLORS)[number]\n\nexport const DEFAULT_FILLS = [\"none\", \"semi\", \"solid\", \"pattern\", \"fill\"] as const\nexport type DefaultFillStyle = (typeof DEFAULT_FILLS)[number]\n\nexport const DEFAULT_DASHES = [\"draw\", \"solid\", \"dashed\", \"dotted\"] as const\nexport type DefaultDashStyle = (typeof DEFAULT_DASHES)[number]\n\nexport const DEFAULT_SIZES = [\"s\", \"m\", \"l\", \"xl\"] as const\nexport type DefaultSizeStyle = (typeof DEFAULT_SIZES)[number]\n\nexport const DEFAULT_FONTS = [\"draw\", \"sans\", \"serif\", \"mono\"] as const\nexport type DefaultFontStyle = (typeof DEFAULT_FONTS)[number]\n\nexport const DEFAULT_H_ALIGNS = [\"start\", \"middle\", \"end\", \"start-legacy\", \"end-legacy\", \"middle-legacy\"] as const\nexport type DefaultHorizontalAlignStyle = (typeof DEFAULT_H_ALIGNS)[number]\n\nexport const DEFAULT_V_ALIGNS = [\"start\", \"middle\", \"end\"] as const\nexport type DefaultVerticalAlignStyle = (typeof DEFAULT_V_ALIGNS)[number]\n\nexport const GEO_SHAPE_KINDS = [\n \"rectangle\",\n \"ellipse\",\n \"triangle\",\n \"diamond\",\n \"pentagon\",\n \"hexagon\",\n \"octagon\",\n \"star\",\n \"rhombus\",\n \"rhombus-2\",\n \"oval\",\n \"trapezoid\",\n \"arrow-right\",\n \"arrow-left\",\n \"arrow-up\",\n \"arrow-down\",\n \"x-box\",\n \"check-box\",\n \"cloud\",\n \"heart\",\n] as const\nexport type GeoShapeKind = (typeof GEO_SHAPE_KINDS)[number]\n\n/** Stroke widths in page units per size, matching the classic look. */\nexport const STROKE_SIZES: Record<DefaultSizeStyle, number> = { s: 2, m: 3.5, l: 5, xl: 10 }\nexport const FONT_SIZES: Record<DefaultSizeStyle, number> = { s: 18, m: 24, l: 36, xl: 44 }\n\nexport interface ThemeColor {\n solid: string\n semi: string\n pattern: string\n fill: string\n note: { fill: string; text: string }\n highlight: { srgb: string; p3: string }\n}\n\n/**\n * A palette in the spirit of the classic light theme. Values are our own picks:\n * hue-matched, tuned for contrast on white and on the semi fills.\n */\nexport const LIGHT_THEME: Record<DefaultColorStyle, ThemeColor> & { background: string; solid: string; text: string } = {\n background: \"#f9fafb\",\n solid: \"#fcfffe\",\n text: \"#000000\",\n black: {\n solid: \"#1d1d1d\", semi: \"#e8e8e8\", pattern: \"#494949\", fill: \"#1d1d1d\",\n note: { fill: \"#fce19c\", text: \"#000000\" }, highlight: { srgb: \"#fddd00\", p3: \"color(display-p3 0.972 0.8705 0.05)\" },\n },\n grey: {\n solid: \"#9fa8b2\", semi: \"#eceef0\", pattern: \"#bac3cb\", fill: \"#9fa8b2\",\n note: { fill: \"#eaeaea\", text: \"#000000\" }, highlight: { srgb: \"#cbe7f1\", p3: \"color(display-p3 0.85 0.9 0.94)\" },\n },\n \"light-violet\": {\n solid: \"#e085f4\", semi: \"#f5eafa\", pattern: \"#e9acf8\", fill: \"#e085f4\",\n note: { fill: \"#f5eafa\", text: \"#000000\" }, highlight: { srgb: \"#f6c9ff\", p3: \"color(display-p3 0.97 0.79 1)\" },\n },\n violet: {\n solid: \"#ae3ec9\", semi: \"#ecdcf2\", pattern: \"#c26fd6\", fill: \"#ae3ec9\",\n note: { fill: \"#e5b7f1\", text: \"#000000\" }, highlight: { srgb: \"#dfa7f1\", p3: \"color(display-p3 0.87 0.65 0.95)\" },\n },\n blue: {\n solid: \"#4465e9\", semi: \"#dce1f8\", pattern: \"#6681ee\", fill: \"#4465e9\",\n note: { fill: \"#c9d3fb\", text: \"#000000\" }, highlight: { srgb: \"#8fbdff\", p3: \"color(display-p3 0.56 0.74 1)\" },\n },\n \"light-blue\": {\n solid: \"#4ba1f1\", semi: \"#ddedfa\", pattern: \"#78b7f4\", fill: \"#4ba1f1\",\n note: { fill: \"#c9e4fb\", text: \"#000000\" }, highlight: { srgb: \"#9de0ff\", p3: \"color(display-p3 0.62 0.88 1)\" },\n },\n yellow: {\n solid: \"#f1ac4b\", semi: \"#f9f0e6\", pattern: \"#f3c68a\", fill: \"#f1ac4b\",\n note: { fill: \"#fbe9c9\", text: \"#000000\" }, highlight: { srgb: \"#fddd00\", p3: \"color(display-p3 0.972 0.8705 0.05)\" },\n },\n orange: {\n solid: \"#e16919\", semi: \"#faeae1\", pattern: \"#eb9c6a\", fill: \"#e16919\",\n note: { fill: \"#f9d3b8\", text: \"#000000\" }, highlight: { srgb: \"#ffa971\", p3: \"color(display-p3 1 0.66 0.44)\" },\n },\n green: {\n solid: \"#099268\", semi: \"#d3e9e3\", pattern: \"#4ab99c\", fill: \"#099268\",\n note: { fill: \"#b5dfd2\", text: \"#000000\" }, highlight: { srgb: \"#98f2c8\", p3: \"color(display-p3 0.6 0.95 0.78)\" },\n },\n \"light-green\": {\n solid: \"#4cb05e\", semi: \"#dbf0e0\", pattern: \"#84c78f\", fill: \"#4cb05e\",\n note: { fill: \"#c8ead0\", text: \"#000000\" }, highlight: { srgb: \"#98f2c8\", p3: \"color(display-p3 0.6 0.95 0.78)\" },\n },\n \"light-red\": {\n solid: \"#f87777\", semi: \"#f4dadb\", pattern: \"#f8a2a2\", fill: \"#f87777\",\n note: { fill: \"#fcd1d1\", text: \"#000000\" }, highlight: { srgb: \"#ffb2b2\", p3: \"color(display-p3 1 0.7 0.7)\" },\n },\n red: {\n solid: \"#e03131\", semi: \"#f4dadb\", pattern: \"#ea6b6b\", fill: \"#e03131\",\n note: { fill: \"#f4b7b7\", text: \"#000000\" }, highlight: { srgb: \"#ff9c9c\", p3: \"color(display-p3 1 0.61 0.61)\" },\n },\n white: {\n solid: \"#ffffff\", semi: \"#f5f5f5\", pattern: \"#f5f5f5\", fill: \"#ffffff\",\n note: { fill: \"#ffffff\", text: \"#000000\" }, highlight: { srgb: \"#ffffff\", p3: \"color(display-p3 1 1 1)\" },\n },\n}\n\n/** Parse `#rrggbb` or `#rrggbbaa` to the engine's `0xRRGGBBAA`. */\nexport function hexToRgba(hex: string, alpha = 1): number {\n let h = hex.trim()\n if (h.startsWith(\"#\")) h = h.slice(1)\n if (h.length === 3) h = h.split(\"\").map((c) => c + c).join(\"\")\n const r = parseInt(h.slice(0, 2), 16)\n const g = parseInt(h.slice(2, 4), 16)\n const b = parseInt(h.slice(4, 6), 16)\n const a = h.length >= 8 ? parseInt(h.slice(6, 8), 16) : Math.round(alpha * 255)\n return ((r << 24) | (g << 16) | (b << 8) | a) >>> 0\n}\n","import {\n DEFAULT_COLORS,\n DEFAULT_DASHES,\n DEFAULT_FILLS,\n DEFAULT_FONTS,\n DEFAULT_H_ALIGNS,\n DEFAULT_SIZES,\n DEFAULT_V_ALIGNS,\n GEO_SHAPE_KINDS,\n type DefaultColorStyle as ColorValue,\n type DefaultDashStyle as DashValue,\n type DefaultFillStyle as FillValue,\n type DefaultFontStyle as FontValue,\n type DefaultHorizontalAlignStyle as HAlignValue,\n type DefaultSizeStyle as SizeValue,\n type DefaultVerticalAlignStyle as VAlignValue,\n} from \"./styles\"\n\n/**\n * A shape prop that is a *style*: shared across shape types, remembered for\n * the next created shape, and editable for a whole selection at once.\n */\nexport class StyleProp<T> {\n /** Define a style with a free-form value. */\n static define<T>(id: string, options: { defaultValue: T; validate?: (value: unknown) => T }): StyleProp<T> {\n return new StyleProp(id, options.defaultValue, options.validate)\n }\n\n /** Define a style whose value is one of a fixed set of strings. */\n static defineEnum<const V extends readonly string[]>(id: string, options: { defaultValue: V[number]; values: V }): EnumStyleProp<V[number]> {\n return new EnumStyleProp(id, options.defaultValue, options.values)\n }\n\n protected constructor(\n readonly id: string,\n readonly defaultValue: T,\n private readonly validator?: (value: unknown) => T,\n ) {}\n\n validate(value: unknown): T {\n return this.validator ? this.validator(value) : (value as T)\n }\n}\n\nexport class EnumStyleProp<T extends string> extends StyleProp<T> {\n constructor(\n id: string,\n defaultValue: T,\n readonly values: readonly T[],\n ) {\n super(id, defaultValue, (v) => {\n if (typeof v !== \"string\" || !(values as readonly string[]).includes(v)) {\n throw new Error(`Invalid value for style ${id}: ${String(v)}`)\n }\n return v as T\n })\n }\n}\n\nexport const DefaultColorStyle = StyleProp.defineEnum(\"mocanvas:color\", { defaultValue: \"black\", values: DEFAULT_COLORS })\nexport const DefaultLabelColorStyle = StyleProp.defineEnum(\"mocanvas:labelColor\", { defaultValue: \"black\", values: DEFAULT_COLORS })\nexport const DefaultFillStyle = StyleProp.defineEnum(\"mocanvas:fill\", { defaultValue: \"none\", values: DEFAULT_FILLS })\nexport const DefaultDashStyle = StyleProp.defineEnum(\"mocanvas:dash\", { defaultValue: \"draw\", values: DEFAULT_DASHES })\nexport const DefaultSizeStyle = StyleProp.defineEnum(\"mocanvas:size\", { defaultValue: \"m\", values: DEFAULT_SIZES })\nexport const DefaultFontStyle = StyleProp.defineEnum(\"mocanvas:font\", { defaultValue: \"draw\", values: DEFAULT_FONTS })\nexport const DefaultHorizontalAlignStyle = StyleProp.defineEnum(\"mocanvas:horizontalAlign\", { defaultValue: \"middle\", values: DEFAULT_H_ALIGNS })\nexport const DefaultVerticalAlignStyle = StyleProp.defineEnum(\"mocanvas:verticalAlign\", { defaultValue: \"middle\", values: DEFAULT_V_ALIGNS })\n\nexport const GeoShapeGeoStyle = StyleProp.defineEnum(\"mocanvas:geo\", { defaultValue: \"rectangle\", values: GEO_SHAPE_KINDS })\n\nexport type { ColorValue, DashValue, FillValue, FontValue, HAlignValue, SizeValue, VAlignValue }\n// The style *values* keep the same names as the style props (a value and a type may share a name).\nexport type DefaultColorStyle = ColorValue\nexport type DefaultLabelColorStyle = ColorValue\nexport type DefaultFillStyle = FillValue\nexport type DefaultDashStyle = DashValue\nexport type DefaultSizeStyle = SizeValue\nexport type DefaultFontStyle = FontValue\nexport type DefaultHorizontalAlignStyle = HAlignValue\nexport type DefaultVerticalAlignStyle = VAlignValue\n\nexport type SharedStyle<T> = { type: \"shared\"; value: T } | { type: \"mixed\" }\n\n/** Styles shared by a set of shapes: one entry per style prop, `mixed` when values differ. */\nexport class SharedStyleMap {\n private readonly map = new Map<StyleProp<unknown>, SharedStyle<unknown>>()\n\n get size(): number {\n return this.map.size\n }\n\n get<T>(prop: StyleProp<T>): SharedStyle<T> | undefined {\n return this.map.get(prop as StyleProp<unknown>) as SharedStyle<T> | undefined\n }\n\n getAsKnownValue<T>(prop: StyleProp<T>): T | undefined {\n const s = this.get(prop)\n return s?.type === \"shared\" ? s.value : undefined\n }\n\n has(prop: StyleProp<unknown>): boolean {\n return this.map.has(prop)\n }\n\n /** Record a value seen on a shape. */\n applyValue<T>(prop: StyleProp<T>, value: T): void {\n const existing = this.map.get(prop as StyleProp<unknown>)\n if (!existing) this.map.set(prop as StyleProp<unknown>, { type: \"shared\", value })\n else if (existing.type === \"shared\" && existing.value !== value) this.map.set(prop as StyleProp<unknown>, { type: \"mixed\" })\n }\n\n [Symbol.iterator](): IterableIterator<[StyleProp<unknown>, SharedStyle<unknown>]> {\n return this.map.entries()\n }\n\n keys(): IterableIterator<StyleProp<unknown>> {\n return this.map.keys()\n }\n}\n\n/** Style props declared on a ShapeUtil's `static props` map, by prop key. */\nexport function getStylePropsOf(props: Record<string, unknown> | undefined): Map<string, StyleProp<unknown>> {\n const out = new Map<string, StyleProp<unknown>>()\n if (!props) return out\n for (const [key, v] of Object.entries(props)) {\n if (v instanceof StyleProp) out.set(key, v)\n }\n return out\n}\n","import { atom, transact, type Atom } from \"@mocanvas/state\"\nimport {\n isRecordsDiffEmpty,\n reverseRecordsDiff,\n squashRecordDiffs,\n type RecordsDiff,\n type Store,\n type UnknownRecord,\n} from \"@mocanvas/store\"\n\ntype Entry<R extends UnknownRecord> = { type: \"diff\"; diff: RecordsDiff<R> } | { type: \"mark\"; id: string }\n\n/**\n * Undo/redo over store diffs. Every user-sourced document change is recorded;\n * marks delimit undo steps. Undo applies the reverse of every diff back to the\n * previous mark.\n */\nexport class HistoryManager<R extends UnknownRecord> {\n private undos: Entry<R>[] = []\n private redos: Entry<R>[] = []\n private ignoring = 0\n private pendingDiff: RecordsDiff<R> | null = null\n private readonly _version: Atom<number>\n private readonly dispose: () => void\n\n constructor(\n private readonly store: Store<R>,\n private readonly onBatchComplete?: () => void,\n ) {\n this._version = atom(\"history.version\", 0)\n this.dispose = store.listen(\n (entry) => {\n if (this.ignoring > 0) return\n if (isRecordsDiffEmpty(entry.changes)) return\n this.pushDiff(entry.changes)\n },\n { source: \"user\", scope: \"document\" },\n )\n }\n\n private pushDiff(diff: RecordsDiff<R>): void {\n const last = this.undos.at(-1)\n if (last && last.type === \"diff\") {\n last.diff = squashRecordDiffs([last.diff, diff])\n } else {\n this.undos.push({ type: \"diff\", diff })\n }\n if (this.redos.length) this.redos = []\n this._version.update((v) => v + 1)\n }\n\n /** Reactive counter for UI. */\n getVersion(): number {\n return this._version.get()\n }\n\n getNumUndos(): number {\n return this.undos.filter((e) => e.type === \"diff\").length\n }\n\n getNumRedos(): number {\n return this.redos.filter((e) => e.type === \"diff\").length\n }\n\n /** Run `fn` without recording its changes. */\n ignore<T>(fn: () => T): T {\n this.ignoring++\n try {\n return fn()\n } finally {\n this.ignoring--\n }\n }\n\n /** Place a stopping point. Returns the mark id. */\n mark(id: string = `mark:${Date.now().toString(36)}:${Math.random().toString(36).slice(2, 8)}`): string {\n const last = this.undos.at(-1)\n if (last && last.type === \"mark\") {\n // collapse consecutive marks\n last.id = id\n } else {\n this.undos.push({ type: \"mark\", id })\n }\n this._version.update((v) => v + 1)\n return id\n }\n\n private apply(diff: RecordsDiff<R>): void {\n this.ignore(() => {\n transact(() => {\n this.store.applyDiff(diff, { runCallbacks: true })\n })\n })\n }\n\n undo(): this {\n this.step(\"undo\", \"toMark\", undefined)\n return this\n }\n\n redo(): this {\n this.step(\"redo\", \"toMark\", undefined)\n return this\n }\n\n /** Undo to the previous mark and drop the undone entries (no redo). */\n bail(): this {\n this.step(\"undo\", \"toMark\", undefined, true)\n return this\n }\n\n /** Undo back to a specific mark and drop the entries. */\n bailToMark(id: string): this {\n this.step(\"undo\", \"toSpecificMark\", id, true)\n return this\n }\n\n /** Merge every diff since `id` into one step (the mark stays). */\n squashToMark(id: string): this {\n const i = this.undos.findLastIndex((e) => e.type === \"mark\" && e.id === id)\n if (i < 0) return this\n const tail = this.undos.splice(i + 1)\n const diffs = tail.filter((e): e is { type: \"diff\"; diff: RecordsDiff<R> } => e.type === \"diff\").map((e) => e.diff)\n if (diffs.length) this.undos.push({ type: \"diff\", diff: squashRecordDiffs(diffs) })\n this._version.update((v) => v + 1)\n return this\n }\n\n clear(): void {\n this.undos = []\n this.redos = []\n this.pendingDiff = null\n this._version.update((v) => v + 1)\n }\n\n private step(dir: \"undo\" | \"redo\", mode: \"toMark\" | \"toSpecificMark\", markId: string | undefined, drop = false): void {\n const from = dir === \"undo\" ? this.undos : this.redos\n const to = dir === \"undo\" ? this.redos : this.undos\n if (from.length === 0) return\n\n // Skip leading marks.\n while (from.length && from.at(-1)!.type === \"mark\") {\n const m = from.pop()!\n if (!drop) to.push(m)\n if (mode === \"toSpecificMark\" && (m as { id: string }).id === markId) {\n this._version.update((v) => v + 1)\n return\n }\n }\n\n const diffs: RecordsDiff<R>[] = []\n while (from.length) {\n const e = from.at(-1)!\n if (e.type === \"mark\") {\n if (mode === \"toMark\") break\n // toSpecificMark: pass through marks until the requested one\n from.pop()\n if (!drop) to.push(e)\n if (e.id === markId) break\n continue\n }\n from.pop()\n diffs.push(e.diff)\n if (!drop) to.push(e)\n if (mode === \"toMark\") break\n }\n if (diffs.length) {\n const combined = squashRecordDiffs(diffs)\n this.apply(dir === \"undo\" ? reverseRecordsDiff(combined) : combined)\n }\n this._version.update((v) => v + 1)\n this.onBatchComplete?.()\n }\n\n destroy(): void {\n this.dispose()\n }\n}\n","import { atom, type Atom } from \"@mocanvas/state\"\nimport type { Editor } from \"./Editor\"\nimport { Box, Vec, type BoxLike } from \"../geometry\"\nimport type { ShapeId } from \"../records/base\"\n\nexport interface SnapLine {\n id: string\n /** Page-space points along the line (at least two). */\n points: Vec[]\n}\n\nexport interface SnapResult {\n /** Adjustment to add to the proposed delta/position. */\n nudge: Vec\n lines: SnapLine[]\n}\n\ninterface SnapPoints {\n xs: { value: number; y: number }[]\n ys: { value: number; x: number }[]\n}\n\n/**\n * Edge and center snapping against nearby shapes. Candidate shapes are taken\n * from the engine's spatial index (viewport query), so cost does not grow with\n * page size.\n */\nexport class SnapManager {\n private readonly _lines: Atom<SnapLine[]>\n /** Snap distance in screen pixels. */\n threshold = 8\n\n constructor(private readonly editor: Editor) {\n this._lines = atom<SnapLine[]>(\"snap.lines\", [])\n }\n\n getLines(): SnapLine[] {\n return this._lines.get()\n }\n\n clearLines(): void {\n if (this._lines.get().length) this._lines.set([])\n }\n\n /** Bounds of shapes near the viewport that are not being moved. */\n private getSnapTargets(exclude: ReadonlySet<ShapeId>): Box[] {\n const editor = this.editor\n const vp = editor.getViewportPageBounds()\n const pad = Math.max(vp.w, vp.h)\n const shapes = editor.getShapesIntersectingBounds(Box.Expand(vp, pad))\n const out: Box[] = []\n for (const s of shapes) {\n if (exclude.has(s.id)) continue\n if (s.parentId !== editor.getCurrentPageId()) continue\n const b = editor.getShapePageBounds(s)\n if (b) out.push(b)\n }\n return out\n }\n\n private static pointsOf(b: BoxLike): SnapPoints {\n const cx = b.x + b.w / 2\n const cy = b.y + b.h / 2\n return {\n xs: [\n { value: b.x, y: cy },\n { value: cx, y: cy },\n { value: b.x + b.w, y: cy },\n ],\n ys: [\n { value: b.y, x: cx },\n { value: cy, x: cx },\n { value: b.y + b.h, x: cx },\n ],\n }\n }\n\n /**\n * Snap a moving box (already offset by the proposed delta) to nearby shapes.\n * Returns the extra nudge to apply and the guide lines to show.\n */\n snapTranslate(moving: BoxLike, exclude: ReadonlySet<ShapeId>, opts: { lockX?: boolean; lockY?: boolean } = {}): SnapResult {\n const editor = this.editor\n const th = this.threshold / editor.getZoomLevel()\n const targets = this.getSnapTargets(exclude)\n const mine = SnapManager.pointsOf(moving)\n let bestX: { d: number; nudge: number } | null = null\n let bestY: { d: number; nudge: number } | null = null\n for (const t of targets) {\n const tp = SnapManager.pointsOf(t)\n if (!opts.lockX) {\n for (const a of mine.xs) {\n for (const b of tp.xs) {\n const d = Math.abs(a.value - b.value)\n if (d <= th && (!bestX || d < bestX.d)) bestX = { d, nudge: b.value - a.value }\n }\n }\n }\n if (!opts.lockY) {\n for (const a of mine.ys) {\n for (const b of tp.ys) {\n const d = Math.abs(a.value - b.value)\n if (d <= th && (!bestY || d < bestY.d)) bestY = { d, nudge: b.value - a.value }\n }\n }\n }\n }\n const nudge = new Vec(bestX?.nudge ?? 0, bestY?.nudge ?? 0)\n // Build guide lines for every aligned edge/center after nudging.\n const snapped = new Box(moving.x + nudge.x, moving.y + nudge.y, moving.w, moving.h)\n const sp = SnapManager.pointsOf(snapped)\n const lines: SnapLine[] = []\n const eps = 0.01\n for (const t of targets) {\n const tp = SnapManager.pointsOf(t)\n for (const a of sp.xs) {\n for (const b of tp.xs) {\n if (Math.abs(a.value - b.value) < eps) {\n const ys = [snapped.y, snapped.maxY, t.y, t.y + t.h]\n lines.push({ id: `x:${a.value.toFixed(2)}`, points: [new Vec(a.value, Math.min(...ys)), new Vec(a.value, Math.max(...ys))] })\n }\n }\n }\n for (const a of sp.ys) {\n for (const b of tp.ys) {\n if (Math.abs(a.value - b.value) < eps) {\n const xs = [snapped.x, snapped.maxX, t.x, t.x + t.w]\n lines.push({ id: `y:${a.value.toFixed(2)}`, points: [new Vec(Math.min(...xs), a.value), new Vec(Math.max(...xs), a.value)] })\n }\n }\n }\n }\n // Merge lines with the same id (extend extents)\n const merged = new Map<string, SnapLine>()\n for (const l of lines) {\n const prev = merged.get(l.id)\n if (!prev) merged.set(l.id, l)\n else {\n const pts = [...prev.points, ...l.points]\n const isX = l.id.startsWith(\"x:\")\n const vals = pts.map((p) => (isX ? p.y : p.x))\n const min = Math.min(...vals)\n const max = Math.max(...vals)\n prev.points = isX ? [new Vec(pts[0]!.x, min), new Vec(pts[0]!.x, max)] : [new Vec(min, pts[0]!.y), new Vec(max, pts[0]!.y)]\n }\n }\n const result = [...merged.values()]\n this._lines.set(result)\n return { nudge, lines: result }\n }\n}\n","import { atom, computed, transact, unsafe__withoutCapture, type Atom, type Computed } from \"@mocanvas/state\"\nimport {\n getIndexAbove,\n getIndexBelow,\n getIndexBetween,\n getIndicesAbove,\n indexKeyToZKey,\n sortByIndex,\n ZERO_INDEX_KEY,\n type IndexKey,\n} from \"@mocanvas/store\"\nimport { EngineBridge, FLAG, type CameraState, type ClipRect, type FrameBuffers, type StyleWords } from \"@mocanvas/wasm\"\nimport { Box, Vec, type BoxLike, type Geometry2d, type VecLike } from \"../geometry\"\nimport {\n CameraRecordType,\n DOCUMENT_ID,\n DocumentRecordType,\n INSTANCE_ID,\n InstancePageStateRecordType,\n InstanceRecordType,\n isPageId,\n isShapeId,\n PageRecordType,\n ShapeRecordType,\n type Camera,\n type Document,\n type Instance,\n type InstancePageState,\n type Page,\n type PageId,\n type ParentId,\n type ShapeCreate,\n type ShapeId,\n type ShapePartial,\n type UnknownShape,\n} from \"../records/base\"\nimport type { ShapeUtil, ShapeUtilConstructor } from \"../shapes/ShapeUtil\"\nimport type { BindingUtil, BindingUtilConstructor } from \"../bindings/BindingUtil\"\nimport {\n BindingRecordType,\n isBinding,\n type BindingCreate,\n type BindingId,\n type BindingPartial,\n type UnknownBinding,\n} from \"../records/binding\"\nimport {\n AssetRecordType,\n type Asset,\n type AssetCreate,\n type AssetId,\n type AssetPartial,\n type ExternalAssetContent,\n type ExternalAssetHandler,\n type ExternalAssetType,\n type ExternalContent,\n type ExternalContentHandler,\n type ExternalContentType,\n} from \"../records/asset\"\nimport { createRootState } from \"../tools/RootState\"\nimport type { StateNode, StateNodeConstructor } from \"../tools/StateNode\"\nimport type { RenderBackend } from \"../render/backend\"\nimport type { EditorRecord, EditorStore } from \"./createStore\"\nimport {\n EventEmitter,\n type EditorEvents,\n type EventInfo,\n type PointerEventInfo,\n type VecModel,\n type WheelEventInfo,\n} from \"./events\"\nimport { HandleTable } from \"./HandleTable\"\nimport { bucketTextureResolution, TextureManager } from \"./TextureManager\"\nimport { createUserPreferences, type InstancePresence, type UserPreferences } from \"../records/presence\"\nimport { getStylePropsOf, SharedStyleMap, type StyleProp } from \"../records/styleProp\"\nimport { HistoryManager } from \"./HistoryManager\"\nimport { SnapManager } from \"./SnapManager\"\n\nexport interface EditorOptions {\n store: EditorStore\n shapeUtils: readonly ShapeUtilConstructor[]\n bindingUtils?: readonly BindingUtilConstructor[]\n tools: readonly StateNodeConstructor[]\n engine: EngineBridge\n /** Id of the tool to start in. Defaults to the first tool. */\n initialState?: string\n getContainer: () => HTMLElement\n options?: Partial<EditorConfig>\n}\n\nexport interface EditorConfig {\n maxShapesPerPage: number\n dragDistanceSquared: number\n /** Hit-test tolerance in screen pixels. */\n hitTestMargin: number\n zoomMin: number\n zoomMax: number\n zoomSteps: number[]\n backgroundColor: [number, number, number, number]\n animationMediumMs: number\n}\n\nexport const DEFAULT_EDITOR_CONFIG: EditorConfig = {\n maxShapesPerPage: 4000,\n dragDistanceSquared: 16,\n hitTestMargin: 8,\n zoomMin: 0.05,\n zoomMax: 8,\n zoomSteps: [0.1, 0.25, 0.5, 1, 2, 4, 8],\n backgroundColor: [0.976, 0.98, 0.984, 1],\n animationMediumMs: 320,\n}\n\nexport interface EditorInputs {\n originPagePoint: Vec\n originScreenPoint: Vec\n previousPagePoint: Vec\n previousScreenPoint: Vec\n currentPagePoint: Vec\n currentScreenPoint: Vec\n keys: Set<string>\n buttons: Set<number>\n isPen: boolean\n shiftKey: boolean\n ctrlKey: boolean\n altKey: boolean\n metaKey: boolean\n accelKey: boolean\n isDragging: boolean\n isPointing: boolean\n isPinching: boolean\n isEditing: boolean\n isPanning: boolean\n pointerVelocity: Vec\n}\n\nexport interface HitTestOptions {\n margin?: number\n hitInside?: boolean\n hitLocked?: boolean\n hitFrameInside?: boolean\n filter?: (shape: UnknownShape) => boolean\n}\n\nconst RAD_PER_DEG = Math.PI / 180\n\n/**\n * The editor: document access, selection, camera, tool dispatch, and the\n * bridge that mirrors the current page into the WASM engine.\n */\nexport class Editor extends EventEmitter<EditorEvents> {\n readonly store: EditorStore\n readonly engine: EngineBridge\n readonly history: HistoryManager<EditorRecord>\n readonly root: StateNode\n readonly shapeUtils: Readonly<Record<string, ShapeUtil>>\n readonly bindingUtils: Readonly<Record<string, BindingUtil>>\n readonly options: EditorConfig\n readonly inputs: EditorInputs\n readonly handles = new HandleTable()\n /** GPU textures referenced by shape styles (images, rasterized text). */\n readonly textures: TextureManager = new TextureManager({ onChange: (keys) => this.onTexturesChanged(keys) })\n readonly snaps: SnapManager\n readonly getContainer: () => HTMLElement\n readonly sideEffects: EditorStore[\"sideEffects\"]\n\n private readonly kindIds = new Map<string, number>()\n private readonly _frameEpoch: Atom<number>\n private readonly _overlayShapeIds: Atom<readonly ShapeId[]>\n private readonly _overlayClips: Atom<readonly (ClipRect | undefined)[]>\n private readonly _isDisposed: Atom<boolean>\n private readonly _lastFrame: Atom<{ drawn: number; culled: number; ms: number }>\n private readonly disposables: (() => void)[] = []\n private syncedPageId: PageId | null = null\n /** Shapes whose last write to the engine threw; they are warned about once. */\n private readonly brokenShapeIds = new Set<ShapeId>()\n\n constructor(opts: EditorOptions) {\n super()\n this.store = opts.store\n this.engine = opts.engine\n this.getContainer = opts.getContainer\n this.options = { ...DEFAULT_EDITOR_CONFIG, ...opts.options }\n this.sideEffects = this.store.sideEffects\n this.snaps = new SnapManager(this)\n\n this._frameEpoch = atom(\"editor.frameEpoch\", 0)\n this._overlayShapeIds = atom<readonly ShapeId[]>(\"editor.overlayShapeIds\", [])\n this._overlayClips = atom<readonly (ClipRect | undefined)[]>(\"editor.overlayClips\", [])\n this._isDisposed = atom(\"editor.isDisposed\", false)\n this._lastFrame = atom(\"editor.lastFrame\", { drawn: 0, culled: 0, ms: 0 })\n\n this.inputs = {\n originPagePoint: new Vec(),\n originScreenPoint: new Vec(),\n previousPagePoint: new Vec(),\n previousScreenPoint: new Vec(),\n currentPagePoint: new Vec(),\n currentScreenPoint: new Vec(),\n keys: new Set(),\n buttons: new Set(),\n isPen: false,\n shiftKey: false,\n ctrlKey: false,\n altKey: false,\n metaKey: false,\n accelKey: false,\n isDragging: false,\n isPointing: false,\n isPinching: false,\n isEditing: false,\n isPanning: false,\n pointerVelocity: new Vec(),\n }\n\n const utils: Record<string, ShapeUtil> = {}\n let kind = 1\n for (const U of opts.shapeUtils) {\n if (utils[U.type]) throw new Error(`Duplicate ShapeUtil for type \"${U.type}\"`)\n utils[U.type] = new U(this)\n this.kindIds.set(U.type, kind++)\n }\n this.shapeUtils = utils\n\n const bindingUtils: Record<string, BindingUtil> = {}\n for (const B of opts.bindingUtils ?? []) {\n if (bindingUtils[B.type]) throw new Error(`Duplicate BindingUtil for type \"${B.type}\"`)\n bindingUtils[B.type] = new B(this)\n }\n this.bindingUtils = bindingUtils\n\n this.ensureBaseRecords()\n this.registerBindingSideEffects()\n this.registerTextureSideEffects()\n\n this.history = new HistoryManager(this.store, () => this.emit(\"update\"))\n\n const Root = createRootState(opts.tools, opts.initialState ?? opts.tools[0]?.id ?? \"\")\n this.root = new Root(this)\n this.root.enter({}, \"initial\")\n\n this.disposables.push(\n this.store.listen(\n (entry) => {\n this.syncChanges(entry.changes)\n this.emit(\"change\", { source: entry.source })\n },\n { source: \"all\", scope: \"document\" },\n ),\n this.store.listen(\n () => {\n this.bumpFrame()\n },\n { source: \"all\", scope: \"session\" },\n ),\n )\n this.syncPage(this.getCurrentPageId())\n }\n\n // ---- lifecycle ----------------------------------------------------------\n\n dispose(): void {\n if (this._isDisposed.get()) return\n this._isDisposed.set(true)\n for (const d of this.disposables) d()\n this.textures.dispose()\n this.history.destroy()\n this.removeAllListeners()\n }\n\n getIsDisposed(): boolean {\n return this._isDisposed.get()\n }\n\n private ensureBaseRecords(): void {\n transact(() => {\n if (!this.store.has(DOCUMENT_ID)) {\n this.store.put([DocumentRecordType.create({ id: DOCUMENT_ID, name: this.store.props.defaultName })])\n }\n let pages = this.store.query.records(\"page\").get()\n if (pages.length === 0) {\n const page = PageRecordType.create({ id: PageRecordType.createId(), name: \"Page 1\", index: ZERO_INDEX_KEY })\n this.store.put([page])\n pages = [page]\n }\n const sorted = sortByIndex(pages)\n const firstPage = sorted[0]!\n let instance = this.store.get(INSTANCE_ID) as Instance | undefined\n if (!instance || !this.store.has(instance.currentPageId)) {\n instance = InstanceRecordType.create({\n id: INSTANCE_ID,\n currentPageId: firstPage.id,\n })\n this.store.put([instance])\n }\n for (const p of sorted) this.ensurePageSessionRecords(p.id)\n })\n }\n\n private ensurePageSessionRecords(pageId: PageId): void {\n const camId = CameraRecordType.createId(pageId.slice(\"page:\".length))\n if (!this.store.has(camId)) this.store.put([CameraRecordType.create({ id: camId })])\n const psId = InstancePageStateRecordType.createId(pageId.slice(\"page:\".length))\n if (!this.store.has(psId)) this.store.put([InstancePageStateRecordType.create({ id: psId, pageId })])\n }\n\n // ---- reactivity helpers -------------------------------------------------\n\n /** Increments whenever the GPU frame must be redrawn. */\n getFrameEpoch(): number {\n return this._frameEpoch.get()\n }\n\n private bumpFrame(): void {\n this._frameEpoch.update((v) => v + 1)\n }\n\n /** Stats for the last rendered frame. */\n getLastFrameStats(): { drawn: number; culled: number; ms: number } {\n return this._lastFrame.get()\n }\n\n /** Shapes the DOM overlay must render this frame, in draw order. */\n getOverlayShapeIds(): readonly ShapeId[] {\n return this._overlayShapeIds.get()\n }\n\n /**\n * Page-space clip rects for the overlay shapes, parallel to\n * `getOverlayShapeIds()`; `undefined` where the shape is unclipped.\n */\n getOverlayClips(): readonly (ClipRect | undefined)[] {\n return this._overlayClips.get()\n }\n\n // ---- batching / history ------------------------------------------------\n\n run<T>(fn: () => T, opts: { history?: \"record\" | \"ignore\" | \"record-preserveRedoStack\" } = {}): T {\n return transact(() => {\n if (opts.history === \"ignore\") return this.history.ignore(fn)\n return fn()\n })\n }\n\n /** @deprecated use `run` */\n batch<T>(fn: () => T): T {\n return this.run(fn)\n }\n\n markHistoryStoppingPoint(name?: string): string {\n return this.history.mark(name)\n }\n\n /** Alias of `markHistoryStoppingPoint`. */\n mark(name?: string): string {\n return this.markHistoryStoppingPoint(name)\n }\n\n undo(): this {\n this.history.undo()\n return this\n }\n\n redo(): this {\n this.history.redo()\n return this\n }\n\n bail(): this {\n this.history.bail()\n return this\n }\n\n bailToMark(id: string): this {\n this.history.bailToMark(id)\n return this\n }\n\n squashToMark(id: string): this {\n this.history.squashToMark(id)\n return this\n }\n\n getCanUndo(): boolean {\n return this.history.getNumUndos() > 0\n }\n\n getCanRedo(): boolean {\n return this.history.getNumRedos() > 0\n }\n\n // ---- document / pages --------------------------------------------------\n\n getDocumentSettings(): Document {\n return this.store.get(DOCUMENT_ID) as Document\n }\n\n updateDocumentSettings(settings: Partial<Omit<Document, \"id\" | \"typeName\">>): this {\n this.store.put([{ ...this.getDocumentSettings(), ...settings }])\n return this\n }\n\n private readonly _pages: Computed<Page[]> = computed(\"editor.pages\", () =>\n sortByIndex(this.store.query.records(\"page\").get() as Page[]),\n )\n\n getPages(): Page[] {\n return this._pages.get()\n }\n\n getPage(id: PageId): Page | undefined {\n return this.store.get(id) as Page | undefined\n }\n\n getInstanceState(): Instance {\n return this.store.get(INSTANCE_ID) as Instance\n }\n\n updateInstanceState(partial: Partial<Omit<Instance, \"id\" | \"typeName\">>): this {\n this.run(\n () => {\n this.store.put([{ ...this.getInstanceState(), ...partial }])\n },\n { history: \"ignore\" },\n )\n return this\n }\n\n getCurrentPageId(): PageId {\n return this.getInstanceState().currentPageId\n }\n\n getCurrentPage(): Page {\n return this.getPage(this.getCurrentPageId())!\n }\n\n setCurrentPage(pageId: PageId): this {\n if (!this.store.has(pageId)) throw new Error(`Page ${pageId} does not exist`)\n if (pageId === this.getCurrentPageId()) return this\n this.run(\n () => {\n this.ensurePageSessionRecords(pageId)\n this.updateInstanceState({ currentPageId: pageId })\n },\n { history: \"ignore\" },\n )\n this.syncPage(pageId)\n return this\n }\n\n createPage(page: Partial<Omit<Page, \"id\" | \"typeName\" | \"index\">> & { id?: PageId } = {}): this {\n const pages = this.getPages()\n const index = getIndexAbove(pages.at(-1)?.index)\n const record = PageRecordType.create({\n id: page.id ?? PageRecordType.createId(),\n name: page.name ?? `Page ${pages.length + 1}`,\n index,\n meta: page.meta ?? {},\n })\n this.run(() => {\n this.store.put([record])\n this.ensurePageSessionRecords(record.id)\n })\n return this\n }\n\n deletePage(id: PageId): this {\n const pages = this.getPages()\n if (pages.length <= 1) return this\n this.run(() => {\n if (this.getCurrentPageId() === id) {\n const next = pages.find((p) => p.id !== id)!\n this.setCurrentPage(next.id)\n }\n const shapeIds = this.getPageShapeIds(id)\n this.store.remove([...shapeIds, id])\n })\n return this\n }\n\n renamePage(id: PageId, name: string): this {\n const page = this.getPage(id)\n if (page) this.store.put([{ ...page, name }])\n return this\n }\n\n getCurrentPageState(): InstancePageState {\n const id = InstancePageStateRecordType.createId(this.getCurrentPageId().slice(\"page:\".length))\n return this.store.get(id) as InstancePageState\n }\n\n updateCurrentPageState(partial: Partial<Omit<InstancePageState, \"id\" | \"typeName\" | \"pageId\">>): this {\n this.run(\n () => {\n this.store.put([{ ...this.getCurrentPageState(), ...partial }])\n },\n { history: \"ignore\" },\n )\n return this\n }\n\n // ---- shapes: reading ---------------------------------------------------\n\n private readonly _allShapes: Computed<UnknownShape[]> = computed(\"editor.allShapes\", () =>\n this.store.query.records(\"shape\").get() as UnknownShape[],\n )\n\n private readonly _currentPageShapes: Computed<UnknownShape[]> = computed(\"editor.currentPageShapes\", () => {\n const pageId = this.getCurrentPageId()\n return this._allShapes.get().filter((s) => this.getAncestorPageId(s) === pageId)\n })\n\n private readonly _currentPageShapeIds: Computed<Set<ShapeId>> = computed(\"editor.currentPageShapeIds\", () => {\n return new Set(this._currentPageShapes.get().map((s) => s.id))\n })\n\n getShape<T extends UnknownShape = UnknownShape>(id: ShapeId | T): T | undefined {\n const shapeId = typeof id === \"string\" ? id : id.id\n return this.store.get(shapeId) as T | undefined\n }\n\n getShapeUtil<T extends UnknownShape>(shape: T | T[\"type\"]): ShapeUtil<T> {\n const type = typeof shape === \"string\" ? shape : shape.type\n const util = this.shapeUtils[type]\n if (!util) throw new Error(`No ShapeUtil registered for type \"${type}\"`)\n return util as ShapeUtil<T>\n }\n\n hasShapeUtil(type: string): boolean {\n return type in this.shapeUtils\n }\n\n getCurrentPageShapes(): UnknownShape[] {\n return this._currentPageShapes.get()\n }\n\n getCurrentPageShapeIds(): Set<ShapeId> {\n return this._currentPageShapeIds.get()\n }\n\n getCurrentPageShapesSorted(): UnknownShape[] {\n const result: UnknownShape[] = []\n const visit = (parentId: ParentId): void => {\n for (const child of this.getSortedChildIdsForParent(parentId)) {\n const shape = this.getShape(child)\n if (!shape) continue\n result.push(shape)\n visit(shape.id)\n }\n }\n visit(this.getCurrentPageId())\n return result\n }\n\n getPageShapeIds(pageId: PageId): ShapeId[] {\n return this._allShapes\n .get()\n .filter((s) => this.getAncestorPageId(s) === pageId)\n .map((s) => s.id)\n }\n\n getAncestorPageId(shape: UnknownShape | ShapeId | undefined): PageId | undefined {\n let cur = typeof shape === \"string\" ? this.getShape(shape) : shape\n let guard = 0\n while (cur && guard++ < 1000) {\n if (isPageId(cur.parentId)) return cur.parentId\n cur = this.getShape(cur.parentId)\n }\n return undefined\n }\n\n getShapeParent(shape: UnknownShape | ShapeId): UnknownShape | undefined {\n const s = typeof shape === \"string\" ? this.getShape(shape) : shape\n if (!s || isPageId(s.parentId)) return undefined\n return this.getShape(s.parentId)\n }\n\n getSortedChildIdsForParent(parentId: ParentId): ShapeId[] {\n const children = this._allShapes.get().filter((s) => s.parentId === parentId)\n return sortByIndex(children).map((s) => s.id)\n }\n\n getHighestIndexForParent(parentId: ParentId): IndexKey {\n const children = this._allShapes.get().filter((s) => s.parentId === parentId)\n if (children.length === 0) return ZERO_INDEX_KEY\n return getIndexAbove(sortByIndex(children).at(-1)!.index)\n }\n\n getShapeGeometry<G extends Geometry2d = Geometry2d>(shape: UnknownShape | ShapeId): G {\n const s = typeof shape === \"string\" ? this.getShape(shape) : shape\n if (!s) throw new Error(`Shape not found`)\n return this.getShapeUtil(s).getGeometry(s) as G\n }\n\n /** Local → parent transform components. */\n getShapeLocalTransform(shape: UnknownShape): { a: number; b: number; c: number; d: number; e: number; f: number } {\n const c = Math.cos(shape.rotation)\n const s = Math.sin(shape.rotation)\n return { a: c, b: s, c: -s, d: c, e: shape.x, f: shape.y }\n }\n\n getShapeParentTransform(shape: UnknownShape): { a: number; b: number; c: number; d: number; e: number; f: number } {\n const parent = this.getShapeParent(shape)\n return parent ? this.getShapePageTransform(parent) : { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 }\n }\n\n getShapePageTransform(shape: UnknownShape | ShapeId): { a: number; b: number; c: number; d: number; e: number; f: number } {\n const s = typeof shape === \"string\" ? this.getShape(shape) : shape\n if (!s) return { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 }\n const p = this.getShapeParentTransform(s)\n const l = this.getShapeLocalTransform(s)\n return {\n a: p.a * l.a + p.c * l.b,\n b: p.b * l.a + p.d * l.b,\n c: p.a * l.c + p.c * l.d,\n d: p.b * l.c + p.d * l.d,\n e: p.a * l.e + p.c * l.f + p.e,\n f: p.b * l.e + p.d * l.f + p.f,\n }\n }\n\n getShapePageBounds(shape: UnknownShape | ShapeId): Box | undefined {\n const s = typeof shape === \"string\" ? this.getShape(shape) : shape\n if (!s) return undefined\n const m = this.getShapePageTransform(s)\n const b = this.getShapeGeometry(s).bounds\n return Box.FromPoints(b.corners.map((c) => new Vec(m.a * c.x + m.c * c.y + m.e, m.b * c.x + m.d * c.y + m.f)))\n }\n\n getShapeGeometryBounds(shape: UnknownShape | ShapeId): Box | undefined {\n const s = typeof shape === \"string\" ? this.getShape(shape) : shape\n return s ? this.getShapeGeometry(s).bounds : undefined\n }\n\n /** Transform a page point into the shape's local space. */\n getPointInShapeSpace(shape: UnknownShape | ShapeId, point: VecLike): Vec {\n const m = this.getShapePageTransform(shape)\n const det = m.a * m.d - m.b * m.c\n if (Math.abs(det) < 1e-12) return new Vec(point.x, point.y)\n const inv = 1 / det\n const a = m.d * inv\n const b = -m.b * inv\n const c = -m.c * inv\n const d = m.a * inv\n const e = -(a * m.e + c * m.f)\n const f = -(b * m.e + d * m.f)\n return new Vec(a * point.x + c * point.y + e, b * point.x + d * point.y + f)\n }\n\n getPointInParentSpace(shape: UnknownShape | ShapeId, point: VecLike): Vec {\n const s = typeof shape === \"string\" ? this.getShape(shape) : shape\n if (!s) return new Vec(point.x, point.y)\n const parent = this.getShapeParent(s)\n return parent ? this.getPointInShapeSpace(parent, point) : new Vec(point.x, point.y)\n }\n\n getShapeParentAtPoint(_point: VecLike): UnknownShape | undefined {\n return undefined\n }\n\n // ---- engine-backed spatial queries -------------------------------------\n\n private hitFilterBits(opts: HitTestOptions): number {\n let bits = 0\n if (opts.hitLocked) bits |= 1\n return bits\n }\n\n getShapeAtPoint(point: VecLike, opts: HitTestOptions = {}): UnknownShape | undefined {\n this.flushEngine()\n const margin = (opts.margin ?? this.options.hitTestMargin) / this.getZoomLevel()\n const bits = this.hitFilterBits(opts) | (opts.hitInside ? 0 : 4)\n if (!opts.filter) {\n const h = this.engine.hitTest(point.x, point.y, margin, bits)\n const id = this.handles.id(h)\n return id ? this.getShape(id as ShapeId) : undefined\n }\n for (const shape of this.getShapesAtPoint(point, opts)) {\n if (opts.filter(shape)) return shape\n }\n return undefined\n }\n\n /** Shapes under a point, topmost first. */\n getShapesAtPoint(point: VecLike, opts: HitTestOptions = {}): UnknownShape[] {\n this.flushEngine()\n const margin = (opts.margin ?? this.options.hitTestMargin) / this.getZoomLevel()\n const handles = this.engine.queryBox(point.x - margin, point.y - margin, point.x + margin, point.y + margin, 0, this.hitFilterBits(opts))\n const out: UnknownShape[] = []\n for (let i = handles.length - 1; i >= 0; i--) {\n const id = this.handles.id(handles[i]!)\n const shape = id ? this.getShape(id as ShapeId) : undefined\n if (!shape) continue\n if (opts.filter && !opts.filter(shape)) continue\n const local = this.getPointInShapeSpace(shape, point)\n const geo = this.getShapeGeometry(shape)\n if (geo.hitTestPoint(local, margin, opts.hitInside ?? false)) out.push(shape)\n }\n return out\n }\n\n /** Shapes fully inside a page box, in draw order. */\n getShapesInsideBounds(box: BoxLike, opts: HitTestOptions = {}): UnknownShape[] {\n this.flushEngine()\n const handles = this.engine.queryBox(box.x, box.y, box.x + box.w, box.y + box.h, 1, this.hitFilterBits(opts))\n return this.handlesToShapes(handles, opts.filter)\n }\n\n /** Shapes whose outline touches a page box, in draw order. */\n getShapesIntersectingBounds(box: BoxLike, opts: HitTestOptions = {}): UnknownShape[] {\n this.flushEngine()\n const handles = this.engine.queryBox(box.x, box.y, box.x + box.w, box.y + box.h, 0, this.hitFilterBits(opts))\n return this.handlesToShapes(handles, opts.filter)\n }\n\n private handlesToShapes(handles: Uint32Array, filter?: (s: UnknownShape) => boolean): UnknownShape[] {\n const out: UnknownShape[] = []\n for (const h of handles) {\n const id = this.handles.id(h)\n const shape = id ? this.getShape(id as ShapeId) : undefined\n if (shape && (!filter || filter(shape))) out.push(shape)\n }\n return out\n }\n\n /**\n * Union of every shape's page bounds on the current page, or undefined when\n * the page is empty.\n *\n * Geometry, not ink: this is the union of `getShapePageBounds()` and excludes\n * the half-stroke pad the engine keeps for culling. The pad is per-shape, so\n * including it would both inflate the box and shift its centre whenever the\n * outermost shapes carry different stroke widths.\n */\n getCurrentPageBounds(): Box | undefined {\n this.flushEngine()\n const b = this.engine.allGeometryBounds()\n return b ? Box.FromMinMax(b[0], b[1], b[2], b[3]) : undefined\n }\n\n // ---- shapes: writing ---------------------------------------------------\n\n createShape<T extends UnknownShape>(partial: ShapeCreate<T>): this {\n return this.createShapes([partial])\n }\n\n createShapes<T extends UnknownShape>(partials: readonly ShapeCreate<T>[]): this {\n if (partials.length === 0) return this\n const currentPageId = this.getCurrentPageId()\n const count = this.getCurrentPageShapeIds().size\n if (count + partials.length > this.options.maxShapesPerPage) {\n this.emit(\"max-shapes\", { name: this.getCurrentPage().name, pageId: currentPageId, count })\n // Still allow creation; the limit is advisory in mocanvas.\n }\n this.run(() => {\n const records: UnknownShape[] = []\n const indexCache = new Map<ParentId, IndexKey>()\n for (const partial of partials) {\n const util = this.getShapeUtil<T>(partial.type)\n const parentId = (partial.parentId ?? currentPageId) as ParentId\n let index = partial.index as IndexKey | undefined\n if (!index) {\n const prev = indexCache.get(parentId) ?? this.getHighestIndexForParent(parentId)\n index = indexCache.has(parentId) ? getIndexAbove(prev) : prev\n indexCache.set(parentId, index)\n }\n const props: Record<string, unknown> = { ...(util.getDefaultProps() as Record<string, unknown>) }\n // Styles remembered for the next shape, unless the caller sets them explicitly.\n const styles = this.getInstanceState().stylesForNextShape\n for (const [key, style] of this.getStylePropsForType(partial.type)) {\n if (style.id in styles) props[key] = styles[style.id]\n }\n // An explicitly `undefined` prop must not shadow the util's default,\n // or the new shape would reach the engine missing a prop it declares.\n for (const [key, value] of Object.entries(partial.props ?? {})) {\n if (value !== undefined) props[key] = value\n }\n let shape = ShapeRecordType.create({\n id: partial.id ?? ShapeRecordType.createId(),\n type: partial.type,\n x: partial.x ?? 0,\n y: partial.y ?? 0,\n rotation: partial.rotation ?? 0,\n index,\n parentId,\n isLocked: partial.isLocked ?? false,\n opacity: partial.opacity ?? 1,\n props: props as T[\"props\"],\n meta: { ...(partial.meta ?? {}) },\n }) as T\n const next = util.onBeforeCreate?.(shape)\n if (next) shape = next\n records.push(shape)\n }\n this.store.put(records)\n })\n return this\n }\n\n updateShape<T extends UnknownShape>(partial: ShapePartial<T> | null | undefined): this {\n return partial ? this.updateShapes([partial]) : this\n }\n\n updateShapes<T extends UnknownShape>(partials: readonly (ShapePartial<T> | null | undefined)[]): this {\n this.run(() => {\n const records: UnknownShape[] = []\n for (const partial of partials) {\n if (!partial) continue\n const prev = this.getShape<T>(partial.id)\n if (!prev) continue\n const util = this.getShapeUtil<T>(prev)\n let next: T = {\n ...prev,\n ...partial,\n props: partial.props ? { ...prev.props, ...partial.props } : prev.props,\n meta: partial.meta ? { ...prev.meta, ...partial.meta } : prev.meta,\n } as T\n const adjusted = util.onBeforeUpdate?.(prev, next)\n if (adjusted) next = adjusted\n records.push(next)\n }\n if (records.length) this.store.put(records)\n })\n return this\n }\n\n deleteShape(id: ShapeId | UnknownShape): this {\n return this.deleteShapes([id])\n }\n\n deleteShapes(ids: readonly (ShapeId | UnknownShape)[]): this {\n const shapeIds = ids.map((s) => (typeof s === \"string\" ? s : s.id))\n if (shapeIds.length === 0) return this\n const toDelete = new Set<ShapeId>()\n const collect = (id: ShapeId): void => {\n if (toDelete.has(id)) return\n toDelete.add(id)\n for (const child of this.getSortedChildIdsForParent(id)) collect(child)\n }\n for (const id of shapeIds) {\n const shape = this.getShape(id)\n if (shape && !shape.isLocked) collect(id)\n }\n if (toDelete.size === 0) return this\n this.run(() => {\n const ps = this.getCurrentPageState()\n const selected = ps.selectedShapeIds.filter((id) => !toDelete.has(id))\n if (selected.length !== ps.selectedShapeIds.length) this.setSelectedShapes(selected)\n if (ps.hoveredShapeId && toDelete.has(ps.hoveredShapeId)) this.setHoveredShape(null)\n if (ps.editingShapeId && toDelete.has(ps.editingShapeId)) this.setEditingShape(null)\n this.store.remove([...toDelete])\n })\n return this\n }\n\n reparentShapes(ids: readonly ShapeId[], parentId: ParentId, insertIndex?: IndexKey): this {\n this.run(() => {\n let index = insertIndex ?? this.getHighestIndexForParent(parentId)\n const updates: ShapePartial[] = []\n const parentTransform =\n isShapeId(parentId) ? this.getShapePageTransform(parentId) : { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 }\n for (const id of ids) {\n const shape = this.getShape(id)\n if (!shape || shape.parentId === parentId) continue\n const pageXf = this.getShapePageTransform(shape)\n // page position of shape origin → new parent's local space\n const px = pageXf.e\n const py = pageXf.f\n const det = parentTransform.a * parentTransform.d - parentTransform.b * parentTransform.c\n const inv = 1 / (det || 1)\n const lx = (parentTransform.d * (px - parentTransform.e) - parentTransform.c * (py - parentTransform.f)) * inv\n const ly = (-parentTransform.b * (px - parentTransform.e) + parentTransform.a * (py - parentTransform.f)) * inv\n const parentRot = Math.atan2(parentTransform.b, parentTransform.a)\n const pageRot = Math.atan2(pageXf.b, pageXf.a)\n updates.push({ id, type: shape.type, parentId, index, x: lx, y: ly, rotation: pageRot - parentRot })\n index = getIndexAbove(index)\n }\n this.updateShapes(updates)\n })\n return this\n }\n\n // ---- bindings ----------------------------------------------------------\n\n private readonly _allBindings: Computed<UnknownBinding[]> = computed(\"editor.allBindings\", () =>\n this.store.query.records(\"binding\").get() as UnknownBinding[],\n )\n\n getBindingUtil<B extends UnknownBinding>(binding: B | B[\"type\"]): BindingUtil<B> {\n const type = typeof binding === \"string\" ? binding : binding.type\n const util = this.bindingUtils[type]\n if (!util) throw new Error(`No BindingUtil registered for type \"${type}\"`)\n return util as BindingUtil<B>\n }\n\n hasBindingUtil(type: string): boolean {\n return type in this.bindingUtils\n }\n\n getBinding<B extends UnknownBinding = UnknownBinding>(id: BindingId): B | undefined {\n return this.store.get(id) as B | undefined\n }\n\n getBindingsFromShape<B extends UnknownBinding = UnknownBinding>(shape: UnknownShape | ShapeId, type?: B[\"type\"]): B[] {\n const id = typeof shape === \"string\" ? shape : shape.id\n return this._allBindings.get().filter((b) => b.fromId === id && (!type || b.type === type)) as B[]\n }\n\n getBindingsToShape<B extends UnknownBinding = UnknownBinding>(shape: UnknownShape | ShapeId, type?: B[\"type\"]): B[] {\n const id = typeof shape === \"string\" ? shape : shape.id\n return this._allBindings.get().filter((b) => b.toId === id && (!type || b.type === type)) as B[]\n }\n\n getBindingsInvolvingShape<B extends UnknownBinding = UnknownBinding>(shape: UnknownShape | ShapeId, type?: B[\"type\"]): B[] {\n const id = typeof shape === \"string\" ? shape : shape.id\n return this._allBindings.get().filter((b) => (b.fromId === id || b.toId === id) && (!type || b.type === type)) as B[]\n }\n\n createBinding<B extends UnknownBinding>(partial: BindingCreate<B>): this {\n return this.createBindings([partial])\n }\n\n createBindings<B extends UnknownBinding>(partials: readonly BindingCreate<B>[]): this {\n if (partials.length === 0) return this\n this.run(() => {\n const records: UnknownBinding[] = []\n for (const partial of partials) {\n const util = this.getBindingUtil<B>(partial.type)\n if (!this.getShape(partial.fromId) || !this.getShape(partial.toId)) continue\n let binding = BindingRecordType.create({\n id: partial.id ?? BindingRecordType.createId(),\n type: partial.type,\n fromId: partial.fromId,\n toId: partial.toId,\n props: { ...util.getDefaultProps(), ...(partial.props ?? {}) },\n meta: { ...(partial.meta ?? {}) } as UnknownBinding[\"meta\"],\n }) as B\n const next = util.onBeforeCreate?.({ binding })\n if (next) binding = next\n records.push(binding)\n }\n this.store.put(records)\n })\n return this\n }\n\n updateBinding<B extends UnknownBinding>(partial: BindingPartial<B>): this {\n return this.updateBindings([partial])\n }\n\n updateBindings<B extends UnknownBinding>(partials: readonly BindingPartial<B>[]): this {\n this.run(() => {\n const records: UnknownBinding[] = []\n for (const partial of partials) {\n const prev = this.getBinding<B>(partial.id)\n if (!prev) continue\n let next: B = {\n ...prev,\n ...partial,\n props: partial.props ? { ...prev.props, ...partial.props } : prev.props,\n meta: partial.meta ? { ...prev.meta, ...partial.meta } : prev.meta,\n } as B\n const adjusted = this.getBindingUtil<B>(prev).onBeforeChange?.({ bindingBefore: prev, bindingAfter: next })\n if (adjusted) next = adjusted\n records.push(next)\n }\n if (records.length) this.store.put(records)\n })\n return this\n }\n\n deleteBinding(id: BindingId | UnknownBinding, opts: { isolateShapes?: boolean } = {}): this {\n return this.deleteBindings([id], opts)\n }\n\n deleteBindings(ids: readonly (BindingId | UnknownBinding)[], opts: { isolateShapes?: boolean } = {}): this {\n const bindingIds = ids.map((b) => (typeof b === \"string\" ? b : b.id))\n if (bindingIds.length === 0) return this\n this.run(() => {\n if (opts.isolateShapes) {\n for (const id of bindingIds) {\n const binding = this.getBinding(id)\n if (!binding) continue\n const util = this.getBindingUtil(binding)\n util.onBeforeIsolateFromShape?.({ binding })\n util.onBeforeIsolateToShape?.({ binding })\n }\n }\n this.store.remove(bindingIds.filter((id) => this.store.has(id)))\n })\n return this\n }\n\n /** Store side effects that keep bindings consistent with their shapes. */\n private registerBindingSideEffects(): void {\n const se = this.store.sideEffects\n this.disposables.push(\n se.registerAfterCreateHandler(\"binding\", (record) => {\n if (!isBinding(record) || !this.hasBindingUtil(record.type)) return\n this.getBindingUtil(record).onAfterCreate?.({ binding: record })\n }),\n se.registerAfterChangeHandler(\"binding\", (prev, next) => {\n if (!isBinding(next) || !isBinding(prev) || !this.hasBindingUtil(next.type)) return\n this.getBindingUtil(next).onAfterChange?.({ bindingBefore: prev, bindingAfter: next })\n }),\n se.registerBeforeDeleteHandler(\"binding\", (record) => {\n if (!isBinding(record) || !this.hasBindingUtil(record.type)) return\n this.getBindingUtil(record).onBeforeDelete?.({ binding: record })\n }),\n se.registerAfterDeleteHandler(\"binding\", (record) => {\n if (!isBinding(record) || !this.hasBindingUtil(record.type)) return\n this.getBindingUtil(record).onAfterDelete?.({ binding: record })\n }),\n se.registerAfterChangeHandler(\"shape\", (prev, next) => {\n if (prev.typeName !== \"shape\" || next.typeName !== \"shape\") return\n if (this._allBindings.get().length === 0) return\n for (const binding of this.getBindingsInvolvingShape(next.id)) {\n if (!this.hasBindingUtil(binding.type)) continue\n const util = this.getBindingUtil(binding)\n if (binding.fromId === next.id) util.onAfterChangeFromShape?.({ binding, shapeBefore: prev, shapeAfter: next, reason: \"self\" })\n if (binding.toId === next.id) util.onAfterChangeToShape?.({ binding, shapeBefore: prev, shapeAfter: next, reason: \"self\" })\n }\n }),\n se.registerBeforeDeleteHandler(\"shape\", (record) => {\n if (record.typeName !== \"shape\") return\n const bindings = this.getBindingsInvolvingShape(record.id)\n if (bindings.length === 0) return\n for (const binding of bindings) {\n if (!this.hasBindingUtil(binding.type)) continue\n const util = this.getBindingUtil(binding)\n if (binding.fromId === record.id) util.onBeforeDeleteFromShape?.({ binding, shape: record })\n if (binding.toId === record.id) util.onBeforeDeleteToShape?.({ binding, shape: record })\n }\n this.store.remove(bindings.map((b) => b.id).filter((id) => this.store.has(id)))\n }),\n )\n }\n\n /** Duplicate shapes (and their descendants) with new ids, offset by `offset` in page space. Returns the new top-level ids. */\n duplicateShapes(ids: readonly ShapeId[] = this.getSelectedShapeIds(), offset: VecLike = { x: 20, y: 20 }): ShapeId[] {\n if (ids.length === 0) return []\n const idMap = new Map<ShapeId, ShapeId>()\n const collect = (id: ShapeId): void => {\n if (idMap.has(id)) return\n idMap.set(id, ShapeRecordType.createId() as ShapeId)\n for (const c of this.getSortedChildIdsForParent(id)) collect(c)\n }\n for (const id of ids) collect(id)\n const topLevel = new Set(ids)\n const creates: ShapeCreate[] = []\n // Preserve draw order.\n for (const shape of this.getCurrentPageShapesSorted()) {\n const newId = idMap.get(shape.id)\n if (!newId) continue\n const parentId = isShapeId(shape.parentId) && idMap.has(shape.parentId) ? idMap.get(shape.parentId)! : shape.parentId\n const isTop = topLevel.has(shape.id) || !idMap.has(shape.parentId as ShapeId)\n creates.push({\n ...shape,\n id: newId,\n parentId,\n x: shape.x + (isTop ? offset.x : 0),\n y: shape.y + (isTop ? offset.y : 0),\n index: undefined as unknown as IndexKey,\n props: { ...shape.props },\n meta: { ...shape.meta },\n })\n }\n this.run(() => {\n this.createShapes(creates)\n // Copy bindings between duplicated shapes.\n const bindingCreates: BindingCreate[] = []\n for (const b of this._allBindings.get()) {\n const from = idMap.get(b.fromId)\n const to = idMap.get(b.toId)\n if (from && to) bindingCreates.push({ type: b.type, fromId: from, toId: to, props: { ...b.props }, meta: { ...b.meta } })\n }\n if (bindingCreates.length) this.createBindings(bindingCreates)\n })\n return ids.map((id) => idMap.get(id)!)\n }\n\n /** Serializable content for the clipboard: shapes (with descendants) and bindings between them. */\n getContentFromCurrentPage(ids: readonly ShapeId[]): { shapes: UnknownShape[]; bindings: UnknownBinding[] } | undefined {\n if (ids.length === 0) return undefined\n const set = new Set<ShapeId>()\n const collect = (id: ShapeId): void => {\n if (set.has(id)) return\n set.add(id)\n for (const c of this.getSortedChildIdsForParent(id)) collect(c)\n }\n for (const id of ids) collect(id)\n const shapes = this.getCurrentPageShapesSorted().filter((s) => set.has(s.id))\n const bindings = this._allBindings.get().filter((b) => set.has(b.fromId) && set.has(b.toId))\n return { shapes, bindings }\n }\n\n /** Insert clipboard content at a page point (centered), with fresh ids. Returns the new ids. */\n putContentOntoCurrentPage(content: { shapes: UnknownShape[]; bindings?: UnknownBinding[] }, opts: { point?: VecLike; select?: boolean } = {}): ShapeId[] {\n const { shapes } = content\n if (shapes.length === 0) return []\n const idMap = new Map<ShapeId, ShapeId>()\n for (const s of shapes) idMap.set(s.id, ShapeRecordType.createId() as ShapeId)\n const pageId = this.getCurrentPageId()\n const tops = shapes.filter((s) => !idMap.has(s.parentId as ShapeId))\n let offset = new Vec(0, 0)\n if (opts.point) {\n // Center the content's top-level bounds on the point.\n const boxes = tops.map((s) => {\n const util = this.shapeUtils[s.type]\n const b = util ? util.getGeometry(s).bounds : new Box(0, 0, 0, 0)\n return new Box(s.x + b.x, s.y + b.y, b.w, b.h)\n })\n const common = Box.Common(boxes)\n offset = Vec.Sub(opts.point, common.center)\n }\n const creates: ShapeCreate[] = shapes.map((s) => {\n const isTop = !idMap.has(s.parentId as ShapeId)\n return {\n ...s,\n id: idMap.get(s.id)!,\n parentId: isTop ? pageId : idMap.get(s.parentId as ShapeId)!,\n x: s.x + (isTop ? offset.x : 0),\n y: s.y + (isTop ? offset.y : 0),\n index: undefined as unknown as IndexKey,\n props: { ...s.props },\n meta: { ...s.meta },\n }\n })\n this.run(() => {\n this.createShapes(creates.filter((c) => this.hasShapeUtil(c.type)))\n const bindingCreates: BindingCreate[] = []\n for (const b of content.bindings ?? []) {\n const from = idMap.get(b.fromId)\n const to = idMap.get(b.toId)\n if (from && to && this.hasBindingUtil(b.type)) bindingCreates.push({ type: b.type, fromId: from, toId: to, props: { ...b.props }, meta: { ...b.meta } })\n }\n if (bindingCreates.length) this.createBindings(bindingCreates)\n if (opts.select ?? true) this.setSelectedShapes(tops.map((s) => idMap.get(s.id)!))\n })\n return tops.map((s) => idMap.get(s.id)!)\n }\n\n // ---- styles ------------------------------------------------------------\n\n private readonly stylePropCache = new Map<string, Map<string, StyleProp<unknown>>>()\n\n /** Style props declared by the ShapeUtil for a type, keyed by prop name. */\n getStylePropsForType(type: string): Map<string, StyleProp<unknown>> {\n let m = this.stylePropCache.get(type)\n if (!m) {\n const ctor = this.shapeUtils[type]?.constructor as ShapeUtilConstructor | undefined\n m = getStylePropsOf(ctor?.props)\n this.stylePropCache.set(type, m)\n }\n return m\n }\n\n getStyleForNextShape<T>(style: StyleProp<T>): T {\n const v = this.getInstanceState().stylesForNextShape[style.id]\n return v === undefined ? style.defaultValue : (v as T)\n }\n\n setStyleForNextShapes<T>(style: StyleProp<T>, value: T): this {\n const styles = this.getInstanceState().stylesForNextShape\n if (styles[style.id] === value) return this\n return this.updateInstanceState({ stylesForNextShape: { ...styles, [style.id]: value } })\n }\n\n /** Set a style on every selected shape that declares it. */\n setStyleForSelectedShapes<T>(style: StyleProp<T>, value: T): this {\n const updates: ShapePartial[] = []\n for (const shape of this.getSelectedShapes()) {\n for (const [key, sp] of this.getStylePropsForType(shape.type)) {\n if (sp !== style) continue\n if ((shape.props as Record<string, unknown>)[key] === value) continue\n updates.push({ id: shape.id, type: shape.type, props: { [key]: value } })\n }\n }\n if (updates.length) this.updateShapes(updates)\n return this\n }\n\n /** Styles of the selection (or of the next shape when nothing is selected). */\n getSharedStyles(): SharedStyleMap {\n const map = new SharedStyleMap()\n const selected = this.getSelectedShapes()\n if (selected.length === 0) {\n const styles = this.getInstanceState().stylesForNextShape\n const seen = new Set<StyleProp<unknown>>()\n for (const type of Object.keys(this.shapeUtils)) {\n for (const sp of this.getStylePropsForType(type).values()) {\n if (seen.has(sp)) continue\n seen.add(sp)\n map.applyValue(sp, styles[sp.id] ?? sp.defaultValue)\n }\n }\n return map\n }\n for (const shape of selected) {\n for (const [key, sp] of this.getStylePropsForType(shape.type)) {\n map.applyValue(sp, (shape.props as Record<string, unknown>)[key])\n }\n }\n return map\n }\n\n // ---- bulk transforms ---------------------------------------------------\n\n /** Move shapes by a page-space offset. */\n nudgeShapes(ids: readonly ShapeId[], offset: VecLike): this {\n const updates: ShapePartial[] = []\n for (const id of ids) {\n const shape = this.getShape(id)\n if (!shape || shape.isLocked) continue\n const parent = this.getShapeParent(shape)\n let d = new Vec(offset.x, offset.y)\n if (parent) {\n const m = this.getShapePageTransform(parent)\n const det = m.a * m.d - m.b * m.c || 1\n d = new Vec((m.d * d.x - m.c * d.y) / det, (-m.b * d.x + m.a * d.y) / det)\n }\n updates.push({ id, type: shape.type, x: shape.x + d.x, y: shape.y + d.y })\n }\n return this.updateShapes(updates)\n }\n\n /** Rotate shapes by `delta` radians around the center of their common page bounds. */\n rotateShapesBy(ids: readonly ShapeId[], delta: number, center?: VecLike): this {\n const shapes = ids.map((id) => this.getShape(id)).filter((s): s is UnknownShape => !!s && !s.isLocked)\n if (shapes.length === 0) return this\n const boxes = shapes.map((s) => this.getShapePageBounds(s)).filter((b): b is Box => !!b)\n const c = center ?? Box.Common(boxes).center\n const updates: ShapePartial[] = []\n for (const shape of shapes) {\n const m = this.getShapePageTransform(shape)\n const newPagePos = Vec.RotWith(new Vec(m.e, m.f), c, delta)\n const parentPoint = this.getPointInParentSpace(shape, newPagePos)\n updates.push({ id: shape.id, type: shape.type, x: parentPoint.x, y: parentPoint.y, rotation: shape.rotation + delta })\n }\n return this.updateShapes(updates)\n }\n\n /** Mirror shapes across the center of their common bounds. Positions flip; geometry is not mirrored. */\n flipShapes(ids: readonly ShapeId[], operation: \"horizontal\" | \"vertical\"): this {\n const shapes = ids.map((id) => this.getShape(id)).filter((s): s is UnknownShape => !!s && !s.isLocked)\n if (shapes.length < 1) return this\n const boxes = shapes.map((s) => this.getShapePageBounds(s)!)\n const common = Box.Common(boxes)\n const updates: ShapePartial[] = []\n shapes.forEach((shape, i) => {\n const b = boxes[i]!\n const nb =\n operation === \"horizontal\"\n ? new Box(common.maxX - (b.maxX - common.x), b.y, b.w, b.h)\n : new Box(b.x, common.maxY - (b.maxY - common.y), b.w, b.h)\n const d = new Vec(nb.x - b.x, nb.y - b.y)\n const m = this.getShapePageTransform(shape)\n const parentPoint = this.getPointInParentSpace(shape, new Vec(m.e + d.x, m.f + d.y))\n updates.push({ id: shape.id, type: shape.type, x: parentPoint.x, y: parentPoint.y })\n })\n return this.updateShapes(updates)\n }\n\n /** Align shapes along an edge or center of their common bounds. */\n alignShapes(ids: readonly ShapeId[], operation: \"left\" | \"center-horizontal\" | \"right\" | \"top\" | \"center-vertical\" | \"bottom\"): this {\n const shapes = ids.map((id) => this.getShape(id)).filter((s): s is UnknownShape => !!s && !s.isLocked)\n if (shapes.length < 2) return this\n const boxes = shapes.map((s) => this.getShapePageBounds(s)!)\n const common = Box.Common(boxes)\n const updates: ShapePartial[] = []\n shapes.forEach((shape, i) => {\n const b = boxes[i]!\n let d = new Vec()\n switch (operation) {\n case \"left\":\n d = new Vec(common.x - b.x, 0)\n break\n case \"center-horizontal\":\n d = new Vec(common.center.x - b.center.x, 0)\n break\n case \"right\":\n d = new Vec(common.maxX - b.maxX, 0)\n break\n case \"top\":\n d = new Vec(0, common.y - b.y)\n break\n case \"center-vertical\":\n d = new Vec(0, common.center.y - b.center.y)\n break\n case \"bottom\":\n d = new Vec(0, common.maxY - b.maxY)\n break\n }\n if (d.x === 0 && d.y === 0) return\n const m = this.getShapePageTransform(shape)\n const parentPoint = this.getPointInParentSpace(shape, new Vec(m.e + d.x, m.f + d.y))\n updates.push({ id: shape.id, type: shape.type, x: parentPoint.x, y: parentPoint.y })\n })\n return this.updateShapes(updates)\n }\n\n /** Space shapes evenly between the first and last along an axis. */\n distributeShapes(ids: readonly ShapeId[], operation: \"horizontal\" | \"vertical\"): this {\n const shapes = ids.map((id) => this.getShape(id)).filter((s): s is UnknownShape => !!s && !s.isLocked)\n if (shapes.length < 3) return this\n const items = shapes.map((s) => ({ shape: s, b: this.getShapePageBounds(s)! }))\n const horizontal = operation === \"horizontal\"\n items.sort((a, b) => (horizontal ? a.b.center.x - b.b.center.x : a.b.center.y - b.b.center.y))\n const first = items[0]!\n const last = items.at(-1)!\n const span = horizontal ? last.b.x - (first.b.maxX) : last.b.y - first.b.maxY\n const inner = items.slice(1, -1)\n const totalInner = inner.reduce((acc, i) => acc + (horizontal ? i.b.w : i.b.h), 0)\n const gap = (span - totalInner) / (inner.length + 1)\n let cursor = horizontal ? first.b.maxX + gap : first.b.maxY + gap\n const updates: ShapePartial[] = []\n for (const it of inner) {\n const d = horizontal ? new Vec(cursor - it.b.x, 0) : new Vec(0, cursor - it.b.y)\n cursor += (horizontal ? it.b.w : it.b.h) + gap\n const m = this.getShapePageTransform(it.shape)\n const parentPoint = this.getPointInParentSpace(it.shape, new Vec(m.e + d.x, m.f + d.y))\n updates.push({ id: it.shape.id, type: it.shape.type, x: parentPoint.x, y: parentPoint.y })\n }\n return this.updateShapes(updates)\n }\n\n /** Stack shapes edge to edge with a fixed gap along an axis (order by current position). */\n stackShapes(ids: readonly ShapeId[], operation: \"horizontal\" | \"vertical\", gap = 16): this {\n const shapes = ids.map((id) => this.getShape(id)).filter((s): s is UnknownShape => !!s && !s.isLocked)\n if (shapes.length < 2) return this\n const items = shapes.map((s) => ({ shape: s, b: this.getShapePageBounds(s)! }))\n const horizontal = operation === \"horizontal\"\n items.sort((a, b) => (horizontal ? a.b.x - b.b.x : a.b.y - b.b.y))\n let cursor = horizontal ? items[0]!.b.maxX + gap : items[0]!.b.maxY + gap\n const updates: ShapePartial[] = []\n for (const it of items.slice(1)) {\n const d = horizontal ? new Vec(cursor - it.b.x, 0) : new Vec(0, cursor - it.b.y)\n cursor += (horizontal ? it.b.w : it.b.h) + gap\n const m = this.getShapePageTransform(it.shape)\n const parentPoint = this.getPointInParentSpace(it.shape, new Vec(m.e + d.x, m.f + d.y))\n updates.push({ id: it.shape.id, type: it.shape.type, x: parentPoint.x, y: parentPoint.y })\n }\n return this.updateShapes(updates)\n }\n\n /** Toggle the locked state of shapes. */\n toggleLock(ids: readonly ShapeId[] = this.getSelectedShapeIds()): this {\n const shapes = ids.map((id) => this.getShape(id)).filter((s): s is UnknownShape => !!s)\n if (shapes.length === 0) return this\n const allLocked = shapes.every((s) => s.isLocked)\n return this.updateShapes(shapes.map((s) => ({ id: s.id, type: s.type, isLocked: !allLocked })))\n }\n\n // ---- groups ------------------------------------------------------------\n\n /** Wrap shapes in a new `group` shape (requires a registered \"group\" ShapeUtil). Returns the group id. */\n groupShapes(ids: readonly ShapeId[] = this.getSelectedShapeIds(), groupId: ShapeId = ShapeRecordType.createId() as ShapeId): ShapeId | undefined {\n if (!this.hasShapeUtil(\"group\")) throw new Error(\"No ShapeUtil registered for type \\\"group\\\"\")\n const shapes = ids.map((id) => this.getShape(id)).filter((s): s is UnknownShape => !!s && !s.isLocked)\n if (shapes.length < 2) return undefined\n const parentId = shapes[0]!.parentId\n if (!shapes.every((s) => s.parentId === parentId)) return undefined\n const sorted = sortByIndex(shapes)\n const bounds = Box.Common(sorted.map((s) => this.getShapePageBounds(s)!))\n this.run(() => {\n this.createShape({ id: groupId, type: \"group\", parentId, x: bounds.x, y: bounds.y, index: getIndexAbove(sorted.at(-1)!.index) })\n this.reparentShapes(sorted.map((s) => s.id), groupId)\n this.setSelectedShapes([groupId])\n })\n return groupId\n }\n\n /** Dissolve groups, re-parenting their children to the group's parent. */\n ungroupShapes(ids: readonly ShapeId[] = this.getSelectedShapeIds()): this {\n const groups = ids.map((id) => this.getShape(id)).filter((s): s is UnknownShape => !!s && s.type === \"group\")\n if (groups.length === 0) return this\n this.run(() => {\n const released: ShapeId[] = []\n for (const g of groups) {\n const children = this.getSortedChildIdsForParent(g.id)\n this.reparentShapes(children, g.parentId, getIndexAbove(g.index))\n released.push(...children)\n this.store.remove([g.id])\n }\n this.setSelectedShapes(released)\n })\n return this\n }\n\n /** The outermost group containing a shape, or undefined. */\n getOutermostSelectableShape(shape: UnknownShape | ShapeId): UnknownShape | undefined {\n let cur = typeof shape === \"string\" ? this.getShape(shape) : shape\n if (!cur) return undefined\n let result = cur\n const focused = this.getCurrentPageState().focusedGroupId\n while (cur && isShapeId(cur.parentId)) {\n const parent: UnknownShape | undefined = this.getShape(cur.parentId)\n if (!parent || parent.id === focused) break\n if (parent.type === \"group\") result = parent\n cur = parent\n }\n return result\n }\n\n // ---- z-order -----------------------------------------------------------\n\n bringToFront(ids: readonly ShapeId[] = this.getSelectedShapeIds()): this {\n return this.reorder(ids, \"toFront\")\n }\n sendToBack(ids: readonly ShapeId[] = this.getSelectedShapeIds()): this {\n return this.reorder(ids, \"toBack\")\n }\n bringForward(ids: readonly ShapeId[] = this.getSelectedShapeIds()): this {\n return this.reorder(ids, \"forward\")\n }\n sendBackward(ids: readonly ShapeId[] = this.getSelectedShapeIds()): this {\n return this.reorder(ids, \"backward\")\n }\n\n private reorder(ids: readonly ShapeId[], op: \"toFront\" | \"toBack\" | \"forward\" | \"backward\"): this {\n if (ids.length === 0) return this\n const set = new Set(ids)\n const byParent = new Map<ParentId, UnknownShape[]>()\n for (const id of ids) {\n const s = this.getShape(id)\n if (!s) continue\n const arr = byParent.get(s.parentId) ?? []\n arr.push(s)\n byParent.set(s.parentId, arr)\n }\n const updates: ShapePartial[] = []\n for (const [parentId, moving] of byParent) {\n const siblings = sortByIndex(this._allShapes.get().filter((s) => s.parentId === parentId))\n const movingSorted = sortByIndex(moving)\n const others = siblings.filter((s) => !set.has(s.id))\n let indices: IndexKey[]\n switch (op) {\n case \"toFront\": {\n indices = getIndicesAbove(others.at(-1)?.index, movingSorted.length)\n break\n }\n case \"toBack\": {\n const first = others[0]?.index\n indices = []\n let cur = first\n for (let i = 0; i < movingSorted.length; i++) {\n cur = getIndexBelow(cur)\n indices.unshift(cur)\n }\n break\n }\n case \"forward\": {\n const topMovingIdx = siblings.findIndex((s) => s.id === movingSorted.at(-1)!.id)\n const above = siblings.slice(topMovingIdx + 1).find((s) => !set.has(s.id))\n if (!above) return this\n const aboveAbove = siblings[siblings.indexOf(above) + 1]\n indices = movingSorted.map(() => \"\" as IndexKey)\n let below = above.index\n for (let i = 0; i < movingSorted.length; i++) {\n const idx = getIndexBetween(below, aboveAbove?.index)\n indices[i] = idx\n below = idx\n }\n break\n }\n case \"backward\": {\n const bottomMovingIdx = siblings.findIndex((s) => s.id === movingSorted[0]!.id)\n const below = siblings\n .slice(0, bottomMovingIdx)\n .reverse()\n .find((s) => !set.has(s.id))\n if (!below) return this\n const belowBelow = siblings[siblings.indexOf(below) - 1]\n indices = movingSorted.map(() => \"\" as IndexKey)\n let above = below.index\n for (let i = movingSorted.length - 1; i >= 0; i--) {\n const idx = getIndexBetween(belowBelow?.index, above)\n indices[i] = idx\n above = idx\n }\n break\n }\n }\n movingSorted.forEach((s, i) => updates.push({ id: s.id, type: s.type, index: indices[i]! }))\n }\n this.updateShapes(updates)\n return this\n }\n\n // ---- selection ---------------------------------------------------------\n\n getSelectedShapeIds(): ShapeId[] {\n return this.getCurrentPageState().selectedShapeIds\n }\n\n getSelectedShapes(): UnknownShape[] {\n return this.getSelectedShapeIds().map((id) => this.getShape(id)).filter((s): s is UnknownShape => !!s)\n }\n\n getOnlySelectedShape(): UnknownShape | undefined {\n const ids = this.getSelectedShapeIds()\n return ids.length === 1 ? this.getShape(ids[0]!) : undefined\n }\n\n setSelectedShapes(ids: readonly (ShapeId | UnknownShape)[]): this {\n const next = ids.map((s) => (typeof s === \"string\" ? s : s.id))\n const prev = this.getSelectedShapeIds()\n if (prev.length === next.length && prev.every((id, i) => id === next[i])) return this\n this.updateCurrentPageState({ selectedShapeIds: next })\n return this\n }\n\n select(...ids: (ShapeId | UnknownShape)[]): this {\n return this.setSelectedShapes(ids)\n }\n\n selectAll(): this {\n return this.setSelectedShapes(this.getSortedChildIdsForParent(this.getCurrentPageId()).filter((id) => !this.getShape(id)?.isLocked))\n }\n\n selectNone(): this {\n return this.setSelectedShapes([])\n }\n\n isShapeOrAncestorLocked(shape: UnknownShape | ShapeId): boolean {\n let cur = typeof shape === \"string\" ? this.getShape(shape) : shape\n while (cur) {\n if (cur.isLocked) return true\n cur = this.getShapeParent(cur)\n }\n return false\n }\n\n private readonly _selectionPageBounds: Computed<Box | undefined> = computed(\"editor.selectionPageBounds\", () => {\n const shapes = this.getSelectedShapes()\n if (shapes.length === 0) return undefined\n const boxes = shapes.map((s) => this.getShapePageBounds(s)).filter((b): b is Box => !!b)\n return boxes.length ? Box.Common(boxes) : undefined\n })\n\n getSelectionPageBounds(): Box | undefined {\n return this._selectionPageBounds.get()\n }\n\n getSelectionRotation(): number {\n const shapes = this.getSelectedShapes()\n if (shapes.length !== 1) return 0\n const m = this.getShapePageTransform(shapes[0]!)\n return Math.atan2(m.b, m.a)\n }\n\n getHoveredShapeId(): ShapeId | null {\n return this.getCurrentPageState().hoveredShapeId\n }\n\n getHoveredShape(): UnknownShape | undefined {\n const id = this.getHoveredShapeId()\n return id ? this.getShape(id) : undefined\n }\n\n setHoveredShape(id: ShapeId | UnknownShape | null): this {\n const next = id === null ? null : typeof id === \"string\" ? id : id.id\n if (this.getHoveredShapeId() === next) return this\n return this.updateCurrentPageState({ hoveredShapeId: next })\n }\n\n getEditingShapeId(): ShapeId | null {\n return this.getCurrentPageState().editingShapeId\n }\n\n getEditingShape(): UnknownShape | undefined {\n const id = this.getEditingShapeId()\n return id ? this.getShape(id) : undefined\n }\n\n setEditingShape(id: ShapeId | UnknownShape | null): this {\n const next = id === null ? null : typeof id === \"string\" ? id : id.id\n const prev = this.getEditingShapeId()\n if (prev === next) return this\n this.updateCurrentPageState({ editingShapeId: next })\n // Editing toggles overlay rendering for the shape.\n for (const sid of [prev, next]) {\n const shape = sid ? this.getShape(sid) : undefined\n if (shape) this.writeShapeToEngine(shape, true)\n }\n this.flushEngine()\n this.bumpFrame()\n if (prev) {\n const shape = this.getShape(prev)\n if (shape) this.getShapeUtil(shape).onEditEnd?.(shape)\n }\n return this\n }\n\n setErasingShapes(ids: readonly ShapeId[]): this {\n return this.updateCurrentPageState({ erasingShapeIds: [...ids] })\n }\n\n getErasingShapeIds(): ShapeId[] {\n return this.getCurrentPageState().erasingShapeIds\n }\n\n // ---- camera / viewport -------------------------------------------------\n\n private cameraId(): Camera[\"id\"] {\n return CameraRecordType.createId(this.getCurrentPageId().slice(\"page:\".length))\n }\n\n getCamera(): Camera {\n return this.store.get(this.cameraId()) as Camera\n }\n\n getZoomLevel(): number {\n return this.getCamera().z\n }\n\n setCamera(point: Partial<VecModel>, _opts: { animation?: { duration: number } } = {}): this {\n const cam = this.getCamera()\n const z = Math.min(this.options.zoomMax, Math.max(this.options.zoomMin, point.z ?? cam.z))\n const x = point.x ?? cam.x\n const y = point.y ?? cam.y\n if (cam.x === x && cam.y === y && cam.z === z) return this\n this.run(\n () => {\n this.store.put([{ ...cam, x, y, z }])\n },\n { history: \"ignore\" },\n )\n return this\n }\n\n getViewportScreenBounds(): Box {\n const b = this.getInstanceState().screenBounds\n return new Box(b.x, b.y, b.w, b.h)\n }\n\n getViewportScreenCenter(): Vec {\n const b = this.getViewportScreenBounds()\n return new Vec(b.w / 2, b.h / 2)\n }\n\n getViewportPageBounds(): Box {\n const { w, h } = this.getViewportScreenBounds()\n const { x, y, z } = this.getCamera()\n return new Box(-x, -y, w / z, h / z)\n }\n\n getViewportPageCenter(): Vec {\n return this.getViewportPageBounds().center\n }\n\n updateViewportScreenBounds(bounds: Box | BoxLike, center = false): this {\n const prev = this.getViewportScreenBounds()\n const next = Box.From(bounds)\n if (prev.x === next.x && prev.y === next.y && prev.w === next.w && prev.h === next.h) return this\n this.run(\n () => {\n this.updateInstanceState({ screenBounds: next.toJson() })\n if (center) {\n const cam = this.getCamera()\n this.setCamera({ x: cam.x + (next.w - prev.w) / 2 / cam.z, y: cam.y + (next.h - prev.h) / 2 / cam.z })\n }\n },\n { history: \"ignore\" },\n )\n return this\n }\n\n /** Screen (container-relative) → page. */\n screenToPage(point: VecLike): Vec {\n const { x, y, z } = this.getCamera()\n return new Vec(point.x / z - x, point.y / z - y)\n }\n\n /** Page → screen (container-relative). */\n pageToScreen(point: VecLike): Vec {\n const { x, y, z } = this.getCamera()\n return new Vec((point.x + x) * z, (point.y + y) * z)\n }\n\n /** Zoom keeping the given screen point fixed. */\n zoomToPointAt(screenPoint: VecLike, nextZoom: number): this {\n const cam = this.getCamera()\n const z = Math.min(this.options.zoomMax, Math.max(this.options.zoomMin, nextZoom))\n const px = screenPoint.x / cam.z - cam.x\n const py = screenPoint.y / cam.z - cam.y\n return this.setCamera({ x: screenPoint.x / z - px, y: screenPoint.y / z - py, z })\n }\n\n zoomIn(point: VecLike = this.getViewportScreenCenter()): this {\n const z = this.getZoomLevel()\n const next = this.options.zoomSteps.find((s) => s > z + 1e-6) ?? this.options.zoomMax\n return this.zoomToPointAt(point, next)\n }\n\n zoomOut(point: VecLike = this.getViewportScreenCenter()): this {\n const z = this.getZoomLevel()\n const next = [...this.options.zoomSteps].reverse().find((s) => s < z - 1e-6) ?? this.options.zoomMin\n return this.zoomToPointAt(point, next)\n }\n\n resetZoom(point: VecLike = this.getViewportScreenCenter()): this {\n return this.zoomToPointAt(point, 1)\n }\n\n zoomToBounds(bounds: BoxLike, opts: { inset?: number; targetZoom?: number } = {}): this {\n const vp = this.getViewportScreenBounds()\n const inset = opts.inset ?? Math.min(256, vp.w * 0.28)\n let z = Math.min((vp.w - inset) / bounds.w, (vp.h - inset) / bounds.h)\n if (opts.targetZoom !== undefined) z = Math.min(z, opts.targetZoom)\n z = Math.min(this.options.zoomMax, Math.max(this.options.zoomMin, z))\n return this.setCamera({\n x: -bounds.x + (vp.w / z - bounds.w) / 2,\n y: -bounds.y + (vp.h / z - bounds.h) / 2,\n z,\n })\n }\n\n zoomToFit(): this {\n const b = this.getCurrentPageBounds()\n return b && b.w > 0 && b.h > 0 ? this.zoomToBounds(b) : this\n }\n\n zoomToSelection(): this {\n const b = this.getSelectionPageBounds()\n return b && b.w > 0 && b.h > 0 ? this.zoomToBounds(b, { targetZoom: Math.max(1, this.getZoomLevel()) }) : this\n }\n\n centerOnPoint(point: VecLike): this {\n const vp = this.getViewportScreenBounds()\n const z = this.getZoomLevel()\n return this.setCamera({ x: -point.x + vp.w / 2 / z, y: -point.y + vp.h / 2 / z })\n }\n\n pan(offsetScreen: VecLike): this {\n const cam = this.getCamera()\n return this.setCamera({ x: cam.x + offsetScreen.x / cam.z, y: cam.y + offsetScreen.y / cam.z })\n }\n\n // ---- tools -------------------------------------------------------------\n\n getCurrentTool(): StateNode {\n return this.root.getCurrent()!\n }\n\n getCurrentToolId(): string {\n const tool = this.root.getCurrent()\n return tool?.id ?? \"\"\n }\n\n setCurrentTool(id: string, info: Record<string, unknown> = {}): this {\n if (this.getCurrentToolId() === id && !info[\"force\"]) return this\n this.root.transition(id, info)\n return this\n }\n\n getPath(): string {\n return this.root.getPath()\n }\n\n isIn(path: string): boolean {\n const full = this.getPath()\n const target = path.startsWith(\"root.\") ? path : `root.${path}`\n return full === target || full.startsWith(`${target}.`)\n }\n\n isInAny(...paths: string[]): boolean {\n return paths.some((p) => this.isIn(p))\n }\n\n getStateDescendant<T extends StateNode>(path: string): T | undefined {\n return this.root.getDescendant<T>(path.replace(/^root\\./, \"\"))\n }\n\n cancel(): this {\n this.dispatch({ type: \"cancel\", name: \"cancel\", ...this.modifierState() })\n return this\n }\n\n complete(): this {\n this.dispatch({ type: \"complete\", name: \"complete\", ...this.modifierState() })\n return this\n }\n\n interrupt(): this {\n this.dispatch({ type: \"interrupt\", name: \"interrupt\", ...this.modifierState() })\n return this\n }\n\n private modifierState(): { shiftKey: boolean; altKey: boolean; ctrlKey: boolean; metaKey: boolean; accelKey: boolean } {\n const i = this.inputs\n return { shiftKey: i.shiftKey, altKey: i.altKey, ctrlKey: i.ctrlKey, metaKey: i.metaKey, accelKey: i.accelKey }\n }\n\n // ---- input dispatch ----------------------------------------------------\n\n /** Route an event to the tool tree, updating `inputs` first. */\n dispatch(info: EventInfo): this {\n if (this.getIsDisposed()) return this\n const inputs = this.inputs\n inputs.shiftKey = info.shiftKey\n inputs.altKey = info.altKey\n inputs.ctrlKey = info.ctrlKey\n inputs.metaKey = info.metaKey\n inputs.accelKey = info.accelKey\n\n switch (info.type) {\n case \"pointer\": {\n this.updatePointer(info)\n break\n }\n case \"click\": {\n const screen = new Vec(info.point.x, info.point.y)\n inputs.currentScreenPoint = screen\n inputs.currentPagePoint = this.screenToPage(screen)\n break\n }\n case \"keyboard\": {\n if (info.name === \"key_down\") inputs.keys.add(info.code)\n else if (info.name === \"key_up\") inputs.keys.delete(info.code)\n break\n }\n case \"wheel\": {\n this.handleWheel(info)\n // tools may still observe wheel\n break\n }\n default:\n break\n }\n\n this.root.handleEvent(info)\n this.emit(\"event\", info)\n return this\n }\n\n private updatePointer(info: PointerEventInfo): void {\n const inputs = this.inputs\n const screen = new Vec(info.point.x, info.point.y)\n const page = this.screenToPage(screen)\n inputs.previousScreenPoint = inputs.currentScreenPoint\n inputs.previousPagePoint = inputs.currentPagePoint\n inputs.currentScreenPoint = screen\n inputs.currentPagePoint = page\n inputs.isPen = info.isPen\n\n switch (info.name) {\n case \"pointer_down\": {\n inputs.buttons.add(info.button)\n inputs.isPointing = true\n inputs.isDragging = false\n inputs.originScreenPoint = screen.clone()\n inputs.originPagePoint = page.clone()\n break\n }\n case \"pointer_move\": {\n if (inputs.isPointing && !inputs.isDragging) {\n const d2 = Vec.Dist2(inputs.originScreenPoint, screen)\n if (d2 > this.options.dragDistanceSquared * (info.isPen ? 0.25 : 1)) inputs.isDragging = true\n }\n break\n }\n case \"pointer_up\": {\n inputs.buttons.delete(info.button)\n inputs.isPointing = false\n inputs.isDragging = false\n break\n }\n default:\n break\n }\n }\n\n private handleWheel(info: WheelEventInfo): void {\n if (info.ctrlKey || info.metaKey) {\n // zoom about the pointer; delta.y in pixels → multiplicative factor\n const cam = this.getCamera()\n const factor = Math.exp(-info.delta.y * 0.0025)\n this.zoomToPointAt(info.point, cam.z * factor)\n } else {\n this.pan({ x: -info.delta.x, y: -info.delta.y })\n }\n }\n\n // ---- engine mirror -----------------------------------------------------\n\n private kindId(type: string): number {\n return this.kindIds.get(type) ?? 0\n }\n\n /** Apply pending engine commands. Cheap when nothing is pending. */\n flushEngine(): void {\n if (this.engine.cmd.pending > 0) this.engine.cmd.flush()\n }\n\n private syncChanges(changes: { added: Record<string, EditorRecord>; updated: Record<string, [EditorRecord, EditorRecord]>; removed: Record<string, EditorRecord> }): void {\n const pageId = this.getCurrentPageId()\n if (pageId !== this.syncedPageId) {\n this.syncPage(pageId)\n return\n }\n let dirty = false\n // Binding changes (e.g. undo of a binding alone) affect the geometry of their `from` shape.\n const rebind = new Set<ShapeId>()\n for (const rec of [...Object.values(changes.added), ...Object.values(changes.removed)]) {\n if (isBinding(rec)) rebind.add(rec.fromId)\n }\n for (const [, next] of Object.values(changes.updated)) {\n if (isBinding(next)) rebind.add(next.fromId)\n }\n for (const rec of Object.values(changes.removed)) {\n if (rec.typeName !== \"shape\") continue\n const h = this.handles.release(rec.id)\n if (h !== undefined) {\n this.engine.cmd.remove(h)\n dirty = true\n }\n }\n for (const rec of Object.values(changes.added)) {\n if (rec.typeName !== \"shape\") continue\n if (this.getAncestorPageId(rec) !== pageId) continue\n this.writeShapeToEngine(rec, true)\n dirty = true\n }\n for (const [prev, next] of Object.values(changes.updated)) {\n if (next.typeName !== \"shape\" || prev.typeName !== \"shape\") continue\n const onPage = this.getAncestorPageId(next) === pageId\n if (!onPage) {\n const h = this.handles.release(next.id)\n if (h !== undefined) {\n this.engine.cmd.remove(h)\n dirty = true\n }\n continue\n }\n const geometryChanged = prev.props !== next.props || prev.type !== next.type || prev.opacity !== next.opacity\n this.writeShapeToEngine(next, geometryChanged || this.handles.peek(next.id) === undefined)\n rebind.delete(next.id)\n dirty = true\n }\n // Groups derive their geometry from their children.\n const touched = [...Object.values(changes.added), ...Object.values(changes.removed), ...Object.values(changes.updated).map(([, n]) => n)]\n for (const rec of touched) {\n if (rec.typeName !== \"shape\") continue\n let parent: UnknownShape | undefined = isShapeId(rec.parentId) ? this.getShape(rec.parentId) : undefined\n while (parent && parent.type === \"group\") {\n rebind.add(parent.id)\n parent = isShapeId(parent.parentId) ? this.getShape(parent.parentId) : undefined\n }\n }\n for (const id of rebind) {\n const shape = this.getShape(id)\n if (shape && this.getAncestorPageId(shape) === pageId && !(id in changes.added)) {\n this.writeShapeToEngine(shape, true)\n dirty = true\n }\n }\n if (dirty) {\n this.flushEngine()\n this.bumpFrame()\n }\n }\n\n /** Clear the engine and upload every shape on `pageId`. */\n private syncPage(pageId: PageId): void {\n this.syncedPageId = pageId\n this.handles.clear()\n this.engine.cmd.clear()\n for (const shape of this.getCurrentPageShapesSorted()) {\n this.writeShapeToEngine(shape, true)\n }\n this.flushEngine()\n this.bumpFrame()\n }\n\n /**\n * Write one shape to the engine, isolating it from its siblings.\n *\n * A shape util can throw on a shape it does not fully understand (a prop a\n * file left out, a value it did not expect). That must cost that one shape,\n * never the rest of the page: the failure is logged once and the shape is\n * skipped, so a single bad record can no longer blank the canvas.\n */\n private writeShapeToEngine(shape: UnknownShape, withGeometry: boolean): void {\n try {\n this.writeShapeToEngineUnsafe(shape, withGeometry)\n this.brokenShapeIds.delete(shape.id)\n } catch (error) {\n if (!this.brokenShapeIds.has(shape.id)) {\n this.brokenShapeIds.add(shape.id)\n console.warn(`mocanvas: skipping shape ${shape.id} (${shape.type}); its shape util threw`, error)\n }\n }\n }\n\n private writeShapeToEngineUnsafe(shape: UnknownShape, withGeometry: boolean): void {\n const util = this.shapeUtils[shape.type]\n const h = this.handles.handle(shape.id)\n const parent = isShapeId(shape.parentId) ? this.handles.handle(shape.parentId) : 0\n const [zlo, zhi] = indexKeyToZKey(shape.index)\n let flags = 0\n if (shape.isLocked) flags |= FLAG.LOCKED\n let style: StyleWords | null = null\n let geometry: Geometry2d | undefined\n if (util) {\n // Texture references acquired while deriving the style are attributed to\n // this shape, so re-writing it neither leaks nor drops references.\n style = this.textures.withOwner(shape.id, () => util.getRenderStyle(shape))\n if (style === null || util.needsOverlay(shape)) flags |= FLAG.OVERLAY\n else if (util.hasOverlayLabel(shape)) flags |= FLAG.LABEL\n if (util.isClipShape(shape)) flags |= FLAG.CLIP\n geometry = util.getGeometry(shape)\n if (geometry.isClosed && !geometry.isFilled) flags |= FLAG.NO_FILL\n } else {\n flags |= FLAG.OVERLAY\n }\n const b = geometry?.bounds\n this.engine.cmd.upsert(h, this.kindId(shape.type), parent, zlo, zhi, flags, shape.x, shape.y, shape.rotation, b?.w ?? 0, b?.h ?? 0)\n if (withGeometry && geometry) {\n this.engine.cmd.setGeometry(h, geometry.toPathWords())\n if (style) {\n // The hand-drawn dash style picks a shape's wobble from this seed, so it is\n // hashed (FNV-1a) from the shape's own id rather than taken from its engine\n // handle: handles are recycled, and a shape that was deleted and restored\n // would otherwise come back looking like a different shape.\n let seed = 0x811c9dc5\n for (let k = 0; k < shape.id.length; k++) seed = Math.imul(seed ^ shape.id.charCodeAt(k), 0x01000193)\n this.engine.cmd.setStyle(h, { ...style, opacity: style.opacity * shape.opacity, seed: style.seed ?? seed >>> 0 })\n this.engine.cmd.setTexture(h, style.texture ?? 0)\n }\n }\n }\n\n // ---- rendering ---------------------------------------------------------\n\n /** Build and draw one frame. Called by the canvas component inside rAF. */\n renderFrame(backend: RenderBackend): FrameBuffers {\n const t0 = performance.now()\n this.textures.setBackend(backend)\n this.syncTextureResolution()\n this.flushEngine()\n const cam = this.getCamera()\n const vp = this.getViewportScreenBounds()\n const camState: CameraState = { x: cam.x, y: cam.y, z: cam.z }\n const frame = this.engine.frame(camState, vp.w, vp.h)\n backend.draw(frame, camState, { background: this.options.backgroundColor })\n\n const overlay = EngineBridge.readOverlay(frame.overlay)\n const ids: ShapeId[] = []\n const clips: (ClipRect | undefined)[] = []\n for (const o of overlay) {\n const id = this.handles.id(o.handle)\n if (id) {\n ids.push(id as ShapeId)\n clips.push(o.clip)\n }\n }\n unsafe__withoutCapture(() => {\n const prev = this._overlayShapeIds.get()\n if (prev.length !== ids.length || prev.some((id, i) => id !== ids[i])) this._overlayShapeIds.set(ids)\n if (!sameClips(this._overlayClips.get(), clips)) this._overlayClips.set(clips)\n const ms = performance.now() - t0\n this._lastFrame.set({ drawn: frame.drawn, culled: frame.culled, ms })\n this.emit(\"frame\", { drawn: frame.drawn, culled: frame.culled, ms })\n })\n return frame\n }\n\n // ---- textures ----------------------------------------------------------\n\n /**\n * Device-pixel scale at which rasterized textures (text labels) should be\n * drawn: the device pixel ratio times the zoom, bucketed to powers of two.\n */\n getTextureResolution(): number {\n return bucketTextureResolution(this.getZoomLevel(), this.getInstanceState().devicePixelRatio)\n }\n\n private textureResolution = 0\n\n /** Re-derive texture-backed styles when the resolution bucket changes. */\n private syncTextureResolution(): void {\n const next = this.getTextureResolution()\n if (next === this.textureResolution) return\n this.textureResolution = next\n this.rewriteTextureOwners(this.textures.getAllOwners())\n }\n\n private registerTextureSideEffects(): void {\n this.disposables.push(\n this.sideEffects.registerAfterDeleteHandler(\"shape\", (shape) => {\n this.textures.releaseOwner(shape.id)\n }),\n )\n }\n\n /** A texture finished (or failed) loading: re-write its shapes and redraw. */\n private onTexturesChanged(keys: readonly string[]): void {\n const owners = new Set<string>()\n for (const key of keys) for (const owner of this.textures.getOwners(key)) owners.add(owner)\n this.rewriteTextureOwners(owners)\n this.bumpFrame()\n }\n\n private rewriteTextureOwners(owners: Iterable<string>): void {\n let dirty = false\n for (const owner of owners) {\n const shape = this.getShape(owner as ShapeId)\n if (!shape || this.getAncestorPageId(shape) !== this.syncedPageId) continue\n this.writeShapeToEngine(shape, true)\n dirty = true\n }\n if (dirty) this.flushEngine()\n }\n\n // ---- misc helpers ------------------------------------------------------\n\n /** Degrees → radians. */\n static degToRad(d: number): number {\n return d * RAD_PER_DEG\n }\n\n // ---- assets ------------------------------------------------------------\n\n private readonly _allAssets: Computed<Asset[]> = computed(\"editor.allAssets\", () =>\n this.store.query.records(\"asset\").get() as Asset[],\n )\n\n getAsset<A extends Asset = Asset>(id: AssetId | A): A | undefined {\n const assetId = typeof id === \"string\" ? id : id.id\n return this.store.get(assetId) as A | undefined\n }\n\n /** Every asset in the document (assets are not per page). */\n getAssets(): Asset[] {\n return this._allAssets.get()\n }\n\n createAsset<A extends Asset>(asset: AssetCreate<A>): this {\n return this.createAssets([asset])\n }\n\n createAssets<A extends Asset>(assets: readonly AssetCreate<A>[]): this {\n if (assets.length === 0) return this\n this.run(() => {\n const records: Asset[] = assets.map(\n (a) =>\n AssetRecordType.create({\n id: a.id ?? AssetRecordType.createId(),\n type: a.type,\n props: { ...a.props },\n meta: { ...(a.meta ?? {}) } as Asset[\"meta\"],\n } as Asset) as Asset,\n )\n this.store.put(records)\n })\n return this\n }\n\n updateAsset<A extends Asset>(partial: AssetPartial<A>): this {\n return this.updateAssets([partial])\n }\n\n updateAssets<A extends Asset>(partials: readonly AssetPartial<A>[]): this {\n this.run(() => {\n const records: Asset[] = []\n for (const partial of partials) {\n const prev = this.getAsset<A>(partial.id)\n if (!prev) continue\n records.push({\n ...prev,\n props: partial.props ? { ...prev.props, ...partial.props } : prev.props,\n meta: partial.meta ? { ...prev.meta, ...partial.meta } : prev.meta,\n } as Asset)\n }\n if (records.length) this.store.put(records)\n })\n return this\n }\n\n deleteAsset(id: AssetId | Asset): this {\n return this.deleteAssets([id])\n }\n\n deleteAssets(ids: readonly (AssetId | Asset)[]): this {\n const assetIds = ids.map((a) => (typeof a === \"string\" ? a : a.id)).filter((id) => this.store.has(id))\n if (assetIds.length === 0) return this\n this.run(() => this.store.remove(assetIds))\n return this\n }\n\n // ---- external content --------------------------------------------------\n\n // Handlers are keyed by content type, so each entry only ever sees the member\n // of the union it registered for; they are stored under the widest handler type.\n private readonly externalContentHandlers = new Map<ExternalContentType, ExternalContentHandler>()\n private readonly externalAssetHandlers = new Map<ExternalAssetType, ExternalAssetHandler>()\n\n /**\n * Register the handler for one kind of dropped/pasted content. Replaces any\n * previous handler for that type; `null` removes it. Returns a function that\n * removes the handler again (only if it is still the registered one).\n */\n registerExternalContentHandler<T extends ExternalContentType>(type: T, handler: ExternalContentHandler<T> | null): () => void {\n const entry = handler as unknown as ExternalContentHandler | null\n if (entry) this.externalContentHandlers.set(type, entry)\n else this.externalContentHandlers.delete(type)\n return () => {\n if (entry && this.externalContentHandlers.get(type) === entry) this.externalContentHandlers.delete(type)\n }\n }\n\n /** Register how an asset record is produced from a file or url. Returns a function that removes it again. */\n registerExternalAssetHandler<T extends ExternalAssetType>(type: T, handler: ExternalAssetHandler<T> | null): () => void {\n const entry = handler as unknown as ExternalAssetHandler | null\n if (entry) this.externalAssetHandlers.set(type, entry)\n else this.externalAssetHandlers.delete(type)\n return () => {\n if (entry && this.externalAssetHandlers.get(type) === entry) this.externalAssetHandlers.delete(type)\n }\n }\n\n hasExternalContentHandler(type: ExternalContentType): boolean {\n return this.externalContentHandlers.has(type)\n }\n\n hasExternalAssetHandler(type: ExternalAssetType): boolean {\n return this.externalAssetHandlers.has(type)\n }\n\n /**\n * Handle content dropped or pasted onto the canvas by dispatching to the\n * registered handler for `info.type`. Resolves once the handler is done;\n * resolves immediately when no handler is registered.\n */\n async putExternalContent(info: ExternalContent): Promise<void> {\n const handler = this.externalContentHandlers.get(info.type)\n if (!handler) return\n await handler(info)\n }\n\n /**\n * Produce (but do not store) an asset record for a file or url through the\n * registered asset handler. `undefined` when there is no handler or the\n * handler declines the content.\n */\n async getAssetForExternalContent(info: ExternalAssetContent): Promise<Asset | undefined> {\n const handler = this.externalAssetHandlers.get(info.type)\n if (!handler) return undefined\n return await handler(info)\n }\n\n // ---- presence ----------------------------------------------------------\n // Everything below is about other people in the same document. It is kept in\n // one block so the collaboration layer (`@mocanvas/sync`) has a single seam.\n\n /**\n * The local person's identity: a random id for this session plus a name and\n * a colour that can be changed at any time. Session-only, never persisted.\n */\n readonly user: UserPreferences = createUserPreferences()\n\n /** Presence records of everyone else in the room, in arrival order. */\n getCollaborators(): InstancePresence[] {\n const me = this.user.getId()\n const records = this.store.query.records(\"instance_presence\").get()\n return records.filter((p) => p.userId !== me)\n }\n\n /** The subset of `getCollaborators()` looking at the page we are on. */\n getCollaboratorsOnCurrentPage(): InstancePresence[] {\n const pageId = this.getCurrentPageId()\n return this.getCollaborators().filter((p) => p.currentPageId === pageId)\n }\n\n // ---- resizing ----------------------------------------------------------\n\n /**\n * Scale one shape by `scale` about a point, letting its `ShapeUtil.onResize`\n * produce the prop change — the same contract the select tool's resize state\n * uses. The shape's origin is moved by the same scale about `scaleOrigin`\n * (its page bounds center by default), measured in a frame rotated by\n * `scaleAxisRotation`.\n *\n * Locked shapes and shapes whose util says `canResize` is false are left\n * alone. `onResizeStart` / `onResizeEnd` bracket the change; the util is\n * told the resize came from the `bottom_right` handle.\n */\n resizeShape(id: ShapeId | UnknownShape, scale: VecLike, options: ResizeShapeOptions = {}): this {\n const shape = this.getShape(id)\n if (!shape || shape.isLocked) return this\n const util = this.getShapeUtil(shape)\n if (!util.canResize(shape)) return this\n if (!Number.isFinite(scale.x) || !Number.isFinite(scale.y)) return this\n\n const initialBounds = options.initialBounds ?? this.getShapeGeometryBounds(shape)?.toJson()\n if (!initialBounds) return this\n\n let scaleX = scale.x\n let scaleY = scale.y\n if (options.isAspectRatioLocked ?? util.isAspectRatioLocked(shape)) {\n const s = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n scaleX = Math.sign(scaleX || 1) * s\n scaleY = Math.sign(scaleY || 1) * s\n }\n\n const m = this.getShapePageTransform(shape)\n const pagePos = new Vec(m.e, m.f)\n const origin = options.scaleOrigin ?? this.getShapePageBounds(shape)?.center ?? pagePos\n const axis = options.scaleAxisRotation ?? 0\n // Move the origin in the scale frame, then bring it back to page space.\n const inFrame = Vec.Rot(Vec.Sub(pagePos, origin), -axis)\n const scaled = new Vec(inFrame.x * scaleX, inFrame.y * scaleY)\n const newPoint = this.getPointInParentSpace(shape, Vec.Add(origin, Vec.Rot(scaled, axis)))\n\n this.run(() => {\n util.onResizeStart?.(shape)\n const change = util.onResize?.(shape, {\n newPoint,\n handle: \"bottom_right\",\n mode: options.mode ?? \"scale_shape\",\n scaleX,\n scaleY,\n initialBounds,\n initialShape: shape,\n })\n this.updateShapes([{ id: shape.id, type: shape.type, x: newPoint.x, y: newPoint.y, ...(change ?? {}) }])\n const current = this.getShape(shape.id)\n if (current) util.onResizeEnd?.(shape, current)\n })\n return this\n }\n\n /**\n * Scale several shapes by the same factor about one point — by default the\n * center of their common page bounds, so the group scales as a unit.\n */\n resizeShapes(\n ids: readonly (ShapeId | UnknownShape)[],\n scale: VecLike,\n options: Omit<ResizeShapeOptions, \"initialBounds\"> = {},\n ): this {\n const shapes = ids.map((id) => this.getShape(id)).filter((s): s is UnknownShape => !!s)\n if (shapes.length === 0) return this\n const boxes = shapes.map((s) => this.getShapePageBounds(s)).filter((b): b is Box => !!b)\n if (boxes.length === 0) return this\n const scaleOrigin = options.scaleOrigin ?? Box.Common(boxes).center\n this.run(() => {\n for (const shape of shapes) this.resizeShape(shape.id, scale, { ...options, scaleOrigin })\n })\n return this\n }\n\n /**\n * Resize shapes so each one spans the common bounds of all of them on one\n * axis. Every shape given contributes to the common bounds, but only the\n * unlocked, resizable ones are stretched.\n */\n stretchShapes(ids: readonly ShapeId[], operation: \"horizontal\" | \"vertical\"): this {\n const items: { shape: UnknownShape; b: Box }[] = []\n for (const id of ids) {\n const shape = this.getShape(id)\n if (!shape) continue\n const b = this.getShapePageBounds(shape)\n if (b) items.push({ shape, b })\n }\n if (items.length < 2) return this\n const common = Box.Common(items.map((it) => it.b))\n const horizontal = operation === \"horizontal\"\n this.run(() => {\n for (const { shape, b } of items) {\n if (shape.isLocked || !this.getShapeUtil(shape).canResize(shape)) continue\n const scale = horizontal\n ? { x: b.w === 0 ? 1 : common.w / b.w, y: 1 }\n : { x: 1, y: b.h === 0 ? 1 : common.h / b.h }\n this.resizeShape(shape.id, scale, { scaleOrigin: { x: b.x, y: b.y }, isAspectRatioLocked: false })\n // The scale happened about the old top-left corner; slide the shape so\n // its leading edge sits on the common bounds.\n const after = this.getShapePageBounds(shape.id)\n if (!after) continue\n const d = horizontal ? new Vec(common.x - after.x, 0) : new Vec(0, common.y - after.y)\n if (d.x !== 0 || d.y !== 0) this.nudgeShapes([shape.id], d)\n }\n })\n return this\n }\n\n // ---- export ------------------------------------------------------------\n // The implementations live in `mocanvas` (which depends on this package, not\n // the other way round), so they are installed through a registration seam.\n\n /**\n * Serialize shapes to an SVG string; `undefined` when there is nothing to\n * export. Defaults to the selection, or the whole page when nothing is\n * selected. Throws until an export implementation is registered.\n */\n getSvgString(ids?: readonly ShapeId[], opts?: EditorSvgExportOptions): EditorSvgExportResult | undefined {\n const impl = exportImplementation\n if (!impl) throw new Error(missingImplementation(\"getSvgString\", \"registerExportImplementation\"))\n return impl.getSvgString(this, ids, opts)\n }\n\n /**\n * Render shapes to an image blob (`png` by default). Same shape selection\n * rules as `getSvgString`. Throws until an export implementation is\n * registered.\n */\n async toImage(ids?: readonly ShapeId[], opts?: EditorImageExportOptions): Promise<EditorImageExportResult> {\n const impl = exportImplementation\n if (!impl) throw new Error(missingImplementation(\"toImage\", \"registerExportImplementation\"))\n return await impl.toImage(this, ids, opts)\n }\n\n // ---- text measurement --------------------------------------------------\n\n /**\n * Measures runs of text the way the editor renders them. Installed through\n * the same seam as the export functions; throws until something registers\n * one.\n */\n get textMeasure(): EditorTextMeasure {\n if (!textMeasureProvider) throw new Error(missingImplementation(\"textMeasure\", \"registerTextMeasureImplementation\"))\n return textMeasureProvider(this)\n }\n\n // ---- menus -------------------------------------------------------------\n\n /** Which menus are open right now. Backed by the `instance` session record. */\n readonly menus: MenuManager = new MenuManager(this)\n}\n\nfunction sameClips(a: readonly (ClipRect | undefined)[], b: readonly (ClipRect | undefined)[]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n const x = a[i]\n const y = b[i]\n if (x === y) continue\n if (!x || !y) return false\n if (x[0] !== y[0] || x[1] !== y[1] || x[2] !== y[2] || x[3] !== y[3]) return false\n }\n return true\n}\n\n// ---- resize options ---------------------------------------------------------\n\nexport interface ResizeShapeOptions {\n /** Shape-local bounds the scale is measured against. Defaults to the shape's geometry bounds. */\n initialBounds?: { x: number; y: number; w: number; h: number }\n /** Page point that stays put. Defaults to the center of the shape's page bounds. */\n scaleOrigin?: VecLike\n /** Rotation (radians) of the frame the scale axes are measured in. Defaults to 0. */\n scaleAxisRotation?: number\n /** Force (or forbid) a uniform scale. Defaults to the util's `isAspectRatioLocked`. */\n isAspectRatioLocked?: boolean\n /** Handed to `onResize`. Defaults to `\"scale_shape\"`. */\n mode?: \"scale_shape\" | \"resize_bounds\"\n}\n\n// ---- registration seams -----------------------------------------------------\n// SVG/image export and text measurement are implemented in `mocanvas`, which\n// depends on this package. They are installed here at import time so the\n// `Editor` methods can stay where callers expect them without inverting the\n// dependency.\n\nexport interface EditorSvgExportOptions {\n /** Page units added around the shapes' bounds. */\n padding?: number\n /** Paint a full-size background rectangle. */\n background?: boolean\n /** Multiplier applied to the output `width`/`height`. */\n scale?: number\n /** Use the dark background colour. */\n darkMode?: boolean\n}\n\nexport interface EditorSvgExportResult {\n svg: string\n /** Output size in CSS pixels (bounds × scale). */\n width: number\n height: number\n}\n\nexport interface EditorImageExportOptions extends EditorSvgExportOptions {\n /** Output format. Implementations default to `\"png\"`. */\n format?: \"svg\" | \"png\" | \"jpeg\" | \"webp\"\n /** Encoder quality for lossy formats (0..1). */\n quality?: number\n /** Device pixel ratio multiplier for raster output. */\n pixelRatio?: number\n}\n\nexport interface EditorImageExportResult {\n blob: Blob\n width: number\n height: number\n}\n\nexport interface EditorExportImplementation {\n getSvgString(\n editor: Editor,\n ids?: readonly ShapeId[],\n opts?: EditorSvgExportOptions,\n ): EditorSvgExportResult | undefined\n toImage(editor: Editor, ids?: readonly ShapeId[], opts?: EditorImageExportOptions): Promise<EditorImageExportResult>\n}\n\nlet exportImplementation: EditorExportImplementation | null = null\n\n/**\n * Install the implementation behind `Editor.getSvgString` and `Editor.toImage`.\n * `mocanvas` calls this at import time; pass `null` to remove it. Returns a\n * function that removes the implementation again (only if it is still the\n * registered one).\n */\nexport function registerExportImplementation(impl: EditorExportImplementation | null): () => void {\n exportImplementation = impl\n return () => {\n if (exportImplementation === impl) exportImplementation = null\n }\n}\n\n/** The registered export implementation, or `null` when nothing has registered one. */\nexport function getExportImplementation(): EditorExportImplementation | null {\n return exportImplementation\n}\n\nexport interface EditorTextMeasureOptions {\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 EditorTextMeasurement {\n w: number\n h: number\n lineCount: number\n}\n\nexport interface EditorTextMeasure {\n measureText(text: string, opts: EditorTextMeasureOptions): EditorTextMeasurement\n}\n\nexport type EditorTextMeasureProvider = (editor: Editor) => EditorTextMeasure\n\nlet textMeasureProvider: EditorTextMeasureProvider | null = null\n\n/**\n * Install the measurer behind `Editor.textMeasure`. `mocanvas` calls this at\n * import time; pass `null` to remove it. Returns a function that removes the\n * provider again (only if it is still the registered one).\n */\nexport function registerTextMeasureImplementation(provider: EditorTextMeasureProvider | null): () => void {\n textMeasureProvider = provider\n return () => {\n if (textMeasureProvider === provider) textMeasureProvider = null\n }\n}\n\n/** The registered text measure provider, or `null` when nothing has registered one. */\nexport function getTextMeasureProvider(): EditorTextMeasureProvider | null {\n return textMeasureProvider\n}\n\nfunction missingImplementation(member: string, register: string): string {\n return (\n `Editor.${member} has no implementation registered. Importing \\`mocanvas\\` installs it — ` +\n `import { Mocanvas } from \"mocanvas\" (or \"mocanvas\" for its side effect) anywhere in your app. ` +\n `To install your own, call ${register}(...) from \"@mocanvas/editor\".`\n )\n}\n\n// ---- menus ------------------------------------------------------------------\n\n/**\n * The set of menus that are open, kept in the `instance` session record so it\n * survives tool changes, is visible to anything reading the store, and is\n * reactive: reading `getOpenMenus()` inside a signal re-runs it on every change.\n *\n * Ids are opaque strings owned by the UI; nothing here interprets them.\n */\nexport class MenuManager {\n constructor(private readonly editor: Editor) {}\n\n /** The open menu ids, in the order they were opened. */\n getOpenMenus(): string[] {\n return [...this.editor.getInstanceState().openMenus]\n }\n\n isMenuOpen(id: string): boolean {\n return this.editor.getInstanceState().openMenus.includes(id)\n }\n\n /** Mark a menu as open. Opening an already-open menu changes nothing. */\n addOpenMenu(id: string): this {\n const open = this.editor.getInstanceState().openMenus\n if (open.includes(id)) return this\n this.editor.updateInstanceState({ openMenus: [...open, id] })\n return this\n }\n\n /** Mark a menu as closed. Closing a menu that is not open changes nothing. */\n removeOpenMenu(id: string): this {\n const open = this.editor.getInstanceState().openMenus\n if (!open.includes(id)) return this\n this.editor.updateInstanceState({ openMenus: open.filter((menu) => menu !== id) })\n return this\n }\n\n /** Close every open menu. */\n clearOpenMenus(): this {\n if (this.editor.getInstanceState().openMenus.length === 0) return this\n this.editor.updateInstanceState({ openMenus: [] })\n return this\n }\n}\n","import { Store, StoreSchema, type MigrationSequence, type SerializedStore, type StoreSnapshot } from \"@mocanvas/store\"\nimport {\n CameraRecordType,\n DocumentRecordType,\n InstancePageStateRecordType,\n InstanceRecordType,\n PageRecordType,\n ShapeRecordType,\n type Camera,\n type Document,\n type Instance,\n type InstancePageState,\n type Page,\n type UnknownShape,\n} from \"../records/base\"\nimport { BindingRecordType, type UnknownBinding } from \"../records/binding\"\nimport { AssetRecordType, type Asset } from \"../records/asset\"\nimport { InstancePresenceRecordType, type InstancePresence } from \"../records/presence\"\n\nexport type EditorRecord =\n | Document\n | Page\n | UnknownShape\n | UnknownBinding\n | Asset\n | Camera\n | Instance\n | InstancePageState\n | InstancePresence\nexport type EditorStore = Store<EditorRecord, EditorStoreProps>\nexport type EditorStoreSnapshot = StoreSnapshot<EditorRecord>\n\nexport interface EditorStoreProps {\n defaultName: string\n}\n\nexport interface CreateStoreOptions {\n migrations?: MigrationSequence[]\n initialData?: SerializedStore<EditorRecord>\n snapshot?: EditorStoreSnapshot\n defaultName?: string\n id?: string\n}\n\nexport function createSchema(migrations: MigrationSequence[] = []): StoreSchema<EditorRecord, EditorStoreProps> {\n return StoreSchema.create<EditorRecord, EditorStoreProps>(\n {\n document: DocumentRecordType,\n page: PageRecordType,\n shape: ShapeRecordType,\n binding: BindingRecordType,\n asset: AssetRecordType,\n camera: CameraRecordType,\n instance: InstanceRecordType,\n instance_page_state: InstancePageStateRecordType,\n instance_presence: InstancePresenceRecordType,\n },\n { migrations },\n )\n}\n\n/** Create a store with the editor's record types. */\nexport function createStore(options: CreateStoreOptions = {}): EditorStore {\n const schema = createSchema(options.migrations)\n const store = new Store<EditorRecord, EditorStoreProps>({\n schema,\n ...(options.initialData ? { initialData: options.initialData } : {}),\n ...(options.id ? { id: options.id } : {}),\n props: { defaultName: options.defaultName ?? \"\" },\n })\n if (options.snapshot) store.loadStoreSnapshot(options.snapshot)\n return store\n}\n","import type { Editor } from \"./Editor\"\nimport type { SelectionHandle } from \"./events\"\nimport { Box, Vec, type VecLike } from \"../geometry\"\n\n/**\n * Half the size of a selection handle's pointer target, in screen pixels.\n * 12 gives a 24x24 target, the smallest that stays comfortable on a trackpad\n * and on touch. It shrinks on small selections — see `getHandleHitRadius`.\n */\nexport const HANDLE_HIT_RADIUS = 12\nexport const ROTATE_HANDLE_OFFSET = 20\n\n/**\n * An edge handle is only worth showing when the edge is long enough that the\n * handle does not simply cover the two corners next to it.\n */\nconst MIN_EDGE_LENGTH_FOR_EDGE_HANDLE = 4 * HANDLE_HIT_RADIUS\n\n/**\n * The effective hit radius for the current selection. On a selection smaller\n * than a few handles across, full-size targets would cover the whole shape and\n * leave nothing to drag, so the radius shrinks to keep an interior free.\n */\nexport function getHandleHitRadius(screenW: number, screenH: number): number {\n const smallest = Math.min(screenW, screenH)\n if (smallest >= 6 * HANDLE_HIT_RADIUS) return HANDLE_HIT_RADIUS\n return Math.max(4, Math.min(HANDLE_HIT_RADIUS, smallest / 6))\n}\n\nexport interface SelectionHandleHit {\n handle: SelectionHandle\n /** Screen-space position of the handle. */\n point: Vec\n}\n\n/**\n * Screen-space positions of the selection handles for the current selection,\n * or null if nothing is selected / handles are hidden.\n */\nexport function getSelectionHandlePositions(\n editor: Editor,\n): { bounds: Box; rotation: number; handles: SelectionHandleHit[]; screenW: number; screenH: number } | null {\n const selected = editor.getSelectedShapes()\n if (selected.length === 0) return null\n if (selected.length === 1) {\n const util = editor.getShapeUtil(selected[0]!)\n if (util.hideResizeHandles(selected[0]!) && util.hideRotateHandle(selected[0]!)) return null\n }\n const single = selected.length === 1 ? selected[0]! : undefined\n const rotation = single ? editor.getSelectionRotation() : 0\n // Local bounds of a single shape (rotated with it), or the page bounds of many.\n let bounds: Box\n let toScreen: (p: VecLike) => Vec\n if (single) {\n const b = editor.getShapeGeometryBounds(single)!\n const m = editor.getShapePageTransform(single)\n bounds = b\n toScreen = (p) => editor.pageToScreen({ x: m.a * p.x + m.c * p.y + m.e, y: m.b * p.x + m.d * p.y + m.f })\n } else {\n bounds = editor.getSelectionPageBounds()!\n toScreen = (p) => editor.pageToScreen(p)\n }\n const { x, y, w, h } = bounds\n const cx = x + w / 2\n const cy = y + h / 2\n const handles: SelectionHandleHit[] = []\n const hideResize = single ? editor.getShapeUtil(single).hideResizeHandles(single) : false\n const hideRotate = single ? editor.getShapeUtil(single).hideRotateHandle(single) : false\n\n const topLeft = toScreen({ x, y })\n const topRight = toScreen({ x: x + w, y })\n const bottomRight = toScreen({ x: x + w, y: y + h })\n const bottomLeft = toScreen({ x, y: y + h })\n // Screen-space edge lengths: the selection may be rotated, so measure the\n // transformed corners rather than the page-space width and height.\n const screenW = Vec.Dist(topLeft, topRight)\n const screenH = Vec.Dist(topLeft, bottomLeft)\n\n if (!hideResize) {\n handles.push(\n { handle: \"top_left\", point: topLeft },\n { handle: \"top_right\", point: topRight },\n { handle: \"bottom_right\", point: bottomRight },\n { handle: \"bottom_left\", point: bottomLeft },\n )\n // Edge handles only once the edge is long enough to hold one.\n if (screenW >= MIN_EDGE_LENGTH_FOR_EDGE_HANDLE) {\n handles.push(\n { handle: \"top\", point: toScreen({ x: cx, y }) },\n { handle: \"bottom\", point: toScreen({ x: cx, y: y + h }) },\n )\n }\n if (screenH >= MIN_EDGE_LENGTH_FOR_EDGE_HANDLE) {\n handles.push(\n { handle: \"right\", point: toScreen({ x: x + w, y: cy }) },\n { handle: \"left\", point: toScreen({ x, y: cy }) },\n )\n }\n }\n if (!hideRotate) {\n // rotate handle above the top edge, in screen pixels\n const top = toScreen({ x: cx, y })\n const center = toScreen({ x: cx, y: cy })\n const dir = Vec.Uni(Vec.Sub(top, center))\n const off = Vec.Len(Vec.Sub(top, center)) === 0 ? new Vec(0, -1) : dir\n handles.push({ handle: \"rotate\", point: Vec.Add(top, Vec.Mul(off, ROTATE_HANDLE_OFFSET)) })\n }\n return { bounds, rotation, handles, screenW, screenH }\n}\n\n/** The selection handle under a screen point, if any. */\nexport function hitTestSelectionHandles(editor: Editor, screenPoint: VecLike, radius?: number): SelectionHandle | undefined {\n const info = getSelectionHandlePositions(editor)\n if (!info) return undefined\n const r = radius ?? getHandleHitRadius(info.screenW, info.screenH)\n let best: SelectionHandle | undefined\n let bestD = r * r\n for (const h of info.handles) {\n const d = Vec.Dist2(h.point, screenPoint)\n if (d <= bestD) {\n bestD = d\n best = h.handle\n }\n }\n // Prefer corners over edges when they overlap (small shapes)\n return best\n}\n\n/** Is the screen point inside the selection bounds (for dragging the selection as a whole)? */\nexport function hitTestSelectionBounds(editor: Editor, pagePoint: VecLike): boolean {\n const selected = editor.getSelectedShapes()\n if (selected.length === 0) return false\n if (selected.length === 1) {\n const s = selected[0]!\n const util = editor.getShapeUtil(s)\n if (util.hideSelectionBoundsBg(s)) return false\n const b = editor.getShapeGeometryBounds(s)!\n const local = editor.getPointInShapeSpace(s, pagePoint)\n return Box.ContainsPoint(b, local)\n }\n const b = editor.getSelectionPageBounds()!\n return Box.ContainsPoint(b, pagePoint)\n}\n","/**\n * Normalization for records read out of a `.tldr` file.\n *\n * Files written by different generations of the format spell the same\n * information in different ways: a shape's label may arrive as a plain string\n * or as a rich-text document, and a freehand stroke's points may arrive as an\n * array or as one packed binary blob. Nothing downstream should have to know\n * that, so the load path runs every record through here first and the shape\n * utils only ever see the props they declare.\n *\n * Everything in this module is pure and total: it never throws, and whatever it\n * cannot make sense of is reported as a warning string instead.\n */\n\nimport type { UnknownRecord } from \"@mocanvas/store\"\nimport type { ShapeUtil } from \"../shapes/ShapeUtil\"\nimport type { UnknownShape } from \"./base\"\n\ntype Props = Record<string, unknown>\n\nfunction isPlainObject(value: unknown): value is Props {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\n/* ---- rich text --------------------------------------------------------- */\n\n/**\n * Flatten a rich-text document to the plain string mocanvas stores in\n * `props.text`.\n *\n * The document is a tree of `{ type, content?, text? }` nodes. `text` nodes\n * contribute their string, `hardBreak` nodes a newline, top-level paragraphs\n * are joined by newlines, and any other node is recursed into so unknown marks\n * or wrappers still yield their text. `unknownNodeTypes`, when passed, collects\n * the node types that were not understood.\n */\nexport function richTextToPlainText(doc: unknown, unknownNodeTypes?: Set<string>): string {\n if (typeof doc === \"string\") return doc\n if (!isPlainObject(doc)) return \"\"\n const blocks = Array.isArray(doc[\"content\"]) ? (doc[\"content\"] as unknown[]) : []\n if (blocks.length === 0) return nodeToText(doc, unknownNodeTypes)\n return blocks.map((block) => nodeToText(block, unknownNodeTypes)).join(\"\\n\")\n}\n\nconst TEXTLESS_NODE_TYPES = new Set([\"doc\", \"paragraph\", \"text\", \"hardBreak\", \"heading\", \"listItem\", \"bulletList\", \"orderedList\"])\n\nfunction nodeToText(node: unknown, unknownNodeTypes?: Set<string>): string {\n if (typeof node === \"string\") return node\n if (!isPlainObject(node)) return \"\"\n const type = typeof node[\"type\"] === \"string\" ? (node[\"type\"] as string) : \"\"\n if (type === \"text\") return typeof node[\"text\"] === \"string\" ? (node[\"text\"] as string) : \"\"\n if (type === \"hardBreak\") return \"\\n\"\n if (type && !TEXTLESS_NODE_TYPES.has(type)) unknownNodeTypes?.add(type)\n const content = node[\"content\"]\n if (!Array.isArray(content)) return \"\"\n // Blocks nested inside a block (a list's items, say) still read as separate lines.\n const separator = type === \"paragraph\" || type === \"heading\" ? \"\" : \"\\n\"\n return (content as unknown[]).map((child) => nodeToText(child, unknownNodeTypes)).join(separator)\n}\n\n/* ---- freehand segment paths -------------------------------------------- */\n\n/** A point of a freehand stroke: position plus pen pressure. */\nexport interface DecodedDrawPoint {\n x: number\n y: number\n z: number\n}\n\nconst PATH_HEADER_BYTES = 12\nconst PATH_DELTA_BYTES = 6\n\n/**\n * Decode a packed freehand segment path into its points, or `null` when the\n * blob is not in the layout we understand.\n *\n * Layout, as observed in the files themselves: base64 of a little-endian\n * buffer holding the first point as three `float32` (x, y, pressure) followed\n * by one `float16` triple per further point, each a delta from the previous\n * point.\n */\nexport function decodeDrawSegmentPath(path: string): DecodedDrawPoint[] | null {\n const bytes = base64ToBytes(path)\n if (!bytes) return null\n if (bytes.byteLength < PATH_HEADER_BYTES) return null\n if ((bytes.byteLength - PATH_HEADER_BYTES) % PATH_DELTA_BYTES !== 0) return null\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n let x = view.getFloat32(0, true)\n let y = view.getFloat32(4, true)\n let z = view.getFloat32(8, true)\n if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) return null\n const points: DecodedDrawPoint[] = [{ x, y, z }]\n for (let at = PATH_HEADER_BYTES; at < bytes.byteLength; at += PATH_DELTA_BYTES) {\n const dx = getFloat16(view, at)\n const dy = getFloat16(view, at + 2)\n const dz = getFloat16(view, at + 4)\n if (!Number.isFinite(dx) || !Number.isFinite(dy) || !Number.isFinite(dz)) return null\n x += dx\n y += dy\n z += dz\n points.push({ x, y, z })\n }\n return points\n}\n\nfunction base64ToBytes(value: string): Uint8Array | null {\n if (typeof value !== \"string\" || value.length === 0 || value.length % 4 !== 0) return null\n if (!/^[A-Za-z0-9+/]+={0,2}$/.test(value)) return null\n try {\n if (typeof atob === \"function\") {\n const binary = atob(value)\n const out = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i)\n return out\n }\n const buffer = (globalThis as { Buffer?: { from(s: string, enc: string): Uint8Array } }).Buffer\n return buffer ? new Uint8Array(buffer.from(value, \"base64\")) : null\n } catch {\n return null\n }\n}\n\n/** Read a little-endian IEEE half-precision float. `DataView` has no `getFloat16`. */\nfunction getFloat16(view: DataView, offset: number): number {\n const bits = view.getUint16(offset, true)\n const sign = bits & 0x8000 ? -1 : 1\n const exponent = (bits >> 10) & 0x1f\n const fraction = bits & 0x3ff\n if (exponent === 0) return sign * 2 ** -14 * (fraction / 1024)\n if (exponent === 0x1f) return fraction ? Number.NaN : sign * Infinity\n return sign * 2 ** (exponent - 15) * (1 + fraction / 1024)\n}\n\n/* ---- record normalization ---------------------------------------------- */\n\nexport interface NormalizeOptions {\n /** The registered shape utils, keyed by shape type. Used for default props. */\n shapeUtils: Readonly<Record<string, Pick<ShapeUtil, \"getDefaultProps\">>>\n}\n\nexport interface NormalizeResult {\n records: UnknownRecord[]\n warnings: string[]\n}\n\n/** Shape types whose `segments` carry packed freehand paths. */\nconst FREEHAND_TYPES = new Set([\"draw\", \"highlight\"])\n\nfunction isShapeRecord(record: UnknownRecord): record is UnknownRecord & UnknownShape {\n return record.typeName === \"shape\" && typeof (record as { type?: unknown }).type === \"string\"\n}\n\n/**\n * Rewrite loaded records so the shape utils see the props they declare.\n *\n * Per shape: `props.richText` becomes `props.text` (the rich-text document is\n * dropped, not kept alongside), packed freehand `segments[].path` becomes\n * `segments[].points`, and any prop the util declares a default for but the\n * file omits is filled in from that default. Props the util does not declare\n * are left untouched so a round trip preserves them, and shapes of a type with\n * no registered util are passed through unchanged.\n *\n * Records are only copied when something actually changes.\n */\nexport function normalizeLoadedRecords(records: readonly UnknownRecord[], options: NormalizeOptions): NormalizeResult {\n const warnings: string[] = []\n const out: UnknownRecord[] = []\n const unknownTypes = new Set<string>()\n\n for (const record of records) {\n if (!isShapeRecord(record)) {\n out.push(record)\n continue\n }\n const util = options.shapeUtils[record.type]\n if (!util) {\n if (!unknownTypes.has(record.type)) {\n unknownTypes.add(record.type)\n warnings.push(`shape type \"${record.type}\" has no registered util; its shapes are kept but not rendered`)\n }\n out.push(record)\n continue\n }\n\n const source = isPlainObject(record.props) ? record.props : {}\n let props: Props | null = isPlainObject(record.props) ? null : { ...source }\n\n // Rich text label -> plain text.\n if (\"richText\" in source) {\n const unknownNodes = new Set<string>()\n const text = richTextToPlainText(source[\"richText\"], unknownNodes)\n for (const node of unknownNodes) {\n warnings.push(`${record.id}: unsupported rich text node \"${node}\"; its text was kept, its formatting dropped`)\n }\n props ??= { ...source }\n delete props[\"richText\"]\n if (typeof props[\"text\"] !== \"string\") props[\"text\"] = text\n }\n\n // Packed freehand paths -> point arrays.\n if (FREEHAND_TYPES.has(record.type) && Array.isArray(source[\"segments\"])) {\n const decoded = decodeSegments(source[\"segments\"] as unknown[], record.id, warnings)\n if (decoded) {\n props ??= { ...source }\n props[\"segments\"] = decoded\n }\n }\n\n // Fill in props the util declares but the file omits.\n const defaults = safeDefaultProps(util, record.type, warnings)\n const missing: string[] = []\n for (const key of Object.keys(defaults)) {\n const from = props ?? source\n if (!(key in from) || from[key] === undefined) missing.push(key)\n }\n if (missing.length > 0) {\n props ??= { ...source }\n for (const key of missing) props[key] = defaults[key]\n warnings.push(`${record.id}: missing prop${missing.length > 1 ? \"s\" : \"\"} ${missing.join(\", \")} filled in from defaults`)\n }\n\n out.push(props ? ({ ...record, props } as UnknownRecord) : record)\n }\n\n return { records: out, warnings }\n}\n\nfunction safeDefaultProps(util: Pick<ShapeUtil, \"getDefaultProps\">, type: string, warnings: string[]): Props {\n try {\n const defaults = util.getDefaultProps() as unknown\n return isPlainObject(defaults) ? defaults : {}\n } catch (error) {\n warnings.push(`shape type \"${type}\": getDefaultProps() failed (${String(error)}); missing props were not filled in`)\n return {}\n }\n}\n\n/**\n * Replace packed `path` blobs with decoded `points`. Returns `null` when no\n * segment needed rewriting. Segments that cannot be decoded are dropped.\n */\nfunction decodeSegments(segments: readonly unknown[], id: string, warnings: string[]): unknown[] | null {\n let changed = false\n const out: unknown[] = []\n for (const segment of segments) {\n if (!isPlainObject(segment) || Array.isArray(segment[\"points\"]) || typeof segment[\"path\"] !== \"string\") {\n out.push(segment)\n continue\n }\n changed = true\n const points = decodeDrawSegmentPath(segment[\"path\"] as string)\n if (!points) {\n warnings.push(`${id}: freehand segment uses an unrecognized path encoding; the segment was dropped`)\n continue\n }\n const next: Props = { ...segment, points }\n delete next[\"path\"]\n out.push(next)\n }\n return changed ? out : null\n}\n","import type { Editor } from \"../editor/Editor\"\nimport type { UnknownBinding } from \"../records/binding\"\nimport type { UnknownShape } from \"../records/base\"\n\nexport interface BindingUtilConstructor<B extends UnknownBinding = UnknownBinding, U extends BindingUtil<B> = BindingUtil<B>> {\n new (editor: Editor): U\n type: B[\"type\"]\n props?: Record<string, unknown>\n migrations?: unknown\n}\n\nexport interface BindingOnCreateOptions<B extends UnknownBinding> {\n binding: B\n}\nexport interface BindingOnChangeOptions<B extends UnknownBinding> {\n bindingBefore: B\n bindingAfter: B\n}\nexport interface BindingOnShapeChangeOptions<B extends UnknownBinding> {\n binding: B\n shapeBefore: UnknownShape\n shapeAfter: UnknownShape\n /** Why the shape changed: itself, or because an ancestor moved. */\n reason: \"self\" | \"ancestry\"\n}\nexport interface BindingOnShapeIsolateOptions<B extends UnknownBinding> {\n binding: B\n /** The shape leaving this binding's context (deleted, or copied without its partner). */\n removedShape?: UnknownShape\n}\nexport interface BindingOnShapeDeleteOptions<B extends UnknownBinding> {\n binding: B\n shape: UnknownShape\n}\n\n/**\n * Describes how a binding type behaves. One instance per binding type per editor.\n * Callbacks run inside the store transaction that caused them.\n */\nexport abstract class BindingUtil<B extends UnknownBinding = UnknownBinding> {\n static type: string\n static props?: Record<string, unknown>\n static migrations?: unknown\n\n constructor(readonly editor: Editor) {}\n\n get type(): B[\"type\"] {\n return (this.constructor as BindingUtilConstructor<B>).type\n }\n\n abstract getDefaultProps(): Partial<B[\"props\"]>\n\n onBeforeCreate?(options: BindingOnCreateOptions<B>): B | void\n onAfterCreate?(options: BindingOnCreateOptions<B>): void\n onBeforeChange?(options: BindingOnChangeOptions<B>): B | void\n onAfterChange?(options: BindingOnChangeOptions<B>): void\n onBeforeDelete?(options: { binding: B }): void\n onAfterDelete?(options: { binding: B }): void\n /** The `from` shape changed (moved, resized, ...). */\n onAfterChangeFromShape?(options: BindingOnShapeChangeOptions<B>): void\n /** The `to` shape changed. */\n onAfterChangeToShape?(options: BindingOnShapeChangeOptions<B>): void\n /** The `from` shape is about to be deleted; the binding is deleted right after. */\n onBeforeDeleteFromShape?(options: BindingOnShapeDeleteOptions<B>): void\n /** The `to` shape is about to be deleted; the binding is deleted right after. */\n onBeforeDeleteToShape?(options: BindingOnShapeDeleteOptions<B>): void\n /** The `from` shape is being isolated (partner going away); typically the binding converts to a static value. */\n onBeforeIsolateFromShape?(options: BindingOnShapeIsolateOptions<B>): void\n onBeforeIsolateToShape?(options: BindingOnShapeIsolateOptions<B>): void\n}\n","import type { ReactNode } from \"react\"\nimport type { StyleWords } from \"@mocanvas/wasm\"\nimport type { Editor } from \"../editor/Editor\"\nimport type { Geometry2d, VecLike } from \"../geometry\"\nimport type { ShapeHandle, SelectionHandle } from \"../editor/events\"\nimport type { UnknownShape } from \"../records/base\"\n\nexport interface ShapeUtilConstructor<T extends UnknownShape = UnknownShape, U extends ShapeUtil<T> = ShapeUtil<T>> {\n new (editor: Editor): U\n type: T[\"type\"]\n props?: Record<string, unknown>\n migrations?: unknown\n}\n\nexport interface ResizeInfo<T extends UnknownShape> {\n newPoint: VecLike\n handle: SelectionHandle\n mode: \"scale_shape\" | \"resize_bounds\"\n scaleX: number\n scaleY: number\n initialBounds: { x: number; y: number; w: number; h: number }\n initialShape: T\n}\n\nexport interface TranslateInfo<T extends UnknownShape> {\n initialShape: T\n}\n\n/** Export-wide settings handed to `ShapeUtil.toSvg` / `toBackgroundSvg`. */\nexport interface ShapeSvgContext {\n /** Whether the export is being drawn against the dark theme. */\n darkMode: boolean\n /** The page background colour of the export, as `#rrggbb`. */\n background: string\n}\n\n/**\n * What an SVG export callback may return: a raw markup string (inserted\n * verbatim, so it must be well-formed and escaped by the util) or a React node\n * the exporter serializes. `undefined` means \"I have nothing to draw\", which\n * lets the exporter fall through to its own renderers.\n */\nexport type ShapeSvgResult = string | ReactNode\n\n/**\n * Describes how a shape type behaves: its default props, geometry, rendering\n * and interaction callbacks. One instance per shape type per editor.\n */\nexport abstract class ShapeUtil<T extends UnknownShape = UnknownShape> {\n static type: string\n static props?: Record<string, unknown>\n static migrations?: unknown\n\n constructor(readonly editor: Editor) {}\n\n get type(): T[\"type\"] {\n return (this.constructor as ShapeUtilConstructor<T>).type\n }\n\n abstract getDefaultProps(): T[\"props\"]\n abstract getGeometry(shape: T): Geometry2d\n abstract component(shape: T): ReactNode\n\n /**\n * The outline drawn over the shape when it is selected or hovered, in\n * shape-local coordinates. The indicators layer supplies `fill: none`, the\n * selection colour and a zoom-independent stroke width, so an indicator is\n * usually just a bare `<path>` or `<rect>`. Return `null` to fall back to a\n * rectangle around the shape's geometry bounds.\n */\n abstract indicator(shape: T): ReactNode\n\n /**\n * The shape as SVG, in shape-local coordinates: the exporter wraps the\n * result in a `<g>` carrying the shape's page transform and opacity.\n * Implement it to make a custom shape exportable without registering\n * anything; leave it undefined to fall through to the exporter's own\n * renderers.\n */\n toSvg?(shape: T, ctx: ShapeSvgContext): ShapeSvgResult\n\n /**\n * Extra SVG drawn *behind* every exported shape (a backdrop, a drop shadow,\n * a grid). Same coordinate space and wrapping as `toSvg`.\n */\n toBackgroundSvg?(shape: T, ctx: ShapeSvgContext): ShapeSvgResult\n\n /**\n * GPU style for the shape's geometry. Return `null` (the default) to render\n * the shape through `component` in the DOM overlay instead.\n */\n getRenderStyle(_shape: T): StyleWords | null {\n return null\n }\n\n /** Whether the shape should be drawn by the DOM overlay even if it has a render style (e.g. while editing). */\n needsOverlay(shape: T): boolean {\n return this.editor.getEditingShapeId() === shape.id\n }\n\n /**\n * Whether `component` should be rendered in the DOM overlay *in addition to*\n * the GPU geometry (e.g. a text label on a filled shape).\n */\n hasOverlayLabel(_shape: T): boolean {\n return false\n }\n\n /**\n * Whether the shape clips its descendants to its own geometry bounds (e.g.\n * frames). Children are then rendered with a scissor rect on the GPU.\n */\n isClipShape(_shape: T): boolean {\n return false\n }\n\n canEdit(_shape: T): boolean {\n return false\n }\n canResize(_shape: T): boolean {\n return true\n }\n canBind(_opts: { fromShapeType: string; toShapeType: string; bindingType: string }): boolean {\n return true\n }\n canCrop(_shape: T): boolean {\n return false\n }\n canScroll(_shape: T): boolean {\n return false\n }\n canSnap(_shape: T): boolean {\n return true\n }\n canReceiveNewChildrenOfType(_shape: T, _type: string): boolean {\n return false\n }\n canDropShapes(_shape: T, _shapes: UnknownShape[]): boolean {\n return false\n }\n hideRotateHandle(_shape: T): boolean {\n return false\n }\n hideResizeHandles(_shape: T): boolean {\n return false\n }\n hideSelectionBoundsBg(_shape: T): boolean {\n return false\n }\n hideSelectionBoundsFg(_shape: T): boolean {\n return false\n }\n isAspectRatioLocked(_shape: T): boolean {\n return false\n }\n getHandles?(shape: T): ShapeHandle[]\n getText?(shape: T): string | undefined\n\n onBeforeCreate?(next: T): T | void\n onBeforeUpdate?(prev: T, next: T): T | void\n onResize?(shape: T, info: ResizeInfo<T>): Partial<T> | void\n onResizeStart?(shape: T): void\n onResizeEnd?(initial: T, current: T): void\n onTranslateStart?(shape: T): Partial<T> | void\n onTranslate?(initial: T, current: T): Partial<T> | void\n onTranslateEnd?(initial: T, current: T): Partial<T> | void\n onRotateStart?(shape: T): void\n onRotate?(initial: T, current: T): Partial<T> | void\n onRotateEnd?(initial: T, current: T): void\n onHandleDrag?(shape: T, info: { handle: ShapeHandle; isPrecise: boolean; initial?: T }): Partial<T> | void\n onDoubleClick?(shape: T): Partial<T> | void\n onDoubleClickEdge?(shape: T): Partial<T> | void\n onDoubleClickHandle?(shape: T, handle: ShapeHandle): Partial<T> | void\n onEditEnd?(shape: T): void\n onChildrenChange?(shape: T): Partial<UnknownShape>[] | void\n onDragShapesOver?(shape: T, shapes: UnknownShape[]): void\n onDragShapesOut?(shape: T, shapes: UnknownShape[]): void\n onDropShapesOver?(shape: T, shapes: UnknownShape[]): void\n}\n\n/** Shapes with `w` and `h` props. */\nexport abstract class BaseBoxShapeUtil<T extends UnknownShape & { props: { w: number; h: number } }> extends ShapeUtil<T> {\n override onResize(shape: T, info: ResizeInfo<T>): Partial<T> {\n const { scaleX, scaleY, initialShape, newPoint } = info\n const w = Math.max(1, Math.abs(initialShape.props.w * scaleX))\n const h = Math.max(1, Math.abs(initialShape.props.h * scaleY))\n return { x: newPoint.x, y: newPoint.y, props: { ...shape.props, w, h } } as Partial<T>\n }\n}\n","import { BATCH_WORDS, readClip, type CameraState, type ClipRect } from \"@mocanvas/wasm\"\n\n/**\n * An axis-aligned rectangle in device pixels with a top-down `y` (origin at\n * the top-left corner of the canvas), as used by WebGPU's `setScissorRect`.\n * WebGL2's `scissor` is bottom-left based: pass `canvasH - (y + h)` as its `y`.\n */\nexport interface DeviceRect {\n x: number\n y: number\n w: number\n h: number\n}\n\n/**\n * Map a page-space clip rect to device pixels: `(p + cam) * zoom * dpr`,\n * clamped to the canvas. Returns `null` when nothing of the rect is visible,\n * in which case the batch can be skipped entirely. The result is snapped\n * outward (floor / ceil) so partially covered pixels stay visible.\n *\n * Shared by the WebGL2 and WebGPU backends so both scissor identically.\n */\nexport function mapClipToDeviceRect(clip: ClipRect, camera: CameraState, dpr: number, canvasW: number, canvasH: number): DeviceRect | null {\n const s = camera.z * dpr\n const ox = camera.x * s\n const oy = camera.y * s\n const x0 = Math.max(0, Math.floor(clip[0] * s + ox))\n const x1 = Math.min(canvasW, Math.ceil(clip[2] * s + ox))\n const y0 = Math.max(0, Math.floor(clip[1] * s + oy))\n const y1 = Math.min(canvasH, Math.ceil(clip[3] * s + oy))\n if (!(x1 > x0 && y1 > y0)) return null\n return { x: x0, y: y0, w: x1 - x0, h: y1 - y0 }\n}\n\n/** One draw-call worth of the frame, already mapped to device space. */\nexport interface DrawBatch {\n /** First index into `FrameBuffers.indices`. */\n first: number\n /** Number of indices. */\n count: number\n /** Host texture id, 0 = solid colour (white texture). */\n texture: number\n /** Device-space scissor, or `null` for the whole canvas. */\n scissor: DeviceRect | null\n}\n\n/**\n * Walk the batch words of a frame and hand each drawable batch to `visit`.\n * Batches whose clip rect maps to nothing on screen are dropped, as are empty\n * batches. Pure: no GPU calls, so both backends and the tests share it.\n */\nexport function forEachDrawBatch(batches: Uint32Array, camera: CameraState, dpr: number, canvasW: number, canvasH: number, visit: (batch: DrawBatch) => void): void {\n const out: DrawBatch = { first: 0, count: 0, texture: 0, scissor: null }\n for (let i = 0; i + BATCH_WORDS <= batches.length; i += BATCH_WORDS) {\n const count = batches[i + 1]!\n if (count === 0) continue\n const clip = readClip(batches, i + 3)\n let scissor: DeviceRect | null = null\n if (clip) {\n scissor = mapClipToDeviceRect(clip, camera, dpr, canvasW, canvasH)\n if (!scissor) continue\n }\n out.first = batches[i]!\n out.count = count\n out.texture = batches[i + 2]!\n out.scissor = scissor\n visit(out)\n }\n}\n","import { VERTEX_FLOATS, type CameraState, type FrameBuffers } from \"@mocanvas/wasm\"\nimport type { DrawOptions, RenderBackend, TextureOptions, TextureSource } from \"./backend\"\nimport { forEachDrawBatch } from \"./clip\"\n\nconst VERT = `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 a_pos;\nlayout(location = 1) in vec2 a_uv;\nlayout(location = 2) in vec4 a_color;\nuniform vec3 u_cam; // x, y, zoom\nuniform vec2 u_vp; // viewport size in CSS px\nout vec2 v_uv;\nout vec4 v_color;\nvoid main() {\n vec2 screen = (a_pos + u_cam.xy) * u_cam.z;\n vec2 clip = screen / u_vp * 2.0 - 1.0;\n gl_Position = vec4(clip.x, -clip.y, 0.0, 1.0);\n v_uv = a_uv;\n v_color = a_color;\n}`\n\n// Textures are stored premultiplied; the vertex colour is straight alpha and is\n// premultiplied here. Solid batches sample the 1×1 white texture (a no-op).\nconst FRAG = `#version 300 es\nprecision mediump float;\nin vec2 v_uv;\nin vec4 v_color;\nuniform sampler2D u_tex;\nout vec4 o_color;\nvoid main() {\n vec4 t = texture(u_tex, v_uv);\n o_color = vec4(v_color.rgb * v_color.a, v_color.a) * t;\n}`\n\nconst BYTES_PER_VERTEX = VERTEX_FLOATS * 4\n\nfunction compile(gl: WebGL2RenderingContext, type: number, src: string): WebGLShader {\n const sh = gl.createShader(type)\n if (!sh) throw new Error(\"mocanvas: cannot create shader\")\n gl.shaderSource(sh, src)\n gl.compileShader(sh)\n if (!gl.getShaderParameter(sh, gl.COMPILE_STATUS) && !gl.isContextLost()) {\n const log = gl.getShaderInfoLog(sh)\n gl.deleteShader(sh)\n throw new Error(`mocanvas: shader compile failed: ${log}`)\n }\n return sh\n}\n\nfunction isPowerOfTwo(n: number): boolean {\n return n > 0 && (n & (n - 1)) === 0\n}\n\nfunction sourceSize(source: TextureSource): [number, number] {\n if (typeof VideoFrame !== \"undefined\" && source instanceof VideoFrame) return [source.displayWidth, source.displayHeight]\n if (typeof HTMLVideoElement !== \"undefined\" && source instanceof HTMLVideoElement) return [source.videoWidth, source.videoHeight]\n const s = source as { width: number; height: number }\n return [s.width, s.height]\n}\n\n/** WebGL2 backend: one interleaved VBO, one IBO, one program, one draw call per batch. */\nexport class WebGL2Backend implements RenderBackend {\n readonly kind = \"webgl2\" as const\n private readonly gl: WebGL2RenderingContext\n private readonly program: WebGLProgram\n private readonly vao: WebGLVertexArrayObject\n private readonly vbo: WebGLBuffer\n private readonly ibo: WebGLBuffer\n private readonly uCam: WebGLUniformLocation\n private readonly uVp: WebGLUniformLocation\n /** Texture 0: 1×1 opaque white, so solid batches use the same shader. */\n private readonly whiteTex: WebGLTexture\n private readonly textures = new Map<number, WebGLTexture>()\n private vboBytes = 0\n private iboBytes = 0\n /**\n * `FrameBuffers.version` currently sitting in the VBO/IBO, or -1 when they hold\n * nothing usable. The engine's vertex data is page-space, so panning and zooming\n * change only the camera uniform: while the version is unchanged this skips the\n * (multi-megabyte, at scale) `bufferSubData` and just re-issues the draw calls.\n */\n private uploadedVersion = -1\n private width = 1\n private height = 1\n private pixelWidth = 1\n private pixelHeight = 1\n private dpr = 1\n private disposed = false\n\n constructor(readonly canvas: HTMLCanvasElement, options: { antialias?: boolean } = {}) {\n const gl = canvas.getContext(\"webgl2\", {\n antialias: options.antialias ?? true,\n premultipliedAlpha: true,\n alpha: true,\n preserveDrawingBuffer: false,\n powerPreference: \"high-performance\",\n desynchronized: true,\n })\n if (!gl) throw new Error(\"mocanvas: WebGL2 is not available\")\n this.gl = gl\n\n const vs = compile(gl, gl.VERTEX_SHADER, VERT)\n const fs = compile(gl, gl.FRAGMENT_SHADER, FRAG)\n const program = gl.createProgram()\n if (!program) throw new Error(\"mocanvas: cannot create program\")\n gl.attachShader(program, vs)\n gl.attachShader(program, fs)\n gl.linkProgram(program)\n gl.deleteShader(vs)\n gl.deleteShader(fs)\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(`mocanvas: program link failed: ${gl.getProgramInfoLog(program)}`)\n }\n this.program = program\n this.uCam = gl.getUniformLocation(program, \"u_cam\")!\n this.uVp = gl.getUniformLocation(program, \"u_vp\")!\n gl.useProgram(program)\n gl.uniform1i(gl.getUniformLocation(program, \"u_tex\"), 0)\n\n const vao = gl.createVertexArray()\n const vbo = gl.createBuffer()\n const ibo = gl.createBuffer()\n if (!vao || !vbo || !ibo) throw new Error(\"mocanvas: cannot create buffers\")\n this.vao = vao\n this.vbo = vbo\n this.ibo = ibo\n\n gl.bindVertexArray(vao)\n gl.bindBuffer(gl.ARRAY_BUFFER, vbo)\n gl.enableVertexAttribArray(0)\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, BYTES_PER_VERTEX, 0)\n gl.enableVertexAttribArray(1)\n gl.vertexAttribPointer(1, 2, gl.FLOAT, false, BYTES_PER_VERTEX, 8)\n gl.enableVertexAttribArray(2)\n gl.vertexAttribPointer(2, 4, gl.FLOAT, false, BYTES_PER_VERTEX, 16)\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo)\n gl.bindVertexArray(null)\n\n const white = gl.createTexture()\n if (!white) throw new Error(\"mocanvas: cannot create texture\")\n this.whiteTex = white\n gl.activeTexture(gl.TEXTURE0)\n gl.bindTexture(gl.TEXTURE_2D, white)\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255, 255, 255, 255]))\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n\n gl.enable(gl.BLEND)\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)\n gl.disable(gl.DEPTH_TEST)\n gl.disable(gl.CULL_FACE)\n gl.disable(gl.SCISSOR_TEST)\n }\n\n resize(width: number, height: number, dpr: number): void {\n this.width = Math.max(1, width)\n this.height = Math.max(1, height)\n this.dpr = dpr\n const pw = Math.max(1, Math.round(width * dpr))\n const ph = Math.max(1, Math.round(height * dpr))\n this.pixelWidth = pw\n this.pixelHeight = ph\n if (this.canvas.width !== pw || this.canvas.height !== ph) {\n this.canvas.width = pw\n this.canvas.height = ph\n }\n this.gl.viewport(0, 0, pw, ph)\n }\n\n uploadTexture(id: number, source: TextureSource, opts: TextureOptions = {}): void {\n if (this.disposed) return\n if (id === 0) throw new Error(\"mocanvas: texture id 0 is reserved\")\n const gl = this.gl\n let tex = this.textures.get(id)\n if (!tex) {\n const t = gl.createTexture()\n if (!t) throw new Error(\"mocanvas: cannot create texture\")\n tex = t\n this.textures.set(id, tex)\n }\n const [w, h] = sourceSize(source)\n const mip = isPowerOfTwo(w) && isPowerOfTwo(h)\n const smooth = opts.smooth ?? true\n gl.activeTexture(gl.TEXTURE0)\n gl.bindTexture(gl.TEXTURE_2D, tex)\n // The blend mode expects premultiplied colour; let the browser premultiply on upload.\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, opts.premultiplied ? 0 : 1)\n gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE)\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source as TexImageSource)\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, smooth ? gl.LINEAR : gl.NEAREST)\n if (mip) {\n gl.generateMipmap(gl.TEXTURE_2D)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, smooth ? gl.LINEAR_MIPMAP_LINEAR : gl.NEAREST_MIPMAP_NEAREST)\n } else {\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, smooth ? gl.LINEAR : gl.NEAREST)\n }\n }\n\n deleteTexture(id: number): void {\n const tex = this.textures.get(id)\n if (!tex) return\n this.textures.delete(id)\n if (!this.disposed) this.gl.deleteTexture(tex)\n }\n\n draw(frame: FrameBuffers, camera: CameraState, options: DrawOptions): void {\n if (this.disposed) return\n const gl = this.gl\n const [r, g, b, a] = options.background\n gl.disable(gl.SCISSOR_TEST)\n gl.clearColor(r * a, g * a, b * a, a)\n gl.clear(gl.COLOR_BUFFER_BIT)\n if (frame.indices.length === 0) return\n\n gl.useProgram(this.program)\n gl.uniform3f(this.uCam, camera.x, camera.y, camera.z)\n gl.uniform2f(this.uVp, this.width, this.height)\n gl.bindVertexArray(this.vao)\n\n if (frame.version !== this.uploadedVersion) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.vbo)\n const vBytes = frame.vertices.byteLength\n if (vBytes > this.vboBytes) {\n this.vboBytes = Math.max(vBytes, this.vboBytes * 2)\n gl.bufferData(gl.ARRAY_BUFFER, this.vboBytes, gl.DYNAMIC_DRAW)\n }\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, frame.vertices)\n\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.ibo)\n const iBytes = frame.indices.byteLength\n if (iBytes > this.iboBytes) {\n this.iboBytes = Math.max(iBytes, this.iboBytes * 2)\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.iboBytes, gl.DYNAMIC_DRAW)\n }\n gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, frame.indices)\n this.uploadedVersion = frame.version\n }\n\n // Scissor rects arrive top-down in device px; GL scissor is bottom-left based.\n const ph = this.pixelHeight\n gl.activeTexture(gl.TEXTURE0)\n let boundTex: WebGLTexture | null = null\n let scissoring = false\n forEachDrawBatch(frame.batches, camera, this.dpr, this.pixelWidth, ph, (b) => {\n const sc = b.scissor\n if (sc) {\n if (!scissoring) {\n gl.enable(gl.SCISSOR_TEST)\n scissoring = true\n }\n gl.scissor(sc.x, ph - (sc.y + sc.h), sc.w, sc.h)\n } else if (scissoring) {\n gl.disable(gl.SCISSOR_TEST)\n scissoring = false\n }\n\n const tex = (b.texture !== 0 ? this.textures.get(b.texture) : undefined) ?? this.whiteTex\n if (tex !== boundTex) {\n gl.bindTexture(gl.TEXTURE_2D, tex)\n boundTex = tex\n }\n gl.drawElements(gl.TRIANGLES, b.count, gl.UNSIGNED_INT, b.first * 4)\n })\n if (scissoring) gl.disable(gl.SCISSOR_TEST)\n gl.bindVertexArray(null)\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n const gl = this.gl\n for (const tex of this.textures.values()) gl.deleteTexture(tex)\n this.textures.clear()\n gl.deleteTexture(this.whiteTex)\n gl.deleteBuffer(this.vbo)\n gl.deleteBuffer(this.ibo)\n gl.deleteVertexArray(this.vao)\n gl.deleteProgram(this.program)\n // Do not lose the context here: the same canvas element may be re-used by a\n // remount (React StrictMode double-invokes effects).\n }\n}\n\n/**\n * Create the synchronous WebGL2 backend. For WebGPU (async device setup) or\n * automatic selection use `createBackendAsync` from `./createBackend`.\n */\nexport function createBackend(canvas: HTMLCanvasElement): RenderBackend {\n return new WebGL2Backend(canvas)\n}\n","import { createContext, useContext } from \"react\"\nimport type { Editor } from \"../editor/Editor\"\n\nexport const EditorContext = createContext<Editor | null>(null)\n\n/** The editor of the nearest `<EditorProvider>` / `<Canvas>`. */\nexport function useEditor(): Editor {\n const editor = useContext(EditorContext)\n if (!editor) throw new Error(\"useEditor must be used inside a mocanvas <Canvas> or <EditorProvider>\")\n return editor\n}\n\nexport function useMaybeEditor(): Editor | null {\n return useContext(EditorContext)\n}\n\nexport const EditorProvider = EditorContext.Provider\n","import { useMemo } from \"react\"\nimport type { Editor } from \"../editor/Editor\"\nimport type { ClickEventInfo, PointerEventInfo, PointerTarget, WheelEventInfo } from \"../editor/events\"\nimport { hitTestSelectionBounds, hitTestSelectionHandles, HANDLE_HIT_RADIUS } from \"../editor/selectionHandles\"\n\nimport { Vec } from \"../geometry\"\n\nfunction modifiers(e: { shiftKey: boolean; altKey: boolean; ctrlKey: boolean; metaKey: boolean }) {\n const isMac = typeof navigator !== \"undefined\" && /Mac|iPhone|iPad/.test(navigator.platform ?? \"\")\n return {\n shiftKey: e.shiftKey,\n altKey: e.altKey,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n accelKey: isMac ? e.metaKey : e.ctrlKey,\n }\n}\n\n/** Container-relative pointer position. */\nfunction localPoint(editor: Editor, e: { clientX: number; clientY: number }): { x: number; y: number; z: number } {\n const rect = editor.getContainer().getBoundingClientRect()\n return { x: e.clientX - rect.left, y: e.clientY - rect.top, z: 0.5 }\n}\n\n/** Resolve what is under the pointer for the event target. */\nfunction resolveTarget(editor: Editor, point: { x: number; y: number }): PointerTarget {\n const page = editor.screenToPage(point)\n if (editor.getCurrentToolId() === \"select\") {\n const selHandle = hitTestSelectionHandles(editor, point)\n if (selHandle) return { target: \"selection\", handle: selHandle }\n // Shape handles (arrow ends, line points) of the only selected shape.\n const only = editor.getOnlySelectedShape()\n if (only) {\n const handles = editor.getShapeUtil(only).getHandles?.(only)\n if (handles?.length) {\n const local = editor.getPointInShapeSpace(only, page)\n const r = HANDLE_HIT_RADIUS / editor.getZoomLevel()\n let best: (typeof handles)[number] | undefined\n let bestD = r * r\n for (const h of handles) {\n const d = Vec.Dist2(h, local)\n if (d <= bestD) {\n bestD = d\n best = h\n }\n }\n if (best) return { target: \"handle\", shape: only, handle: best }\n }\n }\n }\n // Filled shapes hit on their interior, hollow ones only near their outline (engine decides per style).\n const shape = editor.getShapeAtPoint(page, { hitInside: true })\n if (shape) return { target: \"shape\", shape }\n if (editor.getCurrentToolId() === \"select\" && hitTestSelectionBounds(editor, page)) {\n const selected = editor.getSelectedShapes()\n const inside = selected.find((s) => editor.getShapeGeometry(s).hitTestPoint(editor.getPointInShapeSpace(s, page), 0, true))\n return inside ? { target: \"shape\", shape: inside } : { target: \"selection\" }\n }\n const filled = editor.getShapeAtPoint(page, { hitInside: true })\n if (filled && editor.getSelectedShapeIds().includes(filled.id)) return { target: \"shape\", shape: filled }\n return { target: \"canvas\" }\n}\n\n/** DOM handlers that translate browser events into editor events. */\nexport function useCanvasEvents(editor: Editor) {\n return useMemo(() => {\n let lastDownTime = 0\n let clickCount = 0\n let lastDownPoint = { x: 0, y: 0 }\n\n const pointerInfo = (e: PointerEvent | React.PointerEvent, name: PointerEventInfo[\"name\"]): PointerEventInfo => {\n const point = localPoint(editor, e)\n return {\n type: \"pointer\",\n name,\n point,\n pointerId: e.pointerId,\n button: e.button,\n isPen: e.pointerType === \"pen\",\n ...modifiers(e),\n ...resolveTarget(editor, point),\n }\n }\n\n return {\n onPointerDown(e: React.PointerEvent<HTMLDivElement>) {\n if (e.button === 2) {\n editor.dispatch(pointerInfo(e, \"right_click\"))\n return\n }\n if (e.button === 1) {\n editor.dispatch(pointerInfo(e, \"middle_click\"))\n }\n ;(e.currentTarget as HTMLElement).setPointerCapture(e.pointerId)\n editor.getContainer().focus({ preventScroll: true })\n const now = performance.now()\n const p = localPoint(editor, e)\n if (now - lastDownTime < 400 && Math.hypot(p.x - lastDownPoint.x, p.y - lastDownPoint.y) < 8) clickCount++\n else clickCount = 1\n lastDownTime = now\n lastDownPoint = p\n editor.dispatch(pointerInfo(e, \"pointer_down\"))\n },\n onPointerMove(e: React.PointerEvent<HTMLDivElement>) {\n if (e.pointerType === \"mouse\" && e.buttons === 0 && editor.inputs.isPointing) {\n // Missed a pointer up (e.g. released outside the window).\n editor.dispatch(pointerInfo(e, \"pointer_up\"))\n return\n }\n editor.dispatch(pointerInfo(e, \"pointer_move\"))\n },\n onPointerUp(e: React.PointerEvent<HTMLDivElement>) {\n if (e.button === 2) return\n const el = e.currentTarget as HTMLElement\n if (el.hasPointerCapture(e.pointerId)) el.releasePointerCapture(e.pointerId)\n editor.dispatch(pointerInfo(e, \"pointer_up\"))\n if (clickCount >= 2) {\n const name: ClickEventInfo[\"name\"] = clickCount === 2 ? \"double_click\" : clickCount === 3 ? \"triple_click\" : \"quadruple_click\"\n const point = localPoint(editor, e)\n editor.dispatch({\n type: \"click\",\n name,\n phase: \"up\",\n point,\n pointerId: e.pointerId,\n button: e.button,\n isPen: e.pointerType === \"pen\",\n ...modifiers(e),\n ...resolveTarget(editor, point),\n })\n }\n },\n onPointerCancel(e: React.PointerEvent<HTMLDivElement>) {\n editor.dispatch(pointerInfo(e, \"pointer_up\"))\n editor.cancel()\n },\n onWheel(e: WheelEvent) {\n e.preventDefault()\n const point = localPoint(editor, e)\n const scale = e.deltaMode === 1 ? 16 : e.deltaMode === 2 ? 400 : 1\n const info: WheelEventInfo = {\n type: \"wheel\",\n name: \"wheel\",\n point,\n delta: { x: e.deltaX * scale, y: e.deltaY * scale, z: 0 },\n ...modifiers(e),\n }\n editor.dispatch(info)\n },\n onContextMenu(e: React.MouseEvent) {\n e.preventDefault()\n },\n onKeyDown(e: KeyboardEvent) {\n if (isEditableTarget(e.target)) return\n editor.dispatch({ type: \"keyboard\", name: e.repeat ? \"key_repeat\" : \"key_down\", key: e.key, code: e.code, ...modifiers(e) })\n },\n onKeyUp(e: KeyboardEvent) {\n if (isEditableTarget(e.target)) return\n editor.dispatch({ type: \"keyboard\", name: \"key_up\", key: e.key, code: e.code, ...modifiers(e) })\n },\n }\n }, [editor])\n}\n\nfunction isEditableTarget(t: EventTarget | null): boolean {\n if (!(t instanceof HTMLElement)) return false\n const tag = t.tagName\n return tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\" || t.isContentEditable\n}\n","import { react as reactSignal } from \"@mocanvas/state\"\nimport { track, useValue } from \"@mocanvas/state/react\"\nimport { useEffect, useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode } from \"react\"\nimport type { ClipRect } from \"@mocanvas/wasm\"\nimport type { Editor } from \"../editor/Editor\"\nimport type { RenderBackend } from \"../render/backend\"\nimport { createBackend } from \"../render/webgl2\"\nimport type { UnknownShape } from \"../records/base\"\nimport { Vec } from \"../geometry\"\nimport { EditorProvider } from \"./EditorContext\"\nimport { useCanvasEvents } from \"./useCanvasEvents\"\nimport { getSelectionHandlePositions } from \"../editor/selectionHandles\"\n\nexport interface CanvasProps {\n editor: Editor\n className?: string\n style?: CSSProperties\n /** Extra layers rendered above the canvas (UI, menus). */\n children?: ReactNode\n /** Override the default selection/brush indicators. */\n components?: Partial<CanvasComponents>\n}\n\nexport interface CanvasComponents {\n Indicators: (props: { editor: Editor }) => ReactNode\n Brush: (props: { editor: Editor }) => ReactNode\n Background: (props: { editor: Editor }) => ReactNode\n}\n\nconst containerStyle: CSSProperties = {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n overflow: \"hidden\",\n touchAction: \"none\",\n userSelect: \"none\",\n WebkitUserSelect: \"none\",\n outline: \"none\",\n cursor: \"default\",\n}\n\nconst layerStyle: CSSProperties = {\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n}\n\n/*\n * Canvas chrome. Every colour comes from a custom property so an app can retheme\n * the indicators along with the rest of the UI; the literals here are only the\n * fallback for an editor mounted without `ui.css`, and are picked to clear 3:1\n * against both a light and a dark canvas.\n */\nconst SELECTION = \"var(--mocanvas-selection, #2f6fe4)\"\n/** Fill of a solid handle: the surface the selection stroke is drawn against. */\nconst HANDLE_FILL = \"var(--mocanvas-selection-fg, #ffffff)\"\nconst BRUSH_FILL = \"var(--mocanvas-brush-fill, rgba(47, 111, 228, 0.12))\"\nconst SNAP = \"var(--mocanvas-snap, #cf3fe0)\"\n/** Screen-space stroke width for indicator outlines. */\nconst INDICATOR_STROKE = 1.5\n/** Screen-space radii/sides of the selection handles, in CSS px. */\nconst HANDLE = { corner: 9, rotate: 5.5, shape: 6, virtual: 4 } as const\n\n/**\n * The canvas: a WebGL2 surface driven by the engine, a DOM overlay for shapes\n * that render through `ShapeUtil.component`, and an SVG layer for indicators.\n */\nexport function Canvas({ editor, className, style, children, components }: CanvasProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const [backend, setBackend] = useState<RenderBackend | null>(null)\n const events = useCanvasEvents(editor)\n\n // Backend lifecycle\n useLayoutEffect(() => {\n const canvas = canvasRef.current\n if (!canvas) return\n const b = createBackend(canvas)\n setBackend(b)\n return () => {\n b.dispose()\n setBackend(null)\n }\n }, [])\n\n // Viewport size tracking\n useLayoutEffect(() => {\n const el = containerRef.current\n if (!el || !backend) return\n const update = () => {\n const rect = el.getBoundingClientRect()\n const dpr = window.devicePixelRatio || 1\n backend.resize(rect.width, rect.height, dpr)\n editor.updateViewportScreenBounds({ x: rect.left, y: rect.top, w: rect.width, h: rect.height })\n editor.updateInstanceState({ devicePixelRatio: dpr })\n }\n update()\n const ro = new ResizeObserver(update)\n ro.observe(el)\n window.addEventListener(\"resize\", update)\n return () => {\n ro.disconnect()\n window.removeEventListener(\"resize\", update)\n }\n }, [editor, backend])\n\n // Frame loop: redraw when the frame epoch, camera, or viewport change.\n useEffect(() => {\n if (!backend) return\n let raf = 0\n let dirty = true\n const draw = () => {\n raf = 0\n if (!dirty) return\n dirty = false\n // Shapes that entered the viewport may still be waiting on the engine's\n // per-frame tessellation budget, drawn as flat quads until their turn comes.\n // Keep the loop alive until that backlog clears.\n if (editor.renderFrame(backend).pending) {\n dirty = true\n raf = requestAnimationFrame(draw)\n }\n }\n const stop = reactSignal(\n \"canvas.frame\",\n () => {\n editor.getFrameEpoch()\n editor.getCamera()\n editor.getViewportScreenBounds()\n editor.getEditingShapeId()\n dirty = true\n if (!raf) raf = requestAnimationFrame(draw)\n },\n )\n return () => {\n stop()\n if (raf) cancelAnimationFrame(raf)\n }\n }, [editor, backend])\n\n // Non-passive wheel + keyboard listeners\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n const onWheel = (e: WheelEvent) => events.onWheel(e)\n el.addEventListener(\"wheel\", onWheel, { passive: false })\n window.addEventListener(\"keydown\", events.onKeyDown)\n window.addEventListener(\"keyup\", events.onKeyUp)\n return () => {\n el.removeEventListener(\"wheel\", onWheel)\n window.removeEventListener(\"keydown\", events.onKeyDown)\n window.removeEventListener(\"keyup\", events.onKeyUp)\n }\n }, [events])\n\n const cursor = useValue(\"cursor\", () => cssCursor(editor.getInstanceState().cursor.type), [editor])\n const Indicators = components?.Indicators ?? DefaultIndicators\n const Brush = components?.Brush ?? DefaultBrush\n const Background = components?.Background\n\n return (\n <EditorProvider value={editor}>\n <div\n ref={containerRef}\n className={className ? `mocanvas ${className}` : \"mocanvas\"}\n style={{ ...containerStyle, ...style, cursor }}\n tabIndex={0}\n onPointerDown={events.onPointerDown}\n onPointerMove={events.onPointerMove}\n onPointerUp={events.onPointerUp}\n onPointerCancel={events.onPointerCancel}\n onContextMenu={events.onContextMenu}\n data-testid=\"mocanvas-container\"\n >\n {Background ? <Background editor={editor} /> : null}\n <canvas ref={canvasRef} style={{ ...layerStyle, display: \"block\" }} />\n <OverlayLayer editor={editor} />\n <svg style={{ ...layerStyle, pointerEvents: \"none\", overflow: \"visible\" }}>\n <Indicators editor={editor} />\n <SnapLines editor={editor} />\n <Brush editor={editor} />\n </svg>\n {children}\n </div>\n </EditorProvider>\n )\n}\n\n/** Shapes rendered by their ShapeUtil.component, positioned in page space via a camera transform. */\nconst OverlayLayer = track(function OverlayLayer({ editor }: { editor: Editor }) {\n const ids = editor.getOverlayShapeIds()\n const clips = editor.getOverlayClips()\n const cam = editor.getCamera()\n const editingId = editor.getEditingShapeId()\n return (\n <div\n className=\"mocanvas-overlay\"\n style={{\n ...layerStyle,\n pointerEvents: \"none\",\n transformOrigin: \"0 0\",\n transform: `scale(${cam.z}) translate(${cam.x}px, ${cam.y}px)`,\n }}\n >\n {ids.map((id, i) => {\n const shape = editor.getShape(id)\n if (!shape) return null\n return <OverlayShape key={id} editor={editor} shape={shape} isEditing={editingId === id} clip={clips[i]} />\n })}\n </div>\n )\n})\n\nconst OverlayShape = track(function OverlayShape({\n editor,\n shape,\n isEditing,\n clip,\n}: {\n editor: Editor\n shape: UnknownShape\n isEditing: boolean\n /** Page-space clip rect inherited from a clipping ancestor (a frame). */\n clip: ClipRect | undefined\n}) {\n const util = editor.getShapeUtil(shape)\n const m = editor.getShapePageTransform(shape)\n const bounds = editor.getShapeGeometryBounds(shape)\n // The clip rect is page-space and the shape may be rotated, so it is applied\n // by an unrotated wrapper placed at the rect; the shape is offset back into it.\n const offset = clip ? `translate(${-clip[0]}px, ${-clip[1]}px) ` : \"\"\n const el = (\n <div\n className=\"mocanvas-shape\"\n data-shape-id={shape.id}\n data-shape-type={shape.type}\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n width: bounds?.w ?? 0,\n height: bounds?.h ?? 0,\n transformOrigin: \"0 0\",\n transform: `${offset}matrix(${m.a}, ${m.b}, ${m.c}, ${m.d}, ${m.e}, ${m.f})`,\n opacity: shape.opacity,\n pointerEvents: isEditing ? \"auto\" : \"none\",\n }}\n >\n {util.component(shape)}\n </div>\n )\n if (!clip) return el\n return (\n <div\n className=\"mocanvas-shape-clip\"\n style={{\n position: \"absolute\",\n left: clip[0],\n top: clip[1],\n width: Math.max(0, clip[2] - clip[0]),\n height: Math.max(0, clip[3] - clip[1]),\n overflow: \"hidden\",\n pointerEvents: \"none\",\n }}\n >\n {el}\n </div>\n )\n})\n\nconst CURSORS: Record<string, string> = {\n default: \"default\",\n cross: \"crosshair\",\n grab: \"grab\",\n grabbing: \"grabbing\",\n move: \"move\",\n pointer: \"pointer\",\n text: \"text\",\n}\nfunction cssCursor(type: string): string {\n return CURSORS[type] ?? type\n}\n\n/**\n * The outline to draw over one shape: whatever its util's `indicator()`\n * returns, or a rectangle around the shape's geometry bounds when the util has\n * no indicator (or returns nothing). Both are expressed in *shape-local*\n * coordinates; the caller wraps them in the shape's page transform.\n *\n * Pure and exported so a custom `Indicators` component can reuse the same rule\n * instead of guessing at it.\n */\nexport function getShapeIndicatorNode<T extends UnknownShape>(\n util: { indicator?(shape: T): ReactNode },\n shape: T,\n bounds: { x: number; y: number; w: number; h: number } | undefined,\n): ReactNode {\n const own = util.indicator?.(shape)\n // `null`/`undefined`/`false` are the ways React spells \"nothing here\"; every\n // other node — including an empty fragment — is the util's own answer.\n if (own !== null && own !== undefined && own !== false) return own\n if (!bounds) return null\n return <rect x={bounds.x} y={bounds.y} width={bounds.w} height={bounds.h} />\n}\n\n/** Selection bounds and hover indicator. */\nconst DefaultIndicators = track(function DefaultIndicators({ editor }: { editor: Editor }) {\n const bounds = editor.getSelectionPageBounds()\n const hovered = editor.getHoveredShape()\n const selected = editor.getSelectedShapes()\n const cam = editor.getCamera()\n const z = cam.z\n const tool = editor.getCurrentToolId()\n const toScreen = (x: number, y: number) => [(x + cam.x) * z, (y + cam.y) * z] as const\n const items: ReactNode[] = []\n\n /*\n * One shape's outline, inside the camera transform and then the shape's own\n * page transform, so the util's shape-local indicator lands on the shape at\n * any pan, zoom or rotation.\n *\n * Paint is set on the group and inherited: an indicator is normally a bare\n * `<path>`/`<rect>`, and one that wants its own fill or dash just says so.\n * The stroke width is divided by the zoom because the group scales by it —\n * the quotient renders as a constant INDICATOR_STROKE CSS px, the same\n * hairline at 10% and at 800%, which is what makes an indicator readable at\n * all zooms. (`vector-effect=\"non-scaling-stroke\"` would do the same for the\n * inherited width, but it would also silently reinterpret any width an\n * indicator sets for itself as screen px, breaking the promise that\n * everything inside the group is in shape-local units.)\n */\n const indicatorFor = (shape: UnknownShape, key: string, stroke: string) => {\n const b = editor.getShapeGeometryBounds(shape)\n const node = getShapeIndicatorNode(editor.getShapeUtil(shape), shape, b)\n if (node === null) return null\n const m = editor.getShapePageTransform(shape)\n return (\n <g\n key={key}\n transform={`matrix(${z} 0 0 ${z} ${cam.x * z} ${cam.y * z}) matrix(${m.a} ${m.b} ${m.c} ${m.d} ${m.e} ${m.f})`}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={INDICATOR_STROKE / z}\n >\n {node}\n </g>\n )\n }\n\n if (hovered && tool === \"select\" && !selected.some((s) => s.id === hovered.id)) {\n const ind = indicatorFor(hovered, \"hover\", SELECTION)\n if (ind) items.push(ind)\n }\n if (selected.length > 1) {\n for (const s of selected) {\n const ind = indicatorFor(s, `sel-${s.id}`, SELECTION)\n if (ind) items.push(ind)\n }\n }\n if (bounds && tool === \"select\") {\n const info = getSelectionHandlePositions(editor)\n const stroke = SELECTION\n if (selected.length === 1) {\n const shape = selected[0]!\n const util = editor.getShapeUtil(shape)\n const m = editor.getShapePageTransform(shape)\n if (!util.hideSelectionBoundsFg(shape)) {\n const ind = indicatorFor(shape, \"bounds\", stroke)\n if (ind) items.push(ind)\n }\n const handles = util.getHandles?.(shape) ?? []\n for (const hd of handles) {\n const p = new Vec(m.a * hd.x + m.c * hd.y + m.e, m.b * hd.x + m.d * hd.y + m.f)\n const sp = editor.pageToScreen(p)\n items.push(\n <circle\n key={`h-${hd.id}`}\n cx={sp.x}\n cy={sp.y}\n r={hd.type === \"virtual\" ? HANDLE.virtual : HANDLE.shape}\n fill={hd.type === \"virtual\" ? stroke : HANDLE_FILL}\n stroke={stroke}\n strokeWidth={INDICATOR_STROKE}\n opacity={hd.type === \"virtual\" ? 0.6 : 1}\n />,\n )\n }\n } else {\n const [x0, y0] = toScreen(bounds.x, bounds.y)\n const [x1, y1] = toScreen(bounds.maxX, bounds.maxY)\n items.push(<rect key=\"bounds\" x={x0} y={y0} width={x1 - x0} height={y1 - y0} fill=\"none\" stroke={stroke} strokeWidth={INDICATOR_STROKE} />)\n }\n if (info) {\n for (const h of info.handles) {\n if (h.handle === \"rotate\") {\n items.push(<circle key=\"rotate\" cx={h.point.x} cy={h.point.y} r={HANDLE.rotate} fill={HANDLE_FILL} stroke={stroke} strokeWidth={INDICATOR_STROKE} />)\n } else if (h.handle.includes(\"_\")) {\n items.push(\n <rect\n key={h.handle}\n x={h.point.x - HANDLE.corner / 2}\n y={h.point.y - HANDLE.corner / 2}\n width={HANDLE.corner}\n height={HANDLE.corner}\n rx={2}\n fill={HANDLE_FILL}\n stroke={stroke}\n strokeWidth={INDICATOR_STROKE}\n />,\n )\n }\n }\n }\n }\n return <>{items}</>\n})\n\nconst SnapLines = track(function SnapLines({ editor }: { editor: Editor }) {\n const lines = editor.snaps.getLines()\n if (lines.length === 0) return null\n return (\n <>\n {lines.map((l) => {\n const pts = l.points.map((p) => editor.pageToScreen(p))\n return (\n <g key={l.id}>\n <polyline points={pts.map((p) => `${p.x},${p.y}`).join(\" \")} fill=\"none\" stroke={SNAP} strokeWidth={INDICATOR_STROKE} />\n {pts.map((p, i) => (\n <line key={i} x1={p.x - 4} y1={p.y - 4} x2={p.x + 4} y2={p.y + 4} stroke={SNAP} strokeWidth={INDICATOR_STROKE} />\n ))}\n {pts.map((p, i) => (\n <line key={`b${i}`} x1={p.x - 4} y1={p.y + 4} x2={p.x + 4} y2={p.y - 4} stroke={SNAP} strokeWidth={INDICATOR_STROKE} />\n ))}\n </g>\n )\n })}\n </>\n )\n})\n\nconst DefaultBrush = track(function DefaultBrush({ editor }: { editor: Editor }) {\n const brush = editor.getInstanceState().brush\n if (!brush) return null\n const cam = editor.getCamera()\n const x = (brush.x + cam.x) * cam.z\n const y = (brush.y + cam.y) * cam.z\n return (\n <rect\n x={x}\n y={y}\n width={brush.w * cam.z}\n height={brush.h * cam.z}\n fill={BRUSH_FILL}\n stroke={SELECTION}\n strokeWidth={INDICATOR_STROKE}\n />\n )\n})\n\n/** Re-render on a signal value; convenience re-export for shape components. */\nexport { useValue }\n"]}