@stll/folio-core 0.32.2 → 0.33.1

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 (227) hide show
  1. package/dist/ai-edits/__fixtures__/paragraphs.d.ts +17 -0
  2. package/dist/ai-edits/__fixtures__/paragraphs.js +33 -0
  3. package/dist/ai-edits/apply.d.ts +49 -3
  4. package/dist/ai-edits/apply.js +652 -86
  5. package/dist/ai-edits/blockRange.d.ts +7 -3
  6. package/dist/ai-edits/blockRange.js +14 -6
  7. package/dist/ai-edits/headless.d.ts +39 -5
  8. package/dist/ai-edits/headless.js +76 -17
  9. package/dist/ai-edits/index.d.ts +6 -6
  10. package/dist/ai-edits/index.js +3 -3
  11. package/dist/ai-edits/read.d.ts +4 -0
  12. package/dist/ai-edits/read.js +30 -6
  13. package/dist/ai-edits/scoped-reading.js +4 -3
  14. package/dist/ai-edits/snapshot.d.ts +42 -2
  15. package/dist/ai-edits/snapshot.js +127 -62
  16. package/dist/ai-edits/table-row-column-mutations.d.ts +24 -1
  17. package/dist/ai-edits/table-row-column-mutations.js +98 -6
  18. package/dist/ai-edits/table-targets.d.ts +12 -3
  19. package/dist/ai-edits/table-targets.js +15 -5
  20. package/dist/ai-edits/types.d.ts +219 -15
  21. package/dist/ai-edits/word-diff.d.ts +54 -11
  22. package/dist/ai-edits/word-diff.js +221 -61
  23. package/dist/compare/__fixtures__/body-sequence.d.ts +56 -0
  24. package/dist/compare/__fixtures__/body-sequence.js +136 -0
  25. package/dist/compare/__fixtures__/nested-table.d.ts +16 -0
  26. package/dist/compare/__fixtures__/nested-table.js +50 -0
  27. package/dist/compare/__fixtures__/numbered-list.d.ts +34 -0
  28. package/dist/compare/__fixtures__/numbered-list.js +85 -0
  29. package/dist/compare/column-alignment.d.ts +27 -0
  30. package/dist/compare/column-alignment.js +162 -0
  31. package/dist/compare/compare.d.ts +107 -0
  32. package/dist/compare/compare.js +412 -0
  33. package/dist/compare/formatting.d.ts +29 -0
  34. package/dist/compare/formatting.js +84 -0
  35. package/dist/compare/plan.d.ts +22 -0
  36. package/dist/compare/plan.js +1141 -0
  37. package/dist/compare/reproducible-package.d.ts +21 -0
  38. package/dist/compare/reproducible-package.js +47 -0
  39. package/dist/compare/scenario.d.ts +77 -0
  40. package/dist/compare/scenario.js +263 -0
  41. package/dist/compare/types.d.ts +297 -0
  42. package/dist/compare/types.js +42 -0
  43. package/dist/compare/verification.d.ts +83 -0
  44. package/dist/compare/verification.js +189 -0
  45. package/dist/compat/eigenpal.d.ts +9 -6
  46. package/dist/compat/eigenpal.js +6 -3
  47. package/dist/controller/layoutPipeline.d.ts +13 -0
  48. package/dist/controller/layoutPipeline.js +15 -1
  49. package/dist/display-list/build/buildContext.d.ts +39 -0
  50. package/dist/display-list/build/buildContext.js +31 -0
  51. package/dist/display-list/build/buildDisplayList.d.ts +79 -0
  52. package/dist/display-list/build/buildDisplayList.js +283 -0
  53. package/dist/display-list/build/colors.d.ts +20 -0
  54. package/dist/display-list/build/colors.js +136 -0
  55. package/dist/display-list/build/floatingImages.d.ts +24 -0
  56. package/dist/display-list/build/floatingImages.js +41 -0
  57. package/dist/display-list/build/fontTable.d.ts +31 -0
  58. package/dist/display-list/build/fontTable.js +97 -0
  59. package/dist/display-list/build/furniture.d.ts +86 -0
  60. package/dist/display-list/build/furniture.js +98 -0
  61. package/dist/display-list/build/glyphs.d.ts +55 -0
  62. package/dist/display-list/build/glyphs.js +103 -0
  63. package/dist/display-list/build/headerFooterPrimitives.d.ts +17 -0
  64. package/dist/display-list/build/headerFooterPrimitives.js +40 -0
  65. package/dist/display-list/build/imagePrimitives.d.ts +35 -0
  66. package/dist/display-list/build/imagePrimitives.js +264 -0
  67. package/dist/display-list/build/pageBorderPrimitives.d.ts +23 -0
  68. package/dist/display-list/build/pageBorderPrimitives.js +111 -0
  69. package/dist/display-list/build/pageFurniture.d.ts +35 -0
  70. package/dist/display-list/build/pageFurniture.js +141 -0
  71. package/dist/display-list/build/paragraphPrimitives.d.ts +19 -0
  72. package/dist/display-list/build/paragraphPrimitives.js +819 -0
  73. package/dist/display-list/build/regions.d.ts +46 -0
  74. package/dist/display-list/build/regions.js +56 -0
  75. package/dist/display-list/build/storyPrimitives.d.ts +29 -0
  76. package/dist/display-list/build/storyPrimitives.js +279 -0
  77. package/dist/display-list/build/strokes.d.ts +19 -0
  78. package/dist/display-list/build/strokes.js +78 -0
  79. package/dist/display-list/build/tablePrimitives.d.ts +38 -0
  80. package/dist/display-list/build/tablePrimitives.js +409 -0
  81. package/dist/display-list/build/textBoxPrimitives.d.ts +14 -0
  82. package/dist/display-list/build/textBoxPrimitives.js +129 -0
  83. package/dist/display-list/build/textDecorations.d.ts +29 -0
  84. package/dist/display-list/build/textDecorations.js +29 -0
  85. package/dist/display-list/build/unsupported.d.ts +57 -0
  86. package/dist/display-list/build/unsupported.js +0 -0
  87. package/dist/display-list/build/watermarkPrimitives.d.ts +15 -0
  88. package/dist/display-list/build/watermarkPrimitives.js +128 -0
  89. package/dist/display-list/dom/renderDisplayListToDom.d.ts +26 -0
  90. package/dist/display-list/dom/renderDisplayListToDom.js +620 -0
  91. package/dist/display-list/editor/displayListPagePainter.d.ts +22 -0
  92. package/dist/display-list/editor/displayListPagePainter.js +63 -0
  93. package/dist/display-list/editor/pageRenderer.d.ts +24 -0
  94. package/dist/display-list/editor/pageRenderer.js +36 -0
  95. package/dist/display-list/primitives.d.ts +95 -0
  96. package/dist/display-list/primitives.js +127 -0
  97. package/dist/display-list/types.d.ts +472 -0
  98. package/dist/display-list/types.js +0 -0
  99. package/dist/document-operations.d.ts +39 -8
  100. package/dist/document-operations.js +169 -16
  101. package/dist/document-stories.d.ts +16 -0
  102. package/dist/document-stories.js +48 -4
  103. package/dist/docx/hyperlinkParser.d.ts +9 -1
  104. package/dist/docx/hyperlinkParser.js +19 -13
  105. package/dist/docx/packageParts.d.ts +35 -0
  106. package/dist/docx/packageParts.js +120 -0
  107. package/dist/docx/paraIdRangeNormalization.d.ts +40 -0
  108. package/dist/docx/paraIdRangeNormalization.js +64 -0
  109. package/dist/docx/paragraphParser.js +101 -26
  110. package/dist/docx/paragraphTraversal.js +1 -1
  111. package/dist/docx/renderedPageBreakNormalization.js +3 -1
  112. package/dist/docx/revisionIdNormalization.d.ts +27 -0
  113. package/dist/docx/revisionIdNormalization.js +121 -0
  114. package/dist/docx/rezip.d.ts +6 -0
  115. package/dist/docx/rezip.js +51 -19
  116. package/dist/docx/selectiveSave.js +2 -2
  117. package/dist/docx/serializer/commentSerializer.js +6 -1
  118. package/dist/docx/serializer/paragraphSerializer.js +73 -20
  119. package/dist/docx/serializer/runSerializer.js +11 -10
  120. package/dist/docx/serializer/tableSerializer.js +26 -10
  121. package/dist/docx/server/applyDocxXmlPatchProposal.js +1 -1
  122. package/dist/docx/server/createBilingualDocx.js +3 -2
  123. package/dist/docx/streamingXmlParser.d.ts +13 -1
  124. package/dist/docx/streamingXmlParser.js +49 -11
  125. package/dist/docx/unzip.d.ts +1 -2
  126. package/dist/docx/unzip.js +25 -6
  127. package/dist/docx/xmlParser.d.ts +3 -1
  128. package/dist/docx/xmlParser.js +33 -27
  129. package/dist/export-pdf.d.ts +43 -0
  130. package/dist/export-pdf.js +98 -0
  131. package/dist/fonts/headlessMeasure.d.ts +76 -0
  132. package/dist/fonts/headlessMeasure.js +0 -0
  133. package/dist/fonts/sfnt/parse.d.ts +51 -0
  134. package/dist/fonts/sfnt/parse.js +525 -0
  135. package/dist/fonts/sfnt/subset.d.ts +20 -0
  136. package/dist/fonts/sfnt/subset.js +350 -0
  137. package/dist/fonts/sfnt/tables.d.ts +88 -0
  138. package/dist/fonts/sfnt/tables.js +131 -0
  139. package/dist/fonts/sfnt/woff.d.ts +14 -0
  140. package/dist/fonts/sfnt/woff.js +163 -0
  141. package/dist/generated/text_shaper.js +324 -0
  142. package/dist/generated/text_shaper_bg.wasm +0 -0
  143. package/dist/headless-layout.d.ts +75 -0
  144. package/dist/headless-layout.js +350 -0
  145. package/dist/index.d.ts +9 -6
  146. package/dist/index.js +6 -3
  147. package/dist/layout-bridge/convert/footnoteLayout.d.ts +1 -0
  148. package/dist/layout-bridge/convert/footnoteLayout.js +1 -0
  149. package/dist/layout-bridge/convert/headerFooterLayout.d.ts +1 -0
  150. package/dist/layout-bridge/convert/headerFooterLayout.js +2 -0
  151. package/dist/layout-bridge/convert/toFlowBlocks.d.ts +3 -1
  152. package/dist/layout-bridge/convert/toFlowBlocks.js +2 -0
  153. package/dist/layout-engine/measure/advanceComposition.d.ts +62 -0
  154. package/dist/layout-engine/measure/advanceComposition.js +148 -0
  155. package/dist/layout-engine/measure/cache.d.ts +2 -0
  156. package/dist/layout-engine/measure/measureContainer.js +13 -0
  157. package/dist/layout-engine/measure/measureParagraph.js +1 -2
  158. package/dist/layout-engine/measure/measureTypes.d.ts +12 -0
  159. package/dist/layout-engine/measure/tableInlinePlacement.d.ts +3 -2
  160. package/dist/layout-engine/measure/tableInlinePlacement.js +14 -1
  161. package/dist/layout-engine/tableIndentCompatibility.d.ts +5 -0
  162. package/dist/layout-engine/tableIndentCompatibility.js +15 -0
  163. package/dist/layout-engine/types.d.ts +8 -0
  164. package/dist/layout-painter/renderPage.d.ts +29 -1
  165. package/dist/layout-painter/renderPage.js +47 -19
  166. package/dist/layout-painter/renderParagraph.d.ts +21 -2
  167. package/dist/layout-painter/renderParagraph.js +1 -1
  168. package/dist/layout-painter/renderTable.js +37 -4
  169. package/dist/managers/editorShortcuts.d.ts +33 -1
  170. package/dist/managers/editorShortcuts.js +20 -1
  171. package/dist/markdown/renderRuns.js +7 -2
  172. package/dist/markdown/renderTable.js +5 -1
  173. package/dist/model.d.ts +3 -3
  174. package/dist/model.js +2 -2
  175. package/dist/pdf/contentStream.d.ts +73 -0
  176. package/dist/pdf/contentStream.js +143 -0
  177. package/dist/pdf/fonts.d.ts +96 -0
  178. package/dist/pdf/fonts.js +593 -0
  179. package/dist/pdf/images.d.ts +28 -0
  180. package/dist/pdf/images.js +439 -0
  181. package/dist/pdf/objects.d.ts +93 -0
  182. package/dist/pdf/objects.js +237 -0
  183. package/dist/pdf/pageSpace.d.ts +43 -0
  184. package/dist/pdf/pageSpace.js +57 -0
  185. package/dist/pdf/paint.d.ts +32 -0
  186. package/dist/pdf/paint.js +442 -0
  187. package/dist/pdf/writePdf.d.ts +56 -0
  188. package/dist/pdf/writePdf.js +345 -0
  189. package/dist/prosemirror/commands/comments.js +96 -6
  190. package/dist/prosemirror/conversion/fromProseDoc.js +41 -7
  191. package/dist/prosemirror/conversion/toProseDoc.js +41 -4
  192. package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.d.ts +15 -2
  193. package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.js +35 -6
  194. package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +2 -2
  195. package/dist/prosemirror/extensions/features/pasteCleanup.js +4 -3
  196. package/dist/prosemirror/extensions/nodes/BookmarkBoundaryExtension.d.ts +3 -1
  197. package/dist/prosemirror/extensions/nodes/BookmarkBoundaryExtension.js +5 -3
  198. package/dist/prosemirror/extensions/nodes/RenderedPageBreakExtension.d.ts +7 -1
  199. package/dist/prosemirror/extensions/nodes/RenderedPageBreakExtension.js +9 -3
  200. package/dist/prosemirror/extensions/nodes/TableExtension.js +56 -39
  201. package/dist/prosemirror/extensions/nodes/TextBoxAnchorExtension.d.ts +3 -1
  202. package/dist/prosemirror/extensions/nodes/TextBoxAnchorExtension.js +5 -3
  203. package/dist/prosemirror/plugins/suggestionMode.js +1 -0
  204. package/dist/prosemirror/revisionCarriers.js +19 -2
  205. package/dist/prosemirror/utils/extractTrackedChanges.d.ts +2 -2
  206. package/dist/prosemirror/utils/extractTrackedChanges.js +59 -23
  207. package/dist/prosemirror/validation.js +55 -27
  208. package/dist/prosemirror/zeroWidthAnchors.d.ts +10 -0
  209. package/dist/prosemirror/zeroWidthAnchors.js +23 -0
  210. package/dist/redline.js +12 -79
  211. package/dist/server.d.ts +3 -3
  212. package/dist/server.js +2 -2
  213. package/dist/shaping/placeRun.d.ts +51 -0
  214. package/dist/shaping/placeRun.js +84 -0
  215. package/dist/shaping/shaper.d.ts +92 -0
  216. package/dist/shaping/shaper.js +102 -0
  217. package/dist/types/block-id.d.ts +18 -2
  218. package/dist/types/block-id.js +49 -5
  219. package/dist/types/content.d.ts +2 -2
  220. package/dist/utils/clipboard.js +4 -3
  221. package/dist/utils/fontResolver.js +183 -0
  222. package/dist/utils/htmlComments.d.ts +17 -0
  223. package/dist/utils/htmlComments.js +22 -0
  224. package/dist/utils/scriptSegments.d.ts +12 -1
  225. package/dist/utils/scriptSegments.js +17 -1
  226. package/dist/version-comparison.d.ts +1 -1
  227. package/package.json +7 -3
