superdoc 2.29.0-next.3 → 2.29.0

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 (175) hide show
  1. package/dist/chunks/{FindReplaceSurface-BKVHzhQ4.es.js → FindReplaceSurface-B_5ggdWg.es.js} +1 -1
  2. package/dist/chunks/{FindReplaceSurface-BNDrJ6VS.cjs → FindReplaceSurface-fVHxPXtn.cjs} +1 -1
  3. package/dist/chunks/{PasswordPromptSurface-6mF6Azda.es.js → PasswordPromptSurface-CZqhDQQ1.es.js} +1 -1
  4. package/dist/chunks/{PasswordPromptSurface-BNkaztaP.cjs → PasswordPromptSurface-x8GNmMJT.cjs} +1 -1
  5. package/dist/chunks/{PdfViewer-D4lVeOJu.es.js → PdfViewer-CW09MNrB.es.js} +70 -105
  6. package/dist/chunks/{PdfViewer-boENOZdF.cjs → PdfViewer-CkrAHpC-.cjs} +74 -109
  7. package/dist/chunks/{_plugin-vue_export-helper-6MBoygIY.cjs → _plugin-vue_export-helper-BkbCxNeT.cjs} +31 -7
  8. package/dist/chunks/{_plugin-vue_export-helper-CsJQtMvr.es.js → _plugin-vue_export-helper-DRPRMkeA.es.js} +20 -8
  9. package/dist/chunks/{constants-DpXuDx_g.cjs → constants-BeeNZoQp.cjs} +1 -1
  10. package/dist/chunks/{constants-B6VBlmKp.es.js → constants-BvNs_ybI.es.js} +1 -1
  11. package/dist/chunks/{create-super-doc-ui-BFt8agAI.es.js → create-super-doc-ui-Dc8dQAMc.es.js} +89 -137
  12. package/dist/chunks/{create-super-doc-ui-BAGOnYGM.cjs → create-super-doc-ui-L60GhVAX.cjs} +211 -259
  13. package/dist/collaboration-upgrade-engine.cjs +1 -1
  14. package/dist/collaboration-upgrade-engine.es.js +1 -1
  15. package/dist/document-api/src/capabilities/html-markdown-support.d.ts +4 -6
  16. package/dist/document-api/src/comments/comments.d.ts +2 -0
  17. package/dist/document-api/src/contract/command-catalog.d.ts +1 -1
  18. package/dist/document-api/src/contract/operation-definitions.d.ts +2 -2
  19. package/dist/document-api/src/contract/operation-registry.d.ts +10 -9
  20. package/dist/document-api/src/index.d.ts +8 -7
  21. package/dist/document-api/src/insert/insert.d.ts +2 -2
  22. package/dist/document-api/src/replace/replace.d.ts +3 -2
  23. package/dist/document-api/src/types/address.d.ts +3 -0
  24. package/dist/document-api/src/types/temporary-mutation.d.ts +5 -1
  25. package/dist/document-api/src/write/write.d.ts +12 -6
  26. package/dist/public/ui-react.cjs +1 -1
  27. package/dist/public/ui-react.es.js +1 -1
  28. package/dist/public/ui-vue.cjs +1 -1
  29. package/dist/public/ui-vue.es.js +1 -1
  30. package/dist/public/ui.cjs +1 -1
  31. package/dist/public/ui.es.js +1 -1
  32. package/dist/style.css +1 -1
  33. package/dist/style.layered.css +1 -1
  34. package/dist/superdoc/src/SuperDoc.vue.d.ts +132 -58
  35. package/dist/superdoc/src/components/CommentsLayer/CommentDialog.vue.d.ts +28 -13
  36. package/dist/superdoc/src/components/CommentsLayer/collect-removed-comment-ids.d.ts +11 -1
  37. package/dist/superdoc/src/components/CommentsLayer/collect-tracked-change-thread.d.ts +19 -2
  38. package/dist/superdoc/src/components/CommentsLayer/comment-urls.d.ts +1 -1
  39. package/dist/superdoc/src/components/CommentsLayer/commentsList/super-comments-list.d.ts +23 -20
  40. package/dist/superdoc/src/components/CommentsLayer/floating-comment-positioning.d.ts +24 -23
  41. package/dist/superdoc/src/components/CommentsLayer/helpers.d.ts +1 -4
  42. package/dist/superdoc/src/components/CommentsLayer/tracked-change-threading.d.ts +16 -2
  43. package/dist/superdoc/src/components/CommentsLayer/use-comment.d.ts +28 -13
  44. package/dist/superdoc/src/components/PdfViewer/PdfViewer.vue.d.ts +132 -45
  45. package/dist/superdoc/src/components/PdfViewer/PdfViewerDocument.vue.d.ts +62 -16
  46. package/dist/superdoc/src/components/PdfViewer/PdfViewerPage.vue.d.ts +77 -17
  47. package/dist/superdoc/src/components/PdfViewer/pdf-viewer-types.d.ts +45 -0
  48. package/dist/superdoc/src/components/Whiteboard/WhiteboardLayer.vue.d.ts +80 -16
  49. package/dist/superdoc/src/components/Whiteboard/WhiteboardPage.vue.d.ts +48 -13
  50. package/dist/superdoc/src/components/Whiteboard/use-whiteboard.d.ts +30 -15
  51. package/dist/superdoc/src/components/Whiteboard/whiteboard-types.d.ts +13 -0
  52. package/dist/superdoc/src/components/surfaces/focusable-selector.d.ts +1 -5
  53. package/dist/superdoc/src/components/surfaces/watermark-surface-runtime.d.ts +7 -7
  54. package/dist/superdoc/src/composables/find-shortcut-owner.d.ts +16 -9
  55. package/dist/superdoc/src/composables/replace-continuation.d.ts +11 -15
  56. package/dist/superdoc/src/composables/use-comment-small-screen.d.ts +11 -7
  57. package/dist/superdoc/src/composables/use-compact-comment-popover.d.ts +44 -18
  58. package/dist/superdoc/src/composables/use-document.d.ts +1210 -30
  59. package/dist/superdoc/src/composables/use-field.d.ts +88 -25
  60. package/dist/superdoc/src/composables/use-find-replace.d.ts +13 -3
  61. package/dist/superdoc/src/composables/use-password-prompt.d.ts +23 -24
  62. package/dist/superdoc/src/composables/use-viewport-fit.d.ts +62 -26
  63. package/dist/superdoc/src/composables/useUiFontFamily.d.ts +3 -11
  64. package/dist/superdoc/src/core/SuperDoc.d.ts +4 -4
  65. package/dist/superdoc/src/core/collaboration/collaboration-comments.d.ts +9 -4
  66. package/dist/superdoc/src/core/collaboration/helpers.d.ts +20 -3
  67. package/dist/superdoc/src/core/collaboration/permissions.d.ts +15 -10
  68. package/dist/superdoc/src/core/collaboration/resolve-v2-collaboration-target.d.ts +4 -3
  69. package/dist/superdoc/src/core/collaboration/v2-awareness-bridge.d.ts +2 -1
  70. package/dist/superdoc/src/core/config/merge-comments-config.d.ts +1 -5
  71. package/dist/superdoc/src/core/config/merge-defined.d.ts +3 -8
  72. package/dist/superdoc/src/core/config/normalize-hyperlinks-config.d.ts +7 -12
  73. package/dist/superdoc/src/core/config/normalize-surfaces-config.d.ts +9 -12
  74. package/dist/superdoc/src/core/config/normalize-ui-config.d.ts +1 -12
  75. package/dist/superdoc/src/core/create-app.d.ts +13 -24
  76. package/dist/superdoc/src/core/editor-runtime/conformance/fake-v2-runtime.d.ts +2 -1
  77. package/dist/superdoc/src/core/editor-runtime/editor-runtime-registry.d.ts +2 -1
  78. package/dist/superdoc/src/core/editor-runtime/index.d.ts +1 -1
  79. package/dist/superdoc/src/core/editor-runtime/types.d.ts +2 -1
  80. package/dist/superdoc/src/core/editor-runtime/v2/v2-session-shortcut-routes.d.ts +1 -1
  81. package/dist/superdoc/src/core/helpers/export.d.ts +3 -2
  82. package/dist/superdoc/src/core/helpers/file.d.ts +8 -45
  83. package/dist/superdoc/src/core/helpers/normalize-track-changes-config.d.ts +6 -60
  84. package/dist/superdoc/src/core/pdf/helpers/constants.d.ts +2 -2
  85. package/dist/superdoc/src/core/pdf/helpers/floor.d.ts +1 -1
  86. package/dist/superdoc/src/core/pdf/helpers/range.d.ts +1 -1
  87. package/dist/superdoc/src/core/pdf/helpers/read-file.d.ts +1 -1
  88. package/dist/superdoc/src/core/pdf/pdf-adapter.d.ts +28 -61
  89. package/dist/superdoc/src/core/superdoc-ui-owner.d.ts +1 -1
  90. package/dist/superdoc/src/core/surface-manager.d.ts +21 -83
  91. package/dist/superdoc/src/core/types/index.d.ts +41 -23
  92. package/dist/superdoc/src/core/v2-integration/browser-peer-runtime.d.ts +5 -3
  93. package/dist/superdoc/src/core/v2-integration/cdn-engine-loader.d.ts +3 -13
  94. package/dist/superdoc/src/core/v2-integration/internal-vue-runtime.d.ts +64 -59
  95. package/dist/superdoc/src/core/v2-integration/v2-integration.d.ts +10 -10
  96. package/dist/superdoc/src/core/whiteboard/Whiteboard.d.ts +22 -208
  97. package/dist/superdoc/src/core/whiteboard/WhiteboardPage.d.ts +163 -189
  98. package/dist/superdoc/src/core/whiteboard/helpers/createTextarea.d.ts +14 -1
  99. package/dist/superdoc/src/core/whiteboard/helpers/flattenPoints.d.ts +1 -1
  100. package/dist/superdoc/src/core/whiteboard/helpers/getRandomId.d.ts +1 -1
  101. package/dist/superdoc/src/helpers/comment-focus.d.ts +21 -4
  102. package/dist/superdoc/src/helpers/deprecation.d.ts +5 -11
  103. package/dist/superdoc/src/helpers/interaction-trace.d.ts +7 -24
  104. package/dist/superdoc/src/helpers/mark-raw-component.d.ts +1 -0
  105. package/dist/superdoc/src/helpers/object-guards.d.ts +2 -5
  106. package/dist/superdoc/src/helpers/selection-source.d.ts +1 -1
  107. package/dist/superdoc/src/helpers/use-selection.d.ts +35 -15
  108. package/dist/superdoc/src/helpers/v2-author-required-rejection.d.ts +8 -11
  109. package/dist/superdoc/src/helpers/v2-bulk-decision-event.d.ts +9 -7
  110. package/dist/superdoc/src/helpers/v2-keyboard-edit-rejection.d.ts +8 -7
  111. package/dist/superdoc/src/helpers/v2-mutation-exception.d.ts +12 -8
  112. package/dist/superdoc/src/helpers/v2-review-target.d.ts +11 -1
  113. package/dist/superdoc/src/helpers/v2-selection-sync.d.ts +40 -14
  114. package/dist/superdoc/src/helpers/v2-typing-mutation-event.d.ts +14 -5
  115. package/dist/superdoc/src/icons.d.ts +11 -19
  116. package/dist/superdoc/src/internal/diagnostics/diagnostic-dedupe.d.ts +6 -15
  117. package/dist/superdoc/src/internal/diagnostics/translate-diagnostic.d.ts +6 -4
  118. package/dist/superdoc/src/internal/toolbar/built-in/AIWriter.vue.d.ts +2 -2
  119. package/dist/superdoc/src/internal/toolbar/built-in/ButtonGroup.vue.d.ts +4 -24
  120. package/dist/superdoc/src/internal/toolbar/built-in/FontFamilyCombobox.vue.d.ts +34 -0
  121. package/dist/superdoc/src/internal/toolbar/built-in/FontSizeCombobox.vue.d.ts +34 -0
  122. package/dist/superdoc/src/internal/toolbar/built-in/LinkInput.vue.d.ts +1 -1
  123. package/dist/superdoc/src/internal/toolbar/built-in/PageNumberMenu.vue.d.ts +25 -15
  124. package/dist/superdoc/src/internal/toolbar/built-in/Toolbar.vue.d.ts +9 -3
  125. package/dist/superdoc/src/internal/toolbar/built-in/ToolbarComboBox.vue.d.ts +12 -14
  126. package/dist/superdoc/src/internal/toolbar/built-in/ToolbarDropdown.vue.d.ts +1 -11
  127. package/dist/superdoc/src/internal/toolbar/built-in/color-dropdown-helpers.d.ts +9 -19
  128. package/dist/superdoc/src/internal/toolbar/built-in/constants.d.ts +14 -45
  129. package/dist/superdoc/src/internal/toolbar/built-in/default-items.d.ts +34 -17
  130. package/dist/superdoc/src/internal/toolbar/built-in/font-options.d.ts +15 -1
  131. package/dist/superdoc/src/internal/toolbar/built-in/font-typeahead.d.ts +37 -7
  132. package/dist/superdoc/src/internal/toolbar/built-in/format-negation.d.ts +10 -4
  133. package/dist/superdoc/src/internal/toolbar/built-in/general.d.ts +12 -1
  134. package/dist/superdoc/src/internal/toolbar/built-in/helpers.d.ts +9 -4
  135. package/dist/superdoc/src/internal/toolbar/built-in/list-style-buttons.d.ts +2 -2
  136. package/dist/superdoc/src/internal/toolbar/built-in/page-number-feedback.d.ts +4 -5
  137. package/dist/superdoc/src/internal/toolbar/built-in/scroll-helpers.d.ts +3 -4
  138. package/dist/superdoc/src/internal/toolbar/built-in/toolbar-focus-helpers.d.ts +10 -2
  139. package/dist/superdoc/src/internal/toolbar/built-in/toolbarIcons.d.ts +78 -145
  140. package/dist/superdoc/src/internal/toolbar/built-in/toolbarTexts.d.ts +61 -61
  141. package/dist/superdoc/src/internal/toolbar/built-in/url-safety.d.ts +11 -3
  142. package/dist/superdoc/src/internal/toolbar/built-in/use-toolbar-item.d.ts +110 -48
  143. package/dist/superdoc/src/internal/toolbar/built-in-toolbar.d.ts +11 -30
  144. package/dist/superdoc/src/internal/toolbar/compatibility-catalog.d.ts +4 -3
  145. package/dist/superdoc/src/internal/toolbar/image-upload.d.ts +29 -39
  146. package/dist/superdoc/src/internal/toolbar/toolbar-item-aliases.d.ts +1 -1
  147. package/dist/superdoc/src/public/browser-document-api.d.ts +5 -4
  148. package/dist/superdoc/src/public/index.d.cts +26 -0
  149. package/dist/superdoc/src/public/index.d.ts +13 -0
  150. package/dist/superdoc/src/public/ui/commands.d.ts +14 -13
  151. package/dist/superdoc/src/public/ui/create-super-doc-ui.d.ts +1 -1
  152. package/dist/superdoc/src/public/ui/entity-at.d.ts +2 -1
  153. package/dist/superdoc/src/public/ui/format-painter-helpers.d.ts +2 -8
  154. package/dist/superdoc/src/public/ui/style-match-patch.d.ts +2 -2
  155. package/dist/superdoc/src/public/ui/types.d.ts +1 -1
  156. package/dist/superdoc/src/stores/comments-store.d.ts +231 -105
  157. package/dist/superdoc/src/stores/helpers/comment-document-scope.d.ts +22 -0
  158. package/dist/superdoc/src/stores/helpers/comment-grouping.d.ts +30 -0
  159. package/dist/superdoc/src/stores/helpers/comment-identity.d.ts +40 -0
  160. package/dist/superdoc/src/stores/helpers/floating-comment-instances.d.ts +48 -13
  161. package/dist/superdoc/src/stores/helpers/pending-selection-snapshot.d.ts +17 -0
  162. package/dist/superdoc/src/stores/helpers/tracked-change-compaction.d.ts +16 -0
  163. package/dist/superdoc/src/stores/helpers/tracked-change-decision.d.ts +45 -0
  164. package/dist/superdoc/src/stores/helpers/tracked-change-identity.d.ts +19 -0
  165. package/dist/superdoc/src/stores/helpers/tracked-change-row-values.d.ts +0 -4
  166. package/dist/superdoc/src/stores/helpers/tracked-change-thread-index.d.ts +21 -24
  167. package/dist/superdoc/src/stores/superdoc-store.d.ts +694 -316
  168. package/dist/superdoc.cjs +1804 -2782
  169. package/dist/superdoc.es.js +1720 -2699
  170. package/dist-cdn/style.layered.css +1 -1
  171. package/dist-cdn/superdoc.min.css +1 -1
  172. package/dist-cdn/superdoc.min.js +42 -42
  173. package/package.json +3 -2
  174. package/dist/superdoc/src/internal/toolbar/index.d.ts +0 -10
  175. package/dist/superdoc/src/main.d.ts +0 -1
