@8btc/whiteboard 0.0.20-alpha.34 → 0.0.20-alpha.36

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/dist/index.d.ts CHANGED
@@ -59,687 +59,710 @@ export declare class CanvasApi extends CanvasCore {
59
59
  y: number;
60
60
  }): void;
61
61
  /**
62
- * 导出全部图形为图片
63
- * @param options - 导出配置
64
- * @returns DataURL 格式的图片数据
65
- */
66
- exportAsImage(options?: {
67
- pixelRatio?: number;
68
- mimeType?: string;
69
- quality?: number;
70
- }): string;
71
- /**
72
- * 导出当前选区为图片
73
- * @param options - 导出配置
74
- * @returns DataURL 格式的图片数据,如果没有选区则返回 null
75
- */
76
- exportSelectionAsImage(options?: {
77
- pixelRatio?: number;
78
- mimeType?: string;
79
- quality?: number;
80
- padding?: number;
81
- }): string | null;
82
- /**
83
- * 导出带有标注的图片节点为图片
84
- * @param id - 图片节点 ID
85
- * @returns DataURL 格式的图片数据,如果节点或者 marker 不存在则返回 null
86
- */
87
- exportImageWithMarker(id: string, options?: {
88
- pixelRatio?: number;
89
- mimeType?: string;
90
- quality?: number;
91
- markerScale?: number;
92
- }): string | null;
93
- /**
94
- * 删除当前选中的节点
95
- * 如果删除的是 image 节点,会同步删除所有关联的 image-marker
96
- */
97
- deleteSelectedNodes(): void;
98
- /**
99
- * 更新节点样式属性
100
- * @param nodeIds - 要更新的节点 ID 数组
101
- * @param config - 要更新的属性配置
102
- */
103
- updateNodes(nodeIds: string[], config: Partial<NodeConfig>): void;
104
- /**
105
- * 更新选中节点的样式属性
106
- * @param config - 要更新的属性配置
107
- */
108
- updateSelectedNodes(config: Partial<NodeConfig>): void;
109
- /**
110
- * 删除指定的节点
111
- * 如果删除的是 image 节点,会同步删除所有关联的 image-marker
112
- * @param nodeIds - 要删除的节点 ID 数组
113
- * @returns 被删除的节点数据数组
114
- */
115
- deleteNodes(nodeIds: string[]): NodeConfig[];
116
- /**
117
- * 将节点移动到最上层
118
- */
119
- moveNodesToTop(nodeIds: string[]): void;
120
- /**
121
- * 将节点移动到最下层
122
- */
123
- moveNodesToBottom(nodeIds: string[]): void;
124
- moveNodesUp(nodeIds: string[]): void;
125
- moveNodesDown(nodeIds: string[]): void;
126
- /**
127
- * 按照给定的 ID 数组顺序重新排列节点
128
- * 数组中的第一个节点将位于最底层,最后一个节点位于最顶层
129
- * @param nodeIds - 节点 ID 数组,按从底层到顶层的顺序排列
130
- */
131
- reorderNodes(nodeIds: string[]): void;
132
- /**
133
- * 滚动到内容区域
134
- * - 如果提供了 nodeIds,将指定的节点居中显示
135
- * - 如果没有提供 nodeIds 但有选中的节点,将选中节点居中显示
136
- * - 如果没有选中节点,将所有内容居中显示
137
- * @param options - 配置选项
138
- * @param options.padding - 内容周围的留白,默认 50px
139
- * @param options.scale - 是否自动调整缩放以适应内容,默认 false
140
- * @param options.nodeIds - 要滚动到的节点 ID 数组
141
- */
142
- scrollToContent(options?: {
143
- padding?: number;
144
- scale?: boolean;
145
- nodeIds?: string[];
146
- }): void;
147
- /**
148
- * 导出当前状态
149
- */
150
- save(): CanvasSnapshot;
151
- /**
152
- * 从状态中恢复画布
153
- */
154
- restore(state: CanvasSnapshot): void;
155
- /**
156
- * 聚焦到指定节点
157
- * 选中指定的节点并滚动到这些节点的位置
158
- * @param nodeIds - 要聚焦的节点 ID 数组
159
- * @param options - 滚动配置选项
160
- * @param options.padding - 内容周围的留白,默认 50px
161
- * @param options.scale - 是否自动调整缩放以适应内容,默认 false
162
- */
163
- focusNodes(nodeIds: string[], options?: {
164
- padding?: number;
165
- scale?: boolean;
166
- }): void;
167
- /**
168
- * 切换指定节点的可见性
169
- * @param nodeId - 要切换可见性的节点 ID
170
- */
171
- toggleNodeVisibility(nodeId: string): void;
172
- /**
173
- * 切换指定节点的锁定状态
174
- * 锁定的节点无法被选中和交互(listening = false)
175
- * @param nodeId - 要切换锁定状态的节点 ID
176
- */
177
- toggleNodeLock(nodeId: string): void;
178
- }
179
-
180
- declare class CanvasCore extends CanvasStore {
181
- #private;
182
- isEditingText: boolean;
183
- constructor(el: HTMLDivElement, options?: {
184
- state?: CanvasSnapshot;
185
- theme?: Theme;
186
- });
187
- /**
188
- * 获取当前主题
189
- */
190
- getTheme(): Theme;
191
- /**
192
- * 设置主题并重新渲染
193
- */
194
- setTheme(theme: Theme): void;
195
- /**
196
- * 获取 CanvasStage 实例
197
- */
198
- getCanvasStage(): CanvasStage;
199
- /**
200
- * 获取 CanvasTransformer 实例
201
- */
202
- getCanvasTransformer(): CanvasTransformer;
203
- /**
204
- * 获取 Konva.Transformer 实例
205
- */
206
- getTransformer(): Transformer_2;
207
- /**
208
- * 获取 Konva.Stage 实例
209
- */
210
- getStage(): default_2.Stage;
211
- /**
212
- * 获取 Stage 容器元素
213
- */
214
- getContainer(): HTMLDivElement;
215
- /**
216
- * 获取主图层
217
- */
218
- getMainLayer(): default_2.Layer;
219
- /**
220
- * 获取当前工具类型
221
- */
222
- getToolType(): ToolType;
223
- /**
224
- * 获取当前工具的元数据
225
- */
226
- getToolMeta(): Record<string, any> | undefined;
227
- /**
228
- * 设置当前工具类型(内部使用)
229
- *
230
- * toolMeta 是一个可选的对象,可以包含与当前工具相关的任何额外信息。例如,在绘制图形时,toolMeta 可以包含初始位置、颜色、线条样式等信息。这样,在处理工具逻辑时,就可以访问这些元数据来实现更复杂的行为。
231
- *
232
- * - polygon 工具可以在 toolMeta 中包含一个 $_shape 字段,指示要绘制的多边形形状(如 triangle、rectangle、pentagon 等),以便在创建草稿节点时生成对应形状的点数据。
233
- */
234
- setToolType(type: ToolType, toolMeta?: any): void;
235
- /**
236
- * 根据 ID 获取 Canvas 节点实例
237
- */
238
- getCanvasNodeById(id: string): CanvasNode | null;
239
- /**
240
- * 设置是否可拖拽(内部使用)
241
- */
242
- protected setDraggable(draggable: boolean): void;
243
- /* Excluded from this release type: _setCursor */
244
- /* Excluded from this release type: _resetCursor */
245
- /**
246
- * 获取当前 Stage 缩放比例
247
- */
248
- getStageScale(): number;
249
- /* Excluded from this release type: _updateViewport */
250
- protected createNodes(nodes: NodeConfig[], addToHistory: boolean): void;
251
- /**
252
- * 创建图片标注节点(内部使用)
253
- */
254
- protected createImageMarkerNode(parentImageId: string, startPosition: {
255
- x: number;
256
- y: number;
257
- }, endPosition: {
258
- x: number;
259
- y: number;
260
- }, imageBounds: {
261
- x: number;
262
- y: number;
263
- width: number;
264
- height: number;
265
- }): void;
266
- /* Excluded from this release type: _findImageAtPosition */
267
- /* Excluded from this release type: _setDrawingPosition */
268
- /* Excluded from this release type: _updateDrawingPosition */
269
- /* Excluded from this release type: _createDraftNode */
270
- /* Excluded from this release type: _updateDraftNode */
271
- /* Excluded from this release type: _appendBrushPoint */
272
- /* Excluded from this release type: _finalizeDraftNode */
273
- /* Excluded from this release type: _createTextNodeAtDrawingPosition */
274
- /* Excluded from this release type: _createSelectRect */
275
- _updateSelectRect(): void;
276
- /* Excluded from this release type: _finalizeSelectRect */
277
- /* Excluded from this release type: _selectNodes */
278
- /* Excluded from this release type: deleteNodes */
279
- /* Excluded from this release type: deleteSelectedNodes */
280
- /**
281
- * 销毁 canvas
282
- */
283
- dispose(): void;
284
- /* Excluded from this release type: _rebuildStateAfterNodeChange */
285
- /**
286
- * 实现父类的状态同步方法
287
- * 当 undo/redo 时被调用
288
- */
289
- protected _renderCanvas(state: CanvasSnapshot): void;
290
- _showContextMenu(data: {
291
- x: number;
292
- y: number;
293
- clientX: number;
294
- clientY: number;
295
- targetIds: string[];
296
- }): void;
297
- _syncNodesZIndexToStore(): void;
298
- _registerTextEditor(editor: Editor): void;
299
- _unregisterTextEditor(): void;
300
- }
301
-
302
- /**
303
- * 状态事件类型定义
304
- */
305
- declare type CanvasEvents = {
306
- "state:change": CanvasSnapshot;
307
- "state:undo": CanvasSnapshot;
308
- "state:redo": CanvasSnapshot;
309
- "state:reset": CanvasSnapshot;
310
- "viewport:change": CanvasSnapshot["viewport"];
311
- "viewport:scale:change": number;
312
- "transformer:positionChange": TransformerPosition | null;
313
- "toolType:change": {
314
- type: CanvasSnapshot["toolType"];
315
- meta?: Record<string, any>;
62
+ * 导出指定图片节点的底图、笔刷透明图和合成图
63
+ * @param imageId - 图片节点 ID
64
+ * @returns { base, brushOnly, composite } 三张 DataURL,若图片不存在返回 null
65
+ */
66
+ exportImageWithBrush(imageId: string, options?: {
67
+ pixelRatio?: number;
68
+ }): {
69
+ base: string;
70
+ brushOnly: string;
71
+ composite: string;
72
+ } | null;
73
+ /**
74
+ * 删除指定图片节点关联的所有笔刷节点
75
+ * @param imageId - 图片节点 ID
76
+ */
77
+ clearImageBrushNodes(imageId: string): void;
78
+ /**
79
+ * 导出全部图形为图片
80
+ * @param options - 导出配置
81
+ * @returns DataURL 格式的图片数据
82
+ */
83
+ exportAsImage(options?: {
84
+ pixelRatio?: number;
85
+ mimeType?: string;
86
+ quality?: number;
87
+ }): string;
88
+ /**
89
+ * 导出当前选区为图片
90
+ * @param options - 导出配置
91
+ * @returns DataURL 格式的图片数据,如果没有选区则返回 null
92
+ */
93
+ exportSelectionAsImage(options?: {
94
+ pixelRatio?: number;
95
+ mimeType?: string;
96
+ quality?: number;
97
+ padding?: number;
98
+ }): string | null;
99
+ /**
100
+ * 导出带有标注的图片节点为图片
101
+ * @param id - 图片节点 ID
102
+ * @returns DataURL 格式的图片数据,如果节点或者 marker 不存在则返回 null
103
+ */
104
+ exportImageWithMarker(id: string, options?: {
105
+ pixelRatio?: number;
106
+ mimeType?: string;
107
+ quality?: number;
108
+ markerScale?: number;
109
+ }): string | null;
110
+ /**
111
+ * 删除当前选中的节点
112
+ * 如果删除的是 image 节点,会同步删除所有关联的 image-marker
113
+ */
114
+ deleteSelectedNodes(): void;
115
+ /**
116
+ * 选中指定节点
117
+ * @param nodeIds - 要选中的节点 ID 数组,不传则取消所有选中
118
+ * @param multiSelect - 是否多选(追加到已选中节点),默认 false
119
+ */
120
+ selectNodes(nodeIds?: string[], multiSelect?: boolean): void;
121
+ /**
122
+ * 更新节点样式属性
123
+ * @param nodeIds - 要更新的节点 ID 数组
124
+ * @param config - 要更新的属性配置
125
+ */
126
+ updateNodes(nodeIds: string[], config: Partial<NodeConfig>): void;
127
+ /**
128
+ * 更新选中节点的样式属性
129
+ * @param config - 要更新的属性配置
130
+ */
131
+ updateSelectedNodes(config: Partial<NodeConfig>): void;
132
+ /**
133
+ * 删除指定的节点
134
+ * 如果删除的是 image 节点,会同步删除所有关联的 image-marker
135
+ * @param nodeIds - 要删除的节点 ID 数组
136
+ * @returns 被删除的节点数据数组
137
+ */
138
+ deleteNodes(nodeIds: string[]): NodeConfig[];
139
+ /**
140
+ * 将节点移动到最上层
141
+ */
142
+ moveNodesToTop(nodeIds: string[]): void;
143
+ /**
144
+ * 将节点移动到最下层
145
+ */
146
+ moveNodesToBottom(nodeIds: string[]): void;
147
+ moveNodesUp(nodeIds: string[]): void;
148
+ moveNodesDown(nodeIds: string[]): void;
149
+ /**
150
+ * 按照给定的 ID 数组顺序重新排列节点
151
+ * 数组中的第一个节点将位于最底层,最后一个节点位于最顶层
152
+ * @param nodeIds - 节点 ID 数组,按从底层到顶层的顺序排列
153
+ */
154
+ reorderNodes(nodeIds: string[]): void;
155
+ /**
156
+ * 滚动到内容区域
157
+ * - 如果提供了 nodeIds,将指定的节点居中显示
158
+ * - 如果没有提供 nodeIds 但有选中的节点,将选中节点居中显示
159
+ * - 如果没有选中节点,将所有内容居中显示
160
+ * @param options - 配置选项
161
+ * @param options.padding - 内容周围的留白,默认 50px
162
+ * @param options.scale - 是否自动调整缩放以适应内容,默认 false
163
+ * @param options.nodeIds - 要滚动到的节点 ID 数组
164
+ */
165
+ scrollToContent(options?: {
166
+ padding?: number;
167
+ scale?: boolean;
168
+ nodeIds?: string[];
169
+ }): void;
170
+ /**
171
+ * 导出当前状态
172
+ */
173
+ save(): CanvasSnapshot;
174
+ /**
175
+ * 从状态中恢复画布
176
+ */
177
+ restore(state: CanvasSnapshot): void;
178
+ /**
179
+ * 聚焦到指定节点
180
+ * 选中指定的节点并滚动到这些节点的位置
181
+ * @param nodeIds - 要聚焦的节点 ID 数组
182
+ * @param options - 滚动配置选项
183
+ * @param options.padding - 内容周围的留白,默认 50px
184
+ * @param options.scale - 是否自动调整缩放以适应内容,默认 false
185
+ */
186
+ focusNodes(nodeIds: string[], options?: {
187
+ padding?: number;
188
+ scale?: boolean;
189
+ }): void;
190
+ /**
191
+ * 切换指定节点的可见性
192
+ * @param nodeId - 要切换可见性的节点 ID
193
+ */
194
+ toggleNodeVisibility(nodeId: string): void;
195
+ /**
196
+ * 切换指定节点的锁定状态
197
+ * 锁定的节点无法被选中和交互(listening = false)
198
+ * @param nodeId - 要切换锁定状态的节点 ID
199
+ */
200
+ toggleNodeLock(nodeId: string): void;
201
+ }
202
+
203
+ declare class CanvasCore extends CanvasStore {
204
+ #private;
205
+ isEditingText: boolean;
206
+ constructor(el: HTMLDivElement, options?: {
207
+ state?: CanvasSnapshot;
208
+ theme?: Theme;
209
+ });
210
+ /**
211
+ * 获取当前主题
212
+ */
213
+ getTheme(): Theme;
214
+ /**
215
+ * 设置主题并重新渲染
216
+ */
217
+ setTheme(theme: Theme): void;
218
+ /**
219
+ * 获取 CanvasStage 实例
220
+ */
221
+ getCanvasStage(): CanvasStage;
222
+ /**
223
+ * 获取 CanvasTransformer 实例
224
+ */
225
+ getCanvasTransformer(): CanvasTransformer;
226
+ /**
227
+ * 获取 Konva.Transformer 实例
228
+ */
229
+ getTransformer(): Transformer_2;
230
+ /**
231
+ * 获取 Konva.Stage 实例
232
+ */
233
+ getStage(): default_2.Stage;
234
+ /**
235
+ * 获取 Stage 容器元素
236
+ */
237
+ getContainer(): HTMLDivElement;
238
+ /**
239
+ * 获取主图层
240
+ */
241
+ getMainLayer(): default_2.Layer;
242
+ /**
243
+ * 获取当前工具类型
244
+ */
245
+ getToolType(): ToolType;
246
+ /**
247
+ * 获取当前工具的元数据
248
+ */
249
+ getToolMeta(): Record<string, any> | undefined;
250
+ /**
251
+ * 设置当前工具类型(内部使用)
252
+ *
253
+ * toolMeta 是一个可选的对象,可以包含与当前工具相关的任何额外信息。例如,在绘制图形时,toolMeta 可以包含初始位置、颜色、线条样式等信息。这样,在处理工具逻辑时,就可以访问这些元数据来实现更复杂的行为。
254
+ *
255
+ * - polygon 工具可以在 toolMeta 中包含一个 $_shape 字段,指示要绘制的多边形形状(如 triangle、rectangle、pentagon 等),以便在创建草稿节点时生成对应形状的点数据。
256
+ */
257
+ setToolType(type: ToolType, toolMeta?: any): void;
258
+ /**
259
+ * 根据 ID 获取 Canvas 节点实例
260
+ */
261
+ getCanvasNodeById(id: string): CanvasNode | null;
262
+ /**
263
+ * 设置是否可拖拽(内部使用)
264
+ */
265
+ protected setDraggable(draggable: boolean): void;
266
+ /* Excluded from this release type: _setCursor */
267
+ /* Excluded from this release type: _resetCursor */
268
+ /**
269
+ * 获取当前 Stage 缩放比例
270
+ */
271
+ getStageScale(): number;
272
+ /* Excluded from this release type: _updateViewport */
273
+ protected createNodes(nodes: NodeConfig[], addToHistory: boolean): void;
274
+ /**
275
+ * 创建图片标注节点(内部使用)
276
+ */
277
+ protected createImageMarkerNode(parentImageId: string, startPosition: {
278
+ x: number;
279
+ y: number;
280
+ }, endPosition: {
281
+ x: number;
282
+ y: number;
283
+ }, imageBounds: {
284
+ x: number;
285
+ y: number;
286
+ width: number;
287
+ height: number;
288
+ }): void;
289
+ /* Excluded from this release type: _findImageAtPosition */
290
+ /* Excluded from this release type: _setDrawingPosition */
291
+ /* Excluded from this release type: _updateDrawingPosition */
292
+ /* Excluded from this release type: _createDraftNode */
293
+ /* Excluded from this release type: _updateDraftNode */
294
+ /* Excluded from this release type: _appendBrushPoint */
295
+ /* Excluded from this release type: _finalizeDraftNode */
296
+ /* Excluded from this release type: _createTextNodeAtDrawingPosition */
297
+ /* Excluded from this release type: _createSelectRect */
298
+ _updateSelectRect(): void;
299
+ /* Excluded from this release type: _finalizeSelectRect */
300
+ /* Excluded from this release type: _selectNodes */
301
+ /* Excluded from this release type: deleteNodes */
302
+ /* Excluded from this release type: deleteSelectedNodes */
303
+ /**
304
+ * 销毁 canvas
305
+ */
306
+ dispose(): void;
307
+ /* Excluded from this release type: _rebuildStateAfterNodeChange */
308
+ /**
309
+ * 实现父类的状态同步方法
310
+ * 当 undo/redo 时被调用
311
+ */
312
+ protected _renderCanvas(state: CanvasSnapshot): void;
313
+ _showContextMenu(data: {
314
+ x: number;
315
+ y: number;
316
+ clientX: number;
317
+ clientY: number;
318
+ targetIds: string[];
319
+ }): void;
320
+ _syncNodesZIndexToStore(): void;
321
+ _registerTextEditor(editor: Editor): void;
322
+ _unregisterTextEditor(): void;
323
+ }
324
+
325
+ /**
326
+ * 状态事件类型定义
327
+ */
328
+ declare type CanvasEvents = {
329
+ "state:change": CanvasSnapshot;
330
+ "state:undo": CanvasSnapshot;
331
+ "state:redo": CanvasSnapshot;
332
+ "state:reset": CanvasSnapshot;
333
+ "viewport:change": CanvasSnapshot["viewport"];
334
+ "viewport:scale:change": number;
335
+ "transformer:positionChange": TransformerPosition | null;
336
+ "toolType:change": {
337
+ type: CanvasSnapshot["toolType"];
338
+ meta?: Record<string, any>;
339
+ };
340
+ "theme:change": Theme;
341
+ "nodes:created": NodeConfig[];
342
+ "nodes:deleted": NodeConfig[];
343
+ "nodes:selected": string[];
344
+ "contextmenu:show": {
345
+ x: number;
346
+ y: number;
347
+ clientX: number;
348
+ clientY: number;
349
+ targetIds: string[];
350
+ };
351
+ "nodes:sorted": string[];
352
+ "texteditor:register": any;
353
+ "texteditor:unregister": void;
316
354
  };
317
- "theme:change": Theme;
318
- "nodes:created": NodeConfig[];
319
- "nodes:deleted": NodeConfig[];
320
- "nodes:selected": string[];
321
- "contextmenu:show": {
355
+
356
+ export declare interface CanvasNode {
357
+ getID(): string;
358
+ getElement(): default_2.Shape | default_2.Group;
359
+ getConfig(): NodeConfig;
360
+ syncConfigFromElement(): void;
361
+ update(config: Partial<NodeConfig>): void;
362
+ destroy(): void;
363
+ }
364
+
365
+ export declare interface CanvasSnapshot {
366
+ viewport: Viewport;
367
+ toolType: ToolType;
368
+ toolMeta?: any;
369
+ selectedNodeIds?: string[];
370
+ nodes?: NodeConfig[];
371
+ }
372
+
373
+ /**
374
+ * CanvasStage 封装了 Konva.Stage 的核心功能
375
+ * 提供视口管理、事件处理、拖拽和缩放等能力
376
+ */
377
+ declare class CanvasStage {
378
+ #private;
379
+ constructor(core: CanvasCore, config: StageConfig);
380
+ /**
381
+ * 获取原生 Konva.Stage 实例
382
+ */
383
+ getStage(): default_2.Stage;
384
+ /**
385
+ * 获取当前视口状态
386
+ */
387
+ getViewport(): ViewportState;
388
+ /**
389
+ * 设置视口(包括位置、缩放和尺寸)
390
+ */
391
+ setViewport(viewport: Partial<ViewportState>): void;
392
+ /**
393
+ * 设置是否可拖拽
394
+ */
395
+ setDraggable(draggable: boolean): void;
396
+ /**
397
+ * 设置光标样式
398
+ */
399
+ setCursor(cursor: string): void;
400
+ /**
401
+ * 重置光标样式
402
+ */
403
+ resetCursor(): void;
404
+ /**
405
+ * 销毁 Stage
406
+ */
407
+ destroy(): void;
408
+ }
409
+
410
+ /**
411
+ * CanvasStore 类负责管理画布的状态
412
+ * 包括历史记录(past/present/future)和状态监听
413
+ */
414
+ declare abstract class CanvasStore {
415
+ #private;
416
+ constructor(initialState: CanvasSnapshot);
417
+ /**
418
+ * 获取当前状态
419
+ */
420
+ getState(): CanvasSnapshot;
421
+ /**
422
+ * 获取完整历史状态
423
+ */
424
+ getHistory(): HistoryState<CanvasSnapshot>;
425
+ /**
426
+ * 是否可以撤销
427
+ */
428
+ canUndo(): boolean;
429
+ /**
430
+ * 是否可以重做
431
+ */
432
+ canRedo(): boolean;
433
+ /**
434
+ * 订阅状态事件
435
+ */
436
+ on<K extends keyof CanvasEvents>(event: K, handler: (data: CanvasEvents[K]) => void): void;
437
+ /**
438
+ * 取消订阅状态事件
439
+ */
440
+ off<K extends keyof CanvasEvents>(event: K, handler: (data: CanvasEvents[K]) => void): void;
441
+ /* Excluded from this release type: _emit */
442
+ /**
443
+ * 撤销操作
444
+ */
445
+ undo(): void;
446
+ /**
447
+ * 重做操作
448
+ */
449
+ redo(): void;
450
+ /**
451
+ * 重置历史记录
452
+ */
453
+ resetHistory(): void;
454
+ /**
455
+ * 更新状态
456
+ * @param partial - 部分状态更新
457
+ * @param addToHistory - 是否添加到历史记录
458
+ */
459
+ protected _updateState(partial: Partial<CanvasSnapshot>, addToHistory: boolean): void;
460
+ /**
461
+ * 同步状态到 canvas 系统(由子类实现)
462
+ * @param _state - 要同步的状态
463
+ */
464
+ protected abstract _renderCanvas(_state: CanvasSnapshot): void;
465
+ /**
466
+ * 清理资源
467
+ */
468
+ protected _dispose(): void;
469
+ }
470
+
471
+ /**
472
+ * CanvasTransformer 封装了 Konva.Transformer 的核心功能
473
+ * 提供变换器管理、位置计算、事件处理等能力
474
+ */
475
+ declare class CanvasTransformer {
476
+ #private;
477
+ constructor(core: CanvasCore, config?: TransformerConfig);
478
+ /**
479
+ * 获取原生 Konva.Transformer 实例
480
+ */
481
+ getTransformer(): default_2.Transformer;
482
+ /**
483
+ * 获取 Transformer 的位置信息
484
+ */
485
+ getPosition(): TransformerPosition | null;
486
+ /**
487
+ * 设置要变换的节点
488
+ */
489
+ setNodes(nodes: default_2.Node[]): void;
490
+ /**
491
+ * 获取当前变换的节点
492
+ */
493
+ getNodes(): default_2.Node[];
494
+ /**
495
+ * 清除所有节点
496
+ */
497
+ clearNodes(): void;
498
+ /**
499
+ * emit Transformer 位置
500
+ */
501
+ emitPositionChange(): void;
502
+ /**
503
+ * 销毁 Transformer
504
+ */
505
+ destroy(): void;
506
+ }
507
+
508
+ export declare interface ContextMenuItem {
509
+ label: string;
510
+ action: () => void;
511
+ }
512
+
513
+ export declare interface ContextMenuState {
322
514
  x: number;
323
515
  y: number;
324
- clientX: number;
325
- clientY: number;
326
- targetIds: string[];
327
- };
328
- "nodes:sorted": string[];
329
- "texteditor:register": any;
330
- "texteditor:unregister": void;
331
- };
516
+ items: ContextMenuItem[];
517
+ }
332
518
 
