@stll/folio-core 0.8.0 → 0.10.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 (168) hide show
  1. package/README.md +39 -0
  2. package/dist/ai-edits/apply.js +18 -4
  3. package/dist/ai-edits/headless.d.ts +73 -6
  4. package/dist/ai-edits/headless.js +299 -60
  5. package/dist/ai-edits/index.d.ts +3 -3
  6. package/dist/ai-edits/index.js +2 -1
  7. package/dist/ai-edits/snapshot.js +40 -3
  8. package/dist/ai-edits/types.d.ts +2 -1
  9. package/dist/compat/eigenpal.d.ts +6 -4
  10. package/dist/compat/eigenpal.js +5 -3
  11. package/dist/controller/latestRequestGate.d.ts +13 -0
  12. package/dist/controller/latestRequestGate.js +16 -0
  13. package/dist/controller/layoutPipeline.js +13 -1
  14. package/dist/document-operations.d.ts +20 -4
  15. package/dist/document-operations.js +36 -15
  16. package/dist/document-stories.d.ts +10 -0
  17. package/dist/document-stories.js +27 -0
  18. package/dist/docx/blockContentParser.js +2 -2
  19. package/dist/docx/commentParser.js +1 -1
  20. package/dist/docx/compatibility.d.ts +3 -7
  21. package/dist/docx/compatibility.js +0 -11
  22. package/dist/docx/corePropertiesParser.d.ts +8 -0
  23. package/dist/docx/corePropertiesParser.js +53 -0
  24. package/dist/docx/encryption/agileDecryption.js +1 -1
  25. package/dist/docx/encryption/encryptionInfo.js +1 -1
  26. package/dist/docx/encryption/openEncryptedDocx.js +1 -1
  27. package/dist/docx/fontTableParser.d.ts +6 -0
  28. package/dist/docx/fontTableParser.js +72 -0
  29. package/dist/docx/groupDrawingParser.js +7 -2
  30. package/dist/docx/headerFooterParser.js +1 -1
  31. package/dist/docx/index.d.ts +2 -1
  32. package/dist/docx/index.js +2 -1
  33. package/dist/docx/metadataPrivacy.d.ts +40 -0
  34. package/dist/docx/metadataPrivacy.js +131 -0
  35. package/dist/docx/normalizeBaseDirection.js +1 -1
  36. package/dist/docx/numberingParser.js +1 -0
  37. package/dist/docx/paragraphParser.js +12 -1
  38. package/dist/docx/parser.d.ts +1 -1
  39. package/dist/docx/parser.js +16 -10
  40. package/dist/docx/rezip.d.ts +5 -4
  41. package/dist/docx/rezip.js +76 -13
  42. package/dist/docx/runConsolidator.js +4 -0
  43. package/dist/docx/runParser.js +19 -1
  44. package/dist/docx/selectiveSave.js +3 -3
  45. package/dist/docx/serializer/fontTableSerializer.d.ts +6 -0
  46. package/dist/docx/serializer/fontTableSerializer.js +26 -0
  47. package/dist/docx/serializer/headerFooterSerializer.js +1 -1
  48. package/dist/docx/serializer/paragraphSerializer.js +4 -0
  49. package/dist/docx/serializer/runSerializer.js +7 -0
  50. package/dist/docx/serializer/settingsSerializer.d.ts +6 -0
  51. package/dist/docx/serializer/settingsSerializer.js +16 -0
  52. package/dist/docx/serializer/stylesSerializer.d.ts +6 -0
  53. package/dist/docx/serializer/stylesSerializer.js +56 -0
  54. package/dist/docx/serializer/tableSerializer.js +25 -26
  55. package/dist/docx/serializer/themeSerializer.d.ts +6 -0
  56. package/dist/docx/serializer/themeSerializer.js +36 -0
  57. package/dist/docx/settingsParser.js +46 -0
  58. package/dist/docx/styleParser.js +26 -1
  59. package/dist/docx/tableParser.js +11 -1
  60. package/dist/docx/vmlImageParser.js +1 -0
  61. package/dist/i18n/messages/catalogs.gen.d.ts +5916 -5916
  62. package/dist/i18n/messages/catalogs.gen.js +5910 -5910
  63. package/dist/index.d.ts +6 -4
  64. package/dist/index.js +5 -3
  65. package/dist/layout-bridge/convert/footnoteLayout.d.ts +3 -0
  66. package/dist/layout-bridge/convert/footnoteLayout.js +3 -1
  67. package/dist/layout-bridge/convert/headerFooterLayout.d.ts +3 -0
  68. package/dist/layout-bridge/convert/headerFooterLayout.js +6 -1
  69. package/dist/layout-bridge/convert/toFlowBlocks.d.ts +14 -2
  70. package/dist/layout-bridge/convert/toFlowBlocks.js +52 -14
  71. package/dist/layout-bridge/engine/measuring/index.d.ts +2 -1
  72. package/dist/layout-bridge/engine/measuring/index.js +2 -1
  73. package/dist/layout-engine/index.js +36 -28
  74. package/dist/layout-engine/measure/cache.js +6 -3
  75. package/dist/layout-engine/measure/effectiveLineBreakPolicy.d.ts +29 -0
  76. package/dist/layout-engine/measure/effectiveLineBreakPolicy.js +60 -0
  77. package/dist/layout-engine/measure/font-metrics.worker.js +1 -0
  78. package/dist/layout-engine/measure/index.d.ts +2 -1
  79. package/dist/layout-engine/measure/index.js +2 -1
  80. package/dist/layout-engine/measure/lineBreakProvider.d.ts +33 -0
  81. package/dist/layout-engine/measure/lineBreakProvider.js +252 -0
  82. package/dist/layout-engine/measure/lineBreaks.d.ts +7 -2
  83. package/dist/layout-engine/measure/lineBreaks.js +11 -18
  84. package/dist/layout-engine/measure/listMarkerWidth.d.ts +1 -0
  85. package/dist/layout-engine/measure/listMarkerWidth.js +12 -6
  86. package/dist/layout-engine/measure/measureBlocks.d.ts +1 -2
  87. package/dist/layout-engine/measure/measureBlocks.js +6 -36
  88. package/dist/layout-engine/measure/measureContainer.js +32 -9
  89. package/dist/layout-engine/measure/measureHelpers.js +5 -2
  90. package/dist/layout-engine/measure/measureParagraph.js +332 -73
  91. package/dist/layout-engine/measure/measureTypes.d.ts +2 -1
  92. package/dist/layout-engine/measure/measureWorker.d.ts +2 -2
  93. package/dist/layout-engine/measure/measureWorker.js +8 -19
  94. package/dist/layout-engine/measure/measureWorkerProtocol.d.ts +3 -14
  95. package/dist/layout-engine/measure/tableCellFloating.d.ts +10 -3
  96. package/dist/layout-engine/measure/tableCellFloating.js +51 -37
  97. package/dist/layout-engine/measure/tableCellFlow.d.ts +27 -0
  98. package/dist/layout-engine/measure/tableCellFlow.js +73 -0
  99. package/dist/layout-engine/measure/tableCellGrid.js +1 -1
  100. package/dist/layout-engine/measure/textMeasurementPolicy.d.ts +18 -0
  101. package/dist/layout-engine/measure/textMeasurementPolicy.js +24 -0
  102. package/dist/layout-engine/renderedBreakReconciliation.d.ts +6 -1
  103. package/dist/layout-engine/renderedBreakReconciliation.js +34 -11
  104. package/dist/layout-engine/tableRowBreak.d.ts +5 -2
  105. package/dist/layout-engine/tableRowBreak.js +62 -29
  106. package/dist/layout-engine/types.d.ts +43 -8
  107. package/dist/layout-painter/anchoredImagePosition.d.ts +23 -0
  108. package/dist/layout-painter/anchoredImagePosition.js +95 -0
  109. package/dist/layout-painter/borderStroke.d.ts +23 -0
  110. package/dist/layout-painter/borderStroke.js +39 -0
  111. package/dist/layout-painter/renderImage.d.ts +5 -4
  112. package/dist/layout-painter/renderImage.js +18 -4
  113. package/dist/layout-painter/renderPage.d.ts +2 -27
  114. package/dist/layout-painter/renderPage.js +13 -99
  115. package/dist/layout-painter/renderParagraph.js +41 -23
  116. package/dist/layout-painter/renderTable.d.ts +2 -0
  117. package/dist/layout-painter/renderTable.js +223 -43
  118. package/dist/managers/DocumentLoaderManager.d.ts +1 -1
  119. package/dist/managers/DocumentLoaderManager.js +2 -2
  120. package/dist/prosemirror/attrs/index.d.ts +4 -2
  121. package/dist/prosemirror/attrs/index.js +22 -2
  122. package/dist/prosemirror/commands/propertyChangeScope.js +1 -1
  123. package/dist/prosemirror/conversion/effectiveTableCellFormatting.d.ts +62 -0
  124. package/dist/prosemirror/conversion/effectiveTableCellFormatting.js +131 -0
  125. package/dist/prosemirror/conversion/fromProseDoc.js +34 -18
  126. package/dist/prosemirror/conversion/toProseDoc.js +81 -77
  127. package/dist/prosemirror/extensions/StarterKit.js +2 -0
  128. package/dist/prosemirror/extensions/core/ParagraphExtension.js +7 -2
  129. package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.js +1 -1
  130. package/dist/prosemirror/extensions/features/ListExtension.js +1 -0
  131. package/dist/prosemirror/extensions/marks/FootnoteRefExtension.js +1 -0
  132. package/dist/prosemirror/extensions/marks/HighlightExtension.js +1 -1
  133. package/dist/prosemirror/extensions/marks/LanguageExtension.d.ts +7 -0
  134. package/dist/prosemirror/extensions/marks/LanguageExtension.js +30 -0
  135. package/dist/prosemirror/extensions/marks/RunShadingExtension.js +1 -1
  136. package/dist/prosemirror/extensions/marks/TextColorExtension.js +1 -1
  137. package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.js +1 -1
  138. package/dist/prosemirror/extensions/marks/markUtils.js +12 -0
  139. package/dist/prosemirror/extensions/nodes/ImageExtension.js +3 -1
  140. package/dist/prosemirror/extensions/nodes/TableExtension.js +4 -2
  141. package/dist/prosemirror/schema/index.d.ts +2 -2
  142. package/dist/prosemirror/schema/marks.d.ts +6 -1
  143. package/dist/prosemirror/schema/nodes.d.ts +15 -12
  144. package/dist/prosemirror/styles/resolvedStyleAttrs.js +1 -0
  145. package/dist/prosemirror/utils/tabCalculator.d.ts +3 -1
  146. package/dist/prosemirror/utils/tabCalculator.js +12 -10
  147. package/dist/prosemirror/validation.js +4 -1
  148. package/dist/redline.d.ts +26 -11
  149. package/dist/redline.js +107 -64
  150. package/dist/server.d.ts +9 -5
  151. package/dist/server.js +8 -4
  152. package/dist/style-sets/extract.d.ts +35 -0
  153. package/dist/style-sets/extract.js +123 -0
  154. package/dist/style-sets/stellaStyle.d.ts +13 -0
  155. package/dist/style-sets/stellaStyle.js +516 -0
  156. package/dist/style-sets/types.d.ts +31 -0
  157. package/dist/style-sets/types.js +5 -0
  158. package/dist/utils/createDocument.d.ts +12 -2
  159. package/dist/utils/createDocument.js +42 -31
  160. package/dist/utils/fontResolver.js +6 -6
  161. package/dist/utils/formatToStyle.js +1 -1
  162. package/dist/utils/paragraphFormattingMerge.d.ts +14 -3
  163. package/dist/utils/paragraphFormattingMerge.js +14 -4
  164. package/dist/version-comparison.d.ts +65 -11
  165. package/dist/version-comparison.js +187 -29
  166. package/package.json +5 -1
  167. package/dist/docx/capabilities.d.ts +0 -41
  168. package/dist/docx/capabilities.js +0 -322
