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
@@ -1628,13 +1628,296 @@ function resolveTableStyleFormatting(tableStyleId, catalog, look, rowIndex, rowC
1628
1628
  return result;
1629
1629
  }
1630
1630
 
1631
- // docx/theme-color.ts
1632
- function isThemeColorToken(value) {
1633
- return isStThemeColor(value);
1631
+ // color/color-primitives.ts
1632
+ function clampUnitInterval(value) {
1633
+ return Math.min(1, Math.max(0, value));
1634
+ }
1635
+ function hexToRgbChannels(color) {
1636
+ const normalized = color.replace("#", "");
1637
+ if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {
1638
+ return null;
1639
+ }
1640
+ return {
1641
+ r: Number.parseInt(normalized.slice(0, 2), 16),
1642
+ g: Number.parseInt(normalized.slice(2, 4), 16),
1643
+ b: Number.parseInt(normalized.slice(4, 6), 16)
1644
+ };
1645
+ }
1646
+ function percentDivisorFor(text) {
1647
+ return text.endsWith("%") ? 100 : 1e5;
1648
+ }
1649
+ function parseOoxmlPercent(value) {
1650
+ const text = String(value ?? "").trim();
1651
+ const divisor = percentDivisorFor(text);
1652
+ const magnitude = Number.parseFloat(divisor === 100 ? text.slice(0, -1) : text);
1653
+ if (!Number.isFinite(magnitude)) {
1654
+ return void 0;
1655
+ }
1656
+ return magnitude / divisor;
1657
+ }
1658
+ function parseDrawingPercent(value) {
1659
+ const parsed = parseOoxmlPercent(value);
1660
+ return parsed === void 0 ? void 0 : clampUnitInterval(parsed);
1661
+ }
1662
+ function scrgbLinearToSrgb8(linear) {
1663
+ const l = Math.min(1, Math.max(0, linear));
1664
+ const companded = l <= 31308e-7 ? 12.92 * l : 1.055 * l ** (1 / 2.4) - 0.055;
1665
+ return Math.min(255, Math.max(0, Math.round(companded * 255)));
1634
1666
  }
1635
1667
  function toHex(value) {
1636
1668
  return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
1637
1669
  }
1670
+ function rgbToHsl(r, g, b) {
1671
+ const rN = r / 255;
1672
+ const gN = g / 255;
1673
+ const bN = b / 255;
1674
+ const cMax = Math.max(rN, gN, bN);
1675
+ const cMin = Math.min(rN, gN, bN);
1676
+ const delta = cMax - cMin;
1677
+ const l = (cMax + cMin) / 2;
1678
+ let s = 0;
1679
+ if (delta !== 0) {
1680
+ s = delta / (1 - Math.abs(2 * l - 1));
1681
+ }
1682
+ let h = 0;
1683
+ if (delta !== 0) {
1684
+ if (cMax === rN) {
1685
+ h = 60 * ((gN - bN) / delta % 6);
1686
+ } else if (cMax === gN) {
1687
+ h = 60 * ((bN - rN) / delta + 2);
1688
+ } else {
1689
+ h = 60 * ((rN - gN) / delta + 4);
1690
+ }
1691
+ }
1692
+ if (h < 0) {
1693
+ h += 360;
1694
+ }
1695
+ return { h, s: clampUnitInterval(s), l: clampUnitInterval(l) };
1696
+ }
1697
+ function hslToRgb(h, s, l, roundChannel = Math.round, options) {
1698
+ const sC = clampUnitInterval(s);
1699
+ const lC = clampUnitInterval(l);
1700
+ const hN = (h % 360 + 360) % 360;
1701
+ const c = (1 - Math.abs(2 * lC - 1)) * sC;
1702
+ const x = c * (1 - Math.abs(hN / 60 % 2 - 1));
1703
+ const m = lC - c / 2;
1704
+ let rP = 0;
1705
+ let gP = 0;
1706
+ let bP = 0;
1707
+ if (hN < 60) {
1708
+ rP = c;
1709
+ gP = x;
1710
+ bP = 0;
1711
+ } else if (hN < 120) {
1712
+ rP = x;
1713
+ gP = c;
1714
+ bP = 0;
1715
+ } else if (hN < 180) {
1716
+ rP = 0;
1717
+ gP = c;
1718
+ bP = x;
1719
+ } else if (hN < 240) {
1720
+ rP = 0;
1721
+ gP = x;
1722
+ bP = c;
1723
+ } else if (hN < 300) {
1724
+ rP = x;
1725
+ gP = 0;
1726
+ bP = c;
1727
+ } else {
1728
+ rP = c;
1729
+ gP = 0;
1730
+ bP = x;
1731
+ }
1732
+ return {
1733
+ r: roundChannel((rP + m) * 255),
1734
+ g: roundChannel((gP + m) * 255),
1735
+ b: roundChannel((bP + m) * 255)
1736
+ };
1737
+ }
1738
+ function parseDrawingFraction(value) {
1739
+ return parseOoxmlPercent(value);
1740
+ }
1741
+ function parseDrawingHueDegrees(value) {
1742
+ const parsed = Number.parseFloat(String(value ?? "").trim());
1743
+ if (!Number.isFinite(parsed)) {
1744
+ return void 0;
1745
+ }
1746
+ return parsed / 6e4;
1747
+ }
1748
+
1749
+ // color/color-linear.ts
1750
+ function srgb255ToLinear(channel) {
1751
+ const c = clampUnitInterval(channel / 255);
1752
+ return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
1753
+ }
1754
+ function linearToSrgb255(linear) {
1755
+ const c = clampUnitInterval(linear);
1756
+ return 255 * (c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055);
1757
+ }
1758
+
1759
+ // drawingml/drawing-color.ts
1760
+ var PRESET_COLORS = {
1761
+ black: "#000000",
1762
+ white: "#FFFFFF",
1763
+ red: "#FF0000",
1764
+ green: "#008000",
1765
+ blue: "#0000FF",
1766
+ yellow: "#FFFF00",
1767
+ gray: "#808080",
1768
+ grey: "#808080"
1769
+ };
1770
+ function baseHex(color, theme) {
1771
+ switch (color.kind) {
1772
+ case "srgb":
1773
+ return /^[0-9a-f]{6}$/i.test(color.value) ? `#${color.value.toUpperCase()}` : void 0;
1774
+ case "scheme":
1775
+ return theme?.scheme(color.value);
1776
+ case "system":
1777
+ return color.fallback && /^[0-9a-f]{6}$/i.test(color.fallback) ? `#${color.fallback.toUpperCase()}` : void 0;
1778
+ case "preset":
1779
+ return PRESET_COLORS[color.value];
1780
+ case "scrgb": {
1781
+ const [r, g, b] = color.value.split(",").map((part) => parseDrawingFraction(part));
1782
+ if (r === void 0 || g === void 0 || b === void 0) return void 0;
1783
+ return `#${toHex(scrgbLinearToSrgb8(r))}${toHex(scrgbLinearToSrgb8(g))}${toHex(scrgbLinearToSrgb8(b))}`;
1784
+ }
1785
+ case "hsl": {
1786
+ const [h, s, l] = color.value.split(",");
1787
+ const hue = parseDrawingHueDegrees(h);
1788
+ const sat = parseDrawingFraction(s);
1789
+ const lum = parseDrawingFraction(l);
1790
+ if (hue === void 0 || sat === void 0 || lum === void 0) return void 0;
1791
+ const { r, g, b } = hslToRgb(hue, sat, lum);
1792
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
1793
+ }
1794
+ }
1795
+ }
1796
+ var APPLIED = /* @__PURE__ */ new Set([
1797
+ "alpha",
1798
+ "alphaMod",
1799
+ "alphaOff",
1800
+ "comp",
1801
+ "inv",
1802
+ "gray",
1803
+ "shade",
1804
+ "tint",
1805
+ "hue",
1806
+ "hueMod",
1807
+ "hueOff",
1808
+ "sat",
1809
+ "satMod",
1810
+ "satOff",
1811
+ "lum",
1812
+ "lumMod",
1813
+ "lumOff"
1814
+ ]);
1815
+ function resolveDrawingColor(color, theme, options) {
1816
+ const base = baseHex(color, theme);
1817
+ const rgb = base ? hexToRgbChannels(base) : null;
1818
+ if (!rgb) return void 0;
1819
+ let { r, g, b } = rgb;
1820
+ const find = (name) => color.transforms.find((entry) => entry.name === name)?.value;
1821
+ const has = (name) => color.transforms.some((entry) => entry.name === name);
1822
+ if (has("comp")) {
1823
+ const hsl = rgbToHsl(r, g, b);
1824
+ ({ r, g, b } = hslToRgb((hsl.h + 180) % 360, hsl.s, hsl.l));
1825
+ }
1826
+ if (has("inv")) [r, g, b] = [255 - r, 255 - g, 255 - b];
1827
+ if (has("gray")) r = g = b = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
1828
+ const shade = parseDrawingPercent(find("shade"));
1829
+ if (shade !== void 0) {
1830
+ r = linearToSrgb255(srgb255ToLinear(r) * shade);
1831
+ g = linearToSrgb255(srgb255ToLinear(g) * shade);
1832
+ b = linearToSrgb255(srgb255ToLinear(b) * shade);
1833
+ }
1834
+ const tint = parseDrawingPercent(find("tint"));
1835
+ if (tint !== void 0) {
1836
+ r = linearToSrgb255(1 - (1 - srgb255ToLinear(r)) * tint);
1837
+ g = linearToSrgb255(1 - (1 - srgb255ToLinear(g)) * tint);
1838
+ b = linearToSrgb255(1 - (1 - srgb255ToLinear(b)) * tint);
1839
+ }
1840
+ if (["hue", "hueMod", "hueOff", "sat", "satMod", "satOff", "lum", "lumMod", "lumOff"].some(has)) {
1841
+ const hsl = rgbToHsl(r, g, b);
1842
+ const wrap = (degrees) => (degrees % 360 + 360) % 360;
1843
+ const hueAbs = parseDrawingHueDegrees(find("hue"));
1844
+ if (hueAbs !== void 0) hsl.h = wrap(hueAbs);
1845
+ const hueMod = parseDrawingFraction(find("hueMod"));
1846
+ if (hueMod !== void 0) hsl.h = wrap(hsl.h * hueMod);
1847
+ const hueOff = parseDrawingHueDegrees(find("hueOff"));
1848
+ if (hueOff !== void 0) hsl.h = wrap(hsl.h + hueOff);
1849
+ const satAbs = parseDrawingFraction(find("sat"));
1850
+ if (satAbs !== void 0) hsl.s = clampUnitInterval(satAbs);
1851
+ const satMod = parseDrawingFraction(find("satMod"));
1852
+ if (satMod !== void 0) hsl.s = clampUnitInterval(hsl.s * satMod);
1853
+ const satOff = parseDrawingFraction(find("satOff"));
1854
+ if (satOff !== void 0) hsl.s = clampUnitInterval(hsl.s + satOff);
1855
+ const lumAbs = parseDrawingFraction(find("lum"));
1856
+ if (lumAbs !== void 0) hsl.l = clampUnitInterval(lumAbs);
1857
+ const lumMod = parseDrawingFraction(find("lumMod"));
1858
+ if (lumMod !== void 0) hsl.l = clampUnitInterval(hsl.l * lumMod);
1859
+ const lumOff = parseDrawingFraction(find("lumOff"));
1860
+ if (lumOff !== void 0) hsl.l = clampUnitInterval(hsl.l + lumOff);
1861
+ const round = Math.round;
1862
+ ({ r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l, round));
1863
+ }
1864
+ let alpha = parseDrawingPercent(find("alpha")) ?? 1;
1865
+ const alphaMod = parseDrawingFraction(find("alphaMod"));
1866
+ if (alphaMod !== void 0) alpha = clampUnitInterval(alpha * alphaMod);
1867
+ const alphaOff = parseDrawingFraction(find("alphaOff"));
1868
+ if (alphaOff !== void 0) alpha = clampUnitInterval(alpha + alphaOff);
1869
+ return {
1870
+ hex: `#${toHex(r)}${toHex(g)}${toHex(b)}`,
1871
+ alpha,
1872
+ unapplied: [...new Set(color.transforms.map((entry) => entry.name))].filter(
1873
+ (name) => !APPLIED.has(name)
1874
+ )
1875
+ };
1876
+ }
1877
+
1878
+ // drawingml/theme-model.ts
1879
+ var THEME_COLOR_SLOTS = [
1880
+ "dk1",
1881
+ "lt1",
1882
+ "dk2",
1883
+ "lt2",
1884
+ "accent1",
1885
+ "accent2",
1886
+ "accent3",
1887
+ "accent4",
1888
+ "accent5",
1889
+ "accent6",
1890
+ "hlink",
1891
+ "folHlink"
1892
+ ];
1893
+ var DEFAULT_THEME_COLOR_MAP = {
1894
+ bg1: "lt1",
1895
+ tx1: "dk1",
1896
+ bg2: "lt2",
1897
+ tx2: "dk2"
1898
+ };
1899
+
1900
+ // drawingml/theme.ts
1901
+ var SLOT_SET = new Set(THEME_COLOR_SLOTS);
1902
+ function isThemeColorSlot(value) {
1903
+ return SLOT_SET.has(value);
1904
+ }
1905
+
1906
+ // drawingml/theme-color.ts
1907
+ function isLogical(name) {
1908
+ return Object.hasOwn(DEFAULT_THEME_COLOR_MAP, name);
1909
+ }
1910
+ function themeColorSlotFor(name, colorMap = {}) {
1911
+ if (isLogical(name)) return colorMap[name] ?? DEFAULT_THEME_COLOR_MAP[name];
1912
+ if (!isThemeColorSlot(name)) return void 0;
1913
+ if (name === "dk1" || name === "lt1" || name === "dk2" || name === "lt2") return name;
1914
+ return colorMap[name] ?? name;
1915
+ }
1916
+
1917
+ // docx/theme-color.ts
1918
+ function isThemeColorToken(value) {
1919
+ return isStThemeColor(value);
1920
+ }
1638
1921
  function fractionToThemeByte(fraction) {
1639
1922
  return toHex(Math.round(Math.min(1, Math.max(0, fraction)) * 255));
1640
1923
  }
@@ -2500,305 +2783,58 @@ var add = (parent, ...items) => {
2500
2783
  return parent;
2501
2784
  };
2502
2785
  var emu = (px) => String(Math.max(1, Math.round(px * EMU_PER_PIXEL)));
2503
- var descendants = (root, ns, local) => Array.from(root.getElementsByTagNameNS(ns, local));
2504
- function paragraphsFor(doc, lines) {
2505
- return (lines.length ? lines : [""]).map((line) => {
2506
- const paragraph = makeW(doc, "p");
2507
- if (line) {
2508
- const run = makeW(doc, "r");
2509
- const text = makeW(doc, "t");
2510
- if (/^\s|\s$/.test(line))
2511
- text.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space", "preserve");
2512
- text.textContent = line;
2513
- add(run, text);
2514
- add(paragraph, run);
2515
- }
2516
- return paragraph;
2517
- });
2518
- }
2519
- function outline(doc, border) {
2520
- const ln = el(doc, A_NS, "a:ln");
2521
- if (!border) return add(ln, el(doc, A_NS, "a:noFill"));
2522
- ln.setAttribute("w", "9525");
2523
- const color = el(doc, A_NS, "a:srgbClr");
2524
- color.setAttribute("val", "000000");
2525
- return add(ln, add(el(doc, A_NS, "a:solidFill"), color));
2526
- }
2527
- function patchTextBox(doc, drawing, image, base) {
2528
- if (image.widthPx !== base.widthPx || image.heightPx !== base.heightPx)
2529
- for (const node of [
2530
- ...descendants(drawing, WP_NS, "extent"),
2531
- ...descendants(drawing, A_NS, "ext").filter(
2532
- (ext) => ext.parentNode?.localName === "xfrm"
2533
- )
2534
- ]) {
2535
- node.setAttribute("cx", emu(image.widthPx));
2536
- node.setAttribute("cy", emu(image.heightPx));
2537
- }
2538
- if (JSON.stringify(image.textBoxText) !== JSON.stringify(base.textBoxText)) {
2539
- const content = descendants(drawing, W_NS, "txbxContent")[0];
2540
- if (content) {
2541
- for (const child of Array.from(content.childNodes)) content.removeChild(child);
2542
- add(content, ...paragraphsFor(doc, image.textBoxText ?? []));
2543
- }
2544
- }
2545
- if (image.textBoxBorder !== false !== (base.textBoxBorder !== false)) {
2546
- const spPr = descendants(drawing, WPS_NS, "spPr")[0];
2547
- if (spPr) {
2548
- for (const old of Array.from(spPr.childNodes).filter(
2549
- (node) => isElement(node) && node.localName === "ln"
2550
- ))
2551
- spPr.removeChild(old);
2552
- spPr.appendChild(outline(doc, image.textBoxBorder !== false));
2553
- }
2554
- }
2555
- }
2556
-
2557
- // color/color-primitives.ts
2558
- function clampUnitInterval(value) {
2559
- return Math.min(1, Math.max(0, value));
2560
- }
2561
- function hexToRgbChannels(color) {
2562
- const normalized = color.replace("#", "");
2563
- if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {
2564
- return null;
2565
- }
2566
- return {
2567
- r: Number.parseInt(normalized.slice(0, 2), 16),
2568
- g: Number.parseInt(normalized.slice(2, 4), 16),
2569
- b: Number.parseInt(normalized.slice(4, 6), 16)
2570
- };
2571
- }
2572
- function percentDivisorFor(text) {
2573
- return text.endsWith("%") ? 100 : 1e5;
2574
- }
2575
- function parseOoxmlPercent(value) {
2576
- const text = String(value ?? "").trim();
2577
- const divisor = percentDivisorFor(text);
2578
- const magnitude = Number.parseFloat(divisor === 100 ? text.slice(0, -1) : text);
2579
- if (!Number.isFinite(magnitude)) {
2580
- return void 0;
2581
- }
2582
- return magnitude / divisor;
2583
- }
2584
- function parseDrawingPercent(value) {
2585
- const parsed = parseOoxmlPercent(value);
2586
- return parsed === void 0 ? void 0 : clampUnitInterval(parsed);
2587
- }
2588
- function scrgbLinearToSrgb8(linear) {
2589
- const l = Math.min(1, Math.max(0, linear));
2590
- const companded = l <= 31308e-7 ? 12.92 * l : 1.055 * l ** (1 / 2.4) - 0.055;
2591
- return Math.min(255, Math.max(0, Math.round(companded * 255)));
2592
- }
2593
- function toHex2(value) {
2594
- return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
2595
- }
2596
- function rgbToHsl(r, g, b) {
2597
- const rN = r / 255;
2598
- const gN = g / 255;
2599
- const bN = b / 255;
2600
- const cMax = Math.max(rN, gN, bN);
2601
- const cMin = Math.min(rN, gN, bN);
2602
- const delta = cMax - cMin;
2603
- const l = (cMax + cMin) / 2;
2604
- let s = 0;
2605
- if (delta !== 0) {
2606
- s = delta / (1 - Math.abs(2 * l - 1));
2607
- }
2608
- let h = 0;
2609
- if (delta !== 0) {
2610
- if (cMax === rN) {
2611
- h = 60 * ((gN - bN) / delta % 6);
2612
- } else if (cMax === gN) {
2613
- h = 60 * ((bN - rN) / delta + 2);
2614
- } else {
2615
- h = 60 * ((rN - gN) / delta + 4);
2616
- }
2617
- }
2618
- if (h < 0) {
2619
- h += 360;
2620
- }
2621
- return { h, s: clampUnitInterval(s), l: clampUnitInterval(l) };
2622
- }
2623
- function hslToRgb(h, s, l, roundChannel = Math.round, options) {
2624
- const sC = clampUnitInterval(s);
2625
- const lC = clampUnitInterval(l);
2626
- const hN = (h % 360 + 360) % 360;
2627
- const c = (1 - Math.abs(2 * lC - 1)) * sC;
2628
- const x = c * (1 - Math.abs(hN / 60 % 2 - 1));
2629
- const m = lC - c / 2;
2630
- let rP = 0;
2631
- let gP = 0;
2632
- let bP = 0;
2633
- if (hN < 60) {
2634
- rP = c;
2635
- gP = x;
2636
- bP = 0;
2637
- } else if (hN < 120) {
2638
- rP = x;
2639
- gP = c;
2640
- bP = 0;
2641
- } else if (hN < 180) {
2642
- rP = 0;
2643
- gP = c;
2644
- bP = x;
2645
- } else if (hN < 240) {
2646
- rP = 0;
2647
- gP = x;
2648
- bP = c;
2649
- } else if (hN < 300) {
2650
- rP = x;
2651
- gP = 0;
2652
- bP = c;
2653
- } else {
2654
- rP = c;
2655
- gP = 0;
2656
- bP = x;
2657
- }
2658
- return {
2659
- r: roundChannel((rP + m) * 255),
2660
- g: roundChannel((gP + m) * 255),
2661
- b: roundChannel((bP + m) * 255)
2662
- };
2663
- }
2664
- function parseDrawingFraction(value) {
2665
- return parseOoxmlPercent(value);
2666
- }
2667
- function parseDrawingHueDegrees(value) {
2668
- const parsed = Number.parseFloat(String(value ?? "").trim());
2669
- if (!Number.isFinite(parsed)) {
2670
- return void 0;
2671
- }
2672
- return parsed / 6e4;
2673
- }
2674
-
2675
- // color/color-linear.ts
2676
- function srgb255ToLinear(channel) {
2677
- const c = clampUnitInterval(channel / 255);
2678
- return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
2786
+ var descendants = (root, ns, local) => Array.from(root.getElementsByTagNameNS(ns, local));
2787
+ function paragraphsFor(doc, lines) {
2788
+ return (lines.length ? lines : [""]).map((line) => {
2789
+ const paragraph = makeW(doc, "p");
2790
+ if (line) {
2791
+ const run = makeW(doc, "r");
2792
+ const text = makeW(doc, "t");
2793
+ if (/^\s|\s$/.test(line))
2794
+ text.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space", "preserve");
2795
+ text.textContent = line;
2796
+ add(run, text);
2797
+ add(paragraph, run);
2798
+ }
2799
+ return paragraph;
2800
+ });
2679
2801
  }
2680
- function linearToSrgb255(linear) {
2681
- const c = clampUnitInterval(linear);
2682
- return 255 * (c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055);
2802
+ function outline(doc, border) {
2803
+ const ln = el(doc, A_NS, "a:ln");
2804
+ if (!border) return add(ln, el(doc, A_NS, "a:noFill"));
2805
+ ln.setAttribute("w", "9525");
2806
+ const color = el(doc, A_NS, "a:srgbClr");
2807
+ color.setAttribute("val", "000000");
2808
+ return add(ln, add(el(doc, A_NS, "a:solidFill"), color));
2683
2809
  }
2684
-
2685
- // diagram/drawing-color.ts
2686
- var PRESET_COLORS = {
2687
- black: "#000000",
2688
- white: "#FFFFFF",
2689
- red: "#FF0000",
2690
- green: "#008000",
2691
- blue: "#0000FF",
2692
- yellow: "#FFFF00",
2693
- gray: "#808080",
2694
- grey: "#808080"
2695
- };
2696
- function baseHex(color, theme) {
2697
- switch (color.kind) {
2698
- case "srgb":
2699
- return /^[0-9a-f]{6}$/i.test(color.value) ? `#${color.value.toUpperCase()}` : void 0;
2700
- case "scheme":
2701
- return theme?.scheme(color.value);
2702
- case "system":
2703
- return color.fallback && /^[0-9a-f]{6}$/i.test(color.fallback) ? `#${color.fallback.toUpperCase()}` : void 0;
2704
- case "preset":
2705
- return PRESET_COLORS[color.value];
2706
- case "scrgb": {
2707
- const [r, g, b] = color.value.split(",").map((part) => parseDrawingFraction(part));
2708
- if (r === void 0 || g === void 0 || b === void 0) return void 0;
2709
- return `#${toHex2(scrgbLinearToSrgb8(r))}${toHex2(scrgbLinearToSrgb8(g))}${toHex2(scrgbLinearToSrgb8(b))}`;
2810
+ function patchTextBox(doc, drawing, image, base) {
2811
+ if (image.widthPx !== base.widthPx || image.heightPx !== base.heightPx)
2812
+ for (const node of [
2813
+ ...descendants(drawing, WP_NS, "extent"),
2814
+ ...descendants(drawing, A_NS, "ext").filter(
2815
+ (ext) => ext.parentNode?.localName === "xfrm"
2816
+ )
2817
+ ]) {
2818
+ node.setAttribute("cx", emu(image.widthPx));
2819
+ node.setAttribute("cy", emu(image.heightPx));
2710
2820
  }
2711
- case "hsl": {
2712
- const [h, s, l] = color.value.split(",");
2713
- const hue = parseDrawingHueDegrees(h);
2714
- const sat = parseDrawingFraction(s);
2715
- const lum = parseDrawingFraction(l);
2716
- if (hue === void 0 || sat === void 0 || lum === void 0) return void 0;
2717
- const { r, g, b } = hslToRgb(hue, sat, lum);
2718
- return `#${toHex2(r)}${toHex2(g)}${toHex2(b)}`;
2821
+ if (JSON.stringify(image.textBoxText) !== JSON.stringify(base.textBoxText)) {
2822
+ const content = descendants(drawing, W_NS, "txbxContent")[0];
2823
+ if (content) {
2824
+ for (const child of Array.from(content.childNodes)) content.removeChild(child);
2825
+ add(content, ...paragraphsFor(doc, image.textBoxText ?? []));
2719
2826
  }
2720
2827
  }
2721
- }
2722
- var APPLIED = /* @__PURE__ */ new Set([
2723
- "alpha",
2724
- "alphaMod",
2725
- "alphaOff",
2726
- "comp",
2727
- "inv",
2728
- "gray",
2729
- "shade",
2730
- "tint",
2731
- "hue",
2732
- "hueMod",
2733
- "hueOff",
2734
- "sat",
2735
- "satMod",
2736
- "satOff",
2737
- "lum",
2738
- "lumMod",
2739
- "lumOff"
2740
- ]);
2741
- function resolveDrawingColor(color, theme, options) {
2742
- const base = baseHex(color, theme);
2743
- const rgb = base ? hexToRgbChannels(base) : null;
2744
- if (!rgb) return void 0;
2745
- let { r, g, b } = rgb;
2746
- const find = (name) => color.transforms.find((entry) => entry.name === name)?.value;
2747
- const has = (name) => color.transforms.some((entry) => entry.name === name);
2748
- if (has("comp")) {
2749
- const hsl = rgbToHsl(r, g, b);
2750
- ({ r, g, b } = hslToRgb((hsl.h + 180) % 360, hsl.s, hsl.l));
2751
- }
2752
- if (has("inv")) [r, g, b] = [255 - r, 255 - g, 255 - b];
2753
- if (has("gray")) r = g = b = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
2754
- const shade = parseDrawingPercent(find("shade"));
2755
- if (shade !== void 0) {
2756
- r = linearToSrgb255(srgb255ToLinear(r) * shade);
2757
- g = linearToSrgb255(srgb255ToLinear(g) * shade);
2758
- b = linearToSrgb255(srgb255ToLinear(b) * shade);
2759
- }
2760
- const tint = parseDrawingPercent(find("tint"));
2761
- if (tint !== void 0) {
2762
- r = linearToSrgb255(1 - (1 - srgb255ToLinear(r)) * tint);
2763
- g = linearToSrgb255(1 - (1 - srgb255ToLinear(g)) * tint);
2764
- b = linearToSrgb255(1 - (1 - srgb255ToLinear(b)) * tint);
2765
- }
2766
- if (["hue", "hueMod", "hueOff", "sat", "satMod", "satOff", "lum", "lumMod", "lumOff"].some(has)) {
2767
- const hsl = rgbToHsl(r, g, b);
2768
- const wrap = (degrees) => (degrees % 360 + 360) % 360;
2769
- const hueAbs = parseDrawingHueDegrees(find("hue"));
2770
- if (hueAbs !== void 0) hsl.h = wrap(hueAbs);
2771
- const hueMod = parseDrawingFraction(find("hueMod"));
2772
- if (hueMod !== void 0) hsl.h = wrap(hsl.h * hueMod);
2773
- const hueOff = parseDrawingHueDegrees(find("hueOff"));
2774
- if (hueOff !== void 0) hsl.h = wrap(hsl.h + hueOff);
2775
- const satAbs = parseDrawingFraction(find("sat"));
2776
- if (satAbs !== void 0) hsl.s = clampUnitInterval(satAbs);
2777
- const satMod = parseDrawingFraction(find("satMod"));
2778
- if (satMod !== void 0) hsl.s = clampUnitInterval(hsl.s * satMod);
2779
- const satOff = parseDrawingFraction(find("satOff"));
2780
- if (satOff !== void 0) hsl.s = clampUnitInterval(hsl.s + satOff);
2781
- const lumAbs = parseDrawingFraction(find("lum"));
2782
- if (lumAbs !== void 0) hsl.l = clampUnitInterval(lumAbs);
2783
- const lumMod = parseDrawingFraction(find("lumMod"));
2784
- if (lumMod !== void 0) hsl.l = clampUnitInterval(hsl.l * lumMod);
2785
- const lumOff = parseDrawingFraction(find("lumOff"));
2786
- if (lumOff !== void 0) hsl.l = clampUnitInterval(hsl.l + lumOff);
2787
- const round = Math.round;
2788
- ({ r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l, round));
2828
+ if (image.textBoxBorder !== false !== (base.textBoxBorder !== false)) {
2829
+ const spPr = descendants(drawing, WPS_NS, "spPr")[0];
2830
+ if (spPr) {
2831
+ for (const old of Array.from(spPr.childNodes).filter(
2832
+ (node) => isElement(node) && node.localName === "ln"
2833
+ ))
2834
+ spPr.removeChild(old);
2835
+ spPr.appendChild(outline(doc, image.textBoxBorder !== false));
2836
+ }
2789
2837
  }
2790
- let alpha = parseDrawingPercent(find("alpha")) ?? 1;
2791
- const alphaMod = parseDrawingFraction(find("alphaMod"));
2792
- if (alphaMod !== void 0) alpha = clampUnitInterval(alpha * alphaMod);
2793
- const alphaOff = parseDrawingFraction(find("alphaOff"));
2794
- if (alphaOff !== void 0) alpha = clampUnitInterval(alpha + alphaOff);
2795
- return {
2796
- hex: `#${toHex2(r)}${toHex2(g)}${toHex2(b)}`,
2797
- alpha,
2798
- unapplied: [...new Set(color.transforms.map((entry) => entry.name))].filter(
2799
- (name) => !APPLIED.has(name)
2800
- )
2801
- };
2802
2838
  }
2803
2839
 
2804
2840
  // docx/write-drawing.ts
@@ -2912,6 +2948,17 @@ function restoreRunFormatting(run) {
2912
2948
  else delete run.revision;
2913
2949
  }
2914
2950
 
2951
+ // docx/field-flags.ts
2952
+ function writeFieldFlags(element, flags) {
2953
+ for (const [name, value] of [
2954
+ ["fldLock", flags?.locked],
2955
+ ["dirty", flags?.dirty]
2956
+ ]) {
2957
+ if (value === void 0) element.removeAttributeNS(WORD_NS, name);
2958
+ else element.setAttributeNS(WORD_NS, `w:${name}`, value ? "true" : "false");
2959
+ }
2960
+ }
2961
+
2915
2962
  // docx/write-run.ts
2916
2963
  function setAttribute6(element, local, value) {
2917
2964
  element.setAttributeNS(WORD_NS, `w:${local}`, value);
@@ -3097,6 +3144,7 @@ function createRun(doc, run, base, old, allocator) {
3097
3144
  if (run.fieldChar) {
3098
3145
  const marker = makeW(doc, "fldChar");
3099
3146
  setAttribute6(marker, "fldCharType", run.fieldChar);
3147
+ writeFieldFlags(marker, run.fieldFlags);
3100
3148
  node.appendChild(marker);
3101
3149
  return node;
3102
3150
  }
@@ -3177,6 +3225,11 @@ function takeSimpleFieldCommentEdges(doc, runs, start, end, opens, closes) {
3177
3225
  after: take(closes, end - 1).reverse().flatMap((edge) => rangeEndNodes(doc, edge))
3178
3226
  };
3179
3227
  }
3228
+
3229
+ // docx/field-lock.ts
3230
+ function sameFieldFlags(a, b) {
3231
+ return a?.locked === b?.locked && a?.dirty === b?.dirty;
3232
+ }
3180
3233
  var MATH_NAMESPACES = /* @__PURE__ */ new Set([
3181
3234
  "http://schemas.openxmlformats.org/officeDocument/2006/math",
3182
3235
  "http://purl.oclc.org/ooxml/officeDocument/math"
@@ -3372,6 +3425,7 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
3372
3425
  container = makeW(doc, "fldSimple");
3373
3426
  setW2(container, "instr", ` ${group.instr} `);
3374
3427
  }
3428
+ if (group.kind === "simpleField") writeFieldFlags(container, runAt(start).fieldFlags);
3375
3429
  const edges = group.kind === "simpleField" ? takeSimpleFieldCommentEdges(doc, runs, start, index, opens, closes) : { before: [], after: [] };
3376
3430
  for (let item = start; item < index; item++)
3377
3431
  for (const node of nodesFor(item)) container.appendChild(node);
@@ -3382,13 +3436,18 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
3382
3436
  function containerGroup(run) {
3383
3437
  if (run.link) return { kind: "link", link: run.link };
3384
3438
  if (run.field?.simple)
3385
- return { kind: "simpleField", instr: run.field.instr, instanceId: run.fieldInstanceId };
3439
+ return {
3440
+ kind: "simpleField",
3441
+ instr: run.field.instr,
3442
+ instanceId: run.fieldInstanceId,
3443
+ fieldFlags: run.fieldFlags
3444
+ };
3386
3445
  return void 0;
3387
3446
  }
3388
3447
  function sameGroup(a, b) {
3389
3448
  if (!a || !b) return a === b;
3390
3449
  if (a.kind === "link" && b.kind === "link") return sameLink(a.link, b.link);
3391
- return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId;
3450
+ return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId && sameFieldFlags(a.fieldFlags, b.fieldFlags);
3392
3451
  }
3393
3452
 
3394
3453
  // docx/paragraph-properties.ts
@@ -3560,19 +3619,6 @@ function createParagraph(doc, paragraph, allocator, spans) {
3560
3619
  return writeParagraphImpl(doc, paragraph, node, void 0, allocator, spans);
3561
3620
  }
3562
3621
 
3563
- // docx/document-paragraphs.ts
3564
- function documentBlockLists(model) {
3565
- return [
3566
- model.blocks,
3567
- ...(model.sections ?? []).flatMap(
3568
- (section) => [section.headers, section.footers].flatMap(
3569
- (slots) => Object.values(slots ?? {}).flatMap((content) => content ? [content.blocks] : [])
3570
- )
3571
- ),
3572
- ...[...model.footnotes ?? [], ...model.endnotes ?? []].map((note) => note.blocks)
3573
- ];
3574
- }
3575
-
3576
3622
  // docx/numbering-parse.ts
3577
3623
  function resolveNumberingLevel(catalog, numId, level) {
3578
3624
  const num = catalog.nums[numId];
@@ -3598,33 +3644,26 @@ function resolveNumberingLevel(catalog, numId, level) {
3598
3644
  return start !== base.start ? { ...base, start } : base;
3599
3645
  }
3600
3646
 
3647
+ // docx/document-paragraphs.ts
3648
+ function documentBlockLists(model) {
3649
+ return [
3650
+ model.blocks,
3651
+ ...(model.sections ?? []).flatMap(
3652
+ (section) => [section.headers, section.footers].flatMap(
3653
+ (slots) => Object.values(slots ?? {}).flatMap((content) => content ? [content.blocks] : [])
3654
+ )
3655
+ ),
3656
+ ...[...model.footnotes ?? [], ...model.endnotes ?? []].map((note) => note.blocks)
3657
+ ];
3658
+ }
3659
+
3601
3660
  // docx/diagram-theme.ts
3602
- var DEFAULT_MAPPING = {
3603
- bg1: "lt1",
3604
- tx1: "dk1",
3605
- bg2: "lt2",
3606
- tx2: "dk2"
3607
- };
3608
- var SLOTS = /* @__PURE__ */ new Set([
3609
- "dk1",
3610
- "lt1",
3611
- "dk2",
3612
- "lt2",
3613
- "accent1",
3614
- "accent2",
3615
- "accent3",
3616
- "accent4",
3617
- "accent5",
3618
- "accent6",
3619
- "hlink",
3620
- "folHlink"
3621
- ]);
3622
3661
  function diagramColorTheme(theme) {
3623
3662
  return {
3624
3663
  scheme(name) {
3625
3664
  if (!theme) return void 0;
3626
- const mapped = name in DEFAULT_MAPPING ? theme.colorMapping[name] ?? DEFAULT_MAPPING[name] : SLOTS.has(name) ? name : void 0;
3627
- const hex = mapped ? theme.colors[mapped] : void 0;
3665
+ const slot = themeColorSlotFor(name, theme.colorMapping);
3666
+ const hex = slot ? theme.colors[slot] : void 0;
3628
3667
  return hex ? `#${hex.replace(/^#/, "").toUpperCase()}` : void 0;
3629
3668
  }
3630
3669
  };
@@ -3988,6 +4027,7 @@ var ligatureStyle = (value) => isLigatures(value) ? `font-variant-ligatures:${li
3988
4027
  // docx/ui/run-extra-mark.ts
3989
4028
  var extraRunFields = [
3990
4029
  "fieldInstanceId",
4030
+ "fieldFlags",
3991
4031
  "restoredRunPropertiesXml",
3992
4032
  "sourceRunPropertiesXml",
3993
4033
  "formatRevision",
@@ -4513,12 +4553,12 @@ function fieldClipboardSlice(slice) {
4513
4553
  if (!(field?.attrs.simple ?? cached2?.simple) && complete.has(pos)) return node;
4514
4554
  const marks = node.marks.flatMap((mark) => {
4515
4555
  if (mark.type === field?.type) return [];
4516
- if (mark.type.name !== "runProperties" || !mark.attrs.props?.fieldInstanceId) return [mark];
4517
- const { fieldInstanceId: _identity, ...props } = mark.attrs.props;
4556
+ if (mark.type.name !== "runProperties") return [mark];
4557
+ const { fieldInstanceId: _identity, fieldFlags: _flags2, ...props } = mark.attrs.props ?? {};
4518
4558
  return Object.keys(props).length ? [mark.type.create({ ...mark.attrs, props })] : [];
4519
4559
  });
4520
4560
  if (!properties3 || !cached2) return node.mark(marks);
4521
- const { field: _field, fieldInstanceId: _id, ...literal } = properties3;
4561
+ const { field: _field, fieldInstanceId: _id, fieldFlags: _flags, ...literal } = properties3;
4522
4562
  return node.type.create(
4523
4563
  updatedInlineRunAttributes(
4524
4564
  node,
@@ -4542,13 +4582,14 @@ function fieldResultRanges(doc) {
4542
4582
  const field = doc.type.schema.marks.field;
4543
4583
  if (!field) return runs;
4544
4584
  const identityOf = (marks) => marks.find((mark) => mark.type.name === "runProperties")?.attrs.props?.fieldInstanceId;
4585
+ const flagsOf = (marks) => marks.find((mark) => mark.type.name === "runProperties")?.attrs.props?.fieldFlags;
4545
4586
  doc.descendants((node, pos) => {
4546
4587
  if (node.type.name !== "paragraph") return true;
4547
4588
  let open;
4548
4589
  node.forEach((child, offset) => {
4549
4590
  const mark = child.isText ? child.marks.find((item) => item.type === field) : void 0;
4550
4591
  const start = pos + 1 + offset;
4551
- if (mark && open?.mark.eq(mark) && identityOf(open.marks) === identityOf(child.marks)) {
4592
+ if (mark && open?.mark.eq(mark) && identityOf(open.marks) === identityOf(child.marks) && sameFieldFlags(flagsOf(open.marks), flagsOf(child.marks))) {
4552
4593
  open.to = start + child.nodeSize;
4553
4594
  open.text += child.text ?? "";
4554
4595
  } else if (mark) {
@@ -4576,14 +4617,20 @@ function targetField(state, from, to) {
4576
4617
  }
4577
4618
  function resultMarks(node, field) {
4578
4619
  let marks = field.mark.addToSet(node.marks);
4579
- const id = field.marks.find((mark) => mark.type.name === "runProperties")?.attrs.props?.fieldInstanceId;
4620
+ const source = field.marks.find((mark) => mark.type.name === "runProperties")?.attrs.props;
4621
+ const id = source?.fieldInstanceId;
4622
+ const state = {
4623
+ ...typeof id === "string" && { fieldInstanceId: id },
4624
+ ...source?.fieldFlags && { fieldFlags: source.fieldFlags }
4625
+ };
4580
4626
  const properties3 = node.type.schema.marks.runProperties;
4581
- if (typeof id === "string" && properties3) {
4627
+ if (properties3) {
4582
4628
  const old = properties3.isInSet(marks);
4583
- marks = properties3.create({
4584
- ...old?.attrs ?? {},
4585
- props: { ...old?.attrs.props ?? {}, fieldInstanceId: id }
4586
- }).addToSet(marks);
4629
+ const { fieldInstanceId: _identity, fieldFlags: _flags, ...other } = old?.attrs.props ?? {};
4630
+ const props = { ...other, ...state };
4631
+ marks = properties3.removeFromSet(marks);
4632
+ if (Object.keys(props).length)
4633
+ marks = properties3.create({ ...old?.attrs ?? {}, props }).addToSet(marks);
4587
4634
  }
4588
4635
  return marks;
4589
4636
  }
@@ -4613,29 +4660,41 @@ function replaceSimpleFieldResult(state, from, to, text) {
4613
4660
  const field = targetField(state, from, to);
4614
4661
  if (!field) return null;
4615
4662
  if (!text) {
4616
- if (from !== field.from || to !== field.to || !state.schema.nodes.fieldMarker) return null;
4617
- const run = inlineNodeRun(state.doc.nodeAt(from));
4618
- if (!run) return null;
4619
- const format = {
4620
- ...run.commentIds && { commentIds: run.commentIds }
4621
- };
4622
- const markers = [
4623
- { ...format, text: "", fieldChar: "begin" },
4624
- { ...format, text: "", fieldCode: field.mark.attrs.instr },
4625
- { ...format, text: "", fieldChar: "separate" },
4626
- { ...format, text: "", fieldChar: "end" }
4627
- ].flatMap((item) => runToInlineNodes(item, state.schema));
4628
- const tr2 = state.tr.replaceWith(from, to, markers);
4663
+ const tr2 = state.tr;
4664
+ if (!emptySimpleFieldResult(tr2, from, to)) return null;
4629
4665
  return tr2.setSelection(prosemirrorState.TextSelection.create(tr2.doc, from + 3));
4630
4666
  }
4631
- const tr = state.tr.insertText(text, from, to);
4632
- tr.doc.nodesBetween(from, from + text.length, (node, pos) => {
4633
- if (!node.isText) return;
4634
- for (const mark of resultMarks(node, field))
4635
- tr.addMark(Math.max(from, pos), Math.min(from + text.length, pos + node.nodeSize), mark);
4636
- });
4667
+ const $from = state.doc.resolve(from);
4668
+ const marks = state.storedMarks ?? (from === to ? $from.marks() : $from.marksAcross(state.doc.resolve(to)));
4669
+ const node = state.schema.text(text, marks);
4670
+ const tr = state.tr.replaceRangeWith(from, to, node.mark(resultMarks(node, field)));
4671
+ if (!tr.selection.empty && tr.selection.to === from + text.length)
4672
+ tr.setSelection(prosemirrorState.TextSelection.near(tr.selection.$to));
4637
4673
  return tr;
4638
4674
  }
4675
+ function emptySimpleFieldResult(transform, from, to) {
4676
+ const field = fieldResultRanges(transform.doc).find(
4677
+ (range) => range.mark.attrs.simple && range.from === from && range.to === to
4678
+ );
4679
+ const schema = transform.doc.type.schema;
4680
+ if (!field || !schema.nodes.fieldMarker) return false;
4681
+ const run = inlineNodeRun(transform.doc.nodeAt(from));
4682
+ if (!run) return false;
4683
+ const format = { ...run.commentIds && { commentIds: run.commentIds } };
4684
+ const markers = [
4685
+ {
4686
+ ...format,
4687
+ text: "",
4688
+ fieldChar: "begin",
4689
+ ...run.fieldFlags && { fieldFlags: run.fieldFlags }
4690
+ },
4691
+ { ...format, text: "", fieldCode: field.mark.attrs.instr },
4692
+ { ...format, text: "", fieldChar: "separate" },
4693
+ { ...format, text: "", fieldChar: "end" }
4694
+ ].flatMap((item) => runToInlineNodes(item, schema));
4695
+ transform.replaceWith(from, to, markers);
4696
+ return true;
4697
+ }
4639
4698
  function deleteSimpleFieldResult(state, backward) {
4640
4699
  const { from, to, empty } = state.selection;
4641
4700
  if (!empty) return replaceSimpleFieldResult(state, from, to, "");
@@ -4649,6 +4708,7 @@ function deleteSimpleFieldResult(state, backward) {
4649
4708
  }
4650
4709
 
4651
4710
  // docx/ui/field-guard.ts
4711
+ var FIELD_RESULT_REPAIR_META = "dve-field-result-repair";
4652
4712
  function markerKinds(doc) {
4653
4713
  const kinds = [];
4654
4714
  doc.descendants((node) => {
@@ -4724,11 +4784,12 @@ function markFieldResults(state) {
4724
4784
  const fieldMark = state.schema.marks.field;
4725
4785
  if (!fieldMark) return null;
4726
4786
  const stack = [];
4727
- const missing = [];
4787
+ const transaction = state.tr;
4728
4788
  state.doc.descendants((node, pos) => {
4729
4789
  if (node.type.name === "fieldMarker") {
4730
4790
  const kind = node.attrs.kind;
4731
- if (kind === "begin") stack.push({ code: "", inResult: false });
4791
+ if (kind === "begin")
4792
+ stack.push({ code: "", inResult: false, locked: inlineNodeRun(node)?.fieldFlags?.locked });
4732
4793
  else if (kind === "code" && stack.length) {
4733
4794
  const open = stack[stack.length - 1];
4734
4795
  if (open) open.code += node.attrs.code ?? "";
@@ -4739,15 +4800,28 @@ function markFieldResults(state) {
4739
4800
  return false;
4740
4801
  }
4741
4802
  const top = stack.at(-1);
4742
- if (node.isText && top?.inResult && !fieldMark.isInSet(node.marks))
4743
- missing.push({ from: pos, to: pos + node.nodeSize, instr: top.code.trim() });
4803
+ if (node.isText && top?.inResult) {
4804
+ const end = pos + node.nodeSize;
4805
+ if (!fieldMark.isInSet(node.marks))
4806
+ transaction.addMark(pos, end, fieldMark.create({ instr: top.code.trim(), simple: false }));
4807
+ const type = state.schema.marks.runProperties;
4808
+ const current = type?.isInSet(node.marks);
4809
+ const props = current?.attrs.props ?? {};
4810
+ if (type && props.fieldFlags?.locked !== top.locked) {
4811
+ const next = { ...props };
4812
+ const flags = { ...props.fieldFlags };
4813
+ if (top.locked === void 0) delete flags.locked;
4814
+ else flags.locked = top.locked;
4815
+ if (Object.keys(flags).length) next.fieldFlags = flags;
4816
+ else delete next.fieldFlags;
4817
+ if (current) transaction.removeMark(pos, end, current);
4818
+ if (Object.keys(next).length)
4819
+ transaction.addMark(pos, end, type.create({ ...current?.attrs, props: next }));
4820
+ }
4821
+ }
4744
4822
  return true;
4745
4823
  });
4746
- if (!missing.length) return null;
4747
- const transaction = state.tr;
4748
- for (const { from, to, instr } of missing)
4749
- transaction.addMark(from, to, fieldMark.create({ instr, simple: false }));
4750
- return transaction;
4824
+ return transaction.docChanged ? transaction.setMeta(FIELD_RESULT_REPAIR_META, true) : null;
4751
4825
  }
4752
4826
  var isMarker = (node) => node?.type.name === "fieldMarker";
4753
4827
  function trimSelection(state) {
@@ -6511,6 +6585,98 @@ function trackSimpleFieldDeletion(transform, from, to, slice, author, date, next
6511
6585
  );
6512
6586
  return { deletionIds, deletedText, insertedText: "" };
6513
6587
  }
6588
+ function sourceProperties(value) {
6589
+ if (typeof value !== "string" || !value) return value;
6590
+ try {
6591
+ const properties3 = parsePropertiesSnapshot(value, "pPr");
6592
+ const run = first2(properties3, "rPr");
6593
+ if (run) {
6594
+ for (const name of ["ins", "del"])
6595
+ for (const revision of children2(run, name)) run.removeChild(revision);
6596
+ if (!run.childNodes.length && !run.attributes.length) properties3.removeChild(run);
6597
+ }
6598
+ return propertiesSignature(properties3);
6599
+ } catch {
6600
+ return value;
6601
+ }
6602
+ }
6603
+ function safeParagraph(node, allowInsertion = false) {
6604
+ if (node.type.name !== "paragraph" || !node.type.spec.attrs?.markRevision) return false;
6605
+ if (node.attrs.markRevision && !allowInsertion) return false;
6606
+ let fields = false;
6607
+ node.descendants((child) => {
6608
+ if (child.type.name === "fieldMarker" || child.marks.some((mark) => mark.type.name === "field"))
6609
+ fields = true;
6610
+ });
6611
+ return !fields;
6612
+ }
6613
+ function endsSection(state, node) {
6614
+ if (typeof state.doc.attrs.sections !== "string") return false;
6615
+ try {
6616
+ const sections = JSON.parse(state.doc.attrs.sections);
6617
+ return sections.some(
6618
+ (section, index) => section.endsAtBlockId === node.attrs.id && (index < sections.length - 1 || state.doc.lastChild !== node)
6619
+ );
6620
+ } catch {
6621
+ return true;
6622
+ }
6623
+ }
6624
+ function sameProperties(first3, second) {
6625
+ return Object.keys({ ...first3.attrs, ...second.attrs }).every(
6626
+ (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]))
6627
+ );
6628
+ }
6629
+ function trackParagraphBoundary(steps, oldState, newState, author, date, nextId) {
6630
+ if (steps.length !== 1 || !(steps[0] instanceof prosemirrorTransform.ReplaceStep) || steps[0].toJSON().structure !== true)
6631
+ return null;
6632
+ const step = steps[0];
6633
+ const $from = oldState.doc.resolve(step.from);
6634
+ const $to = oldState.doc.resolve(step.to);
6635
+ if ($from.depth !== 1 || $to.depth !== 1) return null;
6636
+ const first3 = $from.parent;
6637
+ const pos = $from.before();
6638
+ if (endsSection(oldState, first3)) return null;
6639
+ const revision = () => ({ author, date, dateUtc: date, id: nextId("revision") });
6640
+ if (step.from === step.to) {
6641
+ 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)
6642
+ return null;
6643
+ const left = newState.doc.nodeAt(pos);
6644
+ if (!left) return null;
6645
+ const rightPos = pos + left.nodeSize;
6646
+ const right = newState.doc.nodeAt(rightPos);
6647
+ if (!right || !safeParagraph(left) || !safeParagraph(right) || !sameProperties(first3, left) || !sameProperties(first3, right) || !left.content.append(right.content).eq(first3.content))
6648
+ return null;
6649
+ const used = /* @__PURE__ */ new Set();
6650
+ newState.doc.descendants((node) => {
6651
+ if (node.attrs.id) used.add(String(node.attrs.id));
6652
+ });
6653
+ let id;
6654
+ do
6655
+ id = nextId("paragraph");
6656
+ while (used.has(id));
6657
+ return newState.tr.setNodeMarkup(pos, void 0, {
6658
+ ...left.attrs,
6659
+ id,
6660
+ markRevision: { ...revision(), kind: "insert" }
6661
+ }).setNodeMarkup(rightPos, void 0, { ...first3.attrs });
6662
+ }
6663
+ if (step.to !== step.from + 2 || step.slice.size || step.from !== $from.end() || step.to !== $to.start())
6664
+ return null;
6665
+ const second = $to.parent;
6666
+ if (!safeParagraph(first3, true) || !safeParagraph(second) || !sameProperties(first3, second))
6667
+ return null;
6668
+ const pending = first3.attrs.markRevision;
6669
+ if (pending) {
6670
+ if (pending.kind !== "insert" || pending.author !== author) return null;
6671
+ const merged = newState.doc.nodeAt(pos);
6672
+ if (!merged || !merged.content.eq(first3.content.append(second.content))) return null;
6673
+ return newState.tr.setNodeMarkup(pos, void 0, { ...second.attrs });
6674
+ }
6675
+ return newState.tr.step(step.invert(oldState.doc)).setNodeMarkup(pos, void 0, {
6676
+ ...first3.attrs,
6677
+ markRevision: { ...revision(), kind: "delete" }
6678
+ });
6679
+ }
6514
6680
 
6515
6681
  // docx/ui/track-changes-mode.ts
6516
6682
  var trackChangesPluginKey = new prosemirrorState.PluginKey("dve-track-changes");
@@ -6652,11 +6818,15 @@ function trackChangesPlugin(getAuthor, isEnabled, idGenerator = createCollaborat
6652
6818
  (tr) => prosemirrorHistory.isHistoryTransaction(tr) || tr.getMeta(trackChangesPluginKey) || tr.getMeta(REMOTE_TRANSACTION_META)
6653
6819
  ))
6654
6820
  return null;
6655
- const relevant = transactions.filter((tr) => tr.docChanged);
6821
+ const relevant = transactions.filter(
6822
+ (tr) => tr.docChanged && !tr.getMeta(FIELD_RESULT_REPAIR_META)
6823
+ );
6656
6824
  if (!relevant.length) return null;
6657
6825
  const steps = relevant.flatMap((tr) => tr.steps);
6658
6826
  const author = getAuthor() || "Author";
6659
6827
  const date = new Date(Date.now()).toISOString();
6828
+ const boundary = trackParagraphBoundary(steps, oldState, newState, author, date, idGenerator);
6829
+ if (boundary) return boundary.setMeta(trackChangesPluginKey, { tracked: true });
6660
6830
  if (!steps.length || !steps.every((step) => step instanceof prosemirrorTransform.ReplaceStep)) {
6661
6831
  if (newState.doc.attrs.trackFormatting === false) return null;
6662
6832
  const formatting = trackRunFormatting(
@@ -6694,7 +6864,7 @@ function trackChangesPlugin(getAuthor, isEnabled, idGenerator = createCollaborat
6694
6864
  });
6695
6865
  if (!transform.docChanged) return null;
6696
6866
  const result = newState.tr;
6697
- const applied = relevant.flatMap(
6867
+ const applied = transactions.filter((tr) => tr.docChanged).flatMap(
6698
6868
  (tr) => tr.steps.map((step, index) => ({
6699
6869
  step,
6700
6870
  doc: expectDefined(tr.docs[index], "document before step")
@@ -6872,8 +7042,9 @@ function resolveRanges(view, ranges, mode) {
6872
7042
  continue;
6873
7043
  }
6874
7044
  const removeText = mode === "accept" === (range.kind === "delete");
6875
- if (removeText) tr = tr.delete(from, to);
6876
- else {
7045
+ if (removeText) {
7046
+ if (!emptySimpleFieldResult(tr, from, to)) tr.delete(from, to);
7047
+ } else {
6877
7048
  clearInlineTextRevisions(tr, from, to);
6878
7049
  tr = tr.removeMark(
6879
7050
  from,
@@ -7900,6 +8071,7 @@ exports.CollaborationAuthority = CollaborationAuthority;
7900
8071
  exports.CollaborationClient = CollaborationClient;
7901
8072
  exports.DirtyState = DirtyState;
7902
8073
  exports.EDITOR_THEME_MODES = EDITOR_THEME_MODES;
8074
+ exports.FIELD_RESULT_REPAIR_META = FIELD_RESULT_REPAIR_META;
7903
8075
  exports.HEADER_FOOTER_INPUT = HEADER_FOOTER_INPUT;
7904
8076
  exports.NotePartsStep = NotePartsStep;
7905
8077
  exports.PAGE_GAP = PAGE_GAP;