@neta-art/cohub 9.0.0 → 10.0.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 (178) hide show
  1. package/README.md +100 -103
  2. package/dist/board/editor/align.d.ts +11 -0
  3. package/dist/board/editor/align.js +72 -0
  4. package/dist/board/editor/animation.d.ts +14 -0
  5. package/dist/board/editor/animation.js +172 -0
  6. package/dist/board/editor/camera.d.ts +32 -0
  7. package/dist/board/editor/camera.js +137 -0
  8. package/dist/board/editor/clipboard.d.ts +41 -0
  9. package/dist/board/editor/clipboard.js +122 -0
  10. package/dist/board/editor/connection-ports.d.ts +19 -0
  11. package/dist/board/editor/connection-ports.js +85 -0
  12. package/dist/board/editor/context.d.ts +111 -0
  13. package/dist/board/editor/context.js +30 -0
  14. package/dist/board/editor/copy.d.ts +17 -0
  15. package/dist/board/editor/copy.js +116 -0
  16. package/dist/board/editor/creation.d.ts +47 -0
  17. package/dist/board/editor/creation.js +224 -0
  18. package/dist/board/editor/deletion.d.ts +9 -0
  19. package/dist/board/editor/deletion.js +90 -0
  20. package/dist/board/editor/document-edits.d.ts +22 -0
  21. package/dist/board/editor/document-edits.js +193 -0
  22. package/dist/board/editor/document.d.ts +35 -0
  23. package/dist/board/editor/document.js +255 -0
  24. package/dist/board/editor/editor.d.ts +210 -0
  25. package/dist/board/editor/editor.js +429 -0
  26. package/dist/board/editor/index.d.ts +18 -0
  27. package/dist/board/editor/index.js +12 -0
  28. package/dist/board/editor/interaction.d.ts +115 -0
  29. package/dist/board/editor/interaction.js +584 -0
  30. package/dist/board/editor/query.d.ts +27 -0
  31. package/dist/board/editor/query.js +201 -0
  32. package/dist/board/editor/remote.d.ts +11 -0
  33. package/dist/board/editor/remote.js +55 -0
  34. package/dist/board/editor/selection-transform.d.ts +24 -0
  35. package/dist/board/editor/selection-transform.js +81 -0
  36. package/dist/board/editor/selection.d.ts +33 -0
  37. package/dist/board/editor/selection.js +196 -0
  38. package/dist/board/editor/snapping.d.ts +33 -0
  39. package/dist/board/editor/snapping.js +75 -0
  40. package/dist/board/editor/snapshots.d.ts +27 -0
  41. package/dist/board/editor/snapshots.js +132 -0
  42. package/dist/board/editor/spatial.d.ts +41 -0
  43. package/dist/board/editor/spatial.js +191 -0
  44. package/dist/board/editor/state.d.ts +12 -0
  45. package/dist/board/editor/state.js +49 -0
  46. package/dist/board/editor/tool.d.ts +10 -0
  47. package/dist/board/editor/tool.js +19 -0
  48. package/dist/board/editor/wheel.d.ts +5 -0
  49. package/dist/board/editor/wheel.js +17 -0
  50. package/dist/board/export/index.d.ts +5 -4
  51. package/dist/board/export/index.js +4 -3
  52. package/dist/board/export/node/index.d.ts +55 -0
  53. package/dist/board/{headless → export/node}/index.js +12 -12
  54. package/dist/board/export/node/sketch.d.ts +19 -0
  55. package/dist/board/{headless → export/node}/sketch.js +6 -6
  56. package/dist/board/export/scene.d.ts +6 -4
  57. package/dist/board/export/scene.js +4 -3
  58. package/dist/board/{animation.d.ts → model/animation.d.ts} +4 -4
  59. package/dist/board/{animation.js → model/animation.js} +3 -3
  60. package/dist/board/{core → model}/arrow-geometry.d.ts +2 -2
  61. package/dist/board/{core → model}/arrow-geometry.js +2 -2
  62. package/dist/board/{core → model}/draw-geometry.d.ts +2 -2
  63. package/dist/board/{core → model}/draw-geometry.js +1 -1
  64. package/dist/board/model/draw-input.d.ts +14 -0
  65. package/dist/board/model/draw-input.js +28 -0
  66. package/dist/board/{core → model}/export-assets.d.ts +1 -1
  67. package/dist/board/{core → model}/export-assets.js +1 -1
  68. package/dist/board/{core → model}/export-plan.d.ts +2 -2
  69. package/dist/board/{core → model}/export-plan.js +2 -2
  70. package/dist/board/{core → model}/file-preview.d.ts +1 -1
  71. package/dist/board/{core → model}/file-preview.js +1 -1
  72. package/dist/board/{core → model}/file-snapshot.d.ts +1 -1
  73. package/dist/board/{core → model}/file-snapshot.js +1 -1
  74. package/dist/board/{geometry.d.ts → model/geometry.d.ts} +3 -3
  75. package/dist/board/{geometry.js → model/geometry.js} +1 -1
  76. package/dist/board/{image-key.d.ts → model/image-key.d.ts} +2 -2
  77. package/dist/board/{image-key.js → model/image-key.js} +1 -1
  78. package/dist/board/model/index.d.ts +35 -0
  79. package/dist/board/{index.js → model/index.js} +26 -22
  80. package/dist/board/model/items/builtin.d.ts +5 -0
  81. package/dist/board/model/items/builtin.js +119 -0
  82. package/dist/board/model/items/create.d.ts +59 -0
  83. package/dist/board/model/items/create.js +271 -0
  84. package/dist/board/model/items/definition.d.ts +35 -0
  85. package/dist/board/model/items/definition.js +18 -0
  86. package/dist/board/model/items/id.d.ts +5 -0
  87. package/dist/board/model/items/id.js +11 -0
  88. package/dist/board/model/items/index.d.ts +6 -0
  89. package/dist/board/model/items/index.js +6 -0
  90. package/dist/board/model/items/registry.d.ts +35 -0
  91. package/dist/board/model/items/registry.js +84 -0
  92. package/dist/board/{media-playback.d.ts → model/media-playback.d.ts} +2 -2
  93. package/dist/board/{media-playback.js → model/media-playback.js} +1 -1
  94. package/dist/board/{media.d.ts → model/media.d.ts} +1 -1
  95. package/dist/board/{media.js → model/media.js} +1 -1
  96. package/dist/board/{core → model}/palette.d.ts +1 -1
  97. package/dist/board/{core → model}/palette.js +1 -1
  98. package/dist/board/{presets.d.ts → model/presets.d.ts} +3 -3
  99. package/dist/board/{presets.js → model/presets.js} +1 -1
  100. package/dist/board/{replay.d.ts → model/replay.d.ts} +5 -5
  101. package/dist/board/{replay.js → model/replay.js} +2 -2
  102. package/dist/board/{core → model}/scene.d.ts +1 -1
  103. package/dist/board/{core → model}/scene.js +1 -1
  104. package/dist/board/model/shape-types.d.ts +8 -0
  105. package/dist/board/model/shape-types.js +8 -0
  106. package/dist/board/{task.d.ts → model/task.d.ts} +4 -4
  107. package/dist/board/{task.js → model/task.js} +3 -3
  108. package/dist/board/{core → model}/text-metrics.d.ts +1 -1
  109. package/dist/board/{core → model}/text-metrics.js +1 -1
  110. package/dist/board/{core → model}/tool-styles.d.ts +1 -1
  111. package/dist/board/{core → model}/tool-styles.js +1 -1
  112. package/dist/board/{runtime/board-player.d.ts → player/index.d.ts} +2 -2
  113. package/dist/board/{runtime/board-player.js → player/index.js} +5 -4
  114. package/dist/board/render/board-background.d.ts +1 -1
  115. package/dist/board/render/clip.d.ts +1 -1
  116. package/dist/board/render/index.d.ts +2 -2
  117. package/dist/board/render/index.js +2 -2
  118. package/dist/board/render/media-interaction.d.ts +2 -2
  119. package/dist/board/render/media-interaction.js +1 -1
  120. package/dist/board/render/palette.d.ts +1 -1
  121. package/dist/board/render/palette.js +1 -1
  122. package/dist/board/render/renderers/arrow-card-renderer.js +1 -1
  123. package/dist/board/render/renderers/board-renderer-registry.d.ts +11 -6
  124. package/dist/board/render/renderers/board-renderer-registry.js +15 -15
  125. package/dist/board/render/renderers/draw-card-renderer.js +1 -1
  126. package/dist/board/render/renderers/far-plate.js +1 -1
  127. package/dist/board/render/renderers/file-card-renderer.d.ts +1 -1
  128. package/dist/board/render/renderers/file-card-renderer.js +2 -2
  129. package/dist/board/render/renderers/image-card-renderer.d.ts +1 -1
  130. package/dist/board/render/renderers/shape-card-renderer.js +1 -1
  131. package/dist/board/render/renderers/task-card-renderer.js +1 -1
  132. package/dist/board/render/renderers/text-card-renderer.js +1 -1
  133. package/dist/board/render/renderers/video-card-renderer.d.ts +1 -1
  134. package/dist/board/render/stroke.d.ts +1 -1
  135. package/dist/board/render/stroke.js +1 -1
  136. package/dist/board/render/text-measurement.js +1 -1
  137. package/dist/board/replica/index.d.ts +70 -0
  138. package/dist/board/replica/index.js +276 -0
  139. package/dist/board/stage/assets.d.ts +41 -0
  140. package/dist/board/stage/assets.js +350 -0
  141. package/dist/board/stage/index.d.ts +8 -0
  142. package/dist/board/stage/index.js +8 -0
  143. package/dist/board/stage/lru.d.ts +32 -0
  144. package/dist/board/stage/lru.js +29 -0
  145. package/dist/board/stage/pointer.d.ts +8 -0
  146. package/dist/board/stage/pointer.js +33 -0
  147. package/dist/board/stage/scene.d.ts +85 -0
  148. package/dist/board/stage/scene.js +512 -0
  149. package/dist/board/stage/stage.d.ts +66 -0
  150. package/dist/board/stage/stage.js +568 -0
  151. package/dist/board/stage/texture-pool.d.ts +24 -0
  152. package/dist/board/stage/texture-pool.js +154 -0
  153. package/dist/board/stage/views.d.ts +38 -0
  154. package/dist/board/stage/views.js +93 -0
  155. package/dist/chunks/environment.d.ts +25 -1
  156. package/dist/chunks/http.d.ts +99 -66
  157. package/dist/chunks/http.js +214 -207
  158. package/dist/chunks/websocket.d.ts +1 -1
  159. package/dist/http.d.ts +2 -2
  160. package/dist/index.d.ts +3 -3
  161. package/dist/index.js +20 -4
  162. package/dist/media.d.ts +1 -10
  163. package/dist/media.js +16 -27
  164. package/dist/protocol/dist/board-patch.js +1 -1
  165. package/dist/protocol/dist/board.d.ts +28 -2
  166. package/dist/protocol/dist/board.js +3 -1
  167. package/dist/protocol/dist/core/media.d.ts +5 -0
  168. package/dist/protocol/dist/core/media.js +39 -0
  169. package/dist/protocol/dist/index.d.ts +5 -5
  170. package/dist/types.d.ts +1 -1
  171. package/package.json +26 -14
  172. package/dist/board/core/shape-definition.d.ts +0 -23
  173. package/dist/board/core/shape-definition.js +0 -45
  174. package/dist/board/core/shape-types.d.ts +0 -38
  175. package/dist/board/core/shape-types.js +0 -22
  176. package/dist/board/headless/index.d.ts +0 -55
  177. package/dist/board/headless/sketch.d.ts +0 -19
  178. package/dist/board/index.d.ts +0 -30
