superdoc 2.20.0 → 2.20.1-next.10

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.
@@ -163,7 +163,7 @@ export interface FontSizeOption {
163
163
  }
164
164
  /** Observable enable/active state for a toolbar-style command. */
165
165
  export interface CommandState {
166
- /** The command can run against the current selection / mode. */
166
+ /** Availability for a control in the current selection / mode snapshot. */
167
167
  enabled: boolean;
168
168
  /** Compatibility inverse of `enabled` for demo code that models commands as disabled. */
169
169
  disabled?: boolean;
@@ -278,9 +278,10 @@ export type SuperDocUIReceipt = Receipt | SuperDocUIFailureReceipt | PartialLink
278
278
  * preserves the public Document API facade result (or a controller-minted
279
279
  * failure), including read-only / unsupported failures and mutation effects.
280
280
  * `true` is returned for legacy command handlers that do not produce a
281
- * structured result, or when the host reports only that an async browser
282
- * operation was scheduled. Use `executeAsync(...)` to await the settled result
283
- * when the browser Document API / host runs asynchronously.
281
+ * structured result, including accepted no-ops, or when the host reports only
282
+ * that an async browser operation was scheduled. Use `executeAsync(...)` to await the settled result
283
+ * when the browser Document API / host runs asynchronously. A settled `true`
284
+ * does not guarantee a document mutation, such as Undo with an empty history.
284
285
  */
285
286
  export type CommandExecutionResult = boolean | SuperDocUIReceipt;
286
287
  /**
@@ -333,16 +334,18 @@ export interface CommandHandle<Id extends CommandId = CommandId> {
333
334
  observe(listener: (state: CommandState) => void): () => void;
334
335
  /**
335
336
  * Run the command. Returns the Document API receipt when the host facade
336
- * provides one, or `false` for unsupported / disabled commands rather than
337
- * throwing. When the browser operation settles asynchronously this returns
338
- * the immediate routed result (`true` or a sync receipt); use
337
+ * provides one, or `false` when routing or current execution prerequisites
338
+ * are unavailable rather than throwing. When the browser operation settles
339
+ * asynchronously this returns the immediate routed result (`true` or a sync receipt); use
339
340
  * `executeAsync(...)` to await settlement.
340
341
  */
341
342
  execute(payload?: unknown): CommandExecutionResult;
342
343
  /**
343
344
  * Run the command and resolve once the routed operation has settled. On
344
345
  * browser-backed hosts this includes the post-mutation paint observation
345
- * boundary when available.
346
+ * boundary when available. Selection-dependent commands may refresh stale
347
+ * selection state before execution. A settled `true` can be an accepted
348
+ * no-op and does not guarantee a document mutation.
346
349
  */
347
350
  executeAsync(payload?: unknown): Promise<CommandExecutionResult>;
348
351
  }
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-BQBQsjoe.cjs");
4
+ const require_create_super_doc_ui = require("./chunks/create-super-doc-ui-j8Qm5SYa.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-CYxINHh_.cjs");
@@ -316,7 +316,7 @@ var shuffleArray = (array) => {
316
316
  var DEFAULT_ENDPOINT = "https://ingest.superdoc.dev/v1/collect";
317
317
  function getSuperdocVersion() {
318
318
  try {
319
- return "2.20.0";
319
+ return "2.20.1-next.10";
320
320
  } catch {
321
321
  return "unknown";
322
322
  }
@@ -8923,6 +8923,11 @@ var useCommentsStore = defineStore("comments", () => {
8923
8923
  }
8924
8924
  superdoc?.activeEditor?.commands?.removeComment({ commentId: "pending" });
8925
8925
  };
8926
+ const getV2CreatedComment = ({ outcome, reconciled, documentId }) => {
8927
+ const createdId = normalizeCommentId(outcome?.createdCommentId);
8928
+ if (!createdId) return reconciled?.added ?? null;
8929
+ return commentsList.value.find((row) => String(row.commentId) === createdId && (documentId == null || String(row.fileId) === String(documentId))) ?? null;
8930
+ };
8926
8931
  /**
8927
8932
  * Add a new comment to the document
8928
8933
  *
@@ -8976,20 +8981,25 @@ var useCommentsStore = defineStore("comments", () => {
8976
8981
  documentId: v2Adapter.documentId,
8977
8982
  items: outcome.items
8978
8983
  });
8984
+ const created = getV2CreatedComment({
8985
+ outcome,
8986
+ reconciled,
8987
+ documentId: v2Adapter.documentId
8988
+ });
8979
8989
  const hadPendingComment = !!pendingComment.value;
8980
8990
  if (hadPendingComment) removePendingComment(superdoc);
8981
- const createdId = reconciled?.added?.commentId ?? null;
8991
+ const createdId = created?.commentId ?? null;
8982
8992
  if (hadPendingComment && createdId) {
8983
8993
  setActiveComment(superdoc, createdId);
8984
8994
  setActiveFloatingCommentInstance(createdId);
8985
8995
  }
8986
8996
  if (broadcastChanges) superdoc.emit("comments-update", {
8987
8997
  type: COMMENT_EVENTS.ADD,
8988
- comment: reconciled?.added?.getValues?.() ?? null
8998
+ comment: created?.getValues?.() ?? null
8989
8999
  });
8990
9000
  return {
8991
9001
  ok: true,
8992
- comment: reconciled?.added ?? null
9002
+ comment: created
8993
9003
  };
8994
9004
  });
8995
9005
  }
@@ -9548,9 +9558,13 @@ var useCommentsStore = defineStore("comments", () => {
9548
9558
  eventType: COMMENT_EVENTS.ADD,
9549
9559
  rejectionFallbackReason: "v2-reply-failed",
9550
9560
  rejectionEventExtras: parent ? { comment: getCommentEventPayload(parent) } : {},
9551
- successEventBuilder: ({ reconciled }) => ({
9561
+ successEventBuilder: ({ outcome, reconciled }) => ({
9552
9562
  type: COMMENT_EVENTS.ADD,
9553
- comment: reconciled?.added?.getValues?.() ?? null
9563
+ comment: getV2CreatedComment({
9564
+ outcome,
9565
+ reconciled,
9566
+ documentId: v2Adapter.documentId
9567
+ })?.getValues?.() ?? null
9554
9568
  })
9555
9569
  });
9556
9570
  };
@@ -13167,51 +13181,53 @@ var _hoisted_26 = { key: 7 };
13167
13181
  var _hoisted_27 = { class: "tracked-change-text is-deleted" };
13168
13182
  var _hoisted_28 = { class: "tracked-change-text is-inserted" };
13169
13183
  var _hoisted_29 = { key: 8 };
13170
- var _hoisted_30 = { class: "tracked-change-text is-deleted" };
13171
- var _hoisted_31 = { key: 9 };
13172
- var _hoisted_32 = { class: "tracked-change-text is-inserted" };
13173
- var _hoisted_33 = ["data-track-change-image-preview-role"];
13174
- var _hoisted_34 = ["src", "alt"];
13175
- var _hoisted_35 = {
13184
+ var _hoisted_30 = { key: 9 };
13185
+ var _hoisted_31 = { key: 10 };
13186
+ var _hoisted_32 = { class: "tracked-change-text is-deleted" };
13187
+ var _hoisted_33 = { key: 11 };
13188
+ var _hoisted_34 = { class: "tracked-change-text is-inserted" };
13189
+ var _hoisted_35 = ["data-track-change-image-preview-role"];
13190
+ var _hoisted_36 = ["src", "alt"];
13191
+ var _hoisted_37 = {
13176
13192
  key: 1,
13177
13193
  class: "card-section comment-body"
13178
13194
  };
13179
- var _hoisted_36 = ["innerHTML"];
13180
- var _hoisted_37 = {
13195
+ var _hoisted_38 = ["innerHTML"];
13196
+ var _hoisted_39 = {
13181
13197
  key: 1,
13182
13198
  class: "comment"
13183
13199
  };
13184
- var _hoisted_38 = {
13200
+ var _hoisted_40 = {
13185
13201
  key: 2,
13186
13202
  class: "reply-expanded"
13187
13203
  };
13188
- var _hoisted_39 = { class: "reply-input-wrapper" };
13189
- var _hoisted_40 = { class: "reply-actions" };
13190
- var _hoisted_41 = ["onClick"];
13191
- var _hoisted_42 = [
13204
+ var _hoisted_41 = { class: "reply-input-wrapper" };
13205
+ var _hoisted_42 = { class: "reply-actions" };
13206
+ var _hoisted_43 = ["onClick"];
13207
+ var _hoisted_44 = [
13192
13208
  "onClick",
13193
13209
  "disabled",
13194
13210
  "data-disabled-reason"
13195
13211
  ];
13196
- var _hoisted_43 = { class: "collapsed-avatars" };
13197
- var _hoisted_44 = {
13212
+ var _hoisted_45 = { class: "collapsed-avatars" };
13213
+ var _hoisted_46 = {
13198
13214
  key: 3,
13199
13215
  class: "comment-separator"
13200
13216
  };
13201
- var _hoisted_45 = {
13217
+ var _hoisted_47 = {
13202
13218
  key: 2,
13203
13219
  class: "tracked-change-decision-alert",
13204
13220
  role: "alert"
13205
13221
  };
13206
- var _hoisted_46 = { class: "tracked-change-decision-alert__message" };
13207
- var _hoisted_47 = ["disabled", "data-disabled-reason"];
13208
- var _hoisted_48 = {
13222
+ var _hoisted_48 = { class: "tracked-change-decision-alert__message" };
13223
+ var _hoisted_49 = ["disabled", "data-disabled-reason"];
13224
+ var _hoisted_50 = {
13209
13225
  key: 1,
13210
13226
  class: "reply-expanded"
13211
13227
  };
13212
- var _hoisted_49 = { class: "reply-input-wrapper" };
13213
- var _hoisted_50 = { class: "reply-actions" };
13214
- var _hoisted_51 = ["disabled", "data-disabled-reason"];
13228
+ var _hoisted_51 = { class: "reply-input-wrapper" };
13229
+ var _hoisted_52 = { class: "reply-actions" };
13230
+ var _hoisted_53 = ["disabled", "data-disabled-reason"];
13215
13231
  var CLICK_OUTSIDE_HIT_TOLERANCE_PX = 3;
13216
13232
  var TRACKED_CHANGE_PREVIEW_MAX_PX = 90;
13217
13233
  var _sfc_main$34 = {
@@ -14221,8 +14237,8 @@ var _sfc_main$34 = {
14221
14237
  require__plugin_vue_export_helper.createElementVNode("span", _hoisted_27, "\"" + require__plugin_vue_export_helper.toDisplayString(comment.deletedText) + "\"", 1),
14222
14238
  _cache[9] || (_cache[9] = require__plugin_vue_export_helper.createElementVNode("span", { class: "change-type" }, " with ", -1)),
14223
14239
  require__plugin_vue_export_helper.createElementVNode("span", _hoisted_28, "\"" + require__plugin_vue_export_helper.toDisplayString(comment.trackedChangeText) + "\"", 1)
14224
- ])) : comment.deletedText ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_29, [_cache[10] || (_cache[10] = require__plugin_vue_export_helper.createElementVNode("span", { class: "change-type" }, "Deleted ", -1)), require__plugin_vue_export_helper.createElementVNode("span", _hoisted_30, "\"" + require__plugin_vue_export_helper.toDisplayString(comment.deletedText) + "\"", 1)])) : comment.trackedChangeText ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_31, [_cache[11] || (_cache[11] = require__plugin_vue_export_helper.createElementVNode("span", { class: "change-type" }, "Added ", -1)), require__plugin_vue_export_helper.createElementVNode("span", _hoisted_32, "\"" + require__plugin_vue_export_helper.toDisplayString(comment.trackedChangeText) + "\"", 1)])) : require__plugin_vue_export_helper.createCommentVNode("", true), comment.trackedChangeImagePreview?.src ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", {
14225
- key: 10,
14240
+ ])) : comment.deletedText && comment.deletedText === "\n" ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_29, [..._cache[10] || (_cache[10] = [require__plugin_vue_export_helper.createElementVNode("span", { class: "change-type" }, "Deleted line break", -1)])])) : comment.trackedChangeText && comment.trackedChangeText === "\n" ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_30, [..._cache[11] || (_cache[11] = [require__plugin_vue_export_helper.createElementVNode("span", { class: "change-type" }, "Added line break", -1)])])) : comment.deletedText ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_31, [_cache[12] || (_cache[12] = require__plugin_vue_export_helper.createElementVNode("span", { class: "change-type" }, "Deleted ", -1)), require__plugin_vue_export_helper.createElementVNode("span", _hoisted_32, "\"" + require__plugin_vue_export_helper.toDisplayString(comment.deletedText) + "\"", 1)])) : comment.trackedChangeText ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_33, [_cache[13] || (_cache[13] = require__plugin_vue_export_helper.createElementVNode("span", { class: "change-type" }, "Added ", -1)), require__plugin_vue_export_helper.createElementVNode("span", _hoisted_34, "\"" + require__plugin_vue_export_helper.toDisplayString(comment.trackedChangeText) + "\"", 1)])) : require__plugin_vue_export_helper.createCommentVNode("", true), comment.trackedChangeImagePreview?.src ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", {
14241
+ key: 12,
14226
14242
  class: "tracked-change-image-preview",
14227
14243
  "data-track-change-image-preview-role": comment.trackedChangeImagePreview.role ?? void 0
14228
14244
  }, [require__plugin_vue_export_helper.createElementVNode("img", {
@@ -14232,7 +14248,7 @@ var _sfc_main$34 = {
14232
14248
  style: require__plugin_vue_export_helper.normalizeStyle(trackedChangeImagePreviewStyle(comment.trackedChangeImagePreview)),
14233
14249
  loading: "lazy",
14234
14250
  decoding: "async"
14235
- }, null, 12, _hoisted_34)], 8, _hoisted_33)) : require__plugin_vue_export_helper.createCommentVNode("", true)], 10, _hoisted_10$3),
14251
+ }, null, 12, _hoisted_36)], 8, _hoisted_35)) : require__plugin_vue_export_helper.createCommentVNode("", true)], 10, _hoisted_10$3),
14236
14252
  shouldTruncate.value && isTextOverflowing.value && index === 0 ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", {
14237
14253
  key: 0,
14238
14254
  class: "show-more-toggle",
@@ -14244,29 +14260,29 @@ var _sfc_main$34 = {
14244
14260
  onClick: require__plugin_vue_export_helper.withModifiers(toggleTruncation, ["stop", "prevent"])
14245
14261
  }, " Show less ")) : require__plugin_vue_export_helper.createCommentVNode("", true)
14246
14262
  ])) : require__plugin_vue_export_helper.createCommentVNode("", true),
14247
- !comment.trackedChange ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_35, [
14263
+ !comment.trackedChange ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_37, [
14248
14264
  !require__plugin_vue_export_helper.unref(isDebugging) && !isEditingThisComment.value(comment) ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", {
14249
14265
  key: 0,
14250
14266
  class: require__plugin_vue_export_helper.normalizeClass(["comment", index === 0 ? bodyOverflowClass.value : void 0]),
14251
14267
  ref_for: true,
14252
14268
  ref: index === 0 ? setParentBodyRef : void 0,
14253
14269
  innerHTML: comment.commentText
14254
- }, null, 10, _hoisted_36)) : require__plugin_vue_export_helper.unref(isDebugging) && !isEditingThisComment.value(comment) ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_37, require__plugin_vue_export_helper.toDisplayString(require__plugin_vue_export_helper.unref(editorCommentPositions)[comment.importedId !== void 0 ? comment.importedId : comment.commentId]?.bounds), 1)) : (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_38, [require__plugin_vue_export_helper.createElementVNode("div", _hoisted_39, [require__plugin_vue_export_helper.createVNode(CommentInput_default, {
14270
+ }, null, 10, _hoisted_38)) : require__plugin_vue_export_helper.unref(isDebugging) && !isEditingThisComment.value(comment) ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_39, require__plugin_vue_export_helper.toDisplayString(require__plugin_vue_export_helper.unref(editorCommentPositions)[comment.importedId !== void 0 ? comment.importedId : comment.commentId]?.bounds), 1)) : (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_40, [require__plugin_vue_export_helper.createElementVNode("div", _hoisted_41, [require__plugin_vue_export_helper.createVNode(CommentInput_default, {
14255
14271
  ref_for: true,
14256
14272
  ref: setEditCommentInputRef(comment.commentId),
14257
14273
  users: [],
14258
14274
  config: require__plugin_vue_export_helper.unref(getConfig),
14259
14275
  "include-header": false,
14260
14276
  comment
14261
- }, null, 8, ["config", "comment"])]), require__plugin_vue_export_helper.createElementVNode("div", _hoisted_40, [require__plugin_vue_export_helper.createElementVNode("button", {
14277
+ }, null, 8, ["config", "comment"])]), require__plugin_vue_export_helper.createElementVNode("div", _hoisted_42, [require__plugin_vue_export_helper.createElementVNode("button", {
14262
14278
  class: "sd-button reply-btn-cancel",
14263
14279
  onClick: require__plugin_vue_export_helper.withModifiers(($event) => handleCancel(comment), ["stop", "prevent"])
14264
- }, "Cancel", 8, _hoisted_41), require__plugin_vue_export_helper.createElementVNode("button", {
14280
+ }, "Cancel", 8, _hoisted_43), require__plugin_vue_export_helper.createElementVNode("button", {
14265
14281
  class: require__plugin_vue_export_helper.normalizeClass(["sd-button primary reply-btn-primary", { "sd-is-disabled": !hasTextContent.value || isV2WriteDisabled.value }]),
14266
14282
  onClick: require__plugin_vue_export_helper.withModifiers(($event) => handleCommentUpdate(comment), ["stop", "prevent"]),
14267
14283
  disabled: !hasTextContent.value || isV2WriteDisabled.value,
14268
14284
  "data-disabled-reason": isV2WriteDisabled.value ? v2WriteCapability.value?.reason ?? null : null
14269
- }, " Update ", 10, _hoisted_42)])])),
14285
+ }, " Update ", 10, _hoisted_44)])])),
14270
14286
  shouldTruncate.value && isTextOverflowing.value && index === 0 && !isEditingThisComment.value(comment) ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", {
14271
14287
  key: 3,
14272
14288
  class: "show-more-toggle",
@@ -14278,20 +14294,20 @@ var _sfc_main$34 = {
14278
14294
  onClick: require__plugin_vue_export_helper.withModifiers(toggleTruncation, ["stop", "prevent"])
14279
14295
  }, " Show less ")) : require__plugin_vue_export_helper.createCommentVNode("", true)
14280
14296
  ])) : require__plugin_vue_export_helper.createCommentVNode("", true),
14281
- shouldCollapseThread.value && index === 0 ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock(require__plugin_vue_export_helper.Fragment, { key: 2 }, [_cache[12] || (_cache[12] = require__plugin_vue_export_helper.createElementVNode("div", { class: "comment-separator" }, null, -1)), require__plugin_vue_export_helper.createElementVNode("div", {
14297
+ shouldCollapseThread.value && index === 0 ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock(require__plugin_vue_export_helper.Fragment, { key: 2 }, [_cache[14] || (_cache[14] = require__plugin_vue_export_helper.createElementVNode("div", { class: "comment-separator" }, null, -1)), require__plugin_vue_export_helper.createElementVNode("div", {
14282
14298
  class: "collapsed-replies",
14283
14299
  onClick: require__plugin_vue_export_helper.withModifiers(expandThread, ["stop", "prevent"])
14284
- }, [require__plugin_vue_export_helper.createElementVNode("div", _hoisted_43, [(require__plugin_vue_export_helper.openBlock(true), require__plugin_vue_export_helper.createElementBlock(require__plugin_vue_export_helper.Fragment, null, require__plugin_vue_export_helper.renderList(collapsedReplyAuthors.value, (author) => {
14300
+ }, [require__plugin_vue_export_helper.createElementVNode("div", _hoisted_45, [(require__plugin_vue_export_helper.openBlock(true), require__plugin_vue_export_helper.createElementBlock(require__plugin_vue_export_helper.Fragment, null, require__plugin_vue_export_helper.renderList(collapsedReplyAuthors.value, (author) => {
14285
14301
  return require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createBlock(Avatar_default, {
14286
14302
  key: author.email || author.name,
14287
14303
  user: author,
14288
14304
  class: "mini-avatar"
14289
14305
  }, null, 8, ["user"]);
14290
14306
  }), 128))]), require__plugin_vue_export_helper.createElementVNode("span", null, require__plugin_vue_export_helper.toDisplayString(collapsedReplyCount.value) + " more " + require__plugin_vue_export_helper.toDisplayString(collapsedReplyCount.value === 1 ? "reply" : "replies"), 1)])], 64)) : require__plugin_vue_export_helper.createCommentVNode("", true),
14291
- showSeparator.value(index) ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_44)) : require__plugin_vue_export_helper.createCommentVNode("", true)
14307
+ showSeparator.value(index) ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_46)) : require__plugin_vue_export_helper.createCommentVNode("", true)
14292
14308
  ]);
14293
14309
  }), 128)),
14294
- trackedChangeDecisionFailure.value ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_45, [require__plugin_vue_export_helper.createElementVNode("span", _hoisted_46, require__plugin_vue_export_helper.toDisplayString(trackedChangeDecisionFailureMessage.value), 1), require__plugin_vue_export_helper.createElementVNode("button", {
14310
+ trackedChangeDecisionFailure.value ? (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_47, [require__plugin_vue_export_helper.createElementVNode("span", _hoisted_48, require__plugin_vue_export_helper.toDisplayString(trackedChangeDecisionFailureMessage.value), 1), require__plugin_vue_export_helper.createElementVNode("button", {
14295
14311
  type: "button",
14296
14312
  class: "sd-button tracked-change-decision-alert__retry",
14297
14313
  onClick: require__plugin_vue_export_helper.withModifiers(retryTrackedChangeDecision, ["stop", "prevent"])
@@ -14303,7 +14319,7 @@ var _sfc_main$34 = {
14303
14319
  onClick: require__plugin_vue_export_helper.withModifiers(startReply, ["stop", "prevent"]),
14304
14320
  disabled: isV2WriteDisabled.value,
14305
14321
  "data-disabled-reason": isV2WriteDisabled.value ? v2WriteCapability.value?.reason ?? null : null
14306
- }, " Reply or add others with @ ", 10, _hoisted_47)) : (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_48, [require__plugin_vue_export_helper.createElementVNode("div", _hoisted_49, [require__plugin_vue_export_helper.createVNode(CommentInput_default, {
14322
+ }, " Reply or add others with @ ", 10, _hoisted_49)) : (require__plugin_vue_export_helper.openBlock(), require__plugin_vue_export_helper.createElementBlock("div", _hoisted_50, [require__plugin_vue_export_helper.createElementVNode("div", _hoisted_51, [require__plugin_vue_export_helper.createVNode(CommentInput_default, {
14307
14323
  ref_key: "commentInput",
14308
14324
  ref: commentInput,
14309
14325
  users: usersFiltered.value,
@@ -14314,7 +14330,7 @@ var _sfc_main$34 = {
14314
14330
  "users",
14315
14331
  "config",
14316
14332
  "comment"
14317
- ])]), require__plugin_vue_export_helper.createElementVNode("div", _hoisted_50, [require__plugin_vue_export_helper.createElementVNode("button", {
14333
+ ])]), require__plugin_vue_export_helper.createElementVNode("div", _hoisted_52, [require__plugin_vue_export_helper.createElementVNode("button", {
14318
14334
  class: "sd-button reply-btn-cancel",
14319
14335
  onClick: require__plugin_vue_export_helper.withModifiers(handleCancel, ["stop", "prevent"])
14320
14336
  }, "Cancel"), require__plugin_vue_export_helper.createElementVNode("button", {
@@ -14322,12 +14338,12 @@ var _sfc_main$34 = {
14322
14338
  onClick: require__plugin_vue_export_helper.withModifiers(handleAddComment, ["stop", "prevent"]),
14323
14339
  disabled: !hasTextContent.value || isV2WriteDisabled.value || isSubmittingReply.value,
14324
14340
  "data-disabled-reason": v2ReplyDisabledReason.value
14325
- }, " Reply ", 10, _hoisted_51)])]))], 64)) : require__plugin_vue_export_helper.createCommentVNode("", true)
14341
+ }, " Reply ", 10, _hoisted_53)])]))], 64)) : require__plugin_vue_export_helper.createCommentVNode("", true)
14326
14342
  ], 64))], 14, _hoisted_1$27)), [[_directive_click_outside, handleClickOutside]]);
14327
14343
  };
14328
14344
  }
14329
14345
  };
14330
- var CommentDialog_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$34, [["__scopeId", "data-v-bc46ac97"]]);
14346
+ var CommentDialog_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$34, [["__scopeId", "data-v-eefd4750"]]);
14331
14347
  //#endregion
14332
14348
  //#region src/components/CommentsLayer/commentsList/ReviewDirectoryListItem.vue
14333
14349
  var _hoisted_1$26 = [
@@ -22176,6 +22192,7 @@ var SuperDoc_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_v
22176
22192
  if (!documentId) return;
22177
22193
  clearV2CommandShortcutBinding(documentId);
22178
22194
  if (typeof bindEditShortcuts !== "function") return;
22195
+ getSuperDocUI();
22179
22196
  const openLinkWorkflow = resolveV2LinkWorkflowOpener();
22180
22197
  const unbind = bindEditShortcuts({
22181
22198
  commandRoute: {
@@ -24520,7 +24537,7 @@ var SuperDoc_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_v
24520
24537
  ], 38);
24521
24538
  };
24522
24539
  }
24523
- }, [["__scopeId", "data-v-7bbf01da"]]);
24540
+ }, [["__scopeId", "data-v-e476c448"]]);
24524
24541
  //#endregion
24525
24542
  //#region src/core/create-app.js
24526
24543
  var PINIA_DEVTOOLS_SETUP_EVENT = "devtools-plugin:setup";
@@ -40542,6 +40559,7 @@ var _sfc_main$15 = {
40542
40559
  ref_key: "popupRef",
40543
40560
  ref: popupRef,
40544
40561
  role: "listbox",
40562
+ "data-sd-part": "dropdown-menu",
40545
40563
  id: listboxId.value,
40546
40564
  "aria-label": ariaLabel.value,
40547
40565
  class: require__plugin_vue_export_helper.normalizeClass(["sd-font-combobox__listbox", { "high-contrast": require__plugin_vue_export_helper.unref(isHighContrastMode) }]),
@@ -40571,7 +40589,7 @@ var _sfc_main$15 = {
40571
40589
  };
40572
40590
  }
40573
40591
  };
40574
- var ToolbarComboBox_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$15, [["__scopeId", "data-v-53e0af20"]]);
40592
+ var ToolbarComboBox_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vue_export_helper_default(_sfc_main$15, [["__scopeId", "data-v-e288ef9f"]]);
40575
40593
  //#endregion
40576
40594
  //#region src/internal/toolbar/built-in/FontFamilyCombobox.vue
40577
40595
  var _sfc_main$14 = {
@@ -41609,10 +41627,9 @@ var Toolbar_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vu
41609
41627
  });
41610
41628
  const showLeftSide = proxy.$toolbar.config?.toolbarGroups?.includes("left");
41611
41629
  const showRightSide = proxy.$toolbar.config?.toolbarGroups?.includes("right");
41612
- const excludeButtonsList = proxy.$toolbar.config?.toolbarButtonsExclude || [];
41613
41630
  const getFilteredItems = (position) => {
41614
41631
  toolbarStateVersion.value;
41615
- return proxy.$toolbar.getToolbarItemByGroup(position).filter((item) => !excludeButtonsList.includes(item.name.value));
41632
+ return proxy.$toolbar.getToolbarItemByGroup(position);
41616
41633
  };
41617
41634
  const updateCompactSideGroups = () => {
41618
41635
  compactSideGroups.value = proxy.$toolbar.getAvailableWidth() <= RESPONSIVE_BREAKPOINTS.lg;
@@ -41786,7 +41803,7 @@ var Toolbar_default = /*#__PURE__*/ require__plugin_vue_export_helper._plugin_vu
41786
41803
  ], 32);
