@neta-art/cohub 8.6.0 → 8.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,4 @@
1
+ import { boardArrowBounds, boardArrowFrame, boardResolveArrow, boardSampleResolvedArrow } from "../../protocol/dist/board-geometry.js";
1
2
  import { worldPoint } from "../geometry.js";
2
3
  //#region src/board/core/arrow-geometry.ts
3
4
  /**
@@ -11,62 +12,24 @@ import { worldPoint } from "../geometry.js";
11
12
  */
12
13
  /** Resolve an arrow's endpoints and its bent control point. */
13
14
  function resolveArrow(item) {
14
- const start = worldPoint(item.start.x, item.start.y);
15
- const end = worldPoint(item.end.x, item.end.y);
16
- const mid = worldPoint((start.x + end.x) / 2, (start.y + end.y) / 2);
17
- if (!item.bend) return {
18
- start,
19
- end,
20
- control: mid
21
- };
22
- const dx = end.x - start.x;
23
- const dy = end.y - start.y;
24
- const length = Math.hypot(dx, dy) || 1;
25
- const offset = item.bend * length;
15
+ const resolved = boardResolveArrow(item);
26
16
  return {
27
- start,
28
- end,
29
- control: worldPoint(mid.x + -dy / length * offset, mid.y + dx / length * offset)
17
+ start: worldPoint(resolved.start.x, resolved.start.y),
18
+ end: worldPoint(resolved.end.x, resolved.end.y),
19
+ control: worldPoint(resolved.control.x, resolved.control.y)
30
20
  };
31
21
  }
32
22
  /** Sample an arrow's quadratic curve into world points. */
33
23
  function sampleArrow(resolved, segments) {
34
- const { start, control, end } = resolved;
35
- const out = [];
36
- for (let index = 0; index <= segments; index += 1) {
37
- const t = index / segments;
38
- const mt = 1 - t;
39
- out.push(worldPoint(mt * mt * start.x + 2 * mt * t * control.x + t * t * end.x, mt * mt * start.y + 2 * mt * t * control.y + t * t * end.y));
40
- }
41
- return out;
24
+ return boardSampleResolvedArrow(resolved, segments).map((point) => worldPoint(point.x, point.y));
42
25
  }
43
26
  /** World bounds of an arrow, padded for its stroke. */
44
27
  function arrowBounds(item) {
45
- const samples = sampleArrow(resolveArrow(item), 12);
46
- let minX = Number.POSITIVE_INFINITY;
47
- let minY = Number.POSITIVE_INFINITY;
48
- let maxX = Number.NEGATIVE_INFINITY;
49
- let maxY = Number.NEGATIVE_INFINITY;
50
- for (const point of samples) {
51
- minX = Math.min(minX, point.x);
52
- minY = Math.min(minY, point.y);
53
- maxX = Math.max(maxX, point.x);
54
- maxY = Math.max(maxY, point.y);
55
- }
56
- const pad = Math.max(8, item.size * 2);
57
- return {
58
- x: minX - pad,
59
- y: minY - pad,
60
- width: Math.max(1, maxX - minX + pad * 2),
61
- height: Math.max(1, maxY - minY + pad * 2)
62
- };
28
+ return boardArrowBounds(item);
63
29
  }
64
30
  /** The frame an arrow should carry, derived from its endpoints. */
65
31
  function arrowFrame(item) {
66
- return {
67
- ...arrowBounds(item),
68
- rotation: 0
69
- };
32
+ return boardArrowFrame(item);
70
33
  }
71
34
  /** Distance from a world point to an arrow's curve (hit testing). */
