@netless/appliance-plugin 1.1.2 → 1.1.3-4.beta.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 (154) hide show
  1. package/READMA.zh-CN.md +993 -0
  2. package/README.md +963 -176
  3. package/cdn/cdn.js +1 -1
  4. package/cdn/fullWorker-Dwf7nY.js +486 -0
  5. package/cdn/subWorker-DXBnNm.js +486 -0
  6. package/dist/ObserverMap-BudneEfB.mjs +58 -0
  7. package/dist/ObserverMap-DTz9zucn.js +1 -0
  8. package/dist/appliance-plugin.js +1 -1
  9. package/dist/appliance-plugin.mjs +27 -18
  10. package/dist/cdn.d.ts +2 -2
  11. package/dist/collector/base.d.ts +3 -1
  12. package/dist/collector/collector.d.ts +57 -14
  13. package/dist/collector/index.d.ts +4 -4
  14. package/dist/collector/types.d.ts +49 -10
  15. package/dist/component/autoDraw/index.d.ts +0 -0
  16. package/dist/component/miniMap/index.d.ts +1 -0
  17. package/dist/component/miniMap/manager.d.ts +37 -0
  18. package/dist/component/miniMap/view.d.ts +14 -0
  19. package/dist/component/svg/base.d.ts +30 -0
  20. package/dist/component/svg/manager.d.ts +44 -0
  21. package/dist/component/svg/markmap.d.ts +41 -0
  22. package/dist/component/svg/mermaid-check.d.ts +18 -0
  23. package/dist/component/svg/mermaid-loader.d.ts +29 -0
  24. package/dist/component/svg/mermaid.d.ts +109 -0
  25. package/dist/component/svg/snapshot.d.ts +31 -0
  26. package/dist/component/svg/svgElemt.d.ts +43 -0
  27. package/dist/component/svg/svgToImageLoader.d.ts +25 -0
  28. package/dist/component/svg/types.d.ts +10 -0
  29. package/dist/component/svg/utils.d.ts +9 -0
  30. package/dist/component/svg/vNodeManager.d.ts +28 -0
  31. package/dist/component/textEditor/index.d.ts +2 -2
  32. package/dist/component/textEditor/manager.d.ts +22 -3
  33. package/dist/component/textEditor/types.d.ts +5 -4
  34. package/dist/component/textEditor/utils.d.ts +1 -0
  35. package/dist/component/textEditor/view.d.ts +28 -48
  36. package/dist/core/autoShape/index.d.ts +12 -0
  37. package/dist/core/autoShape/mapper.d.ts +3 -0
  38. package/dist/core/autoShape/recognizer.d.ts +8 -0
  39. package/dist/core/autoShape/registry.d.ts +2 -0
  40. package/dist/core/autoShape/templates.d.ts +2 -0
  41. package/dist/core/autoShape/types.d.ts +78 -0
  42. package/dist/core/backGroundThread/index.d.ts +35 -0
  43. package/dist/core/backGroundThread/types.d.ts +12 -0
  44. package/dist/core/enum.d.ts +74 -13
  45. package/dist/core/index.d.ts +3 -3
  46. package/dist/core/mainEngine.d.ts +101 -27
  47. package/dist/core/mainThread/base.d.ts +10 -6
  48. package/dist/core/mainThread/index.d.ts +2 -2
  49. package/dist/core/mainThread/snapshotThread.d.ts +8 -4
  50. package/dist/core/mainThread/subLocalThread.d.ts +21 -16
  51. package/dist/core/mainThread/subServiceThread.d.ts +2 -2
  52. package/dist/core/mainThread/subTopThread.d.ts +2 -2
  53. package/dist/core/msgEvent/base.d.ts +1 -0
  54. package/dist/core/msgEvent/baseForBackgroundThread.d.ts +9 -0
  55. package/dist/core/msgEvent/baseForWorker.d.ts +2 -1
  56. package/dist/core/msgEvent/copyNode/forBackgroundThread.d.ts +8 -0
  57. package/dist/core/msgEvent/copyNode/forMain.d.ts +2 -2
  58. package/dist/core/msgEvent/forBackgroundThread.d.ts +12 -0
  59. package/dist/core/msgEvent/forMainThread.d.ts +4 -4
  60. package/dist/core/msgEvent/forWorker.d.ts +4 -4
  61. package/dist/core/msgEvent/index.d.ts +4 -4
  62. package/dist/core/msgEvent/rotateNode/forMain.d.ts +2 -2
  63. package/dist/core/msgEvent/scaleNode/forMain.d.ts +2 -2
  64. package/dist/core/msgEvent/setColor/forMain.d.ts +2 -2
  65. package/dist/core/msgEvent/setPoint/forMain.d.ts +2 -2
  66. package/dist/core/msgEvent/setZIndex/forMain.d.ts +7 -0
  67. package/dist/core/msgEvent/translateNode/forMain.d.ts +2 -2
  68. package/dist/core/plugin.d.ts +49 -0
  69. package/dist/core/renderCotrol.d.ts +12 -11
  70. package/dist/core/tools/arrow.d.ts +10 -22
  71. package/dist/core/tools/base.d.ts +52 -9
  72. package/dist/core/tools/ellipse.d.ts +10 -22
  73. package/dist/core/tools/image.d.ts +9 -7
  74. package/dist/core/tools/index.d.ts +14 -13
  75. package/dist/core/tools/laserPen.d.ts +1 -1
  76. package/dist/core/tools/pencil.d.ts +18 -8
  77. package/dist/core/tools/pencilEraser.d.ts +36 -41
  78. package/dist/core/tools/pencilEraserBitMap.d.ts +20 -27
  79. package/dist/core/tools/polygon.d.ts +10 -22
  80. package/dist/core/tools/rectangle.d.ts +10 -22
  81. package/dist/core/tools/selector.d.ts +42 -24
  82. package/dist/core/tools/shadowSvg.d.ts +36 -0
  83. package/dist/core/tools/speechBalloon.d.ts +10 -22
  84. package/dist/core/tools/star.d.ts +10 -22
  85. package/dist/core/tools/straight.d.ts +10 -22
  86. package/dist/core/tools/text.d.ts +2 -1
  87. package/dist/core/tools/utils.d.ts +11 -12
  88. package/dist/core/types.d.ts +98 -18
  89. package/dist/core/utils/ObserverMap.d.ts +19 -0
  90. package/dist/core/utils/clipper.d.ts +8 -0
  91. package/dist/core/utils/getSvgPathFromPoints.d.ts +1 -1
  92. package/dist/core/utils/index.d.ts +6 -5
  93. package/dist/core/utils/indexDB.d.ts +17 -0
  94. package/dist/core/utils/math.d.ts +1 -0
  95. package/dist/core/utils/polygonUtils.d.ts +8 -0
  96. package/dist/core/utils/primitives/Box2d.d.ts +4 -4
  97. package/dist/core/utils/proxy.d.ts +3 -4
  98. package/dist/core/utils/spriteNode.d.ts +8 -1
  99. package/dist/core/vNodeManager.d.ts +13 -9
  100. package/dist/core/worker/base.d.ts +43 -21
  101. package/dist/core/worker/fullWorkerLocal.d.ts +29 -25
  102. package/dist/core/worker/fullWorkerService.d.ts +9 -9
  103. package/dist/core/worker/simpleWorker.d.ts +28 -0
  104. package/dist/core/worker/snapshotWork.d.ts +27 -0
  105. package/dist/core/worker/subWorkerLocal.d.ts +2 -3
  106. package/dist/core/worker/subWorkerTopLayer.d.ts +2 -2
  107. package/dist/core/worker/workerManager.d.ts +52 -36
  108. package/dist/cursors/index.d.ts +9 -11
  109. package/dist/displayer/const.d.ts +1 -0
  110. package/dist/displayer/cursor/index.d.ts +1 -0
  111. package/dist/displayer/floatBar/dragBox/index.d.ts +9 -3
  112. package/dist/displayer/floatBar/index.d.ts +2 -1
  113. package/dist/displayer/floatBtns/index.d.ts +2 -0
  114. package/dist/displayer/utils.d.ts +1 -0
  115. package/dist/extend.d.ts +1 -0
  116. package/dist/fullWorker.js +242 -195
  117. package/dist/index-BCI9ZJly.mjs +9884 -0
  118. package/dist/index-CRWsZj1z.mjs +16601 -0
  119. package/dist/index-D2XqHUO-.js +1 -0
  120. package/dist/index-Dfujq78k.js +3 -0
  121. package/dist/index-TQPJgovl.mjs +1263 -0
  122. package/dist/index-ZvQrVWzu.js +1 -0
  123. package/dist/index.d.ts +1 -0
  124. package/dist/plugin/applianceMultiPlugin.d.ts +2 -3
  125. package/dist/plugin/applianceSinglePlugin.d.ts +3 -4
  126. package/dist/plugin/baseApplianceManager.d.ts +58 -13
  127. package/dist/plugin/baseViewContainerManager.d.ts +72 -73
  128. package/dist/plugin/const.d.ts +2 -22
  129. package/dist/plugin/displayerView.d.ts +18 -4
  130. package/dist/plugin/index.d.ts +1 -0
  131. package/dist/plugin/multi/applianceMultiManager.d.ts +0 -1
  132. package/dist/plugin/multi/containerManager.d.ts +8 -1
  133. package/dist/plugin/multi/displayer/appViewDisplayerManager.d.ts +3 -2
  134. package/dist/plugin/multi/displayer/mainViewDisplayerManager.d.ts +4 -2
  135. package/dist/plugin/single/displayer/mainViewDisplayerManager.d.ts +4 -3
  136. package/dist/plugin/types.d.ts +393 -32
  137. package/dist/style.css +1 -1
  138. package/dist/subWorker.js +242 -195
  139. package/dist/svgToImageLoader-DPRAAhwW.js +1 -0
  140. package/dist/svgToImageLoader-mXH53h-l.mjs +18 -0
  141. package/dist/undo/index.d.ts +25 -31
  142. package/dist/undo/proxyArray.d.ts +37 -0
  143. package/package.json +31 -9
  144. package/cdn/fullWorker-DMz46H.js +0 -439
  145. package/cdn/subWorker-B_zAQR.js +0 -439
  146. package/dist/collector/eventCollector.d.ts +0 -31
  147. package/dist/collector/magixEventCollector.d.ts +0 -31
  148. package/dist/core/mainThread/workerMainThread.d.ts +0 -99
  149. package/dist/core/msgEvent/deleteNode/forMainThread.d.ts +0 -6
  150. package/dist/core/msgEvent/deleteNode/forWorker.d.ts +0 -6
  151. package/dist/index-B-Nowr4E.mjs +0 -14865
  152. package/dist/index-BDVvqw7g.js +0 -1
  153. package/dist/index-DwakKeHT.mjs +0 -2497
  154. package/dist/index-cRE5FY5s.js +0 -1
@@ -0,0 +1,109 @@
1
+ import { Transformer } from "./markmap";
2
+ /**
3
+ * Mermaid 管理器(单例模式)
4
+ * 统一管理 mermaid 代码块的存储、HTML 生成和 markdown 扩展
5
+ * 使用 workId 作为命名空间,避免多个 ISvgElement 实例互相影响
6
+ */
7
+ export declare class MermaidManager {
8
+ private static instance;
9
+ private mermaidCodeBlocksByWorkId;
10
+ private constructor();
11
+ /**
12
+ * 获取 MermaidManager 单例实例
13
+ */
14
+ static getInstance(): MermaidManager;
15
+ /**
16
+ * 生成唯一的 mermaid ID
17
+ */
18
+ generateId(): string;
19
+ /**
20
+ * 生成 mermaid HTML 容器
21
+ * @param id mermaid ID
22
+ * @param mermaidCode mermaid 代码(可选,如果提供则存储)
23
+ * @param workId 工作 ID(用于命名空间隔离)
24
+ * @returns HTML 字符串
25
+ */
26
+ createContainer(id: string, mermaidCode?: string, workId?: string): string;
27
+ /**
28
+ * 获取 mermaid 代码块
29
+ * @param id mermaid ID
30
+ * @param workId 工作 ID(用于命名空间隔离)
31
+ * @returns mermaid 代码或 undefined
32
+ */
33
+ getCode(id: string, workId: string): string | undefined;
34
+ /**
35
+ * 清空指定 workId 的 mermaid 代码块
36
+ * @param workId 工作 ID(如果未提供,清空所有)
37
+ */
38
+ clear(workId?: string): void;
39
+ /**
40
+ * 扩展 markdown-it 的渲染规则,处理 mermaid 代码块
41
+ * @param transformer Transformer 实例
42
+ * @param workId 工作 ID(用于命名空间隔离)
43
+ */
44
+ extendMarkdown(transformer: Transformer, workId: string): void;
45
+ static generateId(): string;
46
+ static createContainer(id: string, mermaidCode?: string, workId?: string): string;
47
+ static getCode(id: string, workId: string): string | undefined;
48
+ static clear(workId?: string): void;
49
+ static extendMarkdown(transformer: Transformer, workId: string): void;
50
+ }
51
+ /**
52
+ * Mermaid 渲染器工具类
53
+ * 负责处理 markmap 中的 mermaid 图表渲染相关逻辑
54
+ */
55
+ export declare class MermaidRenderer {
56
+ /**
57
+ * 检查 markmap 节点及其子节点是否包含 mermaid 代码块
58
+ * @param node markmap 节点数据
59
+ * @returns 如果节点或其子节点包含 mermaid 代码块,返回 true
60
+ */
61
+ static checkNodeHasMermaid(node: any): boolean;
62
+ /**
63
+ * 等待 DOM 更新后渲染 Mermaid 图表
64
+ * @param svgElement SVG 元素
65
+ * @param workId 工作 ID
66
+ * @returns Promise<void>
67
+ */
68
+ static renderMermaidAfterDOMUpdate(svgElement: SVGSVGElement, workId: string): Promise<void>;
69
+ /**
70
+ * 渲染所有 mermaid 容器中的图表
71
+ * @param svgElement SVG 元素
72
+ * @param workId 工作 ID
73
+ * @returns Promise<void>
74
+ */
75
+ static renderMermaidBlocks(svgElement: SVGSVGElement, workId: string): Promise<void>;
76
+ /**
77
+ * 检测是否是 Safari 浏览器
78
+ * @returns 如果是 Safari 返回 true,否则返回 false
79
+ */
80
+ static isSafari(): boolean;
81
+ /**
82
+ * 将 mermaid SVG 从 foreignObject 移出,直接添加到 markmap SVG 中(Safari 兼容性处理)
83
+ * 克隆 mermaid SVG 元素,设置正确的尺寸和位置,然后将 foreignObject 中的 mermaid-container 透明度设为 0
84
+ * @param svgElement markmap SVG 元素
85
+ * @returns Promise<void>
86
+ */
87
+ static transformMermaidSvgToMarkmapSvg(svgElement: SVGSVGElement): Promise<void>;
88
+ /**
89
+ * 在 root 数据中注入 mermaid HTML
90
+ * 找到包含 mermaid 代码块的节点,将 HTML 添加到其 content 中
91
+ * @param root markmap root 数据
92
+ * @param markdown markdown 文本
93
+ * @param workId 工作 ID(用于命名空间隔离)
94
+ * @returns 修改后的 root 数据
95
+ */
96
+ static injectMermaidHtml(root: any, markdown: string, workId: string): any;
97
+ /**
98
+ * 解码 HTML 实体
99
+ * @param str HTML 字符串
100
+ * @returns 解码后的字符串
101
+ */
102
+ private static decodeHtmlEntities;
103
+ /**
104
+ * 检查 divElement 中是否包含 mermaid SVG 元素
105
+ * @param divElement HTMLDivElement 或 SVGSVGElement 元素
106
+ * @returns 如果包含 mermaid SVG 元素,返回 true,否则返回 false
107
+ */
108
+ static hasMermaidSvg(divElement: HTMLDivElement | SVGSVGElement): boolean;
109
+ }
@@ -0,0 +1,31 @@
1
+ import { IBackgroundThreadInitOption } from "../../core/backGroundThread";
2
+ import { MasterControlForWorker } from "../../core/mainEngine";
3
+ import { BaseShapeTool } from "../../core/tools";
4
+ import { ICameraOpt, IWorkerMessage } from "../../core/types";
5
+ import { VBackgroundNodeManager } from "./vNodeManager";
6
+ import { View } from "../../plugin/types";
7
+ import { IMarkmapOptions } from "./markmap";
8
+ export declare class BackgroundSnapshotThreadImpl {
9
+ viewId: string;
10
+ fullLayer: HTMLDivElement;
11
+ master: MasterControlForWorker;
12
+ vNodes: VBackgroundNodeManager;
13
+ private cameraOpt?;
14
+ readonly opt: IBackgroundThreadInitOption;
15
+ workShapes: Map<string, BaseShapeTool>;
16
+ get camera(): ICameraOpt;
17
+ get view(): View | undefined;
18
+ get markmapOptions(): Partial<IMarkmapOptions> | undefined;
19
+ constructor(viewId: string, opt: IBackgroundThreadInitOption);
20
+ createOffscreenCanvas(opt: IBackgroundThreadInitOption): void;
21
+ setCameraOpt(cameraOpt: ICameraOpt): Promise<void>;
22
+ getPagePoint(x: number, y: number): {
23
+ x: number;
24
+ y: number;
25
+ };
26
+ getSnapshot(data: IWorkerMessage): Promise<void>;
27
+ private createWorkShapeNode;
28
+ private setFullWork;
29
+ runFullWork(data: IWorkerMessage): Promise<void>;
30
+ destroy(): void;
31
+ }
@@ -0,0 +1,43 @@
1
+ import { EToolsKey, ISVGOptions } from "../../core";
2
+ import { ISVGElementToolProps } from "./types";
3
+ import { VBackgroundNodeManager } from "./vNodeManager";
4
+ import type { BackgroundThreadEngineImpl } from "./manager";
5
+ import { Markmap } from "./markmap";
6
+ import type { Collector } from "../../collector";
7
+ import type { BackgroundSnapshotThreadImpl } from "./snapshot";
8
+ export declare class ISvgElement {
9
+ readonly toolsType: EToolsKey;
10
+ readonly vNodes: VBackgroundNodeManager;
11
+ private workOptions;
12
+ readonly workId: string;
13
+ markmapInstance: ReturnType<typeof Markmap.create> | null;
14
+ private isDestroyed;
15
+ private element;
16
+ readonly manager: BackgroundThreadEngineImpl | BackgroundSnapshotThreadImpl;
17
+ get fullLayer(): HTMLDivElement;
18
+ get collector(): Collector | undefined;
19
+ get scenePath(): string | undefined;
20
+ constructor(props: ISVGElementToolProps);
21
+ init(): Promise<void>;
22
+ private createElement;
23
+ private render;
24
+ private isSameSize;
25
+ private isSamePosition;
26
+ private isSameZIndex;
27
+ private isSameState;
28
+ private isSameData;
29
+ private updateElementPosition;
30
+ private updateSvg;
31
+ private fit;
32
+ private serializeData;
33
+ private transformState;
34
+ updateCamera(): Promise<void>;
35
+ setWorkOptions(toolsOpt: ISVGOptions, forceRender?: boolean): Promise<void>;
36
+ destroy(): void;
37
+ getRectFromLayer(): {
38
+ x: number;
39
+ y: number;
40
+ w: number;
41
+ h: number;
42
+ };
43
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * SVG to Image 库的按需加载工具
3
+ * 使用 dom-to-image 库,用于将包含 SVG foreignObject 的 DOM 转换为图片
4
+ * dom-to-image 支持 SVG foreignObject,可以可靠地将 DOM 节点转换为图片
5
+ */
6
+ type DomToImageLib = {
7
+ toPng: (node: Node, options?: any) => Promise<string>;
8
+ toBlob: (node: Node, options?: any) => Promise<Blob>;
9
+ toJpeg: (node: Node, options?: any) => Promise<string>;
10
+ toSvg: (node: Node, options?: any) => Promise<string>;
11
+ };
12
+ /**
13
+ * 按需加载 svg-to-image 库(使用 dom-to-image)
14
+ * @returns Promise<DomToImageLib> 返回加载的库对象
15
+ */
16
+ export declare function loadSvgToImageLib(): Promise<DomToImageLib>;
17
+ /**
18
+ * 检查库是否已加载
19
+ */
20
+ export declare function isSvgToImageLibLoaded(): boolean;
21
+ /**
22
+ * 获取已加载的库(如果未加载则返回 null)
23
+ */
24
+ export declare function getSvgToImageLib(): DomToImageLib | null;
25
+ export {};
@@ -0,0 +1,10 @@
1
+ import { ISVGOptions } from "../../core";
2
+ import { BackgroundThreadEngineImpl } from "./manager";
3
+ import { BackgroundSnapshotThreadImpl } from "./snapshot";
4
+ import { VBackgroundNodeManager } from "./vNodeManager";
5
+ export interface ISVGElementToolProps {
6
+ workId: string;
7
+ toolsOpt: ISVGOptions;
8
+ vNodes: VBackgroundNodeManager;
9
+ manager: BackgroundThreadEngineImpl | BackgroundSnapshotThreadImpl;
10
+ }
@@ -0,0 +1,9 @@
1
+ export declare function loadAllImages(element: HTMLDivElement): Promise<unknown[]>;
2
+ export declare function loadSvg(svg: SVGSVGElement): Promise<void>;
3
+ export declare function loadAllSvgs(divElement: HTMLDivElement): Promise<void>;
4
+ export declare function loadMermaidSvg(divElement: HTMLDivElement | SVGSVGElement): Promise<void>;
5
+ export declare function divToImageElement(container: HTMLDivElement, options?: {
6
+ width?: number;
7
+ height?: number;
8
+ scale?: number;
9
+ }): Promise<HTMLImageElement | null>;
@@ -0,0 +1,28 @@
1
+ import { ObserverMap } from "../../core/utils/ObserverMap";
2
+ import { ISvgElement } from "./svgElemt";
3
+ export interface IBackgroundNodeMapItem {
4
+ name: string;
5
+ workShape: ISvgElement;
6
+ }
7
+ /**
8
+ * 背景节点管理器
9
+ * 覆盖父类的 curNodeMap 类型,使用 IBackgroundNodeMapItem 作为节点项类型
10
+ * IBackgroundNodeMapItem 是 BaseNodeMapItem 的简化版本,专门用于背景节点管理
11
+ */
12
+ export declare class VBackgroundNodeManager {
13
+ viewId: string;
14
+ fullLayer?: HTMLDivElement;
15
+ curNodeMap: ObserverMap<string, IBackgroundNodeMapItem>;
16
+ constructor(viewId: string);
17
+ init(fullLayer: HTMLDivElement): void;
18
+ get(name: string): IBackgroundNodeMapItem | undefined;
19
+ setInfo(name: string, info: Partial<IBackgroundNodeMapItem>): void;
20
+ getNodeRectFormShape(key: string): {
21
+ x: number;
22
+ y: number;
23
+ w: number;
24
+ h: number;
25
+ } | undefined;
26
+ delete(name: string): void;
27
+ clear(): void;
28
+ }
@@ -1,2 +1,2 @@
1
- export * from './types';
2
- export * from './manager';
1
+ export * from "./types";
2
+ export * from "./manager";
@@ -1,13 +1,20 @@
1
1
  import { TextEditorInfo, TextOptions } from "./types";
2
2
  import { BaseSubWorkModuleProps } from "../../plugin/types";
3
- import { ICameraOpt, IWorkerMessage } from "../../core";
3
+ import { ICameraOpt, IUpdateNodeOpt, IWorkerMessage } from "../../core";
4
4
  import type EventEmitter2 from "eventemitter2";
5
5
  import { BaseApplianceManager } from "../../plugin/baseApplianceManager";
6
+ import { WorkId } from "../../collector/types";
7
+ export declare const TextBoxPadding = 5;
6
8
  export interface TextEditorManager {
7
9
  readonly internalMsgEmitter: EventEmitter2;
10
+ readonly publicMsgEmitter: EventEmitter2;
8
11
  readonly control: BaseApplianceManager;
12
+ UndoTickerId?: number;
9
13
  editors: Map<string, TextEditorInfo>;
14
+ /** 当前激活的文本编辑器 */
10
15
  activeId?: string;
16
+ /** 添加撤销栈 */
17
+ addUndoTicker(undoTickerId: number, viewId: string): void;
11
18
  /** 通过view组建中更新文本 */
12
19
  updateForViewEdited(activeId?: string, info?: TextEditorInfo): void;
13
20
  /** 过滤文本编辑器 */
@@ -17,7 +24,7 @@ export interface TextEditorManager {
17
24
  /** 校验是否删除空文本或事失焦 */
18
25
  checkEmptyTextBlur(): void;
19
26
  /** 激活文本编辑组件 */
20
- active(workId: string): void;
27
+ active(workId: string, undoTickerId?: number): void;
21
28
  /** 不激活文本编辑组件 */
22
29
  unActive(blurId: string): void;
23
30
  /** 创建文本来源于main */
@@ -48,6 +55,7 @@ export interface TextEditorManager {
48
55
  viewId: string;
49
56
  canWorker: boolean;
50
57
  canSync: boolean;
58
+ updateNodeOpt?: IUpdateNodeOpt;
51
59
  }, undoTickerId?: number): void;
52
60
  /** 编辑文本 */
53
61
  /** 获取组建信息 */
@@ -64,16 +72,23 @@ export interface TextEditorManager {
64
72
  onServiceDerive(data: IWorkerMessage): void;
65
73
  /** 监听camera变化 */
66
74
  onCameraChange(cameraOpt: ICameraOpt, viewId: string): void;
75
+ /** 插入文本 */
76
+ insertText(viewId: string, x: number, y: number, textContent: string): WorkId | undefined;
77
+ /** 更新指定文本 */
78
+ updateText(workId: WorkId, textContent: string): void;
67
79
  }
68
80
  export declare class TextEditorManagerImpl implements TextEditorManager {
69
81
  readonly internalMsgEmitter: EventEmitter2;
82
+ readonly publicMsgEmitter: EventEmitter2;
70
83
  readonly control: BaseApplianceManager;
71
84
  editors: Map<string, TextEditorInfo>;
72
85
  activeId?: string;
73
86
  private proxyMap;
74
87
  private taskqueue;
88
+ private undoTickerId?;
75
89
  constructor(props: BaseSubWorkModuleProps);
76
90
  get collector(): import("../../collector").Collector | undefined;
91
+ set UndoTickerId(value: number);
77
92
  filterEditor(viewId: string): Map<string, TextEditorInfo>;
78
93
  get interceptors(): {
79
94
  set: (workId: string, info: TextEditorInfo) => true | undefined;
@@ -81,12 +96,14 @@ export declare class TextEditorManagerImpl implements TextEditorManager {
81
96
  clear(): boolean;
82
97
  };
83
98
  computeTextActive(point: [number, number], viewId: string): void;
99
+ checkLocalTextBlur: import("lodash").DebouncedFunc<() => void>;
84
100
  checkEmptyTextBlur(): void;
85
101
  onCameraChange(cameraOpt: ICameraOpt, viewId: string): void;
86
102
  onServiceDerive(data: IWorkerMessage): void;
87
103
  updateForViewEdited(activeId: string, info: TextEditorInfo): void;
88
- active(workId: string): void;
104
+ active(workId: string, undoTickerId?: number): void;
89
105
  unActive(blurId: string): void;
106
+ addUndoTicker(undoTickerId: number, viewId: string): void;
90
107
  createTextForMasterController(params: TextEditorInfo & {
91
108
  workId: string;
92
109
  viewId: string;
@@ -114,4 +131,6 @@ export declare class TextEditorManagerImpl implements TextEditorManager {
114
131
  deleteBatch(workIds: string[], canSync?: boolean | undefined, canWorker?: boolean | undefined): void;
115
132
  clear(viewId: string, justLocal?: boolean): void;
116
133
  destory(): void;
134
+ insertText(viewId: string, x: number, y: number, textContent: string): WorkId | undefined;
135
+ updateText(workId: WorkId, textContent: string): void;
117
136
  }
@@ -1,4 +1,4 @@
1
- import { EDataType, EvevtWorkState } from "../../core";
1
+ import { EDataType, EventWorkState, IUpdateNodeOpt } from "../../core";
2
2
  import { BaseShapeOptions } from "../../core/tools";
3
3
  export declare enum ETextEditorType {
4
4
  Text = 1,
@@ -6,8 +6,8 @@ export declare enum ETextEditorType {
6
6
  }
7
7
  export type VerticalAlignType = "top" | "middle" | "bottom";
8
8
  export type TextAlignType = "left" | "center" | "right";
9
- export type FontWeightType = 'bold' | 'normal';
10
- export type FontStyleType = 'italic' | 'normal';
9
+ export type FontWeightType = "bold" | "normal";
10
+ export type FontStyleType = "italic" | "normal";
11
11
  export interface TextOptions extends BaseShapeOptions {
12
12
  fontColor: string;
13
13
  fontSize: number;
@@ -26,7 +26,7 @@ export interface TextOptions extends BaseShapeOptions {
26
26
  boxPoint?: [number, number];
27
27
  boxSize?: [number, number];
28
28
  /** 状态 */
29
- workState?: EvevtWorkState;
29
+ workState?: EventWorkState;
30
30
  /** 正在编辑的用户 */
31
31
  uid?: string;
32
32
  }
@@ -47,4 +47,5 @@ export type TextEditorInfo = {
47
47
  dataType?: EDataType;
48
48
  translate?: [number, number];
49
49
  justLocal?: boolean;
50
+ updateNodeOpt?: IUpdateNodeOpt;
50
51
  };
@@ -1,3 +1,4 @@
1
1
  import { EToolsKey } from "../../core";
2
2
  import { ETextEditorType } from "./types";
3
3
  export declare function getTextEditorType(toolsKey: EToolsKey): ETextEditorType | undefined;
4
+ export declare function escapeCSS(id: string): string;
@@ -1,73 +1,53 @@
1
- import React, { FocusEventHandler, KeyboardEventHandler } from "react";
1
+ import React from "react";
2
2
  import { TextEditorInfo, TextOptions } from "./types";
3
- import { ApplianceViewManagerLike, EmitEventType } from "../../plugin/types";
4
- export declare const Max_Font_Size = 80;
5
- export interface TextSelectorManagerProps {
6
- selectIds: string[];
3
+ import { EmitEventType } from "../../plugin/types";
4
+ export interface TextManagerProps {
7
5
  className?: string;
8
6
  editors?: Map<string, TextEditorInfo>;
9
- activeTextId?: string;
7
+ selectIds?: string[];
10
8
  box?: {
11
9
  x: number;
12
10
  y: number;
13
11
  w: number;
14
12
  h: number;
15
13
  };
16
- manager: ApplianceViewManagerLike;
17
14
  showFloatBtns?: boolean;
18
15
  operationType?: EmitEventType;
16
+ rightBoundBreak?: boolean;
17
+ }
18
+ export interface TextSelectorManagerProps extends TextManagerProps {
19
+ handleTextEditorPointerDown: (workId: string) => void;
20
+ handleTextEditorPointerUp: () => void;
19
21
  }
20
22
  export interface TextViewProps {
21
23
  workId: string;
22
24
  data: TextEditorInfo;
23
- isSelect?: boolean;
24
- isActive?: boolean;
25
- manager: ApplianceViewManagerLike;
26
25
  }
27
26
  export interface TextSelectorViewProps extends TextViewProps {
28
- left: string;
29
- top: string;
30
- selectIds?: string[];
31
27
  updateOptInfo: (param: {
32
28
  activeTextId: string;
33
29
  update: Partial<TextOptions>;
34
- syncData?: Pick<TextEditorInfo, 'canSync' | 'canWorker'>;
30
+ syncData?: Pick<TextEditorInfo, "canSync" | "canWorker">;
35
31
  }) => void;
32
+ handlePointerDown: (workId: string) => void;
33
+ handlePointerUp: () => void;
36
34
  }
37
35
  export interface TextEditorProps extends TextViewProps {
38
36
  showFloatBtns: boolean;
39
- handleKeyUp: KeyboardEventHandler<HTMLDivElement>;
40
- handleFocus: FocusEventHandler<HTMLDivElement>;
41
- runAnimation: () => void;
42
- updateOptInfo: (param: {
43
- activeTextId: string;
44
- update: Partial<TextOptions>;
45
- syncData?: Pick<TextEditorInfo, 'canSync' | 'canWorker'>;
46
- }) => void;
47
- }
48
- export declare const TextView: (props: TextViewProps) => React.JSX.Element;
49
- export declare const TextSelectorView: React.MemoExoticComponent<(props: TextSelectorViewProps) => React.JSX.Element>;
50
- export declare const TextEditor: (props: TextEditorProps) => React.JSX.Element;
51
- export declare class TextViewInSelector extends React.Component<TextSelectorManagerProps, {
52
- hasEditor: boolean;
53
- }> {
54
- constructor(props: TextSelectorManagerProps);
55
- getInnerText(target: HTMLDivElement): string[];
56
- updateOptInfo(param: {
57
- activeTextId: string;
58
- update: Partial<TextOptions>;
59
- syncData?: Pick<TextEditorInfo, 'canSync' | 'canWorker'>;
60
- }): void;
61
- get editorUI(): JSX.Element[] | null;
62
- render(): React.JSX.Element;
63
- }
64
- export declare class TextEditorContainer extends TextViewInSelector {
65
- ref: React.RefObject<HTMLDivElement> | undefined;
66
- isRunAnimation?: number;
67
- constructor(props: TextSelectorManagerProps);
68
- runAnimation(): void;
69
- handleKeyUp(e: any): void;
70
- handleFocus(e: any): void;
71
- get editorUI(): JSX.Element[] | null;
72
- render(): React.JSX.Element;
37
+ rightBoundBreak: boolean;
38
+ handleKeyUp: (div: HTMLDivElement) => void;
39
+ handleFocus: (div: HTMLDivElement) => void;
40
+ runAnimation: (callback?: () => void) => void;
41
+ updateSize: (updateId: string, boxSize: [number, number]) => void;
73
42
  }
43
+ /**
44
+ * 文本编辑器类型
45
+ * hover: 当前文本被当前用户获焦中
46
+ * editing: 当前文本编辑中(被其他用户编辑中)
47
+ * active: 当前文本可编辑状态被激活(暂无用户编辑)
48
+ * none: 无状态
49
+ */
50
+ export type TextEditorType = "hover" | "editing" | "active" | "none";
51
+ export declare const TextSelectorView: (props: TextSelectorViewProps) => React.JSX.Element;
52
+ export declare const TextViewInSelector: (props: TextSelectorManagerProps) => React.JSX.Element;
53
+ export declare const TextEditorContainer: (props: TextManagerProps) => React.JSX.Element;
@@ -0,0 +1,12 @@
1
+ import { serializeAutoShapeWork } from "./mapper";
2
+ import type { AutoShapeContext, AutoShapeMappedWork, AutoShapePoint, AutoShapeResult } from "./types";
3
+ export * from "./types";
4
+ export declare function buildAutoShapeContext(params: {
5
+ rawPoints: AutoShapePoint[];
6
+ pencilOptions: AutoShapeContext["pencilOptions"];
7
+ viewId: string;
8
+ scenePath?: string;
9
+ }): AutoShapeContext | null;
10
+ export declare function detectAutoShape(context: AutoShapeContext): AutoShapeResult;
11
+ export declare function mapAutoShapeResult(result: AutoShapeResult, context: AutoShapeContext): AutoShapeMappedWork | null;
12
+ export { serializeAutoShapeWork };
@@ -0,0 +1,3 @@
1
+ import type { AutoShapeDefinition, AutoShapeMappedWork } from "./types";
2
+ export declare const defaultAutoShapeMappers: Record<Exclude<AutoShapeDefinition["kind"], "none">, AutoShapeDefinition["mapper"]>;
3
+ export declare function serializeAutoShapeWork(work: AutoShapeMappedWork): string;
@@ -0,0 +1,8 @@
1
+ import type { AutoShapeContext, AutoShapePoint, AutoShapeResult } from "./types";
2
+ export declare function createAutoShapeContext(params: {
3
+ rawPoints: AutoShapePoint[];
4
+ pencilOptions: AutoShapeContext["pencilOptions"];
5
+ viewId: string;
6
+ scenePath?: string;
7
+ }): AutoShapeContext | null;
8
+ export declare function recognizeAutoShape(context: AutoShapeContext): AutoShapeResult;
@@ -0,0 +1,2 @@
1
+ import type { AutoShapeDefinition } from "./types";
2
+ export declare function getAutoShapeDefinitions(): AutoShapeDefinition[];
@@ -0,0 +1,2 @@
1
+ import type { AutoShapeTemplateDefinition } from "./types";
2
+ export declare const defaultAutoShapeTemplates: AutoShapeTemplateDefinition[];
@@ -0,0 +1,78 @@
1
+ import type { EToolsKey } from "../enum";
2
+ import type { ShapeOptions } from "../tools";
3
+ import type { PencilOptions } from "../tools/pencil";
4
+ export type AutoShapePoint = [number, number];
5
+ export type AutoShapeKind = "straight" | "arrow" | "rectangle" | "ellipse" | "triangle" | "rhombus" | "star" | "none";
6
+ export interface AutoShapeBounds {
7
+ minX: number;
8
+ minY: number;
9
+ maxX: number;
10
+ maxY: number;
11
+ }
12
+ export interface AutoShapeMetrics {
13
+ pathLength: number;
14
+ chordLength: number;
15
+ straightness: number;
16
+ closureDistance: number;
17
+ closureRatio: number;
18
+ bboxWidth: number;
19
+ bboxHeight: number;
20
+ bboxDiagonal: number;
21
+ aspectRatio: number;
22
+ cornerCount: number;
23
+ angleVariance: number;
24
+ radialVariance: number;
25
+ bboxCornerCloseness: number;
26
+ diamondCloseness: number;
27
+ }
28
+ export interface AutoShapeContext {
29
+ viewId: string;
30
+ scenePath?: string;
31
+ pencilOptions: PencilOptions;
32
+ rawPoints: AutoShapePoint[];
33
+ points: AutoShapePoint[];
34
+ start: AutoShapePoint;
35
+ end: AutoShapePoint;
36
+ bbox: AutoShapeBounds;
37
+ metrics: AutoShapeMetrics;
38
+ }
39
+ export interface AutoShapeTemplateDefinition {
40
+ id: string;
41
+ semanticKind: Exclude<AutoShapeKind, "none">;
42
+ points: AutoShapePoint[];
43
+ threshold?: number;
44
+ }
45
+ export interface AutoShapeCandidate {
46
+ kind: Exclude<AutoShapeKind, "none">;
47
+ templateId: string;
48
+ score: number;
49
+ threshold: number;
50
+ distance: number;
51
+ }
52
+ export interface AutoShapeResult {
53
+ kind: AutoShapeKind;
54
+ score: number;
55
+ threshold: number;
56
+ recognized: boolean;
57
+ bbox: AutoShapeBounds;
58
+ start: AutoShapePoint;
59
+ end: AutoShapePoint;
60
+ points: AutoShapePoint[];
61
+ templateId?: string;
62
+ metrics: AutoShapeMetrics;
63
+ candidates: AutoShapeCandidate[];
64
+ }
65
+ export interface AutoShapeMappedWork {
66
+ toolsType: EToolsKey;
67
+ opt: ShapeOptions;
68
+ op: number[];
69
+ }
70
+ export type AutoShapePostProcessor = (candidate: AutoShapeCandidate, context: AutoShapeContext) => AutoShapeCandidate | null;
71
+ export type AutoShapeMapper = (result: AutoShapeResult, context: AutoShapeContext) => AutoShapeMappedWork | null;
72
+ export interface AutoShapeDefinition {
73
+ kind: Exclude<AutoShapeKind, "none">;
74
+ templates: AutoShapeTemplateDefinition[];
75
+ postProcessor?: AutoShapePostProcessor;
76
+ mapper: AutoShapeMapper;
77
+ enabledInV1?: boolean;
78
+ }
@@ -0,0 +1,35 @@
1
+ import { MasterControlForWorker } from "../mainEngine";
2
+ import { IBatchMainMessage, ILayerOptionType, IWorkerMessage } from "../types";
3
+ import { AppViewDisplayerManager, MainViewDisplayerManager } from "../../plugin/baseViewContainerManager";
4
+ import { BackgroundThreadEngineImpl } from "../../component/svg/manager";
5
+ import { ICanvasOptionType } from "./types";
6
+ import { BackgroundSnapshotThreadImpl } from "../../component/svg/snapshot";
7
+ export interface IBackgroundThreadInitOption {
8
+ master: MasterControlForWorker;
9
+ container: HTMLDivElement;
10
+ canvasOpt: ICanvasOptionType;
11
+ layerOpt: ILayerOptionType;
12
+ displayer: MainViewDisplayerManager | AppViewDisplayerManager;
13
+ post(sp: Omit<IBatchMainMessage, "render">): void;
14
+ }
15
+ export interface BackgroundThreadManager {
16
+ master: MasterControlForWorker;
17
+ backgroundThreadMap: Map<string, BackgroundThreadEngineImpl>;
18
+ createBackgroundThread(viewId: string, opt: IBackgroundThreadInitOption): BackgroundThreadEngineImpl;
19
+ createSnapshotThread(viewId: string, opt: IBackgroundThreadInitOption): BackgroundSnapshotThreadImpl;
20
+ consume(msg: Set<IWorkerMessage>): Promise<void>;
21
+ post(sp: Omit<IBatchMainMessage, "render">): void;
22
+ destroy(): void;
23
+ }
24
+ export declare class BackgroundThreadManagerImpl implements BackgroundThreadManager {
25
+ backgroundThreadMap: Map<string, BackgroundThreadEngineImpl>;
26
+ private snapshotThread?;
27
+ master: MasterControlForWorker;
28
+ constructor(master: MasterControlForWorker);
29
+ createBackgroundThread(viewId: string, opt: IBackgroundThreadInitOption): BackgroundThreadEngineImpl;
30
+ createSnapshotThread(viewId: string, opt: IBackgroundThreadInitOption): BackgroundSnapshotThreadImpl;
31
+ consume(msg: Set<IWorkerMessage>): Promise<void>;
32
+ consumeTargetOne(viewId: string, msg: IWorkerMessage): Promise<void>;
33
+ post: (msg: Omit<IBatchMainMessage, "render">) => void;
34
+ destroy(): void;
35
+ }
@@ -0,0 +1,12 @@
1
+ import { IOffscreenCanvasOptionType, ILayerOptionType, IBatchMainMessage } from "..";
2
+ import { MainViewDisplayerManager, AppViewDisplayerManager } from "../../plugin/baseViewContainerManager";
3
+ import { MasterControlForWorker } from "../mainEngine";
4
+ export type ICanvasOptionType = IOffscreenCanvasOptionType;
5
+ export interface IMainThreadInitOption {
6
+ container: HTMLDivElement;
7
+ canvasOpt: ICanvasOptionType;
8
+ layerOpt: ILayerOptionType;
9
+ master: MasterControlForWorker;
10
+ displayer: MainViewDisplayerManager | AppViewDisplayerManager;
11
+ post(sp: Omit<IBatchMainMessage, "render">): void;
12
+ }