41787
41804
  };
41788
41805
  }
41789
- }, [["__scopeId", "data-v-9418cc7d"]]);
41806
+ }, [["__scopeId", "data-v-0d00bc5b"]]);
41790
41807
  //#endregion
41791
41808
  //#region src/internal/toolbar/built-in/font-options.js
41792
41809
  /**
@@ -43548,6 +43565,35 @@ var getToolbarItemWidth = (item, controlSizes) => {
43548
43565
  if (item.type === "separator") return controlSizes.get("separator");
43549
43566
  return controlSizes.get(item.name.value) || controlSizes.get("default");
43550
43567
  };
43568
+ var collapseSeparatorRun = (items) => {
43569
+ const result = [];
43570
+ for (const item of items) {
43571
+ if (item.type === "separator") {
43572
+ const previous = result[result.length - 1];
43573
+ if (!previous || previous.type === "separator") continue;
43574
+ }
43575
+ result.push(item);
43576
+ }
43577
+ while (result.length && result[result.length - 1].type === "separator") result.pop();
43578
+ return result;
43579
+ };
43580
+ var normalizeSeparators = (items) => {
43581
+ const byGroup = /* @__PURE__ */ new Map();
43582
+ for (const item of items) {
43583
+ const group = item.group?.value || "center";
43584
+ if (!byGroup.has(group)) byGroup.set(group, []);
43585
+ byGroup.get(group).push(item);
43586
+ }
43587
+ const kept = /* @__PURE__ */ new Set();
43588
+ for (const groupItems of byGroup.values()) for (const item of collapseSeparatorRun(groupItems)) kept.add(item);
43589
+ return items.filter((item) => kept.has(item));
43590
+ };
43591
+ var normalizeSeparatorsIgnoringOverflow = (items) => {
43592
+ const overflowTrigger = items.find((item) => item.type === "overflow");
43593
+ const withoutOverflow = items.filter((item) => item !== overflowTrigger);
43594
+ const kept = new Set(normalizeSeparators(withoutOverflow));
43595
+ return items.filter((item) => item === overflowTrigger || kept.has(item));
43596
+ };
43551
43597
  /**
43552
43598
  * Set or clear the link item's `href` without disturbing the rest of its
43553
43599
  * attributes. The static configuration (`ariaLabel`, and anything added later)
@@ -43602,7 +43648,7 @@ function hasAiModule(superToolbar) {
43602
43648
  function aiModuleConfig(superToolbar) {
43603
43649
  return superToolbar.config?.superdoc?.config?.modules?.ai ?? superToolbar.superdoc?.config?.modules?.ai ?? {};
43604
43650
  }
43605
- var makeDefaultItems = ({ superToolbar, toolbarIcons, toolbarTexts, toolbarFonts, hideButtons, availableWidth, role, isDev = false, configuredItemNames, excludedItemNames, additionalItems = [] } = {}) => {
43651
+ var makeDefaultItems = ({ superToolbar, toolbarIcons, toolbarTexts, toolbarFonts, hideButtons, availableWidth, role, isDev = false, configuredItemNames, configuredItemOrder, excludedItemNames, additionalItems = [] } = {}) => {
43606
43652
  const bold = useToolbarItem({
43607
43653
  type: "button",
43608
43654
  name: "bold",
@@ -44712,9 +44758,15 @@ var makeDefaultItems = ({ superToolbar, toolbarIcons, toolbarTexts, toolbarFonts
44712
44758
  }
44713
44759
  if (configuredItemNames) toolbarItems = toolbarItems.filter((item) => item.name.value === "overflow" || item.isCustomToolbarItem || configuredItemNames.has(item.name.value));
44714
44760
  if (excludedItemNames?.size) toolbarItems = toolbarItems.filter((item) => !excludedItemNames.has(item.name.value));
44761
+ toolbarItems = normalizeSeparatorsIgnoringOverflow(toolbarItems);
44715
44762
  const isStickyItem = (item) => stickyItemNames.includes(item.name.value);
44716
44763
  const overflowTrigger = toolbarItems.find((item) => item.name.value === "overflow");
44717
44764
  const layoutItems = toolbarItems.filter((item) => item !== overflowTrigger);
44765
+ if (configuredItemOrder) {
44766
+ const orderIndex = new Map(configuredItemOrder.map((name, index) => [name, index]));
44767
+ const rank = (item) => orderIndex.get(item.name.value) ?? Number.MAX_SAFE_INTEGER;
44768
+ layoutItems.sort((a, b) => rank(a) - rank(b));
44769
+ }
44718
44770
  const partitionItems = (reserveOverflowTrigger) => {
44719
44771
  const overflowItems = [];
44720
44772
  const visibleItems = [];
@@ -44756,6 +44808,7 @@ var makeDefaultItems = ({ superToolbar, toolbarIcons, toolbarTexts, toolbarFonts
44756
44808
  if (insertAt === -1) visibleItems.push(overflowTrigger);
44757
44809
  else visibleItems.splice(insertAt, 0, overflowTrigger);
44758
44810
  }
44811
+ visibleItems = normalizeSeparators(visibleItems);
44759
44812
  return {
44760
44813
  defaultItems: visibleItems,
44761
44814
  overflowItems: overflowItems.filter((item) => item.type !== "separator")
@@ -44976,6 +45029,7 @@ var BuiltInToolbar = class extends require_eventemitter3.import_eventemitter3.de
44976
45029
  responsiveToContainer: false,
44977
45030
  mode: "docx",
44978
45031
  excludeItems: [],
45032
+ toolbarButtonsExclude: [],
44979
45033
  groups: null,
44980
45034
  customButtons: [],
44981
45035
  showFormattingMarksButton: false,
@@ -45141,7 +45195,7 @@ var BuiltInToolbar = class extends require_eventemitter3.import_eventemitter3.de
45141
45195
  const selectedCustomOptions = new Map(this.#getAllToolbarItems().filter((item) => item.isCustomToolbarItem && item.type === "dropdown").map((item) => [item.name.value, item.selectedValue.value]));
45142
45196
  const hasExplicitGroupComposition = this.config.groups && !Array.isArray(this.config.groups) && Object.keys(this.config.groups).length > 0;
45143
45197
  const configuredItemNames = hasExplicitGroupComposition ? new Set(Object.values(this.config.groups).flatMap((items) => items)) : null;
45144
- const excludedItemNames = new Set(this.config.excludeItems);
45198
+ const excludedItemNames = /* @__PURE__ */ new Set([...this.config.excludeItems ?? [], ...this.config.toolbarButtonsExclude ?? []]);
45145
45199
  const customItems = this.config.customButtons || [];
