@opentiny/fluent-editor 4.0.0-alpha.11 → 4.0.0-alpha.12

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 (41) hide show
  1. package/es/modules/collaborative-editing/awareness/awareness.es.js +6 -7
  2. package/es/modules/collaborative-editing/awareness/awareness.es.js.map +1 -1
  3. package/es/modules/collaborative-editing/awareness/y-indexeddb.es.js +7 -3
  4. package/es/modules/collaborative-editing/awareness/y-indexeddb.es.js.map +1 -1
  5. package/es/modules/collaborative-editing/collaborative-editing.es.js +13 -8
  6. package/es/modules/collaborative-editing/collaborative-editing.es.js.map +1 -1
  7. package/es/modules/collaborative-editing/provider/providerRegistry.es.js.map +1 -1
  8. package/es/modules/collaborative-editing/provider/webrtc.es.js +8 -4
  9. package/es/modules/collaborative-editing/provider/webrtc.es.js.map +1 -1
  10. package/es/modules/collaborative-editing/provider/websocket.es.js +6 -4
  11. package/es/modules/collaborative-editing/provider/websocket.es.js.map +1 -1
  12. package/es/modules/mind-map/modules/control-panel.es.js +3 -2
  13. package/es/modules/mind-map/modules/control-panel.es.js.map +1 -1
  14. package/lib/modules/collaborative-editing/awareness/awareness.cjs.js +6 -24
  15. package/lib/modules/collaborative-editing/awareness/awareness.cjs.js.map +1 -1
  16. package/lib/modules/collaborative-editing/awareness/y-indexeddb.cjs.js +7 -3
  17. package/lib/modules/collaborative-editing/awareness/y-indexeddb.cjs.js.map +1 -1
  18. package/lib/modules/collaborative-editing/collaborative-editing.cjs.js +19 -31
  19. package/lib/modules/collaborative-editing/collaborative-editing.cjs.js.map +1 -1
  20. package/lib/modules/collaborative-editing/provider/providerRegistry.cjs.js.map +1 -1
  21. package/lib/modules/collaborative-editing/provider/webrtc.cjs.js +10 -23
  22. package/lib/modules/collaborative-editing/provider/webrtc.cjs.js.map +1 -1
  23. package/lib/modules/collaborative-editing/provider/websocket.cjs.js +10 -25
  24. package/lib/modules/collaborative-editing/provider/websocket.cjs.js.map +1 -1
  25. package/lib/modules/mind-map/modules/control-panel.cjs.js +3 -2
  26. package/lib/modules/mind-map/modules/control-panel.cjs.js.map +1 -1
  27. package/package.json +1 -38
  28. package/patches/quill@2.0.3.patch +33 -0
  29. package/scripts/apply-patches.cjs +248 -0
  30. package/types/modules/collaborative-editing/awareness/awareness.d.ts +2 -2
  31. package/types/modules/collaborative-editing/awareness/y-indexeddb.d.ts +3 -2
  32. package/types/modules/collaborative-editing/collaborative-editing.d.ts +4 -3
  33. package/types/modules/collaborative-editing/provider/providerRegistry.d.ts +2 -1
  34. package/types/modules/collaborative-editing/provider/webrtc.d.ts +5 -4
  35. package/types/modules/collaborative-editing/provider/websocket.d.ts +6 -5
  36. package/types/modules/collaborative-editing/types.d.ts +17 -1
  37. package/types/modules/mind-map/options.d.ts +1 -0
  38. package/lib/modules/flow-chart/style/flow-chart.css +0 -185
  39. package/lib/modules/mind-map/style/mind-map.css +0 -224
  40. /package/{es/modules/flow-chart/style/flow-chart.css → flow-chart.css} +0 -0
  41. /package/{es/modules/mind-map/style/mind-map.css → mind-map.css} +0 -0