@@ -1,7 +1,7 @@
1
1
  import { FolioAIBlock, FolioAIBlockAnchor, FolioAIBlockKind, FolioAIBlockPreviewRun, FolioAIComment, FolioAIEditAppliedOperation, FolioAIEditApplyMode, FolioAIEditApplyResult, FolioAIEditOperation, FolioAIEditPrecondition, FolioAIEditReviewMeta, FolioAIEditSeverity, FolioAIEditSkipReason, FolioAIEditSkippedOperation, FolioAIEditSnapshot, FolioAISignatureParty } from "../ai-edits/types.js";
2
2
  import { applyFolioAIEditOperations } from "../ai-edits/apply.js";
3
3
  import { document_d_exports } from "../types/document.js";
4
- 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, FolioDocumentOperation, FolioDocumentOperationAffectedTarget, FolioDocumentOperationBatch, FolioDocumentOperationCapabilities, FolioDocumentOperationIssue, FolioDocumentOperationMode, FolioDocumentOperationPrecondition, FolioDocumentOperationReceipt, FolioDocumentOperationRecovery, FolioDocumentOperationResult, FolioDocumentOperationStatus, FolioDocumentOperationType, FolioDocumentOperationUndoFailureReason, FolioDocumentOperationUndoHandle, FolioDocumentOperationUndoResult, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, applyFolioDocumentOperations, assertSupportedFolioDocumentOperationVersion, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, parseFolioDocumentOperationBatch } from "../document-operations.js";
4
+ 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, FolioDocumentOperation, FolioDocumentOperationAffectedTarget, FolioDocumentOperationBatch, FolioDocumentOperationCapabilities, FolioDocumentOperationIssue, FolioDocumentOperationMode, FolioDocumentOperationPrecondition, FolioDocumentOperationReceipt, FolioDocumentOperationRecovery, FolioDocumentOperationResult, FolioDocumentOperationStatus, FolioDocumentOperationStory, FolioDocumentOperationType, FolioDocumentOperationUndoFailureReason, FolioDocumentOperationUndoHandle, FolioDocumentOperationUndoResult, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, applyFolioDocumentOperations, assertSupportedFolioDocumentOperationVersion, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, parseFolioDocumentOperationBatch } from "../document-operations.js";
5
5
  import { createFolioAIEditSnapshot, hashFolioAIBlockText, normalizeFolioAIBlockText } from "../ai-edits/snapshot.js";
6
6
  import { DeriveBlockIdInput, FolioBlockId, deriveBlockId, getFolioParaIdFromBlockId, isFolioBlockId, isSequentialFolioBlockId } from "../types/block-id.js";
7
7
  import { WordDiffSegment, diffWordSegments } from "../ai-edits/word-diff.js";
