superdoc 2.29.0-next.1 → 2.29.0-next.3

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 (67) hide show
  1. package/dist/chunks/{FindReplaceSurface-Dm043CZP.es.js → FindReplaceSurface-BKVHzhQ4.es.js} +34 -26
  2. package/dist/chunks/{FindReplaceSurface-BRs3JrCq.cjs → FindReplaceSurface-BNDrJ6VS.cjs} +34 -26
  3. package/dist/chunks/{PasswordPromptSurface-DGjmN7A-.es.js → PasswordPromptSurface-6mF6Azda.es.js} +6 -4
  4. package/dist/chunks/{PasswordPromptSurface-BpqP4pUa.cjs → PasswordPromptSurface-BNkaztaP.cjs} +6 -4
  5. package/dist/chunks/{create-super-doc-ui-0OA8hCNb.cjs → create-super-doc-ui-BAGOnYGM.cjs} +2 -2
  6. package/dist/chunks/{create-super-doc-ui-Duf65d0b.es.js → create-super-doc-ui-BFt8agAI.es.js} +2 -2
  7. package/dist/collaboration-upgrade-engine.cjs +1 -1
  8. package/dist/collaboration-upgrade-engine.es.js +1 -1
  9. package/dist/document-api/src/contract/metadata-types.d.ts +1 -1
  10. package/dist/document-api/src/contract/operation-definitions.d.ts +1 -1
  11. package/dist/document-api/src/tables/tables.d.ts +2 -1
  12. package/dist/document-api/src/types/table-operations.types.d.ts +1 -0
  13. package/dist/layout-engine/contracts/src/index.d.ts +1 -1
  14. package/dist/layout-engine/contracts/src/paragraph-visible-text.d.ts +3 -1
  15. package/dist/public/ui-react.cjs +1 -1
  16. package/dist/public/ui-react.es.js +1 -1
  17. package/dist/public/ui-vue.cjs +1 -1
  18. package/dist/public/ui-vue.es.js +1 -1
  19. package/dist/public/ui.cjs +1 -1
  20. package/dist/public/ui.es.js +1 -1
  21. package/dist/style.css +1 -1
  22. package/dist/style.layered.css +1 -1
  23. package/dist/superdoc/src/components/CommentsLayer/CommentDialog.vue.d.ts +88 -1264
  24. package/dist/superdoc/src/components/CommentsLayer/CommentHeader.vue.d.ts +106 -22
  25. package/dist/superdoc/src/components/CommentsLayer/CommentInput.vue.d.ts +74 -14
  26. package/dist/superdoc/src/components/CommentsLayer/CommentsDropdown.vue.d.ts +55 -20
  27. package/dist/superdoc/src/components/CommentsLayer/InternalDropdown.vue.d.ts +24 -8
  28. package/dist/superdoc/src/components/CommentsLayer/PdfCommentsLayer.vue.d.ts +5 -3
  29. package/dist/superdoc/src/components/CommentsLayer/commentsList/ReviewDirectoryListItem.vue.d.ts +60 -12
  30. package/dist/superdoc/src/components/CommentsLayer/commentsList/commentsList.vue.d.ts +20 -6
  31. package/dist/superdoc/src/components/CommentsLayer/use-comment.d.ts +1 -0
  32. package/dist/superdoc/src/components/general/Avatar.vue.d.ts +12 -5
  33. package/dist/superdoc/src/components/surfaces/FindReplaceSurface.vue.d.ts +58 -15
  34. package/dist/superdoc/src/components/surfaces/PasswordPromptSurface.vue.d.ts +58 -15
  35. package/dist/superdoc/src/components/surfaces/SurfaceFloating.vue.d.ts +14 -6
  36. package/dist/superdoc/src/components/surfaces/SurfaceHost.vue.d.ts +25 -15
  37. package/dist/superdoc/src/core/SuperDoc.d.ts +1 -6
  38. package/dist/superdoc/src/core/collaboration/permissions.d.ts +1 -1
  39. package/dist/superdoc/src/core/editor-runtime/index.d.ts +1 -1
  40. package/dist/superdoc/src/core/editor-runtime/types.d.ts +7 -0
  41. package/dist/superdoc/src/core/editor-runtime/v2/v2-editor-runtime-adapter.d.ts +2 -1
  42. package/dist/superdoc/src/icons.d.ts +8 -0
  43. package/dist/superdoc/src/internal/toolbar/built-in/AIWriter.vue.d.ts +76 -15
  44. package/dist/superdoc/src/internal/toolbar/built-in/AlignmentButtons.vue.d.ts +5 -3
  45. package/dist/superdoc/src/internal/toolbar/built-in/ButtonGroup.vue.d.ts +105 -5
  46. package/dist/superdoc/src/internal/toolbar/built-in/DocumentMode.vue.d.ts +20 -6
  47. package/dist/superdoc/src/internal/toolbar/built-in/IconGrid.vue.d.ts +44 -12
  48. package/dist/superdoc/src/internal/toolbar/built-in/IconGridRow.vue.d.ts +32 -9
  49. package/dist/superdoc/src/internal/toolbar/built-in/StyleButtonsList.vue.d.ts +39 -10
  50. package/dist/superdoc/src/internal/toolbar/built-in/TableActions.vue.d.ts +24 -6
  51. package/dist/superdoc/src/internal/toolbar/built-in/TableGrid.vue.d.ts +7 -3
  52. package/dist/superdoc/src/internal/toolbar/built-in/ToolbarComboBox.vue.d.ts +1 -1
  53. package/dist/superdoc/src/internal/toolbar/built-in/ToolbarDropdown.vue.d.ts +1 -0
  54. package/dist/superdoc/src/internal/toolbar/built-in/ToolbarSeparator.vue.d.ts +16 -6
  55. package/dist/superdoc/src/internal/toolbar/built-in/color-dropdown-helpers.d.ts +2 -2
  56. package/dist/superdoc/src/internal/toolbar/built-in/list-style-buttons.d.ts +2 -2
  57. package/dist/superdoc/src/internal/toolbar/built-in/toolbarIcons.d.ts +67 -0
  58. package/dist/superdoc/src/stores/helpers/comment-draft-text.d.ts +1 -0
  59. package/dist/superdoc/src/stores/helpers/tracked-change-row-values.d.ts +25 -0
  60. package/dist/superdoc.cjs +349 -231
  61. package/dist/superdoc.es.js +322 -207
  62. package/dist-cdn/style.layered.css +1 -1
  63. package/dist-cdn/superdoc.min.css +1 -1
  64. package/dist-cdn/superdoc.min.js +42 -42
  65. package/package.json +2 -2
  66. package/dist/superdoc/src/internal/toolbar/built-in/FontFamilyCombobox.vue.d.ts +0 -10
  67. package/dist/superdoc/src/internal/toolbar/built-in/FontSizeCombobox.vue.d.ts +0 -10
package/dist/superdoc.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_rolldown_runtime = require("./chunks/rolldown-runtime-74VwNCz7.cjs");
3
3
  const require_blank_docx = require("./chunks/blank-docx-BuFAbRjs.cjs");
4
- const require_create_super_doc_ui = require("./chunks/create-super-doc-ui-0OA8hCNb.cjs");
4
+ const require_create_super_doc_ui = require("./chunks/create-super-doc-ui-BAGOnYGM.cjs");
5
5
  const require_eventemitter3 = require("./chunks/eventemitter3-C_TAnXOl.cjs");
6
6
  const require_uuid = require("./chunks/uuid-BhG0ngwk.cjs");
7
7
  const require__plugin_vue_export_helper = require("./chunks/_plugin-vue_export-helper-6MBoygIY.cjs");
