@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
@@ -25371,14 +25371,15 @@ __export(src_exports, {
25371
25371
  module.exports = __toCommonJS(src_exports);
25372
25372
 
25373
25373
  // src/WhiteboardApplication.ts
25374
- var import_forge_room3 = require("@netless/forge-room");
25374
+ var import_forge_room12 = require("@netless/forge-room");
25375
25375
  var Y15 = __toESM(require("yjs"), 1);
25376
25376
  var import_paper = __toESM(require_paper_full(), 1);
25377
25377
 
25378
25378
  // src/model/RenderableModel.ts
25379
25379
  var Y12 = __toESM(require("yjs"), 1);
25380
- var import_eventemitter32 = __toESM(require("eventemitter3"), 1);
25380
+ var import_eventemitter3 = __toESM(require("eventemitter3"), 1);
25381
25381
  var import_uuid = require("uuid");
25382
+ var import_forge_room4 = require("@netless/forge-room");
25382
25383
 
25383
25384
  // src/model/renderable/CurveModel.ts
25384
25385
  var Y2 = __toESM(require("yjs"), 1);
@@ -25536,6 +25537,7 @@ var import_lodash = __toESM(require_lodash(), 1);
25536
25537
 
25537
25538
  // src/model/renderable/ElementModel.ts
25538
25539
  var Y = __toESM(require("yjs"), 1);
25540
+ var import_forge_room = require("@netless/forge-room");
25539
25541
  function _defineProperty(e, r, t) {
25540
25542
  return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
25541
25543
  }
@@ -25720,7 +25722,7 @@ var ElementModel = class _ElementModel {
25720
25722
  }
25721
25723
  dispose() {
25722
25724
  this.subDispose();
25723
- this.root.unobserveDeep(this.handlePropChange);
25725
+ (0, import_forge_room.removeDeepObserver)(this.root, this.handlePropChange);
25724
25726
  }
25725
25727
  };
25726
25728
  _defineProperty(ElementModel, "KEYS", {
@@ -25795,12 +25797,15 @@ var CurveModel = class extends ElementModel {
25795
25797
  constructor(root, scope) {
25796
25798
  super(root, scope);
25797
25799
  _defineProperty3(this, "item", null);
25800
+ _defineProperty3(this, "debugPath", void 0);
25801
+ _defineProperty3(this, "debug", false);
25798
25802
  if (!this.root.has("type")) {
25799
25803
  this.root.set("type", "curve");
25800
25804
  }
25801
25805
  if (!this.root.has("points")) {
25802
25806
  this.root.set("points", new Y2.Array());
25803
25807
  }
25808
+ this.debugPath = new scope.Path();
25804
25809
  }
25805
25810
  average(a2, b2) {
25806
25811
  return (a2 + b2) / 2;
@@ -25809,23 +25814,23 @@ var CurveModel = class extends ElementModel {
25809
25814
  const groupPoints = (0, import_lodash.chunk)(points, 2);
25810
25815
  return ae(groupPoints, {
25811
25816
  size: this.strokeWidth,
25812
- smoothing: 0,
25813
- thinning: 0.5,
25817
+ smoothing: 0.5,
25818
+ thinning: -0.5,
25814
25819
  streamline: 0.5,
25815
25820
  simulatePressure: true,
25816
25821
  start: {
25817
- taper: 10,
25822
+ taper: this.strokeWidth * 10,
25818
25823
  cap: true
25819
25824
  },
25820
25825
  end: {
25821
- taper: 10,
25826
+ taper: this.strokeWidth * 20,
25822
25827
  cap: true
25823
25828
  }
25824
25829
  });
25825
25830
  }
25826
25831
  matrixedPoints() {
25827
- const groupPoints = (0, import_lodash.chunk)(this.points, 2);
25828
- return groupPoints.map((_ref) => {
25832
+ const currentPoints = (0, import_lodash.chunk)(this.points, 2);
25833
+ return currentPoints.map((_ref) => {
25829
25834
  let [x, y] = _ref;
25830
25835
  return new this.scope.Point(x, y);
25831
25836
  }).map((p) => p.transform(new this.scope.Matrix(this.pointsMatrix))).reduce((result, next) => {
@@ -25859,27 +25864,41 @@ var CurveModel = class extends ElementModel {
25859
25864
  }
25860
25865
  return path;
25861
25866
  }
25862
- getNextSegments() {
25863
- const points = this.parsePoints(this.matrixedPoints());
25864
- const path = this.createPath(points);
25865
- return path.segments;
25867
+ updateDebugPath() {
25868
+ this.debugPath = new this.scope.Path();
25869
+ const points = (0, import_lodash.chunk)(this.points, 2);
25870
+ for (let i = 0, len = points.length; i < len; i++) {
25871
+ const point = new this.scope.Point(points[i][0], points[i][1]);
25872
+ if (i === 0) {
25873
+ this.debugPath.moveTo(point);
25874
+ } else {
25875
+ this.debugPath.lineTo(point);
25876
+ }
25877
+ this.debugPath.strokeWidth = 1;
25878
+ this.debugPath.strokeColor = new this.scope.Color(1, 0, 0, 1);
25879
+ }
25866
25880
  }
25867
25881
  onVectorUpdate() {
25868
25882
  if (!this.item) {
25869
25883
  return;
25870
25884
  }
25885
+ if (this.debug) {
25886
+ this.debugPath.remove();
25887
+ this.updateDebugPath();
25888
+ }
25889
+ const points = this.parsePoints(this.matrixedPoints());
25890
+ const path = this.createPath(points);
25871
25891
  this.item.removeSegments();
25872
- this.item.addSegments(this.getNextSegments());
25873
- this.item.simplify(2.5);
25892
+ this.item.addSegments(path.segments);
25893
+ if (this.debug) {
25894
+ this.item.addChild(this.debugPath);
25895
+ }
25874
25896
  }
25875
25897
  createPaperItem() {
25876
25898
  this.item = new this.scope.Path();
25877
- this.item.strokeCap = "round";
25878
- this.item.strokeJoin = "round";
25879
- this.item.strokeScaling = false;
25880
25899
  this.item.strokeColor = new this.scope.Color(this.strokeColor);
25881
25900
  this.item.fillColor = new this.scope.Color(this.strokeColor);
25882
- this.item.addSegments(this.getNextSegments());
25901
+ this.onVectorUpdate();
25883
25902
  }
25884
25903
  editorConfig() {
25885
25904
  return new EditorConfig();
@@ -25889,8 +25908,8 @@ var CurveModel = class extends ElementModel {
25889
25908
  }
25890
25909
  styleKeys() {
25891
25910
  return {
25892
- include: ["strokeColor"],
25893
- exclude: ["fillColor", "dashArray"]
25911
+ include: ["strokeColor", "strokeWidth"],
25912
+ exclude: ["dashArray", "fillColor"]
25894
25913
  };
25895
25914
  }
25896
25915
  onStyleKeyUpdate(key) {
@@ -25900,6 +25919,8 @@ var CurveModel = class extends ElementModel {
25900
25919
  if (key === "strokeColor") {
25901
25920
  this.item.strokeColor = new this.scope.Color(this.strokeColor);
25902
25921
  this.item.fillColor = new this.scope.Color(this.strokeColor);
25922
+ } else if (key === "strokeWidth") {
25923
+ this.onVectorUpdate();
25903
25924
  }
25904
25925
  }
25905
25926
  subDispose() {
@@ -26429,6 +26450,7 @@ var LineControlPoint = class {
26429
26450
 
26430
26451
  // src/model/renderable/PointTextModel.ts
26431
26452
  var Y6 = __toESM(require("yjs"), 1);
26453
+ var import_forge_room2 = require("@netless/forge-room");
26432
26454
  function _defineProperty10(e, r, t) {
26433
26455
  return (r = _toPropertyKey10(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
26434
26456
  }
@@ -26498,7 +26520,7 @@ var PointTextModel = class extends ElementModel {
26498
26520
  }
26499
26521
  }
26500
26522
  subDispose() {
26501
- this.root.unobserve(this.handleTextPropChange);
26523
+ (0, import_forge_room2.removeObserver)(this.root, this.handleTextPropChange);
26502
26524
  }
26503
26525
  getInternalMeasurement() {
26504
26526
  if (!this.item) {
@@ -27145,24 +27167,7 @@ var LaserPointerModel = class extends ElementModel {
27145
27167
  };
27146
27168
 
27147
27169
  // src/WhitePermissions.ts
27148
- var import_eventemitter3 = __toESM(require("eventemitter3"), 1);
27149
- function _defineProperty15(e, r, t) {
27150
- return (r = _toPropertyKey15(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
27151
- }
27152
- function _toPropertyKey15(t) {
27153
- var i = _toPrimitive15(t, "string");
27154
- return "symbol" == typeof i ? i : i + "";
27155
- }
27156
- function _toPrimitive15(t, r) {
27157
- if ("object" != typeof t || !t) return t;
27158
- var e = t[Symbol.toPrimitive];
27159
- if (void 0 !== e) {
27160
- var i = e.call(t, r || "default");
27161
- if ("object" != typeof i) return i;
27162
- throw new TypeError("@@toPrimitive must return a primitive value.");
27163
- }
27164
- return ("string" === r ? String : Number)(t);
27165
- }
27170
+ var import_forge_room3 = require("@netless/forge-room");
27166
27171
  var WhiteboardPermissionFlag = function(WhiteboardPermissionFlag2) {
27167
27172
  WhiteboardPermissionFlag2[WhiteboardPermissionFlag2["none"] = 0] = "none";
27168
27173
  WhiteboardPermissionFlag2[WhiteboardPermissionFlag2["draw"] = 1] = "draw";
@@ -27175,59 +27180,7 @@ var WhiteboardPermissionFlag = function(WhiteboardPermissionFlag2) {
27175
27180
  WhiteboardPermissionFlag2[WhiteboardPermissionFlag2["all"] = WhiteboardPermissionFlag2.draw | WhiteboardPermissionFlag2.editSelf | WhiteboardPermissionFlag2.editOthers | WhiteboardPermissionFlag2.deleteSelf | WhiteboardPermissionFlag2.deleteOthers | WhiteboardPermissionFlag2.mainView | WhiteboardPermissionFlag2.setOthersView] = "all";
27176
27181
  return WhiteboardPermissionFlag2;
27177
27182
  }({});
27178
- var WhiteboardPermissions = class extends import_eventemitter3.default {
27179
- constructor(userManager, requestUserMap) {
27180
- super();
27181
- _defineProperty15(this, "requestUserMap", void 0);
27182
- _defineProperty15(this, "userManager", void 0);
27183
- _defineProperty15(this, "observers", /* @__PURE__ */ new Map());
27184
- _defineProperty15(this, "handleUserLeave", (user) => {
27185
- const cb = this.observers.get(user.id);
27186
- if (cb) {
27187
- this.requestUserMap(user.id).unobserve(cb);
27188
- }
27189
- });
27190
- _defineProperty15(this, "handleUserJoin", (user) => {
27191
- this.addObserve(user.id);
27192
- });
27193
- this.userManager = userManager;
27194
- this.requestUserMap = requestUserMap;
27195
- this.createModel(this.userManager.selfId);
27196
- this.userManager.userIdList().forEach((userId) => {
27197
- this.addObserve(userId);
27198
- });
27199
- this.userManager.on("join", this.handleUserJoin);
27200
- this.userManager.on("leave", this.handleUserLeave);
27201
- }
27202
- addObserve(userId) {
27203
- if (this.observers.has(userId)) {
27204
- return;
27205
- }
27206
- const observer = (evt) => {
27207
- this.handleUserPermissionChange(userId, evt);
27208
- };
27209
- if (this.observers.has(userId)) {
27210
- this.requestUserMap(userId).unobserve(this.observers.get(userId));
27211
- }
27212
- this.observers.set(userId, observer);
27213
- this.requestUserMap(userId).observe(observer);
27214
- }
27215
- createModel(userId) {
27216
- const userMap = this.requestUserMap(userId);
27217
- if (!userMap.has("permission")) {
27218
- userMap.set("permission", 0);
27219
- }
27220
- }
27221
- handleUserPermissionChange(userId, evt) {
27222
- for (const [key, value] of evt.changes.keys.entries()) {
27223
- if (key === "permission") {
27224
- if (value.action === "add" || value.action === "update") {
27225
- const newValue = this.requestUserMap(userId).get("permission");
27226
- this.emit("change", userId, this.resolveFlags(newValue), newValue);
27227
- }
27228
- }
27229
- }
27230
- }
27183
+ var WhiteboardPermissions = class extends import_forge_room3.AbstractApplicationPermissions {
27231
27184
  /**
27232
27185
  * 解析权限列表组合
27233
27186
  * @param {number} value - 权限数字值
@@ -27236,70 +27189,19 @@ var WhiteboardPermissions = class extends import_eventemitter3.default {
27236
27189
  resolveFlags(value) {
27237
27190
  return [WhiteboardPermissionFlag.draw, WhiteboardPermissionFlag.editSelf, WhiteboardPermissionFlag.editOthers, WhiteboardPermissionFlag.deleteSelf, WhiteboardPermissionFlag.deleteOthers, WhiteboardPermissionFlag.mainView, WhiteboardPermissionFlag.setOthersView].filter((v) => (v & value) !== 0);
27238
27191
  }
27239
- /**
27240
- * 获取权限列表组合对应的数值
27241
- * @param { string } userId 不传表示获取自己
27242
- */
27243
- getPermissionValue(userId) {
27244
- return this.requestUserMap(userId ?? this.userManager.selfId).get("permission") ?? 0;
27245
- }
27246
- /**
27247
- * 获取权限列表
27248
- * @param {string=} userId 可选, 不传表示获取自己
27249
- */
27250
- getPermissionFlags(userId) {
27251
- const value = this.requestUserMap(userId ?? this.userManager.selfId).get("permission") ?? 0;
27252
- return this.resolveFlags(value);
27253
- }
27254
- /**
27255
- * 返回对应 userId 是否有相应权限
27256
- * @param {string=} userId 可选, 不传表示返回自己是否有相应权限
27257
- * @param {WhiteboardPermissionFlag} flag
27258
- */
27259
- hasPermission(flag, userId) {
27260
- return ((this.requestUserMap(userId ?? this.userManager.selfId).get("permission") ?? 0) & flag) !== 0;
27261
- }
27262
- /**
27263
- * 添加权限
27264
- * @param {WhiteboardPermissionFlag} flag 权限标记
27265
- * @param {string=} userId 可选, 为 userId 添加权限, 不传表示为自己添加权限
27266
- */
27267
- addPermission(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
- /**
27273
- * 移除权限
27274
- * @param {WhiteboardPermissionFlag} flag 权限标记
27275
- * @param {string=} userId 可选, 为 userId 移除权限, 不传表示为自己移除权限
27276
- */
27277
- removePermission(flag, userId) {
27278
- const userMap = this.requestUserMap(userId ?? this.userManager.selfId);
27279
- const oldValue = userMap.get("permission") ?? 0;
27280
- this.requestUserMap(userId ?? this.userManager.selfId).set("permission", oldValue & ~flag);
27281
- }
27282
- dispose() {
27283
- this.userManager.off("join", this.handleUserJoin);
27284
- this.userManager.off("leave", this.handleUserLeave);
27285
- this.observers.forEach((cb, userId) => {
27286
- this.requestUserMap(userId).unobserve(cb);
27287
- });
27288
- this.observers.clear();
27289
- }
27290
27192
  };
27291
27193
 
27292
27194
  // src/model/renderable/StraightLineModel.ts
27293
27195
  var Y11 = __toESM(require("yjs"), 1);
27294
27196
  var import_lodash7 = __toESM(require_lodash(), 1);
27295
- function _defineProperty16(e, r, t) {
27296
- return (r = _toPropertyKey16(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
27197
+ function _defineProperty15(e, r, t) {
27198
+ return (r = _toPropertyKey15(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
27297
27199
  }
27298
- function _toPropertyKey16(t) {
27299
- var i = _toPrimitive16(t, "string");
27200
+ function _toPropertyKey15(t) {
27201
+ var i = _toPrimitive15(t, "string");
27300
27202
  return "symbol" == typeof i ? i : i + "";
27301
27203
  }
27302
- function _toPrimitive16(t, r) {
27204
+ function _toPrimitive15(t, r) {
27303
27205
  if ("object" != typeof t || !t) return t;
27304
27206
  var e = t[Symbol.toPrimitive];
27305
27207
  if (void 0 !== e) {
@@ -27312,7 +27214,7 @@ function _toPrimitive16(t, r) {
27312
27214
  var StraightLineModel = class extends ElementModel {
27313
27215
  constructor(root, scope) {
27314
27216
  super(root, scope);
27315
- _defineProperty16(this, "item", null);
27217
+ _defineProperty15(this, "item", null);
27316
27218
  if (!this.root.has("type")) {
27317
27219
  this.root.set("type", "line");
27318
27220
  }
@@ -27405,6 +27307,83 @@ var StraightLineModel = class extends ElementModel {
27405
27307
  }
27406
27308
  };
27407
27309
 
27310
+ // src/model/renderable/ImageModel.ts
27311
+ function _defineProperty16(e, r, t) {
27312
+ return (r = _toPropertyKey16(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
27313
+ }
27314
+ function _toPropertyKey16(t) {
27315
+ var i = _toPrimitive16(t, "string");
27316
+ return "symbol" == typeof i ? i : i + "";
27317
+ }
27318
+ function _toPrimitive16(t, r) {
27319
+ if ("object" != typeof t || !t) return t;
27320
+ var e = t[Symbol.toPrimitive];
27321
+ if (void 0 !== e) {
27322
+ var i = e.call(t, r || "default");
27323
+ if ("object" != typeof i) return i;
27324
+ throw new TypeError("@@toPrimitive must return a primitive value.");
27325
+ }
27326
+ return ("string" === r ? String : Number)(t);
27327
+ }
27328
+ var ImageModel = class extends ElementModel {
27329
+ get src() {
27330
+ return this.root.get("src");
27331
+ }
27332
+ constructor(root, scope, imageSets) {
27333
+ super(root, scope);
27334
+ _defineProperty16(this, "item", null);
27335
+ _defineProperty16(this, "imageSets", void 0);
27336
+ this.imageSets = imageSets;
27337
+ if (!this.root.has("type")) {
27338
+ this.root.set("type", "image");
27339
+ }
27340
+ this.root.set(ElementModel.KEYS.shadow, "");
27341
+ }
27342
+ subDispose() {
27343
+ const img = this.imageSets.querySelector(`[id='${this.uuid}']`);
27344
+ if (img) {
27345
+ img.remove();
27346
+ }
27347
+ }
27348
+ createPaperItem() {
27349
+ if (this.item) {
27350
+ return;
27351
+ }
27352
+ if (!this.imageSets.querySelector(`[id='${this.uuid}']`)) {
27353
+ const img = document.createElement("img");
27354
+ img.src = this.src;
27355
+ img.id = this.uuid;
27356
+ this.imageSets.appendChild(img);
27357
+ }
27358
+ this.item = new this.scope.Raster(this.uuid);
27359
+ const matrix = new this.scope.Matrix(this.pointsMatrix);
27360
+ this.item.matrix = matrix;
27361
+ }
27362
+ onVectorUpdate() {
27363
+ const matrix = new this.scope.Matrix(this.pointsMatrix);
27364
+ if (this.item) {
27365
+ this.item.matrix = matrix;
27366
+ }
27367
+ }
27368
+ vectorKeys() {
27369
+ return [];
27370
+ }
27371
+ styleKeys() {
27372
+ return {
27373
+ include: [],
27374
+ exclude: ["dashArray", "strokeColor", "fillColor", "strokeWidth"]
27375
+ };
27376
+ }
27377
+ onStyleKeyUpdate(_key) {
27378
+ }
27379
+ editorConfig() {
27380
+ const cfg = new EditorConfig();
27381
+ cfg.resizeModel = () => "four-corner";
27382
+ cfg.uniformScale = () => true;
27383
+ return cfg;
27384
+ }
27385
+ };
27386
+
27408
27387
  // src/model/RenderableModel.ts
27409
27388
  function _defineProperty17(e, r, t) {
27410
27389
  return (r = _toPropertyKey17(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
@@ -27423,11 +27402,11 @@ function _toPrimitive17(t, r) {
27423
27402
  }
27424
27403
  return ("string" === r ? String : Number)(t);
27425
27404
  }
27426
- var RenderableModel = class extends import_eventemitter32.default {
27405
+ var RenderableModel = class extends import_eventemitter3.default {
27427
27406
  get uuid() {
27428
- return (0, import_uuid.v4)();
27407
+ return (0, import_uuid.v4)().replace(/-/g, "");
27429
27408
  }
27430
- constructor(layerId, shadowEmitter, elements, scope, toolbarModel, userManager, hasPermission) {
27409
+ constructor(layerId, shadowEmitter, elements, scope, toolbarModel, userManager, imageSets, hasPermission) {
27431
27410
  super();
27432
27411
  _defineProperty17(this, "scope", void 0);
27433
27412
  _defineProperty17(this, "toolbarModel", void 0);
@@ -27438,6 +27417,7 @@ var RenderableModel = class extends import_eventemitter32.default {
27438
27417
  _defineProperty17(this, "maxIndex", -1);
27439
27418
  _defineProperty17(this, "hasPermission", void 0);
27440
27419
  _defineProperty17(this, "shadowEmitter", void 0);
27420
+ _defineProperty17(this, "imageSets", void 0);
27441
27421
  _defineProperty17(this, "onElementsChange", (event) => {
27442
27422
  for (const [key, value] of event.changes.keys.entries()) {
27443
27423
  if (value.action === "add") {
@@ -27453,6 +27433,7 @@ var RenderableModel = class extends import_eventemitter32.default {
27453
27433
  }
27454
27434
  }
27455
27435
  });
27436
+ this.imageSets = imageSets;
27456
27437
  this.hasPermission = hasPermission;
27457
27438
  this.shadowEmitter = shadowEmitter;
27458
27439
  this.layerId = layerId;
@@ -27512,6 +27493,8 @@ var RenderableModel = class extends import_eventemitter32.default {
27512
27493
  model = new LaserPointerModel(this.userManager.selfId, yMap, this.scope, (uuid) => {
27513
27494
  this.removeElementItem(uuid);
27514
27495
  });
27496
+ } else if (type === "image") {
27497
+ model = new ImageModel(yMap, this.scope, this.imageSets);
27515
27498
  }
27516
27499
  if (model) {
27517
27500
  model.shadowEmitter = this.shadowEmitter;
@@ -27544,10 +27527,26 @@ var RenderableModel = class extends import_eventemitter32.default {
27544
27527
  confirmPermission() {
27545
27528
  const hasPermission = this.hasPermission(WhiteboardPermissionFlag.draw);
27546
27529
  if (!hasPermission) {
27547
- console.warn("[@netless/forge-whiteboard] no permission to draw");
27530
+ (0, import_forge_room4.log)("[@netless/forge-whiteboard] no permission to draw", {}, "warning");
27548
27531
  }
27549
27532
  return hasPermission;
27550
27533
  }
27534
+ createImage(src) {
27535
+ if (!this.confirmPermission()) {
27536
+ return;
27537
+ }
27538
+ const model = new ImageModel(new Y12.Map(), this.scope, this.imageSets);
27539
+ model.root.set("src", src);
27540
+ const initMatrix = new this.scope.Matrix();
27541
+ const center = this.scope.project.view.center;
27542
+ initMatrix.translate({
27543
+ x: center.x,
27544
+ y: center.y
27545
+ });
27546
+ model.appendPointsMatrix(initMatrix);
27547
+ model.ownerId = this.userManager.selfId;
27548
+ this.addElementToDoc(model.root);
27549
+ }
27551
27550
  createCurve() {
27552
27551
  let shadow = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
27553
27552
  if (!this.confirmPermission()) {
@@ -27674,7 +27673,7 @@ var RenderableModel = class extends import_eventemitter32.default {
27674
27673
  });
27675
27674
  }
27676
27675
  dispose() {
27677
- this.elements.unobserve(this.onElementsChange);
27676
+ (0, import_forge_room4.removeObserver)(this.elements, this.onElementsChange);
27678
27677
  this.elements.clear();
27679
27678
  Array.from(this.elementModels.values()).forEach((model) => {
27680
27679
  model.dispose();
@@ -27987,9 +27986,24 @@ var CurveTool = class extends WhiteboardTool {
27987
27986
  if (this.pointCount > 1024) {
27988
27987
  return;
27989
27988
  }
27989
+ const MIN_DISTANCE = 4;
27990
27990
  if (this.elementModel) {
27991
- this.pointCount += 1;
27992
- this.elementModel.appendPoints([Math.round(event.point.x), Math.round(event.point.y)]);
27991
+ const len = this.elementModel.points.length;
27992
+ let last = {
27993
+ x: 0,
27994
+ y: 0
27995
+ };
27996
+ if (len >= 2) {
27997
+ last = {
27998
+ x: this.elementModel.points[len - 2],
27999
+ y: this.elementModel.points[len - 1]
28000
+ };
28001
+ }
28002
+ const dist = Math.max(Math.abs(last.x - event.point.x), Math.abs(last.y - event.point.y));
28003
+ if (dist >= MIN_DISTANCE) {
28004
+ this.pointCount += 1;
28005
+ this.elementModel.appendPoints([Math.round(event.point.x), Math.round(event.point.y)]);
28006
+ }
27993
28007
  }
27994
28008
  }
27995
28009
  onMouseUp(event) {
@@ -28075,7 +28089,8 @@ var RectangleTool = class extends WhiteboardTool {
28075
28089
  };
28076
28090
 
28077
28091
  // src/model/ToolbarModel.ts
28078
- var import_eventemitter33 = __toESM(require("eventemitter3"), 1);
28092
+ var import_eventemitter32 = __toESM(require("eventemitter3"), 1);
28093
+ var import_forge_room5 = require("@netless/forge-room");
28079
28094
  function _defineProperty21(e, r, t) {
28080
28095
  return (r = _toPropertyKey21(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
28081
28096
  }
@@ -28102,7 +28117,7 @@ var TOOLBAR_KEYS = {
28102
28117
  strokeWidth: "strokeWidth",
28103
28118
  dashArray: "dashArray"
28104
28119
  };
28105
- var ToolbarModel = class extends import_eventemitter33.default {
28120
+ var ToolbarModel = class extends import_eventemitter32.default {
28106
28121
  get currentTool() {
28107
28122
  return this.root.get(TOOLBAR_KEYS.tool);
28108
28123
  }
@@ -28172,7 +28187,7 @@ var ToolbarModel = class extends import_eventemitter33.default {
28172
28187
  });
28173
28188
  }
28174
28189
  dispose() {
28175
- this.root.unobserve(this.handleRootUpdate);
28190
+ (0, import_forge_room5.removeObserver)(this.root, this.handleRootUpdate);
28176
28191
  this.removeAllListeners();
28177
28192
  }
28178
28193
  };
@@ -28260,7 +28275,8 @@ var SelectorTool = class extends WhiteboardTool {
28260
28275
 
28261
28276
  // src/model/SelectElementsModel.ts
28262
28277
  var Y13 = __toESM(require("yjs"), 1);
28263
- var import_eventemitter34 = __toESM(require("eventemitter3"), 1);
28278
+ var import_eventemitter33 = __toESM(require("eventemitter3"), 1);
28279
+ var import_forge_room6 = require("@netless/forge-room");
28264
28280
 
28265
28281
  // src/WhiteboardKeys.ts
28266
28282
  var WhiteboardKeys = {
@@ -28291,7 +28307,7 @@ function _toPrimitive23(t, r) {
28291
28307
  }
28292
28308
  return ("string" === r ? String : Number)(t);
28293
28309
  }
28294
- var SelectElementsModel = class extends import_eventemitter34.default {
28310
+ var SelectElementsModel = class extends import_eventemitter33.default {
28295
28311
  get hasEditSelfPermission() {
28296
28312
  return this.hasPermission(WhiteboardPermissionFlag.editSelf);
28297
28313
  }
@@ -28307,7 +28323,7 @@ var SelectElementsModel = class extends import_eventemitter34.default {
28307
28323
  _defineProperty23(this, "handleUserLeave", (user) => {
28308
28324
  const cb = this.observers.get(user.id);
28309
28325
  if (cb) {
28310
- this.requestUserMap(user.id).unobserveDeep(cb);
28326
+ (0, import_forge_room6.removeDeepObserver)(this.requestUserMap(user.id), cb);
28311
28327
  this.observers.delete(user.id);
28312
28328
  }
28313
28329
  });
@@ -28316,7 +28332,7 @@ var SelectElementsModel = class extends import_eventemitter34.default {
28316
28332
  this.handleUserSelectElementsChange(user.id, evts);
28317
28333
  };
28318
28334
  if (this.observers.has(user.id)) {
28319
- this.requestUserMap(user.id).unobserveDeep(this.observers.get(user.id));
28335
+ (0, import_forge_room6.removeDeepObserver)(this.requestUserMap(user.id), this.observers.get(user.id));
28320
28336
  }
28321
28337
  this.requestUserMap(user.id).observeDeep(observer);
28322
28338
  this.observers.set(user.id, observer);
@@ -28338,7 +28354,7 @@ var SelectElementsModel = class extends import_eventemitter34.default {
28338
28354
  this.handleUserSelectElementsChange(userId, evts);
28339
28355
  };
28340
28356
  if (this.observers.has(userId)) {
28341
- this.requestUserMap(userId).unobserveDeep(this.observers.get(userId));
28357
+ (0, import_forge_room6.removeDeepObserver)(this.requestUserMap(userId), this.observers.get(userId));
28342
28358
  }
28343
28359
  this.requestUserMap(userId).observeDeep(observer);
28344
28360
  this.observers.set(userId, observer);
@@ -28395,7 +28411,7 @@ var SelectElementsModel = class extends import_eventemitter34.default {
28395
28411
  }
28396
28412
  dispose() {
28397
28413
  for (const [key, value] of this.observers.entries()) {
28398
- this.requestUserMap(key).unobserveDeep(value);
28414
+ (0, import_forge_room6.removeDeepObserver)(this.requestUserMap(key), value);
28399
28415
  }
28400
28416
  this.observers.clear();
28401
28417
  this.userManager.off("leave", this.handleUserLeave);
@@ -28404,10 +28420,10 @@ var SelectElementsModel = class extends import_eventemitter34.default {
28404
28420
  };
28405
28421
 
28406
28422
  // src/edit/Editor.ts
28407
- var import_eventemitter36 = __toESM(require("eventemitter3"), 1);
28423
+ var import_eventemitter35 = __toESM(require("eventemitter3"), 1);
28408
28424
 
28409
28425
  // src/edit/TextEditor.ts
28410
- var import_eventemitter35 = require("eventemitter3");
28426
+ var import_eventemitter34 = require("eventemitter3");
28411
28427
  function _defineProperty24(e, r, t) {
28412
28428
  return (r = _toPropertyKey24(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
28413
28429
  }
@@ -28425,7 +28441,7 @@ function _toPrimitive24(t, r) {
28425
28441
  }
28426
28442
  return ("string" === r ? String : Number)(t);
28427
28443
  }
28428
- var TextEditor = class extends import_eventemitter35.EventEmitter {
28444
+ var TextEditor = class extends import_eventemitter34.EventEmitter {
28429
28445
  constructor(camera) {
28430
28446
  super();
28431
28447
  _defineProperty24(this, "rootView", void 0);
@@ -28568,7 +28584,7 @@ var ANCHOR_STYLE = {
28568
28584
  b: "cursor:s-resize;bottom:-3px;left:50%;translate:-50%;",
28569
28585
  br: "cursor:se-resize;bottom:-3px;right:-3px"
28570
28586
  };
28571
- var Bounds = class extends import_eventemitter36.default {
28587
+ var Bounds = class extends import_eventemitter35.default {
28572
28588
  get width() {
28573
28589
  return this.maxX - this.minX;
28574
28590
  }
@@ -28707,7 +28723,7 @@ var Bounds = class extends import_eventemitter36.default {
28707
28723
  this.maxY = maxY;
28708
28724
  }
28709
28725
  };
28710
- var Editor = class extends import_eventemitter36.default {
28726
+ var Editor = class extends import_eventemitter35.default {
28711
28727
  constructor(scope, shadowScope, shadowEmitter, canvasElement, camera, initConfig) {
28712
28728
  super();
28713
28729
  _defineProperty25(this, "rootView", void 0);
@@ -28910,7 +28926,7 @@ var Editor = class extends import_eventemitter36.default {
28910
28926
  this.ctrlId = initConfig.ctrlId;
28911
28927
  this.ctrlNickName = initConfig.ctrlNickName;
28912
28928
  this.rootView = document.createElement("div");
28913
- this.rootView.style.cssText = "position:absolute;display:none;width:100%;height:100%;top:50%;left:50%;transform:translate(-50%,-50%);";
28929
+ this.rootView.style.cssText = "overflow:hidden;position:absolute;display:none;width:100%;height:100%;top:50%;left:50%;transform:translate(-50%,-50%);";
28914
28930
  this.frame = document.createElement("div");
28915
28931
  this.frame.style.position = "absolute";
28916
28932
  this.frame.style.padding = "8px";
@@ -29219,10 +29235,10 @@ var TextTool = class extends WhiteboardTool {
29219
29235
  };
29220
29236
 
29221
29237
  // src/Camera.ts
29222
- var import_eventemitter38 = __toESM(require("eventemitter3"), 1);
29238
+ var import_eventemitter37 = __toESM(require("eventemitter3"), 1);
29223
29239
 
29224
29240
  // src/Gesture.ts
29225
- var import_eventemitter37 = __toESM(require("eventemitter3"), 1);
29241
+ var import_eventemitter36 = __toESM(require("eventemitter3"), 1);
29226
29242
  function _defineProperty27(e, r, t) {
29227
29243
  return (r = _toPropertyKey27(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
29228
29244
  }
@@ -29240,7 +29256,7 @@ function _toPrimitive27(t, r) {
29240
29256
  }
29241
29257
  return ("string" === r ? String : Number)(t);
29242
29258
  }
29243
- var Gesture = class extends import_eventemitter37.default {
29259
+ var Gesture = class extends import_eventemitter36.default {
29244
29260
  constructor(element, scope) {
29245
29261
  super();
29246
29262
  _defineProperty27(this, "element", void 0);
@@ -29304,6 +29320,7 @@ var Gesture = class extends import_eventemitter37.default {
29304
29320
  };
29305
29321
 
29306
29322
  // src/Camera.ts
29323
+ var import_forge_room7 = require("@netless/forge-room");
29307
29324
  function _defineProperty28(e, r, t) {
29308
29325
  return (r = _toPropertyKey28(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
29309
29326
  }
@@ -29321,7 +29338,7 @@ function _toPrimitive28(t, r) {
29321
29338
  }
29322
29339
  return ("string" === r ? String : Number)(t);
29323
29340
  }
29324
- var Camera = class extends import_eventemitter38.default {
29341
+ var Camera = class extends import_eventemitter37.default {
29325
29342
  get inherentMatrix() {
29326
29343
  const inherentMatrix = new this.scope.Matrix();
29327
29344
  inherentMatrix.scale(this.inherentScale, [0, 0]);
@@ -29377,7 +29394,7 @@ var Camera = class extends import_eventemitter38.default {
29377
29394
  _defineProperty28(this, "handleUserLeave", (user) => {
29378
29395
  const cb = this.observers.get(user.id);
29379
29396
  if (cb) {
29380
- this.requestUserMap(user.id).unobserve(cb);
29397
+ (0, import_forge_room7.removeObserver)(this.requestUserMap(user.id), cb);
29381
29398
  }
29382
29399
  });
29383
29400
  _defineProperty28(this, "handleUserJoin", (user) => {
@@ -29385,7 +29402,7 @@ var Camera = class extends import_eventemitter38.default {
29385
29402
  this.handleViewMatrixUpdate(user.id, evt);
29386
29403
  };
29387
29404
  if (this.observers.has(user.id)) {
29388
- this.requestUserMap(user.id).unobserve(observer);
29405
+ (0, import_forge_room7.removeObserver)(this.requestUserMap(user.id), observer);
29389
29406
  }
29390
29407
  this.requestUserMap(user.id).observe(observer);
29391
29408
  this.observers.set(user.id, observer);
@@ -29492,7 +29509,7 @@ var Camera = class extends import_eventemitter38.default {
29492
29509
  this.handleViewMatrixUpdate(userId, evt);
29493
29510
  };
29494
29511
  if (this.observers.has(userId)) {
29495
- this.requestUserMap(userId).unobserve(observer);
29512
+ (0, import_forge_room7.removeObserver)(this.requestUserMap(userId), observer);
29496
29513
  }
29497
29514
  this.requestUserMap(userId).observe(observer);
29498
29515
  this.observers.set(userId, observer);
@@ -29689,10 +29706,10 @@ var Camera = class extends import_eventemitter38.default {
29689
29706
  Array.from(this.observers.keys()).forEach((userId) => {
29690
29707
  const cb = this.observers.get(userId);
29691
29708
  if (cb) {
29692
- this.requestUserMap(userId).unobserve(cb);
29709
+ (0, import_forge_room7.removeObserver)(this.requestUserMap(userId), cb);
29693
29710
  }
29694
29711
  });
29695
- this.whiteboardAttrsMap.unobserve(this.handleMainCameraChange);
29712
+ (0, import_forge_room7.removeObserver)(this.whiteboardAttrsMap, this.handleMainCameraChange);
29696
29713
  this.userManager.off("join", this.handleUserJoin);
29697
29714
  this.userManager.off("leave", this.handleUserLeave);
29698
29715
  this.gesture.removeAllListeners();
@@ -29805,7 +29822,7 @@ var TriangleTool = class extends WhiteboardTool {
29805
29822
  };
29806
29823
 
29807
29824
  // src/Whiteboard.ts
29808
- var import_eventemitter39 = __toESM(require("eventemitter3"), 1);
29825
+ var import_eventemitter38 = __toESM(require("eventemitter3"), 1);
29809
29826
  function _defineProperty31(e, r, t) {
29810
29827
  return (r = _toPropertyKey31(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
29811
29828
  }
@@ -29823,8 +29840,7 @@ function _toPrimitive31(t, r) {
29823
29840
  }
29824
29841
  return ("string" === r ? String : Number)(t);
29825
29842
  }
29826
- var Whiteboard = class extends import_eventemitter39.default {
29827
- // public insertImage!: (src: string) => void;
29843
+ var Whiteboard = class extends import_eventemitter38.default {
29828
29844
  constructor(view) {
29829
29845
  super();
29830
29846
  _defineProperty31(this, "view", void 0);
@@ -29843,6 +29859,7 @@ var Whiteboard = class extends import_eventemitter39.default {
29843
29859
  _defineProperty31(this, "enableCameraBoundaryHighlight", void 0);
29844
29860
  _defineProperty31(this, "getElementAttribute", void 0);
29845
29861
  _defineProperty31(this, "setElementAttribute", void 0);
29862
+ _defineProperty31(this, "removeElement", void 0);
29846
29863
  _defineProperty31(this, "getCurrentTool", void 0);
29847
29864
  _defineProperty31(this, "setCurrentTool", void 0);
29848
29865
  _defineProperty31(this, "setCanvasBackgroundColor", void 0);
@@ -29869,6 +29886,7 @@ var Whiteboard = class extends import_eventemitter39.default {
29869
29886
  _defineProperty31(this, "rasterizeElementsBounds", void 0);
29870
29887
  _defineProperty31(this, "rasterizeMaxBounds", void 0);
29871
29888
  _defineProperty31(this, "setInputType", void 0);
29889
+ _defineProperty31(this, "insertImage", void 0);
29872
29890
  this.view = view;
29873
29891
  }
29874
29892
  };
@@ -29936,7 +29954,8 @@ var EraserTool = class extends WhiteboardTool {
29936
29954
 
29937
29955
  // src/model/TrashedElementsModel.ts
29938
29956
  var Y14 = __toESM(require("yjs"), 1);
29939
- var import_eventemitter310 = __toESM(require("eventemitter3"), 1);
29957
+ var import_eventemitter39 = __toESM(require("eventemitter3"), 1);
29958
+ var import_forge_room8 = require("@netless/forge-room");
29940
29959
  function _defineProperty33(e, r, t) {
29941
29960
  return (r = _toPropertyKey33(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
29942
29961
  }
@@ -29954,7 +29973,7 @@ function _toPrimitive33(t, r) {
29954
29973
  }
29955
29974
  return ("string" === r ? String : Number)(t);
29956
29975
  }
29957
- var TrashedElementsModel = class extends import_eventemitter310.default {
29976
+ var TrashedElementsModel = class extends import_eventemitter39.default {
29958
29977
  get hasDeleteSelfPermission() {
29959
29978
  return this.hasPermission(WhiteboardPermissionFlag.deleteSelf);
29960
29979
  }
@@ -29970,7 +29989,7 @@ var TrashedElementsModel = class extends import_eventemitter310.default {
29970
29989
  _defineProperty33(this, "handleUserLeave", (user) => {
29971
29990
  const cb = this.observers.get(user.id);
29972
29991
  if (cb) {
29973
- this.requestUserMap(user.id).unobserveDeep(cb);
29992
+ (0, import_forge_room8.removeDeepObserver)(this.requestUserMap(user.id), cb);
29974
29993
  }
29975
29994
  });
29976
29995
  _defineProperty33(this, "handleUserJoin", (user) => {
@@ -29978,7 +29997,7 @@ var TrashedElementsModel = class extends import_eventemitter310.default {
29978
29997
  this.handleUserTrashElementsChange(user.id, evts);
29979
29998
  };
29980
29999
  if (this.observers.has(user.id)) {
29981
- this.requestUserMap(user.id).unobserveDeep(this.observers.get(user.id));
30000
+ (0, import_forge_room8.removeDeepObserver)(this.requestUserMap(user.id), this.observers.get(user.id));
29982
30001
  }
29983
30002
  this.requestUserMap(user.id).observeDeep(observer);
29984
30003
  this.observers.set(user.id, observer);
@@ -29992,7 +30011,7 @@ var TrashedElementsModel = class extends import_eventemitter310.default {
29992
30011
  this.handleUserTrashElementsChange(userId, evts);
29993
30012
  };
29994
30013
  if (this.observers.has(userId)) {
29995
- this.requestUserMap(userId).unobserveDeep(this.observers.get(userId));
30014
+ (0, import_forge_room8.removeDeepObserver)(this.requestUserMap(userId), userId);
29996
30015
  }
29997
30016
  this.requestUserMap(userId).observeDeep(observer);
29998
30017
  this.observers.set(userId, observer);
@@ -30049,7 +30068,7 @@ var TrashedElementsModel = class extends import_eventemitter310.default {
30049
30068
  }
30050
30069
  dispose() {
30051
30070
  for (const [key, value] of this.observers.entries()) {
30052
- this.requestUserMap(key).unobserveDeep(value);
30071
+ (0, import_forge_room8.removeDeepObserver)(this.requestUserMap(key), value);
30053
30072
  }
30054
30073
  this.observers.clear();
30055
30074
  this.userManager.off("leave", this.handleUserLeave);
@@ -30106,8 +30125,8 @@ var LaserPointerTool = class extends WhiteboardTool {
30106
30125
  };
30107
30126
 
30108
30127
  // src/model/PageModel.ts
30109
- var import_eventemitter311 = __toESM(require("eventemitter3"), 1);
30110
- var import_forge_room = require("@netless/forge-room");
30128
+ var import_eventemitter310 = __toESM(require("eventemitter3"), 1);
30129
+ var import_forge_room9 = require("@netless/forge-room");
30111
30130
  function _defineProperty35(e, r, t) {
30112
30131
  return (r = _toPropertyKey35(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30113
30132
  }
@@ -30125,7 +30144,7 @@ function _toPrimitive35(t, r) {
30125
30144
  }
30126
30145
  return ("string" === r ? String : Number)(t);
30127
30146
  }
30128
- var PageModel = class extends import_eventemitter311.default {
30147
+ var PageModel = class extends import_eventemitter310.default {
30129
30148
  constructor(whiteboardAttrsMap, userManager, requestUserMap, pageMap, hasPermission) {
30130
30149
  super();
30131
30150
  _defineProperty35(this, "whiteboardAttrsMap", void 0);
@@ -30137,7 +30156,7 @@ var PageModel = class extends import_eventemitter311.default {
30137
30156
  _defineProperty35(this, "handleUserLeave", (user) => {
30138
30157
  const cb = this.observers.get(user.id);
30139
30158
  if (cb) {
30140
- this.requestUserMap(user.id).unobserve(cb);
30159
+ (0, import_forge_room9.removeObserver)(this.requestUserMap(user.id), cb);
30141
30160
  }
30142
30161
  });
30143
30162
  _defineProperty35(this, "handleUserJoin", (user) => {
@@ -30151,7 +30170,7 @@ var PageModel = class extends import_eventemitter311.default {
30151
30170
  if (cameraMode === "main") {
30152
30171
  const targetPage = this.whiteboardAttrsMap.get(WhiteboardKeys.currentPage);
30153
30172
  if (!this.pageMap.has(targetPage) && targetPage !== "_i_") {
30154
- (0, import_forge_room.log)(`main page {${targetPage}} not found.`, {}, "error");
30173
+ (0, import_forge_room9.log)(`main page {${targetPage}} not found.`, {}, "error");
30155
30174
  return;
30156
30175
  }
30157
30176
  this.requestUserMap(this.userManager.selfId).set(WhiteboardKeys.currentPage, targetPage);
@@ -30279,12 +30298,12 @@ var PageModel = class extends import_eventemitter311.default {
30279
30298
  dispose() {
30280
30299
  for (const entry of this.observers.entries()) {
30281
30300
  const [userId, observer] = entry;
30282
- this.requestUserMap(userId).unobserve(observer);
30301
+ (0, import_forge_room9.removeObserver)(this.requestUserMap(userId), observer);
30283
30302
  }
30284
30303
  this.userManager.off("join", this.handleUserJoin);
30285
30304
  this.userManager.off("leave", this.handleUserLeave);
30286
- this.whiteboardAttrsMap.unobserve(this.handleMainPageChange);
30287
- this.pageMap.unobserve(this.handlePageMapChange);
30305
+ (0, import_forge_room9.removeObserver)(this.whiteboardAttrsMap, this.handleMainPageChange);
30306
+ (0, import_forge_room9.removeObserver)(this.pageMap, this.handlePageMapChange);
30288
30307
  }
30289
30308
  };
30290
30309
 
@@ -30298,8 +30317,9 @@ async function waitUntil(fn, timeout) {
30298
30317
  }
30299
30318
 
30300
30319
  // src/IndexedNavigation.ts
30301
- var import_eventemitter312 = __toESM(require("eventemitter3"), 1);
30302
- var import_forge_room2 = require("@netless/forge-room");
30320
+ var import_eventemitter311 = __toESM(require("eventemitter3"), 1);
30321
+ var import_forge_room10 = require("@netless/forge-room");
30322
+ var import_forge_room11 = require("@netless/forge-room");
30303
30323
  function _defineProperty36(e, r, t) {
30304
30324
  return (r = _toPropertyKey36(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30305
30325
  }
@@ -30317,7 +30337,7 @@ function _toPrimitive36(t, r) {
30317
30337
  }
30318
30338
  return ("string" === r ? String : Number)(t);
30319
30339
  }
30320
- var IndexedNavigation = class extends import_eventemitter312.default {
30340
+ var IndexedNavigation = class extends import_eventemitter311.default {
30321
30341
  get idList() {
30322
30342
  return this.pageModel.pageList().filter((id) => /^_i_/.test(id));
30323
30343
  }
@@ -30326,7 +30346,7 @@ var IndexedNavigation = class extends import_eventemitter312.default {
30326
30346
  return this.list[key] && this.list[key].prev === "";
30327
30347
  });
30328
30348
  if (!headId) {
30329
- (0, import_forge_room2.log)("indexed navigation confusion", {
30349
+ (0, import_forge_room10.log)("indexed navigation confusion", {
30330
30350
  list: JSON.stringify(this.list)
30331
30351
  }, "error");
30332
30352
  throw new Error("indexed navigation confusion");
@@ -30428,6 +30448,9 @@ var IndexedNavigation = class extends import_eventemitter312.default {
30428
30448
  const userPageId = this.userMap.get(WhiteboardKeys.currentPage);
30429
30449
  return this.getPageIndex(userPageId);
30430
30450
  }
30451
+ get currentPageId() {
30452
+ return this.userMap.get(WhiteboardKeys.currentPage);
30453
+ }
30431
30454
  getPageIndex(pageId) {
30432
30455
  let i = 0;
30433
30456
  let currentId = this.head;
@@ -30598,9 +30621,7 @@ var IndexedNavigation = class extends import_eventemitter312.default {
30598
30621
  if (this.pageCount <= 1) {
30599
30622
  return this.pageCount;
30600
30623
  }
30601
- const cameraMode = this.userMap.get(WhiteboardKeys.cameraMode);
30602
- if (cameraMode !== "main") {
30603
- console.warn("cannot modify pages in non-main view mode.");
30624
+ if (!this.modifyDetect()) {
30604
30625
  return this.pageCount;
30605
30626
  }
30606
30627
  const targetId = this.getPageId(index);
@@ -30641,14 +30662,14 @@ var IndexedNavigation = class extends import_eventemitter312.default {
30641
30662
  }
30642
30663
  }
30643
30664
  dispose() {
30644
- this.indexedPageMap.unobserve(this.handleIndexedPageMapUpdate);
30665
+ (0, import_forge_room11.removeObserver)(this.indexedPageMap, this.handleIndexedPageMapUpdate);
30645
30666
  this.pageModel.off("switchPage");
30646
30667
  this.pageModel.off("pagesChange");
30647
30668
  }
30648
30669
  };
30649
30670
 
30650
30671
  // src/utils/ShadowEmitter.ts
30651
- var import_eventemitter313 = __toESM(require("eventemitter3"), 1);
30672
+ var import_eventemitter312 = __toESM(require("eventemitter3"), 1);
30652
30673
  function _defineProperty37(e, r, t) {
30653
30674
  return (r = _toPropertyKey37(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30654
30675
  }
@@ -30666,7 +30687,7 @@ function _toPrimitive37(t, r) {
30666
30687
  }
30667
30688
  return ("string" === r ? String : Number)(t);
30668
30689
  }
30669
- var ShadowEmitter = class extends import_eventemitter313.default {
30690
+ var ShadowEmitter = class extends import_eventemitter312.default {
30670
30691
  constructor(userMap) {
30671
30692
  super();
30672
30693
  _defineProperty37(this, "userMap", void 0);
@@ -30833,6 +30854,7 @@ var SequenceExecutor = class {
30833
30854
  };
30834
30855
 
30835
30856
  // src/WhiteboardApplication.ts
30857
+ var import_forge_room13 = require("@netless/forge-room");
30836
30858
  function _defineProperty41(e, r, t) {
30837
30859
  return (r = _toPropertyKey41(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e;
30838
30860
  }
@@ -30851,7 +30873,7 @@ function _toPrimitive41(t, r) {
30851
30873
  return ("string" === r ? String : Number)(t);
30852
30874
  }
30853
30875
  var WHITEBOARD_APP_NAME = "whiteboard";
30854
- var WhiteboardApplication = class extends import_forge_room3.AbstractApplication {
30876
+ var WhiteboardApplication = class extends import_forge_room12.AbstractApplication {
30855
30877
  get undoManager() {
30856
30878
  const page = this.pageModel.getCurrentPage(this.userId);
30857
30879
  if (page) {
@@ -30871,6 +30893,7 @@ var WhiteboardApplication = class extends import_forge_room3.AbstractApplication
30871
30893
  _defineProperty41(this, "pageModel", void 0);
30872
30894
  _defineProperty41(this, "layers", /* @__PURE__ */ new Map());
30873
30895
  _defineProperty41(this, "undoManagers", /* @__PURE__ */ new Map());
30896
+ _defineProperty41(this, "imageSets", document.createElement("div"));
30874
30897
  _defineProperty41(this, "rootElement", document.createElement("div"));
30875
30898
  _defineProperty41(this, "paperScope", new import_paper.default.PaperScope());
30876
30899
  _defineProperty41(this, "canvasElement", document.createElement("canvas"));
@@ -30925,7 +30948,7 @@ var WhiteboardApplication = class extends import_forge_room3.AbstractApplication
30925
30948
  }
30926
30949
  } else {
30927
30950
  console.warn(`[@netless/forge-whiteboard] page ${pageId} not found`);
30928
- (0, import_forge_room3.log)(`[@netless/forge-whiteboard] page ${pageId} not found`, {}, "warning");
30951
+ (0, import_forge_room12.log)(`[@netless/forge-whiteboard] page ${pageId} not found`, {}, "warning");
30929
30952
  }
30930
30953
  await waitUntil(() => this.undoManagers.has(pageId), 1e3);
30931
30954
  if (this.undoManagers.has(pageId)) {
@@ -30937,7 +30960,7 @@ var WhiteboardApplication = class extends import_forge_room3.AbstractApplication
30937
30960
  this.undoManagers.get(pageId).on("stack-item-popped", this.handleStackItemPopped);
30938
30961
  } else {
30939
30962
  console.warn(`[@netless/forge-whiteboard] undo manager for page ${pageId} not found`);
30940
- (0, import_forge_room3.log)(`[@netless/forge-whiteboard] undo manager for page ${pageId} not found`, {}, "warning");
30963
+ (0, import_forge_room12.log)(`[@netless/forge-whiteboard] undo manager for page ${pageId} not found`, {}, "warning");
30941
30964
  }
30942
30965
  this.emitter.emit("redoStackLength", this.undoManager?.redoStack.length ?? 0);
30943
30966
  this.emitter.emit("undoStackLength", this.undoManager?.undoStack.length ?? 0);
@@ -30960,7 +30983,7 @@ var WhiteboardApplication = class extends import_forge_room3.AbstractApplication
30960
30983
  const id = ids[i];
30961
30984
  if (!this.layers.has(id)) {
30962
30985
  const elementsMap = this.getMap(`layer/${id}/elements`);
30963
- const renderableModel = new RenderableModel(id, this.shadowEmitter, elementsMap, this.paperScope, this.toolbarModel, this.userManager, this.hasPermission);
30986
+ const renderableModel = new RenderableModel(id, this.shadowEmitter, elementsMap, this.paperScope, this.toolbarModel, this.userManager, this.imageSets, this.hasPermission);
30964
30987
  this.layers.set(id, renderableModel);
30965
30988
  }
30966
30989
  if (!this.undoManagers.has(id)) {
@@ -31113,10 +31136,14 @@ var WhiteboardApplication = class extends import_forge_room3.AbstractApplication
31113
31136
  this.camera.triggerZoom();
31114
31137
  }
31115
31138
  });
31139
+ window.__wb = this;
31116
31140
  requestAnimationFrameHook(this.paperScope);
31117
31141
  requestAnimationFrameHook(this.shadowScope);
31118
31142
  const that = this;
31119
31143
  this.rootElement.setAttribute("data-forge-app", "whiteboard");
31144
+ this.imageSets.style.display = "none";
31145
+ this.imageSets.setAttribute("data-image-sets", "");
31146
+ this.rootElement.appendChild(this.imageSets);
31120
31147
  document.body.addEventListener("pointerdown", (evt) => {
31121
31148
  this.isPenEvent = evt.pointerType === "pen";
31122
31149
  if (evt.pointerType === "pen" && this.hasPenInput === null) {
@@ -31178,7 +31205,7 @@ var WhiteboardApplication = class extends import_forge_room3.AbstractApplication
31178
31205
  this.emitter.setViewModeToFree = (userId) => {
31179
31206
  if (that.disableViewModelUpdate) {
31180
31207
  console.warn("Operation failed. Perspective mode switching is disabled in the current environment.");
31181
- (0, import_forge_room3.log)("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31208
+ (0, import_forge_room12.log)("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31182
31209
  return;
31183
31210
  }
31184
31211
  const targetId = userId ? this.hasPermission(WhiteboardPermissionFlag.setOthersView) ? userId : null : this.userId;
@@ -31189,7 +31216,7 @@ var WhiteboardApplication = class extends import_forge_room3.AbstractApplication
31189
31216
  this.emitter.setViewModeToFlow = (flowId, userId) => {
31190
31217
  if (that.disableViewModelUpdate) {
31191
31218
  console.warn("Operation failed. Perspective mode switching is disabled in the current environment.");
31192
- (0, import_forge_room3.log)("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31219
+ (0, import_forge_room12.log)("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31193
31220
  return;
31194
31221
  }
31195
31222
  const targetId = userId ? this.hasPermission(WhiteboardPermissionFlag.setOthersView) ? userId : null : this.userId;
@@ -31204,7 +31231,7 @@ var WhiteboardApplication = class extends import_forge_room3.AbstractApplication
31204
31231
  this.emitter.setViewModeToMain = (userId) => {
31205
31232
  if (that.disableViewModelUpdate) {
31206
31233
  console.warn("Operation failed. Perspective mode switching is disabled in the current environment.");
31207
- (0, import_forge_room3.log)("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31234
+ (0, import_forge_room12.log)("Operation failed. Perspective mode switching is disabled in the current environment.", {}, "warning");
31208
31235
  return;
31209
31236
  }
31210
31237
  const targetId = userId ? this.hasPermission(WhiteboardPermissionFlag.setOthersView) ? userId : null : this.userId;
@@ -31216,6 +31243,30 @@ var WhiteboardApplication = class extends import_forge_room3.AbstractApplication
31216
31243
  this.camera.resetViewMatrixToMain();
31217
31244
  }
31218
31245
  };
31246
+ this.emitter.insertImage = (src, pageId) => {
31247
+ if (!/https/.test(src)) {
31248
+ (0, import_forge_room12.log)("[@netless/forge-whiteboard] invalid image url, src needs to be in the HTTPS protocol.", {
31249
+ src
31250
+ }, "warning");
31251
+ return;
31252
+ }
31253
+ let targetPageId = pageId;
31254
+ if (!targetPageId) {
31255
+ targetPageId = this.pageModel.getCurrentPage(this.userManager.selfId);
31256
+ }
31257
+ if (!targetPageId) {
31258
+ (0, import_forge_room12.log)("[@netless/forge-whiteboard] page not found", {}, "warning");
31259
+ return;
31260
+ }
31261
+ this.layers.get(targetPageId)?.createImage(src);
31262
+ };
31263
+ this.emitter.removeElement = (pageId, elementId) => {
31264
+ if (!this.layers.has(pageId)) {
31265
+ (0, import_forge_room12.log)("[@netless/forge-whiteboard] page not found", {}, "warning");
31266
+ return;
31267
+ }
31268
+ this.layers.get(pageId)?.removeElementItem(elementId);
31269
+ };
31219
31270
  this.emitter.getViewModel = (userId) => {
31220
31271
  const targetId = userId ? userId : this.userId;
31221
31272
  return this.userMap(targetId).get(WhiteboardKeys.cameraMode);
@@ -31231,7 +31282,7 @@ var WhiteboardApplication = class extends import_forge_room3.AbstractApplication
31231
31282
  const source = this.getMap(`layer/${sourceId}/elements`);
31232
31283
  const target = this.getMap(`layer/${targetId}/elements`);
31233
31284
  if (!this.layers.has(targetId)) {
31234
- this.layers.set(targetId, new RenderableModel(targetId, this.shadowEmitter, target, this.paperScope, this.toolbarModel, this.userManager, this.hasPermission));
31285
+ this.layers.set(targetId, new RenderableModel(targetId, this.shadowEmitter, target, this.paperScope, this.toolbarModel, this.userManager, this.imageSets, this.hasPermission));
31235
31286
  }
31236
31287
  if (!this.undoManagers.has(targetId)) {
31237
31288
  const undoManager = new Y15.UndoManager(target, {
@@ -31282,7 +31333,7 @@ var WhiteboardApplication = class extends import_forge_room3.AbstractApplication
31282
31333
  this.camera.reset();
31283
31334
  };
31284
31335
  this.emitter.on("error", (errorCode, errorMessage) => {
31285
- (0, import_forge_room3.log)("WhiteboardApplicationError", {
31336
+ (0, import_forge_room12.log)("WhiteboardApplicationError", {
31286
31337
  errorCode,
31287
31338
  errorMessage
31288
31339
  });
@@ -31383,6 +31434,7 @@ var WhiteboardApplication = class extends import_forge_room3.AbstractApplication
31383
31434
  this.permissions = new WhiteboardPermissions(this.userManager, (userId) => {
31384
31435
  return this.userMap(userId);
31385
31436
  });
31437
+ this.permissions.setPermission(WhiteboardPermissionFlag.all);
31386
31438
  this.emitter["permissions"] = this.permissions;
31387
31439
  this.emitter["selfUserId"] = this.userId;
31388
31440
  this.option = option;
@@ -31465,7 +31517,7 @@ var WhiteboardApplication = class extends import_forge_room3.AbstractApplication
31465
31517
  this.paperScope.tool = this.tools[this.toolbarModel.currentTool].tool;
31466
31518
  } else {
31467
31519
  this.paperScope.tool = this.tools["curve"].tool;
31468
- (0, import_forge_room3.log)(`${this.toolbarModel.currentTool} not supported, backup to curve`);
31520
+ (0, import_forge_room12.log)(`${this.toolbarModel.currentTool} not supported, backup to curve`);
31469
31521
  }
31470
31522
  this.selectElementsModel.on("elementsChange", this.handleElementsSelect);
31471
31523
  this.trashedElementsModel.on("elementsChange", this.handleElementsTrash);
@@ -31710,7 +31762,7 @@ var WhiteboardApplication = class extends import_forge_room3.AbstractApplication
31710
31762
  }
31711
31763
  unlink() {
31712
31764
  if (this.linkTarget) {
31713
- this.linkTarget.unobserve(this.handleLinkedMapChange);
31765
+ (0, import_forge_room13.removeObserver)(this.linkTarget, this.handleLinkedMapChange);
31714
31766
  }
31715
31767
  }
31716
31768
  setViewSize(width, height) {