@netless/window-manager 1.0.0-canary.9 → 1.0.1

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 (132) hide show
  1. package/LICENSE.txt +21 -0
  2. package/README.md +90 -64
  3. package/README.zh-cn.md +224 -0
  4. package/dist/index.d.ts +1133 -40
  5. package/dist/index.js +62 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/{index.es.js → index.mjs} +7954 -5445
  8. package/dist/index.mjs.map +1 -0
  9. package/dist/style.css +1 -1
  10. package/docs/advanced.md +55 -55
  11. package/docs/api.md +126 -113
  12. package/docs/app-context.md +248 -209
  13. package/docs/basic.md +25 -26
  14. package/docs/camera.md +21 -21
  15. package/docs/cn/advanced.md +137 -0
  16. package/docs/cn/api.md +311 -0
  17. package/docs/cn/app-context.md +369 -0
  18. package/docs/cn/basic.md +64 -0
  19. package/docs/cn/camera.md +53 -0
  20. package/docs/cn/concept.md +9 -0
  21. package/docs/cn/custom-max-bar.md +31 -0
  22. package/docs/cn/develop-app.md +94 -0
  23. package/docs/cn/export-pdf.md +48 -0
  24. package/docs/cn/migrate.md +60 -0
  25. package/docs/cn/replay.md +40 -0
  26. package/docs/concept.md +6 -5
  27. package/docs/custom-max-bar.md +31 -0
  28. package/docs/develop-app.md +22 -19
  29. package/docs/export-pdf.md +48 -0
  30. package/docs/migrate.md +25 -27
  31. package/docs/quickstart.md +50 -0
  32. package/docs/replay.md +20 -20
  33. package/package.json +32 -22
  34. package/src/App/AppContext.ts +105 -73
  35. package/src/App/AppPageStateImpl.ts +6 -25
  36. package/src/App/AppProxy.ts +41 -166
  37. package/src/App/MagixEvent/index.ts +38 -38
  38. package/src/App/Storage/StorageEvent.ts +13 -13
  39. package/src/App/Storage/index.ts +269 -245
  40. package/src/App/Storage/typings.ts +4 -2
  41. package/src/App/Storage/utils.ts +3 -3
  42. package/src/App/index.ts +0 -1
  43. package/src/AppListener.ts +8 -8
  44. package/src/AppManager.ts +88 -77
  45. package/src/AttributesDelegate.ts +42 -22
  46. package/src/BoxEmitter.ts +12 -6
  47. package/src/BoxManager.ts +128 -108
  48. package/src/ContainerResizeObserver.ts +75 -0
  49. package/src/Cursor/Cursor.svelte +16 -5
  50. package/src/Cursor/Cursor.svelte.d.ts +21 -0
  51. package/src/Cursor/Cursor.ts +77 -13
  52. package/src/Cursor/icons.ts +6 -0
  53. package/src/Cursor/icons2.ts +66 -0
  54. package/src/Cursor/index.ts +127 -26
  55. package/src/Helper.ts +94 -14
  56. package/src/InternalEmitter.ts +2 -7
  57. package/src/Page/index.ts +1 -1
  58. package/src/PageState.ts +6 -5
  59. package/src/ReconnectRefresher.ts +9 -4
  60. package/src/RedoUndo.ts +3 -3
  61. package/src/Register/index.ts +22 -17
  62. package/src/Register/loader.ts +26 -22
  63. package/src/Register/storage.ts +13 -13
  64. package/src/Utils/Common.ts +18 -14
  65. package/src/Utils/Reactive.ts +26 -25
  66. package/src/Utils/RoomHacker.ts +4 -4
  67. package/src/Utils/error.ts +0 -1
  68. package/src/View/IframeBridge.ts +680 -0
  69. package/src/View/MainView.ts +127 -53
  70. package/src/callback.ts +21 -1
  71. package/src/constants.ts +0 -2
  72. package/src/image/pencil-eraser-1.svg +3 -0
  73. package/src/image/pencil-eraser-2.svg +3 -0
  74. package/src/image/pencil-eraser-3.svg +3 -0
  75. package/src/index.ts +220 -83
  76. package/src/style.css +27 -10
  77. package/src/typings.ts +20 -10
  78. package/.prettierignore +0 -7
  79. package/.prettierrc.json +0 -9
  80. package/CHANGELOG.md +0 -196
  81. package/__mocks__/white-web-sdk.ts +0 -50
  82. package/dist/App/AppContext.d.ts +0 -76
  83. package/dist/App/AppPageStateImpl.d.ts +0 -21
  84. package/dist/App/AppProxy.d.ts +0 -86
  85. package/dist/App/AppViewSync.d.ts +0 -11
  86. package/dist/App/MagixEvent/index.d.ts +0 -29
  87. package/dist/App/Storage/StorageEvent.d.ts +0 -8
  88. package/dist/App/Storage/index.d.ts +0 -39
  89. package/dist/App/Storage/typings.d.ts +0 -22
  90. package/dist/App/Storage/utils.d.ts +0 -5
  91. package/dist/App/WhiteboardView.d.ts +0 -22
  92. package/dist/App/index.d.ts +0 -3
  93. package/dist/AppListener.d.ts +0 -21
  94. package/dist/AppManager.d.ts +0 -107
  95. package/dist/AttributesDelegate.d.ts +0 -80
  96. package/dist/BoxEmitter.d.ts +0 -34
  97. package/dist/BoxManager.d.ts +0 -99
  98. package/dist/BuiltinApps.d.ts +0 -5
  99. package/dist/Cursor/Cursor.d.ts +0 -39
  100. package/dist/Cursor/icons.d.ts +0 -3
  101. package/dist/Cursor/index.d.ts +0 -46
  102. package/dist/Helper.d.ts +0 -17
  103. package/dist/InternalEmitter.d.ts +0 -39
  104. package/dist/Page/PageController.d.ts +0 -21
  105. package/dist/Page/index.d.ts +0 -3
  106. package/dist/PageState.d.ts +0 -9
  107. package/dist/ReconnectRefresher.d.ts +0 -24
  108. package/dist/RedoUndo.d.ts +0 -18
  109. package/dist/Register/index.d.ts +0 -28
  110. package/dist/Register/loader.d.ts +0 -4
  111. package/dist/Register/storage.d.ts +0 -8
  112. package/dist/Utils/AppCreateQueue.d.ts +0 -15
  113. package/dist/Utils/Common.d.ts +0 -23
  114. package/dist/Utils/Reactive.d.ts +0 -6
  115. package/dist/Utils/RoomHacker.d.ts +0 -3
  116. package/dist/Utils/error.d.ts +0 -27
  117. package/dist/Utils/log.d.ts +0 -1
  118. package/dist/View/CameraSynchronizer.d.ts +0 -16
  119. package/dist/View/MainView.d.ts +0 -47
  120. package/dist/View/ViewManager.d.ts +0 -13
  121. package/dist/callback.d.ts +0 -24
  122. package/dist/constants.d.ts +0 -49
  123. package/dist/index.cjs.js +0 -46
  124. package/dist/index.umd.js +0 -46
  125. package/dist/typings.d.ts +0 -82
  126. package/jest.config.js +0 -27
  127. package/pnpm-lock.yaml +0 -6302
  128. package/src/App/AppViewSync.ts +0 -68
  129. package/src/App/WhiteboardView.ts +0 -83
  130. package/src/View/CameraSynchronizer.ts +0 -56
  131. package/vite.config.js +0 -51
  132. /package/docs/{qickstart.md → cn/quickstart.md} +0 -0
