@superdoc-dev/cli 0.5.0-next.19 → 0.5.0-next.20

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 +1086 -76
  2. package/package.json +7 -7
package/dist/index.js CHANGED
@@ -9283,25 +9283,30 @@ var init_schemas = __esm(() => {
9283
9283
  comments: { type: "boolean" },
9284
9284
  styles: { type: "boolean" },
9285
9285
  numbering: { type: "boolean" },
9286
- headerFooters: { type: "boolean", const: false }
9286
+ headerFooters: { type: "boolean" }
9287
9287
  }, ["body", "comments", "styles", "numbering", "headerFooters"]);
9288
9288
  diffSummarySchema = objectSchema({
9289
9289
  hasChanges: { type: "boolean" },
9290
- changedComponents: { type: "array", items: { type: "string", enum: ["body", "comments", "styles", "numbering"] } },
9290
+ changedComponents: {
9291
+ type: "array",
9292
+ items: { type: "string", enum: ["body", "comments", "styles", "numbering", "headerFooters", "parts"] }
9293
+ },
9291
9294
  body: objectSchema({ hasChanges: { type: "boolean" } }, ["hasChanges"]),
9292
9295
  comments: objectSchema({ hasChanges: { type: "boolean" } }, ["hasChanges"]),
9293
9296
  styles: objectSchema({ hasChanges: { type: "boolean" } }, ["hasChanges"]),
9294
- numbering: objectSchema({ hasChanges: { type: "boolean" } }, ["hasChanges"])
9295
- }, ["hasChanges", "changedComponents", "body", "comments", "styles", "numbering"]);
9297
+ numbering: objectSchema({ hasChanges: { type: "boolean" } }, ["hasChanges"]),
9298
+ headerFooters: objectSchema({ hasChanges: { type: "boolean" } }, ["hasChanges"]),
9299
+ parts: objectSchema({ hasChanges: { type: "boolean" } }, ["hasChanges"])
9300
+ }, ["hasChanges", "changedComponents", "body", "comments", "styles", "numbering", "headerFooters", "parts"]);
9296
9301
  diffSnapshotSchema = objectSchema({
9297
- version: { type: "string", const: "sd-diff-snapshot/v1" },
9302
+ version: { type: "string", enum: ["sd-diff-snapshot/v1", "sd-diff-snapshot/v2"] },
9298
9303
  engine: { type: "string", enum: ["super-editor"] },
9299
9304
  fingerprint: { type: "string" },
9300
9305
  coverage: diffCoverageSchema,
9301
9306
  payload: { type: "object", description: "Opaque engine-owned snapshot data." }
9302
9307
  }, ["version", "engine", "fingerprint", "coverage", "payload"]);
