pptx-react-viewer 2.21.0 → 2.22.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 (108) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/{AiChatPanel-XMRQE2GY.mjs → AiChatPanel-KDHDYBMP.mjs} +3 -3
  3. package/dist/AiChatPanel-KDHDYBMP.mjs.br +0 -0
  4. package/dist/AiChatPanel-KDHDYBMP.mjs.gz +0 -0
  5. package/dist/{AiChatPanel-BD6NR2AU.js → AiChatPanel-WVRT4OLF.js} +23 -23
  6. package/dist/AiChatPanel-WVRT4OLF.js.br +0 -0
  7. package/dist/AiChatPanel-WVRT4OLF.js.gz +0 -0
  8. package/dist/{Model3DScene-UXWNLRNQ.js → Model3DScene-COI2CG35.js} +2 -2
  9. package/dist/Model3DScene-COI2CG35.js.br +0 -0
  10. package/dist/Model3DScene-COI2CG35.js.gz +0 -0
  11. package/dist/{Model3DScene-HAJKICLT.mjs → Model3DScene-I5SQKIZC.mjs} +1 -1
  12. package/dist/Model3DScene-I5SQKIZC.mjs.br +0 -0
  13. package/dist/Model3DScene-I5SQKIZC.mjs.gz +0 -0
  14. package/dist/{PowerPointViewer-DVFkeluD.d.ts → PowerPointViewer-SkkxAGKa.d.ts} +2 -2
  15. package/dist/PowerPointViewer-SkkxAGKa.d.ts.map +1 -0
  16. package/dist/SurfaceChart3DScene-2N4TPYPU.js +49 -0
  17. package/dist/SurfaceChart3DScene-2N4TPYPU.js.br +0 -0
  18. package/dist/SurfaceChart3DScene-2N4TPYPU.js.gz +0 -0
  19. package/dist/SurfaceChart3DScene-6LTF5QPW.mjs +47 -0
  20. package/dist/SurfaceChart3DScene-6LTF5QPW.mjs.br +0 -0
  21. package/dist/SurfaceChart3DScene-6LTF5QPW.mjs.gz +0 -0
  22. package/dist/{audience-content-store-C4BFFhV5.d.ts → audience-content-store-Bx4Yj2pN.d.ts} +2 -2
  23. package/dist/{audience-content-store-C4BFFhV5.d.ts.map → audience-content-store-Bx4Yj2pN.d.ts.map} +1 -1
  24. package/dist/{chunk-F7SX4EUT.js → chunk-34UAGEJM.js} +1133 -315
  25. package/dist/chunk-34UAGEJM.js.br +0 -0
  26. package/dist/chunk-34UAGEJM.js.gz +0 -0
  27. package/dist/{chunk-5W2W46LY.mjs → chunk-57TM4MV4.mjs} +1132 -316
  28. package/dist/chunk-57TM4MV4.mjs.br +0 -0
  29. package/dist/chunk-57TM4MV4.mjs.gz +0 -0
  30. package/dist/{chunk-GNY4FD3V.mjs → chunk-7BZYDUNM.mjs} +1 -1
  31. package/dist/chunk-7BZYDUNM.mjs.br +0 -0
  32. package/dist/chunk-7BZYDUNM.mjs.gz +0 -0
  33. package/dist/{chunk-SUNSC3Z5.js → chunk-K7TFZ5MW.js} +147 -147
  34. package/dist/chunk-K7TFZ5MW.js.br +0 -0
  35. package/dist/chunk-K7TFZ5MW.js.gz +0 -0
  36. package/dist/{chunk-W3Y3X4AT.js → chunk-KK6DOUES.js} +1921 -1860
  37. package/dist/chunk-KK6DOUES.js.br +0 -0
  38. package/dist/chunk-KK6DOUES.js.gz +0 -0
  39. package/dist/{chunk-3ILDZ7MD.js → chunk-POP5IWYB.js} +3 -3
  40. package/dist/chunk-POP5IWYB.js.br +0 -0
  41. package/dist/chunk-POP5IWYB.js.gz +0 -0
  42. package/dist/{chunk-II5SCD5L.mjs → chunk-RJFKXPMU.mjs} +1 -1
  43. package/dist/chunk-RJFKXPMU.mjs.br +0 -0
  44. package/dist/chunk-RJFKXPMU.mjs.gz +0 -0
  45. package/dist/{chunk-6PRFUWZA.mjs → chunk-TWU72BY4.mjs} +2 -2
  46. package/dist/chunk-TWU72BY4.mjs.br +0 -0
  47. package/dist/chunk-TWU72BY4.mjs.gz +0 -0
  48. package/dist/{chunk-Y67QVETX.mjs → chunk-XIBTR7KJ.mjs} +125 -64
  49. package/dist/chunk-XIBTR7KJ.mjs.br +0 -0
  50. package/dist/chunk-XIBTR7KJ.mjs.gz +0 -0
  51. package/dist/{chunk-HLUJOKES.js → chunk-YNHWNFE3.js} +385 -385
  52. package/dist/chunk-YNHWNFE3.js.br +0 -0
  53. package/dist/chunk-YNHWNFE3.js.gz +0 -0
  54. package/dist/index.d.ts +25 -1
  55. package/dist/index.js +45 -45
  56. package/dist/index.js.br +0 -0
  57. package/dist/index.js.gz +0 -0
  58. package/dist/index.mjs +5 -5
  59. package/dist/index.mjs.br +0 -0
  60. package/dist/index.mjs.gz +0 -0
  61. package/dist/internals.d.ts +15 -1
  62. package/dist/internals.js +78 -78
  63. package/dist/internals.js.br +0 -0
  64. package/dist/internals.js.gz +0 -0
  65. package/dist/internals.mjs +3 -3
  66. package/dist/internals.mjs.br +0 -0
  67. package/dist/internals.mjs.gz +0 -0
  68. package/dist/{types-TCH6icpi.d.ts → types-kLpvSPxq.d.ts} +11 -1
  69. package/dist/{types-TCH6icpi.d.ts.map → types-kLpvSPxq.d.ts.map} +1 -1
  70. package/dist/{useViewerBuildingBlocks-BKb0qs1j.d.ts → useViewerBuildingBlocks-fh7rq4jc.d.ts} +2 -2
  71. package/dist/{useViewerBuildingBlocks-BKb0qs1j.d.ts.map → useViewerBuildingBlocks-fh7rq4jc.d.ts.map} +1 -1
  72. package/dist/viewer/index.d.ts +25 -1
  73. package/dist/viewer/index.js +26 -26
  74. package/dist/viewer/index.js.br +0 -0
  75. package/dist/viewer/index.js.gz +0 -0
  76. package/dist/viewer/index.mjs +5 -5
  77. package/dist/viewer/index.mjs.br +0 -0
  78. package/dist/viewer/index.mjs.gz +0 -0
  79. package/package.json +1 -1
  80. package/dist/AiChatPanel-BD6NR2AU.js.br +0 -0
  81. package/dist/AiChatPanel-BD6NR2AU.js.gz +0 -0
  82. package/dist/AiChatPanel-XMRQE2GY.mjs.br +0 -0
  83. package/dist/AiChatPanel-XMRQE2GY.mjs.gz +0 -0
  84. package/dist/Model3DScene-HAJKICLT.mjs.br +0 -0
  85. package/dist/Model3DScene-HAJKICLT.mjs.gz +0 -0
  86. package/dist/Model3DScene-UXWNLRNQ.js.br +0 -0
  87. package/dist/Model3DScene-UXWNLRNQ.js.gz +0 -0
  88. package/dist/PowerPointViewer-DVFkeluD.d.ts.map +0 -1
  89. package/dist/chunk-3ILDZ7MD.js.br +0 -0
  90. package/dist/chunk-3ILDZ7MD.js.gz +0 -0
  91. package/dist/chunk-5W2W46LY.mjs.br +0 -0
  92. package/dist/chunk-5W2W46LY.mjs.gz +0 -0
  93. package/dist/chunk-6PRFUWZA.mjs.br +0 -0
  94. package/dist/chunk-6PRFUWZA.mjs.gz +0 -0
  95. package/dist/chunk-F7SX4EUT.js.br +0 -0
  96. package/dist/chunk-F7SX4EUT.js.gz +0 -0
  97. package/dist/chunk-GNY4FD3V.mjs.br +0 -0
  98. package/dist/chunk-GNY4FD3V.mjs.gz +0 -0
  99. package/dist/chunk-HLUJOKES.js.br +0 -0
  100. package/dist/chunk-HLUJOKES.js.gz +0 -0
  101. package/dist/chunk-II5SCD5L.mjs.br +0 -0
  102. package/dist/chunk-II5SCD5L.mjs.gz +0 -0
  103. package/dist/chunk-SUNSC3Z5.js.br +0 -0
  104. package/dist/chunk-SUNSC3Z5.js.gz +0 -0
  105. package/dist/chunk-W3Y3X4AT.js.br +0 -0
  106. package/dist/chunk-W3Y3X4AT.js.gz +0 -0
  107. package/dist/chunk-Y67QVETX.mjs.br +0 -0
  108. package/dist/chunk-Y67QVETX.mjs.gz +0 -0
@@ -9010,10 +9010,10 @@ function normalizeSrgbHex(color2) {
9010
9010
  }
9011
9011
  return void 0;
9012
9012
  }