package/docs/camera.md CHANGED
@@ -1,53 +1,53 @@
1
- # 视角
2
- 在多窗口模式下, 可以同时存在多块白板,但是大多数情况下用户都只需要对主白板也就是 `mainView` 进行操作
1
+ # view angle
2
+ In multi-window mode, multiple whiteboards can exist at the same time, but in most cases users only need to operate on the main whiteboard, which is `mainView`
3
3
 
4
4
 
5
- ## 获取 `mainView` `camera`
5
+ ## Get `camera` of `mainView`
6
6
  ```typescript
7
7
  manager.mainView.camera
8
8
  ```
9
9
 
10
- ## 获取 `mainView` `size`
10
+ ## Get `size` of `mainView`
11
11
  ```typescript
12
12
  manager.mainView.size
13
13
  ```
14
14
 
15
- ## 监听 `mainView` `camera` 变化
15
+ ## Monitor `camera` changes in `mainView`
16
16
  ```typescript
17
17
  manager.mainView.callbacks.on("onCameraUpdated", camera => {
18
- // 更新后的 camera
18
+ // updated camera
19
19
  })
20
20
  ```
21
21
 
22
- ## 监听 `mainView` `size` 的变化
22
+ ## Monitor the change of `size` of `mainView`
23
23
  ```typescript
24
24
  manager.mainView.callbacks.on("onSizeUpdated", camera => {
25
- // 更新后的 size
25
+ // updated size
26
26
  })
27
27
  ```