@@ -259,7 +259,7 @@ var v_click_outside_default = {
259
259
  var DEFAULT_ENDPOINT = "https://ingest.superdoc.dev/v1/collect";
260
260
  function getSuperdocVersion() {
261
261
  try {
262
- return "2.29.0-next.1";
262
+ return "2.29.0-next.3";
263
263
  } catch {
264
264
  return "unknown";
265
265
  }
@@ -7384,74 +7384,88 @@ var buildTrackedChangeDecisionLinkIndex = (allComments, previous = /* @__PURE__
7384
7384
  return next;
7385
7385
  };
7386
7386
  //#endregion
7387
- //#region src/stores/comments-store.js
7388
- var makeTrackedChangeAnchorKey = ({ storyKey, rawId }) => `tc::${storyKey}::${rawId}`;
7387
+ //#region src/stores/helpers/comment-draft-text.ts
7389
7388
  var COMMENT_DRAFT_BR_TAG = /<br(?:\s[^>]*)?\s*\/?>/gi;
7390
7389
  var COMMENT_DRAFT_BLOCK_BOUNDARY = /(?:<\/(?:p|div|li|blockquote|pre|h[1-6])\s*>\s*)+(?:<(?:p|div|li|blockquote|pre|h[1-6])(?:\s[^>]*)?\s*\/?>)+/gi;
7391
7390
  var COMMENT_DRAFT_BLOCK_OPEN_TAG = /<(?:p|div|li|blockquote|pre|h[1-6])(?:\s[^>]*)?\s*\/?>/gi;
7392
7391
  var COMMENT_DRAFT_BLOCK_CLOSE_TAG = /<\/(?:p|div|li|blockquote|pre|h[1-6])\s*>/gi;
7393
7392
  var COMMENT_DRAFT_ANY_TAG = /<\/?[A-Za-z][A-Za-z0-9:-]*(?:\s[^>]*)?\s*\/?>/g;
7394
- var COMMENT_DRAFT_ENTITY = /&(#x[0-9a-fA-F]+|#\d+|[a-zA-Z][a-zA-Z0-9]+);/g;
7395
- var COMMENT_DRAFT_NAMED_ENTITIES = {
7396
- amp: "&",
7397
- apos: "'",
7398
- gt: ">",
7399
- lt: "<",
7400
- nbsp: " ",
7401
- quot: "\""
7393
+ var COMMENT_DRAFT_ENTITY = /&(#[xX][0-9a-fA-F]+|#\d+|[a-zA-Z][a-zA-Z0-9]+);/g;
7394
+ var COMMENT_DRAFT_NAMED_ENTITIES = /* @__PURE__ */ new Map([
7395
+ ["amp", "&"],
7396
+ ["apos", "'"],
7397
+ ["gt", ">"],
7398
+ ["lt", "<"],
7399
+ ["nbsp", " "],
7400
+ ["quot", "\""]
7401
+ ]);
7402
+ var decodeCommentDraftEntity = (entity) => {
7403
+ const lower = entity.toLowerCase();
7404
+ const named = COMMENT_DRAFT_NAMED_ENTITIES.get(lower);
7405
+ if (named !== void 0) return named;
7406
+ const radix = lower.startsWith("#x") ? 16 : lower.startsWith("#") ? 10 : null;
7407
+ if (!radix) return null;
7408
+ const value = lower.startsWith("#x") ? lower.slice(2) : lower.slice(1);
7409
+ const codePoint = Number.parseInt(value, radix);
7410
+ if (!Number.isFinite(codePoint)) return null;
7411
+ try {
7412
+ return String.fromCodePoint(codePoint);
7413
+ } catch {
7414
+ return null;
7415
+ }
7416
+ };
7417
+ var decodeCommentDraftEntities = (value) => value.replace(COMMENT_DRAFT_ENTITY, (match, entity) => decodeCommentDraftEntity(entity) ?? match);
7418
+ var normalizeV2CommentDraftText = (value) => {
7419
+ const html = String(value ?? "");
7420
+ if (!html || html === "<p></p>") return "";
7421
+ return decodeCommentDraftEntities(html.replace(COMMENT_DRAFT_BLOCK_BOUNDARY, "\n").replace(COMMENT_DRAFT_BR_TAG, "\n").replace(COMMENT_DRAFT_BLOCK_CLOSE_TAG, "").replace(COMMENT_DRAFT_BLOCK_OPEN_TAG, "").replace(COMMENT_DRAFT_ANY_TAG, ""));
7402
7422
  };
7423
+ //#endregion
7424
+ //#region src/stores/helpers/tracked-change-row-values.ts
7425
+ var isObjectOrArray = (value) => require_create_super_doc_ui.isPlainObject(value) || Array.isArray(value);
7426
+ var stringOrEmpty = (value) => typeof value === "string" ? value : "";
7427
+ var makeTrackedChangeAnchorKey = ({ storyKey, rawId }) => `tc::${storyKey}::${rawId}`;
7403
7428
  var shallowEqual = (a, b) => {
7404
7429
  if (Object.is(a, b)) return true;
7405
- if (!a || !b || typeof a !== "object" || typeof b !== "object") return false;
7430
+ if (!isObjectOrArray(a) || !isObjectOrArray(b)) return false;
7406
7431
  const aKeys = Object.keys(a);
7407
7432
  const bKeys = Object.keys(b);
7408
7433
  if (aKeys.length !== bKeys.length) return false;
7409
7434
  return aKeys.every((key) => Object.prototype.hasOwnProperty.call(b, key) && Object.is(a[key], b[key]));
7410
7435
  };
7411
- /**
7412
- * Normalize the optional signed tracked-change detail lines
7413
- * (`[{ excerpt, label }]`, TCS-LIST-005) to a stable shape; absent, empty, or
7414
- * malformed input reads as `null` so legacy rows stay untouched.
7415
- */
7436
+ var elementsShallowEqual = (a, b) => {
7437
+ if (a === b) return true;
7438
+ if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;
7439
+ return a.every((element, index) => shallowEqual(element, b[index]));
7440
+ };
7416
7441
  var normalizeTrackedChangeDetailLines = (lines) => {
7417
7442
  if (!Array.isArray(lines)) return null;
7418
- const normalized = lines.filter((line) => line && typeof line === "object").map((line) => ({
7419
- excerpt: typeof line.excerpt === "string" ? line.excerpt : "",
7420
- label: typeof line.label === "string" ? line.label : ""
7443
+ const normalized = lines.filter(isObjectOrArray).map((line) => ({
7444
+ excerpt: stringOrEmpty(line.excerpt),
7445
+ label: stringOrEmpty(line.label)
7421
7446
  }));
7422
7447
  return normalized.length > 0 ? normalized : null;
7423
7448
  };
7424
- /**
7425
- * Element-wise equality for detail-line arrays: refresh paths rebuild the
7426
- * array each pass, so reference equality would rebroadcast every keystroke.
7427
- */
7428
- var trackedChangeDetailLinesEqual = (a, b) => {
7429
- if (a === b) return true;
7430
- if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;
7431
- return a.every((line, index) => shallowEqual(line, b[index]));
7432
- };
7449
+ var trackedChangeDetailLinesEqual = elementsShallowEqual;
7433
7450
  var normalizeTrackedChangeCustomAttributes = (attributes) => {
7434
7451
  if (!Array.isArray(attributes)) return null;
7435
- return attributes.filter((attribute) => attribute && typeof attribute === "object").map((attribute) => ({
7436
- name: typeof attribute.name === "string" ? attribute.name : "",
7437
- namespaceUri: typeof attribute.namespaceUri === "string" ? attribute.namespaceUri : "",
7438
- localName: typeof attribute.localName === "string" ? attribute.localName : "",
7439
- value: typeof attribute.value === "string" ? attribute.value : ""
7452
+ return attributes.filter(isObjectOrArray).map((attribute) => ({
7453
+ name: stringOrEmpty(attribute.name),
7454
+ namespaceUri: stringOrEmpty(attribute.namespaceUri),
7455
+ localName: stringOrEmpty(attribute.localName),
7456
+ value: stringOrEmpty(attribute.value)
7440
7457
  })).filter((attribute) => attribute.name && attribute.namespaceUri && attribute.localName);
7441
7458
  };
7442
- var trackedChangeCustomAttributesEqual = (left, right) => {
7443
- if (left === right) return true;
7444
- if (!Array.isArray(left) || !Array.isArray(right) || left.length !== right.length) return false;
7445
- return left.every((attribute, index) => shallowEqual(attribute, right[index]));
7446
- };
7459
+ var trackedChangeCustomAttributesEqual = elementsShallowEqual;
7460
+ var positiveDimension = (value) => require_is_finite_number.isFiniteNumber(value) && value > 0 ? value : null;
7447
7461
  var normalizeTrackedChangeImagePreview = (preview) => {
7448
- if (!preview || typeof preview !== "object") return null;
7462
+ if (!isObjectOrArray(preview)) return null;
7449
7463
  const src = typeof preview.src === "string" ? preview.src : null;
7450
7464
  if (!src || !src.startsWith("data:image/")) return null;
7451
7465
  const contentType = typeof preview.contentType === "string" && preview.contentType.startsWith("image/") ? preview.contentType : null;
7452
7466
  const role = typeof preview.role === "string" ? preview.role : null;
7453
- const width = require_is_finite_number.isFiniteNumber(preview.width) && preview.width > 0 ? preview.width : null;
7454
- const height = require_is_finite_number.isFiniteNumber(preview.height) && preview.height > 0 ? preview.height : null;
7467
+ const width = positiveDimension(preview.width);
7468
+ const height = positiveDimension(preview.height);
7455
7469
  const alt = typeof preview.alt === "string" && preview.alt.length > 0 ? preview.alt : "Tracked image preview";
7456
7470
  return {
7457
7471
  src,
@@ -7462,35 +7476,16 @@ var normalizeTrackedChangeImagePreview = (preview) => {
7462
7476
  alt
7463
7477
  };
7464
7478
  };
7465
- var decodeCommentDraftEntity = (entity) => {
7466
- const lower = String(entity).toLowerCase();
7467
- const named = COMMENT_DRAFT_NAMED_ENTITIES[lower];
7468
- if (named !== void 0) return named;
7469
- const radix = lower.startsWith("#x") ? 16 : lower.startsWith("#") ? 10 : null;
7470
- if (!radix) return null;
7471
- const value = lower.startsWith("#x") ? lower.slice(2) : lower.slice(1);
7472
- const codePoint = Number.parseInt(value, radix);
7473
- if (!Number.isFinite(codePoint)) return null;
7474
- try {
7475
- return String.fromCodePoint(codePoint);
7476
- } catch {
7477
- return null;
7478
- }
7479
- };
7480
- var decodeCommentDraftEntities = (value) => value.replace(COMMENT_DRAFT_ENTITY, (match, entity) => decodeCommentDraftEntity(entity) ?? match);
7481
- var normalizeV2CommentDraftText = (value) => {
7482
- const html = String(value ?? "");
7483
- if (!html || html === "<p></p>") return "";
7484
- return decodeCommentDraftEntities(html.replace(COMMENT_DRAFT_BLOCK_BOUNDARY, "\n").replace(COMMENT_DRAFT_BR_TAG, "\n").replace(COMMENT_DRAFT_BLOCK_CLOSE_TAG, "").replace(COMMENT_DRAFT_BLOCK_OPEN_TAG, "").replace(COMMENT_DRAFT_ANY_TAG, ""));
7485
- };
7486
7479
  var cloneV2TrackedChangeStory = (story) => {
7487
- if (!story || typeof story !== "object") return null;
7480
+ if (!isObjectOrArray(story)) return null;
7488
7481
  const rawStory = require__plugin_vue_export_helper.toRaw(story);
7489
7482
  return {
7490
7483
  ...rawStory,
7491
- ...rawStory.section && typeof rawStory.section === "object" ? { section: { ...require__plugin_vue_export_helper.toRaw(rawStory.section) } } : {}
7484
+ ...isObjectOrArray(rawStory.section) ? { section: { ...require__plugin_vue_export_helper.toRaw(rawStory.section) } } : {}
7492
7485
  };
7493
7486
  };
7487
+ //#endregion
7488
+ //#region src/stores/comments-store.js
7494
7489
  var useCommentsStore = defineStore("comments", () => {
7495
7490
  const BODY_TRACKED_CHANGE_STORY = {
7496
7491
  kind: "story",
@@ -11093,7 +11088,7 @@ function useUiFontFamily() {
11093
11088
  }) };
11094
11089
  }
11095
11090
  //#endregion
11096
- //#region src/components/CommentsLayer/CommentsDropdown.vue
11091
+ //#region src/components/CommentsLayer/CommentsDropdown.vue?vue&type=script&setup=true&lang.ts
11097
11092
  var _hoisted_1$31 = { class: "comments-dropdown" };
11098
11093
  var _hoisted_2$24 = ["onClick"];
11099
11094
  var _hoisted_3$21 = {
@@ -11102,7 +11097,7 @@ var _hoisted_3$21 = {
11102
11097
  };
11103
11098
  var _hoisted_4$15 = ["innerHTML"];
11104
11099
  var _hoisted_5$11 = { class: "comments-dropdown__option-label" };
11105
- var _sfc_main$25 = {
11100
+ var CommentsDropdown_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
11106
11101
  __name: "CommentsDropdown",
11107
11102
  props: {
11108
11103
  options: {
@@ -11251,15 +11246,17 @@ var _sfc_main$25 = {
11251
11246
  }), 128))], 4)) : require__plugin_vue_export_helper.createCommentVNode("", true)]))]);
11252
11247
  };
11253
11248
  }
11254
- };
11255
- var CommentsDropdown_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$25, [["__scopeId", "data-v-7eced80a"]]);
11249
+ });
11256
11250
  //#endregion
11257
- //#region src/components/CommentsLayer/InternalDropdown.vue
11251
+ //#region src/components/CommentsLayer/CommentsDropdown.vue
11252
+ var CommentsDropdown_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(CommentsDropdown_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-70674ffd"]]);
11253
+ //#endregion
11254
+ //#region src/components/CommentsLayer/InternalDropdown.vue?vue&type=script&setup=true&lang.ts
11258
11255
  var _hoisted_1$30 = { class: "sd-comment-option" };
11259
11256
  var _hoisted_2$23 = ["innerHTML"];
11260
11257
  var _hoisted_3$20 = { class: "sd-option-state" };
11261
11258
  var _hoisted_4$14 = ["innerHTML"];
11262
- var _sfc_main$24 = {
11259
+ var InternalDropdown_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
11263
11260
  __name: "InternalDropdown",
11264
11261
  props: {
11265
11262
  state: {
@@ -11341,8 +11338,10 @@ var _sfc_main$24 = {
11341
11338
  }, 8, ["disabled", "content-style"])], 4);
11342
11339
  };
11343
11340
  }
