@neta-art/cohub 12.1.1 → 12.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +85 -8
  2. package/dist/board/editor/clipboard.js +1 -1
  3. package/dist/board/editor/creation.js +1 -1
  4. package/dist/board/editor/document.d.ts +3 -1
  5. package/dist/board/editor/document.js +8 -6
  6. package/dist/board/editor/editor.d.ts +8 -3
  7. package/dist/board/editor/editor.js +8 -2
  8. package/dist/board/editor/index.d.ts +3 -3
  9. package/dist/board/editor/index.js +2 -2
  10. package/dist/board/editor/interaction.d.ts +23 -2
  11. package/dist/board/editor/interaction.js +93 -4
  12. package/dist/board/editor/query.d.ts +1 -1
  13. package/dist/board/editor/query.js +3 -7
  14. package/dist/board/editor/selection.js +1 -1
  15. package/dist/board/editor/snapshots.js +5 -57
  16. package/dist/board/editor/tool.d.ts +4 -1
  17. package/dist/board/editor/tool.js +6 -1
  18. package/dist/board/export/index.d.ts +2 -2
  19. package/dist/board/export/index.js +1 -1
  20. package/dist/board/export/node/fonts.js +4 -0
  21. package/dist/board/export/node/index.d.ts +2 -0
  22. package/dist/board/export/node/index.js +8 -1
  23. package/dist/board/export/node/scripts.js +1 -1
  24. package/dist/board/export/scene.d.ts +2 -2
  25. package/dist/board/export/scene.js +2 -2
  26. package/dist/board/model/asset-key.d.ts +24 -0
  27. package/dist/board/model/asset-key.js +104 -0
  28. package/dist/board/model/export-assets.d.ts +7 -3
  29. package/dist/board/model/export-assets.js +34 -13
  30. package/dist/board/model/index.d.ts +9 -7
  31. package/dist/board/model/index.js +22 -20
  32. package/dist/board/model/items/create.js +3 -3
  33. package/dist/board/model/items/definition.d.ts +9 -1
  34. package/dist/board/model/items/index.d.ts +2 -2
  35. package/dist/board/model/items/registry.d.ts +2 -1
  36. package/dist/board/model/items/registry.js +1 -0
  37. package/dist/board/model/media-sizes.d.ts +28 -0
  38. package/dist/board/model/media-sizes.js +64 -0
  39. package/dist/board/model/palette.d.ts +1 -0
  40. package/dist/board/model/palette.js +20 -130
  41. package/dist/board/model/sampling.js +1 -1
  42. package/dist/board/model/text-metrics.d.ts +28 -3
  43. package/dist/board/model/text-metrics.js +36 -2
  44. package/dist/board/model/themes.d.ts +495 -0
  45. package/dist/board/model/themes.js +500 -0
  46. package/dist/board/render/card-tag.js +2 -2
  47. package/dist/board/render/index.d.ts +11 -7
  48. package/dist/board/render/index.js +9 -5
  49. package/dist/board/render/labels.d.ts +15 -0
  50. package/dist/board/render/labels.js +14 -0
  51. package/dist/board/render/lod.d.ts +30 -0
  52. package/dist/board/render/lod.js +33 -0
  53. package/dist/board/render/media-interaction.d.ts +5 -2
  54. package/dist/board/render/media-interaction.js +15 -3
  55. package/dist/board/render/palette.js +2 -25
  56. package/dist/board/render/renderers/arrow-card-renderer.js +7 -5
  57. package/dist/board/render/renderers/audio-card-renderer.js +3 -2
  58. package/dist/board/render/renderers/board-renderer-registry.d.ts +22 -1
  59. package/dist/board/render/renderers/board-renderer-registry.js +9 -4
  60. package/dist/board/render/renderers/custom-card-renderer.js +5 -5
  61. package/dist/board/render/renderers/draw-card-renderer.js +1 -1
  62. package/dist/board/render/renderers/far-plate.d.ts +14 -1
  63. package/dist/board/render/renderers/far-plate.js +31 -8
  64. package/dist/board/render/renderers/file-card-renderer.js +49 -31
  65. package/dist/board/render/renderers/frame-card-renderer.js +9 -3
  66. package/dist/board/render/renderers/image-card-renderer.js +34 -8
  67. package/dist/board/render/renderers/model-card-renderer.js +6 -6
  68. package/dist/board/render/renderers/shape-card-renderer.js +25 -24
  69. package/dist/board/render/renderers/task-card-renderer.js +9 -10
  70. package/dist/board/render/renderers/text-card-renderer.js +86 -41
  71. package/dist/board/render/renderers/video-card-renderer.js +5 -4
  72. package/dist/board/render/script-export.js +1 -1
  73. package/dist/board/render/script-host.js +3 -3
  74. package/dist/board/render/style.d.ts +8 -2
  75. package/dist/board/render/style.js +8 -2
  76. package/dist/board/render/surface.d.ts +5 -0
  77. package/dist/board/render/surface.js +13 -3
  78. package/dist/board/render/text-edit.d.ts +32 -0
  79. package/dist/board/render/text-edit.js +134 -0
  80. package/dist/board/render/text-fit.d.ts +1 -3
  81. package/dist/board/render/text-fit.js +6 -49
  82. package/dist/board/render/text-measurement.d.ts +25 -1
  83. package/dist/board/render/text-measurement.js +157 -19
  84. package/dist/board/render/text-resolution.d.ts +1 -6
  85. package/dist/board/render/text-resolution.js +1 -10
  86. package/dist/board/render/theme.d.ts +15 -0
  87. package/dist/board/render/theme.js +15 -0
  88. package/dist/board/replica/index.d.ts +4 -2
  89. package/dist/board/replica/index.js +28 -17
  90. package/dist/board/replica/indexeddb.d.ts +16 -0
  91. package/dist/board/replica/indexeddb.js +155 -0
  92. package/dist/board/stage/assets.d.ts +28 -5
  93. package/dist/board/stage/assets.js +293 -102
  94. package/dist/board/stage/bench.d.ts +35 -0
  95. package/dist/board/stage/bench.js +153 -0
  96. package/dist/board/stage/device.d.ts +41 -0
  97. package/dist/board/stage/device.js +62 -0
  98. package/dist/board/stage/frame-budget.d.ts +19 -0
  99. package/dist/board/stage/frame-budget.js +69 -0
  100. package/dist/board/stage/idle.d.ts +4 -0
  101. package/dist/board/stage/idle.js +26 -0
  102. package/dist/board/stage/index.d.ts +11 -7
  103. package/dist/board/stage/index.js +7 -4
  104. package/dist/board/stage/lru.d.ts +13 -9
  105. package/dist/board/stage/lru.js +38 -20
  106. package/dist/board/stage/presses.d.ts +21 -0
  107. package/dist/board/stage/presses.js +66 -0
  108. package/dist/board/stage/scene.d.ts +15 -1
  109. package/dist/board/stage/scene.js +248 -141
  110. package/dist/board/stage/stage.d.ts +28 -2
  111. package/dist/board/stage/stage.js +404 -112
  112. package/dist/board/stage/texture-pool.d.ts +10 -1
  113. package/dist/board/stage/texture-pool.js +72 -2
  114. package/dist/chunks/environment.d.ts +6 -0
  115. package/dist/chunks/http.d.ts +9 -1
  116. package/dist/chunks/http.js +791 -4
  117. package/dist/index.d.ts +52 -1
  118. package/dist/index.js +202 -862
  119. package/dist/media.d.ts +3 -27
  120. package/dist/media.js +3 -82
  121. package/dist/protocol/dist/board-constants.js +3 -3
  122. package/dist/protocol/dist/board-layout.d.ts +17 -3
  123. package/dist/protocol/dist/board-layout.js +68 -11
  124. package/dist/protocol/dist/board-model.d.ts +15 -1
  125. package/dist/protocol/dist/board-model.js +12 -2
  126. package/dist/protocol/dist/board-patch.js +1 -1
  127. package/dist/protocol/dist/board-schema.d.ts +2 -1
  128. package/dist/protocol/dist/board-schema.js +4 -1
  129. package/dist/protocol/dist/core/media.d.ts +35 -1
  130. package/dist/protocol/dist/core/media.js +127 -1
  131. package/dist/protocol/dist/index.d.ts +3 -3
  132. package/package.json +4 -2
  133. package/dist/board/model/image-key.d.ts +0 -9
  134. package/dist/board/model/image-key.js +0 -33