333
- export declare interface CanvasNode {
334
- getID(): string;
335
- getElement(): default_2.Shape | default_2.Group;
336
- getConfig(): NodeConfig;
337
- syncConfigFromElement(): void;
338
- update(config: Partial<NodeConfig>): void;
339
- destroy(): void;
340
- }
519
+ export declare const DARK_THEME: Theme;
341
520
 
342
- export declare interface CanvasSnapshot {
343
- viewport: Viewport;
344
- toolType: ToolType;
345
- toolMeta?: any;
346
- selectedNodeIds?: string[];
347
- nodes?: NodeConfig[];
348
- }
521
+ export declare const DEFAULT_THEME: Theme;
349
522
 
350
- /**
351
- * CanvasStage 封装了 Konva.Stage 的核心功能
352
- * 提供视口管理、事件处理、拖拽和缩放等能力
353
- */
354
- declare class CanvasStage {
355
- #private;
356
- constructor(core: CanvasCore, config: StageConfig);
357
- /**
358
- * 获取原生 Konva.Stage 实例
359
- */
360
- getStage(): default_2.Stage;
361
523
  /**
362
- * 获取当前视口状态
524
+ * 椭圆节点配置
363
525
  */
364
- getViewport(): ViewportState;
365
- /**
366
- * 设置视口(包括位置、缩放和尺寸)
367
- */
368
- setViewport(viewport: Partial<ViewportState>): void;
369
- /**
370
- * 设置是否可拖拽
371
- */
372
- setDraggable(draggable: boolean): void;
373
- /**
374
- * 设置光标样式
375
- */
376
- setCursor(cursor: string): void;
377
- /**
378
- * 重置光标样式
379
- */
380
- resetCursor(): void;
381
- /**
382
- * 销毁 Stage
383
- */
384
- destroy(): void;
385
- }
526
+ declare type EllipseNodeConfig = BaseNodeConfig & default_2.EllipseConfig & Partial<NodeStyle> & {
527
+ $_type: "ellipse";
528
+ };
386
529
 