@@ -1,14 +1,17 @@
1
- import { FolioAIBlock, FolioAIBlockAnchor, FolioAIBlockKind, FolioAIBlockPreviewRun, FolioAIComment, FolioAIEditAppliedOperation, FolioAIEditApplyMode, FolioAIEditApplyResult, FolioAIEditNormalization, FolioAIEditNormalizationCode, FolioAIEditOperation, FolioAIEditPrecondition, FolioAIEditReviewMeta, FolioAIEditSeverity, FolioAIEditSkipReason, FolioAIEditSkippedOperation, FolioAIEditSnapshot, FolioAISignatureParty } from "../ai-edits/types.js";
2
- import { applyFolioAIEditOperations } from "../ai-edits/apply.js";
1
+ import { FolioAIBlock, FolioAIBlockAnchor, FolioAIBlockKind, FolioAIBlockPreviewRun, FolioAIBlockTableLocation, FolioAIComment, FolioAIEditAppliedOperation, FolioAIEditApplyMode, FolioAIEditApplyResult, FolioAIEditNormalization, FolioAIEditNormalizationCode, FolioAIEditOperation, FolioAIEditPrecondition, FolioAIEditReviewMeta, FolioAIEditSeverity, FolioAIEditSkipReason, FolioAIEditSkippedOperation, FolioAIEditSnapshot, FolioAISignatureParty } from "../ai-edits/types.js";
2
+ import { WORD_DIFF_GRANULARITIES, WordDiffGranularity, WordDiffNormalization, WordDiffOptions, WordDiffSegment, diffWordSegments } from "../ai-edits/word-diff.js";
3
+ import { FolioAIEditApplyOutcome, FolioRevisionStamp, FolioWordDiffOptions, applyFolioAIEditOperations } from "../ai-edits/apply.js";
3
4
  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, FolioDocumentOperationStory, FolioDocumentOperationType, FolioDocumentOperationUndoFailureReason, FolioDocumentOperationUndoHandle, FolioDocumentOperationUndoResult, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, applyFolioDocumentOperations, assertSupportedFolioDocumentOperationVersion, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, parseFolioDocumentOperationBatch } from "../document-operations.js";