11344
- };
11345
- var InternalDropdown_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$24, [["__scopeId", "data-v-138d641e"]]);
11341
+ });
11342
+ //#endregion
11343
+ //#region src/components/CommentsLayer/InternalDropdown.vue
11344
+ var InternalDropdown_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(InternalDropdown_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-026f5d66"]]);
11346
11345
  //#endregion
11347
11346
  //#region src/components/CommentsLayer/helpers.js
11348
11347
  /**
@@ -11375,14 +11374,14 @@ function formatDate(timestamp) {
11375
11374
  return `${`${formattedHours}:${minutes.toString().padStart(2, "0")}${meridiem}`} ${month} ${day}`;
11376
11375
  }
11377
11376
  //#endregion
11378
- //#region src/components/general/Avatar.vue
11377
+ //#region src/components/general/Avatar.vue?vue&type=script&setup=true&lang.ts
11379
11378
  var _hoisted_1$29 = { class: "user-container" };
11380
11379
  var _hoisted_2$22 = ["src"];
11381
11380
  var _hoisted_3$19 = {
11382
11381
  key: 1,
11383
11382
  class: "user-bg"
11384
11383
  };
11385
- var _sfc_main$23 = {
11384
+ var Avatar_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
11386
11385
  __name: "Avatar",
11387
11386
  props: { user: {
11388
11387
  type: Object,
@@ -11406,10 +11405,12 @@ var _sfc_main$23 = {
11406
11405
  }, null, 8, _hoisted_2$22)) : (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("span", _hoisted_3$19, require__plugin_vue_export_helper.toDisplayString(getInitials(__props.user.name, __props.user.email)), 1))]);
11407
11406
  };
11408
11407
  }
11409
- };
11410
- var Avatar_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$23, [["__scopeId", "data-v-c95b2073"]]);
11408
+ });
11411
11409
  //#endregion
11412
- //#region src/components/CommentsLayer/CommentHeader.vue
11410
+ //#region src/components/general/Avatar.vue
11411
+ var Avatar_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(Avatar_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-0b3a0868"]]);
11412
+ //#endregion
11413
+ //#region src/components/CommentsLayer/CommentHeader.vue?vue&type=script&setup=true&lang.ts
11413
11414
  var _hoisted_1$28 = { class: "card-section comment-header" };
11414
11415
  var _hoisted_2$21 = { class: "comment-header-left" };
11415
11416
  var _hoisted_3$18 = { class: "user-info" };
@@ -11439,7 +11440,7 @@ var _hoisted_9$4 = [
11439
11440
  ];
11440
11441
  var _hoisted_10$4 = { class: "overflow-menu__icon" };
11441
11442
  var _hoisted_11$4 = ["innerHTML"];
11442
- var _sfc_main$22 = {
11443
+ var CommentHeader_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
11443
11444
  __name: "CommentHeader",
11444
11445
  props: {
11445
11446
  timestamp: {
@@ -11452,7 +11453,7 @@ var _sfc_main$22 = {
11452
11453
  },
11453
11454
  comment: {
11454
11455
  type: Object,
11455
- required: false
11456
+ required: true
11456
11457
  },
11457
11458
  isPendingInput: {
11458
11459
  type: Boolean,
@@ -11494,9 +11495,9 @@ var _sfc_main$22 = {
11494
11495
  const emit = __emit;
11495
11496
  const commentsStore = useCommentsStore();
11496
11497
  const props = __props;
11497
- const { proxy } = require__plugin_vue_export_helper.getCurrentInstance();
11498
- const role = proxy.$superdoc.config.role;
11499
- const isInternal = proxy.$superdoc.config.isInternal;
11498
+ const { proxy, superdoc } = useSuperDocInstance();
11499
+ const role = superdoc.config.role;
11500
+ const isInternal = superdoc.config.isInternal;
11500
11501
  const isCommentOwnedByCurrentUser = (comment) => {
11501
11502
  const currentUser = proxy.$superdoc.config.user;
11502
11503
  const otherUser = {
@@ -11719,10 +11720,12 @@ var _sfc_main$22 = {
11719
11720
  ], 2)]);
11720
11721
  };
11721
11722
  }
11722
- };
11723
- var CommentHeader_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$22, [["__scopeId", "data-v-3af1135b"]]);
11723
+ });
11724
11724
  //#endregion
11725
- //#region src/components/CommentsLayer/CommentInput.vue
11725
+ //#region src/components/CommentsLayer/CommentHeader.vue
11726
+ var CommentHeader_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(CommentHeader_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-5831e876"]]);
11727
+ //#endregion
11728
+ //#region src/components/CommentsLayer/CommentInput.vue?vue&type=script&setup=true&lang.ts
11726
11729
  var _hoisted_1$27 = { class: "input-section" };
11727
11730
  var _hoisted_2$20 = { class: "comment-composer" };
11728
11731
  var _hoisted_3$17 = [
@@ -11742,7 +11745,7 @@ var _hoisted_6$7 = {
11742
11745
  class: "comment-mention-option__email"
11743
11746
  };
11744
11747
  var commentInputSequence = 0;
11745
- var _sfc_main$21 = {
11748
+ var CommentInput_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
11746
11749
  __name: "CommentInput",
11747
11750
  props: {
11748
11751
  users: {
@@ -11764,7 +11767,7 @@ var _sfc_main$21 = {
11764
11767
  },
11765
11768
  comment: {
11766
11769
  type: Object,
11767
- required: false
11770
+ required: true
11768
11771
  }
11769
11772
  },
11770
11773
  emits: ["focus"],
@@ -11851,7 +11854,8 @@ var _sfc_main$21 = {
11851
11854
  };
11852
11855
  const onInput = (event) => {
11853
11856
  currentCommentMentions.value = currentCommentMentions.value.filter((user) => commentDraft.value.includes(`@${displayName(user)}`));
11854
- updateMentionQuery(event.target.selectionStart ?? commentDraft.value.length);
11857
+ const caret = event.target instanceof HTMLTextAreaElement ? event.target.selectionStart : null;
11858
+ updateMentionQuery(caret ?? commentDraft.value.length);
11855
11859
  syncInputHeight();
11856
11860
  };
11857
11861
  const selectMention = (user) => {
@@ -11940,8 +11944,10 @@ var _sfc_main$21 = {
11940
11944
  }), 128))])) : require__plugin_vue_export_helper.createCommentVNode("", true)])], 2)]);
11941
11945
  };
11942
11946
  }
11943
- };
11944
- var CommentInput_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$21, [["__scopeId", "data-v-0720a671"]]);
11947
+ });
11948
+ //#endregion
11949
+ //#region src/components/CommentsLayer/CommentInput.vue
11950
+ var CommentInput_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(CommentInput_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-aa97de44"]]);
11945
11951
  //#endregion
11946
11952
  //#region src/internal/toolbar/built-in/url-safety.js
11947
11953
  /**
@@ -13388,9 +13394,9 @@ var CommentDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ re
13388
13394
  });
13389
13395
  //#endregion
13390
13396
  //#region src/components/CommentsLayer/CommentDialog.vue
13391
- var CommentDialog_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(CommentDialog_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-752d9e0b"]]);
13397
+ var CommentDialog_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(CommentDialog_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-90d88bf5"]]);
13392
13398
  //#endregion
13393
- //#region src/components/CommentsLayer/commentsList/ReviewDirectoryListItem.vue
13399
+ //#region src/components/CommentsLayer/commentsList/ReviewDirectoryListItem.vue?vue&type=script&setup=true&lang.ts
13394
13400
  var _hoisted_1$25 = [
13395
13401
  "tabindex",
13396
13402
  "aria-posinset",
@@ -13402,7 +13408,7 @@ var _hoisted_1$25 = [
13402
13408
  "data-comment-page-index",
13403
13409
  "data-review-directory-index"
13404
13410
  ];
13405
- var _sfc_main$20 = {
13411
+ var ReviewDirectoryListItem_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
13406
13412
  __name: "ReviewDirectoryListItem",
13407
13413
  props: {
13408
13414
  item: {
@@ -13451,12 +13457,15 @@ var _sfc_main$20 = {
13451
13457
  });
13452
13458
  const measure = () => {
13453
13459
  const height = shell.value?.getBoundingClientRect?.().height;
13454
- if (Number.isFinite(height) && height > 0) measuredHeight.value = height;
13460
+ if (require_is_finite_number.isFiniteNumber(height) && height > 0) measuredHeight.value = height;
13455
13461
  };
13456
13462
  const onFocusIn = () => {
13457
13463
  containsFocus.value = true;
13458
13464
  emit("focus-item", props.index);
13459
13465
  };
13466
+ const onFocusOut = (event) => {
13467
+ containsFocus.value = event.relatedTarget instanceof Node && shell.value?.contains(event.relatedTarget) === true;
13468
+ };
13460
13469
  const onKeydown = (event) => {
13461
13470
  if (![
13462
13471
  "ArrowDown",
@@ -13464,7 +13473,7 @@ var _sfc_main$20 = {
13464
13473
  "Home",
13465
13474
  "End"
13466
13475
  ].includes(event.key)) return;
13467
- if (event.target?.closest?.("input, textarea, select, button, [contenteditable=\"true\"]")) return;
13476
+ if (event.target instanceof Element && event.target.closest("input, textarea, select, button, [contenteditable=\"true\"]")) return;
13468
13477
  event.preventDefault();
13469
13478
  emit("navigate", {
13470
13479
  index: props.index,
@@ -13472,6 +13481,8 @@ var _sfc_main$20 = {
13472
13481
  });
13473
13482
  };
13474
13483
  require__plugin_vue_export_helper.onMounted(() => {
13484
+ const element = shell.value;
13485
+ if (!element) return;
13475
13486
  if (typeof IntersectionObserver !== "undefined") {
13476
13487
  intersectionObserver = new IntersectionObserver((entries) => {
13477
13488
  const entry = entries[0];
@@ -13482,11 +13493,11 @@ var _sfc_main$20 = {
13482
13493
  root: null,
13483
13494
  rootMargin: "600px 0px"
13484
13495
  });
13485
- intersectionObserver.observe(shell.value);
13496
+ intersectionObserver.observe(element);
13486
13497
  }
13487
13498
  if (typeof ResizeObserver !== "undefined") {
13488
13499
  resizeObserver = new ResizeObserver(measure);
13489
- resizeObserver.observe(shell.value);
13500
+ resizeObserver.observe(element);
13490
13501
  }
13491
13502
  require__plugin_vue_export_helper.nextTick(measure);
13492
13503
  });
@@ -13511,7 +13522,7 @@ var _sfc_main$20 = {
13511
13522
  "data-comment-page-index": Number.isFinite(__props.item.floatingPageIndex) ? __props.item.floatingPageIndex : "",
13512
13523
  "data-review-directory-index": __props.index,
13513
13524
  onFocusin: onFocusIn,
13514
- onFocusout: _cache[0] || (_cache[0] = ($event) => containsFocus.value = shell.value?.contains?.($event.relatedTarget) === true),
13525
+ onFocusout: onFocusOut,
13515
13526
  onKeydown
13516
13527
  }, [materialized.value ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createBlock(CommentDialog_default, {
13517
13528
  key: 0,
@@ -13532,15 +13543,17 @@ var _sfc_main$20 = {
13532
13543
  ])) : require__plugin_vue_export_helper.createCommentVNode("", true)], 44, _hoisted_1$25);
13533
13544
  };
13534
13545
  }
13535
- };
13536
- var ReviewDirectoryListItem_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$20, [["__scopeId", "data-v-29650a06"]]);
13546
+ });
13537
13547
  //#endregion
13538
- //#region src/components/CommentsLayer/commentsList/commentsList.vue
13548
+ //#region src/components/CommentsLayer/commentsList/ReviewDirectoryListItem.vue
13549
+ var ReviewDirectoryListItem_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(ReviewDirectoryListItem_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-db6ccae8"]]);
13550
+ //#endregion
13551
+ //#region src/components/CommentsLayer/commentsList/commentsList.vue?vue&type=script&setup=true&lang.ts
13539
13552
  var _hoisted_1$24 = ["aria-busy"];
13540
13553
  var _hoisted_2$18 = { key: 0 };
13541
13554
  var _hoisted_3$15 = { key: 1 };
13542
13555
  var REPEATED_HEADER_FOOTER_STORY_TYPE = "headerFooterPart";
13543
- var _sfc_main$19 = {
13556
+ var commentsList_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
13544
13557
  __name: "commentsList",
13545
13558
  props: {
13546
13559
  showMainComments: {
@@ -13554,12 +13567,13 @@ var _sfc_main$19 = {
13554
13567
  },
13555
13568
  setup(__props) {
13556
13569
  const props = __props;
13557
- const commentsStore = useCommentsStore();
13570
+ const piniaCommentsStore = useCommentsStore();
13571
+ const commentsStore = piniaCommentsStore;
13558
13572
  const listRoot = require__plugin_vue_export_helper.ref(null);
13559
13573
  const rovingIndex = require__plugin_vue_export_helper.ref(0);
13560
13574
  const isCommentsListVisible = require__plugin_vue_export_helper.toRef(commentsStore, "isCommentsListVisible");
13561
13575
  const floatingCommentInstances = require__plugin_vue_export_helper.computed(() => commentsStore.getFloatingCommentInstances);
13562
- const { activeComment, activeFloatingCommentInstanceId, commentsList, reviewDirectoryList, isReviewDirectoryActive, isReviewDirectoryLoading } = storeToRefs(commentsStore);
13576
+ const { activeComment, activeFloatingCommentInstanceId, commentsList, reviewDirectoryList, isReviewDirectoryActive, isReviewDirectoryLoading } = storeToRefs(piniaCommentsStore);
13563
13577
  const groupedComments = require__plugin_vue_export_helper.computed(() => isReviewDirectoryActive.value ? commentsStore.getGroupedReviewDirectory : commentsStore.getGroupedComments);
13564
13578
  const reviewRows = require__plugin_vue_export_helper.computed(() => isReviewDirectoryActive.value ? reviewDirectoryList.value : commentsList.value);
13565
13579
  const commentAliases = (comment) => [
@@ -13590,11 +13604,15 @@ var _sfc_main$19 = {
13590
13604
  }
13591
13605
  return [parentComment];
13592
13606
  };
13607
+ const getStoryType = (comment) => {
13608
+ const story = comment?.trackedChangeStory;
13609
+ return typeof story === "object" && story !== null ? story.storyType : void 0;
13610
+ };
13593
13611
  const getRepeatedHeaderFooterInstances = (comment) => {
13594
13612
  const matchingInstances = floatingCommentInstances.value.filter((instance) => instance?.comment?.commentId === comment?.commentId);
13595
13613
  if (matchingInstances.length < 2) return [];
13596
13614
  if (!comment?.trackedChange) return [];
13597
- if (comment?.trackedChangeStory?.storyType !== REPEATED_HEADER_FOOTER_STORY_TYPE) return [];
13615
+ if (getStoryType(comment) !== REPEATED_HEADER_FOOTER_STORY_TYPE) return [];
13598
13616
  return matchingInstances;
13599
13617
  };
13600
13618
  const isRepeatedInstanceActive = (instance) => {
@@ -13651,8 +13669,9 @@ var _sfc_main$19 = {
13651
13669
  rovingIndex.value = nextIndex;
13652
13670
  await require__plugin_vue_export_helper.nextTick();
13653
13671
  const target = listRoot.value?.querySelector?.(`[data-review-directory-index="${nextIndex}"]`);
13654
- target?.scrollIntoView?.({ block: "nearest" });
13655
- target?.focus?.({ preventScroll: true });
13672
+ if (!(target instanceof HTMLElement)) return;
13673
+ target.scrollIntoView?.({ block: "nearest" });
13674
+ target.focus?.({ preventScroll: true });
13656
13675
  };
13657
13676
  require__plugin_vue_export_helper.onMounted(() => {
13658
13677
  isCommentsListVisible.value = true;
@@ -13700,8 +13719,10 @@ var _sfc_main$19 = {
13700
13719
  }), 128))])) : require__plugin_vue_export_helper.createCommentVNode("", true)], 8, _hoisted_1$24);
13701
13720
  };
13702
13721
  }
13703
- };
13704
- var commentsList_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$19, [["__scopeId", "data-v-89244745"]]);
13722
+ });
13723
+ //#endregion
13724
+ //#region src/components/CommentsLayer/commentsList/commentsList.vue
13725
+ var commentsList_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(commentsList_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-8eca48e1"]]);
13705
13726
  //#endregion
13706
13727
  //#region src/components/CommentsLayer/commentsList/super-comments-list.js
13707
13728
  /**
@@ -15327,9 +15348,9 @@ var FloatingComments_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
15327
15348
  });
15328
15349
  //#endregion
15329
15350
  //#region src/components/CommentsLayer/FloatingComments.vue
15330
- var FloatingComments_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(FloatingComments_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-e74251e0"]]);
15351
+ var FloatingComments_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(FloatingComments_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-0655e424"]]);
15331
15352
  //#endregion
15332
- //#region src/components/CommentsLayer/PdfCommentsLayer.vue
15353
+ //#region src/components/CommentsLayer/PdfCommentsLayer.vue?vue&type=script&setup=true&lang.ts
15333
15354
  var _hoisted_1$22 = {
15334
15355
  class: "superdoc__pdf-comments-layer pdf-comments-layer",
15335
15356
  "aria-hidden": "false"
@@ -15344,7 +15365,7 @@ var _hoisted_2$17 = [
15344
15365
  var PDF_SELECTION_SOURCE = "pdf";
15345
15366
  var INTERNAL_HIGHLIGHT_COLOR = "#078383";
15346
15367
  var EXTERNAL_HIGHLIGHT_COLOR = "#B1124B";
15347
- var PdfCommentsLayer_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default({
15368
+ var PdfCommentsLayer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
15348
15369
  __name: "PdfCommentsLayer",
15349
15370
  emits: ["anchor-activate"],
15350
15371
  setup(__props, { emit: __emit }) {
@@ -15363,11 +15384,12 @@ var PdfCommentsLayer_default = /*#__PURE__*/ require__plugin_vue_export_helper._
15363
15384
  * on-document DOCX comment markers.
15364
15385
  */
15365
15386
  const emit = __emit;
15366
- const commentsStore = useCommentsStore();
15387
+ const piniaCommentsStore = useCommentsStore();
15388
+ const commentsStore = piniaCommentsStore;
15367
15389
  const superdocStore = useSuperdocStore();
15368
- const { activeComment } = storeToRefs(commentsStore);
15390
+ const { activeComment } = storeToRefs(piniaCommentsStore);
15369
15391
  const { documents, activeZoom } = storeToRefs(superdocStore);
15370
- const { proxy } = require__plugin_vue_export_helper.getCurrentInstance();
15392
+ const { proxy } = useSuperDocInstance();
15371
15393
  const isFiniteNumber = (value) => {
15372
15394
  if (typeof value === "number") return Number.isFinite(value);
15373
15395
  if (typeof value === "string" && value.trim() !== "") return Number.isFinite(Number(value));
@@ -15406,15 +15428,20 @@ var PdfCommentsLayer_default = /*#__PURE__*/ require__plugin_vue_export_helper._
15406
15428
  const pdfCommentAnchors = require__plugin_vue_export_helper.computed(() => {
15407
15429
  const parentComments = commentsStore.getFloatingComments;
15408
15430
  if (!Array.isArray(parentComments)) return [];
15409
- return parentComments.filter((comment) => comment?.selection?.source === PDF_SELECTION_SOURCE).filter((comment) => !comment.resolvedTime).filter((comment) => getAnchorCommentId(comment) !== null).filter((comment) => hasFiniteBounds(comment.selection?.selectionBounds)).filter((comment) => belongsToOpenPdfDocument(comment)).map((comment) => {
15431
+ return parentComments.flatMap((comment) => {
15432
+ if (comment?.selection?.source !== PDF_SELECTION_SOURCE) return [];
15433
+ if (comment.resolvedTime) return [];
15410
15434
  const commentId = getAnchorCommentId(comment);
15411
- const bounds = normalizeBounds(comment.selection.selectionBounds);
15412
- return {
15435
+ if (commentId === null) return [];
15436
+ const selectionBounds = comment.selection.selectionBounds;
15437
+ if (!hasFiniteBounds(selectionBounds)) return [];
15438
+ if (!belongsToOpenPdfDocument(comment)) return [];
15439
+ return [{
15413
15440
  commentId,
15414
- page: comment.selection?.page ?? null,
15441
+ page: comment.selection.page ?? null,
15415
15442
  isInternal: comment.isInternal !== false,
15416
- bounds
15417
- };
15443
+ bounds: normalizeBounds(selectionBounds)
15444
+ }];
15418
15445
  });
15419
15446
  });
15420
15447
  const getAnchorStyle = (anchor) => {
@@ -15452,7 +15479,10 @@ var PdfCommentsLayer_default = /*#__PURE__*/ require__plugin_vue_export_helper._
15452
15479
  }), 128))]);