387
- /**
388
- * CanvasStore 类负责管理画布的状态
389
- * 包括历史记录(past/present/future)和状态监听
390
- */
391
- declare abstract class CanvasStore {
392
- #private;
393
- constructor(initialState: CanvasSnapshot);
394
- /**
395
- * 获取当前状态
396
- */
397
- getState(): CanvasSnapshot;
398
- /**
399
- * 获取完整历史状态
400
- */
401
- getHistory(): HistoryState<CanvasSnapshot>;
402
- /**
403
- * 是否可以撤销
404
- */
405
- canUndo(): boolean;
406
- /**
407
- * 是否可以重做
408
- */
409
- canRedo(): boolean;
410
- /**
411
- * 订阅状态事件
412
- */
413
- on<K extends keyof CanvasEvents>(event: K, handler: (data: CanvasEvents[K]) => void): void;
414
- /**
415
- * 取消订阅状态事件
416
- */
417
- off<K extends keyof CanvasEvents>(event: K, handler: (data: CanvasEvents[K]) => void): void;
418
- /* Excluded from this release type: _emit */
419
- /**
420
- * 撤销操作
421
- */
422
- undo(): void;
423
- /**
424
- * 重做操作
425
- */
426
- redo(): void;
427
- /**
428
- * 重置历史记录
429
- */
430
- resetHistory(): void;
431
- /**
432
- * 更新状态
433
- * @param partial - 部分状态更新
434
- * @param addToHistory - 是否添加到历史记录
435
- */
436
- protected _updateState(partial: Partial<CanvasSnapshot>, addToHistory: boolean): void;
437
- /**
438
- * 同步状态到 canvas 系统(由子类实现)
439
- * @param _state - 要同步的状态
440
- */
441
- protected abstract _renderCanvas(_state: CanvasSnapshot): void;
442
- /**
443
- * 清理资源
444
- */
445
- protected _dispose(): void;
446
- }
530
+ declare type HistoryState<T> = {
531
+ past: T[];
532
+ present: T;
533
+ future: T[];
534
+ };
447
535
 
