@neta-art/cohub 9.0.1 → 11.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 (240) hide show
  1. package/README.md +108 -102
  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 +17 -0
  5. package/dist/board/editor/animation.js +187 -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 +129 -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 +121 -0
  16. package/dist/board/editor/creation.d.ts +51 -0
  17. package/dist/board/editor/creation.js +225 -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 +41 -0
  23. package/dist/board/editor/document.js +302 -0
  24. package/dist/board/editor/editor.d.ts +225 -0
  25. package/dist/board/editor/editor.js +439 -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 +203 -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 +197 -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 +28 -6
  51. package/dist/board/export/index.js +47 -13
  52. package/dist/board/export/node/index.d.ts +56 -0
  53. package/dist/board/{headless → export/node}/index.js +26 -21
  54. package/dist/board/export/node/scripts.d.ts +16 -0
  55. package/dist/board/export/node/scripts.js +258 -0
  56. package/dist/board/export/scene.d.ts +8 -5
  57. package/dist/board/export/scene.js +24 -9
  58. package/dist/board/{animation.d.ts → model/animation.d.ts} +8 -5
  59. package/dist/board/{animation.js → model/animation.js} +37 -10
  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/model/authoring.d.ts +20 -0
  63. package/dist/board/model/authoring.js +185 -0
  64. package/dist/board/{core → model}/draw-geometry.d.ts +2 -2
  65. package/dist/board/{core → model}/draw-geometry.js +1 -1
  66. package/dist/board/model/draw-input.d.ts +14 -0
  67. package/dist/board/model/draw-input.js +28 -0
  68. package/dist/board/{core → model}/export-assets.d.ts +1 -1
  69. package/dist/board/{core → model}/export-assets.js +1 -1
  70. package/dist/board/{core → model}/export-plan.d.ts +2 -2
  71. package/dist/board/{core → model}/export-plan.js +3 -2
  72. package/dist/board/{core → model}/file-preview.d.ts +1 -1
  73. package/dist/board/{core → model}/file-preview.js +2 -2
  74. package/dist/board/{core → model}/file-snapshot.d.ts +1 -1
  75. package/dist/board/{core → model}/file-snapshot.js +4 -3
  76. package/dist/board/{geometry.d.ts → model/geometry.d.ts} +3 -3
  77. package/dist/board/{geometry.js → model/geometry.js} +1 -1
  78. package/dist/board/{image-key.d.ts → model/image-key.d.ts} +2 -2
  79. package/dist/board/{image-key.js → model/image-key.js} +7 -3
  80. package/dist/board/model/index.d.ts +42 -0
  81. package/dist/board/model/index.js +39 -0
  82. package/dist/board/model/items/builtin.d.ts +5 -0
  83. package/dist/board/model/items/builtin.js +119 -0
  84. package/dist/board/model/items/create.d.ts +61 -0
  85. package/dist/board/model/items/create.js +272 -0
  86. package/dist/board/model/items/definition.d.ts +35 -0
  87. package/dist/board/model/items/definition.js +18 -0
  88. package/dist/board/model/items/id.d.ts +5 -0
  89. package/dist/board/model/items/id.js +11 -0
  90. package/dist/board/model/items/index.d.ts +6 -0
  91. package/dist/board/model/items/index.js +6 -0
  92. package/dist/board/model/items/registry.d.ts +35 -0
  93. package/dist/board/model/items/registry.js +84 -0
  94. package/dist/board/{media-playback.d.ts → model/media-playback.d.ts} +4 -3
  95. package/dist/board/{media-playback.js → model/media-playback.js} +15 -5
  96. package/dist/board/{media.d.ts → model/media.d.ts} +1 -1
  97. package/dist/board/{media.js → model/media.js} +8 -2
  98. package/dist/board/{core → model}/palette.d.ts +1 -1
  99. package/dist/board/{core → model}/palette.js +1 -1
  100. package/dist/board/{presets.d.ts → model/presets.d.ts} +3 -3
  101. package/dist/board/{presets.js → model/presets.js} +1 -1
  102. package/dist/board/{replay.d.ts → model/replay.d.ts} +5 -5
  103. package/dist/board/{replay.js → model/replay.js} +2 -2
  104. package/dist/board/model/sampling.d.ts +19 -0
  105. package/dist/board/model/sampling.js +96 -0
  106. package/dist/board/{core → model}/scene.d.ts +1 -1
  107. package/dist/board/{core → model}/scene.js +1 -1
  108. package/dist/board/model/script-example.d.ts +4 -0
  109. package/dist/board/model/script-example.js +21 -0
  110. package/dist/board/model/script-hit.d.ts +10 -0
  111. package/dist/board/model/script-hit.js +52 -0
  112. package/dist/board/model/script-index.d.ts +7 -0
  113. package/dist/board/model/script-index.js +15 -0
  114. package/dist/board/model/script-scene.d.ts +24 -0
  115. package/dist/board/model/script-scene.js +267 -0
  116. package/dist/board/model/script.d.ts +105 -0
  117. package/dist/board/model/script.js +1 -0
  118. package/dist/board/model/shape-types.d.ts +8 -0
  119. package/dist/board/model/shape-types.js +8 -0
  120. package/dist/board/{task.d.ts → model/task.d.ts} +4 -4
  121. package/dist/board/{task.js → model/task.js} +3 -3
  122. package/dist/board/{core → model}/text-metrics.d.ts +1 -1
  123. package/dist/board/{core → model}/text-metrics.js +1 -1
  124. package/dist/board/{core → model}/tool-styles.d.ts +1 -1
  125. package/dist/board/{core → model}/tool-styles.js +1 -1
  126. package/dist/board/{runtime/board-player.d.ts → player/index.d.ts} +2 -2
  127. package/dist/board/{runtime/board-player.js → player/index.js} +5 -4
  128. package/dist/board/render/board-background.d.ts +1 -1
  129. package/dist/board/render/clip.d.ts +1 -1
  130. package/dist/board/render/css-color.d.ts +6 -1
  131. package/dist/board/render/css-color.js +34 -20
  132. package/dist/board/render/diagnostics.d.ts +20 -0
  133. package/dist/board/render/diagnostics.js +117 -0
  134. package/dist/board/render/index.d.ts +9 -6
  135. package/dist/board/render/index.js +10 -7
  136. package/dist/board/render/media-interaction.d.ts +2 -2
  137. package/dist/board/render/media-interaction.js +1 -1
  138. package/dist/board/render/palette.d.ts +3 -2
  139. package/dist/board/render/palette.js +7 -3
  140. package/dist/board/render/renderers/arrow-card-renderer.js +4 -3
  141. package/dist/board/render/renderers/audio-card-renderer.js +2 -1
  142. package/dist/board/render/renderers/board-renderer-registry.d.ts +20 -10
  143. package/dist/board/render/renderers/board-renderer-registry.js +17 -17
  144. package/dist/board/render/renderers/custom-card-renderer.d.ts +5 -0
  145. package/dist/board/render/renderers/{sketch-card-renderer.js → custom-card-renderer.js} +16 -15
  146. package/dist/board/render/renderers/draw-card-renderer.js +4 -3
  147. package/dist/board/render/renderers/effect-card-renderer.js +22 -5
  148. package/dist/board/render/renderers/far-plate.js +1 -1
  149. package/dist/board/render/renderers/file-card-renderer.d.ts +1 -1
  150. package/dist/board/render/renderers/file-card-renderer.js +2 -2
  151. package/dist/board/render/renderers/frame-card-renderer.js +30 -14
  152. package/dist/board/render/renderers/image-card-renderer.d.ts +1 -1
  153. package/dist/board/render/renderers/image-card-renderer.js +43 -4
  154. package/dist/board/render/renderers/shape-card-renderer.js +11 -28
  155. package/dist/board/render/renderers/task-card-renderer.js +1 -1
  156. package/dist/board/render/renderers/text-card-renderer.js +6 -4
  157. package/dist/board/render/renderers/unknown-card-renderer.js +1 -0
  158. package/dist/board/render/renderers/video-card-renderer.d.ts +1 -1
  159. package/dist/board/render/renderers/video-card-renderer.js +2 -1
  160. package/dist/board/render/sampling.d.ts +22 -0
  161. package/dist/board/render/sampling.js +21 -0
  162. package/dist/board/render/script-export.d.ts +11 -0
  163. package/dist/board/render/script-export.js +86 -0
  164. package/dist/board/render/script-host.d.ts +31 -0
  165. package/dist/board/render/script-host.js +421 -0
  166. package/dist/board/render/script-modules.d.ts +2 -0
  167. package/dist/board/render/script-modules.js +2 -0
  168. package/dist/board/render/script-runtime.d.ts +29 -0
  169. package/dist/board/render/script-runtime.js +213 -0
  170. package/dist/board/render/script-sandbox.d.ts +4 -0
  171. package/dist/board/render/script-sandbox.js +173 -0
  172. package/dist/board/render/stroke.d.ts +3 -2
  173. package/dist/board/render/stroke.js +23 -2
  174. package/dist/board/render/text-measurement.js +2 -2
  175. package/dist/board/replica/index.d.ts +70 -0
  176. package/dist/board/replica/index.js +276 -0
  177. package/dist/board/stage/assets.d.ts +41 -0
  178. package/dist/board/stage/assets.js +355 -0
  179. package/dist/board/stage/index.d.ts +8 -0
  180. package/dist/board/stage/index.js +8 -0
  181. package/dist/board/stage/lru.d.ts +32 -0
  182. package/dist/board/stage/lru.js +29 -0
  183. package/dist/board/stage/maintenance.d.ts +5 -0
  184. package/dist/board/stage/maintenance.js +11 -0
  185. package/dist/board/stage/pointer.d.ts +8 -0
  186. package/dist/board/stage/pointer.js +33 -0
  187. package/dist/board/stage/scene.d.ts +85 -0
  188. package/dist/board/stage/scene.js +515 -0
  189. package/dist/board/stage/script-pointer.d.ts +19 -0
  190. package/dist/board/stage/script-pointer.js +35 -0
  191. package/dist/board/stage/stage.d.ts +76 -0
  192. package/dist/board/stage/stage.js +774 -0
  193. package/dist/board/stage/texture-pool.d.ts +24 -0
  194. package/dist/board/stage/texture-pool.js +153 -0
  195. package/dist/board/stage/views.d.ts +38 -0
  196. package/dist/board/stage/views.js +93 -0
  197. package/dist/chunks/environment.d.ts +289 -23
  198. package/dist/chunks/host-bridge.d.ts +2 -2
  199. package/dist/chunks/http.d.ts +185 -71
  200. package/dist/chunks/http.js +368 -269
  201. package/dist/chunks/transport.js +3 -1
  202. package/dist/chunks/websocket.d.ts +9 -1
  203. package/dist/chunks/websocket.js +16 -2
  204. package/dist/host-bridge.js +2 -1
  205. package/dist/http.d.ts +2 -2
  206. package/dist/index.d.ts +182 -4
  207. package/dist/index.js +1393 -129
  208. package/dist/media.d.ts +1 -10
  209. package/dist/media.js +16 -27
  210. package/dist/protocol/dist/board-assets.d.ts +1 -0
  211. package/dist/protocol/dist/board-constants.js +2 -2
  212. package/dist/protocol/dist/board-model.d.ts +201 -11
  213. package/dist/protocol/dist/board-model.js +33 -14
  214. package/dist/protocol/dist/board-patch.js +3 -2
  215. package/dist/protocol/dist/board-schema.d.ts +4 -2
  216. package/dist/protocol/dist/board-schema.js +18 -4
  217. package/dist/protocol/dist/board-script-modules.d.ts +25 -0
  218. package/dist/protocol/dist/board-script-modules.js +127 -0
  219. package/dist/protocol/dist/board.d.ts +28 -2
  220. package/dist/protocol/dist/board.js +3 -1
  221. package/dist/protocol/dist/core/media.d.ts +5 -0
  222. package/dist/protocol/dist/core/media.js +39 -0
  223. package/dist/protocol/dist/display/index.d.ts +1 -0
  224. package/dist/protocol/dist/index.d.ts +7 -5
  225. package/dist/protocol/dist/realtime/types.d.ts +1 -0
  226. package/dist/protocol/dist/rtc/index.d.ts +1 -0
  227. package/dist/types.d.ts +1 -1
  228. package/package.json +21 -8
  229. package/dist/board/core/shape-definition.d.ts +0 -23
  230. package/dist/board/core/shape-definition.js +0 -45
  231. package/dist/board/core/shape-types.d.ts +0 -38
  232. package/dist/board/core/shape-types.js +0 -22
  233. package/dist/board/headless/index.d.ts +0 -55
  234. package/dist/board/headless/sketch.d.ts +0 -19
  235. package/dist/board/headless/sketch.js +0 -146
  236. package/dist/board/index.d.ts +0 -30
  237. package/dist/board/index.js +0 -29
  238. package/dist/board/render/renderers/sketch-card-renderer.d.ts +0 -5
  239. package/dist/board/render/sketch-host.d.ts +0 -14
  240. package/dist/board/render/sketch-host.js +0 -216