9303
9308
  diffPayloadSchema = objectSchema({
9304
- version: { type: "string", const: "sd-diff-payload/v1" },
9309
+ version: { type: "string", enum: ["sd-diff-payload/v1", "sd-diff-payload/v2"] },
9305
9310
  engine: { type: "string", enum: ["super-editor"] },
9306
9311
  baseFingerprint: { type: "string" },
9307
9312
  targetFingerprint: { type: "string" },
@@ -15575,8 +15580,8 @@ function validateSnapshotWrapper(snapshot) {
15575
15580
  if (!isRecord2(snapshot)) {
15576
15581
  throw new DocumentApiValidationError("INVALID_INPUT", "targetSnapshot must be a DiffSnapshot object.");
15577
15582
  }
15578
- if (snapshot.version !== SNAPSHOT_VERSION) {
15579
- throw new DocumentApiValidationError("CAPABILITY_UNSUPPORTED", `Unsupported snapshot version "${String(snapshot.version)}". Expected "${SNAPSHOT_VERSION}".`);
15583
+ if (!SNAPSHOT_VERSIONS.has(String(snapshot.version))) {
15584
+ throw new DocumentApiValidationError("CAPABILITY_UNSUPPORTED", `Unsupported snapshot version "${String(snapshot.version)}". Expected one of "${[...SNAPSHOT_VERSIONS].join('", "')}".`);
15580
15585
  }
15581
15586
  if (typeof snapshot.engine !== "string") {
15582
15587
  throw new DocumentApiValidationError("INVALID_INPUT", "targetSnapshot.engine must be a string.");
@@ -15595,8 +15600,8 @@ function validateDiffPayloadWrapper(diff) {
15595
15600
  if (!isRecord2(diff)) {
15596
15601
  throw new DocumentApiValidationError("INVALID_INPUT", "diff must be a DiffPayload object.");
15597
15602
  }
15598
- if (diff.version !== PAYLOAD_VERSION) {
15599
- throw new DocumentApiValidationError("CAPABILITY_UNSUPPORTED", `Unsupported diff version "${String(diff.version)}". Expected "${PAYLOAD_VERSION}".`);
15603
+ if (!PAYLOAD_VERSIONS.has(String(diff.version))) {
15604
+ throw new DocumentApiValidationError("CAPABILITY_UNSUPPORTED", `Unsupported diff version "${String(diff.version)}". Expected one of "${[...PAYLOAD_VERSIONS].join('", "')}".`);
15600
15605
  }
15601
15606
  if (typeof diff.engine !== "string") {
15602
15607
  throw new DocumentApiValidationError("INVALID_INPUT", "diff.engine must be a string.");
@@ -15628,9 +15633,11 @@ function executeDiffApply(adapter, input, options) {
15628
15633
  validateDiffPayloadWrapper(input?.diff);
15629
15634
  return adapter.apply(input, options);
15630
15635
  }
15631
- var SNAPSHOT_VERSION = "sd-diff-snapshot/v1", PAYLOAD_VERSION = "sd-diff-payload/v1";
15636
+ var SNAPSHOT_VERSIONS, PAYLOAD_VERSIONS;
15632
15637
  var init_diff = __esm(() => {
15633
15638
  init_errors2();
15639
+ SNAPSHOT_VERSIONS = new Set(["sd-diff-snapshot/v1", "sd-diff-snapshot/v2"]);
15640
+ PAYLOAD_VERSIONS = new Set(["sd-diff-payload/v1", "sd-diff-payload/v2"]);
15634
15641
  });
15635
15642
 
15636
15643
  // ../../packages/document-api/src/tables/tables.ts
@@ -63339,7 +63346,7 @@ var init_remark_gfm_z_sDF4ss_es = __esm(() => {
63339
63346
  emptyOptions2 = {};
63340
63347
  });
63341
63348
 
63342
- // ../../packages/superdoc/dist/chunks/SuperConverter-DtIvNa0T.es.js
63349
+ // ../../packages/superdoc/dist/chunks/SuperConverter-CYbYOJeZ.es.js
63343
63350
  function getExtensionConfigField(extension$1, field, context = { name: "" }) {
63344
63351
  const fieldValue = extension$1.config[field];
63345
63352
  if (typeof fieldValue === "function")
@@ -68061,8 +68068,8 @@ function isRecord$1(value) {
68061
68068
  function validateSnapshotWrapper2(snapshot2) {
68062
68069
  if (!isRecord$1(snapshot2))
68063
68070
  throw new DocumentApiValidationError2("INVALID_INPUT", "targetSnapshot must be a DiffSnapshot object.");
68064
- if (snapshot2.version !== SNAPSHOT_VERSION2)
68065
- throw new DocumentApiValidationError2("CAPABILITY_UNSUPPORTED", `Unsupported snapshot version "${String(snapshot2.version)}". Expected "${SNAPSHOT_VERSION2}".`);
68071
+ if (!SNAPSHOT_VERSIONS2.has(String(snapshot2.version)))
68072
+ throw new DocumentApiValidationError2("CAPABILITY_UNSUPPORTED", `Unsupported snapshot version "${String(snapshot2.version)}". Expected one of "${[...SNAPSHOT_VERSIONS2].join('", "')}".`);
68066
68073
  if (typeof snapshot2.engine !== "string")
68067
68074
  throw new DocumentApiValidationError2("INVALID_INPUT", "targetSnapshot.engine must be a string.");
68068
68075
  if (typeof snapshot2.fingerprint !== "string")
@@ -68075,8 +68082,8 @@ function validateSnapshotWrapper2(snapshot2) {
68075
68082
  function validateDiffPayloadWrapper2(diff) {
68076
68083
  if (!isRecord$1(diff))
68077
68084
  throw new DocumentApiValidationError2("INVALID_INPUT", "diff must be a DiffPayload object.");
68078
- if (diff.version !== PAYLOAD_VERSION2)
68079
- throw new DocumentApiValidationError2("CAPABILITY_UNSUPPORTED", `Unsupported diff version "${String(diff.version)}". Expected "${PAYLOAD_VERSION2}".`);
68085
+ if (!PAYLOAD_VERSIONS2.has(String(diff.version)))
68086
+ throw new DocumentApiValidationError2("CAPABILITY_UNSUPPORTED", `Unsupported diff version "${String(diff.version)}". Expected one of "${[...PAYLOAD_VERSIONS2].join('", "')}".`);
68080
68087
  if (typeof diff.engine !== "string")
68081
68088
  throw new DocumentApiValidationError2("INVALID_INPUT", "diff.engine must be a string.");
68082
68089
  if (typeof diff.baseFingerprint !== "string")
@@ -99712,7 +99719,7 @@ var isRegExp = (value) => {
99712
99719
  tracked: false,
99713
99720
  carrier: runAttributeCarrier2(runPropertyKey ?? key),
99714
99721
  schema
99715
- }), 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) => ({
99722
+ }), 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_VERSIONS2, PAYLOAD_VERSIONS2, 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) => ({
99716
99723
  handlerName,
99717
99724
  handler: (params3) => {
99718
99725
  const { nodes } = params3;
@@ -113988,7 +113995,7 @@ var isRegExp = (value) => {
113988
113995
  state.kern = kernNode.attributes["w:val"];
113989
113996
  }
113990
113997
  }, SuperConverter;
113991
- var init_SuperConverter_DtIvNa0T_es = __esm(() => {
113998
+ var init_SuperConverter_CYbYOJeZ_es = __esm(() => {
113992
113999
  init_rolldown_runtime_B2q5OVn9_es();
113993
114000
  init_jszip_ChlR43oI_es();
113994
114001
  init_xml_js_40FWvL78_es();
@@ -124840,10 +124847,7 @@ var init_SuperConverter_DtIvNa0T_es = __esm(() => {
124840
124847
  comments: { type: "boolean" },
124841
124848
  styles: { type: "boolean" },
124842
124849
  numbering: { type: "boolean" },
124843
- headerFooters: {
124844
- type: "boolean",
124845
- const: false
124846
- }
124850
+ headerFooters: { type: "boolean" }
124847
124851
  }, [
124848
124852
  "body",
124849
124853
  "comments",
@@ -124861,26 +124865,32 @@ var init_SuperConverter_DtIvNa0T_es = __esm(() => {
124861
124865
  "body",
124862
124866
  "comments",
124863
124867
  "styles",
124864
- "numbering"
124868
+ "numbering",
124869
+ "headerFooters",
124870
+ "parts"
124865
124871
  ]
124866
124872
  }
124867
124873
  },
124868
124874
  body: objectSchema2({ hasChanges: { type: "boolean" } }, ["hasChanges"]),
124869
124875
  comments: objectSchema2({ hasChanges: { type: "boolean" } }, ["hasChanges"]),
124870
124876
  styles: objectSchema2({ hasChanges: { type: "boolean" } }, ["hasChanges"]),
124871
- numbering: objectSchema2({ hasChanges: { type: "boolean" } }, ["hasChanges"])
124877
+ numbering: objectSchema2({ hasChanges: { type: "boolean" } }, ["hasChanges"]),
124878
+ headerFooters: objectSchema2({ hasChanges: { type: "boolean" } }, ["hasChanges"]),
124879
+ parts: objectSchema2({ hasChanges: { type: "boolean" } }, ["hasChanges"])
124872
124880
  }, [
124873
124881
  "hasChanges",
124874
124882
  "changedComponents",
124875
124883
  "body",
124876
124884
  "comments",
124877
124885
  "styles",
124878
- "numbering"
124886
+ "numbering",
124887
+ "headerFooters",
124888
+ "parts"
124879
124889
  ]);
124880
124890
  diffSnapshotSchema2 = objectSchema2({
124881
124891
  version: {
124882
124892
  type: "string",
124883
- const: "sd-diff-snapshot/v1"
124893
+ enum: ["sd-diff-snapshot/v1", "sd-diff-snapshot/v2"]
124884
124894
  },
124885
124895
  engine: {
124886
124896
  type: "string",
@@ -124902,7 +124912,7 @@ var init_SuperConverter_DtIvNa0T_es = __esm(() => {
124902
124912
  diffPayloadSchema2 = objectSchema2({
124903
124913
  version: {
124904
124914
  type: "string",
124905
- const: "sd-diff-payload/v1"
124915
+ enum: ["sd-diff-payload/v1", "sd-diff-payload/v2"]
124906
124916
  },
124907
124917
  engine: {
124908
124918
  type: "string",
@@ -128428,6 +128438,8 @@ var init_SuperConverter_DtIvNa0T_es = __esm(() => {
128428
128438
  SUPPORTED_DELETE_NODE_TYPES2 = new Set(DELETABLE_BLOCK_NODE_TYPES2);
128429
128439
  REJECTED_DELETE_NODE_TYPES2 = new Set(["tableRow", "tableCell"]);
128430
128440
  VALID_BLOCK_NODE_TYPES3 = new Set(BLOCK_NODE_TYPES2);
128441
+ SNAPSHOT_VERSIONS2 = new Set(["sd-diff-snapshot/v1", "sd-diff-snapshot/v2"]);
128442
+ PAYLOAD_VERSIONS2 = new Set(["sd-diff-payload/v1", "sd-diff-payload/v2"]);
128431
128443
  VALID_STYLE_OPTION_FLAGS2 = new Set([
128432
128444
  "headerRow",
128433
128445
  "lastRow",
@@ -172499,7 +172511,7 @@ var init_remark_gfm_CjV8kaUy_es = __esm(() => {
172499
172511
  init_remark_gfm_z_sDF4ss_es();
172500
172512
  });
172501
172513
 
172502
- // ../../packages/superdoc/dist/chunks/src-CEDaw2yY.es.js
172514
+ // ../../packages/superdoc/dist/chunks/src-CxFOmQ5k.es.js
172503
172515
  function deleteProps(obj, propOrProps) {
172504
172516
  const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps;
172505
172517
  const removeNested = (target, pathParts, index2 = 0) => {
@@ -190797,6 +190809,336 @@ function resolveCommentBodyNodeJSON(comment2) {
190797
190809
  function isRecord$4(value) {
190798
190810
  return value !== null && typeof value === "object" && !Array.isArray(value);
190799
190811
  }
190812
+ function captureHeaderFooterState(editor) {
190813
+ return {
190814
+ parts: collectHeaderFooterParts(editor),
190815
+ slots: collectHeaderFooterSlots(editor)
190816
+ };
190817
+ }
190818
+ function diffHeaderFooters(oldState, newState, schema) {
190819
+ const previous3 = oldState ?? {
190820
+ parts: [],
190821
+ slots: []
190822
+ };
190823
+ const next2 = newState ?? {
190824
+ parts: [],
190825
+ slots: []
190826
+ };
190827
+ const previousParts = new Map(previous3.parts.map((part) => [part.refId, part]));
190828
+ const nextParts = new Map(next2.parts.map((part) => [part.refId, part]));
190829
+ const addedParts = [];
190830
+ const removedParts = [];
190831
+ const modifiedParts = [];
190832
+ for (const nextPart of next2.parts) {
190833
+ const previousPart = previousParts.get(nextPart.refId);
190834
+ if (!previousPart) {
190835
+ addedParts.push(structuredClone(nextPart));
190836
+ continue;
190837
+ }
190838
+ if (previousPart.kind !== nextPart.kind) {
190839
+ removedParts.push(structuredClone(previousPart));
190840
+ addedParts.push(structuredClone(nextPart));
190841
+ continue;
190842
+ }
190843
+ const oldDoc = schema.nodeFromJSON(previousPart.content);
190844
+ const newDoc = schema.nodeFromJSON(nextPart.content);
190845
+ const docDiffs = diffNodes(normalizeNodes(oldDoc), normalizeNodes(newDoc));
190846
+ if (docDiffs.length > 0 || previousPart.partPath !== nextPart.partPath)
190847
+ modifiedParts.push({
190848
+ refId: nextPart.refId,
190849
+ kind: nextPart.kind,
190850
+ oldPartPath: previousPart.partPath,
190851
+ partPath: nextPart.partPath,
190852
+ docDiffs
190853
+ });
190854
+ }
190855
+ for (const previousPart of previous3.parts)
190856
+ if (!nextParts.has(previousPart.refId))
190857
+ removedParts.push(structuredClone(previousPart));
190858
+ const previousSlots = new Map(previous3.slots.map((slot) => [slot.sectionId, slot]));
190859
+ const nextSlots = new Map(next2.slots.map((slot) => [slot.sectionId, slot]));
190860
+ const slotChanges = [];
190861
+ const sectionIds = new Set([...previousSlots.keys(), ...nextSlots.keys()]);
190862
+ for (const sectionId of sectionIds) {
190863
+ const previousSlot = previousSlots.get(sectionId);
190864
+ const nextSlot = nextSlots.get(sectionId) ?? createClearedSlotState(sectionId);
190865
+ if (!slotsEqual(previousSlot, nextSlot))
190866
+ slotChanges.push(structuredClone(nextSlot));
190867
+ }
190868
+ if (addedParts.length === 0 && removedParts.length === 0 && modifiedParts.length === 0 && slotChanges.length === 0)
190869
+ return null;
190870
+ return {
190871
+ addedParts,
190872
+ removedParts,
190873
+ modifiedParts,
190874
+ slotChanges
190875
+ };
190876
+ }
190877
+ function collectHeaderFooterParts(editor) {
190878
+ const parts = [];
190879
+ const partPaths = readHeaderFooterPartPaths(editor);
190880
+ for (const kind of PART_KINDS) {
190881
+ const source = kind === "header" ? editor.converter?.headers : editor.converter?.footers;
190882
+ if (!source)
190883
+ continue;
190884
+ for (const [refId, content3] of Object.entries(source)) {
190885
+ const partPath = partPaths.get(refId);
190886
+ if (!partPath || !content3 || typeof content3 !== "object")
190887
+ continue;
190888
+ parts.push({
190889
+ refId,
190890
+ kind,
190891
+ partPath,
190892
+ content: structuredClone(content3)
190893
+ });
190894
+ }
190895
+ }
190896
+ return parts.sort(compareParts);
190897
+ }
190898
+ function readHeaderFooterPartPaths(editor) {
190899
+ const result = /* @__PURE__ */ new Map;
190900
+ const relsRoot = editor.converter?.convertedXml?.["word/_rels/document.xml.rels"]?.elements?.find((entry) => entry.name === "Relationships");
190901
+ if (!relsRoot?.elements)
190902
+ return result;
190903
+ for (const entry of relsRoot.elements) {
190904
+ const type = entry.attributes?.Type;
190905
+ if (entry.name !== "Relationship" || type !== "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" && type !== "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer")
190906
+ continue;
190907
+ const refId = entry.attributes?.Id;
190908
+ const target = entry.attributes?.Target;
190909
+ if (!refId || !target)
190910
+ continue;
190911
+ result.set(refId, normalizePartPath(target));
190912
+ }
190913
+ return result;
190914
+ }
190915
+ function normalizePartPath(target) {
190916
+ let normalized = target.replace(/^\.\//, "");
190917
+ if (normalized.startsWith("../"))
190918
+ normalized = normalized.slice(3);
190919
+ if (normalized.startsWith("/"))
190920
+ normalized = normalized.slice(1);
190921
+ if (!normalized.startsWith("word/"))
190922
+ normalized = `word/${normalized}`;
190923
+ return normalized;
190924
+ }
190925
+ function collectHeaderFooterSlots(editor) {
190926
+ const slots = [];
190927
+ for (const projection of resolveSectionProjections(editor)) {
190928
+ const sectPr = readTargetSectPr(editor, projection);
190929
+ const headerRefs = sectPr ? readSectPrHeaderFooterRefs(sectPr, "header") : undefined;
190930
+ const footerRefs = sectPr ? readSectPrHeaderFooterRefs(sectPr, "footer") : undefined;
190931
+ slots.push({
190932
+ sectionId: projection.sectionId,
190933
+ titlePg: projection.range.titlePg === true,
190934
+ header: {
190935
+ default: headerRefs?.default ?? null,
190936
+ first: headerRefs?.first ?? null,
190937
+ even: headerRefs?.even ?? null
190938
+ },
190939
+ footer: {
190940
+ default: footerRefs?.default ?? null,
190941
+ first: footerRefs?.first ?? null,
190942
+ even: footerRefs?.even ?? null
190943
+ }
190944
+ });
190945
+ }
190946
+ return slots.sort((a2, b$1) => a2.sectionId.localeCompare(b$1.sectionId));
190947
+ }
190948
+ function compareParts(a2, b$1) {
190949
+ if (a2.kind !== b$1.kind)
190950
+ return a2.kind.localeCompare(b$1.kind);
190951
+ return a2.refId.localeCompare(b$1.refId);
190952
+ }
190953
+ function createClearedSlotState(sectionId) {
190954
+ return {
190955
+ sectionId,
190956
+ titlePg: false,
190957
+ header: {
190958
+ default: null,
190959
+ first: null,
190960
+ even: null
190961
+ },
190962
+ footer: {
190963
+ default: null,
190964
+ first: null,
190965
+ even: null
190966
+ }
190967
+ };
190968
+ }
190969
+ function slotsEqual(previous3, next2) {
190970
+ if (!previous3)
190971
+ return false;
190972
+ if (previous3.titlePg !== next2.titlePg)
190973
+ return false;
190974
+ for (const variant of SLOT_VARIANTS) {
190975
+ if (previous3.header[variant] !== next2.header[variant])
190976
+ return false;
190977
+ if (previous3.footer[variant] !== next2.footer[variant])
190978
+ return false;
190979
+ }
190980
+ return true;
190981
+ }
190982
+ function toRelsPathForPart2(partPath) {
190983
+ if (partPath === DOCUMENT_RELS_PATH$2 || partPath.endsWith(".rels"))
190984
+ return null;
190985
+ const lastSlash = partPath.lastIndexOf("/");
190986
+ if (lastSlash < 0 || lastSlash === partPath.length - 1)
190987
+ return null;
190988
+ return `${partPath.slice(0, lastSlash)}/_rels/${partPath.slice(lastSlash + 1)}.rels`;
190989
+ }
190990
+ function capturePartsState(editor, headerFooters) {
190991
+ const convertedXml = editor.converter?.convertedXml ?? {};
190992
+ const mediaStore = getMediaStore(editor);
190993
+ const headerFooterClosures = {};
190994
+ for (const part of headerFooters?.parts ?? [])
190995
+ headerFooterClosures[part.refId] = {
190996
+ refId: part.refId,
190997
+ kind: part.kind,
190998
+ partPath: part.partPath,
190999
+ parts: collectPartClosure(part.partPath, convertedXml, mediaStore)
191000
+ };
191001
+ return {
191002
+ bodyClosure: collectBodyClosure(convertedXml, mediaStore),
191003
+ headerFooterClosures
191004
+ };
191005
+ }
191006
+ function diffParts(previousPartsState, nextPartsState) {
191007
+ if (!previousPartsState || !nextPartsState)
191008
+ return null;
191009
+ const upserts = {};
191010
+ const deletes = /* @__PURE__ */ new Set;
191011
+ const nextReachablePartPaths = collectReachablePartPaths(nextPartsState);
191012
+ const previousOwnedParts = collectOwnedParts(previousPartsState);
191013
+ const nextOwnedParts = collectOwnedParts(nextPartsState);
191014
+ for (const [partPath, snapshot2] of Object.entries(nextOwnedParts)) {
191015
+ const previous3 = previousOwnedParts[partPath];
191016
+ if (!previous3 || !partSnapshotsEqual(previous3, snapshot2))
191017
+ upserts[partPath] = structuredClone(snapshot2);
191018
+ }
191019
+ for (const partPath of Object.keys(previousOwnedParts))
191020
+ if (!(partPath in nextOwnedParts) && !(partPath in upserts) && !nextReachablePartPaths.has(partPath))
191021
+ deletes.add(partPath);
191022
+ if (Object.keys(upserts).length === 0 && deletes.size === 0)
191023
+ return null;
191024
+ return {
191025
+ upserts,
191026
+ deletes: [...deletes].sort()
191027
+ };
191028
+ }
191029
+ function collectOwnedParts(partsState) {
191030
+ const owned = {};
191031
+ addOwnedPartsFromClosure(owned, partsState.bodyClosure);
191032
+ for (const closure of Object.values(partsState.headerFooterClosures))
191033
+ addOwnedPartsFromClosure(owned, closure.parts, closure.partPath);
191034
+ return owned;
191035
+ }
191036
+ function addOwnedPartsFromClosure(target, closure, semanticRootPath) {
191037
+ for (const [partPath, snapshot2] of Object.entries(closure)) {
191038
+ if (isSemanticOwnedPart(partPath, semanticRootPath))
191039
+ continue;
191040
+ target[partPath] = snapshot2;
191041
+ }
191042
+ }
191043
+ function isSemanticOwnedPart(partPath, headerFooterRootPath) {
191044
+ if (partPath === "word/document.xml" || partPath === "word/styles.xml" || partPath === "word/numbering.xml")
191045
+ return true;
191046
+ if (headerFooterRootPath && partPath === headerFooterRootPath)
191047
+ return true;
191048
+ return false;
191049
+ }
191050
+ function collectReachablePartPaths(partsState) {
191051
+ const reachable = /* @__PURE__ */ new Set;
191052
+ for (const partPath of Object.keys(partsState?.bodyClosure ?? {}))
191053
+ reachable.add(partPath);
191054
+ for (const closure of Object.values(partsState?.headerFooterClosures ?? {}))
191055
+ for (const partPath of Object.keys(closure.parts))
191056
+ reachable.add(partPath);
191057
+ return reachable;
191058
+ }
191059
+ function getMediaStore(editor) {
191060
+ return {
191061
+ ...editor.options?.mediaFiles ?? {},
191062
+ ...editor.storage?.image?.media ?? {}
191063
+ };
191064
+ }
191065
+ function collectPartClosure(partPath, convertedXml, mediaStore) {
191066
+ const snapshots = {};
191067
+ collectPartAndDependencies(partPath, convertedXml, mediaStore, snapshots, /* @__PURE__ */ new Set);
191068
+ return snapshots;
191069
+ }
191070
+ function collectBodyClosure(convertedXml, mediaStore) {
191071
+ const relsPart = convertedXml[DOCUMENT_RELS_PATH$1];
191072
+ if (!relsPart || typeof relsPart !== "object")
191073
+ return {};
191074
+ const snapshots = { [DOCUMENT_RELS_PATH$1]: {
191075
+ kind: "xml",
191076
+ content: structuredClone(relsPart)
191077
+ } };
191078
+ const visited = new Set([DOCUMENT_RELS_PATH$1]);
191079
+ for (const relationship of readRelationships(relsPart)) {
191080
+ if (!shouldCaptureBodyRelationship(String(relationship.attributes?.Type ?? "")))
191081
+ continue;
191082
+ if (String(relationship.attributes?.TargetMode ?? "") === "External")
191083
+ continue;
191084
+ const targetPath = resolveOpcTargetPath(String(relationship.attributes?.Target ?? ""), "word");
191085
+ if (!targetPath)
191086
+ continue;
191087
+ collectPartAndDependencies(targetPath, convertedXml, mediaStore, snapshots, visited);
191088
+ }
191089
+ return snapshots;
191090
+ }
191091
+ function collectPartAndDependencies(partPath, convertedXml, mediaStore, snapshots, visited) {
191092
+ if (visited.has(partPath))
191093
+ return;
191094
+ visited.add(partPath);
191095
+ const xmlPart = convertedXml[partPath];
191096
+ if (xmlPart && typeof xmlPart === "object")
191097
+ snapshots[partPath] = {
191098
+ kind: "xml",
191099
+ content: structuredClone(xmlPart)
191100
+ };
191101
+ else if (partPath in mediaStore) {
191102
+ snapshots[partPath] = {
191103
+ kind: "binary",
191104
+ content: structuredClone(mediaStore[partPath])
191105
+ };
191106
+ return;
191107
+ } else
191108
+ return;
191109
+ const relsPath = toRelsPathForPart2(partPath);
191110
+ const relsPart = relsPath ? convertedXml[relsPath] : undefined;
191111
+ if (!relsPath || !relsPart || typeof relsPart !== "object")
191112
+ return;
191113
+ snapshots[relsPath] = {
191114
+ kind: "xml",
191115
+ content: structuredClone(relsPart)
191116
+ };
191117
+ const relationships = readRelationships(relsPart);
191118
+ const baseDir = getPartBaseDir(partPath);
191119
+ for (const relationship of relationships) {
191120
+ if (String(relationship.attributes?.TargetMode ?? "") === "External")
191121
+ continue;
191122
+ const targetPath = resolveOpcTargetPath(String(relationship.attributes?.Target ?? ""), baseDir);
191123
+ if (!targetPath)
191124
+ continue;
191125
+ collectPartAndDependencies(targetPath, convertedXml, mediaStore, snapshots, visited);
191126
+ }
191127
+ }
191128
+ function readRelationships(relsPart) {
191129
+ const root3 = relsPart?.elements?.find((entry) => entry.name === "Relationships");
191130
+ return Array.isArray(root3?.elements) ? root3.elements : [];
191131
+ }
191132
+ function getPartBaseDir(partPath) {
191133
+ const lastSlash = partPath.lastIndexOf("/");
191134
+ return lastSlash >= 0 ? partPath.slice(0, lastSlash) : "";
191135
+ }
191136
+ function shouldCaptureBodyRelationship(type) {
191137
+ return !BODY_RELATIONSHIP_EXCLUSIONS.has(type);
191138
+ }
191139
+ function partSnapshotsEqual(a2, b$1) {
191140
+ return a2.kind === b$1.kind && JSON.stringify(a2.content) === JSON.stringify(b$1.content);
191141
+ }
190800
191142
  function hasOwnStyle(styleMap, styleId) {
190801
191143
  return Object.prototype.hasOwnProperty.call(styleMap, styleId);
190802
191144
  }
@@ -190833,12 +191175,17 @@ function diffStyles(oldStyles, newStyles) {
190833
191175
  function diffNumbering(oldNumbering, newNumbering) {
190834
191176
  return getAttributesDiff(oldNumbering ?? {}, newNumbering ?? {});
190835
191177
  }
190836
- function computeDiff(oldPmDoc, newPmDoc, schema, oldComments = [], newComments = [], oldStyles = null, newStyles = null, oldNumbering = null, newNumbering = null) {
191178
+ function computeDiff(oldPmDoc, newPmDoc, schema, oldComments = [], newComments = [], oldStyles = null, newStyles = null, oldNumbering = null, newNumbering = null, oldHeaderFooters = null, newHeaderFooters = null, oldPartsState = null, newPartsState = null) {
191179
+ const docDiffs = diffNodes(normalizeNodes(oldPmDoc), normalizeNodes(newPmDoc));
191180
+ const headerFootersDiff = diffHeaderFooters(oldHeaderFooters, newHeaderFooters, schema);
191181
+ const partsDiff = oldPartsState && newPartsState ? diffParts(oldPartsState, newPartsState) : null;
190837
191182
  return {
190838
- docDiffs: diffNodes(normalizeNodes(oldPmDoc), normalizeNodes(newPmDoc)),
191183
+ docDiffs,
190839
191184
  commentDiffs: diffComments(oldComments, newComments, schema),
190840
191185
  stylesDiff: diffStyles(oldStyles, newStyles),
190841
- numberingDiff: diffNumbering(oldNumbering, newNumbering)
191186
+ numberingDiff: diffNumbering(oldNumbering, newNumbering),
191187
+ headerFootersDiff,
191188
+ partsDiff
190842
191189
  };
190843
191190
  }
190844
191191
  function replayNonParagraphDiff({ tr, diff, schema }) {
@@ -191687,7 +192034,514 @@ function replayNumbering({ numberingDiff, editor }) {
191687
192034
  result.applied += 1;
191688
192035
  return result;
191689
192036
  }
191690
- function replayDiffs({ tr, diff, schema, comments = [], editor }) {
192037
+ function replayHeaderFooters({ tr, headerFootersDiff, schema, editor, trackedChangesRequested = false }) {
192038
+ const result = {
192039
+ applied: 0,
192040
+ skipped: 0,
192041
+ warnings: []
192042
+ };
192043
+ if (!headerFootersDiff)
192044
+ return result;
192045
+ if (!editor?.converter) {
192046
+ result.skipped += 1;
192047
+ result.warnings.push("Header/footer replay skipped: editor converter is unavailable.");
192048
+ return result;
192049
+ }
192050
+ if (trackedChangesRequested)
192051
+ result.warnings.push("Header/footer replay applied directly because tracked header/footer replay is not supported.");
192052
+ ensureHeaderFooterCollections(editor.converter);
192053
+ for (const part of headerFootersDiff.addedParts) {
192054
+ createHeaderFooterPart$1(editor.converter, schema, part);
192055
+ result.applied += 1;
192056
+ }
192057
+ for (const part of headerFootersDiff.modifiedParts) {
192058
+ if (applyHeaderFooterPartContent(editor.converter, schema, part.refId, part.kind, part.oldPartPath, part.partPath, part.docDiffs)) {
192059
+ result.applied += 1;
192060
+ continue;
192061
+ }
192062
+ result.skipped += 1;
192063
+ result.warnings.push(`Header/footer replay skipped for "${part.refId}": stored part content was not found.`);
192064
+ }
192065
+ let slotChangesApplied = 0;
192066
+ for (const slot of headerFootersDiff.slotChanges) {
192067
+ if (applyHeaderFooterSlotChange(tr, editor, slot)) {
192068
+ result.applied += 1;
192069
+ slotChangesApplied += 1;
192070
+ continue;
192071
+ }
192072
+ result.skipped += 1;
192073
+ result.warnings.push(`Header/footer replay skipped for section "${slot.sectionId}": section projection was not found.`);
192074
+ }
192075
+ if (slotChangesApplied > 0)
192076
+ syncTitlePageCache(tr, editor);
192077
+ for (const part of headerFootersDiff.removedParts) {
192078
+ deleteHeaderFooterPart(editor.converter, part);
192079
+ result.applied += 1;
192080
+ }
192081
+ if (result.applied > 0) {
192082
+ tr.setMeta("forceUpdatePagination", true);
192083
+ editor.converter.headerFooterModified = true;
192084
+ editor.converter.documentModified = true;
192085
+ const changedParts = [];
192086
+ if (headerFootersDiff.addedParts.length > 0 || headerFootersDiff.removedParts.length > 0 || headerFootersDiff.slotChanges.length > 0)
192087
+ changedParts.push({
192088
+ partId: "word/_rels/document.xml.rels",
192089
+ operation: "mutate",
192090
+ changedPaths: []
192091
+ });
192092
+ for (const part of headerFootersDiff.addedParts)
192093
+ changedParts.push({
192094
+ partId: part.partPath,
192095
+ sectionId: part.refId,
192096
+ operation: "create",
192097
+ changedPaths: []
192098
+ });
192099
+ for (const part of headerFootersDiff.modifiedParts) {
192100
+ if (part.oldPartPath !== part.partPath) {
192101
+ changedParts.push({
192102
+ partId: part.oldPartPath,
192103
+ sectionId: part.refId,
192104
+ operation: "delete",
192105
+ changedPaths: []
192106
+ });
192107
+ changedParts.push({
192108
+ partId: part.partPath,
192109
+ sectionId: part.refId,
192110
+ operation: "create",
192111
+ changedPaths: []
192112
+ });
192113
+ continue;
192114
+ }
192115
+ changedParts.push({
192116
+ partId: part.partPath,
192117
+ sectionId: part.refId,
192118
+ operation: "mutate",
192119
+ changedPaths: []
192120
+ });
192121
+ }
192122
+ for (const part of headerFootersDiff.removedParts)
192123
+ changedParts.push({
192124
+ partId: part.partPath,
192125
+ sectionId: part.refId,
192126
+ operation: "delete",
192127
+ changedPaths: []
192128
+ });
192129
+ editor.emit?.("partChanged", {
192130
+ parts: changedParts,
192131
+ source: "diff-replay"
192132
+ });
192133
+ }
192134
+ return result;
192135
+ }
192136
+ function ensureHeaderFooterCollections(converter) {
192137
+ if (!converter.headers)
192138
+ converter.headers = {};
192139
+ if (!converter.footers)
192140
+ converter.footers = {};
192141
+ if (!converter.headerIds)
192142
+ converter.headerIds = {};
192143
+ if (!converter.footerIds)
192144
+ converter.footerIds = {};
192145
+ if (!converter.convertedXml)
192146
+ converter.convertedXml = {};
192147
+ }
192148
+ function createHeaderFooterPart$1(converter, schema, part) {
192149
+ const partCollection = part.kind === "header" ? converter.headers : converter.footers;
192150
+ partCollection[part.refId] = structuredClone(part.content);
192151
+ const variantIds = part.kind === "header" ? converter.headerIds : converter.footerIds;
192152
+ if (!Array.isArray(variantIds.ids))
192153
+ variantIds.ids = [];
192154
+ if (!variantIds.ids.includes(part.refId))
192155
+ variantIds.ids.push(part.refId);
192156
+ upsertRelationshipEntry(converter.convertedXml, part);
192157
+ ensureXmlPartExists(converter.convertedXml, part);
192158
+ syncHeaderFooterPartXml(converter, schema, part.kind, part.refId, part.content);
192159
+ }
192160
+ function applyHeaderFooterPartContent(converter, schema, refId, kind, oldPartPath, partPath, docDiffs) {
192161
+ const collection = kind === "header" ? converter.headers : converter.footers;
192162
+ const currentJson = collection[refId];
192163
+ if (!currentJson || typeof currentJson !== "object")
192164
+ return false;
192165
+ let nextJson = currentJson;
192166
+ if (docDiffs.length > 0) {
192167
+ const partTr = EditorState.create({
192168
+ schema,
192169
+ doc: schema.nodeFromJSON(currentJson)
192170
+ }).tr;
192171
+ if (replayDocDiffs({
192172
+ tr: partTr,
192173
+ docDiffs,
192174
+ schema
192175
+ }).skipped > 0)
192176
+ return false;
192177
+ nextJson = partTr.doc.toJSON();
192178
+ collection[refId] = nextJson;
192179
+ }
192180
+ updateHeaderFooterPartPath(converter, {
192181
+ refId,
192182
+ kind,
192183
+ oldPartPath,
192184
+ partPath
192185
+ });
192186
+ syncHeaderFooterPartXml(converter, schema, kind, refId, nextJson);
192187
+ return true;
192188
+ }
192189
+ function applyHeaderFooterSlotChange(tr, editor, slot) {
192190
+ const projectionEditor = {
192191
+ ...editor,
192192
+ state: {
192193
+ ...editor.state,
192194
+ doc: tr.doc
192195
+ }
192196
+ };
192197
+ const projection = resolveSectionProjections(projectionEditor).find((entry) => entry.sectionId === slot.sectionId);
192198
+ if (!projection)
192199
+ return false;
192200
+ const nextSectPr = ensureSectPrElement(readTargetSectPr(projectionEditor, projection));
192201
+ writeSectPrTitlePage(nextSectPr, slot.titlePg);
192202
+ applySlotRefs(nextSectPr, "header", slot.header);
192203
+ applySlotRefs(nextSectPr, "footer", slot.footer);
192204
+ syncVariantIdCaches(editor.converter, slot);
192205
+ if (projection.target.kind === "paragraph") {
192206
+ const paragraph2 = tr.doc.nodeAt(projection.target.pos);
192207
+ if (!paragraph2)
192208
+ return false;
192209
+ const attrs = paragraph2.attrs ?? {};
192210
+ const nextAttrs = {
192211
+ ...attrs,
192212
+ paragraphProperties: {
192213
+ ...attrs.paragraphProperties ?? {},
192214
+ sectPr: nextSectPr
192215
+ },
192216
+ pageBreakSource: "sectPr",
192217
+ sectionMargins: readSectPrMargins(nextSectPr)
192218
+ };
192219
+ tr.setNodeMarkup(projection.target.pos, undefined, nextAttrs, paragraph2.marks);
192220
+ return true;
192221
+ }
192222
+ tr.setDocAttribute("bodySectPr", nextSectPr);
192223
+ syncBodySectPrConverterCache(editor.converter, nextSectPr);
192224
+ return true;
192225
+ }
192226
+ function applySlotRefs(sectPr, kind, refs) {
192227
+ for (const variant of SLOT_VARIANTS) {
192228
+ clearSectPrHeaderFooterRef(sectPr, kind, variant);
192229
+ if (refs[variant])
192230
+ setSectPrHeaderFooterRef(sectPr, kind, variant, refs[variant]);
192231
+ }
192232
+ }
192233
+ function syncVariantIdCaches(converter, slot) {
192234
+ const headerIds = converter.headerIds ??= {};
192235
+ const footerIds = converter.footerIds ??= {};
192236
+ for (const variant of SLOT_VARIANTS) {
192237
+ headerIds[variant] = slot.header[variant] ?? null;
192238
+ footerIds[variant] = slot.footer[variant] ?? null;
192239
+ }
192240
+ }
192241
+ function syncBodySectPrConverterCache(converter, sectPr) {
192242
+ converter.bodySectPr = cloneXmlElement(sectPr);
192243
+ const savedBodyNode = converter.savedTagsToRestore?.find((entry) => entry?.name === "w:body");
192244
+ if (!savedBodyNode || !Array.isArray(savedBodyNode.elements))
192245
+ return;
192246
+ const preservedChildren = savedBodyNode.elements.filter((entry) => entry?.name !== "w:sectPr");
192247
+ preservedChildren.push(cloneXmlElement(sectPr));
192248
+ savedBodyNode.elements = preservedChildren;
192249
+ }
192250
+ function syncTitlePageCache(tr, editor) {
192251
+ if (!editor.converter)
192252
+ return;
192253
+ if (!editor.converter.headerIds)
192254
+ editor.converter.headerIds = {};
192255
+ if (!editor.converter.footerIds)
192256
+ editor.converter.footerIds = {};
192257
+ const hasTitlePage = resolveSectionProjections({
192258
+ ...editor,
192259
+ state: {
192260
+ ...editor.state,
192261
+ doc: tr.doc
192262
+ }
192263
+ }).some((entry) => entry.range.titlePg === true);
192264
+ editor.converter.headerIds.titlePg = hasTitlePage;
192265
+ editor.converter.footerIds.titlePg = hasTitlePage;
192266
+ }
192267
+ function deleteHeaderFooterPart(converter, part) {
192268
+ const collection = part.kind === "header" ? converter.headers : converter.footers;
192269
+ delete collection[part.refId];
192270
+ const variantIds = part.kind === "header" ? converter.headerIds : converter.footerIds;
192271
+ if (Array.isArray(variantIds.ids))
192272
+ variantIds.ids = variantIds.ids.filter((value) => value !== part.refId);
192273
+ for (const key$1 of [
192274
+ "default",
192275
+ "first",
192276
+ "even",
192277
+ "odd"
192278
+ ])
192279
+ if (variantIds[key$1] === part.refId)
192280
+ variantIds[key$1] = null;
192281
+ removeRelationshipEntry(converter.convertedXml, part.refId);
192282
+ delete converter.convertedXml[part.partPath];
192283
+ const relsPath = toRelsPathForPart2(part.partPath);
192284
+ if (relsPath)
192285
+ delete converter.convertedXml[relsPath];
192286
+ }
192287
+ function updateHeaderFooterPartPath(converter, part) {
192288
+ upsertRelationshipEntry(converter.convertedXml, {
192289
+ refId: part.refId,
192290
+ kind: part.kind,
192291
+ partPath: part.partPath,
192292
+ content: {
192293
+ type: "doc",
192294
+ content: []
192295
+ }
192296
+ });
192297
+ if (part.oldPartPath === part.partPath) {
192298
+ ensureXmlPartExists(converter.convertedXml, {
192299
+ refId: part.refId,
192300
+ kind: part.kind,
192301
+ partPath: part.partPath,
192302
+ content: {
192303
+ type: "doc",
192304
+ content: []
192305
+ }
192306
+ });
192307
+ return;
192308
+ }
192309
+ const previousXml = converter.convertedXml[part.oldPartPath];
192310
+ if (previousXml) {
192311
+ converter.convertedXml[part.partPath] = previousXml;
192312
+ delete converter.convertedXml[part.oldPartPath];
192313
+ } else
192314
+ ensureXmlPartExists(converter.convertedXml, {
192315
+ refId: part.refId,
192316
+ kind: part.kind,
192317
+ partPath: part.partPath,
192318
+ content: {
192319
+ type: "doc",
192320
+ content: []
192321
+ }
192322
+ });
192323
+ const oldRelsPath = toRelsPathForPart2(part.oldPartPath);
192324
+ const nextRelsPath = toRelsPathForPart2(part.partPath);
192325
+ if (oldRelsPath && nextRelsPath && oldRelsPath !== nextRelsPath) {
192326
+ const previousRels = converter.convertedXml[oldRelsPath];
192327
+ if (previousRels) {
192328
+ converter.convertedXml[nextRelsPath] = previousRels;
192329
+ delete converter.convertedXml[oldRelsPath];
192330
+ }
192331
+ }
192332
+ }
192333
+ function upsertRelationshipEntry(convertedXml, part) {
192334
+ const relsRoot = ensureRelationshipsRoot(convertedXml);
192335
+ const target = part.partPath.replace(/^word\//, "");
192336
+ const type = part.kind === "header" ? HEADER_RELATIONSHIP_TYPE$2 : FOOTER_RELATIONSHIP_TYPE$2;
192337
+ const existing = relsRoot.elements.find((entry) => entry.name === "Relationship" && entry.attributes?.Id === part.refId);
192338
+ if (existing) {
192339
+ existing.attributes = {
192340
+ ...existing.attributes ?? {},
192341
+ Id: part.refId,
192342
+ Type: type,
192343
+ Target: target
192344
+ };
192345
+ return;
192346
+ }
192347
+ relsRoot.elements.push({
192348
+ name: "Relationship",
192349
+ attributes: {
192350
+ Id: part.refId,
192351
+ Type: type,
192352
+ Target: target
192353
+ },
192354
+ elements: []
192355
+ });
192356
+ }
192357
+ function removeRelationshipEntry(convertedXml, refId) {
192358
+ const relsRoot = convertedXml["word/_rels/document.xml.rels"]?.elements?.find((entry) => entry.name === "Relationships");
192359
+ if (!relsRoot?.elements)
192360
+ return;
192361
+ relsRoot.elements = relsRoot.elements.filter((entry) => !(entry.name === "Relationship" && entry.attributes?.Id === refId));
192362
+ }
192363
+ function ensureXmlPartExists(convertedXml, part) {
192364
+ if (convertedXml[part.partPath])
192365
+ return;
192366
+ convertedXml[part.partPath] = {
192367
+ type: "element",
192368
+ name: "document",
192369
+ elements: [{
192370
+ type: "element",
192371
+ name: part.kind === "header" ? "w:hdr" : "w:ftr",
192372
+ attributes: getHeaderFooterRootAttributes(convertedXml, part.kind),
192373
+ elements: []
192374
+ }]
192375
+ };
192376
+ }
192377
+ function syncHeaderFooterPartXml(converter, schema, kind, refId, content3) {
192378
+ const partPath = findPartPathByRefId(converter.convertedXml, refId);
192379
+ if (!partPath)
192380
+ return;
192381
+ ensureXmlPartExists(converter.convertedXml, {
192382
+ refId,
192383
+ kind,
192384
+ partPath,
192385
+ content: {
192386
+ type: "doc",
192387
+ content: []
192388
+ }
192389
+ });
192390
+ const exported = converter.exportToXmlJson?.({
192391
+ data: content3,
192392
+ editor: {
192393
+ schema,
192394
+ getUpdatedJson: () => content3
192395
+ },
192396
+ editorSchema: schema,
192397
+ isHeaderFooter: true,
192398
+ comments: [],
192399
+ commentDefinitions: []
192400
+ });
192401
+ const root3 = converter.convertedXml[partPath];
192402
+ if (!root3?.elements?.[0])
192403
+ return;
192404
+ root3.elements[0].attributes = {
192405
+ ...getHeaderFooterRootAttributes(converter.convertedXml, kind),
192406
+ ...root3.elements[0].attributes ?? {}
192407
+ };
192408
+ if (exported?.result?.elements?.[0]?.elements)
192409
+ root3.elements[0].elements = exported.result.elements[0].elements;
192410
+ }
192411
+ function getHeaderFooterRootAttributes(convertedXml, kind) {
192412
+ const existingAttributes = findExistingHeaderFooterRootAttributes(convertedXml, kind);
192413
+ return {
192414
+ ...DEFAULT_DOCX_DEFS,
192415
+ ...existingAttributes ?? {}
192416
+ };
192417
+ }
192418
+ function findExistingHeaderFooterRootAttributes(convertedXml, kind) {
192419
+ const rootName = kind === "header" ? "w:hdr" : "w:ftr";
192420
+ for (const value of Object.values(convertedXml)) {
192421
+ const root3 = value?.elements?.[0];
192422
+ if (root3?.name !== rootName || !root3.attributes)
192423
+ continue;
192424
+ return root3.attributes;
192425
+ }
192426
+ return null;
192427
+ }
192428
+ function findPartPathByRefId(convertedXml, refId) {
192429
+ const target = convertedXml["word/_rels/document.xml.rels"]?.elements?.find((entry) => entry.name === "Relationships")?.elements?.find((entry) => entry.name === "Relationship" && entry.attributes?.Id === refId)?.attributes?.Target;
192430
+ if (!target)
192431
+ return null;
192432
+ return normalizePartPath(target);
192433
+ }
192434
+ function ensureRelationshipsRoot(convertedXml) {
192435
+ if (!convertedXml["word/_rels/document.xml.rels"])
192436
+ convertedXml["word/_rels/document.xml.rels"] = {
192437
+ type: "element",
192438
+ name: "document",
192439
+ elements: []
192440
+ };
192441
+ const relsPart = convertedXml["word/_rels/document.xml.rels"];
192442
+ if (!relsPart.elements)
192443
+ relsPart.elements = [];
192444
+ let relsRoot = relsPart.elements.find((entry) => entry.name === "Relationships");
192445
+ if (!relsRoot) {
192446
+ relsRoot = {
192447
+ name: "Relationships",
192448
+ attributes: { xmlns: "http://schemas.openxmlformats.org/package/2006/relationships" },
192449
+ elements: []
192450
+ };
192451
+ relsPart.elements.push(relsRoot);
192452
+ }
192453
+ if (!relsRoot.elements)
192454
+ relsRoot.elements = [];
192455
+ return relsRoot;
192456
+ }
192457
+ function replayPartsDiff({ partsDiff, editor }) {
192458
+ const result = {
192459
+ applied: 0,
192460
+ skipped: 0,
192461
+ warnings: []
192462
+ };
192463
+ if (!partsDiff)
192464
+ return result;
192465
+ if (!editor?.converter?.convertedXml) {
192466
+ result.skipped += 1;
192467
+ result.warnings.push("Parts replay skipped: editor converter is unavailable.");
192468
+ return result;
192469
+ }
192470
+ editor.options ??= {};
192471
+ editor.options.mediaFiles ??= {};
192472
+ const optionMediaStore = editor.options.mediaFiles;
192473
+ editor.storage ??= {};
192474
+ editor.storage.image ??= {};
192475
+ editor.storage.image.media ??= {};
192476
+ const storageMediaStore = editor.storage.image.media;
192477
+ const changedParts = [];
192478
+ for (const [partPath, snapshot2] of Object.entries(partsDiff.upserts)) {
192479
+ if (snapshot2.kind === "xml") {
192480
+ const operation = partPath in editor.converter.convertedXml ? "mutate" : "create";
192481
+ editor.converter.convertedXml[partPath] = structuredClone(snapshot2.content);
192482
+ changedParts.push({
192483
+ partId: partPath,
192484
+ operation,
192485
+ changedPaths: []
192486
+ });
192487
+ } else {
192488
+ const operation = partPath in optionMediaStore || partPath in storageMediaStore || partPath in editor.converter.convertedXml ? "mutate" : "create";
192489
+ const value = structuredClone(snapshot2.content);
192490
+ optionMediaStore[partPath] = value;
192491
+ storageMediaStore[partPath] = structuredClone(value);
192492
+ if (partPath.startsWith("word/media/") && typeof value === "string")
192493
+ editor.commands?.addImageToCollaboration?.({
192494
+ mediaPath: partPath,
192495
+ fileData: value
192496
+ });
192497
+ changedParts.push({
192498
+ partId: partPath,
192499
+ operation,
192500
+ changedPaths: []
192501
+ });
192502
+ }
192503
+ result.applied += 1;
192504
+ }
192505
+ for (const partPath of partsDiff.deletes) {
192506
+ if (partPath in editor.converter.convertedXml) {
192507
+ delete editor.converter.convertedXml[partPath];
192508
+ changedParts.push({
192509
+ partId: partPath,
192510
+ operation: "delete",
192511
+ changedPaths: []
192512
+ });
192513
+ result.applied += 1;
192514
+ continue;
192515
+ }
192516
+ const hadOptionMedia = partPath in optionMediaStore;
192517
+ const hadStorageMedia = partPath in storageMediaStore;
192518
+ if (hadOptionMedia)
192519
+ delete optionMediaStore[partPath];
192520
+ if (hadStorageMedia)
192521
+ delete storageMediaStore[partPath];
192522
+ if (hadOptionMedia || hadStorageMedia) {
192523
+ changedParts.push({
192524
+ partId: partPath,
192525
+ operation: "delete",
192526
+ changedPaths: []
192527
+ });
192528
+ result.applied += 1;
192529
+ }
192530
+ }
192531
+ if (changedParts.length > 0) {
192532
+ editor.converter.documentModified = true;
192533
+ editor.emit?.("partChanged", {
192534
+ parts: changedParts,
192535
+ source: "diff-replay"
192536
+ });
192537
+ }
192538
+ return {
192539
+ applied: result.applied,
192540
+ skipped: result.skipped,
192541
+ warnings: result.warnings
192542
+ };
192543
+ }
192544
+ function replayDiffs({ tr, diff, schema, comments = [], editor, trackedChangesRequested = false }) {
191691
192545
  const docReplay = replayDocDiffs({
191692
192546
  tr,
191693
192547
  docDiffs: diff.docDiffs,
@@ -191706,15 +192560,28 @@ function replayDiffs({ tr, diff, schema, comments = [], editor }) {
191706
192560
  numberingDiff: diff.numberingDiff,
191707
192561
  editor
191708
192562
  });
192563
+ const headerFootersReplay = replayHeaderFooters({
192564
+ tr,
192565
+ headerFootersDiff: diff.headerFootersDiff,
192566
+ schema,
192567
+ editor,
192568
+ trackedChangesRequested
192569
+ });
192570
+ const partsReplay = replayPartsDiff({
192571
+ partsDiff: diff.partsDiff,
192572
+ editor
192573
+ });
191709
192574
  return {
191710
192575
  tr,
191711
- appliedDiffs: docReplay.applied + commentsReplay.applied + stylesReplay.applied + numberingReplay.applied,
191712
- skippedDiffs: docReplay.skipped + commentsReplay.skipped + stylesReplay.skipped + numberingReplay.skipped,
192576
+ appliedDiffs: docReplay.applied + commentsReplay.applied + stylesReplay.applied + numberingReplay.applied + headerFootersReplay.applied + partsReplay.applied,
192577
+ skippedDiffs: docReplay.skipped + commentsReplay.skipped + stylesReplay.skipped + numberingReplay.skipped + headerFootersReplay.skipped + partsReplay.skipped,
191713
192578
  warnings: [
191714
192579
  ...docReplay.warnings,
191715
192580
  ...commentsReplay.warnings,
191716
192581
  ...stylesReplay.warnings,
191717
- ...numberingReplay.warnings
192582
+ ...numberingReplay.warnings,
192583
+ ...headerFootersReplay.warnings,
192584
+ ...partsReplay.warnings
191718
192585
  ]
191719
192586
  };
191720
192587
  }
@@ -209469,12 +210336,14 @@ function canonicalizeComment(comment2) {
209469
210336
  result[key$1] = value;
209470
210337
  return result;
209471
210338
  }
209472
- function buildCanonicalDiffableState(doc$12, comments, styles, numbering) {
210339
+ function buildCanonicalDiffableState(doc$12, comments, styles, numbering, headerFooters, partsState) {
209473
210340
  return {
209474
210341
  body: normalizeDocJSON(doc$12.toJSON()),
209475
210342
  comments: comments.map(canonicalizeComment),
209476
210343
  styles: styles ? styles : null,
209477
- numbering: numbering ? numbering : null
210344
+ numbering: numbering ? numbering : null,
210345
+ headerFooters: headerFooters ? structuredClone(headerFooters) : null,
210346
+ partsState: partsState ? structuredClone(partsState) : null
209478
210347
  };
209479
210348
  }
209480
210349
  function sortKeysDeep(value) {
@@ -209550,6 +210419,8 @@ function buildDiffSummary(diff) {
209550
210419
  const commentsHasChanges = diff.commentDiffs.length > 0;
209551
210420
  const stylesHasChanges = diff.stylesDiff !== null;
209552
210421
  const numberingHasChanges = diff.numberingDiff !== null;
210422
+ const headerFootersHasChanges = diff.headerFootersDiff !== null;
210423
+ const partsHasChanges = diff.partsDiff !== null;
209553
210424
  const changedComponents = [];
209554
210425
  if (bodyHasChanges)
209555
210426
  changedComponents.push("body");
@@ -209559,13 +210430,19 @@ function buildDiffSummary(diff) {
209559
210430
  changedComponents.push("styles");
209560
210431
  if (numberingHasChanges)
209561
210432
  changedComponents.push("numbering");
210433
+ if (headerFootersHasChanges)
210434
+ changedComponents.push("headerFooters");
210435
+ if (partsHasChanges)
210436
+ changedComponents.push("parts");
209562
210437
  return {
209563
210438
  hasChanges: changedComponents.length > 0,
209564
210439
  changedComponents,
209565
210440
  body: { hasChanges: bodyHasChanges },
209566
210441
  comments: { hasChanges: commentsHasChanges },
209567
210442
  styles: { hasChanges: stylesHasChanges },
209568
- numbering: { hasChanges: numberingHasChanges }
210443
+ numbering: { hasChanges: numberingHasChanges },
210444
+ headerFooters: { hasChanges: headerFootersHasChanges },
210445
+ parts: { hasChanges: partsHasChanges }
209569
210446
  };
209570
210447
  }
209571
210448
  function coverageEquals(a2, b$1) {
@@ -209580,37 +210457,54 @@ function getEditorStyles(editor) {
209580
210457
  function getEditorNumbering(editor) {
209581
210458
  return editor.converter?.translatedNumbering ?? null;
209582
210459
  }
210460
+ function getEditorHeaderFooters(editor) {
210461
+ return captureHeaderFooterState(editor);
210462
+ }
210463
+ function getEditorPartsState(editor, headerFooters) {
210464
+ return capturePartsState(editor, headerFooters);
210465
+ }
210466
+ function buildCanonicalStateForCoverage(doc$12, comments, styles, numbering, headerFooters, partsState, coverage) {
210467
+ return buildCanonicalDiffableState(doc$12, comments, styles, numbering, coverage.headerFooters ? headerFooters : null, coverage.headerFooters ? partsState : null);
210468
+ }
209583
210469
  function captureSnapshot(editor) {
209584
210470
  const doc$12 = editor.state.doc;
209585
210471
  const comments = getEditorComments(editor);
209586
210472
  const styles = getEditorStyles(editor);
209587
210473
  const numbering = getEditorNumbering(editor);
210474
+ const headerFooters = getEditorHeaderFooters(editor);
210475
+ const partsState = getEditorPartsState(editor, headerFooters);
209588
210476
  return {
209589
- version: SNAPSHOT_VERSION3,
210477
+ version: SNAPSHOT_VERSION_V2,
209590
210478
  engine: ENGINE_ID,
209591
- fingerprint: computeFingerprint(buildCanonicalDiffableState(doc$12, comments, styles, numbering)),
209592
- coverage: { ...V1_COVERAGE },
210479
+ fingerprint: computeFingerprint(buildCanonicalStateForCoverage(doc$12, comments, styles, numbering, headerFooters, partsState, V2_COVERAGE)),
210480
+ coverage: { ...V2_COVERAGE },
209593
210481
  payload: structuredClone({
209594
210482
  doc: doc$12.toJSON(),
209595
210483
  comments,
209596
210484
  styles,
209597
- numbering
210485
+ numbering,
210486
+ headerFooters,
210487
+ partsState
209598
210488
  })
209599
210489
  };
209600
210490
  }
209601
210491
  function compareToSnapshot(editor, targetSnapshot) {
209602
210492
  validateEngine(targetSnapshot.engine);
209603
210493
  validateSnapshotVersion(targetSnapshot.version);
210494
+ validateSnapshotFingerprints(targetSnapshot);
210495
+ const expectedCoverage = getCoverageForSnapshotVersion(targetSnapshot.version);
209604
210496
  const targetCoverage = targetSnapshot.coverage;
209605
- validateCoverageMatch(V1_COVERAGE, targetCoverage);
210497
+ validateCoverageMatch(expectedCoverage, targetCoverage);
209606
210498
  validateSnapshotPayload(targetSnapshot.payload);
209607
210499
  const targetComments = targetSnapshot.payload.comments ?? [];
209608
210500
  const targetStyles = targetSnapshot.payload.styles;
209609
210501
  const targetNumbering = targetSnapshot.payload.numbering;
210502
+ const targetHeaderFooters = targetSnapshot.payload.headerFooters ?? null;
210503
+ const targetPartsState = targetSnapshot.payload.partsState ?? null;
209610
210504
  const targetDoc = parseDocPayload(editor.state.schema, targetSnapshot.payload.doc);
209611
210505
  let reDerivedFingerprint;
209612
210506
  try {
209613
- reDerivedFingerprint = computeFingerprint(buildCanonicalDiffableState(targetDoc, targetComments, targetStyles, targetNumbering));
210507
+ reDerivedFingerprint = computeFingerprint(buildCanonicalStateForCoverage(targetDoc, targetComments, targetStyles, targetNumbering, targetHeaderFooters, targetSnapshot.version === SNAPSHOT_VERSION_V2 ? targetPartsState : null, targetCoverage));
209614
210508
  } catch (err) {
209615
210509
  if (err instanceof DiffServiceError)
209616
210510
  throw err;
@@ -209622,10 +210516,12 @@ function compareToSnapshot(editor, targetSnapshot) {
209622
210516
  const baseComments = getEditorComments(editor);
209623
210517
  const baseStyles = getEditorStyles(editor);
209624
210518
  const baseNumbering2 = getEditorNumbering(editor);
209625
- const baseFingerprint = computeFingerprint(buildCanonicalDiffableState(baseDoc, baseComments, baseStyles, baseNumbering2));
210519
+ const baseHeaderFooters = targetCoverage.headerFooters ? getEditorHeaderFooters(editor) : null;
210520
+ const basePartsState = targetCoverage.headerFooters ? getEditorPartsState(editor, baseHeaderFooters) : null;
210521
+ const baseFingerprint = computeFingerprint(buildCanonicalStateForCoverage(baseDoc, baseComments, baseStyles, baseNumbering2, baseHeaderFooters, targetSnapshot.version === SNAPSHOT_VERSION_V2 ? basePartsState : null, targetCoverage));
209626
210522
  let rawDiff;
209627
210523
  try {
209628
- rawDiff = computeDiff(baseDoc, targetDoc, editor.state.schema, baseComments, targetComments, baseStyles, targetStyles, baseNumbering2, targetNumbering);
210524
+ rawDiff = computeDiff(baseDoc, targetDoc, editor.state.schema, baseComments, targetComments, baseStyles, targetStyles, baseNumbering2, targetNumbering, baseHeaderFooters, targetHeaderFooters, basePartsState, targetPartsState);
209629
210525
  } catch (err) {
209630
210526
  if (err instanceof DiffServiceError)
209631
210527
  throw err;
@@ -209636,14 +210532,16 @@ function compareToSnapshot(editor, targetSnapshot) {
209636
210532
  docDiffs: rawDiff.docDiffs,
209637
210533
  commentDiffs: rawDiff.commentDiffs,
209638
210534
  stylesDiff: rawDiff.stylesDiff,
209639
- numberingDiff: rawDiff.numberingDiff
210535
+ numberingDiff: rawDiff.numberingDiff,
210536
+ headerFootersDiff: rawDiff.headerFootersDiff,
210537
+ partsDiff: rawDiff.partsDiff
209640
210538
  });
209641
210539
  return {
209642
- version: PAYLOAD_VERSION3,
210540
+ version: getPayloadVersionForCoverage(targetCoverage),
209643
210541
  engine: ENGINE_ID,
209644
210542
  baseFingerprint,
209645
210543
  targetFingerprint: targetSnapshot.fingerprint,
209646
- coverage: { ...V1_COVERAGE },
210544
+ coverage: { ...targetCoverage },
209647
210545
  summary,
209648
210546
  payload
209649
210547
  };
@@ -209651,8 +210549,15 @@ function compareToSnapshot(editor, targetSnapshot) {
209651
210549
  function applyDiffPayload(editor, diffPayload, options) {
209652
210550
  validateEngine(diffPayload.engine);
209653
210551
  validatePayloadVersion(diffPayload.version);
210552
+ validateCoverageForPayloadVersion(diffPayload);
210553
+ validatePayloadFingerprints(diffPayload);
209654
210554
  const baseDoc = editor.state.doc;
209655
- const currentFingerprint = computeFingerprint(buildCanonicalDiffableState(baseDoc, getEditorComments(editor), getEditorStyles(editor), getEditorNumbering(editor)));
210555
+ const baseComments = getEditorComments(editor);
210556
+ const baseStyles = getEditorStyles(editor);
210557
+ const baseNumbering2 = getEditorNumbering(editor);
210558
+ const baseHeaderFooters = getEditorHeaderFooters(editor);
210559
+ const basePartsState = getEditorPartsState(editor, baseHeaderFooters);
210560
+ const currentFingerprint = computeFingerprint(buildCanonicalStateForCoverage(baseDoc, baseComments, baseStyles, baseNumbering2, baseHeaderFooters, diffPayload.version === PAYLOAD_VERSION_V2 ? basePartsState : null, diffPayload.coverage));
209656
210561
  if (currentFingerprint !== diffPayload.baseFingerprint)
209657
210562
  throw new DiffServiceError("PRECONDITION_FAILED", `Document fingerprint mismatch. Expected "${diffPayload.baseFingerprint}", got "${currentFingerprint}". The document may have changed since the diff was computed. Re-run diff.compare against the current state.`);
209658
210563
  const rawDiff = parseDiffPayloadContents(diffPayload.payload);
@@ -209668,7 +210573,8 @@ function applyDiffPayload(editor, diffPayload, options) {
209668
210573
  diff: rawDiff,
209669
210574
  schema: editor.state.schema,
209670
210575
  comments: stagedComments,
209671
- editor: staging
210576
+ editor: staging,
210577
+ trackedChangesRequested: trackedRequested
209672
210578
  });
209673
210579
  tr.setMeta("inputType", "programmatic");
209674
210580
  if (trackedRequested)
@@ -209684,7 +210590,7 @@ function applyDiffPayload(editor, diffPayload, options) {
209684
210590
  appliedOperations: replayResult.appliedDiffs,
209685
210591
  baseFingerprint: diffPayload.baseFingerprint,
209686
210592
  targetFingerprint: diffPayload.targetFingerprint,
209687
- coverage: { ...V1_COVERAGE },
210593
+ coverage: { ...diffPayload.coverage },
209688
210594
  summary: verifiedSummary,
209689
210595
  diagnostics: replayResult.warnings
209690
210596
  },
@@ -209694,6 +210600,17 @@ function applyDiffPayload(editor, diffPayload, options) {
209694
210600
  function createStagingEditor(editor, comments) {
209695
210601
  const pendingEvents = [];
209696
210602
  const stagedComments = comments.map((c) => ({ ...c }));
210603
+ const stagedOptions = editor.options ? {
210604
+ ...editor.options,
210605
+ mediaFiles: editor.options.mediaFiles ? structuredClone(editor.options.mediaFiles) : editor.options.mediaFiles
210606
+ } : editor.options;
210607
+ const stagedStorage = editor.storage ? {
210608
+ ...editor.storage,
210609
+ image: editor.storage.image ? {
210610
+ ...editor.storage.image,
210611
+ media: editor.storage.image.media ? structuredClone(editor.storage.image.media) : editor.storage.image.media
210612
+ } : editor.storage.image
210613
+ } : editor.storage;
209697
210614
  let stagedConverter = null;
209698
210615
  if (editor.converter) {
209699
210616
  const raw = editor.converter;
@@ -209703,6 +210620,7 @@ function createStagingEditor(editor, comments) {
209703
210620
  if (val !== null && val !== undefined && typeof val === "object")
209704
210621
  cloned[key$1] = structuredClone(val);
209705
210622
  }
210623
+ cloned.headerFooterModified = raw.headerFooterModified;
209706
210624
  cloned.documentModified = raw.documentModified;
209707
210625
  cloned.comments = stagedComments;
209708
210626
  stagedConverter = cloned;
@@ -209712,7 +210630,8 @@ function createStagingEditor(editor, comments) {
209712
210630
  emit: (event, payload) => {
209713
210631
  pendingEvents.push([event, payload]);
209714
210632
  },
209715
- options: editor.options,
210633
+ options: stagedOptions,
210634
+ storage: stagedStorage,
209716
210635
  converter: stagedConverter
209717
210636
  };
209718
210637
  function commit() {
@@ -209721,8 +210640,13 @@ function createStagingEditor(editor, comments) {
209721
210640
  const stagedRaw = stagedConverter;
209722
210641
  for (const key$1 of STAGED_CONVERTER_KEYS)
209723
210642
  realRaw[key$1] = stagedRaw[key$1];
210643
+ realRaw.headerFooterModified = stagedRaw.headerFooterModified;
209724
210644
  realRaw.documentModified = stagedRaw.documentModified;
209725
210645
  }
210646
+ if (editor.options && stagedOptions && "mediaFiles" in stagedOptions)
210647
+ editor.options.mediaFiles = stagedOptions.mediaFiles;
210648
+ if (editor.storage?.image && stagedStorage?.image)
210649
+ editor.storage.image.media = stagedStorage.image.media;
209726
210650
  const ownedComments = stagedComments.map((c) => structuredClone(c));
209727
210651
  if (editor.converter)
209728
210652
  if (Array.isArray(editor.converter.comments)) {
@@ -209753,6 +210677,8 @@ function parseDiffPayloadContents(payload) {
209753
210677
  const commentDiffs = payload.commentDiffs;
209754
210678
  const stylesDiff = payload.stylesDiff;
209755
210679
  const numberingDiff = payload.numberingDiff;
210680
+ const headerFootersDiff = payload.headerFootersDiff;
210681
+ const partsDiff = payload.partsDiff;
209756
210682
  if (!Array.isArray(docDiffs))
209757
210683
  throw new DiffServiceError("INVALID_INPUT", "Diff payload.docDiffs must be an array.");
209758
210684
  if (!Array.isArray(commentDiffs))
@@ -209763,11 +210689,17 @@ function parseDiffPayloadContents(payload) {
209763
210689
  throw new DiffServiceError("INVALID_INPUT", "Diff payload.stylesDiff must be a plain object or null.");
209764
210690
  if (numberingDiff !== null && numberingDiff !== undefined && (typeof numberingDiff !== "object" || Array.isArray(numberingDiff)))
209765
210691
  throw new DiffServiceError("INVALID_INPUT", "Diff payload.numberingDiff must be a plain object or null.");
210692
+ if (headerFootersDiff !== null && headerFootersDiff !== undefined && (typeof headerFootersDiff !== "object" || Array.isArray(headerFootersDiff)))
210693
+ throw new DiffServiceError("INVALID_INPUT", "Diff payload.headerFootersDiff must be a plain object or null.");
210694
+ if (partsDiff !== null && partsDiff !== undefined && (typeof partsDiff !== "object" || Array.isArray(partsDiff)))
210695
+ throw new DiffServiceError("INVALID_INPUT", "Diff payload.partsDiff must be a plain object or null.");
209766
210696
  return {
209767
210697
  docDiffs,
209768
210698
  commentDiffs: structuredClone(commentDiffs),
209769
210699
  stylesDiff: stylesDiff ?? null,
209770
- numberingDiff: numberingDiff ?? null
210700
+ numberingDiff: numberingDiff ?? null,
210701
+ headerFootersDiff: headerFootersDiff ?? null,
210702
+ partsDiff: partsDiff ?? null
209771
210703
  };
209772
210704
  }
209773
210705
  function isNonNullObject(v) {
@@ -209798,12 +210730,20 @@ function validateEngine(engine) {
209798
210730
  throw new DiffServiceError("INVALID_INPUT", `Unsupported engine "${engine}". This adapter only supports "${ENGINE_ID}".`);
209799
210731
  }
209800
210732
  function validateSnapshotVersion(version$1) {
209801
- if (version$1 !== SNAPSHOT_VERSION3)
209802
- throw new DiffServiceError("CAPABILITY_UNSUPPORTED", `Unsupported snapshot version "${version$1}". Expected "${SNAPSHOT_VERSION3}".`);
210733
+ if (version$1 !== "sd-diff-snapshot/v1" && version$1 !== SNAPSHOT_VERSION_V2)
210734
+ throw new DiffServiceError("CAPABILITY_UNSUPPORTED", `Unsupported snapshot version "${version$1}". Expected "sd-diff-snapshot/v1" or "${SNAPSHOT_VERSION_V2}".`);
209803
210735
  }
209804
210736
  function validatePayloadVersion(version$1) {
209805
- if (version$1 !== PAYLOAD_VERSION3)
209806
- throw new DiffServiceError("CAPABILITY_UNSUPPORTED", `Unsupported diff version "${version$1}". Expected "${PAYLOAD_VERSION3}".`);
210737
+ if (version$1 !== PAYLOAD_VERSION_V1 && version$1 !== PAYLOAD_VERSION_V2)
210738
+ throw new DiffServiceError("CAPABILITY_UNSUPPORTED", `Unsupported diff version "${version$1}". Expected "${PAYLOAD_VERSION_V1}" or "${PAYLOAD_VERSION_V2}".`);
210739
+ }
210740
+ function validateSnapshotFingerprints(snapshot2) {
210741
+ if (typeof snapshot2.fingerprint !== "string")
210742
+ throw new DiffServiceError("INVALID_INPUT", "Snapshot fingerprint must be a string.");
210743
+ }
210744
+ function validatePayloadFingerprints(payload) {
210745
+ if (typeof payload.baseFingerprint !== "string" || typeof payload.targetFingerprint !== "string")
210746
+ throw new DiffServiceError("INVALID_INPUT", "Diff payload fingerprints must be strings.");
209807
210747
  }
209808
210748
  function validateSnapshotPayload(payload) {
209809
210749
  if (payload.comments !== null && payload.comments !== undefined) {
@@ -209819,11 +210759,26 @@ function validateSnapshotPayload(payload) {
209819
210759
  throw new DiffServiceError("INVALID_INPUT", "Snapshot payload.styles must be a plain object or null.");
209820
210760
  if (payload.numbering !== null && payload.numbering !== undefined && (typeof payload.numbering !== "object" || Array.isArray(payload.numbering)))
209821
210761
  throw new DiffServiceError("INVALID_INPUT", "Snapshot payload.numbering must be a plain object or null.");
210762
+ if (payload.headerFooters !== null && payload.headerFooters !== undefined && (typeof payload.headerFooters !== "object" || Array.isArray(payload.headerFooters)))
210763
+ throw new DiffServiceError("INVALID_INPUT", "Snapshot payload.headerFooters must be a plain object or null.");
210764
+ if (payload.partsState !== null && payload.partsState !== undefined && (typeof payload.partsState !== "object" || Array.isArray(payload.partsState)))
210765
+ throw new DiffServiceError("INVALID_INPUT", "Snapshot payload.partsState must be a plain object or null.");
209822
210766
  }
209823
210767
  function validateCoverageMatch(base5, target) {
209824
210768
  if (!coverageEquals(base5, target))
209825
210769
  throw new DiffServiceError("INVALID_INPUT", `Coverage mismatch between base and target. Both must use the same coverage configuration.`);
209826
210770
  }
210771
+ function validateCoverageForPayloadVersion(diffPayload) {
210772
+ const expectedCoverage = diffPayload.version === PAYLOAD_VERSION_V1 ? V1_COVERAGE : V2_COVERAGE;
210773
+ if (!coverageEquals(diffPayload.coverage, expectedCoverage))
210774
+ throw new DiffServiceError("INVALID_INPUT", `Coverage mismatch for payload version "${diffPayload.version}". Expected ${JSON.stringify(expectedCoverage)}, got ${JSON.stringify(diffPayload.coverage)}.`);
210775
+ }
210776
+ function getCoverageForSnapshotVersion(version$1) {
210777
+ return version$1 === "sd-diff-snapshot/v1" ? V1_COVERAGE : V2_COVERAGE;
210778
+ }
210779
+ function getPayloadVersionForCoverage(coverage) {
210780
+ return coverage.headerFooters ? PAYLOAD_VERSION_V2 : PAYLOAD_VERSION_V1;
210781
+ }
209827
210782
  function createDiffAdapter(editor) {
209828
210783
  return {
209829
210784
  capture() {
@@ -209834,7 +210789,7 @@ function createDiffAdapter(editor) {
209834
210789
  },
209835
210790
  apply(input2, options) {
209836
210791
  const { result, tr } = wrapServiceCall(() => applyDiffPayload(editor, input2.diff, options));
209837
- if (tr.docChanged)
210792
+ if (tr.docChanged || result.appliedOperations > 0)
209838
210793
  editor.dispatch(tr);
209839
210794
  editor.emit("commentsUpdate", { type: "replayCompleted" });
209840
210795
  return result;
@@ -241774,7 +242729,7 @@ var Node$13 = class Node$14 {
241774
242729
  id: { default: null },
241775
242730
  edGrp: { default: null },
241776
242731
  displacedByCustomXml: { default: null }
241777
- }), PermEnd, PermEndBlock, IGNORED_ATTRIBUTE_KEYS, TRACK_CHANGE_MARK_NAMES, TRACK_CHANGE_IGNORED_ATTRIBUTE_KEYS, VOLATILE_PARAGRAPH_ATTRS, VOLATILE_IMAGE_ORIGINAL_ATTR_KEYS, SIMILARITY_THRESHOLD = 0.65, MIN_LENGTH_FOR_SIMILARITY = 4, COMMENT_ATTRS_DIFF_IGNORED_KEYS, setNestedValue = (target, path2, value) => {
242732
+ }), PermEnd, PermEndBlock, IGNORED_ATTRIBUTE_KEYS, TRACK_CHANGE_MARK_NAMES, TRACK_CHANGE_IGNORED_ATTRIBUTE_KEYS, VOLATILE_PARAGRAPH_ATTRS, VOLATILE_IMAGE_ORIGINAL_ATTR_KEYS, SIMILARITY_THRESHOLD = 0.65, MIN_LENGTH_FOR_SIMILARITY = 4, COMMENT_ATTRS_DIFF_IGNORED_KEYS, SLOT_VARIANTS, PART_KINDS, DOCUMENT_RELS_PATH$2 = "word/_rels/document.xml.rels", DOCUMENT_RELS_PATH$1 = "word/_rels/document.xml.rels", BODY_RELATIONSHIP_EXCLUSIONS, setNestedValue = (target, path2, value) => {
241778
242733
  if (!path2.includes(".")) {
241779
242734
  target[path2] = value;
241780
242735
  return;
@@ -241908,7 +242863,7 @@ var Node$13 = class Node$14 {
241908
242863
  type: mark2.type.name,
241909
242864
  attrs: mark2.attrs ?? {}
241910
242865
  }));
241911
- }, Diffing, getRichTextExtensions = () => {
242866
+ }, HEADER_RELATIONSHIP_TYPE$2 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE$2 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", Diffing, getRichTextExtensions = () => {
241912
242867
  return [
241913
242868
  Bold,
241914
242869
  Color,
@@ -244361,7 +245316,18 @@ var Node$13 = class Node$14 {
244361
245316
  console.warn("Failed to initialize developer tools:", error3);
244362
245317
  }
244363
245318
  }
244364
- }, 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 = `
245319
+ }, 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, V2_COVERAGE, SNAPSHOT_VERSION_V2 = "sd-diff-snapshot/v2", PAYLOAD_VERSION_V1 = "sd-diff-payload/v1", PAYLOAD_VERSION_V2 = "sd-diff-payload/v2", 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, cloneExtensionInstance = (extension2) => {
245320
+ const extensionLike = extension2;
245321
+ const config2 = extensionLike?.config;
245322
+ const ExtensionCtor = extensionLike?.constructor;
245323
+ if (!config2 || typeof config2 !== "object" || typeof ExtensionCtor !== "function")
245324
+ return extension2;
245325
+ try {
245326
+ return new ExtensionCtor(config2);
245327
+ } catch {
245328
+ return extension2;
245329
+ }
245330
+ }, Editor, EXCLUDED_PLUGIN_KEY_REF_LIST, EXCLUDED_PLUGIN_KEY_REFS, EXCLUDED_PLUGIN_KEY_PREFIXES, TEXT_RANGE_BLOCK_SEP = `
244365
245331
  `, TEXT_RANGE_LEAF_SEP = `
244366
245332
  `, DecorationBridge = class DecorationBridge2 {
244367
245333
  #applied = /* @__PURE__ */ new WeakMap;
@@ -253908,9 +254874,9 @@ var Node$13 = class Node$14 {
253908
254874
  return;
253909
254875
  console.log(...args$1);
253910
254876
  }, 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;
253911
- var init_src_CEDaw2yY_es = __esm(() => {
254877
+ var init_src_CxFOmQ5k_es = __esm(() => {
253912
254878
  init_rolldown_runtime_B2q5OVn9_es();
253913
- init_SuperConverter_DtIvNa0T_es();
254879
+ init_SuperConverter_CYbYOJeZ_es();
253914
254880
  init_jszip_ChlR43oI_es();
253915
254881
  init_uuid_qzgm05fK_es();
253916
254882
  init_constants_CIF8yzNk_es();
@@ -275803,19 +276769,46 @@ function print() { __p += __j.call(arguments, '') }
275803
276769
  "fileId",
275804
276770
  "selection"
275805
276771
  ];
276772
+ SLOT_VARIANTS = [
276773
+ "default",
276774
+ "first",
276775
+ "even"
276776
+ ];
276777
+ PART_KINDS = ["header", "footer"];
276778
+ BODY_RELATIONSHIP_EXCLUSIONS = new Set([
276779
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles",
276780
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering",
276781
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings",
276782
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme",
276783
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings",
276784
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable",
276785
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header",
276786
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer",
276787
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments",
276788
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes",
276789
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes",
276790
+ "http://schemas.microsoft.com/office/2011/relationships/commentsExtended",
276791
+ "http://schemas.microsoft.com/office/2016/09/relationships/commentsIds",
276792
+ "http://schemas.microsoft.com/office/2018/08/relationships/commentsExtensible"
276793
+ ]);
275806
276794
  Diffing = Extension.create({
275807
276795
  name: "documentDiffing",
275808
276796
  addCommands() {
275809
276797
  return {
275810
- compareDocuments: (updatedDocument, updatedComments, updatedStyles, updatedNumbering) => ({ state, tr }) => {
276798
+ compareDocuments: (targetEditor) => ({ state, tr }) => {
275811
276799
  tr.setMeta("preventDispatch", true);
276800
+ const updatedDocument = targetEditor.state.doc;
275812
276801
  const currentComments = this.editor.converter?.comments ?? [];
275813
- const nextComments = updatedComments === undefined ? currentComments : updatedComments;
276802
+ const nextComments = targetEditor.converter?.comments ?? currentComments;
275814
276803
  const currentStyles = this.editor.converter?.translatedLinkedStyles ?? null;
275815
- const nextStyles = updatedStyles === undefined ? currentStyles : updatedStyles;
276804
+ const nextStyles = targetEditor.converter?.translatedLinkedStyles ?? currentStyles;
275816
276805
  const currentNumbering = this.editor.converter?.translatedNumbering ?? null;
275817
- const nextNumbering = updatedNumbering === undefined ? currentNumbering : updatedNumbering;
275818
- return computeDiff(state.doc, updatedDocument, state.schema, currentComments, nextComments, currentStyles, nextStyles, currentNumbering, nextNumbering);
276806
+ const nextNumbering = targetEditor.converter?.translatedNumbering ?? currentNumbering;
276807
+ const currentHeaderFooters = captureHeaderFooterState(this.editor);
276808
+ const currentPartsState = capturePartsState(this.editor, currentHeaderFooters);
276809
+ const nextHeaderFooters = captureHeaderFooterState(targetEditor);
276810
+ const nextPartsState = capturePartsState(targetEditor, nextHeaderFooters);
276811
+ return computeDiff(state.doc, updatedDocument, state.schema, currentComments, nextComments, currentStyles, nextStyles, currentNumbering, nextNumbering, currentHeaderFooters, nextHeaderFooters, currentPartsState, nextPartsState);
275819
276812
  },
275820
276813
  replayDifferences: (diff, { applyTrackedChanges = true } = {}) => ({ state, dispatch }) => {
275821
276814
  if (!dispatch)
@@ -275823,18 +276816,21 @@ function print() { __p += __j.call(arguments, '') }
275823
276816
  const comments = this.editor.converter ? Array.isArray(this.editor.converter.comments) ? this.editor.converter.comments : this.editor.converter.comments = [] : [];
275824
276817
  const tr = state.tr;
275825
276818
  const canApplyTrackedChanges = applyTrackedChanges && Boolean(this.editor.options.user);
275826
- replayDiffs({
276819
+ if (canApplyTrackedChanges)
276820
+ tr.setMeta("inputType", "programmatic");
276821
+ const replayResult = replayDiffs({
275827
276822
  tr,
275828
276823
  diff,
275829
276824
  schema: state.schema,
275830
276825
  comments,
275831
- editor: this.editor
276826
+ editor: this.editor,
276827
+ trackedChangesRequested: canApplyTrackedChanges
275832
276828
  });
275833
276829
  if (canApplyTrackedChanges)
275834
276830
  tr.setMeta("forceTrackChanges", true);
275835
276831
  else
275836
276832
  tr.setMeta("skipTrackChanges", true);
275837
- if (dispatch && tr.docChanged)
276833
+ if (dispatch && (tr.docChanged || replayResult.appliedDiffs > 0))
275838
276834
  dispatch(tr);
275839
276835
  this.editor.emit("commentsUpdate", { type: "replayCompleted" });
275840
276836
  return true;
@@ -280869,11 +281865,24 @@ function print() { __p += __j.call(arguments, '') }
280869
281865
  numbering: true,
280870
281866
  headerFooters: false
280871
281867
  });
281868
+ V2_COVERAGE = Object.freeze({
281869
+ body: true,
281870
+ comments: true,
281871
+ styles: true,
281872
+ numbering: true,
281873
+ headerFooters: true
281874
+ });
280872
281875
  STAGED_CONVERTER_KEYS = [
280873
281876
  "translatedLinkedStyles",
280874
281877
  "translatedNumbering",
280875
281878
  "convertedXml",
280876
281879
  "numbering",
281880
+ "headers",
281881
+ "footers",
281882
+ "headerIds",
281883
+ "footerIds",
281884
+ "bodySectPr",
281885
+ "savedTagsToRestore",
280877
281886
  "documentGuid",
280878
281887
  "documentUniqueIdentifier"
280879
281888
  ];
@@ -281882,8 +282891,9 @@ function print() { __p += __j.call(arguments, '') }
281882
282891
  const allExtensions = [...coreExtensions, ...this.options.extensions].filter((extension2) => {
281883
282892
  const extensionType = typeof extension2?.type === "string" ? extension2.type : undefined;
281884
282893
  return extensionType ? allowedExtensions.includes(extensionType) : false;
281885
- });
281886
- this.extensionService = ExtensionService.create(allExtensions, externalExtensions, this);
282894
+ }).map((extension2) => cloneExtensionInstance(extension2));
282895
+ const isolatedExternalExtensions = externalExtensions.map((extension2) => cloneExtensionInstance(extension2));
282896
+ this.extensionService = ExtensionService.create(allExtensions, isolatedExternalExtensions, this);
281887
282897
  }
281888
282898
  #createCommandService() {
281889
282899
  this.#commandService = CommandService.create({ editor: this });
@@ -287860,8 +288870,8 @@ var init_zipper_YmNpPIyc_es = __esm(() => {
287860
288870
 
287861
288871
  // ../../packages/superdoc/dist/super-editor.es.js
287862
288872
  var init_super_editor_es = __esm(() => {
287863
- init_src_CEDaw2yY_es();
287864
- init_SuperConverter_DtIvNa0T_es();
288873
+ init_src_CxFOmQ5k_es();
288874
+ init_SuperConverter_CYbYOJeZ_es();
287865
288875
  init_jszip_ChlR43oI_es();
287866
288876
  init_xml_js_40FWvL78_es();
287867
288877
  init_constants_CIF8yzNk_es();