15453
15480
  };
15454
15481
  }
15455
- }, [["__scopeId", "data-v-b5ad4c58"]]);
15482
+ });
15483
+ //#endregion
15484
+ //#region src/components/CommentsLayer/PdfCommentsLayer.vue
15485
+ var PdfCommentsLayer_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(PdfCommentsLayer_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-86166837"]]);
15456
15486
  //#endregion
15457
15487
  //#region src/components/Whiteboard/use-whiteboard.js
15458
15488
  var useWhiteboard = ({ proxy, layers, documents, modules }) => {
@@ -15606,7 +15636,7 @@ var useWhiteboard = ({ proxy, layers, documents, modules }) => {
15606
15636
  //#endregion
15607
15637
  //#region src/components/Whiteboard/WhiteboardPage.vue
15608
15638
  var _hoisted_1$21 = ["data-page-index"];
15609
- var _sfc_main$17 = {
15639
+ var _sfc_main$2 = {
15610
15640
  __name: "WhiteboardPage",
15611
15641
  props: {
15612
15642
  whiteboard: {
@@ -15741,10 +15771,10 @@ var _sfc_main$17 = {
15741
15771
  };
15742
15772
  }
15743
15773
  };
15744
- var WhiteboardPage_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$17, [["__scopeId", "data-v-c876c9b5"]]);
15774
+ var WhiteboardPage_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$2, [["__scopeId", "data-v-c876c9b5"]]);
15745
15775
  //#endregion
15746
15776
  //#region src/components/Whiteboard/WhiteboardLayer.vue
15747
- var _sfc_main$16 = {
15777
+ var _sfc_main$1 = {
15748
15778
  __name: "WhiteboardLayer",
15749
15779
  props: {
15750
15780
  whiteboard: {
@@ -15813,7 +15843,7 @@ var _sfc_main$16 = {
15813
15843
  };
15814
15844
  }
15815
15845
  };
15816
- var WhiteboardLayer_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$16, [["__scopeId", "data-v-54546c3d"]]);
15846
+ var WhiteboardLayer_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$1, [["__scopeId", "data-v-54546c3d"]]);
15817
15847
  //#endregion
15818
15848
  //#region src/components/CommentsLayer/collect-removed-comment-ids.js
15819
15849
  /**
@@ -16835,7 +16865,7 @@ function usePasswordPrompt({ getSurfaceManager, getPasswordPromptConfig, onUnhan
16835
16865
  })
16836
16866
  });
16837
16867
  } else {
16838
- const PasswordPromptSurface = (await Promise.resolve().then(() => require("./chunks/PasswordPromptSurface-BpqP4pUa.cjs"))).default;
16868
+ const PasswordPromptSurface = (await Promise.resolve().then(() => require("./chunks/PasswordPromptSurface-BNkaztaP.cjs"))).default;
16839
16869
  const surfaceId = `password-prompt-${doc.id}`;
16840
16870
  handle = manager.open({
16841
16871
  id: surfaceId,
@@ -17530,7 +17560,7 @@ function useFindReplace({ getSurfaceManager, getActiveEditor, activeEditorRef, g
17530
17560
  } else {
17531
17561
  let FindReplaceSurface;
17532
17562
  try {
17533
- FindReplaceSurface = (await Promise.resolve().then(() => require("./chunks/FindReplaceSurface-BRs3JrCq.cjs"))).default;
17563
+ FindReplaceSurface = (await Promise.resolve().then(() => require("./chunks/FindReplaceSurface-BNDrJ6VS.cjs"))).default;
17534
17564
  } catch {
17535
17565
  opening = false;
17536
17566
  return;
@@ -19597,6 +19627,9 @@ function createV2EditorRuntimeAdapter(options) {
19597
19627
  setDocumentMode(mode) {
19598
19628
  host.setDocumentMode(mode);
19599
19629
  },
19630
+ async setUser(user) {
19631
+ await host.setUser?.(user);
19632
+ },
19600
19633
  getDocumentMode: () => host.getDocumentMode(),
19601
19634
  setTrackedChangesRenderOptions(options) {
19602
19635
  host.setTrackedChangesRenderOptions(options);
@@ -20440,11 +20473,11 @@ var SurfaceDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ re
20440
20473
  //#region src/components/surfaces/SurfaceDialog.vue
20441
20474
  var SurfaceDialog_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(SurfaceDialog_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-6ce23dd7"]]);
20442
20475
  //#endregion
20443
- //#region src/components/surfaces/SurfaceFloating.vue
20476
+ //#region src/components/surfaces/SurfaceFloating.vue?vue&type=script&setup=true&lang.ts
20444
20477
  var _hoisted_1$18 = ["aria-labelledby", "aria-label"];
20445
20478
  var _hoisted_2$14 = ["id"];
20446
20479
  var _hoisted_3$12 = { class: "sd-surface-floating__content" };
20447
- var _sfc_main$15 = {
20480
+ var SurfaceFloating_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
20448
20481
  __name: "SurfaceFloating",
20449
20482
  props: { surface: {
20450
20483
  type: Object,
@@ -20592,11 +20625,13 @@ var _sfc_main$15 = {
20592
20625
  ])) : __props.surface.component ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createBlock(require__plugin_vue_export_helper.resolveDynamicComponent(__props.surface.component), require__plugin_vue_export_helper.normalizeProps(require__plugin_vue_export_helper.mergeProps({ key: 1 }, mergedComponentProps.value)), null, 16)) : require__plugin_vue_export_helper.createCommentVNode("", true)])], 14, _hoisted_1$18);
20593
20626
  };
20594
20627
  }
20595
- };
20596
- var SurfaceFloating_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$15, [["__scopeId", "data-v-cd2be5db"]]);
20628
+ });
20597
20629
  //#endregion
20598
- //#region src/components/surfaces/SurfaceHost.vue
20599
- var _sfc_main$14 = {
20630
+ //#region src/components/surfaces/SurfaceFloating.vue
20631
+ var SurfaceFloating_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(SurfaceFloating_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-d26a1197"]]);
20632
+ //#endregion
20633
+ //#region src/components/surfaces/SurfaceHost.vue?vue&type=script&setup=true&lang.ts
20634
+ var SurfaceHost_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
20600
20635
  __name: "SurfaceHost",
20601
20636
  props: { geometryTarget: {
20602
20637
  type: Object,
@@ -20746,7 +20781,7 @@ var _sfc_main$14 = {
20746
20781
  if (dialog.value) return;
20747
20782
  if (event.key === "Escape" && f.request.closeOnEscape !== false) {
20748
20783
  event.stopPropagation();
20749
- surfaceManager.close(f.id);
20784
+ surfaceManager?.close(f.id);
20750
20785
  }
20751
20786
  }
20752
20787
  let escapeListenerAttached = false;
@@ -20765,7 +20800,8 @@ var _sfc_main$14 = {
20765
20800
  if (!f || f.settled) return;
20766
20801
  if (dialog.value) return;
20767
20802
  const rootEl = floatingRef.value?.rootEl;
20768
- if (rootEl && !rootEl.contains(event.target)) surfaceManager.close(f.id);
20803
+ const target = event.target instanceof Node ? event.target : null;
20804
+ if (rootEl && !rootEl.contains(target)) surfaceManager?.close(f.id);
20769
20805
  }
20770
20806
  let pointerListenerAttached = false;
20771
20807
  function attachPointerListener() {
@@ -20795,7 +20831,7 @@ var _sfc_main$14 = {
20795
20831
  });
20796
20832
  function handleDialogClose() {
20797
20833
  const d = dialog.value;
20798
- if (d && !d.settled) surfaceManager.close(d.id);
20834
+ if (d && !d.settled) surfaceManager?.close(d.id);
20799
20835
  }
20800
20836
  return (_ctx, _cache) => {
20801
20837
  return require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createBlock(require__plugin_vue_export_helper.Teleport, { to: "body" }, [hasAnySurface.value ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", {
@@ -20817,8 +20853,10 @@ var _sfc_main$14 = {
20817
20853
  }, null, 8, ["surface", "scroll-lock-target"])) : require__plugin_vue_export_helper.createCommentVNode("", true)]);
20818
20854
  };
20819
20855
  }
20820
- };
20821
- var SurfaceHost_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$14, [["__scopeId", "data-v-dad99b67"]]);
20856
+ });
20857
+ //#endregion
20858
+ //#region src/components/surfaces/SurfaceHost.vue
20859
+ var SurfaceHost_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(SurfaceHost_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-ae02e94c"]]);
20822
20860
  //#endregion
20823
20861
  //#region src/SuperDoc.vue?vue&type=script&setup=true&lang.ts
20824
20862
  var _hoisted_1$17 = ["data-superdoc-ui-owner"];
@@ -23452,7 +23490,7 @@ var SuperDoc_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require
23452
23490
  });
23453
23491
  //#endregion
23454
23492
  //#region src/SuperDoc.vue
23455
- var SuperDoc_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(SuperDoc_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-da95e5c5"]]);
23493
+ var SuperDoc_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(SuperDoc_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-0c6f8747"]]);
23456
23494
  //#endregion
23457
23495
  //#region src/core/create-app.js
23458
23496
  var PINIA_DEVTOOLS_SETUP_EVENT = "devtools-plugin:setup";
@@ -38292,13 +38330,13 @@ var ToolbarButton_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ re
38292
38330
  //#region src/internal/toolbar/built-in/ToolbarButton.vue
38293
38331
  var ToolbarButton_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(ToolbarButton_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-40889353"]]);
38294
38332
  //#endregion
38295
- //#region src/internal/toolbar/built-in/ToolbarSeparator.vue
38333
+ //#region src/internal/toolbar/built-in/ToolbarSeparator.vue?vue&type=script&setup=true&lang.ts
38296
38334
  var _hoisted_1$14 = {
38297
38335
  class: "toolbar-separator",
38298
38336
  role: "separator",
38299
38337
  "aria-label": "Toolbar separator"
38300
38338
  };
38301
- var _sfc_main$13 = {
38339
+ var ToolbarSeparator_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
38302
38340
  __name: "ToolbarSeparator",
38303
38341
  props: { active: {
38304
38342
  type: Boolean,
@@ -38318,8 +38356,10 @@ var _sfc_main$13 = {
38318
38356
  }, null, 4)]);
38319
38357
  };
38320
38358
  }
38321
- };
38322
- var ToolbarSeparator_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$13, [["__scopeId", "data-v-cb82253a"]]);
38359
+ });
38360
+ //#endregion
38361
+ //#region src/internal/toolbar/built-in/ToolbarSeparator.vue
38362
+ var ToolbarSeparator_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(ToolbarSeparator_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-10932d46"]]);
38323
38363
  //#endregion
38324
38364
  //#region src/internal/toolbar/built-in/ToolbarDropdown.vue?vue&type=script&setup=true&lang.ts
38325
38365
  var _hoisted_1$13 = { class: "toolbar-dropdown" };
@@ -38723,7 +38763,7 @@ var ToolbarDropdown_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
38723
38763
  });
38724
38764
  //#endregion
38725
38765
  //#region src/internal/toolbar/built-in/ToolbarDropdown.vue
38726
- var ToolbarDropdown_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(ToolbarDropdown_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-50758732"]]);
38766
+ var ToolbarDropdown_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(ToolbarDropdown_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-942d76a6"]]);
38727
38767
  //#endregion
38728
38768
  //#region src/internal/toolbar/built-in/toolbar-focus-helpers.js
38729
38769
  var preventEditorFocusTransfer = (event) => {
@@ -38746,8 +38786,8 @@ var refocusEditorSurface = (superToolbar, preferredEditor = null) => {
38746
38786
  if (editor instanceof HTMLElement) editor.focus({ preventScroll: true });
38747
38787
  };
38748
38788
  //#endregion
38749
- //#region src/internal/toolbar/built-in/OverflowMenu.vue
38750
- var _sfc_main$12 = {
38789
+ //#region src/internal/toolbar/built-in/OverflowMenu.vue?vue&type=script&setup=true&lang.ts
38790
+ var OverflowMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
38751
38791
  __name: "OverflowMenu",
38752
38792
  props: {
38753
38793
  toolbarItem: {
@@ -38843,8 +38883,10 @@ var _sfc_main$12 = {
38843
38883
  ]);
38844
38884
  };
38845
38885
  }
38846
- };
38847
- var OverflowMenu_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$12, [["__scopeId", "data-v-1227fcf9"]]);
38886
+ });
38887
+ //#endregion
38888
+ //#region src/internal/toolbar/built-in/OverflowMenu.vue
38889
+ var OverflowMenu_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(OverflowMenu_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-d2e189fd"]]);
38848
38890
  //#endregion
38849
38891
  //#region src/internal/toolbar/built-in/font-typeahead.js
38850
38892
  /**
@@ -39471,10 +39513,10 @@ var ToolbarComboBox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
39471
39513
  });
39472
39514
  //#endregion
39473
39515
  //#region src/internal/toolbar/built-in/ToolbarComboBox.vue
39474
- var ToolbarComboBox_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(ToolbarComboBox_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-e9143b7e"]]);
39516
+ var ToolbarComboBox_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(ToolbarComboBox_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-a400064a"]]);
39475
39517
  //#endregion
39476
39518
  //#region src/internal/toolbar/built-in/FontFamilyCombobox.vue
39477
- var _sfc_main$11 = {
39519
+ var FontFamilyCombobox_default = /* @__PURE__ */ require__plugin_vue_export_helper.defineComponent({
39478
39520
  __name: "FontFamilyCombobox",
39479
39521
  props: {
39480
39522
  item: {
@@ -39512,10 +39554,10 @@ var _sfc_main$11 = {
39512
39554
  ]);
39513
39555
  };
39514
39556
  }
39515
- };
39557
+ });
39516
39558
  //#endregion
39517
39559
  //#region src/internal/toolbar/built-in/FontSizeCombobox.vue
39518
- var _sfc_main$10 = {
39560
+ var FontSizeCombobox_default = /* @__PURE__ */ require__plugin_vue_export_helper.defineComponent({
39519
39561
  __name: "FontSizeCombobox",
39520
39562
  props: {
39521
39563
  item: {
@@ -39553,7 +39595,7 @@ var _sfc_main$10 = {
39553
39595
  ]);
39554
39596
  };
39555
39597
  }
39556
- };
39598
+ });
39557
39599
  //#endregion
