@stll/folio-core 0.28.1 → 0.30.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 (125) hide show
  1. package/dist/controller/folioEditor.d.ts +28 -1
  2. package/dist/controller/folioEditor.js +37 -26
  3. package/dist/controller/fontReadiness.js +28 -24
  4. package/dist/controller/hiddenEditorManager.d.ts +2 -7
  5. package/dist/controller/layoutPipeline.js +33 -3
  6. package/dist/controller/noteEditorManager.d.ts +3 -6
  7. package/dist/docx/metafileSvg.d.ts +12 -0
  8. package/dist/docx/metafileSvg.js +462 -0
  9. package/dist/docx/paragraphTextBoxEnrichment.js +55 -4
  10. package/dist/docx/parser.d.ts +2 -2
  11. package/dist/docx/parser.js +26 -0
  12. package/dist/docx/runParser.js +2 -1
  13. package/dist/docx/serializer/runSerializer.js +14 -2
  14. package/dist/docx/styleParser.js +2 -1
  15. package/dist/docx/textBoxParser.js +14 -0
  16. package/dist/docx/vmlImageParser.js +72 -152
  17. package/dist/docx/vmlPreview.d.ts +31 -0
  18. package/dist/docx/vmlPreview.js +535 -0
  19. package/dist/docx/wrapTypes.d.ts +2 -36
  20. package/dist/docx/wrapTypes.js +1 -39
  21. package/dist/fonts/fontAlternates.d.ts +8 -0
  22. package/dist/fonts/fontAlternates.js +16 -0
  23. package/dist/layout-bridge/convert/footnoteLayout.d.ts +1 -0
  24. package/dist/layout-bridge/convert/footnoteLayout.js +34 -3
  25. package/dist/layout-bridge/convert/headerFooterLayout.d.ts +1 -0
  26. package/dist/layout-bridge/convert/headerFooterLayout.js +5 -0
  27. package/dist/layout-bridge/convert/toFlowBlocks.d.ts +4 -2
  28. package/dist/layout-bridge/convert/toFlowBlocks.js +136 -120
  29. package/dist/layout-bridge/dom/noteStoryDom.d.ts +1 -1
  30. package/dist/layout-bridge/engine/selectionRects.js +3 -1
  31. package/dist/layout-engine/index.js +65 -32
  32. package/dist/layout-engine/justifiedLineFit.d.ts +7 -0
  33. package/dist/layout-engine/justifiedLineFit.js +6 -0
  34. package/dist/layout-engine/keep-together.js +15 -10
  35. package/dist/layout-engine/measure/complexScriptFormatting.d.ts +6 -1
  36. package/dist/layout-engine/measure/complexScriptFormatting.js +11 -2
  37. package/dist/layout-engine/measure/floatingTablePosition.d.ts +16 -1
  38. package/dist/layout-engine/measure/floatingTablePosition.js +29 -6
  39. package/dist/layout-engine/measure/lineBreakProvider.js +67 -8
  40. package/dist/layout-engine/measure/listMarkerWidth.d.ts +1 -0
  41. package/dist/layout-engine/measure/listMarkerWidth.js +23 -10
  42. package/dist/layout-engine/measure/measureBlocks.d.ts +15 -0
  43. package/dist/layout-engine/measure/measureBlocks.js +197 -30
  44. package/dist/layout-engine/measure/measureContainer.js +20 -24
  45. package/dist/layout-engine/measure/measureHelpers.d.ts +1 -1
  46. package/dist/layout-engine/measure/measureHelpers.js +14 -8
  47. package/dist/layout-engine/measure/measureParagraph.js +111 -37
  48. package/dist/layout-engine/measure/measureTypes.d.ts +3 -0
  49. package/dist/layout-engine/measure/tabCalculator.d.ts +123 -0
  50. package/dist/layout-engine/measure/tabCalculator.js +144 -0
  51. package/dist/layout-engine/measure/tableCellFlow.d.ts +21 -1
  52. package/dist/layout-engine/measure/tableCellFlow.js +45 -8
  53. package/dist/layout-engine/measure/tableInlinePlacement.d.ts +10 -2
  54. package/dist/layout-engine/measure/tableInlinePlacement.js +17 -15
  55. package/dist/layout-engine/paginator.d.ts +26 -2
  56. package/dist/layout-engine/paginator.js +76 -14
  57. package/dist/layout-engine/paragraphSpacing.d.ts +3 -1
  58. package/dist/layout-engine/paragraphSpacing.js +4 -3
  59. package/dist/layout-engine/renderedBreakReconciliation.d.ts +14 -3
  60. package/dist/layout-engine/renderedBreakReconciliation.js +45 -14
  61. package/dist/layout-engine/section-breaks.d.ts +3 -1
  62. package/dist/layout-engine/section-breaks.js +6 -2
  63. package/dist/layout-engine/types.d.ts +18 -1
  64. package/dist/layout-engine/types.js +1 -1
  65. package/dist/layout-painter/imageLayout.d.ts +1 -1
  66. package/dist/layout-painter/renderPage.js +6 -1
  67. package/dist/layout-painter/renderParagraph.js +169 -82
  68. package/dist/layout-painter/renderTable.d.ts +1 -1
  69. package/dist/layout-painter/renderTable.js +18 -7
  70. package/dist/layout-painter/renderTextBox.d.ts +1 -1
  71. package/dist/layout-painter/renderTextBox.js +6 -1
  72. package/dist/markdown/renderParagraph.js +7 -2
  73. package/dist/model.d.ts +3 -3
  74. package/dist/model.js +2 -2
  75. package/dist/paged-layout/sectionBlockWidths.d.ts +14 -0
  76. package/dist/paged-layout/sectionBlockWidths.js +103 -14
  77. package/dist/prosemirror/attrs/index.js +14 -2
  78. package/dist/prosemirror/bookmarkBoundaryAttrs.d.ts +8 -0
  79. package/dist/prosemirror/bookmarkBoundaryAttrs.js +66 -0
  80. package/dist/prosemirror/conversion/fromProseDoc.js +176 -54
  81. package/dist/prosemirror/conversion/toProseDoc.js +179 -64
  82. package/dist/prosemirror/extensions/StarterKit.js +11 -3
  83. package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.js +8 -4
  84. package/dist/prosemirror/extensions/features/PasteCleanupExtension.d.ts +4 -1
  85. package/dist/prosemirror/extensions/features/PasteCleanupExtension.js +9 -5
  86. package/dist/prosemirror/extensions/features/pasteCleanup.d.ts +10 -23
  87. package/dist/prosemirror/extensions/features/pasteCleanup.js +77 -22
  88. package/dist/prosemirror/extensions/marks/CharacterSpacingExtension.js +9 -5
  89. package/dist/prosemirror/extensions/nodes/BookmarkBoundaryExtension.d.ts +9 -0
  90. package/dist/prosemirror/extensions/nodes/BookmarkBoundaryExtension.js +67 -0
  91. package/dist/prosemirror/extensions/nodes/FieldExtension.d.ts +10 -4
  92. package/dist/prosemirror/extensions/nodes/FieldExtension.js +77 -59
  93. package/dist/prosemirror/extensions/nodes/TableExtension.js +2 -0
  94. package/dist/prosemirror/extensions/nodes/TextBoxAnchorExtension.d.ts +4 -1
  95. package/dist/prosemirror/extensions/nodes/TextBoxAnchorExtension.js +4 -3
  96. package/dist/prosemirror/extensions/nodes/TextBoxExtension.js +6 -2
  97. package/dist/prosemirror/listMarker.d.ts +58 -0
  98. package/dist/prosemirror/listMarker.js +185 -0
  99. package/dist/prosemirror/numberedRefFields.d.ts +24 -0
  100. package/dist/prosemirror/numberedRefFields.js +276 -0
  101. package/dist/prosemirror/paraText.js +56 -17
  102. package/dist/prosemirror/plugins/anonymizationDecorations.js +1 -1
  103. package/dist/prosemirror/plugins/pmTextScan.d.ts +3 -1
  104. package/dist/prosemirror/plugins/pmTextScan.js +28 -7
  105. package/dist/prosemirror/plugins/templateDirectives.js +2 -2
  106. package/dist/prosemirror/schema/index.d.ts +2 -2
  107. package/dist/prosemirror/schema/nodes.d.ts +17 -1
  108. package/dist/prosemirror/utils/tabCalculator.d.ts +2 -123
  109. package/dist/prosemirror/utils/tabCalculator.js +1 -140
  110. package/dist/prosemirror/validation.js +93 -0
  111. package/dist/render-dom/RemoteSelectionOverlay.d.ts +4 -4
  112. package/dist/types/documentEnumValues.d.ts +4 -1
  113. package/dist/types/documentEnumValues.js +12 -1
  114. package/dist/types/editor-story.d.ts +8 -0
  115. package/dist/types/editor-story.js +0 -0
  116. package/dist/types/remote-selection.d.ts +11 -0
  117. package/dist/types/remote-selection.js +0 -0
  118. package/dist/types/wrap.d.ts +36 -0
  119. package/dist/types/wrap.js +40 -0
  120. package/dist/utils/fontResolver.d.ts +1 -1
  121. package/dist/utils/fontResolver.js +42 -2
  122. package/dist/utils/formatToStyle.js +4 -2
  123. package/dist/utils/horizontalScale.d.ts +28 -0
  124. package/dist/utils/horizontalScale.js +42 -0
  125. package/package.json +2 -2
