@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.
- package/README.md +100 -103
- package/dist/board/editor/align.d.ts +11 -0
- package/dist/board/editor/align.js +72 -0
- package/dist/board/editor/animation.d.ts +14 -0
- package/dist/board/editor/animation.js +172 -0
- package/dist/board/editor/camera.d.ts +32 -0
- package/dist/board/editor/camera.js +137 -0
- package/dist/board/editor/clipboard.d.ts +41 -0
- package/dist/board/editor/clipboard.js +122 -0
- package/dist/board/editor/connection-ports.d.ts +19 -0
- package/dist/board/editor/connection-ports.js +85 -0
- package/dist/board/editor/context.d.ts +111 -0
- package/dist/board/editor/context.js +30 -0
- package/dist/board/editor/copy.d.ts +17 -0
- package/dist/board/editor/copy.js +116 -0
- package/dist/board/editor/creation.d.ts +47 -0
- package/dist/board/editor/creation.js +224 -0
- package/dist/board/editor/deletion.d.ts +9 -0
- package/dist/board/editor/deletion.js +90 -0
- package/dist/board/editor/document-edits.d.ts +22 -0
- package/dist/board/editor/document-edits.js +193 -0
- package/dist/board/editor/document.d.ts +35 -0
- package/dist/board/editor/document.js +255 -0
- package/dist/board/editor/editor.d.ts +210 -0
- package/dist/board/editor/editor.js +429 -0
- package/dist/board/editor/index.d.ts +18 -0
- package/dist/board/editor/index.js +12 -0
- package/dist/board/editor/interaction.d.ts +115 -0
- package/dist/board/editor/interaction.js +584 -0
- package/dist/board/editor/query.d.ts +27 -0
- package/dist/board/editor/query.js +201 -0
- package/dist/board/editor/remote.d.ts +11 -0
- package/dist/board/editor/remote.js +55 -0
- package/dist/board/editor/selection-transform.d.ts +24 -0
- package/dist/board/editor/selection-transform.js +81 -0
- package/dist/board/editor/selection.d.ts +33 -0
- package/dist/board/editor/selection.js +196 -0
- package/dist/board/editor/snapping.d.ts +33 -0
- package/dist/board/editor/snapping.js +75 -0
- package/dist/board/editor/snapshots.d.ts +27 -0
- package/dist/board/editor/snapshots.js +132 -0
- package/dist/board/editor/spatial.d.ts +41 -0
- package/dist/board/editor/spatial.js +191 -0
- package/dist/board/editor/state.d.ts +12 -0
- package/dist/board/editor/state.js +49 -0
- package/dist/board/editor/tool.d.ts +10 -0
- package/dist/board/editor/tool.js +19 -0
- package/dist/board/editor/wheel.d.ts +5 -0
- package/dist/board/editor/wheel.js +17 -0
- package/dist/board/export/index.d.ts +5 -4
- package/dist/board/export/index.js +4 -3
- package/dist/board/export/node/index.d.ts +55 -0
- package/dist/board/{headless → export/node}/index.js +12 -12
- package/dist/board/export/node/sketch.d.ts +19 -0
- package/dist/board/{headless → export/node}/sketch.js +6 -6
- package/dist/board/export/scene.d.ts +6 -4
- package/dist/board/export/scene.js +4 -3
- package/dist/board/{animation.d.ts → model/animation.d.ts} +4 -4
- package/dist/board/{animation.js → model/animation.js} +3 -3
- package/dist/board/{core → model}/arrow-geometry.d.ts +2 -2
- package/dist/board/{core → model}/arrow-geometry.js +2 -2
- package/dist/board/{core → model}/draw-geometry.d.ts +2 -2
- package/dist/board/{core → model}/draw-geometry.js +1 -1
- package/dist/board/model/draw-input.d.ts +14 -0
- package/dist/board/model/draw-input.js +28 -0
- package/dist/board/{core → model}/export-assets.d.ts +1 -1
- package/dist/board/{core → model}/export-assets.js +1 -1
- package/dist/board/{core → model}/export-plan.d.ts +2 -2
- package/dist/board/{core → model}/export-plan.js +2 -2
- package/dist/board/{core → model}/file-preview.d.ts +1 -1
- package/dist/board/{core → model}/file-preview.js +1 -1
- package/dist/board/{core → model}/file-snapshot.d.ts +1 -1
- package/dist/board/{core → model}/file-snapshot.js +1 -1
- package/dist/board/{geometry.d.ts → model/geometry.d.ts} +3 -3
- package/dist/board/{geometry.js → model/geometry.js} +1 -1
- package/dist/board/{image-key.d.ts → model/image-key.d.ts} +2 -2
- package/dist/board/{image-key.js → model/image-key.js} +1 -1
- package/dist/board/model/index.d.ts +35 -0
- package/dist/board/{index.js → model/index.js} +26 -22
- package/dist/board/model/items/builtin.d.ts +5 -0
- package/dist/board/model/items/builtin.js +119 -0
- package/dist/board/model/items/create.d.ts +59 -0
- package/dist/board/model/items/create.js +271 -0
- package/dist/board/model/items/definition.d.ts +35 -0
- package/dist/board/model/items/definition.js +18 -0
- package/dist/board/model/items/id.d.ts +5 -0
- package/dist/board/model/items/id.js +11 -0
- package/dist/board/model/items/index.d.ts +6 -0
- package/dist/board/model/items/index.js +6 -0
- package/dist/board/model/items/registry.d.ts +35 -0
- package/dist/board/model/items/registry.js +84 -0
- package/dist/board/{media-playback.d.ts → model/media-playback.d.ts} +2 -2
- package/dist/board/{media-playback.js → model/media-playback.js} +1 -1
- package/dist/board/{media.d.ts → model/media.d.ts} +1 -1
- package/dist/board/{media.js → model/media.js} +1 -1
- package/dist/board/{core → model}/palette.d.ts +1 -1
- package/dist/board/{core → model}/palette.js +1 -1
- package/dist/board/{presets.d.ts → model/presets.d.ts} +3 -3
- package/dist/board/{presets.js → model/presets.js} +1 -1
- package/dist/board/{replay.d.ts → model/replay.d.ts} +5 -5
- package/dist/board/{replay.js → model/replay.js} +2 -2
- package/dist/board/{core → model}/scene.d.ts +1 -1
- package/dist/board/{core → model}/scene.js +1 -1
- package/dist/board/model/shape-types.d.ts +8 -0
- package/dist/board/model/shape-types.js +8 -0
- package/dist/board/{task.d.ts → model/task.d.ts} +4 -4
- package/dist/board/{task.js → model/task.js} +3 -3
- package/dist/board/{core → model}/text-metrics.d.ts +1 -1
- package/dist/board/{core → model}/text-metrics.js +1 -1
- package/dist/board/{core → model}/tool-styles.d.ts +1 -1
- package/dist/board/{core → model}/tool-styles.js +1 -1
- package/dist/board/{runtime/board-player.d.ts → player/index.d.ts} +2 -2
- package/dist/board/{runtime/board-player.js → player/index.js} +5 -4
- package/dist/board/render/board-background.d.ts +1 -1
- package/dist/board/render/clip.d.ts +1 -1
- package/dist/board/render/index.d.ts +2 -2
- package/dist/board/render/index.js +2 -2
- package/dist/board/render/media-interaction.d.ts +2 -2
- package/dist/board/render/media-interaction.js +1 -1
- package/dist/board/render/palette.d.ts +1 -1
- package/dist/board/render/palette.js +1 -1
- package/dist/board/render/renderers/arrow-card-renderer.js +1 -1
- package/dist/board/render/renderers/board-renderer-registry.d.ts +11 -6
- package/dist/board/render/renderers/board-renderer-registry.js +15 -15
- package/dist/board/render/renderers/draw-card-renderer.js +1 -1
- package/dist/board/render/renderers/far-plate.js +1 -1
- package/dist/board/render/renderers/file-card-renderer.d.ts +1 -1
- package/dist/board/render/renderers/file-card-renderer.js +2 -2
- package/dist/board/render/renderers/image-card-renderer.d.ts +1 -1
- package/dist/board/render/renderers/shape-card-renderer.js +1 -1
- package/dist/board/render/renderers/task-card-renderer.js +1 -1
- package/dist/board/render/renderers/text-card-renderer.js +1 -1
- package/dist/board/render/renderers/video-card-renderer.d.ts +1 -1
- package/dist/board/render/stroke.d.ts +1 -1
- package/dist/board/render/stroke.js +1 -1
- package/dist/board/render/text-measurement.js +1 -1
- package/dist/board/replica/index.d.ts +70 -0
- package/dist/board/replica/index.js +276 -0
- package/dist/board/stage/assets.d.ts +41 -0
- package/dist/board/stage/assets.js +350 -0
- package/dist/board/stage/index.d.ts +8 -0
- package/dist/board/stage/index.js +8 -0
- package/dist/board/stage/lru.d.ts +32 -0
- package/dist/board/stage/lru.js +29 -0
- package/dist/board/stage/pointer.d.ts +8 -0
- package/dist/board/stage/pointer.js +33 -0
- package/dist/board/stage/scene.d.ts +85 -0
- package/dist/board/stage/scene.js +512 -0
- package/dist/board/stage/stage.d.ts +66 -0
- package/dist/board/stage/stage.js +568 -0
- package/dist/board/stage/texture-pool.d.ts +24 -0
- package/dist/board/stage/texture-pool.js +154 -0
- package/dist/board/stage/views.d.ts +38 -0
- package/dist/board/stage/views.js +93 -0
- package/dist/chunks/environment.d.ts +25 -1
- package/dist/chunks/http.d.ts +99 -66
- package/dist/chunks/http.js +214 -207
- package/dist/chunks/websocket.d.ts +1 -1
- package/dist/http.d.ts +2 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.js +20 -4
- package/dist/media.d.ts +1 -10
- package/dist/media.js +16 -27
- package/dist/protocol/dist/board-patch.js +1 -1
- package/dist/protocol/dist/board.d.ts +28 -2
- package/dist/protocol/dist/board.js +3 -1
- package/dist/protocol/dist/core/media.d.ts +5 -0
- package/dist/protocol/dist/core/media.js +39 -0
- package/dist/protocol/dist/index.d.ts +5 -5
- package/dist/types.d.ts +1 -1
- package/package.json +26 -14
- package/dist/board/core/shape-definition.d.ts +0 -23
- package/dist/board/core/shape-definition.js +0 -45
- package/dist/board/core/shape-types.d.ts +0 -38
- package/dist/board/core/shape-types.js +0 -22
- package/dist/board/headless/index.d.ts +0 -55
- package/dist/board/headless/sketch.d.ts +0 -19
- 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 };
|