@neta-art/cohub 11.2.0 → 11.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/board/export/index.js +14 -3
  2. package/dist/board/export/node/fonts.d.ts +13 -0
  3. package/dist/board/export/node/fonts.js +44 -0
  4. package/dist/board/export/node/index.d.ts +4 -10
  5. package/dist/board/export/node/index.js +12 -20
  6. package/dist/board/export/node/scripts.d.ts +1 -0
  7. package/dist/board/export/node/scripts.js +21 -8
  8. package/dist/board/export/scene.js +1 -1
  9. package/dist/board/model/index.d.ts +2 -1
  10. package/dist/board/model/index.js +2 -1
  11. package/dist/board/model/script-api.d.ts +69 -0
  12. package/dist/board/model/script-api.js +77 -0
  13. package/dist/board/render/diagnostics.d.ts +20 -2
  14. package/dist/board/render/diagnostics.js +17 -4
  15. package/dist/board/render/index.d.ts +2 -2
  16. package/dist/board/render/index.js +5 -5
  17. package/dist/board/render/renderers/arrow-card-renderer.js +1 -1
  18. package/dist/board/render/renderers/audio-card-renderer.js +1 -1
  19. package/dist/board/render/renderers/frame-card-renderer.js +1 -1
  20. package/dist/board/render/renderers/shape-card-renderer.js +1 -1
  21. package/dist/board/render/renderers/task-card-renderer.js +1 -1
  22. package/dist/board/render/renderers/text-card-renderer.js +2 -2
  23. package/dist/board/stage/stage.js +3 -3
  24. package/dist/chunks/app-realtime.js +1697 -0
  25. package/dist/chunks/environment.d.ts +1 -0
  26. package/dist/chunks/http.d.ts +346 -3
  27. package/dist/chunks/http.js +32 -1
  28. package/dist/chunks/websocket.d.ts +4 -0
  29. package/dist/chunks/websocket.js +11 -2
  30. package/dist/http.d.ts +1 -1
  31. package/dist/index.d.ts +3 -322
  32. package/dist/index.js +59 -1660
  33. package/dist/protocol/dist/board-model.js +51 -51
  34. package/dist/protocol/dist/board-schema.d.ts +1 -2
  35. package/dist/protocol/dist/board-schema.js +7 -22
  36. package/package.json +1 -1
@@ -2,11 +2,11 @@ import { buildBoardScene } from "../model/scene.js";
2
2
  import { resolveBoardAnimationCamera } from "../model/sampling.js";
3
3
  import { normalizeBoardDocument, planBoardExport } from "../model/export-plan.js";
4
4
  import { parseBoardCssColor } from "../render/css-color.js";
5
+ import { ensureBoardTextMeasurement } from "../render/text-measurement.js";
5
6
  import { defaultBoardPalette } from "../render/palette.js";
6
7
  import { createBoardRenderSampler } from "../render/sampling.js";
7
- import { ensureBoardTextMeasurement } from "../render/text-measurement.js";
8
8
  import { createBoardExportScene } from "./scene.js";
9
- import { Rectangle } from "pixi.js";
9
+ import { Rectangle, RendererType } from "pixi.js";
10
10
  //#region src/board/export/index.ts
11
11
  function resolveBackground(background, palette, document, colorScheme) {
12
12
  if (background === "transparent") return null;
@@ -85,13 +85,24 @@ function renderBoardExport(renderer, input, options = {}) {
85
85
  backgroundImage: options.backgroundImage
86
86
  });