@@ -71,7 +71,7 @@ const scanDirectives = (doc) => {
71
71
  const last = chunks.at(-1);
72
72
  ranges.push({
73
73
  from: chunks[0]?.start ?? 0,
74
- to: last ? last.start + last.text.length : 0,
74
+ to: last ? last.end ?? last.start + last.text.length : 0,
75
75
  kind: sole.meta.kind,
76
76
  expr: directiveExpr(sole.meta),
77
77
  block: true
@@ -82,7 +82,7 @@ const scanDirectives = (doc) => {
82
82
  const clauseVersion = marker.meta.kind === "clause" ? marker.meta.version : void 0;
83
83
  ranges.push({
84
84
  from: offsetToDocPos(chunks, marker.start),
85
- to: offsetToDocPos(chunks, marker.end),
85
+ to: offsetToDocPos(chunks, marker.end, "end"),
86
86
  kind: marker.meta.kind,
87
87
  expr: directiveExpr(marker.meta),
88
88
  block: false,
@@ -1,5 +1,5 @@
1
1
  import { CharacterSpacingAttrs, CharacterStyleAttrs, CommentAttrs, EmphasisMarkAttrs, FontFamilyAttrs, FontSizeAttrs, FootnoteRefAttrs, HighlightAttrs, HyperlinkAttrs, LanguageAttrs, RunFormattingOverrideAttrs, RunPropertyChangeMarkAttrs, RunShadingAttrs, StrikeAttrs, TextColorAttrs, TextEffectAttrs, TrackedChangeMarkAttrs, UnderlineAttrs } from "./marks.js";
2
- import { BlockSdtAttrs, FieldAttrs, HardBreakAttrs, ImageAttrs, ImagePositionAttrs, MathAttrs, ParagraphAttrs, ParagraphPropertyChangeAttrs, SdtAttrs, ShapeAttrs, SymbolAttrs, TabAttrs, TableAttrs, TableCellAttrs, TableRowAttrs, TextBoxAttrs } from "./nodes.js";
2
+ import { BlockSdtAttrs, BookmarkBoundaryAttrs, FieldAttrs, HardBreakAttrs, ImageAttrs, ImagePositionAttrs, MathAttrs, ParagraphAttrs, ParagraphPropertyChangeAttrs, SdtAttrs, ShapeAttrs, SymbolAttrs, TabAttrs, TableAttrs, TableCellAttrs, TableRowAttrs, TextBoxAttrs } from "./nodes.js";
3
3
  import { ExtensionManager } from "../extensions/ExtensionManager.js";
4
4
  //#region src/prosemirror/schema/index.d.ts
5
5
  declare const singletonManager: ExtensionManager;
@@ -11,4 +11,4 @@ type DocxSchema = typeof schema;
11
11
  type DocxNode = ReturnType<typeof schema.node>;
12
12
  type DocxMark = ReturnType<typeof schema.mark>;
13
13
  //#endregion
14
- export { type BlockSdtAttrs, type CharacterSpacingAttrs, type CharacterStyleAttrs, type CommentAttrs, DocxMark, DocxNode, DocxSchema, type EmphasisMarkAttrs, type FieldAttrs, type FontFamilyAttrs, type FontSizeAttrs, type FootnoteRefAttrs, type HardBreakAttrs, type HighlightAttrs, type HyperlinkAttrs, type ImageAttrs, type ImagePositionAttrs, type LanguageAttrs, type MathAttrs, type ParagraphAttrs, type ParagraphPropertyChangeAttrs, type RunFormattingOverrideAttrs, type RunPropertyChangeMarkAttrs, type RunShadingAttrs, type SdtAttrs, type ShapeAttrs, type StrikeAttrs, type SymbolAttrs, type TabAttrs, type TableAttrs, type TableCellAttrs, type TableRowAttrs, type TextBoxAttrs, type TextColorAttrs, type TextEffectAttrs, type TrackedChangeMarkAttrs, type UnderlineAttrs, schema, singletonManager };
14
+ export { type BlockSdtAttrs, type BookmarkBoundaryAttrs, type CharacterSpacingAttrs, type CharacterStyleAttrs, type CommentAttrs, DocxMark, DocxNode, DocxSchema, type EmphasisMarkAttrs, type FieldAttrs, type FontFamilyAttrs, type FontSizeAttrs, type FootnoteRefAttrs, type HardBreakAttrs, type HighlightAttrs, type HyperlinkAttrs, type ImageAttrs, type ImagePositionAttrs, type LanguageAttrs, type MathAttrs, type ParagraphAttrs, type ParagraphPropertyChangeAttrs, type RunFormattingOverrideAttrs, type RunPropertyChangeMarkAttrs, type RunShadingAttrs, type SdtAttrs, type ShapeAttrs, type StrikeAttrs, type SymbolAttrs, type TabAttrs, type TableAttrs, type TableCellAttrs, type TableRowAttrs, type TextBoxAttrs, type TextColorAttrs, type TextEffectAttrs, type TrackedChangeMarkAttrs, type UnderlineAttrs, schema, singletonManager };
@@ -15,6 +15,16 @@ type SymbolAttrs = {
15
15
  font: string;
16
16
  char: string;
17
17
  };
18
+ type BookmarkBoundaryAttrs = {
19
+ type: "start";
20
+ id: number;
21
+ name: string;
22
+ colFirst?: number;
23
+ colLast?: number;
24
+ } | {
25
+ type: "end";
26
+ id: number;
27
+ };
18
28
  /**
19
29
  * Paragraph node attributes - maps to ParagraphFormatting
20
30
  */
@@ -292,6 +302,8 @@ type FieldAttrs = {
292
302
  instruction: string;
293
303
  /** Current/cached display text */
294
304
  displayText: string;
305
+ /** Imported cache that proved numbered REF resolution for this field. */
306
+ _numberedRefBaseline?: string;
295
307
  /** Whether the field came from w:fldSimple or a complex fldChar range */
296
308
  fieldKind: "simple" | "complex";
297
309
  /** Field is locked */
@@ -559,6 +571,8 @@ type TableAttrs = {
559
571
  borders?: document_d_exports.TableBorders;
560
572
  /** Effective table indent after style resolution. PM-only; never serialized. */
561
573
  _resolvedIndent?: NonNullable<document_d_exports.TableFormatting["indent"]>;
574
+ /** Style-derived table justification fallback. PM-only; never serialized. */
575
+ _resolvedJustification?: NonNullable<document_d_exports.TableFormatting["justification"]>;
562
576
  /** Effective table direction after style resolution. PM-only; never serialized. */
563
577
  _resolvedBidi?: boolean;
564
578
  /** Original table formatting from DOCX for lossless round-trip serialization */
@@ -584,6 +598,8 @@ type TableRowAttrs = {
584
598
  isHeader?: boolean;
585
599
  /** Whether the row is hidden (`w:hidden`) */
586
600
  hidden?: boolean;
601
+ /** Style-derived row justification fallback. PM-only; never serialized. */
602
+ _resolvedJustification?: NonNullable<document_d_exports.TableRowFormatting["justification"]>;
587
603
  /** Original row formatting from DOCX for lossless round-trip serialization */
588
604
  _originalFormatting?: document_d_exports.TableRowFormatting;
589
605
  /** Tracked row property changes (w:trPrChange) for round-trip + accept/reject */
@@ -706,4 +722,4 @@ type TableCellAttrs = {
706
722
  _docxVMergeContinuationCells?: document_d_exports.TableCell[];
707
723
  };
708
724
  //#endregion
709
- export { BlockSdtAttrs, FieldAttrs, HardBreakAttrs, ImageAttrs, ImagePositionAttrs, MathAttrs, ParagraphAttrs, ParagraphPropertyChangeAttrs, SdtAttrs, ShapeAttrs, SuggestedStructuralMarker, SymbolAttrs, TabAttrs, TableAttrs, TableCellAttrs, TableRowAttrs, TextBoxAnchorAttrs, TextBoxAttrs };
725
+ export { BlockSdtAttrs, BookmarkBoundaryAttrs, FieldAttrs, HardBreakAttrs, ImageAttrs, ImagePositionAttrs, MathAttrs, ParagraphAttrs, ParagraphPropertyChangeAttrs, SdtAttrs, ShapeAttrs, SuggestedStructuralMarker, SymbolAttrs, TabAttrs, TableAttrs, TableCellAttrs, TableRowAttrs, TextBoxAnchorAttrs, TextBoxAttrs };
@@ -1,123 +1,2 @@
1
- //#region src/prosemirror/utils/tabCalculator.d.ts
2
- /**
3
- * Tab Width Calculator
4
- *
5
- * Computes tab widths based on position and tab stops.
6
- * Follows OOXML tab stop semantics:
7
- * - Default tab interval: 720 twips (0.5 inch, 48px at 96dpi)
8
- * - Tab stops can be start (left), end (right), center, decimal, or bar
9
- * - Explicit tab stops override default stops
10
- *
11
- * Based on ECMA-376 specification and clean-room understanding of tab layout.
12
- */
13
- /**
14
- * Tab alignment types
15
- */
16
- type TabAlignment = "start" | "end" | "center" | "decimal" | "bar" | "clear";
17
- /**
18
- * Tab leader (fill character) types
19
- */
20
- type TabLeader = "none" | "dot" | "hyphen" | "underscore" | "middleDot" | "heavy";
21
- /**
22
- * Tab stop definition
23
- */
24
- type TabStop = {
25
- /** Tab alignment mode */
26
- val: TabAlignment;
27
- /** Position in twips from left margin */
28
- pos: number;
29
- /** Optional leader character */
30
- leader?: TabLeader;
31
- };
32
- /**
33
- * Context for tab calculations
34
- */
35
- type TabContext = {
36
- /** Explicit tab stops from paragraph or style */
37
- explicitStops?: TabStop[];
38
- /** Default tab interval in twips (default: 720 = 0.5 inch) */
39
- defaultTabInterval?: number;
40
- /** Left indent in twips */
41
- leftIndent?: number;
42
- };
43
- /**
44
- * Result of tab width calculation
45
- */
46
- type TabWidthResult = {
47
- /** Width of the tab in pixels */
48
- width: number;
49
- /** Leader character to render (if any) */
50
- leader?: TabLeader;
51
- /** Alignment that was applied */
52
- alignment: TabAlignment | "default";
53
- };
54
- /** Default tab interval: 720 twips = 0.5 inch */
55
- declare const DEFAULT_TAB_INTERVAL_TWIPS = 720;
56
- /** Twips per inch */
57
- declare const TWIPS_PER_INCH = 1440;
58
- /** Pixels per inch (96 dpi standard for CSS) */
59
- declare const PIXELS_PER_INCH = 96;
60
- /**
61
- * Convert twips to pixels
62
- * @param twips - Value in twips (1/1440 inch)
63
- * @returns Value in pixels (at 96 dpi)
64
- */
65
- declare function twipsToPixels(twips: number): number;
66
- /**
67
- * Convert pixels to twips
68
- * @param pixels - Value in pixels (at 96 dpi)
69
- * @returns Value in twips (1/1440 inch)
70
- */
71
- declare function pixelsToTwips(pixels: number): number;
72
- /**
73
- * Compute the list of effective tab stops for a paragraph
74
- *
75
- * Merges explicit stops with default stops at regular intervals.
76
- * Explicit stops before the left indent remain available to a hanging first
77
- * line. Continuation lines naturally skip them because their cursor already
78
- * starts at the left indent.
79
- *
80
- * @param context - Tab context with explicit stops and settings
81
- * @returns Sorted array of tab stops in twips
82
- */
83
- declare function computeTabStops(context: TabContext): TabStop[];
84
- /**
85
- * Pixel widths of the content after a tab, needed to position non-left stops.
86
- *
87
- * Caller measures its own runs (the painter and the layout measurer have
88
- * different run models and measurement paths) and passes the result here, so
89
- * this module owns the stop grid + alignment math without owning measurement.
90
- */
91
- type TabFollowingContent = {
92
- /** Total width of the runs after the tab. Used for `end` and `center` stops. */
93
- followingWidth?: number;
94
- /** Width of the content before the decimal separator. Used for `decimal` stops. */
95
- decimalPrefixWidth?: number;
96
- };
97
- /**
98
- * Calculate the width of a tab character.
99
- *
100
- * Finds the next tab stop after the current position and computes the width
101
- * needed to reach it. For `end`/`center`/`decimal` stops the content after the
102
- * tab is anchored against the stop, so the caller supplies its measured width
103
- * via {@link TabFollowingContent}.
104
- *
105
- * @param currentXPx - Current horizontal position in pixels (from the content
106
- * area's left edge — the same origin tab stop positions are measured from)
107
- * @param context - Tab context with stops and settings
108
- * @param following - Measured widths of the content after the tab
109
- * @returns Tab width result with width in pixels
110
- */
111
- declare function calculateTabWidth(currentXPx: number, context: TabContext, following?: TabFollowingContent): TabWidthResult;
112
- /**
113
- * Calculate tab width with simple default stops
114
- *
115
- * Simplified version for basic tab rendering without explicit stops.
116
- * Uses the default 0.5 inch (48px) tab interval.
117
- *
118
- * @param currentXPx - Current horizontal position in pixels
119
- * @returns Width of the tab in pixels
120
- */
121
- declare function calculateSimpleTabWidth(currentXPx: number): number;
122
- //#endregion
123
- export { DEFAULT_TAB_INTERVAL_TWIPS, PIXELS_PER_INCH, TWIPS_PER_INCH, TabAlignment, TabContext, TabFollowingContent, TabLeader, TabStop, TabWidthResult, calculateSimpleTabWidth, calculateTabWidth, computeTabStops, pixelsToTwips, twipsToPixels };
1
+ import { DEFAULT_TAB_INTERVAL_TWIPS, PIXELS_PER_INCH, TWIPS_PER_INCH, TabAlignment, TabContext, TabFollowingContent, TabLeader, TabStop, TabWidthResult, calculateSimpleTabWidth, calculateTabWidth, computeTabStops, pixelsToTwips, twipsToPixels } from "../../layout-engine/measure/tabCalculator.js";
2
+ export { DEFAULT_TAB_INTERVAL_TWIPS, PIXELS_PER_INCH, TWIPS_PER_INCH, type TabAlignment, type TabContext, type TabFollowingContent, type TabLeader, type TabStop, type TabWidthResult, calculateSimpleTabWidth, calculateTabWidth, computeTabStops, pixelsToTwips, twipsToPixels };
@@ -1,141 +1,2 @@
1
- //#region src/prosemirror/utils/tabCalculator.ts
2
- /** Default tab interval: 720 twips = 0.5 inch */
3
- const DEFAULT_TAB_INTERVAL_TWIPS = 720;
4
- /** Twips per inch */
5
- const TWIPS_PER_INCH = 1440;
6
- /** Pixels per inch (96 dpi standard for CSS) */
7
- const PIXELS_PER_INCH = 96;
8
- /** Ignore sub-twip round trips when the cursor already occupies a tab stop. */
9
- const TAB_POSITION_EPSILON_TWIPS = .01;
10
- /**
11
- * Convert twips to pixels
12
- * @param twips - Value in twips (1/1440 inch)
13
- * @returns Value in pixels (at 96 dpi)
14
- */
15
- function twipsToPixels(twips) {
16
- return twips / TWIPS_PER_INCH * 96;
17
- }
18
- /**
19
- * Convert pixels to twips
20
- * @param pixels - Value in pixels (at 96 dpi)
21
- * @returns Value in twips (1/1440 inch)
22
- */
23
- function pixelsToTwips(pixels) {
24
- return pixels / 96 * TWIPS_PER_INCH;
25
- }
26
- /**
27
- * Compute the list of effective tab stops for a paragraph
28
- *
29
- * Merges explicit stops with default stops at regular intervals.
30
- * Explicit stops before the left indent remain available to a hanging first
31
- * line. Continuation lines naturally skip them because their cursor already
32
- * starts at the left indent.
33
- *
34
- * @param context - Tab context with explicit stops and settings
35
- * @returns Sorted array of tab stops in twips
36
- */
37
- function computeTabStops(context) {
38
- const { explicitStops = [], defaultTabInterval = 720, leftIndent = 0 } = context;
39
- const validExplicitStops = explicitStops.filter((stop) => stop.val !== "clear" && stop.val !== "bar");
40
- const clearPositions = explicitStops.filter((stop) => stop.val === "clear").map((stop) => stop.pos);
41
- let maxExplicit = 0;
42
- for (const stop of validExplicitStops) maxExplicit = Math.max(maxExplicit, stop.pos);
43
- const stops = explicitStops.filter((stop) => stop.val !== "clear");
44
- const hasLeftIndentClear = clearPositions.some((p) => Math.abs(p - leftIndent) < 20);
45
- const addsImplicitLeftIndent = leftIndent > 0 && !hasLeftIndentClear && !validExplicitStops.some((stop) => stop.pos <= leftIndent);
46
- if (addsImplicitLeftIndent) stops.push({
47
- val: "start",
48
- pos: leftIndent,
49
- leader: "none"
50
- });
51
- let pos = Math.floor(Math.max(maxExplicit, leftIndent) / defaultTabInterval) * defaultTabInterval;
52
- const limitPos = leftIndent + 14400;
53
- while (pos < limitPos) {
54
- pos += defaultTabInterval;
55
- let hasExplicitStop = false;
56
- for (const stop of stops) if (Math.abs(stop.pos - pos) < 20) {
57
- hasExplicitStop = true;
58
- break;
59
- }
60
- let hasClearStop = false;
61
- for (const clearPos of clearPositions) if (Math.abs(clearPos - pos) < 20) {
62
- hasClearStop = true;
63
- break;
64
- }
65
- const isAtLeftIndent = addsImplicitLeftIndent && Math.abs(pos - leftIndent) < 20;
66
- if (!hasExplicitStop && !hasClearStop && !isAtLeftIndent) stops.push({
67
- val: "start",
68
- pos,
69
- leader: "none"
70
- });
71
- }
72
- return stops.toSorted((a, b) => a.pos - b.pos);
73
- }
74
- /**
75
- * Calculate the width of a tab character.
76
- *
77
- * Finds the next tab stop after the current position and computes the width
78
- * needed to reach it. For `end`/`center`/`decimal` stops the content after the
79
- * tab is anchored against the stop, so the caller supplies its measured width
80
- * via {@link TabFollowingContent}.
81
- *
82
- * @param currentXPx - Current horizontal position in pixels (from the content
83
- * area's left edge — the same origin tab stop positions are measured from)
84
- * @param context - Tab context with stops and settings
85
- * @param following - Measured widths of the content after the tab
86
- * @returns Tab width result with width in pixels
87
- */
88
- function calculateTabWidth(currentXPx, context, following = {}) {
89
- const { defaultTabInterval = 720 } = context;
90
- const currentXTwips = pixelsToTwips(currentXPx);
91
- const nextStop = computeTabStops(context).find((stop) => stop.pos > currentXTwips + TAB_POSITION_EPSILON_TWIPS);
92
- if (!nextStop) {
93
- const defaultTabPx = twipsToPixels(defaultTabInterval);
94
- let tabWidth = defaultTabPx - currentXPx % defaultTabPx;
95
- if (tabWidth <= 0) tabWidth = defaultTabPx;
96
- return {
97
- width: tabWidth,
98
- alignment: "default"
99
- };
100
- }
101
- let width = twipsToPixels(nextStop.pos) - currentXPx;
102
- if (nextStop.val === "center") width -= (following.followingWidth ?? 0) / 2;
103
- else if (nextStop.val === "end") width -= following.followingWidth ?? 0;
104
- else if (nextStop.val === "decimal") width -= following.decimalPrefixWidth ?? 0;
105
- else if (nextStop.val === "bar") return {
106
- width: 0,
107
- ...nextStop.leader !== void 0 ? { leader: nextStop.leader } : {},
108
- alignment: "bar"
109
- };
110
- if (width <= 0) {
111
- const defaultTabPx = twipsToPixels(defaultTabInterval);
112
- let fallbackWidth = defaultTabPx - currentXPx % defaultTabPx;
113
- if (fallbackWidth <= 0) fallbackWidth = defaultTabPx;
114
- return {
115
- width: fallbackWidth,
116
- alignment: "default"
117
- };
118
- }
119
- return {
120
- width,
121
- ...nextStop.leader !== void 0 ? { leader: nextStop.leader } : {},
122
- alignment: nextStop.val
123
- };
124
- }
125
- /**
126
- * Calculate tab width with simple default stops
127
- *
128
- * Simplified version for basic tab rendering without explicit stops.
129
- * Uses the default 0.5 inch (48px) tab interval.
130
- *
131
- * @param currentXPx - Current horizontal position in pixels
132
- * @returns Width of the tab in pixels
133
- */
134
- function calculateSimpleTabWidth(currentXPx) {
135
- const defaultTabPx = twipsToPixels(720);
136
- let tabWidth = defaultTabPx - currentXPx % defaultTabPx;
137
- if (tabWidth < defaultTabPx / 4) tabWidth += defaultTabPx;
138
- return tabWidth;
139
- }
140
- //#endregion
1
+ import { DEFAULT_TAB_INTERVAL_TWIPS, PIXELS_PER_INCH, TWIPS_PER_INCH, calculateSimpleTabWidth, calculateTabWidth, computeTabStops, pixelsToTwips, twipsToPixels } from "../../layout-engine/measure/tabCalculator.js";
141
2
  export { DEFAULT_TAB_INTERVAL_TWIPS, PIXELS_PER_INCH, TWIPS_PER_INCH, calculateSimpleTabWidth, calculateTabWidth, computeTabStops, pixelsToTwips, twipsToPixels };
@@ -1,4 +1,5 @@
1
1
  import { readBlockSdtAttrs, readCharacterSpacingMarkAttrs, readCharacterStyleMarkAttrs, readCommentMarkAttrs, readEmphasisMarkAttrs, readFieldAttrs, readFontFamilyMarkAttrs, readFontSizeMarkAttrs, readFootnoteRefMarkAttrs, readHardBreakAttrs, readHighlightMarkAttrs, readHyperlinkMarkAttrs, readImageAttrs, readLanguageMarkAttrs, readMathAttrs, readParagraphAttrs, readRunFormattingOverrideMarkAttrs, readRunPropertyChangeMarkAttrs, readRunShadingMarkAttrs, readSdtAttrs, readShapeAttrs, readStrikeMarkAttrs, readSymbolAttrs, readTabAttrs, readTableAttrs, readTableCellAttrs, readTableRowAttrs, readTextBoxAttrs, readTextColorMarkAttrs, readTextEffectMarkAttrs, readTrackedChangeMarkAttrs, readUnderlineMarkAttrs } from "./attrs/index.js";
2
+ import { readBookmarkBoundaryAttrs } from "./bookmarkBoundaryAttrs.js";
2
3
  import { readTextBoxAnchorAttrs } from "./textBoxAnchorAttrs.js";
3
4
  //#region src/prosemirror/validation.ts
4
5
  var ProseMirrorDocumentValidationError = class extends Error {
@@ -18,11 +19,71 @@ const validateProseMirrorDocument = (doc) => {
18
19
  message: `Expected doc, got ${doc.type.name}.`
19
20
  });
20
21
  validateNode(doc, "doc", issues);
22
+ validateBookmarkBoundaryStructure(doc, issues);
21
23
  return {
22
24
  valid: issues.length === 0,
23
25
  issues
24
26
  };
25
27
  };
28
+ const validateBookmarkBoundaryStructure = (doc, issues) => {
29
+ const open = /* @__PURE__ */ new Map();
30
+ const startedIds = /* @__PURE__ */ new Set();
31
+ const registerStart = (id, path) => {
32
+ if (startedIds.has(id)) {
33
+ issues.push({
34
+ path,
35
+ message: `Bookmark id ${id} has more than one start boundary.`
36
+ });
37
+ return;
38
+ }
39
+ startedIds.add(id);
40
+ open.set(id, {
41
+ id,
42
+ path
43
+ });
44
+ };
45
+ const registerEnd = (id, path) => {
46
+ if (!open.get(id)) {
47
+ issues.push({
48
+ path,
49
+ message: `Bookmark id ${id} has no open start boundary.`
50
+ });
51
+ return;
52
+ }
53
+ open.delete(id);
54
+ };
55
+ const visit = (node, path) => {
56
+ const paragraphAttrs = node.type.name === "paragraph" ? readParagraphAttrs(node) : null;
57
+ if (paragraphAttrs?.ok) for (const [index, bookmark] of (paragraphAttrs.value.bookmarks ?? []).entries()) registerStart(bookmark.id, `${path}.paragraph.attrs.bookmarks[${index}]`);
58
+ if (node.type.name === "bookmarkBoundary") {
59
+ const result = readBookmarkBoundaryAttrs(node);
60
+ if (result.ok) {
61
+ const attrs = result.value;
62
+ const hasHyperlink = node.marks.some((mark) => mark.type.name === "hyperlink");
63
+ const trackedChanges = node.marks.filter((mark) => mark.type.name === "insertion" || mark.type.name === "deletion");
64
+ if (trackedChanges.length > 1) issues.push({
65
+ path,
66
+ message: "Bookmark boundaries cannot carry multiple tracked-change parents."
67
+ });
68
+ else if (trackedChanges.length === 1 && !hasHyperlink) issues.push({
69
+ path,
70
+ message: "Bookmark boundaries inside tracked changes require a hyperlink serialization parent."
71
+ });
72
+ if (attrs.type === "start") registerStart(attrs.id, path);
73
+ else registerEnd(attrs.id, path);
74
+ }
75
+ }
76
+ node.forEach((child, _offset, index) => {
77
+ visit(child, `${path}.content[${index}]`);
78
+ });
79
+ if (paragraphAttrs?.ok) for (const [index, bookmark] of (paragraphAttrs.value.bookmarks ?? []).entries()) registerEnd(bookmark.id, `${path}.paragraph.attrs.bookmarks[${index}]`);
80
+ };
81
+ visit(doc, "doc");
82
+ for (const boundary of open.values()) issues.push({
83
+ path: boundary.path,
84
+ message: `Bookmark id ${boundary.id} has no matching end boundary.`
85
+ });
86
+ };
26
87
  const assertValidProseMirrorDocument = (doc, context) => {
27
88
  if (validDocumentCache.has(doc)) return;
28
89
  const validation = validateProseMirrorDocument(doc);
@@ -50,6 +111,9 @@ const validateNodeAttrs = (node, path, issues) => {
50
111
  case "horizontalRule":
51
112
  case "pageBreak":
52
113
  case "renderedPageBreak": return;
114
+ case "bookmarkBoundary":
115
+ appendAttrIssues(path, readBookmarkBoundaryAttrs(node), issues);
116
+ return;
53
117
  case "tab":
54
118
  appendAttrIssues(path, readTabAttrs(node), issues);
55
119
  return;
@@ -77,6 +141,35 @@ const validateNodeAttrs = (node, path, issues) => {
77
141
  return;
78
142
  case "field":
79
143
  appendAttrIssues(path, readFieldAttrs(node), issues);
144
+ if (node.childCount > 0) issues.push({
145
+ path: `${path}.content`,
146
+ message: "Ordinary fields cannot contain structured result children."
147
+ });
148
+ return;
149
+ case "structuredField":
150
+ {
151
+ const fieldAttrs = readFieldAttrs(node);
152
+ appendAttrIssues(path, fieldAttrs, issues);
153
+ if (fieldAttrs.ok) {
154
+ const hasStructuredHyperlink = node.content.content.some((child) => child.marks.some((mark) => mark.type.name === "hyperlink"));
155
+ if (fieldAttrs.value.fieldKind === "complex") issues.push({
156
+ path: `${path}.content`,
157
+ message: "Complex fields cannot contain structured result children."
158
+ });
159
+ else if (!hasStructuredHyperlink) issues.push({
160
+ path: `${path}.content`,
161
+ message: "Structured simple fields require hyperlink content."
162
+ });
163
+ node.forEach((child, _offset, index) => {
164
+ const childPath = `${path}.content[${index}]`;
165
+ const hasHyperlink = child.marks.some((mark) => mark.type.name === "hyperlink");
166
+ if (child.type.name === "bookmarkBoundary" && !hasHyperlink) issues.push({
167
+ path: childPath,
168
+ message: "Bookmark boundaries inside fields require a hyperlink parent."
169
+ });
170
+ });
171
+ }
172
+ }
80
173
  return;
81
174
  case "math":
82
175
  appendAttrIssues(path, readMathAttrs(node), issues);
@@ -1,9 +1,9 @@
1
- import { HiddenProseMirrorRemoteSelection } from "../controller/hiddenEditorManager.js";
1
+ import { RemoteSelection } from "../types/remote-selection.js";
2
2
  import { RenderedDomContext, RenderedDomPoint, RenderedDomRect } from "./RenderedDomContext.js";
3
3
  //#region src/render-dom/RemoteSelectionOverlay.d.ts
4
4
  type SyncRemoteSelectionOverlayOptions = {
5
5
  pagesContainer: HTMLElement;
6
- selections: readonly HiddenProseMirrorRemoteSelection[];
6
+ selections: readonly RemoteSelection[];
7
7
  zoom: number;
8
8
  zIndex?: number;
9
9
  renderedDomContext?: RenderedDomContext;
@@ -11,9 +11,9 @@ type SyncRemoteSelectionOverlayOptions = {
11
11
  type RemoteSelectionOverlayGeometry = {
12
12
  caret: RenderedDomPoint | null;
13
13
  rects: RenderedDomRect[];
14
- selection: HiddenProseMirrorRemoteSelection;
14
+ selection: RemoteSelection;
15
15
  };
16
- declare const resolveRemoteSelectionOverlayGeometry: (renderedDomContext: RenderedDomContext, selections: readonly HiddenProseMirrorRemoteSelection[]) => RemoteSelectionOverlayGeometry[];
16
+ declare const resolveRemoteSelectionOverlayGeometry: (renderedDomContext: RenderedDomContext, selections: readonly RemoteSelection[]) => RemoteSelectionOverlayGeometry[];
17
17
  /** Paint collaborative cursors and selections over the rendered page DOM. */
18
18
  declare class RemoteSelectionOverlay {
19
19
  clear(pagesContainer: HTMLElement): void;
@@ -1,4 +1,7 @@
1
+ import { document_d_exports } from "./document.js";
1
2
  //#region src/types/documentEnumValues.d.ts
3
+ declare const SHAPE_TEXT_ANCHOR_VALUES: readonly ["top", "middle", "bottom", "distributed", "justified"];
4
+ declare const normalizeShapeTextAnchor: (value: unknown) => document_d_exports.ShapeTextBody["anchor"] | undefined;
2
5
  declare const THEME_COLOR_SLOT_VALUES: readonly ["dk1", "lt1", "dk2", "lt2", "accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "hlink", "folHlink", "background1", "text1", "background2", "text2"];
3
6
  declare const BORDER_STYLE_VALUES: readonly ["none", "single", "double", "dotted", "dashed", "thick", "triple", "thinThickSmallGap", "thickThinSmallGap", "thinThickMediumGap", "thickThinMediumGap", "thinThickLargeGap", "thickThinLargeGap", "wave", "doubleWave", "dashSmallGap", "dashDotStroked", "threeDEmboss", "threeDEngrave", "outset", "inset", "nil"];
4
7
  declare const UNDERLINE_STYLE_VALUES: readonly ["none", "single", "words", "double", "thick", "dotted", "dottedHeavy", "dash", "dashedHeavy", "dashLong", "dashLongHeavy", "dotDash", "dashDotHeavy", "dotDotDash", "dashDotDotHeavy", "wave", "wavyHeavy", "wavyDouble"];
@@ -90,4 +93,4 @@ type OutlineStyleAttr = (typeof OUTLINE_STYLE_ATTR_VALUES)[number];
90
93
  declare const NUMBER_FORMAT_VALUES: readonly ["decimal", "upperRoman", "lowerRoman", "upperLetter", "lowerLetter", "ordinal", "cardinalText", "ordinalText", "hex", "chicago", "ideographDigital", "japaneseCounting", "aiueo", "iroha", "decimalFullWidth", "decimalHalfWidth", "japaneseLegal", "japaneseDigitalTenThousand", "decimalEnclosedCircle", "decimalFullWidth2", "aiueoFullWidth", "irohaFullWidth", "decimalZero", "decimalZero3", "decimalZero4", "decimalZero5", "bullet", "ganada", "chosung", "decimalEnclosedFullstop", "decimalEnclosedParen", "decimalEnclosedCircleChinese", "ideographEnclosedCircle", "ideographTraditional", "ideographZodiac", "ideographZodiacTraditional", "taiwaneseCounting", "ideographLegalTraditional", "taiwaneseCountingThousand", "taiwaneseDigital", "chineseCounting", "chineseLegalSimplified", "chineseCountingThousand", "koreanDigital", "koreanCounting", "koreanLegal", "koreanDigital2", "vietnameseCounting", "russianLower", "russianUpper", "none", "numberInDash", "hebrew1", "hebrew2", "arabicAlpha", "arabicAbjad", "hindiVowels", "hindiConsonants", "hindiNumbers", "hindiCounting", "thaiLetters", "thaiNumbers", "thaiCounting"];
91
94
  declare const LEVEL_SUFFIX_VALUES: readonly ["tab", "space", "nothing"];
92
95
  //#endregion
93
- export { BORDER_STYLE_VALUES, CONDITIONAL_STYLE_TYPE_VALUES, EMPHASIS_MARK_VALUES, FIELD_TYPE_VALUES, FLOATING_TABLE_X_SPEC_VALUES, FLOATING_TABLE_Y_SPEC_VALUES, FONT_HINT_VALUES, FONT_THEME_VALUES, FRAME_WRAP_VALUES, FRAME_X_ALIGN_VALUES, FRAME_Y_ALIGN_VALUES, HIGHLIGHT_COLOR_VALUES, IMAGE_HORIZONTAL_ALIGNMENT_VALUES, IMAGE_HORIZONTAL_RELATIVE_TO_VALUES, IMAGE_VERTICAL_ALIGNMENT_VALUES, IMAGE_VERTICAL_RELATIVE_TO_VALUES, IMAGE_WRAP_TEXT_VALUES, IMAGE_WRAP_TYPE_VALUES, LEVEL_SUFFIX_VALUES, LINE_SPACING_RULE_VALUES, NUMBER_FORMAT_VALUES, OUTLINE_STYLE_ATTR_VALUES, OUTLINE_STYLE_CSS_ALIASES, OUTLINE_STYLE_CSS_ALIAS_VALUES, OutlineStyleAttr, OutlineStyleCssAlias, PARAGRAPH_ALIGNMENT_VALUES, POSITIONAL_TAB_ALIGNMENT_VALUES, POSITIONAL_TAB_LEADER_VALUES, POSITIONAL_TAB_RELATIVE_TO_VALUES, SDT_LOCK_VALUES, SDT_TYPE_VALUES, SHADING_PATTERN_VALUES, SHAPE_OUTLINE_STYLE_VALUES, SHAPE_TYPE_VALUES, STYLE_TYPE_VALUES, TABLE_CELL_TEXT_DIRECTION_VALUES, TABLE_CELL_VERTICAL_ALIGNMENT_VALUES, TABLE_JUSTIFICATION_VALUES, TABLE_ROW_HEIGHT_RULE_VALUES, TABLE_WIDTH_TYPE_VALUES, TAB_LEADER_VALUES, TAB_STOP_ALIGNMENT_VALUES, TEXT_EFFECT_VALUES, THEME_COLOR_SLOT_VALUES, UNDERLINE_STYLE_VALUES };
96
+ export { BORDER_STYLE_VALUES, CONDITIONAL_STYLE_TYPE_VALUES, EMPHASIS_MARK_VALUES, FIELD_TYPE_VALUES, FLOATING_TABLE_X_SPEC_VALUES, FLOATING_TABLE_Y_SPEC_VALUES, FONT_HINT_VALUES, FONT_THEME_VALUES, FRAME_WRAP_VALUES, FRAME_X_ALIGN_VALUES, FRAME_Y_ALIGN_VALUES, HIGHLIGHT_COLOR_VALUES, IMAGE_HORIZONTAL_ALIGNMENT_VALUES, IMAGE_HORIZONTAL_RELATIVE_TO_VALUES, IMAGE_VERTICAL_ALIGNMENT_VALUES, IMAGE_VERTICAL_RELATIVE_TO_VALUES, IMAGE_WRAP_TEXT_VALUES, IMAGE_WRAP_TYPE_VALUES, LEVEL_SUFFIX_VALUES, LINE_SPACING_RULE_VALUES, NUMBER_FORMAT_VALUES, OUTLINE_STYLE_ATTR_VALUES, OUTLINE_STYLE_CSS_ALIASES, OUTLINE_STYLE_CSS_ALIAS_VALUES, OutlineStyleAttr, OutlineStyleCssAlias, PARAGRAPH_ALIGNMENT_VALUES, POSITIONAL_TAB_ALIGNMENT_VALUES, POSITIONAL_TAB_LEADER_VALUES, POSITIONAL_TAB_RELATIVE_TO_VALUES, SDT_LOCK_VALUES, SDT_TYPE_VALUES, SHADING_PATTERN_VALUES, SHAPE_OUTLINE_STYLE_VALUES, SHAPE_TEXT_ANCHOR_VALUES, SHAPE_TYPE_VALUES, STYLE_TYPE_VALUES, TABLE_CELL_TEXT_DIRECTION_VALUES, TABLE_CELL_VERTICAL_ALIGNMENT_VALUES, TABLE_JUSTIFICATION_VALUES, TABLE_ROW_HEIGHT_RULE_VALUES, TABLE_WIDTH_TYPE_VALUES, TAB_LEADER_VALUES, TAB_STOP_ALIGNMENT_VALUES, TEXT_EFFECT_VALUES, THEME_COLOR_SLOT_VALUES, UNDERLINE_STYLE_VALUES, normalizeShapeTextAnchor };
@@ -1,4 +1,15 @@
1
1
  //#region src/types/documentEnumValues.ts
2
+ const SHAPE_TEXT_ANCHOR_VALUES = [
3
+ "top",
4
+ "middle",
5
+ "bottom",
6
+ "distributed",
7
+ "justified"
8
+ ];
9
+ const normalizeShapeTextAnchor = (value) => {
10
+ if (value === "center") return "middle";
11
+ for (const anchor of SHAPE_TEXT_ANCHOR_VALUES) if (value === anchor) return anchor;
12
+ };
2
13
  const THEME_COLOR_SLOT_VALUES = [
3
14
  "dk1",
4
15
  "lt1",
@@ -708,4 +719,4 @@ const LEVEL_SUFFIX_VALUES = [
708
719
  "nothing"
709
720
  ];
710
721
  //#endregion
711
- export { BORDER_STYLE_VALUES, CONDITIONAL_STYLE_TYPE_VALUES, EMPHASIS_MARK_VALUES, FIELD_TYPE_VALUES, FLOATING_TABLE_X_SPEC_VALUES, FLOATING_TABLE_Y_SPEC_VALUES, FONT_HINT_VALUES, FONT_THEME_VALUES, FRAME_WRAP_VALUES, FRAME_X_ALIGN_VALUES, FRAME_Y_ALIGN_VALUES, HIGHLIGHT_COLOR_VALUES, IMAGE_HORIZONTAL_ALIGNMENT_VALUES, IMAGE_HORIZONTAL_RELATIVE_TO_VALUES, IMAGE_VERTICAL_ALIGNMENT_VALUES, IMAGE_VERTICAL_RELATIVE_TO_VALUES, IMAGE_WRAP_TEXT_VALUES, IMAGE_WRAP_TYPE_VALUES, LEVEL_SUFFIX_VALUES, LINE_SPACING_RULE_VALUES, NUMBER_FORMAT_VALUES, OUTLINE_STYLE_ATTR_VALUES, OUTLINE_STYLE_CSS_ALIASES, OUTLINE_STYLE_CSS_ALIAS_VALUES, PARAGRAPH_ALIGNMENT_VALUES, POSITIONAL_TAB_ALIGNMENT_VALUES, POSITIONAL_TAB_LEADER_VALUES, POSITIONAL_TAB_RELATIVE_TO_VALUES, SDT_LOCK_VALUES, SDT_TYPE_VALUES, SHADING_PATTERN_VALUES, SHAPE_OUTLINE_STYLE_VALUES, SHAPE_TYPE_VALUES, STYLE_TYPE_VALUES, TABLE_CELL_TEXT_DIRECTION_VALUES, TABLE_CELL_VERTICAL_ALIGNMENT_VALUES, TABLE_JUSTIFICATION_VALUES, TABLE_ROW_HEIGHT_RULE_VALUES, TABLE_WIDTH_TYPE_VALUES, TAB_LEADER_VALUES, TAB_STOP_ALIGNMENT_VALUES, TEXT_EFFECT_VALUES, THEME_COLOR_SLOT_VALUES, UNDERLINE_STYLE_VALUES };
722
+ export { BORDER_STYLE_VALUES, CONDITIONAL_STYLE_TYPE_VALUES, EMPHASIS_MARK_VALUES, FIELD_TYPE_VALUES, FLOATING_TABLE_X_SPEC_VALUES, FLOATING_TABLE_Y_SPEC_VALUES, FONT_HINT_VALUES, FONT_THEME_VALUES, FRAME_WRAP_VALUES, FRAME_X_ALIGN_VALUES, FRAME_Y_ALIGN_VALUES, HIGHLIGHT_COLOR_VALUES, IMAGE_HORIZONTAL_ALIGNMENT_VALUES, IMAGE_HORIZONTAL_RELATIVE_TO_VALUES, IMAGE_VERTICAL_ALIGNMENT_VALUES, IMAGE_VERTICAL_RELATIVE_TO_VALUES, IMAGE_WRAP_TEXT_VALUES, IMAGE_WRAP_TYPE_VALUES, LEVEL_SUFFIX_VALUES, LINE_SPACING_RULE_VALUES, NUMBER_FORMAT_VALUES, OUTLINE_STYLE_ATTR_VALUES, OUTLINE_STYLE_CSS_ALIASES, OUTLINE_STYLE_CSS_ALIAS_VALUES, PARAGRAPH_ALIGNMENT_VALUES, POSITIONAL_TAB_ALIGNMENT_VALUES, POSITIONAL_TAB_LEADER_VALUES, POSITIONAL_TAB_RELATIVE_TO_VALUES, SDT_LOCK_VALUES, SDT_TYPE_VALUES, SHADING_PATTERN_VALUES, SHAPE_OUTLINE_STYLE_VALUES, SHAPE_TEXT_ANCHOR_VALUES, SHAPE_TYPE_VALUES, STYLE_TYPE_VALUES, TABLE_CELL_TEXT_DIRECTION_VALUES, TABLE_CELL_VERTICAL_ALIGNMENT_VALUES, TABLE_JUSTIFICATION_VALUES, TABLE_ROW_HEIGHT_RULE_VALUES, TABLE_WIDTH_TYPE_VALUES, TAB_LEADER_VALUES, TAB_STOP_ALIGNMENT_VALUES, TEXT_EFFECT_VALUES, THEME_COLOR_SLOT_VALUES, UNDERLINE_STYLE_VALUES, normalizeShapeTextAnchor };
@@ -0,0 +1,8 @@
1
+ //#region src/types/editor-story.d.ts
2
+ /** A secondary note story address, independent of any mounted editor view. */
3
+ type NoteStoryKey = {
4
+ kind: "footnote" | "endnote";
5
+ noteId: number;
6
+ };
7
+ //#endregion
8
+ export { NoteStoryKey };
File without changes
@@ -0,0 +1,11 @@
1
+ //#region src/types/remote-selection.d.ts
2
+ /** Serializable collaborator selection projected into ProseMirror positions. */
3
+ type RemoteSelection = {
4
+ anchor: number;
5
+ clientId: number;
6
+ color: string;
7
+ head: number;
8
+ name: string;
9
+ };
10
+ //#endregion
11
+ export { RemoteSelection };
File without changes
@@ -0,0 +1,36 @@
1
+ //#region src/types/wrap.d.ts
2
+ /**
3
+ * Wrap-type predicates shared across the layout pipeline.
4
+ *
5
+ * Mirrors eigenpal docx-editor `wrapTypes` so that the new textBoxFlow
6
+ * predicates (eigenpal #474) and the existing image classifiers agree on
7
+ * which OOXML wrap variants are floating, which paint over body text, and
8
+ * which wrap around it.
9
+ */
10
+ /**
11
+ * OOXML text-wrap variants for a drawing anchor (`wp:inline` vs the
12
+ * `wp:wrap*` elements). `inline` keeps the object in the text run; every other
13
+ * variant takes it out of inline flow. Mirrors the eigenpal docx-editor union
14
+ * so adapters share one wrap vocabulary.
15
+ */
16
+ type WrapType = "inline" | "square" | "tight" | "through" | "topAndBottom" | "behind" | "inFront";
17
+ /**
18
+ * `true` for any wrap type that takes the object out of inline flow.
19
+ * Includes `topAndBottom` and the wrapNone variants (`behind`/`inFront`):
20
+ * those are anchored at absolute coordinates even though they don't shrink
21
+ * line widths.
22
+ */
23
+ declare function isFloatingWrapType(wrapType: string | undefined): boolean;
24
+ /**
25
+ * `true` for `behind` and `inFront` — wrapNone variants that don't shrink
26
+ * line widths; text paints over or under the object.
27
+ */
28
+ declare function isWrapNone(wrapType: string | undefined): boolean;
29
+ /**
30
+ * `true` for wrap types that actually divert lines around the object
31
+ * (`square` / `tight` / `through`). Excludes `topAndBottom` (block flow)
32
+ * and the wrapNone variants.
33
+ */
34
+ declare function wrapsAroundText(wrapType: string | undefined): boolean;
35
+ //#endregion
36
+ export { WrapType, isFloatingWrapType, isWrapNone, wrapsAroundText };
@@ -0,0 +1,40 @@
1
+ //#region src/types/wrap.ts
2
+ const FLOATING_WRAP_TYPES = /* @__PURE__ */ new Set([
3
+ "square",
4
+ "tight",
5
+ "through",
6
+ "topAndBottom",
7
+ "behind",
8
+ "inFront"
9
+ ]);
10
+ const TEXT_WRAPPING_TYPES = /* @__PURE__ */ new Set([
11
+ "square",
12
+ "tight",
13
+ "through"
14
+ ]);
15
+ /**
16
+ * `true` for any wrap type that takes the object out of inline flow.
17
+ * Includes `topAndBottom` and the wrapNone variants (`behind`/`inFront`):
18
+ * those are anchored at absolute coordinates even though they don't shrink
19
+ * line widths.
20
+ */
21
+ function isFloatingWrapType(wrapType) {
22
+ return wrapType !== void 0 && FLOATING_WRAP_TYPES.has(wrapType);
23
+ }
24
+ /**
25
+ * `true` for `behind` and `inFront` — wrapNone variants that don't shrink
26
+ * line widths; text paints over or under the object.
27
+ */
28
+ function isWrapNone(wrapType) {
29
+ return wrapType === "behind" || wrapType === "inFront";
30
+ }
31
+ /**
32
+ * `true` for wrap types that actually divert lines around the object
33
+ * (`square` / `tight` / `through`). Excludes `topAndBottom` (block flow)
34
+ * and the wrapNone variants.
35
+ */
36
+ function wrapsAroundText(wrapType) {
37
+ return wrapType !== void 0 && TEXT_WRAPPING_TYPES.has(wrapType);
38
+ }
39
+ //#endregion
40
+ export { isFloatingWrapType, isWrapNone, wrapsAroundText };
@@ -47,7 +47,7 @@ declare const CJK_FALLBACK_FONT_FAMILY = "MS Mincho";
47
47
  declare const setGoogleFontsEnabled: (enabled: boolean) => void;
48
48
  declare const getGoogleFontsEnabled: () => boolean;
49
49
  declare const setEmbeddedFontFamilyMap: (map: ReadonlyMap<string, string> | null) => void;
50
- declare function resolveFontFamily(docxFontName: string): ResolvedFont;
50
+ declare function resolveFontFamily(docxFontName: string, alternateFontName?: string): ResolvedFont;
51
51
  /**
52
52
  * Split a CSS `font-family` list built by `quoteFontName` back into family
53
53
  * names: the inverse of the quoting and escaping applied there. Quoted entries