ooxml-core 1.10.0 → 1.12.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 (205) hide show
  1. package/dist/PptxHandler-DNZHAHUY.cjs +12 -0
  2. package/dist/PptxHandler-E44KDHMQ.mjs +3 -0
  3. package/dist/{PptxHandler-ADEFY476.mjs → PptxHandler-NROFYT2N.mjs} +2 -2
  4. package/dist/automation/index.cjs +3504 -2888
  5. package/dist/automation/index.mjs +3504 -2888
  6. package/dist/{chunk-3N6XMMTT.cjs → chunk-2UVH6RHI.cjs} +1138 -996
  7. package/dist/{chunk-ZOUGMAZG.mjs → chunk-7DSZI7S6.mjs} +1 -1
  8. package/dist/{chunk-S6DOCMQC.cjs → chunk-7QZGRB3T.cjs} +0 -10
  9. package/dist/chunk-ANZ4Q6I3.cjs +21 -0
  10. package/dist/{chunk-5NVJN4E6.mjs → chunk-EC2W2MDY.mjs} +1 -1
  11. package/dist/chunk-EGTRL3QJ.mjs +19 -0
  12. package/dist/chunk-GXHKNSZX.mjs +9 -0
  13. package/dist/{chunk-CCHYFCPD.mjs → chunk-HCXUI5UC.mjs} +296 -103
  14. package/dist/chunk-HDQXPSHY.cjs +17 -0
  15. package/dist/chunk-KTYBFGEY.mjs +14 -0
  16. package/dist/chunk-QOO36KG4.cjs +42 -0
  17. package/dist/chunk-R2KZXD6U.mjs +39 -0
  18. package/dist/{chunk-A6P7G3UK.mjs → chunk-U2DF3EGK.mjs} +1 -1
  19. package/dist/{chunk-R6KSBNKX.mjs → chunk-UAY26XOI.mjs} +1 -9
  20. package/dist/{chunk-WUE5ZHU3.mjs → chunk-W5ARCUJB.mjs} +3 -3
  21. package/dist/chunk-XZPZHXV4.cjs +12 -0
  22. package/dist/{chunk-ZE53K7DH.mjs → chunk-YB5SRNFS.mjs} +244 -102
  23. package/dist/docx/embedded.cjs +1 -1
  24. package/dist/docx/embedded.mjs +1 -1
  25. package/dist/docx/index.cjs +1 -1
  26. package/dist/docx/index.mjs +1 -1
  27. package/dist/docx/layout/adapt-table.d.ts.map +1 -1
  28. package/dist/docx/layout/flow-table.d.ts.map +1 -1
  29. package/dist/docx/layout/index.cjs +266 -61
  30. package/dist/docx/layout/index.d.ts +1 -0
  31. package/dist/docx/layout/index.d.ts.map +1 -1
  32. package/dist/docx/layout/index.mjs +266 -62
  33. package/dist/docx/layout/input.d.ts +5 -0
  34. package/dist/docx/layout/input.d.ts.map +1 -1
  35. package/dist/docx/layout/layout-session.d.ts +10 -0
  36. package/dist/docx/layout/layout-session.d.ts.map +1 -0
  37. package/dist/docx/layout/nested-fragment-edges.d.ts +9 -0
  38. package/dist/docx/layout/nested-fragment-edges.d.ts.map +1 -0
  39. package/dist/docx/layout/paragraph-cache.d.ts +8 -0
  40. package/dist/docx/layout/paragraph-cache.d.ts.map +1 -0
  41. package/dist/docx/layout/paragraph-layout.d.ts.map +1 -1
  42. package/dist/docx/layout/paragraph-tokens.d.ts +1 -1
  43. package/dist/docx/layout/paragraph-tokens.d.ts.map +1 -1
  44. package/dist/docx/layout/result.d.ts +7 -0
  45. package/dist/docx/layout/result.d.ts.map +1 -1
  46. package/dist/docx/layout/table-border-layout.d.ts +1 -1
  47. package/dist/docx/layout/table-border-layout.d.ts.map +1 -1
  48. package/dist/docx/layout/table-cell-layout.d.ts +1 -1
  49. package/dist/docx/layout/table-cell-layout.d.ts.map +1 -1
  50. package/dist/docx/layout/table-frames.d.ts.map +1 -1
  51. package/dist/docx/layout/table-layout.d.ts +1 -1
  52. package/dist/docx/layout/table-layout.d.ts.map +1 -1
  53. package/dist/docx/layout/table-paragraph-keeps.d.ts +14 -0
  54. package/dist/docx/layout/table-paragraph-keeps.d.ts.map +1 -0
  55. package/dist/docx/load/index.cjs +1 -1
  56. package/dist/docx/load/index.mjs +1 -1
  57. package/dist/docx/ui/index.cjs +83 -6
  58. package/dist/docx/ui/index.mjs +83 -7
  59. package/dist/docx/ui/ribbon-action-ids.d.ts +1 -1
  60. package/dist/docx/ui/ribbon-action-ids.d.ts.map +1 -1
  61. package/dist/docx/ui/word-count.d.ts +3 -0
  62. package/dist/docx/ui/word-count.d.ts.map +1 -1
  63. package/dist/geometry/element-transform.d.ts +90 -0
  64. package/dist/geometry/element-transform.d.ts.map +1 -0
  65. package/dist/geometry/index.cjs +90 -0
  66. package/dist/geometry/index.d.ts +1 -0
  67. package/dist/geometry/index.d.ts.map +1 -1
  68. package/dist/geometry/index.mjs +83 -1
  69. package/dist/index.cjs +90 -0
  70. package/dist/index.mjs +90 -0
  71. package/dist/pptx/automation/index.cjs +266 -114
  72. package/dist/pptx/automation/index.d.ts +5 -4
  73. package/dist/pptx/automation/index.d.ts.map +1 -1
  74. package/dist/pptx/automation/index.mjs +5 -5
  75. package/dist/pptx/chunks/{text-operations-BqHmLaLA.d.ts → elements-DD3UGOMd.d.ts} +17 -3262
  76. package/dist/pptx/chunks/elements-DD3UGOMd.d.ts.map +1 -0
  77. package/dist/pptx/chunks/{index-DUCGeZh7.d.ts → index-BZrFyNtU.d.ts} +53 -5
  78. package/dist/pptx/chunks/index-BZrFyNtU.d.ts.map +1 -0
  79. package/dist/pptx/chunks/{index-Cuxtr76Y.d.ts → index-DdX02BSm.d.ts} +5 -3
  80. package/dist/pptx/chunks/index-DdX02BSm.d.ts.map +1 -0
  81. package/dist/pptx/chunks/smart-art-ENMMEbmW.d.ts +1512 -0
  82. package/dist/pptx/chunks/smart-art-ENMMEbmW.d.ts.map +1 -0
  83. package/dist/pptx/chunks/text-D49FKllA.d.ts +1473 -0
  84. package/dist/pptx/chunks/text-D49FKllA.d.ts.map +1 -0
  85. package/dist/pptx/chunks/text-operations-CyMTMfID.d.ts +3261 -0
  86. package/dist/pptx/chunks/text-operations-CyMTMfID.d.ts.map +1 -0
  87. package/dist/pptx/cli/index.cjs +266 -114
  88. package/dist/pptx/cli/index.d.ts +1 -1
  89. package/dist/pptx/cli/index.mjs +4 -4
  90. package/dist/pptx/converter/index.d.ts +1 -1
  91. package/dist/pptx/converter/index.mjs +2 -2
  92. package/dist/pptx/editor/render/find-replace.cjs +17 -16
  93. package/dist/pptx/editor/render/find-replace.d.ts +2 -2
  94. package/dist/pptx/editor/render/find-replace.mjs +2 -1
  95. package/dist/pptx/editor/render/font-family-update.cjs +14 -0
  96. package/dist/pptx/editor/render/font-family-update.d.ts +17 -0
  97. package/dist/pptx/editor/render/font-family-update.d.ts.map +1 -0
  98. package/dist/pptx/editor/render/font-family-update.mjs +1 -0
  99. package/dist/pptx/editor/render/paragraph-geometry-overrides.cjs +14 -0
  100. package/dist/pptx/editor/render/paragraph-geometry-overrides.d.ts +17 -0
  101. package/dist/pptx/editor/render/paragraph-geometry-overrides.d.ts.map +1 -0
  102. package/dist/pptx/editor/render/paragraph-geometry-overrides.mjs +12 -0
  103. package/dist/pptx/editor/render/slide-operations.cjs +9 -8
  104. package/dist/pptx/editor/render/slide-operations.mjs +3 -2
  105. package/dist/pptx/editor/render/table-data-grid-ops.cjs +1 -1
  106. package/dist/pptx/editor/render/table-data-grid-ops.mjs +1 -1
  107. package/dist/pptx/editor/render/text-content-style.cjs +18 -0
  108. package/dist/pptx/editor/render/text-content-style.d.ts +9 -0
  109. package/dist/pptx/editor/render/text-content-style.d.ts.map +1 -0
  110. package/dist/pptx/editor/render/text-content-style.mjs +5 -0
  111. package/dist/pptx/editor/render/text-runs-style-patch.cjs +17 -0
  112. package/dist/pptx/editor/render/text-runs-style-patch.d.ts +7 -0
  113. package/dist/pptx/editor/render/text-runs-style-patch.d.ts.map +1 -0
  114. package/dist/pptx/editor/render/text-runs-style-patch.mjs +15 -0
  115. package/dist/pptx/editor/render/text-style-scope.cjs +173 -0
  116. package/dist/pptx/editor/render/text-style-scope.d.ts +76 -0
  117. package/dist/pptx/editor/render/text-style-scope.d.ts.map +1 -0
  118. package/dist/pptx/editor/render/text-style-scope.mjs +164 -0
  119. package/dist/pptx/editor/render/theme-editor-model.cjs +1 -1
  120. package/dist/pptx/editor/render/theme-editor-model.mjs +1 -1
  121. package/dist/pptx/editor/render/update-text-segment-style.cjs +11 -0
  122. package/dist/pptx/editor/render/update-text-segment-style.d.ts +14 -0
  123. package/dist/pptx/editor/render/update-text-segment-style.d.ts.map +1 -0
  124. package/dist/pptx/editor/render/update-text-segment-style.mjs +2 -0
  125. package/dist/pptx/index.cjs +329 -114
  126. package/dist/pptx/index.d.ts +7 -5
  127. package/dist/pptx/index.mjs +5 -5
  128. package/dist/pptx/smartart-layouts/index.d.ts +1 -1
  129. package/dist/teams/index.cjs +112 -16
  130. package/dist/teams/index.mjs +112 -16
  131. package/dist/visio/edit-commands.d.ts +3 -3
  132. package/dist/visio/edit-commands.d.ts.map +1 -1
  133. package/dist/visio/edit-formatting-scope.d.ts.map +1 -1
  134. package/dist/visio/edit-recalculate-index.d.ts.map +1 -1
  135. package/dist/visio/edit-text-field-commands.d.ts +15 -0
  136. package/dist/visio/edit-text-field-commands.d.ts.map +1 -1
  137. package/dist/visio/edit-text-field.d.ts +2 -2
  138. package/dist/visio/edit-text-field.d.ts.map +1 -1
  139. package/dist/visio/edit.d.ts +1 -1
  140. package/dist/visio/edit.d.ts.map +1 -1
  141. package/dist/visio/index.cjs +696 -249
  142. package/dist/visio/index.d.ts +2 -1
  143. package/dist/visio/index.d.ts.map +1 -1
  144. package/dist/visio/index.mjs +695 -250
  145. package/dist/visio/model.d.ts +18 -0
  146. package/dist/visio/model.d.ts.map +1 -1
  147. package/dist/visio/paper-sizes.d.ts +5 -0
  148. package/dist/visio/paper-sizes.d.ts.map +1 -1
  149. package/dist/visio/parser.d.ts.map +1 -1
  150. package/dist/visio/print-count.d.ts +20 -0
  151. package/dist/visio/print-count.d.ts.map +1 -0
  152. package/dist/visio/print-settings.d.ts +14 -0
  153. package/dist/visio/print-settings.d.ts.map +1 -0
  154. package/dist/visio/shapes.d.ts.map +1 -1
  155. package/dist/visio/style.d.ts +1 -1
  156. package/dist/visio/style.d.ts.map +1 -1
  157. package/dist/visio/text-field-display.d.ts +3 -0
  158. package/dist/visio/text-field-display.d.ts.map +1 -1
  159. package/dist/visio/text-field-editability.d.ts +6 -0
  160. package/dist/visio/text-field-editability.d.ts.map +1 -0
  161. package/dist/visio/text-field-independent.d.ts +4 -0
  162. package/dist/visio/text-field-independent.d.ts.map +1 -0
  163. package/dist/visio/text-field-source.d.ts +6 -0
  164. package/dist/visio/text-field-source.d.ts.map +1 -0
  165. package/dist/visio/ui/edit-commands.d.ts.map +1 -1
  166. package/dist/visio/ui/index.cjs +588 -215
  167. package/dist/visio/ui/index.mjs +588 -215
  168. package/dist/visio/ui/snapshot-scene.d.ts.map +1 -1
  169. package/dist/xlsx/edit/pivots.d.ts.map +1 -1
  170. package/dist/xlsx/index.cjs +773 -514
  171. package/dist/xlsx/index.mjs +772 -515
  172. package/dist/xlsx/load/index.cjs +541 -292
  173. package/dist/xlsx/load/index.mjs +541 -292
  174. package/dist/xlsx/model-pivots.d.ts +8 -0
  175. package/dist/xlsx/model-pivots.d.ts.map +1 -1
  176. package/dist/xlsx/pivot/admission.d.ts.map +1 -1
  177. package/dist/xlsx/pivot/aggregate.d.ts.map +1 -1
  178. package/dist/xlsx/pivot/data.d.ts +2 -2
  179. package/dist/xlsx/pivot/data.d.ts.map +1 -1
  180. package/dist/xlsx/pivot/index.d.ts +2 -0
  181. package/dist/xlsx/pivot/index.d.ts.map +1 -1
  182. package/dist/xlsx/pivot/measures.d.ts +1 -1
  183. package/dist/xlsx/pivot/measures.d.ts.map +1 -1
  184. package/dist/xlsx/pivot/page-filter-admission.d.ts +5 -0
  185. package/dist/xlsx/pivot/page-filter-admission.d.ts.map +1 -0
  186. package/dist/xlsx/pivot/page-filter.d.ts +11 -0
  187. package/dist/xlsx/pivot/page-filter.d.ts.map +1 -0
  188. package/dist/xlsx/pivot/read.d.ts.map +1 -1
  189. package/dist/xlsx/pivot/table-xml.d.ts.map +1 -1
  190. package/dist/xlsx/pivot/values-axis.d.ts +4 -1
  191. package/dist/xlsx/pivot/values-axis.d.ts.map +1 -1
  192. package/dist/xlsx/ui/commands/i18n/navigation.d.ts.map +1 -1
  193. package/dist/xlsx/ui/commands/i18n/pivots.d.ts.map +1 -1
  194. package/dist/xlsx/ui/index.cjs +95 -12
  195. package/dist/xlsx/ui/index.mjs +95 -12
  196. package/dist/xlsx/ui/ribbon/parts.d.ts +1 -0
  197. package/dist/xlsx/ui/ribbon/parts.d.ts.map +1 -1
  198. package/package.json +2 -2
  199. package/dist/PptxHandler-5UURGJEV.mjs +0 -2
  200. package/dist/PptxHandler-U5XB2HUE.cjs +0 -11
  201. package/dist/pptx/chunks/index-Cuxtr76Y.d.ts.map +0 -1
  202. package/dist/pptx/chunks/index-DUCGeZh7.d.ts.map +0 -1
  203. package/dist/pptx/chunks/smart-art-D-sXa_Nb.d.ts +0 -2980
  204. package/dist/pptx/chunks/smart-art-D-sXa_Nb.d.ts.map +0 -1
  205. package/dist/pptx/chunks/text-operations-BqHmLaLA.d.ts.map +0 -1