448
- /**
449
- * CanvasTransformer 封装了 Konva.Transformer 的核心功能
450
- * 提供变换器管理、位置计算、事件处理等能力
451
- */
452
- declare class CanvasTransformer {
453
- #private;
454
- constructor(core: CanvasCore, config?: TransformerConfig);
455
536
  /**
456
- * 获取原生 Konva.Transformer 实例
537
+ * HTML 节点配置
457
538
  */
458
- getTransformer(): default_2.Transformer;
459
- /**
460
- * 获取 Transformer 的位置信息
461
- */
462
- getPosition(): TransformerPosition | null;
539
+ export declare type HtmlNodeConfig = BaseNodeConfig & default_2.RectConfig & Partial<NodeStyle> & {
540
+ $_type: "html";
541
+ $_actualType: string;
542
+ $_htmlContent: string;
543
+ };
544
+
463
545
  /**
464
- * 设置要变换的节点
546
+ * 图片笔刷节点配置(仅在绑定图片范围内涂抹)
465
547
  */
466
- setNodes(nodes: default_2.Node[]): void;
548
+ declare type ImageBrushNodeConfig = BaseNodeConfig & default_2.LineConfig & Partial<NodeStyle> & {
549
+ $_type: "image-brush";
550
+ points: number[];
551
+ $_imageId: string;
552
+ $_imageBounds: {
553
+ x: number;
554
+ y: number;
555
+ width: number;
556
+ height: number;
557
+ };
558
+ };
559
+
467
560
  /**
468
- * 获取当前变换的节点
561
+ * 图片标注节点配置
469
562
  */
470
- getNodes(): default_2.Node[];
563
+ export declare type ImageMarkerNodeConfig = BaseNodeConfig & default_2.RectConfig & Partial<NodeStyle> & {
564
+ $_type: "image-marker";
565
+ width: number;
566
+ height: number;
567
+ $_markerNumber: number;
568
+ $_parentId: string;
569
+ $_relativeBox: {
570
+ start: {
571
+ ratioX: number;
572
+ ratioY: number;
573
+ };
574
+ end: {
575
+ ratioX: number;
576
+ ratioY: number;
577
+ };
578
+ };
579
+ $_bounds?: {
580
+ x: number;
581
+ y: number;
582
+ width: number;
583
+ height: number;
584
+ };
585
+ };
586
+
471
587
  /**
472
- * 清除所有节点
588
+ * 图片节点配置
473
589
  */
474
- clearNodes(): void;
590
+ export declare type ImageNodeConfig = BaseNodeConfig & Omit<default_2.ImageConfig, "image"> & Partial<NodeStyle> & {
591
+ $_type: "image";
592
+ $_imageUrl: string;
593
+ image?: CanvasImageSource | undefined;
594
+ };
595
+
596
+ export declare const NODE_NAMES: {
597
+ nodeRoot: string;
598
+ selectable: string;
599
+ rect: string;
600
+ image: string;
601
+ imageMarker: string;
602
+ html: string;
603
+ text: string;
604
+ richText: string;
605
+ video: string;
606
+ star: string;
607
+ ellipse: string;
608
+ polygon: string;
609
+ arrow: string;
610
+ brush: string;
611
+ imageBrush: string;
612
+ };
613
+
475
614
  /**
476
- * emit Transformer 位置
615
+ * 节点配置联合类型(判别联合)
616
+ * 根据 $_type 字段可以自动推断出对应节点的特定字段
477
617
  */
478
- emitPositionChange(): void;
618
+ export declare type NodeConfig = RectangleNodeConfig | ImageNodeConfig | ImageMarkerNodeConfig | HtmlNodeConfig | TextNodeConfig | RichTextNodeConfig | VideoNodeConfig | StarNodeConfig | EllipseNodeConfig | PolygonNodeConfig | ArrowNodeConfig | BrushNodeConfig | ImageBrushNodeConfig;
619
+
479
620
  /**
480
- * 销毁 Transformer
621
+ * 根据节点类型获取对应的配置类型
622
+ * @example NodeConfigByType<"image"> = ImageNodeConfig
481
623
  */
482
- destroy(): void;
483
- }
484
-
485
- export declare interface ContextMenuItem {
486
- label: string;
487
- action: () => void;
488
- }
489
-
490
- export declare interface ContextMenuState {
491
- x: number;
492
- y: number;
493
- items: ContextMenuItem[];
494
- }
495
-
496
- export declare const DARK_THEME: Theme;
624
+ export declare type NodeConfigByType<T extends NodeType> = Extract<NodeConfig, {
625
+ $_type: T;
626
+ }>;
497
627
 