@@ -9,10 +9,12 @@ import { AIBarStatus, AIChatMode, AICitation, AICitationSource, AIGenerateInput,
9
9
  import { ApplyResult, applySuggestions } from "../ai-suggestions/apply.js";
10
10
  import { ResolvedAnchor, isSuggestionStale, resolveSuggestionAnchor } from "../ai-suggestions/conflict.js";
11
11
  import { PositionalText, buildPositionalText } from "../ai-suggestions/text-positions.js";
12
+ import { DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION, DocumentPreset, DocumentStyleSet } from "../style-sets/types.js";
12
13
  import { CreateEmptyDocumentOptions, createEmptyDocument } from "../utils/createDocument.js";
14
+ import { DocumentStyleCatalog, DocumentStyleCatalogEntry, ExtractDocumentStyleSetOptions, extractDocumentStyleSet, extractDocumentStyleSetFromDocx, inspectDocumentStyles, inspectDocumentStylesFromDocx } from "../style-sets/extract.js";
15
+ import { STELLA_STYLE_SET_NAME, createStellaStyleDocumentPreset, createStellaStyleSet } from "../style-sets/stellaStyle.js";
13
16
  import { createDocx } from "../docx/rezip.js";
14
- import { FOLIO_DOCX_CAPABILITY_HOSTS, FOLIO_DOCX_CAPABILITY_IDS, FOLIO_DOCX_CAPABILITY_MANIFEST, FOLIO_DOCX_CAPABILITY_MANIFEST_VERSION, FOLIO_DOCX_CAPABILITY_OPERATIONS, FOLIO_DOCX_COMPATIBILITY_HOSTS, FOLIO_DOCX_COMPATIBILITY_PROFILES, FOLIO_DOCX_PROFILES, FOLIO_DOCX_SUPPORT_STATES, FolioDocxCapabilityHost, FolioDocxCapabilityId, FolioDocxCapabilityManifest, FolioDocxCapabilityOperation, FolioDocxCompatibilityHost, FolioDocxCompatibilityProfile, FolioDocxFeatureCapability, FolioDocxProfile, FolioDocxSupportState, InvalidFolioDocxCapabilityIdError, getFolioDocxCapability, isFolioDocxCapabilityId } from "../docx/capabilities.js";
15
- import { DocxCompatibility, DocxCompatibilityContext, DocxCompatibilityIssue, DocxCompatibilityLocation, DocxCompatibilityPart, InspectDocxCompatibilityOptions, inspectDocxCompatibility } from "../docx/compatibility.js";
17
+ import { DocxCompatibility, DocxCompatibilityContext, DocxCompatibilityIssue, DocxCompatibilityLocation, DocxCompatibilityPart, FolioDocxCompatibilityHost, FolioDocxCompatibilityProfile, InspectDocxCompatibilityOptions, inspectDocxCompatibility } from "../docx/compatibility.js";
16
18
  import { setAISuggestionsMeta, setFocusedSuggestionMeta } from "../prosemirror/plugins/aiSuggestionDecorations.js";
17
19
  import { scrollFolioPositionIntoView } from "../paged-layout/scrollToPmPosition.js";
18
20
  import { getFolioCaretViewportRect, getFolioSelectionViewportRect } from "../paged-layout/selectionViewportRect.js";
@@ -30,4 +32,4 @@ import { getGoogleFontsEnabled, setGoogleFontsEnabled } from "../utils/fontResol
30
32
  import { DOCX_CONFORMANCE_CLASSES } from "../index.js";
31
33
  type Document = document_d_exports.Document;
32
34
  type DocxConformanceClass = document_d_exports.DocxConformanceClass;
33
- 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 CreateEmptyDocumentOptions, DEFAULT_AI_SUGGESTION_PRESETS, DEFAULT_AUTOCOMPLETE_DEAD_ZONE_NODES, DOCX_CONFORMANCE_CLASSES, type DeriveBlockIdInput, type DirectiveKind, type DirectiveRange, type Document, type DocxCompatibility, type DocxCompatibilityContext, type DocxCompatibilityIssue, type DocxCompatibilityLocation, type DocxCompatibilityPart, type DocxConformanceClass, type EmbeddedFont, type EmbeddedFontParts, 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_DOCX_CAPABILITY_HOSTS, FOLIO_DOCX_CAPABILITY_IDS, FOLIO_DOCX_CAPABILITY_MANIFEST, FOLIO_DOCX_CAPABILITY_MANIFEST_VERSION, FOLIO_DOCX_CAPABILITY_OPERATIONS, FOLIO_DOCX_COMPATIBILITY_HOSTS, FOLIO_DOCX_COMPATIBILITY_PROFILES, FOLIO_DOCX_PROFILES, FOLIO_DOCX_SUPPORT_STATES, type FolioAIBlock, type FolioAIBlockAnchor, type FolioAIBlockKind, type FolioAIBlockPreviewRun, type FolioAIComment, type FolioAIEditAppliedOperation, type FolioAIEditApplyMode, type FolioAIEditApplyResult, type FolioAIEditOperation, type FolioAIEditPrecondition, type FolioAIEditReviewMeta, type FolioAIEditSeverity, type FolioAIEditSkipReason, type FolioAIEditSkippedOperation, type FolioAIEditSnapshot, type FolioAISignatureParty, type FolioBlockId, type FolioDocumentOperation, type FolioDocumentOperationAffectedTarget, type FolioDocumentOperationBatch, type FolioDocumentOperationCapabilities, type FolioDocumentOperationIssue, type FolioDocumentOperationMode, type FolioDocumentOperationPrecondition, type FolioDocumentOperationReceipt, type FolioDocumentOperationRecovery, type FolioDocumentOperationResult, type FolioDocumentOperationStatus, type FolioDocumentOperationType, type FolioDocumentOperationUndoFailureReason, type FolioDocumentOperationUndoHandle, type FolioDocumentOperationUndoResult, type FolioDocxCapabilityHost, type FolioDocxCapabilityId, type FolioDocxCapabilityManifest, type FolioDocxCapabilityOperation, type FolioDocxCompatibilityHost, type FolioDocxCompatibilityProfile, type FolioDocxFeatureCapability, type FolioDocxProfile, type FolioDocxSupportState, type ImageMeta, type ImageRef, type InspectDocxCompatibilityOptions, InvalidFolioDocumentOperationBatchError, InvalidFolioDocxCapabilityIdError, type MarkdownOptions, type MarkdownResult, type PositionalText, type ResolvedAnchor, type TemplatePreviewSpan, type TemplatePreviewValue, type TemplatePreviewValues, type TemplateSlashMenuKeyAction, type TemplateSlashMenuState, UnsupportedFolioDocumentOperationVersionError, type WordDiffSegment, acceptAutocompleteSuggestion, acceptAutocompleteWord, anonymizationDecorationsKey, appendAutocompleteToken, applyFolioAIEditOperations, applyFolioDocumentOperations, applySuggestions, assertSupportedFolioDocumentOperationVersion, autocompleteSuggestionKey, autocompleteSuggestionPlugin, buildPositionalText, clearAutocompleteSuggestion, clearTemplateSlashMenu, consumeTemplateSlashQuery, createAICitationDecorationsPlugin, createDocx, createEmptyDocument, createFolioAIEditSnapshot, deriveBlockId, diffWordSegments, extractEmbeddedFonts, finishAutocompleteSuggestion, fromMarkdown, getAnonymizationMatches, getAutocompleteSuggestion, getEmbeddedFontFaces, getFolioCaretViewportRect, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioDocxCapability, getFolioParaIdFromBlockId, getFolioSelectionViewportRect, getGoogleFontsEnabled, getTemplateDirectives, getTemplateSlashMenu, hashFolioAIBlockText, inspectDocxCompatibility, isFolioBlockId, isFolioDocumentOperationModeSupported, isFolioDocxCapabilityId, isSequentialFolioBlockId, isSuggestionStale, isSupportedFolioDocumentOperationVersion, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch, resetTemplateSlashQuery, resolveSuggestionAnchor, scanDirectives, scrollFolioPositionIntoView, setAICitationsMeta, setAISuggestionsMeta, setActiveCitationMeta, setAnonymizationTermsMeta, setFocusedSuggestionMeta, setGoogleFontsEnabled, setTemplatePreviewValues, shouldTriggerAutocomplete, startAutocompleteSuggestion, templateSlashMenuKey, toMarkdown, toMarkdownResult };
35
+ 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 CreateEmptyDocumentOptions, DEFAULT_AI_SUGGESTION_PRESETS, DEFAULT_AUTOCOMPLETE_DEAD_ZONE_NODES, DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION, DOCX_CONFORMANCE_CLASSES, type DeriveBlockIdInput, type DirectiveKind, type DirectiveRange, type Document, type DocumentPreset, type DocumentStyleCatalog, type DocumentStyleCatalogEntry, type DocumentStyleSet, type DocxCompatibility, type DocxCompatibilityContext, type DocxCompatibilityIssue, type DocxCompatibilityLocation, type DocxCompatibilityPart, type DocxConformanceClass, type EmbeddedFont, type EmbeddedFontParts, type ExtractDocumentStyleSetOptions, 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, type FolioAIBlock, type FolioAIBlockAnchor, type FolioAIBlockKind, type FolioAIBlockPreviewRun, type FolioAIComment, type FolioAIEditAppliedOperation, type FolioAIEditApplyMode, type FolioAIEditApplyResult, type FolioAIEditOperation, type FolioAIEditPrecondition, type FolioAIEditReviewMeta, type FolioAIEditSeverity, type FolioAIEditSkipReason, type FolioAIEditSkippedOperation, type FolioAIEditSnapshot, type FolioAISignatureParty, type FolioBlockId, type FolioDocumentOperation, type FolioDocumentOperationAffectedTarget, type FolioDocumentOperationBatch, type FolioDocumentOperationCapabilities, type FolioDocumentOperationIssue, type FolioDocumentOperationMode, type FolioDocumentOperationPrecondition, type FolioDocumentOperationReceipt, type FolioDocumentOperationRecovery, type FolioDocumentOperationResult, type FolioDocumentOperationStatus, type FolioDocumentOperationStory, type FolioDocumentOperationType, type FolioDocumentOperationUndoFailureReason, type FolioDocumentOperationUndoHandle, type FolioDocumentOperationUndoResult, type FolioDocxCompatibilityHost, type FolioDocxCompatibilityProfile, type ImageMeta, type ImageRef, type InspectDocxCompatibilityOptions, InvalidFolioDocumentOperationBatchError, type MarkdownOptions, type MarkdownResult, type PositionalText, type ResolvedAnchor, STELLA_STYLE_SET_NAME, type TemplatePreviewSpan, type TemplatePreviewValue, type TemplatePreviewValues, type TemplateSlashMenuKeyAction, type TemplateSlashMenuState, UnsupportedFolioDocumentOperationVersionError, type WordDiffSegment, acceptAutocompleteSuggestion, acceptAutocompleteWord, anonymizationDecorationsKey, appendAutocompleteToken, applyFolioAIEditOperations, applyFolioDocumentOperations, applySuggestions, assertSupportedFolioDocumentOperationVersion, autocompleteSuggestionKey, autocompleteSuggestionPlugin, buildPositionalText, clearAutocompleteSuggestion, clearTemplateSlashMenu, consumeTemplateSlashQuery, createAICitationDecorationsPlugin, createDocx, createEmptyDocument, createFolioAIEditSnapshot, createStellaStyleDocumentPreset, createStellaStyleSet, deriveBlockId, diffWordSegments, extractDocumentStyleSet, extractDocumentStyleSetFromDocx, extractEmbeddedFonts, finishAutocompleteSuggestion, fromMarkdown, getAnonymizationMatches, getAutocompleteSuggestion, getEmbeddedFontFaces, getFolioCaretViewportRect, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioParaIdFromBlockId, getFolioSelectionViewportRect, getGoogleFontsEnabled, getTemplateDirectives, getTemplateSlashMenu, hashFolioAIBlockText, inspectDocumentStyles, inspectDocumentStylesFromDocx, inspectDocxCompatibility, isFolioBlockId, isFolioDocumentOperationModeSupported, isSequentialFolioBlockId, isSuggestionStale, isSupportedFolioDocumentOperationVersion, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch, resetTemplateSlashQuery, resolveSuggestionAnchor, scanDirectives, scrollFolioPositionIntoView, setAICitationsMeta, setAISuggestionsMeta, setActiveCitationMeta, setAnonymizationTermsMeta, setFocusedSuggestionMeta, setGoogleFontsEnabled, setTemplatePreviewValues, shouldTriggerAutocomplete, startAutocompleteSuggestion, templateSlashMenuKey, toMarkdown, toMarkdownResult };
@@ -3,16 +3,18 @@ import { createFolioAIEditSnapshot, hashFolioAIBlockText, normalizeFolioAIBlockT
3
3
  import { diffWordSegments } from "../ai-edits/word-diff.js";
4
4
  import { applyFolioAIEditOperations } from "../ai-edits/apply.js";
5
5
  import { 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, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, applyFolioDocumentOperations, assertSupportedFolioDocumentOperationVersion, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, parseFolioDocumentOperationBatch } from "../document-operations.js";
6
+ import { DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION } from "../style-sets/types.js";
6
7
  import { createEmptyDocument } from "../utils/createDocument.js";
8
+ import { extractDocumentStyleSet, extractDocumentStyleSetFromDocx, inspectDocumentStyles, inspectDocumentStylesFromDocx } from "../style-sets/extract.js";
9
+ import { STELLA_STYLE_SET_NAME, createStellaStyleDocumentPreset, createStellaStyleSet } from "../style-sets/stellaStyle.js";
7
10
  import { createDocx } from "../docx/rezip.js";
8
- import { FOLIO_DOCX_CAPABILITY_HOSTS, FOLIO_DOCX_CAPABILITY_IDS, FOLIO_DOCX_CAPABILITY_MANIFEST, FOLIO_DOCX_CAPABILITY_MANIFEST_VERSION, FOLIO_DOCX_CAPABILITY_OPERATIONS, FOLIO_DOCX_COMPATIBILITY_HOSTS, FOLIO_DOCX_COMPATIBILITY_PROFILES, FOLIO_DOCX_PROFILES, FOLIO_DOCX_SUPPORT_STATES, InvalidFolioDocxCapabilityIdError, getFolioDocxCapability, isFolioDocxCapabilityId } from "../docx/capabilities.js";
9
11
  import { inspectDocxCompatibility } from "../docx/compatibility.js";
10
12
  import { DEFAULT_AI_SUGGESTION_PRESETS } from "../ai-suggestions/types.js";
11
13
  import { buildPositionalText } from "../ai-suggestions/text-positions.js";
12
14
  import { isSuggestionStale, resolveSuggestionAnchor } from "../ai-suggestions/conflict.js";
13
15
  import { applySuggestions } from "../ai-suggestions/apply.js";
14
- import { setAISuggestionsMeta, setFocusedSuggestionMeta } from "../prosemirror/plugins/aiSuggestionDecorations.js";
15
16
  import { getGoogleFontsEnabled, setGoogleFontsEnabled } from "../utils/fontResolver.js";
17
+ import { setAISuggestionsMeta, setFocusedSuggestionMeta } from "../prosemirror/plugins/aiSuggestionDecorations.js";
16
18
  import { scrollFolioPositionIntoView } from "../paged-layout/scrollToPmPosition.js";
17
19
  import { getFolioCaretViewportRect, getFolioSelectionViewportRect } from "../paged-layout/selectionViewportRect.js";
18
20
  import { createAICitationDecorationsPlugin, setAICitationsMeta, setActiveCitationMeta } from "../prosemirror/plugins/aiCitationDecorations.js";
@@ -25,4 +27,4 @@ import { fromMarkdown } from "../markdown/fromMarkdown.js";
25
27
  import { toMarkdown, toMarkdownResult } from "../markdown/index.js";
26
28
  import { extractEmbeddedFonts, getEmbeddedFontFaces } from "../fonts/embeddedFonts.js";
27
29
  import { DOCX_CONFORMANCE_CLASSES } from "../index.js";
28
- export { DEFAULT_AI_SUGGESTION_PRESETS, DEFAULT_AUTOCOMPLETE_DEAD_ZONE_NODES, DOCX_CONFORMANCE_CLASSES, 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_DOCX_CAPABILITY_HOSTS, FOLIO_DOCX_CAPABILITY_IDS, FOLIO_DOCX_CAPABILITY_MANIFEST, FOLIO_DOCX_CAPABILITY_MANIFEST_VERSION, FOLIO_DOCX_CAPABILITY_OPERATIONS, FOLIO_DOCX_COMPATIBILITY_HOSTS, FOLIO_DOCX_COMPATIBILITY_PROFILES, FOLIO_DOCX_PROFILES, FOLIO_DOCX_SUPPORT_STATES, InvalidFolioDocumentOperationBatchError, InvalidFolioDocxCapabilityIdError, UnsupportedFolioDocumentOperationVersionError, acceptAutocompleteSuggestion, acceptAutocompleteWord, anonymizationDecorationsKey, appendAutocompleteToken, applyFolioAIEditOperations, applyFolioDocumentOperations, applySuggestions, assertSupportedFolioDocumentOperationVersion, autocompleteSuggestionKey, autocompleteSuggestionPlugin, buildPositionalText, clearAutocompleteSuggestion, clearTemplateSlashMenu, consumeTemplateSlashQuery, createAICitationDecorationsPlugin, createDocx, createEmptyDocument, createFolioAIEditSnapshot, deriveBlockId, diffWordSegments, extractEmbeddedFonts, finishAutocompleteSuggestion, fromMarkdown, getAnonymizationMatches, getAutocompleteSuggestion, getEmbeddedFontFaces, getFolioCaretViewportRect, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioDocxCapability, getFolioParaIdFromBlockId, getFolioSelectionViewportRect, getGoogleFontsEnabled, getTemplateDirectives, getTemplateSlashMenu, hashFolioAIBlockText, inspectDocxCompatibility, isFolioBlockId, isFolioDocumentOperationModeSupported, isFolioDocxCapabilityId, isSequentialFolioBlockId, isSuggestionStale, isSupportedFolioDocumentOperationVersion, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch, resetTemplateSlashQuery, resolveSuggestionAnchor, scanDirectives, scrollFolioPositionIntoView, setAICitationsMeta, setAISuggestionsMeta, setActiveCitationMeta, setAnonymizationTermsMeta, setFocusedSuggestionMeta, setGoogleFontsEnabled, setTemplatePreviewValues, shouldTriggerAutocomplete, startAutocompleteSuggestion, templateSlashMenuKey, toMarkdown, toMarkdownResult };
30
+ export { DEFAULT_AI_SUGGESTION_PRESETS, DEFAULT_AUTOCOMPLETE_DEAD_ZONE_NODES, DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION, DOCX_CONFORMANCE_CLASSES, 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, InvalidFolioDocumentOperationBatchError, STELLA_STYLE_SET_NAME, UnsupportedFolioDocumentOperationVersionError, acceptAutocompleteSuggestion, acceptAutocompleteWord, anonymizationDecorationsKey, appendAutocompleteToken, applyFolioAIEditOperations, applyFolioDocumentOperations, applySuggestions, assertSupportedFolioDocumentOperationVersion, autocompleteSuggestionKey, autocompleteSuggestionPlugin, buildPositionalText, clearAutocompleteSuggestion, clearTemplateSlashMenu, consumeTemplateSlashQuery, createAICitationDecorationsPlugin, createDocx, createEmptyDocument, createFolioAIEditSnapshot, createStellaStyleDocumentPreset, createStellaStyleSet, deriveBlockId, diffWordSegments, extractDocumentStyleSet, extractDocumentStyleSetFromDocx, extractEmbeddedFonts, finishAutocompleteSuggestion, fromMarkdown, getAnonymizationMatches, getAutocompleteSuggestion, getEmbeddedFontFaces, getFolioCaretViewportRect, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioParaIdFromBlockId, getFolioSelectionViewportRect, getGoogleFontsEnabled, getTemplateDirectives, getTemplateSlashMenu, hashFolioAIBlockText, inspectDocumentStyles, inspectDocumentStylesFromDocx, inspectDocxCompatibility, isFolioBlockId, isFolioDocumentOperationModeSupported, isSequentialFolioBlockId, isSuggestionStale, isSupportedFolioDocumentOperationVersion, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch, resetTemplateSlashQuery, resolveSuggestionAnchor, scanDirectives, scrollFolioPositionIntoView, setAICitationsMeta, setAISuggestionsMeta, setActiveCitationMeta, setAnonymizationTermsMeta, setFocusedSuggestionMeta, setGoogleFontsEnabled, setTemplatePreviewValues, shouldTriggerAutocomplete, startAutocompleteSuggestion, templateSlashMenuKey, toMarkdown, toMarkdownResult };
@@ -0,0 +1,13 @@
1
+ //#region src/controller/latestRequestGate.d.ts
2
+ /**
3
+ * Coordinates async work where only the most recently started request may
4
+ * commit a result. Each guard closes over an opaque identity, so callers
5
+ * cannot accidentally make an older request current again.
6
+ */
7
+ type LatestRequestGate = {
8
+ /** Start a request and return a guard that remains true while it is latest. */begin: () => () => boolean; /** Supersede the current request without starting another one. */
9
+ invalidate: () => void;
10
+ };
11
+ declare const createLatestRequestGate: () => LatestRequestGate;
12
+ //#endregion
13
+ export { LatestRequestGate, createLatestRequestGate };
@@ -0,0 +1,16 @@
1
+ //#region src/controller/latestRequestGate.ts
2
+ const createLatestRequestGate = () => {
3
+ let current = Symbol();
4
+ return {
5
+ begin: () => {
6
+ const request = Symbol();
7
+ current = request;
8
+ return () => current === request;
9
+ },
10
+ invalidate: () => {
11
+ current = Symbol();
12
+ }
13
+ };
14
+ };
15
+ //#endregion
16
+ export { createLatestRequestGate };
@@ -73,6 +73,14 @@ function runLayoutPipeline(deps, state, options = {}) {
73
73
  const flowOpts = { pageContentHeight: pageSize.h - margins.top - margins.bottom };
74
74
  if (_theme !== void 0) flowOpts.theme = _theme;
75
75
  if (defaultTabStop !== void 0) flowOpts.defaultTabStopTwips = defaultTabStop;
76
+ if (document?.package.settings?.lineBreakRules) flowOpts.lineBreakRules = document.package.settings.lineBreakRules;
77
+ const documentSettings = document?.package.settings;
78
+ if (documentSettings?.autoHyphenation === true) flowOpts.automaticHyphenation = {
79
+ enabled: true,
80
+ ...documentSettings.doNotHyphenateCaps !== void 0 ? { doNotHyphenateCaps: documentSettings.doNotHyphenateCaps } : {},
81
+ ...documentSettings.consecutiveHyphenLimit !== void 0 ? { consecutiveLineLimit: documentSettings.consecutiveHyphenLimit } : {},
82
+ ...documentSettings.hyphenationZoneTwips !== void 0 ? { hyphenationZoneTwips: documentSettings.hyphenationZoneTwips } : {}
83
+ };
76
84
  let newBlocks = toFlowBlocks(state.doc, flowOpts);
77
85
  const previewState = templatePreviewValuesKey.getState(state);
78
86
  const previewEntries = previewState?.entries ?? EMPTY_TEMPLATE_PREVIEW_ENTRIES;
@@ -117,7 +125,9 @@ function runLayoutPipeline(deps, state, options = {}) {
117
125
  ...styles ? { styles } : {},
118
126
  ..._theme !== void 0 ? { theme: _theme } : {},
119
127
  measureBlocks: hfMeasureBlocks,
120
- ...defaultTabStop !== void 0 ? { defaultTabStopTwips: defaultTabStop } : {}
128
+ ...defaultTabStop !== void 0 ? { defaultTabStopTwips: defaultTabStop } : {},
129
+ ...flowOpts.lineBreakRules ? { lineBreakRules: flowOpts.lineBreakRules } : {},
130
+ ...flowOpts.automaticHyphenation ? { automaticHyphenation: flowOpts.automaticHyphenation } : {}
121
131
  };
122
132
  };
123
133
  const hfOptions = buildHfOptions(hfPageCountEstimate);
@@ -245,6 +255,8 @@ function runLayoutPipeline(deps, state, options = {}) {
245
255
  if (styles) footnoteOptions.styles = styles;
246
256
  if (_theme !== void 0) footnoteOptions.theme = _theme;
247
257
  if (defaultTabStop !== void 0) footnoteOptions.defaultTabStopTwips = defaultTabStop;
258
+ if (flowOpts.lineBreakRules) footnoteOptions.lineBreakRules = flowOpts.lineBreakRules;
259
+ if (flowOpts.automaticHyphenation) footnoteOptions.automaticHyphenation = flowOpts.automaticHyphenation;
248
260
  return footnoteOptions;
249
261
  })());