@@ -4524,10 +4524,14 @@ function fontOf(run) {
4524
4524
  };
4525
4525
  }
4526
4526
  var graphemes2 = new Intl.Segmenter(void 0, { granularity: "grapheme" });
4527
- function runTextWidth(text2, run, measurer) {
4527
+ function runTextWidth(text2, run, measurer, font = fontOf(run)) {
4528
+ let characters = 0;
4529
+ if (run.characterSpacingPx) {
4530
+ for (const _segment of graphemes2.segment(text2)) characters++;
4531
+ }
4528
4532
  return Math.max(
4529
4533
  0,
4530
- measurer.widthOf(text2, fontOf(run)) * (run.textScalePercent ?? 100) / 100 + [...graphemes2.segment(text2)].length * (run.characterSpacingPx ?? 0)
4534
+ measurer.widthOf(text2, font) * (run.textScalePercent ?? 100) / 100 + characters * (run.characterSpacingPx ?? 0)
4531
4535
  );
4532
4536
  }
4533
4537
  function resolveIndents(paragraph) {
@@ -4661,8 +4665,45 @@ function alignFragments(fragments, width, isLastLine, effectiveAlign) {
4661
4665
  return offset === 0 ? fragments : fragments.map((f) => ({ ...f, xPx: f.xPx + offset }));
4662
4666
  }
4663
4667
 
4668
+ // docx/layout/paragraph-cache.ts
4669
+ var sessions = /* @__PURE__ */ new WeakMap();
4670
+ function registerParagraphCache(measurer) {
4671
+ sessions.set(measurer, /* @__PURE__ */ new Map());
4672
+ }
4673
+ function cachedParagraphLayout(measurer, key, note, compute) {
4674
+ const cache = sessions.get(measurer);
4675
+ if (!cache) return compute(note);
4676
+ const { index, signature } = key();
4677
+ const cached = cache.get(index);
4678
+ if (cached?.signature === signature) {
4679
+ for (const warning of cached.warnings) note(warning);
4680
+ return structuredClone(cached.result);
4681
+ }
4682
+ const warnings = [];
4683
+ const result = compute((warning) => {
4684
+ warnings.push(warning);
4685
+ note(warning);
4686
+ });
4687
+ if (!cache.has(index) && cache.size >= 4e3) cache.delete(cache.keys().next().value);
4688
+ cache.set(index, { signature, result: structuredClone(result), warnings });
4689
+ return result;
4690
+ }
4691
+
4664
4692
  // docx/layout/paragraph-layout.ts
4665
4693
  function layoutParagraph(paragraph, contentWidthPx, measurer, note, lineBox, startToken = 0) {
4694
+ if (lineBox)
4695
+ return measureParagraph(paragraph, contentWidthPx, measurer, note, lineBox, startToken);
4696
+ return cachedParagraphLayout(
4697
+ measurer,
4698
+ () => ({
4699
+ index: JSON.stringify([paragraph.id, contentWidthPx, startToken]),
4700
+ signature: JSON.stringify(paragraph)
4701
+ }),
4702
+ note,
4703
+ (report) => measureParagraph(paragraph, contentWidthPx, measurer, report, void 0, startToken)
4704
+ );
4705
+ }
4706
+ function measureParagraph(paragraph, contentWidthPx, measurer, note, lineBox, startToken = 0) {
4666
4707
  const { leftPx, rightPx, firstLineExtraPx: initialIndent } = resolveIndents(paragraph);
4667
4708
  const firstLineExtraPx = startToken ? 0 : initialIndent;
4668
4709
  const bodyWidth = Math.max(1, contentWidthPx - leftPx - rightPx);
@@ -4719,7 +4760,8 @@ function layoutParagraph(paragraph, contentWidthPx, measurer, note, lineBox, sta
4719
4760
  const tokenWidth = (token) => token.kind === "word" || token.kind === "space" ? runTextWidth(
4720
4761
  token.text,
4721
4762
  expectDefined(paragraph.runs[token.runIndex], "token run"),
4722
- measurer
4763
+ measurer,
4764
+ fonts[token.runIndex]
4723
4765
  ) : token.kind === "object" ? paragraph.runs[token.runIndex]?.object?.widthPx ?? 0 : 0;
4724
4766
  const widths = tokens.map(tokenWidth);
4725
4767
  const ends = /* @__PURE__ */ new Set(["tab", "lineBreak", "pageBreak", "columnBreak"]);
@@ -4895,6 +4937,75 @@ function widowControlEnabled(value) {
4895
4937
  return value !== false;
4896
4938
  }
4897
4939
 
4940
+ // docx/layout/nested-frame-profile.ts
4941
+ var equal = (a, b) => a !== void 0 && b !== void 0 && a.style === b.style && a.color === b.color && Math.abs(a.widthPx - b.widthPx) < 1e-6;
4942
+ function nestedFrameProfile(table, tableWidthPx = table.widthPx) {
4943
+ const sides = table.rows.flatMap(
4944
+ (row) => row.cells.flatMap(
4945
+ (cell) => ["top", "right", "bottom", "left"].map((side) => cell.borders?.[side])
4946
+ )
4947
+ );
4948
+ if (sides.every((side) => !side)) return { leftPx: 0, rightPx: 0, bottomPx: 0 };
4949
+ if (!sides.every((side) => side?.style === "solid" && side.widthPx > 0)) return void 0;
4950
+ const first3 = table.rows[0], left = first3.cells[0].borders.left, right = first3.cells.at(-1).borders.right;
4951
+ for (const [index, row] of table.rows.entries()) {
4952
+ if (row.cells.length !== first3.cells.length || !equal(row.cells[0]?.borders?.left, left) || !equal(row.cells.at(-1)?.borders?.right, right))
4953
+ return void 0;
4954
+ for (const [column, cell] of row.cells.entries()) {
4955
+ const sourceWidth = cell.widthPx ?? (tableWidthPx === void 0 ? void 0 : tableWidthPx / row.cells.length);
4956
+ const paintWidth = sourceWidth === void 0 ? void 0 : sourceWidth + (cell.borders.left.widthPx - cell.borders.right.widthPx) / 2 + (column === row.cells.length - 1 ? cell.borders.right.widthPx : 0);
4957
+ if (paintWidth !== void 0 && paintWidth <= 0) return void 0;
4958
+ if (!equal(cell.borders?.top, row.cells[0]?.borders?.top) || !equal(cell.borders?.bottom, row.cells[0]?.borders?.bottom))
4959
+ return void 0;
4960
+ if (column && !equal(row.cells[column - 1]?.borders?.right, cell.borders?.left))
4961
+ return void 0;
4962
+ if (index) {
4963
+ const previous = table.rows[index - 1].cells[column];
4964
+ if (previous.xPx !== cell.xPx || previous.widthPx !== cell.widthPx || !equal(previous.borders?.bottom, cell.borders?.top))
4965
+ return void 0;
4966
+ }
4967
+ }
4968
+ }
4969
+ return {
4970
+ leftPx: left.widthPx,
4971
+ rightPx: right.widthPx,
4972
+ bottomPx: table.rows.at(-1).cells[0].borders.bottom.widthPx
4973
+ };
4974
+ }
4975
+
4976
+ // docx/layout/nested-fragment-edges.ts
4977
+ var plain = (paragraph) => !paragraph.keepLines && !paragraph.keepNext && !paragraph.pageBreakBefore && !paragraph.footnotes?.length && !paragraph.runs.some((run) => run.footnoteReferenceId !== void 0 || run.breakAfter);
4978
+ function nestedFragmentEdges(table) {
4979
+ if (table.widthPx === void 0 || !Number.isFinite(table.widthPx) || table.widthPx <= 0 || table.rows.length < 2 || !nestedFrameProfile(table, table.widthPx) || table.rows.some(
4980
+ (row) => row.heightPx !== void 0 || row.heightSpecified || row.cantSplit || row.isHeader || row.cells.length !== 2 || row.cells.some(
4981
+ (cell) => (cell.gridSpan ?? 1) !== 1 || cell.verticalMerge !== void 0 || cell.verticalAlign && cell.verticalAlign !== "top" || cell.blocks?.some((block) => block.kind !== "paragraph") || !(cell.blocks ?? cell.paragraphs).every(
4982
+ (block) => block.kind === "paragraph" && plain(block)
4983
+ )
4984
+ )
4985
+ ))
4986
+ return void 0;
4987
+ const top = table.rows[0].cells.map((cell) => cell.borders?.top);
4988
+ const bottom = table.rows.at(-1).cells.map((cell) => cell.borders?.bottom);
4989
+ return top.every(Boolean) && bottom.every(Boolean) ? { top, bottom } : void 0;
4990
+ }
4991
+ function reflowNestedFragments(row) {
4992
+ if (row.heightPx !== void 0 || row.heightSpecified || row.cantSplit || row.isHeader || row.cells.length !== 2)
4993
+ return false;
4994
+ let tables = 0;
4995
+ for (const cell of row.cells) {
4996
+ if ((cell.gridSpan ?? 1) !== 1 || cell.verticalMerge !== void 0) return false;
4997
+ if (cell.verticalAlign && cell.verticalAlign !== "top") return false;
4998
+ for (const [index, block] of (cell.blocks ?? cell.paragraphs).entries()) {
4999
+ if (block.kind === "paragraph") {
5000
+ if (!plain(block)) return false;
5001
+ } else {
5002
+ if (index !== 0 || !nestedFragmentEdges(block) || ++tables > 1) return false;
5003
+ }
5004
+ }
5005
+ }
5006
+ return tables === 1;
5007
+ }
5008
+
4898
5009
  // docx/layout/table-content.ts
4899
5010
  function cellContentBottom(boxes, paddingBottom = 0) {
4900
5011
  return Math.max(
@@ -4928,44 +5039,21 @@ function clipTableFrames(tables, start, end, inset = 0) {
4928
5039
  }
4929
5040
  ];
4930
5041
  });
4931
- return [{ ...table, yPx: top - start + inset, heightPx: bottom - top, rows }];
4932
- });
4933
- }
4934
-
4935
- // docx/layout/nested-frame-profile.ts
4936
- var equal = (a, b) => a !== void 0 && b !== void 0 && a.style === b.style && a.color === b.color && Math.abs(a.widthPx - b.widthPx) < 1e-6;
4937
- function nestedFrameProfile(table, tableWidthPx = table.widthPx) {
4938
- const sides = table.rows.flatMap(
4939
- (row) => row.cells.flatMap(
4940
- (cell) => ["top", "right", "bottom", "left"].map((side) => cell.borders?.[side])
4941
- )
4942
- );
4943
- if (sides.every((side) => !side)) return { leftPx: 0, rightPx: 0, bottomPx: 0 };
4944
- if (!sides.every((side) => side?.style === "solid" && side.widthPx > 0)) return void 0;
4945
- const first3 = table.rows[0], left = first3.cells[0].borders.left, right = first3.cells.at(-1).borders.right;
4946
- for (const [index, row] of table.rows.entries()) {
4947
- if (row.cells.length !== first3.cells.length || !equal(row.cells[0]?.borders?.left, left) || !equal(row.cells.at(-1)?.borders?.right, right))
4948
- return void 0;
4949
- for (const [column, cell] of row.cells.entries()) {
4950
- const sourceWidth = cell.widthPx ?? (tableWidthPx === void 0 ? void 0 : tableWidthPx / row.cells.length);
4951
- const paintWidth = sourceWidth === void 0 ? void 0 : sourceWidth + (cell.borders.left.widthPx - cell.borders.right.widthPx) / 2 + (column === row.cells.length - 1 ? cell.borders.right.widthPx : 0);
4952
- if (paintWidth !== void 0 && paintWidth <= 0) return void 0;
4953
- if (!equal(cell.borders?.top, row.cells[0]?.borders?.top) || !equal(cell.borders?.bottom, row.cells[0]?.borders?.bottom))
4954
- return void 0;
4955
- if (column && !equal(row.cells[column - 1]?.borders?.right, cell.borders?.left))
4956
- return void 0;
4957
- if (index) {
4958
- const previous = table.rows[index - 1].cells[column];
4959
- if (previous.xPx !== cell.xPx || previous.widthPx !== cell.widthPx || !equal(previous.borders?.bottom, cell.borders?.top))
4960
- return void 0;
5042
+ if (table.fragmentEdges && rows.length) {
5043
+ const edges = table.fragmentEdges;
5044
+ for (const [row, side] of [
5045
+ [rows[0], "top"],
5046
+ [rows.at(-1), "bottom"]
5047
+ ]) {
5048
+ if (row.geometry)
5049
+ row.geometry = row.geometry.map((cell, index) => ({
5050
+ ...cell,
5051
+ borders: { ...cell.borders, [side]: edges[side][index] }
5052
+ }));
4961
5053
  }
4962
5054
  }
4963
- }
4964
- return {
4965
- leftPx: left.widthPx,
4966
- rightPx: right.widthPx,
4967
- bottomPx: table.rows.at(-1).cells[0].borders.bottom.widthPx
4968
- };
5055
+ return [{ ...table, yPx: top - start + inset, heightPx: bottom - top, rows }];
5056
+ });
4969
5057
  }