@@ -0,0 +1,439 @@
1
+ import { clampBoardStrokeSize } from "../../protocol/dist/board-constants.js";
2
+ import { hasBoardScripts } from "../model/script-index.js";
3
+ import { normalizeViewport } from "../model/geometry.js";
4
+ import { buildBoardScene } from "../model/scene.js";
5
+ import { isBoardColorId } from "../model/palette.js";
6
+ import { isShapeKind } from "../model/shape-types.js";
7
+ import { createBoardToolStyles } from "../model/tool-styles.js";
8
+ import { titleForBoardItem } from "../model/items/create.js";
9
+ import { defaultBoardRegistry } from "../model/items/registry.js";
10
+ import { createAnimationModule } from "./animation.js";
11
+ import { createCameraModule } from "./camera.js";
12
+ import { STATE_CHANNELS } from "./context.js";
13
+ import { createCopyModule } from "./copy.js";
14
+ import { isCreationBoardTool } from "./tool.js";
15
+ import { createCreationModule } from "./creation.js";
16
+ import { createDeletionModule } from "./deletion.js";
17
+ import { createDocumentModule } from "./document.js";
18
+ import { createChannels, observable } from "./state.js";
19
+ import { createInteractionModule } from "./interaction.js";
20
+ import { createQueryModule } from "./query.js";
21
+ import { createRemoteModule } from "./remote.js";
22
+ import { createSelectionModule } from "./selection.js";
23
+ import { createSnapshotsModule } from "./snapshots.js";
24
+ //#region src/board/editor/editor.ts
25
+ function styledToolId(tool) {
26
+ switch (tool) {
27
+ case "text":
28
+ case "shape":
29
+ case "draw":
30
+ case "arrow":
31
+ case "frame": return tool;
32
+ default: return null;
33
+ }
34
+ }
35
+ function createBoardEditor(options) {
36
+ const registry = options.registry ?? defaultBoardRegistry;
37
+ const channels = createChannels();
38
+ const track = options.track ?? (() => {});
39
+ const preferences = options.preferences;
40
+ const state = observable({
41
+ base: options.document,
42
+ settingsPreview: null,
43
+ scene: buildBoardScene(options.document),
44
+ structureVersion: 0,
45
+ geometryVersion: 0,
46
+ selection: [],
47
+ camera: normalizeViewport(options.viewport ?? {
48
+ x: 0,
49
+ y: 0,
50
+ zoom: 1
51
+ }),
52
+ surfaceSize: {
53
+ width: 0,
54
+ height: 0
55
+ },
56
+ cameraPolicy: preferences?.cameraPolicy ?? "follow",
57
+ tool: options.initialTool ?? "select",
58
+ toolStyles: preferences?.toolStyles ?? createBoardToolStyles(),
59
+ interaction: { type: "idle" },
60
+ snapGuides: [],
61
+ spaceHeld: false,
62
+ hoverId: null,
63
+ hoverPoint: null,
64
+ hoverPointerType: "mouse",
65
+ editingId: null,
66
+ draftTextId: null,
67
+ playhead: null,
68
+ recording: false,
69
+ undoStack: [],
70
+ redoStack: [],
71
+ saveError: null,
72
+ pendingCommits: 0
73
+ }, STATE_CHANNELS, channels);
74
+ const ctx = {
75
+ options,
76
+ registry,
77
+ state,
78
+ channels,
79
+ preferencesChanged() {
80
+ options.onPreferencesChange?.({
81
+ toolStyles: state.toolStyles,
82
+ cameraPolicy: state.cameraPolicy
83
+ });
84
+ }
85
+ };
86
+ ctx.document = createDocumentModule(ctx);
87
+ ctx.query = createQueryModule(ctx);
88
+ ctx.camera = createCameraModule(ctx);
89
+ ctx.selection = createSelectionModule(ctx);
90
+ ctx.creation = createCreationModule(ctx);
91
+ ctx.deletion = createDeletionModule(ctx);
92
+ ctx.copy = createCopyModule(ctx);
93
+ ctx.interaction = createInteractionModule(ctx);
94
+ ctx.animation = createAnimationModule(ctx);
95
+ ctx.snapshots = createSnapshotsModule(ctx);
96
+ ctx.remote = createRemoteModule(ctx);
97
+ const { document, query, camera, selection, creation, deletion, copy, interaction, animation, snapshots, remote } = ctx;
98
+ let viewStateQueued = false;
99
+ function emitViewState() {
100
+ viewStateQueued = false;
101
+ const onViewStateChange = options.onViewStateChange;
102
+ if (!onViewStateChange) return;
103
+ const selectedNodes = selection.items().map((item) => {
104
+ const title = titleForBoardItem(item).trim();
105
+ return {
106
+ id: item.id,
107
+ type: item.type,
108
+ ...title ? { title } : {}
109
+ };
110
+ });
111
+ onViewStateChange({
112
+ visibleRect: camera.visibleRect(),
113
+ selectedNodes
114
+ });
115
+ }
116
+ function queueViewState() {
117
+ if (viewStateQueued || !options.onViewStateChange) return;
118
+ viewStateQueued = true;
119
+ queueMicrotask(emitViewState);
120
+ }
121
+ const stopViewState = channels.subscribe([
122
+ "camera",
123
+ "selection",
124
+ "scene"
125
+ ], queueViewState);
126
+ queueViewState();
127
+ function setToolStyle(tool, patch) {
128
+ state.toolStyles = {
129
+ ...state.toolStyles,
130
+ [tool]: {
131
+ ...state.toolStyles[tool],
132
+ ...patch
133
+ }
134
+ };
135
+ ctx.preferencesChanged();
136
+ }
137
+ function read(channel, value) {
138
+ if (typeof channel === "string") track(channel);
139
+ else for (const each of channel) track(each);
140
+ return value();
141
+ }
142
+ function tracked(channels, query) {
143
+ return (...args) => read(channels, () => query(...args));
144
+ }
145
+ return {
146
+ registry,
147
+ readonly: options.readonly === true,
148
+ subscribe: channels.subscribe,
149
+ get hasScripts() {
150
+ return read("document", () => hasBoardScripts(state.base));
151
+ },
152
+ get document() {
153
+ return read("document", () => state.base);
154
+ },
155
+ get settings() {
156
+ return read("document", () => state.settingsPreview ?? state.base.board);
157
+ },
158
+ get animations() {
159
+ return read("document", () => state.base.animations);
160
+ },
161
+ get scene() {
162
+ return read("scene", () => state.scene);
163
+ },
164
+ get items() {
165
+ return read("scene", () => state.scene.items);
166
+ },
167
+ get hasContent() {
168
+ return read("scene", () => state.scene.items.length > 0);
169
+ },
170
+ get structureVersion() {
171
+ return read("scene", () => state.structureVersion);
172
+ },
173
+ get geometryVersion() {
174
+ return read("scene", () => state.geometryVersion);
175
+ },
176
+ get selection() {
177
+ return read("selection", () => state.selection);
178
+ },
179
+ get selectedItems() {
180
+ return read(["scene", "selection"], selection.items);
181
+ },
182
+ get hasFocusableSelection() {
183
+ return read(["scene", "selection"], () => selection.items().length > 0);
184
+ },
185
+ get selectionLocked() {
186
+ return read(["scene", "selection"], () => {
187
+ const items = selection.items();
188
+ return items.length > 0 && items.every((item) => item.locked);
189
+ });
190
+ },
191
+ get bounds() {
192
+ return read(["scene", "selection"], selection.bounds);
193
+ },
194
+ get selectionTransform() {
195
+ return read(["scene", "selection"], selection.transform);
196
+ },
197
+ get camera() {
198
+ return read("camera", () => state.camera);
199
+ },
200
+ get cameraPolicy() {
201
+ return read("camera", () => state.cameraPolicy);
202
+ },
203
+ get playhead() {
204
+ return read("playback", () => state.playhead);
205
+ },
206
+ get recording() {
207
+ return read("playback", () => state.recording);
208
+ },
209
+ get tool() {
210
+ return read("tool", () => state.tool);
211
+ },
212
+ set tool(value) {
213
+ if (options.readonly && value !== "hand" && value !== "select") {
214
+ state.tool = "hand";
215
+ return;
216
+ }
217
+ state.tool = value;
218
+ if (isCreationBoardTool(value)) state.hoverId = null;
219
+ if (value === "draw" || value === "arrow") {
220
+ state.selection = [];
221
+ state.editingId = null;
222
+ }
223
+ },
224
+ get activeColor() {
225
+ return read("tool", () => state.toolStyles[styledToolId(state.tool) ?? "text"].color);
226
+ },
227
+ set activeColor(value) {
228
+ const tool = styledToolId(state.tool);
229
+ if (tool && isBoardColorId(value)) setToolStyle(tool, { color: value });
230
+ },
231
+ get activeShape() {
232
+ return read("tool", () => state.toolStyles.shape.geometry);
233
+ },
234
+ set activeShape(value) {
235
+ if (isShapeKind(value)) setToolStyle("shape", { geometry: value });
236
+ },
237
+ get activeStrokeSize() {
238
+ return read("tool", () => (state.tool === "arrow" ? state.toolStyles.arrow : state.toolStyles.draw).size);
239
+ },
240
+ set activeStrokeSize(value) {
241
+ if (!Number.isFinite(value) || state.tool !== "arrow" && state.tool !== "draw") return;
242
+ setToolStyle(state.tool, { size: clampBoardStrokeSize(value) });
243
+ },
244
+ get interaction() {
245
+ return read("interaction", () => state.interaction);
246
+ },
247
+ get gestureActive() {
248
+ return read("interaction", () => state.interaction.type !== "idle");
249
+ },
250
+ get marquee() {
251
+ return read("interaction", interaction.marquee);
252
+ },
253
+ get snapGuides() {
254
+ return read("interaction", () => state.snapGuides);
255
+ },
256
+ get spaceHeld() {
257
+ return read("interaction", () => state.spaceHeld);
258
+ },
259
+ set spaceHeld(value) {
260
+ state.spaceHeld = value;
261
+ },
262
+ get arrowDraft() {
263
+ return read(["interaction", "scene"], () => {
264
+ const gesture = state.interaction;
265
+ if (gesture.type !== "creatingArrow") return null;
266
+ const target = gesture.targetItemId ? state.scene.get(gesture.targetItemId) : null;
267
+ return {
268
+ from: gesture.start,
269
+ to: gesture.current,
270
+ size: gesture.size,
271
+ color: gesture.color,
272
+ targetFrame: target?.frame ?? null
273
+ };
274
+ });
275
+ },
276
+ get bindTargetFrame() {
277
+ return read(["interaction", "scene"], () => {
278
+ const gesture = state.interaction;
279
+ const id = gesture.type === "draggingArrowHandle" ? gesture.targetItemId : null;
280
+ return id ? state.scene.get(id)?.frame ?? null : null;
281
+ });
282
+ },
283
+ get hoverId() {
284
+ return read("hover", () => state.hoverId);
285
+ },
286
+ get pointerType() {
287
+ return read("hover", () => state.hoverPointerType);
288
+ },
289
+ get hoveredTransformControl() {
290
+ return read([
291
+ "interaction",
292
+ "hover",
293
+ "tool",
294
+ "camera",
295
+ "scene",
296
+ "selection"
297
+ ], interaction.hoveredControl);
298
+ },
299
+ get connectionPorts() {
300
+ return read([
301
+ "interaction",
302
+ "hover",
303
+ "tool",
304
+ "camera",
305
+ "scene",
306
+ "selection",
307
+ "editing"
308
+ ], interaction.ports);
309
+ },
310
+ get hoveredConnectionPort() {
311
+ return read([
312
+ "interaction",
313
+ "hover",
314
+ "tool",
315
+ "camera",
316
+ "scene",
317
+ "selection",
318
+ "editing"
319
+ ], interaction.hoveredPort);
320
+ },
321
+ get editingId() {
322
+ return read("editing", () => state.editingId);
323
+ },
324
+ set editingId(value) {
325
+ state.editingId = value;
326
+ },
327
+ get canUndo() {
328
+ return read("history", () => state.undoStack.length > 0);
329
+ },
330
+ get canRedo() {
331
+ return read("history", () => state.redoStack.length > 0);
332
+ },
333
+ get saveError() {
334
+ return read("status", () => state.saveError);
335
+ },
336
+ get saving() {
337
+ return read("status", () => state.pendingCommits > 0);
338
+ },
339
+ set surfaceSize(value) {
340
+ state.surfaceSize = value;
341
+ },
342
+ loadDocument: remote.loadDocument,
343
+ undo: document.undo,
344
+ redo: document.redo,
345
+ retrySave: () => {
346
+ state.saveError = null;
347
+ },
348
+ setSettings: document.setSettings,
349
+ previewSettings: document.previewSettings,
350
+ setPlayedItems: document.setPlayedItems,
351
+ setScriptItems: document.setScriptItems,
352
+ animationItems: document.animationItems,
353
+ commitPatch: document.commitPatch,
354
+ consumeRecentlyAdded: document.consumeRecentlyAdded,
355
+ itemAt: tracked(["scene", "camera"], query.itemAt),
356
+ itemById: tracked(["scene"], query.itemById),
357
+ labelItemAt: tracked([
358
+ "scene",
359
+ "camera",
360
+ "selection"
361
+ ], query.labelItemAt),
362
+ idsInRect: tracked(["scene"], query.idsInRect),
363
+ setCamera: camera.setCamera,
364
+ setCameraPolicy: camera.setCameraPolicy,
365
+ takeCameraControl: camera.takeCameraControl,
366
+ viewCenter: tracked(["camera"], camera.viewCenter),
367
+ zoomAt: camera.zoomAt,
368
+ zoomIn: camera.zoomIn,
369
+ zoomOut: camera.zoomOut,
370
+ resetZoom: camera.resetZoom,
371
+ fitView: camera.fitView,
372
+ focusRect: camera.focusRect,
373
+ focusItems: camera.focusItems,
374
+ focusNode: camera.focusNode,
375
+ focusSelection: camera.focusSelection,
376
+ wheel: camera.wheel,
377
+ setSelection: selection.set,
378
+ clearSelection: selection.clear,
379
+ selectAll: selection.selectAll,
380
+ nudgeSelection: selection.nudge,
381
+ alignSelection: selection.align,
382
+ distributeSelection: selection.distribute,
383
+ toggleSelectionLock: selection.toggleLock,
384
+ setSelectionColor: selection.setColor,
385
+ setSelectionStyle: selection.setStyle,
386
+ setSelectionProps: selection.setProps,
387
+ bringToFront: selection.bringToFront,
388
+ sendToBack: selection.sendToBack,
389
+ addItem: creation.addItem,
390
+ addItems: creation.add,
391
+ addApp: creation.addApp,
392
+ addFile: creation.addFile,
393
+ addMedia: creation.addMedia,
394
+ addTask: creation.addTask,
395
+ addTaskWithSources: creation.addTaskWithSources,
396
+ addText: creation.addText,
397
+ addShape: creation.addShape,
398
+ addFrame: creation.addFrame,
399
+ beginTextDraft: creation.beginTextDraft,
400
+ commitTextEdit: creation.commitTextEdit,
401
+ updateText: creation.updateText,
402
+ previewTextLayout: creation.previewTextLayout,
403
+ deleteSelection: deletion.deleteSelection,
404
+ deleteItem: deletion.deleteItem,
405
+ duplicateSelection: copy.duplicateSelection,
406
+ copySelection: copy.copySelection,
407
+ cutSelection: copy.cutSelection,
408
+ pasteClipboard: copy.pasteClipboard,
409
+ applyMediaFileChange: snapshots.applyMediaFileChange,
410
+ adoptMediaNaturalSizes: snapshots.adoptMediaNaturalSizes,
411
+ applyFileSnapshots: snapshots.applyFileSnapshots,
412
+ applyTaskSnapshots: snapshots.applyTaskSnapshots,
413
+ setPlayhead: animation.setPlayhead,
414
+ setRecording: animation.setRecording,
415
+ keyframeState: tracked([
416
+ "document",
417
+ "scene",
418
+ "selection",
419
+ "playback"
420
+ ], animation.keyframeState),
421
+ toggleKeyframe: animation.toggleKeyframe,
422
+ removeKeyframe: animation.removeKeyframe,
423
+ setKeyframeEase: animation.setKeyframeEase,
424
+ createAnimation: animation.createAnimation,
425
+ createSequence: animation.createSequence,
426
+ pointerDown: interaction.pointerDown,
427
+ pointerMove: interaction.pointerMove,
428
+ pointerUp: interaction.pointerUp,
429
+ pointerLeave: interaction.pointerLeave,
430
+ cancelPointerInteraction: interaction.cancel,
431
+ destroy() {
432
+ stopViewState();
433
+ camera.cancelAnimation();
434
+ interaction.destroy();
435
+ }
436
+ };
437
+ }
438
+ //#endregion
439
+ export { createBoardEditor };
@@ -0,0 +1,18 @@
1
+ import { BOARD_CLIPBOARD_MIME } from "../../protocol/dist/board.js";
2
+ import { AlignMode, DistributeAxis, alignFrames, distributeFrames, framesBounds } from "./align.js";
3
+ import { BoardFocusOptions } from "./camera.js";
4
+ import { BoardSelectionTransform, BoardTransformControl, resizeCursorForHandle, resolveSelectionTransform, selectionTransformControlAt } from "./selection-transform.js";
5
+ import { BoardInteraction, BoardPointerEvent } from "./interaction.js";
6
+ import { BoardAppMetadata, BoardTaskSource } from "./creation.js";
7
+ import { BOARD_CLIPBOARD_VERSION, BoardClipboardPayload, DUPLICATE_OFFSET, MAX_CLIPBOARD_CHARS, MAX_CLIPBOARD_ITEMS, defaultPasteOffset, encodeClipboard, materializeClipboard, parseClipboard, remapItems } from "./clipboard.js";
8
+ import { BoardNaturalSize } from "./snapshots.js";
9
+ import { SnapAxis, SnapGuide, SnapOptions, SnapResult, computeSnap } from "./snapping.js";
10
+ import { BoardEditorChannel, BoardEditorListener } from "./state.js";
11
+ import { BOARD_HAND_TAP_SLOP, BoardToolId, canTapSelectWithHand, defaultBoardTool, isContinuousBoardTool, isCreationBoardTool, isWithinHandTapSlop } from "./tool.js";
12
+ import { BoardCameraPolicy, BoardEditorOptions, BoardEditorPreferences, BoardPlayhead, BoardViewState } from "./context.js";
13
+ import { CONNECTION_PORT_HIT_RADIUS, CONNECTION_PORT_OFFSET, CONNECTION_PORT_RADIUS, CONNECTION_PORT_TOUCH_HIT_RADIUS, CONNECTION_SIDES, ConnectionPort, connectionPortAt, connectionPorts, portHitRadius } from "./connection-ports.js";
14
+ import { BoardEditPlayhead, diffBoardEdits, isEmptyBoardPatch, readPath, routeBoardEdits, sameJson, writePath } from "./document-edits.js";
15
+ import { BoardEditor, createBoardEditor } from "./editor.js";
16
+ import { SpatialEntry, SpatialIndex, createSpatialIndex } from "./spatial.js";
17
+ import { normalizeWheelDelta, wheelZoomFactor } from "./wheel.js";
18
+ export { AlignMode, BOARD_CLIPBOARD_MIME, BOARD_CLIPBOARD_VERSION, BOARD_HAND_TAP_SLOP, type BoardAppMetadata, type BoardCameraPolicy, BoardClipboardPayload, BoardEditPlayhead, type BoardEditor, type BoardEditorChannel, type BoardEditorListener, type BoardEditorOptions, type BoardEditorPreferences, type BoardFocusOptions, type BoardInteraction, type BoardNaturalSize, type BoardPlayhead, type BoardPointerEvent, BoardSelectionTransform, type BoardTaskSource, BoardToolId, BoardTransformControl, type BoardViewState, CONNECTION_PORT_HIT_RADIUS, CONNECTION_PORT_OFFSET, CONNECTION_PORT_RADIUS, CONNECTION_PORT_TOUCH_HIT_RADIUS, CONNECTION_SIDES, ConnectionPort, DUPLICATE_OFFSET, DistributeAxis, MAX_CLIPBOARD_CHARS, MAX_CLIPBOARD_ITEMS, SnapAxis, SnapGuide, SnapOptions, SnapResult, SpatialEntry, SpatialIndex, alignFrames, canTapSelectWithHand, computeSnap, connectionPortAt, connectionPorts, createBoardEditor, createSpatialIndex, defaultBoardTool, defaultPasteOffset, diffBoardEdits, distributeFrames, encodeClipboard, framesBounds, isContinuousBoardTool, isCreationBoardTool, isEmptyBoardPatch, isWithinHandTapSlop, materializeClipboard, normalizeWheelDelta, parseClipboard, portHitRadius, readPath, remapItems, resizeCursorForHandle, resolveSelectionTransform, routeBoardEdits, sameJson, selectionTransformControlAt, wheelZoomFactor, writePath };
@@ -0,0 +1,12 @@
1
+ import { BOARD_CLIPBOARD_MIME } from "../../protocol/dist/board.js";
2
+ import { alignFrames, distributeFrames, framesBounds } from "./align.js";
3
+ import { diffBoardEdits, isEmptyBoardPatch, readPath, routeBoardEdits, sameJson, writePath } from "./document-edits.js";
4
+ import { normalizeWheelDelta, wheelZoomFactor } from "./wheel.js";
5
+ import { BOARD_CLIPBOARD_VERSION, DUPLICATE_OFFSET, MAX_CLIPBOARD_CHARS, MAX_CLIPBOARD_ITEMS, defaultPasteOffset, encodeClipboard, materializeClipboard, parseClipboard, remapItems } from "./clipboard.js";
6
+ import { CONNECTION_PORT_HIT_RADIUS, CONNECTION_PORT_OFFSET, CONNECTION_PORT_RADIUS, CONNECTION_PORT_TOUCH_HIT_RADIUS, CONNECTION_SIDES, connectionPortAt, connectionPorts, portHitRadius } from "./connection-ports.js";
7
+ import { BOARD_HAND_TAP_SLOP, canTapSelectWithHand, defaultBoardTool, isContinuousBoardTool, isCreationBoardTool, isWithinHandTapSlop } from "./tool.js";
8
+ import { resizeCursorForHandle, resolveSelectionTransform, selectionTransformControlAt } from "./selection-transform.js";
9
+ import { computeSnap } from "./snapping.js";
10
+ import { createSpatialIndex } from "./spatial.js";
11
+ import { createBoardEditor } from "./editor.js";
12
+ export { BOARD_CLIPBOARD_MIME, BOARD_CLIPBOARD_VERSION, BOARD_HAND_TAP_SLOP, CONNECTION_PORT_HIT_RADIUS, CONNECTION_PORT_OFFSET, CONNECTION_PORT_RADIUS, CONNECTION_PORT_TOUCH_HIT_RADIUS, CONNECTION_SIDES, DUPLICATE_OFFSET, MAX_CLIPBOARD_CHARS, MAX_CLIPBOARD_ITEMS, alignFrames, canTapSelectWithHand, computeSnap, connectionPortAt, connectionPorts, createBoardEditor, createSpatialIndex, defaultBoardTool, defaultPasteOffset, diffBoardEdits, distributeFrames, encodeClipboard, framesBounds, isContinuousBoardTool, isCreationBoardTool, isEmptyBoardPatch, isWithinHandTapSlop, materializeClipboard, normalizeWheelDelta, parseClipboard, portHitRadius, readPath, remapItems, resizeCursorForHandle, resolveSelectionTransform, routeBoardEdits, sameJson, selectionTransformControlAt, wheelZoomFactor, writePath };
@@ -0,0 +1,115 @@
1
+ import { BoardArrowItem, BoardDrawPoint } from "../../protocol/dist/board-model.js";
2
+ import { BoardFrame } from "../../protocol/dist/board-layout.js";
3
+ import { BoardViewport, Rect, ResizeHandle, ScreenPoint, WorldPoint } from "../model/geometry.js";
4
+ import { BoardDrawInputSample } from "../model/draw-input.js";
5
+ import "../model/index.js";
6
+ import { BoardTransformControl } from "./selection-transform.js";
7
+ import { EditorContext } from "./context.js";
8
+ //#region src/board/editor/interaction.d.ts
9
+ type BoardInteraction = {
10
+ type: "idle";
11
+ } | {
12
+ type: "panning";
13
+ start: ScreenPoint;
14
+ origin: BoardViewport;
15
+ moved: boolean;
16
+ tapSelection: {
17
+ targetId: string | null;
18
+ } | null;
19
+ } | {
20
+ type: "translating";
21
+ start: WorldPoint;
22
+ origin: Map<string, BoardFrame>;
23
+ moved: boolean;
24
+ duplicate: boolean;
25
+ } | {
26
+ type: "resizing";
27
+ handle: ResizeHandle;
28
+ single: BoardFrame | null;
29
+ bounds: Rect;
30
+ origin: Map<string, BoardFrame>;
31
+ moved: boolean;
32
+ } | {
33
+ type: "rotating";
34
+ pivot: WorldPoint;
35
+ startAngle: number;
36
+ current: WorldPoint;
37
+ origin: Map<string, BoardFrame>;
38
+ moved: boolean;
39
+ } | {
40
+ type: "brushing";
41
+ start: WorldPoint;
42
+ current: WorldPoint;
43
+ additive: boolean;
44
+ baseSelection: string[];
45
+ } | {
46
+ type: "drawing";
47
+ id: string;
48
+ pointerId: number;
49
+ points: BoardDrawPoint[];
50
+ color: string;
51
+ size: number;
52
+ } | {
53
+ type: "creatingArrow";
54
+ id: string;
55
+ start: WorldPoint;
56
+ current: WorldPoint;
57
+ startItemId: string | null;
58
+ startSide: "top" | "right" | "bottom" | "left" | null;
59
+ targetItemId: string | null;
60
+ color: string;
61
+ size: number;
62
+ } | {
63
+ type: "creatingBox";
64
+ id: string;
65
+ kind: "shape" | "frame";
66
+ start: WorldPoint;
67
+ current: WorldPoint;
68
+ color: string;
69
+ geometry: string;
70
+ } | {
71
+ type: "draggingArrowHandle";
72
+ arrowId: string;
73
+ which: "start" | "end" | "mid";
74
+ origin: BoardArrowItem;
75
+ targetItemId: string | null;
76
+ moved: boolean;
77
+ };
78
+ type BoardPointerEvent = {
79
+ pointerId: number;
80
+ screen: ScreenPoint;
81
+ world: WorldPoint;
82
+ shiftKey: boolean;
83
+ metaKey: boolean;
84
+ ctrlKey: boolean;
85
+ altKey: boolean;
86
+ button: number;
87
+ buttons: number;
88
+ pointerType: string;
89
+ cancelled: boolean;
90
+ pressure: number;
91
+ samples?: readonly BoardDrawInputSample[];
92
+ };
93
+ declare function createInteractionModule(ctx: EditorContext): {
94
+ marquee: () => Rect | null;
95
+ hoveredControl: () => BoardTransformControl | null;
96
+ ports: () => {
97
+ itemId: string;
98
+ x: number;
99
+ y: number;
100
+ radius: number;
101
+ }[];
102
+ hoveredPort: () => {
103
+ x: number;
104
+ y: number;
105
+ } | null;
106
+ pointerDown: (event: BoardPointerEvent) => void;
107
+ pointerMove: (event: BoardPointerEvent) => void;
108
+ pointerUp: (event: BoardPointerEvent) => void;
109
+ pointerLeave: () => void;
110
+ cancel: () => void;
111
+ destroy: () => void;
112
+ };
113
+ type InteractionModule = ReturnType<typeof createInteractionModule>;
114
+ //#endregion
115
+ export { BoardInteraction, BoardPointerEvent, InteractionModule, createInteractionModule };