72
35
  function distanceToArrow(item, point) {
@@ -1,10 +1,12 @@
1
1
  import { DrawPoint } from "../../protocol/dist/board-document.js";
2
- import { Rect, WorldPoint } from "../geometry.js";
2
+ import { boardDrawBounds, boardDrawSampleRadius } from "../../protocol/dist/board-geometry.js";
3
+ import "../../protocol/dist/index.js";
4
+ import { WorldPoint } from "../geometry.js";
3
5
  //#region src/board/core/draw-geometry.d.ts
4
6
  /** Radius of a sample in world units given the stroke size and pressure. */
5
- declare function sampleRadius(size: number, pressure: number): number;
7
+ declare const sampleRadius: typeof boardDrawSampleRadius;
6
8
  /** Axis-aligned bounds of a stroke in its local space, padded by stroke width. */
7
- declare function computeDrawBounds(points: DrawPoint[], size: number): Rect;
9
+ declare const computeDrawBounds: typeof boardDrawBounds;
8
10
  /**
9
11
  * Ramer–Douglas–Peucker simplification. Reduces point count for low-zoom
10
12
  * rendering without touching the persisted raw samples. Returns indices into
@@ -12,9 +14,9 @@ declare function computeDrawBounds(points: DrawPoint[], size: number): Rect;
12
14
  */
13
15
  declare function simplifyDrawIndices(points: DrawPoint[], tolerance: number): number[];
14
16
  /**
15
- * Build the legacy closed outline used by exports and callers that need a path.
16
- * Interactive Board rendering uses `buildStrokeRibbonGeometry` below instead:
17
- * filling one outline is unsafe when a freehand path folds back over itself.
17
+ * Build a closed outline for callers that need a path representation.
18
+ * Interactive rendering uses `buildStrokeRibbonGeometry` below because a single
19
+ * outline is unsafe when a freehand path folds back over itself.
18
20
  */
19
21
  declare function buildStrokeOutline(points: DrawPoint[], size: number): Array<{
20
22
  x: number;
@@ -1,36 +1,10 @@
1
+ import { boardDrawBounds, boardDrawSampleRadius } from "../../protocol/dist/board-geometry.js";
1
2
  import { getStroke } from "perfect-freehand";
2
3
  //#region src/board/core/draw-geometry.ts
3
4
  /** Radius of a sample in world units given the stroke size and pressure. */
4
- function sampleRadius(size, pressure) {
5
- const clamped = Math.min(1, Math.max(0, pressure));
6
- return Math.max(.5, size / 2 * (.5 + clamped));
7
- }
5
+ const sampleRadius = boardDrawSampleRadius;
8
6
  /** Axis-aligned bounds of a stroke in its local space, padded by stroke width. */
9
- function computeDrawBounds(points, size) {
10
- if (points.length === 0) return {
11
- x: 0,
12
- y: 0,
13
- width: 1,
14
- height: 1
15
- };
16
- let minX = Number.POSITIVE_INFINITY;
17
- let minY = Number.POSITIVE_INFINITY;
18
- let maxX = Number.NEGATIVE_INFINITY;
19
- let maxY = Number.NEGATIVE_INFINITY;
20
- for (const point of points) {
21
- const r = sampleRadius(size, point.p);
22
- minX = Math.min(minX, point.x - r);
23
- minY = Math.min(minY, point.y - r);
24
- maxX = Math.max(maxX, point.x + r);
25
- maxY = Math.max(maxY, point.y + r);
26
- }
27
- return {
28
- x: minX,
29
- y: minY,
30
- width: Math.max(1, maxX - minX),
31
- height: Math.max(1, maxY - minY)
32
- };
33
- }
7
+ const computeDrawBounds = boardDrawBounds;
34
8
  /**
35
9
  * Ramer–Douglas–Peucker simplification. Reduces point count for low-zoom
36
10
  * rendering without touching the persisted raw samples. Returns indices into
@@ -81,9 +55,9 @@ function perpendicularDistance(point, a, b) {
81
55
  return Math.hypot(point.x - projX, point.y - projY);
82
56
  }
83
57
  /**
84
- * Build the legacy closed outline used by exports and callers that need a path.
85
- * Interactive Board rendering uses `buildStrokeRibbonGeometry` below instead:
86
- * filling one outline is unsafe when a freehand path folds back over itself.
58
+ * Build a closed outline for callers that need a path representation.
59
+ * Interactive rendering uses `buildStrokeRibbonGeometry` below because a single
60
+ * outline is unsafe when a freehand path folds back over itself.
87
61
  */
88
62
  function buildStrokeOutline(points, size) {
89
63
  const n = points.length;
@@ -1,6 +1,6 @@
1
1
  import { BoardGeoKind } from "../../protocol/dist/board-node.js";
2
- import "../../protocol/dist/index.js";
3
2
  import { BoardFrame } from "../../protocol/dist/board-document.js";
3
+ import "../../protocol/dist/index.js";
4
4
  import { Rect, WorldPoint } from "../geometry.js";
5
5
  //#region src/board/core/shape-types.d.ts
6
6
  /**
@@ -28,6 +28,7 @@ function buildContext(input) {
28
28
  },
29
29
  colors: input.colors ?? buildFallbackShapeColors(input.colorScheme),
30
30
  colorScheme: input.colorScheme,
31
+ rendererType: "canvas",
31
32
  zoom: input.scale,
32
33
  assetKey: input.assetKey ?? imageAssetKey,
33
34
  getTexture: (key) => textures.get(key) ?? null,
@@ -1,6 +1,6 @@
1
1
  import { BoardCameraFocus, BoardCameraFocusParams, BoardCameraState } from "../protocol/dist/board.js";
2
- import "../protocol/dist/index.js";
3
2
  import { BoardFrame, BoardViewport } from "../protocol/dist/board-document.js";
3
+ import "../protocol/dist/index.js";
4
4
  //#region src/board/geometry.d.ts
5
5
  type Point = {
6
6
  x: number;
@@ -3,10 +3,11 @@ import { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNEC
3
3
  import { BoardTrackInterpolation } from "../protocol/dist/board-composition.js";
4
4
  import { BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BoardCameraFocus, BoardCameraFocusParams, BoardCameraFocusParamsSchema, BoardCameraFocusSchema, BoardCameraState, BoardCameraStateSchema, isBoardPath, parseBoardManifest, serializeBoardManifest } from "../protocol/dist/board.js";
5
5
  import { BoardColorId } from "../protocol/dist/board-node.js";
6
- import "../protocol/dist/index.js";
7
- import { BOARD_CHANNELS, BoardExtensionDefinition, BoardExtensionRegistry, BoardPresetDefinition, CompositionInput, DEFAULT_BOARD_LIMITS, ProceduralClipInput, QualityProfile, RenderBounds, SampledTrack, TrackInput, compileComposition, composition, createBoardExtensionRegistry, proceduralClip, sampleCompositionTracks, sampleEasing, sampleTrack, track } from "./animation.js";
8
6
  import { BOARD_REMOTE_URL_MAX_LENGTH, BoardRemoteUrlSchema, isPublicBoardRemoteAddress, normalizeBoardRemoteUrl } from "../protocol/dist/board-url.js";
9
7
  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
+ import { boardArrowFrame } from "../protocol/dist/board-geometry.js";
9
+ import "../protocol/dist/index.js";
10
+ import { BOARD_CHANNELS, BoardExtensionDefinition, BoardExtensionRegistry, BoardPresetDefinition, CompositionInput, DEFAULT_BOARD_LIMITS, ProceduralClipInput, QualityProfile, RenderBounds, SampledTrack, TrackInput, compileComposition, composition, createBoardExtensionRegistry, proceduralClip, sampleCompositionTracks, sampleEasing, sampleTrack, track } from "./animation.js";
10
11
  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";
11
12
  import { ResolvedArrow, arrowBounds, arrowFrame, distanceToArrow, resolveArrow, sampleArrow, translateArrow } from "./core/arrow-geometry.js";
12
13
  import { CONNECTION_ENDPOINT_GAP, ConnectionIndex, FrameLookup, ResolvedConnection, ResolvedConnectionEndpoint, anchorPointOnFrame, anchorToWorld, autoConnectionSide, connectionArrowheads, connectionBounds, connectionHitTest, createConnectionIndex, distanceToConnection, pathMidpoint, resolveConnection, worldToAnchor } from "./core/connections.js";
@@ -26,4 +27,4 @@ import { BoardAssetSource, BoardPlayableMedia, playableBoardMedia, playableBoard
26
27
  import { patchBoardAppearance } from "./mutation.js";
27
28
  import { applyBoardSemanticCommands, boardDocumentToSemanticCommands } from "./semantic-mutation.js";
28
29
  import { featuredTaskArtifact, rankedTaskArtifacts, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot } from "./task.js";
29
- export { AUTO_BOARD_CONNECTION_ANCHOR, type ArrowShapeProps, type AudioShapeProps, BOARD_CHANNELS, 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_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, BoardItem, BoardItemSchema, BoardItemStyle, BoardItemStyleSchema, BoardKnownItem, BoardMediaKind, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardNormalizedPoint, BoardPlayableMedia, BoardPoint, BoardPointSchema, BoardPresetDefinition, BoardRelationSchema, BoardRemoteUrlSchema, BoardScreenOffset, BoardScreenPoint, BoardShapeColors, BoardStyledToolId, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardToolStyleMap, BoardToolStylePatch, type BoardTrackInterpolation, BoardUnknownItem, BoardVideoItem, BoardVideoItemSchema, BoardViewport, BoardViewportSchema, BoardWorldOffset, BoardWorldPoint, BoardWorldRect, BuildSnapshotInput, CONNECTION_ENDPOINT_GAP, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, CompositionInput, 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, type ImageShapeProps, KNOWN_BOARD_ITEM_TYPES, KnownBoardItemType, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, Point, ProceduralClipInput, QualityProfile, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, Rect, RenderBounds, ResizeHandle, ResolvedArrow, ResolvedConnection, ResolvedConnectionEndpoint, ResolvedCover, SampledTrack, ScreenPoint, type ShapeCapabilities, ShapeDefinition, type ShapeGeometry, type ShapeHandle, type ShapeHandleId, type ShapeResizeMode, Size, SpaceFileRef, SpaceFileRefSchema, StrokeRibbonGeometry, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, type TextShapeProps, TrackInput, UNKNOWN_BOARD_ITEM_TYPE, VIEWPORT_MARGIN_RATIO, type VideoShapeProps, WorldPoint, anchorPointOnFrame, anchorToWorld, angleFromCenter, applyBoardAuthoringSnapshot, applyBoardSemanticCommands, arrowBounds, arrowFrame, autoConnectionSide, availabilityFromError, boardAuthoringItemToDocumentItem, boardAuthoringSnapshotToDocument, boardColorCssVar, boardDocumentToSemanticCommands, boardFrameLookup, boardImageKeySource, boardItemToAuthoringItem, boardTextLineHeight, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardStrokeSize, clampBoardTextFontSize, clampZoom, compileComposition, composition, computeDrawBounds, connectionArrowheads, connectionBounds, connectionHitTest, connectionItemIds, connectionOtherItemId, connectionTouchesItem, createBoardConnection, createBoardExtensionRegistry, 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, isStrokeCorner, isUnknownItem, itemBounds, measureBoardText, mergeFileSnapshot, normalizeBoardConnectionStyle, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, panBy, parseBoardDocument, parseBoardItemLoose, parseBoardManifest, patchBoardAppearance, pathMidpoint, pickBoardColor, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, proceduralClip, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, registerShapeDefinition, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resizeModeForCapabilities, resolveArrow, resolveBoardColor, resolveConnection, resolveCoverRef, resolveSpacePath, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleArrow, sampleCompositionTracks, sampleEasing, sampleRadius, sampleTrack, scaleFrames, screenOffset, screenPoint, screenToWorld, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shapeBounds, shapeCapabilities, shapeHandles, shapeHitTest, shapeResizeMode, shouldFetchFileExcerpt, simplifyDrawIndices, splitFrontmatter, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot, track, translateArrow, unionRects, unknownRealType, unknownShapeDefinition, visibleWorldRect, withResolvedConnections, worldOffset, worldPoint, worldRect, worldToAnchor, worldToScreen, zoomAround };
30
+ export { AUTO_BOARD_CONNECTION_ANCHOR, type ArrowShapeProps, type AudioShapeProps, BOARD_CHANNELS, 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_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, BoardItem, BoardItemSchema, BoardItemStyle, BoardItemStyleSchema, BoardKnownItem, BoardMediaKind, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardNormalizedPoint, BoardPlayableMedia, BoardPoint, BoardPointSchema, BoardPresetDefinition, BoardRelationSchema, BoardRemoteUrlSchema, BoardScreenOffset, BoardScreenPoint, BoardShapeColors, BoardStyledToolId, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardToolStyleMap, BoardToolStylePatch, type BoardTrackInterpolation, BoardUnknownItem, BoardVideoItem, BoardVideoItemSchema, BoardViewport, BoardViewportSchema, BoardWorldOffset, BoardWorldPoint, BoardWorldRect, BuildSnapshotInput, CONNECTION_ENDPOINT_GAP, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, CompositionInput, 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, type ImageShapeProps, KNOWN_BOARD_ITEM_TYPES, KnownBoardItemType, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, Point, ProceduralClipInput, QualityProfile, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, Rect, RenderBounds, ResizeHandle, ResolvedArrow, ResolvedConnection, ResolvedConnectionEndpoint, ResolvedCover, SampledTrack, ScreenPoint, type ShapeCapabilities, ShapeDefinition, type ShapeGeometry, type ShapeHandle, type ShapeHandleId, type ShapeResizeMode, Size, SpaceFileRef, SpaceFileRefSchema, StrokeRibbonGeometry, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, type TextShapeProps, TrackInput, UNKNOWN_BOARD_ITEM_TYPE, VIEWPORT_MARGIN_RATIO, type VideoShapeProps, WorldPoint, anchorPointOnFrame, anchorToWorld, angleFromCenter, applyBoardAuthoringSnapshot, applyBoardSemanticCommands, arrowBounds, arrowFrame, autoConnectionSide, availabilityFromError, boardAuthoringItemToDocumentItem, boardAuthoringSnapshotToDocument, boardColorCssVar, boardDocumentToSemanticCommands, boardFrameLookup, boardImageKeySource, boardItemToAuthoringItem, boardTextLineHeight, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardStrokeSize, clampBoardTextFontSize, clampZoom, compileComposition, composition, boardArrowFrame as computeArrowFrame, computeDrawBounds, connectionArrowheads, connectionBounds, connectionHitTest, connectionItemIds, connectionOtherItemId, connectionTouchesItem, createBoardConnection, createBoardExtensionRegistry, 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, isStrokeCorner, isUnknownItem, itemBounds, measureBoardText, mergeFileSnapshot, normalizeBoardConnectionStyle, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, panBy, parseBoardDocument, parseBoardItemLoose, parseBoardManifest, patchBoardAppearance, pathMidpoint, pickBoardColor, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, proceduralClip, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, registerShapeDefinition, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resizeModeForCapabilities, resolveArrow, resolveBoardColor, resolveConnection, resolveCoverRef, resolveSpacePath, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleArrow, sampleCompositionTracks, sampleEasing, sampleRadius, sampleTrack, scaleFrames, screenOffset, screenPoint, screenToWorld, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shapeBounds, shapeCapabilities, shapeHandles, shapeHitTest, shapeResizeMode, shouldFetchFileExcerpt, simplifyDrawIndices, splitFrontmatter, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot, track, translateArrow, unionRects, unknownRealType, unknownShapeDefinition, visibleWorldRect, withResolvedConnections, worldOffset, worldPoint, worldRect, worldToAnchor, worldToScreen, zoomAround };
@@ -3,6 +3,7 @@ import { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNEC
3
3
  import { BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BoardCameraFocusParamsSchema, BoardCameraFocusSchema, BoardCameraStateSchema, isBoardPath, parseBoardManifest, serializeBoardManifest } from "../protocol/dist/board.js";
4
4
  import { BOARD_REMOTE_URL_MAX_LENGTH, BoardRemoteUrlSchema, isPublicBoardRemoteAddress, normalizeBoardRemoteUrl } from "../protocol/dist/board-url.js";
5
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 { boardArrowFrame } from "../protocol/dist/board-geometry.js";
6
7
  import { BOARD_CHANNELS, BoardExtensionRegistry, DEFAULT_BOARD_LIMITS, compileComposition, composition, createBoardExtensionRegistry, proceduralClip, sampleCompositionTracks, sampleEasing, sampleTrack, track } from "./animation.js";
7
8
  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";
8
9
  import { featuredTaskArtifact, rankedTaskArtifacts, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot } from "./task.js";
@@ -23,4 +24,4 @@ import { getMediaExtension, getMediaResourceTitle, inferBoardMediaKind } from ".
23
24
  import { playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache } from "./media-playback.js";
24
25
  import { patchBoardAppearance } from "./mutation.js";
25
26
  import { applyBoardSemanticCommands, boardDocumentToSemanticCommands } from "./semantic-mutation.js";
26
- export { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_CHANNELS, 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_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, 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, 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, applyBoardAuthoringSnapshot, applyBoardSemanticCommands, arrowBounds, arrowFrame, autoConnectionSide, availabilityFromError, boardAuthoringItemToDocumentItem, boardAuthoringSnapshotToDocument, boardColorCssVar, boardDocumentToSemanticCommands, boardFrameLookup, boardImageKeySource, boardItemToAuthoringItem, boardTextLineHeight, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardStrokeSize, clampBoardTextFontSize, clampZoom, compileComposition, composition, computeDrawBounds, connectionArrowheads, connectionBounds, connectionHitTest, connectionItemIds, connectionOtherItemId, connectionTouchesItem, createBoardConnection, createBoardExtensionRegistry, 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, isStrokeCorner, isUnknownItem, itemBounds, measureBoardText, mergeFileSnapshot, normalizeBoardConnectionStyle, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, panBy, parseBoardDocument, parseBoardItemLoose, parseBoardManifest, patchBoardAppearance, pathMidpoint, pickBoardColor, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, proceduralClip, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, registerShapeDefinition, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resizeModeForCapabilities, resolveArrow, resolveBoardColor, resolveConnection, resolveCoverRef, resolveSpacePath, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleArrow, sampleCompositionTracks, sampleEasing, sampleRadius, sampleTrack, scaleFrames, screenOffset, screenPoint, screenToWorld, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shapeBounds, shapeCapabilities, shapeHandles, shapeHitTest, shapeResizeMode, shouldFetchFileExcerpt, simplifyDrawIndices, splitFrontmatter, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot, track, translateArrow, unionRects, unknownRealType, unknownShapeDefinition, visibleWorldRect, withResolvedConnections, worldOffset, worldPoint, worldRect, worldToAnchor, worldToScreen, zoomAround };
27
+ export { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_CHANNELS, 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_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, 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, 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, applyBoardAuthoringSnapshot, applyBoardSemanticCommands, arrowBounds, arrowFrame, autoConnectionSide, availabilityFromError, boardAuthoringItemToDocumentItem, boardAuthoringSnapshotToDocument, boardColorCssVar, boardDocumentToSemanticCommands, boardFrameLookup, boardImageKeySource, boardItemToAuthoringItem, boardTextLineHeight, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardStrokeSize, clampBoardTextFontSize, clampZoom, compileComposition, composition, boardArrowFrame as computeArrowFrame, computeDrawBounds, connectionArrowheads, connectionBounds, connectionHitTest, connectionItemIds, connectionOtherItemId, connectionTouchesItem, createBoardConnection, createBoardExtensionRegistry, 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, isStrokeCorner, isUnknownItem, itemBounds, measureBoardText, mergeFileSnapshot, normalizeBoardConnectionStyle, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, panBy, parseBoardDocument, parseBoardItemLoose, parseBoardManifest, patchBoardAppearance, pathMidpoint, pickBoardColor, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, proceduralClip, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, registerShapeDefinition, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resizeModeForCapabilities, resolveArrow, resolveBoardColor, resolveConnection, resolveCoverRef, resolveSpacePath, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleArrow, sampleCompositionTracks, sampleEasing, sampleRadius, sampleTrack, scaleFrames, screenOffset, screenPoint, screenToWorld, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shapeBounds, shapeCapabilities, shapeHandles, shapeHitTest, shapeResizeMode, shouldFetchFileExcerpt, simplifyDrawIndices, splitFrontmatter, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot, track, translateArrow, unionRects, unknownRealType, unknownShapeDefinition, visibleWorldRect, withResolvedConnections, worldOffset, worldPoint, worldRect, worldToAnchor, worldToScreen, zoomAround };
@@ -34,6 +34,8 @@ type BoardRenderContext = {
34
34
  colors: BoardShapeColors;
35
35
  /** Resolved color mode, for fallback mapping when colors are unavailable. */
36
36
  colorScheme: "dark" | "light";
37
+ /** Rendering backend selected by the host; Canvas uses compatibility paths. */
38
+ rendererType: "gpu" | "canvas";
37
39
  /** Current camera zoom — used for text re-rasterisation buckets. */
38
40
  zoom: number;
39
41
  /** Stable preview texture key for an item, or null when it has no preview. */
@@ -2,9 +2,23 @@ import { buildStrokeRibbonGeometry, computeDrawBounds } from "../../core/draw-ge
2
2
  import { pickBoardColor } from "../../core/palette.js";
3
3
  import { positionShell } from "./base-card-renderer.js";
4
4
  import { drawFarStroke } from "./far-plate.js";
5
- import { Container, Mesh, MeshGeometry, Texture } from "pixi.js";
5
+ import { Container, Graphics, Mesh, MeshGeometry, Texture } from "pixi.js";
6
6
  //#region src/board/render/renderers/draw-card-renderer.ts
7
7
  const partsByContainer = /* @__PURE__ */ new WeakMap();
8
+ /** Canvas fallback for environments where Pixi intentionally has no Mesh pipe. */
9
+ function createCanvasStroke(positions, indices, color, alpha) {
10
+ const graphics = new Graphics();
11
+ for (let offset = 0; offset < indices.length; offset += 3) {
12
+ const a = (indices[offset] ?? 0) * 2;
13
+ const b = (indices[offset + 1] ?? 0) * 2;
14
+ const c = (indices[offset + 2] ?? 0) * 2;
15
+ graphics.moveTo(positions[a] ?? 0, positions[a + 1] ?? 0).lineTo(positions[b] ?? 0, positions[b + 1] ?? 0).lineTo(positions[c] ?? 0, positions[c + 1] ?? 0).closePath();
16
+ }
17
+ return graphics.fill({
18
+ color,
19
+ alpha
20
+ });
21
+ }
8
22
  function sync(container, item, context) {
9
23
  const parts = partsByContainer.get(container);
10
24
  if (!parts) return;
@@ -26,20 +40,22 @@ function sync(container, item, context) {
26
40
  parts.points = item.points;
27
41
  parts.baseWidth = computeDrawBounds(item.points, item.size).width;
28
42
  const ribbon = buildStrokeRibbonGeometry(item.points, item.size);
29
- const geometry = new MeshGeometry({
30
- positions: ribbon.positions,
31
- indices: ribbon.indices
32
- });
33
- const nextStroke = new Mesh({
34
- geometry,
43
+ const alpha = selected || hovered ? 1 : .92;
44
+ const nextStroke = context.rendererType !== "canvas" ? new Mesh({
45
+ geometry: new MeshGeometry({
46
+ positions: ribbon.positions,
47
+ indices: ribbon.indices
48
+ }),
35
49
  texture: Texture.WHITE
36
- });
37
- nextStroke.tint = color.stroke;
38
- nextStroke.alpha = selected || hovered ? 1 : .92;
50
+ }) : createCanvasStroke(ribbon.positions, ribbon.indices, color.stroke, alpha);
51
+ if (nextStroke instanceof Mesh) {
52
+ nextStroke.tint = color.stroke;
53
+ nextStroke.alpha = alpha;
54
+ }
39
55
  const previous = parts.stroke;
40
56
  parts.stroke = nextStroke;
41
57
  parts.root.removeChild(previous);
42
- previous.destroy({ children: true });
58
+ previous.destroy();
43
59
  parts.root.addChild(nextStroke);
44
60
  }
45
61
  const previewScale = item.frame.width / Math.max(1e-4, parts.baseWidth);
@@ -50,13 +66,7 @@ const drawCardRenderer = {
50
66
  canRender: (item) => item.type === "draw",
51
67
  create: (item, context) => {
52
68
  const root = new Container();
53
- const stroke = new Mesh({
54
- geometry: new MeshGeometry({
55
- positions: /* @__PURE__ */ new Float32Array(),
56
- indices: /* @__PURE__ */ new Uint32Array()
57
- }),
58
- texture: Texture.WHITE
59
- });
69
+ const stroke = new Graphics();
60
70
  root.addChild(stroke);
61
71
  partsByContainer.set(root, {
62
72
  root,
@@ -1,7 +1,7 @@
1
1
  import { BoardAuthoringItem, BoardAuthoringSnapshot } from "../protocol/dist/board-authoring.js";
2
2
  import { BoardMutationReceipt } from "../protocol/dist/board.js";
3
- import "../protocol/dist/index.js";
4
3
  import { BoardDocument, BoardItem } from "../protocol/dist/board-document.js";
4
+ import "../protocol/dist/index.js";
5
5
  //#region src/board/semantic-document.d.ts
6
6
  declare const DEFAULT_BOARD_APPEARANCE: {
7
7
  theme: string;
@@ -1,6 +1,8 @@
1
1
  import { BoardAuthoringItemSchema } from "../protocol/dist/board-authoring.js";
2
2
  import { BOARD_DOCUMENT_KIND } from "../protocol/dist/board.js";
3
3
  import { BoardAppearanceSchema, UNKNOWN_BOARD_ITEM_TYPE, isUnknownItem, parseBoardDocument } from "../protocol/dist/board-document.js";
4
+ import { boardDrawPointsToWorld } from "../protocol/dist/board-geometry.js";
5
+ import { boardAuthoringItemToNode } from "../protocol/dist/board-codec.js";
4
6
  //#region src/board/semantic-document.ts
5
7
  const DEFAULT_BOARD_APPEARANCE = BoardAppearanceSchema.parse({
6
8
  theme: "clean",
@@ -14,9 +16,16 @@ const DEFAULT_BOARD_APPEARANCE = BoardAppearanceSchema.parse({
14
16
  });
15
17
  /** Convert a public authoring Item to the renderer/editor document shape. */
16
18
  function boardAuthoringItemToDocumentItem(item) {
19
+ const node = boardAuthoringItemToNode(item);
17
20
  const base = {
18
21
  id: item.id,
19
- frame: item.frame,
22
+ frame: {
23
+ x: node.x,
24
+ y: node.y,
25
+ width: node.width,
26
+ height: node.height,
27
+ rotation: node.rotation
28
+ },
20
29
  ...item.parentId !== void 0 ? { parentId: item.parentId } : {},
21
30
  ...item.locked ? { locked: true } : {},
22
31
  ...item.metadata ? { metadata: item.metadata } : {}
@@ -43,7 +52,7 @@ function boardAuthoringItemToDocumentItem(item) {
43
52
  case "draw": return {
44
53
  ...base,
45
54
  type: "draw",
46
- points: props.points,
55
+ points: node.data.points,
47
56
  color: String(style?.color ?? "brand"),
48
57
  size: Number(style?.strokeWidth ?? 4)
49
58
  };
@@ -118,7 +127,17 @@ function boardItemToAuthoringItem(item) {
118
127
  }
119
128
  const base = {
120
129
  id: item.id,
121
- frame: item.frame,
130
+ ...item.type === "draw" || item.type === "arrow" ? {} : {
131
+ position: {
132
+ x: item.frame.x,
133
+ y: item.frame.y
134
+ },
135
+ size: {
136
+ width: item.frame.width,
137
+ height: item.frame.height
138
+ }
139
+ },
140
+ rotation: item.frame.rotation,
122
141
  ...item.parentId !== void 0 ? { parentId: item.parentId } : {},
123
142
  ...item.locked ? { locked: true } : {},
124
143
  ...item.metadata ? { metadata: item.metadata } : {}
@@ -148,7 +167,7 @@ function boardItemToAuthoringItem(item) {
148
167
  case "draw": return {
149
168
  ...base,
150
169
  type: "draw",
151
- props: { points: item.points },
170
+ props: { points: boardDrawPointsToWorld(item.points, item.frame.x, item.frame.y) },
152
171
  style: {
153
172
  color: item.color,
154
173
  strokeWidth: item.size
@@ -1,6 +1,6 @@
1
1
  import { BoardSemanticCommand } from "../protocol/dist/board-authoring.js";
2
- import "../protocol/dist/index.js";
3
2
  import { BoardDocument } from "../protocol/dist/board-document.js";
3
+ import "../protocol/dist/index.js";
4
4
  //#region src/board/semantic-mutation.d.ts
5
5
  /** Compile an editor document delta to the public semantic mutation command set. */
6
6
  declare function boardDocumentToSemanticCommands(before: BoardDocument, after: BoardDocument): BoardSemanticCommand[];
@@ -29,7 +29,13 @@ function itemPatch(before, after) {
29
29
  const beforeAuthoring = semanticItem(before);
30
30
  const afterAuthoring = semanticItem(after);
31
31
  const patch = {};
32
- if (!boardJsonEquals(before.frame, after.frame)) patch.frame = after.frame;
32
+ const beforePosition = "position" in beforeAuthoring ? beforeAuthoring.position : void 0;
33
+ const afterPosition = "position" in afterAuthoring ? afterAuthoring.position : void 0;
34
+ if (!boardJsonEquals(beforePosition, afterPosition) && afterPosition) patch.position = afterPosition;
35
+ const beforeSize = "size" in beforeAuthoring ? beforeAuthoring.size : void 0;
36
+ const afterSize = "size" in afterAuthoring ? afterAuthoring.size : void 0;
37
+ if (!boardJsonEquals(beforeSize, afterSize)) patch.size = afterSize ?? null;
38
+ if (beforeAuthoring.rotation !== afterAuthoring.rotation) patch.rotation = afterAuthoring.rotation;
33
39
  const beforeParent = before.parentId ?? null;
34
40
  const afterParent = after.parentId ?? null;
35
41
  if (beforeParent !== afterParent) patch.parentId = afterParent;
@@ -1013,12 +1013,17 @@ const idSchema = z.string().min(1).max(160);
1013
1013
  const jsonObjectSchema = z.record(z.string(), z.unknown());
1014
1014
  const finiteSchema = z.number().finite();
1015
1015
  const extensionTypeSchema = z.string().regex(/^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)+$/).max(160);
1016
- const BoardAuthoringFrameSchema = z.object({
1016
+ const BoardAuthoringPositionSchema = z.object({
1017
1017
  x: finiteSchema,
1018
- y: finiteSchema,
1018
+ y: finiteSchema
1019
+ }).strict();
1020
+ const BoardAuthoringSizeSchema = z.object({
1019
1021
  width: finiteSchema.positive(),
1020
- height: finiteSchema.positive(),
1021
- rotation: finiteSchema.default(0)
1022
+ height: finiteSchema.positive()
1023
+ }).strict();
1024
+ const BoardAuthoringPositionPatchSchema = z.object({
1025
+ x: finiteSchema.optional(),
1026
+ y: finiteSchema.optional()
1022
1027
  }).strict();
1023
1028
  const pointSchema = z.object({
1024
1029
  x: finiteSchema,
@@ -1049,15 +1054,26 @@ const BoardItemSourceSchema = z.object({
1049
1054
  path: z.string().refine(isSafeBoardSourcePath, "source path must be a safe relative Board file path"),
1050
1055
  snapshot: sourceSnapshotSchema.optional()
1051
1056
  }).strict();
1052
- const baseFields = {
1057
+ const sizedBaseFields = {
1053
1058
  id: idSchema,
1054
- frame: BoardAuthoringFrameSchema,
1059
+ position: BoardAuthoringPositionSchema.default({
1060
+ x: 0,
1061
+ y: 0
1062
+ }),
1063
+ rotation: finiteSchema.default(0),
1055
1064
  parentId: idSchema.nullable().optional(),
1056
1065
  locked: z.boolean().optional(),
1057
- metadata: jsonObjectSchema.optional()
1066
+ metadata: jsonObjectSchema.optional(),
1067
+ size: BoardAuthoringSizeSchema.optional()
1058
1068
  };
1059
1069
  const styledBaseFields = {
1060
- ...baseFields,
1070
+ ...sizedBaseFields,
1071
+ style: BoardItemStyleSchema.optional()
1072
+ };
1073
+ const { position: _positionField, size: _sizeField, ...strokeBaseFields } = sizedBaseFields;
1074
+ const strokeStyledBaseFields = {
1075
+ ...strokeBaseFields,
1076
+ rotation: z.literal(0).default(0),
1061
1077
  style: BoardItemStyleSchema.optional()
1062
1078
  };
1063
1079
  const BoardTextAuthoringItemSchema = z.object({
@@ -1077,12 +1093,12 @@ const BoardGeoAuthoringItemSchema = z.object({
1077
1093
  }).strict()
1078
1094
  }).strict();
1079
1095
  const BoardDrawAuthoringItemSchema = z.object({
1080
- ...styledBaseFields,
1096
+ ...strokeStyledBaseFields,
1081
1097
  type: z.literal("draw"),
1082
1098
  props: z.object({ points: z.array(pointSchema).min(1) }).strict()
1083
1099
  }).strict();
1084
1100
  const BoardArrowAuthoringItemSchema = z.object({
1085
- ...styledBaseFields,
1101
+ ...strokeStyledBaseFields,
1086
1102
  type: z.literal("arrow"),
1087
1103
  props: z.object({
1088
1104
  start: worldPointSchema,
@@ -1099,7 +1115,7 @@ const BoardFrameAuthoringItemSchema = z.object({
1099
1115
  props: z.object({ label: z.string().default("Frame") }).strict()
1100
1116
  }).strict();
1101
1117
  const fileBackedFields = {
1102
- ...baseFields,
1118
+ ...sizedBaseFields,
1103
1119
  style: z.object({}).strict().optional(),
1104
1120
  source: BoardItemSourceSchema
1105
1121
  };
@@ -1130,7 +1146,7 @@ const builtinItemSchemas = [
1130
1146
  props: z.object({}).strict()
1131
1147
  }).strict(),
1132
1148
  z.object({
1133
- ...baseFields,
1149
+ ...sizedBaseFields,
1134
1150
  type: z.literal("task"),
1135
1151
  props: z.object({
1136
1152
  taskRunId: z.string().min(1),
@@ -1141,7 +1157,7 @@ const builtinItemSchemas = [
1141
1157
  ];
1142
1158
  const BoardBuiltinAuthoringItemSchema = z.discriminatedUnion("type", builtinItemSchemas);
1143
1159
  const BoardExtensionAuthoringItemSchema = z.object({
1144
- ...baseFields,
1160
+ ...sizedBaseFields,
1145
1161
  type: extensionTypeSchema,
1146
1162
  kindVersion: z.number().int().positive(),
1147
1163
  props: jsonObjectSchema,
@@ -1153,16 +1169,11 @@ const BoardExtensionAuthoringItemSchema = z.object({
1153
1169
  }).strict().optional()
1154
1170
  }).strict();
1155
1171
  const BoardAuthoringItemSchema = z.union([BoardBuiltinAuthoringItemSchema, BoardExtensionAuthoringItemSchema]);
1156
- const framePatchSchema = z.object({
1157
- x: finiteSchema.optional(),
1158
- y: finiteSchema.optional(),
1159
- width: finiteSchema.positive().optional(),
1160
- height: finiteSchema.positive().optional(),
1161
- rotation: finiteSchema.optional()
1162
- }).strict();
1163
1172
  /** JSON Merge Patch semantics, constrained to the stable Item envelope. */
1164
1173
  const BoardItemPatchSchema = z.object({
1165
- frame: framePatchSchema.optional(),
1174
+ position: BoardAuthoringPositionPatchSchema.optional(),
1175
+ size: BoardAuthoringSizeSchema.nullable().optional(),
1176
+ rotation: finiteSchema.optional(),
1166
1177
  parentId: idSchema.nullable().optional(),
1167
1178
  locked: z.boolean().nullable().optional(),
1168
1179
  props: jsonObjectSchema.optional(),