@neta-art/cohub 5.8.2 → 5.10.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.
Files changed (39) hide show
  1. package/dist/board/animation.js +34 -5
  2. package/dist/board/codec.js +1 -1
  3. package/dist/board/export/index.d.ts +6 -0
  4. package/dist/board/export/index.js +6 -3
  5. package/dist/board/export/scene.d.ts +6 -0
  6. package/dist/board/export/scene.js +26 -2
  7. package/dist/board/geometry.d.ts +27 -1
  8. package/dist/board/geometry.js +92 -1
  9. package/dist/board/headless/index.d.ts +7 -1
  10. package/dist/board/headless/index.js +6 -2
  11. package/dist/board/index.d.ts +6 -4
  12. package/dist/board/index.js +7 -5
  13. package/dist/board/mutation.d.ts +21 -0
  14. package/dist/board/mutation.js +104 -0
  15. package/dist/board/render/css-color.d.ts +4 -0
  16. package/dist/board/render/css-color.js +36 -0
  17. package/dist/board/render/index.d.ts +2 -1
  18. package/dist/board/render/index.js +2 -1
  19. package/dist/board/render/renderers/base-card-renderer.js +3 -20
  20. package/dist/board/render/themes/clean-theme.js +6 -3
  21. package/dist/chunks/http.d.ts +16 -4
  22. package/dist/chunks/http.js +180 -16
  23. package/dist/chunks/websocket.d.ts +74 -4
  24. package/dist/http.d.ts +3 -3
  25. package/dist/index.d.ts +3 -3
  26. package/dist/index.js +33 -6
  27. package/dist/protocol/dist/board-constants.d.ts +2 -1
  28. package/dist/protocol/dist/board-constants.js +61 -6
  29. package/dist/protocol/dist/board-document.d.ts +28 -2
  30. package/dist/protocol/dist/board-document.js +16 -3
  31. package/dist/protocol/dist/board-node.d.ts +2 -1
  32. package/dist/protocol/dist/board-url.d.ts +2 -1
  33. package/dist/protocol/dist/board-url.js +8 -3
  34. package/dist/protocol/dist/board.d.ts +136 -4
  35. package/dist/protocol/dist/board.js +42 -1
  36. package/dist/protocol/dist/index.d.ts +3 -3
  37. package/dist/protocol/dist/index.js +2 -2
  38. package/dist/types.d.ts +2 -2
  39. package/package.json +1 -1
@@ -1,4 +1,6 @@
1
1
  import { BOARD_BUILTIN_CAPABILITIES, DEFAULT_BOARD_RENDER_LIMITS } from "../protocol/dist/board-constants.js";
2
+ import { BoardCameraFocusParamsSchema } from "../protocol/dist/board.js";
3
+ import "../protocol/dist/index.js";
2
4
  //#region src/board/animation.ts
3
5
  const ZERO_COST = {
4
6
  particles: 0,
@@ -34,8 +36,9 @@ function builtinDefinition(capability) {
34
36
  if (!bounds || typeof bounds !== "object" || Array.isArray(bounds)) diagnostics.push({
35
37
  severity: "error",
36
38
  code: "PARTICLE_BOUNDS_REQUIRED",
37
- message: "particles require finite bounds",
38
- path: "params.bounds"
39
+ message: "particles require finite world bounds",
40
+ path: "params.bounds",
41
+ coordinateSpace: "world"
39
42
  });
40
43
  else {
41
44
  const value = bounds;
@@ -48,7 +51,8 @@ function builtinDefinition(capability) {
48
51
  severity: "error",
49
52
  code: "INVALID_PARTICLE_BOUNDS",
50
53
  message: "particle bounds must have a positive finite size",
51
- path: "params.bounds"
54
+ path: "params.bounds",
55
+ coordinateSpace: "world"
52
56
  });
53
57
  }
54
58
  }
@@ -57,8 +61,19 @@ function builtinDefinition(capability) {
57
61
  if (!Array.isArray(points) || points.length < 2 || points.length > 1e4) diagnostics.push({
58
62
  severity: "error",
59
63
  code: "INVALID_MOTION_PATH",
60
- message: "motion path must contain 2 to 10000 points",
61
- path: "params.points"
64
+ message: "motion path must contain 2 to 10000 world-offset points",
65
+ path: "params.points",
66
+ coordinateSpace: "world-offset"
67
+ });
68
+ }
69
+ if (capability.id === "camera.focus") {
70
+ const parsed = BoardCameraFocusParamsSchema.safeParse(params);
71
+ if (!parsed.success) diagnostics.push({
72
+ severity: "error",
73
+ code: "INVALID_CAMERA_FOCUS",
74
+ message: parsed.error.issues[0]?.message ?? "invalid camera focus",
75
+ path: "params",
76
+ coordinateSpace: "world"
62
77
  });
63
78
  }
64
79
  return diagnostics;
@@ -322,6 +337,20 @@ var BoardExtensionRegistry = class {
322
337
  cost
323
338
  });
324
339
  }
340
+ const cameraFocusClips = input.clips.map((clip, index) => ({
341
+ clip,
342
+ index
343
+ })).filter(({ clip }) => clip.kind === "camera.focus").sort((left, right) => left.clip.start - right.clip.start);
344
+ for (let index = 1; index < cameraFocusClips.length; index += 1) {
345
+ const previous = cameraFocusClips[index - 1];
346
+ const currentFocus = cameraFocusClips[index];
347
+ if (previous && currentFocus && currentFocus.clip.start < previous.clip.start + previous.clip.duration) diagnostics.push({
348
+ severity: "error",
349
+ code: "OVERLAPPING_CAMERA_FOCUS",
350
+ message: "camera.focus clips must not overlap",
351
+ path: `clips.${currentFocus.index}.start`
352
+ });
353
+ }
325
354
  events.sort((left, right) => left.at - right.at || left.direction - right.direction);
326
355
  const current = { ...persistentCost };
327
356
  const peak = { ...persistentCost };
@@ -1,7 +1,7 @@
1
1
  import { BOARD_DOCUMENT_KIND, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest } from "../protocol/dist/board.js";
2
2
  import { BoardAppearanceSchema, BoardFileSnapshotSchema, BoardTaskSnapshotSchema, UNKNOWN_BOARD_ITEM_TYPE, parseBoardDocument } from "../protocol/dist/board-document.js";
3
- import { TEXT_FONT_SIZE, clampBoardTextFontSize } from "./core/text-metrics.js";
4
3
  import "../protocol/dist/index.js";
4
+ import { TEXT_FONT_SIZE, clampBoardTextFontSize } from "./core/text-metrics.js";
5
5
  //#region src/board/codec.ts
