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
@@ -1454,265 +1454,641 @@ function resolveRunFormatting(run, context = {}) {
1454
1454
  return result;
1455
1455
  }
1456
1456
 
1457
- // docx/theme.ts
1458
- var DRAWING_NS = "http://schemas.openxmlformats.org/drawingml/2006/main";
1459
- var SCHEME_ORDER = [
1460
- "dk1",
1461
- "lt1",
1462
- "dk2",
1463
- "lt2",
1464
- "accent1",
1465
- "accent2",
1466
- "accent3",
1467
- "accent4",
1468
- "accent5",
1469
- "accent6",
1470
- "hlink",
1471
- "folHlink"
1472
- ];
1473
- function drawingChild(parent, local) {
1474
- if (!parent) return void 0;
1475
- for (const node of Array.from(parent.childNodes)) {
1476
- const element = node;
1477
- if (element.nodeType === 1 && element.localName === local && element.namespaceURI === DRAWING_NS)
1478
- return element;
1479
- }
1480
- return void 0;
1481
- }
1482
- function colorOf(slot2) {
1483
- const srgb = drawingChild(slot2, "srgbClr");
1484
- if (srgb) return srgb.getAttribute("val")?.toUpperCase() || void 0;
1485
- const sys = drawingChild(slot2, "sysClr");
1486
- if (sys) return sys.getAttribute("lastClr")?.toUpperCase() || void 0;
1487
- return void 0;
1457
+ // color/color-primitives.ts
1458
+ function clampUnitInterval(value) {
1459
+ return Math.min(1, Math.max(0, value));
1488
1460
  }
1489
- function fontSetOf(element) {
1490
- if (!element) return {};
1491
- const latin = drawingChild(element, "latin")?.getAttribute("typeface") || void 0;
1492
- const ea = drawingChild(element, "ea")?.getAttribute("typeface") || void 0;
1493
- const cs = drawingChild(element, "cs")?.getAttribute("typeface") || void 0;
1461
+ function hexToRgbChannels(color) {
1462
+ const normalized = color.replace("#", "");
1463
+ if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {
1464
+ return null;
1465
+ }
1494
1466
  return {
1495
- ...latin ? { latin } : {},
1496
- ...ea ? { eastAsia: ea } : {},
1497
- ...cs ? { complexScript: cs } : {}
1467
+ r: Number.parseInt(normalized.slice(0, 2), 16),
1468
+ g: Number.parseInt(normalized.slice(2, 4), 16),
1469
+ b: Number.parseInt(normalized.slice(4, 6), 16)
1498
1470
  };
1499
1471
  }
1500
- function parseTheme(xml) {
1501
- const document = parseXml2(xml);
1502
- const root = document.documentElement;
1503
- const clrScheme = Array.from(root.getElementsByTagNameNS(DRAWING_NS, "clrScheme"))[0];
1504
- const colors = {};
1505
- for (const slotName of SCHEME_ORDER) {
1506
- const slot2 = drawingChild(clrScheme, slotName);
1507
- const value = colorOf(slot2);
1508
- if (value) colors[slotName] = value;
1509
- }
1510
- const fontScheme = Array.from(root.getElementsByTagNameNS(DRAWING_NS, "fontScheme"))[0];
1511
- const major = drawingChild(fontScheme, "majorFont");
1512
- const minor = drawingChild(fontScheme, "minorFont");
1513
- return { colors, colorMapping: {}, fonts: { major: fontSetOf(major), minor: fontSetOf(minor) } };
1472
+ function percentDivisorFor(text) {
1473
+ return text.endsWith("%") ? 100 : 1e5;
1514
1474
  }
1515
- var MAPPING_KEYS = ["bg1", "tx1", "bg2", "tx2"];
1516
- var TOKEN_TO_SLOT = {
1517
- dark1: "dk1",
1518
- light1: "lt1",
1519
- dark2: "dk2",
1520
- light2: "lt2",
1521
- accent1: "accent1",
1522
- accent2: "accent2",
1523
- accent3: "accent3",
1524
- accent4: "accent4",
1525
- accent5: "accent5",
1526
- accent6: "accent6",
1527
- hyperlink: "hlink",
1528
- followedHyperlink: "folHlink"
1529
- };
1530
- function parseColorSchemeMapping(xml) {
1531
- const document = parseXml2(xml);
1532
- const mapping = Array.from(document.getElementsByTagNameNS(WORD_NS, "clrSchemeMapping"))[0];
1533
- const result = {};
1534
- if (!mapping) return result;
1535
- for (const key of MAPPING_KEYS) {
1536
- const value = enumValue(
1537
- isStWmlColorSchemeIndex,
1538
- getW(mapping, key),
1539
- `w:clrSchemeMapping/@w:${key}`
1540
- );
1541
- if (value) result[key] = TOKEN_TO_SLOT[value];
1475
+ function parseOoxmlPercent(value) {
1476
+ const text = String(value ?? "").trim();
1477
+ const divisor = percentDivisorFor(text);
1478
+ const magnitude = Number.parseFloat(divisor === 100 ? text.slice(0, -1) : text);
1479
+ if (!Number.isFinite(magnitude)) {
1480
+ return void 0;
1542
1481
  }
1543
- return result;
1482
+ return magnitude / divisor;
1544
1483
  }
1545
-
1546
- // docx/theme-color.ts
1547
- function isThemeColorToken(value) {
1548
- return isStThemeColor(value);
1484
+ function parseDrawingPercent(value) {
1485
+ const parsed = parseOoxmlPercent(value);
1486
+ return parsed === void 0 ? void 0 : clampUnitInterval(parsed);
1549
1487
  }
1550
- var TOKEN_TO_SLOT2 = {
1551
- dark1: "dk1",
1552
- light1: "lt1",
1553
- dark2: "dk2",
1554
- light2: "lt2",
1555
- accent1: "accent1",
1556
- accent2: "accent2",
1557
- accent3: "accent3",
1558
- accent4: "accent4",
1559
- accent5: "accent5",
1560
- accent6: "accent6",
1561
- hyperlink: "hlink",
1562
- followedHyperlink: "folHlink"
1563
- };
1564
- var DEFAULT_MAPPING = {
1565
- bg1: "lt1",
1566
- tx1: "dk1",
1567
- bg2: "lt2",
1568
- tx2: "dk2"
1569
- };
1570
- function resolveThemeColorToken(token, theme) {
1571
- const logical = {
1572
- background1: "bg1",
1573
- text1: "tx1",
1574
- background2: "bg2",
1575
- text2: "tx2"
1576
- };
1577
- const logicalKey = logical[token];
1578
- if (logicalKey) {
1579
- const slot3 = theme.colorMapping[logicalKey] ?? DEFAULT_MAPPING[logicalKey];
1580
- return theme.colors[slot3];
1488
+ function scrgbLinearToSrgb8(linear) {
1489
+ const l = Math.min(1, Math.max(0, linear));
1490
+ const companded = l <= 31308e-7 ? 12.92 * l : 1.055 * l ** (1 / 2.4) - 0.055;
1491
+ return Math.min(255, Math.max(0, Math.round(companded * 255)));
1492
+ }
1493
+ function toHex(value) {
1494
+ return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
1495
+ }
1496
+ function rgbToHsl(r, g, b) {
1497
+ const rN = r / 255;
1498
+ const gN = g / 255;
1499
+ const bN = b / 255;
1500
+ const cMax = Math.max(rN, gN, bN);
1501
+ const cMin = Math.min(rN, gN, bN);
1502
+ const delta = cMax - cMin;
1503
+ const l = (cMax + cMin) / 2;
1504
+ let s = 0;
1505
+ if (delta !== 0) {
1506
+ s = delta / (1 - Math.abs(2 * l - 1));
1581
1507
  }
1582
- const slot2 = TOKEN_TO_SLOT2[token];
1583
- return slot2 ? theme.colors[slot2] : void 0;
1508
+ let h = 0;
1509
+ if (delta !== 0) {
1510
+ if (cMax === rN) {
1511
+ h = 60 * ((gN - bN) / delta % 6);
1512
+ } else if (cMax === gN) {
1513
+ h = 60 * ((bN - rN) / delta + 2);
1514
+ } else {
1515
+ h = 60 * ((rN - gN) / delta + 4);
1516
+ }
1517
+ }
1518
+ if (h < 0) {
1519
+ h += 360;
1520
+ }
1521
+ return { h, s: clampUnitInterval(s), l: clampUnitInterval(l) };
1584
1522
  }
1585
- function hexToRgb(hex) {
1586
- const normalized = hex.replace(/^#/, "");
1587
- if (!/^[0-9a-fA-F]{6}$/.test(normalized)) return null;
1523
+ function hslToRgb(h, s, l, roundChannel = Math.round, options) {
1524
+ const sC = clampUnitInterval(s);
1525
+ const lC = clampUnitInterval(l);
1526
+ const hN = (h % 360 + 360) % 360;
1527
+ const c = (1 - Math.abs(2 * lC - 1)) * sC;
1528
+ const x = c * (1 - Math.abs(hN / 60 % 2 - 1));
1529
+ const m = lC - c / 2;
1530
+ let rP = 0;
1531
+ let gP = 0;
1532
+ let bP = 0;
1533
+ if (hN < 60) {
1534
+ rP = c;
1535
+ gP = x;
1536
+ bP = 0;
1537
+ } else if (hN < 120) {
1538
+ rP = x;
1539
+ gP = c;
1540
+ bP = 0;
1541
+ } else if (hN < 180) {
1542
+ rP = 0;
1543
+ gP = c;
1544
+ bP = x;
1545
+ } else if (hN < 240) {
1546
+ rP = 0;
1547
+ gP = x;
1548
+ bP = c;
1549
+ } else if (hN < 300) {
1550
+ rP = x;
1551
+ gP = 0;
1552
+ bP = c;
1553
+ } else {
1554
+ rP = c;
1555
+ gP = 0;
1556
+ bP = x;
1557
+ }
1588
1558
  return {
1589
- r: Number.parseInt(normalized.slice(0, 2), 16),
1590
- g: Number.parseInt(normalized.slice(2, 4), 16),
1591
- b: Number.parseInt(normalized.slice(4, 6), 16)
1559
+ r: roundChannel((rP + m) * 255),
1560
+ g: roundChannel((gP + m) * 255),
1561
+ b: roundChannel((bP + m) * 255)
1592
1562
  };
1593
1563
  }
1594
- function toHex(value) {
1595
- return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
1564
+ function parseDrawingFraction(value) {
1565
+ return parseOoxmlPercent(value);
1596
1566
  }
1597
- function srgbToLinear(channel) {
1598
- const c = Math.min(1, Math.max(0, channel / 255));
1567
+ function parseDrawingHueDegrees(value) {
1568
+ const parsed = Number.parseFloat(String(value ?? "").trim());
1569
+ if (!Number.isFinite(parsed)) {
1570
+ return void 0;
1571
+ }
1572
+ return parsed / 6e4;
1573
+ }
1574
+
1575
+ // color/color-linear.ts
1576
+ function srgb255ToLinear(channel) {
1577
+ const c = clampUnitInterval(channel / 255);
1599
1578
  return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
1600
1579
  }
1601
- function linearToSrgb(linear) {
1602
- const c = Math.min(1, Math.max(0, linear));
1580
+ function linearToSrgb255(linear) {
1581
+ const c = clampUnitInterval(linear);
1603
1582
  return 255 * (c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055);
1604
1583
  }
1605
- function applyThemeShade(hex, fraction) {
1606
- const rgb = hexToRgb(hex);
1607
- if (!rgb) return hex;
1608
- const mix = (channel) => linearToSrgb(srgbToLinear(channel) * fraction);
1609
- return `#${toHex(mix(rgb.r))}${toHex(mix(rgb.g))}${toHex(mix(rgb.b))}`;
1584
+
1585
+ // drawingml/dom.ts
1586
+ function attributeReader(element) {
1587
+ return (name) => {
1588
+ if (!element) return void 0;
1589
+ const direct = element.getAttribute(name);
1590
+ if (direct !== null) return direct;
1591
+ const attributes = element.attributes;
1592
+ for (let index = 0; index < attributes.length; index++) {
1593
+ const candidate = attributes.item(index);
1594
+ if (candidate && candidate.localName === name) return candidate.value;
1595
+ }
1596
+ return void 0;
1597
+ };
1610
1598
  }
1611
- function applyThemeTint(hex, fraction) {
1612
- const rgb = hexToRgb(hex);
1613
- if (!rgb) return hex;
1614
- const mix = (channel) => linearToSrgb(1 - (1 - srgbToLinear(channel)) * fraction);
1615
- return `#${toHex(mix(rgb.r))}${toHex(mix(rgb.g))}${toHex(mix(rgb.b))}`;
1599
+ function stringAttribute(element, name) {
1600
+ const value = attributeReader(element)(name)?.trim();
1601
+ return value ? value : void 0;
1616
1602
  }
1617
- function fractionToThemeByte(fraction) {
1618
- return toHex(Math.round(Math.min(1, Math.max(0, fraction)) * 255));
1603
+ function integerAttribute(element, name) {
1604
+ const parsed = Number.parseInt(attributeReader(element)(name) ?? "", 10);
1605
+ return Number.isFinite(parsed) ? parsed : void 0;
1619
1606
  }
1620
- function resolveThemeColorReference(ref, theme) {
1621
- const base = resolveThemeColorToken(ref.token, theme);
1622
- if (!base) return void 0;
1623
- let hex = `#${base.replace(/^#/, "")}`;
1624
- if (ref.shade !== void 0) hex = applyThemeShade(hex, ref.shade);
1625
- if (ref.tint !== void 0) hex = applyThemeTint(hex, ref.tint);
1626
- return hex;
1607
+ function booleanAttribute(element, name) {
1608
+ const value = attributeReader(element)(name)?.trim().toLowerCase();
1609
+ if (value === "1" || value === "true") return true;
1610
+ if (value === "0" || value === "false") return false;
1611
+ return void 0;
1612
+ }
1613
+ function descendants(root, local) {
1614
+ const result = [];
1615
+ const visit = (node) => {
1616
+ for (const child3 of Array.from(node.childNodes)) {
1617
+ if (!isElement(child3)) continue;
1618
+ if (child3.localName === local) result.push(child3);
1619
+ visit(child3);
1620
+ }
1621
+ };
1622
+ visit(root);
1623
+ return result;
1627
1624
  }
1628
1625
 
1629
- // opc/relationship-types.ts
1630
- var BASE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
1631
- var RELATIONSHIP_TYPES = {
1632
- image: `${BASE}/image`,
1633
- hyperlink: `${BASE}/hyperlink`,
1634
- diagramData: `${BASE}/diagramData`,
1635
- diagramLayout: `${BASE}/diagramLayout`,
1636
- diagramQuickStyle: `${BASE}/diagramQuickStyle`,
1637
- diagramColors: `${BASE}/diagramColors`,
1638
- diagramDrawing: "http://schemas.microsoft.com/office/2007/relationships/diagramDrawing"};
1639
-
1640
- // opc/relationships.ts
1641
- function parseRelationships(xml) {
1642
- const map = /* @__PURE__ */ new Map();
1643
- if (!xml) return map;
1644
- const root = parseXml(xml).documentElement;
1645
- for (const node of elements(root)) {
1646
- if (node.localName !== "Relationship") continue;
1647
- const id = node.getAttribute("Id");
1648
- const target = node.getAttribute("Target");
1649
- if (!id || target == null) continue;
1650
- map.set(id, {
1651
- id,
1652
- type: node.getAttribute("Type") ?? "",
1653
- target,
1654
- mode: node.getAttribute("TargetMode") === "External" ? "External" : "Internal"
1655
- });
1626
+ // drawingml/drawing-color.ts
1627
+ var COLOR_ELEMENTS = {
1628
+ srgbClr: "srgb",
1629
+ schemeClr: "scheme",
1630
+ sysClr: "system",
1631
+ prstClr: "preset",
1632
+ scrgbClr: "scrgb",
1633
+ hslClr: "hsl"
1634
+ };
1635
+ function colorValue(kind, element) {
1636
+ const attribute = (name) => element.getAttribute(name) ?? "";
1637
+ if (kind === "scrgb") return `${attribute("r")},${attribute("g")},${attribute("b")}`;
1638
+ if (kind === "hsl") return `${attribute("hue")},${attribute("sat")},${attribute("lum")}`;
1639
+ return attribute("val");
1640
+ }
1641
+ function parseDrawingColorIn(container) {
1642
+ if (!container) return void 0;
1643
+ for (const element of elements(container)) {
1644
+ const kind = COLOR_ELEMENTS[element.localName];
1645
+ if (!kind || element.namespaceURI && element.namespaceURI !== NS.a) continue;
1646
+ return parseDrawingColor(element);
1656
1647
  }
1657
- return map;
1648
+ return void 0;
1658
1649
  }
1659
- var escapeAttr = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
1660
- function buildRelationshipsXml(relationships) {
1661
- const items = Array.from(relationships).map(([id, rel]) => {
1662
- const mode = rel.mode === "External" ? ' TargetMode="External"' : "";
1663
- return `<Relationship Id="${escapeAttr(id)}" Type="${escapeAttr(rel.type)}" Target="${escapeAttr(rel.target)}"${mode}/>`;
1664
- }).join("");
1665
- return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="${NS.rels}">${items}</Relationships>`;
1650
+ function parseDrawingColor(element) {
1651
+ const kind = COLOR_ELEMENTS[element.localName];
1652
+ if (!kind) return void 0;
1653
+ const color = {
1654
+ kind,
1655
+ value: colorValue(kind, element),
1656
+ transforms: elements(element).map((child3) => ({
1657
+ name: child3.localName,
1658
+ value: child3.getAttribute("val") ?? ""
1659
+ }))
1660
+ };
1661
+ const fallback = kind === "system" ? element.getAttribute("lastClr") : null;
1662
+ if (fallback) color.fallback = fallback;
1663
+ return color;
1666
1664
  }
1667
- function resolvePartPath(basePart, target) {
1668
- if (target.startsWith("/")) return target.slice(1);
1669
- const baseDir = basePart.slice(0, basePart.lastIndexOf("/") + 1);
1670
- const resolved = [];
1671
- for (const segment of `${baseDir}${target}`.split("/")) {
1672
- if (segment === "." || segment === "") continue;
1673
- if (segment === "..") resolved.pop();
1674
- else resolved.push(segment);
1665
+ function parseDrawingColorList(container) {
1666
+ if (!container) return [];
1667
+ return elements(container).flatMap((element) => {
1668
+ const color = parseDrawingColor(element);
1669
+ return color ? [color] : [];
1670
+ });
1671
+ }
1672
+ var PRESET_COLORS = {
1673
+ black: "#000000",
1674
+ white: "#FFFFFF",
1675
+ red: "#FF0000",
1676
+ green: "#008000",
1677
+ blue: "#0000FF",
1678
+ yellow: "#FFFF00",
1679
+ gray: "#808080",
1680
+ grey: "#808080"
1681
+ };
1682
+ function baseHex(color, theme) {
1683
+ switch (color.kind) {
1684
+ case "srgb":
1685
+ return /^[0-9a-f]{6}$/i.test(color.value) ? `#${color.value.toUpperCase()}` : void 0;
1686
+ case "scheme":
1687
+ return theme?.scheme(color.value);
1688
+ case "system":
1689
+ return color.fallback && /^[0-9a-f]{6}$/i.test(color.fallback) ? `#${color.fallback.toUpperCase()}` : void 0;
1690
+ case "preset":
1691
+ return PRESET_COLORS[color.value];
1692
+ case "scrgb": {
1693
+ const [r, g, b] = color.value.split(",").map((part) => parseDrawingFraction(part));
1694
+ if (r === void 0 || g === void 0 || b === void 0) return void 0;
1695
+ return `#${toHex(scrgbLinearToSrgb8(r))}${toHex(scrgbLinearToSrgb8(g))}${toHex(scrgbLinearToSrgb8(b))}`;
1696
+ }
1697
+ case "hsl": {
1698
+ const [h, s, l] = color.value.split(",");
1699
+ const hue = parseDrawingHueDegrees(h);
1700
+ const sat = parseDrawingFraction(s);
1701
+ const lum = parseDrawingFraction(l);
1702
+ if (hue === void 0 || sat === void 0 || lum === void 0) return void 0;
1703
+ const { r, g, b } = hslToRgb(hue, sat, lum);
1704
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
1705
+ }
1675
1706
  }
1676
- return resolved.join("/");
1677
1707
  }
1678
- function nextRelationshipId(used) {
1679
- let index = 1;
1680
- while (used.has(`rId${index}`)) index++;
1681
- return `rId${index}`;
1708
+ var APPLIED = /* @__PURE__ */ new Set([
1709
+ "alpha",
1710
+ "alphaMod",
1711
+ "alphaOff",
1712
+ "comp",
1713
+ "inv",
1714
+ "gray",
1715
+ "shade",
1716
+ "tint",
1717
+ "hue",
1718
+ "hueMod",
1719
+ "hueOff",
1720
+ "sat",
1721
+ "satMod",
1722
+ "satOff",
1723
+ "lum",
1724
+ "lumMod",
1725
+ "lumOff"
1726
+ ]);
1727
+ function resolveDrawingColor(color, theme, options) {
1728
+ const base = baseHex(color, theme);
1729
+ const rgb = base ? hexToRgbChannels(base) : null;
1730
+ if (!rgb) return void 0;
1731
+ let { r, g, b } = rgb;
1732
+ const find = (name) => color.transforms.find((entry) => entry.name === name)?.value;
1733
+ const has = (name) => color.transforms.some((entry) => entry.name === name);
1734
+ if (has("comp")) {
1735
+ const hsl = rgbToHsl(r, g, b);
1736
+ ({ r, g, b } = hslToRgb((hsl.h + 180) % 360, hsl.s, hsl.l));
1737
+ }
1738
+ if (has("inv")) [r, g, b] = [255 - r, 255 - g, 255 - b];
1739
+ if (has("gray")) r = g = b = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
1740
+ const shade = parseDrawingPercent(find("shade"));
1741
+ if (shade !== void 0) {
1742
+ r = linearToSrgb255(srgb255ToLinear(r) * shade);
1743
+ g = linearToSrgb255(srgb255ToLinear(g) * shade);
1744
+ b = linearToSrgb255(srgb255ToLinear(b) * shade);
1745
+ }
1746
+ const tint = parseDrawingPercent(find("tint"));
1747
+ if (tint !== void 0) {
1748
+ r = linearToSrgb255(1 - (1 - srgb255ToLinear(r)) * tint);
1749
+ g = linearToSrgb255(1 - (1 - srgb255ToLinear(g)) * tint);
1750
+ b = linearToSrgb255(1 - (1 - srgb255ToLinear(b)) * tint);
1751
+ }
1752
+ if (["hue", "hueMod", "hueOff", "sat", "satMod", "satOff", "lum", "lumMod", "lumOff"].some(has)) {
1753
+ const hsl = rgbToHsl(r, g, b);
1754
+ const wrap = (degrees) => (degrees % 360 + 360) % 360;
1755
+ const hueAbs = parseDrawingHueDegrees(find("hue"));
1756
+ if (hueAbs !== void 0) hsl.h = wrap(hueAbs);
1757
+ const hueMod = parseDrawingFraction(find("hueMod"));
1758
+ if (hueMod !== void 0) hsl.h = wrap(hsl.h * hueMod);
1759
+ const hueOff = parseDrawingHueDegrees(find("hueOff"));
1760
+ if (hueOff !== void 0) hsl.h = wrap(hsl.h + hueOff);
1761
+ const satAbs = parseDrawingFraction(find("sat"));
1762
+ if (satAbs !== void 0) hsl.s = clampUnitInterval(satAbs);
1763
+ const satMod = parseDrawingFraction(find("satMod"));
1764
+ if (satMod !== void 0) hsl.s = clampUnitInterval(hsl.s * satMod);
1765
+ const satOff = parseDrawingFraction(find("satOff"));
1766
+ if (satOff !== void 0) hsl.s = clampUnitInterval(hsl.s + satOff);
1767
+ const lumAbs = parseDrawingFraction(find("lum"));
1768
+ if (lumAbs !== void 0) hsl.l = clampUnitInterval(lumAbs);
1769
+ const lumMod = parseDrawingFraction(find("lumMod"));
1770
+ if (lumMod !== void 0) hsl.l = clampUnitInterval(hsl.l * lumMod);
1771
+ const lumOff = parseDrawingFraction(find("lumOff"));
1772
+ if (lumOff !== void 0) hsl.l = clampUnitInterval(hsl.l + lumOff);
1773
+ const round = Math.round;
1774
+ ({ r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l, round));
1775
+ }
1776
+ let alpha = parseDrawingPercent(find("alpha")) ?? 1;
1777
+ const alphaMod = parseDrawingFraction(find("alphaMod"));
1778
+ if (alphaMod !== void 0) alpha = clampUnitInterval(alpha * alphaMod);
1779
+ const alphaOff = parseDrawingFraction(find("alphaOff"));
1780
+ if (alphaOff !== void 0) alpha = clampUnitInterval(alpha + alphaOff);
1781
+ return {
1782
+ hex: `#${toHex(r)}${toHex(g)}${toHex(b)}`,
1783
+ alpha,
1784
+ unapplied: [...new Set(color.transforms.map((entry) => entry.name))].filter(
1785
+ (name) => !APPLIED.has(name)
1786
+ )
1787
+ };
1682
1788
  }
1683
- var getRelationshipId = (element) => relAttr(element, "id") || void 0;
1684
1789
 
1685
- // opc/content-types.ts
1686
- var escapeAttr2 = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
1687
- function parseContentTypes(xml) {
1688
- const defaults = /* @__PURE__ */ new Map();
1689
- const overrides = /* @__PURE__ */ new Map();
1690
- if (!xml) return { defaults, overrides };
1691
- for (const node of elements(parseXml(xml).documentElement)) {
1692
- const contentType = node.getAttribute("ContentType");
1693
- if (!contentType) continue;
1694
- if (node.localName === "Default") {
1695
- const extension = node.getAttribute("Extension");
1696
- if (extension) defaults.set(extension.toLowerCase(), contentType);
1697
- } else if (node.localName === "Override") {
1698
- const partName = node.getAttribute("PartName");
1699
- if (partName) overrides.set(partName, contentType);
1700
- }
1790
+ // drawingml/theme-model.ts
1791
+ var THEME_COLOR_SLOTS = [
1792
+ "dk1",
1793
+ "lt1",
1794
+ "dk2",
1795
+ "lt2",
1796
+ "accent1",
1797
+ "accent2",
1798
+ "accent3",
1799
+ "accent4",
1800
+ "accent5",
1801
+ "accent6",
1802
+ "hlink",
1803
+ "folHlink"
1804
+ ];
1805
+ var DEFAULT_THEME_COLOR_MAP = {
1806
+ bg1: "lt1",
1807
+ tx1: "dk1",
1808
+ bg2: "lt2",
1809
+ tx2: "dk2"
1810
+ };
1811
+
1812
+ // drawingml/theme.ts
1813
+ var SLOT_SET = new Set(THEME_COLOR_SLOTS);
1814
+ function isThemeColorSlot(value) {
1815
+ return SLOT_SET.has(value);
1816
+ }
1817
+ function nonEmpty(value) {
1818
+ return value ? value : void 0;
1819
+ }
1820
+ function parseThemeColorScheme(scheme) {
1821
+ const result = { colors: {} };
1822
+ if (!scheme) return result;
1823
+ const name = nonEmpty(scheme.getAttribute("name"));
1824
+ if (name) result.name = name;
1825
+ for (const slot2 of THEME_COLOR_SLOTS) {
1826
+ const color = parseDrawingColorIn(first(scheme, slot2, NS.a));
1827
+ if (color) result.colors[slot2] = color;
1701
1828
  }
1702
- return { defaults, overrides };
1829
+ return result;
1703
1830
  }
1704
- function contentTypeForPart(types, partName) {
1705
- const overridePath = partName.startsWith("/") ? partName : `/${partName}`;
1706
- const override = types.overrides.get(overridePath);
1707
- if (override) return override;
1708
- const extension = partName.split(".").pop()?.toLowerCase();
1709
- return extension ? types.defaults.get(extension) : void 0;
1831
+ function parseFontCollection(collection) {
1832
+ const result = { scripts: {} };
1833
+ if (!collection) return result;
1834
+ const typeface = (local) => nonEmpty(first(collection, local, NS.a)?.getAttribute("typeface"));
1835
+ const latin = typeface("latin");
1836
+ const eastAsia = typeface("ea");
1837
+ const complexScript = typeface("cs");
1838
+ if (latin) result.latin = latin;
1839
+ if (eastAsia) result.eastAsia = eastAsia;
1840
+ if (complexScript) result.complexScript = complexScript;
1841
+ for (const font of elements(collection)) {
1842
+ if (font.localName !== "font") continue;
1843
+ const script = nonEmpty(font.getAttribute("script"));
1844
+ const face = nonEmpty(font.getAttribute("typeface"));
1845
+ if (script && face && !Object.hasOwn(result.scripts, script)) result.scripts[script] = face;
1846
+ }
1847
+ return result;
1710
1848
  }
1711
- function buildContentTypesXml(types) {
1712
- const defaults = Array.from(types.defaults).map(
1713
- ([extension, type]) => `<Default Extension="${extension}" ContentType="${escapeAttr2(type)}"/>`
1714
- ).join("");
1715
- const overrides = Array.from(types.overrides).map(
1849
+ function parseThemeFontScheme(scheme) {
1850
+ const result = {
1851
+ major: parseFontCollection(first(scheme, "majorFont", NS.a)),
1852
+ minor: parseFontCollection(first(scheme, "minorFont", NS.a))
1853
+ };
1854
+ const name = nonEmpty(scheme?.getAttribute("name"));
1855
+ if (name) result.name = name;
1856
+ return result;
1857
+ }
1858
+ function rootOf(source) {
1859
+ return "documentElement" in source ? source.documentElement : source;
1860
+ }
1861
+ function parseTheme(source) {
1862
+ const root = rootOf(source);
1863
+ const holder = first(root, "themeElements", NS.a) ?? root;
1864
+ const theme = {
1865
+ colorScheme: parseThemeColorScheme(first(holder, "clrScheme", NS.a)),
1866
+ fontScheme: parseThemeFontScheme(first(holder, "fontScheme", NS.a))
1867
+ };
1868
+ const name = nonEmpty(root.getAttribute("name"));
1869
+ if (name) theme.name = name;
1870
+ return theme;
1871
+ }
1872
+
1873
+ // drawingml/theme-color.ts
1874
+ function isLogical(name) {
1875
+ return Object.hasOwn(DEFAULT_THEME_COLOR_MAP, name);
1876
+ }
1877
+ function themeColorSlotFor(name, colorMap = {}) {
1878
+ if (isLogical(name)) return colorMap[name] ?? DEFAULT_THEME_COLOR_MAP[name];
1879
+ if (!isThemeColorSlot(name)) return void 0;
1880
+ if (name === "dk1" || name === "lt1" || name === "dk2" || name === "lt2") return name;
1881
+ return colorMap[name] ?? name;
1882
+ }
1883
+ function themeSlotHex(color) {
1884
+ if (!color) return void 0;
1885
+ const value = color.kind === "srgb" ? color.value : color.kind === "system" ? color.fallback : void 0;
1886
+ return value ? value.toUpperCase() : void 0;
1887
+ }
1888
+
1889
+ // docx/theme.ts
1890
+ function fontSetOf(collection) {
1891
+ const { latin, eastAsia, complexScript } = collection;
1892
+ return {
1893
+ ...latin ? { latin } : {},
1894
+ ...eastAsia ? { eastAsia } : {},
1895
+ ...complexScript ? { complexScript } : {}
1896
+ };
1897
+ }
1898
+ function parseTheme2(xml) {
1899
+ const theme = parseTheme(parseXml2(xml));
1900
+ const colors = {};
1901
+ for (const slot2 of THEME_COLOR_SLOTS) {
1902
+ const value = themeSlotHex(theme.colorScheme.colors[slot2]);
1903
+ if (value) colors[slot2] = value;
1904
+ }
1905
+ const { major, minor } = theme.fontScheme;
1906
+ return { colors, colorMapping: {}, fonts: { major: fontSetOf(major), minor: fontSetOf(minor) } };
1907
+ }
1908
+ var MAPPING_KEYS = ["bg1", "tx1", "bg2", "tx2"];
1909
+ var TOKEN_TO_SLOT = {
1910
+ dark1: "dk1",
1911
+ light1: "lt1",
1912
+ dark2: "dk2",
1913
+ light2: "lt2",
1914
+ accent1: "accent1",
1915
+ accent2: "accent2",
1916
+ accent3: "accent3",
1917
+ accent4: "accent4",
1918
+ accent5: "accent5",
1919
+ accent6: "accent6",
1920
+ hyperlink: "hlink",
1921
+ followedHyperlink: "folHlink"
1922
+ };
1923
+ function parseColorSchemeMapping(xml) {
1924
+ const document = parseXml2(xml);
1925
+ const mapping = Array.from(document.getElementsByTagNameNS(WORD_NS, "clrSchemeMapping"))[0];
1926
+ const result = {};
1927
+ if (!mapping) return result;
1928
+ for (const key of MAPPING_KEYS) {
1929
+ const value = enumValue(
1930
+ isStWmlColorSchemeIndex,
1931
+ getW(mapping, key),
1932
+ `w:clrSchemeMapping/@w:${key}`
1933
+ );
1934
+ if (value) result[key] = TOKEN_TO_SLOT[value];
1935
+ }
1936
+ return result;
1937
+ }
1938
+
1939
+ // docx/theme-color.ts
1940
+ function isThemeColorToken(value) {
1941
+ return isStThemeColor(value);
1942
+ }
1943
+ var TOKEN_TO_SLOT2 = {
1944
+ dark1: "dk1",
1945
+ light1: "lt1",
1946
+ dark2: "dk2",
1947
+ light2: "lt2",
1948
+ accent1: "accent1",
1949
+ accent2: "accent2",
1950
+ accent3: "accent3",
1951
+ accent4: "accent4",
1952
+ accent5: "accent5",
1953
+ accent6: "accent6",
1954
+ hyperlink: "hlink",
1955
+ followedHyperlink: "folHlink"
1956
+ };
1957
+ function resolveThemeColorToken(token, theme) {
1958
+ const logical = {
1959
+ background1: "bg1",
1960
+ text1: "tx1",
1961
+ background2: "bg2",
1962
+ text2: "tx2"
1963
+ };
1964
+ const logicalKey = logical[token];
1965
+ if (logicalKey) {
1966
+ const slot3 = theme.colorMapping[logicalKey] ?? DEFAULT_THEME_COLOR_MAP[logicalKey];
1967
+ return theme.colors[slot3];
1968
+ }
1969
+ const slot2 = TOKEN_TO_SLOT2[token];
1970
+ return slot2 ? theme.colors[slot2] : void 0;
1971
+ }
1972
+ function hexToRgb(hex) {
1973
+ const normalized = hex.replace(/^#/, "");
1974
+ if (!/^[0-9a-fA-F]{6}$/.test(normalized)) return null;
1975
+ return {
1976
+ r: Number.parseInt(normalized.slice(0, 2), 16),
1977
+ g: Number.parseInt(normalized.slice(2, 4), 16),
1978
+ b: Number.parseInt(normalized.slice(4, 6), 16)
1979
+ };
1980
+ }
1981
+ function applyThemeShade(hex, fraction) {
1982
+ const rgb = hexToRgb(hex);
1983
+ if (!rgb) return hex;
1984
+ const mix = (channel) => linearToSrgb255(srgb255ToLinear(channel) * fraction);
1985
+ return `#${toHex(mix(rgb.r))}${toHex(mix(rgb.g))}${toHex(mix(rgb.b))}`;
1986
+ }
1987
+ function applyThemeTint(hex, fraction) {
1988
+ const rgb = hexToRgb(hex);
1989
+ if (!rgb) return hex;
1990
+ const mix = (channel) => linearToSrgb255(1 - (1 - srgb255ToLinear(channel)) * fraction);
1991
+ return `#${toHex(mix(rgb.r))}${toHex(mix(rgb.g))}${toHex(mix(rgb.b))}`;
1992
+ }
1993
+ function fractionToThemeByte(fraction) {
1994
+ return toHex(Math.round(Math.min(1, Math.max(0, fraction)) * 255));
1995
+ }
1996
+ function resolveThemeColorReference(ref, theme) {
1997
+ const base = resolveThemeColorToken(ref.token, theme);
1998
+ if (!base) return void 0;
1999
+ let hex = `#${base.replace(/^#/, "")}`;
2000
+ if (ref.shade !== void 0) hex = applyThemeShade(hex, ref.shade);
2001
+ if (ref.tint !== void 0) hex = applyThemeTint(hex, ref.tint);
2002
+ return hex;
2003
+ }
2004
+
2005
+ // opc/relationship-types.ts
2006
+ var BASE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
2007
+ var RELATIONSHIP_TYPES = {
2008
+ image: `${BASE}/image`,
2009
+ hyperlink: `${BASE}/hyperlink`,
2010
+ diagramData: `${BASE}/diagramData`,
2011
+ diagramLayout: `${BASE}/diagramLayout`,
2012
+ diagramQuickStyle: `${BASE}/diagramQuickStyle`,
2013
+ diagramColors: `${BASE}/diagramColors`,
2014
+ diagramDrawing: "http://schemas.microsoft.com/office/2007/relationships/diagramDrawing"};
2015
+
2016
+ // opc/relationships.ts
2017
+ function parseRelationships(xml) {
2018
+ const map = /* @__PURE__ */ new Map();
2019
+ if (!xml) return map;
2020
+ const root = parseXml(xml).documentElement;
2021
+ for (const node of elements(root)) {
2022
+ if (node.localName !== "Relationship") continue;
2023
+ const id = node.getAttribute("Id");
2024
+ const target = node.getAttribute("Target");
2025
+ if (!id || target == null) continue;
2026
+ map.set(id, {
2027
+ id,
2028
+ type: node.getAttribute("Type") ?? "",
2029
+ target,
2030
+ mode: node.getAttribute("TargetMode") === "External" ? "External" : "Internal"
2031
+ });
2032
+ }
2033
+ return map;
2034
+ }
2035
+ var escapeAttr = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
2036
+ function buildRelationshipsXml(relationships) {
2037
+ const items = Array.from(relationships).map(([id, rel]) => {
2038
+ const mode = rel.mode === "External" ? ' TargetMode="External"' : "";
2039
+ return `<Relationship Id="${escapeAttr(id)}" Type="${escapeAttr(rel.type)}" Target="${escapeAttr(rel.target)}"${mode}/>`;
2040
+ }).join("");
2041
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="${NS.rels}">${items}</Relationships>`;
2042
+ }
2043
+ function resolvePartPath(basePart, target) {
2044
+ if (target.startsWith("/")) return target.slice(1);
2045
+ const baseDir = basePart.slice(0, basePart.lastIndexOf("/") + 1);
2046
+ const resolved = [];
2047
+ for (const segment of `${baseDir}${target}`.split("/")) {
2048
+ if (segment === "." || segment === "") continue;
2049
+ if (segment === "..") resolved.pop();
2050
+ else resolved.push(segment);
2051
+ }
2052
+ return resolved.join("/");
2053
+ }
2054
+ function nextRelationshipId(used) {
2055
+ let index = 1;
2056
+ while (used.has(`rId${index}`)) index++;
2057
+ return `rId${index}`;
2058
+ }
2059
+ var getRelationshipId = (element) => relAttr(element, "id") || void 0;
2060
+
2061
+ // opc/content-types.ts
2062
+ var escapeAttr2 = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
2063
+ function parseContentTypes(xml) {
2064
+ const defaults = /* @__PURE__ */ new Map();
2065
+ const overrides = /* @__PURE__ */ new Map();
2066
+ if (!xml) return { defaults, overrides };
2067
+ for (const node of elements(parseXml(xml).documentElement)) {
2068
+ const contentType = node.getAttribute("ContentType");
2069
+ if (!contentType) continue;
2070
+ if (node.localName === "Default") {
2071
+ const extension = node.getAttribute("Extension");
2072
+ if (extension) defaults.set(extension.toLowerCase(), contentType);
2073
+ } else if (node.localName === "Override") {
2074
+ const partName = node.getAttribute("PartName");
2075
+ if (partName) overrides.set(partName, contentType);
2076
+ }
2077
+ }
2078
+ return { defaults, overrides };
2079
+ }
2080
+ function contentTypeForPart(types, partName) {
2081
+ const overridePath = partName.startsWith("/") ? partName : `/${partName}`;
2082
+ const override = types.overrides.get(overridePath);
2083
+ if (override) return override;
2084
+ const extension = partName.split(".").pop()?.toLowerCase();
2085
+ return extension ? types.defaults.get(extension) : void 0;
2086
+ }
2087
+ function buildContentTypesXml(types) {
2088
+ const defaults = Array.from(types.defaults).map(
2089
+ ([extension, type]) => `<Default Extension="${extension}" ContentType="${escapeAttr2(type)}"/>`
2090
+ ).join("");
2091
+ const overrides = Array.from(types.overrides).map(
1716
2092
  ([part, type]) => `<Override PartName="${escapeAttr2(part)}" ContentType="${escapeAttr2(type)}"/>`
1717
2093
  ).join("");
1718
2094
  return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Types xmlns="${NS.contentTypes}">${defaults}${overrides}</Types>`;
@@ -3665,7 +4041,7 @@ var NAMED = {
3665
4041
  var POINT_TO_PX = 96 / 72;
3666
4042
  var WATERMARK_PREFIX = "PowerPlusWaterMarkObject";
3667
4043
  var DEFAULT_WATERMARK_COLOR = "#c0c0c0";
3668
- function colorOf2(value) {
4044
+ function colorOf(value) {
3669
4045
  const text = (value ?? "").trim().toLowerCase().split(/\s/)[0] ?? "";
3670
4046
  if (NAMED[text]) return NAMED[text];
3671
4047
  const hex = /^#?([0-9a-f]{6})$/.exec(text);
@@ -3686,7 +4062,7 @@ function parseWatermarkShape(shape) {
3686
4062
  const rotation = /rotation:\s*(-?[\d.]+)/i.exec(style);
3687
4063
  const spec = {
3688
4064
  text: path.getAttribute("string") ?? "",
3689
- color: colorOf2(shape.getAttribute("fillcolor")),
4065
+ color: colorOf(shape.getAttribute("fillcolor")),
3690
4066
  semitransparent: opacity !== null && opacity !== "" && opacity !== "1",
3691
4067
  layout: rotation && Math.abs(Number(rotation[1]) % 360) > 1 ? "diagonal" : "horizontal",
3692
4068
  ...family ? { fontFamily: family.trim() } : {}
@@ -3798,7 +4174,7 @@ var add = (parent, ...items) => {
3798
4174
  return parent;
3799
4175
  };
3800
4176
  var emu2 = (px3) => String(Math.max(1, Math.round(px3 * EMU_PER_PIXEL)));
3801
- var descendants = (root, ns, local) => Array.from(root.getElementsByTagNameNS(ns, local));
4177
+ var descendants2 = (root, ns, local) => Array.from(root.getElementsByTagNameNS(ns, local));
3802
4178
  function paragraphsFor(doc, lines) {
3803
4179
  return (lines.length ? lines : [""]).map((line) => {
3804
4180
  const paragraph = makeW(doc, "p");
@@ -3890,23 +4266,23 @@ function buildTextBoxDrawing(doc, image, docPrId) {
3890
4266
  }
3891
4267
  function isSimpleTextBox(graphicData, anchored) {
3892
4268
  if (!graphicData || anchored) return false;
3893
- const content = descendants(graphicData, W_NS, "txbxContent")[0];
4269
+ const content = descendants2(graphicData, W_NS, "txbxContent")[0];
3894
4270
  if (!content) return false;
3895
4271
  const plain = (node, allowed) => Array.from(node.childNodes).filter(isElement).every((child3) => child3.namespaceURI === W_NS && allowed.includes(child3.localName));
3896
- return plain(content, ["p"]) && descendants(content, W_NS, "p").every(
3897
- (paragraph) => plain(paragraph, ["r"]) && descendants(paragraph, W_NS, "r").every((run) => plain(run, ["t"]))
4272
+ return plain(content, ["p"]) && descendants2(content, W_NS, "p").every(
4273
+ (paragraph) => plain(paragraph, ["r"]) && descendants2(paragraph, W_NS, "r").every((run) => plain(run, ["t"]))
3898
4274
  );
3899
4275
  }
3900
4276
  function textBoxHasBorder(graphicData) {
3901
- const spPr = graphicData && descendants(graphicData, WPS_NS, "spPr")[0];
4277
+ const spPr = graphicData && descendants2(graphicData, WPS_NS, "spPr")[0];
3902
4278
  const ln = spPr && Array.from(spPr.getElementsByTagNameNS(A_NS, "ln"))[0];
3903
4279
  return Boolean(ln && !ln.getElementsByTagNameNS(A_NS, "noFill").length);
3904
4280
  }
3905
4281
  function patchTextBox(doc, drawing, image, base) {
3906
4282
  if (image.widthPx !== base.widthPx || image.heightPx !== base.heightPx)
3907
4283
  for (const node of [
3908
- ...descendants(drawing, WP_NS, "extent"),
3909
- ...descendants(drawing, A_NS, "ext").filter(
4284
+ ...descendants2(drawing, WP_NS, "extent"),
4285
+ ...descendants2(drawing, A_NS, "ext").filter(
3910
4286
  (ext) => ext.parentNode?.localName === "xfrm"
3911
4287
  )
3912
4288
  ]) {
@@ -3914,14 +4290,14 @@ function patchTextBox(doc, drawing, image, base) {
3914
4290
  node.setAttribute("cy", emu2(image.heightPx));
3915
4291
  }
3916
4292
  if (JSON.stringify(image.textBoxText) !== JSON.stringify(base.textBoxText)) {
3917
- const content = descendants(drawing, W_NS, "txbxContent")[0];
4293
+ const content = descendants2(drawing, W_NS, "txbxContent")[0];
3918
4294
  if (content) {
3919
4295
  for (const child3 of Array.from(content.childNodes)) content.removeChild(child3);
3920
4296
  add(content, ...paragraphsFor(doc, image.textBoxText ?? []));
3921
4297
  }
3922
4298
  }
3923
4299
  if (image.textBoxBorder !== false !== (base.textBoxBorder !== false)) {
3924
- const spPr = descendants(drawing, WPS_NS, "spPr")[0];
4300
+ const spPr = descendants2(drawing, WPS_NS, "spPr")[0];
3925
4301
  if (spPr) {
3926
4302
  for (const old of Array.from(spPr.childNodes).filter(
3927
4303
  (node) => isElement(node) && node.localName === "ln"
@@ -4084,47 +4460,6 @@ var DIAGRAM_RELATIONSHIP_TYPES = {
4084
4460
  drawing: RELATIONSHIP_TYPES.diagramDrawing
4085
4461
  };
4086
4462
 
4087
- // diagram/dom.ts
4088
- function attributeReader(element) {
4089
- return (name) => {
4090
- if (!element) return void 0;
4091
- const direct = element.getAttribute(name);
4092
- if (direct !== null) return direct;
4093
- const attributes = element.attributes;
4094
- for (let index = 0; index < attributes.length; index++) {
4095
- const candidate = attributes.item(index);
4096
- if (candidate && candidate.localName === name) return candidate.value;
4097
- }
4098
- return void 0;
4099
- };
4100
- }
4101
- function stringAttribute(element, name) {
4102
- const value = attributeReader(element)(name)?.trim();
4103
- return value ? value : void 0;
4104
- }
4105
- function integerAttribute(element, name) {
4106
- const parsed = Number.parseInt(attributeReader(element)(name) ?? "", 10);
4107
- return Number.isFinite(parsed) ? parsed : void 0;
4108
- }
4109
- function booleanAttribute(element, name) {
4110
- const value = attributeReader(element)(name)?.trim().toLowerCase();
4111
- if (value === "1" || value === "true") return true;
4112
- if (value === "0" || value === "false") return false;
4113
- return void 0;
4114
- }
4115
- function descendants2(root, local) {
4116
- const result = [];
4117
- const visit = (node) => {
4118
- for (const child3 of Array.from(node.childNodes)) {
4119
- if (!isElement(child3)) continue;
4120
- if (child3.localName === local) result.push(child3);
4121
- visit(child3);
4122
- }
4123
- };
4124
- visit(root);
4125
- return result;
4126
- }
4127
-
4128
4463
  // diagram/data-model.ts
4129
4464
  var TRANSITION_TYPES = /* @__PURE__ */ new Set(["parTrans", "sibTrans"]);
4130
4465
  var STRUCTURAL_TYPES = /* @__PURE__ */ new Set(["doc", "pres", "parTrans", "sibTrans"]);
@@ -4148,7 +4483,7 @@ function connectionLabel(connection, transitionText) {
4148
4483
  function textBodyParagraphs(body) {
4149
4484
  if (!body) return [];
4150
4485
  return children(body, "p", NS.a).map(
4151
- (paragraph) => descendants2(paragraph, "t").map((run) => run.textContent ?? "").join("")
4486
+ (paragraph) => descendants(paragraph, "t").map((run) => run.textContent ?? "").join("")
4152
4487
  );
4153
4488
  }
4154
4489
  function parsePoint(element) {
@@ -4228,312 +4563,20 @@ function parseDiagramDataModel(source, part) {
4228
4563
  if ((!connection.type || connection.type === "parOf") && !parentById.has(connection.destId))
4229
4564
  parentById.set(connection.destId, connection.sourceId);
4230
4565
  }
4231
- const ext = descendants2(root, "dataModelExt")[0];
4566
+ const ext = descendants(root, "dataModelExt")[0];
4232
4567
  const drawingRelId = stringAttribute(ext, "relId");
4233
4568
  return {
4234
4569
  points,
4235
4570
  connections,
4236
4571
  nodes: points.filter((point) => !STRUCTURAL_TYPES.has(point.type)),
4237
- parentById,
4238
- ...drawingRelId ? { drawingRelId } : {},
4239
- issues
4240
- };
4241
- }
4242
-
4243
- // color/color-primitives.ts
4244
- function clampUnitInterval(value) {
4245
- return Math.min(1, Math.max(0, value));
4246
- }
4247
- function hexToRgbChannels(color) {
4248
- const normalized = color.replace("#", "");
4249
- if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {
4250
- return null;
4251
- }
4252
- return {
4253
- r: Number.parseInt(normalized.slice(0, 2), 16),
4254
- g: Number.parseInt(normalized.slice(2, 4), 16),
4255
- b: Number.parseInt(normalized.slice(4, 6), 16)
4256
- };
4257
- }
4258
- function percentDivisorFor(text) {
4259
- return text.endsWith("%") ? 100 : 1e5;
4260
- }
4261
- function parseOoxmlPercent(value) {
4262
- const text = String(value ?? "").trim();
4263
- const divisor = percentDivisorFor(text);
4264
- const magnitude = Number.parseFloat(divisor === 100 ? text.slice(0, -1) : text);
4265
- if (!Number.isFinite(magnitude)) {
4266
- return void 0;
4267
- }
4268
- return magnitude / divisor;
4269
- }
4270
- function parseDrawingPercent(value) {
4271
- const parsed = parseOoxmlPercent(value);
4272
- return parsed === void 0 ? void 0 : clampUnitInterval(parsed);
4273
- }
4274
- function scrgbLinearToSrgb8(linear) {
4275
- const l = Math.min(1, Math.max(0, linear));
4276
- const companded = l <= 31308e-7 ? 12.92 * l : 1.055 * l ** (1 / 2.4) - 0.055;
4277
- return Math.min(255, Math.max(0, Math.round(companded * 255)));
4278
- }
4279
- function toHex2(value) {
4280
- return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
4281
- }
4282
- function rgbToHsl(r, g, b) {
4283
- const rN = r / 255;
4284
- const gN = g / 255;
4285
- const bN = b / 255;
4286
- const cMax = Math.max(rN, gN, bN);
4287
- const cMin = Math.min(rN, gN, bN);
4288
- const delta = cMax - cMin;
4289
- const l = (cMax + cMin) / 2;
4290
- let s = 0;
4291
- if (delta !== 0) {
4292
- s = delta / (1 - Math.abs(2 * l - 1));
4293
- }
4294
- let h = 0;
4295
- if (delta !== 0) {
4296
- if (cMax === rN) {
4297
- h = 60 * ((gN - bN) / delta % 6);
4298
- } else if (cMax === gN) {
4299
- h = 60 * ((bN - rN) / delta + 2);
4300
- } else {
4301
- h = 60 * ((rN - gN) / delta + 4);
4302
- }
4303
- }
4304
- if (h < 0) {
4305
- h += 360;
4306
- }
4307
- return { h, s: clampUnitInterval(s), l: clampUnitInterval(l) };
4308
- }
4309
- function hslToRgb(h, s, l, roundChannel = Math.round, options) {
4310
- const sC = clampUnitInterval(s);
4311
- const lC = clampUnitInterval(l);
4312
- const hN = (h % 360 + 360) % 360;
4313
- const c = (1 - Math.abs(2 * lC - 1)) * sC;
4314
- const x = c * (1 - Math.abs(hN / 60 % 2 - 1));
4315
- const m = lC - c / 2;
4316
- let rP = 0;
4317
- let gP = 0;
4318
- let bP = 0;
4319
- if (hN < 60) {
4320
- rP = c;
4321
- gP = x;
4322
- bP = 0;
4323
- } else if (hN < 120) {
4324
- rP = x;
4325
- gP = c;
4326
- bP = 0;
4327
- } else if (hN < 180) {
4328
- rP = 0;
4329
- gP = c;
4330
- bP = x;
4331
- } else if (hN < 240) {
4332
- rP = 0;
4333
- gP = x;
4334
- bP = c;
4335
- } else if (hN < 300) {
4336
- rP = x;
4337
- gP = 0;
4338
- bP = c;
4339
- } else {
4340
- rP = c;
4341
- gP = 0;
4342
- bP = x;
4343
- }
4344
- return {
4345
- r: roundChannel((rP + m) * 255),
4346
- g: roundChannel((gP + m) * 255),
4347
- b: roundChannel((bP + m) * 255)
4348
- };
4349
- }
4350
- function parseDrawingFraction(value) {
4351
- return parseOoxmlPercent(value);
4352
- }
4353
- function parseDrawingHueDegrees(value) {
4354
- const parsed = Number.parseFloat(String(value ?? "").trim());
4355
- if (!Number.isFinite(parsed)) {
4356
- return void 0;
4357
- }
4358
- return parsed / 6e4;
4359
- }
4360
-
4361
- // color/color-linear.ts
4362
- function srgb255ToLinear(channel) {
4363
- const c = clampUnitInterval(channel / 255);
4364
- return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
4365
- }
4366
- function linearToSrgb255(linear) {
4367
- const c = clampUnitInterval(linear);
4368
- return 255 * (c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055);
4369
- }
4370
-
4371
- // diagram/drawing-color.ts
4372
- var COLOR_ELEMENTS = {
4373
- srgbClr: "srgb",
4374
- schemeClr: "scheme",
4375
- sysClr: "system",
4376
- prstClr: "preset",
4377
- scrgbClr: "scrgb",
4378
- hslClr: "hsl"
4379
- };
4380
- function colorValue(kind, element) {
4381
- const attribute = (name) => element.getAttribute(name) ?? "";
4382
- if (kind === "scrgb") return `${attribute("r")},${attribute("g")},${attribute("b")}`;
4383
- if (kind === "hsl") return `${attribute("hue")},${attribute("sat")},${attribute("lum")}`;
4384
- return attribute("val");
4385
- }
4386
- function parseDrawingColorIn(container) {
4387
- if (!container) return void 0;
4388
- for (const element of elements(container)) {
4389
- const kind = COLOR_ELEMENTS[element.localName];
4390
- if (!kind || element.namespaceURI && element.namespaceURI !== NS.a) continue;
4391
- return parseDrawingColor(element);
4392
- }
4393
- return void 0;
4394
- }
4395
- function parseDrawingColor(element) {
4396
- const kind = COLOR_ELEMENTS[element.localName];
4397
- if (!kind) return void 0;
4398
- const color = {
4399
- kind,
4400
- value: colorValue(kind, element),
4401
- transforms: elements(element).map((child3) => ({
4402
- name: child3.localName,
4403
- value: child3.getAttribute("val") ?? ""
4404
- }))
4405
- };
4406
- const fallback = kind === "system" ? element.getAttribute("lastClr") : null;
4407
- if (fallback) color.fallback = fallback;
4408
- return color;
4409
- }
4410
- function parseDrawingColorList(container) {
4411
- if (!container) return [];
4412
- return elements(container).flatMap((element) => {
4413
- const color = parseDrawingColor(element);
4414
- return color ? [color] : [];
4415
- });
4416
- }
4417
- var PRESET_COLORS = {
4418
- black: "#000000",
4419
- white: "#FFFFFF",
4420
- red: "#FF0000",
4421
- green: "#008000",
4422
- blue: "#0000FF",
4423
- yellow: "#FFFF00",
4424
- gray: "#808080",
4425
- grey: "#808080"
4426
- };
4427
- function baseHex(color, theme) {
4428
- switch (color.kind) {
4429
- case "srgb":
4430
- return /^[0-9a-f]{6}$/i.test(color.value) ? `#${color.value.toUpperCase()}` : void 0;
4431
- case "scheme":
4432
- return theme?.scheme(color.value);
4433
- case "system":
4434
- return color.fallback && /^[0-9a-f]{6}$/i.test(color.fallback) ? `#${color.fallback.toUpperCase()}` : void 0;
4435
- case "preset":
4436
- return PRESET_COLORS[color.value];
4437
- case "scrgb": {
4438
- const [r, g, b] = color.value.split(",").map((part) => parseDrawingFraction(part));
4439
- if (r === void 0 || g === void 0 || b === void 0) return void 0;
4440
- return `#${toHex2(scrgbLinearToSrgb8(r))}${toHex2(scrgbLinearToSrgb8(g))}${toHex2(scrgbLinearToSrgb8(b))}`;
4441
- }
4442
- case "hsl": {
4443
- const [h, s, l] = color.value.split(",");
4444
- const hue = parseDrawingHueDegrees(h);
4445
- const sat = parseDrawingFraction(s);
4446
- const lum = parseDrawingFraction(l);
4447
- if (hue === void 0 || sat === void 0 || lum === void 0) return void 0;
4448
- const { r, g, b } = hslToRgb(hue, sat, lum);
4449
- return `#${toHex2(r)}${toHex2(g)}${toHex2(b)}`;
4450
- }
4451
- }
4452
- }
4453
- var APPLIED = /* @__PURE__ */ new Set([
4454
- "alpha",
4455
- "alphaMod",
4456
- "alphaOff",
4457
- "comp",
4458
- "inv",
4459
- "gray",
4460
- "shade",
4461
- "tint",
4462
- "hue",
4463
- "hueMod",
4464
- "hueOff",
4465
- "sat",
4466
- "satMod",
4467
- "satOff",
4468
- "lum",
4469
- "lumMod",
4470
- "lumOff"
4471
- ]);
4472
- function resolveDrawingColor(color, theme, options) {
4473
- const base = baseHex(color, theme);
4474
- const rgb = base ? hexToRgbChannels(base) : null;
4475
- if (!rgb) return void 0;
4476
- let { r, g, b } = rgb;
4477
- const find = (name) => color.transforms.find((entry) => entry.name === name)?.value;
4478
- const has = (name) => color.transforms.some((entry) => entry.name === name);
4479
- if (has("comp")) {
4480
- const hsl = rgbToHsl(r, g, b);
4481
- ({ r, g, b } = hslToRgb((hsl.h + 180) % 360, hsl.s, hsl.l));
4482
- }
4483
- if (has("inv")) [r, g, b] = [255 - r, 255 - g, 255 - b];
4484
- if (has("gray")) r = g = b = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
4485
- const shade = parseDrawingPercent(find("shade"));
4486
- if (shade !== void 0) {
4487
- r = linearToSrgb255(srgb255ToLinear(r) * shade);
4488
- g = linearToSrgb255(srgb255ToLinear(g) * shade);
4489
- b = linearToSrgb255(srgb255ToLinear(b) * shade);
4490
- }
4491
- const tint = parseDrawingPercent(find("tint"));
4492
- if (tint !== void 0) {
4493
- r = linearToSrgb255(1 - (1 - srgb255ToLinear(r)) * tint);
4494
- g = linearToSrgb255(1 - (1 - srgb255ToLinear(g)) * tint);
4495
- b = linearToSrgb255(1 - (1 - srgb255ToLinear(b)) * tint);
4496
- }
4497
- if (["hue", "hueMod", "hueOff", "sat", "satMod", "satOff", "lum", "lumMod", "lumOff"].some(has)) {
4498
- const hsl = rgbToHsl(r, g, b);
4499
- const wrap = (degrees) => (degrees % 360 + 360) % 360;
4500
- const hueAbs = parseDrawingHueDegrees(find("hue"));
4501
- if (hueAbs !== void 0) hsl.h = wrap(hueAbs);
4502
- const hueMod = parseDrawingFraction(find("hueMod"));
4503
- if (hueMod !== void 0) hsl.h = wrap(hsl.h * hueMod);
4504
- const hueOff = parseDrawingHueDegrees(find("hueOff"));
4505
- if (hueOff !== void 0) hsl.h = wrap(hsl.h + hueOff);
4506
- const satAbs = parseDrawingFraction(find("sat"));
4507
- if (satAbs !== void 0) hsl.s = clampUnitInterval(satAbs);
4508
- const satMod = parseDrawingFraction(find("satMod"));
4509
- if (satMod !== void 0) hsl.s = clampUnitInterval(hsl.s * satMod);
4510
- const satOff = parseDrawingFraction(find("satOff"));
4511
- if (satOff !== void 0) hsl.s = clampUnitInterval(hsl.s + satOff);
4512
- const lumAbs = parseDrawingFraction(find("lum"));
4513
- if (lumAbs !== void 0) hsl.l = clampUnitInterval(lumAbs);
4514
- const lumMod = parseDrawingFraction(find("lumMod"));
4515
- if (lumMod !== void 0) hsl.l = clampUnitInterval(hsl.l * lumMod);
4516
- const lumOff = parseDrawingFraction(find("lumOff"));
4517
- if (lumOff !== void 0) hsl.l = clampUnitInterval(hsl.l + lumOff);
4518
- const round = Math.round;
4519
- ({ r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l, round));
4520
- }
4521
- let alpha = parseDrawingPercent(find("alpha")) ?? 1;
4522
- const alphaMod = parseDrawingFraction(find("alphaMod"));
4523
- if (alphaMod !== void 0) alpha = clampUnitInterval(alpha * alphaMod);
4524
- const alphaOff = parseDrawingFraction(find("alphaOff"));
4525
- if (alphaOff !== void 0) alpha = clampUnitInterval(alpha + alphaOff);
4526
- return {
4527
- hex: `#${toHex2(r)}${toHex2(g)}${toHex2(b)}`,
4528
- alpha,
4529
- unapplied: [...new Set(color.transforms.map((entry) => entry.name))].filter(
4530
- (name) => !APPLIED.has(name)
4531
- )
4572
+ parentById,
4573
+ ...drawingRelId ? { drawingRelId } : {},
4574
+ issues
4532
4575
  };
4533
4576
  }
4534
4577
 
4535
4578
  // diagram/definitions.ts
4536
- var rootOf = (source) => (typeof source === "string" ? parseXml(source, { label: "DiagramML" }) : source).documentElement;
4579
+ var rootOf2 = (source) => (typeof source === "string" ? parseXml(source, { label: "DiagramML" }) : source).documentElement;
4537
4580
  function parseDefinitionHeader(root) {
4538
4581
  const header = {
4539
4582
  uniqueId: stringAttribute(root, "uniqueId") ?? "",
@@ -4554,7 +4597,7 @@ function colorList(container) {
4554
4597
  return { ...method ? { method } : {}, colors: parseDrawingColorList(container) };
4555
4598
  }
4556
4599
  function parseDiagramColors(source) {
4557
- const root = rootOf(source);
4600
+ const root = rootOf2(source);
4558
4601
  const labels = children(root, "styleLbl", NS.dgm).map((label) => ({
4559
4602
  name: stringAttribute(label, "name") ?? "",
4560
4603
  fill: colorList(first(label, "fillClrLst", NS.dgm)),
@@ -4594,7 +4637,7 @@ function parseStyleReferences(style) {
4594
4637
  }
4595
4638
  var hasContent = (element) => Boolean(element && (element.attributes.length > 0 || elements(element).length > 0));
4596
4639
  function parseDiagramQuickStyle(source) {
4597
- const root = rootOf(source);
4640
+ const root = rootOf2(source);
4598
4641
  const labels = children(root, "styleLbl", NS.dgm).map((label) => ({
4599
4642
  name: stringAttribute(label, "name") ?? "",
4600
4643
  ...parseStyleReferences(first(label, "style", NS.dgm)),
@@ -4608,7 +4651,7 @@ function parseDiagramQuickStyle(source) {
4608
4651
  };
4609
4652
  }
4610
4653
  function parseDiagramLayoutSummary(source) {
4611
- const root = rootOf(source);
4654
+ const root = rootOf2(source);
4612
4655
  const header = parseDefinitionHeader(root);
4613
4656
  const family = resolveDiagramLayoutCategory(
4614
4657
  header.uniqueId,
@@ -4620,11 +4663,11 @@ function parseDiagramLayoutSummary(source) {
4620
4663
  ...header,
4621
4664
  ...family ? { family } : {},
4622
4665
  ...rootAlgorithm ? { rootAlgorithm } : {},
4623
- layoutNodeCount: descendants2(root, "layoutNode").length
4666
+ layoutNodeCount: descendants(root, "layoutNode").length
4624
4667
  };
4625
4668
  }
4626
4669
 
4627
- // diagram/drawing-fill.ts
4670
+ // drawingml/drawing-fill.ts
4628
4671
  var FILL_ELEMENTS = /* @__PURE__ */ new Set([
4629
4672
  "noFill",
4630
4673
  "solidFill",
@@ -4716,7 +4759,7 @@ function parseDrawingLine(ln) {
4716
4759
  return line;
4717
4760
  }
4718
4761
 
4719
- // diagram/drawing-text.ts
4762
+ // drawingml/drawing-text.ts
4720
4763
  function parseSpacing(parent) {
4721
4764
  for (const [name, unit, divisor] of [
4722
4765
  ["spcPts", "points", 100],
@@ -4795,7 +4838,7 @@ function parseDrawingTextBody(body) {
4795
4838
  return result;
4796
4839
  }
4797
4840
 
4798
- // diagram/drawing-geometry.ts
4841
+ // drawingml/drawing-geometry.ts
4799
4842
  var int = (element, name) => Number.parseInt(element?.getAttribute(name) ?? "", 10);
4800
4843
  function parseFrame(container) {
4801
4844
  const off = first(container, "off", NS.a);
@@ -5614,6 +5657,23 @@ function restoreRunFormatting(run) {
5614
5657
  else delete run.revision;
5615
5658
  }
5616
5659
 
5660
+ // docx/field-flags.ts
5661
+ function parseFieldFlags(element) {
5662
+ const locked = onOffAttribute(element, "fldLock");
5663
+ const dirty = onOffAttribute(element, "dirty");
5664
+ if (locked === void 0 && dirty === void 0) return void 0;
5665
+ return { ...locked !== void 0 && { locked }, ...dirty !== void 0 && { dirty } };
5666
+ }
5667
+ function writeFieldFlags(element, flags) {
5668
+ for (const [name, value] of [
5669
+ ["fldLock", flags?.locked],
5670
+ ["dirty", flags?.dirty]
5671
+ ]) {
5672
+ if (value === void 0) element.removeAttributeNS(WORD_NS, name);
5673
+ else element.setAttributeNS(WORD_NS, `w:${name}`, value ? "true" : "false");
5674
+ }
5675
+ }
5676
+
5617
5677
  // docx/write-run.ts
5618
5678
  function setAttribute6(element, local, value) {
5619
5679
  element.setAttributeNS(WORD_NS, `w:${local}`, value);
@@ -5799,6 +5859,7 @@ function createRun(doc, run, base, old, allocator) {
5799
5859
  if (run.fieldChar) {
5800
5860
  const marker = makeW(doc, "fldChar");
5801
5861
  setAttribute6(marker, "fldCharType", run.fieldChar);
5862
+ writeFieldFlags(marker, run.fieldFlags);
5802
5863
  node.appendChild(marker);
5803
5864
  return node;
5804
5865
  }
@@ -5879,6 +5940,14 @@ function takeSimpleFieldCommentEdges(doc, runs, start, end, opens, closes) {
5879
5940
  after: take(closes, end - 1).reverse().flatMap((edge) => rangeEndNodes(doc, edge))
5880
5941
  };
5881
5942
  }
5943
+
5944
+ // docx/field-lock.ts
5945
+ function isFieldLocked(run) {
5946
+ return run?.fieldFlags?.locked === true;
5947
+ }
5948
+ function sameFieldFlags(a, b) {
5949
+ return a?.locked === b?.locked && a?.dirty === b?.dirty;
5950
+ }
5882
5951
  var MATH_NAMESPACES = /* @__PURE__ */ new Set([
5883
5952
  "http://schemas.openxmlformats.org/officeDocument/2006/math",
5884
5953
  "http://purl.oclc.org/ooxml/officeDocument/math"
@@ -6203,6 +6272,7 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
6203
6272
  container = makeW(doc, "fldSimple");
6204
6273
  setW6(container, "instr", ` ${group.instr} `);
6205
6274
  }
6275
+ if (group.kind === "simpleField") writeFieldFlags(container, runAt(start).fieldFlags);
6206
6276
  const edges = group.kind === "simpleField" ? takeSimpleFieldCommentEdges(doc, runs, start, index, opens, closes) : { before: [], after: [] };
6207
6277
  for (let item = start; item < index; item++)
6208
6278
  for (const node of nodesFor(item)) container.appendChild(node);
@@ -6213,13 +6283,18 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
6213
6283
  function containerGroup(run) {
6214
6284
  if (run.link) return { kind: "link", link: run.link };
6215
6285
  if (run.field?.simple)
6216
- return { kind: "simpleField", instr: run.field.instr, instanceId: run.fieldInstanceId };
6286
+ return {
6287
+ kind: "simpleField",
6288
+ instr: run.field.instr,
6289
+ instanceId: run.fieldInstanceId,
6290
+ fieldFlags: run.fieldFlags
6291
+ };
6217
6292
  return void 0;
6218
6293
  }
6219
6294
  function sameGroup(a, b) {
6220
6295
  if (!a || !b) return a === b;
6221
6296
  if (a.kind === "link" && b.kind === "link") return sameLink(a.link, b.link);
6222
- return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId;
6297
+ return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId && sameFieldFlags(a.fieldFlags, b.fieldFlags);
6223
6298
  }
6224
6299
 
6225
6300
  // docx/paragraph-properties.ts
@@ -7044,103 +7119,338 @@ function validateNumberingCatalog(c, catalog) {
7044
7119
  }
7045
7120
  }
7046
7121
 
7047
- // docx/validate-model.ts
7048
- function validateBlocks(c, blocks) {
7049
- blocks?.forEach((block, index) => {
7050
- const at = c.at(`[${index}]`);
7051
- if (block.type === "paragraph") return validateParagraph(at, block);
7052
- validateTable(at, block);
7053
- block.rows.forEach(
7054
- (row, r) => row.forEach(
7055
- (cell, k) => cell.paragraphs.forEach(
7056
- (paragraph, p) => validateParagraph(at.at(`.rows[${r}][${k}].paragraphs[${p}]`), paragraph)
7057
- )
7058
- )
7059
- );
7060
- });
7122
+ // docx/validate-model.ts
7123
+ function validateBlocks(c, blocks) {
7124
+ blocks?.forEach((block, index) => {
7125
+ const at = c.at(`[${index}]`);
7126
+ if (block.type === "paragraph") return validateParagraph(at, block);
7127
+ validateTable(at, block);
7128
+ block.rows.forEach(
7129
+ (row, r) => row.forEach(
7130
+ (cell, k) => cell.paragraphs.forEach(
7131
+ (paragraph, p) => validateParagraph(at.at(`.rows[${r}][${k}].paragraphs[${p}]`), paragraph)
7132
+ )
7133
+ )
7134
+ );
7135
+ });
7136
+ }
7137
+ function validateDocumentModel(model) {
7138
+ const issues = [];
7139
+ const path = (suffix) => new Checker(issues, suffix);
7140
+ const page = path("page");
7141
+ for (const key of ["width", "height"])
7142
+ page.check(
7143
+ key,
7144
+ model.page?.[key],
7145
+ (v) => typeof v === "number" && Number.isFinite(v) && Math.round(v * 15) > 0,
7146
+ "must be a finite, positive pixel size (converted to integer twips)"
7147
+ );
7148
+ for (const key of ["marginTop", "marginRight", "marginBottom", "marginLeft"])
7149
+ page.check(
7150
+ key,
7151
+ model.page?.[key],
7152
+ (v) => typeof v === "number" && Number.isFinite(v) && (key === "marginTop" || key === "marginBottom" || v >= 0),
7153
+ "must be a finite pixel size (converted to integer twips; left/right non-negative)"
7154
+ );
7155
+ validateBlocks(path("blocks"), model.blocks);
7156
+ model.sections?.forEach((section, index) => {
7157
+ const at = path(`sections[${index}]`);
7158
+ validateSection(at, section);
7159
+ for (const kind of ["headers", "footers"])
7160
+ for (const [slot2, content] of Object.entries(section[kind] ?? {}))
7161
+ validateBlocks(at.at(`.${kind}.${slot2}.blocks`), content?.blocks);
7162
+ });
7163
+ for (const kind of ["footnotes", "endnotes"])
7164
+ model[kind]?.forEach(
7165
+ (note, index) => validateBlocks(path(`${kind}[${index}].blocks`), note.blocks)
7166
+ );
7167
+ model.comments?.forEach(
7168
+ (comment, index) => path(`comments[${index}]`).dateTime("date", comment.date)
7169
+ );
7170
+ path("model").hex("pageColor", model.pageColor);
7171
+ path("model").enum("footnoteNumFmt", model.footnoteNumFmt, isStNumberFormat, "ST_NumberFormat");
7172
+ path("model").enum("endnoteNumFmt", model.endnoteNumFmt, isStNumberFormat, "ST_NumberFormat");
7173
+ if (model.numberingCatalog)
7174
+ validateNumberingCatalog(path("numberingCatalog"), model.numberingCatalog);
7175
+ return issues;
7176
+ }
7177
+ function assertValidDocumentModel(model) {
7178
+ const issues = validateDocumentModel(model);
7179
+ if (issues.length) throw new DocxModelValidationError(issues);
7180
+ }
7181
+
7182
+ // docx/numbering-parts.ts
7183
+ var CT_NS = "http://schemas.openxmlformats.org/package/2006/content-types";
7184
+ var REL_NS2 = "http://schemas.openxmlformats.org/package/2006/relationships";
7185
+ var NUMBERING_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering";
7186
+ var NUMBERING_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml";
7187
+ async function registerNumberingPart(zip) {
7188
+ const contentTypesPath = "[Content_Types].xml";
7189
+ const contentTypesFile = zip.file(contentTypesPath);
7190
+ const contentTypesXml = contentTypesFile ? await contentTypesFile.async("string") : `<?xml version="1.0"?><Types xmlns="${CT_NS}"/>`;
7191
+ const contentTypesDoc = parseXml2(contentTypesXml);
7192
+ const hasOverride = Array.from(contentTypesDoc.getElementsByTagNameNS(CT_NS, "Override")).some(
7193
+ (element) => element.getAttribute("PartName") === "/word/numbering.xml"
7194
+ );
7195
+ if (!hasOverride) {
7196
+ const override = contentTypesDoc.createElementNS(CT_NS, "Override");
7197
+ override.setAttribute("PartName", "/word/numbering.xml");
7198
+ override.setAttribute("ContentType", NUMBERING_CONTENT_TYPE);
7199
+ contentTypesDoc.documentElement.appendChild(override);
7200
+ zip.file(contentTypesPath, buildXml(contentTypesDoc));
7201
+ }
7202
+ const relsPath = "word/_rels/document.xml.rels";
7203
+ const relsFile = zip.file(relsPath);
7204
+ const relsXml = relsFile ? await relsFile.async("string") : `<?xml version="1.0"?><Relationships xmlns="${REL_NS2}"/>`;
7205
+ const relsDoc = parseXml2(relsXml);
7206
+ const existingIds = new Set(
7207
+ Array.from(relsDoc.getElementsByTagNameNS(REL_NS2, "Relationship")).map(
7208
+ (element) => element.getAttribute("Id") ?? ""
7209
+ )
7210
+ );
7211
+ let serial = 1;
7212
+ while (existingIds.has(`rId${serial}`)) serial++;
7213
+ const relationship = relsDoc.createElementNS(REL_NS2, "Relationship");
7214
+ relationship.setAttribute("Id", `rId${serial}`);
7215
+ relationship.setAttribute("Type", NUMBERING_RELATIONSHIP_TYPE);
7216
+ relationship.setAttribute("Target", "numbering.xml");
7217
+ relsDoc.documentElement.appendChild(relationship);
7218
+ zip.file(relsPath, buildXml(relsDoc));
7219
+ }
7220
+
7221
+ // docx/numbering-parse.ts
7222
+ var integer2 = (value, fallback) => parseInteger(value) ?? fallback;
7223
+ var flag = (element) => onOffElement(element) === true;
7224
+ function byName(root, local) {
7225
+ return Array.from(root.getElementsByTagName("*")).filter(
7226
+ (node) => node.nodeType === 1 && named2(node, local)
7227
+ );
7228
+ }
7229
+ function parseMarkerFormat(rPr) {
7230
+ if (!rPr) return void 0;
7231
+ const format = {};
7232
+ const family = getW(first2(rPr, "rFonts"), "ascii");
7233
+ if (family) format.fontFamily = family;
7234
+ const size = parseInteger(getW(first2(rPr, "sz"), "val"));
7235
+ if (size !== void 0 && size > 0) format.fontSizeHalfPoints = size;
7236
+ if (onOffElement(first2(rPr, "b")) === true) format.bold = true;
7237
+ if (onOffElement(first2(rPr, "i")) === true) format.italic = true;
7238
+ const color = getW(first2(rPr, "color"), "val");
7239
+ if (color && /^[0-9a-f]{6}$/i.test(color)) format.color = `#${color.toLowerCase()}`;
7240
+ return Object.keys(format).length ? format : void 0;
7241
+ }
7242
+ function parseNumberingLevel(lvl) {
7243
+ const level = integer2(getW(lvl, "ilvl"), 0);
7244
+ const start = integer2(getW(first2(lvl, "start"), "val"), 1);
7245
+ const numFmt = enumValue(isStNumberFormat, getW(first2(lvl, "numFmt"), "val"), "w:numFmt") ?? "decimal";
7246
+ const lvlText = getW(first2(lvl, "lvlText"), "val") ?? "";
7247
+ const jc = getW(first2(lvl, "lvlJc"), "val");
7248
+ const ind = first2(first2(lvl, "pPr"), "ind");
7249
+ const suffRaw = getW(first2(lvl, "suff"), "val");
7250
+ const result = { level, start, numFmt, lvlText };
7251
+ if (!first2(lvl, "start")) result.startWasOmitted = true;
7252
+ const paragraphStyleId = getW(first2(lvl, "pStyle"), "val");
7253
+ if (paragraphStyleId) result.paragraphStyleId = paragraphStyleId;
7254
+ if (jc === "left" || jc === "center" || jc === "right") result.lvlJc = jc;
7255
+ const left = getW(ind, "left") ?? getW(ind, "start");
7256
+ if (left !== void 0) result.indentLeftTwips = parseSignedTwips(left) ?? signedTwips(0);
7257
+ const hanging = getW(ind, "hanging");
7258
+ if (hanging !== void 0) result.hangingTwips = parseTwips(hanging) ?? twips(0);
7259
+ const firstLine = getW(ind, "firstLine");
7260
+ if (firstLine !== void 0) result.firstLineTwips = parseTwips(firstLine) ?? twips(0);
7261
+ const tabs = first2(first2(lvl, "pPr"), "tabs");
7262
+ const tab = tabs ? children2(tabs, "tab").find((stop) => getW(stop, "val") !== "clear") : void 0;
7263
+ const tabPos = tab ? parseTwips(getW(tab, "pos")) : void 0;
7264
+ if (tabPos !== void 0) result.tabStopTwips = tabPos;
7265
+ if (flag(first2(lvl, "isLgl"))) result.isLgl = true;
7266
+ const restart = getW(first2(lvl, "lvlRestart"), "val");
7267
+ if (restart !== void 0) result.lvlRestart = integer2(restart, 0);
7268
+ const marker = parseMarkerFormat(first2(lvl, "rPr"));
7269
+ if (marker) result.markerFormat = marker;
7270
+ result.suffix = suffRaw === "space" ? "space" : suffRaw === "nothing" ? "none" : "tab";
7271
+ return result;
7272
+ }
7273
+ function parseAbstractNum(element) {
7274
+ const id = getW(element, "abstractNumId");
7275
+ if (!id) return void 0;
7276
+ const levels = {};
7277
+ for (const lvl of children2(element, "lvl")) {
7278
+ const parsed = parseNumberingLevel(lvl);
7279
+ levels[parsed.level] = parsed;
7280
+ }
7281
+ return { id, levels };
7282
+ }
7283
+ function parseNum(element) {
7284
+ const id = getW(element, "numId");
7285
+ if (!id) return void 0;
7286
+ const abstractNumId = getW(first2(element, "abstractNumId"), "val") ?? "";
7287
+ const levelOverrides = {};
7288
+ for (const override of children2(element, "lvlOverride")) {
7289
+ const level = integer2(getW(override, "ilvl"), 0);
7290
+ const entry = {};
7291
+ const startOverride = getW(first2(override, "startOverride"), "val");
7292
+ if (startOverride !== void 0) entry.startOverride = integer2(startOverride, 1);
7293
+ const lvl = first2(override, "lvl");
7294
+ if (lvl) entry.lvl = parseNumberingLevel(lvl);
7295
+ if (Object.keys(entry).length) levelOverrides[level] = entry;
7296
+ }
7297
+ return {
7298
+ id,
7299
+ abstractNumId,
7300
+ ...Object.keys(levelOverrides).length ? { levelOverrides } : {}
7301
+ };
7302
+ }
7303
+ function parseNumberingCatalog(xml) {
7304
+ const document = parseXml2(xml);
7305
+ const root = document.documentElement;
7306
+ const abstractNums = {};
7307
+ const warnings = [];
7308
+ for (const element of byName(root, "abstractNum")) {
7309
+ const parsed = parseAbstractNum(element);
7310
+ if (!parsed) continue;
7311
+ abstractNums[parsed.id] = parsed;
7312
+ const link = getW(first2(element, "numStyleLink"), "val");
7313
+ if (link)
7314
+ warnings.push(
7315
+ `Numbering definition abstractNum ${parsed.id} links to style "${link}"; style-linked numbering levels are not resolved.`
7316
+ );
7317
+ if (byName(element, "lvlPicBulletId").length)
7318
+ warnings.push(
7319
+ `Numbering definition abstractNum ${parsed.id} uses a picture bullet; picture bullets are not rendered.`
7320
+ );
7321
+ }
7322
+ const nums = {};
7323
+ for (const element of byName(root, "num")) {
7324
+ const parsed = parseNum(element);
7325
+ if (parsed) nums[parsed.id] = parsed;
7326
+ }
7327
+ return { abstractNums, nums, warnings: [...new Set(warnings)] };
7328
+ }
7329
+ function resolveNumberingLevel(catalog, numId, level) {
7330
+ const num = catalog.nums[numId];
7331
+ if (!num) return void 0;
7332
+ const override = num.levelOverrides?.[level];
7333
+ const sourceAbstract = catalog.abstractNums[num.abstractNumId]?.levels[level];
7334
+ const abstract = sourceAbstract?.startWasOmitted && sourceAbstract.start === 1 ? { ...sourceAbstract, start: 0 } : sourceAbstract;
7335
+ let base = override?.lvl ?? abstract;
7336
+ if (!base) return void 0;
7337
+ if (override?.lvl) {
7338
+ const { lvlRestart: _ignored, ...properties } = base;
7339
+ base = {
7340
+ ...properties,
7341
+ ...abstract?.lvlRestart !== void 0 ? { lvlRestart: abstract.lvlRestart } : {}
7342
+ };
7343
+ }
7344
+ let start = override?.startOverride ?? base.start;
7345
+ if (override?.lvl) {
7346
+ if (abstract?.lvlRestart === 0 && override.startOverride === void 0) start = abstract.start;
7347
+ else if (!override.lvl.startWasOmitted || override.lvl.start !== 1) start = override.lvl.start;
7348
+ else start = override.startOverride ?? 0;
7349
+ }
7350
+ return start !== base.start ? { ...base, start } : base;
7351
+ }
7352
+
7353
+ // docx/numbering-start-edit.ts
7354
+ function assertListStartValue(level, start) {
7355
+ if (!Number.isInteger(level) || level < 0 || level > 8)
7356
+ throw new Error("List level must be an integer from 0 through 8.");
7357
+ if (!Number.isInteger(start) || start < 0 || start > 2147483647)
7358
+ throw new Error("List start must be an integer from 0 through 2147483647.");
7359
+ }
7360
+ function setListStartOverride(catalog, numId, level, start) {
7361
+ assertListStartValue(level, start);
7362
+ if (!Number.isSafeInteger(numId) || numId <= 0) throw new Error("Invalid list instance id.");
7363
+ const id = String(numId);
7364
+ const num = catalog.nums[id];
7365
+ if (!num || !resolveNumberingLevel(catalog, id, level))
7366
+ throw new Error("List instance or level does not exist.");
7367
+ const override = num.levelOverrides?.[level];
7368
+ if (override?.lvl) throw new Error("Changing starts with a full level override is unsupported.");
7369
+ if (override?.startOverride === start) return catalog;
7370
+ return {
7371
+ ...catalog,
7372
+ nums: {
7373
+ ...catalog.nums,
7374
+ [id]: {
7375
+ ...num,
7376
+ levelOverrides: {
7377
+ ...num.levelOverrides,
7378
+ [level]: { ...override, startOverride: start }
7379
+ }
7380
+ }
7381
+ }
7382
+ };
7383
+ }
7384
+
7385
+ // docx/numbering-start-patch.ts
7386
+ function withoutStarts(num) {
7387
+ const { levelOverrides, ...properties } = num;
7388
+ const kept = {};
7389
+ for (const [level, override] of Object.entries(levelOverrides ?? {})) {
7390
+ const { startOverride: _start, ...rest } = override;
7391
+ if (Object.keys(rest).length) kept[level] = rest;
7392
+ }
7393
+ return { ...properties, ...Object.keys(kept).length ? { levelOverrides: kept } : {} };
7061
7394
  }
7062
- function validateDocumentModel(model) {
7063
- const issues = [];
7064
- const path = (suffix) => new Checker(issues, suffix);
7065
- const page = path("page");
7066
- for (const key of ["width", "height"])
7067
- page.check(
7068
- key,
7069
- model.page?.[key],
7070
- (v) => typeof v === "number" && Number.isFinite(v) && Math.round(v * 15) > 0,
7071
- "must be a finite, positive pixel size (converted to integer twips)"
7395
+ function numberingStartChanges(prior, next) {
7396
+ const changes = [];
7397
+ for (const [id, previous] of Object.entries(prior?.nums ?? {})) {
7398
+ const current = next.nums[id];
7399
+ if (!current || JSON.stringify(withoutStarts(current)) !== JSON.stringify(withoutStarts(previous)))
7400
+ throw new Error(
7401
+ `Cannot edit numbering definition num "${id}" except its supported start overrides.`
7402
+ );
7403
+ for (const key of /* @__PURE__ */ new Set([
7404
+ ...Object.keys(previous.levelOverrides ?? {}),
7405
+ ...Object.keys(current.levelOverrides ?? {})
7406
+ ])) {
7407
+ const level = Number(key);
7408
+ const old = previous.levelOverrides?.[level];
7409
+ const value = current.levelOverrides?.[level];
7410
+ if (old?.startOverride === value?.startOverride) continue;
7411
+ if (value?.startOverride === void 0)
7412
+ throw new Error("Removing a list start override is unsupported.");
7413
+ assertListStartValue(level, value.startOverride);
7414
+ if (String(level) !== key || !prior || !resolveNumberingLevel(prior, id, level))
7415
+ throw new Error("List instance or level does not exist.");
7416
+ if (old?.lvl || value.lvl)
7417
+ throw new Error("Changing starts with a full level override is unsupported.");
7418
+ changes.push({ numId: id, level, start: value.startOverride });
7419
+ }
7420
+ }
7421
+ return changes;
7422
+ }
7423
+ function patchNumberingStarts(doc, changes) {
7424
+ const sameNumber = (source, expected) => source !== void 0 && /^[+-]?\d+$/.test(source) && Number(source) === Number(expected);
7425
+ const prepared = changes.map((change) => {
7426
+ const nums = children2(doc.documentElement, "num").filter(
7427
+ (num2) => sameNumber(getW(num2, "numId"), change.numId)
7072
7428
  );
7073
- for (const key of ["marginTop", "marginRight", "marginBottom", "marginLeft"])
7074
- page.check(
7075
- key,
7076
- model.page?.[key],
7077
- (v) => typeof v === "number" && Number.isFinite(v) && (key === "marginTop" || key === "marginBottom" || v >= 0),
7078
- "must be a finite pixel size (converted to integer twips; left/right non-negative)"
7429
+ if (nums.length !== 1 || getW(nums[0], "numId") !== change.numId)
7430
+ throw new Error("Cannot patch an ambiguous or missing source list instance.");
7431
+ const num = nums[0];
7432
+ const overrides = children2(num, "lvlOverride").filter(
7433
+ (node) => sameNumber(getW(node, "ilvl"), String(change.level))
7079
7434
  );
7080
- validateBlocks(path("blocks"), model.blocks);
7081
- model.sections?.forEach((section, index) => {
7082
- const at = path(`sections[${index}]`);
7083
- validateSection(at, section);
7084
- for (const kind of ["headers", "footers"])
7085
- for (const [slot2, content] of Object.entries(section[kind] ?? {}))
7086
- validateBlocks(at.at(`.${kind}.${slot2}.blocks`), content?.blocks);
7435
+ if (overrides.length > 1) throw new Error("Cannot patch duplicate source level overrides.");
7436
+ const override = overrides[0];
7437
+ if (override && getW(override, "ilvl") !== String(change.level))
7438
+ throw new Error("Cannot patch a noncanonical source level override.");
7439
+ if (override && (children2(override, "lvl").length || children2(override, "startOverride").length > 1))
7440
+ throw new Error("Cannot patch a full or ambiguous source level override.");
7441
+ return { change, num, override };
7087
7442
  });
7088
- for (const kind of ["footnotes", "endnotes"])
7089
- model[kind]?.forEach(
7090
- (note, index) => validateBlocks(path(`${kind}[${index}].blocks`), note.blocks)
7091
- );
7092
- model.comments?.forEach(
7093
- (comment, index) => path(`comments[${index}]`).dateTime("date", comment.date)
7094
- );
7095
- path("model").hex("pageColor", model.pageColor);
7096
- path("model").enum("footnoteNumFmt", model.footnoteNumFmt, isStNumberFormat, "ST_NumberFormat");
7097
- path("model").enum("endnoteNumFmt", model.endnoteNumFmt, isStNumberFormat, "ST_NumberFormat");
7098
- if (model.numberingCatalog)
7099
- validateNumberingCatalog(path("numberingCatalog"), model.numberingCatalog);
7100
- return issues;
7101
- }
7102
- function assertValidDocumentModel(model) {
7103
- const issues = validateDocumentModel(model);
7104
- if (issues.length) throw new DocxModelValidationError(issues);
7105
- }
7106
-
7107
- // docx/numbering-parts.ts
7108
- var CT_NS = "http://schemas.openxmlformats.org/package/2006/content-types";
7109
- var REL_NS2 = "http://schemas.openxmlformats.org/package/2006/relationships";
7110
- var NUMBERING_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering";
7111
- var NUMBERING_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml";
7112
- async function registerNumberingPart(zip) {
7113
- const contentTypesPath = "[Content_Types].xml";
7114
- const contentTypesFile = zip.file(contentTypesPath);
7115
- const contentTypesXml = contentTypesFile ? await contentTypesFile.async("string") : `<?xml version="1.0"?><Types xmlns="${CT_NS}"/>`;
7116
- const contentTypesDoc = parseXml2(contentTypesXml);
7117
- const hasOverride = Array.from(contentTypesDoc.getElementsByTagNameNS(CT_NS, "Override")).some(
7118
- (element) => element.getAttribute("PartName") === "/word/numbering.xml"
7119
- );
7120
- if (!hasOverride) {
7121
- const override = contentTypesDoc.createElementNS(CT_NS, "Override");
7122
- override.setAttribute("PartName", "/word/numbering.xml");
7123
- override.setAttribute("ContentType", NUMBERING_CONTENT_TYPE);
7124
- contentTypesDoc.documentElement.appendChild(override);
7125
- zip.file(contentTypesPath, buildXml(contentTypesDoc));
7443
+ for (const { change, num, override: existing } of prepared) {
7444
+ const override = existing ?? makeW(doc, "lvlOverride");
7445
+ if (!existing) {
7446
+ override.setAttributeNS(WORD_NS, "w:ilvl", String(change.level));
7447
+ const after = children2(num, "lvlOverride").at(-1) ?? children2(num, "abstractNumId")[0];
7448
+ num.insertBefore(override, after?.nextSibling ?? null);
7449
+ }
7450
+ const start = children2(override, "startOverride")[0] ?? makeW(doc, "startOverride");
7451
+ start.setAttributeNS(WORD_NS, "w:val", String(change.start));
7452
+ if (!start.parentNode) override.insertBefore(start, override.firstChild);
7126
7453
  }
7127
- const relsPath = "word/_rels/document.xml.rels";
7128
- const relsFile = zip.file(relsPath);
7129
- const relsXml = relsFile ? await relsFile.async("string") : `<?xml version="1.0"?><Relationships xmlns="${REL_NS2}"/>`;
7130
- const relsDoc = parseXml2(relsXml);
7131
- const existingIds = new Set(
7132
- Array.from(relsDoc.getElementsByTagNameNS(REL_NS2, "Relationship")).map(
7133
- (element) => element.getAttribute("Id") ?? ""
7134
- )
7135
- );
7136
- let serial = 1;
7137
- while (existingIds.has(`rId${serial}`)) serial++;
7138
- const relationship = relsDoc.createElementNS(REL_NS2, "Relationship");
7139
- relationship.setAttribute("Id", `rId${serial}`);
7140
- relationship.setAttribute("Type", NUMBERING_RELATIONSHIP_TYPE);
7141
- relationship.setAttribute("Target", "numbering.xml");
7142
- relsDoc.documentElement.appendChild(relationship);
7143
- zip.file(relsPath, buildXml(relsDoc));
7144
7454
  }
7145
7455
 
7146
7456
  // docx/numbering-package.ts
@@ -7247,17 +7557,14 @@ async function applyNumberingCatalog(zip, model, binding) {
7247
7557
  throw new Error(
7248
7558
  `Cannot edit numbering definition abstractNum "${id}"; the original numbering.xml is preserved unchanged.`
7249
7559
  );
7250
- for (const id of Object.keys(prior?.nums ?? {}))
7251
- if (JSON.stringify(next.nums[id]) !== JSON.stringify(prior?.nums[id]))
7252
- throw new Error(
7253
- `Cannot edit numbering definition num "${id}"; the original numbering.xml is preserved unchanged.`
7254
- );
7560
+ const startChanges = numberingStartChanges(prior, next);
7255
7561
  const newAbstractIds = Object.keys(next.abstractNums).filter((id) => !prior?.abstractNums[id]);
7256
7562
  const newNumIds = Object.keys(next.nums).filter((id) => !prior?.nums[id]);
7257
- if (!newAbstractIds.length && !newNumIds.length) return;
7563
+ if (!newAbstractIds.length && !newNumIds.length && !startChanges.length) return;
7258
7564
  const existingFile = zip.file("word/numbering.xml");
7259
7565
  const doc = existingFile ? parseXml2(await existingFile.async("string")) : parseXml2(`<w:numbering xmlns:w="${WORD_NS}"/>`);
7260
7566
  const root = doc.documentElement;
7567
+ patchNumberingStarts(doc, startChanges);
7261
7568
  const cleanup = children2(root, "numIdMacAtCleanup")[0] ?? null;
7262
7569
  const firstNum = children2(root, "num")[0] ?? cleanup;
7263
7570
  for (const id of newAbstractIds) {
@@ -8126,23 +8433,31 @@ function createFieldTracker() {
8126
8433
  const stack = [];
8127
8434
  return (element, run) => {
8128
8435
  let resultInstr;
8436
+ let resultLocked;
8129
8437
  for (const child3 of Array.from(element.childNodes)) {
8130
8438
  if (!isElement(child3)) continue;
8131
8439
  if (named2(child3, "fldChar")) {
8132
8440
  const type = getW(child3, "fldCharType");
8133
- if (type === "begin") stack.push({ instr: "", inResult: false });
8134
- else if (type === "separate") {
8441
+ if (type === "begin") {
8442
+ const locked = parseFieldFlags(child3)?.locked;
8443
+ stack.push({ instr: "", inResult: false, ...locked !== void 0 && { locked } });
8444
+ } else if (type === "separate") {
8135
8445
  const top = stack.at(-1);
8136
8446
  if (top) top.inResult = true;
8137
8447
  } else if (type === "end") stack.pop();
8138
8448
  } else {
8139
8449
  const top = stack.at(-1);
8140
8450
  if (named2(child3, "instrText") && top && !top.inResult) top.instr += textContent(child3);
8141
- else if ((named2(child3, "t") || named2(child3, "delText")) && top?.inResult)
8451
+ else if ((named2(child3, "t") || named2(child3, "delText")) && top?.inResult) {
8142
8452
  resultInstr = top.instr.trim();
8453
+ resultLocked = top.locked;
8454
+ }
8143
8455
  }
8144
8456
  }
8145
- if (resultInstr) run.field = { instr: resultInstr };
8457
+ if (resultInstr) {
8458
+ run.field = { instr: resultInstr };
8459
+ if (resultLocked !== void 0) run.fieldFlags = { locked: resultLocked };
8460
+ }
8146
8461
  return run;
8147
8462
  };
8148
8463
  }
@@ -8153,7 +8468,11 @@ function storyFieldResults(container) {
8153
8468
  if (named2(element, "fldSimple") || named2(element, "txbxContent")) return;
8154
8469
  if (named2(element, "r")) {
8155
8470
  const run = trackField(element, { text: "" });
8156
- if (run.field) metadata.set(element, run.field);
8471
+ if (run.field)
8472
+ metadata.set(element, {
8473
+ field: run.field,
8474
+ ...run.fieldFlags && { fieldFlags: run.fieldFlags }
8475
+ });
8157
8476
  return;
8158
8477
  }
8159
8478
  for (const child3 of Array.from(element.childNodes)) if (isElement(child3)) visit(child3);
@@ -8245,7 +8564,11 @@ function parseRun2(node, revision) {
8245
8564
  if (breakKind) run.break = breakKind;
8246
8565
  if (noteReference) run.noteReference = noteReference;
8247
8566
  if (noteMark) run.noteMark = noteMark;
8248
- if (fieldChar) run.fieldChar = fieldChar;
8567
+ if (fieldChar) {
8568
+ run.fieldChar = fieldChar;
8569
+ const flags = parseFieldFlags(only);
8570
+ if (flags) run.fieldFlags = flags;
8571
+ }
8249
8572
  if (fieldCode !== void 0) run.fieldCode = fieldCode;
8250
8573
  const runRevision = revision ?? runFormatRevision(props);
8251
8574
  if (runRevision) run.revision = runRevision;
@@ -8264,8 +8587,11 @@ function parseParagraph2(node, id, fields) {
8264
8587
  (element, revision) => {
8265
8588
  const run = parseRun2(element, revision);
8266
8589
  if (!fields) return trackField(element, run);
8267
- const field = fields.get(element);
8268
- if (field) run.field = { ...field };
8590
+ const metadata = fields.get(element);
8591
+ if (metadata) {
8592
+ run.field = { ...metadata.field };
8593
+ if (metadata.fieldFlags) run.fieldFlags = { ...metadata.fieldFlags };
8594
+ }
8269
8595
  return run;
8270
8596
  },
8271
8597
  (item) => {
@@ -8287,20 +8613,23 @@ function parseParagraph2(node, id, fields) {
8287
8613
  );
8288
8614
  if (link) return results.map((run) => ({ ...run, link }));
8289
8615
  const field = { instr: instr.trim(), simple: true };
8616
+ const flags = parseFieldFlags(item);
8617
+ const fieldState = flags ? { fieldFlags: flags } : {};
8290
8618
  const fieldInstanceId = `${id}:simple-field-${simpleFieldIndex++}`;
8291
- if (!results.length) return [{ text: fieldPlaceholderText(instr), field, fieldInstanceId }];
8619
+ if (!results.length)
8620
+ return [{ text: fieldPlaceholderText(instr), field, fieldInstanceId, ...fieldState }];
8292
8621
  if (results.every(
8293
8622
  (run) => !run.text && !run.equation && !run.image && !run.break && !run.noteReference && !run.noteMark && !run.fieldChar && run.fieldCode === void 0
8294
8623
  )) {
8295
8624
  return [
8296
- { text: "", fieldChar: "begin" },
8625
+ { text: "", fieldChar: "begin", ...fieldState },
8297
8626
  { text: "", fieldCode: instr },
8298
8627
  { text: "", fieldChar: "separate" },
8299
8628
  ...results,
8300
8629
  { text: "", fieldChar: "end" }
8301
8630
  ];
8302
8631
  }
8303
- return results.map((run) => ({ ...run, field, fieldInstanceId }));
8632
+ return results.map((run) => ({ ...run, field, fieldInstanceId, ...fieldState }));
8304
8633
  },
8305
8634
  (hyperlink) => {
8306
8635
  if (!activeContext) return void 0;
@@ -8673,138 +9002,6 @@ async function parseDocumentParts(zip, body, blocks, drawings) {
8673
9002
  };
8674
9003
  }
8675
9004
 
8676
- // docx/numbering-parse.ts
8677
- var integer2 = (value, fallback) => parseInteger(value) ?? fallback;
8678
- var flag = (element) => onOffElement(element) === true;
8679
- function byName(root, local) {
8680
- return Array.from(root.getElementsByTagName("*")).filter(
8681
- (node) => node.nodeType === 1 && named2(node, local)
8682
- );
8683
- }
8684
- function parseMarkerFormat(rPr) {
8685
- if (!rPr) return void 0;
8686
- const format = {};
8687
- const family = getW(first2(rPr, "rFonts"), "ascii");
8688
- if (family) format.fontFamily = family;
8689
- const size = parseInteger(getW(first2(rPr, "sz"), "val"));
8690
- if (size !== void 0 && size > 0) format.fontSizeHalfPoints = size;
8691
- if (onOffElement(first2(rPr, "b")) === true) format.bold = true;
8692
- if (onOffElement(first2(rPr, "i")) === true) format.italic = true;
8693
- const color = getW(first2(rPr, "color"), "val");
8694
- if (color && /^[0-9a-f]{6}$/i.test(color)) format.color = `#${color.toLowerCase()}`;
8695
- return Object.keys(format).length ? format : void 0;
8696
- }
8697
- function parseNumberingLevel(lvl) {
8698
- const level = integer2(getW(lvl, "ilvl"), 0);
8699
- const start = integer2(getW(first2(lvl, "start"), "val"), 1);
8700
- const numFmt = enumValue(isStNumberFormat, getW(first2(lvl, "numFmt"), "val"), "w:numFmt") ?? "decimal";
8701
- const lvlText = getW(first2(lvl, "lvlText"), "val") ?? "";
8702
- const jc = getW(first2(lvl, "lvlJc"), "val");
8703
- const ind = first2(first2(lvl, "pPr"), "ind");
8704
- const suffRaw = getW(first2(lvl, "suff"), "val");
8705
- const result = { level, start, numFmt, lvlText };
8706
- if (!first2(lvl, "start")) result.startWasOmitted = true;
8707
- const paragraphStyleId = getW(first2(lvl, "pStyle"), "val");
8708
- if (paragraphStyleId) result.paragraphStyleId = paragraphStyleId;
8709
- if (jc === "left" || jc === "center" || jc === "right") result.lvlJc = jc;
8710
- const left = getW(ind, "left") ?? getW(ind, "start");
8711
- if (left !== void 0) result.indentLeftTwips = parseSignedTwips(left) ?? signedTwips(0);
8712
- const hanging = getW(ind, "hanging");
8713
- if (hanging !== void 0) result.hangingTwips = parseTwips(hanging) ?? twips(0);
8714
- const firstLine = getW(ind, "firstLine");
8715
- if (firstLine !== void 0) result.firstLineTwips = parseTwips(firstLine) ?? twips(0);
8716
- const tabs = first2(first2(lvl, "pPr"), "tabs");
8717
- const tab = tabs ? children2(tabs, "tab").find((stop) => getW(stop, "val") !== "clear") : void 0;
8718
- const tabPos = tab ? parseTwips(getW(tab, "pos")) : void 0;
8719
- if (tabPos !== void 0) result.tabStopTwips = tabPos;
8720
- if (flag(first2(lvl, "isLgl"))) result.isLgl = true;
8721
- const restart = getW(first2(lvl, "lvlRestart"), "val");
8722
- if (restart !== void 0) result.lvlRestart = integer2(restart, 0);
8723
- const marker = parseMarkerFormat(first2(lvl, "rPr"));
8724
- if (marker) result.markerFormat = marker;
8725
- result.suffix = suffRaw === "space" ? "space" : suffRaw === "nothing" ? "none" : "tab";
8726
- return result;
8727
- }
8728
- function parseAbstractNum(element) {
8729
- const id = getW(element, "abstractNumId");
8730
- if (!id) return void 0;
8731
- const levels = {};
8732
- for (const lvl of children2(element, "lvl")) {
8733
- const parsed = parseNumberingLevel(lvl);
8734
- levels[parsed.level] = parsed;
8735
- }
8736
- return { id, levels };
8737
- }
8738
- function parseNum(element) {
8739
- const id = getW(element, "numId");
8740
- if (!id) return void 0;
8741
- const abstractNumId = getW(first2(element, "abstractNumId"), "val") ?? "";
8742
- const levelOverrides = {};
8743
- for (const override of children2(element, "lvlOverride")) {
8744
- const level = integer2(getW(override, "ilvl"), 0);
8745
- const entry = {};
8746
- const startOverride = getW(first2(override, "startOverride"), "val");
8747
- if (startOverride !== void 0) entry.startOverride = integer2(startOverride, 1);
8748
- const lvl = first2(override, "lvl");
8749
- if (lvl) entry.lvl = parseNumberingLevel(lvl);
8750
- if (Object.keys(entry).length) levelOverrides[level] = entry;
8751
- }
8752
- return {
8753
- id,
8754
- abstractNumId,
8755
- ...Object.keys(levelOverrides).length ? { levelOverrides } : {}
8756
- };
8757
- }
8758
- function parseNumberingCatalog(xml) {
8759
- const document = parseXml2(xml);
8760
- const root = document.documentElement;
8761
- const abstractNums = {};
8762
- const warnings = [];
8763
- for (const element of byName(root, "abstractNum")) {
8764
- const parsed = parseAbstractNum(element);
8765
- if (!parsed) continue;
8766
- abstractNums[parsed.id] = parsed;
8767
- const link = getW(first2(element, "numStyleLink"), "val");
8768
- if (link)
8769
- warnings.push(
8770
- `Numbering definition abstractNum ${parsed.id} links to style "${link}"; style-linked numbering levels are not resolved.`
8771
- );
8772
- if (byName(element, "lvlPicBulletId").length)
8773
- warnings.push(
8774
- `Numbering definition abstractNum ${parsed.id} uses a picture bullet; picture bullets are not rendered.`
8775
- );
8776
- }
8777
- const nums = {};
8778
- for (const element of byName(root, "num")) {
8779
- const parsed = parseNum(element);
8780
- if (parsed) nums[parsed.id] = parsed;
8781
- }
8782
- return { abstractNums, nums, warnings: [...new Set(warnings)] };
8783
- }
8784
- function resolveNumberingLevel(catalog, numId, level) {
8785
- const num = catalog.nums[numId];
8786
- if (!num) return void 0;
8787
- const override = num.levelOverrides?.[level];
8788
- const sourceAbstract = catalog.abstractNums[num.abstractNumId]?.levels[level];
8789
- const abstract = sourceAbstract?.startWasOmitted && sourceAbstract.start === 1 ? { ...sourceAbstract, start: 0 } : sourceAbstract;
8790
- let base = override?.lvl ?? abstract;
8791
- if (!base) return void 0;
8792
- if (override?.lvl) {
8793
- const { lvlRestart: _ignored, ...properties } = base;
8794
- base = {
8795
- ...properties,
8796
- ...abstract?.lvlRestart !== void 0 ? { lvlRestart: abstract.lvlRestart } : {}
8797
- };
8798
- }
8799
- let start = override?.startOverride ?? base.start;
8800
- if (override?.lvl) {
8801
- if (abstract?.lvlRestart === 0 && override.startOverride === void 0) start = abstract.start;
8802
- else if (!override.lvl.startWasOmitted || override.lvl.start !== 1) start = override.lvl.start;
8803
- else start = override.startOverride ?? 0;
8804
- }
8805
- return start !== base.start ? { ...base, start } : base;
8806
- }
8807
-
8808
9005
  // docx/comments.ts
8809
9006
  var W14_NS2 = "http://schemas.microsoft.com/office/word/2010/wordml";
8810
9007
  var W15_NS2 = "http://schemas.microsoft.com/office/word/2012/wordml";
@@ -9039,7 +9236,7 @@ async function readPackage(input) {
9039
9236
  const themeFile = zip.file("word/theme/theme1.xml");
9040
9237
  const settingsFile = zip.file("word/settings.xml");
9041
9238
  if (themeFile) {
9042
- model.theme = parseTheme(await themeFile.async("string"));
9239
+ model.theme = parseTheme2(await themeFile.async("string"));
9043
9240
  if (settingsFile) {
9044
9241
  const settingsXml = await settingsFile.async("string");
9045
9242
  model.theme.colorMapping = withParseWarnings(
@@ -9157,32 +9354,12 @@ async function loadDocx(input) {
9157
9354
  }
9158
9355
 
9159
9356
  // docx/diagram-theme.ts
9160
- var DEFAULT_MAPPING2 = {
9161
- bg1: "lt1",
9162
- tx1: "dk1",
9163
- bg2: "lt2",
9164
- tx2: "dk2"
9165
- };
9166
- var SLOTS = /* @__PURE__ */ new Set([
9167
- "dk1",
9168
- "lt1",
9169
- "dk2",
9170
- "lt2",
9171
- "accent1",
9172
- "accent2",
9173
- "accent3",
9174
- "accent4",
9175
- "accent5",
9176
- "accent6",
9177
- "hlink",
9178
- "folHlink"
9179
- ]);
9180
9357
  function diagramColorTheme(theme) {
9181
9358
  return {
9182
9359
  scheme(name) {
9183
9360
  if (!theme) return void 0;
9184
- const mapped = name in DEFAULT_MAPPING2 ? theme.colorMapping[name] ?? DEFAULT_MAPPING2[name] : SLOTS.has(name) ? name : void 0;
9185
- const hex = mapped ? theme.colors[mapped] : void 0;
9361
+ const slot2 = themeColorSlotFor(name, theme.colorMapping);
9362
+ const hex = slot2 ? theme.colors[slot2] : void 0;
9186
9363
  return hex ? `#${hex.replace(/^#/, "").toUpperCase()}` : void 0;
9187
9364
  }
9188
9365
  };
@@ -10797,6 +10974,7 @@ exports.halfPointsToPoints = halfPointsToPoints;
10797
10974
  exports.headingLevel = headingLevel;
10798
10975
  exports.headingListLevels = headingListLevels;
10799
10976
  exports.isCaptionOf = isCaptionOf;
10977
+ exports.isFieldLocked = isFieldLocked;
10800
10978
  exports.isHeadingListKind = isHeadingListKind;
10801
10979
  exports.isLigatures = isLigatures;
10802
10980
  exports.isRunHiddenForReview = isRunHiddenForReview;
@@ -10930,7 +11108,7 @@ exports.parseSignedHalfPoints = parseSignedHalfPoints;
10930
11108
  exports.parseSignedTwips = parseSignedTwips;
10931
11109
  exports.parseTableStyleCatalog = parseTableStyleCatalog;
10932
11110
  exports.parseTextScale = parseTextScale;
10933
- exports.parseTheme = parseTheme;
11111
+ exports.parseTheme = parseTheme2;
10934
11112
  exports.parseTintShade = parseTintShade;
10935
11113
  exports.parseTwips = parseTwips;
10936
11114
  exports.parseUnsignedInteger = parseUnsignedInteger;
@@ -10966,6 +11144,7 @@ exports.sectionsFromLayout = sectionsFromLayout;
10966
11144
  exports.sectionsOf = sectionsOf;
10967
11145
  exports.setColumns = setColumns;
10968
11146
  exports.setLineNumbering = setLineNumbering;
11147
+ exports.setListStartOverride = setListStartOverride;
10969
11148
  exports.setMargins = setMargins;
10970
11149
  exports.setOrientation = setOrientation;
10971
11150
  exports.setPageNumbering = setPageNumbering;