250
262
  const footnoteHeightById = /* @__PURE__ */ new Map();
@@ -5,7 +5,7 @@ import { FolioAIEditView } from "./ai-edits/apply.js";
5
5
  declare const FOLIO_DOCUMENT_OPERATION_CONTRACT_VERSION: 1;
6
6
  declare const FOLIO_DOCUMENT_OPERATION_TYPES: readonly ["replaceInBlock", "replaceRange", "commentOnRange", "formatRange", "insertAfterBlock", "insertBeforeBlock", "replaceBlock", "deleteBlock", "commentOnBlock", "insertSignatureTable"];
7
7
  declare const FOLIO_DOCUMENT_OPERATION_MODES: readonly ["direct", "tracked-changes"];
8
- declare const FOLIO_DOCUMENT_OPERATION_STORIES: readonly ["main"];
8
+ declare const FOLIO_DOCUMENT_OPERATION_STORIES: readonly ["main", "header", "footer", "footnote", "endnote"];
9
9
  declare const FOLIO_DOCUMENT_OPERATION_PRECONDITIONS: readonly ["blockTextHash"];
10
10
  declare const FOLIO_DOCUMENT_OPERATION_BATCH_MODES: readonly ["best-effort", "atomic"];
11
11
  type FolioDocumentOperation = FolioAIEditOperation;
