@office-open/docx 0.10.10 → 0.10.11

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.
@@ -179,6 +179,32 @@ function breakXml(breakOpt) {
179
179
  return count === 1 ? one : one.repeat(count);
180
180
  }
181
181
  /**
182
+ * Empty EG_RunInnerContent elements — self-closing XML with no attributes.
183
+ * Shared by the body run stringifier and the inline (footnote/endnote) run
184
+ * stringifier so both emit them identically. Keyed by the RunOptions child
185
+ * property name (e.g. `{ separator: true }` → `separator`).
186
+ *
187
+ * XSD reference: EG_RunInnerContent group in wml.xsd.
188
+ */
189
+ const EMPTY_RUN_ELEMENTS = {
190
+ noBreakHyphen: "<w:noBreakHyphen/>",
191
+ softHyphen: "<w:softHyphen/>",
192
+ dayShort: "<w:dayShort/>",
193
+ monthShort: "<w:monthShort/>",
194
+ yearShort: "<w:yearShort/>",
195
+ dayLong: "<w:dayLong/>",
196
+ monthLong: "<w:monthLong/>",
197
+ yearLong: "<w:yearLong/>",
198
+ annotationRef: "<w:annotationRef/>",
199
+ footnoteRef: "<w:footnoteRef/>",
200
+ endnoteRef: "<w:endnoteRef/>",
201
+ separator: "<w:separator/>",
202
+ continuationSeparator: "<w:continuationSeparator/>",
203
+ pgNum: "<w:pgNum/>",
204
+ carriageReturn: "<w:cr/>",
205
+ lastRenderedPageBreak: "<w:lastRenderedPageBreak/>"
206
+ };
207
+ /**
182
208
  * Constants for page number field types.
183
209
  *
184
210
  * These values are used to insert dynamic page number fields into a document.
@@ -1431,6 +1457,133 @@ function parseEmbed(el) {
1431
1457
  return opts;
1432
1458
  }
1433
1459
  //#endregion
1460
+ //#region src/shared/shading.ts
1461
+ /**
1462
+ * Shading module for WordprocessingML documents.
1463
+ *
1464
+ * Shading is used to apply background colors and patterns to paragraphs,
1465
+ * table cells, and text runs. The shading type is identical in all places.
1466
+ *
1467
+ * Reference: http://officeopenxml.com/WPshading.php
1468
+ *
1469
+ * @see http://officeopenxml.com/WPtableShading.php
1470
+ * @see http://officeopenxml.com/WPtableCellProperties-Shading.php
1471
+ *
1472
+ * ## XSD Schema
1473
+ * ```xml
1474
+ * <xsd:complexType name="CT_Shd">
1475
+ * <xsd:attribute name="val" type="ST_Shd" use="required"/>
1476
+ * <xsd:attribute name="color" type="ST_HexColor" use="optional"/>
1477
+ * <xsd:attribute name="themeColor" type="ST_ThemeColor" use="optional"/>
1478
+ * <xsd:attribute name="themeTint" type="ST_UcharHexNumber" use="optional"/>
1479
+ * <xsd:attribute name="themeShade" type="ST_UcharHexNumber" use="optional"/>
1480
+ * <xsd:attribute name="fill" type="ST_HexColor" use="optional"/>
1481
+ * <xsd:attribute name="themeFill" type="ST_ThemeColor" use="optional"/>
1482
+ * <xsd:attribute name="themeFillTint" type="ST_UcharHexNumber" use="optional"/>
1483
+ * <xsd:attribute name="themeFillShade" type="ST_UcharHexNumber" use="optional"/>
1484
+ * </xsd:complexType>
1485
+ * ```
1486
+ *
1487
+ * @module
1488
+ */
1489
+ /**
1490
+ * Shading pattern types.
1491
+ *
1492
+ * Specifies the pattern used for shading. The pattern combines the fill
1493
+ * color and the pattern color.
1494
+ *
1495
+ * ## XSD Schema
1496
+ * ```xml
1497
+ * <xsd:simpleType name="ST_Shd">
1498
+ * <xsd:restriction base="xsd:string">
1499
+ * <xsd:enumeration value="nil"/>
1500
+ * <xsd:enumeration value="clear"/>
1501
+ * <xsd:enumeration value="solid"/>
1502
+ * <xsd:enumeration value="horzStripe"/>
1503
+ * <xsd:enumeration value="vertStripe"/>
1504
+ * <xsd:enumeration value="reverseDiagStripe"/>
1505
+ * <xsd:enumeration value="diagStripe"/>
1506
+ * <xsd:enumeration value="horzCross"/>
1507
+ * <xsd:enumeration value="diagCross"/>
1508
+ * <!-- ... percent values ... -->
1509
+ * </xsd:restriction>
1510
+ * </xsd:simpleType>
1511
+ * ```
1512
+ *
1513
+ * @publicApi
1514
+ */
1515
+ const ShadingType = {
1516
+ /** Clear shading - no pattern, fill color only */
1517
+ CLEAR: "clear",
1518
+ DIAGONAL_CROSS: "diagCross",
1519
+ DIAGONAL_STRIPE: "diagStripe",
1520
+ HORIZONTAL_CROSS: "horzCross",
1521
+ HORIZONTAL_STRIPE: "horzStripe",
1522
+ NIL: "nil",
1523
+ PERCENT_10: "pct10",
1524
+ PERCENT_12: "pct12",
1525
+ PERCENT_15: "pct15",
1526
+ PERCENT_20: "pct20",
1527
+ PERCENT_25: "pct25",
1528
+ PERCENT_30: "pct30",
1529
+ PERCENT_35: "pct35",
1530
+ PERCENT_37: "pct37",
1531
+ PERCENT_40: "pct40",
1532
+ PERCENT_45: "pct45",
1533
+ PERCENT_5: "pct5",
1534
+ PERCENT_50: "pct50",
1535
+ PERCENT_55: "pct55",
1536
+ PERCENT_60: "pct60",
1537
+ PERCENT_62: "pct62",
1538
+ PERCENT_65: "pct65",
1539
+ PERCENT_70: "pct70",
1540
+ PERCENT_75: "pct75",
1541
+ PERCENT_80: "pct80",
1542
+ PERCENT_85: "pct85",
1543
+ PERCENT_87: "pct87",
1544
+ PERCENT_90: "pct90",
1545
+ PERCENT_95: "pct95",
1546
+ REVERSE_DIAGONAL_STRIPE: "reverseDiagStripe",
1547
+ SOLID: "solid",
1548
+ THIN_DIAGONAL_CROSS: "thinDiagCross",
1549
+ THIN_DIAGONAL_STRIPE: "thinDiagStripe",
1550
+ THIN_HORIZONTAL_CROSS: "thinHorzCross",
1551
+ THIN_REVERSE_DIAGONAL_STRIPE: "thinReverseDiagStripe",
1552
+ THIN_VERTICAL_STRIPE: "thinVertStripe",
1553
+ VERTICAL_STRIPE: "vertStripe"
1554
+ };
1555
+ const THEME_COLORS$2 = Object.values(ThemeColor);
1556
+ /**
1557
+ * Parse a w:shd (CT_Shd) element into ShadingAttributesProperties.
1558
+ *
1559
+ * Reads every CT_Shd attribute (fill/color/val plus the theme* family), so the
1560
+ * result round-trips losslessly — paragraph, table-cell, and run shading all
1561
+ * share this single reader. Returns undefined when the element carries no data.
1562
+ */
1563
+ function parseShading(shd) {
1564
+ const shading = {};
1565
+ const fill = attr(shd, "w:fill");
1566
+ if (fill) shading.fill = fill;
1567
+ const color = attr(shd, "w:color");
1568
+ if (color) shading.color = color;
1569
+ const val = attr(shd, "w:val");
1570
+ if (val) shading.type = val;
1571
+ const themeColor = attr(shd, "w:themeColor");
1572
+ if (themeColor && THEME_COLORS$2.includes(themeColor)) shading.themeColor = themeColor;
1573
+ const themeTint = attr(shd, "w:themeTint");
1574
+ if (themeTint) shading.themeTint = themeTint;
1575
+ const themeShade = attr(shd, "w:themeShade");
1576
+ if (themeShade) shading.themeShade = themeShade;
1577
+ const themeFill = attr(shd, "w:themeFill");
1578
+ if (themeFill && THEME_COLORS$2.includes(themeFill)) shading.themeFill = themeFill;
1579
+ const themeFillTint = attr(shd, "w:themeFillTint");
1580
+ if (themeFillTint) shading.themeFillTint = themeFillTint;
1581
+ const themeFillShade = attr(shd, "w:themeFillShade");
1582
+ if (themeFillShade) shading.themeFillShade = themeFillShade;
1583
+ if (Object.keys(shading).length === 0) return void 0;
1584
+ return shading;
1585
+ }
1586
+ //#endregion
1434
1587
  //#region src/util/stringify-element.ts