@@ -0,0 +1,255 @@
1
+ import { IDENTITY_MATRIX, arrowBindings } from "../../protocol/dist/board-layout.js";
2
+ import { applyBoardPatchToDocument } from "../../protocol/dist/board-patch.js";
3
+ import { compileBoardAnimations, evaluateBoardAnimations } from "../model/animation.js";
4
+ import { buildBoardScene, placeItem, refreshBoardScene } from "../model/scene.js";
5
+ import { diffBoardEdits, isEmptyBoardPatch, routeBoardEdits, sameJson } from "./document-edits.js";
6
+ //#region src/board/editor/document.ts
7
+ function createDocumentModule(ctx) {
8
+ const { state, options } = ctx;
9
+ const draft = /* @__PURE__ */ new Map();
10
+ const draftOrigins = /* @__PURE__ */ new Map();
11
+ const recentlyAdded = /* @__PURE__ */ new Set();
12
+ let evaluated = /* @__PURE__ */ new Map();
13
+ let played = /* @__PURE__ */ new Map();
14
+ let compiled = null;
15
+ function markAdded(ids) {
16
+ if (ids.length === 0) return;
17
+ recentlyAdded.clear();
18
+ for (const id of ids) recentlyAdded.add(id);
19
+ }
20
+ function consumeRecentlyAdded() {
21
+ const ids = [...recentlyAdded];
22
+ recentlyAdded.clear();
23
+ return ids;
24
+ }
25
+ function displayItem(id) {
26
+ if (draft.has(id)) return draft.get(id) ?? void 0;
27
+ return evaluated.get(id) ?? played.get(id) ?? state.base.items[id];
28
+ }
29
+ function displayDocument() {
30
+ const base = state.base;
31
+ if (draft.size === 0 && evaluated.size === 0 && played.size === 0) return base;
32
+ const items = { ...base.items };
33
+ for (const [id, item] of played) items[id] = item;
34
+ for (const [id, item] of evaluated) items[id] = item;
35
+ for (const [id, item] of draft) if (item) items[id] = item;
36
+ else delete items[id];
37
+ return {
38
+ ...base,
39
+ items
40
+ };
41
+ }
42
+ function reevaluate() {
43
+ const { base, playhead } = state;
44
+ if (!playhead || !base.animations[playhead.animationId]) {
45
+ evaluated = /* @__PURE__ */ new Map();
46
+ return;
47
+ }
48
+ if (!compiled || compiled.animations !== base.animations || compiled.items !== base.items) compiled = {
49
+ animations: base.animations,
50
+ items: base.items,
51
+ value: compileBoardAnimations(base)
52
+ };
53
+ evaluated = evaluateBoardAnimations(compiled.value, { [playhead.animationId]: playhead.time }).items;
54
+ }
55
+ function setPlayedItems(items) {
56
+ const previous = played;
57
+ played = new Map([...items].filter(([id]) => state.base.items[id]));
58
+ const changed = /* @__PURE__ */ new Set([...previous.keys(), ...played.keys()]);
59
+ for (const id of changed) if (draft.has(id) || evaluated.has(id) || sameJson(previous.get(id), played.get(id))) changed.delete(id);
60
+ if (changed.size) rescene(changed);
61
+ }
62
+ function rescene(ids) {
63
+ if (ids) {
64
+ const changed = [...ids];
65
+ state.scene = refreshBoardScene(state.scene, displayItem, changed);
66
+ ctx.query.invalidate(changed);
67
+ } else {
68
+ state.scene = buildBoardScene(displayDocument(), state.scene);
69
+ ctx.query.invalidate();
70
+ state.structureVersion += 1;
71
+ }
72
+ state.geometryVersion += 1;
73
+ }
74
+ function reset(next) {
75
+ state.base = next;
76
+ draft.clear();
77
+ draftOrigins.clear();
78
+ played = /* @__PURE__ */ new Map();
79
+ reevaluate();
80
+ state.scene = buildBoardScene(next);
81
+ ctx.query.invalidate();
82
+ state.structureVersion += 1;
83
+ state.geometryVersion += 1;
84
+ }
85
+ function setDraftItem(id, item) {
86
+ if (!draft.has(id)) {
87
+ const shown = displayItem(id);
88
+ if (shown) draftOrigins.set(id, shown);
89
+ }
90
+ draft.set(id, item);
91
+ }
92
+ function draftItem(id) {
93
+ return draft.get(id);
94
+ }
95
+ function dropDraftItem(id) {
96
+ draft.delete(id);
97
+ }
98
+ function writeDraft(changes, structural = false) {
99
+ if (changes.size === 0) return;
100
+ for (const [id, item] of changes) setDraftItem(id, item);
101
+ if (!structural) for (const [id, item] of changes) {
102
+ const before = state.scene.get(id);
103
+ if (!item || !before || before.parent !== item.parent || before.z !== item.z || !sameJson(arrowBindings(before), arrowBindings(item))) {
104
+ structural = true;
105
+ break;
106
+ }
107
+ }
108
+ rescene(structural ? void 0 : changes.keys());
109
+ }
110
+ function discardDraft() {
111
+ draft.clear();
112
+ draftOrigins.clear();
113
+ reevaluate();
114
+ rescene();
115
+ }
116
+ function send(patch) {
117
+ if (options.readonly || isEmptyBoardPatch(patch)) return;
118
+ state.pendingCommits += 1;
119
+ Promise.resolve(options.onCommit(patch)).then(() => {
120
+ state.saveError = null;
121
+ }).catch((error) => {
122
+ state.saveError = error instanceof Error ? error.message : "Failed to sync board";
123
+ }).finally(() => {
124
+ state.pendingCommits -= 1;
125
+ });
126
+ }
127
+ function adopt(next, changedIds) {
128
+ const base = state.base;
129
+ const structural = played.size > 0 || !changedIds || next.animations !== base.animations || next.board !== base.board;
130
+ state.base = next;
131
+ played = /* @__PURE__ */ new Map();
132
+ draft.clear();
133
+ draftOrigins.clear();
134
+ reevaluate();
135
+ if (structural || state.playhead) {
136
+ rescene();
137
+ return;
138
+ }
139
+ const ids = [...changedIds];
140
+ rescene(ids.some((id) => {
141
+ const before = state.scene.get(id);
142
+ const after = next.items[id];
143
+ return !before || !after || before.parent !== after.parent || before.z !== after.z || !sameJson(arrowBindings(before), arrowBindings(after));
144
+ }) ? void 0 : ids);
145
+ }
146
+ function commit(extra = {}, record = true) {
147
+ const ids = [...draft.keys()];
148
+ const base = state.base;
149
+ let target = routeBoardEdits({
150
+ base,
151
+ evaluated,
152
+ draft,
153
+ playhead: state.playhead,
154
+ recording: state.recording,
155
+ displayed: draftOrigins
156
+ });
157
+ if (extra.board) target = {
158
+ ...target,
159
+ board: extra.board
160
+ };
161
+ if (extra.animations) target = {
162
+ ...target,
163
+ animations: extra.animations
164
+ };
165
+ const redo = diffBoardEdits(base, target, ids);
166
+ if (isEmptyBoardPatch(redo)) {
167
+ adopt(base);
168
+ return;
169
+ }
170
+ if (record) {
171
+ const undo = diffBoardEdits(target, base, ids);
172
+ state.undoStack = [...state.undoStack.slice(-199), {
173
+ undo,
174
+ redo
175
+ }];
176
+ state.redoStack = [];
177
+ }
178
+ adopt(target, ids);
179
+ send(redo);
180
+ }
181
+ function commitItems(changes, record = true) {
182
+ if (changes.size === 0) return;
183
+ for (const [id, item] of changes) setDraftItem(id, item);
184
+ commit({}, record);
185
+ }
186
+ function applyPatch(patch) {
187
+ const result = applyBoardPatchToDocument(state.base, patch);
188
+ if (!result.ok) {
189
+ state.saveError = result.diagnostics[0]?.message ?? "Could not apply the change";
190
+ return false;
191
+ }
192
+ adopt(result.document, Object.keys(patch.items ?? {}));
193
+ send(patch);
194
+ return true;
195
+ }
196
+ function undo() {
197
+ const entry = state.undoStack.at(-1);
198
+ if (!entry) return;
199
+ state.undoStack = state.undoStack.slice(0, -1);
200
+ if (applyPatch(entry.undo)) state.redoStack = [...state.redoStack, entry];
201
+ }
202
+ function redo() {
203
+ const entry = state.redoStack.at(-1);
204
+ if (!entry) return;
205
+ state.redoStack = state.redoStack.slice(0, -1);
206
+ if (applyPatch(entry.redo)) state.undoStack = [...state.undoStack, entry];
207
+ }
208
+ function previewSettings(settings) {
209
+ state.settingsPreview = settings;
210
+ }
211
+ function setSettings(settings) {
212
+ state.settingsPreview = null;
213
+ if (!sameJson(settings, state.base.board)) commit({ board: settings });
214
+ }
215
+ function reparent(item, frame, parent, box) {
216
+ const { parent: _previous, ...root } = item;
217
+ const orphan = root;
218
+ const next = parent ? {
219
+ ...orphan,
220
+ parent
221
+ } : orphan;
222
+ const matrix = parent ? state.scene.layout.matrix(parent) : IDENTITY_MATRIX;
223
+ return placeItem(next, frame, matrix, box);
224
+ }
225
+ function topZ(parent) {
226
+ let z = 0;
227
+ for (const id of state.scene.children(parent)) z = Math.max(z, displayItem(id)?.z ?? 0);
228
+ return z + 1;
229
+ }
230
+ return {
231
+ markAdded,
232
+ consumeRecentlyAdded,
233
+ displayItem,
234
+ reevaluate,
235
+ setPlayedItems,
236
+ rescene,
237
+ reset,
238
+ setDraftItem,
239
+ draftItem,
240
+ dropDraftItem,
241
+ writeDraft,
242
+ discardDraft,
243
+ adopt,
244
+ commit,
245
+ commitItems,
246
+ undo,
247
+ redo,
248
+ previewSettings,
249
+ setSettings,
250
+ reparent,
251
+ topZ
252
+ };
253
+ }
254
+ //#endregion
255
+ export { createDocumentModule };
@@ -0,0 +1,210 @@
1
+ import { BoardDocument, BoardItem, BoardMediaSnapshot, BoardSettings, BoardTaskSnapshot } from "../../protocol/dist/board-model.js";
2
+ import { BoardFrame } from "../../protocol/dist/board-layout.js";
3
+ import { BoardViewport, Rect, ScreenPoint, WorldPoint } from "../model/geometry.js";
4
+ import { BoardScene, BoardSceneItem } from "../model/scene.js";
5
+ import { BoardFileSnapshotFacts } from "../model/file-snapshot.js";
6
+ import { ShapeKind } from "../model/shape-types.js";
7
+ import { BoardItemInput, BoardRegistry } from "../model/items/registry.js";
8
+ import "../model/index.js";
9
+ import { AlignMode, DistributeAxis } from "./align.js";
10
+ import { BoardFocusOptions } from "./camera.js";
11
+ import { BoardSelectionTransform, BoardTransformControl } from "./selection-transform.js";
12
+ import { BoardInteraction, BoardPointerEvent } from "./interaction.js";
13
+ import { BoardAppMetadata, BoardTaskSource } from "./creation.js";
14
+ import { BoardClipboardPayload } from "./clipboard.js";
15
+ import { BoardNaturalSize } from "./snapshots.js";
16
+ import { SnapGuide } from "./snapping.js";
17
+ import { BoardEditorChannel, BoardEditorListener } from "./state.js";
18
+ import { BoardToolId } from "./tool.js";
19
+ import { BoardCameraPolicy, BoardEditorOptions, BoardPlayhead } from "./context.js";
20
+ //#region src/board/editor/editor.d.ts
21
+ declare function createBoardEditor(options: BoardEditorOptions): {
22
+ registry: BoardRegistry;
23
+ readonly: boolean;
24
+ subscribe: (channels: BoardEditorChannel | readonly BoardEditorChannel[], listener: BoardEditorListener) => () => void;
25
+ readonly document: BoardDocument;
26
+ readonly settings: {
27
+ title?: string | undefined;
28
+ background: {
29
+ kind: "dots" | "grid" | "image" | "solid";
30
+ color?: string | {
31
+ light: string;
32
+ dark: string;
33
+ } | undefined;
34
+ imageUrl?: string | undefined;
35
+ fit?: "contain" | "cover" | "repeat" | undefined;
36
+ opacity?: number | undefined;
37
+ };
38
+ grid?: {
39
+ visible: boolean;
40
+ size: number;
41
+ } | undefined;
42
+ enter?: {
43
+ preset: "deal" | "drop" | "fade-in" | "pop" | "rise";
44
+ duration?: number | undefined;
45
+ } | undefined;
46
+ };
47
+ readonly animations: Record<string, {
48
+ name?: string | undefined;
49
+ duration: number;
50
+ play: "always" | "auto" | "manual";
51
+ delay: number;
52
+ loop: boolean;
53
+ end: "hold" | "reset";
54
+ markers: {
55
+ at: number;
56
+ label?: string | undefined;
57
+ pause?: boolean | undefined;
58
+ }[];
59
+ tracks: Record<string, {
60
+ target: string;
61
+ property: string;
62
+ keyframes: {
63
+ at: number;
64
+ value: unknown;
65
+ ease?: string | undefined;
66
+ }[];
67
+ composite: "add" | "replace";
68
+ interpolation: "auto" | "spline" | "step";
69
+ orient?: boolean | undefined;
70
+ }>;
71
+ }>;
72
+ readonly scene: BoardScene;
73
+ readonly items: readonly BoardSceneItem[];
74
+ readonly hasContent: boolean;
75
+ readonly structureVersion: number;
76
+ readonly geometryVersion: number;
77
+ readonly selection: string[];
78
+ readonly selectedItems: BoardSceneItem[];
79
+ readonly hasFocusableSelection: boolean;
80
+ readonly selectionLocked: boolean;
81
+ readonly bounds: Rect | null;
82
+ readonly selectionTransform: BoardSelectionTransform | null;
83
+ readonly camera: BoardViewport;
84
+ readonly cameraPolicy: BoardCameraPolicy;
85
+ readonly playhead: BoardPlayhead | null;
86
+ readonly recording: boolean;
87
+ tool: BoardToolId;
88
+ activeColor: string;
89
+ activeShape: string;
90
+ activeStrokeSize: number;
91
+ readonly interaction: BoardInteraction;
92
+ readonly gestureActive: boolean;
93
+ readonly marquee: Rect | null;
94
+ readonly snapGuides: SnapGuide[];
95
+ spaceHeld: boolean;
96
+ readonly arrowDraft: {
97
+ from: WorldPoint;
98
+ to: WorldPoint;
99
+ size: number;
100
+ color: string;
101
+ targetFrame: BoardFrame | null;
102
+ } | null;
103
+ readonly bindTargetFrame: BoardFrame | null;
104
+ readonly hoverId: string | null;
105
+ readonly pointerType: string;
106
+ readonly hoveredTransformControl: BoardTransformControl | null;
107
+ readonly connectionPorts: {
108
+ itemId: string;
109
+ x: number;
110
+ y: number;
111
+ radius: number;
112
+ }[];
113
+ readonly hoveredConnectionPort: {
114
+ x: number;
115
+ y: number;
116
+ } | null;
117
+ editingId: string | null;
118
+ readonly canUndo: boolean;
119
+ readonly canRedo: boolean;
120
+ readonly saveError: string | null;
121
+ readonly saving: boolean;
122
+ surfaceSize: {
123
+ width: number;
124
+ height: number;
125
+ };
126
+ loadDocument: (next: BoardDocument, key?: string) => void;
127
+ undo: () => void;
128
+ redo: () => void;
129
+ retrySave: () => void;
130
+ setSettings: (settings: BoardSettings) => void;
131
+ previewSettings: (settings: BoardSettings) => void;
132
+ setPlayedItems: (items: ReadonlyMap<string, BoardItem>) => void;
133
+ consumeRecentlyAdded: () => string[];
134
+ itemAt: (point: WorldPoint, exclude?: ReadonlySet<string> | undefined) => BoardSceneItem | null;
135
+ itemById: (id: string) => BoardSceneItem | null;
136
+ labelItemAt: (point: WorldPoint) => BoardSceneItem | null;
137
+ idsInRect: (rect: Rect) => string[];
138
+ setCamera: (viewport: BoardViewport) => void;
139
+ setCameraPolicy: (policy: BoardCameraPolicy) => void;
140
+ takeCameraControl: () => void;
141
+ viewCenter: () => WorldPoint;
142
+ zoomAt: (point: ScreenPoint, factor: number, animate?: boolean) => void;
143
+ zoomIn: () => void;
144
+ zoomOut: () => void;
145
+ resetZoom: () => void;
146
+ fitView: (focus?: BoardFocusOptions) => void;
147
+ focusRect: (rect: Rect, focus?: BoardFocusOptions) => void;
148
+ focusItems: (ids: Iterable<string>, focus?: BoardFocusOptions) => void;
149
+ focusNode: (id: string, focus?: BoardFocusOptions) => void;
150
+ focusSelection: (focus?: BoardFocusOptions) => void;
151
+ wheel: (point: ScreenPoint, deltaX: number, deltaY: number, zoomKey: boolean, deltaMode?: number) => void;
152
+ setSelection: (ids: string[]) => void;
153
+ clearSelection: () => void;
154
+ selectAll: () => void;
155
+ nudgeSelection: (dx: number, dy: number, large: boolean) => void;
156
+ alignSelection: (mode: AlignMode) => void;
157
+ distributeSelection: (axis: DistributeAxis) => void;
158
+ toggleSelectionLock: () => void;
159
+ setSelectionColor: (color: string) => void;
160
+ setSelectionStyle: (style: Partial<BoardItem["style"]>) => void;
161
+ setSelectionProps: (type: string, props: Record<string, unknown>) => void;
162
+ bringToFront: () => void;
163
+ sendToBack: () => void;
164
+ addItem: (type: string, input: BoardItemInput) => string | null;
165
+ addApp: (app: BoardAppMetadata, at: WorldPoint) => string;
166
+ addFile: (path: string, at: WorldPoint, snapshot?: BoardMediaSnapshot & BoardFileSnapshotFacts) => string;
167
+ addTask: (taskRunId: string, snapshot: BoardTaskSnapshot, at: WorldPoint, metadata?: Record<string, unknown>) => string;
168
+ addTaskWithSources: (taskRunId: string, snapshot: BoardTaskSnapshot, at: WorldPoint, sources: BoardTaskSource[], metadata?: Record<string, unknown>) => string | null;
169
+ addText: (text: string, at: WorldPoint) => void;
170
+ addShape: (at: WorldPoint, geometry?: ShapeKind) => void;
171
+ addFrame: (at: WorldPoint) => void;
172
+ beginTextDraft: (at: WorldPoint) => void;
173
+ commitTextEdit: (id: string, text: string) => void;
174
+ updateText: (id: string, text: string, created?: boolean) => void;
175
+ previewTextLayout: (id: string, text: string) => void;
176
+ deleteSelection: () => void;
177
+ deleteItem: (id: string) => void;
178
+ duplicateSelection: () => void;
179
+ copySelection: () => BoardClipboardPayload | null;
180
+ cutSelection: () => BoardClipboardPayload | null;
181
+ pasteClipboard: (raw?: unknown, at?: WorldPoint) => void;
182
+ applyMediaFileChange: (path: string, change: {
183
+ size?: number;
184
+ mtimeMs?: number;
185
+ removed?: boolean;
186
+ }) => void;
187
+ adoptMediaNaturalSizes: (sizes: BoardNaturalSize[]) => void;
188
+ applyFileSnapshots: (snapshots: Array<{
189
+ id: string;
190
+ snapshot: BoardFileSnapshotFacts;
191
+ replace?: boolean;
192
+ }>) => void;
193
+ applyTaskSnapshots: (snapshots: ReadonlyMap<string, BoardTaskSnapshot>) => void;
194
+ setPlayhead: (next: BoardPlayhead | null) => void;
195
+ setRecording: (value: boolean) => void;
196
+ keyframeState: (property: string) => "animated" | "keyframe" | "none";
197
+ toggleKeyframe: (property: string) => void;
198
+ removeKeyframe: (trackId: string, at: number) => void;
199
+ setKeyframeEase: (trackId: string, at: number, ease: string | null) => void;
200
+ createAnimation: (name: string, duration?: number) => string;
201
+ pointerDown: (event: BoardPointerEvent) => void;
202
+ pointerMove: (event: BoardPointerEvent) => void;
203
+ pointerUp: (event: BoardPointerEvent) => void;
204
+ pointerLeave: () => void;
205
+ cancelPointerInteraction: () => void;
206
+ destroy(): void;
207
+ };
208
+ type BoardEditor = ReturnType<typeof createBoardEditor>;
209
+ //#endregion
210
+ export { BoardEditor, createBoardEditor };