@@ -67,19 +67,33 @@ type FolioDocumentOperationIssue = {
67
67
  retryable: boolean;
68
68
  recovery: FolioDocumentOperationRecovery;
69
69
  };
70
+ type FolioDocumentOperationStory = "main" | {
71
+ type: "header";
72
+ relationshipId: string;
73
+ } | {
74
+ type: "footer";
75
+ relationshipId: string;
76
+ } | {
77
+ type: "footnote";
78
+ noteId: number;
79
+ } | {
80
+ type: "endnote";
81
+ noteId: number;
82
+ };
70
83
  /** One typed target affected by a successfully applied document operation. */
71
84
  type FolioDocumentOperationAffectedTarget = {
72
85
  type: "block";
73
- story: "main";
86
+ story: FolioDocumentOperationStory;
74
87
  blockId: string;
75
88
  effect: "updated" | "deleted" | "commented";
76
89
  } | {
77
90
  type: "textRange";
78
91
  range: FolioAITextRangeHandle;
79
92
  effect: "formatted" | "commented";
93
+ story?: Exclude<FolioDocumentOperationStory, "main">;
80
94
  } | {
81
95
  type: "insertion";
82
- story: "main";
96
+ story: FolioDocumentOperationStory;
83
97
  anchorBlockId: string;
84
98
  position: "before" | "after";
85
99
  content: "block" | "signatureTable";
@@ -123,6 +137,7 @@ type ApplyFolioDocumentOperationsOptions = {
123
137
  view: FolioAIEditView;
124
138
  snapshot: FolioAIEditSnapshot;
125
139
  batch: FolioDocumentOperationBatch;
140
+ story?: FolioDocumentOperationStory;
126
141
  author?: string;
127
142
  createCommentId?: (text: string) => number;
128
143
  createUndoHandle?: () => FolioDocumentOperationUndoHandle;
@@ -131,9 +146,10 @@ declare const applyFolioDocumentOperations: ({
131
146
  view,
132
147
  snapshot,
133
148
  batch,
149
+ story,
134
150
  author,
135
151
  createCommentId,
136
152
  createUndoHandle
137
153
  }: ApplyFolioDocumentOperationsOptions) => FolioDocumentOperationResult;
138
154
  //#endregion
139
- export { 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, FolioDocumentOperation, FolioDocumentOperationAffectedTarget, FolioDocumentOperationBatch, FolioDocumentOperationCapabilities, FolioDocumentOperationIssue, FolioDocumentOperationMode, FolioDocumentOperationPrecondition, FolioDocumentOperationReceipt, FolioDocumentOperationRecovery, FolioDocumentOperationResult, FolioDocumentOperationStatus, FolioDocumentOperationType, FolioDocumentOperationUndoFailureReason, FolioDocumentOperationUndoHandle, FolioDocumentOperationUndoResult, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, applyFolioDocumentOperations, assertSupportedFolioDocumentOperationVersion, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, parseFolioDocumentOperationBatch };
155
+ export { 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, FolioDocumentOperation, FolioDocumentOperationAffectedTarget, FolioDocumentOperationBatch, FolioDocumentOperationCapabilities, FolioDocumentOperationIssue, FolioDocumentOperationMode, FolioDocumentOperationPrecondition, FolioDocumentOperationReceipt, FolioDocumentOperationRecovery, FolioDocumentOperationResult, FolioDocumentOperationStatus, FolioDocumentOperationStory, FolioDocumentOperationType, FolioDocumentOperationUndoFailureReason, FolioDocumentOperationUndoHandle, FolioDocumentOperationUndoResult, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, applyFolioDocumentOperations, assertSupportedFolioDocumentOperationVersion, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, parseFolioDocumentOperationBatch };
@@ -15,7 +15,13 @@ const FOLIO_DOCUMENT_OPERATION_TYPES = Object.freeze([
15
15
  "insertSignatureTable"
16
16
  ]);
17
17
  const FOLIO_DOCUMENT_OPERATION_MODES = Object.freeze(["direct", "tracked-changes"]);
18
- const FOLIO_DOCUMENT_OPERATION_STORIES = Object.freeze(["main"]);
18
+ const FOLIO_DOCUMENT_OPERATION_STORIES = Object.freeze([
19
+ "main",
20
+ "header",
21
+ "footer",
22
+ "footnote",
23
+ "endnote"
24
+ ]);
19
25
  const FOLIO_DOCUMENT_OPERATION_PRECONDITIONS = Object.freeze(["blockTextHash"]);
20
26
  const FOLIO_DOCUMENT_OPERATION_BATCH_MODES = Object.freeze(["best-effort", "atomic"]);
21
27
  const DIRECT_AND_TRACKED_MODES = FOLIO_DOCUMENT_OPERATION_MODES;
@@ -438,54 +444,56 @@ const getFolioDocumentOperationIssues = (operations, skipped) => {
438
444
  };
439
445
  });