4970
5058
 
4971
5059
  // docx/layout/table-cell-layout.ts
@@ -4975,7 +5063,7 @@ function cellParagraphs(cell) {
4975
5063
  );
4976
5064
  return cell.blocks ? walk(cell.blocks) : cell.paragraphs;
4977
5065
  }
4978
- function stackCellBlocks(cell, width, measurer, note, top, starts) {
5066
+ function stackCellBlocks(cell, width, measurer, note, top, starts, physicalFragments = false) {
4979
5067
  if (!cell.blocks)
4980
5068
  return stackParagraphs(
4981
5069
  starts ? cell.paragraphs.filter((p) => starts.has(p.id)) : cell.paragraphs,
@@ -4996,6 +5084,7 @@ function stackCellBlocks(cell, width, measurer, note, top, starts) {
4996
5084
  y = result.heightPx;
4997
5085
  continue;
4998
5086
  }
5087
+ const edges = physicalFragments ? nestedFragmentEdges(block) : void 0;
4999
5088
  const tableWidth = block.widthPx ?? width;
5000
5089
  const profile = nestedFrameProfile(block, tableWidth);
5001
5090
  const reserveBorders = profile !== void 0;
@@ -5013,13 +5102,21 @@ function stackCellBlocks(cell, width, measurer, note, top, starts) {
5013
5102
  widthPx: paintedWidth,
5014
5103
  yPx: y,
5015
5104
  heightPx: 0,
5016
- rows: []
5105
+ rows: [],
5106
+ ...edges ? { fragmentEdges: edges } : {}
5017
5107
  };
5018
5108
  for (const row of block.rows) {
5019
5109
  if (starts && !row.cells.some((nested) => cellParagraphs(nested).some((p) => starts.has(p.id))))
5020
5110
  continue;
5111
+ const visibleRow = edges && starts && !frame.rows.length ? {
5112
+ ...row,
5113
+ cells: row.cells.map((cell2, index) => ({
5114
+ ...cell2,
5115
+ borders: { ...cell2.borders, top: edges.top[index] }
5116
+ }))
5117
+ } : row;
5021
5118
  const layout = layoutRow(
5022
- row,
5119
+ visibleRow,
5023
5120
  tableWidth,
5024
5121
  measurer,
5025
5122
  note,
@@ -5045,6 +5142,7 @@ function stackCellBlocks(cell, width, measurer, note, top, starts) {
5045
5142
  xPx: x + geometry.xPx + geometry.paddingLeftPx + (paragraph.xPx ?? 0),
5046
5143
  widthPx: paragraph.widthPx ?? Math.max(1, geometry.widthPx - geometry.paddingLeftPx - geometry.paddingRightPx),
5047
5144
  readOnly: true,
5145
+ ...edges ? { tableFragmentBottomPx: edges.bottom[index].widthPx } : {},
5048
5146
  tableFrameInsets: {
5049
5147
  top: (paragraph.tableFrameInsets?.top ?? 0) + (reserveBorders ? geometry.borders?.top?.widthPx ?? 0 : 0),
5050
5148
  bottom: (paragraph.tableFrameInsets?.bottom ?? 0) + (reserveBorders ? geometry.borders?.bottom?.widthPx ?? 0 : 0)
@@ -5093,7 +5191,7 @@ function stackParagraphs(paragraphs, widthPx, measurer, note, topPx = 0, startTo
5093
5191
  }
5094
5192
  return { heightPx: y, boxes };
5095
5193
  }
5096
- function layoutRow(row, tableWidthPx, measurer, note, remaining, startTokens, frameBorders = false, frameLeftBorderPx) {
5194
+ function layoutRow(row, tableWidthPx, measurer, note, remaining, startTokens, frameBorders = false, frameLeftBorderPx, physicalFragments = reflowNestedFragments(row)) {
5097
5195
  const count = row.cells.length || 1;
5098
5196
  let x = 0;
5099
5197
  const geometry = [];
@@ -5119,7 +5217,8 @@ function layoutRow(row, tableWidthPx, measurer, note, remaining, startTokens, fr
5119
5217
  measurer,
5120
5218
  note,
5121
5219
  padding.top,
5122
- starts
5220
+ starts,
5221
+ physicalFragments
5123
5222
  );
5124
5223
  const heightPx2 = content2.heightPx + padding.bottom;
5125
5224
  geometry.push({
@@ -5156,16 +5255,16 @@ function splitCellAtHeight(boxes, cutHeightPx, paragraphCuts) {
5156
5255
  let beforeHeightPx = 0;
5157
5256
  for (const box of boxes) {
5158
5257
  const cut = paragraphCuts?.get(box.blockId) ?? cutHeightPx;
5159
- if (box.yPx + box.heightPx + (box.tableFrameInsets?.bottom ?? 0) <= cut) {
5258
+ if (box.yPx + box.heightPx + (box.tableFragmentBottomPx ?? box.tableFrameInsets?.bottom ?? 0) <= cut) {
5160
5259
  before.push(box);
5161
5260
  beforeHeightPx = Math.max(
5162
5261
  beforeHeightPx,
5163
- box.yPx + box.heightPx + (box.tableFrameInsets?.bottom ?? 0)
5262
+ box.yPx + box.heightPx + (box.tableFragmentBottomPx ?? box.tableFrameInsets?.bottom ?? 0)
5164
5263
  );
5165
5264
  continue;
5166
5265
  }
5167
5266
  const beforeLines = box.lines.filter(
5168
- (line2) => box.yPx + line2.yPx + line2.heightPx + (box.tableFrameInsets?.bottom ?? 0) <= cut
5267
+ (line2) => box.yPx + line2.yPx + line2.heightPx + (box.tableFragmentBottomPx ?? box.tableFrameInsets?.bottom ?? 0) <= cut
5169
5268
  );
5170
5269
  const afterLines = box.lines.slice(beforeLines.length);
5171
5270
  if (beforeLines.length) {
@@ -5173,7 +5272,7 @@ function splitCellAtHeight(boxes, cutHeightPx, paragraphCuts) {
5173
5272
  before.push({ ...box, heightPx: bottom, lines: beforeLines });
5174
5273
  beforeHeightPx = Math.max(
5175
5274
  beforeHeightPx,
5176
- box.yPx + bottom + (box.tableFrameInsets?.bottom ?? 0)
5275
+ box.yPx + bottom + (box.tableFragmentBottomPx ?? box.tableFrameInsets?.bottom ?? 0)
5177
5276
  );
5178
5277
  }
5179
5278
  if (afterLines.length) {
@@ -5981,6 +6080,55 @@ function placeParagraph(cursor, placement, note) {
5981
6080
  }
5982
6081
  }
5983
6082
 
6083
+ // docx/layout/table-paragraph-keeps.ts
6084
+ function tableParagraphKeeps(table) {
6085
+ const row = table.rows[0];
6086
+ if (table.rows.length !== 1 || !row || row.cells.length !== 2 || row.heightPx !== void 0 || row.heightSpecified || row.cantSplit || row.isHeader || table.widthPx === void 0 || !Number.isFinite(table.widthPx) || table.widthPx <= 0 || !nestedFrameProfile(table, table.widthPx) || row.cells.some(
6087
+ (cell) => !cell.borders?.top || (cell.gridSpan ?? 1) !== 1 || cell.verticalMerge !== void 0 || cell.verticalAlign && cell.verticalAlign !== "top" || cell.blocks?.some((block) => block.kind !== "paragraph")
6088
+ ))
6089
+ return void 0;
6090
+ const paragraphs = row.cells.flatMap(cellParagraphs);
6091
+ if (paragraphs.some(
6092
+ (p) => p.keepNext || p.pageBreakBefore || p.footnotes?.length || p.floats?.length || p.borders || p.shading || p.widowControl !== false || p.lineSpacingRule !== "exact" || p.lineSpacingTwips === void 0 || !Number.isFinite(p.lineSpacingTwips) || p.lineSpacingTwips <= 0 || (p.spacingBeforeTwips ?? 0) !== 0 || (p.spacingAfterTwips ?? 0) !== 0 || p.runs.some((run) => run.footnoteReferenceId !== void 0 || run.breakAfter || run.object)
6093
+ ))
6094
+ return void 0;
6095
+ const sources = new Map(paragraphs.map((p) => [p.id, p]));
6096
+ if (sources.size !== paragraphs.length || !paragraphs.some((p) => p.keepLines)) return void 0;
6097
+ return new TableParagraphKeeps(sources);
6098
+ }
6099
+ var TableParagraphKeeps = class {
6100
+ constructor(sources) {
6101
+ this.sources = sources;
6102
+ }
6103
+ sources;
6104
+ /** Before an ordinary row starts, a first kept paragraph can defer the entire row. */
6105
+ startupMinimum(row) {
6106
+ return Math.max(
6107
+ 0,
6108
+ ...row.cells.map((cell, index) => {
6109
+ const first3 = cell[0];
6110
+ return first3 && this.sources.get(first3.blockId)?.keepLines ? first3.yPx + first3.heightPx + (row.cellPadding?.[index]?.bottom ?? 0) : 0;
6111
+ })
6112
+ );
6113
+ }
6114
+ /** Defer an unstarted paragraph and its following cell content, leaving other cells independent. */
6115
+ cuts(row, available, fresh) {
6116
+ const cuts = /* @__PURE__ */ new Map();
6117
+ row.cells.forEach((cell, index) => {
6118
+ const padding = row.cellPadding?.[index] ?? { top: 0, bottom: 0 };
6119
+ let deferred = false;
6120
+ for (const [position, box] of cell.entries()) {
6121
+ const source = this.sources.get(box.blockId);
6122
+ const atFreshOrigin = fresh && position === 0 && Math.abs(box.yPx - padding.top) < 1e-6;
6123
+ if (!deferred && source?.keepLines && (box.lines[0]?.firstToken ?? 0) === 0 && box.yPx + box.heightPx + padding.bottom > available + 1e-6 && !atFreshOrigin)
6124
+ deferred = true;
6125
+ if (deferred) cuts.set(box.blockId, 0);
6126
+ }
6127
+ });
6128
+ return cuts.size ? cuts : void 0;
6129
+ }
6130
+ };
6131
+
5984
6132
  // docx/layout/table-note-stories.ts
5985
6133
  function independentNoteStories(cell) {
5986
6134
  const first3 = cell.blocks?.[0];
@@ -6020,7 +6168,7 @@ function measuredNoteReferences(paragraphs) {
6020
6168
  }
6021
6169
 
6022
6170
  // docx/layout/table-border-layout.ts
6023
- function layoutBorderedRow(row, width, measurer, note, profile, remaining) {
6171
+ function layoutBorderedRow(row, width, measurer, note, profile, remaining, physicalFragments) {
6024
6172
  const reserved = profile !== void 0 && (profile.leftPx > 0 || profile.rightPx > 0 || profile.bottomPx > 0);
6025
6173
  const layout = layoutRow(
6026
6174
  row,
@@ -6030,7 +6178,8 @@ function layoutBorderedRow(row, width, measurer, note, profile, remaining) {
6030
6178
  remaining,
6031
6179
  void 0,
6032
6180
  reserved,
6033
- profile?.leftPx
6181
+ profile?.leftPx,
6182
+ physicalFragments
6034
6183
  );
6035
6184
  if (!reserved) return layout;
6036
6185
  const bottom = Math.max(0, ...layout.geometry.map((cell) => cell.borders?.bottom?.widthPx ?? 0));
@@ -6330,6 +6479,12 @@ var TableFootnotes = class {
6330
6479
  function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6331
6480
  const firstBodyRow = table.rows.findIndex((row) => !row.isHeader);
6332
6481
  const headerRows = table.rows.slice(0, firstBodyRow < 0 ? table.rows.length : firstBodyRow);
6482
+ const nativeFragments = new Map(table.rows.map((row) => [row, reflowNestedFragments(row)]));
6483
+ const paragraphKeeps = tableParagraphKeeps(table);
6484
+ const hasParagraphKeeps = table.rows.some(
6485
+ (row) => row.cells.some((cell) => cellParagraphs(cell).some((paragraph) => paragraph.keepLines))
6486
+ );
6487
+ let keepWarning = false;
6333
6488
  const xPosition = () => {
6334
6489
  const width = (table.widthPx ?? cursor.columnWidthPx) + (activeBorders ? (profile.leftPx + profile.rightPx) / 2 : 0);
6335
6490
  return table.alignment === "center" ? Math.max(0, (cursor.columnWidthPx - width) / 2) : table.alignment === "right" ? Math.max(0, cursor.columnWidthPx - width) : table.indentPx ?? 0;
@@ -6340,13 +6495,14 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6340
6495
  note(
6341
6496
  "Ordinary table border occupancy remains approximate for missing edges, non-solid or conflicting shared borders and changing row grids."
6342
6497
  );
6343
- const layoutRow2 = (row, width, m, n2, remaining) => layoutBorderedRow(
6498
+ const layoutRow2 = (row, width, m, n2, remaining, sourceRow = row) => layoutBorderedRow(
6344
6499
  row,
6345
6500
  activeBorders ? table.widthPx ?? width : width,
6346
6501
  m,
6347
6502
  n2,
6348
6503
  profile,
6349
- remaining
6504
+ remaining,
6505
+ nativeFragments.get(sourceRow) ?? false
6350
6506
  );
6351
6507
  const fragmentBorders = new TableFragmentBorders();
6352
6508
  let fragmentRows = [];
@@ -6403,6 +6559,17 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6403
6559
  let remainingRow = initial;
6404
6560
  while (remainingRow) {
6405
6561
  fragmentHeight += fragmentBorders.remove(fragmentRows.at(-1));
6562
+ const keeps = paragraphKeeps && cursor.page.columns.length === 1 && cursor.column.startYPx === void 0 && Math.abs(cursor.remainingHeightPx() - (cursor.columnHeightPx - cursor.usedColumnHeightPx)) < 1e-6 ? paragraphKeeps : void 0;
6563
+ if (hasParagraphKeeps && !keeps && !keepWarning) {
6564
+ note(
6565
+ "Table-cell keep-lines pagination remains approximate outside the measured ordinary automatic two-cell, top-aligned, single-column, note-free row with direct exact-spaced paragraphs, zero paragraph spacing and widow control off."
6566
+ );
6567
+ keepWarning = true;
6568
+ }
6569
+ if (keeps && remainingRow === initial && !cursor.atColumnTop && keeps.startupMinimum(remainingRow) > cursor.remainingHeightPx() - fragmentHeight + 1e-6) {
6570
+ startNewFragment();
6571
+ continue;
6572
+ }
6406
6573
  const minimum = cantSplit ? Math.min(remainingRow.heightPx, cursor.columnHeightPx) : Math.min(
6407
6574
  ...remainingRow.cells.flatMap(
6408
6575
  (cell, index) => cell.map(
@@ -6419,7 +6586,8 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6419
6586
  cursor.columnWidthPx,
6420
6587
  measurer,
6421
6588
  note,
6422
- remainingRow.cells
6589
+ remainingRow.cells,
6590
+ row
6423
6591
  );
6424
6592
  if (fragmentRows.length) {
6425
6593
  fragmentRows = [];
@@ -6429,7 +6597,7 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6429
6597
  continue;
6430
6598
  }
6431
6599
  }
6432
- if (footnotes) {
6600
+ if (footnotes && !keeps) {
6433
6601
  const selected = footnotes.choose(remainingRow, cantSplit);
6434
6602
  if (selected) {
6435
6603
  if (selected.layout === remainingRow) {
@@ -6451,7 +6619,8 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6451
6619
  cursor.columnWidthPx,
6452
6620
  measurer,
6453
6621
  note,
6454
- after2.cells
6622
+ after2.cells,
6623
+ row
6455
6624
  ) : after2;
6456
6625
  continue;
6457
6626
  }
@@ -6464,7 +6633,8 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6464
6633
  cursor.columnWidthPx,
6465
6634
  measurer,
6466
6635
  note,
6467
- remainingRow === initial ? void 0 : remainingRow.cells
6636
+ remainingRow === initial ? void 0 : remainingRow.cells,
6637
+ row
6468
6638
  );
6469
6639
  continue;
6470
6640
  }
@@ -6499,7 +6669,17 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6499
6669
  remainingRow = null;
6500
6670
  continue;
6501
6671
  }
6502
- const { before, after } = splitRowAtHeight(remainingRow, Math.max(0, remaining));
6672
+ const paragraphCuts = keeps?.cuts(
6673
+ remainingRow,
6674
+ remaining,
6675
+ cursor.atColumnTop && fragmentRows.length === 0
6676
+ );
6677
+ const { before, after } = splitRowAtHeight(
6678
+ remainingRow,
6679
+ Math.max(0, remaining),
6680
+ void 0,
6681
+ paragraphCuts
6682
+ );
6503
6683
  if (!before.cells.some((cell) => cell.length) && cursor.atColumnTop && fragmentRows.every((row2) => row2.repeated)) {
6504
6684
  note(
6505
6685
  "A table row cannot fit a line in an empty page/column and was placed without splitting."
@@ -6511,17 +6691,24 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6511
6691
  const previousWidth = cursor.columnWidthPx;
6512
6692
  if (before.cells.some((cell) => cell.length)) fragmentRows.push(toRowBox(before, false));
6513
6693
  startNewFragment();
6514
- remainingRow = after && previousWidth !== cursor.columnWidthPx ? layoutRow2(
6694
+ remainingRow = after && (paragraphCuts || previousWidth !== cursor.columnWidthPx || nativeFragments.get(row)) ? layoutRow2(
6515
6695
  { ...row, heightPx: 0, heightRule: "atLeast" },
6516
6696
  cursor.columnWidthPx,
6517
6697
  measurer,
6518
6698
  note,
6519
- after.cells
6699
+ after.cells,
6700
+ row
6520
6701
  ) : after;
6521
6702
  }
6522
6703
  }
6523
6704
  for (const row of table.rows) {
6524
6705
  const layout = layoutRow2(row, cursor.columnWidthPx, measurer, note);
6706
+ if (layout.heightPx > cursor.remainingHeightPx() && !nativeFragments.get(row) && row.cells.some(
6707
+ (cell) => cell.blocks?.some((block) => block.kind === "table" && block.rows.length > 1)
6708
+ ))
6709
+ note(
6710
+ "Nested physical border edges at page cuts remain approximate outside automatic, top-aligned tables with two or more two-cell, note-free rows, direct paragraphs and complete shared borders."
6711
+ );
6525
6712
  if (activeBorders && layout.heightPx > cursor.remainingHeightPx() && row.cells.some(
6526
6713
  (cell) => (!measuredNoteReferences(row.cells.flatMap(cellParagraphs)) || !independentNoteStories(cell)) && cell.blocks?.some((block) => block.kind === "table") && cellParagraphs(cell).some((p) => p.footnotes?.length)
6527
6714
  ))
@@ -6785,9 +6972,9 @@ var SectionFlow = class {
6785
6972
  const page = this.cursor.page;
6786
6973
  const exclusions = this.exclusions?.get(page.index);
6787
6974
  if (!exclusions) return void 0;
6788
- const plain = this.paragraphLayout(index);
6975
+ const plain2 = this.paragraphLayout(index);
6789
6976
  const topPx = page.marginTopPx + this.cursor.y + spacingBeforePx;
6790
- const bottomPx = topPx + plain.contentHeightPx;
6977
+ const bottomPx = topPx + plain2.contentHeightPx;
6791
6978
  if (!exclusions.some((item) => item.yPx < bottomPx && item.yPx + item.heightPx > topPx))
6792
6979
  return void 0;
6793
6980
  return layoutParagraph(
@@ -7052,6 +7239,7 @@ function border(side, theme, preserveSingleWidth = false) {
7052
7239
  function rowLayout(props) {
7053
7240
  if (!props) return {};
7054
7241
  return {
7242
+ ...props.heightTwips !== void 0 ? { heightSpecified: true } : {},
7055
7243
  ...props.heightTwips ? { heightPx: twipsToPx2(props.heightTwips), heightRule: props.heightRule ?? "atLeast" } : {},
7056
7244
  ...props.cantSplit ? { cantSplit: true } : {},
7057
7245
  ...props.header ? { isHeader: true } : {}
@@ -7116,6 +7304,8 @@ function adaptTable(table, model, adaptParagraph, _nested = false) {
7116
7304
  const fill = cssHex(visuals.shadingFill);
7117
7305
  return {
7118
7306
  paragraphs: cell.paragraphs.map(adaptParagraph),
7307
+ ...cell.gridSpan !== void 0 ? { gridSpan: cell.gridSpan } : {},
7308
+ ...cell.verticalMerge ? { verticalMerge: cell.verticalMerge } : {},
7119
7309
  ...cell.sourceBlocks ? {
7120
7310
  blocks: cellSourceBlocks(cell).map(
7121
7311
  (block) => block.type === "paragraph" ? adaptParagraph(block) : adaptTable(block, model, adaptParagraph, true)
@@ -7685,4 +7875,18 @@ function cssFontStack(family) {
7685
7875
  );
7686
7876
  }
7687
7877
 
7688
- export { DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE_PT, DEFAULT_TAB_STOP_PX, FLOAT_WRAP_NOTE, NO_TWIPS, PageCursor, SINGLE_LINE_SPACING_UNITS, adaptDocumentModel, adjustForWidowOrphan, appendBreakMarker, cellVerticalOffset, createFakeMeasurer, cssFontStack, fieldDisplayText, floatPosition, fontMetrics, headerFooterForPage, isEastAsianChar, layoutDocument, layoutDocumentModel, layoutParagraph, layoutRow, layoutSections, ligatureCss, pageNumberValues, pageNumbers, paragraphFloats, placeParagraph, placeTab, placeTable, positionFloats, ptToPx, pxToTwips, sectionPageCounts, splitRowAtHeight, suppressesSpacing, tokenizeRun, twipsToPx, widowControlEnabled };
7878
+ // docx/layout/layout-session.ts
7879
+ function createLayoutSession(measurer) {
7880
+ const sessionMeasurer = {
7881
+ widthOf: (text2, font) => measurer.widthOf(text2, font),
7882
+ lineHeightOf: (font) => measurer.lineHeightOf(font),
7883
+ ...measurer.ascentOf ? { ascentOf: measurer.ascentOf.bind(measurer) } : {}
7884
+ };
7885
+ registerParagraphCache(sessionMeasurer);
7886
+ return {
7887
+ layoutDocument: (input) => layoutDocument(input, sessionMeasurer),
7888
+ layoutDocumentModel: (model, options = {}) => layoutDocumentModel(model, sessionMeasurer, options)
7889
+ };
7890
+ }
7891
+
7892
+ export { DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE_PT, DEFAULT_TAB_STOP_PX, FLOAT_WRAP_NOTE, NO_TWIPS, PageCursor, SINGLE_LINE_SPACING_UNITS, adaptDocumentModel, adjustForWidowOrphan, appendBreakMarker, cellVerticalOffset, createFakeMeasurer, createLayoutSession, cssFontStack, fieldDisplayText, floatPosition, fontMetrics, headerFooterForPage, isEastAsianChar, layoutDocument, layoutDocumentModel, layoutParagraph, layoutRow, layoutSections, ligatureCss, pageNumberValues, pageNumbers, paragraphFloats, placeParagraph, placeTab, placeTable, positionFloats, ptToPx, pxToTwips, sectionPageCounts, splitRowAtHeight, suppressesSpacing, tokenizeRun, twipsToPx, widowControlEnabled };
@@ -155,6 +155,9 @@ export interface LayoutCellPadding {
155
155
  }
156
156
  export interface LayoutTableCell {
157
157
  paragraphs: LayoutParagraph[];
158
+ /** Source merge provenance, retained for bounded paragraph-keeping admission. */
159
+ gridSpan?: number;
160
+ verticalMerge?: 'restart' | 'continue';
158
161
  /** Source child order including read-only nested table stories. */
159
162
  blocks?: LayoutBlock[];
160
163
  /** Column width in CSS pixels; undefined cells share the row's remaining width evenly. */
@@ -170,6 +173,8 @@ export interface LayoutTableCell {
170
173
  }
171
174
  export interface LayoutTableRow {
172
175
  cells: LayoutTableCell[];
176
+ /** Source height provenance, including zero heights not retained by the existing box adapter. */
177
+ heightSpecified?: boolean;
173
178
  /** `w:trPr/w:cantSplit`: this row must stay on one page. */
174
179
  cantSplit?: boolean;
175
180
  /** `w:trHeight`: a minimum (`atLeast`) or fixed (`exact`) row height. */
@@ -1 +1 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../docx/layout/input.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../docx/layout/input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { DocumentModel } from '../index.js';
2
+ import type { LayoutDocumentInput } from './input.js';
3
+ import type { TextMeasurer } from './measure.js';
4
+ import type { LayoutReviewOptions } from './review-display.js';
5
+ /** Reuses measured paragraphs across edits. Create a new session when font metrics change. */
6
+ export declare function createLayoutSession(measurer: TextMeasurer): {
7
+ layoutDocument: (input: LayoutDocumentInput) => import("./result.js").LayoutResult;
8
+ layoutDocumentModel: (model: DocumentModel, options?: LayoutReviewOptions) => import("./result.js").LayoutResult;
9
+ };
10
+ //# sourceMappingURL=layout-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-session.d.ts","sourceRoot":"","sources":["../../../docx/layout/layout-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY;IAQxD,cAAc,UAAU,mBAAmB;IAC3C,mBAAmB,UAAU,aAAa,YAAW,mBAAmB;EAGzE"}
@@ -0,0 +1,9 @@
1
+ import type { LayoutTable, LayoutTableRow } from './input.js';
2
+ /** Two or more automatic top-aligned rows with direct paragraphs and complete shared edges. */
3
+ export declare function nestedFragmentEdges(table: LayoutTable): {
4
+ top: (import("./input.js").LayoutBorder | undefined)[];
5
+ bottom: (import("./input.js").LayoutBorder | undefined)[];
6
+ } | undefined;
7
+ /** The enclosing story must also remain within the measured automatic, note-free profile. */
8
+ export declare function reflowNestedFragments(row: LayoutTableRow): boolean;
9
+ //# sourceMappingURL=nested-fragment-edges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nested-fragment-edges.d.ts","sourceRoot":"","sources":["../../../docx/layout/nested-fragment-edges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAQ5E,+FAA+F;AAC/F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW;;;cA8BrD;AACD,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAsBlE"}
@@ -0,0 +1,8 @@
1
+ import type { TextMeasurer } from './measure.js';
2
+ import type { ParagraphLayoutResult } from './paragraph-layout.js';
3
+ export declare function registerParagraphCache(measurer: TextMeasurer): void;
4
+ export declare function cachedParagraphLayout(measurer: TextMeasurer, key: () => {
5
+ index: string;
6
+ signature: string;
7
+ }, note: (message: string) => void, compute: (note: (message: string) => void) => ParagraphLayoutResult): ParagraphLayoutResult;
8
+ //# sourceMappingURL=paragraph-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paragraph-cache.d.ts","sourceRoot":"","sources":["../../../docx/layout/paragraph-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAWhE,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAEnE;AAED,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,YAAY,EACtB,GAAG,EAAE,MAAM;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC/C,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,KAAK,qBAAqB,GACjE,qBAAqB,CAkBvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"paragraph-layout.d.ts","sourceRoot":"","sources":["../../../docx/layout/paragraph-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,KAAK,EAAkB,UAAU,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAe/C,MAAM,WAAW,qBAAqB;IACrC,uFAAuF;IACvF,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,oFAAoF;IACpF,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,uEAAuE;IACvE,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAC7B;AAED;;;;;;GAMG;AACH;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,CACvB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,KACZ;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,wBAAgB,eAAe,CAC9B,SAAS,EAAE,eAAe,EAC1B,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EAC/B,OAAO,CAAC,EAAE,SAAS,EACnB,UAAU,SAAI,GACZ,qBAAqB,CAoQvB"}
1
+ {"version":3,"file":"paragraph-layout.d.ts","sourceRoot":"","sources":["../../../docx/layout/paragraph-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,KAAK,EAAkB,UAAU,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAgB/C,MAAM,WAAW,qBAAqB;IACrC,uFAAuF;IACvF,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,oFAAoF;IACpF,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,uEAAuE;IACvE,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAC7B;AAED;;;;;;GAMG;AACH;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,CACvB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,KACZ;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,wBAAgB,eAAe,CAC9B,SAAS,EAAE,eAAe,EAC1B,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EAC/B,OAAO,CAAC,EAAE,SAAS,EACnB,UAAU,SAAI,GACZ,qBAAqB,CAavB"}