@netless/forge-whiteboard 0.1.15 → 0.1.16

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 (34) hide show
  1. package/changelog.md +6 -1
  2. package/dist/Camera.d.ts.map +1 -1
  3. package/dist/IndexedNavigation.d.ts +1 -0
  4. package/dist/IndexedNavigation.d.ts.map +1 -1
  5. package/dist/WhitePermissions.d.ts +3 -43
  6. package/dist/WhitePermissions.d.ts.map +1 -1
  7. package/dist/Whiteboard.d.ts +14 -2
  8. package/dist/Whiteboard.d.ts.map +1 -1
  9. package/dist/WhiteboardApplication.d.ts +1 -0
  10. package/dist/WhiteboardApplication.d.ts.map +1 -1
  11. package/dist/model/PageModel.d.ts.map +1 -1
  12. package/dist/model/RenderableModel.d.ts +4 -2
  13. package/dist/model/RenderableModel.d.ts.map +1 -1
  14. package/dist/model/SelectElementsModel.d.ts +1 -1
  15. package/dist/model/SelectElementsModel.d.ts.map +1 -1
  16. package/dist/model/ToolbarModel.d.ts.map +1 -1
  17. package/dist/model/TrashedElementsModel.d.ts +1 -1
  18. package/dist/model/TrashedElementsModel.d.ts.map +1 -1
  19. package/dist/model/renderable/CurveModel.d.ts +3 -1
  20. package/dist/model/renderable/CurveModel.d.ts.map +1 -1
  21. package/dist/model/renderable/CurveModel_old.d.ts +28 -0
  22. package/dist/model/renderable/CurveModel_old.d.ts.map +1 -0
  23. package/dist/model/renderable/ElementModel.d.ts.map +1 -1
  24. package/dist/model/renderable/ImageModel.d.ts +20 -0
  25. package/dist/model/renderable/ImageModel.d.ts.map +1 -0
  26. package/dist/model/renderable/PointTextModel.d.ts.map +1 -1
  27. package/dist/tool/CurveTool.d.ts.map +1 -1
  28. package/dist/utils/FPS.d.ts +15 -0
  29. package/dist/utils/FPS.d.ts.map +1 -0
  30. package/dist/whiteboard.esm.js +270 -218
  31. package/dist/whiteboard.esm.js.map +4 -4
  32. package/dist/whiteboard.js +271 -219
  33. package/dist/whiteboard.js.map +4 -4
  34. package/package.json +2 -2