@@ -1,21 +1,7 @@
1
- import { fitBoardMediaSize } from "../../protocol/dist/board-layout.js";
2
- import { featuredTaskArtifact } from "../../protocol/dist/board-task.js";
1
+ import { adoptBoardNaturalSize } from "../../protocol/dist/board-layout.js";
3
2
  import { mergeFileSnapshot } from "../model/file-preview.js";
4
3
  import { sameJson } from "../model/json.js";
5
4
  //#region src/board/editor/snapshots.ts
6
- function fitToNatural(item, natural) {
7
- const size = fitBoardMediaSize(natural, Math.max(item.size.width, item.size.height));
8
- if (!size) return null;
9
- const anchor = item.type === "task" ? 0 : .5;
10
- return {
11
- ...item,
12
- position: {
13
- x: item.position.x + (item.size.width - size.width) * anchor,
14
- y: item.position.y + (item.size.height - size.height) * anchor
15
- },
16
- size
17
- };
18
- }
19
5
  function createSnapshotsModule(ctx) {
20
6
  const { state } = ctx;
21
7
  const commit = (changes) => ctx.document.commitItems(changes, false);
@@ -43,48 +29,10 @@ function createSnapshotsModule(ctx) {
43
29
  }
44
30
  function adoptMediaNaturalSizes(sizes) {
45
31
  const changes = /* @__PURE__ */ new Map();
46
- for (const natural of sizes) {
47
- const item = state.base.items[natural.id];
48
- if (!item || natural.width <= 0 || natural.height <= 0) continue;
49
- const dimensions = {
50
- naturalWidth: natural.width,
51
- naturalHeight: natural.height
52
- };
53
- if (item.type === "task") {
54
- const artifact = featuredTaskArtifact(item.props.snapshot.artifacts);
55
- if (artifact?.type !== "image" && artifact?.type !== "video" || artifact.naturalWidth && artifact.naturalHeight) continue;
56
- const fitted = fitToNatural(item, natural);
57
- if (!fitted) continue;
58
- const artifacts = item.props.snapshot.artifacts.map((entry) => entry.id === artifact.id ? {
59
- ...entry,
60
- ...dimensions
61
- } : entry);
62
- changes.set(natural.id, {
63
- ...fitted,
64
- props: {
65
- ...item.props,
66
- snapshot: {
67
- ...item.props.snapshot,
68
- artifacts
69
- }
70
- }
71
- });
72
- continue;
73
- }
74
- if (item.type !== "image" && item.type !== "video") continue;
75
- if (item.props.snapshot?.naturalWidth && item.props.snapshot.naturalHeight) continue;
76
- const fitted = fitToNatural(item, natural);
77
- if (!fitted) continue;
78
- changes.set(natural.id, {
79
- ...fitted,
80
- props: {
81
- ...item.props,
82
- snapshot: {
83
- ...item.props.snapshot,
84
- ...dimensions
85
- }
86
- }
87
- });
32
+ for (const { id, ...natural } of sizes) {
33
+ const item = state.base.items[id];
34
+ const adopted = item && adoptBoardNaturalSize(item, natural);
35
+ if (adopted) changes.set(id, adopted);
88
36
  }
89
37
  commit(changes);
90
38
  }
@@ -1,10 +1,13 @@
1
1
  //#region src/board/editor/tool.d.ts
2
2
  type BoardToolId = "select" | "hand" | "text" | "shape" | "draw" | "arrow" | "frame";
3
3
  declare const BOARD_HAND_TAP_SLOP = 8;
4
+ declare const BOARD_MOUSE_TAP_SLOP = 4;
5
+ declare const BOARD_TAP_MAX_MS = 300;
6
+ declare function boardTapSlop(pointerType: string): number;
4
7
  declare function defaultBoardTool(isMobile: boolean): BoardToolId;
5
8
  declare function canTapSelectWithHand(pointerType: string): boolean;
6
9
  declare function isWithinHandTapSlop(dx: number, dy: number): boolean;
7
10
  declare function isContinuousBoardTool(tool: BoardToolId): boolean;
8
11
  declare function isCreationBoardTool(tool: BoardToolId): boolean;
9
12
  //#endregion
10
- export { BOARD_HAND_TAP_SLOP, BoardToolId, canTapSelectWithHand, defaultBoardTool, isContinuousBoardTool, isCreationBoardTool, isWithinHandTapSlop };
13
+ export { BOARD_HAND_TAP_SLOP, BOARD_MOUSE_TAP_SLOP, BOARD_TAP_MAX_MS, BoardToolId, boardTapSlop, canTapSelectWithHand, defaultBoardTool, isContinuousBoardTool, isCreationBoardTool, isWithinHandTapSlop };
@@ -1,5 +1,10 @@
1
1
  //#region src/board/editor/tool.ts
2
2
  const BOARD_HAND_TAP_SLOP = 8;
3
+ const BOARD_MOUSE_TAP_SLOP = 4;
4
+ const BOARD_TAP_MAX_MS = 300;
5
+ function boardTapSlop(pointerType) {
6
+ return pointerType === "mouse" ? 4 : 8;
7
+ }
3
8
  function defaultBoardTool(isMobile) {
4
9
  return isMobile ? "hand" : "select";
5
10
  }
@@ -16,4 +21,4 @@ function isCreationBoardTool(tool) {
16
21
  return tool === "text" || tool === "shape" || tool === "draw" || tool === "arrow" || tool === "frame";
17
22
  }
18
23
  //#endregion
19
- export { BOARD_HAND_TAP_SLOP, canTapSelectWithHand, defaultBoardTool, isContinuousBoardTool, isCreationBoardTool, isWithinHandTapSlop };
24
+ export { BOARD_HAND_TAP_SLOP, BOARD_MOUSE_TAP_SLOP, BOARD_TAP_MAX_MS, boardTapSlop, canTapSelectWithHand, defaultBoardTool, isContinuousBoardTool, isCreationBoardTool, isWithinHandTapSlop };
@@ -6,7 +6,7 @@ import { BoardEvaluation } from "../model/animation.js";
6
6
  import { BoardAnimationSampler } from "../model/sampling.js";
7
7
  import { BoardExportPlan, BoardExportPlanInput, BoardExportRegion } from "../model/export-plan.js";
8
8
  import { BoardShapeColors } from "../model/palette.js";
9
- import { BoardRenderStyle } from "../render/style.js";
9
+ import { BoardRenderStyleInput } from "../render/style.js";
10
10
  import { BoardCardRendererResolver, BoardRenderPalette, BoardScriptHost } from "../render/renderers/board-renderer-registry.js";
11
11
  import "../render/index.js";
12
12
  import { BoardExportScene, BoardExportSceneInput, createBoardExportScene } from "./scene.js";
@@ -30,7 +30,7 @@ type BoardExportOptions = {
30
30
  background?: BoardExportBackground;
31
31
  palette?: Partial<BoardRenderPalette>;
32
32
  colors?: BoardShapeColors;
33
- style?: Partial<BoardRenderStyle>;
33
+ style?: BoardRenderStyleInput;
34
34
  textures?: Map<string, Texture>;
35
35
  scripts?: BoardScriptHost;
36
36
  assetKey?: (item: BoardSceneItem) => string | null;
@@ -1,9 +1,9 @@
1
1
  import { buildBoardScene } from "../model/scene.js";
2
2
  import { resolveBoardAnimationCamera } from "../model/sampling.js";
3
- import { normalizeBoardDocument, planBoardExport } from "../model/export-plan.js";
4
3
  import { parseBoardCssColor } from "../render/css-color.js";
5
4
  import { defaultBoardPalette } from "../render/palette.js";
6
5
  import { createBoardRenderSampler } from "../render/sampling.js";
6
+ import { normalizeBoardDocument, planBoardExport } from "../model/export-plan.js";
7
7
  import { ensureBoardTextMeasurement } from "../render/text-measurement.js";
8
8
  import { createBoardExportScene } from "./scene.js";
9
9
  import { Rectangle, RendererType } from "pixi.js";
@@ -3,6 +3,8 @@ function initializeBoardFonts(registry, fonts) {
3
3
  for (const font of fonts) registry.registerFromPath(font.path, font.family);
4
4
  if (!registry.setAlias) return;
5
5
  for (const [alias, candidates] of Object.entries({
6
+ Geist: ["Geist Variable"],
7
+ "Geist Mono": ["Geist Mono Variable"],
6
8
  "system-ui": [
7
9
  "Noto Sans",
8
10
  "DejaVu Sans",
@@ -13,6 +15,7 @@ function initializeBoardFonts(registry, fonts) {
13
15
  "Segoe UI"
14
16
  ],
15
17
  "sans-serif": [
18
+ "Geist Variable",
16
19
  "Geist",
17
20
  "Noto Sans",
18
21
  "DejaVu Sans",
@@ -28,6 +31,7 @@ function initializeBoardFonts(registry, fonts) {
28
31
  "Times New Roman"
29
32
  ],
30
33
  monospace: [
34
+ "Geist Mono Variable",
31
35
  "Geist Mono",
32
36
  "DejaVu Sans Mono",
33
37
  "Liberation Mono",
@@ -18,6 +18,8 @@ type BoardNodeRendererOptions = {
18
18
  };
19
19
  type BoardNodeTexture = {
20
20
  readonly __boardTexture: unique symbol;
21
+ readonly width: number;
22
+ readonly height: number;
21
23
  destroy: (destroySource?: boolean) => void;
22
24
  };
23
25
  type BoardNodeRenderer = {
@@ -28,6 +28,12 @@ function installDOMMatrix(canvasModule) {
28
28
  const globals = globalThis;
29
29
  globals.DOMMatrix ??= canvasModule.DOMMatrix;
30
30
  }
31
+ function installOffscreenCanvas() {
32
+ const globals = globalThis;
33
+ globals.OffscreenCanvas ??= function OffscreenCanvas(width, height) {
34
+ return DOMAdapter.get().createCanvas(width, height);
35
+ };
36
+ }
31
37
  function installAnimationFrameShim() {
32
38
  const globals = globalThis;
33
39
  if (globals.requestAnimationFrame) return () => {};
@@ -57,7 +63,7 @@ async function createNodeBoardRenderer(options = {}) {
57
63
  extensions.add(CanvasGraphicsPipe, GraphicsPipe, CanvasGraphicsContextSystem, GraphicsContextSystem, CanvasRendererTextSystem, CanvasTextSystem, CanvasTextPipe);
58
64
  const fonts = (options.fonts ?? []).map((font) => ({
59
65
  ...font,
60
- family: font.family ?? "Geist"
66
+ family: font.family ?? "Geist Variable"
61
67
  }));
62
68
  initializeBoardFonts(canvasModule.GlobalFonts, fonts);
63
69
  function createCanvas(width = 1, height = 1) {
@@ -83,6 +89,7 @@ async function createNodeBoardRenderer(options = {}) {
83
89
  }
84
90
  });
85
91
  installDOMMatrix(canvasModule);
92
+ installOffscreenCanvas();
86
93
  installBoardTextMeasurement();
87
94
  const restoreAnimationFrame = installAnimationFrameShim();
88
95
  const renderer = new CanvasRenderer();
@@ -1,5 +1,5 @@
1
- import { boardScriptScope, composeBoardScriptItems } from "../../model/script-scene.js";
2
1
  import { buildBoardScene } from "../../model/scene.js";
2
+ import { boardScriptScope, composeBoardScriptItems } from "../../model/script-scene.js";
3
3
  import { createBoardScriptModuleReader, loadBoardScriptSources } from "../../../protocol/dist/board-script-modules.js";
4
4
  import { createScriptRuntime } from "../../render/script-runtime.js";
5
5
  import { initializeBoardFonts } from "./fonts.js";
@@ -3,7 +3,7 @@ import "../../protocol/dist/index.js";
3
3
  import { Rect } from "../model/geometry.js";
4
4
  import { BoardScene, BoardSceneItem } from "../model/scene.js";
5
5
  import { BoardShapeColors } from "../model/palette.js";
6
- import { BoardRenderStyle } from "../render/style.js";
6
+ import { BoardRenderStyleInput } from "../render/style.js";
7
7
  import { BoardCardRendererResolver, BoardRenderContext, BoardRenderPalette } from "../render/renderers/board-renderer-registry.js";
8
8
  import "../render/index.js";
9
9
  import { Container, Texture } from "pixi.js";
@@ -19,7 +19,7 @@ type BoardExportSceneInput = {
19
19
  colorScheme: "dark" | "light";
20
20
  palette?: Partial<BoardRenderPalette>;
21
21
  colors?: BoardShapeColors;
22
- style?: Partial<BoardRenderStyle>;
22
+ style?: BoardRenderStyleInput;
23
23
  textures?: Map<string, Texture>;
24
24
  scripts?: BoardRenderContext["scripts"];
25
25
  assetKey?: (item: BoardSceneItem) => string | null;
@@ -1,9 +1,9 @@
1
1
  import { buildFallbackShapeColors } from "../model/palette.js";
2
- import { imageAssetKey } from "../model/image-key.js";
3
2
  import { defaultBoardPalette } from "../render/palette.js";
4
3
  import { clippingAncestor, isClippingFrame, syncClipGroup } from "../render/clip.js";
5
4
  import { DEFAULT_BOARD_RENDER_LABELS, getBoardCardRenderer } from "../render/renderers/board-renderer-registry.js";
6
5
  import { resolveBoardRenderStyle } from "../render/style.js";
6
+ import { boardAssetKey } from "../model/asset-key.js";
7
7
  import { Container, Graphics, Sprite, TilingSprite } from "pixi.js";
8
8
  //#region src/board/export/scene.ts
9
9
  function buildContext(input) {
@@ -34,7 +34,7 @@ function buildContext(input) {
34
34
  labels: DEFAULT_BOARD_RENDER_LABELS,
35
35
  taskRun: () => null,
36
36
  scripts: input.scripts,
37
- assetKey: input.assetKey ?? imageAssetKey,
37
+ assetKey: input.assetKey ?? boardAssetKey,
38
38
  getTexture: (key) => textures.get(key) ?? null,
39
39
  hasError: (key) => {
40
40
  if (!textures.has(key)) missing.add(key);
@@ -0,0 +1,24 @@
1
+ import { BoardSceneItem } from "./scene.js";
2
+ //#region src/board/model/asset-key.d.ts
3
+ type BoardAssetMedia = "image" | "video" | "model";
4
+ type BoardAssetKeySource = {
5
+ kind: "file" | "url";
6
+ media: BoardAssetMedia;
7
+ value: string;
8
+ fit?: "cover";
9
+ };
10
+ /** `fit` applies to images: `cover` bounds the short edge instead of the long one. */
11
+ type BoardAssetRef = {
12
+ url: string;
13
+ media?: "image" | "video";
14
+ fit?: "contain" | "cover";
15
+ };
16
+ declare function boardAssetRefKey({ url, media, fit }: BoardAssetRef): string;
17
+ declare function imageAssetKey(item: BoardSceneItem): string | null;
18
+ declare function boardAssetKey(item: BoardSceneItem): string | null;
19
+ declare function boardAssetKeySource(key: string): BoardAssetKeySource | null;
20
+ declare function boardTexturePixels(item: BoardSceneItem, scale: number): number;
21
+ declare const BOARD_THUMBNAIL_EDGE = 64;
22
+ declare function boardTextureEdge(item: BoardSceneItem, scale: number): number;
23
+ //#endregion
24
+ export { BOARD_THUMBNAIL_EDGE, BoardAssetKeySource, BoardAssetMedia, BoardAssetRef, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardTextureEdge, boardTexturePixels, imageAssetKey };
@@ -0,0 +1,104 @@
1
+ import { mediaVariantSize, videoFrameUrl } from "../../media.js";
2
+ import { boardItemPreview, parseBoardMediaSource } from "../../protocol/dist/board-model.js";
3
+ import { featuredTaskArtifact, taskArtifactPreviewUrl } from "../../protocol/dist/board-task.js";
4
+ import { isBoardModelItem } from "./media.js";
5
+ //#region src/board/model/asset-key.ts
6
+ function boardAssetRefKey({ url, media = "image", fit }) {
7
+ if (media === "video") return `video-url:${encodeURIComponent(url)}`;
8
+ return fit === "cover" ? `cover-url:${url}` : `url:${url}`;
9
+ }
10
+ function imageAssetKey(item) {
11
+ if (item.type === "image") {
12
+ const source = parseBoardMediaSource(item.props.src);
13
+ return source ? `${source.kind}:${source.value}` : null;
14
+ }
15
+ if (item.type === "file") {
16
+ const snapshot = item.props.snapshot;
17
+ if (snapshot?.coverUrl) return `url:${snapshot.coverUrl}`;
18
+ if (snapshot?.coverPath) return `file:${snapshot.coverPath}`;
19
+ return null;
20
+ }
21
+ if (item.type === "task") {
22
+ const url = taskArtifactPreviewUrl(featuredTaskArtifact(item.props.snapshot.artifacts));
23
+ return url ? `url:${url}` : null;
24
+ }
25
+ const cover = boardItemPreview(item)?.cover;
26
+ const source = cover ? parseBoardMediaSource(cover) : null;
27
+ return source ? `${source.kind}:${source.value}` : null;
28
+ }
29
+ const STILL_MEDIA = ["video", "model"];
30
+ function stillKey(media, src, mtimeMs) {
31
+ const source = parseBoardMediaSource(src);
32
+ if (!source) return null;
33
+ return source.kind === "url" ? `${media}-url:${encodeURIComponent(source.value)}` : `${media}:${encodeURIComponent(source.value)}:${mtimeMs ?? "unknown"}`;
34
+ }
35
+ function taskPreviewKey(item) {
36
+ const artifact = featuredTaskArtifact(item.props.snapshot.artifacts);
37
+ const cover = taskArtifactPreviewUrl(artifact);
38
+ if (cover) return `url:${cover}`;
39
+ if (artifact?.type !== "video") return null;
40
+ const frame = videoFrameUrl(artifact.url, 768);
41
+ return frame ? `url:${frame}` : `video-url:${encodeURIComponent(artifact.url)}`;
42
+ }
43
+ function boardAssetKey(item) {
44
+ if (item.type === "task") return taskPreviewKey(item);
45
+ if (item.type === "video") return stillKey("video", item.props.src, item.props.snapshot?.mtimeMs);
46
+ if (item.type === "file" && isBoardModelItem(item)) return stillKey("model", item.props.src, item.props.snapshot?.mtimeMs);
47
+ return imageAssetKey(item);
48
+ }
49
+ function boardAssetKeySource(key) {
50
+ let base = key;
51
+ if (key.startsWith("local:")) {
52
+ const separator = key.indexOf(":", 6);
53
+ if (separator < 0) return null;
54
+ base = key.slice(separator + 1);
55
+ }
56
+ try {
57
+ for (const media of STILL_MEDIA) {
58
+ if (base.startsWith(`${media}-url:`)) return {
59
+ kind: "url",
60
+ media,
61
+ value: decodeURIComponent(base.slice(media.length + 5))
62
+ };
63
+ if (base.startsWith(`${media}:`)) {
64
+ const end = base.lastIndexOf(":");
65
+ return end > media.length ? {
66
+ kind: "file",
67
+ media,
68
+ value: decodeURIComponent(base.slice(media.length + 1, end))
69
+ } : null;
70
+ }
71
+ }
72
+ } catch {
73
+ return null;
74
+ }
75
+ if (base.startsWith("file:")) return {
76
+ kind: "file",
77
+ media: "image",
78
+ value: base.slice(5)
79
+ };
80
+ if (base.startsWith("url:")) return {
81
+ kind: "url",
82
+ media: "image",
83
+ value: base.slice(4)
84
+ };
85
+ if (base.startsWith("cover-url:")) return {
86
+ kind: "url",
87
+ media: "image",
88
+ value: base.slice(10),
89
+ fit: "cover"
90
+ };
91
+ return null;
92
+ }
93
+ function boardTexturePixels(item, scale) {
94
+ const crop = item.type === "image" ? item.props.crop : void 0;
95
+ return Math.max(item.frame.width / (crop?.w || 1), item.frame.height / (crop?.h || 1)) * scale;
96
+ }
97
+ const BOARD_THUMBNAIL_EDGE = 64;
98
+ function boardTextureEdge(item, scale) {
99
+ const pixels = boardTexturePixels(item, scale);
100
+ if (pixels <= 64) return 64;
101
+ return pixels > 1536 ? Number.POSITIVE_INFINITY : mediaVariantSize(pixels);
102
+ }
103
+ //#endregion
104
+ export { BOARD_THUMBNAIL_EDGE, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardTextureEdge, boardTexturePixels, imageAssetKey };
@@ -1,11 +1,15 @@
1
1
  import { BoardSceneItem } from "./scene.js";
2
2
  //#region src/board/model/export-assets.d.ts
3
- declare const BOARD_EXPORT_MAX_TEXTURES = 64;
3
+ declare const BOARD_EXPORT_TEXTURE_BYTES: number;
4
4
  type BoardExportAssetSelection = {
5
5
  items: BoardSceneItem[];
6
6
  keys: string[];
7
7
  omittedKeys: string[];
8
8
  };
9
- declare function selectBoardExportAssets(items: BoardSceneItem[], assetKey: (item: BoardSceneItem) => string | null, maxTextures?: number): BoardExportAssetSelection;
9
+ declare function boardTextureBytes(item: BoardSceneItem, scale: number): number;
10
+ declare function selectBoardExportAssets(items: BoardSceneItem[], assetKey: (item: BoardSceneItem) => string | null, options: {
11
+ scale: number;
12
+ maxBytes?: number;
13
+ }): BoardExportAssetSelection;
10
14
  //#endregion
11
- export { BOARD_EXPORT_MAX_TEXTURES, BoardExportAssetSelection, selectBoardExportAssets };
15
+ export { BOARD_EXPORT_TEXTURE_BYTES, BoardExportAssetSelection, boardTextureBytes, selectBoardExportAssets };
@@ -1,20 +1,41 @@
1
+ import { boardTextureEdge, boardTexturePixels } from "./asset-key.js";
1
2
  //#region src/board/model/export-assets.ts
2
- const BOARD_EXPORT_MAX_TEXTURES = 64;
3
- function selectBoardExportAssets(items, assetKey, maxTextures = 64) {
4
- const limit = Number.isSafeInteger(maxTextures) ? Math.max(0, maxTextures) : 64;
5
- const selected = /* @__PURE__ */ new Map();
6
- const omitted = /* @__PURE__ */ new Set();
3
+ const BOARD_EXPORT_TEXTURE_BYTES = 256 * 1024 ** 2;
4
+ function boardTextureBytes(item, scale) {
5
+ const crop = item.type === "image" ? item.props.crop : void 0;
6
+ const pixels = boardTexturePixels(item, scale);
7
+ const edge = boardTextureEdge(item, scale);
8
+ const grow = Number.isFinite(edge) && pixels > 0 ? edge / pixels : 1;
9
+ return Math.ceil(item.frame.width / (crop?.w || 1) * scale * grow) * Math.ceil(item.frame.height / (crop?.h || 1) * scale * grow) * 4;
10
+ }
11
+ function selectBoardExportAssets(items, assetKey, options) {
12
+ const budget = options.maxBytes ?? BOARD_EXPORT_TEXTURE_BYTES;
13
+ const largest = /* @__PURE__ */ new Map();
7
14
  for (const item of items) {
8
15
  const key = assetKey(item);
9
- if (!key || selected.has(key) || omitted.has(key)) continue;
10
- if (selected.size < limit) selected.set(key, item);
11
- else omitted.add(key);
16
+ if (!key) continue;
17
+ const need = boardTextureBytes(item, options.scale);
18
+ if (need > (largest.get(key)?.need ?? -1)) largest.set(key, {
19
+ item,
20
+ need
21
+ });
12
22
  }
13
- return {
14
- items: [...selected.values()],
15
- keys: [...selected.keys()],
16
- omittedKeys: [...omitted]
23
+ const selection = {
24
+ items: [],
25
+ keys: [],
26
+ omittedKeys: []
17
27
  };
28
+ let used = 0;
29
+ for (const [key, { item, need }] of largest) {
30
+ if (used + need > budget) {
31
+ selection.omittedKeys.push(key);
32
+ continue;
33
+ }
34
+ used += need;
35
+ selection.keys.push(key);
36
+ selection.items.push(item);
37
+ }
38
+ return selection;
18
39
  }
19
40
  //#endregion
20
- export { BOARD_EXPORT_MAX_TEXTURES, selectBoardExportAssets };
41
+ export { BOARD_EXPORT_TEXTURE_BYTES, boardTextureBytes, selectBoardExportAssets };
@@ -1,5 +1,5 @@
1
- import { BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, 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_SHAPE_GEOMETRIES, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TEXT_ALIGNS, BoardAnchorSide, BoardAnimation, BoardAnimationHeader, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchor, BoardArrowAnchorSchema, BoardArrowBinding, BoardArrowBindingSchema, BoardArrowEnd, BoardArrowEndSchema, BoardArrowItem, BoardArrowItemSchema, BoardArrowRoute, BoardAudioItem, BoardAudioItemSchema, BoardBackgroundSchema, BoardBuiltinItem, BoardBuiltinItemType, BoardColor, BoardColorSchema, BoardColorToken, BoardCropSchema, BoardCustomItem, BoardCustomItemSchema, BoardDash, BoardDelta, BoardDiagnostic, BoardDocument, BoardDrawItem, BoardDrawItemSchema, BoardDrawPoint, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItem, BoardEffectItemSchema, BoardEffectKind, BoardEnterPreset, BoardExtensionItem, BoardExtensionItemSchema, BoardFileBackedItem, BoardFileItem, BoardFileItemSchema, BoardFrameItem, BoardFrameItemSchema, BoardIdSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemType, BoardKeySchema, BoardKeyframe, BoardKeyframeSchema, BoardMarker, BoardMarkerSchema, BoardMediaOrigin, BoardMediaOriginSchema, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardMediaSource, BoardMediaSourceSchema, BoardPatch, BoardPatchSchema, BoardPlayMode, BoardScript, BoardScriptSchema, BoardSettings, BoardSettingsSchema, BoardShapeGeometry, BoardShapeItem, BoardShapeItemSchema, BoardSize, BoardSizeSchema, BoardStyle, BoardStyleSchema, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardTrack, BoardTrackSchema, BoardVec2, BoardVec2Schema, BoardVideoItem, BoardVideoItemSchema, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem, parseBoardMediaSource } from "../../protocol/dist/board-model.js";
2
- import { BoardFrame, BoardItemLookup, BoardLayout, BoardMatrix, BoardRect, BoardTextLayout, BoardTextMeasurer, IDENTITY_MATRIX, anchorPoint, applyMatrix, arrowBindings, autoAnchorSide, bendControl, clampBoardFontSize, createBoardLayout, createDocumentLayout, drawPointsBounds, drawSampleRadius, estimateTextWidth, fitBoardMediaSize, framePoint, invertMatrix, isArrowBinding, layoutBoardText, multiplyMatrix, pointsRect, rotateAround, scaleVector, setBoardTextMeasurer, sideAnchor } from "../../protocol/dist/board-layout.js";
1
+ import { BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, 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_SHAPE_GEOMETRIES, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TEXT_ALIGNS, BoardAnchorSide, BoardAnimation, BoardAnimationHeader, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchor, BoardArrowAnchorSchema, BoardArrowBinding, BoardArrowBindingSchema, BoardArrowEnd, BoardArrowEndSchema, BoardArrowItem, BoardArrowItemSchema, BoardArrowRoute, BoardAudioItem, BoardAudioItemSchema, BoardBackgroundSchema, BoardBuiltinItem, BoardBuiltinItemType, BoardColor, BoardColorSchema, BoardColorToken, BoardCropSchema, BoardCustomItem, BoardCustomItemSchema, BoardDash, BoardDelta, BoardDiagnostic, BoardDocument, BoardDrawItem, BoardDrawItemSchema, BoardDrawPoint, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItem, BoardEffectItemSchema, BoardEffectKind, BoardEnterPreset, BoardExtensionItem, BoardExtensionItemSchema, BoardFileBackedItem, BoardFileItem, BoardFileItemSchema, BoardFrameItem, BoardFrameItemSchema, BoardIdSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemPreview, BoardItemPreviewSchema, BoardItemType, BoardKeySchema, BoardKeyframe, BoardKeyframeSchema, BoardMarker, BoardMarkerSchema, BoardMediaOrigin, BoardMediaOriginSchema, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardMediaSource, BoardMediaSourceSchema, BoardPatch, BoardPatchSchema, BoardPlayMode, BoardScript, BoardScriptSchema, BoardSettings, BoardSettingsSchema, BoardShapeGeometry, BoardShapeItem, BoardShapeItemSchema, BoardSize, BoardSizeSchema, BoardStyle, BoardStyleSchema, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardTrack, BoardTrackSchema, BoardVec2, BoardVec2Schema, BoardVideoItem, BoardVideoItemSchema, boardItemPreview, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem, parseBoardMediaSource } from "../../protocol/dist/board-model.js";
2
+ import { BoardFrame, BoardItemLookup, BoardLayout, BoardMatrix, BoardRect, BoardTextFont, BoardTextLayout, BoardTextLayouter, BoardTextLines, IDENTITY_MATRIX, adoptBoardNaturalSize, anchorPoint, applyMatrix, arrowBindings, autoAnchorSide, bendControl, clampBoardFontSize, createBoardLayout, createDocumentLayout, drawPointsBounds, drawSampleRadius, estimateTextWidth, fitBoardMediaSize, framePoint, invertMatrix, isArrowBinding, layoutBoardText, multiplyMatrix, pointsRect, rotateAround, scaleVector, setBoardTextLayouter, sideAnchor } from "../../protocol/dist/board-layout.js";
3
3
  import { BoardApplyOptions, BoardPatchResult, BoardPropertySpec, BoardState, BoardValueKind, applyBoardDelta, applyBoardPatch, applyBoardPatchToDocument, boardPatchTouches, createDocumentState, diffBoardDocuments, diffMergePatch, isEmptyBoardPatch, listBoardProperties, mergePatch, parseBoardDocument, pruneBoardTrack, resolveBoardProperty, trackReferences } from "../../protocol/dist/board-patch.js";
4
4
  import { isBoardPath, parseBoardManifest, serializeBoardManifest } from "../../protocol/dist/board.js";
5
5
  import { BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, clampBoardStrokeSize } from "../../protocol/dist/board-constants.js";
@@ -23,17 +23,19 @@ import { BOARD_PRESET_NAMES, BoardNestedAnimationOptions, BoardPresetName, Board
23
23
  import { ARROW_BINDING_GAP, ArrowFrameLookup, ResolvedArrow, ResolvedArrowEnd, arrowHitRadius, arrowPathBounds, distanceToArrow, pathMidpoint, pathPointAt, resolveAnchor, resolveArrow, resolveSceneArrow } from "./arrow-geometry.js";
24
24
  import { StrokeRibbonBuilder, StrokeRibbonGeometry, StrokeRibbonMesh, buildStrokeOutline, buildStrokeRibbonGeometry, computeDrawBounds, createStrokeRibbonBuilder, distanceToStroke, isStrokeCorner, sampleRadius, simplifyDrawIndices, trimDrawPoints } from "./draw-geometry.js";
25
25
  import { BoardDrawInputSample, appendBoardDrawSamples, quantizeDrawCoordinate } from "./draw-input.js";
26
- import { BOARD_EXPORT_MAX_TEXTURES, BoardExportAssetSelection, selectBoardExportAssets } from "./export-assets.js";
26
+ import { BOARD_EXPORT_TEXTURE_BYTES, BoardExportAssetSelection, boardTextureBytes, selectBoardExportAssets } from "./export-assets.js";
27
27
  import { BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, BoardExportPlan, BoardExportPlanInput, BoardExportRegion, exportItemBounds, normalizeBoardDocument, planBoardExport } from "./export-plan.js";
28
28
  import { BoardFileSnapshotFacts, BuildSnapshotInput, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FileCategory, ResolvedCover, buildCodeExcerpt, buildFileExcerpt, buildFileSnapshot, fileBaseName, fileCategory, fileStem, readCoverFromFrontmatter, readFrontmatterScalars, readTitleFromFrontmatter, resolveCoverRef, resolveFileTitle, resolveSpacePath, shouldFetchFileExcerpt, splitFrontmatter } from "./file-snapshot.js";
29
29
  import { FileAvailability, FilePreviewKind, availabilityFromError, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileTypeLabel, formatFileSize, isFileSnapshotFresh, mergeFileSnapshot } from "./file-preview.js";
30
30
  import { BOARD_COLORS, BoardColorEntry, BoardColorId, BoardColorValue, BoardShapeColors, DEFAULT_BOARD_COLOR, boardColorCssVar, buildFallbackShapeColors, isBoardColorId, pickBoardColor, resolveBoardColor, resolveItemColor } from "./palette.js";
31
+ import { BOARD_THEME_IDS, BoardThemeId } from "./themes.js";
31
32
  import { SHAPE_KINDS, ShapeKind, isShapeKind } from "./shape-types.js";
32
- import { TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, boardFontFamily } from "./text-metrics.js";
33
+ import { BOARD_FRAME_LABEL_LINE_HEIGHT, BOARD_FRAME_LABEL_SIZE, SHAPE_LABEL_PADDING, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, boardEditableText, boardFontFamily, frameLabelHitRect, frameLabelOffset, layoutShapeLabel } from "./text-metrics.js";
33
34
  import { BoardStyledToolId, BoardToolStyleMap, BoardToolStylePatch, DEFAULT_BOARD_TOOL_STYLES, createBoardToolStyles } from "./tool-styles.js";
34
35
  import { ClientToLocalInput, clientToLocal, elementClientToLocal } from "./client-geometry.js";
35
- import { boardImageKeySource, imageAssetKey } from "./image-key.js";
36
- import { BoardItemCapabilities, BoardItemDefinition, BoardItemOf, BoardItemResizeMode, FULL_CAPABILITIES, defineBoardItem } from "./items/definition.js";
36
+ import { BOARD_THUMBNAIL_EDGE, BoardAssetKeySource, BoardAssetMedia, BoardAssetRef, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardTextureEdge, boardTexturePixels, imageAssetKey } from "./asset-key.js";
37
+ import { BoardMediaFileResolver, BoardMediaSize, BoardMediaSizeOptions, BoardMediaTarget, boardMediaTarget, probeBoardMediaSize, settleBoardMediaSizes } from "./media-sizes.js";
38
+ import { BoardItemActivation, BoardItemCapabilities, BoardItemDefinition, BoardItemOf, BoardItemResizeMode, FULL_CAPABILITIES, defineBoardItem } from "./items/definition.js";
37
39
  import { builtinBoardItems } from "./items/builtin.js";
38
40
  import { BoardAppMetadata, BoardItemEntry, BoardMediaItemKind, boardItemOrigin, boardOriginKey, boardTaskCardSize, createAppBoardItem, createArrowBoardItem, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createTaskBoardItem, createTaskResultItems, createTextBoardItem, mediaFrameSize, titleForBoardItem } from "./items/create.js";
39
41
  import { createBoardEntityId, createBoardItemId } from "./items/id.js";
@@ -42,4 +44,4 @@ import "./items/index.js";
42
44
  import { BoardMediaKind, boardModelFormat, getMediaExtension, getMediaResourceTitle, inferBoardMediaKind, isBoardModelItem } from "./media.js";
43
45
  import { BoardAssetSource, BoardAssetUrlOptions, BoardPlayableMedia, playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache, resolveBoardMediaUrl } from "./media-playback.js";
44
46
  import { BoardReplayActorKind, BoardReplayEntry, BoardReplayPlayer, boardReplayActorKind, createBoardReplayPlayer } from "./replay.js";
45
- 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, BoardAssetUrlOptions, 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, ClientToLocalInput, 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, boardTaskCardSize, boardTaskSource, buildBoardScene, buildCodeExcerpt, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, builtinBoardItems, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardFontSize, clampBoardStrokeSize, clampBoardFontSize as clampBoardTextFontSize, clampZoom, clientToLocal, 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, elementClientToLocal, emptyBoardDocument, estimateTextWidth, evaluateBoardAnimations, expandRect, exportItemBounds, featuredTaskArtifact, fileBaseName, fileCategory, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileStem, fileTypeLabel, fitBoardMediaSize, 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 };
47
+ 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_TEXTURE_BYTES, BOARD_EXTENSION_TYPE_PATTERN, BOARD_FRAME_LABEL_LINE_HEIGHT, BOARD_FRAME_LABEL_SIZE, 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, BOARD_THEME_IDS, BOARD_THUMBNAIL_EDGE, BoardAnchorSide, BoardAnimation, BoardAnimationHeader, BoardAnimationHeaderSchema, BoardAnimationSampler, BoardAnimationSchema, BoardAppMetadata, BoardApplyOptions, BoardArrowAnchor, BoardArrowAnchorSchema, BoardArrowBinding, BoardArrowBindingSchema, BoardArrowEnd, BoardArrowEndSchema, BoardArrowItem, BoardArrowItemSchema, BoardArrowRoute, BoardAssetKeySource, BoardAssetMedia, BoardAssetRef, BoardAssetSource, BoardAssetUrlOptions, 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, BoardItemActivation, BoardItemCapabilities, BoardItemDefinition, BoardItemEntry, BoardItemInput, BoardItemLookup, BoardItemOf, BoardItemPreview, BoardItemPreviewSchema, BoardItemResizeMode, BoardItemType, BoardKeySchema, BoardKeyframe, BoardKeyframeSchema, BoardLayout, BoardMarker, BoardMarkerSchema, BoardMatrix, BoardMediaFileResolver, BoardMediaItemKind, BoardMediaKind, BoardMediaOrigin, BoardMediaOriginSchema, BoardMediaSize, BoardMediaSizeOptions, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardMediaSource, BoardMediaSourceSchema, BoardMediaTarget, 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, BoardTextFont, BoardTextItem, BoardTextItemSchema, BoardTextLayout, BoardTextLayouter, BoardTextLines, type BoardThemeId, BoardToolStyleMap, BoardToolStylePatch, BoardTrack, BoardTrackSchema, BoardValueKind, BoardVec2, BoardVec2Schema, BoardVideoItem, BoardVideoItemSchema, BoardViewport, BoardWorldOffset, BoardWorldPoint, BoardWorldRect, type BuildSnapshotInput, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, ClientToLocalInput, 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, SHAPE_LABEL_PADDING, 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, adoptBoardNaturalSize, anchorPoint, angleFromCenter, appendBoardDrawSamples, applyBoardDelta, applyBoardEvaluation, applyBoardPatch, applyBoardPatchToDocument, applyMatrix, arrowBindings, arrowHitRadius, arrowPathBounds, autoAnchorSide, availabilityFromError, bendControl, boardAnimationTime, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardColorCssVar, boardDocumentAt, boardEase, boardEditableText, boardFontFamily, boardItemOrigin, boardItemPreview, boardItemSchema, boardJsonSchema, boardMediaTarget, boardModelFormat, boardNestedAnimation, boardNestedAnimationTrack, boardOriginKey, boardPatchTouches, boardPathTrack, boardPresetTracks, boardReplayActorKind, boardSchemaOverview, boardScriptHitVisible, boardScriptItems, boardScriptScope, boardScriptTarget, boardSequence, boardSequencePatch, boardTaskCardSize, boardTaskSource, boardTextureBytes, boardTextureEdge, boardTexturePixels, buildBoardScene, buildCodeExcerpt, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, builtinBoardItems, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardFontSize, clampBoardStrokeSize, clampBoardFontSize as clampBoardTextFontSize, clampZoom, clientToLocal, 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, elementClientToLocal, emptyBoardDocument, estimateTextWidth, evaluateBoardAnimations, expandRect, exportItemBounds, featuredTaskArtifact, fileBaseName, fileCategory, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileStem, fileTypeLabel, fitBoardMediaSize, fitToContent, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameLabelHitRect, frameLabelOffset, 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, layoutShapeLabel, 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, probeBoardMediaSize, 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, setBoardTextLayouter, settleBoardMediaSizes, shouldFetchFileExcerpt, sideAnchor, simplifyDrawIndices, splitFrontmatter, stableCullRect, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, titleForBoardItem, toSceneItem, trackReferences, trimDrawPoints, unionRects, validateBoardScriptCommit, validateBoardScriptOutput, visibleWorldRect, withObservedArtifactFacts, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround };