@netless/forge-whiteboard 0.1.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 +216 -0
- package/dist/Camera.d.ts +42 -0
- package/dist/Camera.d.ts.map +1 -0
- package/dist/Gesture.d.ts +17 -0
- package/dist/Gesture.d.ts.map +1 -0
- package/dist/IndexedNavigation.d.ts +78 -0
- package/dist/IndexedNavigation.d.ts.map +1 -0
- package/dist/WhitePermissions.d.ts +96 -0
- package/dist/WhitePermissions.d.ts.map +1 -0
- package/dist/Whiteboard.d.ts +202 -0
- package/dist/Whiteboard.d.ts.map +1 -0
- package/dist/WhiteboardApplication.d.ts +71 -0
- package/dist/WhiteboardApplication.d.ts.map +1 -0
- package/dist/WhiteboardKeys.d.ts +8 -0
- package/dist/WhiteboardKeys.d.ts.map +1 -0
- package/dist/edit/Editor.d.ts +64 -0
- package/dist/edit/Editor.d.ts.map +1 -0
- package/dist/edit/EditorConfig.d.ts +12 -0
- package/dist/edit/EditorConfig.d.ts.map +1 -0
- package/dist/edit/TextEditor.d.ts +32 -0
- package/dist/edit/TextEditor.d.ts.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/model/PageModel.d.ts +39 -0
- package/dist/model/PageModel.d.ts.map +1 -0
- package/dist/model/RenderableModel.d.ts +63 -0
- package/dist/model/RenderableModel.d.ts.map +1 -0
- package/dist/model/SelectElementsModel.d.ts +27 -0
- package/dist/model/SelectElementsModel.d.ts.map +1 -0
- package/dist/model/ToolbarModel.d.ts +65 -0
- package/dist/model/ToolbarModel.d.ts.map +1 -0
- package/dist/model/TrashedElementsModel.d.ts +25 -0
- package/dist/model/TrashedElementsModel.d.ts.map +1 -0
- package/dist/model/renderable/CurveModel.d.ts +22 -0
- package/dist/model/renderable/CurveModel.d.ts.map +1 -0
- package/dist/model/renderable/ElementModel.d.ts +59 -0
- package/dist/model/renderable/ElementModel.d.ts.map +1 -0
- package/dist/model/renderable/EraserModel.d.ts +23 -0
- package/dist/model/renderable/EraserModel.d.ts.map +1 -0
- package/dist/model/renderable/LaserPointerModel.d.ts +27 -0
- package/dist/model/renderable/LaserPointerModel.d.ts.map +1 -0
- package/dist/model/renderable/LineModel.d.ts +25 -0
- package/dist/model/renderable/LineModel.d.ts.map +1 -0
- package/dist/model/renderable/PointTextModel.d.ts +32 -0
- package/dist/model/renderable/PointTextModel.d.ts.map +1 -0
- package/dist/model/renderable/RectangleModel.d.ts +19 -0
- package/dist/model/renderable/RectangleModel.d.ts.map +1 -0
- package/dist/model/renderable/SegmentsModel.d.ts +18 -0
- package/dist/model/renderable/SegmentsModel.d.ts.map +1 -0
- package/dist/model/renderable/SelectorModel.d.ts +18 -0
- package/dist/model/renderable/SelectorModel.d.ts.map +1 -0
- package/dist/model/renderable/StraightLineModel.d.ts +18 -0
- package/dist/model/renderable/StraightLineModel.d.ts.map +1 -0
- package/dist/model/renderable/TriangleModel.d.ts +17 -0
- package/dist/model/renderable/TriangleModel.d.ts.map +1 -0
- package/dist/tool/CurveTool.d.ts +13 -0
- package/dist/tool/CurveTool.d.ts.map +1 -0
- package/dist/tool/EllipseTool.d.ts +14 -0
- package/dist/tool/EllipseTool.d.ts.map +1 -0
- package/dist/tool/EraserTool.d.ts +14 -0
- package/dist/tool/EraserTool.d.ts.map +1 -0
- package/dist/tool/GrabTool.d.ts +13 -0
- package/dist/tool/GrabTool.d.ts.map +1 -0
- package/dist/tool/LaserPointerTool.d.ts +12 -0
- package/dist/tool/LaserPointerTool.d.ts.map +1 -0
- package/dist/tool/LineTool.d.ts +15 -0
- package/dist/tool/LineTool.d.ts.map +1 -0
- package/dist/tool/RectangleTool.d.ts +14 -0
- package/dist/tool/RectangleTool.d.ts.map +1 -0
- package/dist/tool/SelectorTool.d.ts +17 -0
- package/dist/tool/SelectorTool.d.ts.map +1 -0
- package/dist/tool/StraightLineTool.d.ts +14 -0
- package/dist/tool/StraightLineTool.d.ts.map +1 -0
- package/dist/tool/TextTool.d.ts +20 -0
- package/dist/tool/TextTool.d.ts.map +1 -0
- package/dist/tool/TriangleTool.d.ts +14 -0
- package/dist/tool/TriangleTool.d.ts.map +1 -0
- package/dist/tool/WhiteboardTool.d.ts +18 -0
- package/dist/tool/WhiteboardTool.d.ts.map +1 -0
- package/dist/utils/Recognizer.d.ts +12 -0
- package/dist/utils/Recognizer.d.ts.map +1 -0
- package/dist/utils/ShadowEmitter.d.ts +15 -0
- package/dist/utils/ShadowEmitter.d.ts.map +1 -0
- package/dist/utils/async.d.ts +3 -0
- package/dist/utils/async.d.ts.map +1 -0
- package/dist/utils/constant.d.ts +2 -0
- package/dist/utils/constant.d.ts.map +1 -0
- package/dist/utils/paperjs.d.ts +7 -0
- package/dist/utils/paperjs.d.ts.map +1 -0
- package/dist/whiteboard.esm.js +30752 -0
- package/dist/whiteboard.esm.js.map +7 -0
- package/dist/whiteboard.js +30756 -0
- package/dist/whiteboard.js.map +7 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# forge-whiteboard
|
|
2
|
+
|
|
3
|
+
应用于 `forge-room` 房间的白板应用。请先[参考]()创建房间实例, 然后才能加载白板应用。
|
|
4
|
+
|
|
5
|
+
## 启动白板
|
|
6
|
+
|
|
7
|
+
```javascript
|
|
8
|
+
const whiteboard = await room.applicationManager.launchApplication(WhiteboardApplication, {
|
|
9
|
+
width: 1920,
|
|
10
|
+
height: 1080,
|
|
11
|
+
defaultToolbarStyle: {
|
|
12
|
+
tool: "curve"
|
|
13
|
+
}
|
|
14
|
+
}, "MainWhiteboard");
|
|
15
|
+
|
|
16
|
+
// 应用启动之后可以进行样式配置, 并挂载到 dom 上
|
|
17
|
+
whiteboard.view.style.height = `100vh`;
|
|
18
|
+
whiteboard.view.style.width = `100vw`;
|
|
19
|
+
whiteboard.view.style.background = "#9E9E9E";
|
|
20
|
+
|
|
21
|
+
document.body.appendChild(whiteboard.view);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 启动配置项
|
|
25
|
+
|
|
26
|
+
`room.launchApplication` 第二个参数为白板的启动配置, 需注意同一个房间的不同客户端应使用一致的配置项来启动同一个 appId 对应的白板应用, 推荐
|
|
27
|
+
将启动配置硬编码在源代码中. 配置项详细说明如下:
|
|
28
|
+
|
|
29
|
+
**白板配置 WhiteboardOption**
|
|
30
|
+
|
|
31
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
32
|
+
| --- | --- |---|---|
|
|
33
|
+
| width | number | 无 | 可视区域的宽度 |
|
|
34
|
+
| height | number | 无 | 可视区域的高度 |
|
|
35
|
+
| defaultToolbarStyle | ToolbarStyle | 见下文 | 默认工具栏样式 |
|
|
36
|
+
|
|
37
|
+
**工具栏配置 ToolbarStyle**
|
|
38
|
+
|
|
39
|
+
| 属性名 | 类型| 默认值 | 说明 |
|
|
40
|
+
| --- | --- | --- | --- |
|
|
41
|
+
| tool | WhiteboardToolType | "curve" | 当前工具 |
|
|
42
|
+
| strokeColor | string | "#009688" | 描边颜色 |
|
|
43
|
+
| fillColor | string / null | null | 填充颜色, null 表示无填充 |
|
|
44
|
+
| fontSize | number | 24 | 字体大小 |
|
|
45
|
+
| fontFamily | string | "Courier New" | 字体名称 |
|
|
46
|
+
| strokeWidth | number | 4 | 描边宽度 |
|
|
47
|
+
| dashArray | number[] | [] | 虚线样式, 默认为 [] 表示实线 |
|
|
48
|
+
|
|
49
|
+
dashArray 配置参考 [MDN](https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/setLineDash)
|
|
50
|
+
|
|
51
|
+
## 工具栏
|
|
52
|
+
|
|
53
|
+
房间内每个用户都可以独立的设置工具栏样式, 并且设置后的值会持久的保证在房间存储中。直接通过 `whiteboard.tool` 等属性可以获取和设置当前工具栏样式。
|
|
54
|
+
|
|
55
|
+
```javascript
|
|
56
|
+
|
|
57
|
+
whiteboard.tool = "curve";
|
|
58
|
+
whiteboard.strokeColor = "#009688";
|
|
59
|
+
whiteboard.fillColor = "#fff";
|
|
60
|
+
whiteboard.fontSize = 24;
|
|
61
|
+
whiteboard.fontFamily = "Courier New";
|
|
62
|
+
whiteboard.strokeWidth = 4;
|
|
63
|
+
whiteboard.dashArray = [5,2,5];
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
通过 `WhiteboardEvents.toolbarStyleChange` 事件可以监听工具栏样式的变化, 方便跟新 UI.
|
|
67
|
+
|
|
68
|
+
```javascript
|
|
69
|
+
whiteboard.on(WhiteboardEvents.toolbarStyleChange, (style) => {
|
|
70
|
+
console.log(style);
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
"curve"
|
|
75
|
+
| "rectangle"
|
|
76
|
+
| "selector"
|
|
77
|
+
| "line"
|
|
78
|
+
| "arrow"
|
|
79
|
+
| "text"
|
|
80
|
+
| "ellipse"
|
|
81
|
+
| "triangle"
|
|
82
|
+
| "eraser"
|
|
83
|
+
| "laser"
|
|
84
|
+
| "grab";
|
|
85
|
+
|
|
86
|
+
### 工具
|
|
87
|
+
|
|
88
|
+
`WhiteboardToolType` 类型定义了白板的工具类型, 目前支持以下工具:
|
|
89
|
+
|
|
90
|
+
| 名称 | 说明 |
|
|
91
|
+
|--- | --- | --- | --- |
|
|
92
|
+
| curve | 自由曲线 |
|
|
93
|
+
| rectangle | 矩形 |
|
|
94
|
+
| selector | 选择工具 |
|
|
95
|
+
| line | 直线 |
|
|
96
|
+
| arrow | 箭头连接线 |
|
|
97
|
+
| text | 文本 |
|
|
98
|
+
| ellipse | 椭圆(圆) |
|
|
99
|
+
| triangle | 三角形 |
|
|
100
|
+
| eraser | 擦除工具 |
|
|
101
|
+
| laser | 激光笔 |
|
|
102
|
+
| grab | 拖动工具 |
|
|
103
|
+
|
|
104
|
+
### 元素交互
|
|
105
|
+
|
|
106
|
+
工具栏控制新增元素的样式, 每个元素也可以独立的修改各类样式.
|
|
107
|
+
|
|
108
|
+
首先需要通过 `WhiteboardEvents.elementSelected` 事件监听元素被选中, 然后通过 `whiteboard.setElementAttribute` 修改元素样式.
|
|
109
|
+
|
|
110
|
+
```javascript
|
|
111
|
+
whiteboard.on(WhiteboardEvents.elementSelected, (userId, pageId, elementId, attributes, boundingRect) => {
|
|
112
|
+
console.log(userId); // 选中的元素是谁创建的
|
|
113
|
+
console.log(pageId); // 元素所在页码
|
|
114
|
+
console.log(elementId); // 元素 id
|
|
115
|
+
console.log(attributes); // 元素属性列表, 不同元素的可修改属性不同
|
|
116
|
+
console.log(boundingRect); // 元素边界, 数组中的四个值分别对应 x, y, width, height
|
|
117
|
+
});
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
`forge-whiteboard` 不内置 UI, 你需要自行决定元素被选中后的 UI 交互, 可以在屏幕的固定位置显示一个元素属性面板, 也可以在元素附近(上方)显示元素属性面板.
|
|
121
|
+
如果是想要在元素附近显示属性面板, `WhiteboardEvents.elementSelected` 事件中的 `boundingRect` 可用于帮助定位属性面板的位置.
|
|
122
|
+
|
|
123
|
+
可以通过 `whiteboard.getElementAttribute` 来确定元素当前属性值, 以绘制元素属性面板. 注意不同元素的可修改属性不同, "curve" 工具绘制的元素就不存在 "fontFamily" 属性,
|
|
124
|
+
通过 `WhiteboardEvents.elementSelected` 事件中第四个参数来确定可修改属性列表.
|
|
125
|
+
|
|
126
|
+
```javascript
|
|
127
|
+
// 获取元素属性
|
|
128
|
+
const strokeColor = whiteboard.getElementAttribute(pageId, elementId, "strokeColor");
|
|
129
|
+
const fontFamily = whiteboard.getElementAttribute(pageId, elementId, "fontFamily");
|
|
130
|
+
|
|
131
|
+
// 设置元素属性
|
|
132
|
+
|
|
133
|
+
whiteboard.setElementAttribute(pageId, elementId, "strokeColor", "#fff");
|
|
134
|
+
whiteboard.setElementAttribute(pageId, elementId, "fontFamily", "kai");
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 页面操作
|
|
138
|
+
|
|
139
|
+
**基础页面操作**
|
|
140
|
+
|
|
141
|
+
`forge-whiteboard` 页面只有一个 id 属性, 页面之间没有前后顺序的关系, 可通过以下 api 进行页面的跳转等操作,注意需要有对应的页面操作权限.
|
|
142
|
+
|
|
143
|
+
```javascript
|
|
144
|
+
// 添加页面
|
|
145
|
+
whiteboard.addPage("page/1");
|
|
146
|
+
// 跳转至刚添加的页面
|
|
147
|
+
whiteboard.gotoPage("page/1");
|
|
148
|
+
// 删除页面
|
|
149
|
+
whiteboard.deletePage("page/1");
|
|
150
|
+
// 获取页面列表
|
|
151
|
+
whiteboard.pageList();
|
|
152
|
+
// 获取当前页面 id, 依据视角参数不同用户可能在不同页面, 通过 userId 获取指定用户的当前页面 id, 不传 userId 参数则获取自己的当前页面 id
|
|
153
|
+
whiteboard.currentPageId("userId");
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**顺序页面操作**
|
|
157
|
+
|
|
158
|
+
为了支持诸如上一页、下一页等功能, `forge-whiteboard` 通过 `whiteboard.indexedNavigation` 对象提供此类 api.
|
|
159
|
+
|
|
160
|
+
```javascript
|
|
161
|
+
|
|
162
|
+
// 跳转
|
|
163
|
+
whiteboard.indexedNavigation.nextPage();
|
|
164
|
+
whiteboard.indexedNavigation.prevPage();
|
|
165
|
+
|
|
166
|
+
// 添加和插入
|
|
167
|
+
whiteboard.indexedNavigation.pushPage();
|
|
168
|
+
whiteboard.indexedNavigation.insertPage(3); // 在第三页后插入新页面
|
|
169
|
+
|
|
170
|
+
// 删除
|
|
171
|
+
whiteboard.indexedNavigation.deletePage(3);
|
|
172
|
+
|
|
173
|
+
// 总页数
|
|
174
|
+
whiteboard.indexedNavigation.pageCount;
|
|
175
|
+
|
|
176
|
+
// 当前页发生变化时触发
|
|
177
|
+
whiteboard.indexedNavigation.on("activePageChange", pageIndex => {
|
|
178
|
+
console.log(pageIndex);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// 总页数发生变化时触发
|
|
182
|
+
whiteboard.indexedNavigation.on("pageCountChange", pageCount => {
|
|
183
|
+
console.log(pageCount);
|
|
184
|
+
});
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**其他页面操作**
|
|
188
|
+
|
|
189
|
+
```javascript
|
|
190
|
+
|
|
191
|
+
// 复制页面
|
|
192
|
+
whiteboard.clonePage("1", "2");
|
|
193
|
+
|
|
194
|
+
// 清空页面内容
|
|
195
|
+
whiteboard.clearPage();
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### 白板权限
|
|
199
|
+
|
|
200
|
+
`forge-whiteboard` 设计了细致的白板权限控制机制, 通过不同权限配置可以实现很多有趣的场景.
|
|
201
|
+
|
|
202
|
+
| 权限类型 | 描述 |
|
|
203
|
+
|---|---|
|
|
204
|
+
|WhiteboardPermissionFlag.none|没有任何权限, 只能同步的看他人绘制|
|
|
205
|
+
|WhiteboardPermissionFlag.draw|可以绘制元素|
|
|
206
|
+
|WhiteboardPermissionFlag.editSelf|可以修改自己创建的元素|
|
|
207
|
+
|WhiteboardPermissionFlag.editOthers|可以修改他人创建的元素|
|
|
208
|
+
|WhiteboardPermissionFlag.deleteSelf|可以删除自己创建的元素|
|
|
209
|
+
|WhiteboardPermissionFlag.deleteOthers|可以删除他人创建的元素|
|
|
210
|
+
|WhiteboardPermissionFlag.mainView|可以修改主视角, 包括页面和画布状态, 添加页面, 删除页面|
|
|
211
|
+
|WhiteboardPermissionFlag.setOthersView|可以修改他人的视角模式, 指定他人的页码|
|
|
212
|
+
|WhiteboardPermissionFlag.all|拥有所有权限|
|
|
213
|
+
|
|
214
|
+
```javascript
|
|
215
|
+
|
|
216
|
+
```
|
package/dist/Camera.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import EventEmitter from "eventemitter3";
|
|
2
|
+
import * as Y from "yjs";
|
|
3
|
+
import { UserManager } from "@netless/forge-room";
|
|
4
|
+
import { WhiteboardPermissionFlag } from "./WhitePermissions";
|
|
5
|
+
interface CameraEvents {
|
|
6
|
+
zoom: (matrix: paper.Matrix) => void;
|
|
7
|
+
userPageChange: (userId: string, pageId: string) => void;
|
|
8
|
+
userViewModeChange: (userId: string, viewMode: string) => void;
|
|
9
|
+
}
|
|
10
|
+
export declare class Camera extends EventEmitter<CameraEvents> {
|
|
11
|
+
readonly scope: paper.PaperScope;
|
|
12
|
+
private dom;
|
|
13
|
+
private lastTriggerTime;
|
|
14
|
+
private lastDelta;
|
|
15
|
+
private requestUserMap;
|
|
16
|
+
private userManager;
|
|
17
|
+
private observers;
|
|
18
|
+
private whiteboardAttrsMap;
|
|
19
|
+
private paperSize;
|
|
20
|
+
private domSize;
|
|
21
|
+
private hasPermission;
|
|
22
|
+
private gesture;
|
|
23
|
+
private inherentScale;
|
|
24
|
+
private get inherentMatrix();
|
|
25
|
+
private get translateScale();
|
|
26
|
+
constructor(dom: HTMLDivElement, userManager: UserManager, scope: paper.PaperScope, whiteboardAttrsMap: Y.Map<any>, hasPermission: (flag: WhiteboardPermissionFlag) => boolean, requestUserMap: (userId: string) => Y.Map<any>, paperSize: () => [number, number], domSize: () => [number, number]);
|
|
27
|
+
updateInherentScale(scale: number): void;
|
|
28
|
+
private getActiveMatrix;
|
|
29
|
+
triggerZoom(): void;
|
|
30
|
+
resetViewMatrixToFlow(userId: string): void;
|
|
31
|
+
resetViewMatrixToMain(): void;
|
|
32
|
+
private handleMainCameraChange;
|
|
33
|
+
private handleUserLeave;
|
|
34
|
+
private handleUserJoin;
|
|
35
|
+
private createModel;
|
|
36
|
+
private handleViewMatrixUpdate;
|
|
37
|
+
private appendViewMatrix;
|
|
38
|
+
private handleWheel;
|
|
39
|
+
translate(offsetX: number, offsetY: number): void;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=Camera.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Camera.d.ts","sourceRoot":"","sources":["../src/Camera.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAgB,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAC,wBAAwB,EAAC,MAAM,oBAAoB,CAAC;AAI5D,UAAU,YAAY;IAClB,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC;IACrC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAClE;AAED,qBAAa,MAAO,SAAQ,YAAY,CAAC,YAAY,CAAC;IAElD,SAAgB,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC;IAExC,OAAO,CAAC,GAAG,CAAiB;IAC5B,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,aAAa,CAAa;IAElC,OAAO,KAAK,cAAc,GAIzB;IAED,OAAO,KAAK,cAAc,GAGzB;gBAGG,GAAG,EAAE,cAAc,EACnB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,CAAC,UAAU,EACvB,kBAAkB,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAC9B,aAAa,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,OAAO,EAC1D,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAE9C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAEjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IA8C5B,mBAAmB,CAAC,KAAK,EAAE,MAAM;IAIxC,OAAO,CAAC,eAAe;IAahB,WAAW;IAIX,qBAAqB,CAAC,MAAM,EAAE,MAAM;IAMpC,qBAAqB;IAM5B,OAAO,CAAC,sBAAsB,CAgB5B;IAEF,OAAO,CAAC,eAAe,CAKrB;IAEF,OAAO,CAAC,cAAc,CAMpB;IAEF,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,sBAAsB,CA2B5B;IAEF,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,WAAW,CAuCjB;IAEK,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAKpD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import EventEmitter from "eventemitter3";
|
|
2
|
+
interface GestureEvent {
|
|
3
|
+
offset: (x: number, y: number) => void;
|
|
4
|
+
scale: (scale: number, center: paper.Point) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare class Gesture extends EventEmitter<GestureEvent> {
|
|
7
|
+
private element;
|
|
8
|
+
private scope;
|
|
9
|
+
private lastVector;
|
|
10
|
+
private lastPoint;
|
|
11
|
+
constructor(element: HTMLElement, scope: paper.PaperScope);
|
|
12
|
+
private onTouchStart;
|
|
13
|
+
private onTouchMove;
|
|
14
|
+
private onTouchEnd;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=Gesture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Gesture.d.ts","sourceRoot":"","sources":["../src/Gesture.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAEzC,UAAU,YAAY;IAClB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;CACvD;AAED,qBAAa,OAAQ,SAAQ,YAAY,CAAC,YAAY,CAAC;IAEnD,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,SAAS,CAA4B;gBAE1B,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU;IAShE,OAAO,CAAC,YAAY,CAYlB;IAEF,OAAO,CAAC,WAAW,CAgCjB;IAEF,OAAO,CAAC,UAAU,CAGjB;CACJ"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as Y from "yjs";
|
|
2
|
+
import EventEmitter from "eventemitter3";
|
|
3
|
+
import { PageModel } from "./model/PageModel";
|
|
4
|
+
import { WhiteboardPermissionFlag } from "./WhitePermissions";
|
|
5
|
+
export interface IndexedNavigationEvents {
|
|
6
|
+
/**
|
|
7
|
+
* 当前页索引发生变化时触发
|
|
8
|
+
* @param pageIndex
|
|
9
|
+
*/
|
|
10
|
+
activePageChange: (pageIndex: number) => void;
|
|
11
|
+
/**
|
|
12
|
+
* 总页数发生变化时触发
|
|
13
|
+
* @param pageCount 总页数
|
|
14
|
+
*/
|
|
15
|
+
pageCountChange: (pageCount: number) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare class IndexedNavigation extends EventEmitter<IndexedNavigationEvents> {
|
|
18
|
+
private idPool;
|
|
19
|
+
private pageModel;
|
|
20
|
+
private userMap;
|
|
21
|
+
private indexedPageMap;
|
|
22
|
+
private list;
|
|
23
|
+
private hasPermission;
|
|
24
|
+
private get idList();
|
|
25
|
+
private get head();
|
|
26
|
+
private get lastNodeId();
|
|
27
|
+
constructor(pageModel: PageModel, userMap: Y.Map<any>, indexedPageMap: Y.Map<{
|
|
28
|
+
prev: string;
|
|
29
|
+
next: string;
|
|
30
|
+
}>, hasPermission: (flag: WhiteboardPermissionFlag) => boolean);
|
|
31
|
+
private getNextId;
|
|
32
|
+
initIndexed(): Promise<boolean>;
|
|
33
|
+
private handleIndexedPageMapUpdate;
|
|
34
|
+
/**
|
|
35
|
+
* 获取总页数
|
|
36
|
+
* @returns {number}
|
|
37
|
+
*/
|
|
38
|
+
get pageCount(): number;
|
|
39
|
+
/**
|
|
40
|
+
* 获取当前页索引
|
|
41
|
+
*/
|
|
42
|
+
get currentPageIndex(): number;
|
|
43
|
+
private getPageIndex;
|
|
44
|
+
/**
|
|
45
|
+
* 获取指定索引对应的 pageId
|
|
46
|
+
* @param {number} index
|
|
47
|
+
*/
|
|
48
|
+
getPageId(index: number): string | null;
|
|
49
|
+
private modifyDetect;
|
|
50
|
+
/**
|
|
51
|
+
* 在尾部插入新页面
|
|
52
|
+
* @param {boolean=} goto 是否跳转到新页面, 默认 true
|
|
53
|
+
* @return 总页数
|
|
54
|
+
*/
|
|
55
|
+
pushPage(goto?: boolean): number;
|
|
56
|
+
/**
|
|
57
|
+
* 在 after 之后插入新页面
|
|
58
|
+
* @param {number} after 在此页之后插入
|
|
59
|
+
* @param {boolean=} goto 是否跳转到新页面, 默认 true
|
|
60
|
+
* @return 总页数
|
|
61
|
+
*/
|
|
62
|
+
insertPage(after: number, goto?: Boolean): number;
|
|
63
|
+
/**
|
|
64
|
+
* 跳转至上一页, 并返回跳转后的页面索引.
|
|
65
|
+
*/
|
|
66
|
+
prevPage(): number;
|
|
67
|
+
/**
|
|
68
|
+
* 跳转至下一页, 并返回跳转后的页面索引.
|
|
69
|
+
*/
|
|
70
|
+
nextPage(): number;
|
|
71
|
+
/**
|
|
72
|
+
* 删除指定页面
|
|
73
|
+
* @param {number} index
|
|
74
|
+
*/
|
|
75
|
+
removePage(index: number): number;
|
|
76
|
+
gotoPage(index: number): void;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=IndexedNavigation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexedNavigation.d.ts","sourceRoot":"","sources":["../src/IndexedNavigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,YAAY,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAC,wBAAwB,EAAC,MAAM,oBAAoB,CAAC;AAE5D,MAAM,WAAW,uBAAuB;IACpC;;;OAGG;IACH,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C;;;OAGG;IACH,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAED,qBAAa,iBAAkB,SAAQ,YAAY,CAAC,uBAAuB,CAAC;IAExE,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,cAAc,CAAa;IAEnC,OAAO,CAAC,IAAI,CAAwD;IACpE,OAAO,CAAC,aAAa,CAA8C;IAEnE,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,IAAI,GAWf;IAED,OAAO,KAAK,UAAU,GAQrB;gBAGG,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EACnB,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EACrD,aAAa,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,OAAO;IAgC9D,OAAO,CAAC,SAAS;IAcV,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAatC,OAAO,CAAC,0BAA0B,CAYhC;IAEF;;;OAGG;IACH,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED;;OAEG;IACH,IAAW,gBAAgB,IAAI,MAAM,CAGpC;IAED,OAAO,CAAC,YAAY;IAiBpB;;;OAGG;IACI,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAmB9C,OAAO,CAAC,YAAY;IAapB;;;;OAIG;IACI,QAAQ,CAAC,IAAI,GAAE,OAAc,GAAG,MAAM;IAgC7C;;;;;OAKG;IACI,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,OAAc,GAAG,MAAM;IAuD9D;;OAEG;IACI,QAAQ,IAAI,MAAM;IAYzB;;OAEG;IACI,QAAQ,IAAI,MAAM;IAazB;;;OAGG;IACI,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IA2CjC,QAAQ,CAAC,KAAK,EAAE,MAAM;CAMhC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { type UserManager } from "@netless/forge-room";
|
|
2
|
+
import EventEmitter from "eventemitter3";
|
|
3
|
+
import * as Y from "yjs";
|
|
4
|
+
export declare enum WhiteboardPermissionFlag {
|
|
5
|
+
/**
|
|
6
|
+
* 没有任何权限, 只能同步的看他人绘制
|
|
7
|
+
*/
|
|
8
|
+
none = 0,
|
|
9
|
+
/**
|
|
10
|
+
* 可以绘制元素
|
|
11
|
+
*/
|
|
12
|
+
draw = 1,
|
|
13
|
+
/**
|
|
14
|
+
* 可以修改自己创建的元素
|
|
15
|
+
*/
|
|
16
|
+
editSelf = 2,
|
|
17
|
+
/**
|
|
18
|
+
* 可以修改他人创建的元素
|
|
19
|
+
*/
|
|
20
|
+
editOthers = 4,
|
|
21
|
+
/**
|
|
22
|
+
* 可以删除自己创建的元素
|
|
23
|
+
*/
|
|
24
|
+
deleteSelf = 8,
|
|
25
|
+
/**
|
|
26
|
+
* 可以删除他人创建的元素
|
|
27
|
+
*/
|
|
28
|
+
deleteOthers = 16,
|
|
29
|
+
/**
|
|
30
|
+
* 可以修改主视角, 包括页面和画布状态, 添加页面, 删除页面
|
|
31
|
+
*/
|
|
32
|
+
mainView = 32,
|
|
33
|
+
/**
|
|
34
|
+
* 可以修改他人的视角模式, 指定他人的页码
|
|
35
|
+
*/
|
|
36
|
+
setOthersView = 64,
|
|
37
|
+
/**
|
|
38
|
+
* 拥有所有权限
|
|
39
|
+
*/
|
|
40
|
+
all = 127
|
|
41
|
+
}
|
|
42
|
+
export interface WhitePermissionEvents {
|
|
43
|
+
/**
|
|
44
|
+
* 当用户权限变更时触发
|
|
45
|
+
* @param { string } userId 对应 userId
|
|
46
|
+
* @param { WhiteboardPermissionFlag[] } flags 当前权限列表
|
|
47
|
+
* @param { number } value 权限值
|
|
48
|
+
*/
|
|
49
|
+
change: (userId: string, flags: WhiteboardPermissionFlag[], value: number) => void;
|
|
50
|
+
}
|
|
51
|
+
export declare class WhiteboardPermissions extends EventEmitter<WhitePermissionEvents> {
|
|
52
|
+
private requestUserMap;
|
|
53
|
+
private userManager;
|
|
54
|
+
private observers;
|
|
55
|
+
constructor(userManager: UserManager, requestUserMap: (userId: string) => Y.Map<any>);
|
|
56
|
+
private handleUserLeave;
|
|
57
|
+
private handleUserJoin;
|
|
58
|
+
private addObserve;
|
|
59
|
+
private createModel;
|
|
60
|
+
private handleUserPermissionChange;
|
|
61
|
+
/**
|
|
62
|
+
* 解析权限列表组合
|
|
63
|
+
* @param {number} value - 权限数字值
|
|
64
|
+
* @return {WhiteboardPermissionFlag[]} - 权限列表
|
|
65
|
+
*/
|
|
66
|
+
resolveFlags(value: number): WhiteboardPermissionFlag[];
|
|
67
|
+
/**
|
|
68
|
+
* 获取权限列表组合对应的数值
|
|
69
|
+
* @param { string } userId 不传表示获取自己
|
|
70
|
+
*/
|
|
71
|
+
getPermissionValue(userId?: string): number;
|
|
72
|
+
/**
|
|
73
|
+
* 获取权限列表
|
|
74
|
+
* @param {string=} userId 可选, 不传表示获取自己
|
|
75
|
+
*/
|
|
76
|
+
getPermissionFlags(userId?: string): WhiteboardPermissionFlag[];
|
|
77
|
+
/**
|
|
78
|
+
* 返回对应 userId 是否有相应权限
|
|
79
|
+
* @param {string=} userId 可选, 不传表示返回自己是否有相应权限
|
|
80
|
+
* @param {WhiteboardPermissionFlag} flag
|
|
81
|
+
*/
|
|
82
|
+
hasPermission(flag: WhiteboardPermissionFlag, userId?: string): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* 添加权限
|
|
85
|
+
* @param {WhiteboardPermissionFlag} flag 权限标记
|
|
86
|
+
* @param {string=} userId 可选, 为 userId 添加权限, 不传表示为自己添加权限
|
|
87
|
+
*/
|
|
88
|
+
addPermission(flag: WhiteboardPermissionFlag, userId?: string): void;
|
|
89
|
+
/**
|
|
90
|
+
* 移除权限
|
|
91
|
+
* @param {WhiteboardPermissionFlag} flag 权限标记
|
|
92
|
+
* @param {string=} userId 可选, 为 userId 移除权限, 不传表示为自己移除权限
|
|
93
|
+
*/
|
|
94
|
+
removePermission(flag: WhiteboardPermissionFlag, userId?: string): void;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=WhitePermissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WhitePermissions.d.ts","sourceRoot":"","sources":["../src/WhitePermissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,oBAAY,wBAAwB;IAChC;;OAEG;IACH,IAAI,IAAqB;IACzB;;OAEG;IACH,IAAI,IAAqB;IACzB;;OAEG;IACH,QAAQ,IAAqB;IAC7B;;OAEG;IACH,UAAU,IAAqB;IAC/B;;OAEG;IACH,UAAU,IAAqB;IAC/B;;OAEG;IACH,YAAY,KAAqB;IACjC;;OAEG;IACH,QAAQ,KAAqB;IAC7B;;OAEG;IACH,aAAa,KAAqB;IAClC;;OAEG;IACH,GAAG,MAMyC;CAC/C;AAED,MAAM,WAAW,qBAAqB;IAClC;;;;;OAKG;IACH,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtF;AAED,qBAAa,qBAAsB,SAAQ,YAAY,CAAC,qBAAqB,CAAC;IAE1E,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAA+B;gBAG5C,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAclD,OAAO,CAAC,eAAe,CAKrB;IAEF,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,0BAA0B;IAWlC;;;;OAIG;IACI,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,wBAAwB,EAAE;IAW9D;;;OAGG;IACI,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAIlD;;;OAGG;IACI,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,wBAAwB,EAAE;IAKtE;;;;OAIG;IACI,aAAa,CAAC,IAAI,EAAE,wBAAwB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAI9E;;;;OAIG;IACI,aAAa,CAAC,IAAI,EAAE,wBAAwB,EAAE,MAAM,CAAC,EAAE,MAAM;IAMpE;;;;OAIG;IACI,gBAAgB,CAAC,IAAI,EAAE,wBAAwB,EAAE,MAAM,CAAC,EAAE,MAAM;CAK1E"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import EventEmitter from "eventemitter3";
|
|
2
|
+
import { ApplicationInstanceType } from "@netless/forge-room";
|
|
3
|
+
import { WhiteboardToolType } from "./WhiteboardApplication";
|
|
4
|
+
import { IndexedNavigation } from "./IndexedNavigation";
|
|
5
|
+
import { WhiteboardPermissions } from "./WhitePermissions";
|
|
6
|
+
import { ToolbarStyle } from "./model/ToolbarModel";
|
|
7
|
+
export interface WhiteboardEvents {
|
|
8
|
+
/**
|
|
9
|
+
* 元素被选中后触发
|
|
10
|
+
* @param {string} userId - 触发事件的用户 id
|
|
11
|
+
* @param {string} pageId - 元素所属页面 id
|
|
12
|
+
* @param {string} elementId - 元素 id
|
|
13
|
+
* @param {ElementAttributeKey[]} attributes - 元素的可修改属性列表
|
|
14
|
+
* @param {number[]} boundingRect - 所有选中元素的最小包围盒, [x, y, width, height]
|
|
15
|
+
*/
|
|
16
|
+
elementSelected: (userId: string, pageId: string, elementId: string, attributes: ElementAttributeKey[], boundingRect: [number, number, number, number]) => void;
|
|
17
|
+
/**
|
|
18
|
+
* 所有元素取消选中后触发
|
|
19
|
+
* @param {string} userId - 触发事件的用户 id
|
|
20
|
+
*/
|
|
21
|
+
elementDeselected: (userId: string) => void;
|
|
22
|
+
/**
|
|
23
|
+
* 工具栏发生变化
|
|
24
|
+
* @param {ToolbarStyle} style
|
|
25
|
+
*/
|
|
26
|
+
toolbarStyleChange: (style: ToolbarStyle) => void;
|
|
27
|
+
/**
|
|
28
|
+
* 白板页数发生变化
|
|
29
|
+
* @param {string[]} pageList pageId 组成的数组
|
|
30
|
+
*/
|
|
31
|
+
pagesChange: (pageList: string[]) => void;
|
|
32
|
+
/**
|
|
33
|
+
* 当前显示页面发生变化后触发
|
|
34
|
+
* @param {string} userId - 触发事件的用户 id
|
|
35
|
+
* @param {string} pageId - 当前页面 id
|
|
36
|
+
*/
|
|
37
|
+
activePageChange: (userId: string, pageId: string) => void;
|
|
38
|
+
/**
|
|
39
|
+
* 视角模式发生变化
|
|
40
|
+
* @param {string} userId
|
|
41
|
+
* @param {"free" | "main" | string} viewMode
|
|
42
|
+
*/
|
|
43
|
+
userViewModeChange: (userId: string, viewMode: "free" | "main" | string) => void;
|
|
44
|
+
/**
|
|
45
|
+
* 输入类型发生变化, "pen" 仅接受手写笔输入, "any" 接受任意输入
|
|
46
|
+
* @param {"pen" | "any"} type
|
|
47
|
+
*/
|
|
48
|
+
inputTypeChange: (type: "pen" | "any") => void;
|
|
49
|
+
/**
|
|
50
|
+
* 撤销栈发生变化时触发
|
|
51
|
+
* @param {number} length - 撤销栈长度
|
|
52
|
+
*/
|
|
53
|
+
undoStackLength: (length: number) => void;
|
|
54
|
+
/**
|
|
55
|
+
* 重做栈发生变化时触发
|
|
56
|
+
* @param {number} length - 重做栈长度
|
|
57
|
+
*/
|
|
58
|
+
redoStackLength: (length: number) => void;
|
|
59
|
+
/**
|
|
60
|
+
* grab 工具鼠标按下时触发
|
|
61
|
+
*/
|
|
62
|
+
grabDown: () => void;
|
|
63
|
+
/**
|
|
64
|
+
* grab 工具鼠标弹起时触发
|
|
65
|
+
*/
|
|
66
|
+
grabUp: () => void;
|
|
67
|
+
error: (errorCode: number, errorMsg: string) => void;
|
|
68
|
+
}
|
|
69
|
+
export type ElementAttributes = {
|
|
70
|
+
strokeColor: string;
|
|
71
|
+
fillColor: string | null;
|
|
72
|
+
strokeWidth: number;
|
|
73
|
+
fontSize: number;
|
|
74
|
+
dashArray: number[];
|
|
75
|
+
headArrow: "normal" | "none";
|
|
76
|
+
tailArrow: "normal" | "none";
|
|
77
|
+
};
|
|
78
|
+
export type ElementAttributeKey = keyof ElementAttributes;
|
|
79
|
+
export declare class Whiteboard extends EventEmitter<WhiteboardEvents> implements ApplicationInstanceType {
|
|
80
|
+
readonly view: HTMLDivElement;
|
|
81
|
+
readonly selfUserId: string;
|
|
82
|
+
readonly permissions: WhiteboardPermissions;
|
|
83
|
+
/**
|
|
84
|
+
* 当前选中的工具
|
|
85
|
+
*/
|
|
86
|
+
tool: WhiteboardToolType;
|
|
87
|
+
/**
|
|
88
|
+
* 字体大小
|
|
89
|
+
*/
|
|
90
|
+
fontSize: number;
|
|
91
|
+
/**
|
|
92
|
+
* 虚线配置
|
|
93
|
+
*/
|
|
94
|
+
dashArray: number[];
|
|
95
|
+
/**
|
|
96
|
+
* 字体名称
|
|
97
|
+
*/
|
|
98
|
+
fontFamily: string;
|
|
99
|
+
/**
|
|
100
|
+
* 描边颜色
|
|
101
|
+
*/
|
|
102
|
+
strokeColor: string;
|
|
103
|
+
/**
|
|
104
|
+
* 填充颜色
|
|
105
|
+
*/
|
|
106
|
+
fillColor: string;
|
|
107
|
+
/**
|
|
108
|
+
* 描边宽度
|
|
109
|
+
*/
|
|
110
|
+
strokeWidth: number;
|
|
111
|
+
getElementAttribute: <K extends ElementAttributeKey>(sceneId: string, elementId: string, attribute: K) => ElementAttributes[K];
|
|
112
|
+
setElementAttribute: <K extends keyof ElementAttributes>(sceneId: string, elementId: string, attribute: K, value: ElementAttributes[K]) => any;
|
|
113
|
+
getCurrentTool: () => WhiteboardToolType;
|
|
114
|
+
setCurrentTool: (tool: WhiteboardToolType) => void;
|
|
115
|
+
/**
|
|
116
|
+
* 设置画布区域背景色
|
|
117
|
+
* @param {string} color - css 颜色值
|
|
118
|
+
*/
|
|
119
|
+
setCanvasBackgroundColor: (color: string) => void;
|
|
120
|
+
/**
|
|
121
|
+
* 设置主题色, 主题色影响选中框和昵称的背景色
|
|
122
|
+
* @param {string} color - css 颜色值
|
|
123
|
+
*/
|
|
124
|
+
setThemeColor: (color: string) => void;
|
|
125
|
+
/**
|
|
126
|
+
* 切换到指定页面, 调用端需要有页面切换权限
|
|
127
|
+
* @param {string} id - 指定要切换到的页面 id
|
|
128
|
+
*/
|
|
129
|
+
gotoPage: (id: string) => void;
|
|
130
|
+
/**
|
|
131
|
+
* 添加页面, 如果页面已经存在则不做任何修改
|
|
132
|
+
* @param {string} id - 指定要添加到的页面 id
|
|
133
|
+
*/
|
|
134
|
+
addPage: (id: string) => void;
|
|
135
|
+
deletePage: (id: string) => void;
|
|
136
|
+
pageList: () => string[];
|
|
137
|
+
/**
|
|
138
|
+
* 获取当前页面 id
|
|
139
|
+
* @param {string=} userId - 指定要获取对应用户的当前页面 id, 不传 userId 参数则获取自己的当前页面 id
|
|
140
|
+
*/
|
|
141
|
+
currentPageId: (userId?: string) => string;
|
|
142
|
+
/**
|
|
143
|
+
* 复制页面
|
|
144
|
+
* @param {string} sourceId - 指定要复制的页面, string 类型指定 id
|
|
145
|
+
* @param {string} targetId - 指定要复制到的页面, string 类型指定 id
|
|
146
|
+
*/
|
|
147
|
+
clonePage: (sourceId: string, targetId: string) => void;
|
|
148
|
+
/**
|
|
149
|
+
* 清空当前页面
|
|
150
|
+
*/
|
|
151
|
+
clearPage: () => void;
|
|
152
|
+
/**
|
|
153
|
+
* 为 userId 指定的用户设置页面, 调用需要有 `WhiteboardPermissionFlag.setOthersView` 权限,
|
|
154
|
+
* userId 指定的用户的视角模式应为 `free`, 否则调用无效
|
|
155
|
+
*/
|
|
156
|
+
setFreeModelUserPage: (id: string, userId: string) => void;
|
|
157
|
+
indexedNavigation: IndexedNavigation;
|
|
158
|
+
/**
|
|
159
|
+
* 设置视角模式为自由模式, 可以修改自己或者他人视角, 修改他人视角需要 `WhiteboardPermissionFlag.setOthersView` 权限
|
|
160
|
+
* @param {string=} userId 可选, 指定要修改视角的 userId, 默认修改自己的视角
|
|
161
|
+
*/
|
|
162
|
+
setViewModeToFree: (userId?: string) => void;
|
|
163
|
+
/**
|
|
164
|
+
* 设置视角模式为跟随其他用户, 可以修改自己或者他人视角, 修改他人视角需要 `WhiteboardPermissionFlag.setOthersView` 权限
|
|
165
|
+
* @param {string} flowId 指定要跟随的用户 id
|
|
166
|
+
* @param {string=} userId 可选, 指定要修改视角的 userId, 默认修改自己的视角
|
|
167
|
+
*/
|
|
168
|
+
setViewModeToFlow: (flowId: string, userId?: string) => void;
|
|
169
|
+
/**
|
|
170
|
+
* 设置视角模式为跟随白板主视角, 可以修改自己或者他人视角, 修改他人视角需要 `WhiteboardPermissionFlag.setOthersView` 权限
|
|
171
|
+
* @param {string=} userId 可选, 指定要修改视角的 userId, 默认修改自己的视角
|
|
172
|
+
*/
|
|
173
|
+
setViewModeToMain: (userId?: string | undefined) => void;
|
|
174
|
+
/**
|
|
175
|
+
* 获取视角模式
|
|
176
|
+
* @param {string=} userId 可选, 默认获取自己的视角模式
|
|
177
|
+
* @return {'free' | 'main' | string} `free` 表示自由视角, `main` 表示主视角, 其他 string 类型代表跟随视角, string 值为跟随的 userId
|
|
178
|
+
*/
|
|
179
|
+
getViewModel: (userId?: string) => "free" | "main" | string;
|
|
180
|
+
/**
|
|
181
|
+
* 撤销
|
|
182
|
+
*/
|
|
183
|
+
undo: () => void;
|
|
184
|
+
/**
|
|
185
|
+
* 重做
|
|
186
|
+
*/
|
|
187
|
+
redo: () => void;
|
|
188
|
+
/**
|
|
189
|
+
* 光栅化指定页面
|
|
190
|
+
* @param {string | number | undefined} page 指定页码, string 指示页码 id, number 指示 IndexedNavigation 页面索引, undefined 指示光栅化当前页
|
|
191
|
+
* @return {Promise<string>} 异步返回光栅化结果, 图片 png 对应的 base64 url, 如果页面不存在返回 null
|
|
192
|
+
*/
|
|
193
|
+
rasterize: (page: string | number | undefined) => Promise<string | null>;
|
|
194
|
+
/**
|
|
195
|
+
* 设置输入类型, "pen" 仅接受手写笔输入, "any" 接受任意输入, 当首次侦测到手写笔输入时, 将自动切换为 "pen"
|
|
196
|
+
* @param {"pen" | "any"} type 输入类型
|
|
197
|
+
*/
|
|
198
|
+
setInputType: (type: "pen" | "any") => void;
|
|
199
|
+
insertImage: (src: string) => void;
|
|
200
|
+
constructor(view: HTMLDivElement);
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=Whiteboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Whiteboard.d.ts","sourceRoot":"","sources":["../src/Whiteboard.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,EAAC,uBAAuB,EAAC,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAC,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAC7B;;;;;;;OAOG;IACH,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,mBAAmB,EAAE,EAAE,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IAChK;;;OAGG;IACH,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C;;;OAGG;IACH,kBAAkB,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAClD;;;OAGG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC1C;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D;;;;OAIG;IACH,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IACjF;;;OAGG;IACH,eAAe,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC;IAC/C;;;OAGG;IACH,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;;OAGG;IACH,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;OAEG;IACH,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACxD;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;CAChC,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,iBAAiB,CAAC;AAE1D,qBAAa,UAAW,SAAQ,YAAY,CAAC,gBAAgB,CAAE,YAAW,uBAAuB;IAE7F,SAAgB,IAAI,EAAE,cAAc,CAAC;IACrC,SAAgB,UAAU,EAAG,MAAM,CAAC;IAEpC,SAAgB,WAAW,EAAG,qBAAqB,CAAC;IAEpD;;OAEG;IACI,IAAI,EAAG,kBAAkB,CAAC;IACjC;;OAEG;IACI,QAAQ,EAAG,MAAM,CAAC;IACzB;;OAEG;IACI,SAAS,EAAG,MAAM,EAAE,CAAC;IAC5B;;OAEG;IACI,UAAU,EAAG,MAAM,CAAC;IAC3B;;OAEG;IACI,WAAW,EAAG,MAAM,CAAC;IAC5B;;OAEG;IACI,SAAS,EAAG,MAAM,CAAC;IAC1B;;OAEG;IACI,WAAW,EAAG,MAAM,CAAC;IAErB,mBAAmB,EAAG,CAAC,CAAC,SAAS,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,KAAK,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAChI,mBAAmB,EAAG,CAAC,CAAC,SAAS,MAAM,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;IAEhJ,cAAc,EAAG,MAAM,kBAAkB,CAAC;IAC1C,cAAc,EAAG,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAE3D;;;OAGG;IACI,wBAAwB,EAAG,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAE1D;;;OAGG;IACI,aAAa,EAAG,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAE/C;;;OAGG;IACI,QAAQ,EAAG,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC;;;OAGG;IACI,OAAO,EAAG,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,UAAU,EAAG,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAG,MAAM,MAAM,EAAE,CAAC;IAEjC;;;OAGG;IACI,aAAa,EAAG,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACnD;;;;OAIG;IACI,SAAS,EAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE;;OAEG;IACI,SAAS,EAAG,MAAM,IAAI,CAAC;IAE9B;;;OAGG;IACI,oBAAoB,EAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAE5D,iBAAiB,EAAG,iBAAiB,CAAC;IAC7C;;;OAGG;IACI,iBAAiB,EAAG,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD;;;;OAIG;IACI,iBAAiB,EAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE;;;OAGG;IACI,iBAAiB,EAAG,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAEjE;;;;OAIG;IACI,YAAY,EAAG,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAEpE;;OAEG;IACI,IAAI,EAAG,MAAM,IAAI,CAAC;IACzB;;OAEG;IACI,IAAI,EAAG,MAAM,IAAI,CAAC;IAEzB;;;;OAIG;IACI,SAAS,EAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEjF;;;OAGG;IACI,YAAY,EAAG,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC;IAE7C,WAAW,EAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;gBAExB,IAAI,EAAE,cAAc;CAI1C"}
|