5
- import { createFolioAIEditSnapshot, hashFolioAIBlockText, normalizeFolioAIBlockText } from "../ai-edits/snapshot.js";
5
+ 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, FolioDocumentOperationResultBase, FolioDocumentOperationStatus, FolioDocumentOperationStory, FolioDocumentOperationType, FolioDocumentOperationUndoFailureReason, FolioDocumentOperationUndoHandle, FolioDocumentOperationUndoResult, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, applyFolioDocumentOperations, assertSupportedFolioDocumentOperationVersion, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, parseFolioDocumentOperationBatch } from "../document-operations.js";
6
+ import { createFolioAIEditSnapshot, hashFolioAIBlockText, isFolioAIContentBlock, normalizeFolioAIBlockText } from "../ai-edits/snapshot.js";
6
7
  import { DeriveBlockIdInput, FolioBlockId, deriveBlockId, getFolioParaIdFromBlockId, isFolioBlockId, isSequentialFolioBlockId } from "../types/block-id.js";
7
- import { WordDiffSegment, diffWordSegments } from "../ai-edits/word-diff.js";
8
8
  import { AIBarStatus, AIChatMode, AICitation, AICitationSource, AIGenerateInput, AISuggestion, AISuggestionApplyMode, AISuggestionPreset, AISuggestionSeverity, AISuggestionStatus, DEFAULT_AI_SUGGESTION_PRESETS } from "../ai-suggestions/types.js";
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 { COMPARE_VERIFICATION_CAUSES, COMPARE_VERIFICATION_INVARIANTS, CompareVerification, CompareVerificationCause, CompareVerificationFailure, CompareVerificationInvariant, FinalParagraphMarkDeletion } from "../compare/verification.js";
13
+ import { COMPARE_UNSUPPORTED_REASONS, CompareChange, CompareChangeLocation, CompareDocxApplyError, CompareDocxError, CompareDocxFinalParagraphMarkError, CompareDocxOperationLimitError, CompareDocxOptions, CompareDocxParseError, CompareDocxRoundTripError, CompareDocxSerializeError, CompareFormatRange, CompareResult, CompareUnsupportedPart, CompareUnsupportedReason, InvalidCompareDocxOptionsError } from "../compare/types.js";
14
+ import { MAX_COMPARE_OPERATIONS, compareDocx } from "../compare/compare.js";
12
15
  import { DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION, DocumentPreset, DocumentStyleSet } from "../style-sets/types.js";
13
16
  import { CreateEmptyDocumentOptions, createEmptyDocument } from "../utils/createDocument.js";
14
17
  import { mergeDocumentContent } from "../utils/mergeDocumentContent.js";
@@ -34,4 +37,4 @@ import { getGoogleFontsEnabled, setEmbeddedFontFamilyMap, setGoogleFontsEnabled
34
37
  import { DOCX_CONFORMANCE_CLASSES } from "../index.js";
35
38
  type Document = document_d_exports.Document;
36
39
  type DocxConformanceClass = document_d_exports.DocxConformanceClass;
37
- 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, 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 FolioAIEditNormalization, type FolioAIEditNormalizationCode, 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, buildEmbeddedFontFamilyMap, 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, mergeDocumentContent, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch, resetTemplateSlashQuery, resolveSuggestionAnchor, scanDirectives, scopeEmbeddedFontFamily, scrollFolioPositionIntoView, setAICitationsMeta, setAISuggestionsMeta, setActiveCitationMeta, setAnonymizationTermsMeta, setEmbeddedFontFamilyMap, setFocusedSuggestionMeta, setGoogleFontsEnabled, setTemplatePreviewValues, shouldTriggerAutocomplete, startAutocompleteSuggestion, templateSlashMenuKey, toMarkdown, toMarkdownResult };
40
+ 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_UNSUPPORTED_REASONS, COMPARE_VERIFICATION_CAUSES, COMPARE_VERIFICATION_INVARIANTS, type CompareChange, type CompareChangeLocation, CompareDocxApplyError, type CompareDocxError, CompareDocxFinalParagraphMarkError, CompareDocxOperationLimitError, type CompareDocxOptions, CompareDocxParseError, CompareDocxRoundTripError, CompareDocxSerializeError, type CompareFormatRange, type CompareResult, type CompareUnsupportedPart, type CompareUnsupportedReason, type CompareVerification, type CompareVerificationCause, type CompareVerificationFailure, type CompareVerificationInvariant, 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 FinalParagraphMarkDeletion, type FolioAIBlock, type FolioAIBlockAnchor, type FolioAIBlockKind, type FolioAIBlockPreviewRun, 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 FolioAISignatureParty, type FolioBlockId, 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 ImageMeta, type ImageRef, type InspectDocxCompatibilityOptions, InvalidCompareDocxOptionsError, InvalidFolioDocumentOperationBatchError, MAX_COMPARE_OPERATIONS, type MarkdownOptions, type MarkdownResult, type PositionalText, type ResolvedAnchor, STELLA_STYLE_SET_NAME, 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, compareDocx, 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, 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 };
@@ -1,10 +1,13 @@
1
1
  import { applyFolioAIEditOperations } from "../ai-edits/apply.js";