1435
1588
  /**
1436
1589
  * Element-to-XML serialization helpers shared across the parse layer.
@@ -1629,7 +1782,7 @@ function parseRunProperties(el) {
1629
1782
  const bdr = findChild(el, "w:bdr");
1630
1783
  if (bdr) opts.border = parseBorder(bdr);
1631
1784
  const shd = findChild(el, "w:shd");
1632
- if (shd) opts.shading = parseShading$1(shd);
1785
+ if (shd) opts.shading = parseShading(shd);
1633
1786
  const eastAsianLayout = findChild(el, "w:eastAsianLayout");
1634
1787
  if (eastAsianLayout) opts.eastAsianLayout = parseEastAsianLayout(eastAsianLayout);
1635
1788
  const contentPart = findChild(el, "w:contentPart");
@@ -1675,19 +1828,6 @@ function parseBorder(el) {
1675
1828
  return opts;
1676
1829
  }
1677
1830
  /**
1678
- * Parse a w:shd element into ShadingAttributesProperties.
1679
- */
1680
- function parseShading$1(el) {
1681
- const opts = {};
1682
- const fill = colorAttr(el, "w:fill");
1683
- if (fill) opts.fill = fill;
1684
- const color = colorAttr(el, "w:color");
1685
- if (color) opts.color = color;
1686
- const type = attr(el, "w:val");
1687
- if (type) opts.type = type;
1688
- return opts;
1689
- }
1690
- /**
1691
1831
  * Parse a w:eastAsianLayout element into EastAsianLayoutOptions.
1692
1832
  */