@@ -1,4 +1,4 @@
1
- import { B as renderList, D as normalizeClass, E as nextTick, F as openBlock, G as toDisplayString, N as onMounted, W as shallowRef, Y as unref, a as computed, at as withModifiers, c as createCommentVNode, f as createTextVNode, h as defineComponent, j as onBeforeUnmount, l as createElementBlock, n as Fragment, t as _plugin_vue_export_helper_default, tt as watch, u as createElementVNode, z as ref } from "./_plugin-vue_export-helper-CsJQtMvr.es.js";
1
+ import { B as renderList, D as normalizeClass, E as nextTick, F as openBlock, G as toDisplayString, N as onMounted, W as shallowRef, Y as unref, a as computed, at as withModifiers, c as createCommentVNode, f as createTextVNode, h as defineComponent, j as onBeforeUnmount, l as createElementBlock, n as Fragment, ot as isPlainObject, t as _plugin_vue_export_helper_default, tt as watch, u as createElementVNode, z as ref } from "./_plugin-vue_export-helper-DRPRMkeA.es.js";
2
2
  import { t as isFiniteNumber } from "./is-finite-number-BpL4F38c.es.js";
3
3
  //#region src/internal/diagnostics/workflow-recording.ts
4
4
  var fields$1 = /* @__PURE__ */ new Set([
@@ -1088,16 +1088,7 @@ function isSyntheticTrackedChangeCommentLaneItem(item) {
1088
1088
  return typeof itemId === "string" && itemId.startsWith(TRACKED_CHANGE_COMMENT_LANE_ID_PREFIX);
1089
1089
  }
1090
1090
  //#endregion
1091
- //#region src/helpers/object-guards.js
1092
- /**
1093
- * @param {unknown} value
1094
- * @returns {value is Record<string, unknown>}
1095
- */
1096
- function isPlainObject(value) {
1097
- return typeof value === "object" && value !== null && !Array.isArray(value);
1098
- }
1099
- //#endregion
1100
- //#region src/core/collaboration/permissions.js
1091
+ //#region src/core/collaboration/permissions.ts
1101
1092
  var PERMISSIONS = Object.freeze({
1102
1093
  RESOLVE_OWN: "RESOLVE_OWN",
1103
1094
  RESOLVE_OTHER: "RESOLVE_OTHER",
@@ -1160,15 +1151,16 @@ var PERMISSION_MATRIX = Object.freeze({
1160
1151
  var pickResolver = (context = {}) => {
1161
1152
  if (typeof context.permissionResolver === "function") return context.permissionResolver;
1162
1153
  if (typeof context.superdoc?.config?.permissionResolver === "function") return context.superdoc.config.permissionResolver;
1163
- const deprecatedResolver = context.superdoc?.config?.modules?.comments?.permissionResolver;
1154
+ const comments = context.superdoc?.config?.modules?.comments;
1155
+ const deprecatedResolver = comments ? comments.permissionResolver : void 0;
1164
1156
  if (typeof deprecatedResolver === "function") return deprecatedResolver;
1165
1157
  return null;
1166
1158
  };
1167
1159
  var BUILT_IN_PERMISSION_METHOD = Symbol.for("superdoc.internal.permission-method.builtin");
1168
1160
  var BUILT_IN_PERMISSION_RESOLVER = Symbol.for("superdoc.internal.permission-resolver.builtin");
1169
- /** Create the shell's internal, live tracked-change permission shim. */
1161
+ var hasBuiltInPermissionMethodBrand = (method) => (typeof method === "object" && method !== null || typeof method === "function") && Reflect.get(method, BUILT_IN_PERMISSION_METHOD) === true;
1170
1162
  var createTrackedChangePermissionResolver = (superdoc) => {
1171
- const isBuiltInPolicy = () => superdoc.canPerformPermission?.[BUILT_IN_PERMISSION_METHOD] === true && pickResolver({ superdoc }) === null;
1163
+ const isBuiltInPolicy = () => hasBuiltInPermissionMethodBrand(superdoc.canPerformPermission) && pickResolver({ superdoc }) === null;
1172
1164
  const resolver = (payload = {}) => isBuiltInPolicy() ? defaultDecisionFor(payload.permission, superdoc.config.role, superdoc.config.isInternal) : superdoc.canPerformPermission({
1173
1165
  ...payload,
1174
1166
  role: superdoc.config.role,
@@ -1178,6 +1170,7 @@ var createTrackedChangePermissionResolver = (superdoc) => {
1178
1170
  return resolver;
1179
1171
  };
1180
1172
  var defaultDecisionFor = (permission, role, isInternal) => {
1173
+ if (permission === void 0 || typeof role !== "string") return false;
1181
1174
  const internalExternal = isInternal ? "internal" : "external";
1182
1175
  return PERMISSION_MATRIX[permission]?.[internalExternal]?.includes(role) ?? false;
1183
1176
  };
@@ -1222,21 +1215,6 @@ var readBuiltInTrackedChangePermissionDecision = (superdoc, canPerform, permissi
1222
1215
  return null;
1223
1216
  }
1224
1217
  };
1225
- /**
1226
- * Resolve a client-side permission through the built-in matrix and optional
1227
- * resolver.
1228
- *
1229
- * @param {string} permission The permission to check
1230
- * @param {string | undefined} role The role to check
1231
- * @param {boolean | undefined} isInternal The internal/external flag
1232
- * @param {object} [context] Context passed to the permission resolver
1233
- * @param {object | null} [context.comment] The comment/tracked change being evaluated
1234
- * @param {object | null} [context.superdoc] The SuperDoc instance
1235
- * @param {object | null} [context.currentUser] The active user object performing the action
1236
- * @param {Function} [context.permissionResolver] Explicit resolver override
1237
- * @param {object | null} [context.trackedChange] Tracked change metadata (for tracked-change permissions)
1238
- * @returns {boolean} Whether the permission is allowed
1239
- */
1240
1218
  var isAllowed = (permission, role, isInternal, context = {}) => {
1241
1219
  const defaultDecision = defaultDecisionFor(permission, role, isInternal);
1242
1220
  const resolver = pickResolver(context);
@@ -1321,7 +1299,7 @@ function shallowEqual(a, b) {
1321
1299
  return true;
1322
1300
  }
1323
1301
  //#endregion
1324
- //#region src/internal/toolbar/image-upload.js
1302
+ //#region src/internal/toolbar/image-upload.ts
1325
1303
  /**
1326
1304
  * Interactive image acquisition for the built-in toolbar (SD-3567).
1327
1305
  *
@@ -1342,8 +1320,6 @@ var SUPPORTED_IMAGE_EXTENSIONS = /\.(png|jpe?g)$/i;
1342
1320
  /**
1343
1321
  * Whether a picked/dropped file is an insertable image (PNG/JPEG). Falls back
1344
1322
  * to the file extension when the browser reports no MIME type.
1345
- * @param {File | null | undefined} file
1346
- * @returns {boolean}
1347
1323
  */
1348
1324
  function isSupportedImageFile(file) {
1349
1325
  if (!file) return false;
@@ -1358,8 +1334,6 @@ function isSupportedImageFile(file) {
1358
1334
  * accepts those by extension, but `readAsDataURL` would then produce an
1359
1335
  * `application/octet-stream` data URI that `create.image` rejects. Rewrite
1360
1336
  * the media type from the filename so extension-accepted files still insert.
1361
- * @param {Blob & { name?: string }} file
1362
- * @returns {Promise<string>}
1363
1337
  */
1364
1338
  function fileToDataUri(file) {
1365
1339
  return new Promise((resolve, reject) => {
@@ -1372,9 +1346,6 @@ function fileToDataUri(file) {
1372
1346
  /**
1373
1347
  * Ensure a data URI read from a supported file carries a PNG/JPEG media type.
1374
1348
  * Leaves URIs already typed as a supported image (or uninferable ones) alone.
1375
- * @param {string} dataUri
1376
- * @param {(Blob & { name?: string }) | null | undefined} file
1377
- * @returns {string}
1378
1349
  */
1379
1350
  function normalizeImageDataUri(dataUri, file) {
1380
1351
  const match = /^data:([^;,]*);base64,/.exec(dataUri);
@@ -1391,9 +1362,6 @@ function normalizeImageDataUri(dataUri, file) {
1391
1362
  * `handleImageUpload` callback when configured (V1 contract:
1392
1363
  * `(file: File) => Promise<string>`). A returned non-data URL is fetched and
1393
1364
  * embedded, because `create.image` requires an embedded base64 data URI.
1394
- * @param {File} file
1395
- * @param {((file: File) => Promise<string>) | null | undefined} handleImageUpload
1396
- * @returns {Promise<string>}
1397
1365
  */
1398
1366
  async function resolveImageSrc(file, handleImageUpload) {
1399
1367
  if (typeof handleImageUpload === "function") {
@@ -1409,9 +1377,6 @@ async function resolveImageSrc(file, handleImageUpload) {
1409
1377
  * presigned URLs often respond `application/octet-stream`, so keep a filename
1410
1378
  * hint (URL path, falling back to the originally picked file) for the media
1411
1379
  * type normalization in `fileToDataUri`.
1412
- * @param {string} url
1413
- * @param {File | null | undefined} pickedFile
1414
- * @returns {Promise<string>}
1415
1380
  */
1416
1381
  async function embedRemoteImage(url, pickedFile) {
1417
1382
  const response = await fetch(url);
@@ -1425,13 +1390,6 @@ async function embedRemoteImage(url, pickedFile) {
1425
1390
  * stays attached (hidden) so automation and tests can drive it; `destroy()`
1426
1391
  * removes it. Picking a file calls `onPick(file)`; an unsupported type or a
1427
1392
  * failed pick routes through `onError(error)`.
1428
- *
1429
- * @param {{
1430
- * ownerDocument?: Document,
1431
- * onPick?: (file: File) => unknown,
1432
- * onError?: (error: Error) => void,
1433
- * }} options
1434
- * @returns {{ input: HTMLInputElement, open: () => void, destroy: () => void }}
1435
1393
  */
1436
1394
  function createImageFilePicker({ ownerDocument = document, onPick, onError } = {}) {
1437
1395
  const input = ownerDocument.createElement("input");
@@ -2023,13 +1981,9 @@ var WatermarkSurface_default = /* @__PURE__ */ _plugin_vue_export_helper_default
2023
1981
  }
2024
1982
  }), [["__scopeId", "data-v-df56c82c"]]);
2025
1983
  //#endregion
2026
- //#region src/components/surfaces/watermark-surface-runtime.js
2027
- /**
2028
- * Keeps Vue rendering and post-dismissal announcements outside the public type graph.
2029
- * @param {(() => HTMLElement | null) | undefined} getContainer
2030
- */
1984
+ //#region src/components/surfaces/watermark-surface-runtime.ts
1985
+ /** Keeps Vue rendering and post-dismissal announcements outside the public type graph. */
2031
1986
  function createWatermarkSurfaceRuntime(getContainer) {
2032
- /** @type {HTMLDivElement | null} */
2033
1987
  let status = null;
2034
1988
  let disposed = false;
2035
1989
  return {
@@ -2040,7 +1994,6 @@ function createWatermarkSurfaceRuntime(getContainer) {
2040
1994
  const item = opener?.closest("[data-sd-part=\"toolbar-item\"]") ?? opener?.querySelector("[data-sd-part=\"toolbar-item\"]");
2041
1995
  const container = (item?.closest("[data-sd-part=\"toolbar\"]"))?.parentElement;
2042
1996
  const isWatermarkEntry = item?.querySelector("[data-item=\"btn-watermark\"], [data-item=\"btn-overflow\"]");
2043
- /** @param {() => boolean} isCurrent */
2044
1997
  return async (isCurrent) => {
2045
1998
  await nextTick();
2046
1999
  if (disposed || !isCurrent() || !isWatermarkEntry || opener?.isConnected || !container?.isConnected) return;
@@ -2072,7 +2025,6 @@ function createWatermarkSurfaceRuntime(getContainer) {
2072
2025
  });
2073
2026
  container.appendChild(status);
2074
2027
  },
2075
- /** @param {string} message */
2076
2028
  announce(message) {
2077
2029
  if (!disposed && status) status.textContent = message;
2078
2030
  },
@@ -2688,34 +2640,33 @@ function fontsValue(value) {
2688
2640
  return Object.keys(result).length > 0 ? result : null;
2689
2641
  }
2690
2642
  //#endregion
2691
- //#region src/public/ui/format-painter-helpers.js
2643
+ //#region src/public/ui/format-painter-helpers.ts
2692
2644
  /**
2693
2645
  * Maps SDRunProps field names to InlineRunPatch field names.
2694
2646
  * SDRunProps (read-side) and InlineRunPatch (write-side) use different keys
2695
2647
  * for the same properties; direct assignment between them is forbidden.
2696
- *
2697
- * @param {Record<string, unknown>} props - SDRunProps object from doc.getNodeById
2698
- * @returns {Record<string, unknown>} InlineRunPatch ready for doc.format.apply
2699
2648
  */
2700
2649
  function sdRunPropsToInlineRunPatch(props) {
2701
2650
  if (!props || typeof props !== "object") return {};
2702
2651
  const patch = {};
2703
- if (props.fonts) patch.rFonts = {
2704
- ascii: props.fonts.ascii,
2705
- hAnsi: props.fonts.hAnsi,
2706
- eastAsia: props.fonts.eastAsia,
2707
- cs: props.fonts.cs,
2708
- asciiTheme: props.fonts.asciiTheme,
2709
- hAnsiTheme: props.fonts.hAnsiTheme,
2710
- eastAsiaTheme: props.fonts.eastAsiaTheme,
2711
- csTheme: props.fonts.csTheme,
2712
- hint: props.fonts.hint
2652
+ const fonts = props.fonts;
2653
+ if (isPlainObject(fonts)) patch.rFonts = {
2654
+ ascii: fonts.ascii,
2655
+ hAnsi: fonts.hAnsi,
2656
+ eastAsia: fonts.eastAsia,
2657
+ cs: fonts.cs,
2658
+ asciiTheme: fonts.asciiTheme,
2659
+ hAnsiTheme: fonts.hAnsiTheme,
2660
+ eastAsiaTheme: fonts.eastAsiaTheme,
2661
+ csTheme: fonts.csTheme,
2662
+ hint: fonts.hint
2713
2663
  };
2714
2664
  if (props.fontFamily != null) patch.fontFamily = props.fontFamily;
2715
- if (props.lang) patch.lang = {
2716
- val: props.lang.val,
2717
- eastAsia: props.lang.eastAsia,
2718
- bidi: props.lang.bidi
2665
+ const lang = props.lang;
2666
+ if (isPlainObject(lang)) patch.lang = {
2667
+ val: lang.val,
2668
+ eastAsia: lang.eastAsia,
2669
+ bidi: lang.bidi
2719
2670
  };
2720
2671
  if (props.fontSize != null) patch.fontSize = props.fontSize;
2721
2672
  if (props.fontSizeCs != null) patch.fontSizeCs = props.fontSizeCs;
@@ -2756,19 +2707,24 @@ function sdRunPropsToInlineRunPatch(props) {
2756
2707
  function projectColorRefToInlineColor(color) {
2757
2708
  if (!color) return void 0;
2758
2709
  if (typeof color === "string") return color;
2710
+ if (!isPlainObject(color)) return void 0;
2759
2711
  if (color.model === "rgb") return color.value;
2760
2712
  if (color.model === "auto") return "auto";
2761
2713
  }
2762
2714
  function projectUnderlineToInlinePatch(underline) {
2763
2715
  if (underline == null) return void 0;
2716
+ if (!isPlainObject(underline)) return true;
2764
2717
  const patch = {};
2765
2718
  if (underline.style != null) patch.style = underline.style;
2766
- if (underline.color?.model === "rgb") patch.color = underline.color.value;
2767
- if (underline.color?.model === "theme") patch.themeColor = underline.color.theme;
2719
+ const color = underline.color;
2720
+ if (isPlainObject(color)) {
2721
+ if (color.model === "rgb") patch.color = color.value;
2722
+ else if (color.model === "theme") patch.themeColor = color.theme;
2723
+ }
2768
2724
  return Object.keys(patch).length > 0 ? patch : true;
2769
2725
  }
2770
2726
  function projectShadingToInlinePatch(shading) {
2771
- if (!shading) return void 0;
2727
+ if (!isPlainObject(shading)) return void 0;
2772
2728
  const patch = {};
2773
2729
  const fill = projectColorRefToInlineColor(shading.fill);
2774
2730
  if (fill != null) patch.fill = fill;
@@ -2778,7 +2734,7 @@ function projectShadingToInlinePatch(shading) {
2778
2734
  return Object.keys(patch).length > 0 ? patch : void 0;
2779
2735
  }
2780
2736
  function projectBorderToInlinePatch(border) {
2781
- if (!border) return void 0;
2737
+ if (!isPlainObject(border)) return void 0;
2782
2738
  const patch = {};
2783
2739
  if (border.style != null) patch.val = border.style;
2784
2740
  if (border.width != null) patch.sz = border.width;
@@ -2793,9 +2749,6 @@ function projectBorderToInlinePatch(border) {
2793
2749
  *
2794
2750
  * Falls back to the plain text target when the host has not populated an
2795
2751
  * explicit `selectionTarget` yet.
2796
- *
2797
- * @param {{ selectionTarget?: unknown; target?: unknown } | null | undefined} selection
2798
- * @returns {string}
2799
2752
  */
2800
2753
  function selectionKey(selection) {
2801
2754
  const target = selection?.selectionTarget ?? selection?.target;
@@ -2904,7 +2857,7 @@ function readAllResolvedFact(event, receipt) {
2904
2857
  return fact;
2905
2858
  }
2906
2859
  //#endregion
2907
- //#region src/helpers/v2-typing-mutation-event.js
2860
+ //#region src/helpers/v2-typing-mutation-event.ts
2908
2861
  /**
2909
2862
  * Command kinds whose committed mutations belong to the sustained typing
2910
2863
  * cadence class (insert / replace / plain paste / Backspace / Delete).
@@ -2945,9 +2898,6 @@ var V2_TYPING_COMMAND_KINDS = /* @__PURE__ */ new Set([
2945
2898
  * Events without a forwarded `editableCommandKind` (programmatic Document API
2946
2899
  * mutations, history commits, unclassified structural commands) return false
2947
2900
  * so they keep hydrating immediately.
2948
- *
2949
- * @param {{ type?: string, origin?: string, editableCommandKind?: string } | null | undefined} event
2950
- * @returns {boolean}
2951
2901
  */
2952
2902
  var isV2EditableTextMutationEvent = (event) => {
2953
2903
  if (event?.type !== "mutation:committed" || event.origin !== "command") return false;
@@ -7561,6 +7511,23 @@ function createSuperDocUI(options) {
7561
7511
  const clearAsyncReadKeys = (predicate) => {
7562
7512
  for (const key of asyncReads.keys()) if (predicate(key)) asyncReads.delete(key);
7563
7513
  };
7514
+ const seedAsyncRead = (key, token, value, inflightToken = null) => {
7515
+ asyncReads.set(key, {
7516
+ token,
7517
+ value,
7518
+ hasSettled: true,
7519
+ inflightToken
7520
+ });
7521
+ };
7522
+ const selectionValidationSnapshot = () => ({
7523
+ held: typedCaretValidationHeld,
7524
+ pendingToken: pendingSelectionSeedValidationToken
7525
+ });
7526
+ const setSelectionValidation = (next) => {
7527
+ typedCaretValidationHeld = next.held;
7528
+ pendingSelectionSeedValidationToken = next.pendingToken;
7529
+ };
7530
+ const typingIsRecent = () => Date.now() - lastTypingMutationAtMs < HEAVY_READ_IDLE_MS;
7564
7531
  const selectionScopedAsyncReadKeys = (selection) => {
7565
7532
  const signature = selectionSignature(selection);
7566
7533
  const effectiveUniformityKey = effectiveInlineUniformityCacheKey(selection);
@@ -7828,16 +7795,13 @@ function createSuperDocUI(options) {
7828
7795
  const foreground = foregroundMutationState();
7829
7796
  if (isNonCollapsedHostSelection(hostSelectionSnapshot) && readHostSelectionSnapshot() === hostSelectionSnapshot) {
7830
7797
  const seed = normalizeSelectionInfo(safeCall(() => hostMethod(host, "readLiveSelectionSyncSnapshot")?.(), null));
7831
- if (seed && !seed.selectionTarget && captureWholeTableParagraphSeed(host, seed, hostSelectionSnapshot)) asyncReads.set("selection", {
7832
- token: asyncReads.get("selection")?.token ?? null,
7833
- value: seed,
7834
- hasSettled: true,
7835
- inflightToken: null
7836
- });
7798
+ if (seed && !seed.selectionTarget && captureWholeTableParagraphSeed(host, seed, hostSelectionSnapshot)) seedAsyncRead("selection", asyncReads.get("selection")?.token ?? null, seed);
7837
7799
  }
7838
7800
  if (isNonCollapsedHostSelection(hostSelectionSnapshot) && !(foreground && foreground.active > 0)) {
7839
- typedCaretValidationHeld = false;
7840
- pendingSelectionSeedValidationToken = null;
7801
+ setSelectionValidation({
7802
+ held: false,
7803
+ pendingToken: null
7804
+ });
7841
7805
  issueAsyncRead("selection", selectionReadToken(), selectionCurrentRun, normalizeSelectionInfo);
7842
7806
  return;
7843
7807
  }
@@ -7846,17 +7810,14 @@ function createSuperDocUI(options) {
7846
7810
  const seed = normalizeSelectionInfo(safeCall(() => read.call(host), null));
7847
7811
  if (!seed) return;
7848
7812
  if (wholeTableSelectionChanged) {
7849
- typedCaretValidationHeld = false;
7850
- pendingSelectionSeedValidationToken = null;
7813
+ setSelectionValidation({
7814
+ held: false,
7815
+ pendingToken: null
7816
+ });
7851
7817
  wholeTableParagraphSeed = null;
7852
7818
  captureWholeTableParagraphSeed(host, seed, initialTableSelection);
7853
7819
  const token = selectionReadToken();
7854
- asyncReads.set("selection", {
7855
- token,
7856
- value: seed,
7857
- hasSettled: true,
7858
- inflightToken: null
7859
- });
7820
+ seedAsyncRead("selection", token, seed);
7860
7821
  issueAsyncRead("selection", token, selectionCurrentRun, normalizeSelectionInfo);
7861
7822
  return;
7862
7823
  }
@@ -7866,14 +7827,25 @@ function createSuperDocUI(options) {
7866
7827
  const previousRange = previousCaret?.range;
7867
7828
  const nextRange = nextCaret?.range;
7868
7829
  const sameSeedCaret = Boolean(previousCaret && nextCaret && previousCaret.blockId === nextCaret.blockId && storyLocatorSignature(previousCaret.story) === storyLocatorSignature(nextCaret.story) && previousRange?.start === nextRange?.start);
7869
- typedCaretValidationHeld = Boolean(foreground && foreground.active > 0) || typedCaretValidationHeld && (afterTypingPaint || sameSeedCaret);
7830
+ const validation = selectionValidationSnapshot();
7831
+ const held = Boolean(foreground && foreground.active > 0) || validation.held && (afterTypingPaint || sameSeedCaret);
7832
+ setSelectionValidation({
7833
+ held,
7834
+ pendingToken: validation.pendingToken
7835
+ });
7870
7836
  const token = selectionReadToken();
7871
- const deferAuthoritativeRead = Boolean(foreground && (foreground.active > 0 || foreground.pending > 0)) || typedCaretValidationHeld && Date.now() - lastTypingMutationAtMs < HEAVY_READ_IDLE_MS;
7837
+ const deferAuthoritativeRead = Boolean(foreground && (foreground.active > 0 || foreground.pending > 0)) || held && typingIsRecent();
7872
7838
  if (!deferAuthoritativeRead) {
7873
- pendingSelectionSeedValidationToken = null;
7839
+ setSelectionValidation({
7840
+ held,
7841
+ pendingToken: null
7842
+ });
7874
7843
  if (issueAsyncRead("selection", token, selectionCurrentRun, normalizeSelectionInfo)) return;
7875
7844
  } else {
7876
- pendingSelectionSeedValidationToken = token;
7845
+ setSelectionValidation({
7846
+ held,
7847
+ pendingToken: token
7848
+ });
7877
7849
  scheduleForegroundAsyncRetry();
7878
7850
  }
7879
7851
  const prev = asyncReads.get("selection");
@@ -7883,17 +7855,12 @@ function createSuperDocUI(options) {
7883
7855
  const sameActiveTypingCaret = Boolean(foreground && foreground.active > 0 && previousCaret && nextCaret && previousCaret.blockId === nextCaret.blockId && storyLocatorSignature(previousCaret.story) === storyLocatorSignature(nextCaret.story) && typeof previousRange?.start === "number" && typeof nextRange?.start === "number" && Math.abs(nextRange.start - previousRange.start) <= 2);
7884
7856
  const carriedChangeIds = paintedTrackChangeId != null || sameActiveTypingCaret ? state.selection.activeChangeIds.filter((id) => paintedTrackChangeId == null || buildTrackedChangeIdContext(state.trackChanges.items).aliasesFor(id).includes(paintedTrackChangeId)) : [];
7885
7857
  const seedChangeIds = Array.isArray(seed.activeChangeIds) && seed.activeChangeIds.length > 0 ? seed.activeChangeIds : carriedChangeIds;
7886
- asyncReads.set("selection", {
7887
- token,
7888
- value: {
7889
- ...seed,
7890
- activeMarks: seedMarks,
7891
- activeCommentIds: seedCommentIds,
7892
- activeChangeIds: seedChangeIds
7893
- },
7894
- hasSettled: true,
7895
- inflightToken: deferAuthoritativeRead ? null : prev?.inflightToken ?? null
7896
- });
7858
+ seedAsyncRead("selection", token, {
7859
+ ...seed,
7860
+ activeMarks: seedMarks,
7861
+ activeCommentIds: seedCommentIds,
7862
+ activeChangeIds: seedChangeIds
7863
+ }, deferAuthoritativeRead ? null : prev?.inflightToken ?? null);
7897
7864
  };
7898
7865
  const selectionInfoMatchesHost = (info) => {
7899
7866
  const snapshot = readHostSelectionSnapshot();
@@ -7915,12 +7882,7 @@ function createSuperDocUI(options) {
7915
7882
  const sourceToken = contentToken();
7916
7883
  const mode = readDocumentMode();
7917
7884
  if (typeof current !== "function") {
7918
- asyncReads.set("selection", {
7919
- token,
7920
- value: null,
7921
- hasSettled: true,
7922
- inflightToken: null
7923
- });
7885
+ seedAsyncRead("selection", token, null);
7924
7886
  recompute();
7925
7887
  return selectionSliceFromInfo(null, "pending");
7926
7888
  }
@@ -7937,12 +7899,7 @@ function createSuperDocUI(options) {
7937
7899
  if (disposed) return selectionSliceFromInfo(null, "pending");
7938
7900
  const info = normalizeSelectionInfo(raw);
7939
7901
  if (selectionReadToken() !== token && !(getDoc() === doc && contentToken() === sourceToken && readDocumentMode() === mode && selectionInfoMatchesHost(info))) return attempt < 1 ? readSelectionInfoFresh(attempt + 1) : selectionSliceFromInfo(null, "pending");
7940
- asyncReads.set("selection", {
7941
- token: selectionReadToken(),
7942
- value: info,
7943
- hasSettled: true,
7944
- inflightToken: null
7945
- });
7902
+ seedAsyncRead("selection", selectionReadToken(), info);
7946
7903
  const selection = selectionSliceFromInfo(info, info ? "ready" : "pending");
7947
7904
  recompute();
7948
7905
  return selection;
@@ -14615,12 +14572,7 @@ function createSuperDocUI(options) {
14615
14572
  const resolved = await Promise.resolve(resolveMetadata({ id }));
14616
14573
  if (token !== localContentToken()) return null;
14617
14574
  const target = readMetadataResolvedTarget(resolved);
14618
- asyncReads.set(metadataResolveKey(id), {
14619
- token,
14620
- value: target,
14621
- hasSettled: true,
14622
- inflightToken: null
14623
- });
14575
+ seedAsyncRead(metadataResolveKey(id), token, target);
14624
14576
  return target;
14625
14577
  } catch {
14626
14578
  return null;
@@ -15876,4 +15828,4 @@ function commandIsActive(descriptor, selection) {
15876
15828
  return descriptor.activeMark ? selection.activeMarks.includes(descriptor.activeMark) : false;
15877
15829
  }
15878
15830
  //#endregion
15879
- export { getWorkflowRecording as C, createInteractionHistory as S, recordInteraction as T, isAllowed as _, registerFirstPartyCommandMutation as a, DOM_CLASS_NAMES as b, getCommandDescriptor as c, mutationCommittedEventChangedDocument as d, createImageFilePicker as f, createTrackedChangePermissionResolver as g, PERMISSIONS as h, readFirstPartyPageNumbers as i, applyV2CommentInvalidationFromMutation as l, shallowEqual as m, executeFirstPartyCommandAsync as n, isRecord as o, resolveImageSrc as p, executeFirstPartyShortcutAsync as r, BUILT_IN_COMMAND_IDS as s, createSuperDocUI as t, getV2TrackedChangeMutationImpact as u, isPlainObject as v, isWorkflowRecordingEnabled as w, closeInteractionHistory as x, isSyntheticTrackedChangeCommentLaneItem as y };
15831
+ export { getWorkflowRecording as C, createInteractionHistory as S, recordInteraction as T, createTrackedChangePermissionResolver as _, registerFirstPartyCommandMutation as a, DOM_CLASS_NAMES as b, getCommandDescriptor as c, mutationCommittedEventChangedDocument as d, createImageFilePicker as f, PERMISSIONS as g, BUILT_IN_PERMISSION_METHOD as h, readFirstPartyPageNumbers as i, applyV2CommentInvalidationFromMutation as l, shallowEqual as m, executeFirstPartyCommandAsync as n, isRecord as o, resolveImageSrc as p, executeFirstPartyShortcutAsync as r, BUILT_IN_COMMAND_IDS as s, createSuperDocUI as t, getV2TrackedChangeMutationImpact as u, isAllowed as v, isWorkflowRecordingEnabled as w, closeInteractionHistory as x, isSyntheticTrackedChangeCommentLaneItem as y };