@stll/folio-core 0.58.5 → 0.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/ai-edits/apply.d.ts +11 -12
  2. package/dist/ai-edits/apply.js +179 -168
  3. package/dist/ai-edits/headless.d.ts +15 -13
  4. package/dist/ai-edits/headless.js +40 -13
  5. package/dist/ai-edits/index.d.ts +3 -3
  6. package/dist/ai-edits/newListNumbering.d.ts +3 -9
  7. package/dist/ai-edits/newListNumbering.js +36 -41
  8. package/dist/ai-edits/referenceClassification.d.ts +22 -0
  9. package/dist/ai-edits/referenceClassification.js +21 -0
  10. package/dist/ai-edits/snapshot.js +39 -40
  11. package/dist/ai-edits/types.d.ts +24 -32
  12. package/dist/compare/column-alignment.d.ts +4 -4
  13. package/dist/compare/compare.d.ts +3 -7
  14. package/dist/compare/compare.js +25 -27
  15. package/dist/compare/content-alignment.d.ts +9 -9
  16. package/dist/compare/content-types.d.ts +23 -10
  17. package/dist/compare/content-types.js +14 -0
  18. package/dist/compare/content.d.ts +16 -17
  19. package/dist/compare/content.js +30 -7
  20. package/dist/compare/formatting.d.ts +3 -3
  21. package/dist/compare/import-style-closure.d.ts +22 -0
  22. package/dist/compare/import-style-closure.js +33 -0
  23. package/dist/compare/inserted-resource-snapshot.d.ts +15 -0
  24. package/dist/compare/inserted-resource-snapshot.js +63 -0
  25. package/dist/compare/plan.js +20 -13
  26. package/dist/compare/scenario.js +12 -2
  27. package/dist/compare/style-resources.d.ts +8 -2
  28. package/dist/compare/style-resources.js +63 -14
  29. package/dist/compare/verification.d.ts +15 -3
  30. package/dist/compare/verification.js +47 -8
  31. package/dist/compat/eigenpal.d.ts +4 -4
  32. package/dist/controller/canonicalListRendering.js +13 -22
  33. package/dist/controller/canonicalPublicOperations.js +1 -1
  34. package/dist/controller/canonicalStructure.js +45 -21
  35. package/dist/document-operations.d.ts +4 -9
  36. package/dist/document-operations.js +45 -41
  37. package/dist/docx/attributeRemainder.d.ts +1 -1
  38. package/dist/docx/index.d.ts +1 -1
  39. package/dist/docx/listMarkerComputation.js +9 -14
  40. package/dist/docx/listTemplate.d.ts +22 -0
  41. package/dist/docx/listTemplate.js +40 -0
  42. package/dist/docx/numberingParser.js +2 -2
  43. package/dist/docx/numberingReferenceNormalization.js +3 -3
  44. package/dist/docx/paragraphParser.js +3 -4
  45. package/dist/docx/rezip.js +2 -2
  46. package/dist/docx/server/materializeYjsDocx.js +2 -2
  47. package/dist/docx/server/migrateYjsAttrSchema.js +5 -5
  48. package/dist/generated/text_shaper.js +8 -4
  49. package/dist/generated/text_shaper_bg.wasm +0 -0
  50. package/dist/index.d.ts +4 -4
  51. package/dist/internal/paragraphFormattingSerialization.d.ts +1 -8
  52. package/dist/internal/paragraphFormattingSerialization.js +6 -20
  53. package/dist/layout-bridge/convert/flowConversionShared.d.ts +1 -1
  54. package/dist/layout-bridge/convert/listMarkers.d.ts +1 -2
  55. package/dist/layout-bridge/convert/listMarkers.js +3 -11
  56. package/dist/layout-bridge/convert/paragraphAttrs.d.ts +1 -1
  57. package/dist/layout-bridge/convert/paragraphAttrs.js +8 -4
  58. package/dist/layout-bridge/convert/toFlowBlocks.d.ts +2 -1
  59. package/dist/layout-bridge/convert/toFlowBlocks.js +2 -1
  60. package/dist/markdown/renderParagraph.js +29 -3
  61. package/dist/prosemirror/commands/comments.js +5 -32
  62. package/dist/prosemirror/commands/paragraphBookmarkJoin.d.ts +7 -1
  63. package/dist/prosemirror/commands/paragraphBookmarkJoin.js +35 -1
  64. package/dist/prosemirror/commands/propertyChangeScope.js +6 -0
  65. package/dist/prosemirror/commands/resolveParagraphProperties.js +10 -5
  66. package/dist/prosemirror/conversion/fromProseDoc.js +23 -9
  67. package/dist/prosemirror/conversion/toProseDoc.js +31 -7
  68. package/dist/prosemirror/extensions/core/ParagraphExtension.js +29 -14
  69. package/dist/prosemirror/extensions/features/ListExtension.js +51 -21
  70. package/dist/prosemirror/listInstanceReferences.js +21 -15
  71. package/dist/prosemirror/listLabels.d.ts +4 -3
  72. package/dist/prosemirror/listLabels.js +18 -51
  73. package/dist/prosemirror/listMarker.d.ts +2 -19
  74. package/dist/prosemirror/listMarker.js +28 -57
  75. package/dist/prosemirror/listNumbering.js +16 -6
  76. package/dist/prosemirror/listRendering.d.ts +4 -3
  77. package/dist/prosemirror/listRendering.js +22 -3
  78. package/dist/prosemirror/listRenderingAttrs.d.ts +2 -1
  79. package/dist/prosemirror/listRenderingAttrs.js +6 -11
  80. package/dist/prosemirror/numberedRefFields.js +9 -5
  81. package/dist/prosemirror/numberingAttr.d.ts +19 -1
  82. package/dist/prosemirror/numberingAttr.js +16 -2
  83. package/dist/prosemirror/paragraphIndentation.js +5 -2
  84. package/dist/prosemirror/paragraphMarkJoin.js +17 -3
  85. package/dist/prosemirror/paragraphPropertyCarry.js +5 -6
  86. package/dist/prosemirror/plugins/transactionInvariants.js +6 -2
  87. package/dist/prosemirror/schema/nodes.d.ts +2 -1
  88. package/dist/prosemirror/selectionState.js +5 -1
  89. package/dist/prosemirror/storyListNumbering.js +11 -12
  90. package/dist/prosemirror/styles/paragraphStyleCascade.js +2 -6
  91. package/dist/prosemirror/styles/resolvedStyleAttrs.d.ts +11 -4
  92. package/dist/prosemirror/styles/resolvedStyleAttrs.js +28 -18
  93. package/dist/prosemirror/yjsDocumentMetadata.d.ts +9 -3
  94. package/dist/prosemirror/yjsDocumentMetadata.js +42 -10
  95. package/dist/redline.d.ts +17 -1
  96. package/dist/redline.js +118 -57
  97. package/dist/server.d.ts +3 -3
  98. package/dist/server.js +2 -2
  99. package/dist/version-comparison.d.ts +1 -2
  100. package/dist/version-comparison.js +1 -2
  101. package/package.json +4 -3
@@ -1,6 +1,6 @@
1
1
  import { DERIVED_PART_ROOT_ATTRIBUTES, attributeRemainder } from "./attributeRemainder.js";
2
2
  import { CAPTURE, dispatchChildrenWithContext, sequencePositions } from "./containerChildren.js";
3
- import { isNumberingReference } from "./numberingReference.js";
3
+ import { isNumberingReference as isNumberingReference$1 } from "./numberingReference.js";
4
4
  import { formatOoxmlCounter, padDecimal } from "./ooxmlCounterFormatter.js";
5
5
  import { parseParagraphProperties } from "./paragraphProperties.js";
6
6
  import { LevelSuffixSchema, NumberFormatSchema, ParagraphAlignmentSchema, narrowEnum } from "./parserEnums.js";