45146
45200
  const takenNames = new Set(RESERVED_TOOLBAR_ITEM_NAMES);
45147
45201
  const customToolbarItems = customItems.map((item, index) => {
@@ -45162,6 +45216,12 @@ var BuiltInToolbar = class extends require_eventemitter3.import_eventemitter3.de
45162
45216
  }).filter(Boolean);
45163
45217
  const configuredGroups = hasExplicitGroupComposition ? new Set(Object.keys(this.config.groups)) : null;
45164
45218
  const layoutCustomItems = configuredGroups ? customToolbarItems.filter((item) => configuredGroups.has(item.group?.value || "center")) : customToolbarItems;
45219
+ let allConfigItems = null;
45220
+ if (hasExplicitGroupComposition) {
45221
+ const groupedItems = Object.values(this.config.groups).flatMap((item) => item);
45222
+ const groupedCustomItems = customToolbarItems.filter((item) => configuredGroups.has(item.group?.value || "center")).map((item) => item.name.value);
45223
+ allConfigItems = [.../* @__PURE__ */ new Set([...groupedItems, ...groupedCustomItems])];
45224
+ }
45165
45225
  const { defaultItems, overflowItems } = makeDefaultItems({
45166
45226
  superToolbar: this,
45167
45227
  toolbarIcons: this.config.icons,
@@ -45172,18 +45232,29 @@ var BuiltInToolbar = class extends require_eventemitter3.import_eventemitter3.de
45172
45232
  role: this.role,
45173
45233
  isDev: this.isDev,
45174
45234
  configuredItemNames,
45235
+ configuredItemOrder: allConfigItems,
45175
45236
  excludedItemNames,
45176
45237
  additionalItems: layoutCustomItems
45177
45238
  });