@@ -1,9 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const yIndexeddb = require("y-indexeddb");
4
- function setupIndexedDB(doc) {
3
+ function setupIndexedDB(doc, IndexeddbPersistenceClass) {
4
+ if (!IndexeddbPersistenceClass) {
5
+ console.warn("[yjs] IndexeddbPersistence not provided, offline support disabled");
6
+ return () => {
7
+ };
8
+ }
5
9
  const fullDbName = `tiny-editor-${doc.guid}`;
6
- new yIndexeddb.IndexeddbPersistence(fullDbName, doc);
10
+ new IndexeddbPersistenceClass(fullDbName, doc);
7
11
  return () => {
8
12
  indexedDB.deleteDatabase(fullDbName);
9
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"y-indexeddb.cjs.js","sources":["../../../../../src/modules/collaborative-editing/awareness/y-indexeddb.ts"],"sourcesContent":["import type { Doc } from 'yjs'\nimport { IndexeddbPersistence } from 'y-indexeddb'\n\nexport function setupIndexedDB(doc: Doc): () => void {\n const fullDbName = `tiny-editor-${doc.guid}`\n\n new IndexeddbPersistence(fullDbName, doc)\n\n return (): void => {\n indexedDB.deleteDatabase(fullDbName)\n }\n}\n"],"names":["IndexeddbPersistence"],"mappings":";;;AAGO,SAAS,eAAe,KAAsB;AACnD,QAAM,aAAa,eAAe,IAAI,IAAI;AAE1C,MAAIA,WAAAA,qBAAqB,YAAY,GAAG;AAExC,SAAO,MAAY;AACjB,cAAU,eAAe,UAAU;AAAA,EACrC;AACF;;"}
1
+ {"version":3,"file":"y-indexeddb.cjs.js","sources":["../../../../../src/modules/collaborative-editing/awareness/y-indexeddb.ts"],"sourcesContent":["import type { IndexeddbPersistence } from 'y-indexeddb'\nimport type * as Y from 'yjs'\n\nexport function setupIndexedDB(doc: Y.Doc, IndexeddbPersistenceClass?: typeof IndexeddbPersistence): () => void {\n if (!IndexeddbPersistenceClass) {\n console.warn('[yjs] IndexeddbPersistence not provided, offline support disabled')\n return () => {}\n }\n\n const fullDbName = `tiny-editor-${doc.guid}`\n\n new IndexeddbPersistenceClass(fullDbName, doc)\n\n return (): void => {\n indexedDB.deleteDatabase(fullDbName)\n }\n}\n"],"names":[],"mappings":";;AAGO,SAAS,eAAe,KAAY,2BAAqE;AAC9G,MAAI,CAAC,2BAA2B;AAC9B,YAAQ,KAAK,mEAAmE;AAChF,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AAEA,QAAM,aAAa,eAAe,IAAI,IAAI;AAE1C,MAAI,0BAA0B,YAAY,GAAG;AAE7C,SAAO,MAAY;AACjB,cAAU,eAAe,UAAU;AAAA,EACrC;AACF;;"}
@@ -3,54 +3,41 @@ var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
6
- const QuillCursors = require("quill-cursors");
7
- const awareness$1 = require("y-protocols/awareness");
8
- const yQuill = require("y-quill");
9
- const Y = require("yjs");
10
6
  require("./awareness/index.cjs.js");
11
7
  const yIndexeddb = require("./awareness/y-indexeddb.cjs.js");
12
8
  const providerRegistry = require("./provider/providerRegistry.cjs.js");
13
9
  const awareness = require("./awareness/awareness.cjs.js");
14
- function _interopNamespaceDefault(e) {
15
- const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
16
- if (e) {
17
- for (const k in e) {
18
- if (k !== "default") {
19
- const d = Object.getOwnPropertyDescriptor(e, k);
20
- Object.defineProperty(n, k, d.get ? d : {
21
- enumerable: true,
22
- get: () => e[k]
23
- });
24
- }
25
- }
26
- }
27
- n.default = e;
28
- return Object.freeze(n);
29
- }
30
- const Y__namespace = /* @__PURE__ */ _interopNamespaceDefault(Y);
31
10
  class CollaborativeEditor {
32
11
  constructor(quill, options) {
33
- __publicField(this, "ydoc", new Y__namespace.Doc());
12
+ __publicField(this, "ydoc");
34
13
  __publicField(this, "provider");
35
14
  __publicField(this, "awareness");
36
15
  __publicField(this, "cursors");
37
16
  __publicField(this, "cleanupBindings", null);
38
17
  __publicField(this, "clearIndexedDB", null);
18
+ __publicField(this, "deps");
39
19
  this.quill = quill;
40
20
  this.options = options;
41
- this.ydoc = this.options.ydoc || new Y__namespace.Doc();
21
+ this.deps = this.options.deps || window;
22
+ const { Y, Awareness, QuillBinding, QuillCursors } = this.deps;
23
+ if (!Y || !Awareness || !QuillBinding || !QuillCursors) {
24
+ throw new Error(
25
+ "Missing required dependencies for collaborative editing. Please provide Y, Awareness, QuillBinding, and QuillCursors in the deps option."
26
+ );
27
+ }
28
+ this.ydoc = this.options.ydoc || new Y.Doc();
42
29
  if (this.options.cursors !== false) {
43
30
  const cursorsOptions = typeof this.options.cursors === "object" ? this.options.cursors : {};
44
31
  this.cursors = new QuillCursors(quill, cursorsOptions);
45
32
  }
46
33
  if (this.options.awareness) {
47
- const awareness$2 = awareness.setupAwareness(this.options.awareness, new awareness$1.Awareness(this.ydoc));
48
- if (!awareness$2) {
34
+ const awareness$1 = awareness.setupAwareness(this.options.awareness, new Awareness(this.ydoc));
35
+ if (!awareness$1) {
49
36
  throw new Error("Failed to initialize awareness");
50
37
  }
51
- this.awareness = awareness$2;
38
+ this.awareness = awareness$1;
52
39
  } else {
53
- this.awareness = new awareness$1.Awareness(this.ydoc);
40
+ this.awareness = new Awareness(this.ydoc);
54
41
  }
55
42
  if (this.options.provider) {
56
43
  const providerConfig = this.options.provider;
@@ -63,7 +50,8 @@ class CollaborativeEditor {
63
50
  onConnect: this.options.onConnect,
64
51
  onDisconnect: this.options.onDisconnect,
65
52
  onError: this.options.onError,
66
- onSyncChange: this.options.onSyncChange
53
+ onSyncChange: this.options.onSyncChange,
54
+ deps: this.deps
67
55
  });
68
56
  this.provider = provider;
69
57
  } catch (error) {
@@ -75,8 +63,8 @@ class CollaborativeEditor {
75
63
  }
76
64
  if (this.provider) {
77
65
  const ytext = this.ydoc.getText("tiny-editor");
78
- this.cleanupBindings = awareness.bindAwarenessToCursors(this.awareness, this.cursors, quill, ytext) || null;
79
- new yQuill.QuillBinding(
66
+ this.cleanupBindings = awareness.bindAwarenessToCursors(this.awareness, this.cursors, quill, ytext, Y) || null;
67
+ new QuillBinding(
80
68
  ytext,
81
69
  this.quill,
82
70
  this.awareness
@@ -85,7 +73,7 @@ class CollaborativeEditor {
85
73
  console.error("Failed to initialize collaborative editor: no valid provider configured");
86
74
  }
87
75
  if (this.options.offline !== false) {
88
- this.clearIndexedDB = yIndexeddb.setupIndexedDB(this.ydoc);
76
+ this.clearIndexedDB = yIndexeddb.setupIndexedDB(this.ydoc, this.deps.IndexeddbPersistence);
89
77
  }
90
78
  }
91
79
  getAwareness() {
@@ -1 +1 @@
1
- {"version":3,"file":"collaborative-editing.cjs.js","sources":["../../../../src/modules/collaborative-editing/collaborative-editing.ts"],"sourcesContent":["import type FluentEditor from '../../fluent-editor'\nimport type { UnifiedProvider } from './provider/providerRegistry'\nimport type { YjsOptions } from './types'\nimport QuillCursors from 'quill-cursors'\nimport { Awareness } from 'y-protocols/awareness'\nimport { QuillBinding } from 'y-quill'\nimport * as Y from 'yjs'\nimport { bindAwarenessToCursors, setupAwareness } from './awareness'\nimport { setupIndexedDB } from './awareness/y-indexeddb'\nimport { createProvider } from './provider/providerRegistry'\n\nexport class CollaborativeEditor {\n private ydoc: Y.Doc = new Y.Doc()\n private provider: UnifiedProvider\n private awareness: Awareness\n private cursors: QuillCursors | null\n private cleanupBindings: (() => void) | null = null\n private clearIndexedDB: (() => void) | null = null\n\n constructor(\n public quill: FluentEditor,\n public options: YjsOptions,\n ) {\n this.ydoc = this.options.ydoc || new Y.Doc()\n\n if (this.options.cursors !== false) {\n const cursorsOptions = typeof this.options.cursors === 'object' ? this.options.cursors : {}\n this.cursors = new QuillCursors(quill, cursorsOptions)\n }\n\n if (this.options.awareness) {\n const awareness = setupAwareness(this.options.awareness, new Awareness(this.ydoc))\n if (!awareness) {\n throw new Error('Failed to initialize awareness')\n }\n this.awareness = awareness\n }\n else {\n this.awareness = new Awareness(this.ydoc)\n }\n\n if (this.options.provider) {\n const providerConfig = this.options.provider\n try {\n const provider = createProvider({\n doc: this.ydoc,\n options: providerConfig.options,\n type: providerConfig.type,\n awareness: this.awareness,\n onConnect: this.options.onConnect,\n onDisconnect: this.options.onDisconnect,\n onError: this.options.onError,\n onSyncChange: this.options.onSyncChange,\n })\n this.provider = provider\n }\n catch (error) {\n console.warn(\n `[yjs] Error creating provider of type ${providerConfig.type}:`,\n error,\n )\n }\n }\n\n if (this.provider) {\n const ytext = this.ydoc.getText('tiny-editor')\n this.cleanupBindings = bindAwarenessToCursors(this.awareness, this.cursors, quill, ytext) || null\n new QuillBinding(\n ytext,\n this.quill,\n this.awareness,\n )\n }\n else {\n console.error('Failed to initialize collaborative editor: no valid provider configured')\n }\n\n if (this.options.offline !== false) {\n this.clearIndexedDB = setupIndexedDB(this.ydoc)\n }\n }\n\n public getAwareness() {\n return this.awareness\n }\n\n public getProvider() {\n return this.provider\n }\n\n public getYDoc() {\n return this.ydoc\n }\n\n get isConnected() {\n return this.provider?.isConnected ?? false\n }\n\n get isSynced() {\n return this.provider?.isSynced ?? false\n }\n\n public getCursors() {\n return this.cursors\n }\n\n public async destroy() {\n this.cleanupBindings?.()\n this.provider?.destroy?.()\n this.cursors?.clearCursors()\n this.awareness?.destroy?.()\n this.clearIndexedDB?.()\n this.ydoc?.destroy?.()\n }\n}\n"],"names":["Y","awareness","setupAwareness","Awareness","createProvider","bindAwarenessToCursors","QuillBinding","setupIndexedDB"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,MAAM,oBAAoB;AAAA,EAQ/B,YACS,OACA,SACP;AAVM,gCAAc,IAAIA,aAAE,IAAA;AACpB;AACA;AACA;AACA,2CAAuC;AACvC,0CAAsC;AAGrC,SAAA,QAAA;AACA,SAAA,UAAA;AAEP,SAAK,OAAO,KAAK,QAAQ,QAAQ,IAAIA,aAAE,IAAA;AAEvC,QAAI,KAAK,QAAQ,YAAY,OAAO;AAClC,YAAM,iBAAiB,OAAO,KAAK,QAAQ,YAAY,WAAW,KAAK,QAAQ,UAAU,CAAA;AACzF,WAAK,UAAU,IAAI,aAAa,OAAO,cAAc;AAAA,IACvD;AAEA,QAAI,KAAK,QAAQ,WAAW;AAC1B,YAAMC,cAAYC,yBAAe,KAAK,QAAQ,WAAW,IAAIC,YAAAA,UAAU,KAAK,IAAI,CAAC;AACjF,UAAI,CAACF,aAAW;AACd,cAAM,IAAI,MAAM,gCAAgC;AAAA,MAClD;AACA,WAAK,YAAYA;AAAAA,IACnB,OACK;AACH,WAAK,YAAY,IAAIE,sBAAU,KAAK,IAAI;AAAA,IAC1C;AAEA,QAAI,KAAK,QAAQ,UAAU;AACzB,YAAM,iBAAiB,KAAK,QAAQ;AACpC,UAAI;AACF,cAAM,WAAWC,iBAAAA,eAAe;AAAA,UAC9B,KAAK,KAAK;AAAA,UACV,SAAS,eAAe;AAAA,UACxB,MAAM,eAAe;AAAA,UACrB,WAAW,KAAK;AAAA,UAChB,WAAW,KAAK,QAAQ;AAAA,UACxB,cAAc,KAAK,QAAQ;AAAA,UAC3B,SAAS,KAAK,QAAQ;AAAA,UACtB,cAAc,KAAK,QAAQ;AAAA,QAAA,CAC5B;AACD,aAAK,WAAW;AAAA,MAClB,SACO,OAAO;AACZ,gBAAQ;AAAA,UACN,yCAAyC,eAAe,IAAI;AAAA,UAC5D;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AAEA,QAAI,KAAK,UAAU;AACjB,YAAM,QAAQ,KAAK,KAAK,QAAQ,aAAa;AAC7C,WAAK,kBAAkBC,UAAAA,uBAAuB,KAAK,WAAW,KAAK,SAAS,OAAO,KAAK,KAAK;AAC7F,UAAIC,OAAAA;AAAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MAAA;AAAA,IAET,OACK;AACH,cAAQ,MAAM,yEAAyE;AAAA,IACzF;AAEA,QAAI,KAAK,QAAQ,YAAY,OAAO;AAClC,WAAK,iBAAiBC,0BAAe,KAAK,IAAI;AAAA,IAChD;AAAA,EACF;AAAA,EAEO,eAAe;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,cAAc;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,UAAU;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,cAAc;;AAChB,aAAO,UAAK,aAAL,mBAAe,gBAAe;AAAA,EACvC;AAAA,EAEA,IAAI,WAAW;;AACb,aAAO,UAAK,aAAL,mBAAe,aAAY;AAAA,EACpC;AAAA,EAEO,aAAa;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,UAAU;;AACrB,eAAK,oBAAL;AACA,qBAAK,aAAL,mBAAe,YAAf;AACA,eAAK,YAAL,mBAAc;AACd,qBAAK,cAAL,mBAAgB,YAAhB;AACA,eAAK,mBAAL;AACA,qBAAK,SAAL,mBAAW,YAAX;AAAA,EACF;AACF;;"}
1
+ {"version":3,"file":"collaborative-editing.cjs.js","sources":["../../../../src/modules/collaborative-editing/collaborative-editing.ts"],"sourcesContent":["import type QuillCursors from 'quill-cursors'\nimport type { Awareness } from 'y-protocols/awareness'\nimport type * as Y from 'yjs'\nimport type FluentEditor from '../../fluent-editor'\nimport type { UnifiedProvider } from './provider/providerRegistry'\nimport type { CollaborativeEditingDeps, YjsOptions } from './types'\nimport { bindAwarenessToCursors, setupAwareness } from './awareness'\nimport { setupIndexedDB } from './awareness/y-indexeddb'\nimport { createProvider } from './provider/providerRegistry'\n\nexport class CollaborativeEditor {\n private ydoc: Y.Doc\n private provider: UnifiedProvider\n private awareness: Awareness\n private cursors: QuillCursors | null\n private cleanupBindings: (() => void) | null = null\n private clearIndexedDB: (() => void) | null = null\n private deps: CollaborativeEditingDeps\n\n constructor(\n public quill: FluentEditor,\n public options: YjsOptions,\n ) {\n this.deps = this.options.deps || (window as any)\n const { Y, Awareness, QuillBinding, QuillCursors } = this.deps\n\n if (!Y || !Awareness || !QuillBinding || !QuillCursors) {\n throw new Error(\n 'Missing required dependencies for collaborative editing. '\n + 'Please provide Y, Awareness, QuillBinding, and QuillCursors in the deps option.',\n )\n }\n\n this.ydoc = this.options.ydoc || new Y.Doc()\n\n if (this.options.cursors !== false) {\n const cursorsOptions = typeof this.options.cursors === 'object' ? this.options.cursors : {}\n this.cursors = new QuillCursors(quill, cursorsOptions)\n }\n\n if (this.options.awareness) {\n const awareness = setupAwareness(this.options.awareness, new Awareness(this.ydoc))\n if (!awareness) {\n throw new Error('Failed to initialize awareness')\n }\n this.awareness = awareness\n }\n else {\n this.awareness = new Awareness(this.ydoc)\n }\n\n if (this.options.provider) {\n const providerConfig = this.options.provider\n try {\n const provider = createProvider({\n doc: this.ydoc,\n options: providerConfig.options,\n type: providerConfig.type,\n awareness: this.awareness,\n onConnect: this.options.onConnect,\n onDisconnect: this.options.onDisconnect,\n onError: this.options.onError,\n onSyncChange: this.options.onSyncChange,\n deps: this.deps,\n })\n this.provider = provider\n }\n catch (error) {\n console.warn(\n `[yjs] Error creating provider of type ${providerConfig.type}:`,\n error,\n )\n }\n }\n\n if (this.provider) {\n const ytext = this.ydoc.getText('tiny-editor')\n this.cleanupBindings = bindAwarenessToCursors(this.awareness, this.cursors, quill, ytext, Y) || null\n new QuillBinding(\n ytext,\n this.quill,\n this.awareness,\n )\n }\n else {\n console.error('Failed to initialize collaborative editor: no valid provider configured')\n }\n\n if (this.options.offline !== false) {\n this.clearIndexedDB = setupIndexedDB(this.ydoc, this.deps.IndexeddbPersistence)\n }\n }\n\n public getAwareness() {\n return this.awareness\n }\n\n public getProvider() {\n return this.provider\n }\n\n public getYDoc() {\n return this.ydoc\n }\n\n get isConnected() {\n return this.provider?.isConnected ?? false\n }\n\n get isSynced() {\n return this.provider?.isSynced ?? false\n }\n\n public getCursors() {\n return this.cursors\n }\n\n public async destroy() {\n this.cleanupBindings?.()\n this.provider?.destroy?.()\n this.cursors?.clearCursors()\n this.awareness?.destroy?.()\n this.clearIndexedDB?.()\n this.ydoc?.destroy?.()\n }\n}\n"],"names":["awareness","setupAwareness","createProvider","bindAwarenessToCursors","setupIndexedDB"],"mappings":";;;;;;;;;AAUO,MAAM,oBAAoB;AAAA,EAS/B,YACS,OACA,SACP;AAXM;AACA;AACA;AACA;AACA,2CAAuC;AACvC,0CAAsC;AACtC;AAGC,SAAA,QAAA;AACA,SAAA,UAAA;AAEP,SAAK,OAAO,KAAK,QAAQ,QAAS;AAClC,UAAM,EAAE,GAAG,WAAW,cAAc,aAAA,IAAiB,KAAK;AAE1D,QAAI,CAAC,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,cAAc;AACtD,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAGJ;AAEA,SAAK,OAAO,KAAK,QAAQ,QAAQ,IAAI,EAAE,IAAA;AAEvC,QAAI,KAAK,QAAQ,YAAY,OAAO;AAClC,YAAM,iBAAiB,OAAO,KAAK,QAAQ,YAAY,WAAW,KAAK,QAAQ,UAAU,CAAA;AACzF,WAAK,UAAU,IAAI,aAAa,OAAO,cAAc;AAAA,IACvD;AAEA,QAAI,KAAK,QAAQ,WAAW;AAC1B,YAAMA,cAAYC,yBAAe,KAAK,QAAQ,WAAW,IAAI,UAAU,KAAK,IAAI,CAAC;AACjF,UAAI,CAACD,aAAW;AACd,cAAM,IAAI,MAAM,gCAAgC;AAAA,MAClD;AACA,WAAK,YAAYA;AAAAA,IACnB,OACK;AACH,WAAK,YAAY,IAAI,UAAU,KAAK,IAAI;AAAA,IAC1C;AAEA,QAAI,KAAK,QAAQ,UAAU;AACzB,YAAM,iBAAiB,KAAK,QAAQ;AACpC,UAAI;AACF,cAAM,WAAWE,iBAAAA,eAAe;AAAA,UAC9B,KAAK,KAAK;AAAA,UACV,SAAS,eAAe;AAAA,UACxB,MAAM,eAAe;AAAA,UACrB,WAAW,KAAK;AAAA,UAChB,WAAW,KAAK,QAAQ;AAAA,UACxB,cAAc,KAAK,QAAQ;AAAA,UAC3B,SAAS,KAAK,QAAQ;AAAA,UACtB,cAAc,KAAK,QAAQ;AAAA,UAC3B,MAAM,KAAK;AAAA,QAAA,CACZ;AACD,aAAK,WAAW;AAAA,MAClB,SACO,OAAO;AACZ,gBAAQ;AAAA,UACN,yCAAyC,eAAe,IAAI;AAAA,UAC5D;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AAEA,QAAI,KAAK,UAAU;AACjB,YAAM,QAAQ,KAAK,KAAK,QAAQ,aAAa;AAC7C,WAAK,kBAAkBC,iCAAuB,KAAK,WAAW,KAAK,SAAS,OAAO,OAAO,CAAC,KAAK;AAChG,UAAI;AAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MAAA;AAAA,IAET,OACK;AACH,cAAQ,MAAM,yEAAyE;AAAA,IACzF;AAEA,QAAI,KAAK,QAAQ,YAAY,OAAO;AAClC,WAAK,iBAAiBC,0BAAe,KAAK,MAAM,KAAK,KAAK,oBAAoB;AAAA,IAChF;AAAA,EACF;AAAA,EAEO,eAAe;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,cAAc;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,UAAU;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,cAAc;;AAChB,aAAO,UAAK,aAAL,mBAAe,gBAAe;AAAA,EACvC;AAAA,EAEA,IAAI,WAAW;;AACb,aAAO,UAAK,aAAL,mBAAe,aAAY;AAAA,EACpC;AAAA,EAEO,aAAa;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,UAAU;;AACrB,eAAK,oBAAL;AACA,qBAAK,aAAL,mBAAe,YAAf;AACA,eAAK,YAAL,mBAAc;AACd,qBAAK,cAAL,mBAAgB,YAAhB;AACA,eAAK,mBAAL;AACA,qBAAK,SAAL,mBAAW,YAAX;AAAA,EACF;AACF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"providerRegistry.cjs.js","sources":["../../../../../src/modules/collaborative-editing/provider/providerRegistry.ts"],"sourcesContent":["import type { Awareness } from 'y-protocols/awareness'\nimport type * as Y from 'yjs'\nimport type { ProviderEventHandlers } from '../types'\nimport { WebRTCProviderWrapper } from './webrtc'\nimport { WebsocketProviderWrapper } from './websocket'\n\nexport type ProviderRegistry = Record<string, ProviderConstructor>\n\nexport type ProviderConstructor<T = any> = new (\n props: ProviderConstructorProps<T>\n) => UnifiedProvider\n\nexport type ProviderConstructorProps<T = any> = {\n options: T\n awareness?: Awareness\n doc?: Y.Doc\n} & ProviderEventHandlers\n\nexport interface UnifiedProvider extends ProviderEventHandlers {\n awareness: Awareness\n document: Y.Doc\n type: 'webrtc' | 'websocket' | string\n connect: () => void\n destroy: () => void\n disconnect: () => void\n isConnected: boolean\n isSynced: boolean\n}\n\nconst providerRegistry: ProviderRegistry = {\n websocket: WebsocketProviderWrapper,\n webrtc: WebRTCProviderWrapper,\n}\n\nexport function registerProviderType<T>(type: string, providerClass: ProviderConstructor<T>) {\n providerRegistry[type as string]\n = providerClass as ProviderConstructor\n}\n\nexport function getProviderClass(type: string): ProviderConstructor | undefined {\n return providerRegistry[type]\n}\n\nexport function createProvider({\n type,\n ...props\n}: ProviderConstructorProps & {\n type: string\n}) {\n const ProviderClass = getProviderClass(type)\n\n if (!ProviderClass) {\n throw new Error(`Provider type \"${type}\" not found in registry`)\n }\n\n return new ProviderClass(props)\n}\n"],"names":["WebsocketProviderWrapper","WebRTCProviderWrapper"],"mappings":";;;;AA6BA,MAAM,mBAAqC;AAAA,EACzC,WAAWA,UAAAA;AAAAA,EACX,QAAQC,OAAAA;AACV;AAEO,SAAS,qBAAwB,MAAc,eAAuC;AAC3F,mBAAiB,IAAc,IAC3B;AACN;AAEO,SAAS,iBAAiB,MAA+C;AAC9E,SAAO,iBAAiB,IAAI;AAC9B;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,GAAG;AACL,GAEG;AACD,QAAM,gBAAgB,iBAAiB,IAAI;AAE3C,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,kBAAkB,IAAI,yBAAyB;AAAA,EACjE;AAEA,SAAO,IAAI,cAAc,KAAK;AAChC;;;;"}
1
+ {"version":3,"file":"providerRegistry.cjs.js","sources":["../../../../../src/modules/collaborative-editing/provider/providerRegistry.ts"],"sourcesContent":["import type { Awareness } from 'y-protocols/awareness'\nimport type * as Y from 'yjs'\nimport type { CollaborativeEditingDeps, ProviderEventHandlers } from '../types'\nimport { WebRTCProviderWrapper } from './webrtc'\nimport { WebsocketProviderWrapper } from './websocket'\n\nexport type ProviderRegistry = Record<string, ProviderConstructor>\n\nexport type ProviderConstructor<T = any> = new (\n props: ProviderConstructorProps<T>\n) => UnifiedProvider\n\nexport type ProviderConstructorProps<T = any> = {\n options: T\n awareness?: Awareness\n doc?: Y.Doc\n deps?: CollaborativeEditingDeps\n} & ProviderEventHandlers\n\nexport interface UnifiedProvider extends ProviderEventHandlers {\n awareness: Awareness\n document: Y.Doc\n type: 'webrtc' | 'websocket' | string\n connect: () => void\n destroy: () => void\n disconnect: () => void\n isConnected: boolean\n isSynced: boolean\n}\n\nconst providerRegistry: ProviderRegistry = {\n websocket: WebsocketProviderWrapper,\n webrtc: WebRTCProviderWrapper,\n}\n\nexport function registerProviderType<T>(type: string, providerClass: ProviderConstructor<T>) {\n providerRegistry[type as string]\n = providerClass as ProviderConstructor\n}\n\nexport function getProviderClass(type: string): ProviderConstructor | undefined {\n return providerRegistry[type]\n}\n\nexport function createProvider({\n type,\n ...props\n}: ProviderConstructorProps & {\n type: string\n}) {\n const ProviderClass = getProviderClass(type)\n\n if (!ProviderClass) {\n throw new Error(`Provider type \"${type}\" not found in registry`)\n }\n\n return new ProviderClass(props)\n}\n"],"names":["WebsocketProviderWrapper","WebRTCProviderWrapper"],"mappings":";;;;AA8BA,MAAM,mBAAqC;AAAA,EACzC,WAAWA,UAAAA;AAAAA,EACX,QAAQC,OAAAA;AACV;AAEO,SAAS,qBAAwB,MAAc,eAAuC;AAC3F,mBAAiB,IAAc,IAC3B;AACN;AAEO,SAAS,iBAAiB,MAA+C;AAC9E,SAAO,iBAAiB,IAAI;AAC9B;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,GAAG;AACL,GAEG;AACD,QAAM,gBAAgB,iBAAiB,IAAI;AAE3C,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,kBAAkB,IAAI,yBAAyB;AAAA,EACjE;AAEA,SAAO,IAAI,cAAc,KAAK;AAChC;;;;"}
@@ -3,25 +3,6 @@ var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
6
- const yWebrtc = require("y-webrtc");
7
- const Y = require("yjs");
8
- function _interopNamespaceDefault(e) {
9
- const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
10
- if (e) {
11
- for (const k in e) {
12
- if (k !== "default") {
13
- const d = Object.getOwnPropertyDescriptor(e, k);
14
- Object.defineProperty(n, k, d.get ? d : {
15
- enumerable: true,
16
- get: () => e[k]
17
- });
18
- }
19
- }
20
- }
21
- n.default = e;
22
- return Object.freeze(n);
23
- }
24
- const Y__namespace = /* @__PURE__ */ _interopNamespaceDefault(Y);
25
6
  class WebRTCProviderWrapper {
26
7
  constructor({
27
8
  awareness,
@@ -30,7 +11,8 @@ class WebRTCProviderWrapper {
30
11
  onConnect,
31
12
  onDisconnect,
32
13
  onError,
33
- onSyncChange
14
+ onSyncChange,
15
+ deps
34
16
  }) {
35
17
  __publicField(this, "provider");
36
18
  __publicField(this, "_isConnected", false);
@@ -69,10 +51,15 @@ class WebRTCProviderWrapper {
69
51
  this.onDisconnect = onDisconnect;
70
52
  this.onError = onError;
71
53
  this.onSyncChange = onSyncChange;
72
- this.document = doc || new Y__namespace.Doc();
54
+ const { Y, Awareness, WebrtcProvider } = deps || window;
55
+ if (!WebrtcProvider) {
56
+ throw new Error("WebrtcProvider dependency not provided");
57
+ }
58
+ this.document = doc || new Y.Doc();
59
+ this.awareness = awareness ?? new Awareness(this.document);
73
60
  try {
74
- this.provider = new yWebrtc.WebrtcProvider(options.roomName, this.document, {
75
- awareness,
61
+ this.provider = new WebrtcProvider(options.roomName, this.document, {
62
+ awareness: this.awareness,
76
63
  ...options
77
64
  });
78
65
  this.provider.on("status", (status) => {
@@ -1 +1 @@
1
- {"version":3,"file":"webrtc.cjs.js","sources":["../../../../../src/modules/collaborative-editing/provider/webrtc.ts"],"sourcesContent":["import type { Awareness } from 'y-protocols/awareness'\nimport type { ProviderEventHandlers } from '../types'\nimport type { UnifiedProvider } from './providerRegistry'\nimport { WebrtcProvider } from 'y-webrtc'\nimport * as Y from 'yjs'\n\nexport interface WebRTCProviderOptions {\n roomName: string\n filterBcConns?: boolean\n maxConns?: number\n password?: string\n peerOpts?: Record<string, unknown>\n signaling?: string[]\n}\n\nexport class WebRTCProviderWrapper implements UnifiedProvider {\n private provider: WebrtcProvider\n private _isConnected = false\n private _isSynced = false\n\n onConnect?: () => void\n onDisconnect?: () => void\n onError?: (error: Error) => void\n onSyncChange?: (isSynced: boolean) => void\n\n document: Y.Doc\n awareness: Awareness\n type: 'webrtc'\n\n connect = () => {\n try {\n this.provider.connect()\n }\n catch (error) {\n console.warn('[yjs] Error connecting WebRTC provider:', error)\n }\n }\n\n destroy = () => {\n try {\n this.provider.destroy()\n }\n catch (error) {\n console.warn('[yjs] Error destroying WebRTC provider:', error)\n }\n }\n\n disconnect = () => {\n try {\n this.provider.disconnect()\n this._isConnected = false\n this._isSynced = false\n }\n catch (error) {\n console.warn('[yjs] Error disconnecting WebRTC provider:', error)\n }\n }\n\n constructor({\n awareness,\n doc,\n options,\n onConnect,\n onDisconnect,\n onError,\n onSyncChange,\n }: {\n options: WebRTCProviderOptions\n awareness?: Awareness\n doc?: Y.Doc\n } & ProviderEventHandlers) {\n this.onConnect = onConnect\n this.onDisconnect = onDisconnect\n this.onError = onError\n this.onSyncChange = onSyncChange\n\n this.document = doc || new Y.Doc()\n try {\n this.provider = new WebrtcProvider(options.roomName, this.document, {\n awareness,\n ...options,\n })\n\n this.provider.on('status', (status: { connected: boolean }) => {\n const wasConnected = this._isConnected\n this._isConnected = status.connected\n if (status.connected) {\n if (!wasConnected) {\n this.onConnect?.()\n }\n if (!this._isSynced) {\n this._isSynced = true\n this.onSyncChange?.(true)\n }\n }\n else {\n if (wasConnected) {\n this.onDisconnect?.()\n\n if (this._isSynced) {\n this._isSynced = false\n this.onSyncChange?.(false)\n }\n }\n }\n })\n }\n catch (error) {\n console.warn('[yjs] Error creating WebRTC provider:', error)\n onError?.(error instanceof Error ? error : new Error(String(error)))\n }\n }\n\n get isConnected() {\n return this._isConnected\n }\n\n get isSynced() {\n return this._isSynced\n }\n\n getProvider() {\n return this.provider\n }\n}\n"],"names":["Y","WebrtcProvider"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAeO,MAAM,sBAAiD;AAAA,EA2C5D,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAKyB;AAtDnB;AACA,wCAAe;AACf,qCAAY;AAEpB;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA,mCAAU,MAAM;AACd,UAAI;AACF,aAAK,SAAS,QAAA;AAAA,MAChB,SACO,OAAO;AACZ,gBAAQ,KAAK,2CAA2C,KAAK;AAAA,MAC/D;AAAA,IACF;AAEA,mCAAU,MAAM;AACd,UAAI;AACF,aAAK,SAAS,QAAA;AAAA,MAChB,SACO,OAAO;AACZ,gBAAQ,KAAK,2CAA2C,KAAK;AAAA,MAC/D;AAAA,IACF;AAEA,sCAAa,MAAM;AACjB,UAAI;AACF,aAAK,SAAS,WAAA;AACd,aAAK,eAAe;AACpB,aAAK,YAAY;AAAA,MACnB,SACO,OAAO;AACZ,gBAAQ,KAAK,8CAA8C,KAAK;AAAA,MAClE;AAAA,IACF;AAeE,SAAK,YAAY;AACjB,SAAK,eAAe;AACpB,SAAK,UAAU;AACf,SAAK,eAAe;AAEpB,SAAK,WAAW,OAAO,IAAIA,aAAE,IAAA;AAC7B,QAAI;AACF,WAAK,WAAW,IAAIC,QAAAA,eAAe,QAAQ,UAAU,KAAK,UAAU;AAAA,QAClE;AAAA,QACA,GAAG;AAAA,MAAA,CACJ;AAED,WAAK,SAAS,GAAG,UAAU,CAAC,WAAmC;;AAC7D,cAAM,eAAe,KAAK;AAC1B,aAAK,eAAe,OAAO;AAC3B,YAAI,OAAO,WAAW;AACpB,cAAI,CAAC,cAAc;AACjB,uBAAK,cAAL;AAAA,UACF;AACA,cAAI,CAAC,KAAK,WAAW;AACnB,iBAAK,YAAY;AACjB,uBAAK,iBAAL,8BAAoB;AAAA,UACtB;AAAA,QACF,OACK;AACH,cAAI,cAAc;AAChB,uBAAK,iBAAL;AAEA,gBAAI,KAAK,WAAW;AAClB,mBAAK,YAAY;AACjB,yBAAK,iBAAL,8BAAoB;AAAA,YACtB;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SACO,OAAO;AACZ,cAAQ,KAAK,yCAAyC,KAAK;AAC3D,yCAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AACF;;"}
1
+ {"version":3,"file":"webrtc.cjs.js","sources":["../../../../../src/modules/collaborative-editing/provider/webrtc.ts"],"sourcesContent":["import type { Awareness } from 'y-protocols/awareness'\nimport type { WebrtcProvider } from 'y-webrtc'\nimport type * as Y from 'yjs'\nimport type { CollaborativeEditingDeps, ProviderEventHandlers } from '../types'\nimport type { UnifiedProvider } from './providerRegistry'\n\nexport interface WebRTCProviderOptions {\n roomName: string\n filterBcConns?: boolean\n maxConns?: number\n password?: string\n peerOpts?: Record<string, unknown>\n signaling?: string[]\n}\n\nexport class WebRTCProviderWrapper implements UnifiedProvider {\n private provider: WebrtcProvider\n private _isConnected = false\n private _isSynced = false\n\n onConnect?: () => void\n onDisconnect?: () => void\n onError?: (error: Error) => void\n onSyncChange?: (isSynced: boolean) => void\n\n document: Y.Doc\n awareness: Awareness\n type: 'webrtc'\n\n connect = () => {\n try {\n this.provider.connect()\n }\n catch (error) {\n console.warn('[yjs] Error connecting WebRTC provider:', error)\n }\n }\n\n destroy = () => {\n try {\n this.provider.destroy()\n }\n catch (error) {\n console.warn('[yjs] Error destroying WebRTC provider:', error)\n }\n }\n\n disconnect = () => {\n try {\n this.provider.disconnect()\n this._isConnected = false\n this._isSynced = false\n }\n catch (error) {\n console.warn('[yjs] Error disconnecting WebRTC provider:', error)\n }\n }\n\n constructor({\n awareness,\n doc,\n options,\n onConnect,\n onDisconnect,\n onError,\n onSyncChange,\n deps,\n }: {\n options: WebRTCProviderOptions\n awareness?: Awareness\n doc?: Y.Doc\n deps?: CollaborativeEditingDeps\n } & ProviderEventHandlers) {\n this.onConnect = onConnect\n this.onDisconnect = onDisconnect\n this.onError = onError\n this.onSyncChange = onSyncChange\n\n const { Y, Awareness, WebrtcProvider } = deps || (window as any)\n\n if (!WebrtcProvider) {\n throw new Error('WebrtcProvider dependency not provided')\n }\n\n this.document = doc || new Y.Doc()\n this.awareness = awareness ?? new Awareness(this.document)\n try {\n this.provider = new WebrtcProvider(options.roomName, this.document, {\n awareness: this.awareness,\n ...options,\n })\n\n this.provider.on('status', (status: { connected: boolean }) => {\n const wasConnected = this._isConnected\n this._isConnected = status.connected\n if (status.connected) {\n if (!wasConnected) {\n this.onConnect?.()\n }\n if (!this._isSynced) {\n this._isSynced = true\n this.onSyncChange?.(true)\n }\n }\n else {\n if (wasConnected) {\n this.onDisconnect?.()\n\n if (this._isSynced) {\n this._isSynced = false\n this.onSyncChange?.(false)\n }\n }\n }\n })\n }\n catch (error) {\n console.warn('[yjs] Error creating WebRTC provider:', error)\n onError?.(error instanceof Error ? error : new Error(String(error)))\n }\n }\n\n get isConnected() {\n return this._isConnected\n }\n\n get isSynced() {\n return this._isSynced\n }\n\n getProvider() {\n return this.provider\n }\n}\n"],"names":[],"mappings":";;;;;AAeO,MAAM,sBAAiD;AAAA,EA2C5D,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAMyB;AAxDnB;AACA,wCAAe;AACf,qCAAY;AAEpB;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA,mCAAU,MAAM;AACd,UAAI;AACF,aAAK,SAAS,QAAA;AAAA,MAChB,SACO,OAAO;AACZ,gBAAQ,KAAK,2CAA2C,KAAK;AAAA,MAC/D;AAAA,IACF;AAEA,mCAAU,MAAM;AACd,UAAI;AACF,aAAK,SAAS,QAAA;AAAA,MAChB,SACO,OAAO;AACZ,gBAAQ,KAAK,2CAA2C,KAAK;AAAA,MAC/D;AAAA,IACF;AAEA,sCAAa,MAAM;AACjB,UAAI;AACF,aAAK,SAAS,WAAA;AACd,aAAK,eAAe;AACpB,aAAK,YAAY;AAAA,MACnB,SACO,OAAO;AACZ,gBAAQ,KAAK,8CAA8C,KAAK;AAAA,MAClE;AAAA,IACF;AAiBE,SAAK,YAAY;AACjB,SAAK,eAAe;AACpB,SAAK,UAAU;AACf,SAAK,eAAe;AAEpB,UAAM,EAAE,GAAG,WAAW,eAAA,IAAmB,QAAS;AAElD,QAAI,CAAC,gBAAgB;AACnB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAEA,SAAK,WAAW,OAAO,IAAI,EAAE,IAAA;AAC7B,SAAK,YAAY,aAAa,IAAI,UAAU,KAAK,QAAQ;AACzD,QAAI;AACF,WAAK,WAAW,IAAI,eAAe,QAAQ,UAAU,KAAK,UAAU;AAAA,QAClE,WAAW,KAAK;AAAA,QAChB,GAAG;AAAA,MAAA,CACJ;AAED,WAAK,SAAS,GAAG,UAAU,CAAC,WAAmC;;AAC7D,cAAM,eAAe,KAAK;AAC1B,aAAK,eAAe,OAAO;AAC3B,YAAI,OAAO,WAAW;AACpB,cAAI,CAAC,cAAc;AACjB,uBAAK,cAAL;AAAA,UACF;AACA,cAAI,CAAC,KAAK,WAAW;AACnB,iBAAK,YAAY;AACjB,uBAAK,iBAAL,8BAAoB;AAAA,UACtB;AAAA,QACF,OACK;AACH,cAAI,cAAc;AAChB,uBAAK,iBAAL;AAEA,gBAAI,KAAK,WAAW;AAClB,mBAAK,YAAY;AACjB,yBAAK,iBAAL,8BAAoB;AAAA,YACtB;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SACO,OAAO;AACZ,cAAQ,KAAK,yCAAyC,KAAK;AAC3D,yCAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AACF;;"}
@@ -3,35 +3,16 @@ var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
6
- const awareness = require("y-protocols/awareness");
7
- const yWebsocket = require("y-websocket");
8
- const Y = require("yjs");
9
- function _interopNamespaceDefault(e) {
10
- const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
11
- if (e) {
12
- for (const k in e) {
13
- if (k !== "default") {
14
- const d = Object.getOwnPropertyDescriptor(e, k);
15
- Object.defineProperty(n, k, d.get ? d : {
16
- enumerable: true,
17
- get: () => e[k]
18
- });
19
- }
20
- }
21
- }
22
- n.default = e;
23
- return Object.freeze(n);
24
- }
25
- const Y__namespace = /* @__PURE__ */ _interopNamespaceDefault(Y);
26
6
  class WebsocketProviderWrapper {
27
7
  constructor({
28
- awareness: awareness$1,
8
+ awareness,
29
9
  doc,
30
10
  options,
31
11
  onConnect,
32
12
  onDisconnect,
33
13
  onError,
34
- onSyncChange
14
+ onSyncChange,
15
+ deps
35
16
  }) {
36
17
  __publicField(this, "provider");
37
18
  __publicField(this, "_isConnected", false);
@@ -75,10 +56,14 @@ class WebsocketProviderWrapper {
75
56
  this.onDisconnect = onDisconnect;
76
57
  this.onError = onError;
77
58
  this.onSyncChange = onSyncChange;
78
- this.document = doc || new Y__namespace.Doc();
79
- this.awareness = awareness$1 ?? new awareness.Awareness(this.document);
59
+ const { Y, Awareness, WebsocketProvider } = deps || window;
60
+ if (!WebsocketProvider) {
61
+ throw new Error("WebsocketProvider dependency not provided");
62
+ }
63
+ this.document = doc || new Y.Doc();
64
+ this.awareness = awareness ?? new Awareness(this.document);
80
65
  try {
81
- this.provider = new yWebsocket.WebsocketProvider(
66
+ this.provider = new WebsocketProvider(
82
67
  options.serverUrl,
83
68
  options.roomName,
84
69
  this.document,
@@ -1 +1 @@
1
- {"version":3,"file":"websocket.cjs.js","sources":["../../../../../src/modules/collaborative-editing/provider/websocket.ts"],"sourcesContent":["import type { ProviderEventHandlers } from '../types'\nimport type { UnifiedProvider } from './providerRegistry'\nimport { Awareness } from 'y-protocols/awareness'\nimport { WebsocketProvider } from 'y-websocket'\nimport * as Y from 'yjs'\n\nexport interface WebsocketProviderOptions {\n serverUrl: string\n roomName: string\n connect?: boolean\n awareness?: any\n params?: Record<string, string>\n protocols?: string[]\n WebSocketPolyfill?: typeof WebSocket\n resyncInterval?: number\n maxBackoffTime?: number\n disableBc?: boolean\n}\n\nexport class WebsocketProviderWrapper implements UnifiedProvider {\n private provider: WebsocketProvider\n\n private _isConnected = false\n private _isSynced = false\n\n onConnect?: () => void\n onDisconnect?: () => void\n onError?: (error: Error) => void\n onSyncChange?: (isSynced: boolean) => void\n\n document: Y.Doc\n awareness: Awareness\n type: 'websocket'\n\n connect = () => {\n try {\n this.provider.connect()\n }\n catch (error) {\n console.warn('[yjs] Error connecting WebSocket provider:', error)\n }\n }\n\n destroy = () => {\n try {\n this.provider.destroy()\n }\n catch (error) {\n console.warn('[yjs] Error destroying WebSocket provider:', error)\n }\n }\n\n disconnect = () => {\n try {\n this.provider.disconnect()\n const wasSynced = this._isSynced\n\n this._isConnected = false\n this._isSynced = false\n\n if (wasSynced) {\n this.onSyncChange?.(false)\n }\n }\n catch (error) {\n console.warn('[yjs] Error disconnecting WebSocket provider:', error)\n }\n }\n\n constructor({\n awareness,\n doc,\n options,\n onConnect,\n onDisconnect,\n onError,\n onSyncChange,\n }: {\n options: WebsocketProviderOptions\n awareness?: Awareness\n doc?: Y.Doc\n } & ProviderEventHandlers) {\n this.onConnect = onConnect\n this.onDisconnect = onDisconnect\n this.onError = onError\n this.onSyncChange = onSyncChange\n\n this.document = doc || new Y.Doc()\n this.awareness = awareness ?? new Awareness(this.document)\n try {\n this.provider = new WebsocketProvider(\n options.serverUrl,\n options.roomName,\n this.document,\n {\n awareness: this.awareness,\n ...options,\n },\n )\n\n this.provider.on('status', (event: { status: 'connected' | 'disconnected' | 'connecting' }) => {\n const wasConnected = this._isConnected\n this._isConnected = event.status === 'connected'\n\n if (event.status === 'connected') {\n if (!wasConnected) {\n this.onConnect?.()\n }\n if (!this._isSynced) {\n this._isSynced = true\n this.onSyncChange?.(true)\n }\n }\n else if (event.status === 'disconnected') {\n if (wasConnected) {\n this.onDisconnect?.()\n if (this._isSynced) {\n this._isSynced = false\n this.onSyncChange?.(false)\n }\n }\n }\n })\n }\n catch (error) {\n console.warn('[yjs] Error creating WebSocket provider:', error)\n onError?.(error instanceof Error ? error : new Error(String(error)))\n }\n }\n\n get isConnected() {\n return this._isConnected\n }\n\n get isSynced() {\n return this._isSynced\n }\n\n getProvider() {\n return this.provider\n }\n}\n"],"names":["awareness","Y","Awareness","WebsocketProvider"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAmBO,MAAM,yBAAoD;AAAA,EAkD/D,YAAY;AAAA,IAAA,WACVA;AAAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAKyB;AA7DnB;AAEA,wCAAe;AACf,qCAAY;AAEpB;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA,mCAAU,MAAM;AACd,UAAI;AACF,aAAK,SAAS,QAAA;AAAA,MAChB,SACO,OAAO;AACZ,gBAAQ,KAAK,8CAA8C,KAAK;AAAA,MAClE;AAAA,IACF;AAEA,mCAAU,MAAM;AACd,UAAI;AACF,aAAK,SAAS,QAAA;AAAA,MAChB,SACO,OAAO;AACZ,gBAAQ,KAAK,8CAA8C,KAAK;AAAA,MAClE;AAAA,IACF;AAEA,sCAAa,MAAM;;AACjB,UAAI;AACF,aAAK,SAAS,WAAA;AACd,cAAM,YAAY,KAAK;AAEvB,aAAK,eAAe;AACpB,aAAK,YAAY;AAEjB,YAAI,WAAW;AACb,qBAAK,iBAAL,8BAAoB;AAAA,QACtB;AAAA,MACF,SACO,OAAO;AACZ,gBAAQ,KAAK,iDAAiD,KAAK;AAAA,MACrE;AAAA,IACF;AAeE,SAAK,YAAY;AACjB,SAAK,eAAe;AACpB,SAAK,UAAU;AACf,SAAK,eAAe;AAEpB,SAAK,WAAW,OAAO,IAAIC,aAAE,IAAA;AAC7B,SAAK,YAAYD,eAAa,IAAIE,UAAAA,UAAU,KAAK,QAAQ;AACzD,QAAI;AACF,WAAK,WAAW,IAAIC,WAAAA;AAAAA,QAClB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,KAAK;AAAA,QACL;AAAA,UACE,WAAW,KAAK;AAAA,UAChB,GAAG;AAAA,QAAA;AAAA,MACL;AAGF,WAAK,SAAS,GAAG,UAAU,CAAC,UAAmE;;AAC7F,cAAM,eAAe,KAAK;AAC1B,aAAK,eAAe,MAAM,WAAW;AAErC,YAAI,MAAM,WAAW,aAAa;AAChC,cAAI,CAAC,cAAc;AACjB,uBAAK,cAAL;AAAA,UACF;AACA,cAAI,CAAC,KAAK,WAAW;AACnB,iBAAK,YAAY;AACjB,uBAAK,iBAAL,8BAAoB;AAAA,UACtB;AAAA,QACF,WACS,MAAM,WAAW,gBAAgB;AACxC,cAAI,cAAc;AAChB,uBAAK,iBAAL;AACA,gBAAI,KAAK,WAAW;AAClB,mBAAK,YAAY;AACjB,yBAAK,iBAAL,8BAAoB;AAAA,YACtB;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SACO,OAAO;AACZ,cAAQ,KAAK,4CAA4C,KAAK;AAC9D,yCAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AACF;;"}
1
+ {"version":3,"file":"websocket.cjs.js","sources":["../../../../../src/modules/collaborative-editing/provider/websocket.ts"],"sourcesContent":["import type { Awareness } from 'y-protocols/awareness'\nimport type { WebsocketProvider } from 'y-websocket'\nimport type * as Y from 'yjs'\nimport type { CollaborativeEditingDeps, ProviderEventHandlers } from '../types'\nimport type { UnifiedProvider } from './providerRegistry'\n\nexport interface WebsocketProviderOptions {\n serverUrl: string\n roomName: string\n connect?: boolean\n awareness?: Awareness\n params?: Record<string, string>\n protocols?: string[]\n WebSocketPolyfill?: typeof WebSocket\n resyncInterval?: number\n maxBackoffTime?: number\n disableBc?: boolean\n}\n\nexport class WebsocketProviderWrapper implements UnifiedProvider {\n private provider: WebsocketProvider\n\n private _isConnected = false\n private _isSynced = false\n\n onConnect?: () => void\n onDisconnect?: () => void\n onError?: (error: Error) => void\n onSyncChange?: (isSynced: boolean) => void\n\n document: Y.Doc\n awareness: Awareness\n type: 'websocket'\n\n connect = () => {\n try {\n this.provider.connect()\n }\n catch (error) {\n console.warn('[yjs] Error connecting WebSocket provider:', error)\n }\n }\n\n destroy = () => {\n try {\n this.provider.destroy()\n }\n catch (error) {\n console.warn('[yjs] Error destroying WebSocket provider:', error)\n }\n }\n\n disconnect = () => {\n try {\n this.provider.disconnect()\n const wasSynced = this._isSynced\n\n this._isConnected = false\n this._isSynced = false\n\n if (wasSynced) {\n this.onSyncChange?.(false)\n }\n }\n catch (error) {\n console.warn('[yjs] Error disconnecting WebSocket provider:', error)\n }\n }\n\n constructor({\n awareness,\n doc,\n options,\n onConnect,\n onDisconnect,\n onError,\n onSyncChange,\n deps,\n }: {\n options: WebsocketProviderOptions\n awareness?: Awareness\n doc?: Y.Doc\n deps?: CollaborativeEditingDeps\n } & ProviderEventHandlers) {\n this.onConnect = onConnect\n this.onDisconnect = onDisconnect\n this.onError = onError\n this.onSyncChange = onSyncChange\n\n const { Y, Awareness, WebsocketProvider } = deps || (window as any)\n\n if (!WebsocketProvider) {\n throw new Error('WebsocketProvider dependency not provided')\n }\n\n this.document = doc || new Y.Doc()\n this.awareness = awareness ?? new Awareness(this.document)\n try {\n this.provider = new WebsocketProvider(\n options.serverUrl,\n options.roomName,\n this.document,\n {\n awareness: this.awareness,\n ...options,\n },\n )\n\n this.provider.on('status', (event: { status: 'connected' | 'disconnected' | 'connecting' }) => {\n const wasConnected = this._isConnected\n this._isConnected = event.status === 'connected'\n\n if (event.status === 'connected') {\n if (!wasConnected) {\n this.onConnect?.()\n }\n if (!this._isSynced) {\n this._isSynced = true\n this.onSyncChange?.(true)\n }\n }\n else if (event.status === 'disconnected') {\n if (wasConnected) {\n this.onDisconnect?.()\n if (this._isSynced) {\n this._isSynced = false\n this.onSyncChange?.(false)\n }\n }\n }\n })\n }\n catch (error) {\n console.warn('[yjs] Error creating WebSocket provider:', error)\n onError?.(error instanceof Error ? error : new Error(String(error)))\n }\n }\n\n get isConnected() {\n return this._isConnected\n }\n\n get isSynced() {\n return this._isSynced\n }\n\n getProvider() {\n return this.provider\n }\n}\n"],"names":[],"mappings":";;;;;AAmBO,MAAM,yBAAoD;AAAA,EAkD/D,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAMyB;AA/DnB;AAEA,wCAAe;AACf,qCAAY;AAEpB;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA,mCAAU,MAAM;AACd,UAAI;AACF,aAAK,SAAS,QAAA;AAAA,MAChB,SACO,OAAO;AACZ,gBAAQ,KAAK,8CAA8C,KAAK;AAAA,MAClE;AAAA,IACF;AAEA,mCAAU,MAAM;AACd,UAAI;AACF,aAAK,SAAS,QAAA;AAAA,MAChB,SACO,OAAO;AACZ,gBAAQ,KAAK,8CAA8C,KAAK;AAAA,MAClE;AAAA,IACF;AAEA,sCAAa,MAAM;;AACjB,UAAI;AACF,aAAK,SAAS,WAAA;AACd,cAAM,YAAY,KAAK;AAEvB,aAAK,eAAe;AACpB,aAAK,YAAY;AAEjB,YAAI,WAAW;AACb,qBAAK,iBAAL,8BAAoB;AAAA,QACtB;AAAA,MACF,SACO,OAAO;AACZ,gBAAQ,KAAK,iDAAiD,KAAK;AAAA,MACrE;AAAA,IACF;AAiBE,SAAK,YAAY;AACjB,SAAK,eAAe;AACpB,SAAK,UAAU;AACf,SAAK,eAAe;AAEpB,UAAM,EAAE,GAAG,WAAW,kBAAA,IAAsB,QAAS;AAErD,QAAI,CAAC,mBAAmB;AACtB,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAEA,SAAK,WAAW,OAAO,IAAI,EAAE,IAAA;AAC7B,SAAK,YAAY,aAAa,IAAI,UAAU,KAAK,QAAQ;AACzD,QAAI;AACF,WAAK,WAAW,IAAI;AAAA,QAClB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,KAAK;AAAA,QACL;AAAA,UACE,WAAW,KAAK;AAAA,UAChB,GAAG;AAAA,QAAA;AAAA,MACL;AAGF,WAAK,SAAS,GAAG,UAAU,CAAC,UAAmE;;AAC7F,cAAM,eAAe,KAAK;AAC1B,aAAK,eAAe,MAAM,WAAW;AAErC,YAAI,MAAM,WAAW,aAAa;AAChC,cAAI,CAAC,cAAc;AACjB,uBAAK,cAAL;AAAA,UACF;AACA,cAAI,CAAC,KAAK,WAAW;AACnB,iBAAK,YAAY;AACjB,uBAAK,iBAAL,8BAAoB;AAAA,UACtB;AAAA,QACF,WACS,MAAM,WAAW,gBAAgB;AACxC,cAAI,cAAc;AAChB,uBAAK,iBAAL;AACA,gBAAI,KAAK,WAAW;AAClB,mBAAK,YAAY;AACjB,yBAAK,iBAAL,8BAAoB;AAAA,YACtB;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SACO,OAAO;AACZ,cAAQ,KAAK,4CAA4C,KAAK;AAC9D,yCAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AACF;;"}
@@ -3,9 +3,9 @@ var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
6
- const icons$1 = require("simple-mind-map/src/svg/icons");
7
6
  require("../../../config/index.cjs.js");
8
7
  const i18n = require("../../i18n.cjs.js");
8
+ const configUtils = require("../config-utils.cjs.js");
9
9
  const index = require("../i18n/index.cjs.js");
10
10
  const icons = require("../icons.cjs.js");
11
11
  const editor_config = require("../../../config/editor.config.cjs.js");
@@ -223,7 +223,8 @@ function handleInsertIcon(blot, selectedNodes) {
223
223
  const heightStr = blot.domNode.getAttribute("height") || "500px";
224
224
  const height = Number.parseInt(heightStr.replace(/[^\d.]/g, ""), 10) || 500;
225
225
  let iconList = [];
226
- iconList = icons$1.nodeIconList;
226
+ const { deps } = configUtils.getAllConfigs(blot.quill);
227
+ iconList = deps.nodeIconList.nodeIconList;
227
228
  const leftUpControl = blot.domNode.querySelector(".ql-mind-map-left-up-control");
228
229
  let iconPanel = leftUpControl.querySelector(".ql-mind-map-icon-panel");
229
230
  if (!iconPanel) {
@@ -1 +1 @@
1
- {"version":3,"file":"control-panel.cjs.js","sources":["../../../../../src/modules/mind-map/modules/control-panel.ts"],"sourcesContent":["import type FluentEditor from '../../../core/fluent-editor'\nimport type MindMapPlaceholderBlot from '../formats/mind-map-blot'\nimport { nodeIconList } from 'simple-mind-map/src/svg/icons'\nimport { CHANGE_LANGUAGE_EVENT } from '../../../config'\nimport { I18N } from '../../../modules/i18n'\nimport { registerMindMapI18N } from '../i18n'\nimport { backIcon, catalogOrganizationIcon, contractIcon, fishboneIcon, fitIcon, forwardIcon, insertChildNodeIcon, insertIconIcon, insertNodeIcon, insertParentNodeIcon, logicalStructureIcon, mindMapIcon, organizationStructureIcon, removeNodeIcon, screenReduceIcon, screenTypeIcon, setLayoutIcon, timelineIcon, zoomInIcon, zoomOutIcon } from '../icons'\n\nclass MindMapControlPanelHandler {\n private texts: Record<string, string>\n private lang: string\n getText(key: keyof Record<string, string>): string {\n return this.texts[key]\n }\n\n constructor(private quill: FluentEditor, private blot: MindMapPlaceholderBlot) {\n const i18nModule = this.quill.getModule('i18n') as I18N\n registerMindMapI18N(I18N)\n this.lang = i18nModule.options.lang\n this.texts = this.resolveTexts()\n this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, (lang: string) => {\n this.lang = lang\n this.texts = this.resolveTexts()\n this.updateControlPanelTexts()\n })\n }\n\n resolveTexts() {\n const textKeys = [\n 'zoomOutTitle',\n 'zoomInTitle',\n 'fitTitle',\n 'backTitle',\n 'forwardTitle',\n 'inserChildNodeTitle',\n 'inserNodeTitle',\n 'insertIconTitle',\n 'inserParentNodeTitle',\n 'removeNodeTitle',\n 'setLayoutTitle',\n 'logicalStructureLayout',\n 'catalogOrganizationLayout',\n 'mindMapLayout',\n 'organizationStructureLayout',\n 'timelineLayout',\n 'fishboneLayout',\n 'panelStatusTitle',\n 'screenTypeTitle',\n ]\n\n return textKeys.reduce((acc, key) => {\n if (!key.includes('Title')) {\n acc[key] = I18N.parserText(`mindMap.layout.${key.replace('Layout', '')}`, this.lang)\n }\n else {\n acc[key] = I18N.parserText(`mindMap.controlPanel.${key}`, this.lang)\n }\n return acc\n }, {} as Record<string, string>)\n }\n\n updateControlPanelTexts() {\n const controlItems = this.blot.domNode.querySelectorAll('.ql-mind-map-control-item')\n\n const controlItemMap: Record<string, string> = {\n 'zoom-out': 'zoomOutTitle',\n 'zoom-in': 'zoomInTitle',\n 'fit': 'fitTitle',\n 'back': 'backTitle',\n 'forward': 'forwardTitle',\n 'insert-child-node': 'inserChildNodeTitle',\n 'insert-node': 'inserNodeTitle',\n 'insert-icon': 'insertIconTitle',\n 'insert-parent-node': 'inserParentNodeTitle',\n 'remove-node': 'removeNodeTitle',\n 'set-layout-icon': 'setLayoutTitle',\n 'panel-status': 'panelStatusTitle',\n 'screen-type': 'screenTypeTitle',\n }\n\n controlItems.forEach((item) => {\n const controlType = (item as HTMLElement).dataset.controlType\n if (controlType && controlItemMap[controlType] && this.texts[controlItemMap[controlType]]) {\n (item as HTMLElement).title = this.texts[controlItemMap[controlType]]\n }\n })\n }\n}\n\nconst controlPanelHandlers = new WeakMap<MindMapPlaceholderBlot, MindMapControlPanelHandler>()\n\nconst DISABLED_OPACITY = '0.5'\nconst ENABLED_OPACITY = '1'\nexport function createControlPanel(blot: MindMapPlaceholderBlot, quill: FluentEditor): void {\n let isStart = true\n let isEnd = true\n let selectedNodes: any[] = []\n blot.mindMap.on('node_active', (...args: unknown[]) => {\n selectedNodes = Array.isArray(args[1]) ? args[1] : []\n })\n // 中间的控制面板\n const controlPanel = document.createElement('div')\n controlPanel.className = 'ql-mind-map-control'\n // 右上的控制面板\n const controlRightUpPanel = document.createElement('div')\n controlRightUpPanel.className = 'ql-mind-map-right-up-control'\n // 左上的控制面板\n const controlLeftUpPanel = document.createElement('div')\n controlLeftUpPanel.className = 'ql-mind-map-left-up-control'\n\n const handler = new MindMapControlPanelHandler(quill, blot)\n controlPanelHandlers.set(blot, handler)\n\n const zoomOutBtn = createControlItem('zoom-out', handler.getText('zoomOutTitle'), () => handleZoomOut(blot))\n const zoomInBtn = createControlItem('zoom-in', handler.getText('zoomInTitle'), () => handleZoomIn(blot))\n const resetBtn = createControlItem('fit', handler.getText('fitTitle'), () => handleResetZoom(blot))\n const backBtn = createControlItem('back', handler.getText('backTitle'), () => {\n if (!isStart) {\n blot.mindMap.execCommand('BACK')\n }\n })\n const forwardBtn = createControlItem('forward', handler.getText('forwardTitle'), () => {\n if (!isEnd) {\n blot.mindMap.execCommand('FORWARD')\n }\n })\n const insertChildNode = createControlItem('insert-child-node', handler.getText('inserChildNodeTitle'), () => handleInsertChildNode(blot))\n const insertNode = createControlItem('insert-node', handler.getText('inserNodeTitle'), () => handleInsertNode(blot))\n const insertParentNode = createControlItem('insert-parent-node', handler.getText('inserParentNodeTitle'), () => handleInsertParentNode(blot))\n const removeNode = createControlItem('remove-node', handler.getText('removeNodeTitle'), () => handleRemoveNode(blot))\n const insertIconBtn = createControlItem('insert-icon', handler.getText('insertIconTitle'), () => handleInsertIcon(blot, selectedNodes))\n const setLayoutBtn = createControlItem('set-layout-icon', handler.getText('setLayoutTitle'), () => handleSetLayoutBtn(blot))\n const panelStatusBtn = createControlItem('panel-status', handler.getText('panelStatusTitle'))\n const screenTypeBtn = createControlItem('screen-type', handler.getText('screenTypeTitle'), () => handleScreenTypeBtn(blot))\n const updateButtonState = (index: number, len: number) => {\n isStart = index <= 0\n isEnd = index >= len - 1\n backBtn.style.cursor = isStart ? 'not-allowed' : 'pointer'\n backBtn.style.opacity = isStart ? DISABLED_OPACITY : ENABLED_OPACITY\n forwardBtn.style.cursor = isEnd ? 'not-allowed' : 'pointer'\n forwardBtn.style.opacity = isEnd ? DISABLED_OPACITY : ENABLED_OPACITY\n }\n\n blot.mindMap.on('back_forward', (index: number, len: number) => {\n updateButtonState(index, len)\n })\n controlPanel.append(zoomOutBtn, zoomInBtn, resetBtn, screenTypeBtn, backBtn, forwardBtn)\n blot.domNode.appendChild(controlPanel)\n controlRightUpPanel.append(panelStatusBtn)\n blot.domNode.appendChild(controlRightUpPanel)\n controlLeftUpPanel.append(insertChildNode, insertNode, insertParentNode, removeNode, insertIconBtn, setLayoutBtn)\n blot.domNode.appendChild(controlLeftUpPanel)\n}\n\nfunction createControlItem(iconClass: string, title: string, onClick?: () => void, disabled = false) {\n const controlItem = document.createElement('div')\n controlItem.className = 'ql-mind-map-control-item'\n controlItem.title = title\n controlItem.dataset.controlType = iconClass\n controlItem.style.cursor = disabled ? 'not-allowed' : 'pointer'\n controlItem.style.opacity = disabled ? DISABLED_OPACITY : ENABLED_OPACITY\n\n const iconMap: Record<string, string> = {\n 'back': backIcon,\n 'forward': forwardIcon,\n 'zoom-out': zoomOutIcon,\n 'zoom-in': zoomInIcon,\n 'fit': fitIcon,\n 'insert-child-node': insertChildNodeIcon,\n 'insert-node': insertNodeIcon,\n 'insert-parent-node': insertParentNodeIcon,\n 'remove-node': removeNodeIcon,\n 'insert-icon': insertIconIcon,\n 'set-layout-icon': setLayoutIcon,\n 'screen-type': screenTypeIcon,\n 'panel-status': contractIcon,\n }\n\n const icon = document.createElement('i')\n icon.innerHTML = iconMap[iconClass] || ''\n controlItem.appendChild(icon)\n\n if (!disabled) {\n controlItem.addEventListener('click', onClick)\n }\n\n return controlItem\n}\n\nfunction handleInsertChildNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_CHILD_NODE')\n}\n\nfunction handleInsertNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_NODE')\n}\n\nfunction handleInsertParentNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_PARENT_NODE')\n}\n\nfunction handleRemoveNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('REMOVE_CURRENT_NODE')\n}\n\nfunction handleZoomIn(blot: MindMapPlaceholderBlot): void {\n if (blot.mindMap && blot.mindMap.view) {\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const cx = containerRect.width / 2\n const cy = containerRect.height / 2\n blot.mindMap.view.enlarge(cx, cy, false)\n blot.zoomCount++\n }\n}\n\nfunction handleZoomOut(blot: MindMapPlaceholderBlot): void {\n if (blot.mindMap && blot.mindMap.view) {\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const cx = containerRect.width / 2\n const cy = containerRect.height / 2\n blot.mindMap.view.narrow(cx, cy, false)\n blot.zoomCount--\n }\n}\n\nfunction handleResetZoom(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.renderer.setRootNodeCenter()\n if (!blot.mindMap || !blot.mindMap.view || blot.zoomCount === 0) return\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const centerX = containerRect.width / 2\n const centerY = containerRect.height / 2\n const operationCount = Math.abs(blot.zoomCount)\n const isEnlarge = blot.zoomCount < 0\n for (let i = 0; i < operationCount; i++) {\n if (isEnlarge) {\n blot.mindMap.view.enlarge(centerX, centerY, false)\n }\n else {\n blot.mindMap.view.narrow(centerX, centerY, false)\n }\n }\n blot.zoomCount = 0\n}\n\nfunction handleInsertIcon(blot: MindMapPlaceholderBlot, selectedNodes: any[]): void {\n (blot as any).selectedNodes = selectedNodes\n const heightStr = blot.domNode.getAttribute('height') || '500px'\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\n let iconList = []\n iconList = nodeIconList\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\n let iconPanel = leftUpControl.querySelector('.ql-mind-map-icon-panel') as HTMLElement\n if (!iconPanel) {\n iconPanel = document.createElement('div')\n iconPanel.className = 'ql-mind-map-icon-panel'\n\n iconList.forEach((group) => {\n const groupContainer = document.createElement('div')\n groupContainer.className = 'ql-mind-map-icon-group-container'\n\n group.list.forEach((icon: { icon: string, name: string }) => {\n const iconItem = document.createElement('div')\n iconItem.className = 'ql-mind-map-icon-item'\n iconItem.innerHTML = icon.icon\n\n iconItem.addEventListener('click', () => {\n const currentSelectedNodes = (blot as any).selectedNodes || []\n if (currentSelectedNodes.length > 0) {\n const node = currentSelectedNodes[0]\n\n if (node.getData('icon') && node.getData('icon')[0] === `${group.type}_${icon.name}`) {\n node.setIcon([])\n }\n else {\n node.setIcon([`${group.type}_${icon.name}`])\n }\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n }\n iconPanel.style.display = 'none'\n })\n groupContainer.appendChild(iconItem)\n })\n iconPanel.appendChild(groupContainer)\n })\n if (height < 395) {\n iconPanel.style.height = `${height - 130}px`\n }\n else {\n iconPanel.style.height = '270px'\n }\n leftUpControl.appendChild(iconPanel)\n }\n else {\n if (height < 395) {\n iconPanel.style.height = `${height - 130}px`\n }\n else {\n iconPanel.style.height = '270px'\n }\n iconPanel.style.display = 'block'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let insertIconBtn: HTMLElement | null = null\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\n\n controlItems.forEach((item) => {\n if ((item as HTMLElement).dataset.controlType === 'insert-icon') {\n insertIconBtn = item as HTMLElement\n }\n })\n\n if (!iconPanel.contains(e.target as Node) && (!insertIconBtn || !insertIconBtn.contains(e.target as Node))) {\n iconPanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n document.removeEventListener('click', handleOutsideClick)\n document.addEventListener('click', handleOutsideClick)\n}\n\nfunction handleSetLayoutBtn(blot: MindMapPlaceholderBlot): void {\n const handler = controlPanelHandlers.get(blot)\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\n let layoutPanel = leftUpControl.querySelector('.ql-mind-map-layout-panel') as HTMLElement\n const heightStr = blot.domNode.getAttribute('height') || '500'\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\n\n if (!layoutPanel) {\n layoutPanel = document.createElement('div')\n layoutPanel.className = 'ql-mind-map-layout-panel'\n\n const layouts = [\n {\n name: 'logicalStructure',\n displayName: handler?.getText('logicalStructureLayout'),\n icon: logicalStructureIcon,\n },\n {\n name: 'catalogOrganization',\n displayName: handler?.getText('catalogOrganizationLayout'),\n icon: catalogOrganizationIcon,\n },\n {\n name: 'mindMap',\n displayName: handler?.getText('mindMapLayout'),\n icon: mindMapIcon,\n },\n {\n name: 'organizationStructure',\n displayName: handler?.getText('organizationStructureLayout'),\n icon: organizationStructureIcon,\n },\n {\n name: 'timeline',\n displayName: handler?.getText('timelineLayout'),\n icon: timelineIcon,\n },\n {\n name: 'fishbone',\n displayName: handler?.getText('fishboneLayout'),\n icon: fishboneIcon,\n },\n ]\n\n layouts.forEach((layout) => {\n const layoutItem = document.createElement('div')\n layoutItem.className = 'ql-mind-map-layout-item'\n\n const iconContainer = document.createElement('div')\n iconContainer.className = 'ql-mind-map-layout-icon-container'\n\n const img = document.createElement('div')\n img.className = 'ql-mind-map-layout-icon'\n img.innerHTML = layout.icon\n img.style.display = 'flex'\n img.style.alignItems = 'center'\n img.style.justifyContent = 'center'\n const svgElement = img.querySelector('svg')\n\n svgElement.style.maxWidth = '100%'\n svgElement.style.maxHeight = '100%'\n svgElement.style.width = 'auto'\n svgElement.style.height = 'auto'\n svgElement.removeAttribute('width')\n svgElement.removeAttribute('height')\n\n iconContainer.appendChild(img)\n\n const nameText = document.createElement('div')\n nameText.className = 'ql-mind-map-layout-name'\n nameText.textContent = layout.displayName\n\n layoutItem.appendChild(iconContainer)\n layoutItem.appendChild(nameText)\n layoutItem.addEventListener('click', () => {\n blot.mindMap.setLayout(layout.name)\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n layoutPanel.style.display = 'none'\n })\n layoutPanel.appendChild(layoutItem)\n })\n leftUpControl.appendChild(layoutPanel)\n if (height < 395) {\n layoutPanel.style.height = `${height - 130}px`\n }\n else {\n layoutPanel.style.height = '270px'\n }\n }\n else {\n if (height < 395) {\n layoutPanel.style.height = `${height - 130}px`\n }\n else {\n layoutPanel.style.height = '270px'\n }\n layoutPanel.style.display = 'flex'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let setLayoutBtn: HTMLElement | null = null\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\n\n setLayoutBtn = Array.from(controlItems).find(item => item.getAttribute('data-control-type') === 'set-layout-icon') as HTMLElement | null\n\n if (!layoutPanel.contains(e.target as Node) && (!setLayoutBtn || !setLayoutBtn.contains(e.target as Node))) {\n layoutPanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n document.removeEventListener('click', handleOutsideClick)\n document.addEventListener('click', handleOutsideClick)\n}\n\nfunction handleScreenTypeBtn(blot: MindMapPlaceholderBlot): void {\n const screenTypeBtn = blot.domNode.querySelector('[data-control-type=\"screen-type\"]') as HTMLElement | null\n if (!screenTypeBtn || !blot.domNode) return\n\n const mindMapContainer = blot.domNode\n const isFullscreen = mindMapContainer.style.position === 'fixed'\n\n if (isFullscreen) {\n const originalPosition = mindMapContainer.getAttribute('data-original-position')\n const originalWidth = mindMapContainer.getAttribute('data-original-width')\n const originalHeight = mindMapContainer.getAttribute('data-original-height')\n if (originalWidth && originalHeight) {\n mindMapContainer.style.position = originalPosition\n mindMapContainer.style.width = originalWidth\n mindMapContainer.style.height = originalHeight\n mindMapContainer.style.zIndex = '0'\n }\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenTypeIcon\n }\n }\n else {\n mindMapContainer.setAttribute('data-original-position', mindMapContainer.style.position || '')\n mindMapContainer.setAttribute('data-original-width', mindMapContainer.style.width || '')\n mindMapContainer.setAttribute('data-original-height', mindMapContainer.style.height || '')\n mindMapContainer.style.position = 'fixed'\n mindMapContainer.style.top = '0'\n mindMapContainer.style.left = '0'\n mindMapContainer.style.width = '100vw'\n mindMapContainer.style.height = '100vh'\n mindMapContainer.style.zIndex = '100'\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenReduceIcon\n }\n }\n blot.mindMap.renderer.setRootNodeCenter()\n blot.mindMap.resize()\n}\n"],"names":["registerMindMapI18N","I18N","CHANGE_LANGUAGE_EVENT","index","backIcon","forwardIcon","zoomOutIcon","zoomInIcon","fitIcon","insertChildNodeIcon","insertNodeIcon","insertParentNodeIcon","removeNodeIcon","insertIconIcon","setLayoutIcon","screenTypeIcon","contractIcon","nodeIconList","logicalStructureIcon","catalogOrganizationIcon","mindMapIcon","organizationStructureIcon","timelineIcon","fishboneIcon","screenReduceIcon"],"mappings":";;;;;;;;;;;AAQA,MAAM,2BAA2B;AAAA,EAO/B,YAAoB,OAA6B,MAA8B;AANvE;AACA;AAKY,SAAA,QAAA;AAA6B,SAAA,OAAA;AAC/C,UAAM,aAAa,KAAK,MAAM,UAAU,MAAM;AAC9CA,UAAAA,oBAAoBC,KAAAA,IAAI;AACxB,SAAK,OAAO,WAAW,QAAQ;AAC/B,SAAK,QAAQ,KAAK,aAAA;AAClB,SAAK,MAAM,QAAQ,GAAGC,cAAAA,uBAAuB,CAAC,SAAiB;AAC7D,WAAK,OAAO;AACZ,WAAK,QAAQ,KAAK,aAAA;AAClB,WAAK,wBAAA;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAdA,QAAQ,KAA2C;AACjD,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB;AAAA,EAcA,eAAe;AACb,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAGF,WAAO,SAAS,OAAO,CAAC,KAAK,QAAQ;AACnC,UAAI,CAAC,IAAI,SAAS,OAAO,GAAG;AAC1B,YAAI,GAAG,IAAID,KAAAA,KAAK,WAAW,kBAAkB,IAAI,QAAQ,UAAU,EAAE,CAAC,IAAI,KAAK,IAAI;AAAA,MACrF,OACK;AACH,YAAI,GAAG,IAAIA,KAAAA,KAAK,WAAW,wBAAwB,GAAG,IAAI,KAAK,IAAI;AAAA,MACrE;AACA,aAAO;AAAA,IACT,GAAG,CAAA,CAA4B;AAAA,EACjC;AAAA,EAEA,0BAA0B;AACxB,UAAM,eAAe,KAAK,KAAK,QAAQ,iBAAiB,2BAA2B;AAEnF,UAAM,iBAAyC;AAAA,MAC7C,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,qBAAqB;AAAA,MACrB,eAAe;AAAA,MACf,eAAe;AAAA,MACf,sBAAsB;AAAA,MACtB,eAAe;AAAA,MACf,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,eAAe;AAAA,IAAA;AAGjB,iBAAa,QAAQ,CAAC,SAAS;AAC7B,YAAM,cAAe,KAAqB,QAAQ;AAClD,UAAI,eAAe,eAAe,WAAW,KAAK,KAAK,MAAM,eAAe,WAAW,CAAC,GAAG;AACxF,aAAqB,QAAQ,KAAK,MAAM,eAAe,WAAW,CAAC;AAAA,MACtE;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,MAAM,2CAA2B,QAAA;AAEjC,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AACjB,SAAS,mBAAmB,MAA8B,OAA2B;AAC1F,MAAI,UAAU;AACd,MAAI,QAAQ;AACZ,MAAI,gBAAuB,CAAA;AAC3B,OAAK,QAAQ,GAAG,eAAe,IAAI,SAAoB;AACrD,oBAAgB,MAAM,QAAQ,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAA;AAAA,EACrD,CAAC;AAED,QAAM,eAAe,SAAS,cAAc,KAAK;AACjD,eAAa,YAAY;AAEzB,QAAM,sBAAsB,SAAS,cAAc,KAAK;AACxD,sBAAoB,YAAY;AAEhC,QAAM,qBAAqB,SAAS,cAAc,KAAK;AACvD,qBAAmB,YAAY;AAE/B,QAAM,UAAU,IAAI,2BAA2B,OAAO,IAAI;AAC1D,uBAAqB,IAAI,MAAM,OAAO;AAEtC,QAAM,aAAa,kBAAkB,YAAY,QAAQ,QAAQ,cAAc,GAAG,MAAM,cAAc,IAAI,CAAC;AAC3G,QAAM,YAAY,kBAAkB,WAAW,QAAQ,QAAQ,aAAa,GAAG,MAAM,aAAa,IAAI,CAAC;AACvG,QAAM,WAAW,kBAAkB,OAAO,QAAQ,QAAQ,UAAU,GAAG,MAAM,gBAAgB,IAAI,CAAC;AAClG,QAAM,UAAU,kBAAkB,QAAQ,QAAQ,QAAQ,WAAW,GAAG,MAAM;AAC5E,QAAI,CAAC,SAAS;AACZ,WAAK,QAAQ,YAAY,MAAM;AAAA,IACjC;AAAA,EACF,CAAC;AACD,QAAM,aAAa,kBAAkB,WAAW,QAAQ,QAAQ,cAAc,GAAG,MAAM;AACrF,QAAI,CAAC,OAAO;AACV,WAAK,QAAQ,YAAY,SAAS;AAAA,IACpC;AAAA,EACF,CAAC;AACD,QAAM,kBAAkB,kBAAkB,qBAAqB,QAAQ,QAAQ,qBAAqB,GAAG,MAAM,sBAAsB,IAAI,CAAC;AACxI,QAAM,aAAa,kBAAkB,eAAe,QAAQ,QAAQ,gBAAgB,GAAG,MAAM,iBAAiB,IAAI,CAAC;AACnH,QAAM,mBAAmB,kBAAkB,sBAAsB,QAAQ,QAAQ,sBAAsB,GAAG,MAAM,uBAAuB,IAAI,CAAC;AAC5I,QAAM,aAAa,kBAAkB,eAAe,QAAQ,QAAQ,iBAAiB,GAAG,MAAM,iBAAiB,IAAI,CAAC;AACpH,QAAM,gBAAgB,kBAAkB,eAAe,QAAQ,QAAQ,iBAAiB,GAAG,MAAM,iBAAiB,MAAM,aAAa,CAAC;AACtI,QAAM,eAAe,kBAAkB,mBAAmB,QAAQ,QAAQ,gBAAgB,GAAG,MAAM,mBAAmB,IAAI,CAAC;AAC3H,QAAM,iBAAiB,kBAAkB,gBAAgB,QAAQ,QAAQ,kBAAkB,CAAC;AAC5F,QAAM,gBAAgB,kBAAkB,eAAe,QAAQ,QAAQ,iBAAiB,GAAG,MAAM,oBAAoB,IAAI,CAAC;AAC1H,QAAM,oBAAoB,CAACE,QAAe,QAAgB;AACxD,cAAUA,UAAS;AACnB,YAAQA,UAAS,MAAM;AACvB,YAAQ,MAAM,SAAS,UAAU,gBAAgB;AACjD,YAAQ,MAAM,UAAU,UAAU,mBAAmB;AACrD,eAAW,MAAM,SAAS,QAAQ,gBAAgB;AAClD,eAAW,MAAM,UAAU,QAAQ,mBAAmB;AAAA,EACxD;AAEA,OAAK,QAAQ,GAAG,gBAAgB,CAACA,QAAe,QAAgB;AAC9D,sBAAkBA,QAAO,GAAG;AAAA,EAC9B,CAAC;AACD,eAAa,OAAO,YAAY,WAAW,UAAU,eAAe,SAAS,UAAU;AACvF,OAAK,QAAQ,YAAY,YAAY;AACrC,sBAAoB,OAAO,cAAc;AACzC,OAAK,QAAQ,YAAY,mBAAmB;AAC5C,qBAAmB,OAAO,iBAAiB,YAAY,kBAAkB,YAAY,eAAe,YAAY;AAChH,OAAK,QAAQ,YAAY,kBAAkB;AAC7C;AAEA,SAAS,kBAAkB,WAAmB,OAAe,SAAsB,WAAW,OAAO;AACnG,QAAM,cAAc,SAAS,cAAc,KAAK;AAChD,cAAY,YAAY;AACxB,cAAY,QAAQ;AACpB,cAAY,QAAQ,cAAc;AAClC,cAAY,MAAM,SAAS,WAAW,gBAAgB;AACtD,cAAY,MAAM,UAAU,WAAW,mBAAmB;AAE1D,QAAM,UAAkC;AAAA,IACtC,QAAQC,MAAAA;AAAAA,IACR,WAAWC,MAAAA;AAAAA,IACX,YAAYC,MAAAA;AAAAA,IACZ,WAAWC,MAAAA;AAAAA,IACX,OAAOC,MAAAA;AAAAA,IACP,qBAAqBC,MAAAA;AAAAA,IACrB,eAAeC,MAAAA;AAAAA,IACf,sBAAsBC,MAAAA;AAAAA,IACtB,eAAeC,MAAAA;AAAAA,IACf,eAAeC,MAAAA;AAAAA,IACf,mBAAmBC,MAAAA;AAAAA,IACnB,eAAeC,MAAAA;AAAAA,IACf,gBAAgBC,MAAAA;AAAAA,EAAA;AAGlB,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,YAAY,QAAQ,SAAS,KAAK;AACvC,cAAY,YAAY,IAAI;AAE5B,MAAI,CAAC,UAAU;AACb,gBAAY,iBAAiB,SAAS,OAAO;AAAA,EAC/C;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,MAAoC;AACjE,OAAK,QAAQ,YAAY,mBAAmB;AAC9C;AAEA,SAAS,iBAAiB,MAAoC;AAC5D,OAAK,QAAQ,YAAY,aAAa;AACxC;AAEA,SAAS,uBAAuB,MAAoC;AAClE,OAAK,QAAQ,YAAY,oBAAoB;AAC/C;AAEA,SAAS,iBAAiB,MAAoC;AAC5D,OAAK,QAAQ,YAAY,qBAAqB;AAChD;AAEA,SAAS,aAAa,MAAoC;AACxD,MAAI,KAAK,WAAW,KAAK,QAAQ,MAAM;AACrC,UAAM,gBAAgB,KAAK,QAAQ,GAAG,sBAAA;AACtC,UAAM,KAAK,cAAc,QAAQ;AACjC,UAAM,KAAK,cAAc,SAAS;AAClC,SAAK,QAAQ,KAAK,QAAQ,IAAI,IAAI,KAAK;AACvC,SAAK;AAAA,EACP;AACF;AAEA,SAAS,cAAc,MAAoC;AACzD,MAAI,KAAK,WAAW,KAAK,QAAQ,MAAM;AACrC,UAAM,gBAAgB,KAAK,QAAQ,GAAG,sBAAA;AACtC,UAAM,KAAK,cAAc,QAAQ;AACjC,UAAM,KAAK,cAAc,SAAS;AAClC,SAAK,QAAQ,KAAK,OAAO,IAAI,IAAI,KAAK;AACtC,SAAK;AAAA,EACP;AACF;AAEA,SAAS,gBAAgB,MAAoC;AAC3D,OAAK,QAAQ,SAAS,kBAAA;AACtB,MAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,QAAQ,KAAK,cAAc,EAAG;AACjE,QAAM,gBAAgB,KAAK,QAAQ,GAAG,sBAAA;AACtC,QAAM,UAAU,cAAc,QAAQ;AACtC,QAAM,UAAU,cAAc,SAAS;AACvC,QAAM,iBAAiB,KAAK,IAAI,KAAK,SAAS;AAC9C,QAAM,YAAY,KAAK,YAAY;AACnC,WAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACvC,QAAI,WAAW;AACb,WAAK,QAAQ,KAAK,QAAQ,SAAS,SAAS,KAAK;AAAA,IACnD,OACK;AACH,WAAK,QAAQ,KAAK,OAAO,SAAS,SAAS,KAAK;AAAA,IAClD;AAAA,EACF;AACA,OAAK,YAAY;AACnB;AAEA,SAAS,iBAAiB,MAA8B,eAA4B;AACjF,OAAa,gBAAgB;AAC9B,QAAM,YAAY,KAAK,QAAQ,aAAa,QAAQ,KAAK;AACzD,QAAM,SAAS,OAAO,SAAS,UAAU,QAAQ,WAAW,EAAE,GAAG,EAAE,KAAK;AACxE,MAAI,WAAW,CAAA;AACf,aAAWC,QAAAA;AACX,QAAM,gBAAgB,KAAK,QAAQ,cAAc,8BAA8B;AAC/E,MAAI,YAAY,cAAc,cAAc,yBAAyB;AACrE,MAAI,CAAC,WAAW;AACd,gBAAY,SAAS,cAAc,KAAK;AACxC,cAAU,YAAY;AAEtB,aAAS,QAAQ,CAAC,UAAU;AAC1B,YAAM,iBAAiB,SAAS,cAAc,KAAK;AACnD,qBAAe,YAAY;AAE3B,YAAM,KAAK,QAAQ,CAAC,SAAyC;AAC3D,cAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,iBAAS,YAAY;AACrB,iBAAS,YAAY,KAAK;AAE1B,iBAAS,iBAAiB,SAAS,MAAM;AACvC,gBAAM,uBAAwB,KAAa,iBAAiB,CAAA;AAC5D,cAAI,qBAAqB,SAAS,GAAG;AACnC,kBAAM,OAAO,qBAAqB,CAAC;AAEnC,gBAAI,KAAK,QAAQ,MAAM,KAAK,KAAK,QAAQ,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AACpF,mBAAK,QAAQ,EAAE;AAAA,YACjB,OACK;AACH,mBAAK,QAAQ,CAAC,GAAG,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;AAAA,YAC7C;AACA,iBAAK,OAAO,KAAK,QAAQ,QAAQ,CAAA,CAAE;AACnC,iBAAK,QAAQ,aAAa,iBAAiB,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA,UACtE;AACA,oBAAU,MAAM,UAAU;AAAA,QAC5B,CAAC;AACD,uBAAe,YAAY,QAAQ;AAAA,MACrC,CAAC;AACD,gBAAU,YAAY,cAAc;AAAA,IACtC,CAAC;AACD,QAAI,SAAS,KAAK;AAChB,gBAAU,MAAM,SAAS,GAAG,SAAS,GAAG;AAAA,IAC1C,OACK;AACH,gBAAU,MAAM,SAAS;AAAA,IAC3B;AACA,kBAAc,YAAY,SAAS;AAAA,EACrC,OACK;AACH,QAAI,SAAS,KAAK;AAChB,gBAAU,MAAM,SAAS,GAAG,SAAS,GAAG;AAAA,IAC1C,OACK;AACH,gBAAU,MAAM,SAAS;AAAA,IAC3B;AACA,cAAU,MAAM,UAAU;AAAA,EAC5B;AAEA,QAAM,qBAAqB,CAAC,MAAkB;AAC5C,QAAI,gBAAoC;AACxC,UAAM,eAAe,cAAc,iBAAiB,2BAA2B;AAE/E,iBAAa,QAAQ,CAAC,SAAS;AAC7B,UAAK,KAAqB,QAAQ,gBAAgB,eAAe;AAC/D,wBAAgB;AAAA,MAClB;AAAA,IACF,CAAC;AAED,QAAI,CAAC,UAAU,SAAS,EAAE,MAAc,MAAM,CAAC,iBAAiB,CAAC,cAAc,SAAS,EAAE,MAAc,IAAI;AAC1G,gBAAU,MAAM,UAAU;AAC1B,eAAS,oBAAoB,SAAS,kBAAkB;AAAA,IAC1D;AAAA,EACF;AACA,WAAS,oBAAoB,SAAS,kBAAkB;AACxD,WAAS,iBAAiB,SAAS,kBAAkB;AACvD;AAEA,SAAS,mBAAmB,MAAoC;AAC9D,QAAM,UAAU,qBAAqB,IAAI,IAAI;AAC7C,QAAM,gBAAgB,KAAK,QAAQ,cAAc,8BAA8B;AAC/E,MAAI,cAAc,cAAc,cAAc,2BAA2B;AACzE,QAAM,YAAY,KAAK,QAAQ,aAAa,QAAQ,KAAK;AACzD,QAAM,SAAS,OAAO,SAAS,UAAU,QAAQ,WAAW,EAAE,GAAG,EAAE,KAAK;AAExE,MAAI,CAAC,aAAa;AAChB,kBAAc,SAAS,cAAc,KAAK;AAC1C,gBAAY,YAAY;AAExB,UAAM,UAAU;AAAA,MACd;AAAA,QACE,MAAM;AAAA,QACN,aAAa,mCAAS,QAAQ;AAAA,QAC9B,MAAMC,MAAAA;AAAAA,MAAA;AAAA,MAER;AAAA,QACE,MAAM;AAAA,QACN,aAAa,mCAAS,QAAQ;AAAA,QAC9B,MAAMC,MAAAA;AAAAA,MAAA;AAAA,MAER;AAAA,QACE,MAAM;AAAA,QACN,aAAa,mCAAS,QAAQ;AAAA,QAC9B,MAAMC,MAAAA;AAAAA,MAAA;AAAA,MAER;AAAA,QACE,MAAM;AAAA,QACN,aAAa,mCAAS,QAAQ;AAAA,QAC9B,MAAMC,MAAAA;AAAAA,MAAA;AAAA,MAER;AAAA,QACE,MAAM;AAAA,QACN,aAAa,mCAAS,QAAQ;AAAA,QAC9B,MAAMC,MAAAA;AAAAA,MAAA;AAAA,MAER;AAAA,QACE,MAAM;AAAA,QACN,aAAa,mCAAS,QAAQ;AAAA,QAC9B,MAAMC,MAAAA;AAAAA,MAAA;AAAA,IACR;AAGF,YAAQ,QAAQ,CAAC,WAAW;AAC1B,YAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,iBAAW,YAAY;AAEvB,YAAM,gBAAgB,SAAS,cAAc,KAAK;AAClD,oBAAc,YAAY;AAE1B,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,YAAY;AAChB,UAAI,YAAY,OAAO;AACvB,UAAI,MAAM,UAAU;AACpB,UAAI,MAAM,aAAa;AACvB,UAAI,MAAM,iBAAiB;AAC3B,YAAM,aAAa,IAAI,cAAc,KAAK;AAE1C,iBAAW,MAAM,WAAW;AAC5B,iBAAW,MAAM,YAAY;AAC7B,iBAAW,MAAM,QAAQ;AACzB,iBAAW,MAAM,SAAS;AAC1B,iBAAW,gBAAgB,OAAO;AAClC,iBAAW,gBAAgB,QAAQ;AAEnC,oBAAc,YAAY,GAAG;AAE7B,YAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,eAAS,YAAY;AACrB,eAAS,cAAc,OAAO;AAE9B,iBAAW,YAAY,aAAa;AACpC,iBAAW,YAAY,QAAQ;AAC/B,iBAAW,iBAAiB,SAAS,MAAM;AACzC,aAAK,QAAQ,UAAU,OAAO,IAAI;AAClC,aAAK,OAAO,KAAK,QAAQ,QAAQ,CAAA,CAAE;AACnC,aAAK,QAAQ,aAAa,iBAAiB,KAAK,UAAU,KAAK,IAAI,CAAC;AACpE,oBAAY,MAAM,UAAU;AAAA,MAC9B,CAAC;AACD,kBAAY,YAAY,UAAU;AAAA,IACpC,CAAC;AACD,kBAAc,YAAY,WAAW;AACrC,QAAI,SAAS,KAAK;AAChB,kBAAY,MAAM,SAAS,GAAG,SAAS,GAAG;AAAA,IAC5C,OACK;AACH,kBAAY,MAAM,SAAS;AAAA,IAC7B;AAAA,EACF,OACK;AACH,QAAI,SAAS,KAAK;AAChB,kBAAY,MAAM,SAAS,GAAG,SAAS,GAAG;AAAA,IAC5C,OACK;AACH,kBAAY,MAAM,SAAS;AAAA,IAC7B;AACA,gBAAY,MAAM,UAAU;AAAA,EAC9B;AAEA,QAAM,qBAAqB,CAAC,MAAkB;AAC5C,QAAI,eAAmC;AACvC,UAAM,eAAe,cAAc,iBAAiB,2BAA2B;AAE/E,mBAAe,MAAM,KAAK,YAAY,EAAE,KAAK,UAAQ,KAAK,aAAa,mBAAmB,MAAM,iBAAiB;AAEjH,QAAI,CAAC,YAAY,SAAS,EAAE,MAAc,MAAM,CAAC,gBAAgB,CAAC,aAAa,SAAS,EAAE,MAAc,IAAI;AAC1G,kBAAY,MAAM,UAAU;AAC5B,eAAS,oBAAoB,SAAS,kBAAkB;AAAA,IAC1D;AAAA,EACF;AACA,WAAS,oBAAoB,SAAS,kBAAkB;AACxD,WAAS,iBAAiB,SAAS,kBAAkB;AACvD;AAEA,SAAS,oBAAoB,MAAoC;AAC/D,QAAM,gBAAgB,KAAK,QAAQ,cAAc,mCAAmC;AACpF,MAAI,CAAC,iBAAiB,CAAC,KAAK,QAAS;AAErC,QAAM,mBAAmB,KAAK;AAC9B,QAAM,eAAe,iBAAiB,MAAM,aAAa;AAEzD,MAAI,cAAc;AAChB,UAAM,mBAAmB,iBAAiB,aAAa,wBAAwB;AAC/E,UAAM,gBAAgB,iBAAiB,aAAa,qBAAqB;AACzE,UAAM,iBAAiB,iBAAiB,aAAa,sBAAsB;AAC3E,QAAI,iBAAiB,gBAAgB;AACnC,uBAAiB,MAAM,WAAW;AAClC,uBAAiB,MAAM,QAAQ;AAC/B,uBAAiB,MAAM,SAAS;AAChC,uBAAiB,MAAM,SAAS;AAAA,IAClC;AACA,UAAM,cAAc,cAAc,cAAc,GAAG;AACnD,QAAI,aAAa;AACf,kBAAY,YAAYR,MAAAA;AAAAA,IAC1B;AAAA,EACF,OACK;AACH,qBAAiB,aAAa,0BAA0B,iBAAiB,MAAM,YAAY,EAAE;AAC7F,qBAAiB,aAAa,uBAAuB,iBAAiB,MAAM,SAAS,EAAE;AACvF,qBAAiB,aAAa,wBAAwB,iBAAiB,MAAM,UAAU,EAAE;AACzF,qBAAiB,MAAM,WAAW;AAClC,qBAAiB,MAAM,MAAM;AAC7B,qBAAiB,MAAM,OAAO;AAC9B,qBAAiB,MAAM,QAAQ;AAC/B,qBAAiB,MAAM,SAAS;AAChC,qBAAiB,MAAM,SAAS;AAChC,UAAM,cAAc,cAAc,cAAc,GAAG;AACnD,QAAI,aAAa;AACf,kBAAY,YAAYS,MAAAA;AAAAA,IAC1B;AAAA,EACF;AACA,OAAK,QAAQ,SAAS,kBAAA;AACtB,OAAK,QAAQ,OAAA;AACf;;"}
1
+ {"version":3,"file":"control-panel.cjs.js","sources":["../../../../../src/modules/mind-map/modules/control-panel.ts"],"sourcesContent":["import type FluentEditor from '../../../core/fluent-editor'\nimport type MindMapPlaceholderBlot from '../formats/mind-map-blot'\nimport { CHANGE_LANGUAGE_EVENT } from '../../../config'\nimport { I18N } from '../../../modules/i18n'\nimport { getAllConfigs } from '../config-utils'\nimport { registerMindMapI18N } from '../i18n'\nimport { backIcon, catalogOrganizationIcon, contractIcon, fishboneIcon, fitIcon, forwardIcon, insertChildNodeIcon, insertIconIcon, insertNodeIcon, insertParentNodeIcon, logicalStructureIcon, mindMapIcon, organizationStructureIcon, removeNodeIcon, screenReduceIcon, screenTypeIcon, setLayoutIcon, timelineIcon, zoomInIcon, zoomOutIcon } from '../icons'\n\nclass MindMapControlPanelHandler {\n private texts: Record<string, string>\n private lang: string\n getText(key: keyof Record<string, string>): string {\n return this.texts[key]\n }\n\n constructor(private quill: FluentEditor, private blot: MindMapPlaceholderBlot) {\n const i18nModule = this.quill.getModule('i18n') as I18N\n registerMindMapI18N(I18N)\n this.lang = i18nModule.options.lang\n this.texts = this.resolveTexts()\n this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, (lang: string) => {\n this.lang = lang\n this.texts = this.resolveTexts()\n this.updateControlPanelTexts()\n })\n }\n\n resolveTexts() {\n const textKeys = [\n 'zoomOutTitle',\n 'zoomInTitle',\n 'fitTitle',\n 'backTitle',\n 'forwardTitle',\n 'inserChildNodeTitle',\n 'inserNodeTitle',\n 'insertIconTitle',\n 'inserParentNodeTitle',\n 'removeNodeTitle',\n 'setLayoutTitle',\n 'logicalStructureLayout',\n 'catalogOrganizationLayout',\n 'mindMapLayout',\n 'organizationStructureLayout',\n 'timelineLayout',\n 'fishboneLayout',\n 'panelStatusTitle',\n 'screenTypeTitle',\n ]\n\n return textKeys.reduce((acc, key) => {\n if (!key.includes('Title')) {\n acc[key] = I18N.parserText(`mindMap.layout.${key.replace('Layout', '')}`, this.lang)\n }\n else {\n acc[key] = I18N.parserText(`mindMap.controlPanel.${key}`, this.lang)\n }\n return acc\n }, {} as Record<string, string>)\n }\n\n updateControlPanelTexts() {\n const controlItems = this.blot.domNode.querySelectorAll('.ql-mind-map-control-item')\n\n const controlItemMap: Record<string, string> = {\n 'zoom-out': 'zoomOutTitle',\n 'zoom-in': 'zoomInTitle',\n 'fit': 'fitTitle',\n 'back': 'backTitle',\n 'forward': 'forwardTitle',\n 'insert-child-node': 'inserChildNodeTitle',\n 'insert-node': 'inserNodeTitle',\n 'insert-icon': 'insertIconTitle',\n 'insert-parent-node': 'inserParentNodeTitle',\n 'remove-node': 'removeNodeTitle',\n 'set-layout-icon': 'setLayoutTitle',\n 'panel-status': 'panelStatusTitle',\n 'screen-type': 'screenTypeTitle',\n }\n\n controlItems.forEach((item) => {\n const controlType = (item as HTMLElement).dataset.controlType\n if (controlType && controlItemMap[controlType] && this.texts[controlItemMap[controlType]]) {\n (item as HTMLElement).title = this.texts[controlItemMap[controlType]]\n }\n })\n }\n}\n\nconst controlPanelHandlers = new WeakMap<MindMapPlaceholderBlot, MindMapControlPanelHandler>()\n\nconst DISABLED_OPACITY = '0.5'\nconst ENABLED_OPACITY = '1'\nexport function createControlPanel(blot: MindMapPlaceholderBlot, quill: FluentEditor): void {\n let isStart = true\n let isEnd = true\n let selectedNodes: any[] = []\n blot.mindMap.on('node_active', (...args: unknown[]) => {\n selectedNodes = Array.isArray(args[1]) ? args[1] : []\n })\n // 中间的控制面板\n const controlPanel = document.createElement('div')\n controlPanel.className = 'ql-mind-map-control'\n // 右上的控制面板\n const controlRightUpPanel = document.createElement('div')\n controlRightUpPanel.className = 'ql-mind-map-right-up-control'\n // 左上的控制面板\n const controlLeftUpPanel = document.createElement('div')\n controlLeftUpPanel.className = 'ql-mind-map-left-up-control'\n\n const handler = new MindMapControlPanelHandler(quill, blot)\n controlPanelHandlers.set(blot, handler)\n\n const zoomOutBtn = createControlItem('zoom-out', handler.getText('zoomOutTitle'), () => handleZoomOut(blot))\n const zoomInBtn = createControlItem('zoom-in', handler.getText('zoomInTitle'), () => handleZoomIn(blot))\n const resetBtn = createControlItem('fit', handler.getText('fitTitle'), () => handleResetZoom(blot))\n const backBtn = createControlItem('back', handler.getText('backTitle'), () => {\n if (!isStart) {\n blot.mindMap.execCommand('BACK')\n }\n })\n const forwardBtn = createControlItem('forward', handler.getText('forwardTitle'), () => {\n if (!isEnd) {\n blot.mindMap.execCommand('FORWARD')\n }\n })\n const insertChildNode = createControlItem('insert-child-node', handler.getText('inserChildNodeTitle'), () => handleInsertChildNode(blot))\n const insertNode = createControlItem('insert-node', handler.getText('inserNodeTitle'), () => handleInsertNode(blot))\n const insertParentNode = createControlItem('insert-parent-node', handler.getText('inserParentNodeTitle'), () => handleInsertParentNode(blot))\n const removeNode = createControlItem('remove-node', handler.getText('removeNodeTitle'), () => handleRemoveNode(blot))\n const insertIconBtn = createControlItem('insert-icon', handler.getText('insertIconTitle'), () => handleInsertIcon(blot, selectedNodes))\n const setLayoutBtn = createControlItem('set-layout-icon', handler.getText('setLayoutTitle'), () => handleSetLayoutBtn(blot))\n const panelStatusBtn = createControlItem('panel-status', handler.getText('panelStatusTitle'))\n const screenTypeBtn = createControlItem('screen-type', handler.getText('screenTypeTitle'), () => handleScreenTypeBtn(blot))\n const updateButtonState = (index: number, len: number) => {\n isStart = index <= 0\n isEnd = index >= len - 1\n backBtn.style.cursor = isStart ? 'not-allowed' : 'pointer'\n backBtn.style.opacity = isStart ? DISABLED_OPACITY : ENABLED_OPACITY\n forwardBtn.style.cursor = isEnd ? 'not-allowed' : 'pointer'\n forwardBtn.style.opacity = isEnd ? DISABLED_OPACITY : ENABLED_OPACITY\n }\n\n blot.mindMap.on('back_forward', (index: number, len: number) => {\n updateButtonState(index, len)\n })\n controlPanel.append(zoomOutBtn, zoomInBtn, resetBtn, screenTypeBtn, backBtn, forwardBtn)\n blot.domNode.appendChild(controlPanel)\n controlRightUpPanel.append(panelStatusBtn)\n blot.domNode.appendChild(controlRightUpPanel)\n controlLeftUpPanel.append(insertChildNode, insertNode, insertParentNode, removeNode, insertIconBtn, setLayoutBtn)\n blot.domNode.appendChild(controlLeftUpPanel)\n}\n\nfunction createControlItem(iconClass: string, title: string, onClick?: () => void, disabled = false) {\n const controlItem = document.createElement('div')\n controlItem.className = 'ql-mind-map-control-item'\n controlItem.title = title\n controlItem.dataset.controlType = iconClass\n controlItem.style.cursor = disabled ? 'not-allowed' : 'pointer'\n controlItem.style.opacity = disabled ? DISABLED_OPACITY : ENABLED_OPACITY\n\n const iconMap: Record<string, string> = {\n 'back': backIcon,\n 'forward': forwardIcon,\n 'zoom-out': zoomOutIcon,\n 'zoom-in': zoomInIcon,\n 'fit': fitIcon,\n 'insert-child-node': insertChildNodeIcon,\n 'insert-node': insertNodeIcon,\n 'insert-parent-node': insertParentNodeIcon,\n 'remove-node': removeNodeIcon,\n 'insert-icon': insertIconIcon,\n 'set-layout-icon': setLayoutIcon,\n 'screen-type': screenTypeIcon,\n 'panel-status': contractIcon,\n }\n\n const icon = document.createElement('i')\n icon.innerHTML = iconMap[iconClass] || ''\n controlItem.appendChild(icon)\n\n if (!disabled) {\n controlItem.addEventListener('click', onClick)\n }\n\n return controlItem\n}\n\nfunction handleInsertChildNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_CHILD_NODE')\n}\n\nfunction handleInsertNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_NODE')\n}\n\nfunction handleInsertParentNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_PARENT_NODE')\n}\n\nfunction handleRemoveNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('REMOVE_CURRENT_NODE')\n}\n\nfunction handleZoomIn(blot: MindMapPlaceholderBlot): void {\n if (blot.mindMap && blot.mindMap.view) {\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const cx = containerRect.width / 2\n const cy = containerRect.height / 2\n blot.mindMap.view.enlarge(cx, cy, false)\n blot.zoomCount++\n }\n}\n\nfunction handleZoomOut(blot: MindMapPlaceholderBlot): void {\n if (blot.mindMap && blot.mindMap.view) {\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const cx = containerRect.width / 2\n const cy = containerRect.height / 2\n blot.mindMap.view.narrow(cx, cy, false)\n blot.zoomCount--\n }\n}\n\nfunction handleResetZoom(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.renderer.setRootNodeCenter()\n if (!blot.mindMap || !blot.mindMap.view || blot.zoomCount === 0) return\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const centerX = containerRect.width / 2\n const centerY = containerRect.height / 2\n const operationCount = Math.abs(blot.zoomCount)\n const isEnlarge = blot.zoomCount < 0\n for (let i = 0; i < operationCount; i++) {\n if (isEnlarge) {\n blot.mindMap.view.enlarge(centerX, centerY, false)\n }\n else {\n blot.mindMap.view.narrow(centerX, centerY, false)\n }\n }\n blot.zoomCount = 0\n}\n\nfunction handleInsertIcon(blot: MindMapPlaceholderBlot, selectedNodes: any[]): void {\n (blot as any).selectedNodes = selectedNodes\n const heightStr = blot.domNode.getAttribute('height') || '500px'\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\n let iconList = []\n const { deps } = getAllConfigs(blot.quill)\n iconList = deps.nodeIconList.nodeIconList\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\n let iconPanel = leftUpControl.querySelector('.ql-mind-map-icon-panel') as HTMLElement\n if (!iconPanel) {\n iconPanel = document.createElement('div')\n iconPanel.className = 'ql-mind-map-icon-panel'\n\n iconList.forEach((group) => {\n const groupContainer = document.createElement('div')\n groupContainer.className = 'ql-mind-map-icon-group-container'\n\n group.list.forEach((icon: { icon: string, name: string }) => {\n const iconItem = document.createElement('div')\n iconItem.className = 'ql-mind-map-icon-item'\n iconItem.innerHTML = icon.icon\n\n iconItem.addEventListener('click', () => {\n const currentSelectedNodes = (blot as any).selectedNodes || []\n if (currentSelectedNodes.length > 0) {\n const node = currentSelectedNodes[0]\n\n if (node.getData('icon') && node.getData('icon')[0] === `${group.type}_${icon.name}`) {\n node.setIcon([])\n }\n else {\n node.setIcon([`${group.type}_${icon.name}`])\n }\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n }\n iconPanel.style.display = 'none'\n })\n groupContainer.appendChild(iconItem)\n })\n iconPanel.appendChild(groupContainer)\n })\n if (height < 395) {\n iconPanel.style.height = `${height - 130}px`\n }\n else {\n iconPanel.style.height = '270px'\n }\n leftUpControl.appendChild(iconPanel)\n }\n else {\n if (height < 395) {\n iconPanel.style.height = `${height - 130}px`\n }\n else {\n iconPanel.style.height = '270px'\n }\n iconPanel.style.display = 'block'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let insertIconBtn: HTMLElement | null = null\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\n\n controlItems.forEach((item) => {\n if ((item as HTMLElement).dataset.controlType === 'insert-icon') {\n insertIconBtn = item as HTMLElement\n }\n })\n\n if (!iconPanel.contains(e.target as Node) && (!insertIconBtn || !insertIconBtn.contains(e.target as Node))) {\n iconPanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n document.removeEventListener('click', handleOutsideClick)\n document.addEventListener('click', handleOutsideClick)\n}\n\nfunction handleSetLayoutBtn(blot: MindMapPlaceholderBlot): void {\n const handler = controlPanelHandlers.get(blot)\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\n let layoutPanel = leftUpControl.querySelector('.ql-mind-map-layout-panel') as HTMLElement\n const heightStr = blot.domNode.getAttribute('height') || '500'\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\n\n if (!layoutPanel) {\n layoutPanel = document.createElement('div')\n layoutPanel.className = 'ql-mind-map-layout-panel'\n\n const layouts = [\n {\n name: 'logicalStructure',\n displayName: handler?.getText('logicalStructureLayout'),\n icon: logicalStructureIcon,\n },\n {\n name: 'catalogOrganization',\n displayName: handler?.getText('catalogOrganizationLayout'),\n icon: catalogOrganizationIcon,\n },\n {\n name: 'mindMap',\n displayName: handler?.getText('mindMapLayout'),\n icon: mindMapIcon,\n },\n {\n name: 'organizationStructure',\n displayName: handler?.getText('organizationStructureLayout'),\n icon: organizationStructureIcon,\n },\n {\n name: 'timeline',\n displayName: handler?.getText('timelineLayout'),\n icon: timelineIcon,\n },\n {\n name: 'fishbone',\n displayName: handler?.getText('fishboneLayout'),\n icon: fishboneIcon,\n },\n ]\n\n layouts.forEach((layout) => {\n const layoutItem = document.createElement('div')\n layoutItem.className = 'ql-mind-map-layout-item'\n\n const iconContainer = document.createElement('div')\n iconContainer.className = 'ql-mind-map-layout-icon-container'\n\n const img = document.createElement('div')\n img.className = 'ql-mind-map-layout-icon'\n img.innerHTML = layout.icon\n img.style.display = 'flex'\n img.style.alignItems = 'center'\n img.style.justifyContent = 'center'\n const svgElement = img.querySelector('svg')\n\n svgElement.style.maxWidth = '100%'\n svgElement.style.maxHeight = '100%'\n svgElement.style.width = 'auto'\n svgElement.style.height = 'auto'\n svgElement.removeAttribute('width')\n svgElement.removeAttribute('height')\n\n iconContainer.appendChild(img)\n\n const nameText = document.createElement('div')\n nameText.className = 'ql-mind-map-layout-name'\n nameText.textContent = layout.displayName\n\n layoutItem.appendChild(iconContainer)\n layoutItem.appendChild(nameText)\n layoutItem.addEventListener('click', () => {\n blot.mindMap.setLayout(layout.name)\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n layoutPanel.style.display = 'none'\n })\n layoutPanel.appendChild(layoutItem)\n })\n leftUpControl.appendChild(layoutPanel)\n if (height < 395) {\n layoutPanel.style.height = `${height - 130}px`\n }\n else {\n layoutPanel.style.height = '270px'\n }\n }\n else {\n if (height < 395) {\n layoutPanel.style.height = `${height - 130}px`\n }\n else {\n layoutPanel.style.height = '270px'\n }\n layoutPanel.style.display = 'flex'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let setLayoutBtn: HTMLElement | null = null\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\n\n setLayoutBtn = Array.from(controlItems).find(item => item.getAttribute('data-control-type') === 'set-layout-icon') as HTMLElement | null\n\n if (!layoutPanel.contains(e.target as Node) && (!setLayoutBtn || !setLayoutBtn.contains(e.target as Node))) {\n layoutPanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n document.removeEventListener('click', handleOutsideClick)\n document.addEventListener('click', handleOutsideClick)\n}\n\nfunction handleScreenTypeBtn(blot: MindMapPlaceholderBlot): void {\n const screenTypeBtn = blot.domNode.querySelector('[data-control-type=\"screen-type\"]') as HTMLElement | null\n if (!screenTypeBtn || !blot.domNode) return\n\n const mindMapContainer = blot.domNode\n const isFullscreen = mindMapContainer.style.position === 'fixed'\n\n if (isFullscreen) {\n const originalPosition = mindMapContainer.getAttribute('data-original-position')\n const originalWidth = mindMapContainer.getAttribute('data-original-width')\n const originalHeight = mindMapContainer.getAttribute('data-original-height')\n if (originalWidth && originalHeight) {\n mindMapContainer.style.position = originalPosition\n mindMapContainer.style.width = originalWidth\n mindMapContainer.style.height = originalHeight\n mindMapContainer.style.zIndex = '0'\n }\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenTypeIcon\n }\n }\n else {\n mindMapContainer.setAttribute('data-original-position', mindMapContainer.style.position || '')\n mindMapContainer.setAttribute('data-original-width', mindMapContainer.style.width || '')\n mindMapContainer.setAttribute('data-original-height', mindMapContainer.style.height || '')\n mindMapContainer.style.position = 'fixed'\n mindMapContainer.style.top = '0'\n mindMapContainer.style.left = '0'\n mindMapContainer.style.width = '100vw'\n mindMapContainer.style.height = '100vh'\n mindMapContainer.style.zIndex = '100'\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenReduceIcon\n }\n }\n blot.mindMap.renderer.setRootNodeCenter()\n blot.mindMap.resize()\n}\n"],"names":["registerMindMapI18N","I18N","CHANGE_LANGUAGE_EVENT","index","backIcon","forwardIcon","zoomOutIcon","zoomInIcon","fitIcon","insertChildNodeIcon","insertNodeIcon","insertParentNodeIcon","removeNodeIcon","insertIconIcon","setLayoutIcon","screenTypeIcon","contractIcon","getAllConfigs","logicalStructureIcon","catalogOrganizationIcon","mindMapIcon","organizationStructureIcon","timelineIcon","fishboneIcon","screenReduceIcon"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@opentiny/fluent-editor",
3
3
  "type": "module",
4
- "version": "4.0.0-alpha.11",
4
+ "version": "4.0.0-alpha.12",
5
5
  "description": "A rich text editor based on Quill 2.0, which extends rich modules and formats on the basis of Quill. It's powerful and out-of-the-box.",
6
6
  "author": "OpenTiny Team",
7
7
  "license": "MIT",
@@ -26,47 +26,10 @@
26
26
  "main": "lib/index.cjs.js",
27
27
  "module": "es/index.es.js",
28
28
  "types": "types/index.d.ts",
29
- "scripts": {
30
- "dev": "vite build --watch",
31
- "build": "vite build && node scripts/pre-release.cjs",
32
- "test": "jest",
33
- "pub": "cd dist && npm publish"
34
- },
35
29
  "dependencies": {
36
30
  "lodash-es": "^4.17.15",
37
31
  "quill": "^2.0.0",
38
32
  "quill-easy-color": "^0.0.10",
39
33
  "quill-shortcut-key": "^0.0.5"
40
- },
41
- "devDependencies": {
42
- "@emoji-mart/data": "^1.2.1",
43
- "@floating-ui/dom": "^1.7.2",
44
- "@logicflow/core": "^2.0.16",
45
- "@logicflow/extension": "^2.0.21",
46
- "@types/jest": "^26.0.23",
47
- "@types/lodash-es": "^4.17.12",
48
- "commander": "^6.2.0",
49
- "emoji-mart": "^5.6.0",
50
- "highlight.js": "^10.2.0",
51
- "html2canvas": "^1.4.1",
52
- "jest": "^26.6.3",
53
- "mathlive": "^0.101.0",
54
- "parchment": "^3.0.0",
55
- "quill-cursors": "^4.0.4",
56
- "sass": "^1.90.0",
57
- "shelljs": "^0.8.4",
58
- "simple-mind-map": "0.14.0-fix.1",
59
- "simple-mind-map-plugin-themes": "^1.0.1",
60
- "ts-jest": "^26.5.6",
61
- "ts-node": "^9.1.1",
62
- "typescript": "^4.9.5",
63
- "vite": "^5.0.0",
64
- "vite-plugin-dts": "^4.3.0",
65
- "y-indexeddb": "^9.0.12",
66
- "y-protocols": "^1.0.6",
67
- "y-quill": "^1.0.0",
68
- "y-webrtc": "10.3.0",
69
- "y-websocket": "^3.0.0",
70
- "yjs": "^13.6.27"
71
34
  }
72
35
  }
@@ -0,0 +1,33 @@
1
+ diff --git a/core/editor.js b/core/editor.js
2
+ index 07fd544a5857c0c498abf899c66e34a1b6b6a736..62072586605974e6890a919312c0bbd971870b9e 100644
3
+ --- a/core/editor.js
4
+ +++ b/core/editor.js
5
+ @@ -15,7 +15,14 @@ class Editor {
6
+ applyDelta(delta) {
7
+ this.scroll.update();
8
+ let scrollLength = this.scroll.length();
9
+ - this.scroll.batchStart();
10
+ +
11
+ + // Check if a batch already exists (e.g. during composition)
12
+ + const isAlreadyBatching = Boolean(this.scroll.batch);
13
+ +
14
+ + if (!isAlreadyBatching) {
15
+ + this.scroll.batchStart();
16
+ + }
17
+ +
18
+ const normalizedDelta = normalizeDelta(delta);
19
+ const deleteDelta = new Delta();
20
+ const normalizedOps = splitOpLines(normalizedDelta.ops.slice());
21
+ @@ -93,7 +100,11 @@ class Editor {
22
+ }
23
+ return index + Op.length(op);
24
+ }, 0);
25
+ - this.scroll.batchEnd();
26
+ +
27
+ + if (!isAlreadyBatching) {
28
+ + this.scroll.batchEnd();
29
+ + }
30
+ +
31
+ this.scroll.optimize();
32
+ return this.update(normalizedDelta);
33
+ }