ooxml-core 1.0.0 → 1.1.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 (230) hide show
  1. package/dist/{PptxHandler-G63S6YZU.mjs → PptxHandler-75LOVF7I.mjs} +2 -2
  2. package/dist/automation/index.cjs +2559 -1169
  3. package/dist/automation/index.mjs +2559 -1169
  4. package/dist/chart/gradient-definition.d.ts +2 -2
  5. package/dist/chart/gradient-definition.d.ts.map +1 -1
  6. package/dist/chart/index.cjs +7 -7
  7. package/dist/chart/index.mjs +7 -7
  8. package/dist/{chunk-BICQYRPW.mjs → chunk-75LA7H3F.mjs} +1339 -1435
  9. package/dist/{chunk-CKJSWE7N.mjs → chunk-LA7D6ZYQ.mjs} +244 -115
  10. package/dist/{chunk-ROM5MZ7O.mjs → chunk-OMGH6IKY.mjs} +3 -3
  11. package/dist/{chunk-RWXFQJVF.mjs → chunk-Q27H4HFS.mjs} +1 -1
  12. package/dist/{chunk-DDG5HTGX.mjs → chunk-RFX7AJDZ.mjs} +1 -1
  13. package/dist/crypto/index.cjs +1406 -184
  14. package/dist/crypto/index.mjs +1406 -184
  15. package/dist/diagram/dom.d.ts +1 -14
  16. package/dist/diagram/dom.d.ts.map +1 -1
  17. package/dist/diagram/index.cjs +15 -15
  18. package/dist/diagram/index.d.ts +12 -12
  19. package/dist/diagram/index.d.ts.map +1 -1
  20. package/dist/diagram/index.mjs +15 -15
  21. package/dist/diagram/types.d.ts +12 -148
  22. package/dist/diagram/types.d.ts.map +1 -1
  23. package/dist/digest/algorithm-names.d.ts +2 -2
  24. package/dist/digest/algorithm-names.d.ts.map +1 -1
  25. package/dist/digest/bit-ops.d.ts +30 -0
  26. package/dist/digest/bit-ops.d.ts.map +1 -0
  27. package/dist/digest/digest.d.ts +2 -2
  28. package/dist/digest/digest.d.ts.map +1 -1
  29. package/dist/digest/index.cjs +1319 -90
  30. package/dist/digest/index.d.ts +7 -1
  31. package/dist/digest/index.d.ts.map +1 -1
  32. package/dist/digest/index.mjs +1313 -91
  33. package/dist/digest/md2.d.ts +22 -0
  34. package/dist/digest/md2.d.ts.map +1 -0
  35. package/dist/digest/md4.d.ts +3 -0
  36. package/dist/digest/md4.d.ts.map +1 -0
  37. package/dist/digest/md5.d.ts +3 -0
  38. package/dist/digest/md5.d.ts.map +1 -0
  39. package/dist/digest/password-hash.d.ts +7 -0
  40. package/dist/digest/password-hash.d.ts.map +1 -1
  41. package/dist/digest/ripemd-functions.d.ts +18 -0
  42. package/dist/digest/ripemd-functions.d.ts.map +1 -0
  43. package/dist/digest/ripemd128.d.ts +3 -0
  44. package/dist/digest/ripemd128.d.ts.map +1 -0
  45. package/dist/digest/ripemd160.d.ts +3 -0
  46. package/dist/digest/ripemd160.d.ts.map +1 -0
  47. package/dist/digest/whirlpool-sbox.d.ts +15 -0
  48. package/dist/digest/whirlpool-sbox.d.ts.map +1 -0
  49. package/dist/digest/whirlpool-table.d.ts +12 -0
  50. package/dist/digest/whirlpool-table.d.ts.map +1 -0
  51. package/dist/digest/whirlpool.d.ts +3 -0
  52. package/dist/digest/whirlpool.d.ts.map +1 -0
  53. package/dist/docx/block-parser.d.ts.map +1 -1
  54. package/dist/docx/diagram-theme.d.ts +3 -3
  55. package/dist/docx/diagram-theme.d.ts.map +1 -1
  56. package/dist/docx/embedded.cjs +470 -276
  57. package/dist/docx/embedded.mjs +470 -276
  58. package/dist/docx/field-flags.d.ts +8 -0
  59. package/dist/docx/field-flags.d.ts.map +1 -0
  60. package/dist/docx/field-lock.d.ts +6 -0
  61. package/dist/docx/field-lock.d.ts.map +1 -0
  62. package/dist/docx/field-runs.d.ts +4 -1
  63. package/dist/docx/field-runs.d.ts.map +1 -1
  64. package/dist/docx/index.cjs +1029 -850
  65. package/dist/docx/index.d.ts +2 -0
  66. package/dist/docx/index.d.ts.map +1 -1
  67. package/dist/docx/index.mjs +1027 -850
  68. package/dist/docx/layout/adapter.d.ts.map +1 -1
  69. package/dist/docx/layout/index.cjs +61 -47
  70. package/dist/docx/layout/index.mjs +61 -47
  71. package/dist/docx/layout/page-fields.d.ts.map +1 -1
  72. package/dist/docx/load/index.cjs +1883 -467
  73. package/dist/docx/load/index.mjs +1883 -467
  74. package/dist/docx/model-run.d.ts +5 -0
  75. package/dist/docx/model-run.d.ts.map +1 -1
  76. package/dist/docx/numbering-model.d.ts +1 -1
  77. package/dist/docx/numbering-model.d.ts.map +1 -1
  78. package/dist/docx/numbering-package.d.ts +4 -4
  79. package/dist/docx/numbering-package.d.ts.map +1 -1
  80. package/dist/docx/numbering-start-edit.d.ts +8 -0
  81. package/dist/docx/numbering-start-edit.d.ts.map +1 -0
  82. package/dist/docx/numbering-start-patch.d.ts +13 -0
  83. package/dist/docx/numbering-start-patch.d.ts.map +1 -0
  84. package/dist/docx/theme-color.d.ts.map +1 -1
  85. package/dist/docx/theme-model.d.ts +3 -2
  86. package/dist/docx/theme-model.d.ts.map +1 -1
  87. package/dist/docx/theme.d.ts +5 -1
  88. package/dist/docx/theme.d.ts.map +1 -1
  89. package/dist/docx/ui/field-guard.d.ts +2 -0
  90. package/dist/docx/ui/field-guard.d.ts.map +1 -1
  91. package/dist/docx/ui/field-results.d.ts.map +1 -1
  92. package/dist/docx/ui/index.cjs +547 -375
  93. package/dist/docx/ui/index.mjs +547 -376
  94. package/dist/docx/ui/review-commands.d.ts.map +1 -1
  95. package/dist/docx/ui/run-extra-mark.d.ts +1 -1
  96. package/dist/docx/ui/run-extra-mark.d.ts.map +1 -1
  97. package/dist/docx/ui/simple-field-input.d.ts +3 -0
  98. package/dist/docx/ui/simple-field-input.d.ts.map +1 -1
  99. package/dist/docx/ui/track-changes-mode.d.ts.map +1 -1
  100. package/dist/docx/ui/track-paragraph-boundaries.d.ts +5 -0
  101. package/dist/docx/ui/track-paragraph-boundaries.d.ts.map +1 -0
  102. package/dist/docx/write-inline.d.ts.map +1 -1
  103. package/dist/docx/write-run.d.ts.map +1 -1
  104. package/dist/drawingml/dom.d.ts +15 -0
  105. package/dist/drawingml/dom.d.ts.map +1 -0
  106. package/dist/drawingml/drawing-color-brightness.d.ts +6 -0
  107. package/dist/drawingml/drawing-color-brightness.d.ts.map +1 -0
  108. package/dist/drawingml/drawing-color-css.d.ts.map +1 -0
  109. package/dist/{diagram → drawingml}/drawing-color.d.ts +5 -5
  110. package/dist/drawingml/drawing-color.d.ts.map +1 -0
  111. package/dist/{diagram → drawingml}/drawing-fill.d.ts +3 -3
  112. package/dist/drawingml/drawing-fill.d.ts.map +1 -0
  113. package/dist/{diagram → drawingml}/drawing-geometry.d.ts +4 -4
  114. package/dist/drawingml/drawing-geometry.d.ts.map +1 -0
  115. package/dist/drawingml/drawing-shadow.d.ts.map +1 -0
  116. package/dist/{diagram → drawingml}/drawing-text.d.ts +2 -2
  117. package/dist/drawingml/drawing-text.d.ts.map +1 -0
  118. package/dist/{diagram → drawingml}/gradient-geometry.d.ts +2 -2
  119. package/dist/drawingml/gradient-geometry.d.ts.map +1 -0
  120. package/dist/drawingml/gradient-preset-data.d.ts.map +1 -0
  121. package/dist/{diagram → drawingml}/gradient-presets.d.ts +3 -3
  122. package/dist/drawingml/gradient-presets.d.ts.map +1 -0
  123. package/dist/drawingml/index.cjs +1545 -0
  124. package/dist/drawingml/index.d.ts +19 -0
  125. package/dist/drawingml/index.d.ts.map +1 -0
  126. package/dist/drawingml/index.mjs +1497 -0
  127. package/dist/{diagram → drawingml}/ordered-color-transforms.d.ts +2 -2
  128. package/dist/drawingml/ordered-color-transforms.d.ts.map +1 -0
  129. package/dist/drawingml/rect-path-gradient.d.ts.map +1 -0
  130. package/dist/drawingml/theme-color.d.ts +19 -0
  131. package/dist/drawingml/theme-color.d.ts.map +1 -0
  132. package/dist/drawingml/theme-model.d.ts +40 -0
  133. package/dist/drawingml/theme-model.d.ts.map +1 -0
  134. package/dist/drawingml/theme.d.ts +21 -0
  135. package/dist/drawingml/theme.d.ts.map +1 -0
  136. package/dist/drawingml/types.d.ts +152 -0
  137. package/dist/drawingml/types.d.ts.map +1 -0
  138. package/dist/drawingml/write-color.d.ts +4 -0
  139. package/dist/drawingml/write-color.d.ts.map +1 -0
  140. package/dist/{diagram → drawingml}/write-fill.d.ts +2 -2
  141. package/dist/drawingml/write-fill.d.ts.map +1 -0
  142. package/dist/geometry/connector-elbow-geometry.d.ts +14 -0
  143. package/dist/geometry/connector-elbow-geometry.d.ts.map +1 -1
  144. package/dist/geometry/index.cjs +43 -0
  145. package/dist/geometry/index.mjs +42 -1
  146. package/dist/i18n/dictionary.d.ts +13 -0
  147. package/dist/i18n/dictionary.d.ts.map +1 -0
  148. package/dist/i18n/index.cjs +68 -0
  149. package/dist/i18n/index.d.ts +4 -0
  150. package/dist/i18n/index.d.ts.map +1 -0
  151. package/dist/i18n/index.mjs +60 -0
  152. package/dist/i18n/locale.d.ts +17 -0
  153. package/dist/i18n/locale.d.ts.map +1 -0
  154. package/dist/i18n/translator.d.ts +18 -0
  155. package/dist/i18n/translator.d.ts.map +1 -0
  156. package/dist/index.cjs +3712 -2178
  157. package/dist/index.d.ts +2 -0
  158. package/dist/index.d.ts.map +1 -1
  159. package/dist/index.mjs +3711 -2179
  160. package/dist/pptx/automation/index.cjs +2852 -1568
  161. package/dist/pptx/automation/index.d.ts +3 -3
  162. package/dist/pptx/automation/index.mjs +5 -5
  163. package/dist/pptx/chunks/{index-C4mfzVoY.d.ts → index-BHqL5KXH.d.ts} +2 -2
  164. package/dist/pptx/chunks/{index-C4mfzVoY.d.ts.map → index-BHqL5KXH.d.ts.map} +1 -1
  165. package/dist/pptx/chunks/{index-lk7dyOPS.d.ts → index-BYkdcS8J.d.ts} +12 -16
  166. package/dist/pptx/chunks/index-BYkdcS8J.d.ts.map +1 -0
  167. package/dist/pptx/chunks/smart-art-CO2jmJFf.d.ts.map +1 -1
  168. package/dist/pptx/chunks/{text-operations-CDLx4hD5.d.ts → text-operations-DEJ7alZR.d.ts} +2 -2
  169. package/dist/pptx/chunks/text-operations-DEJ7alZR.d.ts.map +1 -0
  170. package/dist/pptx/cli/index.cjs +2680 -1396
  171. package/dist/pptx/cli/index.d.ts +1 -1
  172. package/dist/pptx/cli/index.mjs +4 -4
  173. package/dist/pptx/converter/index.d.ts +1 -1
  174. package/dist/pptx/converter/index.mjs +2 -2
  175. package/dist/pptx/index.cjs +1771 -1756
  176. package/dist/pptx/index.d.ts +3 -3
  177. package/dist/pptx/index.mjs +5 -5
  178. package/dist/teams/index.cjs +144 -74
  179. package/dist/teams/index.mjs +144 -74
  180. package/dist/visio/ui/index.cjs +14 -3
  181. package/dist/visio/ui/index.mjs +14 -3
  182. package/dist/visio/ui/shape-rotation.d.ts +1 -1
  183. package/dist/visio/ui/shape-rotation.d.ts.map +1 -1
  184. package/dist/xlsx/edit/chart-series-gradient.d.ts +1 -1
  185. package/dist/xlsx/edit/chart-series-gradient.d.ts.map +1 -1
  186. package/dist/xlsx/edit/protection.d.ts +1 -1
  187. package/dist/xlsx/index.cjs +3222 -1886
  188. package/dist/xlsx/index.mjs +3222 -1886
  189. package/dist/xlsx/layout/chart-appearance.d.ts +1 -1
  190. package/dist/xlsx/layout/chart-appearance.d.ts.map +1 -1
  191. package/dist/xlsx/layout/chart-scale.d.ts +5 -1
  192. package/dist/xlsx/layout/chart-scale.d.ts.map +1 -1
  193. package/dist/xlsx/layout/chart-svg-legend.d.ts +13 -0
  194. package/dist/xlsx/layout/chart-svg-legend.d.ts.map +1 -0
  195. package/dist/xlsx/layout/chart-svg.d.ts.map +1 -1
  196. package/dist/xlsx/layout/chart-view.d.ts +3 -1
  197. package/dist/xlsx/layout/chart-view.d.ts.map +1 -1
  198. package/dist/xlsx/load/index.cjs +2110 -838
  199. package/dist/xlsx/load/index.mjs +2110 -838
  200. package/dist/xlsx/read/theme.d.ts +2 -4
  201. package/dist/xlsx/read/theme.d.ts.map +1 -1
  202. package/dist/xlsx/ui/index.cjs +2017 -771
  203. package/dist/xlsx/ui/index.mjs +2017 -771
  204. package/dist/xlsx/ui/locales/merge.d.ts +2 -1
  205. package/dist/xlsx/ui/locales/merge.d.ts.map +1 -1
  206. package/dist/xlsx/ui/localization.d.ts.map +1 -1
  207. package/dist/xlsx/write/theme.d.ts.map +1 -1
  208. package/package.json +11 -1
  209. package/dist/diagram/drawing-color-brightness.d.ts +0 -6
  210. package/dist/diagram/drawing-color-brightness.d.ts.map +0 -1
  211. package/dist/diagram/drawing-color-css.d.ts.map +0 -1
  212. package/dist/diagram/drawing-color.d.ts.map +0 -1
  213. package/dist/diagram/drawing-fill.d.ts.map +0 -1
  214. package/dist/diagram/drawing-geometry.d.ts.map +0 -1
  215. package/dist/diagram/drawing-shadow.d.ts.map +0 -1
  216. package/dist/diagram/drawing-text.d.ts.map +0 -1
  217. package/dist/diagram/gradient-geometry.d.ts.map +0 -1
  218. package/dist/diagram/gradient-preset-data.d.ts.map +0 -1
  219. package/dist/diagram/gradient-presets.d.ts.map +0 -1
  220. package/dist/diagram/ordered-color-transforms.d.ts.map +0 -1
  221. package/dist/diagram/rect-path-gradient.d.ts.map +0 -1
  222. package/dist/diagram/write-color.d.ts +0 -4
  223. package/dist/diagram/write-color.d.ts.map +0 -1
  224. package/dist/diagram/write-fill.d.ts.map +0 -1
  225. package/dist/pptx/chunks/index-lk7dyOPS.d.ts.map +0 -1
  226. package/dist/pptx/chunks/text-operations-CDLx4hD5.d.ts.map +0 -1
  227. /package/dist/{diagram → drawingml}/drawing-color-css.d.ts +0 -0
  228. /package/dist/{diagram → drawingml}/drawing-shadow.d.ts +0 -0
  229. /package/dist/{diagram → drawingml}/gradient-preset-data.d.ts +0 -0
  230. /package/dist/{diagram → drawingml}/rect-path-gradient.d.ts +0 -0
