@superdoc-dev/cli 0.5.0-next.13 → 0.5.0-next.15

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 (2) hide show
  1. package/dist/index.js +1903 -415
  2. package/package.json +6 -6
package/dist/index.js CHANGED
@@ -1211,7 +1211,7 @@ function formatInlineAliasExpectedResult(key) {
1211
1211
  function projectFromDefinitions(fn) {
1212
1212
  return Object.fromEntries(OPERATION_IDS.map((id) => [id, fn(id, OPERATION_DEFINITIONS[id])]));
1213
1213
  }
1214
- var NONE_FAILURES, NONE_THROWS, T_NOT_FOUND, T_NOT_FOUND_CAPABLE, T_PLAN_ENGINE, T_NOT_FOUND_COMMAND, T_IMAGE_COMMAND, T_CC_READ, T_CC_MUTATION, T_CC_TYPED, T_CC_TYPED_READ, T_CC_RAW, T_QUERY_MATCH, T_SECTION_CREATE, T_SECTION_READ, T_PARAGRAPH_MUTATION, T_SECTION_MUTATION, T_SECTION_SETTINGS_MUTATION, T_HEADER_FOOTER_MUTATION, T_STORY, T_REF_READ_LIST, T_REF_MUTATION, T_REF_MUTATION_REMOVE, T_REF_INSERT, FORMAT_INLINE_ALIAS_OPERATION_DEFINITIONS, OPERATION_DEFINITIONS, OPERATION_IDS, SINGLETON_OPERATION_IDS, NAMESPACED_OPERATION_IDS;
1214
+ var NONE_FAILURES, NONE_THROWS, T_NOT_FOUND, T_NOT_FOUND_CAPABLE, T_PLAN_ENGINE, T_NOT_FOUND_COMMAND, T_IMAGE_COMMAND, T_CC_READ, T_CC_MUTATION, T_CC_TYPED, T_CC_TYPED_READ, T_CC_RAW, T_QUERY_MATCH, T_SECTION_CREATE, T_SECTION_READ, T_PARAGRAPH_MUTATION, T_SECTION_MUTATION, T_SECTION_SETTINGS_MUTATION, T_HEADER_FOOTER_MUTATION, T_STORY, T_REF_READ_LIST, T_REF_MUTATION, T_REF_MUTATION_REMOVE, T_REF_INSERT, T_PROTECTION_READ, T_PROTECTION_MUTATION, T_PERM_RANGE_READ, T_PERM_RANGE_MUTATION, FORMAT_INLINE_ALIAS_OPERATION_DEFINITIONS, OPERATION_DEFINITIONS, OPERATION_IDS, SINGLETON_OPERATION_IDS, NAMESPACED_OPERATION_IDS;
1215
1215
  var init_operation_definitions = __esm(() => {
1216
1216
  init_inline_run_patch();
1217
1217
  NONE_FAILURES = [];
@@ -1287,6 +1287,15 @@ var init_operation_definitions = __esm(() => {
1287
1287
  T_REF_MUTATION = ["TARGET_NOT_FOUND", "INVALID_TARGET", "INVALID_INPUT", "CAPABILITY_UNAVAILABLE"];
1288
1288
  T_REF_MUTATION_REMOVE = ["TARGET_NOT_FOUND", "INVALID_TARGET", "CAPABILITY_UNAVAILABLE"];
1289
1289
  T_REF_INSERT = ["TARGET_NOT_FOUND", "INVALID_TARGET", "INVALID_INPUT", "CAPABILITY_UNAVAILABLE"];
1290
+ T_PROTECTION_READ = ["CAPABILITY_UNAVAILABLE"];
1291
+ T_PROTECTION_MUTATION = ["INVALID_INPUT", "CAPABILITY_UNAVAILABLE"];
1292
+ T_PERM_RANGE_READ = ["TARGET_NOT_FOUND", "CAPABILITY_UNAVAILABLE"];
1293
+ T_PERM_RANGE_MUTATION = [
1294
+ "TARGET_NOT_FOUND",
1295
+ "INVALID_TARGET",
1296
+ "INVALID_INPUT",
1297
+ "CAPABILITY_UNAVAILABLE"
1298
+ ];
1290
1299
  FORMAT_INLINE_ALIAS_OPERATION_DEFINITIONS = Object.fromEntries(INLINE_PROPERTY_REGISTRY.map((entry) => {
1291
1300
  const operationId = `format.${entry.key}`;
1292
1301
  const definition = {
@@ -6184,6 +6193,116 @@ var init_operation_definitions = __esm(() => {
6184
6193
  referenceDocPath: "diff/apply.mdx",
6185
6194
  referenceGroup: "diff",
6186
6195
  skipAsATool: true
6196
+ },
6197
+ "protection.get": {
6198
+ memberPath: "protection.get",
6199
+ description: "Read the current document protection state including editing restrictions, write protection, and read-only recommendation.",
6200
+ expectedResult: "Returns a DocumentProtectionState with editingRestriction, writeProtection, and readOnlyRecommended fields.",
6201
+ requiresDocumentContext: true,
6202
+ metadata: readOperation({ throws: T_PROTECTION_READ }),
6203
+ referenceDocPath: "protection/get.mdx",
6204
+ referenceGroup: "protection",
6205
+ skipAsATool: true
6206
+ },
6207
+ "protection.setEditingRestriction": {
6208
+ memberPath: "protection.setEditingRestriction",
6209
+ description: "Enable Word-style editing restriction on the document. Only readOnly mode is supported in v1.",
6210
+ expectedResult: "Returns a ProtectionMutationResult with the updated protection state on success.",
6211
+ requiresDocumentContext: true,
6212
+ metadata: mutationOperation({
6213
+ idempotency: "idempotent",
6214
+ supportsDryRun: true,
6215
+ supportsTrackedMode: false,
6216
+ possibleFailureCodes: ["NO_OP"],
6217
+ throws: T_PROTECTION_MUTATION
6218
+ }),
6219
+ referenceDocPath: "protection/set-editing-restriction.mdx",
6220
+ referenceGroup: "protection",
6221
+ skipAsATool: true
6222
+ },
6223
+ "protection.clearEditingRestriction": {
6224
+ memberPath: "protection.clearEditingRestriction",
6225
+ description: "Disable document-level editing restriction by setting enforcement to off. Preserves the protection element and its metadata for round-trip fidelity.",
6226
+ expectedResult: "Returns a ProtectionMutationResult with the updated protection state on success.",
6227
+ requiresDocumentContext: true,
6228
+ metadata: mutationOperation({
6229
+ idempotency: "idempotent",
6230
+ supportsDryRun: true,
6231
+ supportsTrackedMode: false,
6232
+ possibleFailureCodes: ["NO_OP"],
6233
+ throws: T_PROTECTION_MUTATION
6234
+ }),
6235
+ referenceDocPath: "protection/clear-editing-restriction.mdx",
6236
+ referenceGroup: "protection",
6237
+ skipAsATool: true
6238
+ },
6239
+ "permissionRanges.list": {
6240
+ memberPath: "permissionRanges.list",
6241
+ description: "List all permission ranges in the document. Returns only complete paired ranges (both start and end markers present).",
6242
+ expectedResult: "Returns a PermissionRangesListResult containing discovered permission ranges with principal and position data.",
6243
+ requiresDocumentContext: true,
6244
+ metadata: readOperation({ throws: T_PERM_RANGE_READ }),
6245
+ referenceDocPath: "permission-ranges/list.mdx",
6246
+ referenceGroup: "permissionRanges",
6247
+ skipAsATool: true
6248
+ },
6249
+ "permissionRanges.get": {
6250
+ memberPath: "permissionRanges.get",
6251
+ description: "Get detailed information about a specific permission range by ID.",
6252
+ expectedResult: "Returns a PermissionRangeInfo object with the range principal, kind, and positions.",
6253
+ requiresDocumentContext: true,
6254
+ metadata: readOperation({ throws: T_PERM_RANGE_READ }),
6255
+ referenceDocPath: "permission-ranges/get.mdx",
6256
+ referenceGroup: "permissionRanges",
6257
+ skipAsATool: true
6258
+ },
6259
+ "permissionRanges.create": {
6260
+ memberPath: "permissionRanges.create",
6261
+ description: "Create a permission range exception region in the document. Inserts matched permStart/permEnd markers at the target.",
6262
+ expectedResult: "Returns a PermissionRangeMutationResult with the created range info on success.",
6263
+ requiresDocumentContext: true,
6264
+ metadata: mutationOperation({
6265
+ idempotency: "non-idempotent",
6266
+ supportsDryRun: true,
6267
+ supportsTrackedMode: false,
6268
+ possibleFailureCodes: NONE_FAILURES,
6269
+ throws: T_PERM_RANGE_MUTATION
6270
+ }),
6271
+ referenceDocPath: "permission-ranges/create.mdx",
6272
+ referenceGroup: "permissionRanges",
6273
+ skipAsATool: true
6274
+ },
6275
+ "permissionRanges.remove": {
6276
+ memberPath: "permissionRanges.remove",
6277
+ description: "Remove a permission range by ID. Removes whichever markers exist for the given ID (start, end, or both).",
6278
+ expectedResult: "Returns a PermissionRangeRemoveResult indicating success or a failure.",
6279
+ requiresDocumentContext: true,
6280
+ metadata: mutationOperation({
6281
+ idempotency: "idempotent",
6282
+ supportsDryRun: true,
6283
+ supportsTrackedMode: false,
6284
+ possibleFailureCodes: NONE_FAILURES,
6285
+ throws: T_PERM_RANGE_MUTATION
6286
+ }),
6287
+ referenceDocPath: "permission-ranges/remove.mdx",
6288
+ referenceGroup: "permissionRanges",
6289
+ skipAsATool: true
6290
+ },
6291
+ "permissionRanges.updatePrincipal": {
6292
+ memberPath: "permissionRanges.updatePrincipal",
6293
+ description: "Change which principal is allowed to edit a permission range. Updates the principal fields on the start marker.",
6294
+ expectedResult: "Returns a PermissionRangeMutationResult with the updated range info on success.",
6295
+ requiresDocumentContext: true,
6296
+ metadata: mutationOperation({
6297
+ idempotency: "idempotent",
6298
+ supportsDryRun: true,
6299
+ supportsTrackedMode: false,
6300
+ possibleFailureCodes: NONE_FAILURES,
6301
+ throws: T_PERM_RANGE_MUTATION
6302
+ }),
6303
+ referenceDocPath: "permission-ranges/update-principal.mdx",
6304
+ referenceGroup: "permissionRanges",
6305
+ skipAsATool: true
6187
6306
  }
6188
6307
  };
6189
6308
  OPERATION_IDS = Object.freeze(Object.keys(OPERATION_DEFINITIONS));
@@ -12489,6 +12608,77 @@ var init_schemas = __esm(() => {
12489
12608
  output: diffApplyResultSchema,
12490
12609
  success: diffApplyResultSchema,
12491
12610
  failure: { type: "object" }
12611
+ },
12612
+ "protection.get": {
12613
+ input: objectSchema({}),
12614
+ output: objectSchema({
12615
+ editingRestriction: objectSchema({
12616
+ mode: { type: "string", enum: ["none", "readOnly", "comments", "trackedChanges", "forms"] },
12617
+ enforced: { type: "boolean" },
12618
+ runtimeEnforced: { type: "boolean" },
12619
+ passwordProtected: { type: "boolean" },
12620
+ formattingRestricted: { type: "boolean" }
12621
+ }, ["mode", "enforced", "runtimeEnforced", "passwordProtected", "formattingRestricted"]),
12622
+ writeProtection: objectSchema({
12623
+ enabled: { type: "boolean" },
12624
+ passwordProtected: { type: "boolean" }
12625
+ }, ["enabled", "passwordProtected"]),
12626
+ readOnlyRecommended: { type: "boolean" }
12627
+ }, ["editingRestriction", "writeProtection", "readOnlyRecommended"])
12628
+ },
12629
+ "protection.setEditingRestriction": {
12630
+ input: objectSchema({
12631
+ mode: { type: "string", enum: ["readOnly"] },
12632
+ formattingRestricted: { type: "boolean" }
12633
+ }, ["mode"]),
12634
+ output: { type: "object" },
12635
+ success: { type: "object" },
12636
+ failure: { type: "object" }
12637
+ },
12638
+ "protection.clearEditingRestriction": {
12639
+ input: objectSchema({}),
12640
+ output: { type: "object" },
12641
+ success: { type: "object" },
12642
+ failure: { type: "object" }
12643
+ },
12644
+ "permissionRanges.list": {
12645
+ input: refListQuerySchema,
12646
+ output: discoveryOutputSchema
12647
+ },
12648
+ "permissionRanges.get": {
12649
+ input: objectSchema({ id: { type: "string" } }, ["id"]),
12650
+ output: { type: "object" }
12651
+ },
12652
+ "permissionRanges.create": {
12653
+ input: objectSchema({
12654
+ target: selectionTargetSchema,
12655
+ principal: objectSchema({
12656
+ kind: { type: "string", enum: ["everyone", "editor"] },
12657
+ id: { type: "string" }
12658
+ }, ["kind"]),
12659
+ id: { type: "string" }
12660
+ }, ["target", "principal"]),
12661
+ output: { type: "object" },
12662
+ success: { type: "object" },
12663
+ failure: { type: "object" }
12664
+ },
12665
+ "permissionRanges.remove": {
12666
+ input: objectSchema({ id: { type: "string" } }, ["id"]),
12667
+ output: { type: "object" },
12668
+ success: { type: "object" },
12669
+ failure: { type: "object" }
12670
+ },
12671
+ "permissionRanges.updatePrincipal": {
12672
+ input: objectSchema({
12673
+ id: { type: "string" },
12674
+ principal: objectSchema({
12675
+ kind: { type: "string", enum: ["everyone", "editor"] },
12676
+ id: { type: "string" }
12677
+ }, ["kind"])
12678
+ }, ["id", "principal"]),
12679
+ output: { type: "object" },
12680
+ success: { type: "object" },
12681
+ failure: { type: "object" }
12492
12682
  }
12493
12683
  };
12494
12684
  });
@@ -12663,6 +12853,16 @@ var init_reference_doc_map = __esm(() => {
12663
12853
  title: "Diff",
12664
12854
  description: "Snapshot-based document comparison and replay.",
12665
12855
  pagePath: "diff/index.mdx"
12856
+ },
12857
+ protection: {
12858
+ title: "Protection",
12859
+ description: "Document-level protection state and editing restriction operations.",
12860
+ pagePath: "protection/index.mdx"
12861
+ },
12862
+ permissionRanges: {
12863
+ title: "Permission Ranges",
12864
+ description: "Permission range exception operations for protected documents.",
12865
+ pagePath: "permission-ranges/index.mdx"
12666
12866
  }
12667
12867
  };
12668
12868
  REFERENCE_OPERATION_GROUPS = Object.keys(GROUP_METADATA).map((key) => ({
@@ -15335,7 +15535,15 @@ function buildDispatchTable(api) {
15335
15535
  "authorities.entries.remove": (input, options) => api.authorities.entries.remove(input, options),
15336
15536
  "diff.capture": () => api.diff.capture(),
15337
15537
  "diff.compare": (input) => api.diff.compare(input),
15338
- "diff.apply": (input, options) => api.diff.apply(input, options)
15538
+ "diff.apply": (input, options) => api.diff.apply(input, options),
15539
+ "protection.get": (input) => api.protection.get(input),
15540
+ "protection.setEditingRestriction": (input, options) => api.protection.setEditingRestriction(input, options),
15541
+ "protection.clearEditingRestriction": (input, options) => api.protection.clearEditingRestriction(input, options),
15542
+ "permissionRanges.list": (input) => api.permissionRanges.list(input),
15543
+ "permissionRanges.get": (input) => api.permissionRanges.get(input),
15544
+ "permissionRanges.create": (input, options) => api.permissionRanges.create(input, options),
15545
+ "permissionRanges.remove": (input, options) => api.permissionRanges.remove(input, options),
15546
+ "permissionRanges.updatePrincipal": (input, options) => api.permissionRanges.updatePrincipal(input, options)
15339
15547
  };
15340
15548
  }
15341
15549
  var init_invoke = __esm(() => {
@@ -17123,6 +17331,90 @@ var init_bookmarks = __esm(() => {
17123
17331
  init_validation_primitives();
17124
17332
  });
17125
17333
 
17334
+ // ../../packages/document-api/src/protection/protection.ts
17335
+ function validateSetEditingRestrictionInput(input) {
17336
+ if (!input || typeof input !== "object") {
17337
+ throw new DocumentApiValidationError("INVALID_INPUT", "protection.setEditingRestriction requires an object with a mode property.");
17338
+ }
17339
+ const { mode } = input;
17340
+ if (!VALID_SET_MODES.has(mode)) {
17341
+ throw new DocumentApiValidationError("INVALID_INPUT", `protection.setEditingRestriction mode must be 'readOnly'. Received: '${String(mode)}'.`);
17342
+ }
17343
+ }
17344
+ function executeProtectionGet(adapter, _input) {
17345
+ return adapter.get();
17346
+ }
17347
+ function executeSetEditingRestriction(adapter, input, options) {
17348
+ validateSetEditingRestrictionInput(input);
17349
+ return adapter.setEditingRestriction(input, normalizeMutationOptions(options));
17350
+ }
17351
+ function executeClearEditingRestriction(adapter, _input, options) {
17352
+ return adapter.clearEditingRestriction(undefined, normalizeMutationOptions(options));
17353
+ }
17354
+ var VALID_SET_MODES;
17355
+ var init_protection = __esm(() => {
17356
+ init_errors2();
17357
+ VALID_SET_MODES = new Set(["readOnly"]);
17358
+ });
17359
+
17360
+ // ../../packages/document-api/src/permission-ranges/permission-ranges.ts
17361
+ function validatePrincipal(principal, operationName) {
17362
+ if (!principal || typeof principal !== "object") {
17363
+ throw new DocumentApiValidationError("INVALID_INPUT", `${operationName} requires a principal object with a 'kind' property.`);
17364
+ }
17365
+ const p = principal;
17366
+ if (p.kind === "everyone")
17367
+ return;
17368
+ if (p.kind === "editor") {
17369
+ if (typeof p.id !== "string" || p.id.length === 0) {
17370
+ throw new DocumentApiValidationError("INVALID_INPUT", `${operationName} editor principal requires a non-empty id string.`);
17371
+ }
17372
+ return;
17373
+ }
17374
+ throw new DocumentApiValidationError("INVALID_INPUT", `${operationName} principal kind must be 'everyone' or 'editor'. Received: '${String(p.kind)}'.`);
17375
+ }
17376
+ function requireNonEmptyId(id, operationName) {
17377
+ if (typeof id !== "string" || id.length === 0) {
17378
+ throw new DocumentApiValidationError("INVALID_INPUT", `${operationName} requires a non-empty id string.`);
17379
+ }
17380
+ }
17381
+ function executePermissionRangesList(adapter, input) {
17382
+ return adapter.list(input);
17383
+ }
17384
+ function executePermissionRangesGet(adapter, input) {
17385
+ requireNonEmptyId(input?.id, "permissionRanges.get");
17386
+ return adapter.get(input);
17387
+ }
17388
+ function executePermissionRangesCreate(adapter, input, options) {
17389
+ if (!input || typeof input !== "object") {
17390
+ throw new DocumentApiValidationError("INVALID_INPUT", "permissionRanges.create requires an input object.");
17391
+ }
17392
+ const { target, principal } = input;
17393
+ if (!target || typeof target !== "object") {
17394
+ throw new DocumentApiValidationError("INVALID_INPUT", "permissionRanges.create target must be a SelectionTarget object.");
17395
+ }
17396
+ if (target.kind !== "selection" || !target.start || !target.end) {
17397
+ throw new DocumentApiValidationError("INVALID_INPUT", "permissionRanges.create target must have kind 'selection' with start and end points.");
17398
+ }
17399
+ validatePrincipal(principal, "permissionRanges.create");
17400
+ if (input.id !== undefined) {
17401
+ requireNonEmptyId(input.id, "permissionRanges.create");
17402
+ }
17403
+ return adapter.create(input, normalizeMutationOptions(options));
17404
+ }
17405
+ function executePermissionRangesRemove(adapter, input, options) {
17406
+ requireNonEmptyId(input?.id, "permissionRanges.remove");
17407
+ return adapter.remove(input, normalizeMutationOptions(options));
17408
+ }
17409
+ function executePermissionRangesUpdatePrincipal(adapter, input, options) {
17410
+ requireNonEmptyId(input?.id, "permissionRanges.updatePrincipal");
17411
+ validatePrincipal(input?.principal, "permissionRanges.updatePrincipal");
17412
+ return adapter.updatePrincipal(input, normalizeMutationOptions(options));
17413
+ }
17414
+ var init_permission_ranges = __esm(() => {
17415
+ init_errors2();
17416
+ });
17417
+
17126
17418
  // ../../packages/document-api/src/footnotes/footnotes.ts
17127
17419
  function validateFootnoteTarget(target, operationName) {
17128
17420
  assertTargetPresent(target, operationName);
@@ -17538,6 +17830,9 @@ var init_authorities = __esm(() => {
17538
17830
  init_create_location_validator();
17539
17831
  });
17540
17832
 
17833
+ // ../../packages/document-api/src/protection/protection.types.ts
17834
+ var init_protection_types = () => {};
17835
+
17541
17836
  // ../../packages/document-api/src/index.ts
17542
17837
  function executeQueryMatch(adapter, input) {
17543
17838
  if (!input || typeof input !== "object") {
@@ -18696,6 +18991,34 @@ function createDocumentApi(adapters) {
18696
18991
  return executeHistoryRedo(adapters.history);
18697
18992
  }
18698
18993
  },
18994
+ protection: {
18995
+ get(input) {
18996
+ return executeProtectionGet(adapters.protection, input);
18997
+ },
18998
+ setEditingRestriction(input, options) {
18999
+ return executeSetEditingRestriction(adapters.protection, input, options);
19000
+ },
19001
+ clearEditingRestriction(input, options) {
19002
+ return executeClearEditingRestriction(adapters.protection, input, options);
19003
+ }
19004
+ },
19005
+ permissionRanges: {
19006
+ list(input) {
19007
+ return executePermissionRangesList(adapters.permissionRanges, input);
19008
+ },
19009
+ get(input) {
19010
+ return executePermissionRangesGet(adapters.permissionRanges, input);
19011
+ },
19012
+ create(input, options) {
19013
+ return executePermissionRangesCreate(adapters.permissionRanges, input, options);
19014
+ },
19015
+ remove(input, options) {
19016
+ return executePermissionRangesRemove(adapters.permissionRanges, input, options);
19017
+ },
19018
+ updatePrincipal(input, options) {
19019
+ return executePermissionRangesUpdatePrincipal(adapters.permissionRanges, input, options);
19020
+ }
19021
+ },
18699
19022
  invoke(request) {
18700
19023
  if (!Object.prototype.hasOwnProperty.call(dispatch, request.operationId)) {
18701
19024
  throw new Error(`Unknown operationId: "${request.operationId}"`);
@@ -18740,6 +19063,8 @@ var init_src = __esm(() => {
18740
19063
  init_hyperlinks();
18741
19064
  init_content_controls();
18742
19065
  init_bookmarks();
19066
+ init_protection();
19067
+ init_permission_ranges();
18743
19068
  init_footnotes();
18744
19069
  init_cross_refs();
18745
19070
  init_index();
@@ -18761,6 +19086,7 @@ var init_src = __esm(() => {
18761
19086
  init_contract();
18762
19087
  init_capabilities();
18763
19088
  init_inline_semantics();
19089
+ init_protection_types();
18764
19090
  ADAPTER_GATED_PREFIXES = [
18765
19091
  "bookmarks",
18766
19092
  "footnotes",
@@ -62964,7 +63290,7 @@ var init_remark_gfm_z_sDF4ss_es = __esm(() => {
62964
63290
  emptyOptions2 = {};
62965
63291
  });
62966
63292
 
62967
- // ../../packages/superdoc/dist/chunks/SuperConverter-OPfy6vj2.es.js
63293
+ // ../../packages/superdoc/dist/chunks/SuperConverter-CMIR0kxi.es.js
62968
63294
  function getExtensionConfigField(extension$1, field, context = { name: "" }) {
62969
63295
  const fieldValue = extension$1.config[field];
62970
63296
  if (typeof fieldValue === "function")
@@ -67660,7 +67986,15 @@ function buildDispatchTable2(api) {
67660
67986
  "authorities.entries.remove": (input, options) => api.authorities.entries.remove(input, options),
67661
67987
  "diff.capture": () => api.diff.capture(),
67662
67988
  "diff.compare": (input) => api.diff.compare(input),
67663
- "diff.apply": (input, options) => api.diff.apply(input, options)
67989
+ "diff.apply": (input, options) => api.diff.apply(input, options),
67990
+ "protection.get": (input) => api.protection.get(input),
67991
+ "protection.setEditingRestriction": (input, options) => api.protection.setEditingRestriction(input, options),
67992
+ "protection.clearEditingRestriction": (input, options) => api.protection.clearEditingRestriction(input, options),
67993
+ "permissionRanges.list": (input) => api.permissionRanges.list(input),
67994
+ "permissionRanges.get": (input) => api.permissionRanges.get(input),
67995
+ "permissionRanges.create": (input, options) => api.permissionRanges.create(input, options),
67996
+ "permissionRanges.remove": (input, options) => api.permissionRanges.remove(input, options),
67997
+ "permissionRanges.updatePrincipal": (input, options) => api.permissionRanges.updatePrincipal(input, options)
67664
67998
  };
67665
67999
  }
67666
68000
  function executeHistoryGet2(adapter) {
@@ -69199,6 +69533,69 @@ function executeBookmarksRemove2(adapter, input, options) {
69199
69533
  validateBookmarkTarget2(input.target, "bookmarks.remove");
69200
69534
  return adapter.remove(input, normalizeMutationOptions2(options));
69201
69535
  }
69536
+ function validateSetEditingRestrictionInput2(input) {
69537
+ if (!input || typeof input !== "object")
69538
+ throw new DocumentApiValidationError2("INVALID_INPUT", "protection.setEditingRestriction requires an object with a mode property.");
69539
+ const { mode } = input;
69540
+ if (!VALID_SET_MODES2.has(mode))
69541
+ throw new DocumentApiValidationError2("INVALID_INPUT", `protection.setEditingRestriction mode must be 'readOnly'. Received: '${String(mode)}'.`);
69542
+ }
69543
+ function executeProtectionGet2(adapter, _input) {
69544
+ return adapter.get();
69545
+ }
69546
+ function executeSetEditingRestriction2(adapter, input, options) {
69547
+ validateSetEditingRestrictionInput2(input);
69548
+ return adapter.setEditingRestriction(input, normalizeMutationOptions2(options));
69549
+ }
69550
+ function executeClearEditingRestriction2(adapter, _input, options) {
69551
+ return adapter.clearEditingRestriction(undefined, normalizeMutationOptions2(options));
69552
+ }
69553
+ function validatePrincipal2(principal, operationName) {
69554
+ if (!principal || typeof principal !== "object")
69555
+ throw new DocumentApiValidationError2("INVALID_INPUT", `${operationName} requires a principal object with a 'kind' property.`);
69556
+ const p = principal;
69557
+ if (p.kind === "everyone")
69558
+ return;
69559
+ if (p.kind === "editor") {
69560
+ if (typeof p.id !== "string" || p.id.length === 0)
69561
+ throw new DocumentApiValidationError2("INVALID_INPUT", `${operationName} editor principal requires a non-empty id string.`);
69562
+ return;
69563
+ }
69564
+ throw new DocumentApiValidationError2("INVALID_INPUT", `${operationName} principal kind must be 'everyone' or 'editor'. Received: '${String(p.kind)}'.`);
69565
+ }
69566
+ function requireNonEmptyId2(id2, operationName) {
69567
+ if (typeof id2 !== "string" || id2.length === 0)
69568
+ throw new DocumentApiValidationError2("INVALID_INPUT", `${operationName} requires a non-empty id string.`);
69569
+ }
69570
+ function executePermissionRangesList2(adapter, input) {
69571
+ return adapter.list(input);
69572
+ }
69573
+ function executePermissionRangesGet2(adapter, input) {
69574
+ requireNonEmptyId2(input?.id, "permissionRanges.get");
69575
+ return adapter.get(input);
69576
+ }
69577
+ function executePermissionRangesCreate2(adapter, input, options) {
69578
+ if (!input || typeof input !== "object")
69579
+ throw new DocumentApiValidationError2("INVALID_INPUT", "permissionRanges.create requires an input object.");
69580
+ const { target, principal } = input;
69581
+ if (!target || typeof target !== "object")
69582
+ throw new DocumentApiValidationError2("INVALID_INPUT", "permissionRanges.create target must be a SelectionTarget object.");
69583
+ if (target.kind !== "selection" || !target.start || !target.end)
69584
+ throw new DocumentApiValidationError2("INVALID_INPUT", "permissionRanges.create target must have kind 'selection' with start and end points.");
69585
+ validatePrincipal2(principal, "permissionRanges.create");
69586
+ if (input.id !== undefined)
69587
+ requireNonEmptyId2(input.id, "permissionRanges.create");
69588
+ return adapter.create(input, normalizeMutationOptions2(options));
69589
+ }
69590
+ function executePermissionRangesRemove2(adapter, input, options) {
69591
+ requireNonEmptyId2(input?.id, "permissionRanges.remove");
69592
+ return adapter.remove(input, normalizeMutationOptions2(options));
69593
+ }
69594
+ function executePermissionRangesUpdatePrincipal2(adapter, input, options) {
69595
+ requireNonEmptyId2(input?.id, "permissionRanges.updatePrincipal");
69596
+ validatePrincipal2(input?.principal, "permissionRanges.updatePrincipal");
69597
+ return adapter.updatePrincipal(input, normalizeMutationOptions2(options));
69598
+ }
69202
69599
  function validateFootnoteTarget2(target, operationName) {
69203
69600
  assertTargetPresent2(target, operationName);
69204
69601
  const t = target;
@@ -70692,6 +71089,34 @@ function createDocumentApi2(adapters) {
70692
71089
  return executeHistoryRedo2(adapters.history);
70693
71090
  }
70694
71091
  },
71092
+ protection: {
71093
+ get(input) {
71094
+ return executeProtectionGet2(adapters.protection, input);
71095
+ },
71096
+ setEditingRestriction(input, options) {
71097
+ return executeSetEditingRestriction2(adapters.protection, input, options);
71098
+ },
71099
+ clearEditingRestriction(input, options) {
71100
+ return executeClearEditingRestriction2(adapters.protection, input, options);
71101
+ }
71102
+ },
71103
+ permissionRanges: {
71104
+ list(input) {
71105
+ return executePermissionRangesList2(adapters.permissionRanges, input);
71106
+ },
71107
+ get(input) {
71108
+ return executePermissionRangesGet2(adapters.permissionRanges, input);
71109
+ },
71110
+ create(input, options) {
71111
+ return executePermissionRangesCreate2(adapters.permissionRanges, input, options);
71112
+ },
71113
+ remove(input, options) {
71114
+ return executePermissionRangesRemove2(adapters.permissionRanges, input, options);
71115
+ },
71116
+ updatePrincipal(input, options) {
71117
+ return executePermissionRangesUpdatePrincipal2(adapters.permissionRanges, input, options);
71118
+ }
71119
+ },
70695
71120
  invoke(request) {
70696
71121
  if (!Object.prototype.hasOwnProperty.call(dispatch, request.operationId))
70697
71122
  throw new Error(`Unknown operationId: "${request.operationId}"`);
@@ -94135,6 +94560,253 @@ function compoundMutation(request) {
94135
94560
  state._partPublisher?.flush();
94136
94561
  return { success };
94137
94562
  }
94563
+ function findSettingsRoot(part) {
94564
+ if (part.name === "w:settings")
94565
+ return part;
94566
+ if (!Array.isArray(part.elements))
94567
+ return null;
94568
+ return part.elements.find((entry) => entry.name === "w:settings") ?? null;
94569
+ }
94570
+ function ensureSettingsRootElements(settingsRoot) {
94571
+ if (!Array.isArray(settingsRoot.elements))
94572
+ settingsRoot.elements = [];
94573
+ return settingsRoot.elements;
94574
+ }
94575
+ function readSettingsRoot(converter) {
94576
+ const part = converter.convertedXml?.[SETTINGS_PART_PATH];
94577
+ if (!part)
94578
+ return null;
94579
+ return findSettingsRoot(part);
94580
+ }
94581
+ function ensureSettingsRoot(part) {
94582
+ const settingsRoot = findSettingsRoot(part);
94583
+ if (settingsRoot)
94584
+ return settingsRoot;
94585
+ const fallbackRoot = {
94586
+ type: "element",
94587
+ name: "w:settings",
94588
+ elements: []
94589
+ };
94590
+ if (!Array.isArray(part.elements))
94591
+ part.elements = [];
94592
+ part.elements.push(fallbackRoot);
94593
+ return fallbackRoot;
94594
+ }
94595
+ function readDefaultTableStyle(settingsRoot) {
94596
+ const el = settingsRoot.elements?.find((entry) => entry.name === "w:defaultTableStyle");
94597
+ if (!el)
94598
+ return null;
94599
+ const val = el.attributes?.["w:val"];
94600
+ return typeof val === "string" && val.length > 0 ? val : null;
94601
+ }
94602
+ function setDefaultTableStyle(settingsRoot, styleId) {
94603
+ const elements = ensureSettingsRootElements(settingsRoot);
94604
+ const idx = elements.findIndex((entry) => entry.name === "w:defaultTableStyle");
94605
+ const newEl = {
94606
+ type: "element",
94607
+ name: "w:defaultTableStyle",
94608
+ attributes: { "w:val": styleId },
94609
+ elements: []
94610
+ };
94611
+ if (idx !== -1)
94612
+ elements[idx] = newEl;
94613
+ else
94614
+ elements.push(newEl);
94615
+ }
94616
+ function removeDefaultTableStyle(settingsRoot) {
94617
+ settingsRoot.elements = ensureSettingsRootElements(settingsRoot).filter((entry) => entry.name !== "w:defaultTableStyle");
94618
+ }
94619
+ function hasOddEvenHeadersFooters(settingsRoot) {
94620
+ return settingsRoot.elements?.some((entry) => entry.name === "w:evenAndOddHeaders") === true;
94621
+ }
94622
+ function setOddEvenHeadersFooters(settingsRoot, enabled) {
94623
+ const elements = ensureSettingsRootElements(settingsRoot);
94624
+ const hadFlag = hasOddEvenHeadersFooters(settingsRoot);
94625
+ if (enabled) {
94626
+ if (!hadFlag)
94627
+ elements.push({
94628
+ type: "element",
94629
+ name: "w:evenAndOddHeaders",
94630
+ elements: []
94631
+ });
94632
+ } else
94633
+ settingsRoot.elements = elements.filter((entry) => entry.name !== "w:evenAndOddHeaders");
94634
+ return hadFlag !== hasOddEvenHeadersFooters(settingsRoot);
94635
+ }
94636
+ function hasUpdateFields(settingsRoot) {
94637
+ const el = settingsRoot.elements?.find((entry) => entry.name === "w:updateFields");
94638
+ if (!el)
94639
+ return false;
94640
+ const val = el.attributes?.["w:val"];
94641
+ return val === "true" || val === "1" || val === true;
94642
+ }
94643
+ function setUpdateFields(settingsRoot, enabled) {
94644
+ const elements = ensureSettingsRootElements(settingsRoot);
94645
+ const idx = elements.findIndex((entry) => entry.name === "w:updateFields");
94646
+ if (enabled) {
94647
+ const newEl = {
94648
+ type: "element",
94649
+ name: "w:updateFields",
94650
+ attributes: { "w:val": "true" },
94651
+ elements: []
94652
+ };
94653
+ if (idx !== -1)
94654
+ elements[idx] = newEl;
94655
+ else
94656
+ elements.push(newEl);
94657
+ } else if (idx !== -1)
94658
+ elements.splice(idx, 1);
94659
+ }
94660
+ function isXmlTrue(value) {
94661
+ return value === "1" || value === 1 || value === "true" || value === "on" || value === true;
94662
+ }
94663
+ function hasVerifierFields(attrs) {
94664
+ return !!(attrs["w:cryptAlgorithmSid"] || attrs["w:hash"] || attrs["w:salt"] || attrs["w:cryptProviderType"] || attrs["w:cryptAlgorithmType"] || attrs["w:cryptAlgorithmClass"] || attrs["w:cryptSpinCount"]);
94665
+ }
94666
+ function parseProtectionState(settingsRoot) {
94667
+ if (!settingsRoot)
94668
+ return { ...DEFAULT_PROTECTION_STATE };
94669
+ const elements = settingsRoot.elements ?? [];
94670
+ const docProtEl = elements.find((el) => el.name === "w:documentProtection");
94671
+ const dpAttrs = docProtEl?.attributes ?? {};
94672
+ const rawMode = dpAttrs["w:edit"];
94673
+ const mode = rawMode && VALID_EDIT_MODES.has(rawMode) ? rawMode : "none";
94674
+ const enforced = isXmlTrue(dpAttrs["w:enforcement"]);
94675
+ const formattingRestricted = isXmlTrue(dpAttrs["w:formatting"]);
94676
+ const passwordProtected = docProtEl ? hasVerifierFields(dpAttrs) : false;
94677
+ const runtimeEnforced = mode === "readOnly" && enforced;
94678
+ const writeProt = elements.find((el) => el.name === "w:writeProtection");
94679
+ const wpAttrs = writeProt?.attributes ?? {};
94680
+ const writeEnabled = !!writeProt;
94681
+ const writePasswordProtected = writeProt ? hasVerifierFields(wpAttrs) : false;
94682
+ const readOnlyRecommended = isXmlTrue(wpAttrs["w:recommended"]);
94683
+ return {
94684
+ editingRestriction: {
94685
+ mode,
94686
+ enforced,
94687
+ runtimeEnforced,
94688
+ passwordProtected,
94689
+ formattingRestricted
94690
+ },
94691
+ writeProtection: {
94692
+ enabled: writeEnabled,
94693
+ passwordProtected: writePasswordProtected
94694
+ },
94695
+ readOnlyRecommended
94696
+ };
94697
+ }
94698
+ function setDocumentProtection(settingsRoot, opts) {
94699
+ const elements = ensureSettingsRootElements(settingsRoot);
94700
+ const idx = elements.findIndex((el) => el.name === "w:documentProtection");
94701
+ const attrs = {
94702
+ ...idx !== -1 ? { ...elements[idx].attributes ?? {} } : {},
94703
+ "w:edit": opts.mode,
94704
+ "w:enforcement": opts.enforced ? "1" : "0"
94705
+ };
94706
+ if (opts.formattingRestricted !== undefined)
94707
+ attrs["w:formatting"] = opts.formattingRestricted ? "1" : "0";
94708
+ const newEl = {
94709
+ type: "element",
94710
+ name: "w:documentProtection",
94711
+ attributes: attrs,
94712
+ elements: []
94713
+ };
94714
+ if (idx !== -1)
94715
+ elements[idx] = newEl;
94716
+ else
94717
+ elements.push(newEl);
94718
+ }
94719
+ function clearDocumentProtectionEnforcement(settingsRoot) {
94720
+ const el = (settingsRoot.elements ?? []).find((e) => e.name === "w:documentProtection");
94721
+ if (!el)
94722
+ return;
94723
+ if (!el.attributes)
94724
+ el.attributes = {};
94725
+ el.attributes["w:enforcement"] = "0";
94726
+ }
94727
+ function getProtectionStorage(editor) {
94728
+ return editor?.storage?.protection;
94729
+ }
94730
+ function isReadOnlyProtectionRuntimeEnforced(editor) {
94731
+ const storage = getProtectionStorage(editor);
94732
+ if (!storage?.initialized)
94733
+ return false;
94734
+ return storage.state?.editingRestriction?.runtimeEnforced === true;
94735
+ }
94736
+ function applyEffectiveEditability(editor, opts = {}) {
94737
+ if (!editor || editor.isDestroyed)
94738
+ return;
94739
+ if (opts.refilterRanges !== false)
94740
+ refilterAllowedRanges(editor);
94741
+ const protectionEnforced = isReadOnlyProtectionRuntimeEnforced(editor);
94742
+ const hasAllowedRanges = editor.storage?.permissionRanges?.hasAllowedRanges === true;
94743
+ const documentMode = editor.options?.documentMode;
94744
+ const storage = getProtectionStorage(editor);
94745
+ if (protectionEnforced) {
94746
+ if (storage && storage.editableBaseline === null)
94747
+ storage.editableBaseline = editor.isEditable;
94748
+ const shouldBeEditable = hasAllowedRanges;
94749
+ if (editor.isEditable !== shouldBeEditable)
94750
+ editor.setEditable(shouldBeEditable, false);
94751
+ } else {
94752
+ const baseline = storage?.editableBaseline ?? null;
94753
+ if (storage)
94754
+ storage.editableBaseline = null;
94755
+ if (documentMode === "viewing") {
94756
+ if (editor.isEditable !== false)
94757
+ editor.setEditable(false, false);
94758
+ } else if (baseline !== null && editor.isEditable !== baseline)
94759
+ editor.setEditable(baseline, false);
94760
+ }
94761
+ }
94762
+ function refilterAllowedRanges(editor) {
94763
+ const storage = editor?.storage?.permissionRanges;
94764
+ if (!storage)
94765
+ return;
94766
+ const allRanges = storage.allRanges;
94767
+ if (!Array.isArray(allRanges))
94768
+ return;
94769
+ if (!isReadOnlyProtectionRuntimeEnforced(editor)) {
94770
+ storage.allowedRanges = [];
94771
+ storage.hasAllowedRanges = false;
94772
+ storage.ranges = [];
94773
+ return;
94774
+ }
94775
+ const allowedIdentifiers = buildAllowedIdentifierSetFromEditor(editor);
94776
+ const filtered = allRanges.filter((entry) => isRangeAllowedForPrincipal(entry, allowedIdentifiers));
94777
+ storage.allowedRanges = filtered;
94778
+ storage.hasAllowedRanges = filtered.length > 0;
94779
+ storage.ranges = filtered;
94780
+ }
94781
+ function buildAllowedIdentifierSetFromEditor(editor) {
94782
+ const user = editor?.options?.user;
94783
+ if (!user)
94784
+ return /* @__PURE__ */ new Set;
94785
+ const principals = user.permissionPrincipals;
94786
+ if (Array.isArray(principals))
94787
+ return new Set(principals.map((p) => typeof p === "string" ? p.trim().toLowerCase() : "").filter(Boolean));
94788
+ const email = typeof user.email === "string" ? user.email.trim().toLowerCase() : "";
94789
+ if (!email)
94790
+ return /* @__PURE__ */ new Set;
94791
+ const [localPart, domain2] = email.split("@");
94792
+ if (!localPart || !domain2)
94793
+ return /* @__PURE__ */ new Set;
94794
+ return new Set([`${domain2}\\${localPart}`]);
94795
+ }
94796
+ function isRangeAllowedForPrincipal(entry, allowedIdentifiers) {
94797
+ if (entry.principal) {
94798
+ if (entry.principal.kind === "everyone")
94799
+ return true;
94800
+ if (entry.principal.kind === "editor") {
94801
+ const id2 = typeof entry.principal.id === "string" ? entry.principal.id.trim().toLowerCase() : "";
94802
+ return id2 ? allowedIdentifiers.has(id2) : false;
94803
+ }
94804
+ }
94805
+ if ((typeof entry.edGrp === "string" ? entry.edGrp.trim().toLowerCase() : "") === "everyone")
94806
+ return true;
94807
+ const ed = typeof entry.ed === "string" ? entry.ed.trim().toLowerCase() : "";
94808
+ return ed ? allowedIdentifiers.has(ed) : false;
94809
+ }
94138
94810
  function handleNumberingInvalidation(editor, _event) {
94139
94811
  try {
94140
94812
  editor.view?.dispatch?.(editor.state.tr);
@@ -94155,11 +94827,29 @@ function handleNotesInvalidation(editor, _event) {
94155
94827
  editor.view?.dispatch?.(tr);
94156
94828
  } catch {}
94157
94829
  }
94830
+ function handleSettingsInvalidation(editor, event) {
94831
+ if (event.source.startsWith("protection."))
94832
+ return;
94833
+ const converter = editor.converter;
94834
+ if (!converter)
94835
+ return;
94836
+ const newState = parseProtectionState(readSettingsRoot(converter));
94837
+ const protStorage = getProtectionStorage(editor);
94838
+ if (protStorage)
94839
+ protStorage.state = newState;
94840
+ applyEffectiveEditability(editor);
94841
+ editor.emit("protectionChanged", {
94842
+ editor,
94843
+ state: newState,
94844
+ source: "remote-part-sync"
94845
+ });
94846
+ }
94158
94847
  function registerStaticInvalidationHandlers() {
94159
94848
  registerInvalidationHandler("word/numbering.xml", handleNumberingInvalidation);
94160
94849
  registerInvalidationHandler("word/_rels/document.xml.rels", handleRelationshipsInvalidation);
94161
94850
  registerInvalidationHandler("word/footnotes.xml", handleNotesInvalidation);
94162
94851
  registerInvalidationHandler("word/endnotes.xml", handleNotesInvalidation);
94852
+ registerInvalidationHandler("word/settings.xml", handleSettingsInvalidation);
94163
94853
  }
94164
94854
  function registerHeaderFooterInvalidation(partId) {
94165
94855
  registerInvalidationHandler(partId, handleHeaderFooterInvalidation);
@@ -96612,103 +97302,6 @@ function refreshAllStatFields(editor) {
96612
97302
  }
96613
97303
  return cacheMap;
96614
97304
  }
96615
- function findSettingsRoot(part) {
96616
- if (part.name === "w:settings")
96617
- return part;
96618
- if (!Array.isArray(part.elements))
96619
- return null;
96620
- return part.elements.find((entry) => entry.name === "w:settings") ?? null;
96621
- }
96622
- function ensureSettingsRootElements(settingsRoot) {
96623
- if (!Array.isArray(settingsRoot.elements))
96624
- settingsRoot.elements = [];
96625
- return settingsRoot.elements;
96626
- }
96627
- function readSettingsRoot(converter) {
96628
- const part = converter.convertedXml?.[SETTINGS_PART_PATH];
96629
- if (!part)
96630
- return null;
96631
- return findSettingsRoot(part);
96632
- }
96633
- function ensureSettingsRoot(part) {
96634
- const settingsRoot = findSettingsRoot(part);
96635
- if (settingsRoot)
96636
- return settingsRoot;
96637
- const fallbackRoot = {
96638
- type: "element",
96639
- name: "w:settings",
96640
- elements: []
96641
- };
96642
- if (!Array.isArray(part.elements))
96643
- part.elements = [];
96644
- part.elements.push(fallbackRoot);
96645
- return fallbackRoot;
96646
- }
96647
- function readDefaultTableStyle(settingsRoot) {
96648
- const el = settingsRoot.elements?.find((entry) => entry.name === "w:defaultTableStyle");
96649
- if (!el)
96650
- return null;
96651
- const val = el.attributes?.["w:val"];
96652
- return typeof val === "string" && val.length > 0 ? val : null;
96653
- }
96654
- function setDefaultTableStyle(settingsRoot, styleId) {
96655
- const elements = ensureSettingsRootElements(settingsRoot);
96656
- const idx = elements.findIndex((entry) => entry.name === "w:defaultTableStyle");
96657
- const newEl = {
96658
- type: "element",
96659
- name: "w:defaultTableStyle",
96660
- attributes: { "w:val": styleId },
96661
- elements: []
96662
- };
96663
- if (idx !== -1)
96664
- elements[idx] = newEl;
96665
- else
96666
- elements.push(newEl);
96667
- }
96668
- function removeDefaultTableStyle(settingsRoot) {
96669
- settingsRoot.elements = ensureSettingsRootElements(settingsRoot).filter((entry) => entry.name !== "w:defaultTableStyle");
96670
- }
96671
- function hasOddEvenHeadersFooters(settingsRoot) {
96672
- return settingsRoot.elements?.some((entry) => entry.name === "w:evenAndOddHeaders") === true;
96673
- }
96674
- function setOddEvenHeadersFooters(settingsRoot, enabled) {
96675
- const elements = ensureSettingsRootElements(settingsRoot);
96676
- const hadFlag = hasOddEvenHeadersFooters(settingsRoot);
96677
- if (enabled) {
96678
- if (!hadFlag)
96679
- elements.push({
96680
- type: "element",
96681
- name: "w:evenAndOddHeaders",
96682
- elements: []
96683
- });
96684
- } else
96685
- settingsRoot.elements = elements.filter((entry) => entry.name !== "w:evenAndOddHeaders");
96686
- return hadFlag !== hasOddEvenHeadersFooters(settingsRoot);
96687
- }
96688
- function hasUpdateFields(settingsRoot) {
96689
- const el = settingsRoot.elements?.find((entry) => entry.name === "w:updateFields");
96690
- if (!el)
96691
- return false;
96692
- const val = el.attributes?.["w:val"];
96693
- return val === "true" || val === "1" || val === true;
96694
- }
96695
- function setUpdateFields(settingsRoot, enabled) {
96696
- const elements = ensureSettingsRootElements(settingsRoot);
96697
- const idx = elements.findIndex((entry) => entry.name === "w:updateFields");
96698
- if (enabled) {
96699
- const newEl = {
96700
- type: "element",
96701
- name: "w:updateFields",
96702
- attributes: { "w:val": "true" },
96703
- elements: []
96704
- };
96705
- if (idx !== -1)
96706
- elements[idx] = newEl;
96707
- else
96708
- elements.push(newEl);
96709
- } else if (idx !== -1)
96710
- elements.splice(idx, 1);
96711
- }
96712
97305
  function getLocalName(name) {
96713
97306
  if (!name || typeof name !== "string")
96714
97307
  return "";
@@ -99070,7 +99663,7 @@ var isRegExp = (value) => {
99070
99663
  tracked: false,
99071
99664
  carrier: runAttributeCarrier2(runPropertyKey ?? key),
99072
99665
  schema
99073
- }), INLINE_PROPERTY_REGISTRY2, INLINE_PROPERTY_KEY_SET2, INLINE_PROPERTY_BY_KEY2, UNDERLINE_OBJECT_ALLOWED_KEYS2, SHADING_ALLOWED_KEYS2, BORDER_ALLOWED_KEYS2, FIT_TEXT_ALLOWED_KEYS2, LANG_ALLOWED_KEYS2, RFONTS_ALLOWED_KEYS2, EAST_ASIAN_LAYOUT_ALLOWED_KEYS2, STYLISTIC_SET_ALLOWED_KEYS2, VERT_ALIGN_VALUES2, PROPERTY_VALIDATOR_MAP2, NONE_FAILURES2, NONE_THROWS2, T_NOT_FOUND2, T_NOT_FOUND_CAPABLE2, T_PLAN_ENGINE2, T_NOT_FOUND_COMMAND2, T_IMAGE_COMMAND2, T_CC_READ2, T_CC_MUTATION2, T_CC_TYPED2, T_CC_TYPED_READ2, T_CC_RAW2, T_QUERY_MATCH2, T_SECTION_CREATE2, T_SECTION_READ2, T_PARAGRAPH_MUTATION2, T_SECTION_MUTATION2, T_SECTION_SETTINGS_MUTATION2, T_HEADER_FOOTER_MUTATION2, T_STORY2, T_REF_READ_LIST2, T_REF_MUTATION2, T_REF_MUTATION_REMOVE2, T_REF_INSERT2, FORMAT_INLINE_ALIAS_OPERATION_DEFINITIONS2, OPERATION_DEFINITIONS2, OPERATION_IDS2, COMMAND_CATALOG3, PARAGRAPH_ALIGNMENTS2, TAB_STOP_ALIGNMENTS2, TAB_STOP_LEADERS2, BORDER_SIDES2, CLEAR_BORDER_SIDES2, LINE_RULES2, PARAGRAPH_DIRECTIONS2, ALIGNMENT_POLICIES2, PARAGRAPH_BLOCK_TYPES2, SET_STYLE_KEYS2, CLEAR_STYLE_KEYS2, RESET_DIRECT_FORMATTING_KEYS2, SET_ALIGNMENT_KEYS2, CLEAR_ALIGNMENT_KEYS2, SET_INDENTATION_KEYS2, CLEAR_INDENTATION_KEYS2, SET_SPACING_KEYS2, CLEAR_SPACING_KEYS2, SET_KEEP_OPTIONS_KEYS2, SET_OUTLINE_LEVEL_KEYS2, SET_FLOW_OPTIONS_KEYS2, SET_TAB_STOP_KEYS2, CLEAR_TAB_STOP_KEYS2, CLEAR_ALL_TAB_STOPS_KEYS2, SET_BORDER_KEYS2, CLEAR_BORDER_KEYS2, SET_SHADING_KEYS2, CLEAR_SHADING_KEYS2, SET_DIRECTION_KEYS2, CLEAR_DIRECTION_KEYS2, ST_ON_OFF_ON_VALUES2, ST_ON_OFF_OFF_VALUES2, ST_UNDERLINE_VALUES2, ST_UNDERLINE_VALUE_SET2, ST_VERTICAL_ALIGN_RUN2, ST_EM2, ST_TEXT_ALIGNMENT2, ST_TEXT_DIRECTION2, ST_TEXTBOX_TIGHT_WRAP2, ST_TEXT_TRANSFORM2, ST_JUSTIFICATION2, FONT_FAMILY_SCHEMA2, COLOR_SCHEMA2, SPACING_SCHEMA2, INDENT_SCHEMA2, UNDERLINE_SCHEMA2, BORDER_PROPERTIES_SCHEMA2, SHADING_SCHEMA2, LANG_SCHEMA2, EAST_ASIAN_LAYOUT_SCHEMA2, FIT_TEXT_SCHEMA2, NUMBERING_PROPERTIES_SCHEMA2, FRAME_PR_SCHEMA2, PARAGRAPH_BORDERS_SCHEMA2, TAB_STOP_SCHEMA2, PROPERTY_REGISTRY2, ALLOWED_KEYS_BY_CHANNEL2, PROPERTY_INDEX2, EXCLUDED_KEYS2, INPUT_ALLOWED_KEYS2, TARGET_ALLOWED_KEYS2, OPTIONS_ALLOWED_KEYS2, VALID_CHANNELS2, Z_ORDER_RELATIVE_HEIGHT_MAX2 = 4294967295, nodeTypeValues2, blockNodeTypeValues2, deletableBlockNodeTypeValues2, inlineNodeTypeValues2, rangeSchema2, textAddressSchema2, textTargetSchema2, blockNodeAddressSchema2, deletableBlockNodeAddressSchema2, tableAddressSchema2, tableRowAddressSchema2, tableCellAddressSchema2, tableOrCellAddressSchema2, paragraphAddressSchema2, headingAddressSchema2, listItemAddressSchema2, paragraphTargetSchema2, sectionAddressSchema2, nodeAddressSchema2, commentAddressSchema2, trackedChangeAddressSchema2, entityAddressSchema2, selectionTargetSchema2, deleteBehaviorSchema2, resolvedHandleSchema2, pageInfoSchema2, receiptSuccessSchema2, textMutationRangeSchema2, textMutationResolutionSchema2, textMutationSuccessSchema2, matchBlockSchema2, storyLocatorSchema2, trackChangeRefSchema2, createParagraphSuccessSchema2, createHeadingSuccessSchema2, headingLevelSchema2, listsInsertSuccessSchema2, listsMutateItemSuccessSchema2, textSelectorSchema2, nodeSelectorSchema2, sdMutationResolutionSchema2, sdMutationSuccessSchema2, documentInfoCountsSchema2, documentInfoOutlineItemSchema2, documentInfoCapabilitiesSchema2, documentStylesSchema2, documentDefaultsSchema2, listKindSchema2, listInsertPositionSchema2, sectionBreakTypeSchema2, sectionOrientationSchema2, sectionVerticalAlignSchema2, sectionDirectionSchema2, sectionHeaderFooterKindSchema2, sectionHeaderFooterVariantSchema2, sectionLineNumberRestartSchema2, sectionPageNumberFormatSchema2, sectionRangeDomainSchema2, sectionPageMarginsSchema2, sectionHeaderFooterMarginsSchema2, sectionPageSetupSchema2, sectionColumnsSchema2, sectionLineNumberingSchema2, sectionPageNumberingSchema2, sectionHeaderFooterRefsSchema2, sectionBorderSpecSchema2, sectionPageBordersSchema2, sectionMutationSuccessSchema2, documentMutationSuccessSchema2, paragraphMutationTargetSchema2, paragraphMutationSuccessSchema2, createSectionBreakSuccessSchema2, capabilityReasonsSchema2, capabilityFlagSchema2, operationRuntimeCapabilitySchema2, operationCapabilitiesSchema2, inlinePropertyCapabilitySchema2, formatCapabilitiesSchema2, planEngineCapabilitiesSchema2, nullableTableBorderSpecSchema2, sdFragmentSchema2, placementSchema2, nestingPolicySchema2, tableCreateLocationSchema2, formatInlineAliasOperationSchemas2, tocMutationFailureSchema2, tocMutationSuccessSchema2, tocEntryMutationFailureSchema2, tocEntryMutationSuccessSchema2, hyperlinkTargetSchema2, hyperlinkReadPropertiesSchema2, hyperlinkSpecSchema2, hyperlinkPatchSchema2, hyperlinkDomainSchema2, hyperlinkMutationSuccessSchema2, hyperlinkMutationFailureSchema2, contentControlTargetSchema2, contentControlMutationSuccessSchema2, contentControlMutationFailureSchema2, ccListResultSchema2, ccInfoSchema2, refFailureSchema2, bookmarkAddressSchema2, bookmarkMutation2, footnoteAddressSchema2, footnoteConfigScopeSchema2, footnoteNumberingSchema2, footnoteMutation2, footnoteConfig2, crossRefAddressSchema2, crossRefTargetSchema2, crossRefDisplaySchema2, crossRefMutation2, indexAddressSchema2, indexEntryAddressSchema2, indexConfigSchema2, indexEntryDataSchema2, indexEntryPatchSchema2, indexMutation2, indexEntryMutation2, captionAddressSchema2, captionMutation2, captionConfig2, fieldAddressSchema2, fieldMutation2, citationAddressSchema2, citationSourceAddressSchema2, bibliographyAddressSchema2, citationMutation2, citationSourceMutation2, bibliographyMutation2, citationPersonSchema2, citationSourceFieldsSchema2, tocCreateLocationSchema2, authoritiesAddressSchema2, authorityEntryAddressSchema2, authoritiesConfigSchema2, authorityEntryDataSchema2, authorityEntryPatchSchema2, authoritiesMutation2, authorityEntryMutation2, diffCoverageSchema2, diffSummarySchema2, diffSnapshotSchema2, diffPayloadSchema2, GROUP_METADATA2, STEP_OP_CATALOG_UNFROZEN2, PUBLIC_STEP_OP_CATALOG_UNFROZEN2, PUBLIC_MUTATION_STEP_OP_IDS2, PUBLIC_MUTATION_STEP_OP_SET2, CAPABILITY_REASON_CODES, VALID_EDGE_VALUES2, VALID_EDGE_NODE_TYPES2, VALID_DOCUMENT_EDGES2, VALID_REF_BOUNDARIES2, VALID_ANCHOR_KINDS2, RESOLVE_RANGE_ALLOWED_KEYS2, CREATE_COMMENT_ALLOWED_KEYS2, PATCH_COMMENT_ALLOWED_KEYS2, STYLE_APPLY_INPUT_ALLOWED_KEYS2, INLINE_ALIAS_INPUT_ALLOWED_KEYS2, DELETE_INPUT_ALLOWED_KEYS2, VALID_BEHAVIORS2, CONTENT_KIND_SET2, INLINE_KIND_SET2, LEGACY_TOP_LEVEL_TYPES2, TEXT_INSERT_ALLOWED_KEYS2, STRUCTURAL_INSERT_ALLOWED_KEYS2, VALID_INSERT_TYPES2, LIST_KINDS2, LIST_INSERT_POSITIONS2, JOIN_DIRECTIONS2, MUTATION_SCOPES2, LEVEL_ALIGNMENTS2, TRAILING_CHARACTERS2, LIST_PRESET_IDS2, VALID_BLOCK_NODE_TYPES$1, VALID_LIST_KINDS2, VALID_INSERT_POSITIONS2, VALID_JOIN_DIRECTIONS2, VALID_MUTATION_SCOPES2, VALID_LEVEL_ALIGNMENTS2, VALID_TRAILING_CHARACTERS2, VALID_LIST_PRESETS2, VALID_CONTINUITY_VALUES2, VALID_SEQUENCE_MODES2, VALID_LIST_CREATE_MODES2, TEXT_REPLACE_ALLOWED_KEYS2, STRUCTURAL_REPLACE_ALLOWED_KEYS2, VALID_HEADING_LEVELS2, SECTION_BREAK_TYPES$1, SUPPORTED_DELETE_NODE_TYPES2, REJECTED_DELETE_NODE_TYPES2, VALID_BLOCK_NODE_TYPES3, SNAPSHOT_VERSION2 = "sd-diff-snapshot/v1", PAYLOAD_VERSION2 = "sd-diff-payload/v1", VALID_STYLE_OPTION_FLAGS2, TABLE_BORDER_COLOR_PATTERN2, VALID_APPLY_TO_VALUES2, VALID_BORDER_EDGE_KEYS2, HEADER_FOOTER_KINDS$1, HEADER_FOOTER_VARIANTS$1, DEFAULT_SECTIONS_LIST_LIMIT2 = 250, SECTION_BREAK_TYPES3, SECTION_ORIENTATIONS2, SECTION_VERTICAL_ALIGNS2, SECTION_DIRECTIONS2, HEADER_FOOTER_KINDS3, HEADER_FOOTER_VARIANTS3, LINE_NUMBER_RESTARTS2, PAGE_NUMBER_FORMATS2, PAGE_BORDER_DISPLAYS2, PAGE_BORDER_OFFSET_FROM_VALUES2, PAGE_BORDER_Z_ORDER_VALUES2, VALID_WRAP_TYPES2, VALID_WRAP_SIDES2, VALID_IMAGE_SIZE_UNITS2, VALID_TOC_UPDATE_MODES2, EDIT_ENTRY_PATCH_ALLOWED_KEYS2, PATCH_FIELDS2, CONTENT_CONTROL_TYPES2, LOCK_MODES2, CONTENT_CONTROL_APPEARANCES2, VALID_NODE_KINDS2, VALID_LOCK_MODES$1, VALID_CC_TYPES2, VALID_CC_APPEARANCES2, VALID_CONTENT_FORMATS2, VALID_RAW_PATCH_OPS2, VALID_CREATE_LOCATION_KINDS2, ADAPTER_GATED_PREFIXES2, _buffers, _defaultCollectionId = null, _nextCollectionId = 1, generateV2HandlerEntity = (handlerName, translator$216) => ({
99666
+ }), INLINE_PROPERTY_REGISTRY2, INLINE_PROPERTY_KEY_SET2, INLINE_PROPERTY_BY_KEY2, UNDERLINE_OBJECT_ALLOWED_KEYS2, SHADING_ALLOWED_KEYS2, BORDER_ALLOWED_KEYS2, FIT_TEXT_ALLOWED_KEYS2, LANG_ALLOWED_KEYS2, RFONTS_ALLOWED_KEYS2, EAST_ASIAN_LAYOUT_ALLOWED_KEYS2, STYLISTIC_SET_ALLOWED_KEYS2, VERT_ALIGN_VALUES2, PROPERTY_VALIDATOR_MAP2, NONE_FAILURES2, NONE_THROWS2, T_NOT_FOUND2, T_NOT_FOUND_CAPABLE2, T_PLAN_ENGINE2, T_NOT_FOUND_COMMAND2, T_IMAGE_COMMAND2, T_CC_READ2, T_CC_MUTATION2, T_CC_TYPED2, T_CC_TYPED_READ2, T_CC_RAW2, T_QUERY_MATCH2, T_SECTION_CREATE2, T_SECTION_READ2, T_PARAGRAPH_MUTATION2, T_SECTION_MUTATION2, T_SECTION_SETTINGS_MUTATION2, T_HEADER_FOOTER_MUTATION2, T_STORY2, T_REF_READ_LIST2, T_REF_MUTATION2, T_REF_MUTATION_REMOVE2, T_REF_INSERT2, T_PROTECTION_READ2, T_PROTECTION_MUTATION2, T_PERM_RANGE_READ2, T_PERM_RANGE_MUTATION2, FORMAT_INLINE_ALIAS_OPERATION_DEFINITIONS2, OPERATION_DEFINITIONS2, OPERATION_IDS2, COMMAND_CATALOG3, PARAGRAPH_ALIGNMENTS2, TAB_STOP_ALIGNMENTS2, TAB_STOP_LEADERS2, BORDER_SIDES2, CLEAR_BORDER_SIDES2, LINE_RULES2, PARAGRAPH_DIRECTIONS2, ALIGNMENT_POLICIES2, PARAGRAPH_BLOCK_TYPES2, SET_STYLE_KEYS2, CLEAR_STYLE_KEYS2, RESET_DIRECT_FORMATTING_KEYS2, SET_ALIGNMENT_KEYS2, CLEAR_ALIGNMENT_KEYS2, SET_INDENTATION_KEYS2, CLEAR_INDENTATION_KEYS2, SET_SPACING_KEYS2, CLEAR_SPACING_KEYS2, SET_KEEP_OPTIONS_KEYS2, SET_OUTLINE_LEVEL_KEYS2, SET_FLOW_OPTIONS_KEYS2, SET_TAB_STOP_KEYS2, CLEAR_TAB_STOP_KEYS2, CLEAR_ALL_TAB_STOPS_KEYS2, SET_BORDER_KEYS2, CLEAR_BORDER_KEYS2, SET_SHADING_KEYS2, CLEAR_SHADING_KEYS2, SET_DIRECTION_KEYS2, CLEAR_DIRECTION_KEYS2, ST_ON_OFF_ON_VALUES2, ST_ON_OFF_OFF_VALUES2, ST_UNDERLINE_VALUES2, ST_UNDERLINE_VALUE_SET2, ST_VERTICAL_ALIGN_RUN2, ST_EM2, ST_TEXT_ALIGNMENT2, ST_TEXT_DIRECTION2, ST_TEXTBOX_TIGHT_WRAP2, ST_TEXT_TRANSFORM2, ST_JUSTIFICATION2, FONT_FAMILY_SCHEMA2, COLOR_SCHEMA2, SPACING_SCHEMA2, INDENT_SCHEMA2, UNDERLINE_SCHEMA2, BORDER_PROPERTIES_SCHEMA2, SHADING_SCHEMA2, LANG_SCHEMA2, EAST_ASIAN_LAYOUT_SCHEMA2, FIT_TEXT_SCHEMA2, NUMBERING_PROPERTIES_SCHEMA2, FRAME_PR_SCHEMA2, PARAGRAPH_BORDERS_SCHEMA2, TAB_STOP_SCHEMA2, PROPERTY_REGISTRY2, ALLOWED_KEYS_BY_CHANNEL2, PROPERTY_INDEX2, EXCLUDED_KEYS2, INPUT_ALLOWED_KEYS2, TARGET_ALLOWED_KEYS2, OPTIONS_ALLOWED_KEYS2, VALID_CHANNELS2, Z_ORDER_RELATIVE_HEIGHT_MAX2 = 4294967295, nodeTypeValues2, blockNodeTypeValues2, deletableBlockNodeTypeValues2, inlineNodeTypeValues2, rangeSchema2, textAddressSchema2, textTargetSchema2, blockNodeAddressSchema2, deletableBlockNodeAddressSchema2, tableAddressSchema2, tableRowAddressSchema2, tableCellAddressSchema2, tableOrCellAddressSchema2, paragraphAddressSchema2, headingAddressSchema2, listItemAddressSchema2, paragraphTargetSchema2, sectionAddressSchema2, nodeAddressSchema2, commentAddressSchema2, trackedChangeAddressSchema2, entityAddressSchema2, selectionTargetSchema2, deleteBehaviorSchema2, resolvedHandleSchema2, pageInfoSchema2, receiptSuccessSchema2, textMutationRangeSchema2, textMutationResolutionSchema2, textMutationSuccessSchema2, matchBlockSchema2, storyLocatorSchema2, trackChangeRefSchema2, createParagraphSuccessSchema2, createHeadingSuccessSchema2, headingLevelSchema2, listsInsertSuccessSchema2, listsMutateItemSuccessSchema2, textSelectorSchema2, nodeSelectorSchema2, sdMutationResolutionSchema2, sdMutationSuccessSchema2, documentInfoCountsSchema2, documentInfoOutlineItemSchema2, documentInfoCapabilitiesSchema2, documentStylesSchema2, documentDefaultsSchema2, listKindSchema2, listInsertPositionSchema2, sectionBreakTypeSchema2, sectionOrientationSchema2, sectionVerticalAlignSchema2, sectionDirectionSchema2, sectionHeaderFooterKindSchema2, sectionHeaderFooterVariantSchema2, sectionLineNumberRestartSchema2, sectionPageNumberFormatSchema2, sectionRangeDomainSchema2, sectionPageMarginsSchema2, sectionHeaderFooterMarginsSchema2, sectionPageSetupSchema2, sectionColumnsSchema2, sectionLineNumberingSchema2, sectionPageNumberingSchema2, sectionHeaderFooterRefsSchema2, sectionBorderSpecSchema2, sectionPageBordersSchema2, sectionMutationSuccessSchema2, documentMutationSuccessSchema2, paragraphMutationTargetSchema2, paragraphMutationSuccessSchema2, createSectionBreakSuccessSchema2, capabilityReasonsSchema2, capabilityFlagSchema2, operationRuntimeCapabilitySchema2, operationCapabilitiesSchema2, inlinePropertyCapabilitySchema2, formatCapabilitiesSchema2, planEngineCapabilitiesSchema2, nullableTableBorderSpecSchema2, sdFragmentSchema2, placementSchema2, nestingPolicySchema2, tableCreateLocationSchema2, formatInlineAliasOperationSchemas2, tocMutationFailureSchema2, tocMutationSuccessSchema2, tocEntryMutationFailureSchema2, tocEntryMutationSuccessSchema2, hyperlinkTargetSchema2, hyperlinkReadPropertiesSchema2, hyperlinkSpecSchema2, hyperlinkPatchSchema2, hyperlinkDomainSchema2, hyperlinkMutationSuccessSchema2, hyperlinkMutationFailureSchema2, contentControlTargetSchema2, contentControlMutationSuccessSchema2, contentControlMutationFailureSchema2, ccListResultSchema2, ccInfoSchema2, refFailureSchema2, bookmarkAddressSchema2, bookmarkMutation2, footnoteAddressSchema2, footnoteConfigScopeSchema2, footnoteNumberingSchema2, footnoteMutation2, footnoteConfig2, crossRefAddressSchema2, crossRefTargetSchema2, crossRefDisplaySchema2, crossRefMutation2, indexAddressSchema2, indexEntryAddressSchema2, indexConfigSchema2, indexEntryDataSchema2, indexEntryPatchSchema2, indexMutation2, indexEntryMutation2, captionAddressSchema2, captionMutation2, captionConfig2, fieldAddressSchema2, fieldMutation2, citationAddressSchema2, citationSourceAddressSchema2, bibliographyAddressSchema2, citationMutation2, citationSourceMutation2, bibliographyMutation2, citationPersonSchema2, citationSourceFieldsSchema2, tocCreateLocationSchema2, authoritiesAddressSchema2, authorityEntryAddressSchema2, authoritiesConfigSchema2, authorityEntryDataSchema2, authorityEntryPatchSchema2, authoritiesMutation2, authorityEntryMutation2, diffCoverageSchema2, diffSummarySchema2, diffSnapshotSchema2, diffPayloadSchema2, GROUP_METADATA2, STEP_OP_CATALOG_UNFROZEN2, PUBLIC_STEP_OP_CATALOG_UNFROZEN2, PUBLIC_MUTATION_STEP_OP_IDS2, PUBLIC_MUTATION_STEP_OP_SET2, CAPABILITY_REASON_CODES, VALID_EDGE_VALUES2, VALID_EDGE_NODE_TYPES2, VALID_DOCUMENT_EDGES2, VALID_REF_BOUNDARIES2, VALID_ANCHOR_KINDS2, RESOLVE_RANGE_ALLOWED_KEYS2, CREATE_COMMENT_ALLOWED_KEYS2, PATCH_COMMENT_ALLOWED_KEYS2, STYLE_APPLY_INPUT_ALLOWED_KEYS2, INLINE_ALIAS_INPUT_ALLOWED_KEYS2, DELETE_INPUT_ALLOWED_KEYS2, VALID_BEHAVIORS2, CONTENT_KIND_SET2, INLINE_KIND_SET2, LEGACY_TOP_LEVEL_TYPES2, TEXT_INSERT_ALLOWED_KEYS2, STRUCTURAL_INSERT_ALLOWED_KEYS2, VALID_INSERT_TYPES2, LIST_KINDS2, LIST_INSERT_POSITIONS2, JOIN_DIRECTIONS2, MUTATION_SCOPES2, LEVEL_ALIGNMENTS2, TRAILING_CHARACTERS2, LIST_PRESET_IDS2, VALID_BLOCK_NODE_TYPES$1, VALID_LIST_KINDS2, VALID_INSERT_POSITIONS2, VALID_JOIN_DIRECTIONS2, VALID_MUTATION_SCOPES2, VALID_LEVEL_ALIGNMENTS2, VALID_TRAILING_CHARACTERS2, VALID_LIST_PRESETS2, VALID_CONTINUITY_VALUES2, VALID_SEQUENCE_MODES2, VALID_LIST_CREATE_MODES2, TEXT_REPLACE_ALLOWED_KEYS2, STRUCTURAL_REPLACE_ALLOWED_KEYS2, VALID_HEADING_LEVELS2, SECTION_BREAK_TYPES$1, SUPPORTED_DELETE_NODE_TYPES2, REJECTED_DELETE_NODE_TYPES2, VALID_BLOCK_NODE_TYPES3, SNAPSHOT_VERSION2 = "sd-diff-snapshot/v1", PAYLOAD_VERSION2 = "sd-diff-payload/v1", VALID_STYLE_OPTION_FLAGS2, TABLE_BORDER_COLOR_PATTERN2, VALID_APPLY_TO_VALUES2, VALID_BORDER_EDGE_KEYS2, HEADER_FOOTER_KINDS$1, HEADER_FOOTER_VARIANTS$1, DEFAULT_SECTIONS_LIST_LIMIT2 = 250, SECTION_BREAK_TYPES3, SECTION_ORIENTATIONS2, SECTION_VERTICAL_ALIGNS2, SECTION_DIRECTIONS2, HEADER_FOOTER_KINDS3, HEADER_FOOTER_VARIANTS3, LINE_NUMBER_RESTARTS2, PAGE_NUMBER_FORMATS2, PAGE_BORDER_DISPLAYS2, PAGE_BORDER_OFFSET_FROM_VALUES2, PAGE_BORDER_Z_ORDER_VALUES2, VALID_WRAP_TYPES2, VALID_WRAP_SIDES2, VALID_IMAGE_SIZE_UNITS2, VALID_TOC_UPDATE_MODES2, EDIT_ENTRY_PATCH_ALLOWED_KEYS2, PATCH_FIELDS2, CONTENT_CONTROL_TYPES2, LOCK_MODES2, CONTENT_CONTROL_APPEARANCES2, VALID_NODE_KINDS2, VALID_LOCK_MODES$1, VALID_CC_TYPES2, VALID_CC_APPEARANCES2, VALID_CONTENT_FORMATS2, VALID_RAW_PATCH_OPS2, VALID_SET_MODES2, VALID_CREATE_LOCATION_KINDS2, DEFAULT_PROTECTION_STATE, ADAPTER_GATED_PREFIXES2, _buffers, _defaultCollectionId = null, _nextCollectionId = 1, generateV2HandlerEntity = (handlerName, translator$216) => ({
99074
99667
  handlerName,
99075
99668
  handler: (params3) => {
99076
99669
  const { nodes } = params3;
@@ -113245,7 +113838,7 @@ var isRegExp = (value) => {
113245
113838
  candidate = candidate.prev;
113246
113839
  }
113247
113840
  }
113248
- }, DocumentApiAdapterError, SectionType, DEFAULT_PARAGRAPH_SECTION_TYPE, DEFAULT_BODY_SECTION_TYPE, TWIPS_PER_INCH = 1440, PX_PER_INCH = 96, DEFAULT_COLUMN_GAP_INCHES = 0.5, DEFAULT_HEADER_FOOTER_MARGIN_PX = 0, CommentMarkName = "commentMark", LINK_MARK_NAME = "link", COMMENT_MARK_NAME, SUPPORTED_INLINE_TYPES, FALLBACK_PREFIX, UUID_LIKE_PATTERN, ALIAS_ELIGIBLE_TYPES, cacheByEditor, OBJECT_REPLACEMENT_CHAR = "", LINE_NUMBER_RESTART_VALUES, PAGE_NUMBER_FORMAT_VALUES, SECTION_ORIENTATION_VALUES, SECTION_VERTICAL_ALIGN_VALUES, readSectPrHeaderFooterRefs, PIXELS_PER_INCH = 96, DOCUMENT_RELS_PATH = "word/_rels/document.xml.rels", RELS_XMLNS = "http://schemas.openxmlformats.org/package/2006/relationships", HEADER_RELATIONSHIP_TYPE2 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE2 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", WORDPROCESSINGML_XMLNS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main", OFFICE_DOCUMENT_RELS_XMLNS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships", RELATIONSHIP_ID_PATTERN, HEADER_FILE_PATTERN, FOOTER_FILE_PATTERN, SOURCE_HEADER_FOOTER_LOCAL = "header-footer-sync:local", HEADER_PATTERN, FOOTER_PATTERN, DEFAULT_HDR_FTR_ATTRS, HEADER_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", VALID_VARIANTS, FOOTNOTES_PART_ID = "word/footnotes.xml", ENDNOTES_PART_ID = "word/endnotes.xml", FOOTNOTES_CONFIG, ENDNOTES_CONFIG, NOTES_XMLNS, footnotesPartDescriptor, endnotesPartDescriptor, storeByEditor, cacheByHost, hostStoreSyncedKeys, BODY_LOCATOR, findMarkPosition = (doc$2, pos, markName) => {
113841
+ }, DocumentApiAdapterError, SectionType, DEFAULT_PARAGRAPH_SECTION_TYPE, DEFAULT_BODY_SECTION_TYPE, TWIPS_PER_INCH = 1440, PX_PER_INCH = 96, DEFAULT_COLUMN_GAP_INCHES = 0.5, DEFAULT_HEADER_FOOTER_MARGIN_PX = 0, CommentMarkName = "commentMark", LINK_MARK_NAME = "link", COMMENT_MARK_NAME, SUPPORTED_INLINE_TYPES, FALLBACK_PREFIX, UUID_LIKE_PATTERN, ALIAS_ELIGIBLE_TYPES, cacheByEditor, OBJECT_REPLACEMENT_CHAR = "", LINE_NUMBER_RESTART_VALUES, PAGE_NUMBER_FORMAT_VALUES, SECTION_ORIENTATION_VALUES, SECTION_VERTICAL_ALIGN_VALUES, readSectPrHeaderFooterRefs, PIXELS_PER_INCH = 96, SETTINGS_PART_PATH = "word/settings.xml", VALID_EDIT_MODES, DOCUMENT_RELS_PATH = "word/_rels/document.xml.rels", RELS_XMLNS = "http://schemas.openxmlformats.org/package/2006/relationships", HEADER_RELATIONSHIP_TYPE2 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE2 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", WORDPROCESSINGML_XMLNS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main", OFFICE_DOCUMENT_RELS_XMLNS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships", RELATIONSHIP_ID_PATTERN, HEADER_FILE_PATTERN, FOOTER_FILE_PATTERN, SOURCE_HEADER_FOOTER_LOCAL = "header-footer-sync:local", HEADER_PATTERN, FOOTER_PATTERN, DEFAULT_HDR_FTR_ATTRS, HEADER_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", VALID_VARIANTS, FOOTNOTES_PART_ID = "word/footnotes.xml", ENDNOTES_PART_ID = "word/endnotes.xml", FOOTNOTES_CONFIG, ENDNOTES_CONFIG, NOTES_XMLNS, footnotesPartDescriptor, endnotesPartDescriptor, storeByEditor, cacheByHost, hostStoreSyncedKeys, BODY_LOCATOR, findMarkPosition = (doc$2, pos, markName) => {
113249
113842
  const $pos = doc$2.resolve(pos);
113250
113843
  const parent = $pos.parent;
113251
113844
  const start = parent.childAfter($pos.parentOffset);
@@ -113313,7 +113906,7 @@ var isRegExp = (value) => {
113313
113906
  if (id2)
113314
113907
  return trackedChanges.filter(({ mark }) => mark.attrs.id === id2);
113315
113908
  return trackedChanges;
113316
- }, DERIVED_ID_LENGTH = 24, groupedCache, SDT_NODE_NAMES, SDT_BLOCK_NAME = "structuredContentBlock", VALID_CONTROL_TYPES, VALID_LOCK_MODES2, VALID_APPEARANCES, FIELD_LIKE_SDT_TYPES, liveDocumentCountsCache, SETTINGS_PART_PATH = "word/settings.xml", BIBLIOGRAPHY_NAMESPACE_URI = "http://schemas.openxmlformats.org/officeDocument/2006/bibliography", CUSTOM_XML_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml", CUSTOM_XML_PROPS_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps", DEFAULT_SELECTED_STYLE = "/APA.XSL", DEFAULT_STYLE_NAME = "APA", DEFAULT_VERSION = "6", DEFAULT_XML_DECLARATION, API_TO_OOXML_SOURCE_TYPE, OOXML_TO_API_SOURCE_TYPE, SIMPLE_FIELD_TO_XML_TAG, XML_TAG_TO_SIMPLE_FIELD, import_lib2, FONT_FAMILY_FALLBACKS, DEFAULT_GENERIC_FALLBACK = "sans-serif", DEFAULT_FONT_SIZE_PT = 10, CURRENT_APP_VERSION = "1.23.0", collectRunDefaultProperties = (runProps, { allowOverrideTypeface = true, allowOverrideSize = true, themeResolver, state }) => {
113909
+ }, DERIVED_ID_LENGTH = 24, groupedCache, SDT_NODE_NAMES, SDT_BLOCK_NAME = "structuredContentBlock", VALID_CONTROL_TYPES, VALID_LOCK_MODES2, VALID_APPEARANCES, FIELD_LIKE_SDT_TYPES, liveDocumentCountsCache, BIBLIOGRAPHY_NAMESPACE_URI = "http://schemas.openxmlformats.org/officeDocument/2006/bibliography", CUSTOM_XML_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml", CUSTOM_XML_PROPS_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps", DEFAULT_SELECTED_STYLE = "/APA.XSL", DEFAULT_STYLE_NAME = "APA", DEFAULT_VERSION = "6", DEFAULT_XML_DECLARATION, API_TO_OOXML_SOURCE_TYPE, OOXML_TO_API_SOURCE_TYPE, SIMPLE_FIELD_TO_XML_TAG, XML_TAG_TO_SIMPLE_FIELD, import_lib2, FONT_FAMILY_FALLBACKS, DEFAULT_GENERIC_FALLBACK = "sans-serif", DEFAULT_FONT_SIZE_PT = 10, CURRENT_APP_VERSION = "1.23.0", collectRunDefaultProperties = (runProps, { allowOverrideTypeface = true, allowOverrideSize = true, themeResolver, state }) => {
113317
113910
  if (!runProps?.elements?.length || !state)
113318
113911
  return;
113319
113912
  const fontsNode = runProps.elements.find((el) => el.name === "w:rFonts");
@@ -113347,7 +113940,7 @@ var isRegExp = (value) => {
113347
113940
  state.kern = kernNode.attributes["w:val"];
113348
113941
  }
113349
113942
  }, SuperConverter;
113350
- var init_SuperConverter_OPfy6vj2_es = __esm(() => {
113943
+ var init_SuperConverter_CMIR0kxi_es = __esm(() => {
113351
113944
  init_rolldown_runtime_B2q5OVn9_es();
113352
113945
  init_jszip_ChlR43oI_es();
113353
113946
  init_xml_js_40FWvL78_es();
@@ -116349,6 +116942,15 @@ var init_SuperConverter_OPfy6vj2_es = __esm(() => {
116349
116942
  "INVALID_INPUT",
116350
116943
  "CAPABILITY_UNAVAILABLE"
116351
116944
  ];
116945
+ T_PROTECTION_READ2 = ["CAPABILITY_UNAVAILABLE"];
116946
+ T_PROTECTION_MUTATION2 = ["INVALID_INPUT", "CAPABILITY_UNAVAILABLE"];
116947
+ T_PERM_RANGE_READ2 = ["TARGET_NOT_FOUND", "CAPABILITY_UNAVAILABLE"];
116948
+ T_PERM_RANGE_MUTATION2 = [
116949
+ "TARGET_NOT_FOUND",
116950
+ "INVALID_TARGET",
116951
+ "INVALID_INPUT",
116952
+ "CAPABILITY_UNAVAILABLE"
116953
+ ];
116352
116954
  FORMAT_INLINE_ALIAS_OPERATION_DEFINITIONS2 = Object.fromEntries(INLINE_PROPERTY_REGISTRY2.map((entry) => {
116353
116955
  const operationId = `format.${entry.key}`;
116354
116956
  return [operationId, {
@@ -121580,6 +122182,116 @@ var init_SuperConverter_OPfy6vj2_es = __esm(() => {
121580
122182
  referenceDocPath: "diff/apply.mdx",
121581
122183
  referenceGroup: "diff",
121582
122184
  skipAsATool: true
122185
+ },
122186
+ "protection.get": {
122187
+ memberPath: "protection.get",
122188
+ description: "Read the current document protection state including editing restrictions, write protection, and read-only recommendation.",
122189
+ expectedResult: "Returns a DocumentProtectionState with editingRestriction, writeProtection, and readOnlyRecommended fields.",
122190
+ requiresDocumentContext: true,
122191
+ metadata: readOperation2({ throws: T_PROTECTION_READ2 }),
122192
+ referenceDocPath: "protection/get.mdx",
122193
+ referenceGroup: "protection",
122194
+ skipAsATool: true
122195
+ },
122196
+ "protection.setEditingRestriction": {
122197
+ memberPath: "protection.setEditingRestriction",
122198
+ description: "Enable Word-style editing restriction on the document. Only readOnly mode is supported in v1.",
122199
+ expectedResult: "Returns a ProtectionMutationResult with the updated protection state on success.",
122200
+ requiresDocumentContext: true,
122201
+ metadata: mutationOperation2({
122202
+ idempotency: "idempotent",
122203
+ supportsDryRun: true,
122204
+ supportsTrackedMode: false,
122205
+ possibleFailureCodes: ["NO_OP"],
122206
+ throws: T_PROTECTION_MUTATION2
122207
+ }),
122208
+ referenceDocPath: "protection/set-editing-restriction.mdx",
122209
+ referenceGroup: "protection",
122210
+ skipAsATool: true
122211
+ },
122212
+ "protection.clearEditingRestriction": {
122213
+ memberPath: "protection.clearEditingRestriction",
122214
+ description: "Disable document-level editing restriction by setting enforcement to off. Preserves the protection element and its metadata for round-trip fidelity.",
122215
+ expectedResult: "Returns a ProtectionMutationResult with the updated protection state on success.",
122216
+ requiresDocumentContext: true,
122217
+ metadata: mutationOperation2({
122218
+ idempotency: "idempotent",
122219
+ supportsDryRun: true,
122220
+ supportsTrackedMode: false,
122221
+ possibleFailureCodes: ["NO_OP"],
122222
+ throws: T_PROTECTION_MUTATION2
122223
+ }),
122224
+ referenceDocPath: "protection/clear-editing-restriction.mdx",
122225
+ referenceGroup: "protection",
122226
+ skipAsATool: true
122227
+ },
122228
+ "permissionRanges.list": {
122229
+ memberPath: "permissionRanges.list",
122230
+ description: "List all permission ranges in the document. Returns only complete paired ranges (both start and end markers present).",
122231
+ expectedResult: "Returns a PermissionRangesListResult containing discovered permission ranges with principal and position data.",
122232
+ requiresDocumentContext: true,
122233
+ metadata: readOperation2({ throws: T_PERM_RANGE_READ2 }),
122234
+ referenceDocPath: "permission-ranges/list.mdx",
122235
+ referenceGroup: "permissionRanges",
122236
+ skipAsATool: true
122237
+ },
122238
+ "permissionRanges.get": {
122239
+ memberPath: "permissionRanges.get",
122240
+ description: "Get detailed information about a specific permission range by ID.",
122241
+ expectedResult: "Returns a PermissionRangeInfo object with the range principal, kind, and positions.",
122242
+ requiresDocumentContext: true,
122243
+ metadata: readOperation2({ throws: T_PERM_RANGE_READ2 }),
122244
+ referenceDocPath: "permission-ranges/get.mdx",
122245
+ referenceGroup: "permissionRanges",
122246
+ skipAsATool: true
122247
+ },
122248
+ "permissionRanges.create": {
122249
+ memberPath: "permissionRanges.create",
122250
+ description: "Create a permission range exception region in the document. Inserts matched permStart/permEnd markers at the target.",
122251
+ expectedResult: "Returns a PermissionRangeMutationResult with the created range info on success.",
122252
+ requiresDocumentContext: true,
122253
+ metadata: mutationOperation2({
122254
+ idempotency: "non-idempotent",
122255
+ supportsDryRun: true,
122256
+ supportsTrackedMode: false,
122257
+ possibleFailureCodes: NONE_FAILURES2,
122258
+ throws: T_PERM_RANGE_MUTATION2
122259
+ }),
122260
+ referenceDocPath: "permission-ranges/create.mdx",
122261
+ referenceGroup: "permissionRanges",
122262
+ skipAsATool: true
122263
+ },
122264
+ "permissionRanges.remove": {
122265
+ memberPath: "permissionRanges.remove",
122266
+ description: "Remove a permission range by ID. Removes whichever markers exist for the given ID (start, end, or both).",
122267
+ expectedResult: "Returns a PermissionRangeRemoveResult indicating success or a failure.",
122268
+ requiresDocumentContext: true,
122269
+ metadata: mutationOperation2({
122270
+ idempotency: "idempotent",
122271
+ supportsDryRun: true,
122272
+ supportsTrackedMode: false,
122273
+ possibleFailureCodes: NONE_FAILURES2,
122274
+ throws: T_PERM_RANGE_MUTATION2
122275
+ }),
122276
+ referenceDocPath: "permission-ranges/remove.mdx",
122277
+ referenceGroup: "permissionRanges",
122278
+ skipAsATool: true
122279
+ },
122280
+ "permissionRanges.updatePrincipal": {
122281
+ memberPath: "permissionRanges.updatePrincipal",
122282
+ description: "Change which principal is allowed to edit a permission range. Updates the principal fields on the start marker.",
122283
+ expectedResult: "Returns a PermissionRangeMutationResult with the updated range info on success.",
122284
+ requiresDocumentContext: true,
122285
+ metadata: mutationOperation2({
122286
+ idempotency: "idempotent",
122287
+ supportsDryRun: true,
122288
+ supportsTrackedMode: false,
122289
+ possibleFailureCodes: NONE_FAILURES2,
122290
+ throws: T_PERM_RANGE_MUTATION2
122291
+ }),
122292
+ referenceDocPath: "permission-ranges/update-principal.mdx",
122293
+ referenceGroup: "permissionRanges",
122294
+ skipAsATool: true
121583
122295
  }
121584
122296
  };
121585
122297
  OPERATION_IDS2 = Object.freeze(Object.keys(OPERATION_DEFINITIONS2));
@@ -127226,7 +127938,64 @@ var init_SuperConverter_OPfy6vj2_es = __esm(() => {
127226
127938
  }, ["at", "entry"]), { ...authorityEntryMutation2 }, objectSchema2({
127227
127939
  target: authorityEntryAddressSchema2,
127228
127940
  patch: authorityEntryPatchSchema2
127229
- }, ["target", "patch"]), { ...authorityEntryMutation2 }, objectSchema2({ target: authorityEntryAddressSchema2 }, ["target"]), { ...authorityEntryMutation2 }, objectSchema2({}), objectSchema2({ targetSnapshot: diffSnapshotSchema2 }, ["targetSnapshot"]), objectSchema2({ diff: diffPayloadSchema2 }, ["diff"]);
127941
+ }, ["target", "patch"]), { ...authorityEntryMutation2 }, objectSchema2({ target: authorityEntryAddressSchema2 }, ["target"]), { ...authorityEntryMutation2 }, objectSchema2({}), objectSchema2({ targetSnapshot: diffSnapshotSchema2 }, ["targetSnapshot"]), objectSchema2({ diff: diffPayloadSchema2 }, ["diff"]), objectSchema2({}), objectSchema2({
127942
+ editingRestriction: objectSchema2({
127943
+ mode: {
127944
+ type: "string",
127945
+ enum: [
127946
+ "none",
127947
+ "readOnly",
127948
+ "comments",
127949
+ "trackedChanges",
127950
+ "forms"
127951
+ ]
127952
+ },
127953
+ enforced: { type: "boolean" },
127954
+ runtimeEnforced: { type: "boolean" },
127955
+ passwordProtected: { type: "boolean" },
127956
+ formattingRestricted: { type: "boolean" }
127957
+ }, [
127958
+ "mode",
127959
+ "enforced",
127960
+ "runtimeEnforced",
127961
+ "passwordProtected",
127962
+ "formattingRestricted"
127963
+ ]),
127964
+ writeProtection: objectSchema2({
127965
+ enabled: { type: "boolean" },
127966
+ passwordProtected: { type: "boolean" }
127967
+ }, ["enabled", "passwordProtected"]),
127968
+ readOnlyRecommended: { type: "boolean" }
127969
+ }, [
127970
+ "editingRestriction",
127971
+ "writeProtection",
127972
+ "readOnlyRecommended"
127973
+ ]), objectSchema2({
127974
+ mode: {
127975
+ type: "string",
127976
+ enum: ["readOnly"]
127977
+ },
127978
+ formattingRestricted: { type: "boolean" }
127979
+ }, ["mode"]), objectSchema2({}), objectSchema2({ id: { type: "string" } }, ["id"]), objectSchema2({
127980
+ target: selectionTargetSchema2,
127981
+ principal: objectSchema2({
127982
+ kind: {
127983
+ type: "string",
127984
+ enum: ["everyone", "editor"]
127985
+ },
127986
+ id: { type: "string" }
127987
+ }, ["kind"]),
127988
+ id: { type: "string" }
127989
+ }, ["target", "principal"]), objectSchema2({ id: { type: "string" } }, ["id"]), objectSchema2({
127990
+ id: { type: "string" },
127991
+ principal: objectSchema2({
127992
+ kind: {
127993
+ type: "string",
127994
+ enum: ["everyone", "editor"]
127995
+ },
127996
+ id: { type: "string" }
127997
+ }, ["kind"])
127998
+ }, ["id", "principal"]);
127230
127999
  projectFromDefinitions2((_id, entry) => entry.memberPath);
127231
128000
  [...new Set(OPERATION_IDS2.map((id2) => OPERATION_DEFINITIONS2[id2].memberPath))];
127232
128001
  projectFromDefinitions2((_id, entry) => entry.referenceDocPath);
@@ -127385,6 +128154,16 @@ var init_SuperConverter_OPfy6vj2_es = __esm(() => {
127385
128154
  title: "Diff",
127386
128155
  description: "Snapshot-based document comparison and replay.",
127387
128156
  pagePath: "diff/index.mdx"
128157
+ },
128158
+ protection: {
128159
+ title: "Protection",
128160
+ description: "Document-level protection state and editing restriction operations.",
128161
+ pagePath: "protection/index.mdx"
128162
+ },
128163
+ permissionRanges: {
128164
+ title: "Permission Ranges",
128165
+ description: "Permission range exception operations for protected documents.",
128166
+ pagePath: "permission-ranges/index.mdx"
127388
128167
  }
127389
128168
  };
127390
128169
  Object.keys(GROUP_METADATA2).map((key) => ({
@@ -127743,12 +128522,27 @@ var init_SuperConverter_OPfy6vj2_es = __esm(() => {
127743
128522
  "setAttr",
127744
128523
  "removeAttr"
127745
128524
  ]);
128525
+ VALID_SET_MODES2 = new Set(["readOnly"]);
127746
128526
  VALID_CREATE_LOCATION_KINDS2 = new Set([
127747
128527
  "documentStart",
127748
128528
  "documentEnd",
127749
128529
  "before",
127750
128530
  "after"
127751
128531
  ]);
128532
+ DEFAULT_PROTECTION_STATE = {
128533
+ editingRestriction: {
128534
+ mode: "none",
128535
+ enforced: false,
128536
+ runtimeEnforced: false,
128537
+ passwordProtected: false,
128538
+ formattingRestricted: false
128539
+ },
128540
+ writeProtection: {
128541
+ enabled: false,
128542
+ passwordProtected: false
128543
+ },
128544
+ readOnlyRecommended: false
128545
+ };
127752
128546
  ADAPTER_GATED_PREFIXES2 = [
127753
128547
  "bookmarks",
127754
128548
  "footnotes",
@@ -148926,6 +149720,12 @@ var init_SuperConverter_OPfy6vj2_es = __esm(() => {
148926
149720
  "both"
148927
149721
  ];
148928
149722
  readSectPrHeaderFooterRefs = readSectPrRefsByKind;
149723
+ VALID_EDIT_MODES = new Set([
149724
+ "readOnly",
149725
+ "comments",
149726
+ "trackedChanges",
149727
+ "forms"
149728
+ ]);
148929
149729
  RELATIONSHIP_ID_PATTERN = /^rId(\d+)$/;
148930
149730
  HEADER_FILE_PATTERN = /^word\/header(\d+)\.xml$/;
148931
149731
  FOOTER_FILE_PATTERN = /^word\/footer(\d+)\.xml$/;
@@ -171649,7 +172449,7 @@ var init_remark_gfm_CjV8kaUy_es = __esm(() => {
171649
172449
  init_remark_gfm_z_sDF4ss_es();
171650
172450
  });
171651
172451
 
171652
- // ../../packages/superdoc/dist/chunks/src-C1tSJ0Z5.es.js
172452
+ // ../../packages/superdoc/dist/chunks/src-sOP3agXO.es.js
171653
172453
  function deleteProps(obj, propOrProps) {
171654
172454
  const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps;
171655
172455
  const removeNested = (target, pathParts, index2 = 0) => {
@@ -173676,11 +174476,11 @@ function syncSplitParagraphRunProperties(attrs, runProperties) {
173676
174476
  paragraphProperties: nextParagraphProperties
173677
174477
  };
173678
174478
  }
173679
- function getConverter$52(editor) {
174479
+ function getConverter$62(editor) {
173680
174480
  return editor.converter;
173681
174481
  }
173682
174482
  function readTranslatedLinkedStyles(editor) {
173683
- return getConverter$52(editor)?.translatedLinkedStyles ?? null;
174483
+ return getConverter$62(editor)?.translatedLinkedStyles ?? null;
173684
174484
  }
173685
174485
  function isHeadingStyleId$1(styleId) {
173686
174486
  return typeof styleId === "string" && /^heading\s*[1-6]$/i.test(styleId.trim());
@@ -207526,7 +208326,7 @@ function tablesSetDefaultStyleAdapter(editor, input2, options) {
207526
208326
  throw new DocumentApiAdapterError("INVALID_INPUT", `tables.setDefaultStyle: "${input2.styleId}" is not a known table style.`);
207527
208327
  return mutatePart({
207528
208328
  editor,
207529
- partId: SETTINGS_PART,
208329
+ partId: SETTINGS_PART$1,
207530
208330
  operation: "mutate",
207531
208331
  source: "tables.setDefaultStyle",
207532
208332
  dryRun: options?.dryRun === true,
@@ -207548,7 +208348,7 @@ function tablesClearDefaultStyleAdapter(editor, _input, options) {
207548
208348
  throw new DocumentApiAdapterError("CAPABILITY_UNAVAILABLE", "tables.clearDefaultStyle requires an active document converter.");
207549
208349
  return mutatePart({
207550
208350
  editor,
207551
- partId: SETTINGS_PART,
208351
+ partId: SETTINGS_PART$1,
207552
208352
  operation: "mutate",
207553
208353
  source: "tables.clearDefaultStyle",
207554
208354
  dryRun: options?.dryRun === true,
@@ -207968,10 +208768,10 @@ function registerBuiltInExecutors() {
207968
208768
  };
207969
208769
  } });
207970
208770
  }
207971
- function getConverter$42(editor) {
208771
+ function getConverter$52(editor) {
207972
208772
  return editor.converter;
207973
208773
  }
207974
- function getConverter$32(editor) {
208774
+ function getConverter$42(editor) {
207975
208775
  return editor.converter;
207976
208776
  }
207977
208777
  function createEmptyHeaderFooterJson() {
@@ -207984,7 +208784,7 @@ function createEmptyHeaderFooterJson() {
207984
208784
  };
207985
208785
  }
207986
208786
  function syncHeaderFooterCaches(editor, part) {
207987
- const converter = getConverter$32(editor);
208787
+ const converter = getConverter$42(editor);
207988
208788
  if (!converter)
207989
208789
  return;
207990
208790
  const relsRoot = part?.elements?.find((el) => el.name === "Relationships");
@@ -208046,7 +208846,7 @@ function createTableWrapper(editor, input2, options) {
208046
208846
  });
208047
208847
  return adapterResult;
208048
208848
  }
208049
- function getConverter$22(editor) {
208849
+ function getConverter$32(editor) {
208050
208850
  return editor.converter;
208051
208851
  }
208052
208852
  function toSectionFailure2(code7, message) {
@@ -208114,7 +208914,7 @@ function buildSectionMarginsForAttrs2(sectPr) {
208114
208914
  };
208115
208915
  }
208116
208916
  function syncConverterBodySection2(editor, sectPr) {
208117
- const converter = getConverter$22(editor);
208917
+ const converter = getConverter$32(editor);
208118
208918
  if (!converter)
208119
208919
  return;
208120
208920
  converter.bodySectPr = cloneXmlElement(sectPr);
@@ -208234,7 +209034,7 @@ function createSectionBreakNode(editor, breakParagraphId, input2) {
208234
209034
  return paragraphNode;
208235
209035
  }
208236
209036
  function updateGlobalTitlePageFlag(editor) {
208237
- const converter = getConverter$22(editor);
209037
+ const converter = getConverter$32(editor);
208238
209038
  if (!converter)
208239
209039
  return;
208240
209040
  const anyTitlePage = resolveSectionProjections(editor).some((entry) => entry.domain.titlePage === true);
@@ -208318,7 +209118,7 @@ function sectionsSetTitlePageAdapter(editor, input2, options) {
208318
209118
  }
208319
209119
  function sectionsSetOddEvenHeadersFootersAdapter(editor, input2, options) {
208320
209120
  rejectTrackedMode("sections.setOddEvenHeadersFooters", options);
208321
- const converter = getConverter$22(editor);
209121
+ const converter = getConverter$32(editor);
208322
209122
  if (!converter)
208323
209123
  throw new DocumentApiAdapterError("CAPABILITY_UNAVAILABLE", "sections.setOddEvenHeadersFooters requires an active document converter.");
208324
209124
  return mutatePart({
@@ -208354,13 +209154,13 @@ function sectionsSetSectionDirectionAdapter(editor, input2, options) {
208354
209154
  }
208355
209155
  function sectionsSetHeaderFooterRefAdapter(editor, input2, options) {
208356
209156
  return sectionMutationBySectPr$1(editor, input2, options, "sections.setHeaderFooterRef", (sectPr, _projection, _sections, dryRun) => {
208357
- const converter = getConverter$22(editor) ?? null;
209157
+ const converter = getConverter$32(editor) ?? null;
208358
209158
  return setHeaderFooterRefMutation(sectPr, input2.kind, input2.variant, input2.refId, converter, "sections.setHeaderFooterRef", dryRun);
208359
209159
  });
208360
209160
  }
208361
209161
  function sectionsClearHeaderFooterRefAdapter(editor, input2, options) {
208362
209162
  return sectionMutationBySectPr$1(editor, input2, options, "sections.clearHeaderFooterRef", (sectPr, _projection, _sections, dryRun) => {
208363
- const converter = getConverter$22(editor) ?? null;
209163
+ const converter = getConverter$32(editor) ?? null;
208364
209164
  clearHeaderFooterRefMutation(sectPr, input2.kind, input2.variant, converter, dryRun);
208365
209165
  });
208366
209166
  }
@@ -212798,11 +213598,11 @@ function createContentControlsAdapter(editor) {
212798
213598
  create: (input2, options) => createWrapper(editor, input2, options)
212799
213599
  };
212800
213600
  }
212801
- function getConverter$12(editor) {
213601
+ function getConverter$22(editor) {
212802
213602
  return editor.converter;
212803
213603
  }
212804
- function requireConverter(editor, operationName) {
212805
- const converter = getConverter$12(editor);
213604
+ function requireConverter$1(editor, operationName) {
213605
+ const converter = getConverter$22(editor);
212806
213606
  if (!converter)
212807
213607
  throw new DocumentApiAdapterError("CAPABILITY_UNAVAILABLE", `${operationName} requires an active document converter.`);
212808
213608
  return converter;
@@ -212908,7 +213708,7 @@ function headerFootersResolveAdapter(editor, input2) {
212908
213708
  function headerFootersRefsSetAdapter(editor, input2, options) {
212909
213709
  const { section, headerFooterKind, variant } = input2.target;
212910
213710
  const result = sectionMutationBySectPr(editor, { target: section }, options, "headerFooters.refs.set", (sectPr, _projection, _sections, dryRun) => {
212911
- const converter = getConverter$12(editor) ?? null;
213711
+ const converter = getConverter$22(editor) ?? null;
212912
213712
  return setHeaderFooterRefMutation(sectPr, headerFooterKind, variant, input2.refId, converter, "headerFooters.refs.set", dryRun);
212913
213713
  });
212914
213714
  invalidateSlotRuntimesAfterRefChange(editor, result, options);
@@ -212917,7 +213717,7 @@ function headerFootersRefsSetAdapter(editor, input2, options) {
212917
213717
  function headerFootersRefsClearAdapter(editor, input2, options) {
212918
213718
  const { section, headerFooterKind, variant } = input2.target;
212919
213719
  const result = sectionMutationBySectPr(editor, { target: section }, options, "headerFooters.refs.clear", (sectPr, _projection, _sections, dryRun) => {
212920
- clearHeaderFooterRefMutation(sectPr, headerFooterKind, variant, getConverter$12(editor) ?? null, dryRun);
213720
+ clearHeaderFooterRefMutation(sectPr, headerFooterKind, variant, getConverter$22(editor) ?? null, dryRun);
212921
213721
  });
212922
213722
  invalidateSlotRuntimesAfterRefChange(editor, result, options);
212923
213723
  return result;
@@ -212965,7 +213765,7 @@ function extractPartIndex(kind, partPath) {
212965
213765
  return Number.isFinite(num) ? num : null;
212966
213766
  }
212967
213767
  function headerFootersPartsListAdapter(editor, query2) {
212968
- const converter = requireConverter(editor, "headerFooters.parts.list");
213768
+ const converter = requireConverter$1(editor, "headerFooters.parts.list");
212969
213769
  validatePaginationInput(query2?.offset, query2?.limit);
212970
213770
  const relationships = readRelationshipElements(converter);
212971
213771
  const sections = resolveSectionProjections(editor);
@@ -213053,7 +213853,7 @@ function toPartsMutationFailure(code7, message) {
213053
213853
  function headerFootersPartsCreateAdapter(editor, input2, options) {
213054
213854
  rejectTrackedMode("headerFooters.parts.create", options);
213055
213855
  checkRevision(editor, options?.expectedRevision);
213056
- const converter = requireConverter(editor, "headerFooters.parts.create");
213856
+ const converter = requireConverter$1(editor, "headerFooters.parts.create");
213057
213857
  if (input2.sourceRefId) {
213058
213858
  const sourceRel = readRelationshipElements(converter).find((rel) => String(rel.attributes?.Id ?? "") === input2.sourceRefId);
213059
213859
  if (!sourceRel)
@@ -213086,7 +213886,7 @@ function headerFootersPartsCreateAdapter(editor, input2, options) {
213086
213886
  function headerFootersPartsDeleteAdapter(editor, input2, options) {
213087
213887
  rejectTrackedMode("headerFooters.parts.delete", options);
213088
213888
  checkRevision(editor, options?.expectedRevision);
213089
- const converter = requireConverter(editor, "headerFooters.parts.delete");
213889
+ const converter = requireConverter$1(editor, "headerFooters.parts.delete");
213090
213890
  const refId = input2.target.refId;
213091
213891
  const targetRel = readRelationshipElements(converter).find((rel) => String(rel.attributes?.Id ?? "") === refId);
213092
213892
  if (!targetRel)
@@ -213411,6 +214211,402 @@ function bookmarksRemoveWrapper(editor, input2, options) {
213411
214211
  return bookmarkFailure("NO_OP", "Remove operation produced no change.");
213412
214212
  return bookmarkSuccess(address2);
213413
214213
  }
214214
+ function getConverter$12(editor) {
214215
+ return editor.converter ?? undefined;
214216
+ }
214217
+ function requireConverter(editor, operationName) {
214218
+ const converter = getConverter$12(editor);
214219
+ if (!converter)
214220
+ throw new DocumentApiAdapterError("CAPABILITY_UNAVAILABLE", `${operationName} requires an active document converter.`);
214221
+ return converter;
214222
+ }
214223
+ function buildPreviewState(current, editingRestriction) {
214224
+ const { mode, enforced } = editingRestriction;
214225
+ return {
214226
+ editingRestriction: {
214227
+ mode,
214228
+ enforced,
214229
+ runtimeEnforced: mode === "readOnly" && enforced,
214230
+ passwordProtected: current.editingRestriction.passwordProtected,
214231
+ formattingRestricted: editingRestriction.formattingRestricted
214232
+ },
214233
+ writeProtection: current.writeProtection,
214234
+ readOnlyRecommended: current.readOnlyRecommended
214235
+ };
214236
+ }
214237
+ function protectionGetAdapter(editor) {
214238
+ const stored = getProtectionStorage(editor);
214239
+ if (stored?.initialized)
214240
+ return stored.state;
214241
+ const converter = getConverter$12(editor);
214242
+ return parseProtectionState(converter ? readSettingsRoot(converter) : null);
214243
+ }
214244
+ function protectionSetEditingRestrictionAdapter(editor, input2, options) {
214245
+ rejectTrackedMode("protection.setEditingRestriction", options);
214246
+ const converter = requireConverter(editor, "protection.setEditingRestriction");
214247
+ const result = mutatePart({
214248
+ editor,
214249
+ partId: SETTINGS_PART,
214250
+ operation: "mutate",
214251
+ source: "protection.setEditingRestriction",
214252
+ dryRun: options?.dryRun === true,
214253
+ expectedRevision: options?.expectedRevision,
214254
+ mutate({ part, dryRun: isDryRun }) {
214255
+ const currentState = parseProtectionState(readSettingsRoot(converter));
214256
+ const { editingRestriction } = currentState;
214257
+ if (editingRestriction.mode === input2.mode && editingRestriction.enforced === true && (input2.formattingRestricted === undefined || editingRestriction.formattingRestricted === input2.formattingRestricted))
214258
+ return {
214259
+ success: false,
214260
+ failure: {
214261
+ code: "NO_OP",
214262
+ message: "Editing restriction already matches the requested state."
214263
+ }
214264
+ };
214265
+ if (isDryRun)
214266
+ return {
214267
+ success: true,
214268
+ state: buildPreviewState(currentState, {
214269
+ mode: input2.mode,
214270
+ enforced: true,
214271
+ formattingRestricted: input2.formattingRestricted ?? currentState.editingRestriction.formattingRestricted
214272
+ })
214273
+ };
214274
+ const settingsRoot = ensureSettingsRoot(part);
214275
+ setDocumentProtection(settingsRoot, {
214276
+ mode: input2.mode,
214277
+ enforced: true,
214278
+ formattingRestricted: input2.formattingRestricted
214279
+ });
214280
+ const newState = parseProtectionState(settingsRoot);
214281
+ const protStorage = getProtectionStorage(editor);
214282
+ if (protStorage)
214283
+ protStorage.state = newState;
214284
+ editor.emit("protectionChanged", {
214285
+ editor,
214286
+ state: newState,
214287
+ source: "local-mutation"
214288
+ });
214289
+ return {
214290
+ success: true,
214291
+ state: newState
214292
+ };
214293
+ }
214294
+ });
214295
+ if (options?.dryRun !== true)
214296
+ applyEffectiveEditability(editor);
214297
+ return result.result;
214298
+ }
214299
+ function protectionClearEditingRestrictionAdapter(editor, _input, options) {
214300
+ rejectTrackedMode("protection.clearEditingRestriction", options);
214301
+ const converter = requireConverter(editor, "protection.clearEditingRestriction");
214302
+ const result = mutatePart({
214303
+ editor,
214304
+ partId: SETTINGS_PART,
214305
+ operation: "mutate",
214306
+ source: "protection.clearEditingRestriction",
214307
+ dryRun: options?.dryRun === true,
214308
+ expectedRevision: options?.expectedRevision,
214309
+ mutate({ part, dryRun: isDryRun }) {
214310
+ const currentState = parseProtectionState(readSettingsRoot(converter));
214311
+ if (!currentState.editingRestriction.enforced)
214312
+ return {
214313
+ success: false,
214314
+ failure: {
214315
+ code: "NO_OP",
214316
+ message: "Editing restriction is already not enforced."
214317
+ }
214318
+ };
214319
+ if (isDryRun)
214320
+ return {
214321
+ success: true,
214322
+ state: buildPreviewState(currentState, {
214323
+ mode: currentState.editingRestriction.mode,
214324
+ enforced: false,
214325
+ formattingRestricted: currentState.editingRestriction.formattingRestricted
214326
+ })
214327
+ };
214328
+ const settingsRoot = ensureSettingsRoot(part);
214329
+ clearDocumentProtectionEnforcement(settingsRoot);
214330
+ const newState = parseProtectionState(settingsRoot);
214331
+ const protStorage = getProtectionStorage(editor);
214332
+ if (protStorage)
214333
+ protStorage.state = newState;
214334
+ editor.emit("protectionChanged", {
214335
+ editor,
214336
+ state: newState,
214337
+ source: "local-mutation"
214338
+ });
214339
+ return {
214340
+ success: true,
214341
+ state: newState
214342
+ };
214343
+ }
214344
+ });
214345
+ if (options?.dryRun !== true)
214346
+ applyEffectiveEditability(editor);
214347
+ return result.result;
214348
+ }
214349
+ function pmPosToPosition(doc$12, pos) {
214350
+ const resolved = doc$12.resolve(pos);
214351
+ for (let depth = resolved.depth;depth >= 0; depth--) {
214352
+ const blockId = resolved.node(depth).attrs?.sdBlockId;
214353
+ if (blockId)
214354
+ return {
214355
+ blockId,
214356
+ offset: pos - resolved.start(depth)
214357
+ };
214358
+ }
214359
+ return {
214360
+ blockId: "",
214361
+ offset: pos
214362
+ };
214363
+ }
214364
+ function getPermRangesStorage(editor) {
214365
+ return editor.storage.permissionRanges;
214366
+ }
214367
+ function getAllRanges(editor) {
214368
+ return getPermRangesStorage(editor)?.allRanges ?? [];
214369
+ }
214370
+ function toRangeInfo(entry, doc$12) {
214371
+ return {
214372
+ id: entry.id,
214373
+ principal: entry.principal,
214374
+ kind: entry.kind,
214375
+ start: pmPosToPosition(doc$12, entry.from),
214376
+ end: pmPosToPosition(doc$12, entry.to)
214377
+ };
214378
+ }
214379
+ function principalToAttrs(principal) {
214380
+ if (principal.kind === "everyone")
214381
+ return { edGrp: "everyone" };
214382
+ return { ed: principal.id };
214383
+ }
214384
+ function generatePermissionId() {
214385
+ return String(Math.floor(Math.random() * 2000000000));
214386
+ }
214387
+ function permissionRangesListAdapter(editor, input2) {
214388
+ const revision = getRevision(editor);
214389
+ const doc$12 = editor.state.doc;
214390
+ const { total, items: paged } = paginate(getAllRanges(editor).map((entry) => buildDiscoveryItem(entry.id, buildResolvedHandle(`perm:${entry.id}`, "ephemeral", "ext:permissionRange"), toRangeInfo(entry, doc$12))), input2?.offset, input2?.limit);
214391
+ return buildDiscoveryResult({
214392
+ evaluatedRevision: revision,
214393
+ total,
214394
+ items: paged,
214395
+ page: {
214396
+ limit: input2?.limit ?? total,
214397
+ offset: input2?.offset ?? 0,
214398
+ returned: paged.length
214399
+ }
214400
+ });
214401
+ }
214402
+ function permissionRangesGetAdapter(editor, input2) {
214403
+ const entry = getAllRanges(editor).find((r$1) => r$1.id === input2.id);
214404
+ if (!entry)
214405
+ throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Permission range '${input2.id}' not found.`);
214406
+ return toRangeInfo(entry, editor.state.doc);
214407
+ }
214408
+ function permissionRangesCreateAdapter(editor, input2, options) {
214409
+ rejectTrackedMode("permissionRanges.create", options);
214410
+ const { target, principal, id: callerSuppliedId } = input2;
214411
+ const id2 = callerSuppliedId ?? generatePermissionId();
214412
+ if (getAllRanges(editor).some((r$1) => r$1.id === id2))
214413
+ throw new DocumentApiAdapterError("INVALID_INPUT", `Permission range ID '${id2}' already exists.`);
214414
+ const resolved = resolveSelectionTarget(editor, target);
214415
+ const from$1 = resolved.absFrom;
214416
+ const to = resolved.absTo;
214417
+ const doc$12 = editor.state.doc;
214418
+ if (from$1 >= to || from$1 < 0 || to > doc$12.content.size)
214419
+ throw new DocumentApiAdapterError("INVALID_TARGET", "Target range is invalid or empty.");
214420
+ const attrs = {
214421
+ id: id2,
214422
+ ...principalToAttrs(principal)
214423
+ };
214424
+ const $from = doc$12.resolve(from$1);
214425
+ const $to = doc$12.resolve(to);
214426
+ const spansMultipleBlocks = $from.parent !== $to.parent || $from.depth === 0;
214427
+ if (options?.dryRun)
214428
+ return {
214429
+ success: true,
214430
+ range: toRangeInfo({
214431
+ id: id2,
214432
+ principal,
214433
+ kind: spansMultipleBlocks ? "block" : "inline",
214434
+ from: from$1,
214435
+ to,
214436
+ startPos: from$1,
214437
+ endPos: to
214438
+ }, doc$12)
214439
+ };
214440
+ const { tr } = editor.state;
214441
+ tr.setMeta(PERMISSION_MUTATION_META, true);
214442
+ tr.setMeta("addToHistory", false);
214443
+ setTrackChangesSkip(editor, tr);
214444
+ const schema = editor.state.schema;
214445
+ if (spansMultipleBlocks) {
214446
+ const startNode = schema.nodes.permStartBlock?.create(attrs);
214447
+ const endNode = schema.nodes.permEndBlock?.create({ id: id2 });
214448
+ if (!startNode || !endNode)
214449
+ throw new DocumentApiAdapterError("CAPABILITY_UNAVAILABLE", "Block-level permission range nodes are not available in the schema.");
214450
+ tr.insert(to, endNode);
214451
+ tr.insert(from$1, startNode);
214452
+ } else {
214453
+ const startNode = schema.nodes.permStart?.create(attrs);
214454
+ const endNode = schema.nodes.permEnd?.create({ id: id2 });
214455
+ if (!startNode || !endNode)
214456
+ throw new DocumentApiAdapterError("CAPABILITY_UNAVAILABLE", "Inline permission range nodes are not available in the schema.");
214457
+ tr.insert(to, endNode);
214458
+ tr.insert(from$1, startNode);
214459
+ }
214460
+ if (editor.view)
214461
+ editor.view.dispatch(tr);
214462
+ else
214463
+ editor.dispatch(tr);
214464
+ const created = getAllRanges(editor).find((r$1) => r$1.id === id2);
214465
+ if (created)
214466
+ return {
214467
+ success: true,
214468
+ range: toRangeInfo(created, editor.state.doc)
214469
+ };
214470
+ return {
214471
+ success: true,
214472
+ range: {
214473
+ id: id2,
214474
+ principal,
214475
+ kind: spansMultipleBlocks ? "block" : "inline",
214476
+ start: pmPosToPosition(editor.state.doc, from$1),
214477
+ end: pmPosToPosition(editor.state.doc, to)
214478
+ }
214479
+ };
214480
+ }
214481
+ function permissionRangesRemoveAdapter(editor, input2, options) {
214482
+ rejectTrackedMode("permissionRanges.remove", options);
214483
+ const { id: id2 } = input2;
214484
+ if (options?.dryRun) {
214485
+ if (!getAllRanges(editor).some((r$1) => r$1.id === id2)) {
214486
+ const hasMarker = findMarkerPositions(editor, id2);
214487
+ if (!hasMarker.start && !hasMarker.end)
214488
+ throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Permission range '${id2}' not found.`);
214489
+ }
214490
+ return {
214491
+ success: true,
214492
+ id: id2
214493
+ };
214494
+ }
214495
+ const positions = findMarkerPositions(editor, id2);
214496
+ if (!positions.start && !positions.end)
214497
+ throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Permission range '${id2}' not found.`);
214498
+ const { tr } = editor.state;
214499
+ tr.setMeta(PERMISSION_MUTATION_META, true);
214500
+ tr.setMeta("addToHistory", false);
214501
+ setTrackChangesSkip(editor, tr);
214502
+ const toDelete = [...positions.end ? [positions.end] : [], ...positions.start ? [positions.start] : []].sort((a2, b$1) => b$1.pos - a2.pos);
214503
+ for (const marker of toDelete)
214504
+ tr.delete(marker.pos, marker.pos + marker.nodeSize);
214505
+ if (editor.view)
214506
+ editor.view.dispatch(tr);
214507
+ else
214508
+ editor.dispatch(tr);
214509
+ return {
214510
+ success: true,
214511
+ id: id2
214512
+ };
214513
+ }
214514
+ function permissionRangesUpdatePrincipalAdapter(editor, input2, options) {
214515
+ rejectTrackedMode("permissionRanges.updatePrincipal", options);
214516
+ const { id: id2, principal } = input2;
214517
+ const positions = findMarkerPositions(editor, id2);
214518
+ if (!positions.start)
214519
+ throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Permission range start marker '${id2}' not found.`);
214520
+ if (options?.dryRun) {
214521
+ const existing = getAllRanges(editor).find((r$1) => r$1.id === id2);
214522
+ if (existing)
214523
+ return {
214524
+ success: true,
214525
+ range: toRangeInfo({
214526
+ ...existing,
214527
+ principal
214528
+ }, editor.state.doc)
214529
+ };
214530
+ return {
214531
+ success: true,
214532
+ range: {
214533
+ id: id2,
214534
+ principal,
214535
+ kind: "inline",
214536
+ start: pmPosToPosition(editor.state.doc, positions.start.pos),
214537
+ end: pmPosToPosition(editor.state.doc, positions.start.pos)
214538
+ }
214539
+ };
214540
+ }
214541
+ const { tr } = editor.state;
214542
+ tr.setMeta(PERMISSION_MUTATION_META, true);
214543
+ tr.setMeta("addToHistory", false);
214544
+ setTrackChangesSkip(editor, tr);
214545
+ const { pos, node: node3 } = positions.start;
214546
+ const newAttrs = {
214547
+ ...node3.attrs,
214548
+ ...principalToAttrs(principal),
214549
+ ...principal.kind === "everyone" ? { ed: undefined } : { edGrp: undefined }
214550
+ };
214551
+ tr.setNodeMarkup(pos, undefined, newAttrs);
214552
+ if (editor.view)
214553
+ editor.view.dispatch(tr);
214554
+ else
214555
+ editor.dispatch(tr);
214556
+ const updated = getAllRanges(editor).find((r$1) => r$1.id === id2);
214557
+ if (updated)
214558
+ return {
214559
+ success: true,
214560
+ range: toRangeInfo(updated, editor.state.doc)
214561
+ };
214562
+ return {
214563
+ success: true,
214564
+ range: {
214565
+ id: id2,
214566
+ principal,
214567
+ kind: "inline",
214568
+ start: pmPosToPosition(editor.state.doc, pos),
214569
+ end: pmPosToPosition(editor.state.doc, pos)
214570
+ }
214571
+ };
214572
+ }
214573
+ function setTrackChangesSkip(editor, tr) {
214574
+ try {
214575
+ const trackPlugin = editor.state.plugins.find((p$12) => p$12.key?.includes("trackChangesBase$"));
214576
+ if (trackPlugin)
214577
+ tr.setMeta(trackPlugin, { skip: true });
214578
+ } catch {}
214579
+ }
214580
+ function findMarkerPositions(editor, id2) {
214581
+ let start$1 = null;
214582
+ let end$1 = null;
214583
+ const permStartTypes = new Set(["permStart", "permStartBlock"]);
214584
+ const permEndTypes = new Set(["permEnd", "permEndBlock"]);
214585
+ editor.state.doc.descendants((node3, pos) => {
214586
+ if (start$1 && end$1)
214587
+ return false;
214588
+ const typeName = node3.type.name;
214589
+ if (node3.attrs?.id === id2) {
214590
+ if (permStartTypes.has(typeName))
214591
+ start$1 = {
214592
+ pos,
214593
+ nodeSize: node3.nodeSize,
214594
+ node: { attrs: { ...node3.attrs } }
214595
+ };
214596
+ else if (permEndTypes.has(typeName))
214597
+ end$1 = {
214598
+ pos,
214599
+ nodeSize: node3.nodeSize,
214600
+ node: { attrs: { ...node3.attrs } }
214601
+ };
214602
+ }
214603
+ return true;
214604
+ });
214605
+ return {
214606
+ start: start$1,
214607
+ end: end$1
214608
+ };
214609
+ }
213414
214610
  function isSpecialEntry(entry) {
213415
214611
  return SPECIAL_NOTE_TYPES.has(entry.type ?? "");
213416
214612
  }
@@ -216743,7 +217939,19 @@ function assembleDocumentApiAdapters(editor) {
216743
217939
  apply: (input2) => executePlan(editor, input2)
216744
217940
  },
216745
217941
  diff: createDiffAdapter(editor),
216746
- history: createHistoryAdapter(editor)
217942
+ history: createHistoryAdapter(editor),
217943
+ protection: {
217944
+ get: () => protectionGetAdapter(editor),
217945
+ setEditingRestriction: (input2, options) => protectionSetEditingRestrictionAdapter(editor, input2, options),
217946
+ clearEditingRestriction: (_input, options) => protectionClearEditingRestrictionAdapter(editor, undefined, options)
217947
+ },
217948
+ permissionRanges: {
217949
+ list: (input2) => permissionRangesListAdapter(editor, input2),
217950
+ get: (input2) => permissionRangesGetAdapter(editor, input2),
217951
+ create: (input2, options) => permissionRangesCreateAdapter(editor, input2, options),
217952
+ remove: (input2, options) => permissionRangesRemoveAdapter(editor, input2, options),
217953
+ updatePrincipal: (input2, options) => permissionRangesUpdatePrincipalAdapter(editor, input2, options)
217954
+ }
216747
217955
  };
216748
217956
  }
216749
217957
  function getDocumentApiAdapters(editor) {
@@ -236511,173 +237719,40 @@ var Node$13 = class Node$14 {
236511
237719
  this.deco = deco;
236512
237720
  }
236513
237721
  }, searchKey, BLOCK_SEPARATOR = `
236514
- `, ATOM_PLACEHOLDER = "", SearchIndex = class SearchIndex2 {
236515
- text = "";
236516
- segments = [];
236517
- valid = false;
236518
- docSize = 0;
236519
- doc = null;
236520
- build(doc$12) {
236521
- this.text = doc$12.textBetween(0, doc$12.content.size, BLOCK_SEPARATOR, ATOM_PLACEHOLDER);
236522
- this.segments = [];
236523
- this.docSize = doc$12.content.size;
236524
- this.doc = doc$12;
236525
- let offset$1 = 0;
236526
- this.#walkNodeContent(doc$12, 0, offset$1, (segment) => {
236527
- this.segments.push(segment);
236528
- offset$1 = segment.offsetEnd;
236529
- });
236530
- this.valid = true;
236531
- }
236532
- #walkNodeContent(node3, contentStart, offset$1, addSegment) {
236533
- let currentOffset = offset$1;
236534
- let isFirstChild = true;
236535
- node3.forEach((child, childContentOffset) => {
236536
- const childDocPos = contentStart + childContentOffset;
236537
- if (child.isBlock && !isFirstChild) {
236538
- addSegment({
236539
- offsetStart: currentOffset,
236540
- offsetEnd: currentOffset + 1,
236541
- docFrom: childDocPos,
236542
- docTo: childDocPos,
236543
- kind: "blockSep"
236544
- });
236545
- currentOffset += 1;
236546
- }
236547
- currentOffset = this.#walkNode(child, childDocPos, currentOffset, addSegment);
236548
- isFirstChild = false;
236549
- });
236550
- return currentOffset;
236551
- }
236552
- #walkNode(node3, docPos, offset$1, addSegment) {
236553
- if (node3.isText) {
236554
- const text5 = node3.text || "";
236555
- if (text5.length > 0) {
236556
- addSegment({
236557
- offsetStart: offset$1,
236558
- offsetEnd: offset$1 + text5.length,
236559
- docFrom: docPos,
236560
- docTo: docPos + text5.length,
236561
- kind: "text"
236562
- });
236563
- return offset$1 + text5.length;
236564
- }
236565
- return offset$1;
236566
- }
236567
- if (node3.isLeaf) {
236568
- if (node3.type.name === "hard_break") {
236569
- addSegment({
236570
- offsetStart: offset$1,
236571
- offsetEnd: offset$1 + 1,
236572
- docFrom: docPos,
236573
- docTo: docPos + node3.nodeSize,
236574
- kind: "hardBreak"
236575
- });
236576
- return offset$1 + 1;
236577
- }
236578
- addSegment({
236579
- offsetStart: offset$1,
236580
- offsetEnd: offset$1 + 1,
236581
- docFrom: docPos,
236582
- docTo: docPos + node3.nodeSize,
236583
- kind: "atom"
236584
- });
236585
- return offset$1 + 1;
236586
- }
236587
- return this.#walkNodeContent(node3, docPos + 1, offset$1, addSegment);
236588
- }
236589
- invalidate() {
236590
- this.valid = false;
236591
- }
236592
- isStale(doc$12) {
236593
- return !this.valid || this.doc !== doc$12;
236594
- }
236595
- ensureValid(doc$12) {
236596
- if (this.isStale(doc$12))
236597
- this.build(doc$12);
236598
- }
236599
- offsetRangeToDocRanges(start$1, end$1) {
236600
- const ranges = [];
236601
- for (const segment of this.segments) {
236602
- if (segment.offsetEnd <= start$1)
236603
- continue;
236604
- if (segment.offsetStart >= end$1)
236605
- break;
236606
- if (segment.kind !== "text")
236607
- continue;
236608
- const overlapStart = Math.max(start$1, segment.offsetStart);
236609
- const overlapEnd = Math.min(end$1, segment.offsetEnd);
236610
- if (overlapStart < overlapEnd) {
236611
- const startInSegment = overlapStart - segment.offsetStart;
236612
- const endInSegment = overlapEnd - segment.offsetStart;
236613
- ranges.push({
236614
- from: segment.docFrom + startInSegment,
236615
- to: segment.docFrom + endInSegment
236616
- });
237722
+ `, ATOM_PLACEHOLDER = "", SearchIndex, customSearchHighlightsKey, isRegExp2 = (value) => Object.prototype.toString.call(value) === "[object RegExp]", SEARCH_POSITION_TRACKER_TYPE = "search-match", mapIndexMatchesToDocMatches = ({ searchIndex, indexMatches, doc: doc$12, positionTracker }) => {
237723
+ const matches2 = [];
237724
+ for (const indexMatch of indexMatches) {
237725
+ const ranges = searchIndex.offsetRangeToDocRanges(indexMatch.start, indexMatch.end);
237726
+ if (ranges.length === 0)
237727
+ continue;
237728
+ const matchTexts = ranges.map((r$1) => doc$12.textBetween(r$1.from, r$1.to));
237729
+ const match$1 = {
237730
+ from: ranges[0].from,
237731
+ to: ranges[ranges.length - 1].to,
237732
+ text: matchTexts.join(""),
237733
+ id: v4_default(),
237734
+ ranges,
237735
+ trackerIds: []
237736
+ };
237737
+ if (positionTracker?.trackMany) {
237738
+ const trackedRanges = ranges.map((range, rangeIndex) => ({
237739
+ from: range.from,
237740
+ to: range.to,
237741
+ spec: {
237742
+ type: SEARCH_POSITION_TRACKER_TYPE,
237743
+ metadata: { rangeIndex }
237744
+ }
237745
+ }));
237746
+ const trackerIds = positionTracker.trackMany(trackedRanges);
237747
+ if (trackerIds.length > 0) {
237748
+ match$1.trackerIds = trackerIds;
237749
+ match$1.id = trackerIds[0];
236617
237750
  }
236618
237751
  }
236619
- return ranges;
236620
- }
236621
- offsetToDocPos(offset$1) {
236622
- for (const segment of this.segments)
236623
- if (offset$1 >= segment.offsetStart && offset$1 < segment.offsetEnd) {
236624
- if (segment.kind === "text")
236625
- return segment.docFrom + (offset$1 - segment.offsetStart);
236626
- return segment.docFrom;
236627
- }
236628
- if (this.segments.length > 0 && offset$1 === this.segments[this.segments.length - 1].offsetEnd)
236629
- return this.segments[this.segments.length - 1].docTo;
236630
- return null;
237752
+ matches2.push(match$1);
236631
237753
  }
236632
- static escapeRegex(str) {
236633
- return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
236634
- }
236635
- static toFlexiblePattern(searchString) {
236636
- const hasLeadingWhitespace = /^[\s\u00a0]+/.test(searchString);
236637
- const hasTrailingWhitespace = /[\s\u00a0]+$/.test(searchString);
236638
- const parts = searchString.replace(/^[\s\u00a0]+|[\s\u00a0]+$/g, "").split(/[\s\u00a0]+/).filter((part) => part.length > 0);
236639
- if (parts.length === 0)
236640
- return hasLeadingWhitespace || hasTrailingWhitespace ? "[\\s\\u00a0]+" : "";
236641
- const blockSeparatorPattern = "(?:\\n)*";
236642
- let pattern = parts.map((part) => {
236643
- return Array.from(part).map((ch) => SearchIndex2.escapeRegex(ch)).join(blockSeparatorPattern);
236644
- }).join("[\\s\\u00a0]+");
236645
- if (hasLeadingWhitespace)
236646
- pattern = "[\\s\\u00a0]+" + pattern;
236647
- if (hasTrailingWhitespace)
236648
- pattern = pattern + "[\\s\\u00a0]+";
236649
- return pattern;
236650
- }
236651
- search(pattern, options = {}) {
236652
- const { caseSensitive = false, maxMatches = 1000 } = options;
236653
- const matches2 = [];
236654
- let regex;
236655
- if (pattern instanceof RegExp) {
236656
- const flags = pattern.flags.includes("g") ? pattern.flags : pattern.flags + "g";
236657
- regex = new RegExp(pattern.source, flags);
236658
- } else if (typeof pattern === "string") {
236659
- if (pattern.length === 0)
236660
- return matches2;
236661
- const flexiblePattern = SearchIndex2.toFlexiblePattern(pattern);
236662
- if (flexiblePattern.length === 0)
236663
- return matches2;
236664
- const flags = caseSensitive ? "g" : "gi";
236665
- regex = new RegExp(flexiblePattern, flags);
236666
- } else
236667
- return matches2;
236668
- let match$1;
236669
- while ((match$1 = regex.exec(this.text)) !== null && matches2.length < maxMatches) {
236670
- matches2.push({
236671
- start: match$1.index,
236672
- end: match$1.index + match$1[0].length,
236673
- text: match$1[0]
236674
- });
236675
- if (match$1[0].length === 0)
236676
- regex.lastIndex++;
236677
- }
236678
- return matches2;
236679
- }
236680
- }, customSearchHighlightsKey, isRegExp2 = (value) => Object.prototype.toString.call(value) === "[object RegExp]", SEARCH_POSITION_TRACKER_TYPE = "search-match", resolveMatchSelectionRange = (match$1, positionTracker) => {
237754
+ return matches2;
237755
+ }, resolveMatchSelectionRange = (match$1, positionTracker) => {
236681
237756
  if (!match$1)
236682
237757
  return {
236683
237758
  from: undefined,
@@ -237030,16 +238105,7 @@ var Node$13 = class Node$14 {
237030
238105
  return "default";
237031
238106
  }
237032
238107
  }
237033
- }, NodeResizer, PERMISSION_PLUGIN_KEY, EVERYONE_GROUP = "everyone", EMPTY_IDENTIFIER_SET, normalizeIdentifier2 = (value) => typeof value === "string" ? value.trim().toLowerCase() : "", buildAllowedIdentifierSet = (editor) => {
237034
- const email = normalizeIdentifier2(editor?.options?.user?.email);
237035
- if (!email)
237036
- return EMPTY_IDENTIFIER_SET;
237037
- const [localPart, domain2] = email.split("@");
237038
- if (!localPart || !domain2)
237039
- return EMPTY_IDENTIFIER_SET;
237040
- const formatted = `${domain2}\\${localPart}`;
237041
- return formatted ? new Set([formatted]) : EMPTY_IDENTIFIER_SET;
237042
- }, isEveryoneGroup = (value) => normalizeIdentifier2(value) === EVERYONE_GROUP, isRangeAllowedForUser = (attrs, allowedIdentifiers) => {
238108
+ }, NodeResizer, PERMISSION_MUTATION_META = "permissionRangeMutation", PERMISSION_PLUGIN_KEY, EVERYONE_GROUP = "everyone", EMPTY_IDENTIFIER_SET, normalizeIdentifier2 = (value) => typeof value === "string" ? value.trim().toLowerCase() : "", isEveryoneGroup = (value) => normalizeIdentifier2(value) === EVERYONE_GROUP, isRangeAllowedForUser = (attrs, allowedIdentifiers) => {
237043
238109
  if (!attrs)
237044
238110
  return false;
237045
238111
  if (isEveryoneGroup(attrs.edGrp))
@@ -237070,40 +238136,66 @@ var Node$13 = class Node$14 {
237070
238136
  endTypeSet: new Set(endTypes),
237071
238137
  allTypeSet: new Set([...startTypes, ...endTypes])
237072
238138
  };
237073
- }, getPermissionNodeId = (node3, pos, fallbackPrefix) => String(node3.attrs?.id ?? `${fallbackPrefix}-${pos}`), buildPermissionState = (doc$12, allowedIdentifiers = EMPTY_IDENTIFIER_SET, permTypes) => {
237074
- const ranges = [];
238139
+ }, getPermissionNodeId = (node3, pos, fallbackPrefix) => String(node3.attrs?.id ?? `${fallbackPrefix}-${pos}`), derivePrincipal = (attrs) => {
238140
+ if (isEveryoneGroup(attrs?.edGrp))
238141
+ return { kind: "everyone" };
238142
+ if (attrs?.ed)
238143
+ return {
238144
+ kind: "editor",
238145
+ id: String(attrs.ed)
238146
+ };
238147
+ return { kind: "everyone" };
238148
+ }, buildPermissionState = (doc$12, allowedIdentifiers = EMPTY_IDENTIFIER_SET, permTypes, protectionEnforced = false) => {
238149
+ const allRanges = [];
238150
+ const allowedRanges = [];
237075
238151
  const openRanges = /* @__PURE__ */ new Map;
237076
238152
  const startTypeSet = permTypes?.startTypeSet ?? /* @__PURE__ */ new Set;
237077
238153
  const endTypeSet = permTypes?.endTypeSet ?? /* @__PURE__ */ new Set;
238154
+ const blockStartType = doc$12.type.schema?.nodes?.["permStartBlock"];
238155
+ const blockEndType = doc$12.type.schema?.nodes?.["permEndBlock"];
237078
238156
  doc$12.descendants((node3, pos) => {
237079
238157
  if (startTypeSet.has(node3.type)) {
237080
238158
  const id2 = getPermissionNodeId(node3, pos, "permStart");
237081
238159
  openRanges.set(id2, {
237082
238160
  from: pos + node3.nodeSize,
237083
- attrs: node3.attrs ?? {}
238161
+ startPos: pos,
238162
+ attrs: node3.attrs ?? {},
238163
+ isBlock: node3.type === blockStartType
237084
238164
  });
237085
238165
  return false;
237086
238166
  }
237087
238167
  if (endTypeSet.has(node3.type)) {
237088
238168
  const id2 = getPermissionNodeId(node3, pos, "permEnd");
237089
238169
  const start$1 = openRanges.get(id2);
237090
- if (start$1 && isRangeAllowedForUser(start$1.attrs, allowedIdentifiers)) {
238170
+ if (start$1) {
237091
238171
  const to = Math.max(pos, start$1.from);
237092
- if (to > start$1.from)
237093
- ranges.push({
238172
+ if (to > start$1.from) {
238173
+ const isBlock = start$1.isBlock || node3.type === blockEndType;
238174
+ const entry = {
237094
238175
  id: id2,
237095
238176
  from: start$1.from,
237096
- to
237097
- });
237098
- }
237099
- if (start$1)
238177
+ to,
238178
+ startPos: start$1.startPos,
238179
+ endPos: pos,
238180
+ principal: derivePrincipal(start$1.attrs),
238181
+ kind: isBlock ? "block" : "inline",
238182
+ edGrp: start$1.attrs.edGrp,
238183
+ ed: start$1.attrs.ed
238184
+ };
238185
+ allRanges.push(entry);
238186
+ if (protectionEnforced && isRangeAllowedForUser(start$1.attrs, allowedIdentifiers))
238187
+ allowedRanges.push(entry);
238188
+ }
237100
238189
  openRanges.delete(id2);
238190
+ }
237101
238191
  return false;
237102
238192
  }
237103
238193
  });
237104
238194
  return {
237105
- ranges,
237106
- hasAllowedRanges: ranges.length > 0
238195
+ allRanges,
238196
+ allowedRanges,
238197
+ hasAllowedRanges: allowedRanges.length > 0,
238198
+ ranges: allowedRanges
237107
238199
  };
237108
238200
  }, collectPermissionTags = (doc$12, permStartTypes, permEndTypes) => {
237109
238201
  const tags = /* @__PURE__ */ new Map;
@@ -237171,7 +238263,7 @@ var Node$13 = class Node$14 {
237171
238263
  if (!allowedRanges?.length)
237172
238264
  return false;
237173
238265
  return allowedRanges.some((allowed) => range.from >= allowed.from && range.to <= allowed.to);
237174
- }, PermissionRanges, FONT_FAMILY_FALLBACKS2, DEFAULT_GENERIC_FALLBACK2 = "sans-serif", normalizeParts = (value) => (value || "").split(",").map((part) => part.trim()).filter(Boolean), splitOutsideQuotes = (str, delimiter) => {
238266
+ }, PermissionRanges, Protection, FONT_FAMILY_FALLBACKS2, DEFAULT_GENERIC_FALLBACK2 = "sans-serif", normalizeParts = (value) => (value || "").split(",").map((part) => part.trim()).filter(Boolean), splitOutsideQuotes = (str, delimiter) => {
237175
238267
  if (!str.includes('"') && !str.includes("'"))
237176
238268
  return str.split(delimiter).map((p$12) => p$12.trim()).filter(Boolean);
237177
238269
  const parts = [];
@@ -240898,6 +241990,7 @@ var Node$13 = class Node$14 {
240898
241990
  PermStartBlock,
240899
241991
  PermEndBlock,
240900
241992
  PermissionRanges,
241993
+ Protection,
240901
241994
  VerticalNavigation,
240902
241995
  PassthroughInline,
240903
241996
  PassthroughBlock,
@@ -243213,7 +244306,7 @@ var Node$13 = class Node$14 {
243213
244306
  console.warn("Failed to initialize developer tools:", error3);
243214
244307
  }
243215
244308
  }
243216
- }, BLANK_DOCX_BASE64 = `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`, BLANK_DOCX_DATA_URI, TAB_LEADER_TO_SEPARATOR, SEPARATOR_TO_TAB_LEADER, DEFAULT_TOC_CONFIG, SWITCH_PATTERN$1, BULLET_FORMATS$1, LOCK_MODE_TO_SDT_LOCK, SNIPPET_PADDING = 30, DUAL_KIND_TYPES, KNOWN_BLOCK_PM_NODE_TYPES, KNOWN_INLINE_PM_NODE_TYPES, MAX_PATTERN_LENGTH = 1024, TOGGLE_MARK_SPECS, CORE_MARK_NAMES, METADATA_MARK_NAMES, CSS_NAMED_COLORS, V3_PREFIX = "text:", V4_PREFIX = "text:v4:", HEADING_STYLE_DEPTH, BULLET_FORMATS, MARK_PRIORITY, remarkProcessor, DEFAULT_UNFLATTEN_LISTS = true, HEADING_STYLE_PATTERN, REQUIRED_COMMANDS, VALID_CAPABILITY_REASON_CODES, REQUIRED_HELPERS, SCHEMA_NODE_GATES, schemaGatedIds, SUPPORTED_NON_UNIFORM_STRATEGIES, SUPPORTED_SET_MARKS, REGEX_MAX_PATTERN_LENGTH = 1024, registry, VALID_CREATE_POSITIONS, REF_HANDLERS, STEP_INTERACTION_MATRIX, MATRIX_EXEMPT_OPS, DEFAULT_INLINE_POLICY, CORE_SET_MARK_KEYS, BOOLEAN_INLINE_MARK_KEYS, TEXT_STYLE_KEYS, PRESERVE_RUN_PROPERTIES_META_KEY = "sdPreserveRunPropertiesKeys", CONTENT_CAPABILITIES, INLINE_CAPABILITIES, SDT_LOCK_TO_LOCK_MODE, BODY_LOCATOR2, STUB_WHERE, EMPTY_RESOLUTION, CONTAINER_NODE_TYPES, VALID_EDGE_NODE_TYPES3, FALLBACK_STORE_KEY = "__documentApiComments", STYLES_PART = "word/styles.xml", PROPERTIES_KEY_BY_CHANNEL, XML_PATH_BY_CHANNEL2, UNDERLINE_API_TO_STORAGE, UNDERLINE_STORAGE_TO_API, HEX_SUBKEYS_BY_PROPERTY, PARAGRAPH_NODE_TYPES, TEXT_STYLE_CHARACTER_STYLE_ATTR = "styleId", DIRECT_FORMATTING_MARK_NAMES, ALIGNMENT_TO_JUSTIFICATION, SUPPORTED_DELETE_NODE_TYPES3, REJECTED_DELETE_NODE_TYPES3, TEXT_PREVIEW_MAX_LENGTH = 80, RANGE_DELETE_SAFE_NODE_TYPES, HEADING_PATTERN, INDENT_PER_LEVEL_TWIPS = 720, HANGING_INDENT_TWIPS = 360, ORDERED_PRESET_CONFIG, BULLET_PRESET_CONFIG, PRESET_TEMPLATES, LevelFormattingHelpers, PRESET_KIND_MAP, NUMBERING_PART = "word/numbering.xml", DEFAULT_PRESET_FOR_KIND, _setValueDelegate, PREVIEW_TEXT_MAX_LENGTH = 2000, BLOCK_PREVIEW_MAX_LENGTH = 200, EDGE_NODE_TYPES$1, POINTS_TO_PIXELS, POINTS_TO_TWIPS = 20, PIXELS_TO_TWIPS, DEFAULT_TABLE_GRID_WIDTH_TWIPS = 1500, SETTINGS_PART = "word/settings.xml", WORD_DEFAULT_TBL_LOOK, FLAG_TO_OOXML_KEY, INVERTED_FLAGS, XML_KEY_TO_STYLE_OPTION, CLEARED_BORDER_OOXML, TABLE_MARGIN_KEY_GROUPS, TABLE_ADAPTER_DISPATCH, ROW_TARGETED_TABLE_OPS, registered = false, STYLES_PART_ID = "word/styles.xml", stylesPartDescriptor, settingsPartDescriptor, RELS_PART_ID2 = "word/_rels/document.xml.rels", RELS_XMLNS2 = "http://schemas.openxmlformats.org/package/2006/relationships", HEADER_RELATIONSHIP_TYPE$1 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE$1 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", relsPartDescriptor, HISTORY_UNSAFE_OPS, CANONICAL_COMMENT_IGNORED_KEYS, INITIAL_HASH, ROUND_CONSTANTS, V1_COVERAGE, SNAPSHOT_VERSION3 = "sd-diff-snapshot/v1", PAYLOAD_VERSION3 = "sd-diff-payload/v1", ENGINE_ID = "super-editor", STAGED_CONVERTER_KEYS, DiffServiceError, DEFAULT_LEVEL = 1, SWITCH_PATTERN, TOC_BOOKMARK_PREFIX = "_Toc", DEFAULT_RIGHT_TAB_POS = 9350, TAB_LEADER_MAP, NO_ENTRIES_PLACEHOLDER, TC_LEVEL_MIN = 1, TC_LEVEL_MAX = 9, ALLOWED_WRAP_ATTRS, WRAP_TYPES_SUPPORTING_SIDE, WRAP_TYPES_SUPPORTING_DISTANCES, RELATIVE_HEIGHT_MIN = 0, RELATIVE_HEIGHT_MAX = 4294967295, FORBIDDEN_RAW_PATCH_NAMES, CONTROL_TYPE_SDT_PR_ELEMENTS, DEFAULT_CHECKBOX_SYMBOL_FONT2 = "MS Gothic", DEFAULT_CHECKBOX_CHECKED_HEX2 = "2612", DEFAULT_CHECKBOX_UNCHECKED_HEX2 = "2610", VARIANT_ORDER, KIND_ORDER, HEADER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", DOCUMENT_RELS_PATH2 = "word/_rels/document.xml.rels", HEADER_FILE_PATTERN2, FOOTER_FILE_PATTERN2, SPECIAL_NOTE_TYPES, RESTART_POLICY_TO_OOXML, VALID_DISPLAYS, REFERENCE_BLOCK_PREFIX, CAPTION_STYLE_NAMES, CAPTION_PARAGRAPH_STYLE_ID = "Caption", CAPTION_FORMAT_TO_OOXML, DOCUMENT_STAT_FIELD_TYPES, TOA_LEADER_REVERSE_MAP, EDGE_NODE_TYPES, CONTENT_TYPES_PART_ID = "[Content_Types].xml", CONTENT_TYPES_NS = "http://schemas.openxmlformats.org/package/2006/content-types", contentTypesPartDescriptor, empty_exports, init_empty, CURRENT_APP_VERSION2 = "1.23.0", PIXELS_PER_INCH2 = 96, MAX_HEIGHT_BUFFER_PX = 50, MAX_WIDTH_BUFFER_PX = 20, Editor, EXCLUDED_PLUGIN_KEY_REF_LIST, EXCLUDED_PLUGIN_KEY_REFS, EXCLUDED_PLUGIN_KEY_PREFIXES, TEXT_RANGE_BLOCK_SEP = `
244309
+ }, BLANK_DOCX_BASE64 = `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`, BLANK_DOCX_DATA_URI, TAB_LEADER_TO_SEPARATOR, SEPARATOR_TO_TAB_LEADER, DEFAULT_TOC_CONFIG, SWITCH_PATTERN$1, BULLET_FORMATS$1, LOCK_MODE_TO_SDT_LOCK, SNIPPET_PADDING = 30, DUAL_KIND_TYPES, KNOWN_BLOCK_PM_NODE_TYPES, KNOWN_INLINE_PM_NODE_TYPES, MAX_PATTERN_LENGTH = 1024, TOGGLE_MARK_SPECS, CORE_MARK_NAMES, METADATA_MARK_NAMES, CSS_NAMED_COLORS, V3_PREFIX = "text:", V4_PREFIX = "text:v4:", HEADING_STYLE_DEPTH, BULLET_FORMATS, MARK_PRIORITY, remarkProcessor, DEFAULT_UNFLATTEN_LISTS = true, HEADING_STYLE_PATTERN, REQUIRED_COMMANDS, VALID_CAPABILITY_REASON_CODES, REQUIRED_HELPERS, SCHEMA_NODE_GATES, schemaGatedIds, SUPPORTED_NON_UNIFORM_STRATEGIES, SUPPORTED_SET_MARKS, REGEX_MAX_PATTERN_LENGTH = 1024, registry, VALID_CREATE_POSITIONS, REF_HANDLERS, STEP_INTERACTION_MATRIX, MATRIX_EXEMPT_OPS, DEFAULT_INLINE_POLICY, CORE_SET_MARK_KEYS, BOOLEAN_INLINE_MARK_KEYS, TEXT_STYLE_KEYS, PRESERVE_RUN_PROPERTIES_META_KEY = "sdPreserveRunPropertiesKeys", CONTENT_CAPABILITIES, INLINE_CAPABILITIES, SDT_LOCK_TO_LOCK_MODE, BODY_LOCATOR2, STUB_WHERE, EMPTY_RESOLUTION, CONTAINER_NODE_TYPES, VALID_EDGE_NODE_TYPES3, FALLBACK_STORE_KEY = "__documentApiComments", STYLES_PART = "word/styles.xml", PROPERTIES_KEY_BY_CHANNEL, XML_PATH_BY_CHANNEL2, UNDERLINE_API_TO_STORAGE, UNDERLINE_STORAGE_TO_API, HEX_SUBKEYS_BY_PROPERTY, PARAGRAPH_NODE_TYPES, TEXT_STYLE_CHARACTER_STYLE_ATTR = "styleId", DIRECT_FORMATTING_MARK_NAMES, ALIGNMENT_TO_JUSTIFICATION, SUPPORTED_DELETE_NODE_TYPES3, REJECTED_DELETE_NODE_TYPES3, TEXT_PREVIEW_MAX_LENGTH = 80, RANGE_DELETE_SAFE_NODE_TYPES, HEADING_PATTERN, INDENT_PER_LEVEL_TWIPS = 720, HANGING_INDENT_TWIPS = 360, ORDERED_PRESET_CONFIG, BULLET_PRESET_CONFIG, PRESET_TEMPLATES, LevelFormattingHelpers, PRESET_KIND_MAP, NUMBERING_PART = "word/numbering.xml", DEFAULT_PRESET_FOR_KIND, _setValueDelegate, PREVIEW_TEXT_MAX_LENGTH = 2000, BLOCK_PREVIEW_MAX_LENGTH = 200, EDGE_NODE_TYPES$1, POINTS_TO_PIXELS, POINTS_TO_TWIPS = 20, PIXELS_TO_TWIPS, DEFAULT_TABLE_GRID_WIDTH_TWIPS = 1500, SETTINGS_PART$1 = "word/settings.xml", WORD_DEFAULT_TBL_LOOK, FLAG_TO_OOXML_KEY, INVERTED_FLAGS, XML_KEY_TO_STYLE_OPTION, CLEARED_BORDER_OOXML, TABLE_MARGIN_KEY_GROUPS, TABLE_ADAPTER_DISPATCH, ROW_TARGETED_TABLE_OPS, registered = false, STYLES_PART_ID = "word/styles.xml", stylesPartDescriptor, settingsPartDescriptor, RELS_PART_ID2 = "word/_rels/document.xml.rels", RELS_XMLNS2 = "http://schemas.openxmlformats.org/package/2006/relationships", HEADER_RELATIONSHIP_TYPE$1 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE$1 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", relsPartDescriptor, HISTORY_UNSAFE_OPS, CANONICAL_COMMENT_IGNORED_KEYS, INITIAL_HASH, ROUND_CONSTANTS, V1_COVERAGE, SNAPSHOT_VERSION3 = "sd-diff-snapshot/v1", PAYLOAD_VERSION3 = "sd-diff-payload/v1", ENGINE_ID = "super-editor", STAGED_CONVERTER_KEYS, DiffServiceError, DEFAULT_LEVEL = 1, SWITCH_PATTERN, TOC_BOOKMARK_PREFIX = "_Toc", DEFAULT_RIGHT_TAB_POS = 9350, TAB_LEADER_MAP, NO_ENTRIES_PLACEHOLDER, TC_LEVEL_MIN = 1, TC_LEVEL_MAX = 9, ALLOWED_WRAP_ATTRS, WRAP_TYPES_SUPPORTING_SIDE, WRAP_TYPES_SUPPORTING_DISTANCES, RELATIVE_HEIGHT_MIN = 0, RELATIVE_HEIGHT_MAX = 4294967295, FORBIDDEN_RAW_PATCH_NAMES, CONTROL_TYPE_SDT_PR_ELEMENTS, DEFAULT_CHECKBOX_SYMBOL_FONT2 = "MS Gothic", DEFAULT_CHECKBOX_CHECKED_HEX2 = "2612", DEFAULT_CHECKBOX_UNCHECKED_HEX2 = "2610", VARIANT_ORDER, KIND_ORDER, HEADER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", DOCUMENT_RELS_PATH2 = "word/_rels/document.xml.rels", HEADER_FILE_PATTERN2, FOOTER_FILE_PATTERN2, SETTINGS_PART, SPECIAL_NOTE_TYPES, RESTART_POLICY_TO_OOXML, VALID_DISPLAYS, REFERENCE_BLOCK_PREFIX, CAPTION_STYLE_NAMES, CAPTION_PARAGRAPH_STYLE_ID = "Caption", CAPTION_FORMAT_TO_OOXML, DOCUMENT_STAT_FIELD_TYPES, TOA_LEADER_REVERSE_MAP, EDGE_NODE_TYPES, CONTENT_TYPES_PART_ID = "[Content_Types].xml", CONTENT_TYPES_NS = "http://schemas.openxmlformats.org/package/2006/content-types", contentTypesPartDescriptor, empty_exports, init_empty, CURRENT_APP_VERSION2 = "1.23.0", PIXELS_PER_INCH2 = 96, MAX_HEIGHT_BUFFER_PX = 50, MAX_WIDTH_BUFFER_PX = 20, Editor, EXCLUDED_PLUGIN_KEY_REF_LIST, EXCLUDED_PLUGIN_KEY_REFS, EXCLUDED_PLUGIN_KEY_PREFIXES, TEXT_RANGE_BLOCK_SEP = `
243217
244310
  `, TEXT_RANGE_LEAF_SEP = `
243218
244311
  `, DecorationBridge = class DecorationBridge2 {
243219
244312
  #applied = /* @__PURE__ */ new WeakMap;
@@ -252760,9 +253853,9 @@ var Node$13 = class Node$14 {
252760
253853
  return;
252761
253854
  console.log(...args$1);
252762
253855
  }, HEADER_FOOTER_INIT_BUDGET_MS = 200, MAX_ZOOM_WARNING_THRESHOLD = 10, MAX_SELECTION_RECTS_PER_USER = 100, SEMANTIC_RESIZE_DEBOUNCE_MS = 120, MIN_SEMANTIC_CONTENT_WIDTH_PX = 1, GLOBAL_PERFORMANCE, PresentationEditor, ICONS, TEXTS, tableActionsOptions;
252763
- var init_src_C1tSJ0Z5_es = __esm(() => {
253856
+ var init_src_sOP3agXO_es = __esm(() => {
252764
253857
  init_rolldown_runtime_B2q5OVn9_es();
252765
- init_SuperConverter_OPfy6vj2_es();
253858
+ init_SuperConverter_CMIR0kxi_es();
252766
253859
  init_jszip_ChlR43oI_es();
252767
253860
  init_uuid_qzgm05fK_es();
252768
253861
  init_constants_Qqwopz80_es();
@@ -270075,13 +271168,240 @@ function print() { __p += __j.call(arguments, '') }
270075
271168
  replaceCommand(true, true);
270076
271169
  replaceCommand(false, true);
270077
271170
  replaceCommand(false, false);
271171
+ SearchIndex = class SearchIndex2 {
271172
+ text = "";
271173
+ segments = [];
271174
+ valid = false;
271175
+ docSize = 0;
271176
+ doc = null;
271177
+ build(doc$12) {
271178
+ this.text = doc$12.textBetween(0, doc$12.content.size, BLOCK_SEPARATOR, ATOM_PLACEHOLDER);
271179
+ this.segments = [];
271180
+ this.docSize = doc$12.content.size;
271181
+ this.doc = doc$12;
271182
+ let offset$1 = 0;
271183
+ this.#walkNodeContent(doc$12, 0, offset$1, (segment) => {
271184
+ this.segments.push(segment);
271185
+ offset$1 = segment.offsetEnd;
271186
+ });
271187
+ this.valid = true;
271188
+ }
271189
+ #walkNodeContent(node3, contentStart, offset$1, addSegment) {
271190
+ let currentOffset = offset$1;
271191
+ let isFirstChild = true;
271192
+ node3.forEach((child, childContentOffset) => {
271193
+ const childDocPos = contentStart + childContentOffset;
271194
+ if (child.isBlock && !isFirstChild) {
271195
+ addSegment({
271196
+ offsetStart: currentOffset,
271197
+ offsetEnd: currentOffset + 1,
271198
+ docFrom: childDocPos,
271199
+ docTo: childDocPos,
271200
+ kind: "blockSep"
271201
+ });
271202
+ currentOffset += 1;
271203
+ }
271204
+ currentOffset = this.#walkNode(child, childDocPos, currentOffset, addSegment);
271205
+ isFirstChild = false;
271206
+ });
271207
+ return currentOffset;
271208
+ }
271209
+ #walkNode(node3, docPos, offset$1, addSegment) {
271210
+ if (node3.isText) {
271211
+ const text5 = node3.text || "";
271212
+ if (text5.length > 0) {
271213
+ addSegment({
271214
+ offsetStart: offset$1,
271215
+ offsetEnd: offset$1 + text5.length,
271216
+ docFrom: docPos,
271217
+ docTo: docPos + text5.length,
271218
+ kind: "text"
271219
+ });
271220
+ return offset$1 + text5.length;
271221
+ }
271222
+ return offset$1;
271223
+ }
271224
+ if (node3.isLeaf) {
271225
+ if (node3.type.name === "hard_break") {
271226
+ addSegment({
271227
+ offsetStart: offset$1,
271228
+ offsetEnd: offset$1 + 1,
271229
+ docFrom: docPos,
271230
+ docTo: docPos + node3.nodeSize,
271231
+ kind: "hardBreak"
271232
+ });
271233
+ return offset$1 + 1;
271234
+ }
271235
+ addSegment({
271236
+ offsetStart: offset$1,
271237
+ offsetEnd: offset$1 + 1,
271238
+ docFrom: docPos,
271239
+ docTo: docPos + node3.nodeSize,
271240
+ kind: "atom"
271241
+ });
271242
+ return offset$1 + 1;
271243
+ }
271244
+ return this.#walkNodeContent(node3, docPos + 1, offset$1, addSegment);
271245
+ }
271246
+ invalidate() {
271247
+ this.valid = false;
271248
+ }
271249
+ isStale(doc$12) {
271250
+ return !this.valid || this.doc !== doc$12;
271251
+ }
271252
+ ensureValid(doc$12) {
271253
+ if (this.isStale(doc$12))
271254
+ this.build(doc$12);
271255
+ }
271256
+ offsetRangeToDocRanges(start$1, end$1) {
271257
+ const ranges = [];
271258
+ for (const segment of this.segments) {
271259
+ if (segment.offsetEnd <= start$1)
271260
+ continue;
271261
+ if (segment.offsetStart >= end$1)
271262
+ break;
271263
+ if (segment.kind !== "text")
271264
+ continue;
271265
+ const overlapStart = Math.max(start$1, segment.offsetStart);
271266
+ const overlapEnd = Math.min(end$1, segment.offsetEnd);
271267
+ if (overlapStart < overlapEnd) {
271268
+ const startInSegment = overlapStart - segment.offsetStart;
271269
+ const endInSegment = overlapEnd - segment.offsetStart;
271270
+ ranges.push({
271271
+ from: segment.docFrom + startInSegment,
271272
+ to: segment.docFrom + endInSegment
271273
+ });
271274
+ }
271275
+ }
271276
+ return ranges;
271277
+ }
271278
+ offsetToDocPos(offset$1) {
271279
+ for (const segment of this.segments)
271280
+ if (offset$1 >= segment.offsetStart && offset$1 < segment.offsetEnd) {
271281
+ if (segment.kind === "text")
271282
+ return segment.docFrom + (offset$1 - segment.offsetStart);
271283
+ return segment.docFrom;
271284
+ }
271285
+ if (this.segments.length > 0 && offset$1 === this.segments[this.segments.length - 1].offsetEnd)
271286
+ return this.segments[this.segments.length - 1].docTo;
271287
+ return null;
271288
+ }
271289
+ static escapeRegex(str) {
271290
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
271291
+ }
271292
+ static toFlexiblePattern(searchString) {
271293
+ const hasLeadingWhitespace = /^[\s\u00a0]+/.test(searchString);
271294
+ const hasTrailingWhitespace = /[\s\u00a0]+$/.test(searchString);
271295
+ const parts = searchString.replace(/^[\s\u00a0]+|[\s\u00a0]+$/g, "").split(/[\s\u00a0]+/).filter((part) => part.length > 0);
271296
+ if (parts.length === 0)
271297
+ return hasLeadingWhitespace || hasTrailingWhitespace ? "[\\s\\u00a0]+" : "";
271298
+ const blockSeparatorPattern = "(?:\\n)*";
271299
+ let pattern = parts.map((part) => {
271300
+ return Array.from(part).map((ch) => SearchIndex2.escapeRegex(ch)).join(blockSeparatorPattern);
271301
+ }).join("[\\s\\u00a0]+");
271302
+ if (hasLeadingWhitespace)
271303
+ pattern = "[\\s\\u00a0]+" + pattern;
271304
+ if (hasTrailingWhitespace)
271305
+ pattern = pattern + "[\\s\\u00a0]+";
271306
+ return pattern;
271307
+ }
271308
+ search(pattern, options = {}) {
271309
+ const { caseSensitive = false, maxMatches = 1000 } = options;
271310
+ const matches2 = [];
271311
+ let regex;
271312
+ if (pattern instanceof RegExp) {
271313
+ const flags = pattern.flags.includes("g") ? pattern.flags : pattern.flags + "g";
271314
+ regex = new RegExp(pattern.source, flags);
271315
+ } else if (typeof pattern === "string") {
271316
+ if (pattern.length === 0)
271317
+ return matches2;
271318
+ const flexiblePattern = SearchIndex2.toFlexiblePattern(pattern);
271319
+ if (flexiblePattern.length === 0)
271320
+ return matches2;
271321
+ const flags = caseSensitive ? "g" : "gi";
271322
+ regex = new RegExp(flexiblePattern, flags);
271323
+ } else
271324
+ return matches2;
271325
+ let match$1;
271326
+ while ((match$1 = regex.exec(this.text)) !== null && matches2.length < maxMatches) {
271327
+ matches2.push({
271328
+ start: match$1.index,
271329
+ end: match$1.index + match$1[0].length,
271330
+ text: match$1[0]
271331
+ });
271332
+ if (match$1[0].length === 0)
271333
+ regex.lastIndex++;
271334
+ }
271335
+ return matches2;
271336
+ }
271337
+ static DIACRITICS_PATTERN = /[\u0300-\u036f\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7]/g;
271338
+ static stripDiacritics(str) {
271339
+ return str.normalize("NFD").replace(SearchIndex2.DIACRITICS_PATTERN, "");
271340
+ }
271341
+ static buildDiacriticOffsetMap(original) {
271342
+ const nfd = original.normalize("NFD");
271343
+ const toOriginal = [];
271344
+ let foldedChars = [];
271345
+ const nfdToOriginal = [];
271346
+ let origIdx = 0;
271347
+ for (let nfdIdx = 0;nfdIdx < nfd.length; ) {
271348
+ const origNfd = original[origIdx].normalize("NFD");
271349
+ for (let k$1 = 0;k$1 < origNfd.length; k$1++)
271350
+ nfdToOriginal[nfdIdx + k$1] = origIdx;
271351
+ nfdIdx += origNfd.length;
271352
+ origIdx++;
271353
+ }
271354
+ for (let nfdIdx = 0;nfdIdx < nfd.length; nfdIdx++) {
271355
+ const cp = nfd.charCodeAt(nfdIdx);
271356
+ if (cp >= 768 && cp <= 879 || cp >= 1425 && cp <= 1469 || cp === 1471 || cp === 1473 || cp === 1474 || cp === 1476 || cp === 1477 || cp === 1479)
271357
+ continue;
271358
+ foldedChars.push(nfd[nfdIdx]);
271359
+ toOriginal.push(nfdToOriginal[nfdIdx]);
271360
+ }
271361
+ toOriginal.push(original.length);
271362
+ return {
271363
+ folded: foldedChars.join(""),
271364
+ toOriginal
271365
+ };
271366
+ }
271367
+ searchIgnoringDiacritics(pattern, options = {}) {
271368
+ const { caseSensitive = false, maxMatches = 1000 } = options;
271369
+ if (!pattern || typeof pattern !== "string" || pattern.length === 0)
271370
+ return [];
271371
+ const { folded: foldedText, toOriginal } = SearchIndex2.buildDiacriticOffsetMap(this.text);
271372
+ const foldedQuery = SearchIndex2.stripDiacritics(pattern);
271373
+ const flexiblePattern = SearchIndex2.toFlexiblePattern(foldedQuery);
271374
+ if (flexiblePattern.length === 0)
271375
+ return [];
271376
+ const flags = caseSensitive ? "g" : "gi";
271377
+ const regex = new RegExp(flexiblePattern, flags);
271378
+ const matches2 = [];
271379
+ let match$1;
271380
+ while ((match$1 = regex.exec(foldedText)) !== null && matches2.length < maxMatches) {
271381
+ const originalStart = toOriginal[match$1.index];
271382
+ const originalEnd = toOriginal[match$1.index + match$1[0].length];
271383
+ matches2.push({
271384
+ start: originalStart,
271385
+ end: originalEnd,
271386
+ text: this.text.slice(originalStart, originalEnd)
271387
+ });
271388
+ if (match$1[0].length === 0)
271389
+ regex.lastIndex++;
271390
+ }
271391
+ return matches2;
271392
+ }
271393
+ };
270078
271394
  customSearchHighlightsKey = new PluginKey("customSearchHighlights");
270079
271395
  Search = Extension.create({
270080
271396
  addStorage() {
270081
271397
  return {
270082
271398
  searchResults: [],
270083
271399
  highlightEnabled: true,
270084
- searchIndex: new SearchIndex
271400
+ searchIndex: new SearchIndex,
271401
+ activeMatchIndex: -1,
271402
+ query: "",
271403
+ caseSensitive: false,
271404
+ ignoreDiacritics: false
270085
271405
  };
270086
271406
  },
270087
271407
  addPmPlugins() {
@@ -270090,8 +271410,26 @@ function print() { __p += __j.call(arguments, '') }
270090
271410
  const searchIndexInvalidatorPlugin = new Plugin({
270091
271411
  key: new PluginKey("searchIndexInvalidator"),
270092
271412
  appendTransaction(transactions, oldState, newState) {
270093
- if (transactions.some((tr) => tr.docChanged) && storage?.searchIndex)
271413
+ if (!transactions.some((tr) => tr.docChanged))
271414
+ return null;
271415
+ if (storage?.searchIndex)
270094
271416
  storage.searchIndex.invalidate();
271417
+ if (storage?.query) {
271418
+ storage.searchIndex.ensureValid(newState.doc);
271419
+ const indexMatches = (storage.ignoreDiacritics ? (q$1, opts) => storage.searchIndex.searchIgnoringDiacritics(q$1, opts) : (q$1, opts) => storage.searchIndex.search(q$1, opts))(storage.query, { caseSensitive: storage.caseSensitive });
271420
+ const refreshed = mapIndexMatchesToDocMatches({
271421
+ searchIndex: storage.searchIndex,
271422
+ indexMatches,
271423
+ doc: newState.doc
271424
+ });
271425
+ storage.searchResults = refreshed;
271426
+ if (refreshed.length === 0)
271427
+ storage.activeMatchIndex = -1;
271428
+ else if (storage.activeMatchIndex < 0)
271429
+ storage.activeMatchIndex = 0;
271430
+ else if (storage.activeMatchIndex >= refreshed.length)
271431
+ storage.activeMatchIndex = refreshed.length - 1;
271432
+ }
270095
271433
  return null;
270096
271434
  }
270097
271435
  });
@@ -270105,10 +271443,13 @@ function print() { __p += __j.call(arguments, '') }
270105
271443
  return null;
270106
271444
  const highlightEnabled = storage?.highlightEnabled !== false;
270107
271445
  const decorations = [];
270108
- for (const match$1 of matches2) {
271446
+ const activeIdx = storage?.activeMatchIndex ?? -1;
271447
+ for (let i4 = 0;i4 < matches2.length; i4++) {
271448
+ const match$1 = matches2[i4];
271449
+ const cls = i4 === activeIdx ? "ProseMirror-active-search-match" : "ProseMirror-search-match";
270109
271450
  const attrs = highlightEnabled ? {
270110
271451
  id: `search-match-${match$1.id}`,
270111
- class: "ProseMirror-search-match"
271452
+ class: cls
270112
271453
  } : { id: `search-match-${match$1.id}` };
270113
271454
  if (match$1.ranges && match$1.ranges.length > 0)
270114
271455
  for (const range of match$1.ranges)
@@ -270195,41 +271536,15 @@ function print() { __p += __j.call(arguments, '') }
270195
271536
  positionTracker?.untrackByType?.(SEARCH_POSITION_TRACKER_TYPE);
270196
271537
  const searchIndex = this.storage.searchIndex;
270197
271538
  searchIndex.ensureValid(state.doc);
270198
- const indexMatches = searchIndex.search(searchPattern, {
270199
- caseSensitive,
270200
- maxMatches
271539
+ const resultMatches = mapIndexMatchesToDocMatches({
271540
+ searchIndex,
271541
+ indexMatches: searchIndex.search(searchPattern, {
271542
+ caseSensitive,
271543
+ maxMatches
271544
+ }),
271545
+ doc: state.doc,
271546
+ positionTracker
270201
271547
  });
270202
- const resultMatches = [];
270203
- for (const indexMatch of indexMatches) {
270204
- const ranges = searchIndex.offsetRangeToDocRanges(indexMatch.start, indexMatch.end);
270205
- if (ranges.length === 0)
270206
- continue;
270207
- const combinedText = ranges.map((r$1) => state.doc.textBetween(r$1.from, r$1.to)).join("");
270208
- const match$1 = {
270209
- from: ranges[0].from,
270210
- to: ranges[ranges.length - 1].to,
270211
- text: combinedText,
270212
- id: v4_default(),
270213
- ranges,
270214
- trackerIds: []
270215
- };
270216
- if (positionTracker?.trackMany) {
270217
- const trackedRanges = ranges.map((range, rangeIndex) => ({
270218
- from: range.from,
270219
- to: range.to,
270220
- spec: {
270221
- type: SEARCH_POSITION_TRACKER_TYPE,
270222
- metadata: { rangeIndex }
270223
- }
270224
- }));
270225
- const trackerIds = positionTracker.trackMany(trackedRanges);
270226
- if (trackerIds.length > 0) {
270227
- match$1.trackerIds = trackerIds;
270228
- match$1.id = trackerIds[0];
270229
- }
270230
- }
270231
- resultMatches.push(match$1);
270232
- }
270233
271548
  this.storage.searchResults = resultMatches;
270234
271549
  this.storage.highlightEnabled = highlight;
270235
271550
  return resultMatches;
@@ -270265,6 +271580,137 @@ function print() { __p += __j.call(arguments, '') }
270265
271580
  });
270266
271581
  }
270267
271582
  return true;
271583
+ },
271584
+ setSearchSession: (query2, options = {}) => ({ state, editor }) => {
271585
+ const caseSensitive = options.caseSensitive ?? false;
271586
+ const ignoreDiacritics = options.ignoreDiacritics ?? false;
271587
+ const highlight = options.highlight ?? true;
271588
+ this.storage.query = query2;
271589
+ this.storage.caseSensitive = caseSensitive;
271590
+ this.storage.ignoreDiacritics = ignoreDiacritics;
271591
+ const positionTracker = getPositionTracker(editor);
271592
+ positionTracker?.untrackByType?.(SEARCH_POSITION_TRACKER_TYPE);
271593
+ if (!query2) {
271594
+ this.storage.searchResults = [];
271595
+ this.storage.activeMatchIndex = -1;
271596
+ this.storage.highlightEnabled = highlight;
271597
+ return {
271598
+ matches: [],
271599
+ activeMatchIndex: -1
271600
+ };
271601
+ }
271602
+ const searchIndex = this.storage.searchIndex;
271603
+ searchIndex.ensureValid(state.doc);
271604
+ const resultMatches = mapIndexMatchesToDocMatches({
271605
+ searchIndex,
271606
+ indexMatches: ignoreDiacritics ? searchIndex.searchIgnoringDiacritics(query2, { caseSensitive }) : searchIndex.search(query2, { caseSensitive }),
271607
+ doc: state.doc,
271608
+ positionTracker
271609
+ });
271610
+ this.storage.searchResults = resultMatches;
271611
+ this.storage.highlightEnabled = highlight;
271612
+ this.storage.activeMatchIndex = resultMatches.length > 0 ? 0 : -1;
271613
+ return {
271614
+ matches: resultMatches,
271615
+ activeMatchIndex: this.storage.activeMatchIndex
271616
+ };
271617
+ },
271618
+ clearSearchSession: () => ({ editor }) => {
271619
+ getPositionTracker(editor)?.untrackByType?.(SEARCH_POSITION_TRACKER_TYPE);
271620
+ this.storage.searchResults = [];
271621
+ this.storage.highlightEnabled = true;
271622
+ this.storage.activeMatchIndex = -1;
271623
+ this.storage.query = "";
271624
+ this.storage.caseSensitive = false;
271625
+ this.storage.ignoreDiacritics = false;
271626
+ return true;
271627
+ },
271628
+ nextSearchMatch: () => ({ state, editor }) => {
271629
+ const matches2 = this.storage.searchResults;
271630
+ if (!matches2 || matches2.length === 0)
271631
+ return {
271632
+ activeMatchIndex: -1,
271633
+ match: null
271634
+ };
271635
+ const nextIdx = (this.storage.activeMatchIndex + 1) % matches2.length;
271636
+ this.storage.activeMatchIndex = nextIdx;
271637
+ const match$1 = matches2[nextIdx];
271638
+ editor.commands.goToSearchResult(match$1);
271639
+ return {
271640
+ activeMatchIndex: nextIdx,
271641
+ match: match$1
271642
+ };
271643
+ },
271644
+ previousSearchMatch: () => ({ state, editor }) => {
271645
+ const matches2 = this.storage.searchResults;
271646
+ if (!matches2 || matches2.length === 0)
271647
+ return {
271648
+ activeMatchIndex: -1,
271649
+ match: null
271650
+ };
271651
+ const prevIdx = (this.storage.activeMatchIndex - 1 + matches2.length) % matches2.length;
271652
+ this.storage.activeMatchIndex = prevIdx;
271653
+ const match$1 = matches2[prevIdx];
271654
+ editor.commands.goToSearchResult(match$1);
271655
+ return {
271656
+ activeMatchIndex: prevIdx,
271657
+ match: match$1
271658
+ };
271659
+ },
271660
+ replaceSearchMatch: (replacement) => ({ state, dispatch, editor, commands: commands$1 }) => {
271661
+ const matches2 = this.storage.searchResults;
271662
+ const activeIdx = this.storage.activeMatchIndex;
271663
+ if (!matches2 || activeIdx < 0 || activeIdx >= matches2.length)
271664
+ return {
271665
+ matches: matches2 || [],
271666
+ activeMatchIndex: activeIdx
271667
+ };
271668
+ const match$1 = matches2[activeIdx];
271669
+ const from$1 = match$1.ranges[0].from;
271670
+ const to = match$1.ranges[match$1.ranges.length - 1].to;
271671
+ const tr = state.tr;
271672
+ if (replacement)
271673
+ tr.replace(from$1, to, new Slice(Fragment.from(state.schema.text(replacement)), 0, 0));
271674
+ else
271675
+ tr.replace(from$1, to, Slice.empty);
271676
+ if (dispatch)
271677
+ dispatch(tr);
271678
+ state.tr;
271679
+ const result = commands$1.setSearchSession(this.storage.query, {
271680
+ caseSensitive: this.storage.caseSensitive,
271681
+ ignoreDiacritics: this.storage.ignoreDiacritics,
271682
+ highlight: this.storage.highlightEnabled
271683
+ });
271684
+ if (result.matches.length > 0) {
271685
+ const newIdx = Math.min(activeIdx, result.matches.length - 1);
271686
+ this.storage.activeMatchIndex = newIdx;
271687
+ result.activeMatchIndex = newIdx;
271688
+ const nextMatch$1 = result.matches[newIdx];
271689
+ if (nextMatch$1)
271690
+ commands$1.goToSearchResult(nextMatch$1);
271691
+ }
271692
+ return result;
271693
+ },
271694
+ replaceAllSearchMatches: (replacement) => ({ state, dispatch, commands: commands$1 }) => {
271695
+ const matches2 = this.storage.searchResults;
271696
+ if (!matches2 || matches2.length === 0)
271697
+ return { replacedCount: 0 };
271698
+ const { schema } = state;
271699
+ const tr = state.tr;
271700
+ const count2 = matches2.length;
271701
+ for (let i4 = matches2.length - 1;i4 >= 0; i4--) {
271702
+ const match$1 = matches2[i4];
271703
+ const from$1 = match$1.ranges[0].from;
271704
+ const to = match$1.ranges[match$1.ranges.length - 1].to;
271705
+ if (replacement)
271706
+ tr.replace(from$1, to, new Slice(Fragment.from(schema.text(replacement)), 0, 0));
271707
+ else
271708
+ tr.replace(from$1, to, Slice.empty);
271709
+ }
271710
+ if (dispatch)
271711
+ dispatch(tr);
271712
+ commands$1.clearSearchSession();
271713
+ return { replacedCount: count2 };
270268
271714
  }
270269
271715
  };
270270
271716
  }
@@ -270287,75 +271733,49 @@ function print() { __p += __j.call(arguments, '') }
270287
271733
  name: "permissionRanges",
270288
271734
  addStorage() {
270289
271735
  return {
270290
- ranges: [],
270291
- hasAllowedRanges: false
271736
+ allRanges: [],
271737
+ allowedRanges: [],
271738
+ hasAllowedRanges: false,
271739
+ ranges: []
270292
271740
  };
270293
271741
  },
270294
271742
  addPmPlugins() {
270295
271743
  const editor = this.editor;
270296
271744
  const storage = this.storage;
270297
- let originalSetDocumentMode = null;
270298
- const getAllowedIdentifiers = () => buildAllowedIdentifierSet(editor);
270299
- const toggleEditableIfAllowed = (hasAllowedRanges) => {
270300
- if (!editor || editor.isDestroyed)
270301
- return;
270302
- if (editor.options.documentMode !== "viewing")
270303
- return;
270304
- if (hasAllowedRanges && !editor.isEditable)
270305
- editor.setEditable(true, false);
270306
- else if (!hasAllowedRanges && editor.isEditable)
270307
- editor.setEditable(false, false);
270308
- };
270309
- const updateEditableState = (hasAllowedRanges) => {
270310
- const nextValue = Boolean(hasAllowedRanges);
270311
- const previousValue = storage.hasAllowedRanges;
270312
- storage.hasAllowedRanges = nextValue;
270313
- if (previousValue === nextValue)
270314
- return;
270315
- toggleEditableIfAllowed(nextValue);
270316
- };
270317
- if (editor && typeof editor.setDocumentMode === "function") {
270318
- originalSetDocumentMode = editor.setDocumentMode.bind(editor);
270319
- editor.setDocumentMode = (mode, caller) => {
270320
- originalSetDocumentMode(mode, caller);
270321
- const state = editor.state;
270322
- if (!state)
270323
- return;
270324
- const pluginState = PERMISSION_PLUGIN_KEY.getState(state);
270325
- if (pluginState)
270326
- toggleEditableIfAllowed(pluginState.hasAllowedRanges);
270327
- };
270328
- }
271745
+ const getAllowedIdentifiers = () => buildAllowedIdentifierSetFromEditor(editor);
270329
271746
  return [new Plugin({
270330
271747
  key: PERMISSION_PLUGIN_KEY,
270331
271748
  state: {
270332
271749
  init(_$1, state) {
270333
271750
  const permissionTypeInfo = getPermissionTypeInfo(state.schema);
270334
- const permissionState = buildPermissionState(state.doc, getAllowedIdentifiers(), permissionTypeInfo);
271751
+ const protectionEnforced = isReadOnlyProtectionRuntimeEnforced(editor);
271752
+ const permissionState = buildPermissionState(state.doc, getAllowedIdentifiers(), permissionTypeInfo, protectionEnforced);
271753
+ storage.allRanges = permissionState.allRanges;
271754
+ storage.allowedRanges = permissionState.allowedRanges;
271755
+ storage.hasAllowedRanges = permissionState.hasAllowedRanges;
270335
271756
  storage.ranges = permissionState.ranges;
270336
- updateEditableState(permissionState.hasAllowedRanges);
271757
+ applyEffectiveEditability(editor, { refilterRanges: false });
270337
271758
  return permissionState;
270338
271759
  },
270339
271760
  apply(tr, value, _oldState, newState) {
270340
- let permissionState = value;
270341
- if (tr.docChanged) {
270342
- const permissionTypeInfo = getPermissionTypeInfo(newState.schema);
270343
- permissionState = buildPermissionState(newState.doc, getAllowedIdentifiers(), permissionTypeInfo);
270344
- storage.ranges = permissionState.ranges;
270345
- updateEditableState(permissionState.hasAllowedRanges);
270346
- }
271761
+ if (!tr.docChanged)
271762
+ return value;
271763
+ const permissionTypeInfo = getPermissionTypeInfo(newState.schema);
271764
+ const protectionEnforced = isReadOnlyProtectionRuntimeEnforced(editor);
271765
+ const permissionState = buildPermissionState(newState.doc, getAllowedIdentifiers(), permissionTypeInfo, protectionEnforced);
271766
+ storage.allRanges = permissionState.allRanges;
271767
+ storage.allowedRanges = permissionState.allowedRanges;
271768
+ storage.hasAllowedRanges = permissionState.hasAllowedRanges;
271769
+ storage.ranges = permissionState.ranges;
271770
+ applyEffectiveEditability(editor, { refilterRanges: false });
270347
271771
  return permissionState;
270348
271772
  }
270349
271773
  },
270350
- view() {
270351
- return { destroy() {
270352
- if (editor && originalSetDocumentMode)
270353
- editor.setDocumentMode = originalSetDocumentMode;
270354
- } };
270355
- },
270356
271774
  appendTransaction(transactions, oldState, newState) {
270357
271775
  if (!transactions.some((tr$1) => tr$1.docChanged))
270358
271776
  return null;
271777
+ if (transactions.some((tr$1) => tr$1.getMeta?.("permissionRangeMutation")))
271778
+ return null;
270359
271779
  if (transactions.some((tr$1) => tr$1.getMeta?.(ySyncPluginKey)))
270360
271780
  return null;
270361
271781
  const permTypes = getPermissionTypeInfo(newState.schema);
@@ -270415,11 +271835,15 @@ function print() { __p += __j.call(arguments, '') }
270415
271835
  return true;
270416
271836
  if (tr.getMeta?.(ySyncPluginKey))
270417
271837
  return true;
270418
- if (!editor || editor.options.documentMode !== "viewing")
271838
+ if (tr.getMeta?.("permissionRangeMutation"))
271839
+ return true;
271840
+ if (!editor)
270419
271841
  return true;
270420
- const pluginState = PERMISSION_PLUGIN_KEY.getState(state);
270421
- if (!pluginState?.hasAllowedRanges)
271842
+ if (!isReadOnlyProtectionRuntimeEnforced(editor))
270422
271843
  return true;
271844
+ const activeRanges = storage.allowedRanges ?? storage.ranges;
271845
+ if (!activeRanges?.length)
271846
+ return false;
270423
271847
  const changedRanges = collectChangedRanges(tr);
270424
271848
  if (!changedRanges.length)
270425
271849
  return true;
@@ -270427,12 +271851,35 @@ function print() { __p += __j.call(arguments, '') }
270427
271851
  if (!permTypes.startTypes.length || !permTypes.endTypes.length)
270428
271852
  return true;
270429
271853
  return changedRanges.every((range) => {
270430
- return isRangeAllowed(trimPermissionTagsFromRange(state.doc, range, permTypes.allTypeSet), pluginState.ranges);
271854
+ return isRangeAllowed(trimPermissionTagsFromRange(state.doc, range, permTypes.allTypeSet), activeRanges);
270431
271855
  });
270432
271856
  }
270433
271857
  })];
270434
271858
  }
270435
271859
  });
271860
+ Protection = Extension.create({
271861
+ name: "protection",
271862
+ addStorage() {
271863
+ return {
271864
+ state: {
271865
+ editingRestriction: {
271866
+ mode: "none",
271867
+ enforced: false,
271868
+ runtimeEnforced: false,
271869
+ passwordProtected: false,
271870
+ formattingRestricted: false
271871
+ },
271872
+ writeProtection: {
271873
+ enabled: false,
271874
+ passwordProtected: false
271875
+ },
271876
+ readOnlyRecommended: false
271877
+ },
271878
+ initialized: false,
271879
+ editableBaseline: null
271880
+ };
271881
+ }
271882
+ });
270436
271883
  FONT_FAMILY_FALLBACKS2 = Object.freeze({
270437
271884
  swiss: "Arial, sans-serif",
270438
271885
  roman: "Times New Roman, serif",
@@ -279224,7 +280671,7 @@ function print() { __p += __j.call(arguments, '') }
279224
280671
  stylesPartDescriptor = {
279225
280672
  id: STYLES_PART_ID,
279226
280673
  ensurePart(editor) {
279227
- const converter = getConverter$42(editor);
280674
+ const converter = getConverter$52(editor);
279228
280675
  if (converter?.convertedXml[STYLES_PART_ID])
279229
280676
  return converter.convertedXml[STYLES_PART_ID];
279230
280677
  return {
@@ -279239,7 +280686,7 @@ function print() { __p += __j.call(arguments, '') }
279239
280686
  },
279240
280687
  afterCommit(ctx$1) {
279241
280688
  if (ctx$1.source.startsWith("collab:remote:")) {
279242
- const converter = getConverter$42(ctx$1.editor);
280689
+ const converter = getConverter$52(ctx$1.editor);
279243
280690
  if (converter)
279244
280691
  try {
279245
280692
  converter.translatedLinkedStyles = translateStyleDefinitions(converter.convertedXml);
@@ -279459,6 +280906,7 @@ function print() { __p += __j.call(arguments, '') }
279459
280906
  KIND_ORDER = ["header", "footer"];
279460
280907
  HEADER_FILE_PATTERN2 = /header(\d+)\.xml$/;
279461
280908
  FOOTER_FILE_PATTERN2 = /footer(\d+)\.xml$/;
280909
+ SETTINGS_PART = SETTINGS_PART_PATH;
279462
280910
  SPECIAL_NOTE_TYPES = new Set(["separator", "continuationSeparator"]);
279463
280911
  RESTART_POLICY_TO_OOXML = {
279464
280912
  continuous: "continuous",
@@ -279831,6 +281279,7 @@ function print() { __p += __j.call(arguments, '') }
279831
281279
  this.setOptions(resolvedOptions);
279832
281280
  this.#createConverter();
279833
281281
  initPartsRuntime(this);
281282
+ this.#initProtectionState();
279834
281283
  this.#initMedia();
279835
281284
  const shouldMountRenderer = this.#shouldMountRenderer();
279836
281285
  if (shouldMountRenderer) {
@@ -279855,6 +281304,7 @@ function print() { __p += __j.call(arguments, '') }
279855
281304
  if (Boolean(this.options.markdown || this.options.html || this.options.loadFromSchema || this.options.jsonOverride || this.options.mode === "html" || this.options.mode === "text"))
279856
281305
  this.migrateListsToV2();
279857
281306
  this.setDocumentMode(this.options.documentMode, "init");
281307
+ this.#emitProtectionInit();
279858
281308
  this.initializeCollaborationData();
279859
281309
  if (!this.options.ydoc && !this.options.isChildEditor)
279860
281310
  this.#initComments();
@@ -279878,18 +281328,42 @@ function print() { __p += __j.call(arguments, '') }
279878
281328
  this.converter = undefined;
279879
281329
  if (this.storage.image)
279880
281330
  this.storage.image.media = {};
281331
+ const protStorageToReset = getProtectionStorage(this);
281332
+ if (protStorageToReset) {
281333
+ protStorageToReset.state = { ...DEFAULT_PROTECTION_STATE };
281334
+ protStorageToReset.initialized = false;
281335
+ protStorageToReset.editableBaseline = null;
281336
+ }
279881
281337
  this.#sourcePath = null;
279882
281338
  this.options.initialState = null;
279883
281339
  this.options.content = "";
279884
281340
  this.options.fileSource = null;
279885
281341
  this._state = undefined;
279886
281342
  }
281343
+ #initProtectionState() {
281344
+ const protStorage = getProtectionStorage(this);
281345
+ if (!protStorage)
281346
+ return;
281347
+ protStorage.state = parseProtectionState(this.converter ? readSettingsRoot(this.converter) : null);
281348
+ protStorage.initialized = true;
281349
+ }
281350
+ #emitProtectionInit() {
281351
+ const protStorage = getProtectionStorage(this);
281352
+ if (!protStorage?.initialized)
281353
+ return;
281354
+ this.emit("protectionChanged", {
281355
+ editor: this,
281356
+ state: protStorage.state,
281357
+ source: "init"
281358
+ });
281359
+ }
279887
281360
  #init() {
279888
281361
  this.#createExtensionService();
279889
281362
  this.#createCommandService();
279890
281363
  this.#createSchema();
279891
281364
  this.#createConverter();
279892
281365
  initPartsRuntime(this);
281366
+ this.#initProtectionState();
279893
281367
  this.#initMedia();
279894
281368
  this.on("beforeCreate", this.options.onBeforeCreate);
279895
281369
  this.emit("beforeCreate", { editor: this });
@@ -279933,6 +281407,7 @@ function print() { __p += __j.call(arguments, '') }
279933
281407
  if (Boolean(this.options.markdown || this.options.html || this.options.loadFromSchema || this.options.jsonOverride || this.options.mode === "html" || this.options.mode === "text"))
279934
281408
  this.migrateListsToV2();
279935
281409
  this.setDocumentMode(this.options.documentMode, "init");
281410
+ this.#emitProtectionInit();
279936
281411
  if (!this.options.ydoc && !this.options.isChildEditor)
279937
281412
  this.#initComments();
279938
281413
  if (shouldMountRenderer) {
@@ -280131,6 +281606,7 @@ function print() { __p += __j.call(arguments, '') }
280131
281606
  if (pm)
280132
281607
  pm.classList.remove("view-mode");
280133
281608
  }
281609
+ applyEffectiveEditability(this);
280134
281610
  }
280135
281611
  blur() {
280136
281612
  this.view?.dom?.blur();
@@ -281379,7 +282855,6 @@ function print() { __p += __j.call(arguments, '') }
281379
282855
  EXCLUDED_PLUGIN_KEY_REF_LIST = [
281380
282856
  TrackChangesBasePluginKey,
281381
282857
  CommentsPluginKey,
281382
- customSearchHighlightsKey,
281383
282858
  AiPluginKey,
281384
282859
  CustomSelectionPluginKey,
281385
282860
  LinkedStylesPluginKey,
@@ -284119,6 +285594,16 @@ function print() { __p += __j.call(arguments, '') }
284119
285594
  event: "commentsUpdate",
284120
285595
  handler: handleCommentsUpdate
284121
285596
  });
285597
+ const handleProtectionChanged = () => {
285598
+ this.#updatePermissionOverlay();
285599
+ this.#pendingDocChange = true;
285600
+ this.#scheduleRerender();
285601
+ };
285602
+ this.#editor.on("protectionChanged", handleProtectionChanged);
285603
+ this.#editorListeners.push({
285604
+ event: "protectionChanged",
285605
+ handler: handleProtectionChanged
285606
+ });
284122
285607
  }
284123
285608
  #setupCollaborationCursors() {
284124
285609
  this.#remoteCursorManager?.setup();
@@ -286145,6 +287630,9 @@ function print() { __p += __j.call(arguments, '') }
286145
287630
  this.#errorBannerMessage = null;
286146
287631
  }
286147
287632
  #isViewLocked() {
287633
+ const protectionStorage = this.#editor?.storage?.protection;
287634
+ if (protectionStorage?.initialized === true && protectionStorage?.state?.editingRestriction?.runtimeEnforced === true)
287635
+ return !!!this.#editor?.storage?.permissionRanges?.hasAllowedRanges;
286148
287636
  if (this.#documentMode !== "viewing")
286149
287637
  return false;
286150
287638
  if (!!this.#editor?.storage?.permissionRanges?.hasAllowedRanges)
@@ -286317,8 +287805,8 @@ var init_zipper_YmNpPIyc_es = __esm(() => {
286317
287805
 
286318
287806
  // ../../packages/superdoc/dist/super-editor.es.js
286319
287807
  var init_super_editor_es = __esm(() => {
286320
- init_src_C1tSJ0Z5_es();
286321
- init_SuperConverter_OPfy6vj2_es();
287808
+ init_src_sOP3agXO_es();
287809
+ init_SuperConverter_CMIR0kxi_es();
286322
287810
  init_jszip_ChlR43oI_es();
286323
287811
  init_xml_js_40FWvL78_es();
286324
287812
  init_constants_Qqwopz80_es();