2
- import { createFolioAIEditSnapshot, hashFolioAIBlockText, normalizeFolioAIBlockText } from "../ai-edits/snapshot.js";
3
- import { diffWordSegments } from "../ai-edits/word-diff.js";
2
+ import { createFolioAIEditSnapshot, hashFolioAIBlockText, isFolioAIContentBlock, normalizeFolioAIBlockText } from "../ai-edits/snapshot.js";
3
+ import { WORD_DIFF_GRANULARITIES, diffWordSegments } from "../ai-edits/word-diff.js";
4
4
  import { applySuggestions } from "../ai-suggestions/apply.js";
5
5
  import { isSuggestionStale, resolveSuggestionAnchor } from "../ai-suggestions/conflict.js";
6
6
  import { buildPositionalText } from "../ai-suggestions/text-positions.js";
7
7
  import { DEFAULT_AI_SUGGESTION_PRESETS } from "../ai-suggestions/types.js";
8
+ import { MAX_COMPARE_OPERATIONS, compareDocx } from "../compare/compare.js";
9
+ import { COMPARE_UNSUPPORTED_REASONS, CompareDocxApplyError, CompareDocxFinalParagraphMarkError, CompareDocxOperationLimitError, CompareDocxParseError, CompareDocxRoundTripError, CompareDocxSerializeError, InvalidCompareDocxOptionsError } from "../compare/types.js";
10
+ import { COMPARE_VERIFICATION_CAUSES, COMPARE_VERIFICATION_INVARIANTS } from "../compare/verification.js";
8
11
  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";
9
12
  import { inspectDocxCompatibility } from "../docx/compatibility.js";
10
13
  import { createDocx } from "../docx/rezip.js";
@@ -28,4 +31,4 @@ import { deriveBlockId, getFolioParaIdFromBlockId, isFolioBlockId, isSequentialF
28
31
  import { createEmptyDocument } from "../utils/createDocument.js";
29
32
  import { getGoogleFontsEnabled, setEmbeddedFontFamilyMap, setGoogleFontsEnabled } from "../utils/fontResolver.js";
30
33
  import { mergeDocumentContent } from "../utils/mergeDocumentContent.js";
31
- 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, buildEmbeddedFontFamilyMap, 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, mergeDocumentContent, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch, resetTemplateSlashQuery, resolveSuggestionAnchor, scanDirectives, scopeEmbeddedFontFamily, scrollFolioPositionIntoView, setAICitationsMeta, setAISuggestionsMeta, setActiveCitationMeta, setAnonymizationTermsMeta, setEmbeddedFontFamilyMap, setFocusedSuggestionMeta, setGoogleFontsEnabled, setTemplatePreviewValues, shouldTriggerAutocomplete, startAutocompleteSuggestion, templateSlashMenuKey, toMarkdown, toMarkdownResult };
34
+ export { COMPARE_UNSUPPORTED_REASONS, COMPARE_VERIFICATION_CAUSES, COMPARE_VERIFICATION_INVARIANTS, CompareDocxApplyError, CompareDocxFinalParagraphMarkError, CompareDocxOperationLimitError, CompareDocxParseError, CompareDocxRoundTripError, CompareDocxSerializeError, 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, InvalidCompareDocxOptionsError, InvalidFolioDocumentOperationBatchError, MAX_COMPARE_OPERATIONS, STELLA_STYLE_SET_NAME, UnsupportedFolioDocumentOperationVersionError, WORD_DIFF_GRANULARITIES, acceptAutocompleteSuggestion, acceptAutocompleteWord, anonymizationDecorationsKey, appendAutocompleteToken, applyFolioAIEditOperations, applyFolioDocumentOperations, applySuggestions, assertSupportedFolioDocumentOperationVersion, autocompleteSuggestionKey, autocompleteSuggestionPlugin, buildEmbeddedFontFamilyMap, buildPositionalText, clearAutocompleteSuggestion, clearTemplateSlashMenu, compareDocx, 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, 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 };
@@ -7,6 +7,7 @@ import { ConvertHeaderFooterOptions, HeaderFooterMetrics } from "../layout-bridg
7
7
  import "../layout-engine/index.js";
8
8
  import { FootnoteRenderItem } from "../layout-painter/renderPage.js";
9
9
  import { BlockLookup, LayoutPainter } from "../layout-painter/index.js";
10
+ import { PageRendererName } from "../display-list/editor/pageRenderer.js";
10
11
  import { LayoutSelectionGate } from "../paged-layout/LayoutSelectionGate.js";
11
12
  import { LayoutSession } from "./layoutSession.js";
12
13
  import { EditorState } from "prosemirror-state";
@@ -59,6 +60,18 @@ type LayoutPipelineDeps<THfPMs> = {
59
60
  documentFontsAreLoaded: () => boolean;
60
61
  buildFootnoteRenderItems: (pageFootnoteMap: Map<number, number[]>, footnoteContentMap: Map<number, FootnoteContent>, doc: document_d_exports.Document | null) => Map<number, FootnoteRenderItem[]>;
61
62
  describeInvalidHighlightMarks: (doc: EditorState["doc"]) => string;
63
+ /**
64
+ * Which renderer paints the pages. `"legacy"` is the painter that has always
65
+ * painted them; `"display-list"` builds the painter-neutral paint IR from
66
+ * this layout and paints the pages from it, so the editor and an export draw
67
+ * from one structure.
68
+ *
69
+ * Only the *painting* is swapped. Page shells, virtualization, the
70
+ * fingerprint comparison that skips an unchanged page and the painted event
71
+ * are page-container concerns and stay shared, because a second copy of them
72
+ * is how incremental repaint would quietly stop working on long documents.
73
+ */
74
+ pageRenderer?: PageRendererName;
62
75
  emptyTemplatePreviewEntries: readonly TemplatePreviewEntry[];
63
76
  };
64
77
  declare function runLayoutPipeline<THfPMs>(deps: LayoutPipelineDeps<THfPMs>, state: EditorState, options?: LayoutRunOptions): LayoutOutcome;
@@ -1,3 +1,5 @@
1
+ import { createDisplayListPagePainter } from "../display-list/editor/displayListPagePainter.js";
2
+ import { PAGE_RENDERER, displayListFurnitureFrom } from "../display-list/editor/pageRenderer.js";
1
3
  import { resolveDocumentGridLinePitch } from "../docx/documentGrid.js";