1693
1833
  function parseEastAsianLayout(el) {
@@ -2220,7 +2360,7 @@ function stringifyParagraphProperties(options) {
2220
2360
  if (options.suppressAutoHyphens !== void 0) parts.push(onOff$1("w:suppressAutoHyphens", options.suppressAutoHyphens));
2221
2361
  if (options.kinsoku !== void 0) parts.push(onOff$1("w:kinsoku", options.kinsoku));
2222
2362
  if (options.wordWrap !== void 0) parts.push(onOff$1("w:wordWrap", options.wordWrap));
2223
- if (options.overflowPunctuation) parts.push(onOff$1("w:overflowPunct", options.overflowPunctuation));
2363
+ if (options.overflowPunctuation !== void 0) parts.push(onOff$1("w:overflowPunct", options.overflowPunctuation));
2224
2364
  if (options.topLinePunct !== void 0) parts.push(onOff$1("w:topLinePunct", options.topLinePunct));
2225
2365
  if (options.autoSpaceDE !== void 0) parts.push(onOff$1("w:autoSpaceDE", options.autoSpaceDE));
2226
2366
  if (options.autoSpaceEastAsianText !== void 0) parts.push(onOff$1("w:autoSpaceDN", options.autoSpaceEastAsianText));
@@ -4128,8 +4268,39 @@ function tocInstructionStr(opts) {
4128
4268
  function stringifyTableOfContents(alias = "Table of Contents", options = {}, entriesXml = "") {
4129
4269
  const instr = tocInstructionStr(options);
4130
4270
  const aliasAttr = alias ? ` w:val="${escapeXml(alias)}"` : "";
4131
- const dirtyAttr = entriesXml.length > 0 ? "" : " w:dirty=\"1\"";
4132
- return `<w:sdt>${`<w:sdtPr><w:alias${aliasAttr}/><w:docPartObj><w:docPartGallery w:val="Table of Contents"/></w:docPartObj></w:sdtPr>`}${`<w:sdtContent><w:p><w:r><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:cstheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cs="Times New Roman"/></w:rPr><w:fldChar w:fldCharType="begin"${dirtyAttr}/></w:r><w:r><w:instrText xml:space="preserve"> ${instr} </w:instrText></w:r><w:r><w:fldChar w:fldCharType="separate"/></w:r></w:p>` + entriesXml + "<w:p><w:r><w:fldChar w:fldCharType=\"end\"/></w:r></w:p></w:sdtContent>"}</w:sdt>`;
4271
+ const headRuns = `<w:r><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:cstheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cs="Times New Roman"/></w:rPr><w:fldChar w:fldCharType="begin"${entriesXml.length > 0 ? "" : " w:dirty=\"1\""}/></w:r><w:r><w:instrText xml:space="preserve"> ${instr} </w:instrText></w:r><w:r><w:fldChar w:fldCharType="separate"/></w:r>`;
4272
+ const endRun = `<w:r><w:fldChar w:fldCharType="end"/></w:r>`;
4273
+ const endParagraph = `<w:p>${endRun}</w:p>`;
4274
+ const body = entriesXml ? injectFieldEnd(injectFieldHead(entriesXml, headRuns), endRun) : `<w:p>${headRuns}</w:p>` + endParagraph;
4275
+ return `<w:sdt>${`<w:sdtPr><w:alias${aliasAttr}/><w:docPartObj><w:docPartGallery w:val="Table of Contents"/></w:docPartObj></w:sdtPr>`}${`<w:sdtContent>${body}</w:sdtContent>`}</w:sdt>`;
4276
+ }
4277
+ /**
4278
+ * Inject the field-head runs into the first `<w:p>` of `entriesXml`, placing
4279
+ * them after the opening tag (and after `<w:pPr>` when present) so the head
4280
+ * shares the first entry's paragraph. Returns `entriesXml` unchanged when no
4281
+ * `<w:p>` is found.
4282
+ */
4283
+ function injectFieldHead(entriesXml, headRuns) {
4284
+ const pTagStart = entriesXml.search(/<w:p[ >]/);
4285
+ if (pTagStart < 0) return entriesXml;
4286
+ const pTagEnd = entriesXml.indexOf(">", pTagStart) + 1;
4287
+ let injectAt = pTagEnd;
4288
+ if (entriesXml.slice(pTagEnd, pTagEnd + 7) === "<w:pPr>") {
4289
+ const pPrEnd = entriesXml.indexOf("</w:pPr>", pTagEnd);
4290
+ if (pPrEnd >= 0) injectAt = pPrEnd + 8;
4291
+ }
4292
+ return entriesXml.slice(0, injectAt) + headRuns + entriesXml.slice(injectAt);
4293
+ }
4294
+ /**
4295
+ * Inject the field-end run into the last `<w:p>` of `entriesXml` (before its
4296
+ * closing `</w:p>`) so the end shares the last entry's paragraph instead of
4297
+ * occupying a standalone control-only paragraph that renders as a blank line.
4298
+ * Returns `entriesXml` unchanged when no `</w:p>` is found.
4299
+ */
4300
+ function injectFieldEnd(entriesXml, endRun) {
4301
+ const lastClose = entriesXml.lastIndexOf("</w:p>");
4302
+ if (lastClose < 0) return entriesXml;
4303
+ return entriesXml.slice(0, lastClose) + endRun + entriesXml.slice(lastClose);
4133
4304
  }
4134
4305
  //#endregion
4135
4306
  //#region src/parts/textbox/shape/shape.ts
@@ -4648,32 +4819,6 @@ function replaceRelsWithPlaceholders(xml, ctx, prefix) {
4648
4819
  * @module
4649
4820
  */
4650
4821
  /**
4651
- * Mapping from empty child property name to self-closing XML element.
4652
- *
4653
- * These are single-key objects like `{ noBreakHyphen: true }` that map to
4654
- * self-closing XML elements with no attributes.
4655
- *
4656
- * XSD reference: EG_RunInnerContent group in wml.xsd.
4657
- */
4658
- const EMPTY_RUN_ELEMENTS = {
4659
- noBreakHyphen: "<w:noBreakHyphen/>",
4660
- softHyphen: "<w:softHyphen/>",
4661
- dayShort: "<w:dayShort/>",
4662
- monthShort: "<w:monthShort/>",
4663
- yearShort: "<w:yearShort/>",
4664
- dayLong: "<w:dayLong/>",
4665
- monthLong: "<w:monthLong/>",
4666
- yearLong: "<w:yearLong/>",
4667
- annotationRef: "<w:annotationRef/>",
4668
- footnoteRef: "<w:footnoteRef/>",
4669
- endnoteRef: "<w:endnoteRef/>",
4670
- separator: "<w:separator/>",
4671
- continuationSeparator: "<w:continuationSeparator/>",
4672
- pgNum: "<w:pgNum/>",
4673
- carriageReturn: "<w:cr/>",
4674
- lastRenderedPageBreak: "<w:lastRenderedPageBreak/>"
4675
- };
4676
- /**
4677
4822
  * Stringify a run (w:r) from pure JSON options.
4678
4823
  *
4679
4824
  * Handles text, children, breaks, and run properties.
@@ -5005,7 +5150,8 @@ function parseParagraphProperties(el, ctx) {
5005
5150
  const level = ilvl ? attrNum(ilvl, "w:val") ?? 0 : 0;
5006
5151
  const numIdEl = findChild(numPr, "w:numId");
5007
5152
  const numId = numIdEl ? attr(numIdEl, "w:val") : void 0;
5008
- if (numId !== void 0 && ctx.numberingCache.size > 0) {
5153
+ if (numId === "0") opts.numbering = false;
5154
+ else if (numId !== void 0 && ctx.numberingCache.size > 0) {
5009
5155
  const numEl = ctx.docx.numbering;
5010
5156
  if (numEl) {
5011
5157
  let abstractNumId;
@@ -5116,14 +5262,8 @@ function parseParagraphProperties(el, ctx) {
5116
5262
  }
5117
5263
  const shd = findChild(el, "w:shd");
5118
5264
  if (shd) {
5119
- const shdObj = {};
5120
- const fill = attr(shd, "w:fill");
5121
- if (fill) shdObj.fill = fill;
5122
- const color = attr(shd, "w:color");
5123
- if (color) shdObj.color = color;
5124
- const val = attr(shd, "w:val");
5125
- if (val) shdObj.type = val;
5126
- if (Object.keys(shdObj).length > 0) opts.shading = shdObj;
5265
+ const shading = parseShading(shd);
5266
+ if (shading) opts.shading = shading;
5127
5267
  }
5128
5268
  const textAlignment = findChild(el, "w:textAlignment");
5129
5269
  if (textAlignment) {
@@ -5985,8 +6125,9 @@ function parseImageRun(el, ctx) {
5985
6125
  if (!mediaPath) return void 0;
5986
6126
  const imageData = ctx.docx.doc.getRaw(mediaPath);
5987
6127
  if (!imageData) return void 0;
6128
+ const type = imageTypeFromPath(mediaPath);
5988
6129
  const imageOpts = {
5989
- type: imageTypeFromPath(mediaPath),
6130
+ type,
5990
6131
  data: imageData,
5991
6132
  transformation: {
5992
6133
  ...info.width !== void 0 ? { width: info.width } : {},
@@ -6017,6 +6158,15 @@ function parseImageRun(el, ctx) {
6017
6158
  if (blipResult.blipEffects) imageOpts.blipEffects = blipResult.blipEffects;
6018
6159
  const useLocalDpi = readBlipUseLocalDpi(blip);
6019
6160
  if (useLocalDpi !== void 0) imageOpts.useLocalDpi = useLocalDpi;
6161
+ const svg = readBlipSvg(blip, ctx);
6162
+ if (svg) {
6163
+ imageOpts.fallback = {
6164
+ type,
6165
+ data: imageData
6166
+ };
6167
+ imageOpts.type = "svg";
6168
+ imageOpts.data = svg.data;
6169
+ }
6020
6170
  return { image: imageOpts };
6021
6171
  }
6022
6172
  /**
@@ -6033,6 +6183,33 @@ function readBlipUseLocalDpi(blip) {
6033
6183
  }
6034
6184
  }
6035
6185
  /**
6186
+ * Read the `asvg:svgBlip` blip extension. When present, the surrounding
6187
+ * `a:blip` r:embed carries the raster fallback and this extension targets the
6188
+ * vector SVG part. Returns the SVG bytes so the picture round-trips as an
6189
+ * SvgMediaOptions (vector primary + raster fallback); undefined when no SVG
6190
+ * extension exists.
6191
+ */
6192
+ function readBlipSvg(blip, ctx) {
6193
+ const extLst = findChild(blip, "a:extLst");
6194
+ if (!extLst) return void 0;
6195
+ for (const ext of extLst.elements ?? []) {
6196
+ if (ext.type !== "element" || ext.name !== "a:ext") continue;
6197
+ const svgBlip = findChild(ext, "asvg:svgBlip");
6198
+ if (svgBlip) {
6199
+ const rEmbed = attr(svgBlip, "r:embed");
6200
+ if (!rEmbed) return void 0;
6201
+ const svgPath = ctx.resolveRelationship(rEmbed);
6202
+ if (!svgPath) return void 0;
6203
+ const data = ctx.docx.doc.getRaw(svgPath);
6204
+ if (!data) return void 0;
6205
+ return {
6206
+ data,
6207
+ fileName: svgPath.split("/").pop() ?? svgPath
6208
+ };
6209
+ }
6210
+ }
6211
+ }
6212
+ /**
6036
6213
  * Read the blip-fill crop rectangle (`a:srcRect`, l/t/r/b percentage insets)
6037
6214
  * from a `pic:blipFill` parent. Returns undefined when there is no crop.
6038
6215
  */
@@ -6273,6 +6450,19 @@ function parsePicChildMediaData(picEl, ctx) {
6273
6450
  const ln = findChild(spPr, "a:ln");
6274
6451
  if (ln) result.outline = outlineDesc.parse(ln, ctx);
6275
6452
  }
6453
+ const svg = readBlipSvg(blip, ctx);
6454
+ if (svg) return {
6455
+ ...result,
6456
+ type: "svg",
6457
+ data: svg.data,
6458
+ fileName: svg.fileName,
6459
+ fallback: {
6460
+ type: result.type,
6461
+ fileName: result.fileName,
6462
+ data,
6463
+ transformation: result.transformation
6464
+ }
6465
+ };
6276
6466
  return result;
6277
6467
  }
6278
6468
  /**
@@ -6409,6 +6599,26 @@ function readPosition(posEl) {
6409
6599
  }
6410
6600
  return Object.keys(result).length > 0 ? result : void 0;
6411
6601
  }
6602
+ /** Read wp:wrapPolygon (start + lineTo points) into a WrapPolygon, if present. */
6603
+ function readWrapPolygon(el) {
6604
+ const poly = findChild(el, "wp:wrapPolygon");
6605
+ if (!poly) return void 0;
6606
+ const points = [];
6607
+ const start = findChild(poly, "wp:start");
6608
+ if (start) points.push({
6609
+ x: attrNum(start, "x") ?? 0,
6610
+ y: attrNum(start, "y") ?? 0
6611
+ });
6612
+ for (const child of poly.elements ?? []) if (child.name === "wp:lineTo") points.push({
6613
+ x: attrNum(child, "x") ?? 0,
6614
+ y: attrNum(child, "y") ?? 0
6615
+ });
6616
+ if (points.length === 0) return void 0;
6617
+ return {
6618
+ edited: attrBool(poly, "edited"),
6619
+ points
6620
+ };
6621
+ }
6412
6622
  /** Map the wp:anchor wrap child element into a TextWrapping ({ type, side? }). */
6413
6623
  function readWrap(anchor) {
6414
6624
  const WRAP_TYPE = [
@@ -6424,6 +6634,10 @@ function readWrap(anchor) {
6424
6634
  const wrap = { type };
6425
6635
  const side = attr(el, "wrapText");
6426
6636
  if (side) wrap.side = side;
6637
+ if (name === "wrapTight" || name === "wrapThrough") {
6638
+ const polygon = readWrapPolygon(el);
6639
+ if (polygon) wrap.polygon = polygon;
6640
+ }
6427
6641
  return wrap;
6428
6642
  }
6429
6643
  }
@@ -6895,11 +7109,17 @@ function stringifyGroupChild(child, ctx) {
6895
7109
  }
6896
7110
  if (child.type === "wpg") return stringifyNestedGroup(child, ctx);
6897
7111
  const picData = child;
7112
+ const isSvg = picData.type === "svg";
7113
+ const blipTarget = isSvg && "fallback" in picData ? picData.fallback.fileName : picData.fileName;
6898
7114
  const picParts = [];
6899
7115
  picParts.push(stringifyNvPicPr({}, picData.nonVisualProperties));
6900
7116
  const groupBlipParts = [];
7117
+ const extParts = [];
6901
7118
  const useLocalDpiExt = buildUseLocalDpiExt(picData.useLocalDpi);
6902
- groupBlipParts.push(useLocalDpiExt ? `<a:blip r:embed="{${escapeXml(picData.fileName)}}"><a:extLst>${useLocalDpiExt}</a:extLst></a:blip>` : `<a:blip r:embed="{${escapeXml(picData.fileName)}}"/>`);
7119
+ if (useLocalDpiExt) extParts.push(useLocalDpiExt);
7120
+ if (isSvg) extParts.push(`<a:ext uri="${SVG_BLIP_EXT_URI}"><asvg:svgBlip xmlns:asvg="http://schemas.microsoft.com/office/drawing/2016/SVG/main" r:embed="{${escapeXml(picData.fileName)}}"/></a:ext>`);
7121
+ const extLst = extParts.length > 0 ? `<a:extLst>${extParts.join("")}</a:extLst>` : "";
7122
+ groupBlipParts.push(extLst ? `<a:blip r:embed="{${escapeXml(blipTarget)}}">${extLst}</a:blip>` : `<a:blip r:embed="{${escapeXml(blipTarget)}}"/>`);
6903
7123
  const groupSrcRectXml = buildSrcRectXml(picData.sourceRectangle);
6904
7124
  if (groupSrcRectXml) groupBlipParts.push(groupSrcRectXml);
6905
7125
  groupBlipParts.push("<a:stretch><a:fillRect/></a:stretch>");
@@ -6953,7 +7173,12 @@ function stringifyPositionH(opts) {
6953
7173
  function stringifyPositionV(opts) {
6954
7174
  return `<wp:positionV relativeFrom="${opts.relative ?? VerticalPositionRelativeFrom.PAGE}">${opts.align ? `<wp:align>${opts.align}</wp:align>` : opts.offset !== void 0 ? `<wp:posOffset>${convertToEmu(opts.offset)}</wp:posOffset>` : "<wp:align>top</wp:align>"}</wp:positionV>`;
6955
7175
  }
6956
- function wrapPolygonStr(cx, cy) {
7176
+ function wrapPolygonStr(cx, cy, polygon) {
7177
+ if (polygon?.points.length) {
7178
+ const editedAttr = polygon.edited !== void 0 ? ` edited="${polygon.edited ? 1 : 0}"` : "";
7179
+ const [start, ...rest] = polygon.points;
7180
+ return `<wp:wrapPolygon${editedAttr}>${`<wp:start x="${start.x}" y="${start.y}"/>`}${rest.map((p) => `<wp:lineTo x="${p.x}" y="${p.y}"/>`).join("")}</wp:wrapPolygon>`;
7181
+ }
6957
7182
  return `<wp:wrapPolygon edited="0"><wp:start x="0" y="0"/><wp:lineTo x="0" y="${-cy}"/><wp:lineTo x="${cx}" y="${-cy}"/><wp:lineTo x="${cx}" y="0"/><wp:lineTo x="0" y="0"/></wp:wrapPolygon>`;
6958
7183
  }
6959
7184
  function wrapSquareStr(textWrapping, margins) {
@@ -6971,13 +7196,13 @@ function wrapTightStr(textWrapping, margins, cx, cy) {
6971
7196
  const a = [`wrapText="${textWrapping.side ?? TextWrappingSide.BOTH_SIDES}"`];
6972
7197
  if (margins.left != null) a.push(`distL="${convertToEmu(margins.left)}"`);
6973
7198
  if (margins.right != null) a.push(`distR="${convertToEmu(margins.right)}"`);
6974
- return `<wp:wrapTight ${a.join(" ")}>${wrapPolygonStr(cx, cy)}</wp:wrapTight>`;
7199
+ return `<wp:wrapTight ${a.join(" ")}>${wrapPolygonStr(cx, cy, textWrapping.polygon)}</wp:wrapTight>`;
6975
7200
  }
6976
7201
  function wrapThroughStr(textWrapping, margins, cx, cy) {
6977
7202
  const a = [`wrapText="${textWrapping.side ?? TextWrappingSide.BOTH_SIDES}"`];
6978
7203
  if (margins.left != null) a.push(`distL="${convertToEmu(margins.left)}"`);
6979
7204
  if (margins.right != null) a.push(`distR="${convertToEmu(margins.right)}"`);
6980
- return `<wp:wrapThrough ${a.join(" ")}>${wrapPolygonStr(cx, cy)}</wp:wrapThrough>`;
7205
+ return `<wp:wrapThrough ${a.join(" ")}>${wrapPolygonStr(cx, cy, textWrapping.polygon)}</wp:wrapThrough>`;
6981
7206
  }
6982
7207
  function wrapTopAndBottomStr(margins) {
6983
7208
  const m = margins ?? {};
@@ -7216,14 +7441,36 @@ function stringifyRunInline(opts, ctx) {
7216
7441
  const rPr = stringifyRunProperties(opts);
7217
7442
  if (rPr) parts.push(rPr);
7218
7443
  if (opts.break) parts.push(breakXml(opts.break));
7219
- if (opts.children) for (const child of opts.children) if (typeof child === "string") parts.push(`<w:t xml:space="preserve">${escapeXml(child)}</w:t>`);
7220
- else {
7221
- const jsonResult = stringifyChildDispatch(child, ctx);
7222
- if (jsonResult !== void 0) if (Array.isArray(jsonResult)) parts.push(...jsonResult);
7223
- else parts.push(jsonResult);
7224
- else if ("text" in child || "children" in child || "break" in child) parts.push(stringifyRunInline(child, ctx));
7225
- }
7226
- else if (opts.text !== void 0) parts.push(`<w:t xml:space="preserve">${escapeXml(String(opts.text))}</w:t>`);
7444
+ if (opts.children) {
7445
+ for (const child of opts.children) if (typeof child === "string") parts.push(`<w:t xml:space="preserve">${escapeXml(child)}</w:t>`);
7446
+ else if (typeof child === "object" && child !== null) {
7447
+ if ("tab" in child) {
7448
+ parts.push("<w:tab/>");
7449
+ continue;
7450
+ }
7451
+ if ("pageBreak" in child) {
7452
+ parts.push("<w:br w:type=\"page\"/>");
7453
+ continue;
7454
+ }
7455
+ if ("columnBreak" in child) {
7456
+ parts.push("<w:br w:type=\"column\"/>");
7457
+ continue;
7458
+ }
7459
+ if ("break" in child) {
7460
+ parts.push(breakXml(child.break));
7461
+ continue;
7462
+ }
7463
+ const emptyXml = EMPTY_RUN_ELEMENTS[Object.keys(child)[0]];
7464
+ if (emptyXml) {
7465
+ parts.push(emptyXml);
7466
+ continue;
7467
+ }
7468
+ const jsonResult = stringifyChildDispatch(child, ctx);
7469
+ if (jsonResult !== void 0) if (Array.isArray(jsonResult)) parts.push(...jsonResult);
7470
+ else parts.push(jsonResult);
7471
+ else if ("text" in child || "children" in child || "break" in child) parts.push(stringifyRunInline(child, ctx));
7472
+ }
7473
+ } else if (opts.text !== void 0) parts.push(`<w:t xml:space="preserve">${escapeXml(String(opts.text))}</w:t>`);
7227
7474
  const rsidAttrs = [];
7228
7475
  if (opts.rsid) rsidAttrs.push(` w:rsidR="${opts.rsid}"`);
7229
7476
  if (opts.runPropertiesRsid) rsidAttrs.push(` w:rsidRPr="${opts.runPropertiesRsid}"`);
@@ -7563,7 +7810,13 @@ function stringifyChildDispatch(child, ctx) {
7563
7810
  registerMedia(c.children);
7564
7811
  continue;
7565
7812
  }
7566
- ctx.file.media.addMedia(c.data, c.type, () => c, c.fileName);
7813
+ if (c.type === "svg") {
7814
+ const fb = c.fallback;
7815
+ fb.fileName = ctx.file.media.addMedia(fb.data, fb.type, () => fb, fb.fileName).fileName;
7816
+ c.fileName = ctx.file.media.addMedia(c.data, "svg", () => c, c.fileName).fileName;
7817
+ continue;
7818
+ }
7819
+ c.fileName = ctx.file.media.addMedia(c.data, c.type, () => c, c.fileName).fileName;
7567
7820
  }
7568
7821
  };
7569
7822
  registerMedia(opts.children);
@@ -8267,30 +8520,6 @@ function parseCellMargins(marginEl) {
8267
8520
  if (Object.keys(margins).length === 0) return void 0;
8268
8521
  return margins;
8269
8522
  }
8270
- /** Parse a w:shd (CT_Shd) element into ShadingAttributesProperties. */
8271
- function parseShading(shd) {
8272
- const shading = {};
8273
- const fill = attr(shd, "w:fill");
8274
- if (fill) shading.fill = fill;
8275
- const color = attr(shd, "w:color");
8276
- if (color) shading.color = color;
8277
- const val = attr(shd, "w:val");
8278
- if (val) shading.type = val;
8279
- const themeColor = attr(shd, "w:themeColor");
8280
- if (themeColor && THEME_COLORS.includes(themeColor)) shading.themeColor = themeColor;
8281
- const themeTint = attr(shd, "w:themeTint");
8282
- if (themeTint) shading.themeTint = themeTint;
8283
- const themeShade = attr(shd, "w:themeShade");
8284
- if (themeShade) shading.themeShade = themeShade;
8285
- const themeFill = attr(shd, "w:themeFill");
8286
- if (themeFill && THEME_COLORS.includes(themeFill)) shading.themeFill = themeFill;
8287
- const themeFillTint = attr(shd, "w:themeFillTint");
8288
- if (themeFillTint) shading.themeFillTint = themeFillTint;
8289
- const themeFillShade = attr(shd, "w:themeFillShade");
8290
- if (themeFillShade) shading.themeFillShade = themeFillShade;
8291
- if (Object.keys(shading).length === 0) return void 0;
8292
- return shading;
8293
- }
8294
8523
  /** Parse a w:cnfStyle (CT_Cnf) element into CnfStyleOptions. */
8295
8524
  function parseCnfStyle(cnfEl) {
8296
8525
  const cnf = {};
@@ -11664,8 +11893,8 @@ const settingsDesc = {
11664
11893
  }));
11665
11894
  p.push(onOff("w:removePersonalInformation", opts.removePersonalInformation));
11666
11895
  p.push(onOff("w:removeDateAndTime", opts.removeDateAndTime));
11667
- p.push(onOff("w:displayBackgroundShape", opts.displayBackgroundShape));
11668
11896
  p.push(onOff("w:doNotDisplayPageBoundaries", opts.doNotDisplayPageBoundaries));
11897
+ p.push(onOff("w:displayBackgroundShape", opts.displayBackgroundShape));
11669
11898
  p.push(onOff("w:printPostScriptOverText", opts.printPostScriptOverText));
11670
11899
  p.push(onOff("w:printFractionalCharacterWidth", opts.printFractionalCharacterWidth));
11671
11900
  p.push(onOff("w:printFormsData", opts.printFormsData));
@@ -11750,12 +11979,12 @@ const settingsDesc = {
11750
11979
  p.push(numVal("w:drawingGridVerticalSpacing", opts.drawingGridVerticalSpacing));
11751
11980
  p.push(numVal("w:displayHorizontalDrawingGridEvery", opts.displayHorizontalDrawingGridEvery));
11752
11981
  p.push(numVal("w:displayVerticalDrawingGridEvery", opts.displayVerticalDrawingGridEvery));
11982
+ p.push(onOff("w:doNotUseMarginsForDrawingGridOrigin", opts.doNotUseMarginsForDrawingGridOrigin));
11753
11983
  p.push(numVal("w:drawingGridHorizontalOrigin", opts.drawingGridHorizontalOrigin));
11754
11984
  p.push(numVal("w:drawingGridVerticalOrigin", opts.drawingGridVerticalOrigin));
11755
- p.push(onOff("w:doNotUseMarginsForDrawingGridOrigin", opts.doNotUseMarginsForDrawingGridOrigin));
11756
11985
  p.push(onOff("w:doNotShadeFormData", opts.doNotShadeFormData));
11757
- if (opts.characterSpacingControl !== void 0) p.push(strVal("w:characterSpacingControl", opts.characterSpacingControl));
11758
11986
  p.push(onOff("w:noPunctuationKerning", opts.noPunctuationKerning));
11987
+ if (opts.characterSpacingControl !== void 0) p.push(strVal("w:characterSpacingControl", opts.characterSpacingControl));
11759
11988
  p.push(onOff("w:printTwoOnOne", opts.printTwoOnOne));
11760
11989
  p.push(onOff("w:strictFirstAndLastChars", opts.strictFirstAndLastChars));
11761
11990
  if (opts.noLineBreaksAfter !== void 0) {
@@ -11806,7 +12035,6 @@ const settingsDesc = {
11806
12035
  if (opts.rsids !== void 0) p.push(stringifyRsids(opts.rsids));
11807
12036
  if (opts.mathPr !== void 0) p.push(stringifyMathPr(opts.mathPr));
11808
12037
  if (opts.attachedSchema !== void 0) for (const schema of opts.attachedSchema) p.push(strVal("w:attachedSchema", schema));
11809
- if (opts.colorSchemeMapping !== void 0) p.push(stringifyColorSchemeMapping(opts.colorSchemeMapping));
11810
12038
  if (opts.themeFontLang !== void 0) {
11811
12039
  const a = {};
11812
12040
  if (opts.themeFontLang.val !== void 0) a["w:val"] = opts.themeFontLang.val;
@@ -11814,6 +12042,7 @@ const settingsDesc = {
11814
12042
  if (opts.themeFontLang.bidi !== void 0) a["w:bidi"] = opts.themeFontLang.bidi;
11815
12043
  p.push(attrEl("w:themeFontLang", a));
11816
12044
  }
12045
+ if (opts.colorSchemeMapping !== void 0) p.push(stringifyColorSchemeMapping(opts.colorSchemeMapping));
11817
12046
  p.push(onOff("w:doNotIncludeSubdocsInStats", opts.doNotIncludeSubdocsInStats));
11818
12047
  p.push(onOff("w:doNotAutoCompressPictures", opts.doNotAutoCompressPictures));
11819
12048
  if (opts.forceUpgrade !== void 0) p.push("<w:forceUpgrade/>");
@@ -11827,8 +12056,8 @@ const settingsDesc = {
11827
12056
  if (st.url !== void 0) attrs["w:url"] = st.url;
11828
12057
  p.push(attrEl("w:smartTagType", attrs));
11829
12058
  }
11830
- p.push(onOff("w:doNotEmbedSmartTags", opts.doNotEmbedSmartTags));
11831
12059
  if (opts.shapeDefaults !== void 0) p.push(`<w:shapeDefaults>${opts.shapeDefaults}</w:shapeDefaults>`);
12060
+ p.push(onOff("w:doNotEmbedSmartTags", opts.doNotEmbedSmartTags));
11832
12061
  p.push(strVal("w:decimalSymbol", opts.decimalSymbol));
11833
12062
  p.push(strVal("w:listSeparator", opts.listSeparator));
11834
12063
  return `<w:settings ${SETTINGS_NS}>${p.join("")}</w:settings>`;
@@ -13619,6 +13848,6 @@ const webSettingsDesc = {
13619
13848
  }
13620
13849
  };
13621
13850
  //#endregion
13622
- export { PageBorderZOrder as $, stringifyCustomXmlShell as $t, StyleLevel as A, TextVerticalType as An, sectionPageSizeDefaults as At, stringifyNumberingStyle as B, breakXml as Bn, NumberFormat as Bt, footnotesDesc as C, PositionalTabLeader as Cn, parseSdtBlock as Ct, selectTocEntryElements as D, TextBodyWrappingType as Dn, sectionPropertiesDesc as Dt, parseTocFieldInstruction as E, UnderlineType as En, parseSectionPropertiesEl as Et, extractStyleId as F, Media as Fn, createVerticalPosition as Ft, createHeaderFooterReference as G, AlignmentType as Gn, TextWrappingSide as Gt, stringifyTableStyle as H, TextboxTightWrapType as Hn, VerticalPositionAlign as Ht, parseStyleDefinitions as I, createTransformation as In, createHorizontalPosition as It, LineNumberRestartFormat as J, checkboxSymbolRunInner as Jt, SectionType as K, TextWrappingType as Kt, DefaultStylesFactory as L, HighlightColor as Ln, HorizontalPositionRelativeFrom as Lt, Styles as M, createBodyProperties as Mn, PageOrientation as Mt, buildNumberingCache as N, parseBodyProperties as Nn, PageNumberSeparator as Nt, SdtDateMappingType as O, TextHorzOverflowType as On, stringifySectionPropertiesXml as Ot, buildStyleCache as P, createImageData$1 as Pn, createPageNumberType as Pt, PageBorderOffsetFrom as Q, setBodyParseChild as Qt, stringifyCharacterStyle as R, TextEffect as Rn, VerticalPositionRelativeFrom as Rt, endnotesDesc as S, PositionalTabAlignment as Sn, stringifyTableOfContents as St, parseTocFieldFromElements as T, EmphasisMarkType as Tn, FontWrapper as Tt, HeaderFooterReferenceType as U, HeadingLevel as Un, createWrapThrough as Ut, stringifyParagraphStyle as V, TextAlignmentType as Vn, SpaceType as Vt, HeaderFooterType as W, LineRuleType as Wn, createWrapTight as Wt, createPageMargin as X, parseCustomXmlProperties as Xt, createLineNumberType as Y, customXmlBlockDesc as Yt, PageBorderDisplay as Z, sdtBlockDesc as Zt, glossaryDesc as _, ProofErrorType as _n, parseParagraph as _t, appPropertiesDesc as a, WidthType as an, LevelFormat as at, CharacterSet as b, parseFormFieldData as bn, stringifyDocumentXml as bt, relationshipsDesc as c, TABLE_BORDERS_NONE as cn, parseTablePropertiesEl as ct, withAltChunkOverrides as d, OverlapType as dn, tableDesc as dt, stringifySdtPr as en, DocumentGridType as et, withMediaDefaults as f, RelativeHorizontalPosition as fn, stringifyChildDispatch as ft, DocPartType as g, VerticalMergeType as gn, resetDrawingIdGen as gt, DocPartGallery as h, TextDirection as hn, drawingDesc as ht, webSettingsDesc as i, objectDesc as in, parseNumberingDefinitions as it, settingsDesc as j, VerticalAnchor as jn, PageTextDirectionType as jt, SdtLock as k, TextVertOverflowType as kn, sectionMarginDefaults as kt, buildContentTypesFromRegistry as l, BorderStyle as ln, parseTableRowPropertiesEl as lt, DocPartBehavior as m, TableAnchorType as mn, stringifyRunInline as mt, frameXml as n, subDocDesc as nn, DocumentAttributeNamespaces as nt, customPropertiesDesc as o, widthFiftiethsToPct as on, LevelSuffix as ot, commentsDesc as p, RelativeVerticalPosition as pn, stringifyParagraphInline as pt, createSectionType as q, altChunkDesc as qt, framesetXml as r, stringifyElement as rn, Numbering as rt, corePropertiesDesc as s, widthPctToFiftieths as sn, parseTableCellPropertiesEl as st, TargetScreenSize as t, stringifySdtShell as tn, createDocumentGrid as tt, contentTypesDesc as u, TableLayoutType as un, setTableParseChild as ut, bibliographyDesc as v, FormFieldTextType as vn, parseParagraphProperties as vt, parseToc as w, PositionalTabRelativeTo as wn, parseSdtProperties as wt, EditGroupType as x, RubyAlign as xn, replaceRelsWithPlaceholders as xt, fontTableDesc as y, createFormFieldData as yn, stringifyBodyChild as yt, stringifyConditionalTableStyle as z, PageNumber as zn, HorizontalPositionAlign as zt };
13851
+ export { PageBorderZOrder as $, stringifyCustomXmlShell as $t, StyleLevel as A, TextHorzOverflowType as An, sectionPageSizeDefaults as At, stringifyNumberingStyle as B, TextEffect as Bn, NumberFormat as Bt, footnotesDesc as C, RubyAlign as Cn, parseSdtBlock as Ct, selectTocEntryElements as D, EmphasisMarkType as Dn, sectionPropertiesDesc as Dt, parseTocFieldInstruction as E, PositionalTabRelativeTo as En, parseSectionPropertiesEl as Et, extractStyleId as F, parseBodyProperties as Fn, createVerticalPosition as Ft, createHeaderFooterReference as G, TextboxTightWrapType as Gn, TextWrappingSide as Gt, stringifyTableStyle as H, PageNumber as Hn, VerticalPositionAlign as Ht, parseStyleDefinitions as I, createImageData$1 as In, createHorizontalPosition as It, LineNumberRestartFormat as J, AlignmentType as Jn, checkboxSymbolRunInner as Jt, SectionType as K, HeadingLevel as Kn, TextWrappingType as Kt, DefaultStylesFactory as L, Media as Ln, HorizontalPositionRelativeFrom as Lt, Styles as M, TextVerticalType as Mn, PageOrientation as Mt, buildNumberingCache as N, VerticalAnchor as Nn, PageNumberSeparator as Nt, SdtDateMappingType as O, UnderlineType as On, stringifySectionPropertiesXml as Ot, buildStyleCache as P, createBodyProperties as Pn, createPageNumberType as Pt, PageBorderOffsetFrom as Q, setBodyParseChild as Qt, stringifyCharacterStyle as R, createTransformation as Rn, VerticalPositionRelativeFrom as Rt, endnotesDesc as S, parseFormFieldData as Sn, stringifyTableOfContents as St, parseTocFieldFromElements as T, PositionalTabLeader as Tn, FontWrapper as Tt, HeaderFooterReferenceType as U, breakXml as Un, createWrapThrough as Ut, stringifyParagraphStyle as V, EMPTY_RUN_ELEMENTS as Vn, SpaceType as Vt, HeaderFooterType as W, TextAlignmentType as Wn, createWrapTight as Wt, createPageMargin as X, parseCustomXmlProperties as Xt, createLineNumberType as Y, customXmlBlockDesc as Yt, PageBorderDisplay as Z, sdtBlockDesc as Zt, glossaryDesc as _, TextDirection as _n, parseParagraph as _t, appPropertiesDesc as a, parseShading as an, LevelFormat as at, CharacterSet as b, FormFieldTextType as bn, stringifyDocumentXml as bt, relationshipsDesc as c, widthFiftiethsToPct as cn, parseTablePropertiesEl as ct, withAltChunkOverrides as d, BorderStyle as dn, tableDesc as dt, stringifySdtPr as en, DocumentGridType as et, withMediaDefaults as f, TableLayoutType as fn, stringifyChildDispatch as ft, DocPartType as g, TableAnchorType as gn, resetDrawingIdGen as gt, DocPartGallery as h, RelativeVerticalPosition as hn, drawingDesc as ht, webSettingsDesc as i, ShadingType as in, parseNumberingDefinitions as it, settingsDesc as j, TextVertOverflowType as jn, PageTextDirectionType as jt, SdtLock as k, TextBodyWrappingType as kn, sectionMarginDefaults as kt, buildContentTypesFromRegistry as l, widthPctToFiftieths as ln, parseTableRowPropertiesEl as lt, DocPartBehavior as m, RelativeHorizontalPosition as mn, stringifyRunInline as mt, frameXml as n, subDocDesc as nn, DocumentAttributeNamespaces as nt, customPropertiesDesc as o, objectDesc as on, LevelSuffix as ot, commentsDesc as p, OverlapType as pn, stringifyParagraphInline as pt, createSectionType as q, LineRuleType as qn, altChunkDesc as qt, framesetXml as r, stringifyElement as rn, Numbering as rt, corePropertiesDesc as s, WidthType as sn, parseTableCellPropertiesEl as st, TargetScreenSize as t, stringifySdtShell as tn, createDocumentGrid as tt, contentTypesDesc as u, TABLE_BORDERS_NONE as un, setTableParseChild as ut, bibliographyDesc as v, VerticalMergeType as vn, parseParagraphProperties as vt, parseToc as w, PositionalTabAlignment as wn, parseSdtProperties as wt, EditGroupType as x, createFormFieldData as xn, replaceRelsWithPlaceholders as xt, fontTableDesc as y, ProofErrorType as yn, stringifyBodyChild as yt, stringifyConditionalTableStyle as z, HighlightColor as zn, HorizontalPositionAlign as zt };
13623
13852
 
13624
- //# sourceMappingURL=parts-7TLJ0TNR.mjs.map
13853
+ //# sourceMappingURL=parts-D0KoDfg7.mjs.map