39558
39600
  //#region src/internal/toolbar/built-in/SdTooltip.vue?vue&type=script&setup=true&lang.ts
39559
39601
  var AUTO_HIDE_DELAY = 2500;
@@ -39777,7 +39819,7 @@ var SdTooltip_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ requir
39777
39819
  //#region src/internal/toolbar/built-in/SdTooltip.vue
39778
39820
  var SdTooltip_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(SdTooltip_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-dfd6f1d1"]]);
39779
39821
  //#endregion
39780
- //#region src/internal/toolbar/built-in/ButtonGroup.vue
39822
+ //#region src/internal/toolbar/built-in/ButtonGroup.vue?vue&type=script&setup=true&lang.ts
39781
39823
  var _hoisted_1$11 = [
39782
39824
  "onKeydown",
39783
39825
  "tabindex",
@@ -39788,7 +39830,7 @@ var _hoisted_3$7 = { key: 0 };
39788
39830
  var _hoisted_4$5 = { key: 0 };
39789
39831
  var _hoisted_5$3 = { key: 0 };
39790
39832
  var _hoisted_6$2 = { key: 0 };
39791
- var _sfc_main$9 = {
39833
+ var ButtonGroup_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
39792
39834
  __name: "ButtonGroup",
39793
39835
  props: {
39794
39836
  toolbarItems: {
@@ -39829,7 +39871,7 @@ var _sfc_main$9 = {
39829
39871
  ],
39830
39872
  setup(__props, { emit: __emit }) {
39831
39873
  const emit = __emit;
39832
- const { proxy } = require__plugin_vue_export_helper.getCurrentInstance();
39874
+ const proxy = require__plugin_vue_export_helper.getCurrentInstance()?.proxy;
39833
39875
  const toolbarItemRefs = require__plugin_vue_export_helper.ref([]);
39834
39876
  const buttonGroupRef = require__plugin_vue_export_helper.ref(null);
39835
39877
  const props = __props;
@@ -40012,37 +40054,35 @@ var _sfc_main$9 = {
40012
40054
  "aria-label": `${item.attributes.value.ariaLabel} - ${option.label}`
40013
40055
  };
40014
40056
  };
40015
- const moveToNextButton = (e) => {
40016
- const currentButton = e.target;
40017
- const nextButton = e.target.closest(".sd-toolbar-item-ctn").nextElementSibling;
40018
- if (nextButton) {
40019
- currentButton.setAttribute("tabindex", "-1");
40057
+ const moveToNextButton = (target) => {
40058
+ const nextButton = target.closest(".sd-toolbar-item-ctn")?.nextElementSibling;
40059
+ if (nextButton instanceof HTMLElement) {
40060
+ target.setAttribute("tabindex", "-1");
40020
40061
  nextButton.setAttribute("tabindex", "0");
40021
40062
  nextButton.focus();
40022
40063
  }
40023
40064
  };
40024
- const moveToPreviousButton = (e) => {
40025
- const currentButton = e.target;
40026
- const previousButton = e.target.closest(".sd-toolbar-item-ctn").previousElementSibling;
40027
- if (previousButton) {
40028
- currentButton.setAttribute("tabindex", "-1");
40065
+ const moveToPreviousButton = (target) => {
40066
+ const previousButton = target.closest(".sd-toolbar-item-ctn")?.previousElementSibling;
40067
+ if (previousButton instanceof HTMLElement) {
40068
+ target.setAttribute("tabindex", "-1");
40029
40069
  previousButton.setAttribute("tabindex", "0");
40030
40070
  previousButton.focus();
40031
40071
  }
40032
40072
  };
40033
- const moveToNextButtonGroup = (e) => {
40034
- const nextButtonGroup = e.target.closest(".button-group").nextElementSibling;
40035
- if (nextButtonGroup) {
40073
+ const moveToNextButtonGroup = (target) => {
40074
+ const nextButtonGroup = target.closest(".button-group")?.nextElementSibling;
40075
+ if (nextButtonGroup instanceof HTMLElement) {
40036
40076
  nextButtonGroup.setAttribute("tabindex", "0");
40037
40077
  nextButtonGroup.focus();
40038
40078
  } else {
40039
40079
  const editor = document.querySelector(".ProseMirror");
40040
- if (editor) editor.focus();
40080
+ if (editor instanceof HTMLElement) editor.focus();
40041
40081
  }
40042
40082
  };
40043
- const moveToPreviousButtonGroup = (e) => {
40044
- const previousButtonGroup = e.target.closest(".button-group").previousElementSibling;
40045
- if (previousButtonGroup) {
40083
+ const moveToPreviousButtonGroup = (target) => {
40084
+ const previousButtonGroup = target.closest(".button-group")?.previousElementSibling;
40085
+ if (previousButtonGroup instanceof HTMLElement) {
40046
40086
  previousButtonGroup.setAttribute("tabindex", "0");
40047
40087
  previousButtonGroup.focus();
40048
40088
  }
@@ -40056,7 +40096,9 @@ var _sfc_main$9 = {
40056
40096
  handleToolbarButtonClick(item);
40057
40097
  };
40058
40098
  const handleKeyDown = (e, item) => {
40059
- const isTypingField = e.target.nodeName === "INPUT" || e.target.nodeName === "TEXTAREA";
40099
+ const target = e.target;
40100
+ if (!(target instanceof Element)) return;
40101
+ const isTypingField = target.nodeName === "INPUT" || target.nodeName === "TEXTAREA";
40060
40102
  const isTypingToolbarItem = item.name.value === "fontSize" || item.name.value === "fontFamily";
40061
40103
  if (isTypingField && isTypingToolbarItem) return;
40062
40104
  if (![
@@ -40080,20 +40122,20 @@ var _sfc_main$9 = {
40080
40122
  break;
40081
40123
  case "ArrowRight":
40082
40124
  closeDropdowns();
40083
- moveToNextButton(e);
40125
+ moveToNextButton(target);
40084
40126
  break;
40085
40127
  case "ArrowLeft":
40086
40128
  closeDropdowns();
40087
- moveToPreviousButton(e);
40129
+ moveToPreviousButton(target);
40088
40130
  break;
40089
40131
  case "Tab":
40090
- if (e.shiftKey) moveToPreviousButtonGroup(e);
40091
- else moveToNextButtonGroup(e);
40132
+ if (e.shiftKey) moveToPreviousButtonGroup(target);
40133
+ else moveToNextButtonGroup(target);
40092
40134
  break;
40093
40135
  default: break;
40094
40136
  }
40095
40137
  };
40096
- const handleFocus = (e) => {
40138
+ const handleFocus = () => {
40097
40139
  const firstButton = toolbarItemRefs.value.find((item) => !item.classList.contains("sd-disabled"));
40098
40140
  if (firstButton) {
40099
40141
  firstButton.setAttribute("tabindex", "0");
@@ -40163,7 +40205,7 @@ var _sfc_main$9 = {
40163
40205
  disabled: !item.tooltip?.value,
40164
40206
  "content-style": { fontFamily: props.uiFontFamily }
40165
40207
  }, {
40166
- trigger: require__plugin_vue_export_helper.withCtx(() => [require__plugin_vue_export_helper.createVNode(_sfc_main$11, {
40208
+ trigger: require__plugin_vue_export_helper.withCtx(() => [require__plugin_vue_export_helper.createVNode(FontFamilyCombobox_default, {
40167
40209
  item,
40168
40210
  "ui-font-family": props.uiFontFamily,
40169
40211
  class: "sd-toolbar-button sd-editor-toolbar-dropdown",
@@ -40180,7 +40222,7 @@ var _sfc_main$9 = {
40180
40222
  disabled: !item.tooltip?.value,
40181
40223
  "content-style": { fontFamily: props.uiFontFamily }
40182
40224
  }, {
40183
- trigger: require__plugin_vue_export_helper.withCtx(() => [require__plugin_vue_export_helper.createVNode(_sfc_main$10, {
40225
+ trigger: require__plugin_vue_export_helper.withCtx(() => [require__plugin_vue_export_helper.createVNode(FontSizeCombobox_default, {
40184
40226
  item,
40185
40227
  "ui-font-family": props.uiFontFamily,
40186
40228
  class: "sd-toolbar-button sd-editor-toolbar-dropdown",
@@ -40278,8 +40320,10 @@ var _sfc_main$9 = {
40278
40320
  }), 128))], 36);
40279
40321
  };
40280
40322
  }
40281
- };
40282
- var ButtonGroup_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$9, [["__scopeId", "data-v-fb216897"]]);
40323
+ });
40324
+ //#endregion
40325
+ //#region src/internal/toolbar/built-in/ButtonGroup.vue
40326
+ var ButtonGroup_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(ButtonGroup_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-21333fed"]]);
40283
40327
  var TOOLBAR_FONTS = [
40284
40328
  ["Arial", "sans-serif"],
40285
40329
  ["Arial Black", "sans-serif"],
@@ -40799,14 +40843,14 @@ var useToolbarItem = (options) => {
40799
40843
  };
40800
40844
  };
40801
40845
  //#endregion
40802
- //#region src/internal/toolbar/built-in/AlignmentButtons.vue
40846
+ //#region src/internal/toolbar/built-in/AlignmentButtons.vue?vue&type=script&setup=true&lang.ts
40803
40847
  var _hoisted_1$9 = [
40804
40848
  "onClick",
40805
40849
  "innerHTML",
40806
40850
  "aria-label",
40807
40851
  "onKeydown"
40808
40852
  ];
40809
- var AlignmentButtons_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default({
40853
+ var AlignmentButtons_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
40810
40854
  __name: "AlignmentButtons",
40811
40855
  emits: ["select"],
40812
40856
  setup(__props, { emit: __emit }) {
@@ -40893,16 +40937,19 @@ var AlignmentButtons_default = /*#__PURE__*/ require__plugin_vue_export_helper._
40893
40937
  }), 64))], 2);
40894
40938
  };
40895
40939
  }
40896
- }, [["__scopeId", "data-v-13e5f7a4"]]);
40940
+ });
40897
40941
  //#endregion
40898
- //#region src/internal/toolbar/built-in/StyleButtonsList.vue
40942
+ //#region src/internal/toolbar/built-in/AlignmentButtons.vue
40943
+ var AlignmentButtons_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(AlignmentButtons_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-7ddf6e50"]]);
40944
+ //#endregion
40945
+ //#region src/internal/toolbar/built-in/StyleButtonsList.vue?vue&type=script&setup=true&lang.ts
40899
40946
  var _hoisted_1$8 = [
40900
40947
  "onClick",
40901
40948
  "innerHTML",
40902
40949
  "aria-label",
40903
40950
  "onKeydown"
40904
40951
  ];
40905
- var _sfc_main$6 = {
40952
+ var StyleButtonsList_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
40906
40953
  __name: "StyleButtonsList",
40907
40954
  props: {
40908
40955
  buttons: {
@@ -40986,8 +41033,10 @@ var _sfc_main$6 = {
40986
41033
  }), 128))], 2);
40987
41034
  };
40988
41035
  }
40989
- };
40990
- var StyleButtonsList_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$6, [["__scopeId", "data-v-44f37ff6"]]);
41036
+ });
41037
+ //#endregion
41038
+ //#region src/internal/toolbar/built-in/StyleButtonsList.vue
41039
+ var StyleButtonsList_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(StyleButtonsList_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-539d0995"]]);
40991
41040
  //#endregion
40992
41041
  //#region src/internal/toolbar/built-in/list-style-buttons.js
40993
41042
  var bulletStyleButtons = [
@@ -41050,14 +41099,14 @@ var numberedStyleButtons = [
41050
41099
  }
41051
41100
  ];
41052
41101
  //#endregion
41053
- //#region src/internal/toolbar/built-in/DocumentMode.vue
41102
+ //#region src/internal/toolbar/built-in/DocumentMode.vue?vue&type=script&setup=true&lang.ts
41054
41103
  var _hoisted_1$7 = ["onClick", "onKeydown"];
41055
41104
  var _hoisted_2$7 = { class: "document-mode-column icon-column" };
41056
41105
  var _hoisted_3$6 = ["innerHTML"];
41057
41106
  var _hoisted_4$4 = { class: "document-mode-column text-column" };
41058
41107
  var _hoisted_5$2 = { class: "document-mode-type" };
41059
41108
  var _hoisted_6$1 = { class: "document-mode-description" };
41060
- var _sfc_main$5 = {
41109
+ var DocumentMode_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
41061
41110
  __name: "DocumentMode",
41062
41111
  props: { options: { type: Array } },
41063
41112
  emits: ["select"],
@@ -41093,9 +41142,11 @@ var _sfc_main$5 = {
41093
41142
  case "ArrowUp":
41094
41143
  moveToPreviousOption(index);
41095
41144
  break;
41096
- case "Enter":
41097
- handleClick(props.options[index]);
41145
+ case "Enter": {
41146
+ const option = props.options?.[index];
41147
+ if (option) handleClick(option);
41098
41148
  break;
41149
+ }
41099
41150
  default: break;
41100
41151
  }
41101
41152
  };
@@ -41121,8 +41172,10 @@ var _sfc_main$5 = {
41121
41172
  }), 256))], 2);
41122
41173
  };
41123
41174
  }
41124
- };
41125
- var DocumentMode_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$5, [["__scopeId", "data-v-bee14d7a"]]);
41175
+ });
41176
+ //#endregion
41177
+ //#region src/internal/toolbar/built-in/DocumentMode.vue
41178
+ var DocumentMode_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(DocumentMode_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-a20b9574"]]);
41126
41179
  //#endregion
41127
41180
  //#region src/internal/toolbar/built-in/LinkedStyle.vue?vue&type=script&setup=true&lang.ts
41128
41181
  var _hoisted_1$6 = {
@@ -41260,7 +41313,7 @@ var LinkedStyle_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ requ
41260
41313
  //#region src/internal/toolbar/built-in/LinkedStyle.vue
41261
41314
  var LinkedStyle_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(LinkedStyle_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-4e36f956"]]);
41262
41315
  //#endregion
41263
- //#region src/internal/toolbar/built-in/AIWriter.vue
41316
+ //#region src/internal/toolbar/built-in/AIWriter.vue?vue&type=script&setup=true&lang.ts
41264
41317
  var _hoisted_1$5 = ["placeholder"];
41265
41318
  var _hoisted_2$5 = { class: "sd-ai-writer__footer" };
41266
41319
  var _hoisted_3$4 = {
@@ -41271,7 +41324,7 @@ var _hoisted_3$4 = {
41271
41324
  var _hoisted_4$2 = ["disabled"];
41272
41325
  var DEFAULT_AI_ENDPOINT = "https://sd-dev-express-gateway-i6xtm.ondigitalocean.app/insights";
41273
41326
  var SYSTEM_PROMPT = "You are an expert copywriter and you are immersed in a document editor. Only write what is asked for.";
41274
- var _sfc_main$4 = {
41327
+ var AIWriter_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
41275
41328
  __name: "AIWriter",
41276
41329
  props: {
41277
41330
  selectedText: {
@@ -41318,13 +41371,13 @@ var _sfc_main$4 = {
41318
41371
  });
41319
41372
  function extractGeneratedText(payload) {
41320
41373
  if (typeof payload === "string") return payload;
41321
- if (!payload || typeof payload !== "object") return "";
41374
+ if (!require_create_super_doc_ui.isPlainObject(payload)) return "";
41322
41375
  const customPrompt = payload.custom_prompt;
41323
41376
  if (Array.isArray(customPrompt)) {
41324
41377
  const first = customPrompt[0];
41325
- if (first && typeof first.value === "string") return first.value;
41378
+ if (require_create_super_doc_ui.isPlainObject(first) && typeof first.value === "string") return first.value;
41326
41379
  }
41327
- if (customPrompt && typeof customPrompt === "object" && typeof customPrompt.value === "string") return customPrompt.value;
41380
+ if (require_create_super_doc_ui.isPlainObject(customPrompt) && typeof customPrompt.value === "string") return customPrompt.value;
41328
41381
  if (typeof payload.value === "string") return payload.value;
41329
41382
  if (typeof payload.text === "string") return payload.text;
41330
41383
  return "";
@@ -41358,7 +41411,7 @@ var _sfc_main$4 = {
41358
41411
  }
41359
41412
  function receiptSucceeded(receipt) {
41360
41413
  if (!receipt || typeof receipt !== "object") return true;
41361
- if (receipt.success === false || receipt.ok === false) return false;
41414
+ if ("success" in receipt && receipt.success === false || "ok" in receipt && receipt.ok === false) return false;
41362
41415
  return true;
41363
41416
  }
41364
41417
  function insertGeneratedText(text) {
@@ -41428,10 +41481,12 @@ var _sfc_main$4 = {
41428
41481
  }, require__plugin_vue_export_helper.toDisplayString(isLoading.value ? "Generating" : "Generate"), 9, _hoisted_4$2)])], 32);
41429
41482
  };
41430
41483
  }
41431
- };
41432
- var AIWriter_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$4, [["__scopeId", "data-v-67f6c6f7"]]);
41484
+ });
41433
41485
  //#endregion