28
28
 
29
- ## 通过 `api` 移动 `camera`
29
+ ## Move `camera` via `api`
30
30
  ```typescript
31
31
  manager.moveCamera(camera)
32
32
  ```
33
33
 
34
- ## 设置视角边界
35
- 把所有人的视角限制在以世界坐标 (0, 0) 为中心,宽为 1024,高为 768 的矩形之中。
34
+ ## Set view bounds
35
+ Limit everyone's viewing angle to a rectangle centered at world coordinates (0, 0) with a width of 1024 and a height of 768.
36
36
  ```typescript
37
37
  manager.setCameraBound({
38
- centerX: 0,
39
- centerY: 0,
40
- width: 1024,
41
- height: 768,
38
+ centerX: 0,
39
+ centerY: 0,
40
+ width: 1024,
41
+ height: 768,
42
42
  })
43
43
  ```
44
44
 
45
- ## 禁止/允许 `mainView` `camera` 的移动,缩放
45
+ ## Prohibit/allow movement and scaling of `mainView` `camera`
46
46
  ```typescript
47
- // 禁止 `camera` 移动,缩放
48
- manager.mainView.disableCameraTransform = false
49
-
50
- // 恢复 `camera` 移动,缩放
47
+ // Prohibit `camera` from moving and zooming
51
48
  manager.mainView.disableCameraTransform = true
52
- ```
53
49
 