498
- export declare const DEFAULT_THEME: Theme;
628
+ declare interface NodeStyle {
629
+ $_strokeColor: ThemeKeysStartingWith<"theme.stroke-color."> | string;
630
+ $_fillColor: ThemeKeysStartingWith<"theme.fill-color."> | string;
631
+ }
499
632
 
500
- /**
501
- * 椭圆节点配置
502
- */
503
- declare type EllipseNodeConfig = BaseNodeConfig & default_2.EllipseConfig & Partial<NodeStyle> & {
504
- $_type: "ellipse";
505
- };
633
+ export declare type NodeType = "rectangle" | "image" | "image-marker" | "html" | "text" | "rich-text" | "video" | "star" | "ellipse" | "polygon" | "arrow" | "brush" | "image-brush";
506
634
 
507
- declare type HistoryState<T> = {
508
- past: T[];
509
- present: T;
510
- future: T[];
511
- };
512
-
513
- /**
514
- * HTML 节点配置
515
- */
516
- export declare type HtmlNodeConfig = BaseNodeConfig & default_2.RectConfig & Partial<NodeStyle> & {
517
- $_type: "html";
518
- $_actualType: string;
519
- $_htmlContent: string;
520
- };
635
+ /**
636
+ * 多边形节点配置
637
+ */
638
+ declare type PolygonNodeConfig = BaseNodeConfig & default_2.LineConfig & Partial<NodeStyle> & {
639
+ $_type: "polygon";
640
+ $_shape: "triangle" | "diamond" | "hexagon";
641
+ };
521
642
 