41434
- //#region src/internal/toolbar/built-in/IconGridRow.vue
41486
+ //#region src/internal/toolbar/built-in/AIWriter.vue
41487
+ var AIWriter_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(AIWriter_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-3951e804"]]);
41488
+ //#endregion
41489
+ //#region src/internal/toolbar/built-in/IconGridRow.vue?vue&type=script&setup=true&lang.ts
41435
41490
  var _hoisted_1$4 = [
41436
41491
  "aria-label",
41437
41492
  "onClick",
@@ -41440,7 +41495,7 @@ var _hoisted_1$4 = [
41440
41495
  var _hoisted_2$4 = ["innerHTML"];
41441
41496
  var _hoisted_3$3 = ["innerHTML"];
41442
41497
  var ROW_SIZE$1 = 7;
41443
- var _sfc_main$3 = {
41498
+ var IconGridRow_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
41444
41499
  __name: "IconGridRow",
41445
41500
  props: {
41446
41501
  icons: {
@@ -41457,8 +41512,9 @@ var _sfc_main$3 = {
41457
41512
  const emit = __emit;
41458
41513
  const props = __props;
41459
41514
  const isActive = require__plugin_vue_export_helper.computed(() => (option) => {
41460
- if (!props.activeColor.value) return false;
41461
- return props.activeColor.value.toUpperCase() === option.value;
41515
+ const activeColor = props.activeColor?.value;
41516
+ if (!activeColor) return false;
41517
+ return activeColor.toUpperCase() === option.value;
41462
41518
  });
41463
41519
  const getCheckStyle = (color, optionIndex) => {
41464
41520
  if (optionIndex === 5 || ["#FFFFFF", "#FAFF09"].includes(color)) return { color: "#000" };
@@ -41566,17 +41622,19 @@ var _sfc_main$3 = {
41566
41622
  }), 128);
41567
41623
  };
41568
41624
  }
41569
- };
41570
- var IconGridRow_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$3, [["__scopeId", "data-v-05eb02fc"]]);
41625
+ });
41626
+ //#endregion
41627
+ //#region src/internal/toolbar/built-in/IconGridRow.vue
41628
+ var IconGridRow_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(IconGridRow_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-b1771c36"]]);
41571
41629
  //#endregion
41572
41630
  //#region ../../shared/common/icons/droplet-slash.svg?raw
41573
41631
  var droplet_slash_default = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d=\"M320 512c53.2 0 101.4-21.6 136.1-56.6l-298.3-235C140 257.1 128 292.3 128 320c0 106 86 192 192 192zM505.2 370.7c4.4-16.2 6.8-33.1 6.8-50.7c0-91.2-130.2-262.3-166.6-308.3C339.4 4.2 330.5 0 320.9 0l-1.8 0c-9.6 0-18.5 4.2-24.5 11.7C277.8 33 240.7 81.3 205.8 136L38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L505.2 370.7zM224 336c0 44.2 35.8 80 80 80c8.8 0 16 7.2 16 16s-7.2 16-16 16c-61.9 0-112-50.1-112-112c0-8.8 7.2-16 16-16s16 7.2 16 16z\"/></svg>\n";
41574
41632
  //#endregion
41575
- //#region src/internal/toolbar/built-in/IconGrid.vue
41633
+ //#region src/internal/toolbar/built-in/IconGrid.vue?vue&type=script&setup=true&lang.ts
41576
41634
  var _hoisted_1$3 = { class: "options-grid-wrap" };
41577
41635
  var _hoisted_2$3 = ["innerHTML"];
41578
41636
  var _hoisted_3$2 = { class: "option-grid-ctn" };
41579
- var _sfc_main$2 = {
41637
+ var IconGrid_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
41580
41638
  __name: "IconGrid",
41581
41639
  props: {
41582
41640
  icons: {
@@ -41616,15 +41674,17 @@ var _sfc_main$2 = {
41616
41674
  icons: __props.icons,
41617
41675
  "active-color": __props.activeColor,
41618
41676
  onSelect: handleSelect
41619
- }, null, 8, ["icons", "active-color"]), __props.customIcons.flat().length ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock(require__plugin_vue_export_helper.Fragment, { key: 0 }, [_cache[2] || (_cache[2] = require__plugin_vue_export_helper.createElementVNode("span", { class: "option-grid-ctn__subtitle" }, "Custom colors", -1)), require__plugin_vue_export_helper.createVNode(IconGridRow_default, {
41677
+ }, null, 8, ["icons", "active-color"]), __props.customIcons?.flat().length ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock(require__plugin_vue_export_helper.Fragment, { key: 0 }, [_cache[2] || (_cache[2] = require__plugin_vue_export_helper.createElementVNode("span", { class: "option-grid-ctn__subtitle" }, "Custom colors", -1)), require__plugin_vue_export_helper.createVNode(IconGridRow_default, {
41620
41678
  icons: __props.customIcons,
41621
41679
  "active-color": __props.activeColor,
41622
41680
  onSelect: handleSelect
41623
41681
  }, null, 8, ["icons", "active-color"])], 64)) : require__plugin_vue_export_helper.createCommentVNode("", true)])]);