87
87
  try {
88
- const canvas = renderer.extract.canvas({
88
+ const texture = renderer.textureGenerator.generateTexture({
89
89
  target: exportScene.root,
90
90
  frame: new Rectangle(0, 0, plan.width, plan.height),
91
91
  resolution: 1,
92
92
  antialias: true,
93
93
  clearColor: options.background === "transparent" ? void 0 : palette.bg
94
94
  });
95
+ let canvas;
96
+ const surface = renderer.type === RendererType.CANVAS ? texture.source.resource : void 0;
97
+ try {
98
+ canvas = renderer.texture.generateCanvas(texture);
99
+ } finally {
100
+ texture.destroy(true);
101
+ if (surface) {
102
+ surface.width = 1;
103
+ surface.height = 1;
104
+ }
105
+ }
95
106
  const warnings = [];
96
107
  if (plan.clamped) warnings.push({
97
108
  kind: "scale-clamped",
@@ -0,0 +1,13 @@
1
+ //#region src/board/export/node/fonts.d.ts
2
+ type BoardNodeFont = {
3
+ path: string;
4
+ family?: string;
5
+ };
6
+ type BoardFontRegistry = {
7
+ registerFromPath(path: string, family?: string): unknown;
8
+ has(family: string): boolean;
9
+ setAlias?: (family: string, alias: string) => boolean;
10
+ };
11
+ declare function initializeBoardFonts(registry: BoardFontRegistry, fonts: readonly BoardNodeFont[]): void;
12
+ //#endregion
13
+ export { BoardFontRegistry, BoardNodeFont, initializeBoardFonts };
@@ -0,0 +1,44 @@
1
+ //#region src/board/export/node/fonts.ts
2
+ function initializeBoardFonts(registry, fonts) {
3
+ for (const font of fonts) registry.registerFromPath(font.path, font.family);
4
+ if (!registry.setAlias) return;
5
+ for (const [alias, candidates] of Object.entries({
6
+ "system-ui": [
7
+ "Noto Sans",
8
+ "DejaVu Sans",
9
+ "Liberation Sans",
10
+ "FreeSans",
11
+ "Helvetica Neue",
12
+ "Arial",
13
+ "Segoe UI"
14
+ ],
15
+ "sans-serif": [
16
+ "Geist",
17
+ "Noto Sans",
18
+ "DejaVu Sans",
19
+ "Liberation Sans",
20
+ "FreeSans",
21
+ "Arial"
22
+ ],
23
+ serif: [
24
+ "Noto Serif",
25
+ "DejaVu Serif",
26
+ "Liberation Serif",
27
+ "FreeSerif",
28
+ "Times New Roman"
29
+ ],
30
+ monospace: [
31
+ "Geist Mono",
32
+ "DejaVu Sans Mono",
33
+ "Liberation Mono",
34
+ "FreeMono",
35
+ "Courier New"
36
+ ]
37
+ })) {
38
+ if (registry.has(alias)) continue;
39
+ const family = candidates.find((name) => registry.has(name));
40
+ if (family) registry.setAlias(family, alias);
41
+ }
42
+ }
43
+ //#endregion
44
+ export { initializeBoardFonts };
@@ -2,21 +2,14 @@ import { BoardDocument } from "../../../protocol/dist/board-model.js";
2
2
  import "../../../protocol/dist/index.js";
3
3
  import { BoardScriptHost } from "../../render/renderers/board-renderer-registry.js";
4
4
  import { BoardExportOptions, BoardExportResult } from "../index.js";
5
+ import { BoardFontRegistry, BoardNodeFont } from "./fonts.js";
5
6
  import { createNodeBoardScriptHost } from "./scripts.js";
6
7
  import { Renderer } from "pixi.js";
7
8
  //#region src/board/export/node/index.d.ts
8
9
  type NodeCanvasModule = {
9
10
  createCanvas: (width: number, height: number) => unknown;
10
11
  Image: new () => unknown;
11
- GlobalFonts: {
12
- registerFromPath: (path: string, name?: string) => unknown;
13
- has: (name: string) => boolean;
14
- setAlias?: (fontName: string, alias: string) => boolean;
15
- };
16
- };
17
- type BoardNodeFont = {
18
- path: string;
19
- family?: string;
12
+ GlobalFonts: BoardFontRegistry;
20
13
  };
21
14
  type BoardNodeRendererOptions = {
22
15
  fonts?: BoardNodeFont[];
@@ -29,6 +22,7 @@ type BoardNodeTexture = {
29
22
  type BoardNodeRenderer = {
30
23
  renderer: Renderer;
31
24
  canvasModule: NodeCanvasModule;
25
+ fonts?: readonly BoardNodeFont[];
32
26
  decodeImage: (bytes: Uint8Array, mimeType?: string) => Promise<BoardNodeTexture>;
33
27
  destroy: () => void;
34
28
  };
@@ -53,4 +47,4 @@ type BoardNodeExportResult = Omit<BoardExportResult, "canvas"> & {
53
47
  declare function boardImageMimeType(format: BoardNodeExportFormat): string;
54
48
  declare function exportBoardImageBytes(renderer: BoardNodeRenderer, document: BoardDocument, options?: BoardNodeExportOptions): BoardNodeExportResult | null;
55
49
  //#endregion
56
- export { BoardNodeExportFormat, BoardNodeExportOptions, BoardNodeExportResult, BoardNodeFont, BoardNodeRenderer, BoardNodeRendererOptions, BoardNodeTexture, NodeCanvasModule, boardImageMimeType, createNodeBoardRenderer, createNodeBoardScriptHost, exportBoardImageBytes };
50
+ export { BoardNodeExportFormat, BoardNodeExportOptions, BoardNodeExportResult, type BoardNodeFont, BoardNodeRenderer, BoardNodeRendererOptions, BoardNodeTexture, NodeCanvasModule, boardImageMimeType, createNodeBoardRenderer, createNodeBoardScriptHost, exportBoardImageBytes };
@@ -1,23 +1,10 @@
1
1
  import "../../../protocol/dist/board-constants.js";
2
2
  import { installBoardTextMeasurement } from "../../render/text-measurement.js";
3
3
  import { renderBoardExport } from "../index.js";
4
+ import { initializeBoardFonts } from "./fonts.js";
4
5
  import { createNodeBoardScriptHost } from "./scripts.js";
5
6
  import { CanvasGraphicsContextSystem, CanvasGraphicsPipe, CanvasRenderer, CanvasRendererTextSystem, CanvasTextPipe, CanvasTextSystem, DOMAdapter, GraphicsContextSystem, GraphicsPipe, ImageSource, Texture, extensions } from "pixi.js";
6
7
  //#region src/board/export/node/index.ts
7
- const SYSTEM_UI_FAMILIES = [
8
- "Noto Sans",
9
- "DejaVu Sans",
10
- "Liberation Sans",
11
- "FreeSans",
12
- "Helvetica Neue",
13
- "Arial",
14
- "Segoe UI"
15
- ];
16
- function aliasSystemUi(fonts) {
17
- if (!fonts.setAlias || fonts.has("system-ui")) return;
18
- const family = SYSTEM_UI_FAMILIES.find((name) => fonts.has(name));
19
- if (family) fonts.setAlias(family, "system-ui");
20
- }
21
8
  const WEBGL_PROBE_STUB = {
22
9
  getShaderPrecisionFormat: () => ({
23
10
  precision: 1,
@@ -64,8 +51,11 @@ function installAnimationFrameShim() {
64
51
  async function createNodeBoardRenderer(options = {}) {
65
52
  const canvasModule = options.canvasModule ?? await loadCanvasModule();
66
53
  extensions.add(CanvasGraphicsPipe, GraphicsPipe, CanvasGraphicsContextSystem, GraphicsContextSystem, CanvasRendererTextSystem, CanvasTextSystem, CanvasTextPipe);
67
- for (const font of options.fonts ?? []) canvasModule.GlobalFonts.registerFromPath(font.path, font.family ?? "Geist");
68
- aliasSystemUi(canvasModule.GlobalFonts);
54
+ const fonts = (options.fonts ?? []).map((font) => ({
55
+ ...font,
56
+ family: font.family ?? "Geist"
57
+ }));
58
+ initializeBoardFonts(canvasModule.GlobalFonts, fonts);
69
59
  function createCanvas(width = 1, height = 1) {
70
60
  const canvas = canvasModule.createCanvas(Math.max(1, Math.ceil(width)), Math.max(1, Math.ceil(height)));
71
61
  const nativeGetContext = canvas.getContext.bind(canvas);
@@ -102,14 +92,16 @@ async function createNodeBoardRenderer(options = {}) {
102
92
  return {
103
93
  renderer,
104
94
  canvasModule,
105
- decodeImage: async (bytes, mimeType = "image/png") => {
95
+ fonts,
96
+ decodeImage: async (bytes) => {
106
97
  const image = new canvasModule.Image();
107
- const base64 = Buffer.from(bytes).toString("base64");
108
98
  await new Promise((resolve, reject) => {
109
99
  image.onload = () => resolve();
110
100
  image.onerror = (error) => reject(error);
111
- image.src = `data:${mimeType};base64,${base64}`;
101
+ image.src = bytes;
112
102
  });
103
+ image.onload = void 0;
104
+ image.onerror = void 0;
113
105
  return new Texture({ source: new ImageSource({
114
106
  resource: image,
115
107
  width: image.width,
@@ -146,7 +138,7 @@ function exportBoardImageBytes(renderer, document, options = {}) {
146
138
  try {
147
139
  const bytes = format === "png" ? canvas.toBuffer(MIME.png) : canvas.toBuffer(MIME[format], Math.round(quality * 100));
148
140
  return {
149
- bytes: new Uint8Array(bytes),
141
+ bytes: new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength),
150
142
  plan: result.plan,
151
143
  warnings: result.warnings,
152
144
  format
@@ -4,6 +4,7 @@ import { BoardNodeRenderer } from "./index.js";
4
4
  //#region src/board/export/node/scripts.d.ts
5
5
  type BoardNodeScriptOptions = {
6
6
  readModule(src: string): Promise<string>;
7
+ concurrency?: number;
7
8
  timeoutMs?: number;
8
9
  readTimeoutMs?: number;
9
10
  };
@@ -2,13 +2,15 @@ import { boardScriptScope, composeBoardScriptItems } from "../../model/script-sc
2
2
  import { buildBoardScene } from "../../model/scene.js";
3
3
  import { createBoardScriptModuleReader, loadBoardScriptSources } from "../../../protocol/dist/board-script-modules.js";
4
4
  import { createScriptRuntime } from "../../render/script-runtime.js";
5
+ import { initializeBoardFonts } from "./fonts.js";
5
6
  import { Worker } from "node:worker_threads";
6
7
  import { fileURLToPath } from "node:url";
7
8
  //#region src/board/export/node/scripts.ts
8
9
  const WORKER = `
9
10
  const {parentPort, workerData} = require('node:worker_threads');
10
11
  const {createContext, Script, SourceTextModule} = require('node:vm');
11
- const {createCanvas} = require(workerData.canvasModule);
12
+ const {createCanvas, GlobalFonts} = require(workerData.canvasModule);
13
+ (${initializeBoardFonts.toString()})(GlobalFonts, workerData.fonts);
12
14
  const instances = new Map();
13
15
  const graphs = new Map();
14
16
  const update = new Script('__runtime.update(JSON.parse(__inputJson)); __runtime.step(__time)');
@@ -17,7 +19,10 @@ const output = new Script('JSON.stringify(__runtime.output())');
17
19
  const dispose = new Script('__runtime.destroy()');
18
20
  function release(id) {
19
21
  const entry=instances.get(id);instances.delete(id);
20
- if(entry) {try {dispose.runInContext(entry.context,{timeout:workerData.timeout});} catch {}}
22
+ if(entry) {
23
+ try {dispose.runInContext(entry.context,{timeout:workerData.timeout});} catch {}
24
+ if(entry.canvas) {entry.canvas.width=1;entry.canvas.height=1;}
25
+ }
21
26
  }
22
27
  async function create(data) {
23
28
  const context = createContext({console:{log(){},warn(){},error(){}},structuredClone},{codeGeneration:{strings:false,wasm:false}});
@@ -67,22 +72,29 @@ parentPort.on('message',async data=>{
67
72
  const width=Math.max(1,Math.round(data.input.width*data.scale));
68
73
  const height=Math.max(1,Math.round(data.input.height*data.scale));
69
74
  const canvas=entry.canvas??=createCanvas(width,height);
70
- canvas.width=width;canvas.height=height;
71
- const drawing=canvas.getContext('2d');drawing.scale(data.scale,data.scale);
72
- context.__drawing=drawing;draw.runInContext(context,{timeout:workerData.timeout});
73
- png=canvas.toBuffer('image/png');delete context.__drawing;
75
+ if(canvas.width!==width || canvas.height!==height) {canvas.width=width;canvas.height=height;}
76
+ const drawing=canvas.getContext('2d');drawing.reset();drawing.scale(data.scale,data.scale);
77
+ context.__drawing=drawing;
78
+ try {
79
+ draw.runInContext(context,{timeout:workerData.timeout});
80
+ png=canvas.toBuffer('image/png');
81
+ } finally {
82
+ delete context.__drawing;canvas.width=1;canvas.height=1;
83
+ }
74
84
  }
75
85
  parentPort.postMessage({png,output:JSON.parse(output.runInContext(context,{timeout:workerData.timeout}))});
76
- } catch(error) { instances.delete(data.input?.id);parentPort.postMessage({error:String(error.stack||error)}); }
86
+ } catch(error) { release(data.input?.id);parentPort.postMessage({error:String(error.stack||error)}); }
77
87
  });
78
88
  `;
79
89
  function createNodeBoardScriptHost(renderer, options) {
90
+ const concurrency = options.concurrency ?? 4;
91
+ if (!Number.isSafeInteger(concurrency) || concurrency < 1 || concurrency > 4) throw new Error("Script concurrency must be an integer between 1 and 4.");
80
92
  const textures = /* @__PURE__ */ new Map();
81
93
  const outputs = /* @__PURE__ */ new Map();
82
94
  const errors = /* @__PURE__ */ new Map();
83
95
  const sources = /* @__PURE__ */ new Map();
84
96
  const modules = createBoardScriptModuleReader(options.readModule, options.readTimeoutMs);
85
- const lanes = Array.from({ length: 4 }, () => ({
97
+ const lanes = Array.from({ length: concurrency }, () => ({
86
98
  worker: null,
87
99
  tail: Promise.resolve(),
88
100
  graphs: /* @__PURE__ */ new Set()
@@ -123,6 +135,7 @@ function createNodeBoardScriptHost(renderer, options) {
123
135
  workerData: {
124
136
  runtime: createScriptRuntime.toString(),
125
137
  timeout,
138
+ fonts: renderer.fonts ?? [],
126
139
  canvasModule: fileURLToPath(import.meta.resolve("@napi-rs/canvas"))
127
140
  }
128
141
  });
@@ -1,7 +1,7 @@
1
1
  import { buildFallbackShapeColors } from "../model/palette.js";
2
2
  import { imageAssetKey } from "../model/image-key.js";
3
- import { defaultBoardPalette } from "../render/palette.js";
4
3
  import { clippingAncestor, isClippingFrame, syncClipGroup } from "../render/clip.js";
4
+ import { defaultBoardPalette } from "../render/palette.js";
5
5
  import { DEFAULT_BOARD_RENDER_LABELS, getBoardCardRenderer } from "../render/renderers/board-renderer-registry.js";
6
6
  import { resolveBoardRenderStyle } from "../render/style.js";
7
7
  import { Container, Graphics, Sprite, TilingSprite } from "pixi.js";
@@ -13,6 +13,7 @@ import { BoardScriptAnchor, BoardScriptContext, BoardScriptEvent, BoardScriptEve
13
13
  import { boardScriptItems, hasBoardScripts } from "./script-index.js";
14
14
  import { BoardScene, BoardSceneItem, SceneItem, buildBoardScene, orderBoardItems, placeItem, refreshBoardScene, sceneItemToItem, sceneItemsToRecord, toSceneItem } from "./scene.js";
15
15
  import { boardScriptHitVisible, boardScriptTarget, resolveBoardScriptHit } from "./script-hit.js";
16
+ import { BOARD_SCRIPT_API } from "./script-api.js";
16
17
  import { BOARD_SCRIPT_DRAWING_EXAMPLE } from "./script-example.js";
17
18
  import { boardScriptScope, composeBoardScriptItems, prepareBoardScriptOutput, scriptTemporaryPrefix, validateBoardScriptCommit, validateBoardScriptOutput } from "./script-scene.js";
18
19
  import { BoardCameraOverride, BoardColorResolver, BoardEaseFunction, BoardEvaluateOptions, BoardEvaluation, CompiledAnimation, CompiledBoardAnimations, CompiledTrack, applyBoardEvaluation, boardAnimationTime, boardDocumentAt, boardEase, compileBoardAnimations, evaluateBoardAnimations, parseHexColor, sampleBoardTrack } from "./animation.js";
@@ -40,4 +41,4 @@ import "./items/index.js";
40
41
  import { BoardMediaKind, getMediaExtension, getMediaResourceTitle, inferBoardMediaKind } from "./media.js";
41
42
  import { BoardAssetSource, BoardPlayableMedia, playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache, resolveBoardMediaUrl } from "./media-playback.js";
42
43
  import { BoardReplayActorKind, BoardReplayEntry, BoardReplayPlayer, boardReplayActorKind, createBoardReplayPlayer } from "./replay.js";
43
- export { ARROW_BINDING_GAP, ArrowFrameLookup, BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLORS, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, 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_TYPE_PATTERN, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_PRESET_NAMES, BOARD_SCHEMA_TARGETS, BOARD_SCRIPT_DRAWING_EXAMPLE, BOARD_SHAPE_GEOMETRIES, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TASK_SOURCE_PREFIX, BOARD_TEXT_ALIGNS, BoardAnchorSide, BoardAnimation, BoardAnimationHeader, BoardAnimationHeaderSchema, BoardAnimationSampler, BoardAnimationSchema, BoardAppMetadata, BoardApplyOptions, BoardArrowAnchor, BoardArrowAnchorSchema, BoardArrowBinding, BoardArrowBindingSchema, BoardArrowEnd, BoardArrowEndSchema, BoardArrowItem, BoardArrowItemSchema, BoardArrowRoute, BoardAssetSource, BoardAudioItem, BoardAudioItemSchema, BoardBackgroundSchema, BoardBuiltinItem, BoardBuiltinItemType, BoardCameraFit, BoardCameraFocus, BoardCameraOverride, BoardCameraState, BoardChapter, BoardColor, BoardColorEntry, BoardColorId, BoardColorResolver, BoardColorSchema, BoardColorToken, BoardColorValue, BoardCropSchema, BoardCustomItem, BoardCustomItemSchema, BoardDash, BoardDelta, BoardDiagnostic, BoardDocument, BoardDrawInputSample, BoardDrawItem, BoardDrawItemSchema, BoardDrawPoint, BoardDrawPointSchema, BoardEaseFunction, BoardEaseSchema, BoardEffectItem, BoardEffectItemSchema, BoardEffectKind, BoardEnterPreset, BoardEvaluateOptions, BoardEvaluation, BoardExportAssetSelection, BoardExportPlan, BoardExportPlanInput, BoardExportRegion, BoardExtensionItem, BoardExtensionItemSchema, BoardFileBackedItem, BoardFileItem, BoardFileItemSchema, type BoardFileSnapshotFacts, BoardFrame, BoardFrameItem, BoardFrameItemSchema, BoardIdSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemCapabilities, BoardItemDefinition, BoardItemEntry, BoardItemInput, BoardItemLookup, BoardItemOf, BoardItemResizeMode, BoardItemType, BoardKeySchema, BoardKeyframe, BoardKeyframeSchema, BoardLayout, BoardMarker, BoardMarkerSchema, BoardMatrix, BoardMediaItemKind, BoardMediaKind, BoardMediaOrigin, BoardMediaOriginSchema, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardMediaSource, BoardMediaSourceSchema, BoardNestedAnimationOptions, BoardNormalizedPoint, BoardPatch, BoardPatchResult, BoardPatchSchema, BoardPlacement, BoardPlayMode, BoardPlayableMedia, BoardPresetName, BoardPresetOptions, BoardPropertySpec, BoardRect, BoardRegistry, BoardReplayActorKind, BoardReplayEntry, BoardReplayPlayer, BoardScene, BoardSceneItem, BoardScreenOffset, BoardScreenPoint, BoardScript, BoardScriptAnchor, BoardScriptContext, BoardScriptEvent, BoardScriptEventOf, BoardScriptFrame, BoardScriptHit, BoardScriptHostEvents, BoardScriptItemPatch, BoardScriptModule, BoardScriptOutput, BoardScriptParameter, BoardScriptSceneOptions, BoardScriptSchema, BoardScriptSnapshot, BoardScriptView, BoardSettings, BoardSettingsSchema, BoardShapeColors, BoardShapeGeometry, BoardShapeItem, BoardShapeItemSchema, BoardSize, BoardSizeSchema, BoardState, BoardStyle, BoardStyleSchema, BoardStyledToolId, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, type BoardTaskRunSource, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardTextLayout, BoardTextMeasurer, BoardToolStyleMap, BoardToolStylePatch, BoardTrack, BoardTrackSchema, BoardValueKind, BoardVec2, BoardVec2Schema, BoardVideoItem, BoardVideoItemSchema, BoardViewport, BoardWorldOffset, BoardWorldPoint, BoardWorldRect, type BuildSnapshotInput, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, CompiledAnimation, CompiledBoardAnimations, CompiledTrack, CornerResizeHandle, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_TOOL_STYLES, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, FileAvailability, type FileCategory, FilePreviewKind, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, IDENTITY_MATRIX, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, Point, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, Rect, ResizeHandle, ResolvedArrow, ResolvedArrowEnd, type ResolvedCover, SHAPE_KINDS, SceneItem, ScreenPoint, ShapeKind, Size, StrokeRibbonBuilder, StrokeRibbonGeometry, StrokeRibbonMesh, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, VIEWPORT_MARGIN_RATIO, WorldPoint, anchorPoint, angleFromCenter, appendBoardDrawSamples, applyBoardDelta, applyBoardEvaluation, applyBoardPatch, applyBoardPatchToDocument, applyMatrix, arrowBindings, arrowHitRadius, arrowPathBounds, autoAnchorSide, availabilityFromError, bendControl, boardAnimationTime, boardColorCssVar, boardDocumentAt, boardEase, boardFontFamily, boardImageKeySource, boardItemOrigin, boardItemSchema, boardJsonSchema, boardNestedAnimation, boardNestedAnimationTrack, boardOriginKey, boardPatchTouches, boardPathTrack, boardPresetTracks, boardReplayActorKind, boardSchemaOverview, boardScriptHitVisible, boardScriptItems, boardScriptScope, boardScriptTarget, boardSequence, boardSequencePatch, boardTaskSource, buildBoardScene, buildCodeExcerpt, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, builtinBoardItems, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardFontSize, clampBoardStrokeSize, clampBoardFontSize as clampBoardTextFontSize, clampZoom, compileBoardAnimations, composeBoardScriptItems, computeDrawBounds, createAppBoardItem, createArrowBoardItem, createBoardAnimationSampler, createBoardEntityId, createBoardItemId, createBoardLayout, createBoardRegistry, createBoardReplayPlayer, createBoardToolStyles, createDocumentLayout, createDocumentState, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createStrokeRibbonBuilder, createTaskBoardItem, createTaskResultItems, createTextBoardItem, defaultBoardRegistry, defineBoardItem, degToRad, diffBoardDocuments, diffMergePatch, distanceToArrow, distanceToStroke, drawPointsBounds, drawSampleRadius, emptyBoardDocument, estimateTextWidth, evaluateBoardAnimations, expandRect, exportItemBounds, featuredTaskArtifact, fileBaseName, fileCategory, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileStem, fileTypeLabel, fitToContent, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, framePoint, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, handlePosition, hasAuthoredSize, hasBoardScripts, imageAssetKey, inferBoardMediaKind, invertMatrix, isArrowBinding, isBoardColorId, isBoardColorString, isBoardEase, isBoardPath, isBoardPresetName, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isEmptyBoardPatch, isFileBackedItem, isFileSnapshotFresh, isMediaItem, isPublicBoardRemoteAddress, isSafeBoardSourcePath, isShapeKind, isStrokeCorner, itemBounds, layoutBoardText, listBoardPresets, listBoardProperties, mediaFrameSize, mergeFileSnapshot, mergePatch, multiplyMatrix, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, orderBoardItems, panBy, parseBoardDocument, parseBoardItem, parseBoardManifest, parseBoardMediaSource, parseHexColor, pathMidpoint, pathPointAt, pickBoardColor, placeBoardOverlay, placeItem, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, pointsRect, prepareBoardScriptOutput, pruneBoardTrack, quantizeDrawCoordinate, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readFrontmatterScalars, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, refreshBoardScene, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resolveAnchor, resolveArrow, resolveBoardAnimationCamera, resolveBoardColor, resolveBoardMediaUrl, resolveBoardProperty, resolveBoardScriptHit, resolveCoverRef, resolveFileTitle, resolveItemColor, resolveSceneArrow, resolveSpacePath, rotateAround, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleBoardTrack, sampleRadius, scaleFrames, scaleVector, sceneItemToItem, sceneItemsToRecord, screenOffset, screenPoint, screenToWorld, scriptTemporaryPrefix, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shouldFetchFileExcerpt, sideAnchor, simplifyDrawIndices, splitFrontmatter, stableCullRect, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, titleForBoardItem, toSceneItem, trackReferences, trimDrawPoints, unionRects, validateBoardScriptCommit, validateBoardScriptOutput, visibleWorldRect, withObservedArtifactFacts, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround };
44
+ export { ARROW_BINDING_GAP, ArrowFrameLookup, BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLORS, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, 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_TYPE_PATTERN, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_PRESET_NAMES, BOARD_SCHEMA_TARGETS, BOARD_SCRIPT_API, BOARD_SCRIPT_DRAWING_EXAMPLE, BOARD_SHAPE_GEOMETRIES, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TASK_SOURCE_PREFIX, BOARD_TEXT_ALIGNS, BoardAnchorSide, BoardAnimation, BoardAnimationHeader, BoardAnimationHeaderSchema, BoardAnimationSampler, BoardAnimationSchema, BoardAppMetadata, BoardApplyOptions, BoardArrowAnchor, BoardArrowAnchorSchema, BoardArrowBinding, BoardArrowBindingSchema, BoardArrowEnd, BoardArrowEndSchema, BoardArrowItem, BoardArrowItemSchema, BoardArrowRoute, BoardAssetSource, BoardAudioItem, BoardAudioItemSchema, BoardBackgroundSchema, BoardBuiltinItem, BoardBuiltinItemType, BoardCameraFit, BoardCameraFocus, BoardCameraOverride, BoardCameraState, BoardChapter, BoardColor, BoardColorEntry, BoardColorId, BoardColorResolver, BoardColorSchema, BoardColorToken, BoardColorValue, BoardCropSchema, BoardCustomItem, BoardCustomItemSchema, BoardDash, BoardDelta, BoardDiagnostic, BoardDocument, BoardDrawInputSample, BoardDrawItem, BoardDrawItemSchema, BoardDrawPoint, BoardDrawPointSchema, BoardEaseFunction, BoardEaseSchema, BoardEffectItem, BoardEffectItemSchema, BoardEffectKind, BoardEnterPreset, BoardEvaluateOptions, BoardEvaluation, BoardExportAssetSelection, BoardExportPlan, BoardExportPlanInput, BoardExportRegion, BoardExtensionItem, BoardExtensionItemSchema, BoardFileBackedItem, BoardFileItem, BoardFileItemSchema, type BoardFileSnapshotFacts, BoardFrame, BoardFrameItem, BoardFrameItemSchema, BoardIdSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemCapabilities, BoardItemDefinition, BoardItemEntry, BoardItemInput, BoardItemLookup, BoardItemOf, BoardItemResizeMode, BoardItemType, BoardKeySchema, BoardKeyframe, BoardKeyframeSchema, BoardLayout, BoardMarker, BoardMarkerSchema, BoardMatrix, BoardMediaItemKind, BoardMediaKind, BoardMediaOrigin, BoardMediaOriginSchema, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardMediaSource, BoardMediaSourceSchema, BoardNestedAnimationOptions, BoardNormalizedPoint, BoardPatch, BoardPatchResult, BoardPatchSchema, BoardPlacement, BoardPlayMode, BoardPlayableMedia, BoardPresetName, BoardPresetOptions, BoardPropertySpec, BoardRect, BoardRegistry, BoardReplayActorKind, BoardReplayEntry, BoardReplayPlayer, BoardScene, BoardSceneItem, BoardScreenOffset, BoardScreenPoint, BoardScript, BoardScriptAnchor, BoardScriptContext, BoardScriptEvent, BoardScriptEventOf, BoardScriptFrame, BoardScriptHit, BoardScriptHostEvents, BoardScriptItemPatch, BoardScriptModule, BoardScriptOutput, BoardScriptParameter, BoardScriptSceneOptions, BoardScriptSchema, BoardScriptSnapshot, BoardScriptView, BoardSettings, BoardSettingsSchema, BoardShapeColors, BoardShapeGeometry, BoardShapeItem, BoardShapeItemSchema, BoardSize, BoardSizeSchema, BoardState, BoardStyle, BoardStyleSchema, BoardStyledToolId, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, type BoardTaskRunSource, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardTextLayout, BoardTextMeasurer, BoardToolStyleMap, BoardToolStylePatch, BoardTrack, BoardTrackSchema, BoardValueKind, BoardVec2, BoardVec2Schema, BoardVideoItem, BoardVideoItemSchema, BoardViewport, BoardWorldOffset, BoardWorldPoint, BoardWorldRect, type BuildSnapshotInput, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, CompiledAnimation, CompiledBoardAnimations, CompiledTrack, CornerResizeHandle, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_TOOL_STYLES, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, FileAvailability, type FileCategory, FilePreviewKind, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, IDENTITY_MATRIX, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, Point, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, Rect, ResizeHandle, ResolvedArrow, ResolvedArrowEnd, type ResolvedCover, SHAPE_KINDS, SceneItem, ScreenPoint, ShapeKind, Size, StrokeRibbonBuilder, StrokeRibbonGeometry, StrokeRibbonMesh, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, VIEWPORT_MARGIN_RATIO, WorldPoint, anchorPoint, angleFromCenter, appendBoardDrawSamples, applyBoardDelta, applyBoardEvaluation, applyBoardPatch, applyBoardPatchToDocument, applyMatrix, arrowBindings, arrowHitRadius, arrowPathBounds, autoAnchorSide, availabilityFromError, bendControl, boardAnimationTime, boardColorCssVar, boardDocumentAt, boardEase, boardFontFamily, boardImageKeySource, boardItemOrigin, boardItemSchema, boardJsonSchema, boardNestedAnimation, boardNestedAnimationTrack, boardOriginKey, boardPatchTouches, boardPathTrack, boardPresetTracks, boardReplayActorKind, boardSchemaOverview, boardScriptHitVisible, boardScriptItems, boardScriptScope, boardScriptTarget, boardSequence, boardSequencePatch, boardTaskSource, buildBoardScene, buildCodeExcerpt, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, builtinBoardItems, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardFontSize, clampBoardStrokeSize, clampBoardFontSize as clampBoardTextFontSize, clampZoom, compileBoardAnimations, composeBoardScriptItems, computeDrawBounds, createAppBoardItem, createArrowBoardItem, createBoardAnimationSampler, createBoardEntityId, createBoardItemId, createBoardLayout, createBoardRegistry, createBoardReplayPlayer, createBoardToolStyles, createDocumentLayout, createDocumentState, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createStrokeRibbonBuilder, createTaskBoardItem, createTaskResultItems, createTextBoardItem, defaultBoardRegistry, defineBoardItem, degToRad, diffBoardDocuments, diffMergePatch, distanceToArrow, distanceToStroke, drawPointsBounds, drawSampleRadius, emptyBoardDocument, estimateTextWidth, evaluateBoardAnimations, expandRect, exportItemBounds, featuredTaskArtifact, fileBaseName, fileCategory, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileStem, fileTypeLabel, fitToContent, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, framePoint, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, handlePosition, hasAuthoredSize, hasBoardScripts, imageAssetKey, inferBoardMediaKind, invertMatrix, isArrowBinding, isBoardColorId, isBoardColorString, isBoardEase, isBoardPath, isBoardPresetName, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isEmptyBoardPatch, isFileBackedItem, isFileSnapshotFresh, isMediaItem, isPublicBoardRemoteAddress, isSafeBoardSourcePath, isShapeKind, isStrokeCorner, itemBounds, layoutBoardText, listBoardPresets, listBoardProperties, mediaFrameSize, mergeFileSnapshot, mergePatch, multiplyMatrix, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, orderBoardItems, panBy, parseBoardDocument, parseBoardItem, parseBoardManifest, parseBoardMediaSource, parseHexColor, pathMidpoint, pathPointAt, pickBoardColor, placeBoardOverlay, placeItem, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, pointsRect, prepareBoardScriptOutput, pruneBoardTrack, quantizeDrawCoordinate, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readFrontmatterScalars, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, refreshBoardScene, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resolveAnchor, resolveArrow, resolveBoardAnimationCamera, resolveBoardColor, resolveBoardMediaUrl, resolveBoardProperty, resolveBoardScriptHit, resolveCoverRef, resolveFileTitle, resolveItemColor, resolveSceneArrow, resolveSpacePath, rotateAround, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleBoardTrack, sampleRadius, scaleFrames, scaleVector, sceneItemToItem, sceneItemsToRecord, screenOffset, screenPoint, screenToWorld, scriptTemporaryPrefix, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shouldFetchFileExcerpt, sideAnchor, simplifyDrawIndices, splitFrontmatter, stableCullRect, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, titleForBoardItem, toSceneItem, trackReferences, trimDrawPoints, unionRects, validateBoardScriptCommit, validateBoardScriptOutput, visibleWorldRect, withObservedArtifactFacts, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround };
@@ -11,6 +11,7 @@ import { boardScriptItems, hasBoardScripts } from "./script-index.js";
11
11
  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, stableCullRect, unionRects, visibleWorldRect, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround } from "./geometry.js";
12
12
  import { boardScriptScope, composeBoardScriptItems, prepareBoardScriptOutput, scriptTemporaryPrefix, validateBoardScriptCommit, validateBoardScriptOutput } from "./script-scene.js";
13
13
  import { boardScriptHitVisible, boardScriptTarget, resolveBoardScriptHit } from "./script-hit.js";
14
+ import { BOARD_SCRIPT_API } from "./script-api.js";
14
15
  import { BOARD_SCRIPT_DRAWING_EXAMPLE } from "./script-example.js";
15
16
  import { applyBoardEvaluation, boardAnimationTime, boardDocumentAt, boardEase, compileBoardAnimations, evaluateBoardAnimations, parseHexColor, sampleBoardTrack } from "./animation.js";
16
17
  import { buildBoardScene, orderBoardItems, placeItem, refreshBoardScene, sceneItemToItem, sceneItemsToRecord, toSceneItem } from "./scene.js";
@@ -37,4 +38,4 @@ import { boardItemOrigin, boardOriginKey, createAppBoardItem, createArrowBoardIt
37
38
  import { createBoardRegistry, defaultBoardRegistry } from "./items/registry.js";
38
39
  import { playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache, resolveBoardMediaUrl } from "./media-playback.js";
39
40
  import { boardReplayActorKind, createBoardReplayPlayer } from "./replay.js";
40
- export { ARROW_BINDING_GAP, BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLORS, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, 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_TYPE_PATTERN, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_PRESET_NAMES, BOARD_SCHEMA_TARGETS, BOARD_SCRIPT_DRAWING_EXAMPLE, BOARD_SHAPE_GEOMETRIES, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TASK_SOURCE_PREFIX, BOARD_TEXT_ALIGNS, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchorSchema, BoardArrowBindingSchema, BoardArrowEndSchema, BoardArrowItemSchema, BoardAudioItemSchema, BoardBackgroundSchema, BoardColorSchema, BoardCropSchema, BoardCustomItemSchema, BoardDrawItemSchema, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItemSchema, BoardExtensionItemSchema, BoardFileItemSchema, BoardFrameItemSchema, BoardIdSchema, BoardImageItemSchema, BoardKeySchema, BoardKeyframeSchema, BoardMarkerSchema, BoardMediaOriginSchema, BoardMediaSnapshotSchema, BoardMediaSourceSchema, BoardPatchSchema, BoardScriptSchema, BoardSettingsSchema, BoardShapeItemSchema, BoardSizeSchema, BoardStyleSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardTrackSchema, BoardVec2Schema, BoardVideoItemSchema, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_TOOL_STYLES, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, IDENTITY_MATRIX, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, SHAPE_KINDS, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, VIEWPORT_MARGIN_RATIO, anchorPoint, angleFromCenter, appendBoardDrawSamples, applyBoardDelta, applyBoardEvaluation, applyBoardPatch, applyBoardPatchToDocument, applyMatrix, arrowBindings, arrowHitRadius, arrowPathBounds, autoAnchorSide, availabilityFromError, bendControl, boardAnimationTime, boardColorCssVar, boardDocumentAt, boardEase, boardFontFamily, boardImageKeySource, boardItemOrigin, boardItemSchema, boardJsonSchema, boardNestedAnimation, boardNestedAnimationTrack, boardOriginKey, boardPatchTouches, boardPathTrack, boardPresetTracks, boardReplayActorKind, boardSchemaOverview, boardScriptHitVisible, boardScriptItems, boardScriptScope, boardScriptTarget, boardSequence, boardSequencePatch, boardTaskSource, buildBoardScene, buildCodeExcerpt, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, builtinBoardItems, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardFontSize, clampBoardStrokeSize, clampBoardFontSize as clampBoardTextFontSize, clampZoom, compileBoardAnimations, composeBoardScriptItems, computeDrawBounds, createAppBoardItem, createArrowBoardItem, createBoardAnimationSampler, createBoardEntityId, createBoardItemId, createBoardLayout, createBoardRegistry, createBoardReplayPlayer, createBoardToolStyles, createDocumentLayout, createDocumentState, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createStrokeRibbonBuilder, createTaskBoardItem, createTaskResultItems, createTextBoardItem, defaultBoardRegistry, defineBoardItem, degToRad, diffBoardDocuments, diffMergePatch, distanceToArrow, distanceToStroke, drawPointsBounds, drawSampleRadius, emptyBoardDocument, estimateTextWidth, evaluateBoardAnimations, expandRect, exportItemBounds, featuredTaskArtifact, fileBaseName, fileCategory, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileStem, fileTypeLabel, fitToContent, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, framePoint, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, handlePosition, hasAuthoredSize, hasBoardScripts, imageAssetKey, inferBoardMediaKind, invertMatrix, isArrowBinding, isBoardColorId, isBoardColorString, isBoardEase, isBoardPath, isBoardPresetName, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isEmptyBoardPatch, isFileBackedItem, isFileSnapshotFresh, isMediaItem, isPublicBoardRemoteAddress, isSafeBoardSourcePath, isShapeKind, isStrokeCorner, itemBounds, layoutBoardText, listBoardPresets, listBoardProperties, mediaFrameSize, mergeFileSnapshot, mergePatch, multiplyMatrix, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, orderBoardItems, panBy, parseBoardDocument, parseBoardItem, parseBoardManifest, parseBoardMediaSource, parseHexColor, pathMidpoint, pathPointAt, pickBoardColor, placeBoardOverlay, placeItem, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, pointsRect, prepareBoardScriptOutput, pruneBoardTrack, quantizeDrawCoordinate, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readFrontmatterScalars, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, refreshBoardScene, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resolveAnchor, resolveArrow, resolveBoardAnimationCamera, resolveBoardColor, resolveBoardMediaUrl, resolveBoardProperty, resolveBoardScriptHit, resolveCoverRef, resolveFileTitle, resolveItemColor, resolveSceneArrow, resolveSpacePath, rotateAround, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleBoardTrack, sampleRadius, scaleFrames, scaleVector, sceneItemToItem, sceneItemsToRecord, screenOffset, screenPoint, screenToWorld, scriptTemporaryPrefix, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shouldFetchFileExcerpt, sideAnchor, simplifyDrawIndices, splitFrontmatter, stableCullRect, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, titleForBoardItem, toSceneItem, trackReferences, trimDrawPoints, unionRects, validateBoardScriptCommit, validateBoardScriptOutput, visibleWorldRect, withObservedArtifactFacts, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround };
41
+ export { ARROW_BINDING_GAP, BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLORS, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, 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_TYPE_PATTERN, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_PRESET_NAMES, BOARD_SCHEMA_TARGETS, BOARD_SCRIPT_API, BOARD_SCRIPT_DRAWING_EXAMPLE, BOARD_SHAPE_GEOMETRIES, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TASK_SOURCE_PREFIX, BOARD_TEXT_ALIGNS, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchorSchema, BoardArrowBindingSchema, BoardArrowEndSchema, BoardArrowItemSchema, BoardAudioItemSchema, BoardBackgroundSchema, BoardColorSchema, BoardCropSchema, BoardCustomItemSchema, BoardDrawItemSchema, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItemSchema, BoardExtensionItemSchema, BoardFileItemSchema, BoardFrameItemSchema, BoardIdSchema, BoardImageItemSchema, BoardKeySchema, BoardKeyframeSchema, BoardMarkerSchema, BoardMediaOriginSchema, BoardMediaSnapshotSchema, BoardMediaSourceSchema, BoardPatchSchema, BoardScriptSchema, BoardSettingsSchema, BoardShapeItemSchema, BoardSizeSchema, BoardStyleSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardTrackSchema, BoardVec2Schema, BoardVideoItemSchema, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_TOOL_STYLES, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, IDENTITY_MATRIX, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, SHAPE_KINDS, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, VIEWPORT_MARGIN_RATIO, anchorPoint, angleFromCenter, appendBoardDrawSamples, applyBoardDelta, applyBoardEvaluation, applyBoardPatch, applyBoardPatchToDocument, applyMatrix, arrowBindings, arrowHitRadius, arrowPathBounds, autoAnchorSide, availabilityFromError, bendControl, boardAnimationTime, boardColorCssVar, boardDocumentAt, boardEase, boardFontFamily, boardImageKeySource, boardItemOrigin, boardItemSchema, boardJsonSchema, boardNestedAnimation, boardNestedAnimationTrack, boardOriginKey, boardPatchTouches, boardPathTrack, boardPresetTracks, boardReplayActorKind, boardSchemaOverview, boardScriptHitVisible, boardScriptItems, boardScriptScope, boardScriptTarget, boardSequence, boardSequencePatch, boardTaskSource, buildBoardScene, buildCodeExcerpt, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, builtinBoardItems, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardFontSize, clampBoardStrokeSize, clampBoardFontSize as clampBoardTextFontSize, clampZoom, compileBoardAnimations, composeBoardScriptItems, computeDrawBounds, createAppBoardItem, createArrowBoardItem, createBoardAnimationSampler, createBoardEntityId, createBoardItemId, createBoardLayout, createBoardRegistry, createBoardReplayPlayer, createBoardToolStyles, createDocumentLayout, createDocumentState, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createStrokeRibbonBuilder, createTaskBoardItem, createTaskResultItems, createTextBoardItem, defaultBoardRegistry, defineBoardItem, degToRad, diffBoardDocuments, diffMergePatch, distanceToArrow, distanceToStroke, drawPointsBounds, drawSampleRadius, emptyBoardDocument, estimateTextWidth, evaluateBoardAnimations, expandRect, exportItemBounds, featuredTaskArtifact, fileBaseName, fileCategory, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileStem, fileTypeLabel, fitToContent, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, framePoint, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, handlePosition, hasAuthoredSize, hasBoardScripts, imageAssetKey, inferBoardMediaKind, invertMatrix, isArrowBinding, isBoardColorId, isBoardColorString, isBoardEase, isBoardPath, isBoardPresetName, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isEmptyBoardPatch, isFileBackedItem, isFileSnapshotFresh, isMediaItem, isPublicBoardRemoteAddress, isSafeBoardSourcePath, isShapeKind, isStrokeCorner, itemBounds, layoutBoardText, listBoardPresets, listBoardProperties, mediaFrameSize, mergeFileSnapshot, mergePatch, multiplyMatrix, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, orderBoardItems, panBy, parseBoardDocument, parseBoardItem, parseBoardManifest, parseBoardMediaSource, parseHexColor, pathMidpoint, pathPointAt, pickBoardColor, placeBoardOverlay, placeItem, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, pointsRect, prepareBoardScriptOutput, pruneBoardTrack, quantizeDrawCoordinate, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readFrontmatterScalars, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, refreshBoardScene, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resolveAnchor, resolveArrow, resolveBoardAnimationCamera, resolveBoardColor, resolveBoardMediaUrl, resolveBoardProperty, resolveBoardScriptHit, resolveCoverRef, resolveFileTitle, resolveItemColor, resolveSceneArrow, resolveSpacePath, rotateAround, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleBoardTrack, sampleRadius, scaleFrames, scaleVector, sceneItemToItem, sceneItemsToRecord, screenOffset, screenPoint, screenToWorld, scriptTemporaryPrefix, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shouldFetchFileExcerpt, sideAnchor, simplifyDrawIndices, splitFrontmatter, stableCullRect, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, titleForBoardItem, toSceneItem, trackReferences, trimDrawPoints, unionRects, validateBoardScriptCommit, validateBoardScriptOutput, visibleWorldRect, withObservedArtifactFacts, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround };
@@ -0,0 +1,69 @@
1
+ //#region src/board/model/script-api.d.ts
2
+ /**
3
+ * A compact reference for Board script authors, printed by `cohub boards schema script`.
4
+ * Each group is checked against its type, so a new member fails to compile until it is described.
5
+ */
6
+ declare const BOARD_SCRIPT_API: {
7
+ readonly runtime: readonly ["Modules are .js or .mjs Space files that import only literal relative paths (at most 64 modules, 2 MB).", "They run in a worker with no DOM or network. Use Apps for HTML content.", "Exports replay deterministically from ctx.onFrame, the frame clock, ctx.random() and ctx.state; timers, Date.now() and Math.random() do not."];
8
+ readonly module: {
9
+ draw: string;
10
+ animated: string;
11
+ parameters: string;
12
+ default: string;
13
+ };
14
+ readonly frame: {
15
+ t: string;
16
+ dt: string;
17
+ width: string;
18
+ height: string;
19
+ seed: string;
20
+ params: string;
21
+ state: string;
22
+ };
23
+ readonly context: {
24
+ self: string;
25
+ params: string;
26
+ targets: string;
27
+ state: string;
28
+ frame: string;
29
+ view: string;
30
+ random: string;
31
+ on: string;
32
+ onFrame: string;
33
+ onDispose: string;
34
+ invalidate: string;
35
+ get: string;
36
+ present: string;
37
+ scene: string;
38
+ hitRegions: string;
39
+ emit: string;
40
+ commit: string;
41
+ capabilities: string;
42
+ };
43
+ readonly scope: "The owner, a Frame owner's descendants, and script.targets.";
44
+ readonly hitRegions: {
45
+ readonly forms: readonly ["{ target: \"self\" }: the owner.", "{ item: id }: a scene item.", "{ x, y, width, height }: a rectangle in owner coordinates."];
46
+ readonly options: "label (also a keyboard focus target) and cursor.";
47
+ readonly rule: "Only declared regions receive input; everything else passes through to the Board. Event target is the region's key.";
48
+ };
49
+ readonly sceneOptions: {
50
+ space: string;
51
+ anchor: string;
52
+ };
53
+ readonly events: {
54
+ readonly input: "pointerenter, pointerleave, pointerdown, pointermove, pointerup, pointercancel, click, focus, blur, keydown, keyup. Pointer events carry point in owner coordinates; key events carry key.";
55
+ readonly host: {
56
+ selectionchange: string;
57
+ transformend: string;
58
+ viewchange: string;
59
+ };
60
+ };
61
+ readonly view: {
62
+ camera: string;
63
+ width: string;
64
+ height: string;
65
+ safeRect: string;
66
+ };
67
+ };
68
+ //#endregion
69
+ export { BOARD_SCRIPT_API };
@@ -0,0 +1,77 @@
1
+ //#region src/board/model/script-api.ts
2
+ /**
3
+ * A compact reference for Board script authors, printed by `cohub boards schema script`.
4
+ * Each group is checked against its type, so a new member fails to compile until it is described.
5
+ */
6
+ const BOARD_SCRIPT_API = {
7
+ runtime: [
8
+ "Modules are .js or .mjs Space files that import only literal relative paths (at most 64 modules, 2 MB).",
9
+ "They run in a worker with no DOM or network. Use Apps for HTML content.",
10
+ "Exports replay deterministically from ctx.onFrame, the frame clock, ctx.random() and ctx.state; timers, Date.now() and Math.random() do not."
11
+ ],
12
+ module: {
13
+ draw: "draw(ctx, frame): synchronous Canvas 2D drawing in item-local units.",
14
+ animated: "true redraws every frame; otherwise draw runs when its inputs change or after invalidate().",
15
+ parameters: "Declares params as { name: { type: number | boolean | string | color, label?, default?, min?, max?, step? } }.",
16
+ default: "Setup function (ctx) for behavior; may return a cleanup function."
17
+ },
18
+ frame: {
19
+ t: "Clock time in milliseconds.",
20
+ dt: "Milliseconds since the previous frame.",
21
+ width: "Item width in board units.",
22
+ height: "Item height in board units.",
23
+ seed: "script.seed, or the item id.",
24
+ params: "script.params merged over parameter defaults.",
25
+ state: "ctx.state."
26
+ },
27
+ context: {
28
+ self: "The owner: id, base (its authored item) and present(patch | null).",
29
+ params: "script.params merged over parameter defaults.",
30
+ targets: "script.targets: names mapped to item ids.",
31
+ state: "Mutable state kept across frames and restored in exports.",
32
+ frame: "The latest frame.",
33
+ view: "Camera, width, height and safeRect in screen pixels; null until a viewchange.",
34
+ random: "random(): a seeded number in [0, 1).",
35
+ on: "on(type, handler): input and host events; returns an unsubscribe function.",
36
+ onFrame: "onFrame(handler): a 60 Hz fixed step; returns an unsubscribe function.",
37
+ onDispose: "onDispose(handler): cleanup when the instance stops.",
38
+ invalidate: "invalidate(): redraw a non-animated draw().",
39
+ get: "get(id): an item in scope, as authored.",
40
+ present: "present(id, patch | null): temporarily override an item in scope; never saved.",
41
+ scene: "scene(items, options?): replace this instance's temporary Board items; never saved.",
42
+ hitRegions: "hitRegions(regions): replace the input declarations.",
43
+ emit: "emit(id, type, data?): send a custom event to another scripted item in scope.",
44
+ commit: "commit(patch): save a Board patch through history and permissions; it may edit items in scope or add children to a scoped frame.",
45
+ capabilities: "has(name) and call(name, input?) for adapters the host provides."
46
+ },
47
+ scope: "The owner, a Frame owner's descendants, and script.targets.",
48
+ hitRegions: {
49
+ forms: [
50
+ "{ target: \"self\" }: the owner.",
51
+ "{ item: id }: a scene item.",
52
+ "{ x, y, width, height }: a rectangle in owner coordinates."
53
+ ],
54
+ options: "label (also a keyboard focus target) and cursor.",
55
+ rule: "Only declared regions receive input; everything else passes through to the Board. Event target is the region's key."
56
+ },
57
+ sceneOptions: {
58
+ space: "world (default) follows the owner's transform; screen keeps screen-pixel size and is left out of exports.",
59
+ anchor: "{ item, point }: pin a screen scene to an item, point in 0–1 box coordinates."
60
+ },
61
+ events: {
62
+ input: "pointerenter, pointerleave, pointerdown, pointermove, pointerup, pointercancel, click, focus, blur, keydown, keyup. Pointer events carry point in owner coordinates; key events carry key.",
63
+ host: {
64
+ selectionchange: "data.ids: selected items in scope.",
65
+ transformend: "data.ids, data.operation (move | resize | rotate | arrow), data.cancelled.",
66
+ viewchange: "data: the view; also stored in ctx.view."
67
+ }
68
+ },
69
+ view: {
70
+ camera: "x, y and zoom.",
71
+ width: "Viewport width in screen pixels.",
72
+ height: "Viewport height in screen pixels.",
73
+ safeRect: "The viewport area not covered by editor chrome."
74
+ }
75
+ };
76
+ //#endregion
77
+ export { BOARD_SCRIPT_API };
@@ -1,5 +1,7 @@
1
1
  import { BoardTextItem } from "../../protocol/dist/board-model.js";
2
+ import { BoardFrame } from "../../protocol/dist/board-layout.js";
2
3
  import "../../protocol/dist/index.js";
4
+ import { Rect } from "../model/geometry.js";
3
5
  import { BoardScene } from "../model/scene.js";
4
6
  //#region src/board/render/diagnostics.d.ts
5
7
  type BoardRenderDiagnostic = {
@@ -15,6 +17,22 @@ declare function measureBoardText(props: BoardTextItem["props"]): {
15
17
  lineHeight: number;
16
18
  missingCharacters: string;
17
19
  };
18
- declare function inspectBoardScene(scene: BoardScene, limit?: number): BoardRenderDiagnostic[];
20
+ declare function inspectBoardItems(scene: BoardScene, ids?: ReadonlySet<string>): {
21
+ diagnostics: BoardRenderDiagnostic[];
22
+ items: {
23
+ id: string;
24
+ bounds: BoardFrame;
25
+ worldBounds: Rect;
26
+ opacity: number;
27
+ text?: {
28
+ width: number;
29
+ height: number;
30
+ lines: string[];
31
+ lineHeight: number;
32
+ missingCharacters: string;
33
+ } | undefined;
34
+ }[];
35
+ };
36
+ declare function inspectBoardScene(scene: BoardScene, limit?: number, ids?: ReadonlySet<string>): BoardRenderDiagnostic[];
19
37
  //#endregion
20
- export { BoardRenderDiagnostic, inspectBoardScene, measureBoardText };
38
+ export { BoardRenderDiagnostic, inspectBoardItems, inspectBoardScene, measureBoardText };
@@ -46,12 +46,24 @@ function measureBoardText(props) {
46
46
  missingCharacters: characters
47
47
  };
48
48
  }
49
- function inspectBoardScene(scene, limit = 100) {
49
+ function inspectBoardItems(scene, ids) {
50
+ return {
51
+ diagnostics: inspectBoardScene(scene, 100, ids),
52
+ items: scene.items.filter((item) => !ids || ids.has(item.id)).map((item) => ({
53
+ id: item.id,
54
+ bounds: item.frame,
55
+ worldBounds: itemBounds(item.frame),
56
+ opacity: scene.opacity(item.id),
57
+ ...item.type === "text" ? { text: measureBoardText(item.props) } : {}
58
+ }))
59
+ };
60
+ }
61
+ function inspectBoardScene(scene, limit = 100, ids) {
50
62
  ensureBoardTextMeasurement();
51
63
  const diagnostics = [];
52
64
  const texts = scene.items.filter((item) => item.type === "text" && scene.opacity(item.id) > .01);
53
65
  const push = (entry) => {
54
- if (diagnostics.length < limit) diagnostics.push(entry);
66
+ if (diagnostics.length < limit && (!ids || ids.has(entry.item) || Boolean(entry.related && ids.has(entry.related)))) diagnostics.push(entry);
55
67
  };
56
68
  for (const item of scene.items) {
57
69
  if (diagnostics.length >= limit) break;
@@ -63,7 +75,7 @@ function inspectBoardScene(scene, limit = 100) {
63
75
  let glyphBudget = 256;
64
76
  for (const item of texts) {
65
77
  if (diagnostics.length >= limit || item.type !== "text") break;
66
- if (glyphBudget-- > 0) {
78
+ if ((!ids || ids.has(item.id)) && glyphBudget-- > 0) {
67
79
  const measured = measureBoardText(item.props);
68
80
  if (measured.missingCharacters) push({
69
81
  code: "glyph-unavailable",
@@ -102,6 +114,7 @@ function inspectBoardScene(scene, limit = 100) {
102
114
  const b = sorted[j];
103
115
  if (!b) continue;
104
116
  if (b.rect.x >= a.rect.x + a.rect.width) break;
117
+ if (ids && !ids.has(a.item.id) && !ids.has(b.item.id)) continue;
105
118
  if (++comparisons > 1e4) return diagnostics;
106
119
  if (a.item.parent === b.item.parent && rectsIntersect(a.rect, b.rect)) push({
107
120
  code: "text-overlap",
@@ -114,4 +127,4 @@ function inspectBoardScene(scene, limit = 100) {
114
127
  return diagnostics;
115
128
  }
116
129
  //#endregion
117
- export { inspectBoardScene, measureBoardText };
130
+ export { inspectBoardItems, inspectBoardScene, measureBoardText };