6
6
  const DEFAULT_BOARD_APPEARANCE = BoardAppearanceSchema.parse({
7
7
  theme: "clean",
@@ -23,6 +23,12 @@ type BoardExportOptions = {
23
23
  textures?: Map<string, Texture>;
24
24
  /** Preview-key strategy supplied by the host; defaults to still images only. */
25
25
  assetKey?: (item: BoardItem) => string | null;
26
+ backgroundImage?: {
27
+ texture: Texture;
28
+ fit: "cover" | "contain" | "repeat";
29
+ position: "center" | "top" | "bottom" | "left" | "right";
30
+ opacity: number;
31
+ };
26
32
  maxEdge?: number;
27
33
  maxPixels?: number;
28
34
  };
@@ -1,12 +1,14 @@
1
1
  import { normalizeBoardDocument, planBoardExport } from "../core/export-plan.js";
2
+ import { parseBoardCssColor } from "../render/css-color.js";
2
3
  import { defaultBoardPalette } from "../render/palette.js";
3
4
  import { createBoardExportScene } from "./scene.js";
4
5
  import { Rectangle } from "pixi.js";
5
6
  //#region src/board/export/index.ts
6
- function resolveBackground(background, palette) {
7
+ function resolveBackground(background, palette, document) {
7
8
  if (background === "transparent") return null;
8
9
  if (typeof background === "number") return background;
9
- return palette.bg;
10
+ const declared = document.appearance.background.color;
11
+ return declared ? parseBoardCssColor(declared) ?? palette.bg : palette.bg;
10
12
  }
11
13
  /**
12
14
  * Capture a board region as a canvas.
@@ -42,7 +44,8 @@ function renderBoardExport(renderer, input, options = {}) {
42
44
  colors: options.colors,
43
45
  textures: options.textures,
44
46
  assetKey: options.assetKey,
45
- background: resolveBackground(options.background, palette)
47
+ background: resolveBackground(options.background, palette, document),
48
+ backgroundImage: options.backgroundImage
46
49
  });
47
50
  try {
48
51
  const canvas = renderer.extract.canvas({
@@ -25,6 +25,12 @@ type BoardExportSceneInput = {
25
25
  assetKey?: (item: BoardItem) => string | null;
26
26
  /** Opaque paper behind the content, or null for transparency. */
27
27
  background?: number | null;
28
+ backgroundImage?: {
29
+ texture: Texture;
30
+ fit: "cover" | "contain" | "repeat";
31
+ position: "center" | "top" | "bottom" | "left" | "right";
32
+ opacity: number;
33
+ };
28
34
  };
29
35
  type BoardExportScene = {
30
36
  /** Root to hand to the renderer; already positioned and scaled. */
@@ -3,7 +3,7 @@ import { buildFallbackShapeColors } from "../core/palette.js";
3
3
  import { createConnectionLayer } from "../render/connection-layer.js";
4
4
  import { defaultBoardPalette } from "../render/palette.js";
5
5
  import { getBoardCardRenderer } from "../render/renderers/board-renderer-registry.js";
6
- import { Container, Graphics } from "pixi.js";
6
+ import { Container, Graphics, Sprite, TilingSprite } from "pixi.js";
7
7
  //#region src/board/export/scene.ts
8
8
  /**
9
9
  * Render context for an export.
@@ -45,10 +45,34 @@ function buildContext(input) {
45
45
  function createBoardExportScene(input) {
46
46
  const { context, missing } = buildContext(input);
47
47
  const root = new Container({ label: "board-export-root" });
48
- if (input.background != null) root.addChild(new Graphics().rect(0, 0, input.world.width * input.scale, input.world.height * input.scale).fill({
48
+ const outputWidth = input.world.width * input.scale;
49
+ const outputHeight = input.world.height * input.scale;
50
+ if (input.background != null) root.addChild(new Graphics().rect(0, 0, outputWidth, outputHeight).fill({
49
51
  color: input.background,
50
52
  alpha: 1
51
53
  }));
54
+ if (input.backgroundImage) {
55
+ const { texture, fit, position, opacity } = input.backgroundImage;
56
+ if (fit === "repeat") root.addChild(new TilingSprite({
57
+ texture,
58
+ width: outputWidth,
59
+ height: outputHeight,
60
+ alpha: opacity
61
+ }));
62
+ else {
63
+ const sprite = new Sprite({
64
+ texture,
65
+ alpha: opacity
66
+ });
67
+ const scale = fit === "cover" ? Math.max(outputWidth / texture.width, outputHeight / texture.height) : Math.min(outputWidth / texture.width, outputHeight / texture.height);
68
+ sprite.width = texture.width * scale;
69
+ sprite.height = texture.height * scale;
70
+ const x = position === "left" ? 0 : position === "right" ? outputWidth - sprite.width : (outputWidth - sprite.width) / 2;
71
+ const y = position === "top" ? 0 : position === "bottom" ? outputHeight - sprite.height : (outputHeight - sprite.height) / 2;
72
+ sprite.position.set(x, y);
73
+ root.addChild(sprite);
74
+ }
75
+ }
52
76
  const world = new Container({
53
77
  isRenderGroup: true,
54
78
  label: "board-export-world"
@@ -1,3 +1,5 @@
1
+ import { BoardCameraFocus, BoardCameraFocusParams, BoardCameraState } from "../protocol/dist/board.js";
2
+ import "../protocol/dist/index.js";
1
3
  import { BoardFrame, BoardViewport } from "../protocol/dist/board-document.js";
2
4
  //#region src/board/geometry.d.ts
3
5
  type Point = {
@@ -27,8 +29,27 @@ type WorldPoint = {
27
29
  y: number;
28
30
  readonly [coordBrand]: "world";
29
31
  };
32
+ type BoardScreenPoint = ScreenPoint;
33
+ type BoardWorldPoint = WorldPoint;
34
+ declare const coordinateKindBrand: unique symbol;
35
+ type BoardWorldOffset = Point & {
36
+ readonly [coordinateKindBrand]: "world-offset";
37
+ };
38
+ type BoardScreenOffset = Point & {
39
+ readonly [coordinateKindBrand]: "screen-offset";
40
+ };
41
+ type BoardNormalizedPoint = Point & {
42
+ readonly [coordinateKindBrand]: "normalized";
43
+ };
44
+ type BoardWorldRect = Rect & {
45
+ readonly [coordinateKindBrand]: "world-rect";
46
+ };
30
47
  declare function screenPoint(x: number, y: number): ScreenPoint;
31
48
  declare function worldPoint(x: number, y: number): WorldPoint;
49
+ declare function worldOffset(x: number, y: number): BoardWorldOffset;
50
+ declare function screenOffset(x: number, y: number): BoardScreenOffset;
51
+ declare function normalizedPoint(x: number, y: number): BoardNormalizedPoint;
52
+ declare function worldRect(x: number, y: number, width: number, height: number): BoardWorldRect;
32
53
  declare const MIN_BOARD_ZOOM = 0.05;
33
54
  declare const MAX_BOARD_ZOOM = 8;
34
55
  /** Smallest an item can be resized to, in world units. */
@@ -52,6 +73,7 @@ declare function rectCenter(rect: Rect): WorldPoint;
52
73
  declare function rectsIntersect(a: Rect, b: Rect): boolean;
53
74
  declare function rectContainsPoint(rect: Rect, point: Point, tolerance?: number): boolean;
54
75
  declare function expandRect(rect: Rect, amount: number): Rect;
76
+ declare function pointsBounds(points: readonly Point[], minSize?: number): Rect | null;
55
77
  declare function unionRects(rects: Rect[]): Rect | null;
56
78
  declare function rotatePointAround<P extends Point>(point: P, center: Point, angleRad: number): P;
57
79
  /** Axis-aligned bounding box of a (possibly rotated) frame. */
@@ -131,9 +153,13 @@ declare function screenToWorld(clientX: number, clientY: number, rect: DOMRect,
131
153
  /** Zoom while keeping a surface-relative screen point fixed under the cursor. */
132
154
  declare function zoomAround(viewport: BoardViewport, anchor: ScreenPoint, nextZoom: number): BoardViewport;
133
155
  declare function panBy(viewport: BoardViewport, dx: number, dy: number): BoardViewport;
156
+ declare function cameraForState(state: BoardCameraState, surface: Size): BoardViewport;
157
+ declare function cameraForRect(content: Rect, surface: Size, options?: Pick<BoardCameraFocusParams, "fit" | "padding" | "minZoom" | "maxZoom">): BoardViewport;
158
+ declare function rectForCameraFocus(focus: BoardCameraFocus, getFrame: (id: string) => BoardFrame | null | undefined): Rect | null;
159
+ declare function cameraForFocus(params: BoardCameraFocusParams, getFrame: (id: string) => BoardFrame | null | undefined, surface: Size): BoardViewport | null;
134
160
  /** Compute a viewport that frames the given world rect within the surface. */
135
161
  declare function fitToContent(content: Rect, surface: Size, padding?: number): BoardViewport;
136
162
  /** World-space rectangle currently visible in the board stage. */
137
163
  declare function visibleWorldRect(viewport: BoardViewport, surfaceWidth: number, surfaceHeight: number): Rect;
138
164
  //#endregion
139
- export { CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, CornerResizeHandle, EDGE_RESIZE_HANDLES, FIT_PADDING, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, Point, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, Rect, ResizeHandle, ScreenPoint, Size, VIEWPORT_MARGIN_RATIO, WorldPoint, angleFromCenter, clamp, clampZoom, degToRad, expandRect, fitToContent, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, handlePosition, itemBounds, normalizeRotation, normalizeViewport, panBy, pointToWorld, radToDeg, rectCenter, rectContainsPoint, rectsIntersect, resizeFrame, resizeFrameToSize, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, scaleFrames, screenPoint, screenToWorld, selectionBounds, unionRects, visibleWorldRect, worldPoint, worldToScreen, zoomAround };
165
+ export { BoardNormalizedPoint, BoardScreenOffset, BoardScreenPoint, BoardWorldOffset, BoardWorldPoint, BoardWorldRect, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, CornerResizeHandle, EDGE_RESIZE_HANDLES, FIT_PADDING, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, Point, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, Rect, ResizeHandle, ScreenPoint, Size, VIEWPORT_MARGIN_RATIO, WorldPoint, angleFromCenter, cameraForFocus, cameraForRect, cameraForState, clamp, clampZoom, degToRad, expandRect, fitToContent, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, handlePosition, itemBounds, normalizeRotation, normalizeViewport, normalizedPoint, panBy, pointToWorld, pointsBounds, radToDeg, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, resizeFrame, resizeFrameToSize, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, scaleFrames, screenOffset, screenPoint, screenToWorld, selectionBounds, unionRects, visibleWorldRect, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround };
@@ -11,6 +11,32 @@ function worldPoint(x, y) {
11
11
  y
12
12
  };
13
13
  }
14
+ function worldOffset(x, y) {
15
+ return {
16
+ x,
17
+ y
18
+ };
19
+ }
20
+ function screenOffset(x, y) {
21
+ return {
22
+ x,
23
+ y
24
+ };
25
+ }
26
+ function normalizedPoint(x, y) {
27
+ return {
28
+ x: clamp(x, 0, 1),
29
+ y: clamp(y, 0, 1)
30
+ };
31
+ }
32
+ function worldRect(x, y, width, height) {
33
+ return {
34
+ x,
35
+ y,
36
+ width,
37
+ height
38
+ };
39
+ }
14
40
  const MIN_BOARD_ZOOM = .05;
15
41
  const MAX_BOARD_ZOOM = 8;
16
42
  const DEFAULT_BOARD_VIEWPORT = {
@@ -77,6 +103,25 @@ function expandRect(rect, amount) {
77
103
  height: rect.height + amount * 2
78
104
  };
79
105
  }
106
+ function pointsBounds(points, minSize = 0) {
107
+ if (points.length === 0) return null;
108
+ let minX = Number.POSITIVE_INFINITY;
109
+ let minY = Number.POSITIVE_INFINITY;
110
+ let maxX = Number.NEGATIVE_INFINITY;
111
+ let maxY = Number.NEGATIVE_INFINITY;
112
+ for (const point of points) {
113
+ minX = Math.min(minX, point.x);
114
+ minY = Math.min(minY, point.y);
115
+ maxX = Math.max(maxX, point.x);
116
+ maxY = Math.max(maxY, point.y);
117
+ }
118
+ return {
119
+ x: minX,
120
+ y: minY,
121
+ width: Math.max(minSize, maxX - minX),
122
+ height: Math.max(minSize, maxY - minY)
123
+ };
124
+ }
80
125
  function unionRects(rects) {
81
126
  if (rects.length === 0) return null;
82
127
  let minX = Number.POSITIVE_INFINITY;
@@ -465,6 +510,52 @@ function panBy(viewport, dx, dy) {
465
510
  y: viewport.y + dy
466
511
  };
467
512
  }
513
+ function cameraForState(state, surface) {
514
+ const zoom = clampZoom(state.zoom);
515
+ return normalizeViewport({
516
+ x: surface.width / 2 - state.centerX * zoom,
517
+ y: surface.height / 2 - state.centerY * zoom,
518
+ zoom
519
+ });
520
+ }
521
+ function cameraForRect(content, surface, options = {
522
+ fit: "contain",
523
+ padding: 32
524
+ }) {
525
+ const padding = Math.max(0, Number.isFinite(options.padding) ? options.padding : 32);
526
+ const availableW = Math.max(1, surface.width - padding * 2);
527
+ const availableH = Math.max(1, surface.height - padding * 2);
528
+ const fitZoom = options.fit === "cover" ? Math.max(availableW / content.width, availableH / content.height) : Math.min(availableW / content.width, availableH / content.height);
529
+ const minZoom = clampZoom(options.minZoom ?? .05);
530
+ const maxZoom = clampZoom(options.maxZoom ?? 8);
531
+ const zoom = Math.min(Math.max(fitZoom, Math.min(minZoom, maxZoom)), Math.max(minZoom, maxZoom));
532
+ const center = rectCenter(content);
533
+ return cameraForState({
534
+ centerX: center.x,
535
+ centerY: center.y,
536
+ zoom
537
+ }, surface);
538
+ }
539
+ function rectForCameraFocus(focus, getFrame) {
540
+ if (focus.type === "rect") return focus.rect;
541
+ if (focus.type === "node") {
542
+ const frame = getFrame(focus.nodeId);
543
+ return frame ? itemBounds(frame) : null;
544
+ }
545
+ if (focus.type === "frame") {
546
+ const frame = getFrame(focus.frameId);
547
+ return frame ? itemBounds(frame) : null;
548
+ }
549
+ const frames = focus.nodeIds.flatMap((id) => {
550
+ const frame = getFrame(id);
551
+ return frame ? [frame] : [];
552
+ });
553
+ return frames.length === focus.nodeIds.length ? selectionBounds(frames) : null;
554
+ }
555
+ function cameraForFocus(params, getFrame, surface) {
556
+ const rect = rectForCameraFocus(params.focus, getFrame);
557
+ return rect ? cameraForRect(rect, surface, params) : null;
558
+ }
468
559
  /** Compute a viewport that frames the given world rect within the surface. */
469
560
  function fitToContent(content, surface, padding = 64) {
470
561
  const availableW = Math.max(1, surface.width - padding * 2);
@@ -489,4 +580,4 @@ function visibleWorldRect(viewport, surfaceWidth, surfaceHeight) {
489
580
  };
490
581
  }
491
582
  //#endregion
492
- export { CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, EDGE_RESIZE_HANDLES, FIT_PADDING, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, VIEWPORT_MARGIN_RATIO, angleFromCenter, clamp, clampZoom, degToRad, expandRect, fitToContent, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, handlePosition, itemBounds, normalizeRotation, normalizeViewport, panBy, pointToWorld, radToDeg, rectCenter, rectContainsPoint, rectsIntersect, resizeFrame, resizeFrameToSize, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, scaleFrames, screenPoint, screenToWorld, selectionBounds, unionRects, visibleWorldRect, worldPoint, worldToScreen, zoomAround };
583
+ export { CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, EDGE_RESIZE_HANDLES, FIT_PADDING, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, VIEWPORT_MARGIN_RATIO, angleFromCenter, cameraForFocus, cameraForRect, cameraForState, clamp, clampZoom, degToRad, expandRect, fitToContent, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, handlePosition, itemBounds, normalizeRotation, normalizeViewport, normalizedPoint, panBy, pointToWorld, pointsBounds, radToDeg, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, resizeFrame, resizeFrameToSize, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, scaleFrames, screenOffset, screenPoint, screenToWorld, selectionBounds, unionRects, visibleWorldRect, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround };
@@ -51,9 +51,15 @@ type BoardHeadlessRenderer = {
51
51
  */
52
52
  declare function createBoardHeadlessRenderer(options?: BoardHeadlessRendererOptions): Promise<BoardHeadlessRenderer>;
53
53
  type BoardHeadlessExportFormat = "png" | "jpeg" | "webp";
54
- type BoardHeadlessExportOptions = Omit<BoardExportOptions, "textures"> & {
54
+ type BoardHeadlessExportOptions = Omit<BoardExportOptions, "textures" | "backgroundImage"> & {
55
55
  /** Textures from `decodeImage`, keyed by image key. */
56
56
  textures?: Map<string, BoardHeadlessTexture>;
57
+ backgroundImage?: {
58
+ texture: BoardHeadlessTexture;
59
+ fit: "cover" | "contain" | "repeat";
60
+ position: "center" | "top" | "bottom" | "left" | "right";
61
+ opacity: number;
62
+ };
57
63
  format?: BoardHeadlessExportFormat;
58
64
  /** JPEG/WebP quality, 0–1. Ignored for PNG. */
59
65
  quality?: number;
@@ -131,10 +131,14 @@ function boardHeadlessMimeType(format) {
131
131
  }
132
132
  /** Render a document to encoded image bytes. Returns null for an empty region. */
133
133
  function exportBoardImageBytes(headless, document, options = {}) {
134
- const { format = "png", quality = .92, textures, ...rest } = options;
134
+ const { format = "png", quality = .92, textures, backgroundImage, ...rest } = options;
135
135
  const result = renderBoardExport(headless.renderer, document, {
136
136
  ...rest,
137
- ...textures ? { textures } : {}
137
+ ...textures ? { textures } : {},
138
+ ...backgroundImage ? { backgroundImage: {
139
+ ...backgroundImage,
140
+ texture: backgroundImage.texture
141
+ } } : {}
138
142
  });
139
143
  if (!result) return null;
140
144
  const canvas = result.canvas;
@@ -1,12 +1,13 @@
1
1
  import { BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, clampBoardStrokeSize } from "../protocol/dist/board-constants.js";
2
2
  import { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNECTION_LINES, BOARD_CONNECTION_ROUTINGS, BOARD_CONNECTION_SIDES, BoardConnection, BoardConnectionAnchor, BoardConnectionAnchorSchema, BoardConnectionDirection, BoardConnectionEndpoint, BoardConnectionEndpointSchema, BoardConnectionInput, BoardConnectionLine, BoardConnectionPatch, BoardConnectionPatchSchema, BoardConnectionRecord, BoardConnectionRouting, BoardConnectionRoutingConfig, BoardConnectionRoutingSchema, BoardConnectionSchema, BoardConnectionSide, BoardConnectionStyle, BoardConnectionStyleSchema, BoardConnectionWaypointSchema, BoardRelationSchema, DEFAULT_BOARD_CONNECTION_ROUTING, DEFAULT_BOARD_CONNECTION_STYLE, DEFAULT_BOARD_RELATION, connectionNodeIds, connectionOtherNodeId, connectionTouchesNode, createBoardConnection, flipBoardConnection, normalizeBoardConnectionStyle } from "../protocol/dist/board-connection.js";
3
3
  import { BoardColorId } from "../protocol/dist/board-node.js";
4
- import { BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BoardManifest, BoardNodeRecord, BoardRecord, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest } from "../protocol/dist/board.js";
4
+ import { BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BoardCameraFocus, BoardCameraFocusParams, BoardCameraFocusParamsSchema, BoardCameraFocusSchema, BoardCameraState, BoardCameraStateSchema, BoardManifest, BoardNodeRecord, BoardRecord, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest } from "../protocol/dist/board.js";
5
+ import "../protocol/dist/index.js";
5
6
  import { BoardExtensionDefinition, BoardExtensionRegistry, BoardPresetDefinition, CompiledSequence, DEFAULT_BOARD_LIMITS, QualityProfile, RenderBounds, TimelineClipInput, TimelineInput, clip, compileSequence, createBoardExtensionRegistry, timeline } from "./animation.js";
6
- import { BOARD_REMOTE_URL_MAX_LENGTH, BoardRemoteUrlSchema, normalizeBoardRemoteUrl } from "../protocol/dist/board-url.js";
7
+ import { BOARD_REMOTE_URL_MAX_LENGTH, BoardRemoteUrlSchema, isPublicBoardRemoteAddress, normalizeBoardRemoteUrl } from "../protocol/dist/board-url.js";
7
8
  import { BOARD_TASK_ARTIFACT_LIMIT, BoardAppearance, BoardAppearanceSchema, BoardArrowItem, BoardArrowItemSchema, BoardAudioItem, BoardAudioItemSchema, BoardDocument, BoardDocumentSchema, BoardDrawItem, BoardDrawItemSchema, BoardFileItem, BoardFileItemSchema, BoardFileSnapshot, BoardFileSnapshotSchema, BoardFrame, BoardFrameItem, BoardFrameItemSchema, BoardFrameSchema, BoardGeoItem, BoardGeoItemSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemSchema, BoardItemStyle, BoardItemStyleSchema, BoardKnownItem, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardPoint, BoardPointSchema, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardUnknownItem, BoardVideoItem, BoardVideoItemSchema, BoardViewport, BoardViewportSchema, DrawPoint, DrawPointSchema, KNOWN_BOARD_ITEM_TYPES, KnownBoardItemType, SpaceFileRef, SpaceFileRefSchema, UNKNOWN_BOARD_ITEM_TYPE, isFileBackedItem, isMediaItem, isUnknownItem, parseBoardDocument, parseBoardItemLoose, unknownRealType, withResolvedConnections } from "../protocol/dist/board-document.js";
8
9
  import { BOARD_NODE_SOURCE, DEFAULT_BOARD_APPEARANCE, ITEM_BASE_KEYS, WireBackedBoardItem, boardBootstrapToDocument, boardNodeToItem, isRecord, nodeInputFromRecord, sourceForItem } from "./codec.js";
9
- import { CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, CornerResizeHandle, EDGE_RESIZE_HANDLES, FIT_PADDING, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, Point, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, Rect, ResizeHandle, ScreenPoint, Size, VIEWPORT_MARGIN_RATIO, WorldPoint, angleFromCenter, clamp, clampZoom, degToRad, expandRect, fitToContent, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, handlePosition, itemBounds, normalizeRotation, normalizeViewport, panBy, pointToWorld, radToDeg, rectCenter, rectContainsPoint, rectsIntersect, resizeFrame, resizeFrameToSize, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, scaleFrames, screenPoint, screenToWorld, selectionBounds, unionRects, visibleWorldRect, worldPoint, worldToScreen, zoomAround } from "./geometry.js";
10
+ import { BoardNormalizedPoint, BoardScreenOffset, BoardScreenPoint, BoardWorldOffset, BoardWorldPoint, BoardWorldRect, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, CornerResizeHandle, EDGE_RESIZE_HANDLES, FIT_PADDING, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, Point, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, Rect, ResizeHandle, ScreenPoint, Size, VIEWPORT_MARGIN_RATIO, WorldPoint, angleFromCenter, cameraForFocus, cameraForRect, cameraForState, clamp, clampZoom, degToRad, expandRect, fitToContent, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, handlePosition, itemBounds, normalizeRotation, normalizeViewport, normalizedPoint, panBy, pointToWorld, pointsBounds, radToDeg, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, resizeFrame, resizeFrameToSize, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, scaleFrames, screenOffset, screenPoint, screenToWorld, selectionBounds, unionRects, visibleWorldRect, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround } from "./geometry.js";
10
11
  import { ResolvedArrow, arrowBounds, arrowFrame, distanceToArrow, resolveArrow, sampleArrow, translateArrow } from "./core/arrow-geometry.js";
11
12
  import { CONNECTION_ENDPOINT_GAP, ConnectionIndex, FrameLookup, ResolvedConnection, ResolvedConnectionEndpoint, anchorPointOnFrame, anchorToWorld, autoConnectionSide, connectionArrowheads, connectionBounds, connectionHitTest, createConnectionIndex, distanceToConnection, pathMidpoint, resolveConnection, worldToAnchor } from "./core/connections.js";
12
13
  import { buildStrokeOutline, computeDrawBounds, distanceToStroke, sampleRadius, simplifyDrawIndices } from "./core/draw-geometry.js";
@@ -21,6 +22,7 @@ import { BoardStyledToolId, BoardToolStyleMap, BoardToolStylePatch, DEFAULT_BOAR
21
22
  import { boardImageKeySource, imageAssetKey } from "./image-key.js";
22
23
  import { BoardMediaKind, getMediaExtension, getMediaResourceTitle, inferBoardMediaKind } from "./media.js";
23
24
  import { BoardAssetSource, BoardPlayableMedia, playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache } from "./media-playback.js";
25
+ import { boardAppearanceOperation, boardEffectDeleteOperation, boardEffectUpsertOperation, boardNodeCreateOperation, boardNodeDeleteOperations, boardNodePatchOperation, boardPlaybackPolicyOperation, boardSequenceDeleteOperation, boardSequenceUpsertOperation, boardTitleOperation, patchBoardAppearance } from "./mutation.js";
24
26
  import { BoardInputError, BoardNodeFrameInput, BoardNodeSpec, assertBoardNodes, assertBoardTransactionNodeCreates, createBoardNode, validateBoardNodes } from "./nodes.js";
25
27
  import { featuredTaskArtifact, rankedTaskArtifacts, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot } from "./task.js";
26
- export { AUTO_BOARD_CONNECTION_ANCHOR, type ArrowShapeProps, type AudioShapeProps, BOARD_COLORS, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNECTION_LINES, BOARD_CONNECTION_ROUTINGS, BOARD_CONNECTION_SIDES, BOARD_DOCUMENT_KIND, BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, BOARD_EXPORT_MAX_TEXTURES, BOARD_EXTENSION, BOARD_NODE_SOURCE, BOARD_REMOTE_URL_MAX_LENGTH, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BoardAppearance, BoardAppearanceSchema, BoardArrowItem, BoardArrowItemSchema, BoardAssetSource, BoardAudioItem, BoardAudioItemSchema, BoardColorEntry, type BoardColorId, BoardColorValue, BoardConnection, BoardConnectionAnchor, BoardConnectionAnchorSchema, BoardConnectionDirection, BoardConnectionEndpoint, BoardConnectionEndpointSchema, BoardConnectionInput, BoardConnectionLine, BoardConnectionPatch, BoardConnectionPatchSchema, BoardConnectionRecord, BoardConnectionRouting, BoardConnectionRoutingConfig, BoardConnectionRoutingSchema, BoardConnectionSchema, BoardConnectionSide, BoardConnectionStyle, BoardConnectionStyleSchema, BoardConnectionWaypointSchema, BoardDocument, BoardDocumentSchema, BoardDrawItem, BoardDrawItemSchema, BoardExportAssetSelection, BoardExportPlan, BoardExportPlanInput, BoardExportRegion, BoardExtensionDefinition, BoardExtensionRegistry, BoardFileItem, BoardFileItemSchema, BoardFileSnapshot, BoardFileSnapshotFacts, BoardFileSnapshotSchema, BoardFrame, BoardFrameItem, BoardFrameItemSchema, BoardFrameSchema, BoardGeoItem, BoardGeoItemSchema, BoardImageItem, BoardImageItemSchema, BoardInputError, BoardItem, BoardItemSchema, BoardItemStyle, BoardItemStyleSchema, BoardKnownItem, type BoardManifest, BoardMediaKind, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardNodeFrameInput, type BoardNodeRecord, BoardNodeSpec, BoardPlayableMedia, BoardPoint, BoardPointSchema, BoardPresetDefinition, type BoardRecord, BoardRelationSchema, BoardRemoteUrlSchema, BoardShapeColors, BoardStyledToolId, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardToolStyleMap, BoardToolStylePatch, BoardUnknownItem, BoardVideoItem, BoardVideoItemSchema, BoardViewport, BoardViewportSchema, BuildSnapshotInput, CONNECTION_ENDPOINT_GAP, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, CompiledSequence, ConnectionIndex, CornerResizeHandle, DEFAULT_BOARD_APPEARANCE, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_CONNECTION_ROUTING, DEFAULT_BOARD_CONNECTION_STYLE, DEFAULT_BOARD_LIMITS, DEFAULT_BOARD_RELATION, DEFAULT_BOARD_TOOL_STYLES, DrawPoint, DrawPointSchema, type DrawShapeProps, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, FileAvailability, FilePreviewKind, FrameLookup, GEO_KINDS, type GeoKind, type GeoShapeProps, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, type HandleDragResult, ITEM_BASE_KEYS, type ImageShapeProps, InvalidBoardFileError, KNOWN_BOARD_ITEM_TYPES, KnownBoardItemType, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, Point, QualityProfile, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, Rect, RenderBounds, ResizeHandle, ResolvedArrow, ResolvedConnection, ResolvedConnectionEndpoint, ResolvedCover, ScreenPoint, type ShapeCapabilities, ShapeDefinition, type ShapeGeometry, type ShapeHandle, type ShapeHandleId, type ShapeResizeMode, Size, SpaceFileRef, SpaceFileRefSchema, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, type TextShapeProps, TimelineClipInput, TimelineInput, UNKNOWN_BOARD_ITEM_TYPE, VIEWPORT_MARGIN_RATIO, type VideoShapeProps, WireBackedBoardItem, WorldPoint, anchorPointOnFrame, anchorToWorld, angleFromCenter, arrowBounds, arrowFrame, assertBoardNodes, assertBoardTransactionNodeCreates, autoConnectionSide, availabilityFromError, boardBootstrapToDocument, boardColorCssVar, boardFrameLookup, boardImageKeySource, boardNodeToItem, boardTextLineHeight, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, clamp, clampBoardStrokeSize, clampBoardTextFontSize, clampZoom, clip, compileSequence, computeDrawBounds, connectionArrowheads, connectionBounds, connectionHitTest, connectionNodeIds, connectionOtherNodeId, connectionTouchesNode, createBoardConnection, createBoardExtensionRegistry, createBoardNode, createBoardToolStyles, createConnectionIndex, definitionForItem, degToRad, distanceToArrow, distanceToConnection, distanceToStroke, expandRect, exportConnectionBounds, exportItemBounds, featuredTaskArtifact, fileBaseName, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileTypeLabel, fitToContent, flipBoardConnection, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, getShapeDefinition, handlePosition, imageAssetKey, inferBoardMediaKind, isBoardColorId, isBoardPath, isFileBackedItem, isFileSnapshotFresh, isGeoKind, isMediaItem, isRecord, isUnknownItem, itemBounds, measureBoardText, mergeFileSnapshot, nodeInputFromRecord, normalizeBoardConnectionStyle, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, panBy, parseBoardDocument, parseBoardItemLoose, parseBoardManifest, pathMidpoint, pickBoardColor, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectsIntersect, registerShapeDefinition, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resizeModeForCapabilities, resolveArrow, resolveBoardColor, resolveConnection, resolveCoverRef, resolveSpacePath, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleArrow, sampleRadius, scaleFrames, screenPoint, screenToWorld, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shapeBounds, shapeCapabilities, shapeHandles, shapeHitTest, shapeResizeMode, shouldFetchFileExcerpt, simplifyDrawIndices, sourceForItem, splitFrontmatter, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot, timeline, translateArrow, unionRects, unknownRealType, unknownShapeDefinition, validateBoardNodes, visibleWorldRect, withResolvedConnections, worldPoint, worldToAnchor, worldToScreen, zoomAround };
28
+ export { AUTO_BOARD_CONNECTION_ANCHOR, type ArrowShapeProps, type AudioShapeProps, BOARD_COLORS, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNECTION_LINES, BOARD_CONNECTION_ROUTINGS, BOARD_CONNECTION_SIDES, BOARD_DOCUMENT_KIND, BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, BOARD_EXPORT_MAX_TEXTURES, BOARD_EXTENSION, BOARD_NODE_SOURCE, BOARD_REMOTE_URL_MAX_LENGTH, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BoardAppearance, BoardAppearanceSchema, BoardArrowItem, BoardArrowItemSchema, BoardAssetSource, BoardAudioItem, BoardAudioItemSchema, type BoardCameraFocus, type BoardCameraFocusParams, BoardCameraFocusParamsSchema, BoardCameraFocusSchema, type BoardCameraState, BoardCameraStateSchema, BoardColorEntry, type BoardColorId, BoardColorValue, BoardConnection, BoardConnectionAnchor, BoardConnectionAnchorSchema, BoardConnectionDirection, BoardConnectionEndpoint, BoardConnectionEndpointSchema, BoardConnectionInput, BoardConnectionLine, BoardConnectionPatch, BoardConnectionPatchSchema, BoardConnectionRecord, BoardConnectionRouting, BoardConnectionRoutingConfig, BoardConnectionRoutingSchema, BoardConnectionSchema, BoardConnectionSide, BoardConnectionStyle, BoardConnectionStyleSchema, BoardConnectionWaypointSchema, BoardDocument, BoardDocumentSchema, BoardDrawItem, BoardDrawItemSchema, BoardExportAssetSelection, BoardExportPlan, BoardExportPlanInput, BoardExportRegion, BoardExtensionDefinition, BoardExtensionRegistry, BoardFileItem, BoardFileItemSchema, BoardFileSnapshot, BoardFileSnapshotFacts, BoardFileSnapshotSchema, BoardFrame, BoardFrameItem, BoardFrameItemSchema, BoardFrameSchema, BoardGeoItem, BoardGeoItemSchema, BoardImageItem, BoardImageItemSchema, BoardInputError, BoardItem, BoardItemSchema, BoardItemStyle, BoardItemStyleSchema, BoardKnownItem, type BoardManifest, BoardMediaKind, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardNodeFrameInput, type BoardNodeRecord, BoardNodeSpec, BoardNormalizedPoint, BoardPlayableMedia, BoardPoint, BoardPointSchema, BoardPresetDefinition, type BoardRecord, BoardRelationSchema, BoardRemoteUrlSchema, BoardScreenOffset, BoardScreenPoint, BoardShapeColors, BoardStyledToolId, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardToolStyleMap, BoardToolStylePatch, BoardUnknownItem, BoardVideoItem, BoardVideoItemSchema, BoardViewport, BoardViewportSchema, BoardWorldOffset, BoardWorldPoint, BoardWorldRect, BuildSnapshotInput, CONNECTION_ENDPOINT_GAP, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, CompiledSequence, ConnectionIndex, CornerResizeHandle, DEFAULT_BOARD_APPEARANCE, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_CONNECTION_ROUTING, DEFAULT_BOARD_CONNECTION_STYLE, DEFAULT_BOARD_LIMITS, DEFAULT_BOARD_RELATION, DEFAULT_BOARD_TOOL_STYLES, DrawPoint, DrawPointSchema, type DrawShapeProps, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, FileAvailability, FilePreviewKind, FrameLookup, GEO_KINDS, type GeoKind, type GeoShapeProps, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, type HandleDragResult, ITEM_BASE_KEYS, type ImageShapeProps, InvalidBoardFileError, KNOWN_BOARD_ITEM_TYPES, KnownBoardItemType, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, Point, QualityProfile, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, Rect, RenderBounds, ResizeHandle, ResolvedArrow, ResolvedConnection, ResolvedConnectionEndpoint, ResolvedCover, ScreenPoint, type ShapeCapabilities, ShapeDefinition, type ShapeGeometry, type ShapeHandle, type ShapeHandleId, type ShapeResizeMode, Size, SpaceFileRef, SpaceFileRefSchema, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, type TextShapeProps, TimelineClipInput, TimelineInput, UNKNOWN_BOARD_ITEM_TYPE, VIEWPORT_MARGIN_RATIO, type VideoShapeProps, WireBackedBoardItem, WorldPoint, anchorPointOnFrame, anchorToWorld, angleFromCenter, arrowBounds, arrowFrame, assertBoardNodes, assertBoardTransactionNodeCreates, autoConnectionSide, availabilityFromError, boardAppearanceOperation, boardBootstrapToDocument, boardColorCssVar, boardEffectDeleteOperation, boardEffectUpsertOperation, boardFrameLookup, boardImageKeySource, boardNodeCreateOperation, boardNodeDeleteOperations, boardNodePatchOperation, boardNodeToItem, boardPlaybackPolicyOperation, boardSequenceDeleteOperation, boardSequenceUpsertOperation, boardTextLineHeight, boardTitleOperation, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardStrokeSize, clampBoardTextFontSize, clampZoom, clip, compileSequence, computeDrawBounds, connectionArrowheads, connectionBounds, connectionHitTest, connectionNodeIds, connectionOtherNodeId, connectionTouchesNode, createBoardConnection, createBoardExtensionRegistry, createBoardNode, createBoardToolStyles, createConnectionIndex, definitionForItem, degToRad, distanceToArrow, distanceToConnection, distanceToStroke, expandRect, exportConnectionBounds, exportItemBounds, featuredTaskArtifact, fileBaseName, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileTypeLabel, fitToContent, flipBoardConnection, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, getShapeDefinition, handlePosition, imageAssetKey, inferBoardMediaKind, isBoardColorId, isBoardPath, isFileBackedItem, isFileSnapshotFresh, isGeoKind, isMediaItem, isPublicBoardRemoteAddress, isRecord, isUnknownItem, itemBounds, measureBoardText, mergeFileSnapshot, nodeInputFromRecord, normalizeBoardConnectionStyle, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, panBy, parseBoardDocument, parseBoardItemLoose, parseBoardManifest, patchBoardAppearance, pathMidpoint, pickBoardColor, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, registerShapeDefinition, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resizeModeForCapabilities, resolveArrow, resolveBoardColor, resolveConnection, resolveCoverRef, resolveSpacePath, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleArrow, sampleRadius, scaleFrames, screenOffset, screenPoint, screenToWorld, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shapeBounds, shapeCapabilities, shapeHandles, shapeHitTest, shapeResizeMode, shouldFetchFileExcerpt, simplifyDrawIndices, sourceForItem, splitFrontmatter, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot, timeline, translateArrow, unionRects, unknownRealType, unknownShapeDefinition, validateBoardNodes, visibleWorldRect, withResolvedConnections, worldOffset, worldPoint, worldRect, worldToAnchor, worldToScreen, zoomAround };
@@ -1,12 +1,13 @@
1
1
  import { BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, clampBoardStrokeSize } from "../protocol/dist/board-constants.js";
2
- import { BoardExtensionRegistry, DEFAULT_BOARD_LIMITS, clip, compileSequence, createBoardExtensionRegistry, timeline } from "./animation.js";
3
2
  import { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNECTION_LINES, BOARD_CONNECTION_ROUTINGS, BOARD_CONNECTION_SIDES, BoardConnectionAnchorSchema, BoardConnectionEndpointSchema, BoardConnectionPatchSchema, BoardConnectionRoutingSchema, BoardConnectionSchema, BoardConnectionStyleSchema, BoardConnectionWaypointSchema, BoardRelationSchema, DEFAULT_BOARD_CONNECTION_ROUTING, DEFAULT_BOARD_CONNECTION_STYLE, DEFAULT_BOARD_RELATION, connectionNodeIds, connectionOtherNodeId, connectionTouchesNode, createBoardConnection, flipBoardConnection, normalizeBoardConnectionStyle } from "../protocol/dist/board-connection.js";
4
- import { BOARD_DOCUMENT_KIND, BOARD_EXTENSION, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest } from "../protocol/dist/board.js";
5
- import { BOARD_REMOTE_URL_MAX_LENGTH, BoardRemoteUrlSchema, normalizeBoardRemoteUrl } from "../protocol/dist/board-url.js";
3
+ import { BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BoardCameraFocusParamsSchema, BoardCameraFocusSchema, BoardCameraStateSchema, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest } from "../protocol/dist/board.js";
4
+ import { BOARD_REMOTE_URL_MAX_LENGTH, BoardRemoteUrlSchema, isPublicBoardRemoteAddress, normalizeBoardRemoteUrl } from "../protocol/dist/board-url.js";
6
5
  import { BOARD_TASK_ARTIFACT_LIMIT, BoardAppearanceSchema, BoardArrowItemSchema, BoardAudioItemSchema, BoardDocumentSchema, BoardDrawItemSchema, BoardFileItemSchema, BoardFileSnapshotSchema, BoardFrameItemSchema, BoardFrameSchema, BoardGeoItemSchema, BoardImageItemSchema, BoardItemSchema, BoardItemStyleSchema, BoardMediaSnapshotSchema, BoardPointSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardVideoItemSchema, BoardViewportSchema, DrawPointSchema, KNOWN_BOARD_ITEM_TYPES, SpaceFileRefSchema, UNKNOWN_BOARD_ITEM_TYPE, isFileBackedItem, isMediaItem, isUnknownItem, parseBoardDocument, parseBoardItemLoose, unknownRealType, withResolvedConnections } from "../protocol/dist/board-document.js";
6
+ import "../protocol/dist/index.js";
7
+ import { BoardExtensionRegistry, DEFAULT_BOARD_LIMITS, clip, compileSequence, createBoardExtensionRegistry, timeline } from "./animation.js";
7
8
  import { TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, boardTextLineHeight, clampBoardTextFontSize, measureBoardText, setBoardTextMeasurer } from "./core/text-metrics.js";
8
9
  import { BOARD_NODE_SOURCE, DEFAULT_BOARD_APPEARANCE, ITEM_BASE_KEYS, boardBootstrapToDocument, boardNodeToItem, isRecord, nodeInputFromRecord, sourceForItem } from "./codec.js";
9
- import { CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, EDGE_RESIZE_HANDLES, FIT_PADDING, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, VIEWPORT_MARGIN_RATIO, angleFromCenter, clamp, clampZoom, degToRad, expandRect, fitToContent, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, handlePosition, itemBounds, normalizeRotation, normalizeViewport, panBy, pointToWorld, radToDeg, rectCenter, rectContainsPoint, rectsIntersect, resizeFrame, resizeFrameToSize, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, scaleFrames, screenPoint, screenToWorld, selectionBounds, unionRects, visibleWorldRect, worldPoint, worldToScreen, zoomAround } from "./geometry.js";
10
+ import { CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, EDGE_RESIZE_HANDLES, FIT_PADDING, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, VIEWPORT_MARGIN_RATIO, angleFromCenter, cameraForFocus, cameraForRect, cameraForState, clamp, clampZoom, degToRad, expandRect, fitToContent, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, handlePosition, itemBounds, normalizeRotation, normalizeViewport, normalizedPoint, panBy, pointToWorld, pointsBounds, radToDeg, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, resizeFrame, resizeFrameToSize, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, scaleFrames, screenOffset, screenPoint, screenToWorld, selectionBounds, unionRects, visibleWorldRect, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround } from "./geometry.js";
10
11
  import { featuredTaskArtifact, rankedTaskArtifacts, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot } from "./task.js";
11
12
  import { boardImageKeySource, imageAssetKey } from "./image-key.js";
12
13
  import { arrowBounds, arrowFrame, distanceToArrow, resolveArrow, sampleArrow, translateArrow } from "./core/arrow-geometry.js";
@@ -21,5 +22,6 @@ import { definitionForItem, getShapeDefinition, registerShapeDefinition, shapeBo
21
22
  import { DEFAULT_BOARD_TOOL_STYLES, createBoardToolStyles } from "./core/tool-styles.js";
22
23
  import { getMediaExtension, getMediaResourceTitle, inferBoardMediaKind } from "./media.js";
23
24
  import { playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache } from "./media-playback.js";
25
+ import { boardAppearanceOperation, boardEffectDeleteOperation, boardEffectUpsertOperation, boardNodeCreateOperation, boardNodeDeleteOperations, boardNodePatchOperation, boardPlaybackPolicyOperation, boardSequenceDeleteOperation, boardSequenceUpsertOperation, boardTitleOperation, patchBoardAppearance } from "./mutation.js";
24
26
  import { BoardInputError, assertBoardNodes, assertBoardTransactionNodeCreates, createBoardNode, validateBoardNodes } from "./nodes.js";
25
- export { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_COLORS, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNECTION_LINES, BOARD_CONNECTION_ROUTINGS, BOARD_CONNECTION_SIDES, BOARD_DOCUMENT_KIND, BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, BOARD_EXPORT_MAX_TEXTURES, BOARD_EXTENSION, BOARD_NODE_SOURCE, BOARD_REMOTE_URL_MAX_LENGTH, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BoardAppearanceSchema, BoardArrowItemSchema, BoardAudioItemSchema, BoardConnectionAnchorSchema, BoardConnectionEndpointSchema, BoardConnectionPatchSchema, BoardConnectionRoutingSchema, BoardConnectionSchema, BoardConnectionStyleSchema, BoardConnectionWaypointSchema, BoardDocumentSchema, BoardDrawItemSchema, BoardExtensionRegistry, BoardFileItemSchema, BoardFileSnapshotSchema, BoardFrameItemSchema, BoardFrameSchema, BoardGeoItemSchema, BoardImageItemSchema, BoardInputError, BoardItemSchema, BoardItemStyleSchema, BoardMediaSnapshotSchema, BoardPointSchema, BoardRelationSchema, BoardRemoteUrlSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardVideoItemSchema, BoardViewportSchema, CONNECTION_ENDPOINT_GAP, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, DEFAULT_BOARD_APPEARANCE, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_CONNECTION_ROUTING, DEFAULT_BOARD_CONNECTION_STYLE, DEFAULT_BOARD_LIMITS, DEFAULT_BOARD_RELATION, DEFAULT_BOARD_TOOL_STYLES, DrawPointSchema, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, GEO_KINDS, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, ITEM_BASE_KEYS, InvalidBoardFileError, KNOWN_BOARD_ITEM_TYPES, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, SpaceFileRefSchema, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, UNKNOWN_BOARD_ITEM_TYPE, VIEWPORT_MARGIN_RATIO, anchorPointOnFrame, anchorToWorld, angleFromCenter, arrowBounds, arrowFrame, assertBoardNodes, assertBoardTransactionNodeCreates, autoConnectionSide, availabilityFromError, boardBootstrapToDocument, boardColorCssVar, boardFrameLookup, boardImageKeySource, boardNodeToItem, boardTextLineHeight, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, clamp, clampBoardStrokeSize, clampBoardTextFontSize, clampZoom, clip, compileSequence, computeDrawBounds, connectionArrowheads, connectionBounds, connectionHitTest, connectionNodeIds, connectionOtherNodeId, connectionTouchesNode, createBoardConnection, createBoardExtensionRegistry, createBoardNode, createBoardToolStyles, createConnectionIndex, definitionForItem, degToRad, distanceToArrow, distanceToConnection, distanceToStroke, expandRect, exportConnectionBounds, exportItemBounds, featuredTaskArtifact, fileBaseName, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileTypeLabel, fitToContent, flipBoardConnection, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, getShapeDefinition, handlePosition, imageAssetKey, inferBoardMediaKind, isBoardColorId, isBoardPath, isFileBackedItem, isFileSnapshotFresh, isGeoKind, isMediaItem, isRecord, isUnknownItem, itemBounds, measureBoardText, mergeFileSnapshot, nodeInputFromRecord, normalizeBoardConnectionStyle, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, panBy, parseBoardDocument, parseBoardItemLoose, parseBoardManifest, pathMidpoint, pickBoardColor, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectsIntersect, registerShapeDefinition, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resizeModeForCapabilities, resolveArrow, resolveBoardColor, resolveConnection, resolveCoverRef, resolveSpacePath, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleArrow, sampleRadius, scaleFrames, screenPoint, screenToWorld, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shapeBounds, shapeCapabilities, shapeHandles, shapeHitTest, shapeResizeMode, shouldFetchFileExcerpt, simplifyDrawIndices, sourceForItem, splitFrontmatter, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot, timeline, translateArrow, unionRects, unknownRealType, unknownShapeDefinition, validateBoardNodes, visibleWorldRect, withResolvedConnections, worldPoint, worldToAnchor, worldToScreen, zoomAround };
27
+ export { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_COLORS, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNECTION_LINES, BOARD_CONNECTION_ROUTINGS, BOARD_CONNECTION_SIDES, BOARD_DOCUMENT_KIND, BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, BOARD_EXPORT_MAX_TEXTURES, BOARD_EXTENSION, BOARD_NODE_SOURCE, BOARD_REMOTE_URL_MAX_LENGTH, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BoardAppearanceSchema, BoardArrowItemSchema, BoardAudioItemSchema, BoardCameraFocusParamsSchema, BoardCameraFocusSchema, BoardCameraStateSchema, BoardConnectionAnchorSchema, BoardConnectionEndpointSchema, BoardConnectionPatchSchema, BoardConnectionRoutingSchema, BoardConnectionSchema, BoardConnectionStyleSchema, BoardConnectionWaypointSchema, BoardDocumentSchema, BoardDrawItemSchema, BoardExtensionRegistry, BoardFileItemSchema, BoardFileSnapshotSchema, BoardFrameItemSchema, BoardFrameSchema, BoardGeoItemSchema, BoardImageItemSchema, BoardInputError, BoardItemSchema, BoardItemStyleSchema, BoardMediaSnapshotSchema, BoardPointSchema, BoardRelationSchema, BoardRemoteUrlSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardVideoItemSchema, BoardViewportSchema, CONNECTION_ENDPOINT_GAP, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, DEFAULT_BOARD_APPEARANCE, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_CONNECTION_ROUTING, DEFAULT_BOARD_CONNECTION_STYLE, DEFAULT_BOARD_LIMITS, DEFAULT_BOARD_RELATION, DEFAULT_BOARD_TOOL_STYLES, DrawPointSchema, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, GEO_KINDS, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, ITEM_BASE_KEYS, InvalidBoardFileError, KNOWN_BOARD_ITEM_TYPES, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, SpaceFileRefSchema, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, UNKNOWN_BOARD_ITEM_TYPE, VIEWPORT_MARGIN_RATIO, anchorPointOnFrame, anchorToWorld, angleFromCenter, arrowBounds, arrowFrame, assertBoardNodes, assertBoardTransactionNodeCreates, autoConnectionSide, availabilityFromError, boardAppearanceOperation, boardBootstrapToDocument, boardColorCssVar, boardEffectDeleteOperation, boardEffectUpsertOperation, boardFrameLookup, boardImageKeySource, boardNodeCreateOperation, boardNodeDeleteOperations, boardNodePatchOperation, boardNodeToItem, boardPlaybackPolicyOperation, boardSequenceDeleteOperation, boardSequenceUpsertOperation, boardTextLineHeight, boardTitleOperation, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardStrokeSize, clampBoardTextFontSize, clampZoom, clip, compileSequence, computeDrawBounds, connectionArrowheads, connectionBounds, connectionHitTest, connectionNodeIds, connectionOtherNodeId, connectionTouchesNode, createBoardConnection, createBoardExtensionRegistry, createBoardNode, createBoardToolStyles, createConnectionIndex, definitionForItem, degToRad, distanceToArrow, distanceToConnection, distanceToStroke, expandRect, exportConnectionBounds, exportItemBounds, featuredTaskArtifact, fileBaseName, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileTypeLabel, fitToContent, flipBoardConnection, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, getShapeDefinition, handlePosition, imageAssetKey, inferBoardMediaKind, isBoardColorId, isBoardPath, isFileBackedItem, isFileSnapshotFresh, isGeoKind, isMediaItem, isPublicBoardRemoteAddress, isRecord, isUnknownItem, itemBounds, measureBoardText, mergeFileSnapshot, nodeInputFromRecord, normalizeBoardConnectionStyle, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, panBy, parseBoardDocument, parseBoardItemLoose, parseBoardManifest, patchBoardAppearance, pathMidpoint, pickBoardColor, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, registerShapeDefinition, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resizeModeForCapabilities, resolveArrow, resolveBoardColor, resolveConnection, resolveCoverRef, resolveSpacePath, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleArrow, sampleRadius, scaleFrames, screenOffset, screenPoint, screenToWorld, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shapeBounds, shapeCapabilities, shapeHandles, shapeHitTest, shapeResizeMode, shouldFetchFileExcerpt, simplifyDrawIndices, sourceForItem, splitFrontmatter, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot, timeline, translateArrow, unionRects, unknownRealType, unknownShapeDefinition, validateBoardNodes, visibleWorldRect, withResolvedConnections, worldOffset, worldPoint, worldRect, worldToAnchor, worldToScreen, zoomAround };
@@ -0,0 +1,21 @@
1
+ import { BoardConnection } from "../protocol/dist/board-connection.js";
2
+ import { BoardClip, BoardEffect, BoardNodeInput, BoardOperation, BoardPlaybackPolicy, BoardSequence } from "../protocol/dist/board.js";
3
+ import "../protocol/dist/index.js";
4
+ import { BoardAppearance } from "../protocol/dist/board-document.js";
5
+ //#region src/board/mutation.d.ts
6
+ declare function patchBoardAppearance(current: BoardAppearance, patch: Partial<BoardAppearance>): BoardAppearance;
7
+ declare function boardAppearanceOperation(appearance: BoardAppearance): BoardOperation;
8
+ declare function boardTitleOperation(title: string): BoardOperation;
9
+ declare function boardPlaybackPolicyOperation(metadata: Record<string, unknown>, policy: BoardPlaybackPolicy | null): BoardOperation;
10
+ declare function boardNodeCreateOperation(node: BoardNodeInput): BoardOperation;
11
+ declare function boardNodePatchOperation(nodeId: string, patch: Partial<Omit<BoardNodeInput, "nodeId">>): BoardOperation;
12
+ declare function boardNodeDeleteOperations(nodeId: string, connections: readonly BoardConnection[]): BoardOperation[];
13
+ declare function boardEffectUpsertOperation(effect: Omit<BoardEffect, "boardId" | "revision">): BoardOperation;
14
+ declare function boardEffectDeleteOperation(effectId: string): BoardOperation;
15
+ declare function boardSequenceUpsertOperation(input: {
16
+ sequence: Omit<BoardSequence, "boardId" | "revision">;
17
+ clips: Array<Omit<BoardClip, "sequenceId">>;
18
+ }): BoardOperation;
19
+ declare function boardSequenceDeleteOperation(sequenceId: string): BoardOperation;
20
+ //#endregion
21
+ export { boardAppearanceOperation, boardEffectDeleteOperation, boardEffectUpsertOperation, boardNodeCreateOperation, boardNodeDeleteOperations, boardNodePatchOperation, boardPlaybackPolicyOperation, boardSequenceDeleteOperation, boardSequenceUpsertOperation, boardTitleOperation, patchBoardAppearance };
@@ -0,0 +1,104 @@
1
+ import { BoardClipSchema, BoardEffectSchema, BoardSequenceSchema } from "../protocol/dist/board.js";
2
+ import { BoardAppearanceSchema } from "../protocol/dist/board-document.js";
3
+ import "../protocol/dist/index.js";
4
+ //#region src/board/mutation.ts
5
+ const EffectInputSchema = BoardEffectSchema.omit({
6
+ boardId: true,
7
+ revision: true
8
+ });
9
+ const SequenceInputSchema = BoardSequenceSchema.omit({
10
+ boardId: true,
11
+ revision: true
12
+ });
13
+ const ClipInputSchema = BoardClipSchema.omit({ sequenceId: true });
14
+ function patchBoardAppearance(current, patch) {
15
+ return BoardAppearanceSchema.parse({
16
+ ...current,
17
+ ...patch,
18
+ background: patch.background ?? current.background,
19
+ grid: patch.grid ?? current.grid
20
+ });
21
+ }
22
+ function boardAppearanceOperation(appearance) {
23
+ return {
24
+ type: "board.patch",
25
+ payload: { patch: { metadataPatch: { appearance } } }
26
+ };
27
+ }
28
+ function boardTitleOperation(title) {
29
+ return {
30
+ type: "board.patch",
31
+ payload: { patch: { title } }
32
+ };
33
+ }
34
+ function boardPlaybackPolicyOperation(metadata, policy) {
35
+ if (policy) return {
36
+ type: "board.patch",
37
+ payload: { patch: { metadataPatch: { playback: policy } } }
38
+ };
39
+ const next = { ...metadata };
40
+ delete next.playback;
41
+ return {
42
+ type: "board.patch",
43
+ payload: { patch: { metadata: next } }
44
+ };
45
+ }
46
+ function boardNodeCreateOperation(node) {
47
+ return {
48
+ type: "node.create",
49
+ payload: { node }
50
+ };
51
+ }
52
+ function boardNodePatchOperation(nodeId, patch) {
53
+ return {
54
+ type: "node.patch",
55
+ payload: {
56
+ nodeId,
57
+ patch
58
+ }
59
+ };
60
+ }
61
+ function boardNodeDeleteOperations(nodeId, connections) {
62
+ return [...connections.filter((connection) => connection.source.nodeId === nodeId || connection.target.nodeId === nodeId).map((connection) => ({
63
+ type: "connection.delete",
64
+ payload: {
65
+ connectionId: connection.id,
66
+ reason: "node-cascade"
67
+ }
68
+ })), {
69
+ type: "node.delete",
70
+ payload: {
71
+ nodeId,
72
+ reason: "node-cascade"
73
+ }
74
+ }];
75
+ }
76
+ function boardEffectUpsertOperation(effect) {
77
+ return {
78
+ type: "effect.upsert",
79
+ payload: { effect: EffectInputSchema.parse(effect) }
80
+ };
81
+ }
82
+ function boardEffectDeleteOperation(effectId) {
83
+ return {
84
+ type: "effect.delete",
85
+ payload: { effectId }
86
+ };
87
+ }
88
+ function boardSequenceUpsertOperation(input) {
89
+ return {
90
+ type: "sequence.upsert",
91
+ payload: {
92
+ sequence: SequenceInputSchema.parse(input.sequence),
93
+ clips: input.clips.map((clip) => ClipInputSchema.parse(clip))
94
+ }
95
+ };
96
+ }
97
+ function boardSequenceDeleteOperation(sequenceId) {
98
+ return {
99
+ type: "sequence.delete",
100
+ payload: { sequenceId }
101
+ };
102
+ }
103
+ //#endregion
104
+ export { boardAppearanceOperation, boardEffectDeleteOperation, boardEffectUpsertOperation, boardNodeCreateOperation, boardNodeDeleteOperations, boardNodePatchOperation, boardPlaybackPolicyOperation, boardSequenceDeleteOperation, boardSequenceUpsertOperation, boardTitleOperation, patchBoardAppearance };