45178
- let allConfigItems = [...defaultItems.map((item) => item.name.value), ...overflowItems.map((item) => item.name.value)];
45179
- if (hasExplicitGroupComposition) {
45180
- const groupedItems = Object.values(this.config.groups).flatMap((item) => item);
45181
- const groupedCustomItems = customToolbarItems.filter((item) => configuredGroups.has(item.group?.value || "center")).map((item) => item.name.value);
45182
- allConfigItems = [.../* @__PURE__ */ new Set([...groupedItems, ...groupedCustomItems])];
45183
- }
45239
+ if (!hasExplicitGroupComposition) allConfigItems = [...defaultItems.map((item) => item.name.value), ...overflowItems.map((item) => item.name.value)];
45184
45240
  const configuredOverflowItems = overflowItems.filter((item) => allConfigItems.includes(item.name.value) && !excludedItemNames.has(item.name.value));
45185
45241
  const visibleItemNames = configuredOverflowItems.length ? [...allConfigItems, "overflow"] : allConfigItems;
45186
45242
  const filteredItems = defaultItems.filter((item) => visibleItemNames.includes(item.name.value)).filter((item) => !excludedItemNames.has(item.name.value));
45243
+ if (hasExplicitGroupComposition) {
45244
+ const orderIndex = new Map(allConfigItems.map((name, index) => [name, index]));
45245
+ const rank = (item) => orderIndex.get(item.name.value) ?? Number.MAX_SAFE_INTEGER;
45246
+ const overflowTrigger = filteredItems.find((item) => item.name.value === "overflow");
45247
+ const originalIndex = new Map(filteredItems.map((item, index) => [item, index]));
45248
+ const reordered = filteredItems.filter((item) => item !== overflowTrigger);
45249
+ reordered.sort((a, b) => rank(a) - rank(b));
45250
+ if (overflowTrigger) {
45251
+ const triggerOriginalIndex = originalIndex.get(overflowTrigger);
45252
+ const insertAt = reordered.findIndex((item) => originalIndex.get(item) > triggerOriginalIndex);
45253
+ insertAt === -1 ? reordered.push(overflowTrigger) : reordered.splice(insertAt, 0, overflowTrigger);
45254
+ }
45255
+ filteredItems.splice(0, filteredItems.length, ...reordered);
45256
+ configuredOverflowItems.sort((a, b) => rank(a) - rank(b));
45257
+ }
45187
45258
  if (hasExplicitGroupComposition) {
45188
45259
  for (const [group, names] of Object.entries(this.config.groups)) for (const item of filteredItems) if (names.includes(item.name.value)) item.group.value = group;
45189
45260
  }
@@ -46283,7 +46354,7 @@ var SuperDoc = class extends require_eventemitter3.import_eventemitter3.default
46283
46354
  this.config.colors = shuffleArray(this.config.colors);
46284
46355
  this.userColorMap = /* @__PURE__ */ new Map();
46285
46356
  this.colorIndex = 0;
46286
- this.version = "2.20.0";
46357
+ this.version = "2.20.1-next.10";
46287
46358
  this.#log("🦋 [superdoc] Using SuperDoc version:", this.version);
46288
46359
  this.superdocId = config.superdocId || require_uuid.v4();
46289
46360
  this.colors = this.config.colors ?? [];