@@ -459,7 +459,7 @@ function createNumberingMap(definitions) {
459
459
  */
460
460
  function computeListRendering(numPr, numbering) {
461
461
  const { numId, ilvl = 0 } = numPr;
462
- if (!isNumberingReference(numId)) return null;
462
+ if (!isNumberingReference$1(numId)) return null;
463
463
  const level = numbering.getLevel(numId, ilvl);
464
464
  if (!level) return null;
465
465
  const levelNumFmts = [];
@@ -1,4 +1,4 @@
1
- import { NO_PARAGRAPH_NUMBERING as NO_PARAGRAPH_NUMBERING$1, paragraphNumberingReferenceId as paragraphNumberingReferenceId$1 } from "./numberingReference.js";
1
+ import { NO_PARAGRAPH_NUMBERING as NO_PARAGRAPH_NUMBERING$1, paragraphNumberingReferenceId } from "./numberingReference.js";
2
2
  import { visitDocxParagraphs } from "./paragraphTraversal.js";
3
3
  import { PARSE_WARNING_CODES } from "@stll/docx-core/model";
4
4
  //#region src/docx/numberingReferenceNormalization.ts
@@ -40,7 +40,7 @@ const normalizeNumberingReferences = ({ documentBody, numbering, headers, footer
40
40
  endnotes
41
41
  }, (paragraph) => {
42
42
  const formatting = paragraph.formatting;
43
- const numId = paragraphNumberingReferenceId$1(formatting?.numPr);
43
+ const numId = paragraphNumberingReferenceId(formatting?.numPr);
44
44
  if (!formatting || numId === void 0 || resolvesNumbering(numId, numbering)) return;
45
45
  formatting.numPr = NO_PARAGRAPH_NUMBERING$1;
46
46
  delete formatting.numPrFromStyle;
@@ -53,7 +53,7 @@ const normalizeStyleNumberingReferences = ({ styles, numbering }) => {
53
53
  const unnumberedStyleIds = [];
54
54
  for (const style of styles) {
55
55
  const pPr = style.pPr;
56
- const numId = paragraphNumberingReferenceId$1(pPr?.numPr);
56
+ const numId = paragraphNumberingReferenceId(pPr?.numPr);
57
57
  if (!pPr || numId === void 0 || resolvesNumbering(numId, numbering)) continue;
58
58
  pPr.numPr = NO_PARAGRAPH_NUMBERING$1;
59
59
  unnumberedStyleIds.push(style.styleId);
@@ -12,7 +12,7 @@ import { inlineWrapperOf } from "./inlineWrapperParser.js";
12
12
  import { preserveLinkedSdt } from "./linkedSdtPreservation.js";
13
13
  import { parseMarkupRangeMarker, parseMoveBookmarkMarker } from "./markupRangeMarker.js";
14
14
  import { counterFormatOf, markerAlignmentForLevel, markerFormattingFromLevel, numberingLevelHasMarkerSlot } from "./numberingParser.js";
15
- import { mergeParagraphNumbering as mergeParagraphNumbering$1, paragraphNumberingReferenceId as paragraphNumberingReferenceId$1, resolveParagraphNumbering as resolveParagraphNumbering$1 } from "./numberingReference.js";
15
+ import { mergeParagraphNumbering as mergeParagraphNumbering$1, paragraphNumberingReferenceId, resolveParagraphNumbering as resolveParagraphNumbering$1 } from "./numberingReference.js";
16
16
  import { paraIdAttribute, textIdAttribute } from "./paraIdAttribute.js";
17
17
  import { paraIdInRange } from "./paraIdRangeNormalization.js";
18
18
  import { EMPTY_MARK_PROPERTIES_ATTRIBUTE, restoreEmptyMarkProperties } from "./paragraphMarkPropertyPresence.js";
@@ -1253,7 +1253,6 @@ function parseParagraph(node, styles, theme, numbering, rels = null, media = nul
1253
1253
  let effectiveNumPr = directNumPr;
1254
1254
  if (paragraphFormatting && numPrFromStyle) {
1255
1255
  effectiveNumPr = mergeParagraphNumbering$1(styleNumPr, directNumPr);
1256
- if (effectiveNumPr !== void 0) paragraphFormatting.numPr = effectiveNumPr;
1257
1256
  paragraphFormatting.numPrFromStyle = styleNumPr;
1258
1257
  }
1259
1258
  const resolvedNumbering = resolveParagraphNumbering$1(effectiveNumPr);
@@ -1444,7 +1443,7 @@ function isEmptyParagraph(paragraph) {
1444
1443
  * @returns true if paragraph has numbering properties
1445
1444
  */
1446
1445
  function isListItem(paragraph) {
1447
- return paragraphNumberingReferenceId$1(paragraph.formatting?.numPr) !== void 0;
1446
+ return paragraphNumberingReferenceId(mergeParagraphNumbering$1(paragraph.formatting?.numPrFromStyle, paragraph.formatting?.numPr)) !== void 0;
1448
1447
  }
1449
1448
  /**
1450
1449
  * Get the list level of a paragraph (0-8)
@@ -1453,7 +1452,7 @@ function isListItem(paragraph) {
1453
1452
  * @returns List level or undefined if not a list item
1454
1453
  */
1455
1454
  function getListLevel(paragraph) {
1456
- const resolved = resolveParagraphNumbering$1(paragraph.formatting?.numPr);
1455
+ const resolved = resolveParagraphNumbering$1(mergeParagraphNumbering$1(paragraph.formatting?.numPrFromStyle, paragraph.formatting?.numPr));
1457
1456
  return resolved.kind === "reference" ? resolved.ilvl : void 0;
1458
1457
  }
1459
1458
  /**
@@ -16,7 +16,7 @@ import { assertValidFolioDocumentModel } from "./modelValidation.js";
16
16
  import { isNewDataUrlDrawing } from "./newImage.js";
17
17
  import { missingNoteReferenceStyles, noteReferenceNeeds } from "./noteReferenceStyles.js";
18
18
  import { parseNumbering } from "./numberingParser.js";
19
- import { paragraphNumberingReferenceId as paragraphNumberingReferenceId$1 } from "./numberingReference.js";
19
+ import { paragraphNumberingReferenceId } from "./numberingReference.js";
20
20
  import { isUnsafePackagePath, reconcilePackageReferences, removeUnsafeEntries } from "./packageParts.js";
21
21
  import { normalizeParaIdRangeInXmlParts } from "./paraIdRangeNormalization.js";
22
22
  import { cloneDocumentWithParagraphPropertySources, cloneParagraphWithPropertySource, copyDocumentParagraphPropertySourceContract } from "./paragraphPropertySource.js";
@@ -2462,7 +2462,7 @@ const overrideXml = (partName, contentType) => `<Override PartName="${partName}"
2462
2462
  const assertStyleNumberingReferences = (doc) => {
2463
2463
  const referenced = /* @__PURE__ */ new Set();
2464
2464
  for (const style of doc.package.styles?.styles ?? []) {
2465
- const numId = paragraphNumberingReferenceId$1(style.pPr?.numPr);
2465
+ const numId = paragraphNumberingReferenceId(style.pPr?.numPr);
2466
2466
  if (numId !== void 0) referenced.add(numId);
2467
2467
  }
2468
2468
  if (referenced.size === 0) return;
@@ -1,6 +1,6 @@
1
1
  import { fromProseDoc } from "../../prosemirror/conversion/fromProseDoc.js";
2
2
  import { schema } from "../../prosemirror/schema/index.js";
3
- import { FolioYjsNoteReferenceSchemaError, applyAttrSchemaMigrations, readYjsAttrSchemaVersion, readYjsParagraphSourceContract, withParagraphSourceContract } from "../../prosemirror/yjsDocumentMetadata.js";
3
+ import { FolioYjsNoteReferenceSchemaError, FolioYjsNumberingSourceSchemaError, applyAttrSchemaMigrations, readYjsAttrSchemaVersion, readYjsParagraphSourceContract, withParagraphSourceContract } from "../../prosemirror/yjsDocumentMetadata.js";
4
4
  import { ParagraphPropertySourceValidationError } from "../paragraphPropertySource.js";
5
5
  import { parseDocx } from "../parser.js";
6
6
  import { repackDocx } from "../rezip.js";
@@ -57,7 +57,7 @@ const readProseMirrorDocument = (yjsUpdate) => {
57
57
  },
58
58
  catch: (cause) => {
59
59
  if (cause instanceof FolioYjsDocxMaterializationError) return cause;
60
- if (cause instanceof FolioYjsNoteReferenceSchemaError) return new FolioYjsDocxMaterializationError({
60
+ if (cause instanceof FolioYjsNoteReferenceSchemaError || cause instanceof FolioYjsNumberingSourceSchemaError) return new FolioYjsDocxMaterializationError({
61
61
  code: "stale_attr_schema",
62
62
  message: cause.message,
63
63
  cause
@@ -1,4 +1,4 @@
1
- import { FolioYjsNoteReferenceSchemaError, applyAttrSchemaMigrations, readYjsAttrSchemaVersion } from "../../prosemirror/yjsDocumentMetadata.js";
1
+ import { FolioYjsNoteReferenceSchemaError, FolioYjsNumberingSourceSchemaError, applyAttrSchemaMigrations, readYjsAttrSchemaVersion } from "../../prosemirror/yjsDocumentMetadata.js";
2
2
  import { FOLIO_YJS_PROSEMIRROR_FRAGMENT_NAME } from "./materializeYjsDocx.js";
3
3
  import { Result, TaggedError } from "better-result";
4
4
  import * as Y from "yjs";
@@ -77,19 +77,19 @@ const migrateFolioYjsSnapshot = (update) => {
77
77
  catch: (cause) => new FolioYjsSnapshotMigrationError({
78
78
  cause,
79
79
  code: "unsupported_version",
80
- message: cause instanceof FolioYjsNoteReferenceSchemaError ? cause.message : "Cannot migrate the collaboration attribute schema."
80
+ message: cause instanceof FolioYjsNoteReferenceSchemaError || cause instanceof FolioYjsNumberingSourceSchemaError ? cause.message : "Cannot migrate the collaboration attribute schema."
81
81
  })
82
82
  });
83
83
  if (migratedAttrs.isErr()) {
84
84
  ydoc.destroy();
85
85
  return Result.err(migratedAttrs.error);
86
86
  }
87
- if (fromVersion === 12) {
87
+ if (fromVersion === 13) {
88
88
  ydoc.destroy();
89
89
  return Result.ok({
90
90
  fromVersion,
91
91
  paragraphsRewritten: 0,
92
- toVersion: 12,
92
+ toVersion: 13,
93
93
  update
94
94
  });
95
95
  }
@@ -99,7 +99,7 @@ const migrateFolioYjsSnapshot = (update) => {
99
99
  return Result.ok({
100
100
  fromVersion,
101
101
  paragraphsRewritten,
102
- toVersion: 12,
102
+ toVersion: 13,
103
103
  update: migrated
104
104
  });
105
105
  };
@@ -81,7 +81,7 @@ export function shapeRun(font, face_index, text, right_to_left, script, language
81
81
  function __wbg_get_imports() {
82
82
  const import0 = {
83
83
  __proto__: null,
84
- __wbg___wbindgen_string_get_b0ca35b86a603356: function(arg0, arg1) {
84
+ __wbg___wbindgen_string_get_0380ccaa2f57f0d9: function(arg0, arg1) {
85
85
  const obj = getObject(arg1);
86
86
  const ret = typeof(obj) === 'string' ? obj : undefined;
87
87
  var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);
@@ -89,10 +89,10 @@ function __wbg_get_imports() {
89
89
  getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
90
90
  getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
91
91
  },
92
- __wbg___wbindgen_throw_344f42d3211c4765: function(arg0, arg1) {
92
+ __wbg___wbindgen_throw_41e9ee4f547fc59a: function(arg0, arg1) {
93
93
  throw new Error(getStringFromWasm0(arg0, arg1));
94
94
  },
95
- __wbindgen_cast_0000000000000001: function(arg0, arg1) {
95
+ __wbindgen_generic_0000000000000001: function(arg0, arg1) {
96
96
  // Cast intrinsic for `Ref(String) -> Externref`.
97
97
  const ret = getStringFromWasm0(arg0, arg1);
98
98
  return addHeapObject(ret);
@@ -268,11 +268,15 @@ function __wbg_finalize_init(instance, module) {
268
268
 
269
269
  async function __wbg_load(module, imports) {
270
270
  if (typeof Response === 'function' && module instanceof Response) {
271
+ if (!module.ok) {
272
+ throw new Error(`failed to fetch Wasm: ${module.status} ${module.statusText} fetching '${module.url}'`);
273
+ }
274
+
271
275
  if (typeof WebAssembly.instantiateStreaming === 'function') {
272
276
  try {
273
277
  return await WebAssembly.instantiateStreaming(module, imports);
274
278
  } catch (e) {
275
- const validResponse = module.ok && expectedResponseType(module.type);
279
+ const validResponse = expectedResponseType(module.type);
276
280
 
277
281
  if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {
278
282
  console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
Binary file
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { document_d_exports } from "./types/document.js";
2
- import { FolioContentBlock, FolioContentContainerPathEntry, FolioContentFormatRange, FolioContentIdStability, FolioContentInlineBooleanProperty, FolioContentInlineComparisonResult, FolioContentInlineFormatting, FolioContentInlineFormattingPatch, FolioContentLineSpacingRule, FolioContentParagraphAlignment, FolioContentParagraphKind, FolioContentParagraphSpacing, FolioContentRun, FolioContentSnapshot, FolioContentTableLocation } from "./compare/content-types.js";
3
- import { FolioAIBlock, FolioAIBlockAnchor, FolioAIBlockKind, FolioAIBlockPreviewRun, FolioAIBlockStructuralBoundary, FolioAIBlockTableLocation, FolioAIComment, FolioAIEditAppliedOperation, FolioAIEditApplyMode, FolioAIEditApplyResult, FolioAIEditNormalization, FolioAIEditNormalizationCode, FolioAIEditOperation, FolioAIEditPrecondition, FolioAIEditReviewMeta, FolioAIEditSeverity, FolioAIEditSkipReason, FolioAIEditSkippedOperation, FolioAIEditSnapshot, FolioAIInlineBooleanProperty, FolioAIInlineFormatting, FolioAIInlineFormattingPatch, FolioAIParagraphSpacing, FolioAISignatureParty } from "./ai-edits/types.js";
2
+ import { FolioContentBlock, FolioContentContainerPathEntry, FolioContentFormatRange, FolioContentIdStability, FolioContentInlineBooleanProperty, FolioContentInlineComparisonResult, FolioContentInlineFormatting, FolioContentInlineFormattingPatch, FolioContentLineSpacingRule, FolioContentParagraphAlignment, FolioContentParagraphKind, FolioContentParagraphSpacing, FolioContentRun, FolioContentSnapshot, FolioContentStatedNumbering, FolioContentTableLocation } from "./compare/content-types.js";
3
+ import { FolioAIBlock, FolioAIBlockAnchor, FolioAIBlockKind, FolioAIBlockPreviewRun, FolioAIBlockStructuralBoundary, FolioAIBlockTableLocation, FolioAIComment, FolioAIDiagnosticBlock, FolioAIEditAppliedOperation, FolioAIEditApplyMode, FolioAIEditApplyResult, FolioAIEditNormalization, FolioAIEditNormalizationCode, FolioAIEditOperation, FolioAIEditPrecondition, FolioAIEditReviewMeta, FolioAIEditSeverity, FolioAIEditSkipReason, FolioAIEditSkippedOperation, FolioAIEditSnapshot, FolioAIInlineBooleanProperty, FolioAIInlineFormatting, FolioAIInlineFormattingPatch, FolioAIParagraphBlock, FolioAIParagraphSpacing, FolioAISignatureParty } from "./ai-edits/types.js";
4
4
  import { WORD_DIFF_GRANULARITIES, WordDiffGranularity, WordDiffNormalization, WordDiffOptions, WordDiffSegment, diffWordSegments } from "./ai-edits/word-diff.js";
5
- import { FolioAIEditApplyOutcome, FolioRevisionStamp, FolioWordDiffOptions, applyFolioAIEditOperations } from "./ai-edits/apply.js";
5
+ import { FolioAIEditApplyOutcome, FolioRevisionStamp, FolioUndefinedReferencePolicy, FolioWordDiffOptions, applyFolioAIEditOperations } from "./ai-edits/apply.js";
6
6
  import { ApplyFolioDocumentOperationsOptions, FOLIO_DOCUMENT_OPERATION_BATCH_MODES, FOLIO_DOCUMENT_OPERATION_CONTRACT_VERSION, FOLIO_DOCUMENT_OPERATION_MODES, FOLIO_DOCUMENT_OPERATION_MODES_BY_TYPE, FOLIO_DOCUMENT_OPERATION_PRECONDITIONS, FOLIO_DOCUMENT_OPERATION_STORIES, FOLIO_DOCUMENT_OPERATION_TYPES, FOLIO_LINE_SPACING_RULE_VALUES, FOLIO_PARAGRAPH_ALIGNMENT_VALUES, FolioDocumentOperation, FolioDocumentOperationAffectedTarget, FolioDocumentOperationBatch, FolioDocumentOperationCapabilities, FolioDocumentOperationIssue, FolioDocumentOperationMode, FolioDocumentOperationPrecondition, FolioDocumentOperationReceipt, FolioDocumentOperationRecovery, FolioDocumentOperationResult, FolioDocumentOperationResultBase, FolioDocumentOperationStatus, FolioDocumentOperationStory, FolioDocumentOperationType, FolioDocumentOperationUndoFailureReason, FolioDocumentOperationUndoHandle, FolioDocumentOperationUndoResult, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, applyFolioDocumentOperations, assertSupportedFolioDocumentOperationVersion, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, parseFolioDocumentOperationBatch } from "./document-operations.js";
7
7
  import { createFolioAIEditSnapshot, hashFolioAIBlockText, isFolioAIContentBlock, normalizeFolioAIBlockText } from "./ai-edits/snapshot.js";
8
8
  import { DeriveBlockIdInput, FolioBlockId, currentFolioBlockId, deriveBlockId, getFolioParaIdFromBlockId, isFolioBlockId, isSequentialFolioBlockId } from "./types/block-id.js";
@@ -43,4 +43,4 @@ import { FOLIO_YJS_ATTR_SCHEMA_VERSION, FolioYjsAttrSchemaVersion, FolioYjsAttrS
43
43
  import { DOCX_CONFORMANCE_CLASSES } from "@stll/docx-core/model";
44
44
  type Document = document_d_exports.Document;
45
45
  type DocxConformanceClass = document_d_exports.DocxConformanceClass;
46
- export { type AIBarStatus, type AIChatMode, type AICitation, type AICitationRange, type AICitationSource, type AIGenerateInput, type AISuggestion, type AISuggestionApplyMode, type AISuggestionPreset, type AISuggestionSeverity, type AISuggestionStatus, type AcceptAutocompleteResult, type AnonymizationMatch, type AnonymizationTerm, type ApplyFolioDocumentOperationsOptions, type ApplyResult, type AutocompleteSuggestionPluginOptions, type AutocompleteSuggestionState, type AutocompleteSuggestionStatus, type AutocompleteTriggerCheck, type AutocompleteTriggerOptions, type AutocompleteTriggerSkipReason, type BlockRect, COMPARE_REVISION_FORMATS, COMPARE_UNSUPPORTED_REASONS, COMPARE_VERIFICATION_CAUSES, COMPARE_VERIFICATION_INVARIANTS, type CompareChange, type CompareChangeLocation, type CompareCompatibility, type CompareContentOptions, CompareDocxApplyError, type CompareDocxError, CompareDocxFinalParagraphMarkError, CompareDocxOperationLimitError, type CompareDocxOptions, CompareDocxParseError, CompareDocxRoundTripError, CompareDocxSerializeError, type CompareFolioRequirement, type CompareResult, type CompareRevisionFormat, type CompareUnsupportedPart, type CompareUnsupportedReason, type CompareVerification, type CompareVerificationCause, type CompareVerificationFailure, type CompareVerificationInvariant, type CreateEmptyDocumentOptions, DEFAULT_AI_SUGGESTION_PRESETS, DEFAULT_AUTOCOMPLETE_DEAD_ZONE_NODES, DEFAULT_OUTLINE_DEPTH, DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION, DOCX_CONFORMANCE_CLASSES, DRAWING_SAFETY_CLASSES, type DeriveBlockIdInput, type DirectiveKind, type DirectiveRange, type Document, type DocumentPreset, type DocumentPropertiesOptions, type DocumentStyleCatalog, type DocumentStyleCatalogEntry, type DocumentStyleSet, type DocxCompatibility, type DocxCompatibilityContext, type DocxCompatibilityIssue, type DocxCompatibilityLocation, type DocxCompatibilityPart, type DocxConformanceClass, type DocxDrawingClassification, type DrawingSafetyClass, type EmbeddedFont, type EmbeddedFontParts, type ExtractDocumentStyleSetOptions, FOLIO_CONTENT_COMPARISON_LIMITS, FOLIO_DOCUMENT_OPERATION_BATCH_MODES, FOLIO_DOCUMENT_OPERATION_CONTRACT_VERSION, FOLIO_DOCUMENT_OPERATION_MODES, FOLIO_DOCUMENT_OPERATION_MODES_BY_TYPE, FOLIO_DOCUMENT_OPERATION_PRECONDITIONS, FOLIO_DOCUMENT_OPERATION_STORIES, FOLIO_DOCUMENT_OPERATION_TYPES, FOLIO_LINE_SPACING_RULE_VALUES, FOLIO_PARAGRAPH_ALIGNMENT_VALUES, FOLIO_YJS_ATTR_SCHEMA_VERSION, type FinalParagraphMarkRevision, type FolioAIBlock, type FolioAIBlockAnchor, type FolioAIBlockKind, type FolioAIBlockPreviewRun, type FolioAIBlockStructuralBoundary, type FolioAIBlockTableLocation, type FolioAIComment, type FolioAIEditAppliedOperation, type FolioAIEditApplyMode, type FolioAIEditApplyOutcome, type FolioAIEditApplyResult, type FolioAIEditNormalization, type FolioAIEditNormalizationCode, type FolioAIEditOperation, type FolioAIEditPrecondition, type FolioAIEditReviewMeta, type FolioAIEditSeverity, type FolioAIEditSkipReason, type FolioAIEditSkippedOperation, type FolioAIEditSnapshot, type FolioAIInlineBooleanProperty, type FolioAIInlineFormatting, type FolioAIInlineFormattingPatch, type FolioAIParagraphSpacing, type FolioAISignatureParty, type FolioBlockId, type FolioContentBlock, type FolioContentBlockProperty, type FolioContentComparison, type FolioContentComparisonError, type FolioContentComparisonEvent, type FolioContentComparisonLimit, FolioContentComparisonLimitError, type FolioContentContainerPathEntry, type FolioContentFormatRange, type FolioContentFormattingChange, type FolioContentIdStability, type FolioContentInlineBooleanProperty, type FolioContentInlineComparisonResult, type FolioContentInlineFormatting, type FolioContentInlineFormattingPatch, FolioContentInlinePresentationProjectionError, type FolioContentLineSpacingRule, type FolioContentParagraphAlignment, type FolioContentParagraphFormattingPatch, type FolioContentParagraphKind, type FolioContentParagraphSpacing, type FolioContentRun, type FolioContentSnapshot, type FolioContentStructuralChange, type FolioContentTableLocation, type FolioContentTextSegment, type FolioDocumentOperation, type FolioDocumentOperationAffectedTarget, type FolioDocumentOperationBatch, type FolioDocumentOperationCapabilities, type FolioDocumentOperationIssue, type FolioDocumentOperationMode, type FolioDocumentOperationPrecondition, type FolioDocumentOperationReceipt, type FolioDocumentOperationRecovery, type FolioDocumentOperationResult, type FolioDocumentOperationResultBase, type FolioDocumentOperationStatus, type FolioDocumentOperationStory, type FolioDocumentOperationType, type FolioDocumentOperationUndoFailureReason, type FolioDocumentOperationUndoHandle, type FolioDocumentOperationUndoResult, type FolioDocxCompatibilityHost, type FolioDocxCompatibilityProfile, type FolioRevisionStamp, type FolioWordDiffOptions, type FolioYjsAttrSchemaVersion, FolioYjsAttrSchemaVersionError, type ImageMeta, type ImageRef, type InspectDocxCompatibilityOptions, InvalidCompareDocxOptionsError, InvalidFolioContentComparisonError, InvalidFolioDocumentOperationBatchError, MAX_COMPARE_OPERATIONS, type MarkdownOptions, type MarkdownResult, type OutlineDepth, type PositionalText, type ResolvedAnchor, STELLA_STYLE_SET_NAME, type TemplatePreviewHiddenRange, type TemplatePreviewSpan, type TemplatePreviewValue, type TemplatePreviewValues, type TemplateSlashMenuKeyAction, type TemplateSlashMenuState, UnsupportedFolioDocumentOperationVersionError, WORD_DIFF_GRANULARITIES, type WordDiffGranularity, type WordDiffNormalization, type WordDiffOptions, type WordDiffSegment, acceptAutocompleteSuggestion, acceptAutocompleteWord, anonymizationDecorationsKey, appendAutocompleteToken, applyFolioAIEditOperations, applyFolioDocumentOperations, applySuggestions, assertSupportedFolioDocumentOperationVersion, autocompleteSuggestionKey, autocompleteSuggestionPlugin, buildEmbeddedFontFamilyMap, buildPositionalText, clearAutocompleteSuggestion, clearTemplateSlashMenu, compareContent, compareDocx, consumeTemplateSlashQuery, createAICitationDecorationsPlugin, createDocx, createEmptyDocument, createFolioAIEditSnapshot, createStellaStyleDocumentPreset, createStellaStyleSet, currentFolioBlockId, deriveBlockId, diffWordSegments, extractDocumentStyleSet, extractDocumentStyleSetFromDocx, extractEmbeddedFonts, filterHeadingsByDepth, finishAutocompleteSuggestion, fromMarkdown, getAnonymizationMatches, getAutocompleteSuggestion, getEmbeddedFontFaces, getFolioCaretViewportRect, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioParaIdFromBlockId, getFolioSelectionViewportRect, getGoogleFontsEnabled, getTemplateDirectives, getTemplateSlashMenu, hashFolioAIBlockText, inspectDocumentStyles, inspectDocumentStylesFromDocx, inspectDocxCompatibility, isFolioAIContentBlock, isFolioBlockId, isFolioDocumentOperationModeSupported, isSequentialFolioBlockId, isSuggestionStale, isSupportedFolioDocumentOperationVersion, mergeDocumentContent, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch, resetTemplateSlashQuery, resolveSuggestionAnchor, scanDirectives, scopeEmbeddedFontFamily, scrollFolioPositionIntoView, setAICitationsMeta, setAISuggestionsMeta, setActiveCitationMeta, setAnonymizationTermsMeta, setEmbeddedFontFamilyMap, setFocusedSuggestionMeta, setGoogleFontsEnabled, setTemplatePreviewValues, shouldTriggerAutocomplete, startAutocompleteSuggestion, templateSlashMenuKey, toMarkdown, toMarkdownResult };
46
+ export { type AIBarStatus, type AIChatMode, type AICitation, type AICitationRange, type AICitationSource, type AIGenerateInput, type AISuggestion, type AISuggestionApplyMode, type AISuggestionPreset, type AISuggestionSeverity, type AISuggestionStatus, type AcceptAutocompleteResult, type AnonymizationMatch, type AnonymizationTerm, type ApplyFolioDocumentOperationsOptions, type ApplyResult, type AutocompleteSuggestionPluginOptions, type AutocompleteSuggestionState, type AutocompleteSuggestionStatus, type AutocompleteTriggerCheck, type AutocompleteTriggerOptions, type AutocompleteTriggerSkipReason, type BlockRect, COMPARE_REVISION_FORMATS, COMPARE_UNSUPPORTED_REASONS, COMPARE_VERIFICATION_CAUSES, COMPARE_VERIFICATION_INVARIANTS, type CompareChange, type CompareChangeLocation, type CompareCompatibility, type CompareContentOptions, CompareDocxApplyError, type CompareDocxError, CompareDocxFinalParagraphMarkError, CompareDocxOperationLimitError, type CompareDocxOptions, CompareDocxParseError, CompareDocxRoundTripError, CompareDocxSerializeError, type CompareFolioRequirement, type CompareResult, type CompareRevisionFormat, type CompareUnsupportedPart, type CompareUnsupportedReason, type CompareVerification, type CompareVerificationCause, type CompareVerificationFailure, type CompareVerificationInvariant, type CreateEmptyDocumentOptions, DEFAULT_AI_SUGGESTION_PRESETS, DEFAULT_AUTOCOMPLETE_DEAD_ZONE_NODES, DEFAULT_OUTLINE_DEPTH, DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION, DOCX_CONFORMANCE_CLASSES, DRAWING_SAFETY_CLASSES, type DeriveBlockIdInput, type DirectiveKind, type DirectiveRange, type Document, type DocumentPreset, type DocumentPropertiesOptions, type DocumentStyleCatalog, type DocumentStyleCatalogEntry, type DocumentStyleSet, type DocxCompatibility, type DocxCompatibilityContext, type DocxCompatibilityIssue, type DocxCompatibilityLocation, type DocxCompatibilityPart, type DocxConformanceClass, type DocxDrawingClassification, type DrawingSafetyClass, type EmbeddedFont, type EmbeddedFontParts, type ExtractDocumentStyleSetOptions, FOLIO_CONTENT_COMPARISON_LIMITS, FOLIO_DOCUMENT_OPERATION_BATCH_MODES, FOLIO_DOCUMENT_OPERATION_CONTRACT_VERSION, FOLIO_DOCUMENT_OPERATION_MODES, FOLIO_DOCUMENT_OPERATION_MODES_BY_TYPE, FOLIO_DOCUMENT_OPERATION_PRECONDITIONS, FOLIO_DOCUMENT_OPERATION_STORIES, FOLIO_DOCUMENT_OPERATION_TYPES, FOLIO_LINE_SPACING_RULE_VALUES, FOLIO_PARAGRAPH_ALIGNMENT_VALUES, FOLIO_YJS_ATTR_SCHEMA_VERSION, type FinalParagraphMarkRevision, type FolioAIBlock, type FolioAIBlockAnchor, type FolioAIBlockKind, type FolioAIBlockPreviewRun, type FolioAIBlockStructuralBoundary, type FolioAIBlockTableLocation, type FolioAIComment, type FolioAIDiagnosticBlock, type FolioAIEditAppliedOperation, type FolioAIEditApplyMode, type FolioAIEditApplyOutcome, type FolioAIEditApplyResult, type FolioAIEditNormalization, type FolioAIEditNormalizationCode, type FolioAIEditOperation, type FolioAIEditPrecondition, type FolioAIEditReviewMeta, type FolioAIEditSeverity, type FolioAIEditSkipReason, type FolioAIEditSkippedOperation, type FolioAIEditSnapshot, type FolioAIInlineBooleanProperty, type FolioAIInlineFormatting, type FolioAIInlineFormattingPatch, type FolioAIParagraphBlock, type FolioAIParagraphSpacing, type FolioAISignatureParty, type FolioBlockId, type FolioContentBlock, type FolioContentBlockProperty, type FolioContentComparison, type FolioContentComparisonError, type FolioContentComparisonEvent, type FolioContentComparisonLimit, FolioContentComparisonLimitError, type FolioContentContainerPathEntry, type FolioContentFormatRange, type FolioContentFormattingChange, type FolioContentIdStability, type FolioContentInlineBooleanProperty, type FolioContentInlineComparisonResult, type FolioContentInlineFormatting, type FolioContentInlineFormattingPatch, FolioContentInlinePresentationProjectionError, type FolioContentLineSpacingRule, type FolioContentParagraphAlignment, type FolioContentParagraphFormattingPatch, type FolioContentParagraphKind, type FolioContentParagraphSpacing, type FolioContentRun, type FolioContentSnapshot, type FolioContentStatedNumbering, type FolioContentStructuralChange, type FolioContentTableLocation, type FolioContentTextSegment, type FolioDocumentOperation, type FolioDocumentOperationAffectedTarget, type FolioDocumentOperationBatch, type FolioDocumentOperationCapabilities, type FolioDocumentOperationIssue, type FolioDocumentOperationMode, type FolioDocumentOperationPrecondition, type FolioDocumentOperationReceipt, type FolioDocumentOperationRecovery, type FolioDocumentOperationResult, type FolioDocumentOperationResultBase, type FolioDocumentOperationStatus, type FolioDocumentOperationStory, type FolioDocumentOperationType, type FolioDocumentOperationUndoFailureReason, type FolioDocumentOperationUndoHandle, type FolioDocumentOperationUndoResult, type FolioDocxCompatibilityHost, type FolioDocxCompatibilityProfile, type FolioRevisionStamp, type FolioUndefinedReferencePolicy, type FolioWordDiffOptions, type FolioYjsAttrSchemaVersion, FolioYjsAttrSchemaVersionError, type ImageMeta, type ImageRef, type InspectDocxCompatibilityOptions, InvalidCompareDocxOptionsError, InvalidFolioContentComparisonError, InvalidFolioDocumentOperationBatchError, MAX_COMPARE_OPERATIONS, type MarkdownOptions, type MarkdownResult, type OutlineDepth, type PositionalText, type ResolvedAnchor, STELLA_STYLE_SET_NAME, type TemplatePreviewHiddenRange, type TemplatePreviewSpan, type TemplatePreviewValue, type TemplatePreviewValues, type TemplateSlashMenuKeyAction, type TemplateSlashMenuState, UnsupportedFolioDocumentOperationVersionError, WORD_DIFF_GRANULARITIES, type WordDiffGranularity, type WordDiffNormalization, type WordDiffOptions, type WordDiffSegment, acceptAutocompleteSuggestion, acceptAutocompleteWord, anonymizationDecorationsKey, appendAutocompleteToken, applyFolioAIEditOperations, applyFolioDocumentOperations, applySuggestions, assertSupportedFolioDocumentOperationVersion, autocompleteSuggestionKey, autocompleteSuggestionPlugin, buildEmbeddedFontFamilyMap, buildPositionalText, clearAutocompleteSuggestion, clearTemplateSlashMenu, compareContent, compareDocx, consumeTemplateSlashQuery, createAICitationDecorationsPlugin, createDocx, createEmptyDocument, createFolioAIEditSnapshot, createStellaStyleDocumentPreset, createStellaStyleSet, currentFolioBlockId, deriveBlockId, diffWordSegments, extractDocumentStyleSet, extractDocumentStyleSetFromDocx, extractEmbeddedFonts, filterHeadingsByDepth, finishAutocompleteSuggestion, fromMarkdown, getAnonymizationMatches, getAutocompleteSuggestion, getEmbeddedFontFaces, getFolioCaretViewportRect, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioParaIdFromBlockId, getFolioSelectionViewportRect, getGoogleFontsEnabled, getTemplateDirectives, getTemplateSlashMenu, hashFolioAIBlockText, inspectDocumentStyles, inspectDocumentStylesFromDocx, inspectDocxCompatibility, isFolioAIContentBlock, isFolioBlockId, isFolioDocumentOperationModeSupported, isSequentialFolioBlockId, isSuggestionStale, isSupportedFolioDocumentOperationVersion, mergeDocumentContent, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch, resetTemplateSlashQuery, resolveSuggestionAnchor, scanDirectives, scopeEmbeddedFontFamily, scrollFolioPositionIntoView, setAICitationsMeta, setAISuggestionsMeta, setActiveCitationMeta, setAnonymizationTermsMeta, setEmbeddedFontFamilyMap, setFocusedSuggestionMeta, setGoogleFontsEnabled, setTemplatePreviewValues, shouldTriggerAutocomplete, startAutocompleteSuggestion, templateSlashMenuKey, toMarkdown, toMarkdownResult };
@@ -3,14 +3,7 @@ import { ParagraphNumberingOverride } from "@stll/docx-core/model";
3
3
  //#region src/internal/paragraphFormattingSerialization.d.ts
4
4
  type ClassifiedParagraphFormattingField = "alignment" | "bidi" | "kinsoku" | "overflowPunctuation" | "spaceBefore" | "spaceAfter" | "lineSpacing" | "lineSpacingRule" | "snapToGrid" | "beforeAutospacing" | "afterAutospacing" | "spacingExplicit" | "spacingPreservedAttributes" | "indentLeft" | "indentRight" | "indentFirstLine" | "hangingIndent" | "indentPreservedAttributes" | "borders" | "shading" | "tabs" | "keepNext" | "keepLines" | "widowControl" | "pageBreakBefore" | "contextualSpacing" | "numPr" | "numPrFromStyle" | "numberingChangeXml" | "numberingInsertionXml" | "outlineLevel" | "styleId" | "frame" | "suppressLineNumbers" | "suppressAutoHyphens" | "runProperties" | "runInWithNext" | "preserved";
5
5
  type ExhaustiveParagraphFormatting = document_d_exports.ExhaustiveFields<document_d_exports.ParagraphFormatting, ClassifiedParagraphFormattingField>;
6
- /**
7
- * Whether resolved numbering still belongs to the paragraph's style tier.
8
- *
9
- * Effective equality, not stated: the resolved field carries the level the
10
- * cascade supplied even where the style stated none, and a paragraph whose
11
- * numbering came wholly from its style must still not emit a direct
12
- * `<w:numPr>`.
13
- */
6
+ /** Only an absent paragraph override leaves numbering wholly to its style. */
14
7
  declare const isStyleSourcedParagraphNumbering: (numPr: ParagraphNumberingOverride | null | undefined, numPrFromStyle: ParagraphNumberingOverride | null | undefined) => boolean;
15
8
  /** Exact fallback-emission instructions for the modeled part of `w:pPr`. */
16
9
  type ModeledParagraphFormattingEmission = Readonly<{
@@ -6,18 +6,11 @@ import { TRANSITIONAL_NAME_BY_STRICT_NAME } from "../docx/strictNames.gen.js";
6
6
  import { createCapturedXmlSanitizer } from "../docx/verbatimCapture.js";
7
7
  import { NAMESPACES, OOXML_NAMESPACE_SCOPE } from "../docx/xmlParser.js";
8
8
  import { escapeXmlAttribute, serializeOnOffElement } from "@stll/docx-core";
9
- import { mergeParagraphNumbering, outlineLevelStatedValue, paragraphNumberingLevel, paragraphNumberingSlots, sameEffectiveParagraphNumbering } from "@stll/docx-core/model";
9
+ import { outlineLevelStatedValue, paragraphNumberingSlots } from "@stll/docx-core/model";
10
10
  import { serializeSequenceChildren } from "@stll/docx-core/schema";
11
11
  //#region src/internal/paragraphFormattingSerialization.ts
12
- /**
13
- * Whether resolved numbering still belongs to the paragraph's style tier.
14
- *
15
- * Effective equality, not stated: the resolved field carries the level the
16
- * cascade supplied even where the style stated none, and a paragraph whose
17
- * numbering came wholly from its style must still not emit a direct
18
- * `<w:numPr>`.
19
- */
20
- const isStyleSourcedParagraphNumbering = (numPr, numPrFromStyle) => numPr != null && numPrFromStyle != null && sameEffectiveParagraphNumbering(numPr, numPrFromStyle);
12
+ /** Only an absent paragraph override leaves numbering wholly to its style. */
13
+ const isStyleSourcedParagraphNumbering = (numPr, numPrFromStyle) => numPr == null && numPrFromStyle != null;
21
14
  const serializeParagraphBorders = (borders) => {
22
15
  if (!borders) return "";
23
16
  const { top, left, bottom, right, between, bar } = borders;
@@ -150,7 +143,7 @@ const paragraphMarkPropertiesInner = (runProperties, runInWithNext) => {
150
143
  */
151
144
  const modelParagraphFormattingEmission = (input) => {
152
145
  if (!input) return {};
153
- const { alignment, bidi, kinsoku, overflowPunctuation, spaceBefore, spaceAfter, lineSpacing, lineSpacingRule, snapToGrid, beforeAutospacing, afterAutospacing, spacingExplicit, spacingPreservedAttributes, indentLeft, indentRight, indentFirstLine, hangingIndent, indentPreservedAttributes, borders, shading, tabs, keepNext, keepLines, widowControl, pageBreakBefore, contextualSpacing, numPr, numPrFromStyle, numberingChangeXml, numberingInsertionXml, outlineLevel, styleId, frame, suppressLineNumbers, suppressAutoHyphens, runProperties, runInWithNext, preserved } = input;
146
+ const { alignment, bidi, kinsoku, overflowPunctuation, spaceBefore, spaceAfter, lineSpacing, lineSpacingRule, snapToGrid, beforeAutospacing, afterAutospacing, spacingExplicit, spacingPreservedAttributes, indentLeft, indentRight, indentFirstLine, hangingIndent, indentPreservedAttributes, borders, shading, tabs, keepNext, keepLines, widowControl, pageBreakBefore, contextualSpacing, numPr, numberingChangeXml, numberingInsertionXml, outlineLevel, styleId, frame, suppressLineNumbers, suppressAutoHyphens, runProperties, runInWithNext, preserved } = input;
154
147
  modelSpacingProvenance(spacingExplicit);
155
148
  const propertiesXml = serializeSequenceChildren({
156
149
  container: "paragraph-properties",
@@ -162,15 +155,8 @@ const modelParagraphFormattingEmission = (input) => {
162
155
  ["pageBreakBefore", serializeOnOffElement(pageBreakBefore, "pageBreakBefore")],
163
156
  ["framePr", serializeFrameProperties(frame)],
164
157
  ["widowControl", serializeOnOffElement(widowControl, "widowControl")],
165
- ["numPr", isStyleSourcedParagraphNumbering(numPr, numPrFromStyle) ? serializeNumbering({
166
- numPr: void 0,
167
- numberingChangeXml,
168
- numberingInsertionXml
169
- }) : serializeNumbering({
170
- numPr: numPr?.kind === "reference" && numPrFromStyle?.kind === "reference" && numPr.numId === numPrFromStyle.numId ? {
171
- kind: "levelOnly",
172
- ilvl: paragraphNumberingLevel(mergeParagraphNumbering(numPrFromStyle, numPr)) ?? 0
173
- } : numPr,
158
+ ["numPr", serializeNumbering({
159
+ numPr,
174
160
  numberingChangeXml,
175
161
  numberingInsertionXml
176
162
  })],
@@ -1,8 +1,8 @@
1
1
  import { document_d_exports } from "../../types/document.js";
2
2
  import { RunStyleResolver } from "../../prosemirror/runStyleFormatting.js";
3
+ import { ListCounterStreams } from "../../prosemirror/listMarker.js";
3
4
  import { ParagraphAttrs, ParagraphBlock, TableBlock } from "../../layout-engine/types.js";
4
5
  import { FontAlternates } from "../../fonts/fontAlternates.js";
5
- import { ListCounterStreams } from "../../prosemirror/listMarker.js";
6
6
  import { Node } from "prosemirror-model";
7
7
  //#region src/layout-bridge/convert/flowConversionShared.d.ts
8
8
  /**
@@ -2,7 +2,6 @@ import { document_d_exports } from "../../types/document.js";
2
2
  import { ParagraphAttrs, ParagraphPropertyChangeAttrs } from "../../prosemirror/schema/nodes.js";
3
3
  import { ParagraphAttrs as ParagraphAttrs$1 } from "../../layout-engine/types.js";
4
4
  import { FontAlternates } from "../../fonts/fontAlternates.js";
5
- import { ListCounterState } from "../../prosemirror/listMarker.js";
6
5
  //#region src/layout-bridge/convert/listMarkers.d.ts
7
6
  declare function applyMarkerAllCaps(marker: string | null, allCaps: boolean | undefined): string | null;
8
7
  /**
@@ -23,6 +22,6 @@ declare function isChangedNumberingChange(currentNumPr: NonNullable<ParagraphAtt
23
22
  };
24
23
  declare function applyDeletedListMarkerAttrs(attrs: ParagraphAttrs$1, change: ListPropertyChange & {
25
24
  previousFormatting: ListPropertyFormatting;
26
- }, listCounterState: ListCounterState | undefined, theme: document_d_exports.Theme | null | undefined, fontAlternates: FontAlternates | undefined, paragraphMarkFormatting: () => document_d_exports.TextFormatting | undefined): void;
25
+ }, theme: document_d_exports.Theme | null | undefined, fontAlternates: FontAlternates | undefined, paragraphMarkFormatting: () => document_d_exports.TextFormatting | undefined): void;
27
26
  //#endregion
28
27
  export { ListPropertyChange, ListPropertyFormatting, applyDeletedListMarkerAttrs, applyMarkerAllCaps, isAddedNumberingChange, isChangedNumberingChange, isRemovedNumberingChange, toListMarkerRevision };
@@ -1,6 +1,5 @@
1
1
  import { bulletMarkerFontName, convertBulletToUnicode } from "../../docx/bulletMarkers.js";
2
2
  import { isListNumPr } from "../../layout-engine/types.js";
3
- import { advanceListMarker } from "../../prosemirror/listMarker.js";
4
3
  import { listMarkerFormattingFor } from "./textFormattingConversion.js";
5
4
  import { sameStatedParagraphNumbering } from "@stll/docx-core/model";
6
5
  //#region src/layout-bridge/convert/listMarkers.ts
@@ -12,9 +11,6 @@ function applyMarkerAllCaps(marker, allCaps) {
12
11
  if (marker === null || !allCaps) return marker;
13
12
  return marker.toLocaleUpperCase();
14
13
  }
15
- function computeListMarker(pmAttrs, state) {
16
- return advanceListMarker(pmAttrs, state);
17
- }
18
14
  function toListMarkerRevision(kind, info) {
19
15
  const revision = { kind };
20
16
  if (typeof info?.author === "string") revision.author = info.author;
@@ -72,18 +68,14 @@ function toPreviousListAttrs(previousFormatting) {
72
68
  if (listMarkerSecondSlotOffsetTwips !== void 0) attrs.listMarkerSecondSlotOffsetTwips = listMarkerSecondSlotOffsetTwips;
73
69
  return attrs;
74
70
  }
75
- function resolveDeletedListMarker(previousListAttrs, listCounterState) {
76
- if (listCounterState && previousListAttrs.numPr) {
77
- const marker = computeListMarker(previousListAttrs, listCounterState);
78
- if (marker) return marker;
79
- }
71
+ function resolveDeletedListMarker(previousListAttrs) {
80
72
  if (previousListAttrs.listMarker) return previousListAttrs.listIsBullet ? convertBulletToUnicode(previousListAttrs.listMarker, bulletMarkerFontName(previousListAttrs.listMarkerFormatting)) : previousListAttrs.listMarker;
81
73
  if (previousListAttrs.listIsBullet) return "•";
82
74
  return null;
83
75
  }
84
- function applyDeletedListMarkerAttrs(attrs, change, listCounterState, theme, fontAlternates, paragraphMarkFormatting) {
76
+ function applyDeletedListMarkerAttrs(attrs, change, theme, fontAlternates, paragraphMarkFormatting) {
85
77
  const previousListAttrs = toPreviousListAttrs(change.previousFormatting);
86
- const marker = resolveDeletedListMarker(previousListAttrs, listCounterState);
78
+ const marker = resolveDeletedListMarker(previousListAttrs);
87
79
  if (!marker) return;
88
80
  attrs.listMarker = marker;
89
81
  attrs.listMarkerRevision = toListMarkerRevision("del", change.info);
@@ -1,8 +1,8 @@
1
1
  import { document_d_exports } from "../../types/document.js";
2
2
  import { ParagraphAttrs } from "../../prosemirror/schema/nodes.js";
3
+ import { ListCounterStreams } from "../../prosemirror/listMarker.js";
3
4
  import { ParagraphAttrs as ParagraphAttrs$1 } from "../../layout-engine/types.js";
4
5
  import { FontAlternates } from "../../fonts/fontAlternates.js";
5
- import { ListCounterStreams } from "../../prosemirror/listMarker.js";
6
6
  //#region src/layout-bridge/convert/paragraphAttrs.d.ts
7
7
  type ConvertParagraphAttrsOptions = {
8
8
  theme: document_d_exports.Theme | null | undefined;
@@ -2,6 +2,7 @@ import { bulletMarkerFontName, convertBulletToUnicode } from "../../docx/bulletM
2
2
  import { getFontAlternate } from "../../fonts/fontAlternates.js";
3
3
  import { autospacingMatchesBase } from "../../prosemirror/autospacingBase.js";
4
4
  import { advanceVisibleListMarker } from "../../prosemirror/listMarker.js";
5
+ import { effectiveParagraphNumberingReference, paragraphNumberingSourcesFromBoundary } from "../../prosemirror/numberingAttr.js";
5
6
  import { directionIsRtl, directionToBidi } from "../../prosemirror/paragraphDirection.js";
6
7
  import { mergeParagraphTabStops } from "../../utils/paragraphFormattingMerge.js";
7
8
  import { AUTO_PARAGRAPH_SPACING_PX } from "../../utils/units.js";
@@ -9,7 +10,6 @@ import { convertBorderSpecToLayout } from "./flowBorders.js";
9
10
  import { twipsToPixels } from "./flowConversionShared.js";
10
11
  import { applyDeletedListMarkerAttrs, applyMarkerAllCaps, isAddedNumberingChange, isChangedNumberingChange, isRemovedNumberingChange, toListMarkerRevision } from "./listMarkers.js";
11
12
  import { listMarkerFormattingFor, resolveWesternThemeFont } from "./textFormattingConversion.js";
12
- import { paragraphNumberingLevel, paragraphNumberingReferenceId } from "@stll/docx-core/model";
13
13
  //#region src/layout-bridge/convert/paragraphAttrs.ts
14
14
  /**
15
15
  * Converts ProseMirror paragraph attributes to layout ParagraphAttrs:
@@ -88,8 +88,12 @@ function convertParagraphAttrs(pmAttrs, { theme, fontAlternates, listCounterStre
88
88
  let indentLeft = typeof pmAttrs.indentLeft === "number" ? pmAttrs.indentLeft : void 0;
89
89
  let indentFirstLine = typeof pmAttrs.indentFirstLine === "number" ? pmAttrs.indentFirstLine : void 0;
90
90
  let hangingIndent = pmAttrs.hangingIndent;
91
- if (paragraphNumberingReferenceId(pmAttrs.numPr) !== void 0 && indentLeft === void 0 && indentFirstLine === void 0) {
92
- indentLeft = ((paragraphNumberingLevel(pmAttrs.numPr) ?? 0) + 1) * 720;
91
+ const numbering = effectiveParagraphNumberingReference(paragraphNumberingSourcesFromBoundary({
92
+ numPr: pmAttrs.numPr,
93
+ numPrFromStyle: pmAttrs.numPrFromStyle
94
+ }));
95
+ if (numbering !== void 0 && indentLeft === void 0 && indentFirstLine === void 0) {
96
+ indentLeft = ((numbering.ilvl ?? 0) + 1) * 720;
93
97
  if (indentFirstLine === void 0) {
94
98
  indentFirstLine = -360;
95
99
  hangingIndent = true;
@@ -177,7 +181,7 @@ function convertParagraphAttrs(pmAttrs, { theme, fontAlternates, listCounterStre
177
181
  if (!pmAttrs.numPr) {
178
182
  const numberingRemovedChange = propertyChanges.find(isRemovedNumberingChange);
179
183
  if (numberingRemovedChange) {
180
- applyDeletedListMarkerAttrs(attrs, numberingRemovedChange, void 0, theme, fontAlternates, paragraphMarkFormatting);
184
+ applyDeletedListMarkerAttrs(attrs, numberingRemovedChange, theme, fontAlternates, paragraphMarkFormatting);
181
185
  if (resolvedMarker !== null) {
182
186
  attrs.listMarker = resolvedMarker;
183
187
  attrs.listMarkerRevision = toListMarkerRevision("del", numberingRemovedChange.info);
@@ -1,5 +1,6 @@
1
+ import { resolveListTemplate } from "../../docx/listTemplate.js";
2
+ import { formatCounter } from "../../prosemirror/listMarker.js";
1
3
  import { FlowBlock } from "../../layout-engine/types.js";
2
- import { formatCounter, resolveListTemplate } from "../../prosemirror/listMarker.js";
3
4
  import { ToFlowBlocksOptions, resetBlockIdCounter } from "./flowConversionShared.js";
4
5
  import { collectNoteRefs } from "./noteReferences.js";
5
6
  import { convertBorderSpecToLayout } from "./flowBorders.js";
@@ -1,8 +1,9 @@
1
1
  import { resolveDocumentGridLinePitch } from "../../docx/documentGrid.js";
2
+ import { resolveListTemplate } from "../../docx/listTemplate.js";
2
3
  import { buildPageBreakRunDescendantIndex } from "../../internal/pageBreakRunDescendantIndex.js";
3
4
  import { getPageNumbering } from "../../paged-layout/sectionGeometry.js";
4
5
  import { expectBlockSdtAttrs, expectHardBreakAttrs, expectParagraphAttrs, expectTextBoxAttrs } from "../../prosemirror/attrs/index.js";
5
- import { cloneListCounterState, formatCounter, resolveListTemplate } from "../../prosemirror/listMarker.js";
6
+ import { cloneListCounterState, formatCounter } from "../../prosemirror/listMarker.js";
6
7
  import { resolveNumberedRefFields } from "../../prosemirror/numberedRefFields.js";
7
8
  import { expectTextBoxAnchorAttrs } from "../../prosemirror/textBoxAnchorAttrs.js";
8
9
  import { assertValidProseMirrorDocument } from "../../prosemirror/validation.js";
@@ -40,7 +40,33 @@ function renderParagraphBlock(ctx, pkg, para) {
40
40
  let list = para.listRendering;
41
41
  if (numPr?.kind === "none" || pkg?.numbering !== void 0 && numPr === void 0) list = void 0;
42
42
  else if (pkg?.numbering !== void 0 && numPr?.kind === "reference") list = resolveCachedListRendering(para.listRendering, resolveListRenderingDefinition(numPr, getCachedNumberingMap(pkg.numbering))) ?? void 0;
43
- const label = ctx.nextListLabel(list ? listLabelAttrsFromRendering(list, numPrFromStyle) : UNNUMBERED);
43
+ const counterAttrs = listLabelAttrsFromRendering(list, {
44
+ numPr: para.formatting?.numPr,
45
+ numPrFromStyle
46
+ });
47
+ if (para.pPrMark) counterAttrs.pPrMark = para.pPrMark;
48
+ let originalList;
49
+ if (para.propertyChanges) counterAttrs._propertyChanges = para.propertyChanges.map(({ previousFormatting, ...change }) => {
50
+ if (!previousFormatting) return change;
51
+ const previousInherited = ctx.paragraphNumbering(previousFormatting.styleId) ?? previousFormatting.numPrFromStyle;
52
+ const previousNumbering = mergeParagraphNumbering(previousInherited, previousFormatting.numPr);
53
+ const previousRendering = pkg?.numbering !== void 0 && previousNumbering?.kind === "reference" ? resolveListRenderingDefinition(previousNumbering, getCachedNumberingMap(pkg.numbering)).rendering ?? void 0 : void 0;
54
+ originalList ??= previousRendering;
55
+ const previousAttrs = listLabelAttrsFromRendering(previousRendering, {
56
+ numPr: previousFormatting.numPr,
57
+ numPrFromStyle: previousInherited
58
+ });
59
+ return {
60
+ ...change,
61
+ previousFormatting: {
62
+ ...previousFormatting,
63
+ ...previousAttrs,
64
+ ...previousAttrs.numPr === void 0 ? { numPr: null } : { numPr: previousAttrs.numPr },
65
+ ...previousAttrs.numPrFromStyle === void 0 ? { numPrFromStyle: null } : { numPrFromStyle: previousAttrs.numPrFromStyle }
66
+ }
67
+ };
68
+ });
69
+ const label = ctx.nextListLabel(counterAttrs);
44
70
  const inline = renderParagraphInline(ctx, pkg, para.content, para.paraId);
45
71
  const styleId = para.formatting?.styleId;
46
72
  const headingLevel = markdownHeadingLevel(ctx, para);
@@ -57,7 +83,8 @@ function renderParagraphBlock(ctx, pkg, para) {
57
83
  type: "paragraph"
58
84
  };
59
85
  }
60
- if (list && label !== void 0) return renderListItem(ctx, list, label, inline);
86
+ const visibleList = list ?? originalList;
87
+ if (visibleList && label !== void 0) return renderListItem(ctx, visibleList, label, inline);
61
88
  ctx.listIndentWidths = [];
62
89
  if (isQuoteStyle(styleId, ctx.builtInStyles)) return {
63
90
  markdown: inline.split("\n").map((line) => `> ${line}`).join("\n"),
@@ -75,7 +102,6 @@ function markdownHeadingLevel(ctx, para) {
75
102
  styleId: para.formatting?.styleId
76
103
  }, ctx.builtInStyles);
77
104
  }
78
- const UNNUMBERED = Object.freeze({});
79
105
  /**
80
106
  * A plain paragraph whose visible text begins with markdown block syntax (e.g.
81
107
  * `# Not a heading`, `- value`, `1. value`, `> quote`) would be reclassified as
@@ -1,5 +1,5 @@
1
1
  import { sameStatedParagraphNumbering as sameStatedParagraphNumbering$1 } from "../../docx/numberingReference.js";
2
- import { getProseParagraphPropertySourceToken, markParagraphPropertySourceTransfers } from "../../docx/paragraphPropertySource.js";
2
+ import { markParagraphPropertySourceTransfers } from "../../docx/paragraphPropertySource.js";
3
3
  import { RevisionResolutionStep } from "../../internal/revisionResolutionStep.js";
4
4
  import { finalRevisionParagraphRanges } from "../../internal/revisionResolutionTracking.js";
5
5
  import { deleteTextBoxesAnchoredAt, droppedTextBoxAnchorIds, moveTextBoxesPastNextParagraph } from "../anchoredTextBoxes.js";
@@ -16,19 +16,18 @@ import { joinAtParagraphMark } from "../paragraphMarkJoin.js";
16
16
  import { getDocumentNumbering } from "../plugins/documentNumbering.js";
17
17
  import { getDocumentStyleResolver } from "../plugins/documentStyleState.js";
18
18
  import { resolvedPreservedXmlAttrs } from "../preservedXmlReview.js";
19
- import { rebaseParagraphRuns, setParagraphAttrsWithRebasedRunFormatting } from "../rebaseParagraphRunFormatting.js";
19
+ import { setParagraphAttrsWithRebasedRunFormatting } from "../rebaseParagraphRunFormatting.js";
20
20
  import { rejoinRunsAt } from "../rejoinRunCarriers.js";
21
21
  import { getFolioNodeRevisionCarriers, nodePropertyRevisionSites } from "../revisionCarriers.js";
22
22
  import { RUN_FORMATTING_MARK_NAMES } from "../runFormattingMarkNames.js";
23
23
  import { reconstructRejectedRunFormattingMarks, restoreHistoricalRunFormatting } from "../runPropertyChangeResolution.js";
24
- import { paragraphRunStyleContext, paragraphRunStyleContextAt } from "../runStyleFormatting.js";
24
+ import { paragraphRunStyleContextAt } from "../runStyleFormatting.js";
25
25
  import { getTableCellMergeChange } from "../tableCellMergeRevision.js";
26
26
  import { isTableCellRetainedInReviewView } from "../tableCellRevisionVisibility.js";
27
27
  import { markRowEmptiedInBatch, reconcileTableGridAfterColumnRemoval, removeRowsWithoutCellsAfterBatch, removeTableRow } from "../tableGridMutation.js";
28
28
  import { runInCellPending, runParagraphIntoTable } from "../tableRunIn.js";
29
29
  import { retainedTrackedRevisionMark, trackedRevisionPathOf } from "../trackedRevisionPath.js";
30
30
  import { holdsNoContent } from "../zeroWidthAnchors.js";
31
- import { inlineBookmarksForParagraphJoin } from "./paragraphBookmarkJoin.js";
32
31
  import { hasSerializableParagraphPropertyChange, paragraphPropertiesSnapshot } from "./propertyChangeScope.js";
33
32
  import { resolveNodePropertyChangeAttrs } from "./resolveNodePropertyChangeAttrs.js";
34
33
  import { resolveParagraphChangeAttrs } from "./resolveParagraphProperties.js";
@@ -338,8 +337,7 @@ function resolveChange(from, to, mode, revisionIds) {
338
337
  continue;
339
338
  }
340
339
  if (moveTextBoxesPastNextParagraph(tr, mappedPos)) markStructuralChange(tr);
341
- const joinPos = mappedPos + paragraph.nodeSize;
342
- let nextPos = joinPos;
340
+ let nextPos = mappedPos + paragraph.nodeSize;
343
341
  const boundaries = [];
344
342
  while (nextPos < tr.doc.content.size) {
345
343
  const boundary = tr.doc.nodeAt(nextPos);
@@ -375,32 +373,7 @@ function resolveChange(from, to, mode, revisionIds) {
375
373
  continue;
376
374
  }
377
375
  try {
378
- if (boundaries.length > 0) {
379
- const leftToken = getProseParagraphPropertySourceToken(paragraph);
380
- const rightToken = getProseParagraphPropertySourceToken(nextNode);
381
- const inlineBookmarks = inlineBookmarksForParagraphJoin({
382
- first: paragraph,
383
- boundaries,
384
- second: nextNode
385
- });
386
- if (!inlineBookmarks) continue;
387
- tr.replaceWith(joinPos - 1, nextPos + 1, inlineBookmarks);
388
- tr.setNodeMarkup(mappedPos, void 0, nextNode.attrs);
389
- markParagraphPropertySourceTransfers(tr, [{
390
- displacedToken: typeof leftToken === "string" ? leftToken : null,
391
- selectedToken: typeof rightToken === "string" ? rightToken : null
392
- }]);
393
- if (styleResolver && paragraph.content.size > 0) rebaseParagraphRuns({
394
- previousContext: paragraphRunStyleContext(paragraph, styleResolver),
395
- paragraphPosition: mappedPos,
396
- range: {
397
- from: 0,
398
- to: paragraph.content.size
399
- },
400
- styleResolver,
401
- tr
402
- });
403
- } else joinAtParagraphMark({
376
+ joinAtParagraphMark({
404
377
  tr,
405
378
  paragraphPos: mappedPos,
406
379
  paragraph,
@@ -9,5 +9,11 @@ type InlineBookmarksForParagraphJoinOptions = {
9
9
  declare const inlineBookmarksOf: (boundaries: readonly Node[]) => Node[] | null;
10
10
  /** Inline boundaries that can replace the paragraph break without replacing either paragraph's content. */
11
11
  declare const inlineBookmarksForParagraphJoin: ({ first, boundaries, second }: InlineBookmarksForParagraphJoinOptions) => Node[] | null;
12
+ /** Paragraph siblings separated only by typed bookmark boundaries. */
13
+ declare const paragraphJoinAfter: (doc: Node, position: number) => {
14
+ next: Node;
15
+ nextPosition: number;
16
+ inlineBookmarks: Node[];
17
+ } | null;
12
18
  //#endregion
13
- export { inlineBookmarksForParagraphJoin, inlineBookmarksOf };
19
+ export { inlineBookmarksForParagraphJoin, inlineBookmarksOf, paragraphJoinAfter };