@neta-art/cohub 11.3.0 → 11.3.2

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 (38) hide show
  1. package/dist/board/export/index.js +13 -2
  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/model/authoring.js +1 -2
  9. package/dist/board/model/index.d.ts +2 -2
  10. package/dist/board/model/index.js +2 -2
  11. package/dist/board/model/items/create.js +6 -2
  12. package/dist/board/model/media.d.ts +5 -1
  13. package/dist/board/model/media.js +12 -1
  14. package/dist/board/render/card-tag.d.ts +3 -2
  15. package/dist/board/render/card-tag.js +31 -1
  16. package/dist/board/render/diagnostics.d.ts +20 -2
  17. package/dist/board/render/diagnostics.js +17 -4
  18. package/dist/board/render/index.d.ts +3 -3
  19. package/dist/board/render/index.js +3 -3
  20. package/dist/board/render/media-interaction.js +12 -3
  21. package/dist/board/render/renderers/board-renderer-registry.js +2 -0
  22. package/dist/board/render/renderers/media-key.d.ts +2 -1
  23. package/dist/board/render/renderers/media-key.js +21 -1
  24. package/dist/board/render/renderers/model-card-renderer.d.ts +10 -0
  25. package/dist/board/render/renderers/model-card-renderer.js +132 -0
  26. package/dist/board/stage/assets.d.ts +16 -3
  27. package/dist/board/stage/assets.js +98 -47
  28. package/dist/board/stage/index.d.ts +2 -2
  29. package/dist/chunks/environment.d.ts +46 -3
  30. package/dist/index.d.ts +30 -1
  31. package/dist/index.js +237 -6
  32. package/dist/protocol/dist/board-patch.js +4 -4
  33. package/dist/protocol/dist/board-schema.js +13 -2
  34. package/dist/protocol/dist/board.js +2 -1
  35. package/dist/protocol/dist/fs/mime.d.ts +4 -0
  36. package/dist/protocol/dist/fs/mime.js +113 -0
  37. package/dist/protocol/dist/index.d.ts +2 -1
  38. package/package.json +1 -1
@@ -6,7 +6,7 @@ import { defaultBoardPalette } from "../render/palette.js";
6
6
  import { createBoardRenderSampler } from "../render/sampling.js";
7
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
  });