440
446
  };
441
- const getPrimaryAffectedTarget = (operation) => {
447
+ const getPrimaryAffectedTarget = (operation, story) => {
442
448
  switch (operation.type) {
443
449
  case "replaceInBlock":
444
450
  case "replaceBlock": return {
445
451
  type: "block",
446
- story: "main",
452
+ story,
447
453
  blockId: operation.blockId,
448
454
  effect: "updated"
449
455
  };
450
456
  case "replaceRange": return {
451
457
  type: "block",
452
- story: "main",
458
+ story,
453
459
  blockId: operation.range.blockId,
454
460
  effect: "updated"
455
461
  };
456
462
  case "commentOnRange": return {
457
463
  type: "textRange",
458
464
  range: operation.range,
459
- effect: "commented"
465
+ effect: "commented",
466
+ ...story !== "main" && { story }
460
467
  };
461
468
  case "formatRange": return {
462
469
  type: "textRange",
463
470
  range: operation.range,
464
- effect: "formatted"
471
+ effect: "formatted",
472
+ ...story !== "main" && { story }
465
473
  };
466
474
  case "insertAfterBlock":
467
475
  case "insertBeforeBlock": return {
468
476
  type: "insertion",
469
- story: "main",
477
+ story,
470
478
  anchorBlockId: operation.blockId,
471
479
  position: operation.type === "insertBeforeBlock" ? "before" : "after",
472
480
  content: "block"
473
481
  };
474
482
  case "deleteBlock": return {
475
483
  type: "block",
476
- story: "main",
484
+ story,
477
485
  blockId: operation.blockId,
478
486
  effect: "deleted"
479
487
  };
480
488
  case "commentOnBlock": return {
481
489
  type: "block",
482
- story: "main",
490
+ story,
483
491
  blockId: operation.blockId,
484
492
  effect: "commented"
485
493
  };
486
494
  case "insertSignatureTable": return {
487
495
  type: "insertion",
488
- story: "main",
496
+ story,
489
497
  anchorBlockId: operation.blockId,
490
498
  position: operation.position ?? "after",
491
499
  content: "signatureTable"
@@ -493,7 +501,12 @@ const getPrimaryAffectedTarget = (operation) => {
493
501
  }
494
502
  };
495
503
  /** Build deterministic affected-target receipts from operations and their applied entries. */
496
- const getFolioDocumentOperationReceipts = (operations, applied) => {
504
+ const getFolioDocumentOperationReceipts = (operations, applied) => getFolioDocumentOperationReceiptsForStory({
505
+ operations,
506
+ applied,
507
+ story: "main"
508
+ });
509
+ const getFolioDocumentOperationReceiptsForStory = ({ operations, applied, story }) => {
497
510
  const appliedById = /* @__PURE__ */ new Map();
498
511
  applied.forEach((operation) => {
499
512
  appliedById.set(operation.id, operation);
@@ -502,7 +515,7 @@ const getFolioDocumentOperationReceipts = (operations, applied) => {
502
515
  operations.forEach((operation, operationIndex) => {
503
516
  const appliedOperation = appliedById.get(operation.id);
504
517
  if (!appliedOperation) return;
505
- const affected = [getPrimaryAffectedTarget(operation)];
518
+ const affected = [getPrimaryAffectedTarget(operation, story)];
506
519
  if (appliedOperation.commentId !== void 0) affected.push({
507
520
  type: "comment",
508
521
  commentId: appliedOperation.commentId
@@ -515,7 +528,7 @@ const getFolioDocumentOperationReceipts = (operations, applied) => {
515
528
  });
516
529
  return receipts;
517
530
  };
518
- const applyFolioDocumentOperations = ({ view, snapshot, batch, author, createCommentId, createUndoHandle }) => {
531
+ const applyFolioDocumentOperations = ({ view, snapshot, batch, story = "main", author, createCommentId, createUndoHandle }) => {
519
532
  const parsedBatch = parseFolioDocumentOperationBatch(batch);
520
533
  const apply = ({ targetView, targetCreateCommentId = createCommentId, preview = false }) => {
521
534
  return (preview ? previewFolioAIEditOperations : applyFolioAIEditOperations)({
@@ -556,7 +569,11 @@ const applyFolioDocumentOperations = ({ view, snapshot, batch, author, createCom
556
569
  applied: previewResult.applied.map(({ id }) => ({ id })),
557
570
  skipped: previewResult.skipped,
558
571
  issues: getFolioDocumentOperationIssues(parsedBatch.operations, previewResult.skipped),
559
- receipts: getFolioDocumentOperationReceipts(parsedBatch.operations, previewResult.applied),
572
+ receipts: getFolioDocumentOperationReceiptsForStory({
573
+ operations: parsedBatch.operations,
574
+ applied: previewResult.applied,
575
+ story
576
+ }),
560
577
  undoHandle: null
561
578
  };
562
579
  }
@@ -570,7 +587,11 @@ const applyFolioDocumentOperations = ({ view, snapshot, batch, author, createCom
570
587
  status: "committed",
571
588
  ...result,
572
589
  issues: getFolioDocumentOperationIssues(parsedBatch.operations, result.skipped),
573
- receipts: getFolioDocumentOperationReceipts(parsedBatch.operations, result.applied),
590
+ receipts: getFolioDocumentOperationReceiptsForStory({
591
+ operations: parsedBatch.operations,
592
+ applied: result.applied,
593
+ story
594
+ }),
574
595
  undoHandle: result.applied.length > 0 && createUndoHandle !== void 0 ? createUndoHandle() : null
575
596
  };
576
597
  };
@@ -0,0 +1,10 @@
1
+ import { FolioDocumentStoryHandle } from "./ai-edits/headless.js";
2
+
3
+ //#region src/document-stories.d.ts
4
+ type FolioDocumentStoryPair = {
5
+ baseStory: FolioDocumentStoryHandle | null;
6
+ revisedStory: FolioDocumentStoryHandle | null;
7
+ };
8
+ declare const pairFolioDocumentStories: (baseStories: readonly FolioDocumentStoryHandle[], revisedStories: readonly FolioDocumentStoryHandle[]) => FolioDocumentStoryPair[];
9
+ //#endregion
10
+ export { FolioDocumentStoryPair, pairFolioDocumentStories };
@@ -0,0 +1,27 @@
1
+ //#region src/document-stories.ts
2
+ const documentStoryKey = (story) => {
3
+ if (story.type === "main") return story.type;
4
+ if (story.type === "header" || story.type === "footer") return `${story.type}:${story.relationshipId}`;
5
+ return `${story.type}:${String(story.noteId)}`;
6
+ };
7
+ const pairFolioDocumentStories = (baseStories, revisedStories) => {
8
+ const revisedByKey = new Map(revisedStories.map((story) => [documentStoryKey(story), story]));
9
+ const pairedKeys = /* @__PURE__ */ new Set();
10
+ const pairs = [];
11
+ for (const baseStory of baseStories) {
12
+ const key = documentStoryKey(baseStory);
13
+ const revisedStory = revisedByKey.get(key) ?? null;
14
+ pairs.push({
15
+ baseStory,
16
+ revisedStory
17
+ });
18
+ if (revisedStory) pairedKeys.add(key);
19
+ }
20
+ for (const revisedStory of revisedStories) if (!pairedKeys.has(documentStoryKey(revisedStory))) pairs.push({
21
+ baseStory: null,
22
+ revisedStory
23
+ });
24
+ return pairs;
25
+ };
26
+ //#endregion
27
+ export { pairFolioDocumentStories };
@@ -3,10 +3,10 @@ import { parseBookmarkEnd, parseBookmarkStart } from "./bookmarkParser.js";
3
3
  import { parseSdtProperties } from "./sdtProperties.js";
4
4
  import { parseParagraph } from "./paragraphParser.js";
5
5
  import { appendBookmarkMarkerToLastParagraphInBlocks, prependBookmarkMarkersToFirstParagraphInBlocks } from "./bookmarkPlacement.js";
6
+ import { convertBulletToUnicode } from "./bulletMarkers.js";
7
+ import { padDecimal } from "./numberingParser.js";
6
8
  import { enrichParagraphTextBoxes } from "./paragraphTextBoxEnrichment.js";
7
9
  import { parseTable } from "./tableParser.js";
8
- import { padDecimal } from "./numberingParser.js";
9
- import { convertBulletToUnicode } from "./bulletMarkers.js";
10
10
  //#region src/docx/blockContentParser.ts
11
11
  const toRoman = (numParam) => {
12
12
  let num = numParam;
@@ -75,7 +75,7 @@ function parseComments(commentsXml, styles, theme, rels, media, commentsExtensib
75
75
  for (const child of children) {
76
76
  if ((child.name?.replace(/^.*:/u, "") ?? "") !== "comment") continue;
77
77
  const id = Number.parseInt(getAttribute(child, "w", "id") ?? "0", 10);
78
- const author = getAttribute(child, "w", "author") ?? "Unknown";
78
+ const author = getAttribute(child, "w", "author")?.trim() || "Unknown";
79
79
  const rawInitials = getAttribute(child, "w", "initials");
80
80
  const initials = rawInitials !== null ? String(rawInitials) : void 0;
81
81
  const rawDate = getAttribute(child, "w", "date");
@@ -1,8 +1,9 @@
1
1
  import { document_d_exports } from "../types/document.js";
2
- import { FolioDocxCompatibilityHost, FolioDocxCompatibilityProfile, FolioDocxFeatureCapability } from "./capabilities.js";
3
2
 
4
3
  //#region src/docx/compatibility.d.ts
5
4
  type DocxCompatibilityReason = "opaqueDrawing";
5
+ type FolioDocxCompatibilityHost = "browser" | "server" | "unknown";
6
+ type FolioDocxCompatibilityProfile = document_d_exports.DocxConformanceClass;
6
7
  type DocxCompatibilityContext = {
7
8
  host: FolioDocxCompatibilityHost;
8
9
  profile: FolioDocxCompatibilityProfile;
@@ -24,11 +25,6 @@ type DocxCompatibilityLocation = {
24
25
  };
25
26
  type DocxCompatibilityIssue = {
26
27
  code: DocxCompatibilityReason;
27
- capability: FolioDocxFeatureCapability;
28
- coverage: {
29
- host: "covered" | "unknown" | "unverified";
30
- profile: "covered" | "unknown" | "unverified";
31
- };
32
28
  location: DocxCompatibilityLocation;
33
29
  };
34
30
  type DocxCompatibility = {
@@ -41,4 +37,4 @@ type DocxCompatibility = {
41
37
  };
42
38
  declare const inspectDocxCompatibility: (doc: document_d_exports.Document, options?: InspectDocxCompatibilityOptions) => DocxCompatibility;
43
39
  //#endregion
44
- export { DocxCompatibility, DocxCompatibilityContext, DocxCompatibilityIssue, DocxCompatibilityLocation, DocxCompatibilityPart, DocxCompatibilityReason, InspectDocxCompatibilityOptions, inspectDocxCompatibility };
40
+ export { DocxCompatibility, DocxCompatibilityContext, DocxCompatibilityIssue, DocxCompatibilityLocation, DocxCompatibilityPart, DocxCompatibilityReason, FolioDocxCompatibilityHost, FolioDocxCompatibilityProfile, InspectDocxCompatibilityOptions, inspectDocxCompatibility };
@@ -1,29 +1,18 @@
1
- import { getFolioDocxCapability } from "./capabilities.js";
2
1
  import { DOCX_CONFORMANCE_CLASSES } from "@stll/docx-core/model";
3
2
  //#region src/docx/compatibility.ts
4
3
  const resolveCompatibilityContext = (doc, options) => ({
5
4
  host: options.host ?? "unknown",
6
5
  profile: options.profile ?? doc.package.conformanceClass ?? DOCX_CONFORMANCE_CLASSES.UNKNOWN
7
6
  });
8
- const getCoverageState = (value, coveredValues) => {
9
- if (value === "unknown") return "unknown";
10
- return coveredValues.includes(value) ? "covered" : "unverified";
11
- };
12
7
  const inspectDocxCompatibility = (doc, options = {}) => {
13
8
  const context = resolveCompatibilityContext(doc, options);
14
9
  const reasons = /* @__PURE__ */ new Set();
15
10
  const issues = [];
16
11
  const record = (location) => {
17
12
  const code = "opaqueDrawing";
18
- const capability = getFolioDocxCapability(code);
19
13
  reasons.add(code);
20
14
  issues.push({
21
15
  code,
22
- capability,
23
- coverage: {
24
- host: getCoverageState(context.host, capability.hosts),
25
- profile: getCoverageState(context.profile, capability.profiles)
26
- },
27
16
  location
28
17
  });
29
18
  };
@@ -0,0 +1,8 @@
1
+ import { document_d_exports } from "../types/document.js";
2
+
3
+ //#region src/docx/corePropertiesParser.d.ts
4
+ type DocumentProperties = NonNullable<document_d_exports.DocxPackage["properties"]>;
5
+ /** Parse recognized package metadata from `docProps/core.xml`. */
6
+ declare const parseCoreProperties: (xml: string | null) => DocumentProperties | undefined;
7
+ //#endregion
8
+ export { parseCoreProperties };
@@ -0,0 +1,53 @@
1
+ import { findChildByLocalName, getTextContent, parseXmlDocument } from "./xmlParser.js";
2
+ //#region src/docx/corePropertiesParser.ts
3
+ const STRING_PROPERTIES = [
4
+ "title",
5
+ "subject",
6
+ "creator",
7
+ "keywords",
8
+ "description",
9
+ "lastModifiedBy"
10
+ ];
11
+ const parseRevision = (value) => {
12
+ if (!/^\d+$/u.test(value)) return;
13
+ const revision = Number(value);
14
+ return Number.isSafeInteger(revision) ? revision : void 0;
15
+ };
16
+ const parseDate = (value) => {
17
+ const timestamp = Date.parse(value);
18
+ return Number.isNaN(timestamp) ? void 0 : new Date(timestamp);
19
+ };
20
+ /** Parse recognized package metadata from `docProps/core.xml`. */
21
+ const parseCoreProperties = (xml) => {
22
+ if (!xml) return;
23
+ const root = parseXmlDocument(xml);
24
+ if (!root) return;
25
+ const properties = {};
26
+ let recognizedPropertyCount = 0;
27
+ for (const property of STRING_PROPERTIES) {
28
+ const element = findChildByLocalName(root, property);
29
+ if (!element) continue;
30
+ properties[property] = getTextContent(element);
31
+ recognizedPropertyCount++;
32
+ }
33
+ const revisionElement = findChildByLocalName(root, "revision");
34
+ if (revisionElement) {
35
+ const revision = parseRevision(getTextContent(revisionElement));
36
+ if (revision !== void 0) {
37
+ properties.revision = revision;
38
+ recognizedPropertyCount++;
39
+ }
40
+ }
41
+ for (const property of ["created", "modified"]) {
42
+ const element = findChildByLocalName(root, property);
43
+ if (!element) continue;
44
+ const date = parseDate(getTextContent(element));
45
+ if (date !== void 0) {
46
+ properties[property] = date;
47
+ recognizedPropertyCount++;
48
+ }
49
+ }
50
+ return recognizedPropertyCount > 0 ? properties : void 0;
51
+ };
52
+ //#endregion
53
+ export { parseCoreProperties };
@@ -1,5 +1,5 @@
1
- import { bytesEqual, joinBytes, padToBlock, passwordToUtf16Le, toArrayBuffer, writeUint32Le } from "./cryptoBytes.js";
2
1
  import { DOCX_ENCRYPTION_ERROR_CODES, DocxEncryptionError } from "./errors.js";
2
+ import { bytesEqual, joinBytes, padToBlock, passwordToUtf16Le, toArrayBuffer, writeUint32Le } from "./cryptoBytes.js";
3
3
  //#region src/docx/encryption/agileDecryption.ts
4
4
  /**
5
5
  * Agile Encryption decryption (Office 2010+) using Web Crypto.
@@ -1,5 +1,5 @@
1
- import { decodeBase64 } from "./cryptoBytes.js";
2
1
  import { DOCX_ENCRYPTION_ERROR_CODES, DocxEncryptionError } from "./errors.js";
2
+ import { decodeBase64 } from "./cryptoBytes.js";
3
3
  //#region src/docx/encryption/encryptionInfo.ts
4
4
  /**
5
5
  * Parse the EncryptionInfo stream for Agile Encryption (Office 2010+).
@@ -1,5 +1,5 @@
1
- import { toArrayBuffer } from "./cryptoBytes.js";
2
1
  import { DOCX_ENCRYPTION_ERROR_CODES, DocxEncryptionError } from "./errors.js";
2
+ import { toArrayBuffer } from "./cryptoBytes.js";
3
3
  import { decryptAgileEncryptedPackage } from "./agileDecryption.js";
4
4
  import { readEncryptedPackageStreams } from "./compoundFile.js";
5
5
  import { DOCX_CONTAINER_TYPES, detectDocxContainerType } from "./containerFormat.js";
@@ -0,0 +1,6 @@
1
+ import { document_d_exports } from "../types/document.js";
2
+
3
+ //#region src/docx/fontTableParser.d.ts
4
+ declare const parseFontTable: (xml: string | null | undefined) => document_d_exports.FontTable | undefined;
5
+ //#endregion
6
+ export { parseFontTable };