50
+ // restore `camera` movement, scaling
51
+ manager.mainView.disableCameraTransform = false
52
+ ```
53
+ **Note** that when this property is `true`, only device operations are prohibited. You can still actively adjust the perspective using the moveCamera method.
@@ -0,0 +1,137 @@
1
+ ## 进阶使用
2
+
3
+ - 目录
4
+ - [撤销重做](#redo-undo)
5
+ - [清屏](#clean-current-scene)
6
+ - [判断是否打开某种 APP](#has-kind)
7
+ - [页面控制器](#page-control)
8
+ - [视角](#view-mode)
9
+ - [插入图片到当前app](#insert-image-to-app)
10
+
11
+
12
+ <h3 id="redo-undo">撤销重做</h3>
13
+
14
+ > 以下事件和属性都会根据 `focus` 的窗口来进行自动切换应用对象
15
+
16
+ #### 获取可以撤销/重做的步数
17
+
18
+ ```ts
19
+ manager.canUndoSteps
20
+ manager.canRedoSteps
21
+ ```
22
+
23
+ #### 监听可以撤销/重做的步数的变化
24
+
25
+ `canRedoStepsChange` 和 `canUndoStepsChange` 会在切换窗口时重新触发
26
+
27
+ ```ts
28
+ manager.emitter.on("canUndoStepsChange", (steps: number) => {
29
+ // 可以撤销的步数更新
30
+ })
31
+ manager.emitter.on("canRedoStepsChange", (steps: number) => {
32
+ // 可以重做的步数更新
33
+ })
34
+ ```
35
+
36
+ #### 撤销/重做
37
+
38
+ ```ts
39
+ manager.undo() //撤销
40
+ manager.redo() // 重做
41
+ ```
42
+
43
+ <br>
44
+
45
+ <h3 id="clean-current-scene">清屏</h3>
46
+
47
+ 因为在多窗口模式下有多个白板, 如果想要清除当前 `focus` 的白板只需要调用
48
+
49
+ ```ts
50
+ manager.cleanCurrentScene()
51
+ ```
52
+
53
+ 只想清理主白板的笔迹则需要
54
+
55
+ ```ts
56
+ manager.mainView.cleanCurrentScene()
57
+ ```
58
+
59
+
60
+ <br>
61
+
62
+ <h3 id="has-kind">判断是否打开某种 APP</h3>
63
+
64
+ ```ts
65
+ manager.emitter.on("ready", () => { // ready 事件在所有 app 创建完成后触发
66
+ const apps = manager.queryAll(); // 获取所有已经打开的 App
67
+ const hasSlide = apps.some(app => app.kind === "Slide"); // 判断已经打开的 APP 中是否有 Slide
68
+ });
69
+ ```
70
+
71
+ <br>
72
+
73
+ <h3 id="page-control">页面控制器</h3>
74
+
75
+ `manager` 提供了一个 `pageState` 来获取当前的 index 和总页数
76
+
77
+ ```ts
78
+ manager.pageState.index // 当前的 index
79
+ manager.pageState.length // 总页数
80
+
81
+ manager.emitter.on("pageStateChange", state => {
82
+ // 当前 index 变化和总页数变化会触发此事件
83
+ });
84
+ ```
85
+
86
+ 上一页/下一页/添加一页
87
+
88
+ ```ts
89
+ manager.nextPage()
90
+ manager.prevPage()
91
+ manager.addPage()
92
+ ```
93
+
94
+ <br>
95
+
96
+ <h3 id="view-mode">视角跟随</h3>
97
+
98
+ 多窗口中 `ViewMode` 有 `broadcaster` `freedom` 两种模式
99
+
100
+ - `freedom`
101
+
102
+ 自由模式,用户可以自由放缩、移动视角
103
+
104
+ 即便房间里有主播,主播也无法影响用户的视角
105
+
106
+ - `broadcaster`
107
+
108
+ 主播模式, 操作时其他人的视角都会跟随我
109
+
110
+ 同时其他为 `broadcaster` 模式的人也会影响我的视角
111
+
112
+ 在 `isWritable` 为 `false` 时只会跟随其他 `broadcaster` 的视角
113
+
114
+ <br>
115
+
116
+ <h3 id="insert-image-to-app">插入图片到当前 app</h3>
117
+
118
+ ```ts
119
+ // 判断当前是否为最大化
120
+ if (manager.boxState === "maximized") {
121
+ // `focused` 的值的会根据当前 focus 的 app 不同而变化
122
+ const app = manager.queryOne(manager.focused)
123
+ // 有 view 的 app 才可以插入图片, 像是 视频,音频之类的 app 是没有 view 的
124
+ if (app.view) {
125
+ var imageInformation = {
126
+ uuid: uuid,
127
+ centerX: centerX,
128
+ centerY: centerY,
129
+ width: width,
130
+ height: height,
131
+ locked: false,
132
+ };
133
+ app.view.insertImage(imageInformation);
134
+ app.view.completeImageUpload(uuid, src);
135
+ }
136
+ }
137
+ ```
package/docs/cn/api.md ADDED
@@ -0,0 +1,311 @@
1
+ # API
2
+
3
+ ## 目录
4
+ - [静态方法](#static-methods)
5
+ - [`mount`](#mount)
6
+ - [`register`](#register)
7
+ - [`registered`](#registered)
8
+ - [`setContainer`](#set-container)
9
+ - [`setCollectorContainer`](#set-collector-container)
10
+ - [实例方法](#instance-methods)
11
+ - [`addApp`](#addApp)
12
+ - [`closeApp`](#closeApp)
13
+ - [`focusApp`](#focusApp)
14
+ - [`setMainViewSceneIndex`](#setMainViewSceneIndex)
15
+ - [`setBoxState`](#setBoxState)
16
+ - [`cleanCurrentScene`](#cleanCurrentScene)
17
+ - [`redo`](#redo)
18
+ - [`undo`](#undo)
19
+ - [`copy`](#copy)
20
+ - [`paste`](#paste)
21
+ - [`delete`](#delete)
22
+ - [`duplicate`](#duplicate)
23
+ - [`insertText`](#insertText)
24
+ - [`insertImage`](#insertImage)
25
+ - [`completeImageUpload`](#completeImageUpload)
26
+ - [`lockImage`](#lockImage)
27
+ - [`lockImages`](#lockImages)
28
+ - [`nextPage`](#nextPage)
29
+ - [`prevPage`](#prevPage)
30
+ - [`addPage`](#addPage)
31
+ - [`removePage`](#removePage)
32
+ - [`refresh`](#refresh)
33
+ - [`setContainerSizeRatio`](#setContainerSizeRatio)
34
+ - [实例属性](#prototypes)
35
+ - [事件回调](#events)
36
+
37
+ <br>
38
+
39
+ <h2 id="static-methods">静态方法</h2>
40
+
41
+ <h3 id="mount">WindowManager.mount</h3>
42
+
43
+ > 挂载 WindowManager
44
+
45
+ ```typescript
46
+ const manager = await WindowManager.mount(
47
+ room: room,
48
+ container: document.getElementById("container")
49
+ // 完整配置见下方
50
+ );
51
+ ```
52
+
53
+ 参数
54
+
55
+ | name | type | default | desc |
56
+ | ---------------------- | --------------------------------------- | ------- | ---------------------------- |
57
+ | room | [require] Room | | 房间实例 |
58
+ | container | [require] HTMLElement | | 房间挂载容器 |
59
+ | containerSizeRatio | [optional] number | 9 / 16 | 多窗口区域的高宽比,默认为 9 : 16 |
60
+ | chessboard | [optional] boolean | true | 多窗口区域以外的空间显示 PS 棋盘背景,默认 true |
61
+ | collectorContainer | [optional] HTMLElement | | 用于多窗口最小化图标挂载的 dom |
62
+ | collectorStyles | [optional] Partial{CSSStyleDeclaration} | | 配置 collector 的样式 |
63
+ | overwriteStyles | [optional] string | | 用于覆盖窗口的样式 |
64
+ | cursor | [optional] boolean | false | 开启光标同步 |
65
+ | disableCameraTransform | [optional] boolean | | 禁用主白板的相机移动 |
66
+ | prefersColorScheme | [optional] string | light | auto, light, dark |
67
+ | debug | [optional] boolean | false | 打印日志信息
68
+ | applianceIcons | [optional] {ApplianceNames, string} | | 配置光标使用的教具图片 |
69
+
70
+ <h3 id="register">WindowManager.register</h3>
71
+
72
+ > 注册 `APP` 到 `WindowManager`
73
+
74
+ ```typescript
75
+ WindowManager.register({
76
+ kind: "helloWorld",
77
+ src: NetlessApp,
78
+ appOptions: () => "appOptions",
79
+ addHooks: (emitter) => {
80
+ emitter.on("created", result => {
81
+ console.log("HelloWordResult", result);
82
+ });
83
+ emitter.on("focus", result => {
84
+ console.log("HelloWorld focus", result);
85
+ })
86
+ emitter.on("destroy", result => {
87
+ console.log("HelloWorld destroy", result);
88
+ })
89
+ }
90
+ })
91
+ ```
92
+
93
+ <br>
94
+
95
+ <h3 id="registered">WindowManager.registered</h3>
96
+
97
+ > 获取已经注册过的 `App`
98
+
99
+ ```ts
100
+ WindowManager.registered
101
+ ```
102
+
103
+ <br>
104
+
105
+ <h3 id="set-container">setContainer</h3>
106
+
107
+ > 设置白板挂载容器
108
+
109
+ ```typescript
110
+ WindowManager.setContainer(document.getElementById("container"));
111
+ ```
112
+
113
+ <h3 id="set-container">setCollectorContainer</h3>
114
+
115
+ > 设置 `Collector` 挂载的容器
116
+
117
+ ```typescript
118
+ WindowManager.setCollectorContainer(document.getElementById("collector-container"));
119
+ ```
120
+
121
+ <br>
122
+
123
+ <h2 id="instance-methods">实例方法</h2>
124
+
125
+ <h3 id="addApp">addApp</h3>
126
+
127
+ > 添加 `app` 至白板
128
+
129
+ ```typescript
130
+ const appId = await manager.addApp({
131
+ kind: "helloWorld"
132
+ options: { // 可选配置
133
+ scenePath: "/hello-world"
134
+ }
135
+ })
136
+ ```
137
+ 具体参数请参考 `APP` 本身的要求
138
+
139
+ <h3 id="closeApp">closeApp</h3>
140
+
141
+ > 关闭已经打开的 `APP`
142
+
143
+ ```typescript
144
+ manager.closeApp(appId)
145
+ ```
146
+
147
+ <h3 id="focusApp">focusApp</h3>
148
+
149
+ > 切换当前 `focus` 的 `app`, 并把此 `app` 置为最前
150
+
151
+ ```typescript
152
+ manager.focusApp(appId)
153
+ ```
154
+
155
+ <h3 id="setMainViewSceneIndex">setMainViewSceneIndex</h3>
156
+
157
+ > 设置主白板的 `SceneIndex`
158
+
159
+ ```ts
160
+ manager.setMainViewSceneIndex(1)
161
+ ```
162
+
163
+ <h3 id="setBoxState">setBoxState</h3>
164
+
165
+ > 设置当前的 `boxState`
166
+
167
+ ```ts
168
+ manager.setBoxState("normal") // boxState: normal | maximized | minimized
169
+ ```
170
+
171
+ <h3 id="cleanCurrentScene">cleanCurrentScene</h3>
172
+
173
+ > 清除当前 focus 的 view 的笔迹
174
+
175
+ ```ts
176
+ manager.cleanCurrentScene()
177
+ ```
178
+
179
+ <h3 id="redo">redo</h3>
180
+
181
+ > 在当前 focus 的 view 上重做上一步操作
182
+
183
+ ```ts
184
+ manager.redo()
185
+ ```
186
+
187
+ <h3 id="undo">undo</h3>
188
+
189
+ > 在当前 focus 的 view 上撤消上一步操作
190
+
191
+ ```ts
192
+ manager.undo()
193
+ ```
194
+
195
+ <h3 id="nextPage">nextPage</h3>
196
+
197
+ > 切换主白板至下一页
198
+
199
+ ```ts
200
+ const success = await manager.nextPage()
201
+ if (!success) {
202
+ // 已经到了最后一页
203
+ }
204
+ ```
205
+
206
+ <h3 id="prevPage">prevPage</h3>
207
+
208
+ > 切换主白板至上一页
209
+
210
+ ```ts
211
+ const success = await manager.prevPage()
212
+ if (!success) {
213
+ // 已经到了第一页
214
+ }
215
+ ```
216
+
217
+ <h3 id="addPage">addPage</h3>
218
+
219
+ > 在主白板添加一页
220
+
221
+ ```ts
222
+ manager.addPage() // 默认在最后添加一页
223
+ manager.addPage({ after: true }) // 在当前页后添加一页
224
+ manager.addPage({ scene: { name: "page2" } }) // 传入 page 信息
225
+ ```
226
+
227
+ <h3 id="removePage">removePage</h3>
228
+
229
+ > 移除一页
230
+ > 当只剩一页时, 最后一页不允许被删除
231
+
232
+ ```ts
233
+ const success = await manager.removePage() // 默认删除当前页
234
+ const success = await manager.removePage(1) // 可以删除指定 index
235
+ ```
236
+
237
+ <h3 id="refresh">refresh</h3>
238
+
239
+ > 刷新 `manager` 的内部状态, 用于从其他房间 `copy` `attributes`
240
+
241
+ ```ts
242
+ manager.refresh()
243
+ ```
244
+
245
+ <h3 id="setContainerSizeRatio">setContainerSizeRatio</h3>
246
+
247
+ > 设置白板同步区域的宽高比
248
+
249
+ ```ts
250
+ manager.setContainerSizeRatio(10 / 16)
251
+ ```
252
+
253
+ <br>
254
+
255
+ <h2 id="prototypes">实例属性</h2>
256
+
257
+ | name | type | default | desc |
258
+ | ------------------ | ------- | ------- | ----------------- |
259
+ | mainView | View | | 主白板 |
260
+ | mainViewSceneIndex | number | | 当前主白板的 SceneIndex |
261
+ | mainViewScenesLength | number | | mainView 的 scenes 长度 |
262
+ | boxState | string | | 当前窗口状态 |
263
+ | darkMode | boolean | | 黑夜模式 |
264
+ | prefersColorScheme | string | | 颜色主题 |
265
+ | focused | string | | focus 的 app |
266
+ | canRedoSteps | number | | 当前 focus 的 view 可以重做的步数 |
267
+ | canRedoSteps | number | | 当前 focus 的 view 可以撤销的步数 |
268
+ | sceneState | SceneState | | 兼容原本 SDK 的 sceneState 属性, 只对 mainView 生效 |
269
+ | pageState | PageState | | 组合 mainView 的 index 和 scenes 的修改 |
270
+
271
+ <br>
272
+
273
+ <h2 id="events">事件回调</h2>
274
+
275
+ ```typescript
276
+ manager.emitter.on(events, listener)
277
+ ```
278
+
279
+ | name | type | default | desc |
280
+ | ------------------------ | -------------- | ------- | -------------------------- |
281
+ | mainViewModeChange | ViewVisionMode | | |
282
+ | mainViewSceneIndexChange | index: number | | |
283
+ | boxStateChange | string | | normal,minimized,maximized |
284
+ | darkModeChange | boolean | | |
285
+ | prefersColorSchemeChange | string | | auto,light,dark |
286
+ | cameraStateChange | CameraState | | |
287
+ | focusedChange | string, undefined | | 当前 focus 的 appId,主白板时为 undefined |
288
+ | mainViewScenesLengthChange | number | | mainView scenes 添加或删除时触发 |
289
+ | canRedoStepsChange | number | | 当前 focus 的 view 可重做步数改变 |
290
+ | canUndoStepsChange | number | | 当前 focus 的 view 可撤销步数改变 |
291
+ | loadApp | LoadAppEvent | | 加载远程APP 事件 |
292
+ | ready | undefined | | 当所有 APP 创建完毕时触发 |
293
+ | sceneStateChange | SceneState | | 当 sceneState 修改时触发 |
294
+ | pageStateChange | PageState | | |
295
+ | fullscreenChange | boolean | | 当全屏状态改变时触发 |
296
+ | appsChange | string[] | | 被打开的app列表改变时触发 |
297
+
298
+ ```ts
299
+ type LoadAppEvent = {
300
+ kind: string;
301
+ status: "start" | "success" | "failed";
302
+ reason?: string;
303
+ }
304
+ ```
305
+
306
+ ```ts
307
+ type PageState = {
308
+ index: number;
309
+ length: number;
310
+ }
311
+ ```