41624
41682
  };
41625
41683
  }
41626
- };
41627
- var IconGrid_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$2, [["__scopeId", "data-v-52b0283a"]]);
41684
+ });
41685
+ //#endregion
41686
+ //#region src/internal/toolbar/built-in/IconGrid.vue
41687
+ var IconGrid_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(IconGrid_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-03719472"]]);
41628
41688
  //#endregion
41629
41689
  //#region src/internal/toolbar/built-in/color-dropdown-helpers.js
41630
41690
  var closeDropdown$1 = (dropdown) => {
@@ -41735,7 +41795,7 @@ var icons = [
41735
41795
  ]
41736
41796
  ];
41737
41797
  //#endregion
41738
- //#region src/internal/toolbar/built-in/TableGrid.vue
41798
+ //#region src/internal/toolbar/built-in/TableGrid.vue?vue&type=script&setup=true&lang.ts
41739
41799
  var _hoisted_1$2 = [
41740
41800
  "data-cols",
41741
41801
  "data-rows",
@@ -41744,7 +41804,7 @@ var _hoisted_1$2 = [
41744
41804
  ];
41745
41805
  var _hoisted_2$2 = ["aria-valuetext"];
41746
41806
  var ROW_SIZE = 5;
41747
- var TableGrid_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default({
41807
+ var TableGrid_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
41748
41808
  __name: "TableGrid",
41749
41809
  emits: ["select", "clickoutside"],
41750
41810
  setup(__props, { emit: __emit }) {
@@ -41755,10 +41815,13 @@ var TableGrid_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_
41755
41815
  const tableGridItems = require__plugin_vue_export_helper.ref([]);
41756
41816
  const onTableGridMouseOver = (event) => {
41757
41817
  let target = event.target;
41818
+ if (!(target instanceof HTMLElement)) return;
41758
41819
  if (!!target.dataset.grid) return;
41759
- let allItems = [...target.parentElement.querySelectorAll("[data-item]")];
41760
- let cols = parseInt(target.dataset.cols, 10);
41761
- let rows = parseInt(target.dataset.rows, 10);
41820
+ let grid = target.parentElement;
41821
+ if (!grid) return;
41822
+ let allItems = Array.from(grid.querySelectorAll("[data-item]"));
41823
+ let cols = parseInt(target.dataset.cols ?? "", 10);
41824
+ let rows = parseInt(target.dataset.rows ?? "", 10);
41762
41825
  selectGridItems(allItems, cols, rows);
41763
41826
  };
41764
41827
  const selectGridItems = (allItems, cols, rows) => {
@@ -41766,8 +41829,8 @@ var TableGrid_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_
41766
41829
  selectedRows.value = rows;
41767
41830
  for (let i = 0; i < allItems.length; i++) {
41768
41831
  let item = allItems[i];
41769
- let itemsCols = parseInt(item.dataset.cols, 10);
41770
- let itemsRows = parseInt(item.dataset.rows, 10);
41832
+ let itemsCols = parseInt(item.dataset.cols ?? "", 10);
41833
+ let itemsRows = parseInt(item.dataset.rows ?? "", 10);
41771
41834
  if (itemsCols <= cols && itemsRows <= rows) item.classList.add("sd-selected");
41772
41835
  else item.classList.remove("sd-selected");
41773
41836
  }
@@ -41857,9 +41920,12 @@ var TableGrid_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_
41857
41920
  }, require__plugin_vue_export_helper.toDisplayString(selectedRows.value) + " x " + require__plugin_vue_export_helper.toDisplayString(selectedCols.value), 9, _hoisted_2$2)], 2);
41858
41921
  };
41859
41922
  }