2
4
  import { buildBookmarkPageMap } from "../fields/bookmarkPages.js";
3
5
  import { buildBookmarkText } from "../fields/bookmarkText.js";
@@ -15,6 +17,7 @@ import { recordLayoutComplete, recordLayoutError, recordLayoutPhase, recordLayou
15
17
  import { measureBlocks, measureSingleBlockWithoutFloatingZones } from "../layout-engine/measure/measureBlocks.js";
16
18
  import { installCanvasMeasureProvider } from "../layout-engine/measure/measureContainer.js";
17
19
  import { resolveEffectiveParagraphSpacingTree } from "../layout-engine/paragraphSpacing.js";
20
+ import { resolveTableIndentCompatibility } from "../layout-engine/tableIndentCompatibility.js";
18
21
  import "../layout-engine/types.js";
19
22
  import { renderPages } from "../layout-painter/renderPage.js";
20
23
  import { tryBuildIncrementalMeasures } from "../paged-layout/incrementalMeasure.js";
@@ -84,7 +87,7 @@ function attachAuthoredMarginsToLayoutPages(layout, options) {
84
87
  } : layout;
85
88
  }
86
89
  function runLayoutPipeline(deps, state, options = {}) {
87
- const { contentWidth, columns, pageSize, margins, pageGap, showMarginGuides, marginGuideColor, syncCoordinator, headerContent, footerContent, firstPageHeaderContent, firstPageFooterContent, headerContentRId, footerContentRId, firstPageHeaderContentRId, firstPageFooterContentRId, sectionHeaderFooterRefs, theme: _theme, sectionProperties, document, defaultTabStop, mirrorMargins, styles, layout, hfPMs, painter, pagesContainer, session, renderHfFromContentOrPm, renderHeaderFooterContentByRId, documentFontsAreLoaded, buildFootnoteRenderItems, describeInvalidHighlightMarks, emptyTemplatePreviewEntries: EMPTY_TEMPLATE_PREVIEW_ENTRIES } = deps;
90
+ const { contentWidth, columns, pageSize, margins, pageGap, showMarginGuides, marginGuideColor, syncCoordinator, headerContent, footerContent, firstPageHeaderContent, firstPageFooterContent, headerContentRId, footerContentRId, firstPageHeaderContentRId, firstPageFooterContentRId, sectionHeaderFooterRefs, theme: _theme, sectionProperties, document, defaultTabStop, mirrorMargins, styles, layout, hfPMs, painter, pagesContainer, session, renderHfFromContentOrPm, renderHeaderFooterContentByRId, documentFontsAreLoaded, buildFootnoteRenderItems, describeInvalidHighlightMarks, pageRenderer = PAGE_RENDERER.legacy, emptyTemplatePreviewEntries: EMPTY_TEMPLATE_PREVIEW_ENTRIES } = deps;
88
91
  let outcome = {};
89
92
  let pendingArtifacts;
90
93
  let pendingTemplatePreview;
@@ -110,6 +113,8 @@ function runLayoutPipeline(deps, state, options = {}) {
110
113
  const documentSettings = document?.package.settings;
111
114
  const justificationCompatibility = resolveJustificationCompatibility(documentSettings?.compatibilityMode);
112
115
  if (justificationCompatibility) flowOpts.justificationCompatibility = justificationCompatibility;
116
+ const tableIndentCompatibility = resolveTableIndentCompatibility(documentSettings?.compatibilityMode);
117
+ if (tableIndentCompatibility) flowOpts.tableIndentCompatibility = tableIndentCompatibility;
113
118
  if (documentSettings?.autoHyphenation === true) flowOpts.automaticHyphenation = {
114
119
  enabled: true,
115
120
  ...documentSettings.doNotHyphenateCaps !== void 0 ? { doNotHyphenateCaps: documentSettings.doNotHyphenateCaps } : {},
@@ -166,6 +171,7 @@ function runLayoutPipeline(deps, state, options = {}) {
166
171
  ...defaultTabStop !== void 0 ? { defaultTabStopTwips: defaultTabStop } : {},
167
172
  ...flowOpts.lineBreakRules ? { lineBreakRules: flowOpts.lineBreakRules } : {},
168
173
  ...flowOpts.justificationCompatibility ? { justificationCompatibility: flowOpts.justificationCompatibility } : {},
174
+ ...flowOpts.tableIndentCompatibility ? { tableIndentCompatibility: flowOpts.tableIndentCompatibility } : {},
169
175
  ...flowOpts.automaticHyphenation ? { automaticHyphenation: flowOpts.automaticHyphenation } : {}
170
176
  };
171
177
  };
@@ -312,6 +318,7 @@ function runLayoutPipeline(deps, state, options = {}) {
312
318
  if (defaultTabStop !== void 0) footnoteOptions.defaultTabStopTwips = defaultTabStop;
313
319
  if (flowOpts.lineBreakRules) footnoteOptions.lineBreakRules = flowOpts.lineBreakRules;
314
320
  if (flowOpts.justificationCompatibility) footnoteOptions.justificationCompatibility = flowOpts.justificationCompatibility;
321
+ if (flowOpts.tableIndentCompatibility) footnoteOptions.tableIndentCompatibility = flowOpts.tableIndentCompatibility;
315
322
  if (flowOpts.automaticHyphenation) footnoteOptions.automaticHyphenation = flowOpts.automaticHyphenation;
316
323
  return footnoteOptions;
317
324
  })());
@@ -479,6 +486,13 @@ function runLayoutPipeline(deps, state, options = {}) {
479
486
  if (watermarkByHeaderRId.size > 0) renderOpts.watermarkByHeaderRId = watermarkByHeaderRId;
480
487
  }
481
488
  }
489
+ if (pageRenderer === PAGE_RENDERER.displayList) renderOpts.paintPage = createDisplayListPagePainter({
490
+ layout: newLayout,
491
+ blockLookup,
492
+ doc: pagesContainer.ownerDocument,
493
+ ...displayListFurnitureFrom(renderOpts),
494
+ ...footnoteContentMap.size === 0 ? {} : { footnoteContentById: footnoteContentMap }
495
+ }).paintPage;
482
496
  renderPages(newLayout.pages, pagesContainer, renderOpts);
483
497
  recordPhaseDuration("render-pages", phaseStartedAt);
484
498
  }