522
- /**
523
- * 图片笔刷节点配置(仅在绑定图片范围内涂抹)
524
- */
525
- declare type ImageBrushNodeConfig = BaseNodeConfig & default_2.LineConfig & Partial<NodeStyle> & {
526
- $_type: "image-brush";
527
- points: number[];
528
- $_imageId: string;
529
- $_imageBounds: {
530
- x: number;
531
- y: number;
643
+ /**
644
+ * 矩形节点配置
645
+ */
646
+ export declare type RectangleNodeConfig = BaseNodeConfig & default_2.RectConfig & Partial<NodeStyle> & {
647
+ $_type: "rectangle";
532
648
  width: number;
533
649
  height: number;
534
650
  };
535
- };
536
651
 
537
- /**
538
- * 图片标注节点配置
539
- */
540
- export declare type ImageMarkerNodeConfig = BaseNodeConfig & default_2.RectConfig & Partial<NodeStyle> & {
541
- $_type: "image-marker";
542
- width: number;
543
- height: number;
544
- $_markerNumber: number;
545
- $_parentId: string;
546
- $_relativeBox: {
547
- start: {
548
- ratioX: number;
549
- ratioY: number;
550
- };
551
- end: {
552
- ratioX: number;
553
- ratioY: number;
554
- };
652
+ declare type RichTextNodeConfig = BaseNodeConfig & default_2.ImageConfig & Partial<NodeStyle> & {
653
+ $_type: "rich-text";
654
+ $_htmlContent: string;
555
655
  };
556
- $_bounds?: {
557
- x: number;
558
- y: number;
656
+
657
+ declare type StageConfig = {
658
+ container: HTMLDivElement;
559
659
  width: number;
560
660
  height: number;
661
+ draggable?: boolean;
662
+ className?: string;
561
663
  };
562
- };
563
-
564
- /**
565
- * 图片节点配置
566
- */
567
- export declare type ImageNodeConfig = BaseNodeConfig & Omit<default_2.ImageConfig, "image"> & Partial<NodeStyle> & {
568
- $_type: "image";
569
- $_imageUrl: string;
570
- image?: CanvasImageSource | undefined;
571
- };
572
664
 
573
- export declare const NODE_NAMES: {
574
- nodeRoot: string;
575
- selectable: string;
576
- rect: string;
577
- image: string;
578
- imageMarker: string;
579
- html: string;
580
- text: string;
581
- richText: string;
582
- video: string;
583
- star: string;
584
- ellipse: string;
585
- polygon: string;
586
- arrow: string;
587
- brush: string;
588
- imageBrush: string;
589
- };
590
-
591
- /**
592
- * 节点配置联合类型(判别联合)
593
- * 根据 $_type 字段可以自动推断出对应节点的特定字段
594
- */
595
- export declare type NodeConfig = RectangleNodeConfig | ImageNodeConfig | ImageMarkerNodeConfig | HtmlNodeConfig | TextNodeConfig | RichTextNodeConfig | VideoNodeConfig | StarNodeConfig | EllipseNodeConfig | PolygonNodeConfig | ArrowNodeConfig | BrushNodeConfig | ImageBrushNodeConfig;
596
-
597
- /**
598
- * 根据节点类型获取对应的配置类型
599
- * @example NodeConfigByType<"image"> = ImageNodeConfig
600
- */
601
- export declare type NodeConfigByType<T extends NodeType> = Extract<NodeConfig, {
602
- $_type: T;
603
- }>;
604
-
605
- declare interface NodeStyle {
606
- $_strokeColor: ThemeKeysStartingWith<"theme.stroke-color."> | string;
607
- $_fillColor: ThemeKeysStartingWith<"theme.fill-color."> | string;
608
- }
609
-
610
- export declare type NodeType = "rectangle" | "image" | "image-marker" | "html" | "text" | "rich-text" | "video" | "star" | "ellipse" | "polygon" | "arrow" | "brush" | "image-brush";
611
-
612
- /**
613
- * 多边形节点配置
614
- */
615
- declare type PolygonNodeConfig = BaseNodeConfig & default_2.LineConfig & Partial<NodeStyle> & {
616
- $_type: "polygon";
617
- $_shape: "triangle" | "diamond" | "hexagon";
618
- };
619
-
620
- /**
621
- * 矩形节点配置
622
- */
623
- export declare type RectangleNodeConfig = BaseNodeConfig & default_2.RectConfig & Partial<NodeStyle> & {
624
- $_type: "rectangle";
625
- width: number;
626
- height: number;
627
- };
628
-
629
- declare type RichTextNodeConfig = BaseNodeConfig & default_2.ImageConfig & Partial<NodeStyle> & {
630
- $_type: "rich-text";
631
- $_htmlContent: string;
632
- };
633
-
634
- declare type StageConfig = {
635
- container: HTMLDivElement;
636
- width: number;
637
- height: number;
638
- draggable?: boolean;
639
- className?: string;
640
- };
641
-
642
- /**
643
- * 星形节点配置
644
- */
645
- export declare type StarNodeConfig = BaseNodeConfig & default_2.StarConfig & Partial<NodeStyle> & {
646
- $_type: "star";
647
- };
648
-
649
- declare type TextNodeConfig = BaseNodeConfig & default_2.TextConfig & Partial<NodeStyle> & {
650
- $_type: "text";
651
- text: string;
652
- };
665
+ /**
666
+ * 星形节点配置
667
+ */
668
+ export declare type StarNodeConfig = BaseNodeConfig & default_2.StarConfig & Partial<NodeStyle> & {
669
+ $_type: "star";
670
+ };
653
671
 
654
- export declare interface Theme {
655
- "theme.select-rect-border": string;
656
- "theme.select-rect-fill": string;
657
- "theme.image-marker-color": string;
658
- "theme.stroke-color.1": string;
659
- "theme.stroke-color.2": string;
660
- "theme.stroke-color.3": string;
661
- "theme.stroke-color.4": string;
662
- "theme.stroke-color.5": string;
663
- "theme.stroke-color.6": string;
664
- "theme.fill-color.1": string;
665
- "theme.fill-color.2": string;
666
- "theme.fill-color.3": string;
667
- "theme.fill-color.4": string;
668
- "theme.fill-color.5": string;
669
- "theme.fill-color.6": string;
670
- }
672
+ declare type TextNodeConfig = BaseNodeConfig & default_2.TextConfig & Partial<NodeStyle> & {
673
+ $_type: "text";
674
+ text: string;
675
+ };
671
676
 
672
- export declare const THEME_PRESETS: {
673
- readonly default: Theme;
674
- readonly dark: Theme;
675
- };
677
+ export declare interface Theme {
678
+ "theme.select-rect-border": string;
679
+ "theme.select-rect-fill": string;
680
+ "theme.image-marker-color": string;
681
+ "theme.stroke-color.1": string;
682
+ "theme.stroke-color.2": string;
683
+ "theme.stroke-color.3": string;
684
+ "theme.stroke-color.4": string;
685
+ "theme.stroke-color.5": string;
686
+ "theme.stroke-color.6": string;
687
+ "theme.fill-color.1": string;
688
+ "theme.fill-color.2": string;
689
+ "theme.fill-color.3": string;
690
+ "theme.fill-color.4": string;
691
+ "theme.fill-color.5": string;
692
+ "theme.fill-color.6": string;
693
+ }
694
+
695
+ export declare const THEME_PRESETS: {
696
+ readonly default: Theme;
697
+ readonly dark: Theme;
698
+ };
676
699
 
677
- declare type ThemeKeysStartingWith<Prefix extends string> = Extract<keyof Theme, `${Prefix}${string}`>;
700
+ declare type ThemeKeysStartingWith<Prefix extends string> = Extract<keyof Theme, `${Prefix}${string}`>;
678
701
 
679
- export declare type ThemePreset = keyof typeof THEME_PRESETS;
702
+ export declare type ThemePreset = keyof typeof THEME_PRESETS;
680
703
 
681
- export declare function TipTapBubbleMenu({ api }: TipTapBubbleMenuProps): JSX.Element | null;
704
+ export declare function TipTapBubbleMenu({ api }: TipTapBubbleMenuProps): JSX.Element | null;
682
705
 
683
- declare interface TipTapBubbleMenuProps {
684
- api: CanvasApi | null;
685
- }
706
+ declare interface TipTapBubbleMenuProps {
707
+ api: CanvasApi | null;
708
+ }
686
709
 
687
- export declare type ToolType = "select" | "hand" | "rectangle" | "star" | "image-marker" | "text" | "rich-text" | "ellipse" | "polygon" | "arrow" | "brush" | "image-brush";
710
+ export declare type ToolType = "select" | "hand" | "rectangle" | "star" | "image-marker" | "text" | "rich-text" | "ellipse" | "polygon" | "arrow" | "brush" | "image-brush";
688
711
 
689
- declare type TransformerConfig = {
690
- rotateEnabled?: boolean;
691
- ignoreStroke?: boolean;
692
- anchorSize?: number;
693
- borderDash?: number[];
694
- anchorCornerRadius?: number;
695
- padding?: number;
696
- };
712
+ declare type TransformerConfig = {
713
+ rotateEnabled?: boolean;
714
+ ignoreStroke?: boolean;
715
+ anchorSize?: number;
716
+ borderDash?: number[];
717
+ anchorCornerRadius?: number;
718
+ padding?: number;
719
+ };
697
720
 
698
- /**
699
- * 变换器(Transformer)位置信息
700
- */
701
- declare interface TransformerPosition {
702
- x: number;
703
- y: number;
704
- width: number;
705
- height: number;
706
- rotation?: number;
707
- }
721
+ /**
722
+ * 变换器(Transformer)位置信息
723
+ */
724
+ declare interface TransformerPosition {
725
+ x: number;
726
+ y: number;
727
+ width: number;
728
+ height: number;
729
+ rotation?: number;
730
+ }
708
731
 
709
- export declare function useContextMenu(api: CanvasApi | null): {
710
- contextMenu: ContextMenuState | null;
711
- closeContextMenu: () => void;
712
- };
732
+ export declare function useContextMenu(api: CanvasApi | null): {
733
+ contextMenu: ContextMenuState | null;
734
+ closeContextMenu: () => void;
735
+ };
713
736
 
714
- declare type VideoNodeConfig = BaseNodeConfig & Omit<default_2.ImageConfig, "image"> & Partial<NodeStyle> & {
715
- $_type: "video";
716
- $_videoUrl: string;
717
- $_coverUrl: string;
718
- image?: CanvasImageSource | undefined;
719
- };
737
+ declare type VideoNodeConfig = BaseNodeConfig & Omit<default_2.ImageConfig, "image"> & Partial<NodeStyle> & {
738
+ $_type: "video";
739
+ $_videoUrl: string;
740
+ $_coverUrl: string;
741
+ image?: CanvasImageSource | undefined;
742
+ };
720
743
 
721
- declare interface Viewport {
722
- x: number;
723
- y: number;
724
- scale: number;
725
- }
744
+ declare interface Viewport {
745
+ x: number;
746
+ y: number;
747
+ scale: number;
748
+ }
726
749
 
727
- declare type ViewportState = {
728
- x: number;
729
- y: number;
730
- scale: number;
731
- width?: number;
732
- height?: number;
733
- };
750
+ declare type ViewportState = {
751
+ x: number;
752
+ y: number;
753
+ scale: number;
754
+ width?: number;
755
+ height?: number;
756
+ };
734
757
 
735
- export declare function Whiteboard({ setApi, theme }: WhiteboardProps): JSX.Element;
758
+ export declare function Whiteboard({ setApi, theme }: WhiteboardProps): JSX.Element;
736
759
 
737
- declare interface WhiteboardProps {
738
- setApi?: (core: CanvasApi) => void;
739
- theme?: Theme;
740
- }
760
+ declare interface WhiteboardProps {
761
+ setApi?: (core: CanvasApi) => void;
762
+ theme?: Theme;
763
+ }
741
764
 
742
- export { }
765
+ export { }
743
766
 
744
767
 
745
768
  declare module "@tiptap/core" {