@@ -1606,13 +1606,296 @@ function resolveTableStyleFormatting(tableStyleId, catalog, look, rowIndex, rowC
1606
1606
  return result;
1607
1607
  }
1608
1608
 
1609
- // docx/theme-color.ts
1610
- function isThemeColorToken(value) {
1611
- return isStThemeColor(value);
1609
+ // color/color-primitives.ts
1610
+ function clampUnitInterval(value) {
1611
+ return Math.min(1, Math.max(0, value));
1612
+ }
1613
+ function hexToRgbChannels(color) {
1614
+ const normalized = color.replace("#", "");
1615
+ if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {
1616
+ return null;
1617
+ }
1618
+ return {
1619
+ r: Number.parseInt(normalized.slice(0, 2), 16),
1620
+ g: Number.parseInt(normalized.slice(2, 4), 16),
1621
+ b: Number.parseInt(normalized.slice(4, 6), 16)
1622
+ };
1623
+ }
1624
+ function percentDivisorFor(text) {
1625
+ return text.endsWith("%") ? 100 : 1e5;
1626
+ }
1627
+ function parseOoxmlPercent(value) {
1628
+ const text = String(value ?? "").trim();
1629
+ const divisor = percentDivisorFor(text);
1630
+ const magnitude = Number.parseFloat(divisor === 100 ? text.slice(0, -1) : text);
1631
+ if (!Number.isFinite(magnitude)) {
1632
+ return void 0;
1633
+ }
1634
+ return magnitude / divisor;
1635
+ }
1636
+ function parseDrawingPercent(value) {
1637
+ const parsed = parseOoxmlPercent(value);
1638
+ return parsed === void 0 ? void 0 : clampUnitInterval(parsed);
1639
+ }
1640
+ function scrgbLinearToSrgb8(linear) {
1641
+ const l = Math.min(1, Math.max(0, linear));
1642
+ const companded = l <= 31308e-7 ? 12.92 * l : 1.055 * l ** (1 / 2.4) - 0.055;
1643
+ return Math.min(255, Math.max(0, Math.round(companded * 255)));
1612
1644
  }
1613
1645
  function toHex(value) {
1614
1646
  return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
1615
1647
  }
1648
+ function rgbToHsl(r, g, b) {
1649
+ const rN = r / 255;
1650
+ const gN = g / 255;
1651
+ const bN = b / 255;
1652
+ const cMax = Math.max(rN, gN, bN);
1653
+ const cMin = Math.min(rN, gN, bN);
1654
+ const delta = cMax - cMin;
1655
+ const l = (cMax + cMin) / 2;
1656
+ let s = 0;
1657
+ if (delta !== 0) {
1658
+ s = delta / (1 - Math.abs(2 * l - 1));
1659
+ }
1660
+ let h = 0;
1661
+ if (delta !== 0) {
1662
+ if (cMax === rN) {
1663
+ h = 60 * ((gN - bN) / delta % 6);
1664
+ } else if (cMax === gN) {
1665
+ h = 60 * ((bN - rN) / delta + 2);
1666
+ } else {
1667
+ h = 60 * ((rN - gN) / delta + 4);
1668
+ }
1669
+ }
1670
+ if (h < 0) {
1671
+ h += 360;
1672
+ }
1673
+ return { h, s: clampUnitInterval(s), l: clampUnitInterval(l) };
1674
+ }
1675
+ function hslToRgb(h, s, l, roundChannel = Math.round, options) {
1676
+ const sC = clampUnitInterval(s);
1677
+ const lC = clampUnitInterval(l);
1678
+ const hN = (h % 360 + 360) % 360;
1679
+ const c = (1 - Math.abs(2 * lC - 1)) * sC;
1680
+ const x = c * (1 - Math.abs(hN / 60 % 2 - 1));
1681
+ const m = lC - c / 2;
1682
+ let rP = 0;
1683
+ let gP = 0;
1684
+ let bP = 0;
1685
+ if (hN < 60) {
1686
+ rP = c;
1687
+ gP = x;
1688
+ bP = 0;
1689
+ } else if (hN < 120) {
1690
+ rP = x;
1691
+ gP = c;
1692
+ bP = 0;
1693
+ } else if (hN < 180) {
1694
+ rP = 0;
1695
+ gP = c;
1696
+ bP = x;
1697
+ } else if (hN < 240) {
1698
+ rP = 0;
1699
+ gP = x;
1700
+ bP = c;
1701
+ } else if (hN < 300) {
1702
+ rP = x;
1703
+ gP = 0;
1704
+ bP = c;
1705
+ } else {
1706
+ rP = c;
1707
+ gP = 0;
1708
+ bP = x;
1709
+ }
1710
+ return {
1711
+ r: roundChannel((rP + m) * 255),
1712
+ g: roundChannel((gP + m) * 255),
1713
+ b: roundChannel((bP + m) * 255)
1714
+ };
1715
+ }
1716
+ function parseDrawingFraction(value) {
1717
+ return parseOoxmlPercent(value);
1718
+ }
1719
+ function parseDrawingHueDegrees(value) {
1720
+ const parsed = Number.parseFloat(String(value ?? "").trim());
1721
+ if (!Number.isFinite(parsed)) {
1722
+ return void 0;
1723
+ }
1724
+ return parsed / 6e4;
1725
+ }
1726
+
1727
+ // color/color-linear.ts
1728
+ function srgb255ToLinear(channel) {
1729
+ const c = clampUnitInterval(channel / 255);
1730
+ return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
1731
+ }
1732
+ function linearToSrgb255(linear) {
1733
+ const c = clampUnitInterval(linear);
1734
+ return 255 * (c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055);
1735
+ }
1736
+
1737
+ // drawingml/drawing-color.ts
1738
+ var PRESET_COLORS = {
1739
+ black: "#000000",
1740
+ white: "#FFFFFF",
1741
+ red: "#FF0000",
1742
+ green: "#008000",
1743
+ blue: "#0000FF",
1744
+ yellow: "#FFFF00",
1745
+ gray: "#808080",
1746
+ grey: "#808080"
1747
+ };
1748
+ function baseHex(color, theme) {
1749
+ switch (color.kind) {
1750
+ case "srgb":
1751
+ return /^[0-9a-f]{6}$/i.test(color.value) ? `#${color.value.toUpperCase()}` : void 0;
1752
+ case "scheme":
1753
+ return theme?.scheme(color.value);
1754
+ case "system":
1755
+ return color.fallback && /^[0-9a-f]{6}$/i.test(color.fallback) ? `#${color.fallback.toUpperCase()}` : void 0;
1756
+ case "preset":
1757
+ return PRESET_COLORS[color.value];
1758
+ case "scrgb": {
1759
+ const [r, g, b] = color.value.split(",").map((part) => parseDrawingFraction(part));
1760
+ if (r === void 0 || g === void 0 || b === void 0) return void 0;
1761
+ return `#${toHex(scrgbLinearToSrgb8(r))}${toHex(scrgbLinearToSrgb8(g))}${toHex(scrgbLinearToSrgb8(b))}`;
1762
+ }
1763
+ case "hsl": {
1764
+ const [h, s, l] = color.value.split(",");
1765
+ const hue = parseDrawingHueDegrees(h);
1766
+ const sat = parseDrawingFraction(s);
1767
+ const lum = parseDrawingFraction(l);
1768
+ if (hue === void 0 || sat === void 0 || lum === void 0) return void 0;
1769
+ const { r, g, b } = hslToRgb(hue, sat, lum);
1770
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
1771
+ }
1772
+ }
1773
+ }
1774
+ var APPLIED = /* @__PURE__ */ new Set([
1775
+ "alpha",
1776
+ "alphaMod",
1777
+ "alphaOff",
1778
+ "comp",
1779
+ "inv",
1780
+ "gray",
1781
+ "shade",
1782
+ "tint",
1783
+ "hue",
1784
+ "hueMod",
1785
+ "hueOff",
1786
+ "sat",
1787
+ "satMod",
1788
+ "satOff",
1789
+ "lum",
1790
+ "lumMod",
1791
+ "lumOff"
1792
+ ]);
1793
+ function resolveDrawingColor(color, theme, options) {
1794
+ const base = baseHex(color, theme);
1795
+ const rgb = base ? hexToRgbChannels(base) : null;
1796
+ if (!rgb) return void 0;
1797
+ let { r, g, b } = rgb;
1798
+ const find = (name) => color.transforms.find((entry) => entry.name === name)?.value;
1799
+ const has = (name) => color.transforms.some((entry) => entry.name === name);
1800
+ if (has("comp")) {
1801
+ const hsl = rgbToHsl(r, g, b);
1802
+ ({ r, g, b } = hslToRgb((hsl.h + 180) % 360, hsl.s, hsl.l));
1803
+ }
1804
+ if (has("inv")) [r, g, b] = [255 - r, 255 - g, 255 - b];
1805
+ if (has("gray")) r = g = b = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
1806
+ const shade = parseDrawingPercent(find("shade"));
1807
+ if (shade !== void 0) {
1808
+ r = linearToSrgb255(srgb255ToLinear(r) * shade);
1809
+ g = linearToSrgb255(srgb255ToLinear(g) * shade);
1810
+ b = linearToSrgb255(srgb255ToLinear(b) * shade);
1811
+ }
1812
+ const tint = parseDrawingPercent(find("tint"));
1813
+ if (tint !== void 0) {
1814
+ r = linearToSrgb255(1 - (1 - srgb255ToLinear(r)) * tint);
1815
+ g = linearToSrgb255(1 - (1 - srgb255ToLinear(g)) * tint);
1816
+ b = linearToSrgb255(1 - (1 - srgb255ToLinear(b)) * tint);
1817
+ }
1818
+ if (["hue", "hueMod", "hueOff", "sat", "satMod", "satOff", "lum", "lumMod", "lumOff"].some(has)) {
1819
+ const hsl = rgbToHsl(r, g, b);
1820
+ const wrap = (degrees) => (degrees % 360 + 360) % 360;
1821
+ const hueAbs = parseDrawingHueDegrees(find("hue"));
1822
+ if (hueAbs !== void 0) hsl.h = wrap(hueAbs);
1823
+ const hueMod = parseDrawingFraction(find("hueMod"));
1824
+ if (hueMod !== void 0) hsl.h = wrap(hsl.h * hueMod);
1825
+ const hueOff = parseDrawingHueDegrees(find("hueOff"));
1826
+ if (hueOff !== void 0) hsl.h = wrap(hsl.h + hueOff);
1827
+ const satAbs = parseDrawingFraction(find("sat"));
1828
+ if (satAbs !== void 0) hsl.s = clampUnitInterval(satAbs);
1829
+ const satMod = parseDrawingFraction(find("satMod"));
1830
+ if (satMod !== void 0) hsl.s = clampUnitInterval(hsl.s * satMod);
1831
+ const satOff = parseDrawingFraction(find("satOff"));
1832
+ if (satOff !== void 0) hsl.s = clampUnitInterval(hsl.s + satOff);
1833
+ const lumAbs = parseDrawingFraction(find("lum"));
1834
+ if (lumAbs !== void 0) hsl.l = clampUnitInterval(lumAbs);
1835
+ const lumMod = parseDrawingFraction(find("lumMod"));
1836
+ if (lumMod !== void 0) hsl.l = clampUnitInterval(hsl.l * lumMod);
1837
+ const lumOff = parseDrawingFraction(find("lumOff"));
1838
+ if (lumOff !== void 0) hsl.l = clampUnitInterval(hsl.l + lumOff);
1839
+ const round = Math.round;
1840
+ ({ r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l, round));
1841
+ }
1842
+ let alpha = parseDrawingPercent(find("alpha")) ?? 1;
1843
+ const alphaMod = parseDrawingFraction(find("alphaMod"));
1844
+ if (alphaMod !== void 0) alpha = clampUnitInterval(alpha * alphaMod);
1845
+ const alphaOff = parseDrawingFraction(find("alphaOff"));
1846
+ if (alphaOff !== void 0) alpha = clampUnitInterval(alpha + alphaOff);
1847
+ return {
1848
+ hex: `#${toHex(r)}${toHex(g)}${toHex(b)}`,
1849
+ alpha,
1850
+ unapplied: [...new Set(color.transforms.map((entry) => entry.name))].filter(
1851
+ (name) => !APPLIED.has(name)
1852
+ )
1853
+ };
1854
+ }
1855
+
1856
+ // drawingml/theme-model.ts
1857
+ var THEME_COLOR_SLOTS = [
1858
+ "dk1",
1859
+ "lt1",
1860
+ "dk2",
1861
+ "lt2",
1862
+ "accent1",
1863
+ "accent2",
1864
+ "accent3",
1865
+ "accent4",
1866
+ "accent5",
1867
+ "accent6",
1868
+ "hlink",
1869
+ "folHlink"
1870
+ ];
1871
+ var DEFAULT_THEME_COLOR_MAP = {
1872
+ bg1: "lt1",
1873
+ tx1: "dk1",
1874
+ bg2: "lt2",
1875
+ tx2: "dk2"
1876
+ };
1877
+
1878
+ // drawingml/theme.ts
1879
+ var SLOT_SET = new Set(THEME_COLOR_SLOTS);
1880
+ function isThemeColorSlot(value) {
1881
+ return SLOT_SET.has(value);
1882
+ }
1883
+
1884
+ // drawingml/theme-color.ts
1885
+ function isLogical(name) {
1886
+ return Object.hasOwn(DEFAULT_THEME_COLOR_MAP, name);
1887
+ }
1888
+ function themeColorSlotFor(name, colorMap = {}) {
1889
+ if (isLogical(name)) return colorMap[name] ?? DEFAULT_THEME_COLOR_MAP[name];
1890
+ if (!isThemeColorSlot(name)) return void 0;
1891
+ if (name === "dk1" || name === "lt1" || name === "dk2" || name === "lt2") return name;
1892
+ return colorMap[name] ?? name;
1893
+ }
1894
+
1895
+ // docx/theme-color.ts
1896
+ function isThemeColorToken(value) {
1897
+ return isStThemeColor(value);
1898
+ }
1616
1899
  function fractionToThemeByte(fraction) {
1617
1900
  return toHex(Math.round(Math.min(1, Math.max(0, fraction)) * 255));
1618
1901
  }
@@ -2478,305 +2761,58 @@ var add = (parent, ...items) => {
2478
2761
  return parent;
2479
2762
  };
2480
2763
  var emu = (px) => String(Math.max(1, Math.round(px * EMU_PER_PIXEL)));
2481
- var descendants = (root, ns, local) => Array.from(root.getElementsByTagNameNS(ns, local));
2482
- function paragraphsFor(doc, lines) {
2483
- return (lines.length ? lines : [""]).map((line) => {
2484
- const paragraph = makeW(doc, "p");
2485
- if (line) {
2486
- const run = makeW(doc, "r");
2487
- const text = makeW(doc, "t");
2488
- if (/^\s|\s$/.test(line))
2489
- text.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space", "preserve");
2490
- text.textContent = line;
2491
- add(run, text);
2492
- add(paragraph, run);
2493
- }
2494
- return paragraph;
2495
- });
2496
- }
2497
- function outline(doc, border) {
2498
- const ln = el(doc, A_NS, "a:ln");
2499
- if (!border) return add(ln, el(doc, A_NS, "a:noFill"));
2500
- ln.setAttribute("w", "9525");
2501
- const color = el(doc, A_NS, "a:srgbClr");
2502
- color.setAttribute("val", "000000");
2503
- return add(ln, add(el(doc, A_NS, "a:solidFill"), color));
2504
- }
2505
- function patchTextBox(doc, drawing, image, base) {
2506
- if (image.widthPx !== base.widthPx || image.heightPx !== base.heightPx)
2507
- for (const node of [
2508
- ...descendants(drawing, WP_NS, "extent"),
2509
- ...descendants(drawing, A_NS, "ext").filter(
2510
- (ext) => ext.parentNode?.localName === "xfrm"
2511
- )
2512
- ]) {
2513
- node.setAttribute("cx", emu(image.widthPx));
2514
- node.setAttribute("cy", emu(image.heightPx));
2515
- }
2516
- if (JSON.stringify(image.textBoxText) !== JSON.stringify(base.textBoxText)) {
2517
- const content = descendants(drawing, W_NS, "txbxContent")[0];
2518
- if (content) {
2519
- for (const child of Array.from(content.childNodes)) content.removeChild(child);
2520
- add(content, ...paragraphsFor(doc, image.textBoxText ?? []));
2521
- }
2522
- }
2523
- if (image.textBoxBorder !== false !== (base.textBoxBorder !== false)) {
2524
- const spPr = descendants(drawing, WPS_NS, "spPr")[0];
2525
- if (spPr) {
2526
- for (const old of Array.from(spPr.childNodes).filter(
2527
- (node) => isElement(node) && node.localName === "ln"
2528
- ))
2529
- spPr.removeChild(old);
2530
- spPr.appendChild(outline(doc, image.textBoxBorder !== false));
2531
- }
2532
- }
2533
- }
2534
-
2535
- // color/color-primitives.ts
2536
- function clampUnitInterval(value) {
2537
- return Math.min(1, Math.max(0, value));
2538
- }
2539
- function hexToRgbChannels(color) {
2540
- const normalized = color.replace("#", "");
2541
- if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {
2542
- return null;
2543
- }
2544
- return {
2545
- r: Number.parseInt(normalized.slice(0, 2), 16),
2546
- g: Number.parseInt(normalized.slice(2, 4), 16),
2547
- b: Number.parseInt(normalized.slice(4, 6), 16)
2548
- };
2549
- }
2550
- function percentDivisorFor(text) {
2551
- return text.endsWith("%") ? 100 : 1e5;
2552
- }
2553
- function parseOoxmlPercent(value) {
2554
- const text = String(value ?? "").trim();
2555
- const divisor = percentDivisorFor(text);
2556
- const magnitude = Number.parseFloat(divisor === 100 ? text.slice(0, -1) : text);
2557
- if (!Number.isFinite(magnitude)) {
2558
- return void 0;
2559
- }
2560
- return magnitude / divisor;
2561
- }
2562
- function parseDrawingPercent(value) {
2563
- const parsed = parseOoxmlPercent(value);
2564
- return parsed === void 0 ? void 0 : clampUnitInterval(parsed);
2565
- }
2566
- function scrgbLinearToSrgb8(linear) {
2567
- const l = Math.min(1, Math.max(0, linear));
2568
- const companded = l <= 31308e-7 ? 12.92 * l : 1.055 * l ** (1 / 2.4) - 0.055;
2569
- return Math.min(255, Math.max(0, Math.round(companded * 255)));
2570
- }
2571
- function toHex2(value) {
2572
- return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
2573
- }
2574
- function rgbToHsl(r, g, b) {
2575
- const rN = r / 255;
2576
- const gN = g / 255;
2577
- const bN = b / 255;
2578
- const cMax = Math.max(rN, gN, bN);
2579
- const cMin = Math.min(rN, gN, bN);
2580
- const delta = cMax - cMin;
2581
- const l = (cMax + cMin) / 2;
2582
- let s = 0;
2583
- if (delta !== 0) {
2584
- s = delta / (1 - Math.abs(2 * l - 1));
2585
- }
2586
- let h = 0;
2587
- if (delta !== 0) {
2588
- if (cMax === rN) {
2589
- h = 60 * ((gN - bN) / delta % 6);
2590
- } else if (cMax === gN) {
2591
- h = 60 * ((bN - rN) / delta + 2);
2592
- } else {
2593
- h = 60 * ((rN - gN) / delta + 4);
2594
- }
2595
- }
2596
- if (h < 0) {
2597
- h += 360;
2598
- }
2599
- return { h, s: clampUnitInterval(s), l: clampUnitInterval(l) };
2600
- }
2601
- function hslToRgb(h, s, l, roundChannel = Math.round, options) {
2602
- const sC = clampUnitInterval(s);
2603
- const lC = clampUnitInterval(l);
2604
- const hN = (h % 360 + 360) % 360;
2605
- const c = (1 - Math.abs(2 * lC - 1)) * sC;
2606
- const x = c * (1 - Math.abs(hN / 60 % 2 - 1));
2607
- const m = lC - c / 2;
2608
- let rP = 0;
2609
- let gP = 0;
2610
- let bP = 0;
2611
- if (hN < 60) {
2612
- rP = c;
2613
- gP = x;
2614
- bP = 0;
2615
- } else if (hN < 120) {
2616
- rP = x;
2617
- gP = c;
2618
- bP = 0;
2619
- } else if (hN < 180) {
2620
- rP = 0;
2621
- gP = c;
2622
- bP = x;
2623
- } else if (hN < 240) {
2624
- rP = 0;
2625
- gP = x;
2626
- bP = c;
2627
- } else if (hN < 300) {
2628
- rP = x;
2629
- gP = 0;
2630
- bP = c;
2631
- } else {
2632
- rP = c;
2633
- gP = 0;
2634
- bP = x;
2635
- }
2636
- return {
2637
- r: roundChannel((rP + m) * 255),
2638
- g: roundChannel((gP + m) * 255),
2639
- b: roundChannel((bP + m) * 255)
2640
- };
2641
- }
2642
- function parseDrawingFraction(value) {
2643
- return parseOoxmlPercent(value);
2644
- }
2645
- function parseDrawingHueDegrees(value) {
2646
- const parsed = Number.parseFloat(String(value ?? "").trim());
2647
- if (!Number.isFinite(parsed)) {
2648
- return void 0;
2649
- }
2650
- return parsed / 6e4;
2651
- }
2652
-
2653
- // color/color-linear.ts
2654
- function srgb255ToLinear(channel) {
2655
- const c = clampUnitInterval(channel / 255);
2656
- return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
2764
+ var descendants = (root, ns, local) => Array.from(root.getElementsByTagNameNS(ns, local));
2765
+ function paragraphsFor(doc, lines) {
2766
+ return (lines.length ? lines : [""]).map((line) => {
2767
+ const paragraph = makeW(doc, "p");
2768
+ if (line) {
2769
+ const run = makeW(doc, "r");
2770
+ const text = makeW(doc, "t");
2771
+ if (/^\s|\s$/.test(line))
2772
+ text.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space", "preserve");
2773
+ text.textContent = line;
2774
+ add(run, text);
2775
+ add(paragraph, run);
2776
+ }
2777
+ return paragraph;
2778
+ });
2657
2779
  }
2658
- function linearToSrgb255(linear) {
2659
- const c = clampUnitInterval(linear);
2660
- return 255 * (c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055);
2780
+ function outline(doc, border) {
2781
+ const ln = el(doc, A_NS, "a:ln");
2782
+ if (!border) return add(ln, el(doc, A_NS, "a:noFill"));
2783
+ ln.setAttribute("w", "9525");
2784
+ const color = el(doc, A_NS, "a:srgbClr");
2785
+ color.setAttribute("val", "000000");
2786
+ return add(ln, add(el(doc, A_NS, "a:solidFill"), color));
2661
2787
  }
2662
-
2663
- // diagram/drawing-color.ts
2664
- var PRESET_COLORS = {
2665
- black: "#000000",
2666
- white: "#FFFFFF",
2667
- red: "#FF0000",
2668
- green: "#008000",
2669
- blue: "#0000FF",
2670
- yellow: "#FFFF00",
2671
- gray: "#808080",
2672
- grey: "#808080"
2673
- };
2674
- function baseHex(color, theme) {
2675
- switch (color.kind) {
2676
- case "srgb":
2677
- return /^[0-9a-f]{6}$/i.test(color.value) ? `#${color.value.toUpperCase()}` : void 0;
2678
- case "scheme":
2679
- return theme?.scheme(color.value);
2680
- case "system":
2681
- return color.fallback && /^[0-9a-f]{6}$/i.test(color.fallback) ? `#${color.fallback.toUpperCase()}` : void 0;
2682
- case "preset":
2683
- return PRESET_COLORS[color.value];
2684
- case "scrgb": {
2685
- const [r, g, b] = color.value.split(",").map((part) => parseDrawingFraction(part));
2686
- if (r === void 0 || g === void 0 || b === void 0) return void 0;
2687
- return `#${toHex2(scrgbLinearToSrgb8(r))}${toHex2(scrgbLinearToSrgb8(g))}${toHex2(scrgbLinearToSrgb8(b))}`;
2788
+ function patchTextBox(doc, drawing, image, base) {
2789
+ if (image.widthPx !== base.widthPx || image.heightPx !== base.heightPx)
2790
+ for (const node of [
2791
+ ...descendants(drawing, WP_NS, "extent"),
2792
+ ...descendants(drawing, A_NS, "ext").filter(
2793
+ (ext) => ext.parentNode?.localName === "xfrm"
2794
+ )
2795
+ ]) {
2796
+ node.setAttribute("cx", emu(image.widthPx));
2797
+ node.setAttribute("cy", emu(image.heightPx));
2688
2798
  }
2689
- case "hsl": {
2690
- const [h, s, l] = color.value.split(",");
2691
- const hue = parseDrawingHueDegrees(h);
2692
- const sat = parseDrawingFraction(s);
2693
- const lum = parseDrawingFraction(l);
2694
- if (hue === void 0 || sat === void 0 || lum === void 0) return void 0;
2695
- const { r, g, b } = hslToRgb(hue, sat, lum);
2696
- return `#${toHex2(r)}${toHex2(g)}${toHex2(b)}`;
2799
+ if (JSON.stringify(image.textBoxText) !== JSON.stringify(base.textBoxText)) {
2800
+ const content = descendants(drawing, W_NS, "txbxContent")[0];
2801
+ if (content) {
2802
+ for (const child of Array.from(content.childNodes)) content.removeChild(child);
2803
+ add(content, ...paragraphsFor(doc, image.textBoxText ?? []));
2697
2804
  }
2698
2805
  }
2699
- }
2700
- var APPLIED = /* @__PURE__ */ new Set([
2701
- "alpha",
2702
- "alphaMod",
2703
- "alphaOff",
2704
- "comp",
2705
- "inv",
2706
- "gray",
2707
- "shade",
2708
- "tint",
2709
- "hue",
2710
- "hueMod",
2711
- "hueOff",
2712
- "sat",
2713
- "satMod",
2714
- "satOff",
2715
- "lum",
2716
- "lumMod",
2717
- "lumOff"
2718
- ]);
2719
- function resolveDrawingColor(color, theme, options) {
2720
- const base = baseHex(color, theme);
2721
- const rgb = base ? hexToRgbChannels(base) : null;
2722
- if (!rgb) return void 0;
2723
- let { r, g, b } = rgb;
2724
- const find = (name) => color.transforms.find((entry) => entry.name === name)?.value;
2725
- const has = (name) => color.transforms.some((entry) => entry.name === name);
2726
- if (has("comp")) {
2727
- const hsl = rgbToHsl(r, g, b);
2728
- ({ r, g, b } = hslToRgb((hsl.h + 180) % 360, hsl.s, hsl.l));
2729
- }
2730
- if (has("inv")) [r, g, b] = [255 - r, 255 - g, 255 - b];
2731
- if (has("gray")) r = g = b = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
2732
- const shade = parseDrawingPercent(find("shade"));
2733
- if (shade !== void 0) {
2734
- r = linearToSrgb255(srgb255ToLinear(r) * shade);
2735
- g = linearToSrgb255(srgb255ToLinear(g) * shade);
2736
- b = linearToSrgb255(srgb255ToLinear(b) * shade);
2737
- }
2738
- const tint = parseDrawingPercent(find("tint"));
2739
- if (tint !== void 0) {
2740
- r = linearToSrgb255(1 - (1 - srgb255ToLinear(r)) * tint);
2741
- g = linearToSrgb255(1 - (1 - srgb255ToLinear(g)) * tint);
2742
- b = linearToSrgb255(1 - (1 - srgb255ToLinear(b)) * tint);
2743
- }
2744
- if (["hue", "hueMod", "hueOff", "sat", "satMod", "satOff", "lum", "lumMod", "lumOff"].some(has)) {
2745
- const hsl = rgbToHsl(r, g, b);
2746
- const wrap = (degrees) => (degrees % 360 + 360) % 360;
2747
- const hueAbs = parseDrawingHueDegrees(find("hue"));
2748
- if (hueAbs !== void 0) hsl.h = wrap(hueAbs);
2749
- const hueMod = parseDrawingFraction(find("hueMod"));
2750
- if (hueMod !== void 0) hsl.h = wrap(hsl.h * hueMod);
2751
- const hueOff = parseDrawingHueDegrees(find("hueOff"));
2752
- if (hueOff !== void 0) hsl.h = wrap(hsl.h + hueOff);
2753
- const satAbs = parseDrawingFraction(find("sat"));
2754
- if (satAbs !== void 0) hsl.s = clampUnitInterval(satAbs);
2755
- const satMod = parseDrawingFraction(find("satMod"));
2756
- if (satMod !== void 0) hsl.s = clampUnitInterval(hsl.s * satMod);
2757
- const satOff = parseDrawingFraction(find("satOff"));
2758
- if (satOff !== void 0) hsl.s = clampUnitInterval(hsl.s + satOff);
2759
- const lumAbs = parseDrawingFraction(find("lum"));
2760
- if (lumAbs !== void 0) hsl.l = clampUnitInterval(lumAbs);
2761
- const lumMod = parseDrawingFraction(find("lumMod"));
2762
- if (lumMod !== void 0) hsl.l = clampUnitInterval(hsl.l * lumMod);
2763
- const lumOff = parseDrawingFraction(find("lumOff"));
2764
- if (lumOff !== void 0) hsl.l = clampUnitInterval(hsl.l + lumOff);
2765
- const round = Math.round;
2766
- ({ r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l, round));
2806
+ if (image.textBoxBorder !== false !== (base.textBoxBorder !== false)) {
2807
+ const spPr = descendants(drawing, WPS_NS, "spPr")[0];
2808
+ if (spPr) {
2809
+ for (const old of Array.from(spPr.childNodes).filter(
2810
+ (node) => isElement(node) && node.localName === "ln"
2811
+ ))
2812
+ spPr.removeChild(old);
2813
+ spPr.appendChild(outline(doc, image.textBoxBorder !== false));
2814
+ }
2767
2815
  }
2768
- let alpha = parseDrawingPercent(find("alpha")) ?? 1;
2769
- const alphaMod = parseDrawingFraction(find("alphaMod"));
2770
- if (alphaMod !== void 0) alpha = clampUnitInterval(alpha * alphaMod);
2771
- const alphaOff = parseDrawingFraction(find("alphaOff"));
2772
- if (alphaOff !== void 0) alpha = clampUnitInterval(alpha + alphaOff);
2773
- return {
2774
- hex: `#${toHex2(r)}${toHex2(g)}${toHex2(b)}`,
2775
- alpha,
2776
- unapplied: [...new Set(color.transforms.map((entry) => entry.name))].filter(
2777
- (name) => !APPLIED.has(name)
2778
- )
2779
- };
2780
2816
  }
2781
2817
 
2782
2818
  // docx/write-drawing.ts
@@ -2890,6 +2926,17 @@ function restoreRunFormatting(run) {
2890
2926
  else delete run.revision;
2891
2927
  }
2892
2928
 
2929
+ // docx/field-flags.ts
2930
+ function writeFieldFlags(element, flags) {
2931
+ for (const [name, value] of [
2932
+ ["fldLock", flags?.locked],
2933
+ ["dirty", flags?.dirty]
2934
+ ]) {
2935
+ if (value === void 0) element.removeAttributeNS(WORD_NS, name);
2936
+ else element.setAttributeNS(WORD_NS, `w:${name}`, value ? "true" : "false");
2937
+ }
2938
+ }
2939
+
2893
2940
  // docx/write-run.ts
2894
2941
  function setAttribute6(element, local, value) {
2895
2942
  element.setAttributeNS(WORD_NS, `w:${local}`, value);
@@ -3075,6 +3122,7 @@ function createRun(doc, run, base, old, allocator) {
3075
3122
  if (run.fieldChar) {
3076
3123
  const marker = makeW(doc, "fldChar");
3077
3124
  setAttribute6(marker, "fldCharType", run.fieldChar);
3125
+ writeFieldFlags(marker, run.fieldFlags);
3078
3126
  node.appendChild(marker);
3079
3127
  return node;
3080
3128
  }
@@ -3155,6 +3203,11 @@ function takeSimpleFieldCommentEdges(doc, runs, start, end, opens, closes) {
3155
3203
  after: take(closes, end - 1).reverse().flatMap((edge) => rangeEndNodes(doc, edge))
3156
3204
  };
3157
3205
  }
3206
+
3207
+ // docx/field-lock.ts
3208
+ function sameFieldFlags(a, b) {
3209
+ return a?.locked === b?.locked && a?.dirty === b?.dirty;
3210
+ }
3158
3211
  var MATH_NAMESPACES = /* @__PURE__ */ new Set([
3159
3212
  "http://schemas.openxmlformats.org/officeDocument/2006/math",
3160
3213
  "http://purl.oclc.org/ooxml/officeDocument/math"
@@ -3350,6 +3403,7 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
3350
3403
  container = makeW(doc, "fldSimple");
3351
3404
  setW2(container, "instr", ` ${group.instr} `);
3352
3405
  }
3406
+ if (group.kind === "simpleField") writeFieldFlags(container, runAt(start).fieldFlags);
3353
3407
  const edges = group.kind === "simpleField" ? takeSimpleFieldCommentEdges(doc, runs, start, index, opens, closes) : { before: [], after: [] };
3354
3408
  for (let item = start; item < index; item++)
3355
3409
  for (const node of nodesFor(item)) container.appendChild(node);
@@ -3360,13 +3414,18 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
3360
3414
  function containerGroup(run) {
3361
3415
  if (run.link) return { kind: "link", link: run.link };
3362
3416
  if (run.field?.simple)
3363
- return { kind: "simpleField", instr: run.field.instr, instanceId: run.fieldInstanceId };
3417
+ return {
3418
+ kind: "simpleField",
3419
+ instr: run.field.instr,
3420
+ instanceId: run.fieldInstanceId,
3421
+ fieldFlags: run.fieldFlags
3422
+ };
3364
3423
  return void 0;
3365
3424
  }
3366
3425
  function sameGroup(a, b) {
3367
3426
  if (!a || !b) return a === b;
3368
3427
  if (a.kind === "link" && b.kind === "link") return sameLink(a.link, b.link);
3369
- return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId;
3428
+ return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId && sameFieldFlags(a.fieldFlags, b.fieldFlags);
3370
3429
  }
3371
3430
 
3372
3431
  // docx/paragraph-properties.ts
@@ -3538,19 +3597,6 @@ function createParagraph(doc, paragraph, allocator, spans) {
3538
3597
  return writeParagraphImpl(doc, paragraph, node, void 0, allocator, spans);
3539
3598
  }
3540
3599
 
3541
- // docx/document-paragraphs.ts
3542
- function documentBlockLists(model) {
3543
- return [
3544
- model.blocks,
3545
- ...(model.sections ?? []).flatMap(
3546
- (section) => [section.headers, section.footers].flatMap(
3547
- (slots) => Object.values(slots ?? {}).flatMap((content) => content ? [content.blocks] : [])
3548
- )
3549
- ),
3550
- ...[...model.footnotes ?? [], ...model.endnotes ?? []].map((note) => note.blocks)
3551
- ];
3552
- }
3553
-
3554
3600
  // docx/numbering-parse.ts
3555
3601
  function resolveNumberingLevel(catalog, numId, level) {
3556
3602
  const num = catalog.nums[numId];
@@ -3576,33 +3622,26 @@ function resolveNumberingLevel(catalog, numId, level) {
3576
3622
  return start !== base.start ? { ...base, start } : base;
3577
3623
  }
3578
3624
 
3625
+ // docx/document-paragraphs.ts
3626
+ function documentBlockLists(model) {
3627
+ return [
3628
+ model.blocks,
3629
+ ...(model.sections ?? []).flatMap(
3630
+ (section) => [section.headers, section.footers].flatMap(
3631
+ (slots) => Object.values(slots ?? {}).flatMap((content) => content ? [content.blocks] : [])
3632
+ )
3633
+ ),
3634
+ ...[...model.footnotes ?? [], ...model.endnotes ?? []].map((note) => note.blocks)
3635
+ ];
3636
+ }
3637
+
3579
3638
  // docx/diagram-theme.ts
3580
- var DEFAULT_MAPPING = {
3581
- bg1: "lt1",
3582
- tx1: "dk1",
3583
- bg2: "lt2",
3584
- tx2: "dk2"
3585
- };
3586
- var SLOTS = /* @__PURE__ */ new Set([
3587
- "dk1",
3588
- "lt1",
3589
- "dk2",
3590
- "lt2",
3591
- "accent1",
3592
- "accent2",
3593
- "accent3",
3594
- "accent4",
3595
- "accent5",
3596
- "accent6",
3597
- "hlink",
3598
- "folHlink"
3599
- ]);
3600
3639
  function diagramColorTheme(theme) {
3601
3640
  return {
3602
3641
  scheme(name) {
3603
3642
  if (!theme) return void 0;
3604
- const mapped = name in DEFAULT_MAPPING ? theme.colorMapping[name] ?? DEFAULT_MAPPING[name] : SLOTS.has(name) ? name : void 0;
3605
- const hex = mapped ? theme.colors[mapped] : void 0;
3643
+ const slot = themeColorSlotFor(name, theme.colorMapping);
3644
+ const hex = slot ? theme.colors[slot] : void 0;
3606
3645
  return hex ? `#${hex.replace(/^#/, "").toUpperCase()}` : void 0;
3607
3646
  }
3608
3647
  };
@@ -3966,6 +4005,7 @@ var ligatureStyle = (value) => isLigatures(value) ? `font-variant-ligatures:${li
3966
4005
  // docx/ui/run-extra-mark.ts
3967
4006
  var extraRunFields = [
3968
4007
  "fieldInstanceId",
4008
+ "fieldFlags",
3969
4009
  "restoredRunPropertiesXml",
3970
4010
  "sourceRunPropertiesXml",
3971
4011
  "formatRevision",
@@ -4491,12 +4531,12 @@ function fieldClipboardSlice(slice) {
4491
4531
  if (!(field?.attrs.simple ?? cached2?.simple) && complete.has(pos)) return node;
4492
4532
  const marks = node.marks.flatMap((mark) => {
4493
4533
  if (mark.type === field?.type) return [];
4494
- if (mark.type.name !== "runProperties" || !mark.attrs.props?.fieldInstanceId) return [mark];
4495
- const { fieldInstanceId: _identity, ...props } = mark.attrs.props;
4534
+ if (mark.type.name !== "runProperties") return [mark];
4535
+ const { fieldInstanceId: _identity, fieldFlags: _flags2, ...props } = mark.attrs.props ?? {};
4496
4536
  return Object.keys(props).length ? [mark.type.create({ ...mark.attrs, props })] : [];
4497
4537
  });
4498
4538
  if (!properties3 || !cached2) return node.mark(marks);
4499
- const { field: _field, fieldInstanceId: _id, ...literal } = properties3;
4539
+ const { field: _field, fieldInstanceId: _id, fieldFlags: _flags, ...literal } = properties3;
4500
4540
  return node.type.create(
4501
4541
  updatedInlineRunAttributes(
4502
4542
  node,
@@ -4520,13 +4560,14 @@ function fieldResultRanges(doc) {
4520
4560
  const field = doc.type.schema.marks.field;
4521
4561
  if (!field) return runs;
4522
4562
  const identityOf = (marks) => marks.find((mark) => mark.type.name === "runProperties")?.attrs.props?.fieldInstanceId;
4563
+ const flagsOf = (marks) => marks.find((mark) => mark.type.name === "runProperties")?.attrs.props?.fieldFlags;
4523
4564
  doc.descendants((node, pos) => {
4524
4565
  if (node.type.name !== "paragraph") return true;
4525
4566
  let open;
4526
4567
  node.forEach((child, offset) => {
4527
4568
  const mark = child.isText ? child.marks.find((item) => item.type === field) : void 0;
4528
4569
  const start = pos + 1 + offset;
4529
- if (mark && open?.mark.eq(mark) && identityOf(open.marks) === identityOf(child.marks)) {
4570
+ if (mark && open?.mark.eq(mark) && identityOf(open.marks) === identityOf(child.marks) && sameFieldFlags(flagsOf(open.marks), flagsOf(child.marks))) {
4530
4571
  open.to = start + child.nodeSize;
4531
4572
  open.text += child.text ?? "";
4532
4573
  } else if (mark) {
@@ -4554,14 +4595,20 @@ function targetField(state, from, to) {
4554
4595
  }
4555
4596
  function resultMarks(node, field) {
4556
4597
  let marks = field.mark.addToSet(node.marks);
4557
- const id = field.marks.find((mark) => mark.type.name === "runProperties")?.attrs.props?.fieldInstanceId;
4598
+ const source = field.marks.find((mark) => mark.type.name === "runProperties")?.attrs.props;
4599
+ const id = source?.fieldInstanceId;
4600
+ const state = {
4601
+ ...typeof id === "string" && { fieldInstanceId: id },
4602
+ ...source?.fieldFlags && { fieldFlags: source.fieldFlags }
4603
+ };
4558
4604
  const properties3 = node.type.schema.marks.runProperties;
4559
- if (typeof id === "string" && properties3) {
4605
+ if (properties3) {
4560
4606
  const old = properties3.isInSet(marks);
4561
- marks = properties3.create({
4562
- ...old?.attrs ?? {},
4563
- props: { ...old?.attrs.props ?? {}, fieldInstanceId: id }
4564
- }).addToSet(marks);
4607
+ const { fieldInstanceId: _identity, fieldFlags: _flags, ...other } = old?.attrs.props ?? {};
4608
+ const props = { ...other, ...state };
4609
+ marks = properties3.removeFromSet(marks);
4610
+ if (Object.keys(props).length)
4611
+ marks = properties3.create({ ...old?.attrs ?? {}, props }).addToSet(marks);
4565
4612
  }
4566
4613
  return marks;
4567
4614
  }
@@ -4591,29 +4638,41 @@ function replaceSimpleFieldResult(state, from, to, text) {
4591
4638
  const field = targetField(state, from, to);
4592
4639
  if (!field) return null;
4593
4640
  if (!text) {
4594
- if (from !== field.from || to !== field.to || !state.schema.nodes.fieldMarker) return null;
4595
- const run = inlineNodeRun(state.doc.nodeAt(from));
4596
- if (!run) return null;
4597
- const format = {
4598
- ...run.commentIds && { commentIds: run.commentIds }
4599
- };
4600
- const markers = [
4601
- { ...format, text: "", fieldChar: "begin" },
4602
- { ...format, text: "", fieldCode: field.mark.attrs.instr },
4603
- { ...format, text: "", fieldChar: "separate" },
4604
- { ...format, text: "", fieldChar: "end" }
4605
- ].flatMap((item) => runToInlineNodes(item, state.schema));
4606
- const tr2 = state.tr.replaceWith(from, to, markers);
4641
+ const tr2 = state.tr;
4642
+ if (!emptySimpleFieldResult(tr2, from, to)) return null;
4607
4643
  return tr2.setSelection(TextSelection.create(tr2.doc, from + 3));
4608
4644
  }
4609
- const tr = state.tr.insertText(text, from, to);
4610
- tr.doc.nodesBetween(from, from + text.length, (node, pos) => {
4611
- if (!node.isText) return;
4612
- for (const mark of resultMarks(node, field))
4613
- tr.addMark(Math.max(from, pos), Math.min(from + text.length, pos + node.nodeSize), mark);
4614
- });
4645
+ const $from = state.doc.resolve(from);
4646
+ const marks = state.storedMarks ?? (from === to ? $from.marks() : $from.marksAcross(state.doc.resolve(to)));
4647
+ const node = state.schema.text(text, marks);
4648
+ const tr = state.tr.replaceRangeWith(from, to, node.mark(resultMarks(node, field)));
4649
+ if (!tr.selection.empty && tr.selection.to === from + text.length)
4650
+ tr.setSelection(TextSelection.near(tr.selection.$to));
4615
4651
  return tr;
4616
4652
  }
4653
+ function emptySimpleFieldResult(transform, from, to) {
4654
+ const field = fieldResultRanges(transform.doc).find(
4655
+ (range) => range.mark.attrs.simple && range.from === from && range.to === to
4656
+ );
4657
+ const schema = transform.doc.type.schema;
4658
+ if (!field || !schema.nodes.fieldMarker) return false;
4659
+ const run = inlineNodeRun(transform.doc.nodeAt(from));
4660
+ if (!run) return false;
4661
+ const format = { ...run.commentIds && { commentIds: run.commentIds } };
4662
+ const markers = [
4663
+ {
4664
+ ...format,
4665
+ text: "",
4666
+ fieldChar: "begin",
4667
+ ...run.fieldFlags && { fieldFlags: run.fieldFlags }
4668
+ },
4669
+ { ...format, text: "", fieldCode: field.mark.attrs.instr },
4670
+ { ...format, text: "", fieldChar: "separate" },
4671
+ { ...format, text: "", fieldChar: "end" }
4672
+ ].flatMap((item) => runToInlineNodes(item, schema));
4673
+ transform.replaceWith(from, to, markers);
4674
+ return true;
4675
+ }
4617
4676
  function deleteSimpleFieldResult(state, backward) {
4618
4677
  const { from, to, empty } = state.selection;
4619
4678
  if (!empty) return replaceSimpleFieldResult(state, from, to, "");
@@ -4627,6 +4686,7 @@ function deleteSimpleFieldResult(state, backward) {
4627
4686
  }
4628
4687
 
4629
4688
  // docx/ui/field-guard.ts
4689
+ var FIELD_RESULT_REPAIR_META = "dve-field-result-repair";
4630
4690
  function markerKinds(doc) {
4631
4691
  const kinds = [];
4632
4692
  doc.descendants((node) => {
@@ -4702,11 +4762,12 @@ function markFieldResults(state) {
4702
4762
  const fieldMark = state.schema.marks.field;
4703
4763
  if (!fieldMark) return null;
4704
4764
  const stack = [];
4705
- const missing = [];
4765
+ const transaction = state.tr;
4706
4766
  state.doc.descendants((node, pos) => {
4707
4767
  if (node.type.name === "fieldMarker") {
4708
4768
  const kind = node.attrs.kind;
4709
- if (kind === "begin") stack.push({ code: "", inResult: false });
4769
+ if (kind === "begin")
4770
+ stack.push({ code: "", inResult: false, locked: inlineNodeRun(node)?.fieldFlags?.locked });
4710
4771
  else if (kind === "code" && stack.length) {
4711
4772
  const open = stack[stack.length - 1];
4712
4773
  if (open) open.code += node.attrs.code ?? "";
@@ -4717,15 +4778,28 @@ function markFieldResults(state) {
4717
4778
  return false;
4718
4779
  }
4719
4780
  const top = stack.at(-1);
4720
- if (node.isText && top?.inResult && !fieldMark.isInSet(node.marks))
4721
- missing.push({ from: pos, to: pos + node.nodeSize, instr: top.code.trim() });
4781
+ if (node.isText && top?.inResult) {
4782
+ const end = pos + node.nodeSize;
4783
+ if (!fieldMark.isInSet(node.marks))
4784
+ transaction.addMark(pos, end, fieldMark.create({ instr: top.code.trim(), simple: false }));
4785
+ const type = state.schema.marks.runProperties;
4786
+ const current = type?.isInSet(node.marks);
4787
+ const props = current?.attrs.props ?? {};
4788
+ if (type && props.fieldFlags?.locked !== top.locked) {
4789
+ const next = { ...props };
4790
+ const flags = { ...props.fieldFlags };
4791
+ if (top.locked === void 0) delete flags.locked;
4792
+ else flags.locked = top.locked;
4793
+ if (Object.keys(flags).length) next.fieldFlags = flags;
4794
+ else delete next.fieldFlags;
4795
+ if (current) transaction.removeMark(pos, end, current);
4796
+ if (Object.keys(next).length)
4797
+ transaction.addMark(pos, end, type.create({ ...current?.attrs, props: next }));
4798
+ }
4799
+ }
4722
4800
  return true;
4723
4801
  });
4724
- if (!missing.length) return null;
4725
- const transaction = state.tr;
4726
- for (const { from, to, instr } of missing)
4727
- transaction.addMark(from, to, fieldMark.create({ instr, simple: false }));
4728
- return transaction;
4802
+ return transaction.docChanged ? transaction.setMeta(FIELD_RESULT_REPAIR_META, true) : null;
4729
4803
  }
4730
4804
  var isMarker = (node) => node?.type.name === "fieldMarker";
4731
4805
  function trimSelection(state) {
@@ -6489,6 +6563,98 @@ function trackSimpleFieldDeletion(transform, from, to, slice, author, date, next
6489
6563
  );
6490
6564
  return { deletionIds, deletedText, insertedText: "" };
6491
6565
  }
6566
+ function sourceProperties(value) {
6567
+ if (typeof value !== "string" || !value) return value;
6568
+ try {
6569
+ const properties3 = parsePropertiesSnapshot(value, "pPr");
6570
+ const run = first2(properties3, "rPr");
6571
+ if (run) {
6572
+ for (const name of ["ins", "del"])
6573
+ for (const revision of children2(run, name)) run.removeChild(revision);
6574
+ if (!run.childNodes.length && !run.attributes.length) properties3.removeChild(run);
6575
+ }
6576
+ return propertiesSignature(properties3);
6577
+ } catch {
6578
+ return value;
6579
+ }
6580
+ }
6581
+ function safeParagraph(node, allowInsertion = false) {
6582
+ if (node.type.name !== "paragraph" || !node.type.spec.attrs?.markRevision) return false;
6583
+ if (node.attrs.markRevision && !allowInsertion) return false;
6584
+ let fields = false;
6585
+ node.descendants((child) => {
6586
+ if (child.type.name === "fieldMarker" || child.marks.some((mark) => mark.type.name === "field"))
6587
+ fields = true;
6588
+ });
6589
+ return !fields;
6590
+ }
6591
+ function endsSection(state, node) {
6592
+ if (typeof state.doc.attrs.sections !== "string") return false;
6593
+ try {
6594
+ const sections = JSON.parse(state.doc.attrs.sections);
6595
+ return sections.some(
6596
+ (section, index) => section.endsAtBlockId === node.attrs.id && (index < sections.length - 1 || state.doc.lastChild !== node)
6597
+ );
6598
+ } catch {
6599
+ return true;
6600
+ }
6601
+ }
6602
+ function sameProperties(first3, second) {
6603
+ return Object.keys({ ...first3.attrs, ...second.attrs }).every(
6604
+ (key) => key === "id" || key === "markRevision" || (key === "sourceParagraphPropertiesXml" ? sourceProperties(first3.attrs[key]) === sourceProperties(second.attrs[key]) : JSON.stringify(first3.attrs[key]) === JSON.stringify(second.attrs[key]))
6605
+ );
6606
+ }
6607
+ function trackParagraphBoundary(steps, oldState, newState, author, date, nextId) {
6608
+ if (steps.length !== 1 || !(steps[0] instanceof ReplaceStep) || steps[0].toJSON().structure !== true)
6609
+ return null;
6610
+ const step = steps[0];
6611
+ const $from = oldState.doc.resolve(step.from);
6612
+ const $to = oldState.doc.resolve(step.to);
6613
+ if ($from.depth !== 1 || $to.depth !== 1) return null;
6614
+ const first3 = $from.parent;
6615
+ const pos = $from.before();
6616
+ if (endsSection(oldState, first3)) return null;
6617
+ const revision = () => ({ author, date, dateUtc: date, id: nextId("revision") });
6618
+ if (step.from === step.to) {
6619
+ if (!safeParagraph(first3) || first3.attrs.bookmarks?.length || step.slice.openStart !== 1 || step.slice.openEnd !== 1 || step.slice.content.childCount !== 2 || step.slice.content.child(0).content.size || step.slice.content.child(1).content.size)
6620
+ return null;
6621
+ const left = newState.doc.nodeAt(pos);
6622
+ if (!left) return null;
6623
+ const rightPos = pos + left.nodeSize;
6624
+ const right = newState.doc.nodeAt(rightPos);
6625
+ if (!right || !safeParagraph(left) || !safeParagraph(right) || !sameProperties(first3, left) || !sameProperties(first3, right) || !left.content.append(right.content).eq(first3.content))
6626
+ return null;
6627
+ const used = /* @__PURE__ */ new Set();
6628
+ newState.doc.descendants((node) => {
6629
+ if (node.attrs.id) used.add(String(node.attrs.id));
6630
+ });
6631
+ let id;
6632
+ do
6633
+ id = nextId("paragraph");
6634
+ while (used.has(id));
6635
+ return newState.tr.setNodeMarkup(pos, void 0, {
6636
+ ...left.attrs,
6637
+ id,
6638
+ markRevision: { ...revision(), kind: "insert" }
6639
+ }).setNodeMarkup(rightPos, void 0, { ...first3.attrs });
6640
+ }
6641
+ if (step.to !== step.from + 2 || step.slice.size || step.from !== $from.end() || step.to !== $to.start())
6642
+ return null;
6643
+ const second = $to.parent;
6644
+ if (!safeParagraph(first3, true) || !safeParagraph(second) || !sameProperties(first3, second))
6645
+ return null;
6646
+ const pending = first3.attrs.markRevision;
6647
+ if (pending) {
6648
+ if (pending.kind !== "insert" || pending.author !== author) return null;
6649
+ const merged = newState.doc.nodeAt(pos);
6650
+ if (!merged || !merged.content.eq(first3.content.append(second.content))) return null;
6651
+ return newState.tr.setNodeMarkup(pos, void 0, { ...second.attrs });
6652
+ }
6653
+ return newState.tr.step(step.invert(oldState.doc)).setNodeMarkup(pos, void 0, {
6654
+ ...first3.attrs,
6655
+ markRevision: { ...revision(), kind: "delete" }
6656
+ });
6657
+ }
6492
6658
 
6493
6659
  // docx/ui/track-changes-mode.ts
6494
6660
  var trackChangesPluginKey = new PluginKey("dve-track-changes");
@@ -6630,11 +6796,15 @@ function trackChangesPlugin(getAuthor, isEnabled, idGenerator = createCollaborat
6630
6796
  (tr) => isHistoryTransaction(tr) || tr.getMeta(trackChangesPluginKey) || tr.getMeta(REMOTE_TRANSACTION_META)
6631
6797
  ))
6632
6798
  return null;
6633
- const relevant = transactions.filter((tr) => tr.docChanged);
6799
+ const relevant = transactions.filter(
6800
+ (tr) => tr.docChanged && !tr.getMeta(FIELD_RESULT_REPAIR_META)
6801
+ );
6634
6802
  if (!relevant.length) return null;
6635
6803
  const steps = relevant.flatMap((tr) => tr.steps);
6636
6804
  const author = getAuthor() || "Author";
6637
6805
  const date = new Date(Date.now()).toISOString();
6806
+ const boundary = trackParagraphBoundary(steps, oldState, newState, author, date, idGenerator);
6807
+ if (boundary) return boundary.setMeta(trackChangesPluginKey, { tracked: true });
6638
6808
  if (!steps.length || !steps.every((step) => step instanceof ReplaceStep)) {
6639
6809
  if (newState.doc.attrs.trackFormatting === false) return null;
6640
6810
  const formatting = trackRunFormatting(
@@ -6672,7 +6842,7 @@ function trackChangesPlugin(getAuthor, isEnabled, idGenerator = createCollaborat
6672
6842
  });
6673
6843
  if (!transform.docChanged) return null;
6674
6844
  const result = newState.tr;
6675
- const applied = relevant.flatMap(
6845
+ const applied = transactions.filter((tr) => tr.docChanged).flatMap(
6676
6846
  (tr) => tr.steps.map((step, index) => ({
6677
6847
  step,
6678
6848
  doc: expectDefined(tr.docs[index], "document before step")
@@ -6850,8 +7020,9 @@ function resolveRanges(view, ranges, mode) {
6850
7020
  continue;
6851
7021
  }
6852
7022
  const removeText = mode === "accept" === (range.kind === "delete");
6853
- if (removeText) tr = tr.delete(from, to);
6854
- else {
7023
+ if (removeText) {
7024
+ if (!emptySimpleFieldResult(tr, from, to)) tr.delete(from, to);
7025
+ } else {
6855
7026
  clearInlineTextRevisions(tr, from, to);
6856
7027
  tr = tr.removeMark(
6857
7028
  from,
@@ -7874,4 +8045,4 @@ function fitZoomPercent(mode, viewport, page) {
7874
8045
  return Math.max(10, Math.min(500, Math.floor(ratio * 100)));
7875
8046
  }
7876
8047
 
7877
- export { CollaborationAuthority, CollaborationClient, DirtyState, EDITOR_THEME_MODES, HEADER_FOOTER_INPUT, NotePartsStep, PAGE_GAP, PARAGRAPH_KEEP_KEYS, REMOTE_TRANSACTION_META, RIBBON_ACTION_IDS, RIBBON_ACTION_LABELS, SectionPartsStep, THEME_KEYS, WordYjsCollaboration, WordYjsComments, WordYjsMedia, acceptAllChanges, acceptChangeAtCursor, acceptRevisionRange, addComment, appendInlineNode, applyMarkFormatting, applyRunFormattingPatch, applyThemeColors, applyWordLink, authorColor, backstageFocus, clearDirectRunFormatting, collectRevisionRanges, commentAnchors, commentHistoryAttributes, commentIdsAtSelection, commentIdsFromMarks, commentIdsFromNode, commentThreadsFromDoc, countWords, createCollaborationIdGenerator, createToggleFormat, cssBorderSide, darkTheme, deleteAroundMarkers, deleteComment, deleteFieldSelection, dispatchIsolatedCommand, expectDefined, explicitOffFields, extraRunFields, extraRunProperties, fieldGuardPlugin, fieldMarkerNodeSpec, fieldResultRanges, fieldsBalanced, fitZoomPercent, formattingRevision, freezeBatch, goToComment, goToNextChange, goToPreviousChange, hardBreakNodeSpec, hasAnyChange, hasChangeAtCursor, hasNoteRevisions, imageNodeSpec, inlineNodeRun, insertWordHardBreak, isNavigableHref, isRibbonActionId, isWordYjsRemoteTransaction, ligatureCss, ligatureStyle, lightTheme, linkFromMarks, linkMarkSpec, markSpecs, marksForRun, moveName, nodeNumbering, normalizeRibbonActions, normalizeThemeMode, notePartsJson, noteReferenceNodeSpec, pageBreakNodeSpec, paragraphAttrs, paragraphBoxCss, paragraphFormattingRevision, paragraphFromAttrs, parseBatch, parseBordersJson, placementClass, refreshWordYjsPresence, rejectAllChanges, rejectChangeAtCursor, rejectRevisionRange, removeCommentAnchor, removeCommentThread, removeWordLink, repairCollaborativeDocumentIds, repairCollaborativeParagraphIds, replaceAroundMarkers, replyToComment, resolveCellVisuals, resolveComment, resolveNoteRevisions, restoreNoteParts, restoreSectionParts, reviewMarks, ribbonActionIdForLabel, runPropertiesMark, runToInlineNodes, sameJson2 as sameJson, sameRuns, sectionPartsJson, setCommentThreads, setReviewRecordingPreferences, swatchColor, tableCellStyle, tableStyle, themeDrawing, themeToCssVars, toggleTrackChanges, toggleTrackFormatting, toggleTrackMoves, trackChangesPlugin, trackChangesPluginKey, updateCommentThreads, wordHighlightColors, wordLinkRangeAt, wordYjsPluginKey, wordYjsPresencePlugin, wordYjsRedo, wordYjsUndo };
8048
+ export { CollaborationAuthority, CollaborationClient, DirtyState, EDITOR_THEME_MODES, FIELD_RESULT_REPAIR_META, HEADER_FOOTER_INPUT, NotePartsStep, PAGE_GAP, PARAGRAPH_KEEP_KEYS, REMOTE_TRANSACTION_META, RIBBON_ACTION_IDS, RIBBON_ACTION_LABELS, SectionPartsStep, THEME_KEYS, WordYjsCollaboration, WordYjsComments, WordYjsMedia, acceptAllChanges, acceptChangeAtCursor, acceptRevisionRange, addComment, appendInlineNode, applyMarkFormatting, applyRunFormattingPatch, applyThemeColors, applyWordLink, authorColor, backstageFocus, clearDirectRunFormatting, collectRevisionRanges, commentAnchors, commentHistoryAttributes, commentIdsAtSelection, commentIdsFromMarks, commentIdsFromNode, commentThreadsFromDoc, countWords, createCollaborationIdGenerator, createToggleFormat, cssBorderSide, darkTheme, deleteAroundMarkers, deleteComment, deleteFieldSelection, dispatchIsolatedCommand, expectDefined, explicitOffFields, extraRunFields, extraRunProperties, fieldGuardPlugin, fieldMarkerNodeSpec, fieldResultRanges, fieldsBalanced, fitZoomPercent, formattingRevision, freezeBatch, goToComment, goToNextChange, goToPreviousChange, hardBreakNodeSpec, hasAnyChange, hasChangeAtCursor, hasNoteRevisions, imageNodeSpec, inlineNodeRun, insertWordHardBreak, isNavigableHref, isRibbonActionId, isWordYjsRemoteTransaction, ligatureCss, ligatureStyle, lightTheme, linkFromMarks, linkMarkSpec, markSpecs, marksForRun, moveName, nodeNumbering, normalizeRibbonActions, normalizeThemeMode, notePartsJson, noteReferenceNodeSpec, pageBreakNodeSpec, paragraphAttrs, paragraphBoxCss, paragraphFormattingRevision, paragraphFromAttrs, parseBatch, parseBordersJson, placementClass, refreshWordYjsPresence, rejectAllChanges, rejectChangeAtCursor, rejectRevisionRange, removeCommentAnchor, removeCommentThread, removeWordLink, repairCollaborativeDocumentIds, repairCollaborativeParagraphIds, replaceAroundMarkers, replyToComment, resolveCellVisuals, resolveComment, resolveNoteRevisions, restoreNoteParts, restoreSectionParts, reviewMarks, ribbonActionIdForLabel, runPropertiesMark, runToInlineNodes, sameJson2 as sameJson, sameRuns, sectionPartsJson, setCommentThreads, setReviewRecordingPreferences, swatchColor, tableCellStyle, tableStyle, themeDrawing, themeToCssVars, toggleTrackChanges, toggleTrackFormatting, toggleTrackMoves, trackChangesPlugin, trackChangesPluginKey, updateCommentThreads, wordHighlightColors, wordLinkRangeAt, wordYjsPluginKey, wordYjsPresencePlugin, wordYjsRedo, wordYjsUndo };