@@ -0,0 +1,39 @@
1
+ import { DisplayColor, DisplayLink, DisplayLinkTarget, DisplayStoryRef } from "../types.js";
2
+ import { FontTable } from "./fontTable.js";
3
+ import { ImageTable } from "./imagePrimitives.js";
4
+ import { UnsupportedCollector } from "./unsupported.js";
5
+ //#region src/display-list/build/buildContext.d.ts
6
+ /** Word's per-author redline palette, assigned in first-seen order per build. */
7
+ declare class AuthorColorTable {
8
+ private readonly indexByAuthor;
9
+ colorFor(author: string | undefined): DisplayColor;
10
+ }
11
+ /** Colour a tracked change paints in: the author's hue, or the proposal hue. */
12
+ declare const trackedChangeColor: (authorColors: AuthorColorTable, changeAuthor: string | undefined, isSuggestion: boolean | undefined) => DisplayColor;
13
+ /**
14
+ * Which OOXML story the primitives being built belong to, named precisely
15
+ * enough to address it: a document has many headers and many notes, and a
16
+ * position only means something against one of them.
17
+ */
18
+ type DisplayStory = DisplayStoryRef;
19
+ type BuildContext = {
20
+ readonly fonts: FontTable;
21
+ readonly images: ImageTable;
22
+ readonly unsupported: UnsupportedCollector;
23
+ readonly authorColors: AuthorColorTable;
24
+ /** Link sink for the page being built. */
25
+ readonly links: DisplayLink[];
26
+ /**
27
+ * Bookmark name → where it lands, collected in a first pass over the layout.
28
+ * A `#name` hyperlink can only become a `page` target once every page is
29
+ * known, which is why this is resolved before any page is painted.
30
+ */
31
+ readonly bookmarkTargets: ReadonlyMap<string, DisplayLinkTarget>;
32
+ readonly story: DisplayStory;
33
+ readonly pageIndex: number;
34
+ /** Authored page number, for `PAGE` fields. */
35
+ readonly pageNumber: number;
36
+ readonly totalPages: number;
37
+ };
38
+ //#endregion
39
+ export { AuthorColorTable, BuildContext, DisplayStory, trackedChangeColor };
@@ -0,0 +1,31 @@
1
+ import { AUTHOR_COLORS } from "../../utils/authorColors.js";
2
+ import { SUGGESTION_COLOR, parseDisplayColor } from "./colors.js";
3
+ //#region src/display-list/build/buildContext.ts
4
+ /**
5
+ * State threaded through one `buildDisplayList` call.
6
+ *
7
+ * Everything mutable the builder needs lives here so the builder itself stays a
8
+ * pure function of its arguments: the font table, the image table, the
9
+ * unsupported log and the author-colour assignment are all born and die inside
10
+ * a single call. `utils/authorColors.ts`'s `getAuthorColorIdx` deliberately is
11
+ * not used: it keeps a module-level map, so the colour an author gets depends
12
+ * on which documents the process opened earlier, and two builds of the same
13
+ * layout would not compare equal.
14
+ */
15
+ /** Word's per-author redline palette, assigned in first-seen order per build. */
16
+ var AuthorColorTable = class {
17
+ indexByAuthor = /* @__PURE__ */ new Map();
18
+ colorFor(author) {
19
+ const key = author ?? "";
20
+ let index = this.indexByAuthor.get(key);
21
+ if (index === void 0) {
22
+ index = this.indexByAuthor.size % AUTHOR_COLORS.length;
23
+ this.indexByAuthor.set(key, index);
24
+ }
25
+ return parseDisplayColor(AUTHOR_COLORS[index]) ?? SUGGESTION_COLOR;
26
+ }
27
+ };
28
+ /** Colour a tracked change paints in: the author's hue, or the proposal hue. */
29
+ const trackedChangeColor = (authorColors, changeAuthor, isSuggestion) => isSuggestion ? SUGGESTION_COLOR : authorColors.colorFor(changeAuthor);
30
+ //#endregion
31
+ export { AuthorColorTable, trackedChangeColor };
@@ -0,0 +1,79 @@
1
+ import { EmbeddedFont } from "../../fonts/embeddedFonts.js";
2
+ import { Layout } from "../../layout-engine/types.js";
3
+ import { BlockLookup } from "../../layout-painter/index.js";
4
+ import { DisplayColor, DisplayList, DisplayMetadata, DisplayPage } from "../types.js";
5
+ import { PageFurnitureInputs } from "./furniture.js";
6
+ //#region src/display-list/build/buildDisplayList.d.ts
7
+ /**
8
+ * Every feature a source document can have that a `Layout` does not record and
9
+ * that nothing on a page betrays, with the reason it paints nothing when the
10
+ * caller supplies neither the construct nor a flag denying it. The list is the
11
+ * single source of truth: {@link DocumentFeatures} is derived from it, so a
12
+ * feature added here cannot be left without a flag or without a reason.
13
+ *
14
+ * Footnote bodies and header/footer stories are deliberately absent: a page
15
+ * that carries them says so itself (`footnoteIds`, `headerFooterRefs`), so
16
+ * their gaps are reported per page from the layout rather than from a
17
+ * document-wide flag the caller would have to remember to set.
18
+ */
19
+ declare const DOCUMENT_FEATURE_GAPS: readonly [readonly ["pageBorders", "w:pgBorders reach the painter through render options, not through Layout, and none were supplied to the builder"], readonly ["watermark", "watermarks reach the painter through render options, not through Layout, and none was supplied to the builder"]];
20
+ /**
21
+ * Which of those features the source document actually has. The builder cannot
22
+ * detect them, so the caller that parsed the document states it.
23
+ */
24
+ type DocumentFeatures = { readonly [Feature in (typeof DOCUMENT_FEATURE_GAPS)[number][0]]: boolean; };
25
+ type BuildDisplayListOptions = PageFurnitureInputs & {
26
+ readonly layout: Layout;
27
+ readonly blockLookup: BlockLookup;
28
+ readonly metadata?: DisplayMetadata;
29
+ /** Page background. Defaults to opaque white: the PDF has no theme. */
30
+ readonly pageBackground?: DisplayColor;
31
+ /**
32
+ * States, for each construct in {@link DOCUMENT_FEATURE_GAPS}, whether the
33
+ * document has one at all. Omitted means unknown, and an unknown document is
34
+ * reported as having both: a silent gap is worse than one the reader can
35
+ * dismiss. A construct supplied through {@link PageFurnitureInputs} is
36
+ * painted and never reported, whatever this says.
37
+ */
38
+ readonly documentFeatures?: DocumentFeatures;
39
+ /**
40
+ * The package's own font faces (`fonts/embeddedFonts.ts`). Absent: a face the
41
+ * measurer resolved to an embedded family travels as a name, and a backend
42
+ * that cannot find that name on the host paints the document in a substitute.
43
+ */
44
+ readonly embeddedFonts?: readonly EmbeddedFont[];
45
+ };
46
+ /**
47
+ * A document's display list, one page at a time.
48
+ *
49
+ * The tables a page refers to (faces, images), the bookmark targets a link can
50
+ * resolve against, and the outline are properties of the whole document, so
51
+ * they are computed once; a page's primitives are not, and an editor paints a
52
+ * window of pages rather than all of them. Building every page to paint three
53
+ * of them is the difference between work proportional to the screen and work
54
+ * proportional to the document, which on a long one is the difference a reader
55
+ * feels on every keystroke.
56
+ *
57
+ * A page is built at most once. `snapshot` returns what has been built so far,
58
+ * so a caller that wants the whole list asks for every page first — which is
59
+ * what {@link buildDisplayList} does.
60
+ */
61
+ type DisplayListBuilder = {
62
+ readonly pageCount: number;
63
+ /** The page at that index, built on first request and kept. */
64
+ readonly pageAt: (pageIndex: number) => DisplayPage | undefined;
65
+ /**
66
+ * The list as far as it has been built. The tables grow as pages are built,
67
+ * so a backend reads them after the page it is about to paint, never before.
68
+ */
69
+ readonly snapshot: () => DisplayList;
70
+ };
71
+ declare const createDisplayListBuilder: ({ layout, blockLookup, metadata, pageBackground, documentFeatures, embeddedFonts, ...furniture }: BuildDisplayListOptions) => DisplayListBuilder;
72
+ /**
73
+ * The whole document's display list. Every page is built, so the tables, the
74
+ * outline and the gap report are complete; an editor that paints a window of
75
+ * pages uses {@link createDisplayListBuilder} instead.
76
+ */
77
+ declare const buildDisplayList: (options: BuildDisplayListOptions) => DisplayList;
78
+ //#endregion
79
+ export { BuildDisplayListOptions, DisplayListBuilder, DocumentFeatures, buildDisplayList, createDisplayListBuilder };
@@ -0,0 +1,283 @@
1
+ import { HIT_REGION_KINDS } from "../primitives.js";
2
+ import { AuthorColorTable } from "./buildContext.js";
3
+ import { DOC_CANVAS } from "./colors.js";
4
+ import { collectFloatingImages, pageGeometryOf } from "./floatingImages.js";
5
+ import { FontTable } from "./fontTable.js";
6
+ import { paintPageFurniture } from "./furniture.js";
7
+ import { ImageTable, paintImageFragment } from "./imagePrimitives.js";
8
+ import { paintColumnSeparators, paintPageBackground } from "./pageFurniture.js";
9
+ import { paintParagraphFragment } from "./paragraphPrimitives.js";
10
+ import { blockRegion, createPageComposer } from "./regions.js";
11
+ import { paintTableFragment } from "./tablePrimitives.js";
12
+ import { paintTextBoxFragment } from "./textBoxPrimitives.js";
13
+ import { UNSUPPORTED_CONSTRUCT, UnsupportedCollector } from "./unsupported.js";
14
+ //#region src/display-list/build/buildDisplayList.ts
15
+ /** Document-wide gaps are attributed to the first page, the only one certain to exist. */
16
+ const FIRST_PAGE_INDEX = 0;
17
+ /**
18
+ * Every feature a source document can have that a `Layout` does not record and
19
+ * that nothing on a page betrays, with the reason it paints nothing when the
20
+ * caller supplies neither the construct nor a flag denying it. The list is the
21
+ * single source of truth: {@link DocumentFeatures} is derived from it, so a
22
+ * feature added here cannot be left without a flag or without a reason.
23
+ *
24
+ * Footnote bodies and header/footer stories are deliberately absent: a page
25
+ * that carries them says so itself (`footnoteIds`, `headerFooterRefs`), so
26
+ * their gaps are reported per page from the layout rather than from a
27
+ * document-wide flag the caller would have to remember to set.
28
+ */
29
+ const DOCUMENT_FEATURE_GAPS = [["pageBorders", "w:pgBorders reach the painter through render options, not through Layout, and none were supplied to the builder"], ["watermark", "watermarks reach the painter through render options, not through Layout, and none was supplied to the builder"]];
30
+ const paragraphTextOf = (block) => block.runs.map((run) => run.kind === "text" ? run.text : "").join("").trim();
31
+ /**
32
+ * Resolve everything that needs the whole document before any page is painted:
33
+ * where each bookmark lands (a `#name` hyperlink cannot become a page target
34
+ * until then) and the heading outline.
35
+ */
36
+ const collectDocumentTargets = (layout, blockLookup) => {
37
+ const bookmarkTargets = /* @__PURE__ */ new Map();
38
+ const outline = [];
39
+ for (const [pageIndex, page] of layout.pages.entries()) for (const fragment of page.fragments) {
40
+ if (fragment.kind !== "paragraph") continue;
41
+ const block = blockLookup.get(String(fragment.blockId))?.block;
42
+ if (block?.kind !== "paragraph") continue;
43
+ for (const name of block.bookmarks ?? []) if (!bookmarkTargets.has(name)) bookmarkTargets.set(name, {
44
+ kind: "page",
45
+ pageIndex,
46
+ yPx: fragment.y
47
+ });
48
+ const level = block.attrs?.outlineLevel;
49
+ if (level !== void 0 && fragment.continuesFromPrev !== true) {
50
+ const title = paragraphTextOf(block);
51
+ if (title.length > 0) outline.push({
52
+ title,
53
+ level,
54
+ pageIndex,
55
+ yPx: fragment.y
56
+ });
57
+ }
58
+ }
59
+ return {
60
+ bookmarkTargets,
61
+ outline
62
+ };
63
+ };
64
+ const bordersOfNeighbour = (entry) => entry?.block.kind === "paragraph" ? entry.block.attrs?.borders : void 0;
65
+ const paintFragment = ({ fragment, entry, context, composer, prevEntry, nextEntry }) => {
66
+ const { block, measure } = entry;
67
+ const mismatch = () => {
68
+ context.unsupported.report(UNSUPPORTED_CONSTRUCT.measureMismatch, context.pageIndex, `${fragment.kind} fragment ${String(fragment.blockId)} has a ${block.kind} block and a ${measure.kind} measure`);
69
+ };
70
+ switch (fragment.kind) {
71
+ case "paragraph": {
72
+ if (block.kind !== "paragraph" || measure.kind !== "paragraph") {
73
+ mismatch();
74
+ return;
75
+ }
76
+ const prevBorders = bordersOfNeighbour(prevEntry);
77
+ const nextBorders = bordersOfNeighbour(nextEntry);
78
+ paintParagraphFragment({
79
+ fragment,
80
+ block,
81
+ measure,
82
+ context,
83
+ composer,
84
+ ...prevBorders === void 0 ? {} : { prevBorders },
85
+ ...nextBorders === void 0 ? {} : { nextBorders }
86
+ });
87
+ return;
88
+ }
89
+ case "table":
90
+ if (block.kind === "table" && measure.kind === "table") {
91
+ paintTableFragment({
92
+ fragment,
93
+ block,
94
+ measure,
95
+ context,
96
+ composer,
97
+ paintTextBox: paintTextBoxFragment
98
+ });
99
+ return;
100
+ }
101
+ mismatch();
102
+ return;
103
+ case "image":
104
+ if (block.kind === "image") {
105
+ composer.push(paintImageFragment(fragment, block, context));
106
+ return;
107
+ }
108
+ mismatch();
109
+ return;
110
+ case "textBox":
111
+ if (block.kind === "textBox" && measure.kind === "textBox") {
112
+ paintTextBoxFragment({
113
+ composer,
114
+ fragment,
115
+ block,
116
+ measure,
117
+ context
118
+ });
119
+ return;
120
+ }
121
+ mismatch();
122
+ return;
123
+ default: {
124
+ const unreachable = fragment;
125
+ context.unsupported.report(UNSUPPORTED_CONSTRUCT.fragmentKind, context.pageIndex, `fragment kind ${JSON.stringify(unreachable)} has no builder`);
126
+ }
127
+ }
128
+ };
129
+ const buildPage = ({ page, pageIndex, totalPages, blockLookup, pageBackground, bookmarkTargets, fonts, images, unsupported, authorColors, furniture }) => {
130
+ const links = [];
131
+ const context = {
132
+ fonts,
133
+ images,
134
+ unsupported,
135
+ authorColors,
136
+ links,
137
+ bookmarkTargets,
138
+ story: { kind: "body" },
139
+ pageIndex,
140
+ pageNumber: page.logicalNumber,
141
+ totalPages
142
+ };
143
+ const entries = page.fragments.map((fragment) => blockLookup.get(String(fragment.blockId)));
144
+ const geometry = pageGeometryOf(page);
145
+ const placedFloats = /* @__PURE__ */ new Set();
146
+ const behindFloats = [];
147
+ const frontFloats = [];
148
+ for (const [index, fragment] of page.fragments.entries()) {
149
+ const block = entries[index]?.block;
150
+ if (fragment.kind !== "paragraph" || block?.kind !== "paragraph") continue;
151
+ for (const placement of collectFloatingImages({
152
+ block,
153
+ fragmentYPx: fragment.y,
154
+ geometry,
155
+ context,
156
+ placed: placedFloats
157
+ })) (placement.behindDoc ? behindFloats : frontFloats).push(...placement.primitives);
158
+ }
159
+ const { behind, above } = paintPageFurniture({
160
+ page,
161
+ furniture,
162
+ context
163
+ });
164
+ const composer = createPageComposer();
165
+ composer.push([
166
+ paintPageBackground(page, pageBackground),
167
+ ...behind,
168
+ ...behindFloats
169
+ ]);
170
+ composer.region({
171
+ kind: HIT_REGION_KINDS.pageContent,
172
+ rect: {
173
+ xPx: page.margins.left,
174
+ yPx: page.margins.top,
175
+ widthPx: page.size.w - page.margins.left - page.margins.right,
176
+ heightPx: page.size.h - page.margins.top - page.margins.bottom
177
+ }
178
+ }, () => {
179
+ for (const [index, fragment] of page.fragments.entries()) {
180
+ const entry = entries[index];
181
+ if (!entry) {
182
+ unsupported.report(UNSUPPORTED_CONSTRUCT.missingBlock, pageIndex, `no block lookup entry for ${fragment.kind} fragment ${String(fragment.blockId)}`);
183
+ continue;
184
+ }
185
+ composer.region(blockRegion({
186
+ fragment,
187
+ kind: FRAGMENT_REGION_KIND[fragment.kind],
188
+ context
189
+ }), () => {
190
+ paintFragment({
191
+ fragment,
192
+ entry,
193
+ context,
194
+ composer,
195
+ prevEntry: entries[index - 1],
196
+ nextEntry: entries[index + 1]
197
+ });
198
+ });
199
+ }
200
+ });
201
+ composer.push(frontFloats);
202
+ composer.push(paintColumnSeparators(page));
203
+ above(composer);
204
+ return {
205
+ pageNumber: page.number,
206
+ widthPx: page.size.w,
207
+ heightPx: page.size.h,
208
+ orientation: page.orientation ?? (page.size.w > page.size.h ? "landscape" : "portrait"),
209
+ primitives: composer.primitives(),
210
+ regions: composer.regions(),
211
+ links
212
+ };
213
+ };
214
+ /** Which kind of region a fragment paints into. */
215
+ const FRAGMENT_REGION_KIND = {
216
+ paragraph: HIT_REGION_KINDS.paragraph,
217
+ table: HIT_REGION_KINDS.table,
218
+ image: HIT_REGION_KINDS.image,
219
+ textBox: HIT_REGION_KINDS.textBox
220
+ };
221
+ /** Whether the caller handed over the construct this document-wide gap names. */
222
+ const SUPPLIED_BY = {
223
+ pageBorders: (furniture) => furniture.pageBorders !== void 0,
224
+ watermark: (furniture) => furniture.watermark !== void 0 || furniture.watermarkByHeaderRId !== void 0
225
+ };
226
+ const createDisplayListBuilder = ({ layout, blockLookup, metadata, pageBackground, documentFeatures, embeddedFonts, ...furniture }) => {
227
+ const fonts = new FontTable(embeddedFonts ?? []);
228
+ const images = new ImageTable();
229
+ const unsupported = new UnsupportedCollector();
230
+ const authorColors = new AuthorColorTable();
231
+ const { bookmarkTargets, outline } = collectDocumentTargets(layout, blockLookup);
232
+ if (layout.pages.length > 0) for (const [feature, detail] of DOCUMENT_FEATURE_GAPS) {
233
+ if (SUPPLIED_BY[feature](furniture)) continue;
234
+ if (documentFeatures !== void 0 && !documentFeatures[feature]) continue;
235
+ unsupported.report(UNSUPPORTED_CONSTRUCT[feature], FIRST_PAGE_INDEX, detail);
236
+ }
237
+ const built = /* @__PURE__ */ new Map();
238
+ const pageAt = (pageIndex) => {
239
+ const existing = built.get(pageIndex);
240
+ if (existing !== void 0) return existing;
241
+ const page = layout.pages[pageIndex];
242
+ if (page === void 0) return;
243
+ const display = buildPage({
244
+ page,
245
+ pageIndex,
246
+ totalPages: layout.pages.length,
247
+ blockLookup,
248
+ pageBackground: pageBackground ?? DOC_CANVAS,
249
+ bookmarkTargets,
250
+ fonts,
251
+ images,
252
+ unsupported,
253
+ authorColors,
254
+ furniture
255
+ });
256
+ built.set(pageIndex, display);
257
+ return display;
258
+ };
259
+ return {
260
+ pageCount: layout.pages.length,
261
+ pageAt,
262
+ snapshot: () => ({
263
+ pages: [...built.entries()].sort(([left], [right]) => left - right).map(([, page]) => page),
264
+ fonts: fonts.snapshot(),
265
+ images: images.snapshot(),
266
+ outline,
267
+ metadata: metadata ?? {},
268
+ unsupported: unsupported.snapshot()
269
+ })
270
+ };
271
+ };
272
+ /**
273
+ * The whole document's display list. Every page is built, so the tables, the
274
+ * outline and the gap report are complete; an editor that paints a window of
275
+ * pages uses {@link createDisplayListBuilder} instead.
276
+ */
277
+ const buildDisplayList = (options) => {
278
+ const builder = createDisplayListBuilder(options);
279
+ for (let pageIndex = 0; pageIndex < builder.pageCount; pageIndex += 1) builder.pageAt(pageIndex);
280
+ return builder.snapshot();
281
+ };
282
+ //#endregion
283
+ export { buildDisplayList, createDisplayListBuilder };
@@ -0,0 +1,20 @@
1
+ import { DisplayColor } from "../types.js";
2
+ //#region src/display-list/build/colors.d.ts
3
+ /**
4
+ * The editor's document custom properties, materialised. A PDF has no theme
5
+ * and no stylesheet: `--doc-canvas` is the paper, `--doc-canvas-text` the ink,
6
+ * `--suggestion-color` the AI-proposal hue (`renderParagraph.ts`'s
7
+ * `SUGGESTION_COLOR_CSS` fallback).
8
+ */
9
+ declare const DOC_CANVAS: DisplayColor;
10
+ declare const DOC_CANVAS_TEXT: DisplayColor;
11
+ declare const SUGGESTION_COLOR: DisplayColor;
12
+ declare const TRANSPARENT: DisplayColor;
13
+ /**
14
+ * Resolve an authored CSS colour. Returns `undefined` for a value this module
15
+ * cannot turn into concrete channels (`color-mix()`, `oklch()`, an unknown
16
+ * name) so the caller can report it rather than paint a guess.
17
+ */
18
+ declare const parseDisplayColor: (color: string | undefined) => DisplayColor | undefined;
19
+ //#endregion
20
+ export { DOC_CANVAS, DOC_CANVAS_TEXT, SUGGESTION_COLOR, TRANSPARENT, parseDisplayColor };