@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.
- package/dist/board/animation.js +34 -5
- package/dist/board/codec.js +1 -1
- package/dist/board/export/index.d.ts +6 -0
- package/dist/board/export/index.js +6 -3
- package/dist/board/export/scene.d.ts +6 -0
- package/dist/board/export/scene.js +26 -2
- package/dist/board/geometry.d.ts +27 -1
- package/dist/board/geometry.js +92 -1
- package/dist/board/headless/index.d.ts +7 -1
- package/dist/board/headless/index.js +6 -2
- package/dist/board/index.d.ts +6 -4
- package/dist/board/index.js +7 -5
- package/dist/board/mutation.d.ts +21 -0
- package/dist/board/mutation.js +104 -0
- package/dist/board/render/css-color.d.ts +4 -0
- package/dist/board/render/css-color.js +36 -0
- package/dist/board/render/index.d.ts +2 -1
- package/dist/board/render/index.js +2 -1
- package/dist/board/render/renderers/base-card-renderer.js +3 -20
- package/dist/board/render/themes/clean-theme.js +6 -3
- package/dist/chunks/http.d.ts +16 -4
- package/dist/chunks/http.js +180 -16
- package/dist/chunks/websocket.d.ts +74 -4
- package/dist/http.d.ts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +33 -6
- package/dist/protocol/dist/board-constants.d.ts +2 -1
- package/dist/protocol/dist/board-constants.js +61 -6
- package/dist/protocol/dist/board-document.d.ts +28 -2
- package/dist/protocol/dist/board-document.js +16 -3
- package/dist/protocol/dist/board-node.d.ts +2 -1
- package/dist/protocol/dist/board-url.d.ts +2 -1
- package/dist/protocol/dist/board-url.js +8 -3
- package/dist/protocol/dist/board.d.ts +136 -4
- package/dist/protocol/dist/board.js +42 -1
- package/dist/protocol/dist/index.d.ts +3 -3
- package/dist/protocol/dist/index.js +2 -2
- package/dist/types.d.ts +2 -2
- package/package.json +1 -1
package/dist/board/animation.js
CHANGED
|
@@ -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 };
|
package/dist/board/codec.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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"
|
package/dist/board/geometry.d.ts
CHANGED
|
@@ -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 };
|
package/dist/board/geometry.js
CHANGED
|
@@ -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;
|
package/dist/board/index.d.ts
CHANGED
|
@@ -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 };
|
package/dist/board/index.js
CHANGED
|
@@ -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 };
|