@@ -25362,13 +25362,14 @@ var require_lodash = __commonJS({
25362
25362
 
25363
25363
  // src/WhiteboardApplication.ts
25364
25364
  var import_paper = __toESM(require_paper_full(), 1);
25365
- import { AbstractApplication, log as log3 } from "@netless/forge-room";
25365
+ import { AbstractApplication, log as log4 } from "@netless/forge-room";
25366
25366
  import * as Y15 from "yjs";
25367
25367
 
25368
25368
  // src/model/RenderableModel.ts
25369
25369
  import * as Y12 from "yjs";
25370
- import EventEmitter2 from "eventemitter3";
25370
+ import EventEmitter from "eventemitter3";
25371
25371
  import { v4 as uuidv4 } from "uuid";
25372
+ import { log, removeObserver as removeObserver2 } from "@netless/forge-room";
25372
25373
 
25373
25374
  // src/model/renderable/CurveModel.ts
25374
25375
  import * as Y2 from "yjs";
@@ -25526,6 +25527,7 @@ var import_lodash = __toESM(require_lodash(), 1);
25526
25527
 
25527
25528
  // src/model/renderable/ElementModel.ts
25528
25529
  import * as Y from "yjs";
25530
+ import { removeDeepObserver } from "@netless/forge-room";
25529
25531
  function _defineProperty(e, r, t) {
25530
25532
  return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
25531
25533
  }
@@ -25710,7 +25712,7 @@ var ElementModel = class _ElementModel {
25710
25712
  }
25711
25713
  dispose() {
25712
25714
  this.subDispose();
25713
- this.root.unobserveDeep(this.handlePropChange);
25715
+ removeDeepObserver(this.root, this.handlePropChange);
25714
25716
  }
25715
25717
  };
25716
25718
  _defineProperty(ElementModel, "KEYS", {
@@ -25785,12 +25787,15 @@ var CurveModel = class extends ElementModel {
25785
25787
  constructor(root, scope) {
25786
25788
  super(root, scope);
25787
25789
  _defineProperty3(this, "item", null);
25790
+ _defineProperty3(this, "debugPath", void 0);
25791
+ _defineProperty3(this, "debug", false);
25788
25792
  if (!this.root.has("type")) {
25789
25793
  this.root.set("type", "curve");
25790
25794
  }
25791
25795
  if (!this.root.has("points")) {
25792
25796
  this.root.set("points", new Y2.Array());
25793
25797
  }
25798
+ this.debugPath = new scope.Path();
25794
25799
  }
25795
25800
  average(a2, b2) {
25796
25801
  return (a2 + b2) / 2;
@@ -25799,23 +25804,23 @@ var CurveModel = class extends ElementModel {
25799
25804
  const groupPoints = (0, import_lodash.chunk)(points, 2);
25800
25805
  return ae(groupPoints, {
25801
25806
  size: this.strokeWidth,
25802
- smoothing: 0,
25803
- thinning: 0.5,
25807
+ smoothing: 0.5,
25808
+ thinning: -0.5,
25804
25809
  streamline: 0.5,
25805
25810
  simulatePressure: true,
25806
25811
  start: {
25807
- taper: 10,
25812
+ taper: this.strokeWidth * 10,
25808
25813
  cap: true
25809
25814
  },
25810
25815
  end: {
25811
- taper: 10,
25816
+ taper: this.strokeWidth * 20,
25812
25817
  cap: true
25813
25818
  }
25814
25819
  });
25815
25820
  }
25816
25821
  matrixedPoints() {
25817
- const groupPoints = (0, import_lodash.chunk)(this.points, 2);
25818
- return groupPoints.map((_ref) => {
25822
+ const currentPoints = (0, import_lodash.chunk)(this.points, 2);
25823
+ return currentPoints.map((_ref) => {
25819
25824
  let [x, y] = _ref;
25820
25825
  return new this.scope.Point(x, y);
25821
25826
  }).map((p) => p.transform(new this.scope.Matrix(this.pointsMatrix))).reduce((result, next) => {
@@ -25849,27 +25854,41 @@ var CurveModel = class extends ElementModel {
25849
25854
  }
25850
25855
  return path;
25851
25856
  }
25852
- getNextSegments() {
25853
- const points = this.parsePoints(this.matrixedPoints());
25854
- const path = this.createPath(points);
25855
- return path.segments;
25857
+ updateDebugPath() {
25858
+ this.debugPath = new this.scope.Path();
25859
+ const points = (0, import_lodash.chunk)(this.points, 2);
25860
+ for (let i = 0, len = points.length; i < len; i++) {
25861
+ const point = new this.scope.Point(points[i][0], points[i][1]);
25862
+ if (i === 0) {
25863
+ this.debugPath.moveTo(point);
25864
+ } else {
25865
+ this.debugPath.lineTo(point);
25866
+ }
25867
+ this.debugPath.strokeWidth = 1;
25868
+ this.debugPath.strokeColor = new this.scope.Color(1, 0, 0, 1);
25869
+ }
25856
25870
  }
25857
25871
  onVectorUpdate() {
25858
25872
  if (!this.item) {
25859
25873
  return;
25860
25874
  }
25875
+ if (this.debug) {
25876
+ this.debugPath.remove();
25877
+ this.updateDebugPath();
25878
+ }
25879
+ const points = this.parsePoints(this.matrixedPoints());
25880
+ const path = this.createPath(points);
25861
25881
  this.item.removeSegments();
25862
- this.item.addSegments(this.getNextSegments());
25863
- this.item.simplify(2.5);
25882
+ this.item.addSegments(path.segments);
25883
+ if (this.debug) {
25884
+ this.item.addChild(this.debugPath);
25885
+ }
25864
25886
  }
25865
25887
  createPaperItem() {
25866
25888
  this.item = new this.scope.Path();
25867
- this.item.strokeCap = "round";
25868
- this.item.strokeJoin = "round";
25869
- this.item.strokeScaling = false;
25870
25889
  this.item.strokeColor = new this.scope.Color(this.strokeColor);
25871
25890
  this.item.fillColor = new this.scope.Color(this.strokeColor);
25872
- this.item.addSegments(this.getNextSegments());
25891
+ this.onVectorUpdate();
25873
25892
  }
25874
25893
  editorConfig() {
25875
25894
  return new EditorConfig();
@@ -25879,8 +25898,8 @@ var CurveModel = class extends ElementModel {
25879
25898
  }
25880
25899
  styleKeys() {
25881
25900
  return {
25882
- include: ["strokeColor"],
25883
- exclude: ["fillColor", "dashArray"]
25901
+ include: ["strokeColor", "strokeWidth"],
25902
+ exclude: ["dashArray", "fillColor"]
25884
25903
  };
25885
25904
  }
25886
25905
  onStyleKeyUpdate(key) {
@@ -25890,6 +25909,8 @@ var CurveModel = class extends ElementModel {
25890
25909
  if (key === "strokeColor") {
25891
25910
  this.item.strokeColor = new this.scope.Color(this.strokeColor);
25892
25911
  this.item.fillColor = new this.scope.Color(this.strokeColor);
25912
+ } else if (key === "strokeWidth") {
25913
+ this.onVectorUpdate();
25893
25914
  }
25894
25915
  }
25895
25916
  subDispose() {
@@ -26419,6 +26440,7 @@ var LineControlPoint = class {
26419
26440
 
26420
26441
  // src/model/renderable/PointTextModel.ts
26421
26442
  import * as Y6 from "yjs";
26443
+ import { removeObserver } from "@netless/forge-room";
26422
26444
  function _defineProperty10(e, r, t) {
26423
26445
  return (r = _toPropertyKey10(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
26424
26446
  }
@@ -26488,7 +26510,7 @@ var PointTextModel = class extends ElementModel {
26488
26510
  }
26489
26511
  }
26490
26512
  subDispose() {
26491
- this.root.unobserve(this.handleTextPropChange);
26513
+ removeObserver(this.root, this.handleTextPropChange);
26492
26514
  }
26493
26515
  getInternalMeasurement() {
26494
26516
  if (!this.item) {
@@ -27135,24 +27157,7 @@ var LaserPointerModel = class extends ElementModel {
27135
27157
  };
27136
27158
 
27137
27159
  // src/WhitePermissions.ts
27138
- import EventEmitter from "eventemitter3";
27139
- function _defineProperty15(e, r, t) {
27140
- return (r = _toPropertyKey15(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
27141
- }
27142
- function _toPropertyKey15(t) {
27143
- var i = _toPrimitive15(t, "string");
27144
- return "symbol" == typeof i ? i : i + "";
27145
- }
27146
- function _toPrimitive15(t, r) {
27147
- if ("object" != typeof t || !t) return t;
27148
- var e = t[Symbol.toPrimitive];
27149
- if (void 0 !== e) {
27150
- var i = e.call(t, r || "default");
27151
- if ("object" != typeof i) return i;
27152
- throw new TypeError("@@toPrimitive must return a primitive value.");
27153
- }
27154
- return ("string" === r ? String : Number)(t);
27155
- }
27160
+ import { AbstractApplicationPermissions } from "@netless/forge-room";
27156
27161
  var WhiteboardPermissionFlag = function(WhiteboardPermissionFlag2) {
27157
27162
  WhiteboardPermissionFlag2[WhiteboardPermissionFlag2["none"] = 0] = "none";
27158
27163
  WhiteboardPermissionFlag2[WhiteboardPermissionFlag2["draw"] = 1] = "draw";
@@ -27165,59 +27170,7 @@ var WhiteboardPermissionFlag = function(WhiteboardPermissionFlag2) {
27165
27170
  WhiteboardPermissionFlag2[WhiteboardPermissionFlag2["all"] = WhiteboardPermissionFlag2.draw | WhiteboardPermissionFlag2.editSelf | WhiteboardPermissionFlag2.editOthers | WhiteboardPermissionFlag2.deleteSelf | WhiteboardPermissionFlag2.deleteOthers | WhiteboardPermissionFlag2.mainView | WhiteboardPermissionFlag2.setOthersView] = "all";
27166
27171
  return WhiteboardPermissionFlag2;
27167
27172
  }({});
27168
- var WhiteboardPermissions = class extends EventEmitter {
27169
- constructor(userManager, requestUserMap) {
27170
- super();
27171
- _defineProperty15(this, "requestUserMap", void 0);
27172
- _defineProperty15(this, "userManager", void 0);
27173
- _defineProperty15(this, "observers", /* @__PURE__ */ new Map());
27174
- _defineProperty15(this, "handleUserLeave", (user) => {
27175
- const cb = this.observers.get(user.id);
27176
- if (cb) {
27177
- this.requestUserMap(user.id).unobserve(cb);
27178
- }
27179
- });
27180
- _defineProperty15(this, "handleUserJoin", (user) => {
27181
- this.addObserve(user.id);
27182
- });
27183
- this.userManager = userManager;
27184
- this.requestUserMap = requestUserMap;
27185
- this.createModel(this.userManager.selfId);
27186
- this.userManager.userIdList().forEach((userId) => {
27187
- this.addObserve(userId);
27188
- });
27189
- this.userManager.on("join", this.handleUserJoin);
27190
- this.userManager.on("leave", this.handleUserLeave);
27191
- }
27192
- addObserve(userId) {
27193
- if (this.observers.has(userId)) {
27194
- return;
27195
- }
27196
- const observer = (evt) => {
27197
- this.handleUserPermissionChange(userId, evt);
27198
- };
27199
- if (this.observers.has(userId)) {
27200
- this.requestUserMap(userId).unobserve(this.observers.get(userId));
27201
- }
27202
- this.observers.set(userId, observer);
27203
- this.requestUserMap(userId).observe(observer);
27204
- }
27205
- createModel(userId) {
27206
- const userMap = this.requestUserMap(userId);
27207
- if (!userMap.has("permission")) {
27208
- userMap.set("permission", 0);
27209
- }
27210
- }
27211
- handleUserPermissionChange(userId, evt) {
27212
- for (const [key, value] of evt.changes.keys.entries()) {
27213
- if (key === "permission") {
27214
- if (value.action === "add" || value.action === "update") {
27215
- const newValue = this.requestUserMap(userId).get("permission");
27216
- this.emit("change", userId, this.resolveFlags(newValue), newValue);
27217
- }
27218
- }
27219
- }
27220
- }
27173
+ var WhiteboardPermissions = class extends AbstractApplicationPermissions {
27221
27174
  /**
27222
27175
  * 解析权限列表组合
27223
27176
  * @param {number} value - 权限数字值
@@ -27226,70 +27179,19 @@ var WhiteboardPermissions = class extends EventEmitter {
27226
27179
  resolveFlags(value) {
27227
27180
  return [WhiteboardPermissionFlag.draw, WhiteboardPermissionFlag.editSelf, WhiteboardPermissionFlag.editOthers, WhiteboardPermissionFlag.deleteSelf, WhiteboardPermissionFlag.deleteOthers, WhiteboardPermissionFlag.mainView, WhiteboardPermissionFlag.setOthersView].filter((v) => (v & value) !== 0);
27228
27181
  }
27229
- /**
27230
- * 获取权限列表组合对应的数值
27231
- * @param { string } userId 不传表示获取自己
27232
- */
27233
- getPermissionValue(userId) {
27234
- return this.requestUserMap(userId ?? this.userManager.selfId).get("permission") ?? 0;
27235
- }
27236
- /**
27237
- * 获取权限列表
27238
- * @param {string=} userId 可选, 不传表示获取自己
27239
- */
27240
- getPermissionFlags(userId) {
27241
- const value = this.requestUserMap(userId ?? this.userManager.selfId).get("permission") ?? 0;
27242
- return this.resolveFlags(value);
27243
- }
27244
- /**
27245
- * 返回对应 userId 是否有相应权限
27246
- * @param {string=} userId 可选, 不传表示返回自己是否有相应权限
27247
- * @param {WhiteboardPermissionFlag} flag
27248
- */
27249
- hasPermission(flag, userId) {
27250
- return ((this.requestUserMap(userId ?? this.userManager.selfId).get("permission") ?? 0) & flag) !== 0;
27251
- }
27252
- /**
27253
- * 添加权限
27254
- * @param {WhiteboardPermissionFlag} flag 权限标记
27255
- * @param {string=} userId 可选, 为 userId 添加权限, 不传表示为自己添加权限
27256
- */
27257
- addPermission(flag, userId) {
27258
- const userMap = this.requestUserMap(userId ?? this.userManager.selfId);
27259
- const oldValue = userMap.get("permission") ?? 0;
27260
- this.requestUserMap(userId ?? this.userManager.selfId).set("permission", oldValue | flag);
27261
- }
27262
- /**
27263
- * 移除权限
27264
- * @param {WhiteboardPermissionFlag} flag 权限标记
27265
- * @param {string=} userId 可选, 为 userId 移除权限, 不传表示为自己移除权限
27266
- */
27267
- removePermission(flag, userId) {
27268
- const userMap = this.requestUserMap(userId ?? this.userManager.selfId);
27269
- const oldValue = userMap.get("permission") ?? 0;
27270
- this.requestUserMap(userId ?? this.userManager.selfId).set("permission", oldValue & ~flag);
27271
- }
27272
- dispose() {
27273
- this.userManager.off("join", this.handleUserJoin);
27274
- this.userManager.off("leave", this.handleUserLeave);
27275
- this.observers.forEach((cb, userId) => {
27276
- this.requestUserMap(userId).unobserve(cb);
27277
- });
27278
- this.observers.clear();
27279
- }
27280
27182
  };
27281
27183
 
27282
27184
  // src/model/renderable/StraightLineModel.ts
27283
27185
  var import_lodash7 = __toESM(require_lodash(), 1);
27284
27186
  import * as Y11 from "yjs";
27285
- function _defineProperty16(e, r, t) {
27286
- return (r = _toPropertyKey16(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
27187
+ function _defineProperty15(e, r, t) {
27188
+ return (r = _toPropertyKey15(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
27287
27189
  }
27288
- function _toPropertyKey16(t) {
27289
- var i = _toPrimitive16(t, "string");
27190
+ function _toPropertyKey15(t) {
27191
+ var i = _toPrimitive15(t, "string");
27290
27192
  return "symbol" == typeof i ? i : i + "";
27291
27193
  }
27292
- function _toPrimitive16(t, r) {
27194
+ function _toPrimitive15(t, r) {
27293
27195
  if ("object" != typeof t || !t) return t;
27294
27196
  var e = t[Symbol.toPrimitive];
27295
27197
  if (void 0 !== e) {
@@ -27302,7 +27204,7 @@ function _toPrimitive16(t, r) {
27302
27204
  var StraightLineModel = class extends ElementModel {
27303
27205
  constructor(root, scope) {
27304
27206
  super(root, scope);
27305
- _defineProperty16(this, "item", null);
27207
+ _defineProperty15(this, "item", null);
27306
27208
  if (!this.root.has("type")) {
27307
27209
  this.root.set("type", "line");
27308
27210
  }
@@ -27395,6 +27297,83 @@ var StraightLineModel = class extends ElementModel {
27395
27297
  }
27396
27298
  };
27397
27299
 
27300
+ // src/model/renderable/ImageModel.ts
27301
+ function _defineProperty16(e, r, t) {
27302
+ return (r = _toPropertyKey16(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
27303
+ }
27304
+ function _toPropertyKey16(t) {
27305
+ var i = _toPrimitive16(t, "string");
27306
+ return "symbol" == typeof i ? i : i + "";
27307
+ }
27308
+ function _toPrimitive16(t, r) {
27309
+ if ("object" != typeof t || !t) return t;
27310
+ var e = t[Symbol.toPrimitive];
27311
+ if (void 0 !== e) {
27312
+ var i = e.call(t, r || "default");
27313
+ if ("object" != typeof i) return i;
27314
+ throw new TypeError("@@toPrimitive must return a primitive value.");
27315
+ }
27316
+ return ("string" === r ? String : Number)(t);
27317
+ }
27318
+ var ImageModel = class extends ElementModel {
27319
+ get src() {
27320
+ return this.root.get("src");
27321
+ }
27322
+ constructor(root, scope, imageSets) {
27323
+ super(root, scope);
27324
+ _defineProperty16(this, "item", null);
27325
+ _defineProperty16(this, "imageSets", void 0);
27326
+ this.imageSets = imageSets;
27327
+ if (!this.root.has("type")) {
27328
+ this.root.set("type", "image");
27329
+ }
27330
+ this.root.set(ElementModel.KEYS.shadow, "");
27331
+ }
27332
+ subDispose() {
27333
+ const img = this.imageSets.querySelector(`[id='${this.uuid}']`);
27334
+ if (img) {
27335
+ img.remove();
27336
+ }
27337
+ }
27338
+ createPaperItem() {
27339
+ if (this.item) {
27340
+ return;
27341
+ }
27342
+ if (!this.imageSets.querySelector(`[id='${this.uuid}']`)) {
27343
+ const img = document.createElement("img");
27344
+ img.src = this.src;
27345
+ img.id = this.uuid;
27346
+ this.imageSets.appendChild(img);
27347
+ }
27348
+ this.item = new this.scope.Raster(this.uuid);
27349
+ const matrix = new this.scope.Matrix(this.pointsMatrix);
27350
+ this.item.matrix = matrix;
27351
+ }
27352
+ onVectorUpdate() {
27353
+ const matrix = new this.scope.Matrix(this.pointsMatrix);
27354
+ if (this.item) {
27355
+ this.item.matrix = matrix;
27356
+ }
27357
+ }
27358
+ vectorKeys() {
27359
+ return [];
27360
+ }
27361
+ styleKeys() {
27362
+ return {
27363
+ include: [],
27364
+ exclude: ["dashArray", "strokeColor", "fillColor", "strokeWidth"]
27365
+ };
27366
+ }
27367
+ onStyleKeyUpdate(_key) {
27368
+ }
27369
+ editorConfig() {
27370
+ const cfg = new EditorConfig();
27371
+ cfg.resizeModel = () => "four-corner";
27372
+ cfg.uniformScale = () => true;
27373
+ return cfg;
27374
+ }
27375
+ };
27376
+
27398
27377
  // src/model/RenderableModel.ts
27399
27378
  function _defineProperty17(e, r, t) {
27400
27379
  return (r = _toPropertyKey17(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
@@ -27413,11 +27392,11 @@ function _toPrimitive17(t, r) {
27413
27392
  }
27414
27393
  return ("string" === r ? String : Number)(t);
27415
27394
  }
27416
- var RenderableModel = class extends EventEmitter2 {
27395
+ var RenderableModel = class extends EventEmitter {
27417
27396
  get uuid() {
27418
- return uuidv4();
27397
+ return uuidv4().replace(/-/g, "");
27419
27398
  }
27420
- constructor(layerId, shadowEmitter, elements, scope, toolbarModel, userManager, hasPermission) {
27399
+ constructor(layerId, shadowEmitter, elements, scope, toolbarModel, userManager, imageSets, hasPermission) {
27421
27400
  super();
27422
27401
  _defineProperty17(this, "scope", void 0);
27423
27402
  _defineProperty17(this, "toolbarModel", void 0);
@@ -27428,6 +27407,7 @@ var RenderableModel = class extends EventEmitter2 {
27428
27407
  _defineProperty17(this, "maxIndex", -1);
27429
27408
  _defineProperty17(this, "hasPermission", void 0);
27430
27409
  _defineProperty17(this, "shadowEmitter", void 0);
27410
+ _defineProperty17(this, "imageSets", void 0);
27431
27411
  _defineProperty17(this, "onElementsChange", (event) => {
27432
27412
  for (const [key, value] of event.changes.keys.entries()) {
27433
27413
  if (value.action === "add") {
@@ -27443,6 +27423,7 @@ var RenderableModel = class extends EventEmitter2 {
27443
27423
  }
27444
27424
  }
27445
27425
  });
27426
+ this.imageSets = imageSets;
27446
27427
  this.hasPermission = hasPermission;
27447
27428
  this.shadowEmitter = shadowEmitter;
27448
27429
  this.layerId = layerId;
@@ -27502,6 +27483,8 @@ var RenderableModel = class extends EventEmitter2 {
27502
27483
  model = new LaserPointerModel(this.userManager.selfId, yMap, this.scope, (uuid) => {
27503
27484
  this.removeElementItem(uuid);
27504
27485
  });
27486
+ } else if (type === "image") {
27487
+ model = new ImageModel(yMap, this.scope, this.imageSets);
27505
27488
  }
27506
27489
  if (model) {
27507
27490
  model.shadowEmitter = this.shadowEmitter;
@@ -27534,10 +27517,26 @@ var RenderableModel = class extends EventEmitter2 {
27534
27517
  confirmPermission() {
27535
27518
  const hasPermission = this.hasPermission(WhiteboardPermissionFlag.draw);
27536
27519
  if (!hasPermission) {
27537
- console.warn("[@netless/forge-whiteboard] no permission to draw");
27520
+ log("[@netless/forge-whiteboard] no permission to draw", {}, "warning");
27538
27521
  }
27539
27522
  return hasPermission;
27540
27523
  }
27524
+ createImage(src) {
27525
+ if (!this.confirmPermission()) {
27526
+ return;
27527
+ }
27528
+ const model = new ImageModel(new Y12.Map(), this.scope, this.imageSets);
27529
+ model.root.set("src", src);
27530
+ const initMatrix = new this.scope.Matrix();
27531
+ const center = this.scope.project.view.center;
27532
+ initMatrix.translate({
27533
+ x: center.x,
27534
+ y: center.y
27535
+ });
27536
+ model.appendPointsMatrix(initMatrix);
27537
+ model.ownerId = this.userManager.selfId;
27538
+ this.addElementToDoc(model.root);
27539
+ }
27541
27540
  createCurve() {
27542
27541
  let shadow = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
27543
27542
  if (!this.confirmPermission()) {
@@ -27664,7 +27663,7 @@ var RenderableModel = class extends EventEmitter2 {
27664
27663
  });
27665
27664
  }
27666
27665
  dispose() {
27667
- this.elements.unobserve(this.onElementsChange);
27666
+ removeObserver2(this.elements, this.onElementsChange);
27668
27667
  this.elements.clear();
27669
27668
  Array.from(this.elementModels.values()).forEach((model) => {
27670
27669
  model.dispose();
@@ -27977,9 +27976,24 @@ var CurveTool = class extends WhiteboardTool {
27977
27976
  if (this.pointCount > 1024) {
27978
27977
  return;
27979
27978
  }
27979
+ const MIN_DISTANCE = 4;
27980
27980
  if (this.elementModel) {
27981
- this.pointCount += 1;
27982
- this.elementModel.appendPoints([Math.round(event.point.x), Math.round(event.point.y)]);
27981
+ const len = this.elementModel.points.length;
27982
+ let last = {
27983
+ x: 0,
27984
+ y: 0
27985
+ };
27986
+ if (len >= 2) {
27987
+ last = {
27988
+ x: this.elementModel.points[len - 2],
27989
+ y: this.elementModel.points[len - 1]
27990
+ };
27991
+ }
27992
+ const dist = Math.max(Math.abs(last.x - event.point.x), Math.abs(last.y - event.point.y));
27993
+ if (dist >= MIN_DISTANCE) {
27994
+ this.pointCount += 1;
27995
+ this.elementModel.appendPoints([Math.round(event.point.x), Math.round(event.point.y)]);
27996
+ }
27983
27997
  }
27984
27998
  }
27985
27999
  onMouseUp(event) {
@@ -28065,7 +28079,8 @@ var RectangleTool = class extends WhiteboardTool {
28065
28079
  };
28066
28080
 
28067
28081
  // src/model/ToolbarModel.ts
28068
- import EventEmitter3 from "eventemitter3";
28082
+ import EventEmitter2 from "eventemitter3";
28083
+ import { removeObserver as removeObserver3 } from "@netless/forge-room";
28069
28084
  function _defineProperty21(e, r, t) {
28070
28085
  return (r = _toPropertyKey21(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
28071
28086
  }
@@ -28092,7 +28107,7 @@ var TOOLBAR_KEYS = {
28092
28107
  strokeWidth: "strokeWidth",
28093
28108
  dashArray: "dashArray"
28094
28109
  };
28095
- var ToolbarModel = class extends EventEmitter3 {
28110
+ var ToolbarModel = class extends EventEmitter2 {
28096
28111
  get currentTool() {
28097
28112
  return this.root.get(TOOLBAR_KEYS.tool);
28098
28113
  }
@@ -28162,7 +28177,7 @@ var ToolbarModel = class extends EventEmitter3 {
28162
28177
  });
28163
28178
  }
28164
28179
  dispose() {
28165
- this.root.unobserve(this.handleRootUpdate);
28180
+ removeObserver3(this.root, this.handleRootUpdate);
28166
28181
  this.removeAllListeners();
28167
28182
  }
28168
28183
  };
@@ -28250,7 +28265,8 @@ var SelectorTool = class extends WhiteboardTool {
28250
28265
 
28251
28266
  // src/model/SelectElementsModel.ts
28252
28267
  import * as Y13 from "yjs";
28253
- import EventEmitter4 from "eventemitter3";
28268
+ import EventEmitter3 from "eventemitter3";
28269
+ import { removeDeepObserver as removeDeepObserver2 } from "@netless/forge-room";
28254
28270
 
28255
28271
  // src/WhiteboardKeys.ts
28256
28272
  var WhiteboardKeys = {
@@ -28281,7 +28297,7 @@ function _toPrimitive23(t, r) {
28281
28297
  }
28282
28298
  return ("string" === r ? String : Number)(t);
28283
28299
  }
28284
- var SelectElementsModel = class extends EventEmitter4 {
28300
+ var SelectElementsModel = class extends EventEmitter3 {
28285
28301
  get hasEditSelfPermission() {
28286
28302
  return this.hasPermission(WhiteboardPermissionFlag.editSelf);
28287
28303
  }
@@ -28297,7 +28313,7 @@ var SelectElementsModel = class extends EventEmitter4 {
28297
28313
  _defineProperty23(this, "handleUserLeave", (user) => {
28298
28314
  const cb = this.observers.get(user.id);
28299
28315
  if (cb) {
28300
- this.requestUserMap(user.id).unobserveDeep(cb);
28316
+ removeDeepObserver2(this.requestUserMap(user.id), cb);
28301
28317
  this.observers.delete(user.id);
28302
28318
  }
28303
28319
  });
@@ -28306,7 +28322,7 @@ var SelectElementsModel = class extends EventEmitter4 {
28306
28322
  this.handleUserSelectElementsChange(user.id, evts);
28307
28323
  };
28308
28324
  if (this.observers.has(user.id)) {
28309
- this.requestUserMap(user.id).unobserveDeep(this.observers.get(user.id));
28325
+ removeDeepObserver2(this.requestUserMap(user.id), this.observers.get(user.id));
28310
28326
  }
28311
28327
  this.requestUserMap(user.id).observeDeep(observer);
28312
28328
  this.observers.set(user.id, observer);
@@ -28328,7 +28344,7 @@ var SelectElementsModel = class extends EventEmitter4 {
28328
28344
  this.handleUserSelectElementsChange(userId, evts);
28329
28345
  };
28330
28346
  if (this.observers.has(userId)) {
28331
- this.requestUserMap(userId).unobserveDeep(this.observers.get(userId));
28347
+ removeDeepObserver2(this.requestUserMap(userId), this.observers.get(userId));
28332
28348
  }
28333
28349
  this.requestUserMap(userId).observeDeep(observer);
28334
28350
  this.observers.set(userId, observer);
@@ -28385,7 +28401,7 @@ var SelectElementsModel = class extends EventEmitter4 {
28385
28401
  }
28386
28402
  dispose() {
28387
28403
  for (const [key, value] of this.observers.entries()) {
28388
- this.requestUserMap(key).unobserveDeep(value);
28404
+ removeDeepObserver2(this.requestUserMap(key), value);
28389
28405
  }
28390
28406
  this.observers.clear();
28391
28407
  this.userManager.off("leave", this.handleUserLeave);
@@ -28394,10 +28410,10 @@ var SelectElementsModel = class extends EventEmitter4 {
28394
28410
  };
28395
28411
 
28396
28412
  // src/edit/Editor.ts
28397
- import EventEmitter6 from "eventemitter3";
28413
+ import EventEmitter5 from "eventemitter3";
28398
28414
 
28399
28415
  // src/edit/TextEditor.ts
28400
- import { EventEmitter as EventEmitter5 } from "eventemitter3";
28416
+ import { EventEmitter as EventEmitter4 } from "eventemitter3";
28401
28417
  function _defineProperty24(e, r, t) {
28402
28418
  return (r = _toPropertyKey24(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
28403
28419
  }
@@ -28415,7 +28431,7 @@ function _toPrimitive24(t, r) {
28415
28431
  }
28416
28432
  return ("string" === r ? String : Number)(t);
28417
28433
  }
28418
- var TextEditor = class extends EventEmitter5 {
28434
+ var TextEditor = class extends EventEmitter4 {
28419
28435
  constructor(camera) {
28420
28436
  super();
28421
28437
  _defineProperty24(this, "rootView", void 0);
@@ -28558,7 +28574,7 @@ var ANCHOR_STYLE = {
28558
28574
  b: "cursor:s-resize;bottom:-3px;left:50%;translate:-50%;",
28559
28575
  br: "cursor:se-resize;bottom:-3px;right:-3px"
28560
28576
  };
28561
- var Bounds = class extends EventEmitter6 {
28577
+ var Bounds = class extends EventEmitter5 {
28562
28578
  get width() {
28563
28579
  return this.maxX - this.minX;
28564
28580
  }
@@ -28697,7 +28713,7 @@ var Bounds = class extends EventEmitter6 {
28697
28713
  this.maxY = maxY;
28698
28714
  }
28699
28715
  };
28700
- var Editor = class extends EventEmitter6 {
28716
+ var Editor = class extends EventEmitter5 {
28701
28717
  constructor(scope, shadowScope, shadowEmitter, canvasElement, camera, initConfig) {
28702
28718
  super();
28703
28719
  _defineProperty25(this, "rootView", void 0);
@@ -28900,7 +28916,7 @@ var Editor = class extends EventEmitter6 {
28900
28916
  this.ctrlId = initConfig.ctrlId;
28901
28917
  this.ctrlNickName = initConfig.ctrlNickName;
28902
28918
  this.rootView = document.createElement("div");
28903
- this.rootView.style.cssText = "position:absolute;display:none;width:100%;height:100%;top:50%;left:50%;transform:translate(-50%,-50%);";
28919
+ this.rootView.style.cssText = "overflow:hidden;position:absolute;display:none;width:100%;height:100%;top:50%;left:50%;transform:translate(-50%,-50%);";
28904
28920
  this.frame = document.createElement("div");
28905
28921
  this.frame.style.position = "absolute";
28906
28922
  this.frame.style.padding = "8px";
@@ -29209,10 +29225,10 @@ var TextTool = class extends WhiteboardTool {
29209
29225
  };
29210
29226
 
29211
29227
  // src/Camera.ts
29212
- import EventEmitter8 from "eventemitter3";
29228
+ import EventEmitter7 from "eventemitter3";
29213
29229
 
29214
29230
  // src/Gesture.ts
29215
- import EventEmitter7 from "eventemitter3";
29231
+ import EventEmitter6 from "eventemitter3";
29216
29232
  function _defineProperty27(e, r, t) {
29217
29233
  return (r = _toPropertyKey27(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
29218
29234
  }
@@ -29230,7 +29246,7 @@ function _toPrimitive27(t, r) {
29230
29246
  }
29231
29247
  return ("string" === r ? String : Number)(t);
29232
29248
  }
29233
- var Gesture = class extends EventEmitter7 {
29249
+ var Gesture = class extends EventEmitter6 {
29234
29250
  constructor(element, scope) {
29235
29251
  super();
29236
29252
  _defineProperty27(this, "element", void 0);
@@ -29294,6 +29310,7 @@ var Gesture = class extends EventEmitter7 {
29294
29310
  };
29295
29311
 
29296
29312
  // src/Camera.ts
29313
+ import { removeObserver as removeObserver4 } from "@netless/forge-room";
29297
29314
  function _defineProperty28(e, r, t) {
29298
29315
  return (r = _toPropertyKey28(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
29299
29316
  }
@@ -29311,7 +29328,7 @@ function _toPrimitive28(t, r) {
29311
29328
  }
29312
29329
  return ("string" === r ? String : Number)(t);
29313
29330
  }
29314
- var Camera = class extends EventEmitter8 {
29331
+ var Camera = class extends EventEmitter7 {
29315
29332
  get inherentMatrix() {
29316
29333
  const inherentMatrix = new this.scope.Matrix();
29317
29334
  inherentMatrix.scale(this.inherentScale, [0, 0]);
@@ -29367,7 +29384,7 @@ var Camera = class extends EventEmitter8 {
29367
29384
  _defineProperty28(this, "handleUserLeave", (user) => {
29368
29385
  const cb = this.observers.get(user.id);
29369
29386
  if (cb) {
29370
- this.requestUserMap(user.id).unobserve(cb);
29387
+ removeObserver4(this.requestUserMap(user.id), cb);
29371
29388
  }
29372
29389
  });
29373
29390
  _defineProperty28(this, "handleUserJoin", (user) => {
@@ -29375,7 +29392,7 @@ var Camera = class extends EventEmitter8 {
29375
29392
  this.handleViewMatrixUpdate(user.id, evt);
29376
29393
  };
29377
29394
  if (this.observers.has(user.id)) {
29378
- this.requestUserMap(user.id).unobserve(observer);
29395
+ removeObserver4(this.requestUserMap(user.id), observer);
29379
29396
  }
29380
29397
  this.requestUserMap(user.id).observe(observer);
29381
29398
  this.observers.set(user.id, observer);
@@ -29482,7 +29499,7 @@ var Camera = class extends EventEmitter8 {
29482
29499
  this.handleViewMatrixUpdate(userId, evt);
29483
29500
  };
29484
29501
  if (this.observers.has(userId)) {
29485
- this.requestUserMap(userId).unobserve(observer);
29502
+ removeObserver4(this.requestUserMap(userId), observer);
29486
29503
  }
29487
29504
  this.requestUserMap(userId).observe(observer);
29488
29505
  this.observers.set(userId, observer);
@@ -29679,10 +29696,10 @@ var Camera = class extends EventEmitter8 {
29679
29696
  Array.from(this.observers.keys()).forEach((userId) => {
29680
29697
  const cb = this.observers.get(userId);
29681
29698
  if (cb) {
29682
- this.requestUserMap(userId).unobserve(cb);
29699
+ removeObserver4(this.requestUserMap(userId), cb);
29683
29700
  }
29684
29701
  });
29685
- this.whiteboardAttrsMap.unobserve(this.handleMainCameraChange);
29702
+ removeObserver4(this.whiteboardAttrsMap, this.handleMainCameraChange);
29686
29703
  this.userManager.off("join", this.handleUserJoin);
29687
29704
  this.userManager.off("leave", this.handleUserLeave);
29688
29705
  this.gesture.removeAllListeners();
@@ -29795,7 +29812,7 @@ var TriangleTool = class extends WhiteboardTool {
29795
29812
  };
29796
29813
 
29797
29814
  // src/Whiteboard.ts
29798
- import EventEmitter9 from "eventemitter3";
29815
+ import EventEmitter8 from "eventemitter3";
29799
29816
  function _defineProperty31(e, r, t) {
29800
29817
  return (r = _toPropertyKey31(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
29801
29818
  }
@@ -29813,8 +29830,7 @@ function _toPrimitive31(t, r) {
29813
29830
  }
29814
29831
  return ("string" === r ? String : Number)(t);
29815
29832
  }
29816
- var Whiteboard = class extends EventEmitter9 {
29817
- // public insertImage!: (src: string) => void;
29833
+ var Whiteboard = class extends EventEmitter8 {
29818
29834
  constructor(view) {
29819
29835
  super();
29820
29836
  _defineProperty31(this, "view", void 0);
@@ -29833,6 +29849,7 @@ var Whiteboard = class extends EventEmitter9 {
29833
29849
  _defineProperty31(this, "enableCameraBoundaryHighlight", void 0);
29834
29850
  _defineProperty31(this, "getElementAttribute", void 0);
29835
29851
  _defineProperty31(this, "setElementAttribute", void 0);
29852
+ _defineProperty31(this, "removeElement", void 0);
29836
29853
  _defineProperty31(this, "getCurrentTool", void 0);
29837
29854
  _defineProperty31(this, "setCurrentTool", void 0);
29838
29855
  _defineProperty31(this, "setCanvasBackgroundColor", void 0);
@@ -29859,6 +29876,7 @@ var Whiteboard = class extends EventEmitter9 {
29859
29876
  _defineProperty31(this, "rasterizeElementsBounds", void 0);
29860
29877
  _defineProperty31(this, "rasterizeMaxBounds", void 0);
29861
29878
  _defineProperty31(this, "setInputType", void 0);
29879
+ _defineProperty31(this, "insertImage", void 0);
29862
29880
  this.view = view;
29863
29881
  }
29864
29882
  };
@@ -29926,7 +29944,8 @@ var EraserTool = class extends WhiteboardTool {
29926
29944
 
29927
29945
  // src/model/TrashedElementsModel.ts
29928
29946
  import * as Y14 from "yjs";
29929
- import EventEmitter10 from "eventemitter3";
29947
+ import EventEmitter9 from "eventemitter3";
29948
+ import { removeDeepObserver as removeDeepObserver3 } from "@netless/forge-room";
29930
29949
  function _defineProperty33(e, r, t) {
29931
29950
  return (r = _toPropertyKey33(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
29932
29951
  }
@@ -29944,7 +29963,7 @@ function _toPrimitive33(t, r) {
29944
29963
  }
29945
29964
  return ("string" === r ? String : Number)(t);
29946
29965
  }
29947
- var TrashedElementsModel = class extends EventEmitter10 {
29966
+ var TrashedElementsModel = class extends EventEmitter9 {
29948
29967
  get hasDeleteSelfPermission() {
29949
29968
  return this.hasPermission(WhiteboardPermissionFlag.deleteSelf);
29950
29969
  }
@@ -29960,7 +29979,7 @@ var TrashedElementsModel = class extends EventEmitter10 {
29960
29979
  _defineProperty33(this, "handleUserLeave", (user) => {
29961
29980
  const cb = this.observers.get(user.id);
29962
29981
  if (cb) {
29963
- this.requestUserMap(user.id).unobserveDeep(cb);
29982
+ removeDeepObserver3(this.requestUserMap(user.id), cb);
29964
29983
  }
29965
29984
  });
29966
29985
  _defineProperty33(this, "handleUserJoin", (user) => {
@@ -29968,7 +29987,7 @@ var TrashedElementsModel = class extends EventEmitter10 {
29968
29987
  this.handleUserTrashElementsChange(user.id, evts);
29969
29988
  };
29970
29989
  if (this.observers.has(user.id)) {
29971
- this.requestUserMap(user.id).unobserveDeep(this.observers.get(user.id));
29990
+ removeDeepObserver3(this.requestUserMap(user.id), this.observers.get(user.id));
29972
29991
  }
29973
29992
  this.requestUserMap(user.id).observeDeep(observer);
29974
29993
  this.observers.set(user.id, observer);
@@ -29982,7 +30001,7 @@ var TrashedElementsModel = class extends EventEmitter10 {
29982
30001
  this.handleUserTrashElementsChange(userId, evts);
29983
30002
  };
29984
30003
  if (this.observers.has(userId)) {
29985
- this.requestUserMap(userId).unobserveDeep(this.observers.get(userId));
30004
+ removeDeepObserver3(this.requestUserMap(userId), userId);
29986
30005
  }
29987
30006
  this.requestUserMap(userId).observeDeep(observer);
29988
30007
  this.observers.set(userId, observer);
@@ -30039,7 +30058,7 @@ var TrashedElementsModel = class extends EventEmitter10 {
30039
30058
  }
30040
30059
  dispose() {
30041
30060
  for (const [key, value] of this.observers.entries()) {
30042
- this.requestUserMap(key).unobserveDeep(value);
30061
+ removeDeepObserver3(this.requestUserMap(key), value);
30043
30062
  }
30044
30063
  this.observers.clear();
30045
30064
  this.userManager.off("leave", this.handleUserLeave);
@@ -30096,8 +30115,8 @@ var LaserPointerTool = class extends WhiteboardTool {
30096
30115
  };
30097
30116
 
30098
30117
  // src/model/PageModel.ts
30099
- import EventEmitter11 from "eventemitter3";
30100
- import { log } from "@netless/forge-room";
30118
+ import EventEmitter10 from "eventemitter3";
30119
+ import { log as log2, removeObserver as removeObserver5 } from "@netless/forge-room";
30101
30120
  function _defineProperty35(e, r, t) {
30102
30121
  return (r = _toPropertyKey35(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30103
30122
  }
@@ -30115,7 +30134,7 @@ function _toPrimitive35(t, r) {
30115
30134
  }
30116
30135
  return ("string" === r ? String : Number)(t);
30117
30136
  }
30118
- var PageModel = class extends EventEmitter11 {
30137
+ var PageModel = class extends EventEmitter10 {
30119
30138
  constructor(whiteboardAttrsMap, userManager, requestUserMap, pageMap, hasPermission) {
30120
30139
  super();
30121
30140
  _defineProperty35(this, "whiteboardAttrsMap", void 0);
@@ -30127,7 +30146,7 @@ var PageModel = class extends EventEmitter11 {
30127
30146
  _defineProperty35(this, "handleUserLeave", (user) => {
30128
30147
  const cb = this.observers.get(user.id);
30129
30148
  if (cb) {
30130
- this.requestUserMap(user.id).unobserve(cb);
30149
+ removeObserver5(this.requestUserMap(user.id), cb);
30131
30150
  }
30132
30151
  });
30133
30152
  _defineProperty35(this, "handleUserJoin", (user) => {
@@ -30141,7 +30160,7 @@ var PageModel = class extends EventEmitter11 {
30141
30160
  if (cameraMode === "main") {
30142
30161
  const targetPage = this.whiteboardAttrsMap.get(WhiteboardKeys.currentPage);
30143
30162
  if (!this.pageMap.has(targetPage) && targetPage !== "_i_") {
30144
- log(`main page {${targetPage}} not found.`, {}, "error");
30163
+ log2(`main page {${targetPage}} not found.`, {}, "error");
30145
30164
  return;
30146
30165
  }
30147
30166
  this.requestUserMap(this.userManager.selfId).set(WhiteboardKeys.currentPage, targetPage);
@@ -30269,12 +30288,12 @@ var PageModel = class extends EventEmitter11 {
30269
30288
  dispose() {
30270
30289
  for (const entry of this.observers.entries()) {
30271
30290
  const [userId, observer] = entry;
30272
- this.requestUserMap(userId).unobserve(observer);
30291
+ removeObserver5(this.requestUserMap(userId), observer);
30273
30292
  }
30274
30293
  this.userManager.off("join", this.handleUserJoin);
30275
30294
  this.userManager.off("leave", this.handleUserLeave);
30276
- this.whiteboardAttrsMap.unobserve(this.handleMainPageChange);
30277
- this.pageMap.unobserve(this.handlePageMapChange);
30295
+ removeObserver5(this.whiteboardAttrsMap, this.handleMainPageChange);
30296
+ removeObserver5(this.pageMap, this.handlePageMapChange);
30278
30297
  }
30279
30298
  };
30280
30299
 
@@ -30288,8 +30307,9 @@ async function waitUntil(fn, timeout) {
30288
30307
  }
30289
30308
 
30290
30309
  // src/IndexedNavigation.ts
30291
- import EventEmitter12 from "eventemitter3";
30292
- import { log as log2 } from "@netless/forge-room";
30310
+ import EventEmitter11 from "eventemitter3";
30311
+ import { log as log3 } from "@netless/forge-room";
30312
+ import { removeObserver as removeObserver6 } from "@netless/forge-room";
30293
30313
  function _defineProperty36(e, r, t) {
30294
30314
  return (r = _toPropertyKey36(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30295
30315
  }
@@ -30307,7 +30327,7 @@ function _toPrimitive36(t, r) {
30307
30327
  }
30308
30328
  return ("string" === r ? String : Number)(t);
30309
30329
  }
30310
- var IndexedNavigation = class extends EventEmitter12 {
30330
+ var IndexedNavigation = class extends EventEmitter11 {
30311
30331
  get idList() {
30312
30332
  return this.pageModel.pageList().filter((id) => /^_i_/.test(id));
30313
30333
  }
@@ -30316,7 +30336,7 @@ var IndexedNavigation = class extends EventEmitter12 {
30316
30336
  return this.list[key] && this.list[key].prev === "";
30317
30337
  });
30318
30338
  if (!headId) {
30319
- log2("indexed navigation confusion", {
30339
+ log3("indexed navigation confusion", {
30320
30340
  list: JSON.stringify(this.list)
30321
30341
  }, "error");
30322
30342
  throw new Error("indexed navigation confusion");
@@ -30418,6 +30438,9 @@ var IndexedNavigation = class extends EventEmitter12 {
30418
30438
  const userPageId = this.userMap.get(WhiteboardKeys.currentPage);
30419
30439
  return this.getPageIndex(userPageId);
30420
30440
  }
30441
+ get currentPageId() {
30442
+ return this.userMap.get(WhiteboardKeys.currentPage);
30443
+ }
30421
30444
  getPageIndex(pageId) {
30422
30445
  let i = 0;
30423
30446
  let currentId = this.head;
@@ -30588,9 +30611,7 @@ var IndexedNavigation = class extends EventEmitter12 {
30588
30611
  if (this.pageCount <= 1) {
30589
30612
  return this.pageCount;
30590
30613
  }
30591
- const cameraMode = this.userMap.get(WhiteboardKeys.cameraMode);
30592
- if (cameraMode !== "main") {
30593
- console.warn("cannot modify pages in non-main view mode.");
30614
+ if (!this.modifyDetect()) {
30594
30615
  return this.pageCount;
30595
30616
  }
30596
30617
  const targetId = this.getPageId(index);
@@ -30631,14 +30652,14 @@ var IndexedNavigation = class extends EventEmitter12 {
30631
30652
  }
30632
30653
  }
30633
30654
  dispose() {
30634
- this.indexedPageMap.unobserve(this.handleIndexedPageMapUpdate);
30655
+ removeObserver6(this.indexedPageMap, this.handleIndexedPageMapUpdate);
30635
30656
  this.pageModel.off("switchPage");
30636
30657
  this.pageModel.off("pagesChange");
30637
30658
  }
30638
30659
  };
30639
30660
 
30640
30661
  // src/utils/ShadowEmitter.ts
30641
- import EventEmitter13 from "eventemitter3";
30662
+ import EventEmitter12 from "eventemitter3";
30642
30663
  function _defineProperty37(e, r, t) {
30643
30664
  return (r = _toPropertyKey37(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30644
30665
  }
@@ -30656,7 +30677,7 @@ function _toPrimitive37(t, r) {
30656
30677
  }
30657
30678
  return ("string" === r ? String : Number)(t);
30658
30679
  }
30659
- var ShadowEmitter = class extends EventEmitter13 {
30680
+ var ShadowEmitter = class extends EventEmitter12 {
30660
30681
  constructor(userMap) {
30661
30682
  super();
30662
30683
  _defineProperty37(this, "userMap", void 0);
@@ -30823,6 +30844,7 @@ var SequenceExecutor = class {
30823
30844
  };
30824
30845
 
30825
30846
  // src/WhiteboardApplication.ts
30847
+ import { removeObserver as removeObserver7 } from "@netless/forge-room";
30826
30848
  function _defineProperty41(e, r, t) {
30827
30849
  return (r = _toPropertyKey41(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30828
30850
  }
@@ -30861,6 +30883,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30861
30883
  _defineProperty41(this, "pageModel", void 0);
30862
30884
  _defineProperty41(this, "layers", /* @__PURE__ */ new Map());
30863
30885
  _defineProperty41(this, "undoManagers", /* @__PURE__ */ new Map());
30886
+ _defineProperty41(this, "imageSets", document.createElement("div"));
30864
30887
  _defineProperty41(this, "rootElement", document.createElement("div"));
30865
30888
  _defineProperty41(this, "paperScope", new import_paper.default.PaperScope());
30866
30889
  _defineProperty41(this, "canvasElement", document.createElement("canvas"));
@@ -30915,7 +30938,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30915
30938
  }
30916
30939
  } else {
30917
30940
  console.warn(`[@netless/forge-whiteboard] page ${pageId} not found`);
30918
- log3(`[@netless/forge-whiteboard] page ${pageId} not found`, {}, "warning");
30941
+ log4(`[@netless/forge-whiteboard] page ${pageId} not found`, {}, "warning");
30919
30942
  }
30920
30943
  await waitUntil(() => this.undoManagers.has(pageId), 1e3);
30921
30944
  if (this.undoManagers.has(pageId)) {
@@ -30927,7 +30950,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30927
30950
  this.undoManagers.get(pageId).on("stack-item-popped", this.handleStackItemPopped);
30928
30951
  } else {
30929
30952
  console.warn(`[@netless/forge-whiteboard] undo manager for page ${pageId} not found`);
30930
- log3(`[@netless/forge-whiteboard] undo manager for page ${pageId} not found`, {}, "warning");
30953
+ log4(`[@netless/forge-whiteboard] undo manager for page ${pageId} not found`, {}, "warning");
30931
30954
  }
30932
30955
  this.emitter.emit("redoStackLength", this.undoManager?.redoStack.length ?? 0);
30933
30956
  this.emitter.emit("undoStackLength", this.undoManager?.undoStack.length ?? 0);
@@ -30950,7 +30973,7 @@ var WhiteboardApplication = class extends AbstractApplication {
30950
30973
  const id = ids[i];
30951
30974
  if (!this.layers.has(id)) {
30952
30975
  const elementsMap = this.getMap(`layer/${id}/elements`);
30953
- const renderableModel = new RenderableModel(id, this.shadowEmitter, elementsMap, this.paperScope, this.toolbarModel, this.userManager, this.hasPermission);
30976
+ const renderableModel = new RenderableModel(id, this.shadowEmitter, elementsMap, this.paperScope, this.toolbarModel, this.userManager, this.imageSets, this.hasPermission);
30954
30977
  this.layers.set(id, renderableModel);
30955
30978
  }
30956
30979
  if (!this.undoManagers.has(id)) {
@@ -31103,10 +31126,14 @@ var WhiteboardApplication = class extends AbstractApplication {
31103
31126
  this.camera.triggerZoom();
31104
31127
  }
31105
31128
  });
31129
+ window.__wb = this;
31106
31130
  requestAnimationFrameHook(this.paperScope);
31107
31131
  requestAnimationFrameHook(this.shadowScope);
31108
31132
  const that = this;
31109
31133
  this.rootElement.setAttribute("data-forge-app", "whiteboard");
31134
+ this.imageSets.style.display = "none";
31135
+ this.imageSets.setAttribute("data-image-sets", "");
31136
+ this.rootElement.appendChild(this.imageSets);
31110
31137
  document.body.addEventListener("pointerdown", (evt) => {
31111
31138
  this.isPenEvent = evt.pointerType === "pen";
31112
31139
  if (evt.pointerType === "pen" && this.hasPenInput === null) {
@@ -31168,7 +31195,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31168
31195
  this.emitter.setViewModeToFree = (userId) => {
31169
31196
  if (that.disableViewModelUpdate) {
31170
31197
  console.warn("Operation failed. Perspective mode switching is disabled in the current environment.");
31171
- log3("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31198
+ log4("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31172
31199
  return;
31173
31200
  }
31174
31201
  const targetId = userId ? this.hasPermission(WhiteboardPermissionFlag.setOthersView) ? userId : null : this.userId;
@@ -31179,7 +31206,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31179
31206
  this.emitter.setViewModeToFlow = (flowId, userId) => {
31180
31207
  if (that.disableViewModelUpdate) {
31181
31208
  console.warn("Operation failed. Perspective mode switching is disabled in the current environment.");
31182
- log3("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31209
+ log4("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31183
31210
  return;
31184
31211
  }
31185
31212
  const targetId = userId ? this.hasPermission(WhiteboardPermissionFlag.setOthersView) ? userId : null : this.userId;
@@ -31194,7 +31221,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31194
31221
  this.emitter.setViewModeToMain = (userId) => {
31195
31222
  if (that.disableViewModelUpdate) {
31196
31223
  console.warn("Operation failed. Perspective mode switching is disabled in the current environment.");
31197
- log3("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31224
+ log4("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31198
31225
  return;
31199
31226
  }
31200
31227
  const targetId = userId ? this.hasPermission(WhiteboardPermissionFlag.setOthersView) ? userId : null : this.userId;
@@ -31206,6 +31233,30 @@ var WhiteboardApplication = class extends AbstractApplication {
31206
31233
  this.camera.resetViewMatrixToMain();
31207
31234
  }
31208
31235
  };
31236
+ this.emitter.insertImage = (src, pageId) => {
31237
+ if (!/https/.test(src)) {
31238
+ log4("[@netless/forge-whiteboard] invalid image url, src needs to be in the HTTPS protocol.", {
31239
+ src
31240
+ }, "warning");
31241
+ return;
31242
+ }
31243
+ let targetPageId = pageId;
31244
+ if (!targetPageId) {
31245
+ targetPageId = this.pageModel.getCurrentPage(this.userManager.selfId);
31246
+ }
31247
+ if (!targetPageId) {
31248
+ log4("[@netless/forge-whiteboard] page not found", {}, "warning");
31249
+ return;
31250
+ }
31251
+ this.layers.get(targetPageId)?.createImage(src);
31252
+ };
31253
+ this.emitter.removeElement = (pageId, elementId) => {
31254
+ if (!this.layers.has(pageId)) {
31255
+ log4("[@netless/forge-whiteboard] page not found", {}, "warning");
31256
+ return;
31257
+ }
31258
+ this.layers.get(pageId)?.removeElementItem(elementId);
31259
+ };
31209
31260
  this.emitter.getViewModel = (userId) => {
31210
31261
  const targetId = userId ? userId : this.userId;
31211
31262
  return this.userMap(targetId).get(WhiteboardKeys.cameraMode);
@@ -31221,7 +31272,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31221
31272
  const source = this.getMap(`layer/${sourceId}/elements`);
31222
31273
  const target = this.getMap(`layer/${targetId}/elements`);
31223
31274
  if (!this.layers.has(targetId)) {
31224
- this.layers.set(targetId, new RenderableModel(targetId, this.shadowEmitter, target, this.paperScope, this.toolbarModel, this.userManager, this.hasPermission));
31275
+ this.layers.set(targetId, new RenderableModel(targetId, this.shadowEmitter, target, this.paperScope, this.toolbarModel, this.userManager, this.imageSets, this.hasPermission));
31225
31276
  }
31226
31277
  if (!this.undoManagers.has(targetId)) {
31227
31278
  const undoManager = new Y15.UndoManager(target, {
@@ -31272,7 +31323,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31272
31323
  this.camera.reset();
31273
31324
  };
31274
31325
  this.emitter.on("error", (errorCode, errorMessage) => {
31275
- log3("WhiteboardApplicationError", {
31326
+ log4("WhiteboardApplicationError", {
31276
31327
  errorCode,
31277
31328
  errorMessage
31278
31329
  });
@@ -31373,6 +31424,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31373
31424
  this.permissions = new WhiteboardPermissions(this.userManager, (userId) => {
31374
31425
  return this.userMap(userId);
31375
31426
  });
31427
+ this.permissions.setPermission(WhiteboardPermissionFlag.all);
31376
31428
  this.emitter["permissions"] = this.permissions;
31377
31429
  this.emitter["selfUserId"] = this.userId;
31378
31430
  this.option = option;
@@ -31455,7 +31507,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31455
31507
  this.paperScope.tool = this.tools[this.toolbarModel.currentTool].tool;
31456
31508
  } else {
31457
31509
  this.paperScope.tool = this.tools["curve"].tool;
31458
- log3(`${this.toolbarModel.currentTool} not supported, backup to curve`);
31510
+ log4(`${this.toolbarModel.currentTool} not supported, backup to curve`);
31459
31511
  }
31460
31512
  this.selectElementsModel.on("elementsChange", this.handleElementsSelect);
31461
31513
  this.trashedElementsModel.on("elementsChange", this.handleElementsTrash);
@@ -31700,7 +31752,7 @@ var WhiteboardApplication = class extends AbstractApplication {
31700
31752
  }
31701
31753
  unlink() {
31702
31754
  if (this.linkTarget) {
31703
- this.linkTarget.unobserve(this.handleLinkedMapChange);
31755
+ removeObserver7(this.linkTarget, this.handleLinkedMapChange);
31704
31756
  }
31705
31757
  }
31706
31758
  setViewSize(width, height) {