@@ -47,7 +47,6 @@ function boardSequence(document, chapters) {
47
47
  const chapterIndex = String(index).padStart(String(chapters.length).length, "0");
48
48
  for (const [id, track] of Object.entries(animation.tracks)) {
49
49
  if (document.animations[track.target]) throw new Error(`Chapter ${chapter.animation} contains nested clocks; compose its leaf animations instead.`);
50
- if (chapter.frame && track.target === "camera" && track.property === "focus") continue;
51
50
  tracks[`chapter-${chapterIndex}-${ranks.get(id)}`] = {
52
51
  ...track,
53
52
  keyframes: track.keyframes.map((keyframe) => ({
@@ -78,7 +77,7 @@ function boardSequence(document, chapters) {
78
77
  }] : []
79
78
  ]
80
79
  };
81
- tracks[`camera-${index}`] = {
80
+ tracks[`chapter-${chapterIndex}--camera`] = {
82
81
  target: "camera",
83
82
  property: "focus",
84
83
  composite: "replace",
@@ -38,7 +38,7 @@ import { BoardAppMetadata, BoardItemEntry, BoardMediaItemKind, boardItemOrigin,
38
38
  import { createBoardEntityId, createBoardItemId } from "./items/id.js";
39
39
  import { BoardItemInput, BoardRegistry, createBoardRegistry, defaultBoardRegistry } from "./items/registry.js";
40
40
  import "./items/index.js";
41
- import { BoardMediaKind, getMediaExtension, getMediaResourceTitle, inferBoardMediaKind } from "./media.js";
41
+ import { BoardMediaKind, boardModelFormat, getMediaExtension, getMediaResourceTitle, inferBoardMediaKind, isBoardModelItem } from "./media.js";
42
42
  import { BoardAssetSource, BoardPlayableMedia, playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache, resolveBoardMediaUrl } from "./media-playback.js";
43
43
  import { BoardReplayActorKind, BoardReplayEntry, BoardReplayPlayer, boardReplayActorKind, createBoardReplayPlayer } from "./replay.js";
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 };
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, boardModelFormat, 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, isBoardModelItem, 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 };
@@ -23,7 +23,7 @@ import { buildStrokeOutline, buildStrokeRibbonGeometry, computeDrawBounds, creat
23
23
  import { appendBoardDrawSamples, quantizeDrawCoordinate } from "./draw-input.js";
24
24
  import { BOARD_EXPORT_MAX_TEXTURES, selectBoardExportAssets } from "./export-assets.js";
25
25
  import { BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, exportItemBounds, normalizeBoardDocument, planBoardExport } from "./export-plan.js";
26
- import { getMediaExtension, getMediaResourceTitle, inferBoardMediaKind } from "./media.js";
26
+ import { boardModelFormat, getMediaExtension, getMediaResourceTitle, inferBoardMediaKind, isBoardModelItem } from "./media.js";
27
27
  import { FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, buildCodeExcerpt, buildFileExcerpt, buildFileSnapshot, fileBaseName, fileCategory, fileStem, readCoverFromFrontmatter, readFrontmatterScalars, readTitleFromFrontmatter, resolveCoverRef, resolveFileTitle, resolveSpacePath, shouldFetchFileExcerpt, splitFrontmatter } from "./file-snapshot.js";
28
28
  import { availabilityFromError, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileTypeLabel, formatFileSize, isFileSnapshotFresh, mergeFileSnapshot } from "./file-preview.js";
29
29
  import { BOARD_COLORS, DEFAULT_BOARD_COLOR, boardColorCssVar, buildFallbackShapeColors, isBoardColorId, pickBoardColor, resolveBoardColor, resolveItemColor } from "./palette.js";
@@ -38,4 +38,4 @@ import { boardItemOrigin, boardOriginKey, createAppBoardItem, createArrowBoardIt
38
38
  import { createBoardRegistry, defaultBoardRegistry } from "./items/registry.js";
39
39
  import { playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache, resolveBoardMediaUrl } from "./media-playback.js";
40
40
  import { boardReplayActorKind, createBoardReplayPlayer } from "./replay.js";
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 };
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, boardModelFormat, 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, isBoardModelItem, 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 };
@@ -2,7 +2,7 @@ import { BoardMediaOriginSchema, parseBoardItem } from "../../../protocol/dist/b
2
2
  import { pointsRect } from "../../../protocol/dist/board-layout.js";
3
3
  import { featuredTaskArtifact } from "../../../protocol/dist/board-task.js";
4
4
  import { quantizeDrawCoordinate } from "../draw-input.js";
5
- import { getMediaResourceTitle, inferBoardMediaKind } from "../media.js";
5
+ import { boardModelFormat, getMediaResourceTitle, inferBoardMediaKind } from "../media.js";
6
6
  import { fileStem } from "../file-snapshot.js";
7
7
  import { filePreviewKind } from "../file-preview.js";
8
8
  import { DEFAULT_BOARD_TOOL_STYLES } from "../tool-styles.js";
@@ -32,6 +32,10 @@ const DEFAULT_FILE_SIZE = {
32
32
  width: 260,
33
33
  height: 132
34
34
  };
35
+ const DEFAULT_MODEL_SIZE = {
36
+ width: 264,
37
+ height: 264
38
+ };
35
39
  const DEFAULT_FILE_COVER_SIZE = {
36
40
  width: 260,
37
41
  height: 208
@@ -110,7 +114,7 @@ function createMediaBoardItem(path, x, y, snapshot = {}, id = createBoardItemId(
110
114
  id,
111
115
  item: item({
112
116
  type: "file",
113
- ...centered(x, y, filePreviewKind(snapshot) === "cover" ? DEFAULT_FILE_COVER_SIZE : DEFAULT_FILE_SIZE),
117
+ ...centered(x, y, boardModelFormat(path, snapshot.mimeType) ? DEFAULT_MODEL_SIZE : filePreviewKind(snapshot) === "cover" ? DEFAULT_FILE_COVER_SIZE : DEFAULT_FILE_SIZE),
114
118
  props: {
115
119
  src: path,
116
120
  snapshot: cleanSnapshot({
@@ -1,7 +1,11 @@
1
+ import { ModelFormat } from "../../protocol/dist/fs/mime.js";
2
+ import { BoardSceneItem } from "./scene.js";
1
3
  //#region src/board/model/media.d.ts
2
4
  type BoardMediaKind = "image" | "video" | "audio" | "text" | "file";
3
5
  declare function getMediaExtension(value: string): string;
4
6
  declare function inferBoardMediaKind(value: string, mimeType?: string | null): BoardMediaKind;
5
7
  declare function getMediaResourceTitle(value: string): string;
8
+ declare function boardModelFormat(src: string, mimeType?: string | null): ModelFormat | null;
9
+ declare function isBoardModelItem(item: BoardSceneItem | null | undefined): boolean;
6
10
  //#endregion
7
- export { BoardMediaKind, getMediaExtension, getMediaResourceTitle, inferBoardMediaKind };
11
+ export { BoardMediaKind, boardModelFormat, getMediaExtension, getMediaResourceTitle, inferBoardMediaKind, isBoardModelItem };
@@ -1,3 +1,5 @@
1
+ import { parseBoardMediaSource } from "../../protocol/dist/board-model.js";
2
+ import { modelFormatForPath } from "../../protocol/dist/fs/mime.js";
1
3
  //#region src/board/model/media.ts
2
4
  const IMAGE_EXTENSIONS = /* @__PURE__ */ new Set([
3
5
  "png",
@@ -72,5 +74,14 @@ function getMediaResourceTitle(value) {
72
74
  return value.split("/").filter(Boolean).pop() || value;
73
75
  }
74
76
  }
77
+ function boardModelFormat(src, mimeType) {
78
+ const source = parseBoardMediaSource(src);
79
+ if (!source) return null;
80
+ const path = source.kind === "url" ? source.value.split(/[?#]/, 1)[0] ?? "" : source.value;
81
+ return modelFormatForPath(path, mimeType);
82
+ }
83
+ function isBoardModelItem(item) {
84
+ return item?.type === "file" && boardModelFormat(item.props.src, item.props.snapshot?.mimeType) !== null;
85
+ }
75
86
  //#endregion
76
- export { getMediaExtension, getMediaResourceTitle, inferBoardMediaKind };
87
+ export { boardModelFormat, getMediaExtension, getMediaResourceTitle, inferBoardMediaKind, isBoardModelItem };
@@ -1,9 +1,10 @@
1
1
  import { BoardRenderContext } from "./renderers/board-renderer-registry.js";
2
2
  import { Container, Graphics, Text } from "pixi.js";
3
3
  //#region src/board/render/card-tag.d.ts
4
- type CardGlyph = "image" | "video" | "audio" | "file" | "task";
4
+ type CardGlyph = "image" | "video" | "audio" | "model" | "file" | "task";
5
5
  declare const CARD_TAG_SIZE = 11;
6
6
  declare function formatBoardDuration(ms: number): string;
7
+ declare function traceCube(graphics: Graphics, cx: number, cy: number, radius: number): Graphics;
7
8
  declare function drawCardGlyph(graphics: Graphics, glyph: CardGlyph, color: number, pixel: boolean): void;
8
9
  type CardTag = {
9
10
  root: Container;
@@ -21,4 +22,4 @@ declare function syncCardTag(tag: CardTag, input: {
21
22
  width: number;
22
23
  }, context: BoardRenderContext): void;
23
24
  //#endregion
24
- export { CARD_TAG_SIZE, CardGlyph, CardTag, createCardTag, drawCardGlyph, formatBoardDuration, syncCardTag, zoomCardTag };
25
+ export { CARD_TAG_SIZE, CardGlyph, CardTag, createCardTag, drawCardGlyph, formatBoardDuration, syncCardTag, traceCube, zoomCardTag };
@@ -40,6 +40,14 @@ const PIXEL_GLYPHS = {
40
40
  ".###..",
41
41
  ".###.."
42
42
  ],
43
+ model: [
44
+ "..#...",
45
+ ".###..",
46
+ "#####.",
47
+ "#####.",
48
+ ".###..",
49
+ "..#..."
50
+ ],
43
51
  file: [
44
52
  "####..",
45
53
  "#..##.",
@@ -90,6 +98,9 @@ function drawLineGlyph(graphics, glyph, color) {
90
98
  ]) graphics.moveTo(x, 6 - height / 2).lineTo(x, 6 + height / 2);
91
99
  graphics.stroke(line);
92
100
  return;
101
+ case "model":
102
+ traceCube(graphics, 6, 6, 4.5).stroke(line);
103
+ return;
93
104
  case "file":
94
105
  graphics.poly([
95
106
  2.5,
@@ -127,6 +138,25 @@ function drawLineGlyph(graphics, glyph, color) {
127
138
  return;
128
139
  }
129
140
  }
141
+ function traceCube(graphics, cx, cy, radius) {
142
+ const dx = radius * .866;
143
+ const dy = radius / 2;
144
+ graphics.poly([
145
+ cx,
146
+ cy - radius,
147
+ cx + dx,
148
+ cy - dy,
149
+ cx + dx,
150
+ cy + dy,
151
+ cx,
152
+ cy + radius,
153
+ cx - dx,
154
+ cy + dy,
155
+ cx - dx,
156
+ cy - dy
157
+ ]).moveTo(cx - dx, cy - dy).lineTo(cx, cy).lineTo(cx + dx, cy - dy).moveTo(cx, cy).lineTo(cx, cy + radius);
158
+ return graphics;
159
+ }
130
160
  function drawCardGlyph(graphics, glyph, color, pixel) {
131
161
  if (!pixel) {
132
162
  drawLineGlyph(graphics, glyph, color);
@@ -202,4 +232,4 @@ function syncCardTag(tag, input, context) {
202
232
  zoomCardTag(tag, context.zoom);
203
233
  }
204
234
  //#endregion
205
- export { CARD_TAG_SIZE, createCardTag, drawCardGlyph, formatBoardDuration, syncCardTag, zoomCardTag };
235
+ export { CARD_TAG_SIZE, createCardTag, drawCardGlyph, formatBoardDuration, syncCardTag, traceCube, zoomCardTag };
@@ -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 };