41860
- }, [["__scopeId", "data-v-b87d6ca2"]]);
41923
+ });
41861
41924
  //#endregion
41862
- //#region src/internal/toolbar/built-in/TableActions.vue
41925
+ //#region src/internal/toolbar/built-in/TableGrid.vue
41926
+ var TableGrid_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(TableGrid_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-38daa3ad"]]);
41927
+ //#endregion
41928
+ //#region src/internal/toolbar/built-in/TableActions.vue?vue&type=script&setup=true&lang.ts
41863
41929
  var _hoisted_1$1 = { class: "toolbar-table-actions" };
41864
41930
  var _hoisted_2$1 = [
41865
41931
  "aria-disabled",
@@ -41870,7 +41936,7 @@ var _hoisted_2$1 = [
41870
41936
  var _hoisted_3$1 = { class: "toolbar-table-actions__icon" };
41871
41937
  var _hoisted_4$1 = ["innerHTML"];
41872
41938
  var _hoisted_5$1 = { class: "toolbar-table-actions__label" };
41873
- var _sfc_main = {
41939
+ var TableActions_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ require__plugin_vue_export_helper.defineComponent({
41874
41940
  __name: "TableActions",
41875
41941
  props: { options: { type: Array } },
41876
41942
  emits: ["select"],
@@ -41899,8 +41965,10 @@ var _sfc_main = {
41899
41965
  }), 256))]);
41900
41966
  };
41901
41967
  }
41902
- };
41903
- var TableActions_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main, [["__scopeId", "data-v-72123aae"]]);
41968
+ });
41969
+ //#endregion
41970
+ //#region src/internal/toolbar/built-in/TableActions.vue
41971
+ var TableActions_default = /* @__PURE__ */ require__plugin_vue_export_helper._plugin_vue_export_helper_default(TableActions_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-76ed2dc1"]]);
41904
41972
  //#endregion
41905
41973
  //#region src/internal/toolbar/built-in/PageNumberMenu.vue?vue&type=script&setup=true&lang.ts
41906
41974
  var _hoisted_1 = ["aria-busy"];
@@ -44890,6 +44958,15 @@ function getActiveFontRuntime(editor) {
44890
44958
  *
44891
44959
  * @class
44892
44960
  */
44961
+ function runtimeUserOf(user) {
44962
+ const text = (value) => typeof value === "string" && value ? value : void 0;
44963
+ return {
44964
+ name: text(user.name) ?? "",
44965
+ ...text(user.id) ? { id: text(user.id) } : {},
44966
+ ...text(user.email) ? { email: text(user.email) } : {},
44967
+ ...text(user.initials) ? { initials: text(user.initials) } : {}
44968
+ };
44969
+ }
44893
44970
  var SuperDoc = class extends require_eventemitter3.import_eventemitter3.default {
44894
44971
  static {
44895
44972
  this.allowedTypes = [DOCX, PDF];
@@ -45120,6 +45197,7 @@ var SuperDoc = class extends require_eventemitter3.import_eventemitter3.default
45120
45197
  viewOptions: { layout: "print" },
45121
45198
  useLayoutEngine: true
45122
45199
  };
45200
+ this.#userSwitch = Promise.resolve();
45123
45201
  this.#fontsRelayEditors = /* @__PURE__ */ new WeakSet();
45124
45202
  this.#warnedMissingFonts = /* @__PURE__ */ new WeakMap();
45125
45203
  this.#lastFontsChangedPayload = null;
@@ -45216,7 +45294,7 @@ var SuperDoc = class extends require_eventemitter3.import_eventemitter3.default
45216
45294
  }
45217
45295
  this.userColorMap = /* @__PURE__ */ new Map();
45218
45296
  this.colorIndex = 0;
45219
- this.version = "2.29.0-next.1";
45297
+ this.version = "2.29.0-next.3";
45220
45298
  this.#log("🦋 [superdoc] Using SuperDoc version:", this.version);
45221
45299
  this.superdocId = config.superdocId || require_uuid.v4();
45222
45300
  this.colors = this.config.colors ?? [];
@@ -46071,6 +46149,46 @@ var SuperDoc = class extends require_eventemitter3.import_eventemitter3.default
46071
46149
  if (!editor) throw new Error("SuperDoc: source editor not yet created — wait for the ready event before upgrading");
46072
46150
  return editor;
46073
46151
  }
46152
+ setUser(user) {
46153
+ this.#requireReady("setUser");
46154
+ const name = typeof user?.name === "string" ? user.name.trim() : "";
46155
+ if (!name) return Promise.reject(/* @__PURE__ */ new TypeError("SuperDoc.setUser requires a non-empty user name."));
46156
+ const next = normalizeSuperDocUser({
46157
+ ...user,
46158
+ name
46159
+ });
46160
+ const applied = this.#userSwitch.then(() => this.#applyUser(next));
46161
+ this.#userSwitch = applied.catch(() => {});
46162
+ return applied;
46163
+ }
46164
+ #userSwitch;
46165
+ async #applyUser(next) {
46166
+ const current = this.config.user;
46167
+ if (current && [
46168
+ "id",
46169
+ "name",
46170
+ "email",
46171
+ "image",
46172
+ "initials"
46173
+ ].every((key) => (current[key] ?? null) === (next[key] ?? null))) return;
46174
+ const runtimes = this.#editorRuntimeRegistry.getAll();
46175
+ const results = await Promise.allSettled(runtimes.map((runtime) => runtime.setUser?.(runtimeUserOf(next))));
46176
+ const failure = results.find((result) => result.status === "rejected");
46177
+ if (failure) {
46178
+ if (current) await Promise.allSettled(runtimes.filter((_, index) => results[index].status === "fulfilled").map((runtime) => runtime.setUser?.(runtimeUserOf(current))));
46179
+ throw failure.reason;
46180
+ }
46181
+ const target = this.config.user ?? (this.config.user = {});
46182
+ for (const key of Object.keys(target)) delete target[key];
46183
+ Object.assign(target, next);
46184
+ this.user = target;
46185
+ this.#assignUserColor();
46186
+ const storeUser = this.superdocStore?.user;
46187
+ if (storeUser) {
46188
+ for (const key of Object.keys(storeUser)) delete storeUser[key];
46189
+ Object.assign(storeUser, target);
46190
+ }
46191
+ }
46074
46192
  /**
46075
46193
  * Add a user to the shared users list. Requires the instance to be
46076
46194
  * ready; pre-ready mutations would be silently overwritten by the