9013
- function resolveThemeColors(overrides10) {
9013
+ function resolveThemeColors(overrides11) {
9014
9014
  const resolved = {};
9015
9015
  for (const [key2, fallback] of Object.entries(DEFAULT_COLORS)) {
9016
- resolved[key2] = normalizeSrgbHex(overrides10?.[key2]) ?? normalizeSrgbHex(fallback) ?? "000000";
9016
+ resolved[key2] = normalizeSrgbHex(overrides11?.[key2]) ?? normalizeSrgbHex(fallback) ?? "000000";
9017
9017
  }
9018
9018
  return resolved;
9019
9019
  }
@@ -19230,13 +19230,13 @@ var PptxContentTypesBuilder = class _PptxContentTypesBuilder {
19230
19230
  applySlideAndMediaUpdates(init) {
19231
19231
  const typesRoot = this.ensureTypesRoot(init.contentTypesData);
19232
19232
  const defaults = this.ensureArray(typesRoot["Default"]);
19233
- const overrides10 = this.ensureArray(typesRoot["Override"]);
19233
+ const overrides11 = this.ensureArray(typesRoot["Override"]);
19234
19234
  const activeSlidePartNames = new Set(
19235
19235
  init.slidePaths.map(
19236
19236
  (slidePath) => this.normalizePartName(slidePath.startsWith("/") ? slidePath.substring(1) : slidePath)
19237
19237
  )
19238
19238
  );
19239
- const filteredOverrides = overrides10.filter((entry2) => {
19239
+ const filteredOverrides = overrides11.filter((entry2) => {
19240
19240
  if (entry2?.["@_ContentType"] !== init.slideContentType) {
19241
19241
  return true;
19242
19242
  }
@@ -19273,17 +19273,17 @@ var PptxContentTypesBuilder = class _PptxContentTypesBuilder {
19273
19273
  init.contentTypesData["Types"] = typesRoot;
19274
19274
  return init.contentTypesData;
19275
19275
  }
19276
- applyInkOverrides(overrides10, paths) {
19276
+ applyInkOverrides(overrides11, paths) {
19277
19277
  if (!paths) {
19278
19278
  return;
19279
19279
  }
19280
19280
  const existing = new Set(
19281
- overrides10.filter((entry2) => entry2["@_ContentType"] === "application/inkml+xml").map((entry2) => String(entry2["@_PartName"] ?? ""))
19281
+ overrides11.filter((entry2) => entry2["@_ContentType"] === "application/inkml+xml").map((entry2) => String(entry2["@_PartName"] ?? ""))
19282
19282
  );
19283
19283
  for (const path of paths) {
19284
19284
  const partName = this.normalizePartName(path);
19285
19285
  if (!existing.has(partName)) {
19286
- overrides10.push({
19286
+ overrides11.push({
19287
19287
  "@_PartName": partName,
19288
19288
  "@_ContentType": "application/inkml+xml"
19289
19289
  });
@@ -19293,11 +19293,11 @@ var PptxContentTypesBuilder = class _PptxContentTypesBuilder {
19293
19293
  applyCommentUpdates(init) {
19294
19294
  const typesRoot = this.ensureTypesRoot(init.contentTypesData);
19295
19295
  const defaults = this.ensureArray(typesRoot["Default"]);
19296
- const overrides10 = this.ensureArray(typesRoot["Override"]);
19296
+ const overrides11 = this.ensureArray(typesRoot["Override"]);
19297
19297
  const activeCommentPartNames = new Set(
19298
19298
  Array.from(init.activeCommentPaths).map((commentPath) => this.normalizePartName(commentPath))
19299
19299
  );
19300
- const filteredOverrides = overrides10.filter((entry2) => {
19300
+ const filteredOverrides = overrides11.filter((entry2) => {
19301
19301
  const entryType = String(entry2?.["@_ContentType"] || "");
19302
19302
  const rawPartName = entry2?.["@_PartName"];
19303
19303
  const entryPartName = typeof rawPartName === "string" ? this.normalizePartName(rawPartName) : void 0;
@@ -19402,9 +19402,9 @@ var PptxContentTypesBuilder = class _PptxContentTypesBuilder {
19402
19402
  return;
19403
19403
  }
19404
19404
  const typesRoot = this.ensureTypesRoot(init.contentTypesData);
19405
- const overrides10 = this.ensureArray(typesRoot["Override"]);
19405
+ const overrides11 = this.ensureArray(typesRoot["Override"]);
19406
19406
  const existingOverrides = /* @__PURE__ */ new Set();
19407
- for (const entry2 of overrides10) {
19407
+ for (const entry2 of overrides11) {
19408
19408
  const partName = entry2?.["@_PartName"];
19409
19409
  if (typeof partName === "string") {
19410
19410
  existingOverrides.add(this.normalizePartName(partName));
@@ -19418,13 +19418,13 @@ var PptxContentTypesBuilder = class _PptxContentTypesBuilder {
19418
19418
  if (existingOverrides.has(partName)) {
19419
19419
  continue;
19420
19420
  }
19421
- overrides10.push({
19421
+ overrides11.push({
19422
19422
  "@_PartName": partName,
19423
19423
  "@_ContentType": _PptxContentTypesBuilder.CUSTOM_XML_CONTENT_TYPE
19424
19424
  });
19425
19425
  existingOverrides.add(partName);
19426
19426
  }
19427
- typesRoot["Override"] = overrides10;
19427
+ typesRoot["Override"] = overrides11;
19428
19428
  init.contentTypesData["Types"] = typesRoot;
19429
19429
  }
19430
19430
  /** Content type for the main presentation part keyed by output format. */
@@ -19443,9 +19443,9 @@ var PptxContentTypesBuilder = class _PptxContentTypesBuilder {
19443
19443
  return;
19444
19444
  }
19445
19445
  const typesRoot = this.ensureTypesRoot(contentTypesData);
19446
- const overrides10 = this.ensureArray(typesRoot["Override"]);
19446
+ const overrides11 = this.ensureArray(typesRoot["Override"]);
19447
19447
  const targetContentType = _PptxContentTypesBuilder.PRESENTATION_CONTENT_TYPES[format];
19448
- for (const entry2 of overrides10) {
19448
+ for (const entry2 of overrides11) {
19449
19449
  const partName = String(entry2?.["@_PartName"] || "");
19450
19450
  const normalised = this.normalizePartName(partName);
19451
19451
  if (normalised === "/ppt/presentation.xml") {
@@ -19455,18 +19455,18 @@ var PptxContentTypesBuilder = class _PptxContentTypesBuilder {
19455
19455
  }
19456
19456
  if (format === "pptm" && hasVba) {
19457
19457
  const vbaPartName = "/ppt/vbaProject.bin";
19458
- const hasVbaOverride = overrides10.some((entry2) => {
19458
+ const hasVbaOverride = overrides11.some((entry2) => {
19459
19459
  const pn = String(entry2?.["@_PartName"] || "");
19460
19460
  return this.normalizePartName(pn) === vbaPartName;
19461
19461
  });
19462
19462
  if (!hasVbaOverride) {
19463
- overrides10.push({
19463
+ overrides11.push({
19464
19464
  "@_PartName": vbaPartName,
19465
19465
  "@_ContentType": _PptxContentTypesBuilder.VBA_PROJECT_CONTENT_TYPE
19466
19466
  });
19467
19467
  }
19468
19468
  }
19469
- typesRoot["Override"] = overrides10;
19469
+ typesRoot["Override"] = overrides11;
19470
19470
  contentTypesData["Types"] = typesRoot;
19471
19471
  }
19472
19472
  };
@@ -21054,12 +21054,12 @@ var PptxSlideNotesPartUpdater = class {
21054
21054
  const data = init.parser.parse(xml);
21055
21055
  const root = data["Types"] ?? {};
21056
21056
  const raw = root["Override"];
21057
- const overrides10 = Array.isArray(raw) ? raw : raw ? [raw] : [];
21058
- overrides10.push({
21057
+ const overrides11 = Array.isArray(raw) ? raw : raw ? [raw] : [];
21058
+ overrides11.push({
21059
21059
  "@_PartName": `/${notesPath}`,
21060
21060
  "@_ContentType": "application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml"
21061
21061
  });
21062
- root["Override"] = overrides10;
21062
+ root["Override"] = overrides11;
21063
21063
  data["Types"] = root;
21064
21064
  init.zip.file("[Content_Types].xml", init.xmlBuilder.build(data));
21065
21065
  }
@@ -25034,9 +25034,9 @@ function evaluateLayoutRules(base, rules, nodes) {
25034
25034
  }
25035
25035
  return { constraints, nodeConstraints };
25036
25036
  }
25037
- function applyNodeLayoutRules(shapes, overrides10, bounds, global) {
25037
+ function applyNodeLayoutRules(shapes, overrides11, bounds, global) {
25038
25038
  return shapes.map((shape) => {
25039
- const rule = overrides10.get(shape.nodeId);
25039
+ const rule = overrides11.get(shape.nodeId);
25040
25040
  const widthRule = rule?.w ?? global.w;
25041
25041
  const heightRule = rule?.h ?? global.h;
25042
25042
  const width = widthRule !== void 0 ? widthRule * bounds.width : shape.width;
@@ -32809,6 +32809,110 @@ function unwrapAlternateContent(container) {
32809
32809
  delete container["mc:AlternateContent"];
32810
32810
  return blocks;
32811
32811
  }
32812
+ function reapplyAlternateContentToTree(container, blockByNode) {
32813
+ let working = container;
32814
+ const groups = ensureArray3(working["p:grpSp"]);
32815
+ if (groups.length > 0) {
32816
+ let groupsChanged = false;
32817
+ const nextGroups = groups.map((group2) => {
32818
+ const next2 = reapplyAlternateContentToTree(group2, blockByNode);
32819
+ if (next2 !== group2) {
32820
+ groupsChanged = true;
32821
+ }
32822
+ return next2;
32823
+ });
32824
+ if (groupsChanged) {
32825
+ working = { ...working, "p:grpSp": nextGroups };
32826
+ }
32827
+ }
32828
+ const blockGroups = /* @__PURE__ */ new Map();
32829
+ for (const tag of SHAPE_TREE_ELEMENT_TAGS) {
32830
+ for (const node of ensureArray3(working[tag])) {
32831
+ const block = blockByNode.get(node);
32832
+ if (!block) {
32833
+ continue;
32834
+ }
32835
+ let entries = blockGroups.get(block);
32836
+ if (!entries) {
32837
+ entries = [];
32838
+ blockGroups.set(block, entries);
32839
+ }
32840
+ entries.push({ tag, node });
32841
+ }
32842
+ }
32843
+ if (blockGroups.size === 0) {
32844
+ return working;
32845
+ }
32846
+ const nextArrays = /* @__PURE__ */ new Map();
32847
+ const arrayFor = (tag) => {
32848
+ let arr = nextArrays.get(tag);
32849
+ if (!arr) {
32850
+ arr = [...ensureArray3(working[tag])];
32851
+ nextArrays.set(tag, arr);
32852
+ }
32853
+ return arr;
32854
+ };
32855
+ const envelopes = [...ensureArray3(working["mc:AlternateContent"])];
32856
+ for (const [block, entries] of blockGroups) {
32857
+ for (const entry2 of entries) {
32858
+ const arr = arrayFor(entry2.tag);
32859
+ const idx = arr.indexOf(entry2.node);
32860
+ if (idx !== -1) {
32861
+ arr.splice(idx, 1);
32862
+ }
32863
+ }
32864
+ const liveByTag = /* @__PURE__ */ new Map();
32865
+ for (const entry2 of entries) {
32866
+ let nodes = liveByTag.get(entry2.tag);
32867
+ if (!nodes) {
32868
+ nodes = [];
32869
+ liveByTag.set(entry2.tag, nodes);
32870
+ }
32871
+ nodes.push(entry2.node);
32872
+ }
32873
+ const clonedAc = { ...block.rawAc };
32874
+ if (block.selectedBranch === "choice") {
32875
+ const choices2 = ensureArray3(clonedAc["mc:Choice"]);
32876
+ const targetIdx = block.choiceIndex ?? 0;
32877
+ const original = choices2[targetIdx];
32878
+ if (original) {
32879
+ const rebuilt = { ...original };
32880
+ for (const tag of SHAPE_TREE_ELEMENT_TAGS) {
32881
+ delete rebuilt[tag];
32882
+ }
32883
+ for (const [tag, nodes] of liveByTag) {
32884
+ rebuilt[tag] = nodes.length === 1 ? nodes[0] : nodes;
32885
+ }
32886
+ const nextChoices = [...choices2];
32887
+ nextChoices[targetIdx] = rebuilt;
32888
+ clonedAc["mc:Choice"] = nextChoices.length === 1 ? nextChoices[0] : nextChoices;
32889
+ }
32890
+ } else {
32891
+ const fallback = clonedAc["mc:Fallback"];
32892
+ if (fallback) {
32893
+ const rebuilt = { ...fallback };
32894
+ for (const tag of SHAPE_TREE_ELEMENT_TAGS) {
32895
+ delete rebuilt[tag];
32896
+ }
32897
+ for (const [tag, nodes] of liveByTag) {
32898
+ rebuilt[tag] = nodes.length === 1 ? nodes[0] : nodes;
32899
+ }
32900
+ clonedAc["mc:Fallback"] = rebuilt;
32901
+ }
32902
+ }
32903
+ envelopes.push(clonedAc);
32904
+ }
32905
+ const next = { ...working };
32906
+ for (const [tag, arr] of nextArrays) {
32907
+ if (arr.length > 0) {
32908
+ next[tag] = arr;
32909
+ } else {
32910
+ delete next[tag];
32911
+ }
32912
+ }
32913
+ next["mc:AlternateContent"] = envelopes.length === 1 ? envelopes[0] : envelopes;
32914
+ return next;
32915
+ }
32812
32916
  function ensureArray3(val2) {
32813
32917
  if (!val2) {
32814
32918
  return [];
@@ -36074,6 +36178,37 @@ var STYLE_MATRIX_LINE_KEYS = [
36074
36178
  "lineCap",
36075
36179
  "compoundLine"
36076
36180
  ];
36181
+ var STYLE_MATRIX_EFFECT_KEYS = [
36182
+ "shadowColor",
36183
+ "shadowBlur",
36184
+ "shadowOffsetX",
36185
+ "shadowOffsetY",
36186
+ "shadowOpacity",
36187
+ "innerShadowColor",
36188
+ "innerShadowBlur",
36189
+ "innerShadowOffsetX",
36190
+ "innerShadowOffsetY",
36191
+ "innerShadowOpacity",
36192
+ "glowColor",
36193
+ "glowRadius",
36194
+ "glowOpacity",
36195
+ "softEdgeRadius",
36196
+ "reflectionBlurRadius",
36197
+ "reflectionStartOpacity",
36198
+ "reflectionEndOpacity",
36199
+ "reflectionEndPosition",
36200
+ "reflectionDirection",
36201
+ "reflectionRotation",
36202
+ "reflectionDistance",
36203
+ "scene3d",
36204
+ "shape3d"
36205
+ ];
36206
+ var EFFECT_AUTHORED_ONLY_KEYS = [
36207
+ "blurRadius",
36208
+ "presetShadowName",
36209
+ "effectDagXml",
36210
+ "effectDagTree"
36211
+ ];
36077
36212
  function captureStyleBaseline(style, keys) {
36078
36213
  const baseline = {};
36079
36214
  for (const key2 of keys) {
@@ -36098,6 +36233,16 @@ function createLineStyleGate(style) {
36098
36233
  }
36099
36234
  return (...keys) => keys.some((key2) => style[key2] !== baseline[key2]);
36100
36235
  }
36236
+ function effectIsPurelyStyleMatrix(style) {
36237
+ const baseline = style.inheritedEffectStyle;
36238
+ if (baseline === void 0) {
36239
+ return false;
36240
+ }
36241
+ if (!matchesBaseline(style, baseline, STYLE_MATRIX_EFFECT_KEYS)) {
36242
+ return false;
36243
+ }
36244
+ return EFFECT_AUTHORED_ONLY_KEYS.every((key2) => style[key2] === void 0);
36245
+ }
36101
36246
  function applyScene3dStyle(shapeProps, style) {
36102
36247
  const scene3dNode = shapeProps["a:scene3d"];
36103
36248
  if (!scene3dNode) {
@@ -36416,14 +36561,17 @@ var PptxShapeStyleExtractor = class {
36416
36561
  Object.assign(style, this.context.extractEffectDagStyle(shapeProps));
36417
36562
  if (styleNode?.["a:effectRef"]) {
36418
36563
  const suppressInherited = hasEmptyDrawingChild(shapeProps, "effectLst");
36419
- const authored = suppressInherited ? new Set(Object.keys(style)) : void 0;
36564
+ const authoredBefore = new Set(Object.keys(style));
36420
36565
  this.context.resolveThemeEffectRef(styleNode["a:effectRef"], style);
36421
- if (authored) {
36566
+ if (suppressInherited) {
36422
36567
  for (const key2 of Object.keys(style)) {
36423
- if (!authored.has(key2) && key2 !== "effectRefIdx" && key2 !== "effectRefColorXml") {
36568
+ if (!authoredBefore.has(key2) && key2 !== "effectRefIdx" && key2 !== "effectRefColorXml") {
36424
36569
  delete style[key2];
36425
36570
  }
36426
36571
  }
36572
+ } else {
36573
+ const inheritedKeys = STYLE_MATRIX_EFFECT_KEYS.filter((key2) => !authoredBefore.has(key2));
36574
+ style.inheritedEffectStyle = captureStyleBaseline(style, inheritedKeys);
36427
36575
  }
36428
36576
  }
36429
36577
  const fontRef = styleNode?.["a:fontRef"];
@@ -38840,7 +38988,10 @@ var GRAPHIC_FRAME_LIMITATIONS = {
38840
38988
  "PARTIAL_SMARTART_SUPPORT",
38841
38989
  "SmartArt is parsed and preserved, but some DiagramML behavior is not editable."
38842
38990
  ],
38843
- ole: ["PARTIAL_OLE_SUPPORT", "The OLE payload is preserved but cannot be rendered or edited."],
38991
+ ole: [
38992
+ "PARTIAL_OLE_SUPPORT",
38993
+ "The OLE payload renders as a preview image and can be downloaded or opened in a new tab, but cannot be edited in place."
38994
+ ],
38844
38995
  ink: [
38845
38996
  "PARTIAL_INK_SUPPORT",
38846
38997
  "Ink is rendered from decoded traces; unsupported ink properties remain raw XML."
@@ -39216,8 +39367,8 @@ var PptxDocumentPropertiesUpdater = class {
39216
39367
  coreProps["@_xmlns:dcterms"] = "http://purl.org/dc/terms/";
39217
39368
  }
39218
39369
  }
39219
- applyCorePropertiesOverrides(coreProps, overrides10) {
39220
- if (!overrides10) {
39370
+ applyCorePropertiesOverrides(coreProps, overrides11) {
39371
+ if (!overrides11) {
39221
39372
  return;
39222
39373
  }
39223
39374
  const map = [
@@ -39234,7 +39385,7 @@ var PptxDocumentPropertiesUpdater = class {
39234
39385
  ["contentStatus", "cp:contentStatus"]
39235
39386
  ];
39236
39387
  for (const [sourceKey, xmlKey] of map) {
39237
- const value = overrides10[sourceKey];
39388
+ const value = overrides11[sourceKey];
39238
39389
  if (value === void 0) {
39239
39390
  continue;
39240
39391
  }
@@ -39260,8 +39411,8 @@ var PptxDocumentPropertiesUpdater = class {
39260
39411
  updateSlideTitleProperties(appProps, slides) {
39261
39412
  applySlideTitlesToAppProps(appProps, deriveSlideTitles(slides));
39262
39413
  }
39263
- applyAppPropertiesOverrides(appProps, overrides10) {
39264
- if (!overrides10) {
39414
+ applyAppPropertiesOverrides(appProps, overrides11) {
39415
+ if (!overrides11) {
39265
39416
  return;
39266
39417
  }
39267
39418
  const stringMap = [
@@ -39281,7 +39432,7 @@ var PptxDocumentPropertiesUpdater = class {
39281
39432
  ["paragraphs", "Paragraphs"]
39282
39433
  ];
39283
39434
  for (const [sourceKey, xmlKey] of stringMap) {
39284
- const value = overrides10[sourceKey];
39435
+ const value = overrides11[sourceKey];
39285
39436
  if (value === void 0) {
39286
39437
  continue;
39287
39438
  }
@@ -39293,7 +39444,7 @@ var PptxDocumentPropertiesUpdater = class {
39293
39444
  }
39294
39445
  }
39295
39446
  for (const [sourceKey, xmlKey] of numberMap) {
39296
- const value = overrides10[sourceKey];
39447
+ const value = overrides11[sourceKey];
39297
39448
  if (value === void 0) {
39298
39449
  continue;
39299
39450
  }
@@ -39351,16 +39502,16 @@ var PptxDocumentPropertiesUpdater = class {
39351
39502
  const ctData = this.context.parser.parse(ctXml);
39352
39503
  const types = ctData["Types"];
39353
39504
  if (types) {
39354
- const overrides10 = Array.isArray(types["Override"]) ? types["Override"] : types["Override"] ? [types["Override"]] : [];
39355
- const hasCustomOverride = overrides10.some(
39505
+ const overrides11 = Array.isArray(types["Override"]) ? types["Override"] : types["Override"] ? [types["Override"]] : [];
39506
+ const hasCustomOverride = overrides11.some(
39356
39507
  (o) => String(o?.["@_PartName"] || "") === "/docProps/custom.xml"
39357
39508
  );
39358
39509
  if (!hasCustomOverride) {
39359
- overrides10.push({
39510
+ overrides11.push({
39360
39511
  "@_PartName": "/docProps/custom.xml",
39361
39512
  "@_ContentType": customContentType
39362
39513
  });
39363
- types["Override"] = overrides10.length === 1 ? overrides10[0] : overrides10;
39514
+ types["Override"] = overrides11.length === 1 ? overrides11[0] : overrides11;
39364
39515
  this.context.zip.file("[Content_Types].xml", this.context.builder.build(ctData));
39365
39516
  }
39366
39517
  }
@@ -39414,11 +39565,11 @@ var PptxDocumentPropertiesUpdater = class {
39414
39565
  const ctData = this.context.parser.parse(ctXml);
39415
39566
  const types = ctData["Types"];
39416
39567
  if (types) {
39417
- const overrides10 = Array.isArray(types["Override"]) ? types["Override"] : types["Override"] ? [types["Override"]] : [];
39418
- const filtered = overrides10.filter(
39568
+ const overrides11 = Array.isArray(types["Override"]) ? types["Override"] : types["Override"] ? [types["Override"]] : [];
39569
+ const filtered = overrides11.filter(
39419
39570
  (o) => String(o?.["@_PartName"] || "") !== "/docProps/custom.xml"
39420
39571
  );
39421
- if (filtered.length !== overrides10.length) {
39572
+ if (filtered.length !== overrides11.length) {
39422
39573
  types["Override"] = filtered.length === 1 ? filtered[0] : filtered;
39423
39574
  this.context.zip.file("[Content_Types].xml", this.context.builder.build(ctData));
39424
39575
  }
@@ -39732,15 +39883,15 @@ async function ensureSlideSyncContentType(zip, parser, writer, partPath, content
39732
39883
  const data = parser.parse(xml);
39733
39884
  const root = data["Types"] || {};
39734
39885
  const values = root["Override"];
39735
- const overrides10 = Array.isArray(values) ? values : values ? [values] : [];
39886
+ const overrides11 = Array.isArray(values) ? values : values ? [values] : [];
39736
39887
  const partName = `/${partPath.replace(/^\//u, "")}`;
39737
- const entry2 = overrides10.find((item) => item["@_PartName"] === partName);
39888
+ const entry2 = overrides11.find((item) => item["@_PartName"] === partName);
39738
39889
  if (entry2) {
39739
39890
  entry2["@_ContentType"] = contentType;
39740
39891
  } else {
39741
- overrides10.push({ "@_PartName": partName, "@_ContentType": contentType });
39892
+ overrides11.push({ "@_PartName": partName, "@_ContentType": contentType });
39742
39893
  }
39743
- root["Override"] = overrides10;
39894
+ root["Override"] = overrides11;
39744
39895
  data["Types"] = root;
39745
39896
  zip.file("[Content_Types].xml", writer.build(data));
39746
39897
  }
@@ -45396,6 +45547,16 @@ var CONTAINER_LOCAL_NAME_TO_TYPE = {
45396
45547
  function chartContainerLocalNameToType(localName25) {
45397
45548
  return CONTAINER_LOCAL_NAME_TO_TYPE[localName25];
45398
45549
  }
45550
+ var LINE_DRAWN_CHART_TYPES = /* @__PURE__ */ new Set([
45551
+ "line",
45552
+ "line3D",
45553
+ "scatter",
45554
+ "radar",
45555
+ "stock"
45556
+ ]);
45557
+ function isLineDrawnChartType(type) {
45558
+ return type !== void 0 && LINE_DRAWN_CHART_TYPES.has(type);
45559
+ }
45399
45560
  function parseChartDateCategories(seriesNode, xmlLookup) {
45400
45561
  const cat = xmlLookup.getChildByLocalName(seriesNode, "cat");
45401
45562
  const numeric = xmlLookup.getChildByLocalName(cat, "numRef") || xmlLookup.getChildByLocalName(cat, "numLit");
@@ -47965,9 +48126,9 @@ var nextRelationshipId = (relationships) => {
47965
48126
  }
47966
48127
  return `rId${index}`;
47967
48128
  };
47968
- var updateOverride = (overrides10, contentType, activePaths) => {
48129
+ var updateOverride = (overrides11, contentType, activePaths) => {
47969
48130
  const active = new Set(activePaths.map((path) => `/${path.replace(/^\//, "")}`));
47970
- const retained = overrides10.filter(
48131
+ const retained = overrides11.filter(
47971
48132
  (entry2) => String(entry2["@_ContentType"] || "") !== contentType || active.has(String(entry2["@_PartName"] || ""))
47972
48133
  );
47973
48134
  for (const path of active) {
@@ -48018,14 +48179,14 @@ async function persistModernCommentPackage(init) {
48018
48179
  if (contentTypesXml3) {
48019
48180
  const data = init.parser.parse(contentTypesXml3);
48020
48181
  const root = data["Types"] || {};
48021
- let overrides10 = ensureArray9(root["Override"]);
48022
- overrides10 = updateOverride(overrides10, MODERN_COMMENT_CONTENT_TYPE, activeCommentPaths);
48023
- overrides10 = updateOverride(
48024
- overrides10,
48182
+ let overrides11 = ensureArray9(root["Override"]);
48183
+ overrides11 = updateOverride(overrides11, MODERN_COMMENT_CONTENT_TYPE, activeCommentPaths);
48184
+ overrides11 = updateOverride(
48185
+ overrides11,
48025
48186
  MODERN_AUTHOR_CONTENT_TYPE,
48026
48187
  hasComments ? [authorPath] : []
48027
48188
  );
48028
- root["Override"] = overrides10;
48189
+ root["Override"] = overrides11;
48029
48190
  data["Types"] = root;
48030
48191
  init.zip.file("[Content_Types].xml", init.xmlBuilder.build(data));
48031
48192
  }
@@ -50202,17 +50363,17 @@ async function upsertContentTypes(zip, codec, contentTypes) {
50202
50363
  }
50203
50364
  const data = codec.parse(xml);
50204
50365
  const root = data["Types"];
50205
- const overrides10 = ensureArray13(root["Override"]);
50366
+ const overrides11 = ensureArray13(root["Override"]);
50206
50367
  for (const [path, contentType] of contentTypes) {
50207
50368
  const partName = `/${path}`;
50208
- const existing = overrides10.find((entry2) => entry2["@_PartName"] === partName);
50369
+ const existing = overrides11.find((entry2) => entry2["@_PartName"] === partName);
50209
50370
  if (existing) {
50210
50371
  existing["@_ContentType"] = contentType;
50211
50372
  } else {
50212
- overrides10.push({ "@_PartName": partName, "@_ContentType": contentType });
50373
+ overrides11.push({ "@_PartName": partName, "@_ContentType": contentType });
50213
50374
  }
50214
50375
  }
50215
- root["Override"] = overrides10;
50376
+ root["Override"] = overrides11;
50216
50377
  zip.file("[Content_Types].xml", codec.build(data));
50217
50378
  }
50218
50379
  function relsForSourcePart(source) {
@@ -50364,17 +50525,17 @@ async function upsertTagContentTypes(zip, codec, paths) {
50364
50525
  }
50365
50526
  const data = codec.parse(xml);
50366
50527
  const root = data["Types"];
50367
- const overrides10 = ensureArray14(root["Override"]);
50528
+ const overrides11 = ensureArray14(root["Override"]);
50368
50529
  for (const path of paths) {
50369
50530
  const partName = `/${path}`;
50370
- const existing = overrides10.find((entry2) => entry2["@_PartName"] === partName);
50531
+ const existing = overrides11.find((entry2) => entry2["@_PartName"] === partName);
50371
50532
  if (existing) {
50372
50533
  existing["@_ContentType"] = TAG_CONTENT_TYPE;
50373
50534
  } else {
50374
- overrides10.push({ "@_PartName": partName, "@_ContentType": TAG_CONTENT_TYPE });
50535
+ overrides11.push({ "@_PartName": partName, "@_ContentType": TAG_CONTENT_TYPE });
50375
50536
  }
50376
50537
  }
50377
- root["Override"] = overrides10;
50538
+ root["Override"] = overrides11;
50378
50539
  zip.file("[Content_Types].xml", codec.build(data));
50379
50540
  }
50380
50541
  function sourcePartForRels(relsPath) {
@@ -51294,6 +51455,77 @@ function applyChartLegendToXml(chartRoot, style, getLocalName2, resolveColor2) {
51294
51455
  }
51295
51456
  applyLegendEntries(legendNode, style.legendEntries, getLocalName2, resolveColor2);
51296
51457
  }
51458
+ function findKey18(obj, local, getLocalName2) {
51459
+ return Object.keys(obj).find((k) => getLocalName2(k) === local);
51460
+ }
51461
+ function insertBeforeLn(obj, key2, value, getLocalName2) {
51462
+ const keys = Object.keys(obj);
51463
+ const lnIdx = keys.findIndex((k) => getLocalName2(k) === "ln");
51464
+ const entries = keys.map((k) => [k, obj[k]]);
51465
+ const at = lnIdx === -1 ? entries.length : lnIdx;
51466
+ entries.splice(at, 0, [key2, value]);
51467
+ for (const k of keys) {
51468
+ delete obj[k];
51469
+ }
51470
+ for (const [k, v] of entries) {
51471
+ obj[k] = v;
51472
+ }
51473
+ }
51474
+ function insertFirst(obj, key2, value) {
51475
+ const keys = Object.keys(obj);
51476
+ const entries = keys.map((k) => [k, obj[k]]);
51477
+ for (const k of keys) {
51478
+ delete obj[k];
51479
+ }
51480
+ obj[key2] = value;
51481
+ for (const [k, v] of entries) {
51482
+ obj[k] = v;
51483
+ }
51484
+ }
51485
+ function writeSeriesColorToSpPr(spPr, hex4, isLineFamily, getLocalName2, resolveColor2) {
51486
+ const normalizedHex = hex4.replace(/^#/u, "");
51487
+ if (isLineFamily) {
51488
+ const lnKey = findKey18(spPr, "ln", getLocalName2) ?? "a:ln";
51489
+ const ln = spPr[lnKey] ?? {};
51490
+ const hadLn = Boolean(spPr[lnKey]);
51491
+ const noFillKey2 = findKey18(ln, "noFill", getLocalName2);
51492
+ if (noFillKey2) {
51493
+ delete ln[noFillKey2];
51494
+ }
51495
+ const lnFillKey = findKey18(ln, "solidFill", getLocalName2) ?? "a:solidFill";
51496
+ const authoredFill2 = ln[lnFillKey];
51497
+ const fillNode2 = serializeColorChoice(
51498
+ authoredFill2,
51499
+ authoredFill2 ? resolveColor2(authoredFill2) : void 0,
51500
+ normalizedHex
51501
+ );
51502
+ if (authoredFill2) {
51503
+ ln[lnFillKey] = fillNode2;
51504
+ } else {
51505
+ insertFirst(ln, lnFillKey, fillNode2);
51506
+ }
51507
+ if (!hadLn) {
51508
+ spPr[lnKey] = ln;
51509
+ }
51510
+ return;
51511
+ }
51512
+ const noFillKey = findKey18(spPr, "noFill", getLocalName2);
51513
+ if (noFillKey) {
51514
+ delete spPr[noFillKey];
51515
+ }
51516
+ const fillKey = findKey18(spPr, "solidFill", getLocalName2) ?? "a:solidFill";
51517
+ const authoredFill = spPr[fillKey];
51518
+ const fillNode = serializeColorChoice(
51519
+ authoredFill,
51520
+ authoredFill ? resolveColor2(authoredFill) : void 0,
51521
+ normalizedHex
51522
+ );
51523
+ if (authoredFill) {
51524
+ spPr[fillKey] = fillNode;
51525
+ } else {
51526
+ insertBeforeLn(spPr, fillKey, fillNode, getLocalName2);
51527
+ }
51528
+ }
51297
51529
  var TITLE_ROLE = /* @__PURE__ */ new Set(["title", "ctrtitle"]);
51298
51530
  var CONTENT_ROLE = /* @__PURE__ */ new Set([
51299
51531
  "body",
@@ -58010,8 +58242,8 @@ var SCRIPT_CANDIDATES = {
58010
58242
  };
58011
58243
  function aggregateFontScriptOverrides(perPathMap) {
58012
58244
  const aggregate2 = {};
58013
- for (const overrides10 of perPathMap.values()) {
58014
- for (const [script, typeface] of Object.entries(overrides10)) {
58245
+ for (const overrides11 of perPathMap.values()) {
58246
+ for (const [script, typeface] of Object.entries(overrides11)) {
58015
58247
  if (!(script in aggregate2)) {
58016
58248
  aggregate2[script] = typeface;
58017
58249
  }
@@ -60456,26 +60688,24 @@ var PptxHandlerRuntime23 = class _PptxHandlerRuntime7 extends PptxHandlerRuntime
60456
60688
  this.updateChartCacheValues(valNode, true, seriesData.values.map(String));
60457
60689
  }
60458
60690
  if (seriesData.color) {
60459
- const hex4 = seriesData.color.replace("#", "");
60460
- const spPr = this.xmlLookupService.getChildByLocalName(seriesNode, "spPr");
60461
- if (spPr) {
60462
- const solidFillKey = Object.keys(spPr).find(
60463
- (k) => this.compatibilityService.getXmlLocalName(k) === "solidFill"
60464
- ) ?? "a:solidFill";
60465
- const authoredFill = spPr[solidFillKey];
60466
- spPr[solidFillKey] = serializeColorChoice(
60467
- authoredFill,
60468
- authoredFill ? this.parseColor(authoredFill) : void 0,
60469
- hex4
60470
- );
60471
- } else {
60472
- const spPrKey = Object.keys(seriesNode).find(
60473
- (k) => this.compatibilityService.getXmlLocalName(k) === "spPr"
60474
- ) ?? "c:spPr";
60475
- seriesNode[spPrKey] = {
60476
- "a:solidFill": { "a:srgbClr": { "@_val": hex4 } }
60477
- };
60691
+ const isLineFamily = isLineDrawnChartType(
60692
+ seriesData.seriesChartType ?? chartData.chartType
60693
+ );
60694
+ const spPrKey = Object.keys(seriesNode).find(
60695
+ (k) => this.compatibilityService.getXmlLocalName(k) === "spPr"
60696
+ ) ?? "c:spPr";
60697
+ let spPr = seriesNode[spPrKey];
60698
+ if (!spPr) {
60699
+ spPr = {};
60700
+ seriesNode[spPrKey] = spPr;
60478
60701
  }
60702
+ writeSeriesColorToSpPr(
60703
+ spPr,
60704
+ seriesData.color,
60705
+ isLineFamily,
60706
+ (key2) => this.compatibilityService.getXmlLocalName(key2),
60707
+ (node) => this.parseColor(node)
60708
+ );
60479
60709
  }
60480
60710
  if (seriesData.trendlines !== void 0) {
60481
60711
  applySeriesTrendlinesToXml(
@@ -60527,7 +60757,8 @@ var PptxHandlerRuntime23 = class _PptxHandlerRuntime7 extends PptxHandlerRuntime
60527
60757
  seriesData,
60528
60758
  chartData.categories,
60529
60759
  templateSeries,
60530
- chartData.dateCategories
60760
+ chartData.dateCategories,
60761
+ isLineDrawnChartType(seriesData.seriesChartType ?? chartData.chartType)
60531
60762
  );
60532
60763
  newSeriesXmlNodes.push(newNode);
60533
60764
  }
@@ -60963,8 +61194,12 @@ var PptxHandlerRuntime23 = class _PptxHandlerRuntime7 extends PptxHandlerRuntime
60963
61194
  * If a `templateSeries` is provided, it is deep-cloned and its data is
60964
61195
  * replaced with the new series data. Otherwise, a minimal structure is
60965
61196
  * built from scratch.
61197
+ *
61198
+ * @param isLineFamily - Whether the target chart family reads/writes its
61199
+ * series colour from `a:ln/a:solidFill` (line/line3D/scatter/radar/stock)
61200
+ * rather than a direct `a:solidFill`. See `isLineDrawnChartType`.
60966
61201
  */
60967
- buildNewSeriesXml(seriesIndex, seriesData, categories, templateSeries, dateCategories) {
61202
+ buildNewSeriesXml(seriesIndex, seriesData, categories, templateSeries, dateCategories, isLineFamily = false) {
60968
61203
  if (templateSeries) {
60969
61204
  const clone3 = JSON.parse(JSON.stringify(templateSeries));
60970
61205
  const idxNode = this.xmlLookupService.getChildByLocalName(clone3, "idx");
@@ -60991,22 +61226,13 @@ var PptxHandlerRuntime23 = class _PptxHandlerRuntime7 extends PptxHandlerRuntime
60991
61226
  if (seriesData.color) {
60992
61227
  const spPr = this.xmlLookupService.getChildByLocalName(clone3, "spPr");
60993
61228
  if (spPr) {
60994
- const solidFillKey = Object.keys(spPr).find(
60995
- (k) => this.compatibilityService.getXmlLocalName(k) === "solidFill"
61229
+ writeSeriesColorToSpPr(
61230
+ spPr,
61231
+ seriesData.color,
61232
+ isLineFamily,
61233
+ (key2) => this.compatibilityService.getXmlLocalName(key2),
61234
+ (node) => this.parseColor(node)
60996
61235
  );
60997
- if (solidFillKey) {
60998
- spPr[solidFillKey] = {
60999
- "a:srgbClr": {
61000
- "@_val": seriesData.color.replace("#", "")
61001
- }
61002
- };
61003
- } else {
61004
- spPr["a:solidFill"] = {
61005
- "a:srgbClr": {
61006
- "@_val": seriesData.color.replace("#", "")
61007
- }
61008
- };
61009
- }
61010
61236
  }
61011
61237
  }
61012
61238
  return clone3;
@@ -61023,11 +61249,7 @@ var PptxHandlerRuntime23 = class _PptxHandlerRuntime7 extends PptxHandlerRuntime
61023
61249
  }
61024
61250
  }
61025
61251
  },
61026
- "c:spPr": {
61027
- "a:solidFill": {
61028
- "a:srgbClr": { "@_val": colorHex }
61029
- }
61030
- },
61252
+ "c:spPr": isLineFamily ? { "a:ln": { "a:solidFill": { "a:srgbClr": { "@_val": colorHex } } } } : { "a:solidFill": { "a:srgbClr": { "@_val": colorHex } } },
61031
61253
  "c:cat": dateCategories ? {
61032
61254
  "c:numRef": {
61033
61255
  "c:numCache": {
@@ -61057,7 +61279,7 @@ var PptxHandlerRuntime23 = class _PptxHandlerRuntime7 extends PptxHandlerRuntime
61057
61279
  return ser;
61058
61280
  }
61059
61281
  };
61060
- function findKey18(node, name, localName25) {
61282
+ function findKey19(node, name, localName25) {
61061
61283
  return Object.keys(node).find((key2) => localName25(key2) === name);
61062
61284
  }
61063
61285
  function prefixFor2(node) {
@@ -61076,7 +61298,7 @@ function setChildren(node, name, values, localName25) {
61076
61298
  if (values === void 0) {
61077
61299
  return false;
61078
61300
  }
61079
- const existing = findKey18(node, name, localName25);
61301
+ const existing = findKey19(node, name, localName25);
61080
61302
  if (values.length === 0) {
61081
61303
  if (existing) {
61082
61304
  delete node[existing];
@@ -61103,7 +61325,7 @@ function applySmartArtDefinitionMetadata(node, metadata, localName25) {
61103
61325
  changed = setChildren(node, "title", textNodes(metadata.titles), localName25) || changed;
61104
61326
  changed = setChildren(node, "desc", textNodes(metadata.descriptions), localName25) || changed;
61105
61327
  if (metadata.categories !== void 0) {
61106
- const key2 = findKey18(node, "catLst", localName25);
61328
+ const key2 = findKey19(node, "catLst", localName25);
61107
61329
  if (metadata.categories.length === 0) {
61108
61330
  if (key2) {
61109
61331
  delete node[key2];
@@ -61127,7 +61349,7 @@ function applySmartArtDefinitionMetadata(node, metadata, localName25) {
61127
61349
  return changed;
61128
61350
  }
61129
61351
  function ensureLabels(node, localName25) {
61130
- const key2 = findKey18(node, "styleLbl", localName25) ?? `${prefixFor2(node)}styleLbl`;
61352
+ const key2 = findKey19(node, "styleLbl", localName25) ?? `${prefixFor2(node)}styleLbl`;
61131
61353
  return { key: key2, labels: objects2(node[key2]) };
61132
61354
  }
61133
61355
  function applySmartArtQuickStyleLabels(node, labels, localName25) {
@@ -61150,7 +61372,7 @@ var COLOR_LISTS = [
61150
61372
  ["textEffect", "txEffectClrLst"]
61151
61373
  ];
61152
61374
  function applyColorList(label, name, metadata, localName25) {
61153
- const key2 = findKey18(label, name, localName25) ?? `${prefixFor2(label)}${name}`;
61375
+ const key2 = findKey19(label, name, localName25) ?? `${prefixFor2(label)}${name}`;
61154
61376
  const list = objects2(label[key2])[0] ?? {};
61155
61377
  if (metadata.method !== void 0) {
61156
61378
  list["@_meth"] = metadata.method;
@@ -61188,7 +61410,7 @@ function toArray3(value) {
61188
61410
  const obj = asObject(value);
61189
61411
  return obj ? [obj] : [];
61190
61412
  }
61191
- function findKey19(obj, name, getLocalName2) {
61413
+ function findKey20(obj, name, getLocalName2) {
61192
61414
  return Object.keys(obj).find((k) => getLocalName2(k) === name);
61193
61415
  }
61194
61416
  function hex3(value) {
@@ -61230,7 +61452,7 @@ function applySmartArtColorTransform(colorsDef, transform, getLocalName2, resolv
61230
61452
  let mutated = false;
61231
61453
  mutated = applySmartArtDefinitionMetadata(colorsDef, transform, getLocalName2) || mutated;
61232
61454
  mutated = applySmartArtColorStyleLabels(colorsDef, transform.labels, getLocalName2) || mutated;
61233
- const styleLblKey = findKey19(colorsDef, "styleLbl", getLocalName2);
61455
+ const styleLblKey = findKey20(colorsDef, "styleLbl", getLocalName2);
61234
61456
  if (!styleLblKey) {
61235
61457
  return mutated;
61236
61458
  }
@@ -61241,7 +61463,7 @@ function applySmartArtColorTransform(colorsDef, transform, getLocalName2, resolv
61241
61463
  let fillIndex = 0;
61242
61464
  let lineIndex = 0;
61243
61465
  for (const label of labels) {
61244
- const fillKey = findKey19(label, "fillClrLst", getLocalName2);
61466
+ const fillKey = findKey20(label, "fillClrLst", getLocalName2);
61245
61467
  if (fillKey) {
61246
61468
  const value = transform.fillColors[fillIndex++];
61247
61469
  const list = asObject(label[fillKey]);
@@ -61250,7 +61472,7 @@ function applySmartArtColorTransform(colorsDef, transform, getLocalName2, resolv
61250
61472
  mutated = true;
61251
61473
  }
61252
61474
  }
61253
- const lineKey = findKey19(label, "linClrLst", getLocalName2);
61475
+ const lineKey = findKey20(label, "linClrLst", getLocalName2);
61254
61476
  if (lineKey) {
61255
61477
  const value = transform.lineColors[lineIndex++];
61256
61478
  const list = asObject(label[lineKey]);
@@ -61266,11 +61488,11 @@ function localName23(key2) {
61266
61488
  const idx = key2.indexOf(":");
61267
61489
  return idx >= 0 ? key2.slice(idx + 1) : key2;
61268
61490
  }
61269
- function findKey20(obj, local) {
61491
+ function findKey21(obj, local) {
61270
61492
  return Object.keys(obj).find((k) => localName23(k) === local);
61271
61493
  }
61272
61494
  function ensureChild(obj, local, prefixedFallback) {
61273
- const key2 = findKey20(obj, local) ?? prefixedFallback;
61495
+ const key2 = findKey21(obj, local) ?? prefixedFallback;
61274
61496
  const existing = obj[key2];
61275
61497
  if (existing && typeof existing === "object" && !Array.isArray(existing)) {
61276
61498
  return existing;
@@ -61286,7 +61508,7 @@ function solidFill2(color2) {
61286
61508
  return { "a:srgbClr": { "@_val": hexValue(color2) } };
61287
61509
  }
61288
61510
  function setSolidFill(parent, color2) {
61289
- const key2 = findKey20(parent, "solidFill") ?? "a:solidFill";
61511
+ const key2 = findKey21(parent, "solidFill") ?? "a:solidFill";
61290
61512
  parent[key2] = solidFill2(color2);
61291
61513
  }
61292
61514
  function applyShapeStyle(pt2, style) {
@@ -61303,7 +61525,7 @@ function applyShapeStyle(pt2, style) {
61303
61525
  }
61304
61526
  }
61305
61527
  function ensureFirstRunRPr(pt2) {
61306
- const tKey = findKey20(pt2, "t");
61528
+ const tKey = findKey21(pt2, "t");
61307
61529
  if (!tKey) {
61308
61530
  return void 0;
61309
61531
  }
@@ -61311,7 +61533,7 @@ function ensureFirstRunRPr(pt2) {
61311
61533
  if (!body || typeof body !== "object" || Array.isArray(body)) {
61312
61534
  return void 0;
61313
61535
  }
61314
- const pKey = findKey20(body, "p");
61536
+ const pKey = findKey21(body, "p");
61315
61537
  if (!pKey) {
61316
61538
  return void 0;
61317
61539
  }
@@ -61320,7 +61542,7 @@ function ensureFirstRunRPr(pt2) {
61320
61542
  if (!firstP || typeof firstP !== "object") {
61321
61543
  return void 0;
61322
61544
  }
61323
- const rKey = findKey20(firstP, "r");
61545
+ const rKey = findKey21(firstP, "r");
61324
61546
  if (!rKey) {
61325
61547
  return void 0;
61326
61548
  }
@@ -62244,27 +62466,27 @@ function applySmartArtChrome(dataModel, chrome, getLocalName2) {
62244
62466
  if (!chrome || !chrome.backgroundColor && !chrome.outlineColor && (chrome.outlineWidth === null || chrome.outlineWidth === void 0)) {
62245
62467
  return;
62246
62468
  }
62247
- const findKey21 = (obj, name) => Object.keys(obj).find((k) => getLocalName2(k) === name);
62469
+ const findKey22 = (obj, name) => Object.keys(obj).find((k) => getLocalName2(k) === name);
62248
62470
  if (chrome.backgroundColor) {
62249
62471
  const hex4 = chrome.backgroundColor.replace("#", "");
62250
- const bgKey = findKey21(dataModel, "bg") ?? "dgm:bg";
62472
+ const bgKey = findKey22(dataModel, "bg") ?? "dgm:bg";
62251
62473
  const bg = asObject2(dataModel[bgKey]);
62252
- const fillKey = findKey21(bg, "solidFill") ?? "a:solidFill";
62474
+ const fillKey = findKey22(bg, "solidFill") ?? "a:solidFill";
62253
62475
  bg[fillKey] = { "a:srgbClr": { "@_val": hex4 } };
62254
62476
  dataModel[bgKey] = bg;
62255
62477
  }
62256
62478
  const hasOutlineWidth = chrome.outlineWidth !== null && chrome.outlineWidth !== void 0;
62257
62479
  if (chrome.outlineColor || hasOutlineWidth) {
62258
- const wholeKey = findKey21(dataModel, "whole") ?? "dgm:whole";
62480
+ const wholeKey = findKey22(dataModel, "whole") ?? "dgm:whole";
62259
62481
  const whole = asObject2(dataModel[wholeKey]);
62260
- const lnKey = findKey21(whole, "ln") ?? "a:ln";
62482
+ const lnKey = findKey22(whole, "ln") ?? "a:ln";
62261
62483
  const ln = asObject2(whole[lnKey]);
62262
62484
  if (hasOutlineWidth) {
62263
62485
  ln["@_w"] = String(Math.round(chrome.outlineWidth * 12700));
62264
62486
  }
62265
62487
  if (chrome.outlineColor) {
62266
62488
  const hex4 = chrome.outlineColor.replace("#", "");
62267
- const fillKey = findKey21(ln, "solidFill") ?? "a:solidFill";
62489
+ const fillKey = findKey22(ln, "solidFill") ?? "a:solidFill";
62268
62490
  ln[fillKey] = { "a:srgbClr": { "@_val": hex4 } };
62269
62491
  }
62270
62492
  whole[lnKey] = ln;
@@ -63242,12 +63464,12 @@ var PptxHandlerRuntime25 = class extends PptxHandlerRuntime24 {
63242
63464
  if (ctXml) {
63243
63465
  const ctData = this.parser.parse(ctXml);
63244
63466
  const typesRoot = ctData?.Types ?? {};
63245
- const overrides10 = this.ensureArray(typesRoot.Override);
63246
- const filteredOverrides = overrides10.filter((o) => {
63467
+ const overrides11 = this.ensureArray(typesRoot.Override);
63468
+ const filteredOverrides = overrides11.filter((o) => {
63247
63469
  const partName = String(o?.["@_PartName"] || "");
63248
63470
  return !partName.startsWith("/_xmlsignatures/");
63249
63471
  });
63250
- if (filteredOverrides.length !== overrides10.length) {
63472
+ if (filteredOverrides.length !== overrides11.length) {
63251
63473
  typesRoot.Override = filteredOverrides;
63252
63474
  ctData.Types = typesRoot;
63253
63475
  this.zip.file("[Content_Types].xml", this.builder.build(ctData));
@@ -63971,155 +64193,87 @@ var PptxHandlerRuntime28 = class _PptxHandlerRuntime9 extends PptxHandlerRuntime
63971
64193
  }
63972
64194
  }
63973
64195
  };
63974
- var PptxHandlerRuntime29 = class extends PptxHandlerRuntime28 {
63975
- /**
63976
- * Serialize visual effects (shadow, glow, reflection, blur, soft edge),
63977
- * effectDag, 3D scene, and 3D shape properties to the given spPr XML object.
63978
- */
63979
- applyEffectsAndThreeD(spPr, shapeStyle) {
63980
- const presetShadowXml = shapeStyle.presetShadowName ? this.buildPresetShadowXml(shapeStyle) : void 0;
63981
- const outerShadowXml = presetShadowXml ? void 0 : this.buildOuterShadowXml(shapeStyle);
63982
- const innerShadowXml = this.buildInnerShadowXml(shapeStyle);
63983
- const glowXml = this.buildGlowXml(shapeStyle);
63984
- const softEdgeXml = this.buildSoftEdgeXml(shapeStyle);
63985
- const reflectionXml = this.buildReflectionXml(shapeStyle);
63986
- const blurXml = this.buildBlurXml(shapeStyle);
63987
- const hasAnyEffect = outerShadowXml || presetShadowXml || innerShadowXml || glowXml || softEdgeXml || reflectionXml || blurXml;
63988
- if (hasAnyEffect || shapeStyle.effectListXml) {
63989
- const effectList = createEffectList(shapeStyle, spPr);
63990
- if (presetShadowXml) {
63991
- setEffectChild(effectList, "prstShdw", presetShadowXml);
64196
+ function writeShapeEffects(spPr, shapeStyle, ctx) {
64197
+ if (effectIsPurelyStyleMatrix(shapeStyle)) {
64198
+ return;
64199
+ }
64200
+ writeEffectList(spPr, shapeStyle, ctx);
64201
+ writeEffectDag(spPr, shapeStyle);
64202
+ writeScene3d(spPr, shapeStyle);
64203
+ writeShape3d(spPr, shapeStyle);
64204
+ }
64205
+ function writeEffectList(spPr, shapeStyle, ctx) {
64206
+ const {
64207
+ outerShadowXml,
64208
+ presetShadowXml,
64209
+ innerShadowXml,
64210
+ glowXml,
64211
+ softEdgeXml,
64212
+ reflectionXml,
64213
+ blurXml
64214
+ } = ctx;
64215
+ const hasAnyEffect = outerShadowXml || presetShadowXml || innerShadowXml || glowXml || softEdgeXml || reflectionXml || blurXml;
64216
+ if (hasAnyEffect || shapeStyle.effectListXml) {
64217
+ const effectList = createEffectList(shapeStyle, spPr);
64218
+ if (presetShadowXml) {
64219
+ setEffectChild(effectList, "prstShdw", presetShadowXml);
64220
+ setEffectChild(effectList, "outerShdw", void 0);
64221
+ } else if (outerShadowXml) {
64222
+ setEffectChild(effectList, "outerShdw", outerShadowXml);
64223
+ setEffectChild(effectList, "prstShdw", void 0);
64224
+ }
64225
+ if (innerShadowXml) {
64226
+ setEffectChild(effectList, "innerShdw", innerShadowXml);
64227
+ }
64228
+ if (glowXml) {
64229
+ setEffectChild(effectList, "glow", glowXml);
64230
+ }
64231
+ if (softEdgeXml) {
64232
+ setEffectChild(effectList, "softEdge", softEdgeXml);
64233
+ }
64234
+ if (reflectionXml) {
64235
+ setEffectChild(effectList, "reflection", reflectionXml);
64236
+ }
64237
+ if (blurXml) {
64238
+ setEffectChild(effectList, "blur", blurXml);
64239
+ }
64240
+ setEffectChild(spPr, "effectLst", reorderObjectKeys(effectList, EFFECT_LST_ORDER));
64241
+ } else {
64242
+ const effectList = effectChild(spPr, "effectLst");
64243
+ if (effectList) {
64244
+ if (shapeStyle.shadowColor !== void 0 && !outerShadowXml && !presetShadowXml) {
63992
64245
  setEffectChild(effectList, "outerShdw", void 0);
63993
- } else if (outerShadowXml) {
63994
- setEffectChild(effectList, "outerShdw", outerShadowXml);
63995
64246
  setEffectChild(effectList, "prstShdw", void 0);
63996
64247
  }
63997
- if (innerShadowXml) {
63998
- setEffectChild(effectList, "innerShdw", innerShadowXml);
63999
- }
64000
- if (glowXml) {
64001
- setEffectChild(effectList, "glow", glowXml);
64002
- }
64003
- if (softEdgeXml) {
64004
- setEffectChild(effectList, "softEdge", softEdgeXml);
64248
+ if (shapeStyle.innerShadowColor !== void 0 && !innerShadowXml) {
64249
+ setEffectChild(effectList, "innerShdw", void 0);
64005
64250
  }
64006
- if (reflectionXml) {
64007
- setEffectChild(effectList, "reflection", reflectionXml);
64251
+ if (shapeStyle.glowColor !== void 0 && !glowXml) {
64252
+ setEffectChild(effectList, "glow", void 0);
64008
64253
  }
64009
- if (blurXml) {
64010
- setEffectChild(effectList, "blur", blurXml);
64254
+ if (shapeStyle.softEdgeRadius !== void 0 && !softEdgeXml) {
64255
+ setEffectChild(effectList, "softEdge", void 0);
64011
64256
  }
64012
- setEffectChild(spPr, "effectLst", reorderObjectKeys(effectList, EFFECT_LST_ORDER));
64013
- } else {
64014
- const effectList = effectChild(spPr, "effectLst");
64015
- if (effectList) {
64016
- if (shapeStyle.shadowColor !== void 0 && !outerShadowXml && !presetShadowXml) {
64017
- setEffectChild(effectList, "outerShdw", void 0);
64018
- setEffectChild(effectList, "prstShdw", void 0);
64019
- }
64020
- if (shapeStyle.innerShadowColor !== void 0 && !innerShadowXml) {
64021
- setEffectChild(effectList, "innerShdw", void 0);
64022
- }
64023
- if (shapeStyle.glowColor !== void 0 && !glowXml) {
64024
- setEffectChild(effectList, "glow", void 0);
64025
- }
64026
- if (shapeStyle.softEdgeRadius !== void 0 && !softEdgeXml) {
64027
- setEffectChild(effectList, "softEdge", void 0);
64028
- }
64029
- if (shapeStyle.reflectionBlurRadius !== void 0 && !reflectionXml) {
64030
- setEffectChild(effectList, "reflection", void 0);
64031
- }
64032
- if (shapeStyle.blurRadius !== void 0 && !blurXml) {
64033
- setEffectChild(effectList, "blur", void 0);
64034
- }
64035
- if (Object.keys(effectList).length === 0) {
64036
- setEffectChild(spPr, "effectLst", void 0);
64037
- } else {
64038
- setEffectChild(spPr, "effectLst", reorderObjectKeys(effectList, EFFECT_LST_ORDER));
64039
- }
64257
+ if (shapeStyle.reflectionBlurRadius !== void 0 && !reflectionXml) {
64258
+ setEffectChild(effectList, "reflection", void 0);
64040
64259
  }
64041
- }
64042
- const effectDagXml = shapeStyle.effectDagTree ? serializeEffectDagContainer(shapeStyle.effectDagTree) : shapeStyle.effectDagXml;
64043
- if (effectDagXml) {
64044
- setEffectChild(spPr, "effectDag", effectDagXml);
64045
- }
64046
- if (shapeStyle.scene3d) {
64047
- const s3d = shapeStyle.scene3d;
64048
- const hasData = s3d.cameraPreset || s3d.lightRigType;
64049
- if (hasData) {
64050
- const source = spPr["a:scene3d"] ?? {};
64051
- const scene3dXml = { ...source };
64052
- scene3dXml["a:camera"] = buildScene3dCamera(s3d, source);
64053
- const lightRig = buildScene3dLightRig(s3d, source);
64054
- if (lightRig) {
64055
- scene3dXml["a:lightRig"] = lightRig;
64056
- }
64057
- const backdrop = buildScene3dBackdrop(s3d);
64058
- if (backdrop) {
64059
- scene3dXml["a:backdrop"] = backdrop;
64060
- } else {
64061
- delete scene3dXml["a:backdrop"];
64062
- }
64063
- spPr["a:scene3d"] = scene3dXml;
64064
- } else {
64065
- delete spPr["a:scene3d"];
64260
+ if (shapeStyle.blurRadius !== void 0 && !blurXml) {
64261
+ setEffectChild(effectList, "blur", void 0);
64066
64262
  }
64067
- } else if (shapeStyle.scene3d === void 0) {
64068
- delete spPr["a:scene3d"];
64069
- }
64070
- if (shapeStyle.shape3d) {
64071
- const sh3d = shapeStyle.shape3d;
64072
- const hasData = sh3d.extrusionHeight !== void 0 || sh3d.contourWidth !== void 0 || sh3d.presetMaterial || sh3d.bevelTopType || sh3d.bevelBottomType || sh3d.extrusionColor || sh3d.contourColor;
64073
- if (hasData) {
64074
- const sp3dXml = {};
64075
- if (sh3d.extrusionHeight !== void 0) {
64076
- sp3dXml["@_extrusionH"] = String(sh3d.extrusionHeight);
64077
- }
64078
- if (sh3d.contourWidth !== void 0) {
64079
- sp3dXml["@_contourW"] = String(sh3d.contourWidth);
64080
- }
64081
- if (sh3d.presetMaterial) {
64082
- sp3dXml["@_prstMaterial"] = sh3d.presetMaterial;
64083
- }
64084
- if (sh3d.bevelTopType) {
64085
- const bevelT = { "@_prst": sh3d.bevelTopType };
64086
- if (sh3d.bevelTopWidth !== void 0) {
64087
- bevelT["@_w"] = String(sh3d.bevelTopWidth);
64088
- }
64089
- if (sh3d.bevelTopHeight !== void 0) {
64090
- bevelT["@_h"] = String(sh3d.bevelTopHeight);
64091
- }
64092
- sp3dXml["a:bevelT"] = bevelT;
64093
- }
64094
- if (sh3d.bevelBottomType) {
64095
- const bevelB = { "@_prst": sh3d.bevelBottomType };
64096
- if (sh3d.bevelBottomWidth !== void 0) {
64097
- bevelB["@_w"] = String(sh3d.bevelBottomWidth);
64098
- }
64099
- if (sh3d.bevelBottomHeight !== void 0) {
64100
- bevelB["@_h"] = String(sh3d.bevelBottomHeight);
64101
- }
64102
- sp3dXml["a:bevelB"] = bevelB;
64103
- }
64104
- if (sh3d.extrusionColor) {
64105
- sp3dXml["a:extrusionClr"] = {
64106
- "a:srgbClr": { "@_val": sh3d.extrusionColor.replace("#", "") }
64107
- };
64108
- }
64109
- if (sh3d.contourColor) {
64110
- sp3dXml["a:contourClr"] = {
64111
- "a:srgbClr": { "@_val": sh3d.contourColor.replace("#", "") }
64112
- };
64113
- }
64114
- spPr["a:sp3d"] = sp3dXml;
64263
+ if (Object.keys(effectList).length === 0) {
64264
+ setEffectChild(spPr, "effectLst", void 0);
64115
64265
  } else {
64116
- delete spPr["a:sp3d"];
64266
+ setEffectChild(spPr, "effectLst", reorderObjectKeys(effectList, EFFECT_LST_ORDER));
64117
64267
  }
64118
- } else if (shapeStyle.shape3d === void 0) {
64119
- delete spPr["a:sp3d"];
64120
64268
  }
64121
64269
  }
64122
- };
64270
+ }
64271
+ function writeEffectDag(spPr, shapeStyle) {
64272
+ const effectDagXml = shapeStyle.effectDagTree ? serializeEffectDagContainer(shapeStyle.effectDagTree) : shapeStyle.effectDagXml;
64273
+ if (effectDagXml) {
64274
+ setEffectChild(spPr, "effectDag", effectDagXml);
64275
+ }
64276
+ }
64123
64277
  function buildSphereRot(lat, lon, rev) {
64124
64278
  if (lat === void 0 && lon === void 0 && rev === void 0) {
64125
64279
  return void 0;
@@ -64191,6 +64345,109 @@ function buildScene3dBackdrop(s3d) {
64191
64345
  }
64192
64346
  };
64193
64347
  }
64348
+ function writeScene3d(spPr, shapeStyle) {
64349
+ if (shapeStyle.scene3d) {
64350
+ const s3d = shapeStyle.scene3d;
64351
+ const hasData = s3d.cameraPreset || s3d.lightRigType;
64352
+ if (hasData) {
64353
+ const source = spPr["a:scene3d"] ?? {};
64354
+ const scene3dXml = { ...source };
64355
+ scene3dXml["a:camera"] = buildScene3dCamera(s3d, source);
64356
+ const lightRig = buildScene3dLightRig(s3d, source);
64357
+ if (lightRig) {
64358
+ scene3dXml["a:lightRig"] = lightRig;
64359
+ }
64360
+ const backdrop = buildScene3dBackdrop(s3d);
64361
+ if (backdrop) {
64362
+ scene3dXml["a:backdrop"] = backdrop;
64363
+ } else {
64364
+ delete scene3dXml["a:backdrop"];
64365
+ }
64366
+ spPr["a:scene3d"] = scene3dXml;
64367
+ } else {
64368
+ delete spPr["a:scene3d"];
64369
+ }
64370
+ } else if (shapeStyle.scene3d === void 0) {
64371
+ delete spPr["a:scene3d"];
64372
+ }
64373
+ }
64374
+ function writeShape3d(spPr, shapeStyle) {
64375
+ if (shapeStyle.shape3d) {
64376
+ const sh3d = shapeStyle.shape3d;
64377
+ const hasData = sh3d.extrusionHeight !== void 0 || sh3d.contourWidth !== void 0 || sh3d.presetMaterial || sh3d.bevelTopType || sh3d.bevelBottomType || sh3d.extrusionColor || sh3d.contourColor;
64378
+ if (hasData) {
64379
+ const sp3dXml = {};
64380
+ if (sh3d.extrusionHeight !== void 0) {
64381
+ sp3dXml["@_extrusionH"] = String(sh3d.extrusionHeight);
64382
+ }
64383
+ if (sh3d.contourWidth !== void 0) {
64384
+ sp3dXml["@_contourW"] = String(sh3d.contourWidth);
64385
+ }
64386
+ if (sh3d.presetMaterial) {
64387
+ sp3dXml["@_prstMaterial"] = sh3d.presetMaterial;
64388
+ }
64389
+ if (sh3d.bevelTopType) {
64390
+ const bevelT = { "@_prst": sh3d.bevelTopType };
64391
+ if (sh3d.bevelTopWidth !== void 0) {
64392
+ bevelT["@_w"] = String(sh3d.bevelTopWidth);
64393
+ }
64394
+ if (sh3d.bevelTopHeight !== void 0) {
64395
+ bevelT["@_h"] = String(sh3d.bevelTopHeight);
64396
+ }
64397
+ sp3dXml["a:bevelT"] = bevelT;
64398
+ }
64399
+ if (sh3d.bevelBottomType) {
64400
+ const bevelB = { "@_prst": sh3d.bevelBottomType };
64401
+ if (sh3d.bevelBottomWidth !== void 0) {
64402
+ bevelB["@_w"] = String(sh3d.bevelBottomWidth);
64403
+ }
64404
+ if (sh3d.bevelBottomHeight !== void 0) {
64405
+ bevelB["@_h"] = String(sh3d.bevelBottomHeight);
64406
+ }
64407
+ sp3dXml["a:bevelB"] = bevelB;
64408
+ }
64409
+ if (sh3d.extrusionColor) {
64410
+ sp3dXml["a:extrusionClr"] = {
64411
+ "a:srgbClr": { "@_val": sh3d.extrusionColor.replace("#", "") }
64412
+ };
64413
+ }
64414
+ if (sh3d.contourColor) {
64415
+ sp3dXml["a:contourClr"] = {
64416
+ "a:srgbClr": { "@_val": sh3d.contourColor.replace("#", "") }
64417
+ };
64418
+ }
64419
+ spPr["a:sp3d"] = sp3dXml;
64420
+ } else {
64421
+ delete spPr["a:sp3d"];
64422
+ }
64423
+ } else if (shapeStyle.shape3d === void 0) {
64424
+ delete spPr["a:sp3d"];
64425
+ }
64426
+ }
64427
+ var PptxHandlerRuntime29 = class extends PptxHandlerRuntime28 {
64428
+ /**
64429
+ * Serialize visual effects (shadow, glow, reflection, blur, soft edge),
64430
+ * effectDag, 3D scene, and 3D shape properties to the given spPr XML object.
64431
+ *
64432
+ * The whole body lives in {@link writeShapeEffects} as a free function so
64433
+ * the colocated unit test can import and drive the REAL logic (it used to
64434
+ * keep a private copy - "its mixin chain crashes on load" - which meant it
64435
+ * could not fail when production drifted). This method only supplies the
64436
+ * runtime-bound effect builders.
64437
+ */
64438
+ applyEffectsAndThreeD(spPr, shapeStyle) {
64439
+ const presetShadowXml = shapeStyle.presetShadowName ? this.buildPresetShadowXml(shapeStyle) : void 0;
64440
+ writeShapeEffects(spPr, shapeStyle, {
64441
+ outerShadowXml: presetShadowXml ? void 0 : this.buildOuterShadowXml(shapeStyle),
64442
+ presetShadowXml,
64443
+ innerShadowXml: this.buildInnerShadowXml(shapeStyle),
64444
+ glowXml: this.buildGlowXml(shapeStyle),
64445
+ softEdgeXml: this.buildSoftEdgeXml(shapeStyle),
64446
+ reflectionXml: this.buildReflectionXml(shapeStyle),
64447
+ blurXml: this.buildBlurXml(shapeStyle)
64448
+ });
64449
+ }
64450
+ };
64194
64451
  var PptxHandlerRuntime30 = class _PptxHandlerRuntime10 extends PptxHandlerRuntime29 {
64195
64452
  /**
64196
64453
  * Build and write the text body (`p:txBody`) for shapes, text boxes,
@@ -64874,15 +65131,15 @@ var PptxHandlerRuntime32 = class _PptxHandlerRuntime11 extends PptxHandlerRuntim
64874
65131
  }
64875
65132
  const ctData = this.parser.parse(ctXml);
64876
65133
  const typesRoot = ctData["Types"] || {};
64877
- const overrides10 = Array.isArray(typesRoot["Override"]) ? typesRoot["Override"] : typesRoot["Override"] ? [typesRoot["Override"]] : [];
64878
- const have = new Set(overrides10.map((o) => String(o?.["@_PartName"] || "")));
65134
+ const overrides11 = Array.isArray(typesRoot["Override"]) ? typesRoot["Override"] : typesRoot["Override"] ? [typesRoot["Override"]] : [];
65135
+ const have = new Set(overrides11.map((o) => String(o?.["@_PartName"] || "")));
64879
65136
  for (const entry2 of entries) {
64880
65137
  if (!have.has(entry2.partName)) {
64881
- overrides10.push({ "@_PartName": entry2.partName, "@_ContentType": entry2.contentType });
65138
+ overrides11.push({ "@_PartName": entry2.partName, "@_ContentType": entry2.contentType });
64882
65139
  have.add(entry2.partName);
64883
65140
  }
64884
65141
  }
64885
- typesRoot["Override"] = overrides10;
65142
+ typesRoot["Override"] = overrides11;
64886
65143
  ctData["Types"] = typesRoot;
64887
65144
  this.zip.file("[Content_Types].xml", this.builder.build(ctData));
64888
65145
  }
@@ -64950,15 +65207,15 @@ var PptxHandlerRuntime33 = class extends PptxHandlerRuntime32 {
64950
65207
  }
64951
65208
  const data = this.parser.parse(xml);
64952
65209
  const root = data["Types"] ?? {};
64953
- const overrides10 = Array.isArray(root["Override"]) ? root["Override"] : root["Override"] ? [root["Override"]] : [];
64954
- const existing = new Set(overrides10.map((entry2) => String(entry2["@_PartName"] ?? "")));
65210
+ const overrides11 = Array.isArray(root["Override"]) ? root["Override"] : root["Override"] ? [root["Override"]] : [];
65211
+ const existing = new Set(overrides11.map((entry2) => String(entry2["@_PartName"] ?? "")));
64955
65212
  for (const [path, contentType] of pending) {
64956
65213
  const partName = `/${path}`;
64957
65214
  if (!existing.has(partName)) {
64958
- overrides10.push({ "@_PartName": partName, "@_ContentType": contentType });
65215
+ overrides11.push({ "@_PartName": partName, "@_ContentType": contentType });
64959
65216
  }
64960
65217
  }
64961
- root["Override"] = overrides10;
65218
+ root["Override"] = overrides11;
64962
65219
  data["Types"] = root;
64963
65220
  this.zip.file("[Content_Types].xml", this.builder.build(data));
64964
65221
  }
@@ -65919,8 +66176,8 @@ var PptxHandlerRuntime40 = class _PptxHandlerRuntime16 extends PptxHandlerRuntim
65919
66176
  }
65920
66177
  const ctData = this.parser.parse(ctXml);
65921
66178
  const typesRoot = ctData["Types"] || {};
65922
- const overrides10 = Array.isArray(typesRoot["Override"]) ? typesRoot["Override"] : typesRoot["Override"] ? [typesRoot["Override"]] : [];
65923
- const have = new Set(overrides10.map((o) => String(o?.["@_PartName"] || "")));
66179
+ const overrides11 = Array.isArray(typesRoot["Override"]) ? typesRoot["Override"] : typesRoot["Override"] ? [typesRoot["Override"]] : [];
66180
+ const have = new Set(overrides11.map((o) => String(o?.["@_PartName"] || "")));
65924
66181
  for (const [p, contentType] of [
65925
66182
  ...(paths ?? []).map((path) => [path, CHART_CONTENT_TYPE]),
65926
66183
  ...(extendedPaths ?? []).map(
@@ -65932,11 +66189,11 @@ var PptxHandlerRuntime40 = class _PptxHandlerRuntime16 extends PptxHandlerRuntim
65932
66189
  ]) {
65933
66190
  const partName = `/${p}`;
65934
66191
  if (!have.has(partName)) {
65935
- overrides10.push({ "@_PartName": partName, "@_ContentType": contentType });
66192
+ overrides11.push({ "@_PartName": partName, "@_ContentType": contentType });
65936
66193
  have.add(partName);
65937
66194
  }
65938
66195
  }
65939
- typesRoot["Override"] = overrides10;
66196
+ typesRoot["Override"] = overrides11;
65940
66197
  ctData["Types"] = typesRoot;
65941
66198
  this.zip.file("[Content_Types].xml", this.builder.build(ctData));
65942
66199
  }
@@ -67864,7 +68121,15 @@ function orderContainer(container, plan, getLocalName2) {
67864
68121
  return orderShapeTreeChildren(working, (node) => positions.get(node), getLocalName2);
67865
68122
  }
67866
68123
  function orderedTemplatePartXml(options) {
67867
- const { runtime, partPath, xmlObj, rootTag: rootTag2, sourceXml, getLocalName: getLocalName2 } = options;
68124
+ const {
68125
+ runtime,
68126
+ partPath,
68127
+ xmlObj,
68128
+ rootTag: rootTag2,
68129
+ sourceXml,
68130
+ getLocalName: getLocalName2,
68131
+ alternateContentBlockByRawXml
68132
+ } = options;
67868
68133
  const root = xmlObj[rootTag2];
67869
68134
  if (!isXmlObject8(root)) {
67870
68135
  return xmlObj;
@@ -67877,8 +68142,9 @@ function orderedTemplatePartXml(options) {
67877
68142
  if (!isXmlObject8(spTree)) {
67878
68143
  return xmlObj;
67879
68144
  }
68145
+ const rewrapped = reapplyAlternateContentToTree(spTree, alternateContentBlockByRawXml);
67880
68146
  const rebuilt = positionsByRuntime.get(runtime)?.get(partPath);
67881
- const ordered32 = rebuilt ? orderShapeTreeChildren(spTree, (node) => rebuilt.get(node), getLocalName2) : orderContainer(spTree, sourceXml ? scanSpTreeDocumentOrder(sourceXml) : [], getLocalName2);
68147
+ const ordered32 = rebuilt ? orderShapeTreeChildren(rewrapped, (node) => rebuilt.get(node), getLocalName2) : orderContainer(rewrapped, sourceXml ? scanSpTreeDocumentOrder(sourceXml) : [], getLocalName2);
67882
68148
  if (ordered32 === spTree) {
67883
68149
  return xmlObj;
67884
68150
  }
@@ -68018,7 +68284,8 @@ var PptxHandlerRuntime45 = class extends PptxHandlerRuntime44 {
68018
68284
  xmlObj,
68019
68285
  rootTag: rootTag2,
68020
68286
  sourceXml: sourceXml ?? await this.zip.file(partPath)?.async("string"),
68021
- getLocalName: (key2) => this.compatibilityService.getXmlLocalName(key2)
68287
+ getLocalName: (key2) => this.compatibilityService.getXmlLocalName(key2),
68288
+ alternateContentBlockByRawXml: this.alternateContentBlockByRawXml
68022
68289
  });
68023
68290
  }
68024
68291
  getAuxiliaryMasterRelsPath(partPath) {
@@ -68531,11 +68798,11 @@ var PptxHandlerRuntime49 = class extends PptxHandlerRuntime48 {
68531
68798
  }
68532
68799
  const data = this.parser.parse(xml);
68533
68800
  const root = data["Types"] ?? {};
68534
- const overrides10 = asArray3(root["Override"]);
68535
- if (!overrides10.some((entry2) => entry2["@_PartName"] === partName)) {
68536
- overrides10.push({ "@_PartName": partName, "@_ContentType": contentType });
68801
+ const overrides11 = asArray3(root["Override"]);
68802
+ if (!overrides11.some((entry2) => entry2["@_PartName"] === partName)) {
68803
+ overrides11.push({ "@_PartName": partName, "@_ContentType": contentType });
68537
68804
  }
68538
- root["Override"] = overrides10;
68805
+ root["Override"] = overrides11;
68539
68806
  data["Types"] = root;
68540
68807
  this.zip.file("[Content_Types].xml", this.builder.build(data));
68541
68808
  }
@@ -68716,12 +68983,12 @@ var PptxHandlerRuntime50 = class extends PptxHandlerRuntime49 {
68716
68983
  }
68717
68984
  const data = this.parser.parse(xml);
68718
68985
  const root = data["Types"] ?? {};
68719
- const overrides10 = asArray4(root["Override"]);
68986
+ const overrides11 = asArray4(root["Override"]);
68720
68987
  const partName = `/${masterPath}`;
68721
- if (!overrides10.some((entry2) => entry2["@_PartName"] === partName)) {
68722
- overrides10.push({ "@_PartName": partName, "@_ContentType": HANDOUT_MASTER_CONTENT_TYPE });
68988
+ if (!overrides11.some((entry2) => entry2["@_PartName"] === partName)) {
68989
+ overrides11.push({ "@_PartName": partName, "@_ContentType": HANDOUT_MASTER_CONTENT_TYPE });
68723
68990
  }
68724
- root["Override"] = overrides10;
68991
+ root["Override"] = overrides11;
68725
68992
  data["Types"] = root;
68726
68993
  this.zip.file("[Content_Types].xml", this.builder.build(data));
68727
68994
  }
@@ -75739,8 +76006,8 @@ var PptxHandlerRuntime81 = class extends PptxHandlerRuntime80 {
75739
76006
  */
75740
76007
  aggregateFontScriptOverrides(perPathMap) {
75741
76008
  const aggregate2 = {};
75742
- for (const overrides10 of perPathMap.values()) {
75743
- for (const [script, typeface] of Object.entries(overrides10)) {
76009
+ for (const overrides11 of perPathMap.values()) {
76010
+ for (const [script, typeface] of Object.entries(overrides11)) {
75744
76011
  if (!(script in aggregate2)) {
75745
76012
  aggregate2[script] = typeface;
75746
76013
  }
@@ -75749,19 +76016,19 @@ var PptxHandlerRuntime81 = class extends PptxHandlerRuntime80 {
75749
76016
  return aggregate2;
75750
76017
  }
75751
76018
  collectFontScriptOverrides(fontNode) {
75752
- const overrides10 = {};
76019
+ const overrides11 = {};
75753
76020
  if (!fontNode) {
75754
- return overrides10;
76021
+ return overrides11;
75755
76022
  }
75756
76023
  const fontEntries = this.ensureArray(fontNode["a:font"]);
75757
76024
  for (const entry2 of fontEntries) {
75758
76025
  const script = String(entry2?.["@_script"] || "").trim();
75759
76026
  const typeface = this.normalizeTypefaceToken(String(entry2?.["@_typeface"] || ""));
75760
76027
  if (script && typeface) {
75761
- overrides10[script] = typeface;
76028
+ overrides11[script] = typeface;
75762
76029
  }
75763
76030
  }
75764
- return overrides10;
76031
+ return overrides11;
75765
76032
  }
75766
76033
  /**
75767
76034
  * Resolve the theme file path referenced by a given master's `.rels`.
@@ -78048,9 +78315,20 @@ var PptxHandlerRuntime91 = class extends PptxHandlerRuntime90 {
78048
78315
  false
78049
78316
  );
78050
78317
  }
78051
- const containerType = isCombo ? chartContainerLocalNameToType(this.compatibilityService.getXmlLocalName(containerKey)) : void 0;
78318
+ const resolvedContainerType = chartContainerLocalNameToType(
78319
+ this.compatibilityService.getXmlLocalName(containerKey)
78320
+ );
78321
+ const containerType = isCombo ? resolvedContainerType : void 0;
78052
78322
  const axisId = resolveChartContainerValueAxisId(container, axes ?? [], this.xmlLookupService);
78053
- series.push(...this.buildChartSeries(seriesList, categories, containerType, axisId));
78323
+ series.push(
78324
+ ...this.buildChartSeries(
78325
+ seriesList,
78326
+ categories,
78327
+ containerType,
78328
+ axisId,
78329
+ resolvedContainerType
78330
+ )
78331
+ );
78054
78332
  }
78055
78333
  return { categories, series };
78056
78334
  }
@@ -78094,9 +78372,15 @@ var PptxHandlerRuntime91 = class extends PptxHandlerRuntime90 {
78094
78372
  * @param categories - Pre-parsed category labels (used for fallback values).
78095
78373
  * @param seriesChartType - When set (combo charts), tags every series in this
78096
78374
  * container with its source chart type for round-trip.
78375
+ * @param axisId - The container's resolved value-axis id, if any.
78376
+ * @param containerChartType - The container's actual chart type, always
78377
+ * resolved (unlike `seriesChartType`, which is combo-only). Used to decide
78378
+ * whether this container's series read their colour from a direct fill or
78379
+ * from the outline (`a:ln/a:solidFill`), so a plain (non-combo)
78380
+ * line/scatter/radar/stock chart's authored colour is not dropped.
78097
78381
  * @returns The series array matching `PptxChartData["series"]`.
78098
78382
  */
78099
- buildChartSeries(seriesList, categories, seriesChartType, axisId) {
78383
+ buildChartSeries(seriesList, categories, seriesChartType, axisId, containerChartType) {
78100
78384
  return seriesList.map((seriesNode, seriesIndex) => {
78101
78385
  const seriesName = this.extractChartSeriesName(seriesNode);
78102
78386
  const valNode = this.xmlLookupService.getChildByLocalName(seriesNode, "val") || this.xmlLookupService.getChildByLocalName(seriesNode, "yVal");
@@ -78119,7 +78403,7 @@ var PptxHandlerRuntime91 = class extends PptxHandlerRuntime90 {
78119
78403
  ) ?? ""
78120
78404
  ).trim();
78121
78405
  const seriesShapeProperties = this.xmlLookupService.getChildByLocalName(seriesNode, "spPr");
78122
- const readsLineColor = seriesChartType === "line" || seriesChartType === "line3D" || seriesChartType === "scatter" || seriesChartType === "radar" || seriesChartType === "stock";
78406
+ const readsLineColor = isLineDrawnChartType(containerChartType);
78123
78407
  const seriesColor22 = this.parseColor(
78124
78408
  this.xmlLookupService.getChildByLocalName(seriesShapeProperties, "solidFill")
78125
78409
  ) ?? (readsLineColor ? this.parseColor(
@@ -83732,7 +84016,226 @@ function assign8(ids, facets) {
83732
84016
  overrides8[id] = facets;
83733
84017
  }
83734
84018
  }
83735
- assign8(["presentation:complexType:CT_SlideTransition", "presentation:element:transition"], {
84019
+ assign8(
84020
+ [
84021
+ "drawing:complexType:CT_LineProperties",
84022
+ "drawing:element:ln",
84023
+ "drawing:simpleType:ST_LineWidth"
84024
+ ],
84025
+ {
84026
+ parse: "native",
84027
+ preserve: "native",
84028
+ edit: "native",
84029
+ serialize: "native",
84030
+ note: "The `a:ln` outline (width, fill choice, dash, join, cap, compound, alignment, and both line ends) is fully typed on the shared `ShapeStyle`. An `a:extLst` child, or any property still resolved from `a:lnRef`, is left untouched by the writer and so survives a dirty save unmodified.",
84031
+ evidence: [
84032
+ testEvidence(
84033
+ "src/core/core/builders/shape-style-line-helpers.test.ts",
84034
+ [
84035
+ "extracts line width from @_w (12700 EMU = 1pt \u2248 1.33px)",
84036
+ "extracts larger line width (38100 => 4px)"
84037
+ ],
84038
+ ["parse"]
84039
+ ),
84040
+ testEvidence(
84041
+ "src/core/core/runtime/PptxHandlerRuntimeSaveShapeStyleWriter.test.ts",
84042
+ ["should set stroke width in EMU and solid fill"],
84043
+ ["edit", "serialize"]
84044
+ ),
84045
+ testEvidence(
84046
+ "src/core/core/runtime/authored-shape-style.test.ts",
84047
+ [
84048
+ "does not invent an a:ln for an outline that comes from a:lnRef",
84049
+ "keeps an authored a:ln free of the theme width, colour, cap and join",
84050
+ "writes width and colour once the outline is edited"
84051
+ ],
84052
+ ["preserve", "edit", "serialize"]
84053
+ ),
84054
+ testEvidence(
84055
+ "src/core/core/runtime/save-line-fill.test.ts",
84056
+ [
84057
+ "keeps the fill ahead of an authored a:prstDash",
84058
+ "keeps the fill ahead of the join and the line ends"
84059
+ ],
84060
+ ["preserve", "serialize"]
84061
+ )
84062
+ ]
84063
+ }
84064
+ );
84065
+ assign8(["drawing:group:EG_LineFillProperties"], {
84066
+ parse: "native",
84067
+ preserve: "native",
84068
+ edit: "native",
84069
+ serialize: "native",
84070
+ note: "All four choice members of an outline fill (noFill, solidFill, gradFill, pattFill) are typed via `strokeFillMode`, with the gradient/pattern node preserved verbatim for re-emission (issue #87). Exactly one fill child is ever written, in schema order ahead of the dash/join/ends group.",
84071
+ evidence: [
84072
+ testEvidence(
84073
+ "src/core/core/builders/shape-style-line-helpers.test.ts",
84074
+ [
84075
+ "applies solid fill stroke color",
84076
+ "applies gradient fill stroke color via context callback",
84077
+ "applies pattern fill stroke color from foreground",
84078
+ "models a gradient outline and preserves the whole a:gradFill node",
84079
+ "models a pattern outline and preserves the whole a:pattFill node",
84080
+ 'models a noFill outline (no hidden line) as strokeFillMode "none"'
84081
+ ],
84082
+ ["parse"]
84083
+ ),
84084
+ testEvidence(
84085
+ "src/core/core/runtime/save-line-fill.test.ts",
84086
+ [
84087
+ "emits a single a:gradFill for a gradient outline, never a solid dual-fill",
84088
+ "emits a single a:pattFill for a pattern outline",
84089
+ "emits a single a:solidFill for a solid outline and clears any prior gradient",
84090
+ "emits a:noFill for a transparent / zero-width outline and clears fills"
84091
+ ],
84092
+ ["preserve", "edit", "serialize"]
84093
+ )
84094
+ ]
84095
+ });
84096
+ assign8(
84097
+ [
84098
+ "drawing:group:EG_LineDashProperties",
84099
+ "drawing:complexType:CT_PresetLineDashProperties",
84100
+ "drawing:element:prstDash",
84101
+ "drawing:simpleType:ST_PresetLineDashVal"
84102
+ ],
84103
+ {
84104
+ parse: "native",
84105
+ preserve: "native",
84106
+ edit: "native",
84107
+ serialize: "native",
84108
+ note: "All eleven `ST_PresetLineDashVal` values are typed on `strokeDash`; the sibling `custDash` choice (`CT_DashStopList`) has its own coverage entry. Editing back to a preset drops any prior custom dash-stop list.",
84109
+ evidence: [
84110
+ testEvidence(
84111
+ "src/core/core/builders/shape-style-line-helpers.test.ts",
84112
+ [
84113
+ "applies preset dash type 'dash'",
84114
+ "applies preset dash type 'dot'",
84115
+ "applies preset dash type 'lgDash'",
84116
+ "applies preset dash type 'sysDash'",
84117
+ "applies preset dash type 'dashDot'"
84118
+ ],
84119
+ ["parse"]
84120
+ ),
84121
+ testEvidence(
84122
+ "src/core/core/runtime/PptxHandlerRuntimeSaveShapeStyleWriter.test.ts",
84123
+ ["should remove dash styles when dash is 'solid'", "should set preset dash"],
84124
+ ["edit", "serialize"]
84125
+ ),
84126
+ testEvidence(
84127
+ "src/core/utils/drawing-line-dash.test.ts",
84128
+ ["inserts custom dash before line joins and extensions"],
84129
+ ["preserve", "serialize"]
84130
+ )
84131
+ ]
84132
+ }
84133
+ );
84134
+ assign8(
84135
+ [
84136
+ "drawing:group:EG_LineJoinProperties",
84137
+ "drawing:complexType:CT_LineJoinRound",
84138
+ "drawing:complexType:CT_LineJoinBevel",
84139
+ "drawing:complexType:CT_LineJoinMiterProperties",
84140
+ "drawing:element:round",
84141
+ "drawing:element:bevel",
84142
+ "drawing:element:miter",
84143
+ "drawing:simpleType:ST_CompoundLine",
84144
+ "drawing:simpleType:ST_LineCap"
84145
+ ],
84146
+ {
84147
+ parse: "native",
84148
+ preserve: "native",
84149
+ edit: "native",
84150
+ serialize: "native",
84151
+ note: "The join choice (round/bevel/miter, with the miter limit) and the `cap`/`cmpd` attributes are typed on `lineJoin`, `miterLimit`, `lineCap`, and `compoundLine`, covering all `ST_CompoundLine` and `ST_LineCap` enumerators. The miter limit is only emitted when it differs from the 800000 default, and a cap/join the shape authored on top of an `a:lnRef` theme baseline is kept while the reference-derived value is not written back.",
84152
+ evidence: [
84153
+ testEvidence(
84154
+ "src/core/core/builders/shape-style-line-helpers.test.ts",
84155
+ [
84156
+ "applies round line join",
84157
+ "applies bevel line join",
84158
+ "applies miter line join",
84159
+ "parses miter @_lim into miterLimit (E-H6)",
84160
+ "applies cap type 'rnd'",
84161
+ "applies cap type 'sq'",
84162
+ "applies cap type 'flat'",
84163
+ "applies compound line type 'dbl'",
84164
+ "applies compound line type 'thickThin'",
84165
+ "applies compound line type 'tri'"
84166
+ ],
84167
+ ["parse"]
84168
+ ),
84169
+ testEvidence(
84170
+ "src/core/core/runtime/PptxHandlerRuntimeSaveShapeStyleWriter.test.ts",
84171
+ [
84172
+ "should set round join",
84173
+ "should set bevel join",
84174
+ "omits @lim on a miter join at the 800000 default",
84175
+ "emits @lim on a miter join with a non-default limit",
84176
+ "should set line cap",
84177
+ "should set compound line type"
84178
+ ],
84179
+ ["edit", "serialize"]
84180
+ ),
84181
+ testEvidence(
84182
+ "src/core/core/runtime/authored-shape-style.test.ts",
84183
+ ["keeps an outline property the shape authored on top of the reference"],
84184
+ ["preserve"]
84185
+ )
84186
+ ]
84187
+ }
84188
+ );
84189
+ assign8(
84190
+ [
84191
+ "drawing:complexType:CT_LineEndProperties",
84192
+ "drawing:element:headEnd",
84193
+ "drawing:element:tailEnd",
84194
+ "drawing:simpleType:ST_LineEndType",
84195
+ "drawing:simpleType:ST_LineEndWidth",
84196
+ "drawing:simpleType:ST_LineEndLength"
84197
+ ],
84198
+ {
84199
+ parse: "native",
84200
+ preserve: "native",
84201
+ edit: "native",
84202
+ serialize: "native",
84203
+ note: 'Both connector line ends (`headEnd`/`tailEnd`) are typed on `connectorStart/EndArrow(Width|Length)`, covering all six `ST_LineEndType` arrowhead shapes and all three `ST_LineEndWidth`/`ST_LineEndLength` sizes independently per end. Setting an end to "none" removes the element rather than writing an empty one.',
84204
+ evidence: [
84205
+ testEvidence(
84206
+ "src/core/core/builders/shape-style-line-helpers.test.ts",
84207
+ [
84208
+ "applies head end arrow type 'triangle' with size 'lg'",
84209
+ "applies tail end arrow type 'stealth' with size 'sm'",
84210
+ "applies both head and tail arrows"
84211
+ ],
84212
+ ["parse"]
84213
+ ),
84214
+ testEvidence(
84215
+ "src/core/core/runtime/PptxHandlerRuntimeSaveShapeStyleWriter.test.ts",
84216
+ [
84217
+ "should set tail end arrow with width and length",
84218
+ "should remove tailEnd when endArrow is 'none'",
84219
+ "should set head end arrow"
84220
+ ],
84221
+ ["edit", "serialize"]
84222
+ ),
84223
+ testEvidence(
84224
+ "src/core/core/runtime/authored-shape-style.test.ts",
84225
+ ["keeps an authored a:ln free of the theme width, colour, cap and join"],
84226
+ ["preserve"]
84227
+ )
84228
+ ]
84229
+ }
84230
+ );
84231
+ var OPENXML_LINE_STROKE_PROPERTIES_COVERAGE = overrides8;
84232
+ var overrides9 = {};
84233
+ function assign9(ids, facets) {
84234
+ for (const id of ids) {
84235
+ overrides9[id] = facets;
84236
+ }
84237
+ }
84238
+ assign9(["presentation:complexType:CT_SlideTransition", "presentation:element:transition"], {
83736
84239
  parse: "partial",
83737
84240
  preserve: "native",
83738
84241
  edit: "partial",
@@ -83745,7 +84248,7 @@ assign8(["presentation:complexType:CT_SlideTransition", "presentation:element:tr
83745
84248
  ])
83746
84249
  ]
83747
84250
  });
83748
- assign8(
84251
+ assign9(
83749
84252
  [
83750
84253
  "presentation:complexType:CT_TransitionSoundAction",
83751
84254
  "presentation:complexType:CT_TransitionStartSoundAction",
@@ -83767,7 +84270,7 @@ assign8(
83767
84270
  ]
83768
84271
  }
83769
84272
  );
83770
- assign8(
84273
+ assign9(
83771
84274
  [
83772
84275
  "drawing:complexType:CT_Backdrop",
83773
84276
  "drawing:complexType:CT_Camera",
@@ -83801,7 +84304,7 @@ assign8(
83801
84304
  ]
83802
84305
  }
83803
84306
  );
83804
- assign8(["chart:complexType:CT_DTable", "chart:element:dTable"], {
84307
+ assign9(["chart:complexType:CT_DTable", "chart:element:dTable"], {
83805
84308
  parse: "partial",
83806
84309
  preserve: "native",
83807
84310
  edit: "partial",
@@ -83813,7 +84316,7 @@ assign8(["chart:complexType:CT_DTable", "chart:element:dTable"], {
83813
84316
  ])
83814
84317
  ]
83815
84318
  });
83816
- assign8(
84319
+ assign9(
83817
84320
  [
83818
84321
  "chart:element:showHorzBorder",
83819
84322
  "chart:element:showVertBorder",
@@ -83833,7 +84336,7 @@ assign8(
83833
84336
  ]
83834
84337
  }
83835
84338
  );
83836
- assign8(
84339
+ assign9(
83837
84340
  [
83838
84341
  "presentation:complexType:CT_PrintProperties",
83839
84342
  "presentation:simpleType:ST_PrintColorMode",
@@ -83864,14 +84367,14 @@ assign8(
83864
84367
  ]
83865
84368
  }
83866
84369
  );
83867
- var OPENXML_TRANSITIONS_SCENES_AND_CHART_TABLES_COVERAGE = overrides8;
83868
- var overrides9 = {};
83869
- function assign9(ids, facets) {
84370
+ var OPENXML_TRANSITIONS_SCENES_AND_CHART_TABLES_COVERAGE = overrides9;
84371
+ var overrides10 = {};
84372
+ function assign10(ids, facets) {
83870
84373
  for (const id of ids) {
83871
- overrides9[id] = facets;
84374
+ overrides10[id] = facets;
83872
84375
  }
83873
84376
  }
83874
- assign9(
84377
+ assign10(
83875
84378
  [
83876
84379
  "presentation:complexType:CT_CommonViewProperties",
83877
84380
  "presentation:complexType:CT_CommonSlideViewProperties",
@@ -83898,7 +84401,7 @@ assign9(
83898
84401
  ]
83899
84402
  }
83900
84403
  );
83901
- assign9(
84404
+ assign10(
83902
84405
  [
83903
84406
  "drawing:complexType:CT_ColorChangeEffect",
83904
84407
  "drawing:complexType:CT_ColorReplaceEffect",
@@ -83924,7 +84427,7 @@ assign9(
83924
84427
  ]
83925
84428
  }
83926
84429
  );
83927
- assign9(
84430
+ assign10(
83928
84431
  [
83929
84432
  "drawing:complexType:CT_GrayscaleEffect",
83930
84433
  "drawing:complexType:CT_BiLevelEffect",
@@ -83946,7 +84449,7 @@ assign9(
83946
84449
  ]
83947
84450
  }
83948
84451
  );
83949
- assign9(
84452
+ assign10(
83950
84453
  [
83951
84454
  "chart:complexType:CT_Marker",
83952
84455
  "chart:complexType:CT_DPt",
@@ -83966,7 +84469,7 @@ assign9(
83966
84469
  ]
83967
84470
  }
83968
84471
  );
83969
- assign9(
84472
+ assign10(
83970
84473
  [
83971
84474
  "chart:complexType:CT_MarkerSize",
83972
84475
  "chart:complexType:CT_MarkerStyle",
@@ -83990,7 +84493,7 @@ assign9(
83990
84493
  ]
83991
84494
  }
83992
84495
  );
83993
- assign9(
84496
+ assign10(
83994
84497
  [
83995
84498
  "drawing:complexType:CT_AlphaBiLevelEffect",
83996
84499
  "drawing:complexType:CT_AlphaCeilingEffect",
@@ -84024,7 +84527,7 @@ assign9(
84024
84527
  ]
84025
84528
  }
84026
84529
  );
84027
- assign9(
84530
+ assign10(
84028
84531
  [
84029
84532
  "drawing:complexType:CT_AlphaInverseEffect",
84030
84533
  "drawing:complexType:CT_AlphaModulateEffect",
@@ -84046,7 +84549,7 @@ assign9(
84046
84549
  ]
84047
84550
  }
84048
84551
  );
84049
- var OPENXML_VIEW_IMAGE_AND_CHART_POINT_FORMATTING_COVERAGE = overrides9;
84552
+ var OPENXML_VIEW_IMAGE_AND_CHART_POINT_FORMATTING_COVERAGE = overrides10;
84050
84553
  var OPENXML_STRICT_SCHEMA_CONSTRUCT_IDS = [
84051
84554
  "chart:attribute:alignWithMargins",
84052
84555
  "chart:attribute:b",
@@ -88508,6 +89011,7 @@ var COVERAGE_OVERRIDES = {
88508
89011
  ...OPENXML_VIEW_IMAGE_AND_CHART_POINT_FORMATTING_COVERAGE,
88509
89012
  ...OPENXML_FONTS_AUDIO_PIVOTS_AND_ALGORITHMS_COVERAGE,
88510
89013
  ...OPENXML_LINE_LAYOUT_AND_PIVOT_STRUCTURES_COVERAGE,
89014
+ ...OPENXML_LINE_STROKE_PROPERTIES_COVERAGE,
88511
89015
  "chart:complexType:CT_ManualLayout": {
88512
89016
  parse: "native",
88513
89017
  preserve: "native",
@@ -125281,6 +125785,318 @@ async function mountModel3D(container, modelUrl, options) {
125281
125785
  }
125282
125786
  };
125283
125787
  }
125788
+ var GRID_SPACING = 0.5;
125789
+ var MAX_HEIGHT = 1.5;
125790
+ function computeGridExtent(cols, rows) {
125791
+ return {
125792
+ gridWidth: Math.max(cols - 1, 1) * GRID_SPACING,
125793
+ gridDepth: Math.max(rows - 1, 1) * GRID_SPACING
125794
+ };
125795
+ }
125796
+ function buildSurfaceGeometry(three, cols, rows, heightMap, colorMap) {
125797
+ const widthSegs = Math.max(cols - 1, 0);
125798
+ const depthSegs = Math.max(rows - 1, 0);
125799
+ const { gridWidth, gridDepth } = computeGridExtent(cols, rows);
125800
+ const geo = new three.PlaneGeometry(gridWidth, gridDepth, widthSegs, depthSegs);
125801
+ geo.rotateX(-Math.PI / 2);
125802
+ const pos2 = geo.attributes.position;
125803
+ const vertexCount = pos2.count;
125804
+ const colors = new Float32Array(vertexCount * 3);
125805
+ for (let i = 0; i < vertexCount; i++) {
125806
+ const row = Math.floor(i / cols);
125807
+ const col = i % cols;
125808
+ const idx = row * cols + col;
125809
+ const h = idx < heightMap.length ? heightMap[idx] : 0;
125810
+ pos2.setY(i, h * MAX_HEIGHT);
125811
+ const ci = idx * 3;
125812
+ colors[i * 3] = ci < colorMap.length ? colorMap[ci] : 0.5;
125813
+ colors[i * 3 + 1] = ci + 1 < colorMap.length ? colorMap[ci + 1] : 0.5;
125814
+ colors[i * 3 + 2] = ci + 2 < colorMap.length ? colorMap[ci + 2] : 0.5;
125815
+ }
125816
+ geo.setAttribute("color", new three.BufferAttribute(colors, 3));
125817
+ geo.computeVertexNormals();
125818
+ pos2.needsUpdate = true;
125819
+ const wireGeometry = new three.WireframeGeometry(geo);
125820
+ return { geometry: geo, wireGeometry };
125821
+ }
125822
+ function buildSurfaceLabels(cols, rows, categoryLabels, seriesNames, maxCat = 8, maxSer = 6) {
125823
+ const { gridWidth, gridDepth } = computeGridExtent(cols, rows);
125824
+ const labels = [];
125825
+ const catStep = Math.max(1, Math.ceil(categoryLabels.length / maxCat));
125826
+ for (let i = 0; i < categoryLabels.length; i += catStep) {
125827
+ const x = -gridWidth / 2 + i / Math.max(cols - 1, 1) * gridWidth;
125828
+ labels.push({
125829
+ key: `cat-${i}`,
125830
+ text: categoryLabels[i],
125831
+ anchor: [x, -0.15, gridDepth / 2 + 0.25],
125832
+ axis: "category"
125833
+ });
125834
+ }
125835
+ const serStep = Math.max(1, Math.ceil(seriesNames.length / maxSer));
125836
+ for (let i = 0; i < seriesNames.length; i += serStep) {
125837
+ const z = -gridDepth / 2 + i / Math.max(rows - 1, 1) * gridDepth;
125838
+ labels.push({
125839
+ key: `ser-${i}`,
125840
+ text: seriesNames[i],
125841
+ anchor: [gridWidth / 2 + 0.3, -0.15, z],
125842
+ axis: "series"
125843
+ });
125844
+ }
125845
+ labels.push({
125846
+ key: "value-axis",
125847
+ text: "Value",
125848
+ anchor: [-gridWidth / 2 - 0.35, 0.75, -gridDepth / 2],
125849
+ axis: "value"
125850
+ });
125851
+ return labels;
125852
+ }
125853
+ function computeCameraPlacement(cols, rows) {
125854
+ const { gridWidth, gridDepth } = computeGridExtent(cols, rows);
125855
+ const maxExtent = Math.max(gridWidth, gridDepth, MAX_HEIGHT);
125856
+ const dist2 = maxExtent * 1.8;
125857
+ return {
125858
+ position: [dist2 * 0.8, dist2 * 0.7, dist2 * 0.8],
125859
+ target: [0, 0.3, 0]
125860
+ };
125861
+ }
125862
+ var SURFACE_THREE_UNAVAILABLE = {
125863
+ ok: false,
125864
+ resize: () => {
125865
+ },
125866
+ dispose: () => {
125867
+ }
125868
+ };
125869
+ var FOV2 = 45;
125870
+ async function loadThree2() {
125871
+ try {
125872
+ return await import('./three.module-GNNNRIMK.js');
125873
+ } catch {
125874
+ return null;
125875
+ }
125876
+ }
125877
+ async function loadOrbitControlsCtor2() {
125878
+ try {
125879
+ const mod = await import('./OrbitControls-SMYCPLXO.js');
125880
+ return mod.OrbitControls;
125881
+ } catch {
125882
+ return null;
125883
+ }
125884
+ }
125885
+ function createLabelOverlay(doc, labels) {
125886
+ const layer = doc.createElement("div");
125887
+ Object.assign(layer.style, {
125888
+ position: "absolute",
125889
+ inset: "0",
125890
+ pointerEvents: "none",
125891
+ overflow: "hidden"
125892
+ });
125893
+ const nodes = labels.map((label) => {
125894
+ const node = doc.createElement("div");
125895
+ node.textContent = label.text;
125896
+ const color2 = label.axis === "value" ? "#999" : "#666";
125897
+ Object.assign(node.style, {
125898
+ position: "absolute",
125899
+ fontSize: "9px",
125900
+ color: color2,
125901
+ whiteSpace: "nowrap",
125902
+ userSelect: "none",
125903
+ transform: "translate(-50%, -50%)",
125904
+ willChange: "left, top"
125905
+ });
125906
+ if (label.axis === "value") {
125907
+ node.style.writingMode = "vertical-rl";
125908
+ }
125909
+ layer.appendChild(node);
125910
+ return node;
125911
+ });
125912
+ return { layer, nodes };
125913
+ }
125914
+ async function mountSurfaceChart3D(container, options) {
125915
+ const three = await loadThree2();
125916
+ const OrbitCtrlCtor = three ? await loadOrbitControlsCtor2() : null;
125917
+ if (!three || !OrbitCtrlCtor) {
125918
+ return SURFACE_THREE_UNAVAILABLE;
125919
+ }
125920
+ const { cols, rows } = options;
125921
+ let width = Math.max(1, options.width);
125922
+ let height = Math.max(1, options.height);
125923
+ const renderer = new three.WebGLRenderer({ antialias: true, alpha: true });
125924
+ renderer.setPixelRatio(
125925
+ Math.min(
125926
+ typeof window === "undefined" ? 1 : window.devicePixelRatio || 1,
125927
+ options.maxPixelRatio ?? 2
125928
+ )
125929
+ );
125930
+ renderer.setSize(width, height, false);
125931
+ const canvas = renderer.domElement;
125932
+ canvas.style.width = `${width}px`;
125933
+ canvas.style.height = `${height}px`;
125934
+ canvas.style.display = "block";
125935
+ canvas.style.willChange = "transform";
125936
+ container.appendChild(canvas);
125937
+ const scene = new three.Scene();
125938
+ scene.add(new three.AmbientLight(16777215, 0.6));
125939
+ const key2 = new three.DirectionalLight(16777215, 0.8);
125940
+ key2.position.set(5, 8, 5);
125941
+ scene.add(key2);
125942
+ const fill = new three.DirectionalLight(16777215, 0.3);
125943
+ fill.position.set(-3, 4, -2);
125944
+ scene.add(fill);
125945
+ const camera = new three.PerspectiveCamera(FOV2, width / height, 0.1, 1e3);
125946
+ const placement = computeCameraPlacement(cols, rows);
125947
+ camera.position.set(...placement.position);
125948
+ const target = new three.Vector3(...placement.target);
125949
+ camera.lookAt(target);
125950
+ const { gridWidth, gridDepth } = computeGridExtent(cols, rows);
125951
+ const floorSize = Math.max(gridWidth, gridDepth) * 1.2;
125952
+ const gridFloor = new three.GridHelper(floorSize, Math.max(cols, rows), 13421772, 15263976);
125953
+ gridFloor.position.y = -0.02;
125954
+ scene.add(gridFloor);
125955
+ const { geometry, wireGeometry } = buildSurfaceGeometry(
125956
+ three,
125957
+ cols,
125958
+ rows,
125959
+ options.heightMap,
125960
+ options.colorMap
125961
+ );
125962
+ const surfaceMaterial = new three.MeshPhongMaterial({
125963
+ vertexColors: true,
125964
+ side: three.DoubleSide,
125965
+ shininess: 30,
125966
+ transparent: true,
125967
+ opacity: 0.92
125968
+ });
125969
+ const surfaceMesh = new three.Mesh(geometry, surfaceMaterial);
125970
+ scene.add(surfaceMesh);
125971
+ let wireMaterial = null;
125972
+ if (options.wireframe) {
125973
+ wireMaterial = new three.LineBasicMaterial({
125974
+ color: 3355443,
125975
+ transparent: true,
125976
+ opacity: 0.25
125977
+ });
125978
+ scene.add(new three.LineSegments(wireGeometry, wireMaterial));
125979
+ }
125980
+ const controls = new OrbitCtrlCtor(camera, canvas);
125981
+ controls.enablePan = true;
125982
+ controls.enableZoom = true;
125983
+ controls.enableRotate = true;
125984
+ controls.minDistance = 1;
125985
+ controls.maxDistance = 20;
125986
+ controls.maxPolarAngle = Math.PI / 2 + 0.3;
125987
+ controls.target.copy(target);
125988
+ controls.update();
125989
+ const doc = container.ownerDocument ?? document;
125990
+ const labels = buildSurfaceLabels(cols, rows, options.categoryLabels, options.seriesNames);
125991
+ const { layer, nodes } = createLabelOverlay(doc, labels);
125992
+ container.appendChild(layer);
125993
+ const anchors = labels.map((l) => new three.Vector3(...l.anchor));
125994
+ const projected = new three.Vector3();
125995
+ const updateLabels = () => {
125996
+ for (let i = 0; i < nodes.length; i++) {
125997
+ projected.copy(anchors[i]).project(camera);
125998
+ const node = nodes[i];
125999
+ if (projected.z > 1) {
126000
+ node.style.display = "none";
126001
+ continue;
126002
+ }
126003
+ node.style.display = "";
126004
+ node.style.left = `${(projected.x + 1) / 2 * width}px`;
126005
+ node.style.top = `${(-projected.y + 1) / 2 * height}px`;
126006
+ }
126007
+ };
126008
+ let frame2 = 0;
126009
+ let disposed = false;
126010
+ const renderLoop = () => {
126011
+ if (disposed) {
126012
+ return;
126013
+ }
126014
+ frame2 = requestAnimationFrame(renderLoop);
126015
+ controls.update();
126016
+ renderer.render(scene, camera);
126017
+ updateLabels();
126018
+ };
126019
+ frame2 = requestAnimationFrame(renderLoop);
126020
+ return {
126021
+ ok: true,
126022
+ resize(w, h) {
126023
+ width = Math.max(1, w);
126024
+ height = Math.max(1, h);
126025
+ camera.aspect = width / height;
126026
+ camera.updateProjectionMatrix();
126027
+ renderer.setSize(width, height, false);
126028
+ canvas.style.width = `${width}px`;
126029
+ canvas.style.height = `${height}px`;
126030
+ },
126031
+ dispose() {
126032
+ if (disposed) {
126033
+ return;
126034
+ }
126035
+ disposed = true;
126036
+ cancelAnimationFrame(frame2);
126037
+ controls.dispose();
126038
+ geometry.dispose();
126039
+ wireGeometry.dispose();
126040
+ surfaceMaterial.dispose();
126041
+ wireMaterial?.dispose();
126042
+ gridFloor.dispose();
126043
+ scene.clear();
126044
+ renderer.dispose();
126045
+ canvas.remove();
126046
+ layer.remove();
126047
+ }
126048
+ };
126049
+ }
126050
+ function buildSurfaceChart3DData(chartData, categoryLabels, options) {
126051
+ const seriesCount = chartData.series.length;
126052
+ const catCount = categoryLabels.length;
126053
+ if (seriesCount === 0 || catCount === 0) {
126054
+ return null;
126055
+ }
126056
+ const range = computeValueRange2(chartData.series);
126057
+ const heightMap = new Float32Array(seriesCount * catCount);
126058
+ const colorMap = new Float32Array(seriesCount * catCount * 3);
126059
+ for (let row = 0; row < seriesCount; row++) {
126060
+ for (let col = 0; col < catCount; col++) {
126061
+ const idx = row * catCount + col;
126062
+ const val2 = chartData.series[row]?.values[col] ?? 0;
126063
+ const t = range.span > 0 ? (val2 - range.min) / range.span : 0;
126064
+ heightMap[idx] = t;
126065
+ const { r, g, b } = surfaceColor(t);
126066
+ const ci = idx * 3;
126067
+ colorMap[ci] = r / 255;
126068
+ colorMap[ci + 1] = g / 255;
126069
+ colorMap[ci + 2] = b / 255;
126070
+ }
126071
+ }
126072
+ return {
126073
+ cols: catCount,
126074
+ rows: seriesCount,
126075
+ heightMap,
126076
+ colorMap,
126077
+ wireframe: options.wireframe ?? true,
126078
+ categoryLabels,
126079
+ seriesNames: chartData.series.map((s) => s.name),
126080
+ width: options.width,
126081
+ height: options.height
126082
+ };
126083
+ }
126084
+ function buildSurfaceChart3DDataForElement(element, options) {
126085
+ if (element.type !== "chart") {
126086
+ return null;
126087
+ }
126088
+ const chartEl = element;
126089
+ const chartData = chartEl.chartData;
126090
+ if (!chartData || chartData.series.length === 0) {
126091
+ return null;
126092
+ }
126093
+ if (resolveChartKind(chartData.chartType ?? "bar") !== "surface") {
126094
+ return null;
126095
+ }
126096
+ const longestLen = chartData.series.reduce((m, s) => Math.max(m, s.values.length), 0);
126097
+ const categoryLabels = chartData.categories.length > 0 ? chartData.categories : Array.from({ length: longestLen }, (_, i) => String(i + 1));
126098
+ return buildSurfaceChart3DData(chartData, categoryLabels, options);
126099
+ }
125284
126100
  var AVERAGE_ADVANCE_RATIO = 0.5;
125285
126101
  function wrapTextByEstimatedWidth(text2, maxWidth, fontSize, options = {}) {
125286
126102
  if (!text2 || text2.trim().length === 0) {
@@ -135077,6 +135893,7 @@ exports.buildSmartArtA11y = buildSmartArtA11y;
135077
135893
  exports.buildSmartArtPresetData = buildSmartArtPresetData;
135078
135894
  exports.buildStrokeOutline = buildStrokeOutline;
135079
135895
  exports.buildSummaryZoomView = buildSummaryZoomView;
135896
+ exports.buildSurfaceChart3DDataForElement = buildSurfaceChart3DDataForElement;
135080
135897
  exports.buildSvgGradientDef = buildSvgGradientDef;
135081
135898
  exports.buildTableDataGrid = buildTableDataGrid;
135082
135899
  exports.buildTextBlockStyle = buildTextBlockStyle;
@@ -135372,6 +136189,7 @@ exports.motionPathPresetLabelKey = motionPathPresetLabelKey;
135372
136189
  exports.motionPathPresetsByFamily = motionPathPresetsByFamily;
135373
136190
  exports.motionPathToSvgD = motionPathToSvgD;
135374
136191
  exports.mountModel3D = mountModel3D;
136192
+ exports.mountSurfaceChart3D = mountSurfaceChart3D;
135375
136193
  exports.movePresenterPointer = movePresenterPointer;
135376
136194
  exports.moveQuickAccessCommand = moveQuickAccessCommand;
135377
136195
  exports.moveSectionDown = moveSectionDown;