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
@@ -1448,265 +1448,641 @@ function resolveRunFormatting(run, context = {}) {
1448
1448
  return result;
1449
1449
  }
1450
1450
 
1451
- // docx/theme.ts
1452
- var DRAWING_NS = "http://schemas.openxmlformats.org/drawingml/2006/main";
1453
- var SCHEME_ORDER = [
1454
- "dk1",
1455
- "lt1",
1456
- "dk2",
1457
- "lt2",
1458
- "accent1",
1459
- "accent2",
1460
- "accent3",
1461
- "accent4",
1462
- "accent5",
1463
- "accent6",
1464
- "hlink",
1465
- "folHlink"
1466
- ];
1467
- function drawingChild(parent, local) {
1468
- if (!parent) return void 0;
1469
- for (const node of Array.from(parent.childNodes)) {
1470
- const element = node;
1471
- if (element.nodeType === 1 && element.localName === local && element.namespaceURI === DRAWING_NS)
1472
- return element;
1473
- }
1474
- return void 0;
1475
- }
1476
- function colorOf(slot2) {
1477
- const srgb = drawingChild(slot2, "srgbClr");
1478
- if (srgb) return srgb.getAttribute("val")?.toUpperCase() || void 0;
1479
- const sys = drawingChild(slot2, "sysClr");
1480
- if (sys) return sys.getAttribute("lastClr")?.toUpperCase() || void 0;
1481
- return void 0;
1451
+ // color/color-primitives.ts
1452
+ function clampUnitInterval(value) {
1453
+ return Math.min(1, Math.max(0, value));
1482
1454
  }
1483
- function fontSetOf(element) {
1484
- if (!element) return {};
1485
- const latin = drawingChild(element, "latin")?.getAttribute("typeface") || void 0;
1486
- const ea = drawingChild(element, "ea")?.getAttribute("typeface") || void 0;
1487
- const cs = drawingChild(element, "cs")?.getAttribute("typeface") || void 0;
1455
+ function hexToRgbChannels(color) {
1456
+ const normalized = color.replace("#", "");
1457
+ if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {
1458
+ return null;
1459
+ }
1488
1460
  return {
1489
- ...latin ? { latin } : {},
1490
- ...ea ? { eastAsia: ea } : {},
1491
- ...cs ? { complexScript: cs } : {}
1461
+ r: Number.parseInt(normalized.slice(0, 2), 16),
1462
+ g: Number.parseInt(normalized.slice(2, 4), 16),
1463
+ b: Number.parseInt(normalized.slice(4, 6), 16)
1492
1464
  };
1493
1465
  }
1494
- function parseTheme(xml) {
1495
- const document = parseXml2(xml);
1496
- const root = document.documentElement;
1497
- const clrScheme = Array.from(root.getElementsByTagNameNS(DRAWING_NS, "clrScheme"))[0];
1498
- const colors = {};
1499
- for (const slotName of SCHEME_ORDER) {
1500
- const slot2 = drawingChild(clrScheme, slotName);
1501
- const value = colorOf(slot2);
1502
- if (value) colors[slotName] = value;
1503
- }
1504
- const fontScheme = Array.from(root.getElementsByTagNameNS(DRAWING_NS, "fontScheme"))[0];
1505
- const major = drawingChild(fontScheme, "majorFont");
1506
- const minor = drawingChild(fontScheme, "minorFont");
1507
- return { colors, colorMapping: {}, fonts: { major: fontSetOf(major), minor: fontSetOf(minor) } };
1466
+ function percentDivisorFor(text) {
1467
+ return text.endsWith("%") ? 100 : 1e5;
1508
1468
  }
1509
- var MAPPING_KEYS = ["bg1", "tx1", "bg2", "tx2"];
1510
- var TOKEN_TO_SLOT = {
1511
- dark1: "dk1",
1512
- light1: "lt1",
1513
- dark2: "dk2",
1514
- light2: "lt2",
1515
- accent1: "accent1",
1516
- accent2: "accent2",
1517
- accent3: "accent3",
1518
- accent4: "accent4",
1519
- accent5: "accent5",
1520
- accent6: "accent6",
1521
- hyperlink: "hlink",
1522
- followedHyperlink: "folHlink"
1523
- };
1524
- function parseColorSchemeMapping(xml) {
1525
- const document = parseXml2(xml);
1526
- const mapping = Array.from(document.getElementsByTagNameNS(WORD_NS, "clrSchemeMapping"))[0];
1527
- const result = {};
1528
- if (!mapping) return result;
1529
- for (const key of MAPPING_KEYS) {
1530
- const value = enumValue(
1531
- isStWmlColorSchemeIndex,
1532
- getW(mapping, key),
1533
- `w:clrSchemeMapping/@w:${key}`
1534
- );
1535
- if (value) result[key] = TOKEN_TO_SLOT[value];
1469
+ function parseOoxmlPercent(value) {
1470
+ const text = String(value ?? "").trim();
1471
+ const divisor = percentDivisorFor(text);
1472
+ const magnitude = Number.parseFloat(divisor === 100 ? text.slice(0, -1) : text);
1473
+ if (!Number.isFinite(magnitude)) {
1474
+ return void 0;
1536
1475
  }
1537
- return result;
1476
+ return magnitude / divisor;
1538
1477
  }
1539
-
1540
- // docx/theme-color.ts
1541
- function isThemeColorToken(value) {
1542
- return isStThemeColor(value);
1478
+ function parseDrawingPercent(value) {
1479
+ const parsed = parseOoxmlPercent(value);
1480
+ return parsed === void 0 ? void 0 : clampUnitInterval(parsed);
1543
1481
  }
1544
- var TOKEN_TO_SLOT2 = {
1545
- dark1: "dk1",
1546
- light1: "lt1",
1547
- dark2: "dk2",
1548
- light2: "lt2",
1549
- accent1: "accent1",
1550
- accent2: "accent2",
1551
- accent3: "accent3",
1552
- accent4: "accent4",
1553
- accent5: "accent5",
1554
- accent6: "accent6",
1555
- hyperlink: "hlink",
1556
- followedHyperlink: "folHlink"
1557
- };
1558
- var DEFAULT_MAPPING = {
1559
- bg1: "lt1",
1560
- tx1: "dk1",
1561
- bg2: "lt2",
1562
- tx2: "dk2"
1563
- };
1564
- function resolveThemeColorToken(token, theme) {
1565
- const logical = {
1566
- background1: "bg1",
1567
- text1: "tx1",
1568
- background2: "bg2",
1569
- text2: "tx2"
1570
- };
1571
- const logicalKey = logical[token];
1572
- if (logicalKey) {
1573
- const slot3 = theme.colorMapping[logicalKey] ?? DEFAULT_MAPPING[logicalKey];
1574
- return theme.colors[slot3];
1482
+ function scrgbLinearToSrgb8(linear) {
1483
+ const l = Math.min(1, Math.max(0, linear));
1484
+ const companded = l <= 31308e-7 ? 12.92 * l : 1.055 * l ** (1 / 2.4) - 0.055;
1485
+ return Math.min(255, Math.max(0, Math.round(companded * 255)));
1486
+ }
1487
+ function toHex(value) {
1488
+ return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
1489
+ }
1490
+ function rgbToHsl(r, g, b) {
1491
+ const rN = r / 255;
1492
+ const gN = g / 255;
1493
+ const bN = b / 255;
1494
+ const cMax = Math.max(rN, gN, bN);
1495
+ const cMin = Math.min(rN, gN, bN);
1496
+ const delta = cMax - cMin;
1497
+ const l = (cMax + cMin) / 2;
1498
+ let s = 0;
1499
+ if (delta !== 0) {
1500
+ s = delta / (1 - Math.abs(2 * l - 1));
1575
1501
  }
1576
- const slot2 = TOKEN_TO_SLOT2[token];
1577
- return slot2 ? theme.colors[slot2] : void 0;
1502
+ let h = 0;
1503
+ if (delta !== 0) {
1504
+ if (cMax === rN) {
1505
+ h = 60 * ((gN - bN) / delta % 6);
1506
+ } else if (cMax === gN) {
1507
+ h = 60 * ((bN - rN) / delta + 2);
1508
+ } else {
1509
+ h = 60 * ((rN - gN) / delta + 4);
1510
+ }
1511
+ }
1512
+ if (h < 0) {
1513
+ h += 360;
1514
+ }
1515
+ return { h, s: clampUnitInterval(s), l: clampUnitInterval(l) };
1578
1516
  }
1579
- function hexToRgb(hex) {
1580
- const normalized = hex.replace(/^#/, "");
1581
- if (!/^[0-9a-fA-F]{6}$/.test(normalized)) return null;
1517
+ function hslToRgb(h, s, l, roundChannel = Math.round, options) {
1518
+ const sC = clampUnitInterval(s);
1519
+ const lC = clampUnitInterval(l);
1520
+ const hN = (h % 360 + 360) % 360;
1521
+ const c = (1 - Math.abs(2 * lC - 1)) * sC;
1522
+ const x = c * (1 - Math.abs(hN / 60 % 2 - 1));
1523
+ const m = lC - c / 2;
1524
+ let rP = 0;
1525
+ let gP = 0;
1526
+ let bP = 0;
1527
+ if (hN < 60) {
1528
+ rP = c;
1529
+ gP = x;
1530
+ bP = 0;
1531
+ } else if (hN < 120) {
1532
+ rP = x;
1533
+ gP = c;
1534
+ bP = 0;
1535
+ } else if (hN < 180) {
1536
+ rP = 0;
1537
+ gP = c;
1538
+ bP = x;
1539
+ } else if (hN < 240) {
1540
+ rP = 0;
1541
+ gP = x;
1542
+ bP = c;
1543
+ } else if (hN < 300) {
1544
+ rP = x;
1545
+ gP = 0;
1546
+ bP = c;
1547
+ } else {
1548
+ rP = c;
1549
+ gP = 0;
1550
+ bP = x;
1551
+ }
1582
1552
  return {
1583
- r: Number.parseInt(normalized.slice(0, 2), 16),
1584
- g: Number.parseInt(normalized.slice(2, 4), 16),
1585
- b: Number.parseInt(normalized.slice(4, 6), 16)
1553
+ r: roundChannel((rP + m) * 255),
1554
+ g: roundChannel((gP + m) * 255),
1555
+ b: roundChannel((bP + m) * 255)
1586
1556
  };
1587
1557
  }
1588
- function toHex(value) {
1589
- return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
1558
+ function parseDrawingFraction(value) {
1559
+ return parseOoxmlPercent(value);
1590
1560
  }
1591
- function srgbToLinear(channel) {
1592
- const c = Math.min(1, Math.max(0, channel / 255));
1561
+ function parseDrawingHueDegrees(value) {
1562
+ const parsed = Number.parseFloat(String(value ?? "").trim());
1563
+ if (!Number.isFinite(parsed)) {
1564
+ return void 0;
1565
+ }
1566
+ return parsed / 6e4;
1567
+ }
1568
+
1569
+ // color/color-linear.ts
1570
+ function srgb255ToLinear(channel) {
1571
+ const c = clampUnitInterval(channel / 255);
1593
1572
  return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
1594
1573
  }
1595
- function linearToSrgb(linear) {
1596
- const c = Math.min(1, Math.max(0, linear));
1574
+ function linearToSrgb255(linear) {
1575
+ const c = clampUnitInterval(linear);
1597
1576
  return 255 * (c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055);
1598
1577
  }
1599
- function applyThemeShade(hex, fraction) {
1600
- const rgb = hexToRgb(hex);
1601
- if (!rgb) return hex;
1602
- const mix = (channel) => linearToSrgb(srgbToLinear(channel) * fraction);
1603
- return `#${toHex(mix(rgb.r))}${toHex(mix(rgb.g))}${toHex(mix(rgb.b))}`;
1578
+
1579
+ // drawingml/dom.ts
1580
+ function attributeReader(element) {
1581
+ return (name) => {
1582
+ if (!element) return void 0;
1583
+ const direct = element.getAttribute(name);
1584
+ if (direct !== null) return direct;
1585
+ const attributes = element.attributes;
1586
+ for (let index = 0; index < attributes.length; index++) {
1587
+ const candidate = attributes.item(index);
1588
+ if (candidate && candidate.localName === name) return candidate.value;
1589
+ }
1590
+ return void 0;
1591
+ };
1604
1592
  }
1605
- function applyThemeTint(hex, fraction) {
1606
- const rgb = hexToRgb(hex);
1607
- if (!rgb) return hex;
1608
- const mix = (channel) => linearToSrgb(1 - (1 - srgbToLinear(channel)) * fraction);
1609
- return `#${toHex(mix(rgb.r))}${toHex(mix(rgb.g))}${toHex(mix(rgb.b))}`;
1593
+ function stringAttribute(element, name) {
1594
+ const value = attributeReader(element)(name)?.trim();
1595
+ return value ? value : void 0;
1610
1596
  }
1611
- function fractionToThemeByte(fraction) {
1612
- return toHex(Math.round(Math.min(1, Math.max(0, fraction)) * 255));
1597
+ function integerAttribute(element, name) {
1598
+ const parsed = Number.parseInt(attributeReader(element)(name) ?? "", 10);
1599
+ return Number.isFinite(parsed) ? parsed : void 0;
1613
1600
  }
1614
- function resolveThemeColorReference(ref, theme) {
1615
- const base = resolveThemeColorToken(ref.token, theme);
1616
- if (!base) return void 0;
1617
- let hex = `#${base.replace(/^#/, "")}`;
1618
- if (ref.shade !== void 0) hex = applyThemeShade(hex, ref.shade);
1619
- if (ref.tint !== void 0) hex = applyThemeTint(hex, ref.tint);
1620
- return hex;
1601
+ function booleanAttribute(element, name) {
1602
+ const value = attributeReader(element)(name)?.trim().toLowerCase();
1603
+ if (value === "1" || value === "true") return true;
1604
+ if (value === "0" || value === "false") return false;
1605
+ return void 0;
1606
+ }
1607
+ function descendants(root, local) {
1608
+ const result = [];
1609
+ const visit = (node) => {
1610
+ for (const child3 of Array.from(node.childNodes)) {
1611
+ if (!isElement(child3)) continue;
1612
+ if (child3.localName === local) result.push(child3);
1613
+ visit(child3);
1614
+ }
1615
+ };
1616
+ visit(root);
1617
+ return result;
1621
1618
  }
1622
1619
 
1623
- // opc/relationship-types.ts
1624
- var BASE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
1625
- var RELATIONSHIP_TYPES = {
1626
- image: `${BASE}/image`,
1627
- hyperlink: `${BASE}/hyperlink`,
1628
- diagramData: `${BASE}/diagramData`,
1629
- diagramLayout: `${BASE}/diagramLayout`,
1630
- diagramQuickStyle: `${BASE}/diagramQuickStyle`,
1631
- diagramColors: `${BASE}/diagramColors`,
1632
- diagramDrawing: "http://schemas.microsoft.com/office/2007/relationships/diagramDrawing"};
1633
-
1634
- // opc/relationships.ts
1635
- function parseRelationships(xml) {
1636
- const map = /* @__PURE__ */ new Map();
1637
- if (!xml) return map;
1638
- const root = parseXml(xml).documentElement;
1639
- for (const node of elements(root)) {
1640
- if (node.localName !== "Relationship") continue;
1641
- const id = node.getAttribute("Id");
1642
- const target = node.getAttribute("Target");
1643
- if (!id || target == null) continue;
1644
- map.set(id, {
1645
- id,
1646
- type: node.getAttribute("Type") ?? "",
1647
- target,
1648
- mode: node.getAttribute("TargetMode") === "External" ? "External" : "Internal"
1649
- });
1620
+ // drawingml/drawing-color.ts
1621
+ var COLOR_ELEMENTS = {
1622
+ srgbClr: "srgb",
1623
+ schemeClr: "scheme",
1624
+ sysClr: "system",
1625
+ prstClr: "preset",
1626
+ scrgbClr: "scrgb",
1627
+ hslClr: "hsl"
1628
+ };
1629
+ function colorValue(kind, element) {
1630
+ const attribute = (name) => element.getAttribute(name) ?? "";
1631
+ if (kind === "scrgb") return `${attribute("r")},${attribute("g")},${attribute("b")}`;
1632
+ if (kind === "hsl") return `${attribute("hue")},${attribute("sat")},${attribute("lum")}`;
1633
+ return attribute("val");
1634
+ }
1635
+ function parseDrawingColorIn(container) {
1636
+ if (!container) return void 0;
1637
+ for (const element of elements(container)) {
1638
+ const kind = COLOR_ELEMENTS[element.localName];
1639
+ if (!kind || element.namespaceURI && element.namespaceURI !== NS.a) continue;
1640
+ return parseDrawingColor(element);
1650
1641
  }
1651
- return map;
1642
+ return void 0;
1652
1643
  }
1653
- var escapeAttr = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
1654
- function buildRelationshipsXml(relationships) {
1655
- const items = Array.from(relationships).map(([id, rel]) => {
1656
- const mode = rel.mode === "External" ? ' TargetMode="External"' : "";
1657
- return `<Relationship Id="${escapeAttr(id)}" Type="${escapeAttr(rel.type)}" Target="${escapeAttr(rel.target)}"${mode}/>`;
1658
- }).join("");
1659
- return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="${NS.rels}">${items}</Relationships>`;
1644
+ function parseDrawingColor(element) {
1645
+ const kind = COLOR_ELEMENTS[element.localName];
1646
+ if (!kind) return void 0;
1647
+ const color = {
1648
+ kind,
1649
+ value: colorValue(kind, element),
1650
+ transforms: elements(element).map((child3) => ({
1651
+ name: child3.localName,
1652
+ value: child3.getAttribute("val") ?? ""
1653
+ }))
1654
+ };
1655
+ const fallback = kind === "system" ? element.getAttribute("lastClr") : null;
1656
+ if (fallback) color.fallback = fallback;
1657
+ return color;
1660
1658
  }
1661
- function resolvePartPath(basePart, target) {
1662
- if (target.startsWith("/")) return target.slice(1);
1663
- const baseDir = basePart.slice(0, basePart.lastIndexOf("/") + 1);
1664
- const resolved = [];
1665
- for (const segment of `${baseDir}${target}`.split("/")) {
1666
- if (segment === "." || segment === "") continue;
1667
- if (segment === "..") resolved.pop();
1668
- else resolved.push(segment);
1659
+ function parseDrawingColorList(container) {
1660
+ if (!container) return [];
1661
+ return elements(container).flatMap((element) => {
1662
+ const color = parseDrawingColor(element);
1663
+ return color ? [color] : [];
1664
+ });
1665
+ }
1666
+ var PRESET_COLORS = {
1667
+ black: "#000000",
1668
+ white: "#FFFFFF",
1669
+ red: "#FF0000",
1670
+ green: "#008000",
1671
+ blue: "#0000FF",
1672
+ yellow: "#FFFF00",
1673
+ gray: "#808080",
1674
+ grey: "#808080"
1675
+ };
1676
+ function baseHex(color, theme) {
1677
+ switch (color.kind) {
1678
+ case "srgb":
1679
+ return /^[0-9a-f]{6}$/i.test(color.value) ? `#${color.value.toUpperCase()}` : void 0;
1680
+ case "scheme":
1681
+ return theme?.scheme(color.value);
1682
+ case "system":
1683
+ return color.fallback && /^[0-9a-f]{6}$/i.test(color.fallback) ? `#${color.fallback.toUpperCase()}` : void 0;
1684
+ case "preset":
1685
+ return PRESET_COLORS[color.value];
1686
+ case "scrgb": {
1687
+ const [r, g, b] = color.value.split(",").map((part) => parseDrawingFraction(part));
1688
+ if (r === void 0 || g === void 0 || b === void 0) return void 0;
1689
+ return `#${toHex(scrgbLinearToSrgb8(r))}${toHex(scrgbLinearToSrgb8(g))}${toHex(scrgbLinearToSrgb8(b))}`;
1690
+ }
1691
+ case "hsl": {
1692
+ const [h, s, l] = color.value.split(",");
1693
+ const hue = parseDrawingHueDegrees(h);
1694
+ const sat = parseDrawingFraction(s);
1695
+ const lum = parseDrawingFraction(l);
1696
+ if (hue === void 0 || sat === void 0 || lum === void 0) return void 0;
1697
+ const { r, g, b } = hslToRgb(hue, sat, lum);
1698
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
1699
+ }
1669
1700
  }
1670
- return resolved.join("/");
1671
1701
  }
1672
- function nextRelationshipId(used) {
1673
- let index = 1;
1674
- while (used.has(`rId${index}`)) index++;
1675
- return `rId${index}`;
1702
+ var APPLIED = /* @__PURE__ */ new Set([
1703
+ "alpha",
1704
+ "alphaMod",
1705
+ "alphaOff",
1706
+ "comp",
1707
+ "inv",
1708
+ "gray",
1709
+ "shade",
1710
+ "tint",
1711
+ "hue",
1712
+ "hueMod",
1713
+ "hueOff",
1714
+ "sat",
1715
+ "satMod",
1716
+ "satOff",
1717
+ "lum",
1718
+ "lumMod",
1719
+ "lumOff"
1720
+ ]);
1721
+ function resolveDrawingColor(color, theme, options) {
1722
+ const base = baseHex(color, theme);
1723
+ const rgb = base ? hexToRgbChannels(base) : null;
1724
+ if (!rgb) return void 0;
1725
+ let { r, g, b } = rgb;
1726
+ const find = (name) => color.transforms.find((entry) => entry.name === name)?.value;
1727
+ const has = (name) => color.transforms.some((entry) => entry.name === name);
1728
+ if (has("comp")) {
1729
+ const hsl = rgbToHsl(r, g, b);
1730
+ ({ r, g, b } = hslToRgb((hsl.h + 180) % 360, hsl.s, hsl.l));
1731
+ }
1732
+ if (has("inv")) [r, g, b] = [255 - r, 255 - g, 255 - b];
1733
+ if (has("gray")) r = g = b = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
1734
+ const shade = parseDrawingPercent(find("shade"));
1735
+ if (shade !== void 0) {
1736
+ r = linearToSrgb255(srgb255ToLinear(r) * shade);
1737
+ g = linearToSrgb255(srgb255ToLinear(g) * shade);
1738
+ b = linearToSrgb255(srgb255ToLinear(b) * shade);
1739
+ }
1740
+ const tint = parseDrawingPercent(find("tint"));
1741
+ if (tint !== void 0) {
1742
+ r = linearToSrgb255(1 - (1 - srgb255ToLinear(r)) * tint);
1743
+ g = linearToSrgb255(1 - (1 - srgb255ToLinear(g)) * tint);
1744
+ b = linearToSrgb255(1 - (1 - srgb255ToLinear(b)) * tint);
1745
+ }
1746
+ if (["hue", "hueMod", "hueOff", "sat", "satMod", "satOff", "lum", "lumMod", "lumOff"].some(has)) {
1747
+ const hsl = rgbToHsl(r, g, b);
1748
+ const wrap = (degrees) => (degrees % 360 + 360) % 360;
1749
+ const hueAbs = parseDrawingHueDegrees(find("hue"));
1750
+ if (hueAbs !== void 0) hsl.h = wrap(hueAbs);
1751
+ const hueMod = parseDrawingFraction(find("hueMod"));
1752
+ if (hueMod !== void 0) hsl.h = wrap(hsl.h * hueMod);
1753
+ const hueOff = parseDrawingHueDegrees(find("hueOff"));
1754
+ if (hueOff !== void 0) hsl.h = wrap(hsl.h + hueOff);
1755
+ const satAbs = parseDrawingFraction(find("sat"));
1756
+ if (satAbs !== void 0) hsl.s = clampUnitInterval(satAbs);
1757
+ const satMod = parseDrawingFraction(find("satMod"));
1758
+ if (satMod !== void 0) hsl.s = clampUnitInterval(hsl.s * satMod);
1759
+ const satOff = parseDrawingFraction(find("satOff"));
1760
+ if (satOff !== void 0) hsl.s = clampUnitInterval(hsl.s + satOff);
1761
+ const lumAbs = parseDrawingFraction(find("lum"));
1762
+ if (lumAbs !== void 0) hsl.l = clampUnitInterval(lumAbs);
1763
+ const lumMod = parseDrawingFraction(find("lumMod"));
1764
+ if (lumMod !== void 0) hsl.l = clampUnitInterval(hsl.l * lumMod);
1765
+ const lumOff = parseDrawingFraction(find("lumOff"));
1766
+ if (lumOff !== void 0) hsl.l = clampUnitInterval(hsl.l + lumOff);
1767
+ const round = Math.round;
1768
+ ({ r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l, round));
1769
+ }
1770
+ let alpha = parseDrawingPercent(find("alpha")) ?? 1;
1771
+ const alphaMod = parseDrawingFraction(find("alphaMod"));
1772
+ if (alphaMod !== void 0) alpha = clampUnitInterval(alpha * alphaMod);
1773
+ const alphaOff = parseDrawingFraction(find("alphaOff"));
1774
+ if (alphaOff !== void 0) alpha = clampUnitInterval(alpha + alphaOff);
1775
+ return {
1776
+ hex: `#${toHex(r)}${toHex(g)}${toHex(b)}`,
1777
+ alpha,
1778
+ unapplied: [...new Set(color.transforms.map((entry) => entry.name))].filter(
1779
+ (name) => !APPLIED.has(name)
1780
+ )
1781
+ };
1676
1782
  }
1677
- var getRelationshipId = (element) => relAttr(element, "id") || void 0;
1678
1783
 
1679
- // opc/content-types.ts
1680
- var escapeAttr2 = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
1681
- function parseContentTypes(xml) {
1682
- const defaults = /* @__PURE__ */ new Map();
1683
- const overrides = /* @__PURE__ */ new Map();
1684
- if (!xml) return { defaults, overrides };
1685
- for (const node of elements(parseXml(xml).documentElement)) {
1686
- const contentType = node.getAttribute("ContentType");
1687
- if (!contentType) continue;
1688
- if (node.localName === "Default") {
1689
- const extension = node.getAttribute("Extension");
1690
- if (extension) defaults.set(extension.toLowerCase(), contentType);
1691
- } else if (node.localName === "Override") {
1692
- const partName = node.getAttribute("PartName");
1693
- if (partName) overrides.set(partName, contentType);
1694
- }
1784
+ // drawingml/theme-model.ts
1785
+ var THEME_COLOR_SLOTS = [
1786
+ "dk1",
1787
+ "lt1",
1788
+ "dk2",
1789
+ "lt2",
1790
+ "accent1",
1791
+ "accent2",
1792
+ "accent3",
1793
+ "accent4",
1794
+ "accent5",
1795
+ "accent6",
1796
+ "hlink",
1797
+ "folHlink"
1798
+ ];
1799
+ var DEFAULT_THEME_COLOR_MAP = {
1800
+ bg1: "lt1",
1801
+ tx1: "dk1",
1802
+ bg2: "lt2",
1803
+ tx2: "dk2"
1804
+ };
1805
+
1806
+ // drawingml/theme.ts
1807
+ var SLOT_SET = new Set(THEME_COLOR_SLOTS);
1808
+ function isThemeColorSlot(value) {
1809
+ return SLOT_SET.has(value);
1810
+ }
1811
+ function nonEmpty(value) {
1812
+ return value ? value : void 0;
1813
+ }
1814
+ function parseThemeColorScheme(scheme) {
1815
+ const result = { colors: {} };
1816
+ if (!scheme) return result;
1817
+ const name = nonEmpty(scheme.getAttribute("name"));
1818
+ if (name) result.name = name;
1819
+ for (const slot2 of THEME_COLOR_SLOTS) {
1820
+ const color = parseDrawingColorIn(first(scheme, slot2, NS.a));
1821
+ if (color) result.colors[slot2] = color;
1695
1822
  }
1696
- return { defaults, overrides };
1823
+ return result;
1697
1824
  }
1698
- function contentTypeForPart(types, partName) {
1699
- const overridePath = partName.startsWith("/") ? partName : `/${partName}`;
1700
- const override = types.overrides.get(overridePath);
1701
- if (override) return override;
1702
- const extension = partName.split(".").pop()?.toLowerCase();
1703
- return extension ? types.defaults.get(extension) : void 0;
1825
+ function parseFontCollection(collection) {
1826
+ const result = { scripts: {} };
1827
+ if (!collection) return result;
1828
+ const typeface = (local) => nonEmpty(first(collection, local, NS.a)?.getAttribute("typeface"));
1829
+ const latin = typeface("latin");
1830
+ const eastAsia = typeface("ea");
1831
+ const complexScript = typeface("cs");
1832
+ if (latin) result.latin = latin;
1833
+ if (eastAsia) result.eastAsia = eastAsia;
1834
+ if (complexScript) result.complexScript = complexScript;
1835
+ for (const font of elements(collection)) {
1836
+ if (font.localName !== "font") continue;
1837
+ const script = nonEmpty(font.getAttribute("script"));
1838
+ const face = nonEmpty(font.getAttribute("typeface"));
1839
+ if (script && face && !Object.hasOwn(result.scripts, script)) result.scripts[script] = face;
1840
+ }
1841
+ return result;
1704
1842
  }
1705
- function buildContentTypesXml(types) {
1706
- const defaults = Array.from(types.defaults).map(
1707
- ([extension, type]) => `<Default Extension="${extension}" ContentType="${escapeAttr2(type)}"/>`
1708
- ).join("");
1709
- const overrides = Array.from(types.overrides).map(
1843
+ function parseThemeFontScheme(scheme) {
1844
+ const result = {
1845
+ major: parseFontCollection(first(scheme, "majorFont", NS.a)),
1846
+ minor: parseFontCollection(first(scheme, "minorFont", NS.a))
1847
+ };
1848
+ const name = nonEmpty(scheme?.getAttribute("name"));
1849
+ if (name) result.name = name;
1850
+ return result;
1851
+ }
1852
+ function rootOf(source) {
1853
+ return "documentElement" in source ? source.documentElement : source;
1854
+ }
1855
+ function parseTheme(source) {
1856
+ const root = rootOf(source);
1857
+ const holder = first(root, "themeElements", NS.a) ?? root;
1858
+ const theme = {
1859
+ colorScheme: parseThemeColorScheme(first(holder, "clrScheme", NS.a)),
1860
+ fontScheme: parseThemeFontScheme(first(holder, "fontScheme", NS.a))
1861
+ };
1862
+ const name = nonEmpty(root.getAttribute("name"));
1863
+ if (name) theme.name = name;
1864
+ return theme;
1865
+ }
1866
+
1867
+ // drawingml/theme-color.ts
1868
+ function isLogical(name) {
1869
+ return Object.hasOwn(DEFAULT_THEME_COLOR_MAP, name);
1870
+ }
1871
+ function themeColorSlotFor(name, colorMap = {}) {
1872
+ if (isLogical(name)) return colorMap[name] ?? DEFAULT_THEME_COLOR_MAP[name];
1873
+ if (!isThemeColorSlot(name)) return void 0;
1874
+ if (name === "dk1" || name === "lt1" || name === "dk2" || name === "lt2") return name;
1875
+ return colorMap[name] ?? name;
1876
+ }
1877
+ function themeSlotHex(color) {
1878
+ if (!color) return void 0;
1879
+ const value = color.kind === "srgb" ? color.value : color.kind === "system" ? color.fallback : void 0;
1880
+ return value ? value.toUpperCase() : void 0;
1881
+ }
1882
+
1883
+ // docx/theme.ts
1884
+ function fontSetOf(collection) {
1885
+ const { latin, eastAsia, complexScript } = collection;
1886
+ return {
1887
+ ...latin ? { latin } : {},
1888
+ ...eastAsia ? { eastAsia } : {},
1889
+ ...complexScript ? { complexScript } : {}
1890
+ };
1891
+ }
1892
+ function parseTheme2(xml) {
1893
+ const theme = parseTheme(parseXml2(xml));
1894
+ const colors = {};
1895
+ for (const slot2 of THEME_COLOR_SLOTS) {
1896
+ const value = themeSlotHex(theme.colorScheme.colors[slot2]);
1897
+ if (value) colors[slot2] = value;
1898
+ }
1899
+ const { major, minor } = theme.fontScheme;
1900
+ return { colors, colorMapping: {}, fonts: { major: fontSetOf(major), minor: fontSetOf(minor) } };
1901
+ }
1902
+ var MAPPING_KEYS = ["bg1", "tx1", "bg2", "tx2"];
1903
+ var TOKEN_TO_SLOT = {
1904
+ dark1: "dk1",
1905
+ light1: "lt1",
1906
+ dark2: "dk2",
1907
+ light2: "lt2",
1908
+ accent1: "accent1",
1909
+ accent2: "accent2",
1910
+ accent3: "accent3",
1911
+ accent4: "accent4",
1912
+ accent5: "accent5",
1913
+ accent6: "accent6",
1914
+ hyperlink: "hlink",
1915
+ followedHyperlink: "folHlink"
1916
+ };
1917
+ function parseColorSchemeMapping(xml) {
1918
+ const document = parseXml2(xml);
1919
+ const mapping = Array.from(document.getElementsByTagNameNS(WORD_NS, "clrSchemeMapping"))[0];
1920
+ const result = {};
1921
+ if (!mapping) return result;
1922
+ for (const key of MAPPING_KEYS) {
1923
+ const value = enumValue(
1924
+ isStWmlColorSchemeIndex,
1925
+ getW(mapping, key),
1926
+ `w:clrSchemeMapping/@w:${key}`
1927
+ );
1928
+ if (value) result[key] = TOKEN_TO_SLOT[value];
1929
+ }
1930
+ return result;
1931
+ }
1932
+
1933
+ // docx/theme-color.ts
1934
+ function isThemeColorToken(value) {
1935
+ return isStThemeColor(value);
1936
+ }
1937
+ var TOKEN_TO_SLOT2 = {
1938
+ dark1: "dk1",
1939
+ light1: "lt1",
1940
+ dark2: "dk2",
1941
+ light2: "lt2",
1942
+ accent1: "accent1",
1943
+ accent2: "accent2",
1944
+ accent3: "accent3",
1945
+ accent4: "accent4",
1946
+ accent5: "accent5",
1947
+ accent6: "accent6",
1948
+ hyperlink: "hlink",
1949
+ followedHyperlink: "folHlink"
1950
+ };
1951
+ function resolveThemeColorToken(token, theme) {
1952
+ const logical = {
1953
+ background1: "bg1",
1954
+ text1: "tx1",
1955
+ background2: "bg2",
1956
+ text2: "tx2"
1957
+ };
1958
+ const logicalKey = logical[token];
1959
+ if (logicalKey) {
1960
+ const slot3 = theme.colorMapping[logicalKey] ?? DEFAULT_THEME_COLOR_MAP[logicalKey];
1961
+ return theme.colors[slot3];
1962
+ }
1963
+ const slot2 = TOKEN_TO_SLOT2[token];
1964
+ return slot2 ? theme.colors[slot2] : void 0;
1965
+ }
1966
+ function hexToRgb(hex) {
1967
+ const normalized = hex.replace(/^#/, "");
1968
+ if (!/^[0-9a-fA-F]{6}$/.test(normalized)) return null;
1969
+ return {
1970
+ r: Number.parseInt(normalized.slice(0, 2), 16),
1971
+ g: Number.parseInt(normalized.slice(2, 4), 16),
1972
+ b: Number.parseInt(normalized.slice(4, 6), 16)
1973
+ };
1974
+ }
1975
+ function applyThemeShade(hex, fraction) {
1976
+ const rgb = hexToRgb(hex);
1977
+ if (!rgb) return hex;
1978
+ const mix = (channel) => linearToSrgb255(srgb255ToLinear(channel) * fraction);
1979
+ return `#${toHex(mix(rgb.r))}${toHex(mix(rgb.g))}${toHex(mix(rgb.b))}`;
1980
+ }
1981
+ function applyThemeTint(hex, fraction) {
1982
+ const rgb = hexToRgb(hex);
1983
+ if (!rgb) return hex;
1984
+ const mix = (channel) => linearToSrgb255(1 - (1 - srgb255ToLinear(channel)) * fraction);
1985
+ return `#${toHex(mix(rgb.r))}${toHex(mix(rgb.g))}${toHex(mix(rgb.b))}`;
1986
+ }
1987
+ function fractionToThemeByte(fraction) {
1988
+ return toHex(Math.round(Math.min(1, Math.max(0, fraction)) * 255));
1989
+ }
1990
+ function resolveThemeColorReference(ref, theme) {
1991
+ const base = resolveThemeColorToken(ref.token, theme);
1992
+ if (!base) return void 0;
1993
+ let hex = `#${base.replace(/^#/, "")}`;
1994
+ if (ref.shade !== void 0) hex = applyThemeShade(hex, ref.shade);
1995
+ if (ref.tint !== void 0) hex = applyThemeTint(hex, ref.tint);
1996
+ return hex;
1997
+ }
1998
+
1999
+ // opc/relationship-types.ts
2000
+ var BASE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
2001
+ var RELATIONSHIP_TYPES = {
2002
+ image: `${BASE}/image`,
2003
+ hyperlink: `${BASE}/hyperlink`,
2004
+ diagramData: `${BASE}/diagramData`,
2005
+ diagramLayout: `${BASE}/diagramLayout`,
2006
+ diagramQuickStyle: `${BASE}/diagramQuickStyle`,
2007
+ diagramColors: `${BASE}/diagramColors`,
2008
+ diagramDrawing: "http://schemas.microsoft.com/office/2007/relationships/diagramDrawing"};
2009
+
2010
+ // opc/relationships.ts
2011
+ function parseRelationships(xml) {
2012
+ const map = /* @__PURE__ */ new Map();
2013
+ if (!xml) return map;
2014
+ const root = parseXml(xml).documentElement;
2015
+ for (const node of elements(root)) {
2016
+ if (node.localName !== "Relationship") continue;
2017
+ const id = node.getAttribute("Id");
2018
+ const target = node.getAttribute("Target");
2019
+ if (!id || target == null) continue;
2020
+ map.set(id, {
2021
+ id,
2022
+ type: node.getAttribute("Type") ?? "",
2023
+ target,
2024
+ mode: node.getAttribute("TargetMode") === "External" ? "External" : "Internal"
2025
+ });
2026
+ }
2027
+ return map;
2028
+ }
2029
+ var escapeAttr = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
2030
+ function buildRelationshipsXml(relationships) {
2031
+ const items = Array.from(relationships).map(([id, rel]) => {
2032
+ const mode = rel.mode === "External" ? ' TargetMode="External"' : "";
2033
+ return `<Relationship Id="${escapeAttr(id)}" Type="${escapeAttr(rel.type)}" Target="${escapeAttr(rel.target)}"${mode}/>`;
2034
+ }).join("");
2035
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="${NS.rels}">${items}</Relationships>`;
2036
+ }
2037
+ function resolvePartPath(basePart, target) {
2038
+ if (target.startsWith("/")) return target.slice(1);
2039
+ const baseDir = basePart.slice(0, basePart.lastIndexOf("/") + 1);
2040
+ const resolved = [];
2041
+ for (const segment of `${baseDir}${target}`.split("/")) {
2042
+ if (segment === "." || segment === "") continue;
2043
+ if (segment === "..") resolved.pop();
2044
+ else resolved.push(segment);
2045
+ }
2046
+ return resolved.join("/");
2047
+ }
2048
+ function nextRelationshipId(used) {
2049
+ let index = 1;
2050
+ while (used.has(`rId${index}`)) index++;
2051
+ return `rId${index}`;
2052
+ }
2053
+ var getRelationshipId = (element) => relAttr(element, "id") || void 0;
2054
+
2055
+ // opc/content-types.ts
2056
+ var escapeAttr2 = (value) => value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
2057
+ function parseContentTypes(xml) {
2058
+ const defaults = /* @__PURE__ */ new Map();
2059
+ const overrides = /* @__PURE__ */ new Map();
2060
+ if (!xml) return { defaults, overrides };
2061
+ for (const node of elements(parseXml(xml).documentElement)) {
2062
+ const contentType = node.getAttribute("ContentType");
2063
+ if (!contentType) continue;
2064
+ if (node.localName === "Default") {
2065
+ const extension = node.getAttribute("Extension");
2066
+ if (extension) defaults.set(extension.toLowerCase(), contentType);
2067
+ } else if (node.localName === "Override") {
2068
+ const partName = node.getAttribute("PartName");
2069
+ if (partName) overrides.set(partName, contentType);
2070
+ }
2071
+ }
2072
+ return { defaults, overrides };
2073
+ }
2074
+ function contentTypeForPart(types, partName) {
2075
+ const overridePath = partName.startsWith("/") ? partName : `/${partName}`;
2076
+ const override = types.overrides.get(overridePath);
2077
+ if (override) return override;
2078
+ const extension = partName.split(".").pop()?.toLowerCase();
2079
+ return extension ? types.defaults.get(extension) : void 0;
2080
+ }
2081
+ function buildContentTypesXml(types) {
2082
+ const defaults = Array.from(types.defaults).map(
2083
+ ([extension, type]) => `<Default Extension="${extension}" ContentType="${escapeAttr2(type)}"/>`
2084
+ ).join("");
2085
+ const overrides = Array.from(types.overrides).map(
1710
2086
  ([part, type]) => `<Override PartName="${escapeAttr2(part)}" ContentType="${escapeAttr2(type)}"/>`
1711
2087
  ).join("");
1712
2088
  return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Types xmlns="${NS.contentTypes}">${defaults}${overrides}</Types>`;
@@ -3659,7 +4035,7 @@ var NAMED = {
3659
4035
  var POINT_TO_PX = 96 / 72;
3660
4036
  var WATERMARK_PREFIX = "PowerPlusWaterMarkObject";
3661
4037
  var DEFAULT_WATERMARK_COLOR = "#c0c0c0";
3662
- function colorOf2(value) {
4038
+ function colorOf(value) {
3663
4039
  const text = (value ?? "").trim().toLowerCase().split(/\s/)[0] ?? "";
3664
4040
  if (NAMED[text]) return NAMED[text];
3665
4041
  const hex = /^#?([0-9a-f]{6})$/.exec(text);
@@ -3680,7 +4056,7 @@ function parseWatermarkShape(shape) {
3680
4056
  const rotation = /rotation:\s*(-?[\d.]+)/i.exec(style);
3681
4057
  const spec = {
3682
4058
  text: path.getAttribute("string") ?? "",
3683
- color: colorOf2(shape.getAttribute("fillcolor")),
4059
+ color: colorOf(shape.getAttribute("fillcolor")),
3684
4060
  semitransparent: opacity !== null && opacity !== "" && opacity !== "1",
3685
4061
  layout: rotation && Math.abs(Number(rotation[1]) % 360) > 1 ? "diagonal" : "horizontal",
3686
4062
  ...family ? { fontFamily: family.trim() } : {}
@@ -3792,7 +4168,7 @@ var add = (parent, ...items) => {
3792
4168
  return parent;
3793
4169
  };
3794
4170
  var emu2 = (px3) => String(Math.max(1, Math.round(px3 * EMU_PER_PIXEL)));
3795
- var descendants = (root, ns, local) => Array.from(root.getElementsByTagNameNS(ns, local));
4171
+ var descendants2 = (root, ns, local) => Array.from(root.getElementsByTagNameNS(ns, local));
3796
4172
  function paragraphsFor(doc, lines) {
3797
4173
  return (lines.length ? lines : [""]).map((line) => {
3798
4174
  const paragraph = makeW(doc, "p");
@@ -3884,23 +4260,23 @@ function buildTextBoxDrawing(doc, image, docPrId) {
3884
4260
  }
3885
4261
  function isSimpleTextBox(graphicData, anchored) {
3886
4262
  if (!graphicData || anchored) return false;
3887
- const content = descendants(graphicData, W_NS, "txbxContent")[0];
4263
+ const content = descendants2(graphicData, W_NS, "txbxContent")[0];
3888
4264
  if (!content) return false;
3889
4265
  const plain = (node, allowed) => Array.from(node.childNodes).filter(isElement).every((child3) => child3.namespaceURI === W_NS && allowed.includes(child3.localName));
3890
- return plain(content, ["p"]) && descendants(content, W_NS, "p").every(
3891
- (paragraph) => plain(paragraph, ["r"]) && descendants(paragraph, W_NS, "r").every((run) => plain(run, ["t"]))
4266
+ return plain(content, ["p"]) && descendants2(content, W_NS, "p").every(
4267
+ (paragraph) => plain(paragraph, ["r"]) && descendants2(paragraph, W_NS, "r").every((run) => plain(run, ["t"]))
3892
4268
  );
3893
4269
  }
3894
4270
  function textBoxHasBorder(graphicData) {
3895
- const spPr = graphicData && descendants(graphicData, WPS_NS, "spPr")[0];
4271
+ const spPr = graphicData && descendants2(graphicData, WPS_NS, "spPr")[0];
3896
4272
  const ln = spPr && Array.from(spPr.getElementsByTagNameNS(A_NS, "ln"))[0];
3897
4273
  return Boolean(ln && !ln.getElementsByTagNameNS(A_NS, "noFill").length);
3898
4274
  }
3899
4275
  function patchTextBox(doc, drawing, image, base) {
3900
4276
  if (image.widthPx !== base.widthPx || image.heightPx !== base.heightPx)
3901
4277
  for (const node of [
3902
- ...descendants(drawing, WP_NS, "extent"),
3903
- ...descendants(drawing, A_NS, "ext").filter(
4278
+ ...descendants2(drawing, WP_NS, "extent"),
4279
+ ...descendants2(drawing, A_NS, "ext").filter(
3904
4280
  (ext) => ext.parentNode?.localName === "xfrm"
3905
4281
  )
3906
4282
  ]) {
@@ -3908,14 +4284,14 @@ function patchTextBox(doc, drawing, image, base) {
3908
4284
  node.setAttribute("cy", emu2(image.heightPx));
3909
4285
  }
3910
4286
  if (JSON.stringify(image.textBoxText) !== JSON.stringify(base.textBoxText)) {
3911
- const content = descendants(drawing, W_NS, "txbxContent")[0];
4287
+ const content = descendants2(drawing, W_NS, "txbxContent")[0];
3912
4288
  if (content) {
3913
4289
  for (const child3 of Array.from(content.childNodes)) content.removeChild(child3);
3914
4290
  add(content, ...paragraphsFor(doc, image.textBoxText ?? []));
3915
4291
  }
3916
4292
  }
3917
4293
  if (image.textBoxBorder !== false !== (base.textBoxBorder !== false)) {
3918
- const spPr = descendants(drawing, WPS_NS, "spPr")[0];
4294
+ const spPr = descendants2(drawing, WPS_NS, "spPr")[0];
3919
4295
  if (spPr) {
3920
4296
  for (const old of Array.from(spPr.childNodes).filter(
3921
4297
  (node) => isElement(node) && node.localName === "ln"
@@ -4078,47 +4454,6 @@ var DIAGRAM_RELATIONSHIP_TYPES = {
4078
4454
  drawing: RELATIONSHIP_TYPES.diagramDrawing
4079
4455
  };
4080
4456
 
4081
- // diagram/dom.ts
4082
- function attributeReader(element) {
4083
- return (name) => {
4084
- if (!element) return void 0;
4085
- const direct = element.getAttribute(name);
4086
- if (direct !== null) return direct;
4087
- const attributes = element.attributes;
4088
- for (let index = 0; index < attributes.length; index++) {
4089
- const candidate = attributes.item(index);
4090
- if (candidate && candidate.localName === name) return candidate.value;
4091
- }
4092
- return void 0;
4093
- };
4094
- }
4095
- function stringAttribute(element, name) {
4096
- const value = attributeReader(element)(name)?.trim();
4097
- return value ? value : void 0;
4098
- }
4099
- function integerAttribute(element, name) {
4100
- const parsed = Number.parseInt(attributeReader(element)(name) ?? "", 10);
4101
- return Number.isFinite(parsed) ? parsed : void 0;
4102
- }
4103
- function booleanAttribute(element, name) {
4104
- const value = attributeReader(element)(name)?.trim().toLowerCase();
4105
- if (value === "1" || value === "true") return true;
4106
- if (value === "0" || value === "false") return false;
4107
- return void 0;
4108
- }
4109
- function descendants2(root, local) {
4110
- const result = [];
4111
- const visit = (node) => {
4112
- for (const child3 of Array.from(node.childNodes)) {
4113
- if (!isElement(child3)) continue;
4114
- if (child3.localName === local) result.push(child3);
4115
- visit(child3);
4116
- }
4117
- };
4118
- visit(root);
4119
- return result;
4120
- }
4121
-
4122
4457
  // diagram/data-model.ts
4123
4458
  var TRANSITION_TYPES = /* @__PURE__ */ new Set(["parTrans", "sibTrans"]);
4124
4459
  var STRUCTURAL_TYPES = /* @__PURE__ */ new Set(["doc", "pres", "parTrans", "sibTrans"]);
@@ -4142,7 +4477,7 @@ function connectionLabel(connection, transitionText) {
4142
4477
  function textBodyParagraphs(body) {
4143
4478
  if (!body) return [];
4144
4479
  return children(body, "p", NS.a).map(
4145
- (paragraph) => descendants2(paragraph, "t").map((run) => run.textContent ?? "").join("")
4480
+ (paragraph) => descendants(paragraph, "t").map((run) => run.textContent ?? "").join("")
4146
4481
  );
4147
4482
  }
4148
4483
  function parsePoint(element) {
@@ -4222,312 +4557,20 @@ function parseDiagramDataModel(source, part) {
4222
4557
  if ((!connection.type || connection.type === "parOf") && !parentById.has(connection.destId))
4223
4558
  parentById.set(connection.destId, connection.sourceId);
4224
4559
  }
4225
- const ext = descendants2(root, "dataModelExt")[0];
4560
+ const ext = descendants(root, "dataModelExt")[0];
4226
4561
  const drawingRelId = stringAttribute(ext, "relId");
4227
4562
  return {
4228
4563
  points,
4229
4564
  connections,
4230
4565
  nodes: points.filter((point) => !STRUCTURAL_TYPES.has(point.type)),
4231
- parentById,
4232
- ...drawingRelId ? { drawingRelId } : {},
4233
- issues
4234
- };
4235
- }
4236
-
4237
- // color/color-primitives.ts
4238
- function clampUnitInterval(value) {
4239
- return Math.min(1, Math.max(0, value));
4240
- }
4241
- function hexToRgbChannels(color) {
4242
- const normalized = color.replace("#", "");
4243
- if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {
4244
- return null;
4245
- }
4246
- return {
4247
- r: Number.parseInt(normalized.slice(0, 2), 16),
4248
- g: Number.parseInt(normalized.slice(2, 4), 16),
4249
- b: Number.parseInt(normalized.slice(4, 6), 16)
4250
- };
4251
- }
4252
- function percentDivisorFor(text) {
4253
- return text.endsWith("%") ? 100 : 1e5;
4254
- }
4255
- function parseOoxmlPercent(value) {
4256
- const text = String(value ?? "").trim();
4257
- const divisor = percentDivisorFor(text);
4258
- const magnitude = Number.parseFloat(divisor === 100 ? text.slice(0, -1) : text);
4259
- if (!Number.isFinite(magnitude)) {
4260
- return void 0;
4261
- }
4262
- return magnitude / divisor;
4263
- }
4264
- function parseDrawingPercent(value) {
4265
- const parsed = parseOoxmlPercent(value);
4266
- return parsed === void 0 ? void 0 : clampUnitInterval(parsed);
4267
- }
4268
- function scrgbLinearToSrgb8(linear) {
4269
- const l = Math.min(1, Math.max(0, linear));
4270
- const companded = l <= 31308e-7 ? 12.92 * l : 1.055 * l ** (1 / 2.4) - 0.055;
4271
- return Math.min(255, Math.max(0, Math.round(companded * 255)));
4272
- }
4273
- function toHex2(value) {
4274
- return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
4275
- }
4276
- function rgbToHsl(r, g, b) {
4277
- const rN = r / 255;
4278
- const gN = g / 255;
4279
- const bN = b / 255;
4280
- const cMax = Math.max(rN, gN, bN);
4281
- const cMin = Math.min(rN, gN, bN);
4282
- const delta = cMax - cMin;
4283
- const l = (cMax + cMin) / 2;
4284
- let s = 0;
4285
- if (delta !== 0) {
4286
- s = delta / (1 - Math.abs(2 * l - 1));
4287
- }
4288
- let h = 0;
4289
- if (delta !== 0) {
4290
- if (cMax === rN) {
4291
- h = 60 * ((gN - bN) / delta % 6);
4292
- } else if (cMax === gN) {
4293
- h = 60 * ((bN - rN) / delta + 2);
4294
- } else {
4295
- h = 60 * ((rN - gN) / delta + 4);
4296
- }
4297
- }
4298
- if (h < 0) {
4299
- h += 360;
4300
- }
4301
- return { h, s: clampUnitInterval(s), l: clampUnitInterval(l) };
4302
- }
4303
- function hslToRgb(h, s, l, roundChannel = Math.round, options) {
4304
- const sC = clampUnitInterval(s);
4305
- const lC = clampUnitInterval(l);
4306
- const hN = (h % 360 + 360) % 360;
4307
- const c = (1 - Math.abs(2 * lC - 1)) * sC;
4308
- const x = c * (1 - Math.abs(hN / 60 % 2 - 1));
4309
- const m = lC - c / 2;
4310
- let rP = 0;
4311
- let gP = 0;
4312
- let bP = 0;
4313
- if (hN < 60) {
4314
- rP = c;
4315
- gP = x;
4316
- bP = 0;
4317
- } else if (hN < 120) {
4318
- rP = x;
4319
- gP = c;
4320
- bP = 0;
4321
- } else if (hN < 180) {
4322
- rP = 0;
4323
- gP = c;
4324
- bP = x;
4325
- } else if (hN < 240) {
4326
- rP = 0;
4327
- gP = x;
4328
- bP = c;
4329
- } else if (hN < 300) {
4330
- rP = x;
4331
- gP = 0;
4332
- bP = c;
4333
- } else {
4334
- rP = c;
4335
- gP = 0;
4336
- bP = x;
4337
- }
4338
- return {
4339
- r: roundChannel((rP + m) * 255),
4340
- g: roundChannel((gP + m) * 255),
4341
- b: roundChannel((bP + m) * 255)
4342
- };
4343
- }
4344
- function parseDrawingFraction(value) {
4345
- return parseOoxmlPercent(value);
4346
- }
4347
- function parseDrawingHueDegrees(value) {
4348
- const parsed = Number.parseFloat(String(value ?? "").trim());
4349
- if (!Number.isFinite(parsed)) {
4350
- return void 0;
4351
- }
4352
- return parsed / 6e4;
4353
- }
4354
-
4355
- // color/color-linear.ts
4356
- function srgb255ToLinear(channel) {
4357
- const c = clampUnitInterval(channel / 255);
4358
- return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
4359
- }
4360
- function linearToSrgb255(linear) {
4361
- const c = clampUnitInterval(linear);
4362
- return 255 * (c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055);
4363
- }
4364
-
4365
- // diagram/drawing-color.ts
4366
- var COLOR_ELEMENTS = {
4367
- srgbClr: "srgb",
4368
- schemeClr: "scheme",
4369
- sysClr: "system",
4370
- prstClr: "preset",
4371
- scrgbClr: "scrgb",
4372
- hslClr: "hsl"
4373
- };
4374
- function colorValue(kind, element) {
4375
- const attribute = (name) => element.getAttribute(name) ?? "";
4376
- if (kind === "scrgb") return `${attribute("r")},${attribute("g")},${attribute("b")}`;
4377
- if (kind === "hsl") return `${attribute("hue")},${attribute("sat")},${attribute("lum")}`;
4378
- return attribute("val");
4379
- }
4380
- function parseDrawingColorIn(container) {
4381
- if (!container) return void 0;
4382
- for (const element of elements(container)) {
4383
- const kind = COLOR_ELEMENTS[element.localName];
4384
- if (!kind || element.namespaceURI && element.namespaceURI !== NS.a) continue;
4385
- return parseDrawingColor(element);
4386
- }
4387
- return void 0;
4388
- }
4389
- function parseDrawingColor(element) {
4390
- const kind = COLOR_ELEMENTS[element.localName];
4391
- if (!kind) return void 0;
4392
- const color = {
4393
- kind,
4394
- value: colorValue(kind, element),
4395
- transforms: elements(element).map((child3) => ({
4396
- name: child3.localName,
4397
- value: child3.getAttribute("val") ?? ""
4398
- }))
4399
- };
4400
- const fallback = kind === "system" ? element.getAttribute("lastClr") : null;
4401
- if (fallback) color.fallback = fallback;
4402
- return color;
4403
- }
4404
- function parseDrawingColorList(container) {
4405
- if (!container) return [];
4406
- return elements(container).flatMap((element) => {
4407
- const color = parseDrawingColor(element);
4408
- return color ? [color] : [];
4409
- });
4410
- }
4411
- var PRESET_COLORS = {
4412
- black: "#000000",
4413
- white: "#FFFFFF",
4414
- red: "#FF0000",
4415
- green: "#008000",
4416
- blue: "#0000FF",
4417
- yellow: "#FFFF00",
4418
- gray: "#808080",
4419
- grey: "#808080"
4420
- };
4421
- function baseHex(color, theme) {
4422
- switch (color.kind) {
4423
- case "srgb":
4424
- return /^[0-9a-f]{6}$/i.test(color.value) ? `#${color.value.toUpperCase()}` : void 0;
4425
- case "scheme":
4426
- return theme?.scheme(color.value);
4427
- case "system":
4428
- return color.fallback && /^[0-9a-f]{6}$/i.test(color.fallback) ? `#${color.fallback.toUpperCase()}` : void 0;
4429
- case "preset":
4430
- return PRESET_COLORS[color.value];
4431
- case "scrgb": {
4432
- const [r, g, b] = color.value.split(",").map((part) => parseDrawingFraction(part));
4433
- if (r === void 0 || g === void 0 || b === void 0) return void 0;
4434
- return `#${toHex2(scrgbLinearToSrgb8(r))}${toHex2(scrgbLinearToSrgb8(g))}${toHex2(scrgbLinearToSrgb8(b))}`;
4435
- }
4436
- case "hsl": {
4437
- const [h, s, l] = color.value.split(",");
4438
- const hue = parseDrawingHueDegrees(h);
4439
- const sat = parseDrawingFraction(s);
4440
- const lum = parseDrawingFraction(l);
4441
- if (hue === void 0 || sat === void 0 || lum === void 0) return void 0;
4442
- const { r, g, b } = hslToRgb(hue, sat, lum);
4443
- return `#${toHex2(r)}${toHex2(g)}${toHex2(b)}`;
4444
- }
4445
- }
4446
- }
4447
- var APPLIED = /* @__PURE__ */ new Set([
4448
- "alpha",
4449
- "alphaMod",
4450
- "alphaOff",
4451
- "comp",
4452
- "inv",
4453
- "gray",
4454
- "shade",
4455
- "tint",
4456
- "hue",
4457
- "hueMod",
4458
- "hueOff",
4459
- "sat",
4460
- "satMod",
4461
- "satOff",
4462
- "lum",
4463
- "lumMod",
4464
- "lumOff"
4465
- ]);
4466
- function resolveDrawingColor(color, theme, options) {
4467
- const base = baseHex(color, theme);
4468
- const rgb = base ? hexToRgbChannels(base) : null;
4469
- if (!rgb) return void 0;
4470
- let { r, g, b } = rgb;
4471
- const find = (name) => color.transforms.find((entry) => entry.name === name)?.value;
4472
- const has = (name) => color.transforms.some((entry) => entry.name === name);
4473
- if (has("comp")) {
4474
- const hsl = rgbToHsl(r, g, b);
4475
- ({ r, g, b } = hslToRgb((hsl.h + 180) % 360, hsl.s, hsl.l));
4476
- }
4477
- if (has("inv")) [r, g, b] = [255 - r, 255 - g, 255 - b];
4478
- if (has("gray")) r = g = b = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
4479
- const shade = parseDrawingPercent(find("shade"));
4480
- if (shade !== void 0) {
4481
- r = linearToSrgb255(srgb255ToLinear(r) * shade);
4482
- g = linearToSrgb255(srgb255ToLinear(g) * shade);
4483
- b = linearToSrgb255(srgb255ToLinear(b) * shade);
4484
- }
4485
- const tint = parseDrawingPercent(find("tint"));
4486
- if (tint !== void 0) {
4487
- r = linearToSrgb255(1 - (1 - srgb255ToLinear(r)) * tint);
4488
- g = linearToSrgb255(1 - (1 - srgb255ToLinear(g)) * tint);
4489
- b = linearToSrgb255(1 - (1 - srgb255ToLinear(b)) * tint);
4490
- }
4491
- if (["hue", "hueMod", "hueOff", "sat", "satMod", "satOff", "lum", "lumMod", "lumOff"].some(has)) {
4492
- const hsl = rgbToHsl(r, g, b);
4493
- const wrap = (degrees) => (degrees % 360 + 360) % 360;
4494
- const hueAbs = parseDrawingHueDegrees(find("hue"));
4495
- if (hueAbs !== void 0) hsl.h = wrap(hueAbs);
4496
- const hueMod = parseDrawingFraction(find("hueMod"));
4497
- if (hueMod !== void 0) hsl.h = wrap(hsl.h * hueMod);
4498
- const hueOff = parseDrawingHueDegrees(find("hueOff"));
4499
- if (hueOff !== void 0) hsl.h = wrap(hsl.h + hueOff);
4500
- const satAbs = parseDrawingFraction(find("sat"));
4501
- if (satAbs !== void 0) hsl.s = clampUnitInterval(satAbs);
4502
- const satMod = parseDrawingFraction(find("satMod"));
4503
- if (satMod !== void 0) hsl.s = clampUnitInterval(hsl.s * satMod);
4504
- const satOff = parseDrawingFraction(find("satOff"));
4505
- if (satOff !== void 0) hsl.s = clampUnitInterval(hsl.s + satOff);
4506
- const lumAbs = parseDrawingFraction(find("lum"));
4507
- if (lumAbs !== void 0) hsl.l = clampUnitInterval(lumAbs);
4508
- const lumMod = parseDrawingFraction(find("lumMod"));
4509
- if (lumMod !== void 0) hsl.l = clampUnitInterval(hsl.l * lumMod);
4510
- const lumOff = parseDrawingFraction(find("lumOff"));
4511
- if (lumOff !== void 0) hsl.l = clampUnitInterval(hsl.l + lumOff);
4512
- const round = Math.round;
4513
- ({ r, g, b } = hslToRgb(hsl.h, hsl.s, hsl.l, round));
4514
- }
4515
- let alpha = parseDrawingPercent(find("alpha")) ?? 1;
4516
- const alphaMod = parseDrawingFraction(find("alphaMod"));
4517
- if (alphaMod !== void 0) alpha = clampUnitInterval(alpha * alphaMod);
4518
- const alphaOff = parseDrawingFraction(find("alphaOff"));
4519
- if (alphaOff !== void 0) alpha = clampUnitInterval(alpha + alphaOff);
4520
- return {
4521
- hex: `#${toHex2(r)}${toHex2(g)}${toHex2(b)}`,
4522
- alpha,
4523
- unapplied: [...new Set(color.transforms.map((entry) => entry.name))].filter(
4524
- (name) => !APPLIED.has(name)
4525
- )
4566
+ parentById,
4567
+ ...drawingRelId ? { drawingRelId } : {},
4568
+ issues
4526
4569
  };
4527
4570
  }
4528
4571
 
4529
4572
  // diagram/definitions.ts
4530
- var rootOf = (source) => (typeof source === "string" ? parseXml(source, { label: "DiagramML" }) : source).documentElement;
4573
+ var rootOf2 = (source) => (typeof source === "string" ? parseXml(source, { label: "DiagramML" }) : source).documentElement;
4531
4574
  function parseDefinitionHeader(root) {
4532
4575
  const header = {
4533
4576
  uniqueId: stringAttribute(root, "uniqueId") ?? "",
@@ -4548,7 +4591,7 @@ function colorList(container) {
4548
4591
  return { ...method ? { method } : {}, colors: parseDrawingColorList(container) };
4549
4592
  }
4550
4593
  function parseDiagramColors(source) {
4551
- const root = rootOf(source);
4594
+ const root = rootOf2(source);
4552
4595
  const labels = children(root, "styleLbl", NS.dgm).map((label) => ({
4553
4596
  name: stringAttribute(label, "name") ?? "",
4554
4597
  fill: colorList(first(label, "fillClrLst", NS.dgm)),
@@ -4588,7 +4631,7 @@ function parseStyleReferences(style) {
4588
4631
  }
4589
4632
  var hasContent = (element) => Boolean(element && (element.attributes.length > 0 || elements(element).length > 0));
4590
4633
  function parseDiagramQuickStyle(source) {
4591
- const root = rootOf(source);
4634
+ const root = rootOf2(source);
4592
4635
  const labels = children(root, "styleLbl", NS.dgm).map((label) => ({
4593
4636
  name: stringAttribute(label, "name") ?? "",
4594
4637
  ...parseStyleReferences(first(label, "style", NS.dgm)),
@@ -4602,7 +4645,7 @@ function parseDiagramQuickStyle(source) {
4602
4645
  };
4603
4646
  }
4604
4647
  function parseDiagramLayoutSummary(source) {
4605
- const root = rootOf(source);
4648
+ const root = rootOf2(source);
4606
4649
  const header = parseDefinitionHeader(root);
4607
4650
  const family = resolveDiagramLayoutCategory(
4608
4651
  header.uniqueId,
@@ -4614,11 +4657,11 @@ function parseDiagramLayoutSummary(source) {
4614
4657
  ...header,
4615
4658
  ...family ? { family } : {},
4616
4659
  ...rootAlgorithm ? { rootAlgorithm } : {},
4617
- layoutNodeCount: descendants2(root, "layoutNode").length
4660
+ layoutNodeCount: descendants(root, "layoutNode").length
4618
4661
  };
4619
4662
  }
4620
4663
 
4621
- // diagram/drawing-fill.ts
4664
+ // drawingml/drawing-fill.ts
4622
4665
  var FILL_ELEMENTS = /* @__PURE__ */ new Set([
4623
4666
  "noFill",
4624
4667
  "solidFill",
@@ -4710,7 +4753,7 @@ function parseDrawingLine(ln) {
4710
4753
  return line;
4711
4754
  }
4712
4755
 
4713
- // diagram/drawing-text.ts
4756
+ // drawingml/drawing-text.ts
4714
4757
  function parseSpacing(parent) {
4715
4758
  for (const [name, unit, divisor] of [
4716
4759
  ["spcPts", "points", 100],
@@ -4789,7 +4832,7 @@ function parseDrawingTextBody(body) {
4789
4832
  return result;
4790
4833
  }
4791
4834
 
4792
- // diagram/drawing-geometry.ts
4835
+ // drawingml/drawing-geometry.ts
4793
4836
  var int = (element, name) => Number.parseInt(element?.getAttribute(name) ?? "", 10);
4794
4837
  function parseFrame(container) {
4795
4838
  const off = first(container, "off", NS.a);
@@ -5608,6 +5651,23 @@ function restoreRunFormatting(run) {
5608
5651
  else delete run.revision;
5609
5652
  }
5610
5653
 
5654
+ // docx/field-flags.ts
5655
+ function parseFieldFlags(element) {
5656
+ const locked = onOffAttribute(element, "fldLock");
5657
+ const dirty = onOffAttribute(element, "dirty");
5658
+ if (locked === void 0 && dirty === void 0) return void 0;
5659
+ return { ...locked !== void 0 && { locked }, ...dirty !== void 0 && { dirty } };
5660
+ }
5661
+ function writeFieldFlags(element, flags) {
5662
+ for (const [name, value] of [
5663
+ ["fldLock", flags?.locked],
5664
+ ["dirty", flags?.dirty]
5665
+ ]) {
5666
+ if (value === void 0) element.removeAttributeNS(WORD_NS, name);
5667
+ else element.setAttributeNS(WORD_NS, `w:${name}`, value ? "true" : "false");
5668
+ }
5669
+ }
5670
+
5611
5671
  // docx/write-run.ts
5612
5672
  function setAttribute6(element, local, value) {
5613
5673
  element.setAttributeNS(WORD_NS, `w:${local}`, value);
@@ -5793,6 +5853,7 @@ function createRun(doc, run, base, old, allocator) {
5793
5853
  if (run.fieldChar) {
5794
5854
  const marker = makeW(doc, "fldChar");
5795
5855
  setAttribute6(marker, "fldCharType", run.fieldChar);
5856
+ writeFieldFlags(marker, run.fieldFlags);
5796
5857
  node.appendChild(marker);
5797
5858
  return node;
5798
5859
  }
@@ -5873,6 +5934,14 @@ function takeSimpleFieldCommentEdges(doc, runs, start, end, opens, closes) {
5873
5934
  after: take(closes, end - 1).reverse().flatMap((edge) => rangeEndNodes(doc, edge))
5874
5935
  };
5875
5936
  }
5937
+
5938
+ // docx/field-lock.ts
5939
+ function isFieldLocked(run) {
5940
+ return run?.fieldFlags?.locked === true;
5941
+ }
5942
+ function sameFieldFlags(a, b) {
5943
+ return a?.locked === b?.locked && a?.dirty === b?.dirty;
5944
+ }
5876
5945
  var MATH_NAMESPACES = /* @__PURE__ */ new Set([
5877
5946
  "http://schemas.openxmlformats.org/officeDocument/2006/math",
5878
5947
  "http://purl.oclc.org/ooxml/officeDocument/math"
@@ -6197,6 +6266,7 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
6197
6266
  container = makeW(doc, "fldSimple");
6198
6267
  setW6(container, "instr", ` ${group.instr} `);
6199
6268
  }
6269
+ if (group.kind === "simpleField") writeFieldFlags(container, runAt(start).fieldFlags);
6200
6270
  const edges = group.kind === "simpleField" ? takeSimpleFieldCommentEdges(doc, runs, start, index, opens, closes) : { before: [], after: [] };
6201
6271
  for (let item = start; item < index; item++)
6202
6272
  for (const node of nodesFor(item)) container.appendChild(node);
@@ -6207,13 +6277,18 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
6207
6277
  function containerGroup(run) {
6208
6278
  if (run.link) return { kind: "link", link: run.link };
6209
6279
  if (run.field?.simple)
6210
- return { kind: "simpleField", instr: run.field.instr, instanceId: run.fieldInstanceId };
6280
+ return {
6281
+ kind: "simpleField",
6282
+ instr: run.field.instr,
6283
+ instanceId: run.fieldInstanceId,
6284
+ fieldFlags: run.fieldFlags
6285
+ };
6211
6286
  return void 0;
6212
6287
  }
6213
6288
  function sameGroup(a, b) {
6214
6289
  if (!a || !b) return a === b;
6215
6290
  if (a.kind === "link" && b.kind === "link") return sameLink(a.link, b.link);
6216
- return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId;
6291
+ return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId && sameFieldFlags(a.fieldFlags, b.fieldFlags);
6217
6292
  }
6218
6293
 
6219
6294
  // docx/paragraph-properties.ts
@@ -7038,103 +7113,338 @@ function validateNumberingCatalog(c, catalog) {
7038
7113
  }
7039
7114
  }
7040
7115
 
7041
- // docx/validate-model.ts
7042
- function validateBlocks(c, blocks) {
7043
- blocks?.forEach((block, index) => {
7044
- const at = c.at(`[${index}]`);
7045
- if (block.type === "paragraph") return validateParagraph(at, block);
7046
- validateTable(at, block);
7047
- block.rows.forEach(
7048
- (row, r) => row.forEach(
7049
- (cell, k) => cell.paragraphs.forEach(
7050
- (paragraph, p) => validateParagraph(at.at(`.rows[${r}][${k}].paragraphs[${p}]`), paragraph)
7051
- )
7052
- )
7053
- );
7054
- });
7116
+ // docx/validate-model.ts
7117
+ function validateBlocks(c, blocks) {
7118
+ blocks?.forEach((block, index) => {
7119
+ const at = c.at(`[${index}]`);
7120
+ if (block.type === "paragraph") return validateParagraph(at, block);
7121
+ validateTable(at, block);
7122
+ block.rows.forEach(
7123
+ (row, r) => row.forEach(
7124
+ (cell, k) => cell.paragraphs.forEach(
7125
+ (paragraph, p) => validateParagraph(at.at(`.rows[${r}][${k}].paragraphs[${p}]`), paragraph)
7126
+ )
7127
+ )
7128
+ );
7129
+ });
7130
+ }
7131
+ function validateDocumentModel(model) {
7132
+ const issues = [];
7133
+ const path = (suffix) => new Checker(issues, suffix);
7134
+ const page = path("page");
7135
+ for (const key of ["width", "height"])
7136
+ page.check(
7137
+ key,
7138
+ model.page?.[key],
7139
+ (v) => typeof v === "number" && Number.isFinite(v) && Math.round(v * 15) > 0,
7140
+ "must be a finite, positive pixel size (converted to integer twips)"
7141
+ );
7142
+ for (const key of ["marginTop", "marginRight", "marginBottom", "marginLeft"])
7143
+ page.check(
7144
+ key,
7145
+ model.page?.[key],
7146
+ (v) => typeof v === "number" && Number.isFinite(v) && (key === "marginTop" || key === "marginBottom" || v >= 0),
7147
+ "must be a finite pixel size (converted to integer twips; left/right non-negative)"
7148
+ );
7149
+ validateBlocks(path("blocks"), model.blocks);
7150
+ model.sections?.forEach((section, index) => {
7151
+ const at = path(`sections[${index}]`);
7152
+ validateSection(at, section);
7153
+ for (const kind of ["headers", "footers"])
7154
+ for (const [slot2, content] of Object.entries(section[kind] ?? {}))
7155
+ validateBlocks(at.at(`.${kind}.${slot2}.blocks`), content?.blocks);
7156
+ });
7157
+ for (const kind of ["footnotes", "endnotes"])
7158
+ model[kind]?.forEach(
7159
+ (note, index) => validateBlocks(path(`${kind}[${index}].blocks`), note.blocks)
7160
+ );
7161
+ model.comments?.forEach(
7162
+ (comment, index) => path(`comments[${index}]`).dateTime("date", comment.date)
7163
+ );
7164
+ path("model").hex("pageColor", model.pageColor);
7165
+ path("model").enum("footnoteNumFmt", model.footnoteNumFmt, isStNumberFormat, "ST_NumberFormat");
7166
+ path("model").enum("endnoteNumFmt", model.endnoteNumFmt, isStNumberFormat, "ST_NumberFormat");
7167
+ if (model.numberingCatalog)
7168
+ validateNumberingCatalog(path("numberingCatalog"), model.numberingCatalog);
7169
+ return issues;
7170
+ }
7171
+ function assertValidDocumentModel(model) {
7172
+ const issues = validateDocumentModel(model);
7173
+ if (issues.length) throw new DocxModelValidationError(issues);
7174
+ }
7175
+
7176
+ // docx/numbering-parts.ts
7177
+ var CT_NS = "http://schemas.openxmlformats.org/package/2006/content-types";
7178
+ var REL_NS2 = "http://schemas.openxmlformats.org/package/2006/relationships";
7179
+ var NUMBERING_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering";
7180
+ var NUMBERING_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml";
7181
+ async function registerNumberingPart(zip) {
7182
+ const contentTypesPath = "[Content_Types].xml";
7183
+ const contentTypesFile = zip.file(contentTypesPath);
7184
+ const contentTypesXml = contentTypesFile ? await contentTypesFile.async("string") : `<?xml version="1.0"?><Types xmlns="${CT_NS}"/>`;
7185
+ const contentTypesDoc = parseXml2(contentTypesXml);
7186
+ const hasOverride = Array.from(contentTypesDoc.getElementsByTagNameNS(CT_NS, "Override")).some(
7187
+ (element) => element.getAttribute("PartName") === "/word/numbering.xml"
7188
+ );
7189
+ if (!hasOverride) {
7190
+ const override = contentTypesDoc.createElementNS(CT_NS, "Override");
7191
+ override.setAttribute("PartName", "/word/numbering.xml");
7192
+ override.setAttribute("ContentType", NUMBERING_CONTENT_TYPE);
7193
+ contentTypesDoc.documentElement.appendChild(override);
7194
+ zip.file(contentTypesPath, buildXml(contentTypesDoc));
7195
+ }
7196
+ const relsPath = "word/_rels/document.xml.rels";
7197
+ const relsFile = zip.file(relsPath);
7198
+ const relsXml = relsFile ? await relsFile.async("string") : `<?xml version="1.0"?><Relationships xmlns="${REL_NS2}"/>`;
7199
+ const relsDoc = parseXml2(relsXml);
7200
+ const existingIds = new Set(
7201
+ Array.from(relsDoc.getElementsByTagNameNS(REL_NS2, "Relationship")).map(
7202
+ (element) => element.getAttribute("Id") ?? ""
7203
+ )
7204
+ );
7205
+ let serial = 1;
7206
+ while (existingIds.has(`rId${serial}`)) serial++;
7207
+ const relationship = relsDoc.createElementNS(REL_NS2, "Relationship");
7208
+ relationship.setAttribute("Id", `rId${serial}`);
7209
+ relationship.setAttribute("Type", NUMBERING_RELATIONSHIP_TYPE);
7210
+ relationship.setAttribute("Target", "numbering.xml");
7211
+ relsDoc.documentElement.appendChild(relationship);
7212
+ zip.file(relsPath, buildXml(relsDoc));
7213
+ }
7214
+
7215
+ // docx/numbering-parse.ts
7216
+ var integer2 = (value, fallback) => parseInteger(value) ?? fallback;
7217
+ var flag = (element) => onOffElement(element) === true;
7218
+ function byName(root, local) {
7219
+ return Array.from(root.getElementsByTagName("*")).filter(
7220
+ (node) => node.nodeType === 1 && named2(node, local)
7221
+ );
7222
+ }
7223
+ function parseMarkerFormat(rPr) {
7224
+ if (!rPr) return void 0;
7225
+ const format = {};
7226
+ const family = getW(first2(rPr, "rFonts"), "ascii");
7227
+ if (family) format.fontFamily = family;
7228
+ const size = parseInteger(getW(first2(rPr, "sz"), "val"));
7229
+ if (size !== void 0 && size > 0) format.fontSizeHalfPoints = size;
7230
+ if (onOffElement(first2(rPr, "b")) === true) format.bold = true;
7231
+ if (onOffElement(first2(rPr, "i")) === true) format.italic = true;
7232
+ const color = getW(first2(rPr, "color"), "val");
7233
+ if (color && /^[0-9a-f]{6}$/i.test(color)) format.color = `#${color.toLowerCase()}`;
7234
+ return Object.keys(format).length ? format : void 0;
7235
+ }
7236
+ function parseNumberingLevel(lvl) {
7237
+ const level = integer2(getW(lvl, "ilvl"), 0);
7238
+ const start = integer2(getW(first2(lvl, "start"), "val"), 1);
7239
+ const numFmt = enumValue(isStNumberFormat, getW(first2(lvl, "numFmt"), "val"), "w:numFmt") ?? "decimal";
7240
+ const lvlText = getW(first2(lvl, "lvlText"), "val") ?? "";
7241
+ const jc = getW(first2(lvl, "lvlJc"), "val");
7242
+ const ind = first2(first2(lvl, "pPr"), "ind");
7243
+ const suffRaw = getW(first2(lvl, "suff"), "val");
7244
+ const result = { level, start, numFmt, lvlText };
7245
+ if (!first2(lvl, "start")) result.startWasOmitted = true;
7246
+ const paragraphStyleId = getW(first2(lvl, "pStyle"), "val");
7247
+ if (paragraphStyleId) result.paragraphStyleId = paragraphStyleId;
7248
+ if (jc === "left" || jc === "center" || jc === "right") result.lvlJc = jc;
7249
+ const left = getW(ind, "left") ?? getW(ind, "start");
7250
+ if (left !== void 0) result.indentLeftTwips = parseSignedTwips(left) ?? signedTwips(0);
7251
+ const hanging = getW(ind, "hanging");
7252
+ if (hanging !== void 0) result.hangingTwips = parseTwips(hanging) ?? twips(0);
7253
+ const firstLine = getW(ind, "firstLine");
7254
+ if (firstLine !== void 0) result.firstLineTwips = parseTwips(firstLine) ?? twips(0);
7255
+ const tabs = first2(first2(lvl, "pPr"), "tabs");
7256
+ const tab = tabs ? children2(tabs, "tab").find((stop) => getW(stop, "val") !== "clear") : void 0;
7257
+ const tabPos = tab ? parseTwips(getW(tab, "pos")) : void 0;
7258
+ if (tabPos !== void 0) result.tabStopTwips = tabPos;
7259
+ if (flag(first2(lvl, "isLgl"))) result.isLgl = true;
7260
+ const restart = getW(first2(lvl, "lvlRestart"), "val");
7261
+ if (restart !== void 0) result.lvlRestart = integer2(restart, 0);
7262
+ const marker = parseMarkerFormat(first2(lvl, "rPr"));
7263
+ if (marker) result.markerFormat = marker;
7264
+ result.suffix = suffRaw === "space" ? "space" : suffRaw === "nothing" ? "none" : "tab";
7265
+ return result;
7266
+ }
7267
+ function parseAbstractNum(element) {
7268
+ const id = getW(element, "abstractNumId");
7269
+ if (!id) return void 0;
7270
+ const levels = {};
7271
+ for (const lvl of children2(element, "lvl")) {
7272
+ const parsed = parseNumberingLevel(lvl);
7273
+ levels[parsed.level] = parsed;
7274
+ }
7275
+ return { id, levels };
7276
+ }
7277
+ function parseNum(element) {
7278
+ const id = getW(element, "numId");
7279
+ if (!id) return void 0;
7280
+ const abstractNumId = getW(first2(element, "abstractNumId"), "val") ?? "";
7281
+ const levelOverrides = {};
7282
+ for (const override of children2(element, "lvlOverride")) {
7283
+ const level = integer2(getW(override, "ilvl"), 0);
7284
+ const entry = {};
7285
+ const startOverride = getW(first2(override, "startOverride"), "val");
7286
+ if (startOverride !== void 0) entry.startOverride = integer2(startOverride, 1);
7287
+ const lvl = first2(override, "lvl");
7288
+ if (lvl) entry.lvl = parseNumberingLevel(lvl);
7289
+ if (Object.keys(entry).length) levelOverrides[level] = entry;
7290
+ }
7291
+ return {
7292
+ id,
7293
+ abstractNumId,
7294
+ ...Object.keys(levelOverrides).length ? { levelOverrides } : {}
7295
+ };
7296
+ }
7297
+ function parseNumberingCatalog(xml) {
7298
+ const document = parseXml2(xml);
7299
+ const root = document.documentElement;
7300
+ const abstractNums = {};
7301
+ const warnings = [];
7302
+ for (const element of byName(root, "abstractNum")) {
7303
+ const parsed = parseAbstractNum(element);
7304
+ if (!parsed) continue;
7305
+ abstractNums[parsed.id] = parsed;
7306
+ const link = getW(first2(element, "numStyleLink"), "val");
7307
+ if (link)
7308
+ warnings.push(
7309
+ `Numbering definition abstractNum ${parsed.id} links to style "${link}"; style-linked numbering levels are not resolved.`
7310
+ );
7311
+ if (byName(element, "lvlPicBulletId").length)
7312
+ warnings.push(
7313
+ `Numbering definition abstractNum ${parsed.id} uses a picture bullet; picture bullets are not rendered.`
7314
+ );
7315
+ }
7316
+ const nums = {};
7317
+ for (const element of byName(root, "num")) {
7318
+ const parsed = parseNum(element);
7319
+ if (parsed) nums[parsed.id] = parsed;
7320
+ }
7321
+ return { abstractNums, nums, warnings: [...new Set(warnings)] };
7322
+ }
7323
+ function resolveNumberingLevel(catalog, numId, level) {
7324
+ const num = catalog.nums[numId];
7325
+ if (!num) return void 0;
7326
+ const override = num.levelOverrides?.[level];
7327
+ const sourceAbstract = catalog.abstractNums[num.abstractNumId]?.levels[level];
7328
+ const abstract = sourceAbstract?.startWasOmitted && sourceAbstract.start === 1 ? { ...sourceAbstract, start: 0 } : sourceAbstract;
7329
+ let base = override?.lvl ?? abstract;
7330
+ if (!base) return void 0;
7331
+ if (override?.lvl) {
7332
+ const { lvlRestart: _ignored, ...properties } = base;
7333
+ base = {
7334
+ ...properties,
7335
+ ...abstract?.lvlRestart !== void 0 ? { lvlRestart: abstract.lvlRestart } : {}
7336
+ };
7337
+ }
7338
+ let start = override?.startOverride ?? base.start;
7339
+ if (override?.lvl) {
7340
+ if (abstract?.lvlRestart === 0 && override.startOverride === void 0) start = abstract.start;
7341
+ else if (!override.lvl.startWasOmitted || override.lvl.start !== 1) start = override.lvl.start;
7342
+ else start = override.startOverride ?? 0;
7343
+ }
7344
+ return start !== base.start ? { ...base, start } : base;
7345
+ }
7346
+
7347
+ // docx/numbering-start-edit.ts
7348
+ function assertListStartValue(level, start) {
7349
+ if (!Number.isInteger(level) || level < 0 || level > 8)
7350
+ throw new Error("List level must be an integer from 0 through 8.");
7351
+ if (!Number.isInteger(start) || start < 0 || start > 2147483647)
7352
+ throw new Error("List start must be an integer from 0 through 2147483647.");
7353
+ }
7354
+ function setListStartOverride(catalog, numId, level, start) {
7355
+ assertListStartValue(level, start);
7356
+ if (!Number.isSafeInteger(numId) || numId <= 0) throw new Error("Invalid list instance id.");
7357
+ const id = String(numId);
7358
+ const num = catalog.nums[id];
7359
+ if (!num || !resolveNumberingLevel(catalog, id, level))
7360
+ throw new Error("List instance or level does not exist.");
7361
+ const override = num.levelOverrides?.[level];
7362
+ if (override?.lvl) throw new Error("Changing starts with a full level override is unsupported.");
7363
+ if (override?.startOverride === start) return catalog;
7364
+ return {
7365
+ ...catalog,
7366
+ nums: {
7367
+ ...catalog.nums,
7368
+ [id]: {
7369
+ ...num,
7370
+ levelOverrides: {
7371
+ ...num.levelOverrides,
7372
+ [level]: { ...override, startOverride: start }
7373
+ }
7374
+ }
7375
+ }
7376
+ };
7377
+ }
7378
+
7379
+ // docx/numbering-start-patch.ts
7380
+ function withoutStarts(num) {
7381
+ const { levelOverrides, ...properties } = num;
7382
+ const kept = {};
7383
+ for (const [level, override] of Object.entries(levelOverrides ?? {})) {
7384
+ const { startOverride: _start, ...rest } = override;
7385
+ if (Object.keys(rest).length) kept[level] = rest;
7386
+ }
7387
+ return { ...properties, ...Object.keys(kept).length ? { levelOverrides: kept } : {} };
7055
7388
  }
7056
- function validateDocumentModel(model) {
7057
- const issues = [];
7058
- const path = (suffix) => new Checker(issues, suffix);
7059
- const page = path("page");
7060
- for (const key of ["width", "height"])
7061
- page.check(
7062
- key,
7063
- model.page?.[key],
7064
- (v) => typeof v === "number" && Number.isFinite(v) && Math.round(v * 15) > 0,
7065
- "must be a finite, positive pixel size (converted to integer twips)"
7389
+ function numberingStartChanges(prior, next) {
7390
+ const changes = [];
7391
+ for (const [id, previous] of Object.entries(prior?.nums ?? {})) {
7392
+ const current = next.nums[id];
7393
+ if (!current || JSON.stringify(withoutStarts(current)) !== JSON.stringify(withoutStarts(previous)))
7394
+ throw new Error(
7395
+ `Cannot edit numbering definition num "${id}" except its supported start overrides.`
7396
+ );
7397
+ for (const key of /* @__PURE__ */ new Set([
7398
+ ...Object.keys(previous.levelOverrides ?? {}),
7399
+ ...Object.keys(current.levelOverrides ?? {})
7400
+ ])) {
7401
+ const level = Number(key);
7402
+ const old = previous.levelOverrides?.[level];
7403
+ const value = current.levelOverrides?.[level];
7404
+ if (old?.startOverride === value?.startOverride) continue;
7405
+ if (value?.startOverride === void 0)
7406
+ throw new Error("Removing a list start override is unsupported.");
7407
+ assertListStartValue(level, value.startOverride);
7408
+ if (String(level) !== key || !prior || !resolveNumberingLevel(prior, id, level))
7409
+ throw new Error("List instance or level does not exist.");
7410
+ if (old?.lvl || value.lvl)
7411
+ throw new Error("Changing starts with a full level override is unsupported.");
7412
+ changes.push({ numId: id, level, start: value.startOverride });
7413
+ }
7414
+ }
7415
+ return changes;
7416
+ }
7417
+ function patchNumberingStarts(doc, changes) {
7418
+ const sameNumber = (source, expected) => source !== void 0 && /^[+-]?\d+$/.test(source) && Number(source) === Number(expected);
7419
+ const prepared = changes.map((change) => {
7420
+ const nums = children2(doc.documentElement, "num").filter(
7421
+ (num2) => sameNumber(getW(num2, "numId"), change.numId)
7066
7422
  );
7067
- for (const key of ["marginTop", "marginRight", "marginBottom", "marginLeft"])
7068
- page.check(
7069
- key,
7070
- model.page?.[key],
7071
- (v) => typeof v === "number" && Number.isFinite(v) && (key === "marginTop" || key === "marginBottom" || v >= 0),
7072
- "must be a finite pixel size (converted to integer twips; left/right non-negative)"
7423
+ if (nums.length !== 1 || getW(nums[0], "numId") !== change.numId)
7424
+ throw new Error("Cannot patch an ambiguous or missing source list instance.");
7425
+ const num = nums[0];
7426
+ const overrides = children2(num, "lvlOverride").filter(
7427
+ (node) => sameNumber(getW(node, "ilvl"), String(change.level))
7073
7428
  );
7074
- validateBlocks(path("blocks"), model.blocks);
7075
- model.sections?.forEach((section, index) => {
7076
- const at = path(`sections[${index}]`);
7077
- validateSection(at, section);
7078
- for (const kind of ["headers", "footers"])
7079
- for (const [slot2, content] of Object.entries(section[kind] ?? {}))
7080
- validateBlocks(at.at(`.${kind}.${slot2}.blocks`), content?.blocks);
7429
+ if (overrides.length > 1) throw new Error("Cannot patch duplicate source level overrides.");
7430
+ const override = overrides[0];
7431
+ if (override && getW(override, "ilvl") !== String(change.level))
7432
+ throw new Error("Cannot patch a noncanonical source level override.");
7433
+ if (override && (children2(override, "lvl").length || children2(override, "startOverride").length > 1))
7434
+ throw new Error("Cannot patch a full or ambiguous source level override.");
7435
+ return { change, num, override };
7081
7436
  });
7082
- for (const kind of ["footnotes", "endnotes"])
7083
- model[kind]?.forEach(
7084
- (note, index) => validateBlocks(path(`${kind}[${index}].blocks`), note.blocks)
7085
- );
7086
- model.comments?.forEach(
7087
- (comment, index) => path(`comments[${index}]`).dateTime("date", comment.date)
7088
- );
7089
- path("model").hex("pageColor", model.pageColor);
7090
- path("model").enum("footnoteNumFmt", model.footnoteNumFmt, isStNumberFormat, "ST_NumberFormat");
7091
- path("model").enum("endnoteNumFmt", model.endnoteNumFmt, isStNumberFormat, "ST_NumberFormat");
7092
- if (model.numberingCatalog)
7093
- validateNumberingCatalog(path("numberingCatalog"), model.numberingCatalog);
7094
- return issues;
7095
- }
7096
- function assertValidDocumentModel(model) {
7097
- const issues = validateDocumentModel(model);
7098
- if (issues.length) throw new DocxModelValidationError(issues);
7099
- }
7100
-
7101
- // docx/numbering-parts.ts
7102
- var CT_NS = "http://schemas.openxmlformats.org/package/2006/content-types";
7103
- var REL_NS2 = "http://schemas.openxmlformats.org/package/2006/relationships";
7104
- var NUMBERING_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering";
7105
- var NUMBERING_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml";
7106
- async function registerNumberingPart(zip) {
7107
- const contentTypesPath = "[Content_Types].xml";
7108
- const contentTypesFile = zip.file(contentTypesPath);
7109
- const contentTypesXml = contentTypesFile ? await contentTypesFile.async("string") : `<?xml version="1.0"?><Types xmlns="${CT_NS}"/>`;
7110
- const contentTypesDoc = parseXml2(contentTypesXml);
7111
- const hasOverride = Array.from(contentTypesDoc.getElementsByTagNameNS(CT_NS, "Override")).some(
7112
- (element) => element.getAttribute("PartName") === "/word/numbering.xml"
7113
- );
7114
- if (!hasOverride) {
7115
- const override = contentTypesDoc.createElementNS(CT_NS, "Override");
7116
- override.setAttribute("PartName", "/word/numbering.xml");
7117
- override.setAttribute("ContentType", NUMBERING_CONTENT_TYPE);
7118
- contentTypesDoc.documentElement.appendChild(override);
7119
- zip.file(contentTypesPath, buildXml(contentTypesDoc));
7437
+ for (const { change, num, override: existing } of prepared) {
7438
+ const override = existing ?? makeW(doc, "lvlOverride");
7439
+ if (!existing) {
7440
+ override.setAttributeNS(WORD_NS, "w:ilvl", String(change.level));
7441
+ const after = children2(num, "lvlOverride").at(-1) ?? children2(num, "abstractNumId")[0];
7442
+ num.insertBefore(override, after?.nextSibling ?? null);
7443
+ }
7444
+ const start = children2(override, "startOverride")[0] ?? makeW(doc, "startOverride");
7445
+ start.setAttributeNS(WORD_NS, "w:val", String(change.start));
7446
+ if (!start.parentNode) override.insertBefore(start, override.firstChild);
7120
7447
  }
7121
- const relsPath = "word/_rels/document.xml.rels";
7122
- const relsFile = zip.file(relsPath);
7123
- const relsXml = relsFile ? await relsFile.async("string") : `<?xml version="1.0"?><Relationships xmlns="${REL_NS2}"/>`;
7124
- const relsDoc = parseXml2(relsXml);
7125
- const existingIds = new Set(
7126
- Array.from(relsDoc.getElementsByTagNameNS(REL_NS2, "Relationship")).map(
7127
- (element) => element.getAttribute("Id") ?? ""
7128
- )
7129
- );
7130
- let serial = 1;
7131
- while (existingIds.has(`rId${serial}`)) serial++;
7132
- const relationship = relsDoc.createElementNS(REL_NS2, "Relationship");
7133
- relationship.setAttribute("Id", `rId${serial}`);
7134
- relationship.setAttribute("Type", NUMBERING_RELATIONSHIP_TYPE);
7135
- relationship.setAttribute("Target", "numbering.xml");
7136
- relsDoc.documentElement.appendChild(relationship);
7137
- zip.file(relsPath, buildXml(relsDoc));
7138
7448
  }
7139
7449
 
7140
7450
  // docx/numbering-package.ts
@@ -7241,17 +7551,14 @@ async function applyNumberingCatalog(zip, model, binding) {
7241
7551
  throw new Error(
7242
7552
  `Cannot edit numbering definition abstractNum "${id}"; the original numbering.xml is preserved unchanged.`
7243
7553
  );
7244
- for (const id of Object.keys(prior?.nums ?? {}))
7245
- if (JSON.stringify(next.nums[id]) !== JSON.stringify(prior?.nums[id]))
7246
- throw new Error(
7247
- `Cannot edit numbering definition num "${id}"; the original numbering.xml is preserved unchanged.`
7248
- );
7554
+ const startChanges = numberingStartChanges(prior, next);
7249
7555
  const newAbstractIds = Object.keys(next.abstractNums).filter((id) => !prior?.abstractNums[id]);
7250
7556
  const newNumIds = Object.keys(next.nums).filter((id) => !prior?.nums[id]);
7251
- if (!newAbstractIds.length && !newNumIds.length) return;
7557
+ if (!newAbstractIds.length && !newNumIds.length && !startChanges.length) return;
7252
7558
  const existingFile = zip.file("word/numbering.xml");
7253
7559
  const doc = existingFile ? parseXml2(await existingFile.async("string")) : parseXml2(`<w:numbering xmlns:w="${WORD_NS}"/>`);
7254
7560
  const root = doc.documentElement;
7561
+ patchNumberingStarts(doc, startChanges);
7255
7562
  const cleanup = children2(root, "numIdMacAtCleanup")[0] ?? null;
7256
7563
  const firstNum = children2(root, "num")[0] ?? cleanup;
7257
7564
  for (const id of newAbstractIds) {
@@ -8120,23 +8427,31 @@ function createFieldTracker() {
8120
8427
  const stack = [];
8121
8428
  return (element, run) => {
8122
8429
  let resultInstr;
8430
+ let resultLocked;
8123
8431
  for (const child3 of Array.from(element.childNodes)) {
8124
8432
  if (!isElement(child3)) continue;
8125
8433
  if (named2(child3, "fldChar")) {
8126
8434
  const type = getW(child3, "fldCharType");
8127
- if (type === "begin") stack.push({ instr: "", inResult: false });
8128
- else if (type === "separate") {
8435
+ if (type === "begin") {
8436
+ const locked = parseFieldFlags(child3)?.locked;
8437
+ stack.push({ instr: "", inResult: false, ...locked !== void 0 && { locked } });
8438
+ } else if (type === "separate") {
8129
8439
  const top = stack.at(-1);
8130
8440
  if (top) top.inResult = true;
8131
8441
  } else if (type === "end") stack.pop();
8132
8442
  } else {
8133
8443
  const top = stack.at(-1);
8134
8444
  if (named2(child3, "instrText") && top && !top.inResult) top.instr += textContent(child3);
8135
- else if ((named2(child3, "t") || named2(child3, "delText")) && top?.inResult)
8445
+ else if ((named2(child3, "t") || named2(child3, "delText")) && top?.inResult) {
8136
8446
  resultInstr = top.instr.trim();
8447
+ resultLocked = top.locked;
8448
+ }
8137
8449
  }
8138
8450
  }
8139
- if (resultInstr) run.field = { instr: resultInstr };
8451
+ if (resultInstr) {
8452
+ run.field = { instr: resultInstr };
8453
+ if (resultLocked !== void 0) run.fieldFlags = { locked: resultLocked };
8454
+ }
8140
8455
  return run;
8141
8456
  };
8142
8457
  }
@@ -8147,7 +8462,11 @@ function storyFieldResults(container) {
8147
8462
  if (named2(element, "fldSimple") || named2(element, "txbxContent")) return;
8148
8463
  if (named2(element, "r")) {
8149
8464
  const run = trackField(element, { text: "" });
8150
- if (run.field) metadata.set(element, run.field);
8465
+ if (run.field)
8466
+ metadata.set(element, {
8467
+ field: run.field,
8468
+ ...run.fieldFlags && { fieldFlags: run.fieldFlags }
8469
+ });
8151
8470
  return;
8152
8471
  }
8153
8472
  for (const child3 of Array.from(element.childNodes)) if (isElement(child3)) visit(child3);
@@ -8239,7 +8558,11 @@ function parseRun2(node, revision) {
8239
8558
  if (breakKind) run.break = breakKind;
8240
8559
  if (noteReference) run.noteReference = noteReference;
8241
8560
  if (noteMark) run.noteMark = noteMark;
8242
- if (fieldChar) run.fieldChar = fieldChar;
8561
+ if (fieldChar) {
8562
+ run.fieldChar = fieldChar;
8563
+ const flags = parseFieldFlags(only);
8564
+ if (flags) run.fieldFlags = flags;
8565
+ }
8243
8566
  if (fieldCode !== void 0) run.fieldCode = fieldCode;
8244
8567
  const runRevision = revision ?? runFormatRevision(props);
8245
8568
  if (runRevision) run.revision = runRevision;
@@ -8258,8 +8581,11 @@ function parseParagraph2(node, id, fields) {
8258
8581
  (element, revision) => {
8259
8582
  const run = parseRun2(element, revision);
8260
8583
  if (!fields) return trackField(element, run);
8261
- const field = fields.get(element);
8262
- if (field) run.field = { ...field };
8584
+ const metadata = fields.get(element);
8585
+ if (metadata) {
8586
+ run.field = { ...metadata.field };
8587
+ if (metadata.fieldFlags) run.fieldFlags = { ...metadata.fieldFlags };
8588
+ }
8263
8589
  return run;
8264
8590
  },
8265
8591
  (item) => {
@@ -8281,20 +8607,23 @@ function parseParagraph2(node, id, fields) {
8281
8607
  );
8282
8608
  if (link) return results.map((run) => ({ ...run, link }));
8283
8609
  const field = { instr: instr.trim(), simple: true };
8610
+ const flags = parseFieldFlags(item);
8611
+ const fieldState = flags ? { fieldFlags: flags } : {};
8284
8612
  const fieldInstanceId = `${id}:simple-field-${simpleFieldIndex++}`;
8285
- if (!results.length) return [{ text: fieldPlaceholderText(instr), field, fieldInstanceId }];
8613
+ if (!results.length)
8614
+ return [{ text: fieldPlaceholderText(instr), field, fieldInstanceId, ...fieldState }];
8286
8615
  if (results.every(
8287
8616
  (run) => !run.text && !run.equation && !run.image && !run.break && !run.noteReference && !run.noteMark && !run.fieldChar && run.fieldCode === void 0
8288
8617
  )) {
8289
8618
  return [
8290
- { text: "", fieldChar: "begin" },
8619
+ { text: "", fieldChar: "begin", ...fieldState },
8291
8620
  { text: "", fieldCode: instr },
8292
8621
  { text: "", fieldChar: "separate" },
8293
8622
  ...results,
8294
8623
  { text: "", fieldChar: "end" }
8295
8624
  ];
8296
8625
  }
8297
- return results.map((run) => ({ ...run, field, fieldInstanceId }));
8626
+ return results.map((run) => ({ ...run, field, fieldInstanceId, ...fieldState }));
8298
8627
  },
8299
8628
  (hyperlink) => {
8300
8629
  if (!activeContext) return void 0;
@@ -8667,138 +8996,6 @@ async function parseDocumentParts(zip, body, blocks, drawings) {
8667
8996
  };
8668
8997
  }
8669
8998
 
8670
- // docx/numbering-parse.ts
8671
- var integer2 = (value, fallback) => parseInteger(value) ?? fallback;
8672
- var flag = (element) => onOffElement(element) === true;
8673
- function byName(root, local) {
8674
- return Array.from(root.getElementsByTagName("*")).filter(
8675
- (node) => node.nodeType === 1 && named2(node, local)
8676
- );
8677
- }
8678
- function parseMarkerFormat(rPr) {
8679
- if (!rPr) return void 0;
8680
- const format = {};
8681
- const family = getW(first2(rPr, "rFonts"), "ascii");
8682
- if (family) format.fontFamily = family;
8683
- const size = parseInteger(getW(first2(rPr, "sz"), "val"));
8684
- if (size !== void 0 && size > 0) format.fontSizeHalfPoints = size;
8685
- if (onOffElement(first2(rPr, "b")) === true) format.bold = true;
8686
- if (onOffElement(first2(rPr, "i")) === true) format.italic = true;
8687
- const color = getW(first2(rPr, "color"), "val");
8688
- if (color && /^[0-9a-f]{6}$/i.test(color)) format.color = `#${color.toLowerCase()}`;
8689
- return Object.keys(format).length ? format : void 0;
8690
- }
8691
- function parseNumberingLevel(lvl) {
8692
- const level = integer2(getW(lvl, "ilvl"), 0);
8693
- const start = integer2(getW(first2(lvl, "start"), "val"), 1);
8694
- const numFmt = enumValue(isStNumberFormat, getW(first2(lvl, "numFmt"), "val"), "w:numFmt") ?? "decimal";
8695
- const lvlText = getW(first2(lvl, "lvlText"), "val") ?? "";
8696
- const jc = getW(first2(lvl, "lvlJc"), "val");
8697
- const ind = first2(first2(lvl, "pPr"), "ind");
8698
- const suffRaw = getW(first2(lvl, "suff"), "val");
8699
- const result = { level, start, numFmt, lvlText };
8700
- if (!first2(lvl, "start")) result.startWasOmitted = true;
8701
- const paragraphStyleId = getW(first2(lvl, "pStyle"), "val");
8702
- if (paragraphStyleId) result.paragraphStyleId = paragraphStyleId;
8703
- if (jc === "left" || jc === "center" || jc === "right") result.lvlJc = jc;
8704
- const left = getW(ind, "left") ?? getW(ind, "start");
8705
- if (left !== void 0) result.indentLeftTwips = parseSignedTwips(left) ?? signedTwips(0);
8706
- const hanging = getW(ind, "hanging");
8707
- if (hanging !== void 0) result.hangingTwips = parseTwips(hanging) ?? twips(0);
8708
- const firstLine = getW(ind, "firstLine");
8709
- if (firstLine !== void 0) result.firstLineTwips = parseTwips(firstLine) ?? twips(0);
8710
- const tabs = first2(first2(lvl, "pPr"), "tabs");
8711
- const tab = tabs ? children2(tabs, "tab").find((stop) => getW(stop, "val") !== "clear") : void 0;
8712
- const tabPos = tab ? parseTwips(getW(tab, "pos")) : void 0;
8713
- if (tabPos !== void 0) result.tabStopTwips = tabPos;
8714
- if (flag(first2(lvl, "isLgl"))) result.isLgl = true;
8715
- const restart = getW(first2(lvl, "lvlRestart"), "val");
8716
- if (restart !== void 0) result.lvlRestart = integer2(restart, 0);
8717
- const marker = parseMarkerFormat(first2(lvl, "rPr"));
8718
- if (marker) result.markerFormat = marker;
8719
- result.suffix = suffRaw === "space" ? "space" : suffRaw === "nothing" ? "none" : "tab";
8720
- return result;
8721
- }
8722
- function parseAbstractNum(element) {
8723
- const id = getW(element, "abstractNumId");
8724
- if (!id) return void 0;
8725
- const levels = {};
8726
- for (const lvl of children2(element, "lvl")) {
8727
- const parsed = parseNumberingLevel(lvl);
8728
- levels[parsed.level] = parsed;
8729
- }
8730
- return { id, levels };
8731
- }
8732
- function parseNum(element) {
8733
- const id = getW(element, "numId");
8734
- if (!id) return void 0;
8735
- const abstractNumId = getW(first2(element, "abstractNumId"), "val") ?? "";
8736
- const levelOverrides = {};
8737
- for (const override of children2(element, "lvlOverride")) {
8738
- const level = integer2(getW(override, "ilvl"), 0);
8739
- const entry = {};
8740
- const startOverride = getW(first2(override, "startOverride"), "val");
8741
- if (startOverride !== void 0) entry.startOverride = integer2(startOverride, 1);
8742
- const lvl = first2(override, "lvl");
8743
- if (lvl) entry.lvl = parseNumberingLevel(lvl);
8744
- if (Object.keys(entry).length) levelOverrides[level] = entry;
8745
- }
8746
- return {
8747
- id,
8748
- abstractNumId,
8749
- ...Object.keys(levelOverrides).length ? { levelOverrides } : {}
8750
- };
8751
- }
8752
- function parseNumberingCatalog(xml) {
8753
- const document = parseXml2(xml);
8754
- const root = document.documentElement;
8755
- const abstractNums = {};
8756
- const warnings = [];
8757
- for (const element of byName(root, "abstractNum")) {
8758
- const parsed = parseAbstractNum(element);
8759
- if (!parsed) continue;
8760
- abstractNums[parsed.id] = parsed;
8761
- const link = getW(first2(element, "numStyleLink"), "val");
8762
- if (link)
8763
- warnings.push(
8764
- `Numbering definition abstractNum ${parsed.id} links to style "${link}"; style-linked numbering levels are not resolved.`
8765
- );
8766
- if (byName(element, "lvlPicBulletId").length)
8767
- warnings.push(
8768
- `Numbering definition abstractNum ${parsed.id} uses a picture bullet; picture bullets are not rendered.`
8769
- );
8770
- }
8771
- const nums = {};
8772
- for (const element of byName(root, "num")) {
8773
- const parsed = parseNum(element);
8774
- if (parsed) nums[parsed.id] = parsed;
8775
- }
8776
- return { abstractNums, nums, warnings: [...new Set(warnings)] };
8777
- }
8778
- function resolveNumberingLevel(catalog, numId, level) {
8779
- const num = catalog.nums[numId];
8780
- if (!num) return void 0;
8781
- const override = num.levelOverrides?.[level];
8782
- const sourceAbstract = catalog.abstractNums[num.abstractNumId]?.levels[level];
8783
- const abstract = sourceAbstract?.startWasOmitted && sourceAbstract.start === 1 ? { ...sourceAbstract, start: 0 } : sourceAbstract;
8784
- let base = override?.lvl ?? abstract;
8785
- if (!base) return void 0;
8786
- if (override?.lvl) {
8787
- const { lvlRestart: _ignored, ...properties } = base;
8788
- base = {
8789
- ...properties,
8790
- ...abstract?.lvlRestart !== void 0 ? { lvlRestart: abstract.lvlRestart } : {}
8791
- };
8792
- }
8793
- let start = override?.startOverride ?? base.start;
8794
- if (override?.lvl) {
8795
- if (abstract?.lvlRestart === 0 && override.startOverride === void 0) start = abstract.start;
8796
- else if (!override.lvl.startWasOmitted || override.lvl.start !== 1) start = override.lvl.start;
8797
- else start = override.startOverride ?? 0;
8798
- }
8799
- return start !== base.start ? { ...base, start } : base;
8800
- }
8801
-
8802
8999
  // docx/comments.ts
8803
9000
  var W14_NS2 = "http://schemas.microsoft.com/office/word/2010/wordml";
8804
9001
  var W15_NS2 = "http://schemas.microsoft.com/office/word/2012/wordml";
@@ -9033,7 +9230,7 @@ async function readPackage(input) {
9033
9230
  const themeFile = zip.file("word/theme/theme1.xml");
9034
9231
  const settingsFile = zip.file("word/settings.xml");
9035
9232
  if (themeFile) {
9036
- model.theme = parseTheme(await themeFile.async("string"));
9233
+ model.theme = parseTheme2(await themeFile.async("string"));
9037
9234
  if (settingsFile) {
9038
9235
  const settingsXml = await settingsFile.async("string");
9039
9236
  model.theme.colorMapping = withParseWarnings(
@@ -9151,32 +9348,12 @@ async function loadDocx(input) {
9151
9348
  }
9152
9349
 
9153
9350
  // docx/diagram-theme.ts
9154
- var DEFAULT_MAPPING2 = {
9155
- bg1: "lt1",
9156
- tx1: "dk1",
9157
- bg2: "lt2",
9158
- tx2: "dk2"
9159
- };
9160
- var SLOTS = /* @__PURE__ */ new Set([
9161
- "dk1",
9162
- "lt1",
9163
- "dk2",
9164
- "lt2",
9165
- "accent1",
9166
- "accent2",
9167
- "accent3",
9168
- "accent4",
9169
- "accent5",
9170
- "accent6",
9171
- "hlink",
9172
- "folHlink"
9173
- ]);
9174
9351
  function diagramColorTheme(theme) {
9175
9352
  return {
9176
9353
  scheme(name) {
9177
9354
  if (!theme) return void 0;
9178
- const mapped = name in DEFAULT_MAPPING2 ? theme.colorMapping[name] ?? DEFAULT_MAPPING2[name] : SLOTS.has(name) ? name : void 0;
9179
- const hex = mapped ? theme.colors[mapped] : void 0;
9355
+ const slot2 = themeColorSlotFor(name, theme.colorMapping);
9356
+ const hex = slot2 ? theme.colors[slot2] : void 0;
9180
9357
  return hex ? `#${hex.replace(/^#/, "").toUpperCase()}` : void 0;
9181
9358
  }
9182
9359
  };
@@ -10628,4 +10805,4 @@ function presetOf(values) {
10628
10805
  });
10629
10806
  }
10630
10807
 
10631
- export { DEFAULT_STYLES_XML, DEFAULT_TABLE_BORDERS, DEFAULT_TOC_INSTRUCTION, DIAGRAM_GRAPHIC_URI, DocxModelValidationError, EMPTY_FIGURES_TEXT, EMPTY_TOC_TEXT, EMU_PER_INCH, EMU_PER_PIXEL, EMU_PER_POINT, LIGATURE_VALUES, PAGE_SIZES, PAGE_SIZE_OPTIONS, PIXELS_PER_INCH, PROPERTY_FIELDS, ST_AlgClass, ST_AlgType, ST_AnnotationVMerge, ST_Border, ST_BrClear, ST_BrType, ST_CalendarType, ST_CaptionPos, ST_ChapterSep, ST_CharacterSpacing, ST_CombineBrackets, ST_ConformanceClass, ST_CryptProv, ST_Direction, ST_DisplacedByCustomXml, ST_DocGrid, ST_DocPartBehavior, ST_DocPartGallery, ST_DocPartType, ST_DocProtect, ST_DropCap, ST_EdGrp, ST_EdnPos, ST_Em, ST_FFTextType, ST_FldCharType, ST_FontFamily, ST_FrameLayout, ST_FrameScrollbar, ST_FtnEdn, ST_FtnPos, ST_HAnchor, ST_HdrFtr, ST_HeightRule, ST_HexColorAuto, ST_HighlightColor, ST_Hint, ST_InfoTextType, ST_Jc, ST_JcTable, ST_LevelSuffix, ST_LineNumberRestart, ST_LineSpacingRule, ST_Lock, ST_MailMergeDest, ST_MailMergeDocType, ST_MailMergeOdsoFMDFieldType, ST_MailMergeSourceType, ST_Merge, ST_MultiLevelType, ST_NumberFormat, ST_ObjectDrawAspect, ST_ObjectUpdateMode, ST_OnOff1, ST_PTabAlignment, ST_PTabLeader, ST_PTabRelativeTo, ST_PageBorderDisplay, ST_PageBorderOffset, ST_PageBorderZOrder, ST_PageOrientation, ST_Pitch, ST_Proof, ST_ProofErr, ST_RelFromH, ST_RelFromV, ST_RestartNumber, ST_RubyAlign, ST_SchemeColorVal, ST_SdtDateMappingType, ST_SectionMark, ST_Shd, ST_StyleSort, ST_StyleType, ST_TabJc, ST_TabTlc, ST_TargetScreenSz, ST_TblLayoutType, ST_TblOverlap, ST_TblStyleOverrideType, ST_TblWidth, ST_TextAlignment, ST_TextDirection, ST_TextEffect, ST_TextboxTightWrap, ST_Theme, ST_ThemeColor, ST_TrueFalse, ST_TrueFalseBlank, ST_Underline, ST_VAnchor, ST_VerticalAlignRun, ST_VerticalJc, ST_View, ST_WmlColorSchemeIndex, ST_Wrap, ST_XAlign, ST_YAlign, ST_Zoom, TWIPS_PER_INCH, TWIPS_PER_POINT, WORD, WORD_HIGHLIGHT_TOKENS, WORD_UNDERLINE_TOKENS, acceptAllRevisions, acceptRevision, alignFromJustification, applyPageSetup, applyThemeShade, applyThemeTint, assertValidDocumentModel, buildTableOfContents, captionParagraphs, changeColumnGap, changeColumnWidth, columnPreset, columnTextWidth, computeListLabels, createDocument, createListDefinition, dateFieldResult, datePicture, defaultStyleCatalogs, diagramColorTheme, diagramsIn, displayListLabel, documentStats, eighthPoints, eighthPointsFromPoints, eighthPointsToPoints, emu, emuFromPixels, emuToPixels, ensureListDefinition, enumValue, equalColumnDraft, fieldName, findRevision, findTableOfContents, formatListNumber, formatNoteNumber, formatWordDate, halfPoints, halfPointsFromPoints, halfPointsToPoints, headingLevel, headingListLevels, isCaptionOf, isHeadingListKind, isLigatures, isRunHiddenForReview, isStAlgClass, isStAlgType, isStAnnotationVMerge, isStBorder, isStBrClear, isStBrType, isStCalendarType, isStCaptionPos, isStChapterSep, isStCharacterSpacing, isStCombineBrackets, isStConformanceClass, isStCryptProv, isStDirection, isStDisplacedByCustomXml, isStDocGrid, isStDocPartBehavior, isStDocPartGallery, isStDocPartType, isStDocProtect, isStDropCap, isStEdGrp, isStEdnPos, isStEm, isStFFTextType, isStFldCharType, isStFontFamily, isStFrameLayout, isStFrameScrollbar, isStFtnEdn, isStFtnPos, isStHAnchor, isStHdrFtr, isStHeightRule, isStHexColorAuto, isStHighlightColor, isStHint, isStInfoTextType, isStJc, isStJcTable, isStLevelSuffix, isStLineNumberRestart, isStLineSpacingRule, isStLock, isStMailMergeDest, isStMailMergeDocType, isStMailMergeOdsoFMDFieldType, isStMailMergeSourceType, isStMerge, isStMultiLevelType, isStNumberFormat, isStObjectDrawAspect, isStObjectUpdateMode, isStOnOff1, isStPTabAlignment, isStPTabLeader, isStPTabRelativeTo, isStPageBorderDisplay, isStPageBorderOffset, isStPageBorderZOrder, isStPageOrientation, isStPitch, isStProof, isStProofErr, isStRelFromH, isStRelFromV, isStRestartNumber, isStRubyAlign, isStSchemeColorVal, isStSdtDateMappingType, isStSectionMark, isStShd, isStStyleSort, isStStyleType, isStTabJc, isStTabTlc, isStTargetScreenSz, isStTblLayoutType, isStTblOverlap, isStTblStyleOverrideType, isStTblWidth, isStTextAlignment, isStTextDirection, isStTextEffect, isStTextboxTightWrap, isStTheme, isStThemeColor, isStTrueFalse, isStTrueFalseBlank, isStUnderline, isStVAnchor, isStVerticalAlignRun, isStVerticalJc, isStView, isStWmlColorSchemeIndex, isStWrap, isStXAlign, isStYAlign, isStZoom, isThemeColorToken, isValidLanguageTag, isWordHighlightToken, isWordUnderlineStyle, lineSpacingLabel, lineSpacingOptions, lineSpacingValue, linkStylesToList, listRevisions, loadDocx, numberNotesInOrder, onOffAttribute, onOffElement, pageSizeOf, paragraphTwipsFromAttrs, parseColorSchemeMapping, parseEighthPoints, parseHalfPoints, parseHexColor, parseInteger, parseJustification, parseLineSpacingValue, parseNumberingCatalog, parseOnOff, parseParagraphStyleCatalog, parseRgbColor, parseRunStyleCatalog, parseSignedHalfPoints, parseSignedTwips, parseTableStyleCatalog, parseTextScale, parseTheme, parseTintShade, parseTwips, parseUnsignedInteger, plainText2 as plainText, presetOf, readColumnDraft, readPageSetup, rejectAllRevisions, rejectRevision, reportParseWarning, resolveCellVisuals, resolveDiagramColor, resolveNumberingLevel, resolveParagraphFormatting, resolveParagraphNumbering, resolveRunFormatting, resolveStyleNumbering, resolveTableStyleFormatting, resolveThemeColorReference, resolveThemeColorToken, reviewDocumentFormatting, reviewFormattingWarnings, reviewParagraphFormatting, reviewRunFormatting, roundEighthPoints, roundEmu, roundHalfPoints, roundSignedTwips, roundTwips, saveDocx, sectionLayoutJson, sectionsFromLayout, sectionsOf, setColumns, setLineNumbering, setMargins, setOrientation, setPageNumbering, setPageSize, setTitlePage, setVerticalAlign, signedTwips, signedTwipsAttr, signedTwipsFromPixels, signedTwipsFromPoints, tableOfFiguresInstruction, tocBookmarks, tocCaptionLabel, tocEntries, tocHyperlinks, tocLevels, transformCase, twips, twipsAttr, twipsFromInches, twipsFromPixels, twipsFromPoints, twipsToInches, twipsToPixels, twipsToPoints, unequalColumnPreset, universalMeasureToTwips, updateTableOfContents, validColumnDraft, validateDocumentModel, validatePageSetup, withParseWarnings, withSection, withTocBookmarks };
10808
+ export { DEFAULT_STYLES_XML, DEFAULT_TABLE_BORDERS, DEFAULT_TOC_INSTRUCTION, DIAGRAM_GRAPHIC_URI, DocxModelValidationError, EMPTY_FIGURES_TEXT, EMPTY_TOC_TEXT, EMU_PER_INCH, EMU_PER_PIXEL, EMU_PER_POINT, LIGATURE_VALUES, PAGE_SIZES, PAGE_SIZE_OPTIONS, PIXELS_PER_INCH, PROPERTY_FIELDS, ST_AlgClass, ST_AlgType, ST_AnnotationVMerge, ST_Border, ST_BrClear, ST_BrType, ST_CalendarType, ST_CaptionPos, ST_ChapterSep, ST_CharacterSpacing, ST_CombineBrackets, ST_ConformanceClass, ST_CryptProv, ST_Direction, ST_DisplacedByCustomXml, ST_DocGrid, ST_DocPartBehavior, ST_DocPartGallery, ST_DocPartType, ST_DocProtect, ST_DropCap, ST_EdGrp, ST_EdnPos, ST_Em, ST_FFTextType, ST_FldCharType, ST_FontFamily, ST_FrameLayout, ST_FrameScrollbar, ST_FtnEdn, ST_FtnPos, ST_HAnchor, ST_HdrFtr, ST_HeightRule, ST_HexColorAuto, ST_HighlightColor, ST_Hint, ST_InfoTextType, ST_Jc, ST_JcTable, ST_LevelSuffix, ST_LineNumberRestart, ST_LineSpacingRule, ST_Lock, ST_MailMergeDest, ST_MailMergeDocType, ST_MailMergeOdsoFMDFieldType, ST_MailMergeSourceType, ST_Merge, ST_MultiLevelType, ST_NumberFormat, ST_ObjectDrawAspect, ST_ObjectUpdateMode, ST_OnOff1, ST_PTabAlignment, ST_PTabLeader, ST_PTabRelativeTo, ST_PageBorderDisplay, ST_PageBorderOffset, ST_PageBorderZOrder, ST_PageOrientation, ST_Pitch, ST_Proof, ST_ProofErr, ST_RelFromH, ST_RelFromV, ST_RestartNumber, ST_RubyAlign, ST_SchemeColorVal, ST_SdtDateMappingType, ST_SectionMark, ST_Shd, ST_StyleSort, ST_StyleType, ST_TabJc, ST_TabTlc, ST_TargetScreenSz, ST_TblLayoutType, ST_TblOverlap, ST_TblStyleOverrideType, ST_TblWidth, ST_TextAlignment, ST_TextDirection, ST_TextEffect, ST_TextboxTightWrap, ST_Theme, ST_ThemeColor, ST_TrueFalse, ST_TrueFalseBlank, ST_Underline, ST_VAnchor, ST_VerticalAlignRun, ST_VerticalJc, ST_View, ST_WmlColorSchemeIndex, ST_Wrap, ST_XAlign, ST_YAlign, ST_Zoom, TWIPS_PER_INCH, TWIPS_PER_POINT, WORD, WORD_HIGHLIGHT_TOKENS, WORD_UNDERLINE_TOKENS, acceptAllRevisions, acceptRevision, alignFromJustification, applyPageSetup, applyThemeShade, applyThemeTint, assertValidDocumentModel, buildTableOfContents, captionParagraphs, changeColumnGap, changeColumnWidth, columnPreset, columnTextWidth, computeListLabels, createDocument, createListDefinition, dateFieldResult, datePicture, defaultStyleCatalogs, diagramColorTheme, diagramsIn, displayListLabel, documentStats, eighthPoints, eighthPointsFromPoints, eighthPointsToPoints, emu, emuFromPixels, emuToPixels, ensureListDefinition, enumValue, equalColumnDraft, fieldName, findRevision, findTableOfContents, formatListNumber, formatNoteNumber, formatWordDate, halfPoints, halfPointsFromPoints, halfPointsToPoints, headingLevel, headingListLevels, isCaptionOf, isFieldLocked, isHeadingListKind, isLigatures, isRunHiddenForReview, isStAlgClass, isStAlgType, isStAnnotationVMerge, isStBorder, isStBrClear, isStBrType, isStCalendarType, isStCaptionPos, isStChapterSep, isStCharacterSpacing, isStCombineBrackets, isStConformanceClass, isStCryptProv, isStDirection, isStDisplacedByCustomXml, isStDocGrid, isStDocPartBehavior, isStDocPartGallery, isStDocPartType, isStDocProtect, isStDropCap, isStEdGrp, isStEdnPos, isStEm, isStFFTextType, isStFldCharType, isStFontFamily, isStFrameLayout, isStFrameScrollbar, isStFtnEdn, isStFtnPos, isStHAnchor, isStHdrFtr, isStHeightRule, isStHexColorAuto, isStHighlightColor, isStHint, isStInfoTextType, isStJc, isStJcTable, isStLevelSuffix, isStLineNumberRestart, isStLineSpacingRule, isStLock, isStMailMergeDest, isStMailMergeDocType, isStMailMergeOdsoFMDFieldType, isStMailMergeSourceType, isStMerge, isStMultiLevelType, isStNumberFormat, isStObjectDrawAspect, isStObjectUpdateMode, isStOnOff1, isStPTabAlignment, isStPTabLeader, isStPTabRelativeTo, isStPageBorderDisplay, isStPageBorderOffset, isStPageBorderZOrder, isStPageOrientation, isStPitch, isStProof, isStProofErr, isStRelFromH, isStRelFromV, isStRestartNumber, isStRubyAlign, isStSchemeColorVal, isStSdtDateMappingType, isStSectionMark, isStShd, isStStyleSort, isStStyleType, isStTabJc, isStTabTlc, isStTargetScreenSz, isStTblLayoutType, isStTblOverlap, isStTblStyleOverrideType, isStTblWidth, isStTextAlignment, isStTextDirection, isStTextEffect, isStTextboxTightWrap, isStTheme, isStThemeColor, isStTrueFalse, isStTrueFalseBlank, isStUnderline, isStVAnchor, isStVerticalAlignRun, isStVerticalJc, isStView, isStWmlColorSchemeIndex, isStWrap, isStXAlign, isStYAlign, isStZoom, isThemeColorToken, isValidLanguageTag, isWordHighlightToken, isWordUnderlineStyle, lineSpacingLabel, lineSpacingOptions, lineSpacingValue, linkStylesToList, listRevisions, loadDocx, numberNotesInOrder, onOffAttribute, onOffElement, pageSizeOf, paragraphTwipsFromAttrs, parseColorSchemeMapping, parseEighthPoints, parseHalfPoints, parseHexColor, parseInteger, parseJustification, parseLineSpacingValue, parseNumberingCatalog, parseOnOff, parseParagraphStyleCatalog, parseRgbColor, parseRunStyleCatalog, parseSignedHalfPoints, parseSignedTwips, parseTableStyleCatalog, parseTextScale, parseTheme2 as parseTheme, parseTintShade, parseTwips, parseUnsignedInteger, plainText2 as plainText, presetOf, readColumnDraft, readPageSetup, rejectAllRevisions, rejectRevision, reportParseWarning, resolveCellVisuals, resolveDiagramColor, resolveNumberingLevel, resolveParagraphFormatting, resolveParagraphNumbering, resolveRunFormatting, resolveStyleNumbering, resolveTableStyleFormatting, resolveThemeColorReference, resolveThemeColorToken, reviewDocumentFormatting, reviewFormattingWarnings, reviewParagraphFormatting, reviewRunFormatting, roundEighthPoints, roundEmu, roundHalfPoints, roundSignedTwips, roundTwips, saveDocx, sectionLayoutJson, sectionsFromLayout, sectionsOf, setColumns, setLineNumbering, setListStartOverride, setMargins, setOrientation, setPageNumbering, setPageSize, setTitlePage, setVerticalAlign, signedTwips, signedTwipsAttr, signedTwipsFromPixels, signedTwipsFromPoints, tableOfFiguresInstruction, tocBookmarks, tocCaptionLabel, tocEntries, tocHyperlinks, tocLevels, transformCase, twips, twipsAttr, twipsFromInches, twipsFromPixels, twipsFromPoints, twipsToInches, twipsToPixels, twipsToPoints, unequalColumnPreset, universalMeasureToTwips, updateTableOfContents, validColumnDraft, validateDocumentModel, validatePageSetup, withParseWarnings, withSection, withTocBookmarks };