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
@@ -9003,10 +9003,10 @@ function normalizeSrgbHex(color2) {
9003
9003
  }
9004
9004
  return void 0;
9005
9005
  }
9006
- function resolveThemeColors(overrides10) {
9006
+ function resolveThemeColors(overrides11) {
9007
9007
  const resolved = {};
9008
9008
  for (const [key2, fallback] of Object.entries(DEFAULT_COLORS)) {
9009
- resolved[key2] = normalizeSrgbHex(overrides10?.[key2]) ?? normalizeSrgbHex(fallback) ?? "000000";
9009
+ resolved[key2] = normalizeSrgbHex(overrides11?.[key2]) ?? normalizeSrgbHex(fallback) ?? "000000";
9010
9010
  }
9011
9011
  return resolved;
9012
9012
  }
@@ -19223,13 +19223,13 @@ var PptxContentTypesBuilder = class _PptxContentTypesBuilder {
19223
19223
  applySlideAndMediaUpdates(init) {
19224
19224
  const typesRoot = this.ensureTypesRoot(init.contentTypesData);
19225
19225
  const defaults = this.ensureArray(typesRoot["Default"]);
19226
- const overrides10 = this.ensureArray(typesRoot["Override"]);
19226
+ const overrides11 = this.ensureArray(typesRoot["Override"]);
19227
19227
  const activeSlidePartNames = new Set(
19228
19228
  init.slidePaths.map(
19229
19229
  (slidePath) => this.normalizePartName(slidePath.startsWith("/") ? slidePath.substring(1) : slidePath)
19230
19230
  )
19231
19231
  );
19232
- const filteredOverrides = overrides10.filter((entry2) => {
19232
+ const filteredOverrides = overrides11.filter((entry2) => {
19233
19233
  if (entry2?.["@_ContentType"] !== init.slideContentType) {
19234
19234
  return true;
19235
19235
  }
@@ -19266,17 +19266,17 @@ var PptxContentTypesBuilder = class _PptxContentTypesBuilder {
19266
19266
  init.contentTypesData["Types"] = typesRoot;
19267
19267
  return init.contentTypesData;
19268
19268
  }
19269
- applyInkOverrides(overrides10, paths) {
19269
+ applyInkOverrides(overrides11, paths) {
19270
19270
  if (!paths) {
19271
19271
  return;
19272
19272
  }
19273
19273
  const existing = new Set(
19274
- overrides10.filter((entry2) => entry2["@_ContentType"] === "application/inkml+xml").map((entry2) => String(entry2["@_PartName"] ?? ""))
19274
+ overrides11.filter((entry2) => entry2["@_ContentType"] === "application/inkml+xml").map((entry2) => String(entry2["@_PartName"] ?? ""))
19275
19275
  );
19276
19276
  for (const path of paths) {
19277
19277
  const partName = this.normalizePartName(path);
19278
19278
  if (!existing.has(partName)) {
19279
- overrides10.push({
19279
+ overrides11.push({
19280
19280
  "@_PartName": partName,
19281
19281
  "@_ContentType": "application/inkml+xml"
19282
19282
  });
@@ -19286,11 +19286,11 @@ var PptxContentTypesBuilder = class _PptxContentTypesBuilder {
19286
19286
  applyCommentUpdates(init) {
19287
19287
  const typesRoot = this.ensureTypesRoot(init.contentTypesData);
19288
19288
  const defaults = this.ensureArray(typesRoot["Default"]);
19289
- const overrides10 = this.ensureArray(typesRoot["Override"]);
19289
+ const overrides11 = this.ensureArray(typesRoot["Override"]);
19290
19290
  const activeCommentPartNames = new Set(
19291
19291
  Array.from(init.activeCommentPaths).map((commentPath) => this.normalizePartName(commentPath))
19292
19292
  );
19293
- const filteredOverrides = overrides10.filter((entry2) => {
19293
+ const filteredOverrides = overrides11.filter((entry2) => {
19294
19294
  const entryType = String(entry2?.["@_ContentType"] || "");
19295
19295
  const rawPartName = entry2?.["@_PartName"];
19296
19296
  const entryPartName = typeof rawPartName === "string" ? this.normalizePartName(rawPartName) : void 0;
@@ -19395,9 +19395,9 @@ var PptxContentTypesBuilder = class _PptxContentTypesBuilder {
19395
19395
  return;
19396
19396
  }
19397
19397
  const typesRoot = this.ensureTypesRoot(init.contentTypesData);
19398
- const overrides10 = this.ensureArray(typesRoot["Override"]);
19398
+ const overrides11 = this.ensureArray(typesRoot["Override"]);
19399
19399
  const existingOverrides = /* @__PURE__ */ new Set();
19400
- for (const entry2 of overrides10) {
19400
+ for (const entry2 of overrides11) {
19401
19401
  const partName = entry2?.["@_PartName"];
19402
19402
  if (typeof partName === "string") {
19403
19403
  existingOverrides.add(this.normalizePartName(partName));
@@ -19411,13 +19411,13 @@ var PptxContentTypesBuilder = class _PptxContentTypesBuilder {
19411
19411
  if (existingOverrides.has(partName)) {
19412
19412
  continue;
19413
19413
  }
19414
- overrides10.push({
19414
+ overrides11.push({
19415
19415
  "@_PartName": partName,
19416
19416
  "@_ContentType": _PptxContentTypesBuilder.CUSTOM_XML_CONTENT_TYPE
19417
19417
  });
19418
19418
  existingOverrides.add(partName);
19419
19419
  }
19420
- typesRoot["Override"] = overrides10;
19420
+ typesRoot["Override"] = overrides11;
19421
19421
  init.contentTypesData["Types"] = typesRoot;
19422
19422
  }
19423
19423
  /** Content type for the main presentation part keyed by output format. */
@@ -19436,9 +19436,9 @@ var PptxContentTypesBuilder = class _PptxContentTypesBuilder {
19436
19436
  return;
19437
19437
  }
19438
19438
  const typesRoot = this.ensureTypesRoot(contentTypesData);
19439
- const overrides10 = this.ensureArray(typesRoot["Override"]);
19439
+ const overrides11 = this.ensureArray(typesRoot["Override"]);
19440
19440
  const targetContentType = _PptxContentTypesBuilder.PRESENTATION_CONTENT_TYPES[format];
19441
- for (const entry2 of overrides10) {
19441
+ for (const entry2 of overrides11) {
19442
19442
  const partName = String(entry2?.["@_PartName"] || "");
19443
19443
  const normalised = this.normalizePartName(partName);
19444
19444
  if (normalised === "/ppt/presentation.xml") {
@@ -19448,18 +19448,18 @@ var PptxContentTypesBuilder = class _PptxContentTypesBuilder {
19448
19448
  }
19449
19449
  if (format === "pptm" && hasVba) {
19450
19450
  const vbaPartName = "/ppt/vbaProject.bin";
19451
- const hasVbaOverride = overrides10.some((entry2) => {
19451
+ const hasVbaOverride = overrides11.some((entry2) => {
19452
19452
  const pn = String(entry2?.["@_PartName"] || "");
19453
19453
  return this.normalizePartName(pn) === vbaPartName;
19454
19454
  });
19455
19455
  if (!hasVbaOverride) {
19456
- overrides10.push({
19456
+ overrides11.push({
19457
19457
  "@_PartName": vbaPartName,
19458
19458
  "@_ContentType": _PptxContentTypesBuilder.VBA_PROJECT_CONTENT_TYPE
19459
19459
  });
19460
19460
  }
19461
19461
  }
19462
- typesRoot["Override"] = overrides10;
19462
+ typesRoot["Override"] = overrides11;
19463
19463
  contentTypesData["Types"] = typesRoot;
19464
19464
  }
19465
19465
  };
@@ -21047,12 +21047,12 @@ var PptxSlideNotesPartUpdater = class {
21047
21047
  const data = init.parser.parse(xml);
21048
21048
  const root = data["Types"] ?? {};
21049
21049
  const raw = root["Override"];
21050
- const overrides10 = Array.isArray(raw) ? raw : raw ? [raw] : [];
21051
- overrides10.push({
21050
+ const overrides11 = Array.isArray(raw) ? raw : raw ? [raw] : [];
21051
+ overrides11.push({
21052
21052
  "@_PartName": `/${notesPath}`,
21053
21053
  "@_ContentType": "application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml"
21054
21054
  });
21055
- root["Override"] = overrides10;
21055
+ root["Override"] = overrides11;
21056
21056
  data["Types"] = root;
21057
21057
  init.zip.file("[Content_Types].xml", init.xmlBuilder.build(data));
21058
21058
  }
@@ -25027,9 +25027,9 @@ function evaluateLayoutRules(base, rules, nodes) {
25027
25027
  }
25028
25028
  return { constraints, nodeConstraints };
25029
25029
  }
25030
- function applyNodeLayoutRules(shapes, overrides10, bounds, global) {
25030
+ function applyNodeLayoutRules(shapes, overrides11, bounds, global) {
25031
25031
  return shapes.map((shape) => {
25032
- const rule = overrides10.get(shape.nodeId);
25032
+ const rule = overrides11.get(shape.nodeId);
25033
25033
  const widthRule = rule?.w ?? global.w;
25034
25034
  const heightRule = rule?.h ?? global.h;
25035
25035
  const width = widthRule !== void 0 ? widthRule * bounds.width : shape.width;
@@ -32802,6 +32802,110 @@ function unwrapAlternateContent(container) {
32802
32802
  delete container["mc:AlternateContent"];
32803
32803
  return blocks;
32804
32804
  }
32805
+ function reapplyAlternateContentToTree(container, blockByNode) {
32806
+ let working = container;
32807
+ const groups = ensureArray3(working["p:grpSp"]);
32808
+ if (groups.length > 0) {
32809
+ let groupsChanged = false;
32810
+ const nextGroups = groups.map((group2) => {
32811
+ const next2 = reapplyAlternateContentToTree(group2, blockByNode);
32812
+ if (next2 !== group2) {
32813
+ groupsChanged = true;
32814
+ }
32815
+ return next2;
32816
+ });
32817
+ if (groupsChanged) {
32818
+ working = { ...working, "p:grpSp": nextGroups };
32819
+ }
32820
+ }
32821
+ const blockGroups = /* @__PURE__ */ new Map();
32822
+ for (const tag of SHAPE_TREE_ELEMENT_TAGS) {
32823
+ for (const node of ensureArray3(working[tag])) {
32824
+ const block = blockByNode.get(node);
32825
+ if (!block) {
32826
+ continue;
32827
+ }
32828
+ let entries = blockGroups.get(block);
32829
+ if (!entries) {
32830
+ entries = [];
32831
+ blockGroups.set(block, entries);
32832
+ }
32833
+ entries.push({ tag, node });
32834
+ }
32835
+ }
32836
+ if (blockGroups.size === 0) {
32837
+ return working;
32838
+ }
32839
+ const nextArrays = /* @__PURE__ */ new Map();
32840
+ const arrayFor = (tag) => {
32841
+ let arr = nextArrays.get(tag);
32842
+ if (!arr) {
32843
+ arr = [...ensureArray3(working[tag])];
32844
+ nextArrays.set(tag, arr);
32845
+ }
32846
+ return arr;
32847
+ };
32848
+ const envelopes = [...ensureArray3(working["mc:AlternateContent"])];
32849
+ for (const [block, entries] of blockGroups) {
32850
+ for (const entry2 of entries) {
32851
+ const arr = arrayFor(entry2.tag);
32852
+ const idx = arr.indexOf(entry2.node);
32853
+ if (idx !== -1) {
32854
+ arr.splice(idx, 1);
32855
+ }
32856
+ }
32857
+ const liveByTag = /* @__PURE__ */ new Map();
32858
+ for (const entry2 of entries) {
32859
+ let nodes = liveByTag.get(entry2.tag);
32860
+ if (!nodes) {
32861
+ nodes = [];
32862
+ liveByTag.set(entry2.tag, nodes);
32863
+ }
32864
+ nodes.push(entry2.node);
32865
+ }
32866
+ const clonedAc = { ...block.rawAc };
32867
+ if (block.selectedBranch === "choice") {
32868
+ const choices2 = ensureArray3(clonedAc["mc:Choice"]);
32869
+ const targetIdx = block.choiceIndex ?? 0;
32870
+ const original = choices2[targetIdx];
32871
+ if (original) {
32872
+ const rebuilt = { ...original };
32873
+ for (const tag of SHAPE_TREE_ELEMENT_TAGS) {
32874
+ delete rebuilt[tag];
32875
+ }
32876
+ for (const [tag, nodes] of liveByTag) {
32877
+ rebuilt[tag] = nodes.length === 1 ? nodes[0] : nodes;
32878
+ }
32879
+ const nextChoices = [...choices2];
32880
+ nextChoices[targetIdx] = rebuilt;
32881
+ clonedAc["mc:Choice"] = nextChoices.length === 1 ? nextChoices[0] : nextChoices;
32882
+ }
32883
+ } else {
32884
+ const fallback = clonedAc["mc:Fallback"];
32885
+ if (fallback) {
32886
+ const rebuilt = { ...fallback };
32887
+ for (const tag of SHAPE_TREE_ELEMENT_TAGS) {
32888
+ delete rebuilt[tag];
32889
+ }
32890
+ for (const [tag, nodes] of liveByTag) {
32891
+ rebuilt[tag] = nodes.length === 1 ? nodes[0] : nodes;
32892
+ }
32893
+ clonedAc["mc:Fallback"] = rebuilt;
32894
+ }
32895
+ }
32896
+ envelopes.push(clonedAc);
32897
+ }
32898
+ const next = { ...working };
32899
+ for (const [tag, arr] of nextArrays) {
32900
+ if (arr.length > 0) {
32901
+ next[tag] = arr;
32902
+ } else {
32903
+ delete next[tag];
32904
+ }
32905
+ }
32906
+ next["mc:AlternateContent"] = envelopes.length === 1 ? envelopes[0] : envelopes;
32907
+ return next;
32908
+ }
32805
32909
  function ensureArray3(val2) {
32806
32910
  if (!val2) {
32807
32911
  return [];
@@ -36067,6 +36171,37 @@ var STYLE_MATRIX_LINE_KEYS = [
36067
36171
  "lineCap",
36068
36172
  "compoundLine"
36069
36173
  ];
36174
+ var STYLE_MATRIX_EFFECT_KEYS = [
36175
+ "shadowColor",
36176
+ "shadowBlur",
36177
+ "shadowOffsetX",
36178
+ "shadowOffsetY",
36179
+ "shadowOpacity",
36180
+ "innerShadowColor",
36181
+ "innerShadowBlur",
36182
+ "innerShadowOffsetX",
36183
+ "innerShadowOffsetY",
36184
+ "innerShadowOpacity",
36185
+ "glowColor",
36186
+ "glowRadius",
36187
+ "glowOpacity",
36188
+ "softEdgeRadius",
36189
+ "reflectionBlurRadius",
36190
+ "reflectionStartOpacity",
36191
+ "reflectionEndOpacity",
36192
+ "reflectionEndPosition",
36193
+ "reflectionDirection",
36194
+ "reflectionRotation",
36195
+ "reflectionDistance",
36196
+ "scene3d",
36197
+ "shape3d"
36198
+ ];
36199
+ var EFFECT_AUTHORED_ONLY_KEYS = [
36200
+ "blurRadius",
36201
+ "presetShadowName",
36202
+ "effectDagXml",
36203
+ "effectDagTree"
36204
+ ];
36070
36205
  function captureStyleBaseline(style, keys) {
36071
36206
  const baseline = {};
36072
36207
  for (const key2 of keys) {
@@ -36091,6 +36226,16 @@ function createLineStyleGate(style) {
36091
36226
  }
36092
36227
  return (...keys) => keys.some((key2) => style[key2] !== baseline[key2]);
36093
36228
  }
36229
+ function effectIsPurelyStyleMatrix(style) {
36230
+ const baseline = style.inheritedEffectStyle;
36231
+ if (baseline === void 0) {
36232
+ return false;
36233
+ }
36234
+ if (!matchesBaseline(style, baseline, STYLE_MATRIX_EFFECT_KEYS)) {
36235
+ return false;
36236
+ }
36237
+ return EFFECT_AUTHORED_ONLY_KEYS.every((key2) => style[key2] === void 0);
36238
+ }
36094
36239
  function applyScene3dStyle(shapeProps, style) {
36095
36240
  const scene3dNode = shapeProps["a:scene3d"];
36096
36241
  if (!scene3dNode) {
@@ -36409,14 +36554,17 @@ var PptxShapeStyleExtractor = class {
36409
36554
  Object.assign(style, this.context.extractEffectDagStyle(shapeProps));
36410
36555
  if (styleNode?.["a:effectRef"]) {
36411
36556
  const suppressInherited = hasEmptyDrawingChild(shapeProps, "effectLst");
36412
- const authored = suppressInherited ? new Set(Object.keys(style)) : void 0;
36557
+ const authoredBefore = new Set(Object.keys(style));
36413
36558
  this.context.resolveThemeEffectRef(styleNode["a:effectRef"], style);
36414
- if (authored) {
36559
+ if (suppressInherited) {
36415
36560
  for (const key2 of Object.keys(style)) {
36416
- if (!authored.has(key2) && key2 !== "effectRefIdx" && key2 !== "effectRefColorXml") {
36561
+ if (!authoredBefore.has(key2) && key2 !== "effectRefIdx" && key2 !== "effectRefColorXml") {
36417
36562
  delete style[key2];
36418
36563
  }
36419
36564
  }
36565
+ } else {
36566
+ const inheritedKeys = STYLE_MATRIX_EFFECT_KEYS.filter((key2) => !authoredBefore.has(key2));
36567
+ style.inheritedEffectStyle = captureStyleBaseline(style, inheritedKeys);
36420
36568
  }
36421
36569
  }
36422
36570
  const fontRef = styleNode?.["a:fontRef"];
@@ -38833,7 +38981,10 @@ var GRAPHIC_FRAME_LIMITATIONS = {
38833
38981
  "PARTIAL_SMARTART_SUPPORT",
38834
38982
  "SmartArt is parsed and preserved, but some DiagramML behavior is not editable."
38835
38983
  ],
38836
- ole: ["PARTIAL_OLE_SUPPORT", "The OLE payload is preserved but cannot be rendered or edited."],
38984
+ ole: [
38985
+ "PARTIAL_OLE_SUPPORT",
38986
+ "The OLE payload renders as a preview image and can be downloaded or opened in a new tab, but cannot be edited in place."
38987
+ ],
38837
38988
  ink: [
38838
38989
  "PARTIAL_INK_SUPPORT",
38839
38990
  "Ink is rendered from decoded traces; unsupported ink properties remain raw XML."
@@ -39209,8 +39360,8 @@ var PptxDocumentPropertiesUpdater = class {
39209
39360
  coreProps["@_xmlns:dcterms"] = "http://purl.org/dc/terms/";
39210
39361
  }
39211
39362
  }
39212
- applyCorePropertiesOverrides(coreProps, overrides10) {
39213
- if (!overrides10) {
39363
+ applyCorePropertiesOverrides(coreProps, overrides11) {
39364
+ if (!overrides11) {
39214
39365
  return;
39215
39366
  }
39216
39367
  const map = [
@@ -39227,7 +39378,7 @@ var PptxDocumentPropertiesUpdater = class {
39227
39378
  ["contentStatus", "cp:contentStatus"]
39228
39379
  ];
39229
39380
  for (const [sourceKey, xmlKey] of map) {
39230
- const value = overrides10[sourceKey];
39381
+ const value = overrides11[sourceKey];
39231
39382
  if (value === void 0) {
39232
39383
  continue;
39233
39384
  }
@@ -39253,8 +39404,8 @@ var PptxDocumentPropertiesUpdater = class {
39253
39404
  updateSlideTitleProperties(appProps, slides) {
39254
39405
  applySlideTitlesToAppProps(appProps, deriveSlideTitles(slides));
39255
39406
  }
39256
- applyAppPropertiesOverrides(appProps, overrides10) {
39257
- if (!overrides10) {
39407
+ applyAppPropertiesOverrides(appProps, overrides11) {
39408
+ if (!overrides11) {
39258
39409
  return;
39259
39410
  }
39260
39411
  const stringMap = [
@@ -39274,7 +39425,7 @@ var PptxDocumentPropertiesUpdater = class {
39274
39425
  ["paragraphs", "Paragraphs"]
39275
39426
  ];
39276
39427
  for (const [sourceKey, xmlKey] of stringMap) {
39277
- const value = overrides10[sourceKey];
39428
+ const value = overrides11[sourceKey];
39278
39429
  if (value === void 0) {
39279
39430
  continue;
39280
39431
  }
@@ -39286,7 +39437,7 @@ var PptxDocumentPropertiesUpdater = class {
39286
39437
  }
39287
39438
  }
39288
39439
  for (const [sourceKey, xmlKey] of numberMap) {
39289
- const value = overrides10[sourceKey];
39440
+ const value = overrides11[sourceKey];
39290
39441
  if (value === void 0) {
39291
39442
  continue;
39292
39443
  }
@@ -39344,16 +39495,16 @@ var PptxDocumentPropertiesUpdater = class {
39344
39495
  const ctData = this.context.parser.parse(ctXml);
39345
39496
  const types = ctData["Types"];
39346
39497
  if (types) {
39347
- const overrides10 = Array.isArray(types["Override"]) ? types["Override"] : types["Override"] ? [types["Override"]] : [];
39348
- const hasCustomOverride = overrides10.some(
39498
+ const overrides11 = Array.isArray(types["Override"]) ? types["Override"] : types["Override"] ? [types["Override"]] : [];
39499
+ const hasCustomOverride = overrides11.some(
39349
39500
  (o) => String(o?.["@_PartName"] || "") === "/docProps/custom.xml"
39350
39501
  );
39351
39502
  if (!hasCustomOverride) {
39352
- overrides10.push({
39503
+ overrides11.push({
39353
39504
  "@_PartName": "/docProps/custom.xml",
39354
39505
  "@_ContentType": customContentType
39355
39506
  });
39356
- types["Override"] = overrides10.length === 1 ? overrides10[0] : overrides10;
39507
+ types["Override"] = overrides11.length === 1 ? overrides11[0] : overrides11;
39357
39508
  this.context.zip.file("[Content_Types].xml", this.context.builder.build(ctData));
39358
39509
  }
39359
39510
  }
@@ -39407,11 +39558,11 @@ var PptxDocumentPropertiesUpdater = class {
39407
39558
  const ctData = this.context.parser.parse(ctXml);
39408
39559
  const types = ctData["Types"];
39409
39560
  if (types) {
39410
- const overrides10 = Array.isArray(types["Override"]) ? types["Override"] : types["Override"] ? [types["Override"]] : [];
39411
- const filtered = overrides10.filter(
39561
+ const overrides11 = Array.isArray(types["Override"]) ? types["Override"] : types["Override"] ? [types["Override"]] : [];
39562
+ const filtered = overrides11.filter(
39412
39563
  (o) => String(o?.["@_PartName"] || "") !== "/docProps/custom.xml"
39413
39564
  );
39414
- if (filtered.length !== overrides10.length) {
39565
+ if (filtered.length !== overrides11.length) {
39415
39566
  types["Override"] = filtered.length === 1 ? filtered[0] : filtered;
39416
39567
  this.context.zip.file("[Content_Types].xml", this.context.builder.build(ctData));
39417
39568
  }
@@ -39725,15 +39876,15 @@ async function ensureSlideSyncContentType(zip, parser, writer, partPath, content
39725
39876
  const data = parser.parse(xml);
39726
39877
  const root = data["Types"] || {};
39727
39878
  const values = root["Override"];
39728
- const overrides10 = Array.isArray(values) ? values : values ? [values] : [];
39879
+ const overrides11 = Array.isArray(values) ? values : values ? [values] : [];
39729
39880
  const partName = `/${partPath.replace(/^\//u, "")}`;
39730
- const entry2 = overrides10.find((item) => item["@_PartName"] === partName);
39881
+ const entry2 = overrides11.find((item) => item["@_PartName"] === partName);
39731
39882
  if (entry2) {
39732
39883
  entry2["@_ContentType"] = contentType;
39733
39884
  } else {
39734
- overrides10.push({ "@_PartName": partName, "@_ContentType": contentType });
39885
+ overrides11.push({ "@_PartName": partName, "@_ContentType": contentType });
39735
39886
  }
39736
- root["Override"] = overrides10;
39887
+ root["Override"] = overrides11;
39737
39888
  data["Types"] = root;
39738
39889
  zip.file("[Content_Types].xml", writer.build(data));
39739
39890
  }
@@ -45389,6 +45540,16 @@ var CONTAINER_LOCAL_NAME_TO_TYPE = {
45389
45540
  function chartContainerLocalNameToType(localName25) {
45390
45541
  return CONTAINER_LOCAL_NAME_TO_TYPE[localName25];
45391
45542
  }
45543
+ var LINE_DRAWN_CHART_TYPES = /* @__PURE__ */ new Set([
45544
+ "line",
45545
+ "line3D",
45546
+ "scatter",
45547
+ "radar",
45548
+ "stock"
45549
+ ]);
45550
+ function isLineDrawnChartType(type) {
45551
+ return type !== void 0 && LINE_DRAWN_CHART_TYPES.has(type);
45552
+ }
45392
45553
  function parseChartDateCategories(seriesNode, xmlLookup) {
45393
45554
  const cat = xmlLookup.getChildByLocalName(seriesNode, "cat");
45394
45555
  const numeric = xmlLookup.getChildByLocalName(cat, "numRef") || xmlLookup.getChildByLocalName(cat, "numLit");
@@ -47958,9 +48119,9 @@ var nextRelationshipId = (relationships) => {
47958
48119
  }
47959
48120
  return `rId${index}`;
47960
48121
  };
47961
- var updateOverride = (overrides10, contentType, activePaths) => {
48122
+ var updateOverride = (overrides11, contentType, activePaths) => {
47962
48123
  const active = new Set(activePaths.map((path) => `/${path.replace(/^\//, "")}`));
47963
- const retained = overrides10.filter(
48124
+ const retained = overrides11.filter(
47964
48125
  (entry2) => String(entry2["@_ContentType"] || "") !== contentType || active.has(String(entry2["@_PartName"] || ""))
47965
48126
  );
47966
48127
  for (const path of active) {
@@ -48011,14 +48172,14 @@ async function persistModernCommentPackage(init) {
48011
48172
  if (contentTypesXml3) {
48012
48173
  const data = init.parser.parse(contentTypesXml3);
48013
48174
  const root = data["Types"] || {};
48014
- let overrides10 = ensureArray9(root["Override"]);
48015
- overrides10 = updateOverride(overrides10, MODERN_COMMENT_CONTENT_TYPE, activeCommentPaths);
48016
- overrides10 = updateOverride(
48017
- overrides10,
48175
+ let overrides11 = ensureArray9(root["Override"]);
48176
+ overrides11 = updateOverride(overrides11, MODERN_COMMENT_CONTENT_TYPE, activeCommentPaths);
48177
+ overrides11 = updateOverride(
48178
+ overrides11,
48018
48179
  MODERN_AUTHOR_CONTENT_TYPE,
48019
48180
  hasComments ? [authorPath] : []
48020
48181
  );
48021
- root["Override"] = overrides10;
48182
+ root["Override"] = overrides11;
48022
48183
  data["Types"] = root;
48023
48184
  init.zip.file("[Content_Types].xml", init.xmlBuilder.build(data));
48024
48185
  }
@@ -50195,17 +50356,17 @@ async function upsertContentTypes(zip, codec, contentTypes) {
50195
50356
  }
50196
50357
  const data = codec.parse(xml);
50197
50358
  const root = data["Types"];
50198
- const overrides10 = ensureArray13(root["Override"]);
50359
+ const overrides11 = ensureArray13(root["Override"]);
50199
50360
  for (const [path, contentType] of contentTypes) {
50200
50361
  const partName = `/${path}`;
50201
- const existing = overrides10.find((entry2) => entry2["@_PartName"] === partName);
50362
+ const existing = overrides11.find((entry2) => entry2["@_PartName"] === partName);
50202
50363
  if (existing) {
50203
50364
  existing["@_ContentType"] = contentType;
50204
50365
  } else {
50205
- overrides10.push({ "@_PartName": partName, "@_ContentType": contentType });
50366
+ overrides11.push({ "@_PartName": partName, "@_ContentType": contentType });
50206
50367
  }
50207
50368
  }
50208
- root["Override"] = overrides10;
50369
+ root["Override"] = overrides11;
50209
50370
  zip.file("[Content_Types].xml", codec.build(data));
50210
50371
  }
50211
50372
  function relsForSourcePart(source) {
@@ -50357,17 +50518,17 @@ async function upsertTagContentTypes(zip, codec, paths) {
50357
50518
  }
50358
50519
  const data = codec.parse(xml);
50359
50520
  const root = data["Types"];
50360
- const overrides10 = ensureArray14(root["Override"]);
50521
+ const overrides11 = ensureArray14(root["Override"]);
50361
50522
  for (const path of paths) {
50362
50523
  const partName = `/${path}`;
50363
- const existing = overrides10.find((entry2) => entry2["@_PartName"] === partName);
50524
+ const existing = overrides11.find((entry2) => entry2["@_PartName"] === partName);
50364
50525
  if (existing) {
50365
50526
  existing["@_ContentType"] = TAG_CONTENT_TYPE;
50366
50527
  } else {
50367
- overrides10.push({ "@_PartName": partName, "@_ContentType": TAG_CONTENT_TYPE });
50528
+ overrides11.push({ "@_PartName": partName, "@_ContentType": TAG_CONTENT_TYPE });
50368
50529
  }
50369
50530
  }
50370
- root["Override"] = overrides10;
50531
+ root["Override"] = overrides11;
50371
50532
  zip.file("[Content_Types].xml", codec.build(data));
50372
50533
  }
50373
50534
  function sourcePartForRels(relsPath) {
@@ -51287,6 +51448,77 @@ function applyChartLegendToXml(chartRoot, style, getLocalName2, resolveColor2) {
51287
51448
  }
51288
51449
  applyLegendEntries(legendNode, style.legendEntries, getLocalName2, resolveColor2);
51289
51450
  }
51451
+ function findKey18(obj, local, getLocalName2) {
51452
+ return Object.keys(obj).find((k) => getLocalName2(k) === local);
51453
+ }
51454
+ function insertBeforeLn(obj, key2, value, getLocalName2) {
51455
+ const keys = Object.keys(obj);
51456
+ const lnIdx = keys.findIndex((k) => getLocalName2(k) === "ln");
51457
+ const entries = keys.map((k) => [k, obj[k]]);
51458
+ const at = lnIdx === -1 ? entries.length : lnIdx;
51459
+ entries.splice(at, 0, [key2, value]);
51460
+ for (const k of keys) {
51461
+ delete obj[k];
51462
+ }
51463
+ for (const [k, v] of entries) {
51464
+ obj[k] = v;
51465
+ }
51466
+ }
51467
+ function insertFirst(obj, key2, value) {
51468
+ const keys = Object.keys(obj);
51469
+ const entries = keys.map((k) => [k, obj[k]]);
51470
+ for (const k of keys) {
51471
+ delete obj[k];
51472
+ }
51473
+ obj[key2] = value;
51474
+ for (const [k, v] of entries) {
51475
+ obj[k] = v;
51476
+ }
51477
+ }
51478
+ function writeSeriesColorToSpPr(spPr, hex4, isLineFamily, getLocalName2, resolveColor2) {
51479
+ const normalizedHex = hex4.replace(/^#/u, "");
51480
+ if (isLineFamily) {
51481
+ const lnKey = findKey18(spPr, "ln", getLocalName2) ?? "a:ln";
51482
+ const ln = spPr[lnKey] ?? {};
51483
+ const hadLn = Boolean(spPr[lnKey]);
51484
+ const noFillKey2 = findKey18(ln, "noFill", getLocalName2);
51485
+ if (noFillKey2) {
51486
+ delete ln[noFillKey2];
51487
+ }
51488
+ const lnFillKey = findKey18(ln, "solidFill", getLocalName2) ?? "a:solidFill";
51489
+ const authoredFill2 = ln[lnFillKey];
51490
+ const fillNode2 = serializeColorChoice(
51491
+ authoredFill2,
51492
+ authoredFill2 ? resolveColor2(authoredFill2) : void 0,
51493
+ normalizedHex
51494
+ );
51495
+ if (authoredFill2) {
51496
+ ln[lnFillKey] = fillNode2;
51497
+ } else {
51498
+ insertFirst(ln, lnFillKey, fillNode2);
51499
+ }
51500
+ if (!hadLn) {
51501
+ spPr[lnKey] = ln;
51502
+ }
51503
+ return;
51504
+ }
51505
+ const noFillKey = findKey18(spPr, "noFill", getLocalName2);
51506
+ if (noFillKey) {
51507
+ delete spPr[noFillKey];
51508
+ }
51509
+ const fillKey = findKey18(spPr, "solidFill", getLocalName2) ?? "a:solidFill";
51510
+ const authoredFill = spPr[fillKey];
51511
+ const fillNode = serializeColorChoice(
51512
+ authoredFill,
51513
+ authoredFill ? resolveColor2(authoredFill) : void 0,
51514
+ normalizedHex
51515
+ );
51516
+ if (authoredFill) {
51517
+ spPr[fillKey] = fillNode;
51518
+ } else {
51519
+ insertBeforeLn(spPr, fillKey, fillNode, getLocalName2);
51520
+ }
51521
+ }
51290
51522
  var TITLE_ROLE = /* @__PURE__ */ new Set(["title", "ctrtitle"]);
51291
51523
  var CONTENT_ROLE = /* @__PURE__ */ new Set([
51292
51524
  "body",
@@ -58003,8 +58235,8 @@ var SCRIPT_CANDIDATES = {
58003
58235
  };
58004
58236
  function aggregateFontScriptOverrides(perPathMap) {
58005
58237
  const aggregate2 = {};
58006
- for (const overrides10 of perPathMap.values()) {
58007
- for (const [script, typeface] of Object.entries(overrides10)) {
58238
+ for (const overrides11 of perPathMap.values()) {
58239
+ for (const [script, typeface] of Object.entries(overrides11)) {
58008
58240
  if (!(script in aggregate2)) {
58009
58241
  aggregate2[script] = typeface;
58010
58242
  }
@@ -60449,26 +60681,24 @@ var PptxHandlerRuntime23 = class _PptxHandlerRuntime7 extends PptxHandlerRuntime
60449
60681
  this.updateChartCacheValues(valNode, true, seriesData.values.map(String));
60450
60682
  }
60451
60683
  if (seriesData.color) {
60452
- const hex4 = seriesData.color.replace("#", "");
60453
- const spPr = this.xmlLookupService.getChildByLocalName(seriesNode, "spPr");
60454
- if (spPr) {
60455
- const solidFillKey = Object.keys(spPr).find(
60456
- (k) => this.compatibilityService.getXmlLocalName(k) === "solidFill"
60457
- ) ?? "a:solidFill";
60458
- const authoredFill = spPr[solidFillKey];
60459
- spPr[solidFillKey] = serializeColorChoice(
60460
- authoredFill,
60461
- authoredFill ? this.parseColor(authoredFill) : void 0,
60462
- hex4
60463
- );
60464
- } else {
60465
- const spPrKey = Object.keys(seriesNode).find(
60466
- (k) => this.compatibilityService.getXmlLocalName(k) === "spPr"
60467
- ) ?? "c:spPr";
60468
- seriesNode[spPrKey] = {
60469
- "a:solidFill": { "a:srgbClr": { "@_val": hex4 } }
60470
- };
60684
+ const isLineFamily = isLineDrawnChartType(
60685
+ seriesData.seriesChartType ?? chartData.chartType
60686
+ );
60687
+ const spPrKey = Object.keys(seriesNode).find(
60688
+ (k) => this.compatibilityService.getXmlLocalName(k) === "spPr"
60689
+ ) ?? "c:spPr";
60690
+ let spPr = seriesNode[spPrKey];
60691
+ if (!spPr) {
60692
+ spPr = {};
60693
+ seriesNode[spPrKey] = spPr;
60471
60694
  }
60695
+ writeSeriesColorToSpPr(
60696
+ spPr,
60697
+ seriesData.color,
60698
+ isLineFamily,
60699
+ (key2) => this.compatibilityService.getXmlLocalName(key2),
60700
+ (node) => this.parseColor(node)
60701
+ );
60472
60702
  }
60473
60703
  if (seriesData.trendlines !== void 0) {
60474
60704
  applySeriesTrendlinesToXml(
@@ -60520,7 +60750,8 @@ var PptxHandlerRuntime23 = class _PptxHandlerRuntime7 extends PptxHandlerRuntime
60520
60750
  seriesData,
60521
60751
  chartData.categories,
60522
60752
  templateSeries,
60523
- chartData.dateCategories
60753
+ chartData.dateCategories,
60754
+ isLineDrawnChartType(seriesData.seriesChartType ?? chartData.chartType)
60524
60755
  );
60525
60756
  newSeriesXmlNodes.push(newNode);
60526
60757
  }
@@ -60956,8 +61187,12 @@ var PptxHandlerRuntime23 = class _PptxHandlerRuntime7 extends PptxHandlerRuntime
60956
61187
  * If a `templateSeries` is provided, it is deep-cloned and its data is
60957
61188
  * replaced with the new series data. Otherwise, a minimal structure is
60958
61189
  * built from scratch.
61190
+ *
61191
+ * @param isLineFamily - Whether the target chart family reads/writes its
61192
+ * series colour from `a:ln/a:solidFill` (line/line3D/scatter/radar/stock)
61193
+ * rather than a direct `a:solidFill`. See `isLineDrawnChartType`.
60959
61194
  */
60960
- buildNewSeriesXml(seriesIndex, seriesData, categories, templateSeries, dateCategories) {
61195
+ buildNewSeriesXml(seriesIndex, seriesData, categories, templateSeries, dateCategories, isLineFamily = false) {
60961
61196
  if (templateSeries) {
60962
61197
  const clone3 = JSON.parse(JSON.stringify(templateSeries));
60963
61198
  const idxNode = this.xmlLookupService.getChildByLocalName(clone3, "idx");
@@ -60984,22 +61219,13 @@ var PptxHandlerRuntime23 = class _PptxHandlerRuntime7 extends PptxHandlerRuntime
60984
61219
  if (seriesData.color) {
60985
61220
  const spPr = this.xmlLookupService.getChildByLocalName(clone3, "spPr");
60986
61221
  if (spPr) {
60987
- const solidFillKey = Object.keys(spPr).find(
60988
- (k) => this.compatibilityService.getXmlLocalName(k) === "solidFill"
61222
+ writeSeriesColorToSpPr(
61223
+ spPr,
61224
+ seriesData.color,
61225
+ isLineFamily,
61226
+ (key2) => this.compatibilityService.getXmlLocalName(key2),
61227
+ (node) => this.parseColor(node)
60989
61228
  );
60990
- if (solidFillKey) {
60991
- spPr[solidFillKey] = {
60992
- "a:srgbClr": {
60993
- "@_val": seriesData.color.replace("#", "")
60994
- }
60995
- };
60996
- } else {
60997
- spPr["a:solidFill"] = {
60998
- "a:srgbClr": {
60999
- "@_val": seriesData.color.replace("#", "")
61000
- }
61001
- };
61002
- }
61003
61229
  }
61004
61230
  }
61005
61231
  return clone3;
@@ -61016,11 +61242,7 @@ var PptxHandlerRuntime23 = class _PptxHandlerRuntime7 extends PptxHandlerRuntime
61016
61242
  }
61017
61243
  }
61018
61244
  },
61019
- "c:spPr": {
61020
- "a:solidFill": {
61021
- "a:srgbClr": { "@_val": colorHex }
61022
- }
61023
- },
61245
+ "c:spPr": isLineFamily ? { "a:ln": { "a:solidFill": { "a:srgbClr": { "@_val": colorHex } } } } : { "a:solidFill": { "a:srgbClr": { "@_val": colorHex } } },
61024
61246
  "c:cat": dateCategories ? {
61025
61247
  "c:numRef": {
61026
61248
  "c:numCache": {
@@ -61050,7 +61272,7 @@ var PptxHandlerRuntime23 = class _PptxHandlerRuntime7 extends PptxHandlerRuntime
61050
61272
  return ser;
61051
61273
  }
61052
61274
  };
61053
- function findKey18(node, name, localName25) {
61275
+ function findKey19(node, name, localName25) {
61054
61276
  return Object.keys(node).find((key2) => localName25(key2) === name);
61055
61277
  }
61056
61278
  function prefixFor2(node) {
@@ -61069,7 +61291,7 @@ function setChildren(node, name, values, localName25) {
61069
61291
  if (values === void 0) {
61070
61292
  return false;
61071
61293
  }
61072
- const existing = findKey18(node, name, localName25);
61294
+ const existing = findKey19(node, name, localName25);
61073
61295
  if (values.length === 0) {
61074
61296
  if (existing) {
61075
61297
  delete node[existing];
@@ -61096,7 +61318,7 @@ function applySmartArtDefinitionMetadata(node, metadata, localName25) {
61096
61318
  changed = setChildren(node, "title", textNodes(metadata.titles), localName25) || changed;
61097
61319
  changed = setChildren(node, "desc", textNodes(metadata.descriptions), localName25) || changed;
61098
61320
  if (metadata.categories !== void 0) {
61099
- const key2 = findKey18(node, "catLst", localName25);
61321
+ const key2 = findKey19(node, "catLst", localName25);
61100
61322
  if (metadata.categories.length === 0) {
61101
61323
  if (key2) {
61102
61324
  delete node[key2];
@@ -61120,7 +61342,7 @@ function applySmartArtDefinitionMetadata(node, metadata, localName25) {
61120
61342
  return changed;
61121
61343
  }
61122
61344
  function ensureLabels(node, localName25) {
61123
- const key2 = findKey18(node, "styleLbl", localName25) ?? `${prefixFor2(node)}styleLbl`;
61345
+ const key2 = findKey19(node, "styleLbl", localName25) ?? `${prefixFor2(node)}styleLbl`;
61124
61346
  return { key: key2, labels: objects2(node[key2]) };
61125
61347
  }
61126
61348
  function applySmartArtQuickStyleLabels(node, labels, localName25) {
@@ -61143,7 +61365,7 @@ var COLOR_LISTS = [
61143
61365
  ["textEffect", "txEffectClrLst"]
61144
61366
  ];
61145
61367
  function applyColorList(label, name, metadata, localName25) {
61146
- const key2 = findKey18(label, name, localName25) ?? `${prefixFor2(label)}${name}`;
61368
+ const key2 = findKey19(label, name, localName25) ?? `${prefixFor2(label)}${name}`;
61147
61369
  const list = objects2(label[key2])[0] ?? {};
61148
61370
  if (metadata.method !== void 0) {
61149
61371
  list["@_meth"] = metadata.method;
@@ -61181,7 +61403,7 @@ function toArray3(value) {
61181
61403
  const obj = asObject(value);
61182
61404
  return obj ? [obj] : [];
61183
61405
  }
61184
- function findKey19(obj, name, getLocalName2) {
61406
+ function findKey20(obj, name, getLocalName2) {
61185
61407
  return Object.keys(obj).find((k) => getLocalName2(k) === name);
61186
61408
  }
61187
61409
  function hex3(value) {
@@ -61223,7 +61445,7 @@ function applySmartArtColorTransform(colorsDef, transform, getLocalName2, resolv
61223
61445
  let mutated = false;
61224
61446
  mutated = applySmartArtDefinitionMetadata(colorsDef, transform, getLocalName2) || mutated;
61225
61447
  mutated = applySmartArtColorStyleLabels(colorsDef, transform.labels, getLocalName2) || mutated;
61226
- const styleLblKey = findKey19(colorsDef, "styleLbl", getLocalName2);
61448
+ const styleLblKey = findKey20(colorsDef, "styleLbl", getLocalName2);
61227
61449
  if (!styleLblKey) {
61228
61450
  return mutated;
61229
61451
  }
@@ -61234,7 +61456,7 @@ function applySmartArtColorTransform(colorsDef, transform, getLocalName2, resolv
61234
61456
  let fillIndex = 0;
61235
61457
  let lineIndex = 0;
61236
61458
  for (const label of labels) {
61237
- const fillKey = findKey19(label, "fillClrLst", getLocalName2);
61459
+ const fillKey = findKey20(label, "fillClrLst", getLocalName2);
61238
61460
  if (fillKey) {
61239
61461
  const value = transform.fillColors[fillIndex++];
61240
61462
  const list = asObject(label[fillKey]);
@@ -61243,7 +61465,7 @@ function applySmartArtColorTransform(colorsDef, transform, getLocalName2, resolv
61243
61465
  mutated = true;
61244
61466
  }
61245
61467
  }
61246
- const lineKey = findKey19(label, "linClrLst", getLocalName2);
61468
+ const lineKey = findKey20(label, "linClrLst", getLocalName2);
61247
61469
  if (lineKey) {
61248
61470
  const value = transform.lineColors[lineIndex++];
61249
61471
  const list = asObject(label[lineKey]);
@@ -61259,11 +61481,11 @@ function localName23(key2) {
61259
61481
  const idx = key2.indexOf(":");
61260
61482
  return idx >= 0 ? key2.slice(idx + 1) : key2;
61261
61483
  }
61262
- function findKey20(obj, local) {
61484
+ function findKey21(obj, local) {
61263
61485
  return Object.keys(obj).find((k) => localName23(k) === local);
61264
61486
  }
61265
61487
  function ensureChild(obj, local, prefixedFallback) {
61266
- const key2 = findKey20(obj, local) ?? prefixedFallback;
61488
+ const key2 = findKey21(obj, local) ?? prefixedFallback;
61267
61489
  const existing = obj[key2];
61268
61490
  if (existing && typeof existing === "object" && !Array.isArray(existing)) {
61269
61491
  return existing;
@@ -61279,7 +61501,7 @@ function solidFill2(color2) {
61279
61501
  return { "a:srgbClr": { "@_val": hexValue(color2) } };
61280
61502
  }
61281
61503
  function setSolidFill(parent, color2) {
61282
- const key2 = findKey20(parent, "solidFill") ?? "a:solidFill";
61504
+ const key2 = findKey21(parent, "solidFill") ?? "a:solidFill";
61283
61505
  parent[key2] = solidFill2(color2);
61284
61506
  }
61285
61507
  function applyShapeStyle(pt2, style) {
@@ -61296,7 +61518,7 @@ function applyShapeStyle(pt2, style) {
61296
61518
  }
61297
61519
  }
61298
61520
  function ensureFirstRunRPr(pt2) {
61299
- const tKey = findKey20(pt2, "t");
61521
+ const tKey = findKey21(pt2, "t");
61300
61522
  if (!tKey) {
61301
61523
  return void 0;
61302
61524
  }
@@ -61304,7 +61526,7 @@ function ensureFirstRunRPr(pt2) {
61304
61526
  if (!body || typeof body !== "object" || Array.isArray(body)) {
61305
61527
  return void 0;
61306
61528
  }
61307
- const pKey = findKey20(body, "p");
61529
+ const pKey = findKey21(body, "p");
61308
61530
  if (!pKey) {
61309
61531
  return void 0;
61310
61532
  }
@@ -61313,7 +61535,7 @@ function ensureFirstRunRPr(pt2) {
61313
61535
  if (!firstP || typeof firstP !== "object") {
61314
61536
  return void 0;
61315
61537
  }
61316
- const rKey = findKey20(firstP, "r");
61538
+ const rKey = findKey21(firstP, "r");
61317
61539
  if (!rKey) {
61318
61540
  return void 0;
61319
61541
  }
@@ -62237,27 +62459,27 @@ function applySmartArtChrome(dataModel, chrome, getLocalName2) {
62237
62459
  if (!chrome || !chrome.backgroundColor && !chrome.outlineColor && (chrome.outlineWidth === null || chrome.outlineWidth === void 0)) {
62238
62460
  return;
62239
62461
  }
62240
- const findKey21 = (obj, name) => Object.keys(obj).find((k) => getLocalName2(k) === name);
62462
+ const findKey22 = (obj, name) => Object.keys(obj).find((k) => getLocalName2(k) === name);
62241
62463
  if (chrome.backgroundColor) {
62242
62464
  const hex4 = chrome.backgroundColor.replace("#", "");
62243
- const bgKey = findKey21(dataModel, "bg") ?? "dgm:bg";
62465
+ const bgKey = findKey22(dataModel, "bg") ?? "dgm:bg";
62244
62466
  const bg = asObject2(dataModel[bgKey]);
62245
- const fillKey = findKey21(bg, "solidFill") ?? "a:solidFill";
62467
+ const fillKey = findKey22(bg, "solidFill") ?? "a:solidFill";
62246
62468
  bg[fillKey] = { "a:srgbClr": { "@_val": hex4 } };
62247
62469
  dataModel[bgKey] = bg;
62248
62470
  }
62249
62471
  const hasOutlineWidth = chrome.outlineWidth !== null && chrome.outlineWidth !== void 0;
62250
62472
  if (chrome.outlineColor || hasOutlineWidth) {
62251
- const wholeKey = findKey21(dataModel, "whole") ?? "dgm:whole";
62473
+ const wholeKey = findKey22(dataModel, "whole") ?? "dgm:whole";
62252
62474
  const whole = asObject2(dataModel[wholeKey]);
62253
- const lnKey = findKey21(whole, "ln") ?? "a:ln";
62475
+ const lnKey = findKey22(whole, "ln") ?? "a:ln";
62254
62476
  const ln = asObject2(whole[lnKey]);
62255
62477
  if (hasOutlineWidth) {
62256
62478
  ln["@_w"] = String(Math.round(chrome.outlineWidth * 12700));
62257
62479
  }
62258
62480
  if (chrome.outlineColor) {
62259
62481
  const hex4 = chrome.outlineColor.replace("#", "");
62260
- const fillKey = findKey21(ln, "solidFill") ?? "a:solidFill";
62482
+ const fillKey = findKey22(ln, "solidFill") ?? "a:solidFill";
62261
62483
  ln[fillKey] = { "a:srgbClr": { "@_val": hex4 } };
62262
62484
  }
62263
62485
  whole[lnKey] = ln;
@@ -63235,12 +63457,12 @@ var PptxHandlerRuntime25 = class extends PptxHandlerRuntime24 {
63235
63457
  if (ctXml) {
63236
63458
  const ctData = this.parser.parse(ctXml);
63237
63459
  const typesRoot = ctData?.Types ?? {};
63238
- const overrides10 = this.ensureArray(typesRoot.Override);
63239
- const filteredOverrides = overrides10.filter((o) => {
63460
+ const overrides11 = this.ensureArray(typesRoot.Override);
63461
+ const filteredOverrides = overrides11.filter((o) => {
63240
63462
  const partName = String(o?.["@_PartName"] || "");
63241
63463
  return !partName.startsWith("/_xmlsignatures/");
63242
63464
  });
63243
- if (filteredOverrides.length !== overrides10.length) {
63465
+ if (filteredOverrides.length !== overrides11.length) {
63244
63466
  typesRoot.Override = filteredOverrides;
63245
63467
  ctData.Types = typesRoot;
63246
63468
  this.zip.file("[Content_Types].xml", this.builder.build(ctData));
@@ -63964,155 +64186,87 @@ var PptxHandlerRuntime28 = class _PptxHandlerRuntime9 extends PptxHandlerRuntime
63964
64186
  }
63965
64187
  }
63966
64188
  };
63967
- var PptxHandlerRuntime29 = class extends PptxHandlerRuntime28 {
63968
- /**
63969
- * Serialize visual effects (shadow, glow, reflection, blur, soft edge),
63970
- * effectDag, 3D scene, and 3D shape properties to the given spPr XML object.
63971
- */
63972
- applyEffectsAndThreeD(spPr, shapeStyle) {
63973
- const presetShadowXml = shapeStyle.presetShadowName ? this.buildPresetShadowXml(shapeStyle) : void 0;
63974
- const outerShadowXml = presetShadowXml ? void 0 : this.buildOuterShadowXml(shapeStyle);
63975
- const innerShadowXml = this.buildInnerShadowXml(shapeStyle);
63976
- const glowXml = this.buildGlowXml(shapeStyle);
63977
- const softEdgeXml = this.buildSoftEdgeXml(shapeStyle);
63978
- const reflectionXml = this.buildReflectionXml(shapeStyle);
63979
- const blurXml = this.buildBlurXml(shapeStyle);
63980
- const hasAnyEffect = outerShadowXml || presetShadowXml || innerShadowXml || glowXml || softEdgeXml || reflectionXml || blurXml;
63981
- if (hasAnyEffect || shapeStyle.effectListXml) {
63982
- const effectList = createEffectList(shapeStyle, spPr);
63983
- if (presetShadowXml) {
63984
- setEffectChild(effectList, "prstShdw", presetShadowXml);
64189
+ function writeShapeEffects(spPr, shapeStyle, ctx) {
64190
+ if (effectIsPurelyStyleMatrix(shapeStyle)) {
64191
+ return;
64192
+ }
64193
+ writeEffectList(spPr, shapeStyle, ctx);
64194
+ writeEffectDag(spPr, shapeStyle);
64195
+ writeScene3d(spPr, shapeStyle);
64196
+ writeShape3d(spPr, shapeStyle);
64197
+ }
64198
+ function writeEffectList(spPr, shapeStyle, ctx) {
64199
+ const {
64200
+ outerShadowXml,
64201
+ presetShadowXml,
64202
+ innerShadowXml,
64203
+ glowXml,
64204
+ softEdgeXml,
64205
+ reflectionXml,
64206
+ blurXml
64207
+ } = ctx;
64208
+ const hasAnyEffect = outerShadowXml || presetShadowXml || innerShadowXml || glowXml || softEdgeXml || reflectionXml || blurXml;
64209
+ if (hasAnyEffect || shapeStyle.effectListXml) {
64210
+ const effectList = createEffectList(shapeStyle, spPr);
64211
+ if (presetShadowXml) {
64212
+ setEffectChild(effectList, "prstShdw", presetShadowXml);
64213
+ setEffectChild(effectList, "outerShdw", void 0);
64214
+ } else if (outerShadowXml) {
64215
+ setEffectChild(effectList, "outerShdw", outerShadowXml);
64216
+ setEffectChild(effectList, "prstShdw", void 0);
64217
+ }
64218
+ if (innerShadowXml) {
64219
+ setEffectChild(effectList, "innerShdw", innerShadowXml);
64220
+ }
64221
+ if (glowXml) {
64222
+ setEffectChild(effectList, "glow", glowXml);
64223
+ }
64224
+ if (softEdgeXml) {
64225
+ setEffectChild(effectList, "softEdge", softEdgeXml);
64226
+ }
64227
+ if (reflectionXml) {
64228
+ setEffectChild(effectList, "reflection", reflectionXml);
64229
+ }
64230
+ if (blurXml) {
64231
+ setEffectChild(effectList, "blur", blurXml);
64232
+ }
64233
+ setEffectChild(spPr, "effectLst", reorderObjectKeys(effectList, EFFECT_LST_ORDER));
64234
+ } else {
64235
+ const effectList = effectChild(spPr, "effectLst");
64236
+ if (effectList) {
64237
+ if (shapeStyle.shadowColor !== void 0 && !outerShadowXml && !presetShadowXml) {
63985
64238
  setEffectChild(effectList, "outerShdw", void 0);
63986
- } else if (outerShadowXml) {
63987
- setEffectChild(effectList, "outerShdw", outerShadowXml);
63988
64239
  setEffectChild(effectList, "prstShdw", void 0);
63989
64240
  }
63990
- if (innerShadowXml) {
63991
- setEffectChild(effectList, "innerShdw", innerShadowXml);
63992
- }
63993
- if (glowXml) {
63994
- setEffectChild(effectList, "glow", glowXml);
63995
- }
63996
- if (softEdgeXml) {
63997
- setEffectChild(effectList, "softEdge", softEdgeXml);
64241
+ if (shapeStyle.innerShadowColor !== void 0 && !innerShadowXml) {
64242
+ setEffectChild(effectList, "innerShdw", void 0);
63998
64243
  }
63999
- if (reflectionXml) {
64000
- setEffectChild(effectList, "reflection", reflectionXml);
64244
+ if (shapeStyle.glowColor !== void 0 && !glowXml) {
64245
+ setEffectChild(effectList, "glow", void 0);
64001
64246
  }
64002
- if (blurXml) {
64003
- setEffectChild(effectList, "blur", blurXml);
64247
+ if (shapeStyle.softEdgeRadius !== void 0 && !softEdgeXml) {
64248
+ setEffectChild(effectList, "softEdge", void 0);
64004
64249
  }
64005
- setEffectChild(spPr, "effectLst", reorderObjectKeys(effectList, EFFECT_LST_ORDER));
64006
- } else {
64007
- const effectList = effectChild(spPr, "effectLst");
64008
- if (effectList) {
64009
- if (shapeStyle.shadowColor !== void 0 && !outerShadowXml && !presetShadowXml) {
64010
- setEffectChild(effectList, "outerShdw", void 0);
64011
- setEffectChild(effectList, "prstShdw", void 0);
64012
- }
64013
- if (shapeStyle.innerShadowColor !== void 0 && !innerShadowXml) {
64014
- setEffectChild(effectList, "innerShdw", void 0);
64015
- }
64016
- if (shapeStyle.glowColor !== void 0 && !glowXml) {
64017
- setEffectChild(effectList, "glow", void 0);
64018
- }
64019
- if (shapeStyle.softEdgeRadius !== void 0 && !softEdgeXml) {
64020
- setEffectChild(effectList, "softEdge", void 0);
64021
- }
64022
- if (shapeStyle.reflectionBlurRadius !== void 0 && !reflectionXml) {
64023
- setEffectChild(effectList, "reflection", void 0);
64024
- }
64025
- if (shapeStyle.blurRadius !== void 0 && !blurXml) {
64026
- setEffectChild(effectList, "blur", void 0);
64027
- }
64028
- if (Object.keys(effectList).length === 0) {
64029
- setEffectChild(spPr, "effectLst", void 0);
64030
- } else {
64031
- setEffectChild(spPr, "effectLst", reorderObjectKeys(effectList, EFFECT_LST_ORDER));
64032
- }
64250
+ if (shapeStyle.reflectionBlurRadius !== void 0 && !reflectionXml) {
64251
+ setEffectChild(effectList, "reflection", void 0);
64033
64252
  }
64034
- }
64035
- const effectDagXml = shapeStyle.effectDagTree ? serializeEffectDagContainer(shapeStyle.effectDagTree) : shapeStyle.effectDagXml;
64036
- if (effectDagXml) {
64037
- setEffectChild(spPr, "effectDag", effectDagXml);
64038
- }
64039
- if (shapeStyle.scene3d) {
64040
- const s3d = shapeStyle.scene3d;
64041
- const hasData = s3d.cameraPreset || s3d.lightRigType;
64042
- if (hasData) {
64043
- const source = spPr["a:scene3d"] ?? {};
64044
- const scene3dXml = { ...source };
64045
- scene3dXml["a:camera"] = buildScene3dCamera(s3d, source);
64046
- const lightRig = buildScene3dLightRig(s3d, source);
64047
- if (lightRig) {
64048
- scene3dXml["a:lightRig"] = lightRig;
64049
- }
64050
- const backdrop = buildScene3dBackdrop(s3d);
64051
- if (backdrop) {
64052
- scene3dXml["a:backdrop"] = backdrop;
64053
- } else {
64054
- delete scene3dXml["a:backdrop"];
64055
- }
64056
- spPr["a:scene3d"] = scene3dXml;
64057
- } else {
64058
- delete spPr["a:scene3d"];
64253
+ if (shapeStyle.blurRadius !== void 0 && !blurXml) {
64254
+ setEffectChild(effectList, "blur", void 0);
64059
64255
  }
64060
- } else if (shapeStyle.scene3d === void 0) {
64061
- delete spPr["a:scene3d"];
64062
- }
64063
- if (shapeStyle.shape3d) {
64064
- const sh3d = shapeStyle.shape3d;
64065
- const hasData = sh3d.extrusionHeight !== void 0 || sh3d.contourWidth !== void 0 || sh3d.presetMaterial || sh3d.bevelTopType || sh3d.bevelBottomType || sh3d.extrusionColor || sh3d.contourColor;
64066
- if (hasData) {
64067
- const sp3dXml = {};
64068
- if (sh3d.extrusionHeight !== void 0) {
64069
- sp3dXml["@_extrusionH"] = String(sh3d.extrusionHeight);
64070
- }
64071
- if (sh3d.contourWidth !== void 0) {
64072
- sp3dXml["@_contourW"] = String(sh3d.contourWidth);
64073
- }
64074
- if (sh3d.presetMaterial) {
64075
- sp3dXml["@_prstMaterial"] = sh3d.presetMaterial;
64076
- }
64077
- if (sh3d.bevelTopType) {
64078
- const bevelT = { "@_prst": sh3d.bevelTopType };
64079
- if (sh3d.bevelTopWidth !== void 0) {
64080
- bevelT["@_w"] = String(sh3d.bevelTopWidth);
64081
- }
64082
- if (sh3d.bevelTopHeight !== void 0) {
64083
- bevelT["@_h"] = String(sh3d.bevelTopHeight);
64084
- }
64085
- sp3dXml["a:bevelT"] = bevelT;
64086
- }
64087
- if (sh3d.bevelBottomType) {
64088
- const bevelB = { "@_prst": sh3d.bevelBottomType };
64089
- if (sh3d.bevelBottomWidth !== void 0) {
64090
- bevelB["@_w"] = String(sh3d.bevelBottomWidth);
64091
- }
64092
- if (sh3d.bevelBottomHeight !== void 0) {
64093
- bevelB["@_h"] = String(sh3d.bevelBottomHeight);
64094
- }
64095
- sp3dXml["a:bevelB"] = bevelB;
64096
- }
64097
- if (sh3d.extrusionColor) {
64098
- sp3dXml["a:extrusionClr"] = {
64099
- "a:srgbClr": { "@_val": sh3d.extrusionColor.replace("#", "") }
64100
- };
64101
- }
64102
- if (sh3d.contourColor) {
64103
- sp3dXml["a:contourClr"] = {
64104
- "a:srgbClr": { "@_val": sh3d.contourColor.replace("#", "") }
64105
- };
64106
- }
64107
- spPr["a:sp3d"] = sp3dXml;
64256
+ if (Object.keys(effectList).length === 0) {
64257
+ setEffectChild(spPr, "effectLst", void 0);
64108
64258
  } else {
64109
- delete spPr["a:sp3d"];
64259
+ setEffectChild(spPr, "effectLst", reorderObjectKeys(effectList, EFFECT_LST_ORDER));
64110
64260
  }
64111
- } else if (shapeStyle.shape3d === void 0) {
64112
- delete spPr["a:sp3d"];
64113
64261
  }
64114
64262
  }
64115
- };
64263
+ }
64264
+ function writeEffectDag(spPr, shapeStyle) {
64265
+ const effectDagXml = shapeStyle.effectDagTree ? serializeEffectDagContainer(shapeStyle.effectDagTree) : shapeStyle.effectDagXml;
64266
+ if (effectDagXml) {
64267
+ setEffectChild(spPr, "effectDag", effectDagXml);
64268
+ }
64269
+ }
64116
64270
  function buildSphereRot(lat, lon, rev) {
64117
64271
  if (lat === void 0 && lon === void 0 && rev === void 0) {
64118
64272
  return void 0;
@@ -64184,6 +64338,109 @@ function buildScene3dBackdrop(s3d) {
64184
64338
  }
64185
64339
  };
64186
64340
  }
64341
+ function writeScene3d(spPr, shapeStyle) {
64342
+ if (shapeStyle.scene3d) {
64343
+ const s3d = shapeStyle.scene3d;
64344
+ const hasData = s3d.cameraPreset || s3d.lightRigType;
64345
+ if (hasData) {
64346
+ const source = spPr["a:scene3d"] ?? {};
64347
+ const scene3dXml = { ...source };
64348
+ scene3dXml["a:camera"] = buildScene3dCamera(s3d, source);
64349
+ const lightRig = buildScene3dLightRig(s3d, source);
64350
+ if (lightRig) {
64351
+ scene3dXml["a:lightRig"] = lightRig;
64352
+ }
64353
+ const backdrop = buildScene3dBackdrop(s3d);
64354
+ if (backdrop) {
64355
+ scene3dXml["a:backdrop"] = backdrop;
64356
+ } else {
64357
+ delete scene3dXml["a:backdrop"];
64358
+ }
64359
+ spPr["a:scene3d"] = scene3dXml;
64360
+ } else {
64361
+ delete spPr["a:scene3d"];
64362
+ }
64363
+ } else if (shapeStyle.scene3d === void 0) {
64364
+ delete spPr["a:scene3d"];
64365
+ }
64366
+ }
64367
+ function writeShape3d(spPr, shapeStyle) {
64368
+ if (shapeStyle.shape3d) {
64369
+ const sh3d = shapeStyle.shape3d;
64370
+ const hasData = sh3d.extrusionHeight !== void 0 || sh3d.contourWidth !== void 0 || sh3d.presetMaterial || sh3d.bevelTopType || sh3d.bevelBottomType || sh3d.extrusionColor || sh3d.contourColor;
64371
+ if (hasData) {
64372
+ const sp3dXml = {};
64373
+ if (sh3d.extrusionHeight !== void 0) {
64374
+ sp3dXml["@_extrusionH"] = String(sh3d.extrusionHeight);
64375
+ }
64376
+ if (sh3d.contourWidth !== void 0) {
64377
+ sp3dXml["@_contourW"] = String(sh3d.contourWidth);
64378
+ }
64379
+ if (sh3d.presetMaterial) {
64380
+ sp3dXml["@_prstMaterial"] = sh3d.presetMaterial;
64381
+ }
64382
+ if (sh3d.bevelTopType) {
64383
+ const bevelT = { "@_prst": sh3d.bevelTopType };
64384
+ if (sh3d.bevelTopWidth !== void 0) {
64385
+ bevelT["@_w"] = String(sh3d.bevelTopWidth);
64386
+ }
64387
+ if (sh3d.bevelTopHeight !== void 0) {
64388
+ bevelT["@_h"] = String(sh3d.bevelTopHeight);
64389
+ }
64390
+ sp3dXml["a:bevelT"] = bevelT;
64391
+ }
64392
+ if (sh3d.bevelBottomType) {
64393
+ const bevelB = { "@_prst": sh3d.bevelBottomType };
64394
+ if (sh3d.bevelBottomWidth !== void 0) {
64395
+ bevelB["@_w"] = String(sh3d.bevelBottomWidth);
64396
+ }
64397
+ if (sh3d.bevelBottomHeight !== void 0) {
64398
+ bevelB["@_h"] = String(sh3d.bevelBottomHeight);
64399
+ }
64400
+ sp3dXml["a:bevelB"] = bevelB;
64401
+ }
64402
+ if (sh3d.extrusionColor) {
64403
+ sp3dXml["a:extrusionClr"] = {
64404
+ "a:srgbClr": { "@_val": sh3d.extrusionColor.replace("#", "") }
64405
+ };
64406
+ }
64407
+ if (sh3d.contourColor) {
64408
+ sp3dXml["a:contourClr"] = {
64409
+ "a:srgbClr": { "@_val": sh3d.contourColor.replace("#", "") }
64410
+ };
64411
+ }
64412
+ spPr["a:sp3d"] = sp3dXml;
64413
+ } else {
64414
+ delete spPr["a:sp3d"];
64415
+ }
64416
+ } else if (shapeStyle.shape3d === void 0) {
64417
+ delete spPr["a:sp3d"];
64418
+ }
64419
+ }
64420
+ var PptxHandlerRuntime29 = class extends PptxHandlerRuntime28 {
64421
+ /**
64422
+ * Serialize visual effects (shadow, glow, reflection, blur, soft edge),
64423
+ * effectDag, 3D scene, and 3D shape properties to the given spPr XML object.
64424
+ *
64425
+ * The whole body lives in {@link writeShapeEffects} as a free function so
64426
+ * the colocated unit test can import and drive the REAL logic (it used to
64427
+ * keep a private copy - "its mixin chain crashes on load" - which meant it
64428
+ * could not fail when production drifted). This method only supplies the
64429
+ * runtime-bound effect builders.
64430
+ */
64431
+ applyEffectsAndThreeD(spPr, shapeStyle) {
64432
+ const presetShadowXml = shapeStyle.presetShadowName ? this.buildPresetShadowXml(shapeStyle) : void 0;
64433
+ writeShapeEffects(spPr, shapeStyle, {
64434
+ outerShadowXml: presetShadowXml ? void 0 : this.buildOuterShadowXml(shapeStyle),
64435
+ presetShadowXml,
64436
+ innerShadowXml: this.buildInnerShadowXml(shapeStyle),
64437
+ glowXml: this.buildGlowXml(shapeStyle),
64438
+ softEdgeXml: this.buildSoftEdgeXml(shapeStyle),
64439
+ reflectionXml: this.buildReflectionXml(shapeStyle),
64440
+ blurXml: this.buildBlurXml(shapeStyle)
64441
+ });
64442
+ }
64443
+ };
64187
64444
  var PptxHandlerRuntime30 = class _PptxHandlerRuntime10 extends PptxHandlerRuntime29 {
64188
64445
  /**
64189
64446
  * Build and write the text body (`p:txBody`) for shapes, text boxes,
@@ -64867,15 +65124,15 @@ var PptxHandlerRuntime32 = class _PptxHandlerRuntime11 extends PptxHandlerRuntim
64867
65124
  }
64868
65125
  const ctData = this.parser.parse(ctXml);
64869
65126
  const typesRoot = ctData["Types"] || {};
64870
- const overrides10 = Array.isArray(typesRoot["Override"]) ? typesRoot["Override"] : typesRoot["Override"] ? [typesRoot["Override"]] : [];
64871
- const have = new Set(overrides10.map((o) => String(o?.["@_PartName"] || "")));
65127
+ const overrides11 = Array.isArray(typesRoot["Override"]) ? typesRoot["Override"] : typesRoot["Override"] ? [typesRoot["Override"]] : [];
65128
+ const have = new Set(overrides11.map((o) => String(o?.["@_PartName"] || "")));
64872
65129
  for (const entry2 of entries) {
64873
65130
  if (!have.has(entry2.partName)) {
64874
- overrides10.push({ "@_PartName": entry2.partName, "@_ContentType": entry2.contentType });
65131
+ overrides11.push({ "@_PartName": entry2.partName, "@_ContentType": entry2.contentType });
64875
65132
  have.add(entry2.partName);
64876
65133
  }
64877
65134
  }
64878
- typesRoot["Override"] = overrides10;
65135
+ typesRoot["Override"] = overrides11;
64879
65136
  ctData["Types"] = typesRoot;
64880
65137
  this.zip.file("[Content_Types].xml", this.builder.build(ctData));
64881
65138
  }
@@ -64943,15 +65200,15 @@ var PptxHandlerRuntime33 = class extends PptxHandlerRuntime32 {
64943
65200
  }
64944
65201
  const data = this.parser.parse(xml);
64945
65202
  const root = data["Types"] ?? {};
64946
- const overrides10 = Array.isArray(root["Override"]) ? root["Override"] : root["Override"] ? [root["Override"]] : [];
64947
- const existing = new Set(overrides10.map((entry2) => String(entry2["@_PartName"] ?? "")));
65203
+ const overrides11 = Array.isArray(root["Override"]) ? root["Override"] : root["Override"] ? [root["Override"]] : [];
65204
+ const existing = new Set(overrides11.map((entry2) => String(entry2["@_PartName"] ?? "")));
64948
65205
  for (const [path, contentType] of pending) {
64949
65206
  const partName = `/${path}`;
64950
65207
  if (!existing.has(partName)) {
64951
- overrides10.push({ "@_PartName": partName, "@_ContentType": contentType });
65208
+ overrides11.push({ "@_PartName": partName, "@_ContentType": contentType });
64952
65209
  }
64953
65210
  }
64954
- root["Override"] = overrides10;
65211
+ root["Override"] = overrides11;
64955
65212
  data["Types"] = root;
64956
65213
  this.zip.file("[Content_Types].xml", this.builder.build(data));
64957
65214
  }
@@ -65912,8 +66169,8 @@ var PptxHandlerRuntime40 = class _PptxHandlerRuntime16 extends PptxHandlerRuntim
65912
66169
  }
65913
66170
  const ctData = this.parser.parse(ctXml);
65914
66171
  const typesRoot = ctData["Types"] || {};
65915
- const overrides10 = Array.isArray(typesRoot["Override"]) ? typesRoot["Override"] : typesRoot["Override"] ? [typesRoot["Override"]] : [];
65916
- const have = new Set(overrides10.map((o) => String(o?.["@_PartName"] || "")));
66172
+ const overrides11 = Array.isArray(typesRoot["Override"]) ? typesRoot["Override"] : typesRoot["Override"] ? [typesRoot["Override"]] : [];
66173
+ const have = new Set(overrides11.map((o) => String(o?.["@_PartName"] || "")));
65917
66174
  for (const [p, contentType] of [
65918
66175
  ...(paths ?? []).map((path) => [path, CHART_CONTENT_TYPE]),
65919
66176
  ...(extendedPaths ?? []).map(
@@ -65925,11 +66182,11 @@ var PptxHandlerRuntime40 = class _PptxHandlerRuntime16 extends PptxHandlerRuntim
65925
66182
  ]) {
65926
66183
  const partName = `/${p}`;
65927
66184
  if (!have.has(partName)) {
65928
- overrides10.push({ "@_PartName": partName, "@_ContentType": contentType });
66185
+ overrides11.push({ "@_PartName": partName, "@_ContentType": contentType });
65929
66186
  have.add(partName);
65930
66187
  }
65931
66188
  }
65932
- typesRoot["Override"] = overrides10;
66189
+ typesRoot["Override"] = overrides11;
65933
66190
  ctData["Types"] = typesRoot;
65934
66191
  this.zip.file("[Content_Types].xml", this.builder.build(ctData));
65935
66192
  }
@@ -67857,7 +68114,15 @@ function orderContainer(container, plan, getLocalName2) {
67857
68114
  return orderShapeTreeChildren(working, (node) => positions.get(node), getLocalName2);
67858
68115
  }
67859
68116
  function orderedTemplatePartXml(options) {
67860
- const { runtime, partPath, xmlObj, rootTag: rootTag2, sourceXml, getLocalName: getLocalName2 } = options;
68117
+ const {
68118
+ runtime,
68119
+ partPath,
68120
+ xmlObj,
68121
+ rootTag: rootTag2,
68122
+ sourceXml,
68123
+ getLocalName: getLocalName2,
68124
+ alternateContentBlockByRawXml
68125
+ } = options;
67861
68126
  const root = xmlObj[rootTag2];
67862
68127
  if (!isXmlObject8(root)) {
67863
68128
  return xmlObj;
@@ -67870,8 +68135,9 @@ function orderedTemplatePartXml(options) {
67870
68135
  if (!isXmlObject8(spTree)) {
67871
68136
  return xmlObj;
67872
68137
  }
68138
+ const rewrapped = reapplyAlternateContentToTree(spTree, alternateContentBlockByRawXml);
67873
68139
  const rebuilt = positionsByRuntime.get(runtime)?.get(partPath);
67874
- const ordered32 = rebuilt ? orderShapeTreeChildren(spTree, (node) => rebuilt.get(node), getLocalName2) : orderContainer(spTree, sourceXml ? scanSpTreeDocumentOrder(sourceXml) : [], getLocalName2);
68140
+ const ordered32 = rebuilt ? orderShapeTreeChildren(rewrapped, (node) => rebuilt.get(node), getLocalName2) : orderContainer(rewrapped, sourceXml ? scanSpTreeDocumentOrder(sourceXml) : [], getLocalName2);
67875
68141
  if (ordered32 === spTree) {
67876
68142
  return xmlObj;
67877
68143
  }
@@ -68011,7 +68277,8 @@ var PptxHandlerRuntime45 = class extends PptxHandlerRuntime44 {
68011
68277
  xmlObj,
68012
68278
  rootTag: rootTag2,
68013
68279
  sourceXml: sourceXml ?? await this.zip.file(partPath)?.async("string"),
68014
- getLocalName: (key2) => this.compatibilityService.getXmlLocalName(key2)
68280
+ getLocalName: (key2) => this.compatibilityService.getXmlLocalName(key2),
68281
+ alternateContentBlockByRawXml: this.alternateContentBlockByRawXml
68015
68282
  });
68016
68283
  }
68017
68284
  getAuxiliaryMasterRelsPath(partPath) {
@@ -68524,11 +68791,11 @@ var PptxHandlerRuntime49 = class extends PptxHandlerRuntime48 {
68524
68791
  }
68525
68792
  const data = this.parser.parse(xml);
68526
68793
  const root = data["Types"] ?? {};
68527
- const overrides10 = asArray3(root["Override"]);
68528
- if (!overrides10.some((entry2) => entry2["@_PartName"] === partName)) {
68529
- overrides10.push({ "@_PartName": partName, "@_ContentType": contentType });
68794
+ const overrides11 = asArray3(root["Override"]);
68795
+ if (!overrides11.some((entry2) => entry2["@_PartName"] === partName)) {
68796
+ overrides11.push({ "@_PartName": partName, "@_ContentType": contentType });
68530
68797
  }
68531
- root["Override"] = overrides10;
68798
+ root["Override"] = overrides11;
68532
68799
  data["Types"] = root;
68533
68800
  this.zip.file("[Content_Types].xml", this.builder.build(data));
68534
68801
  }
@@ -68709,12 +68976,12 @@ var PptxHandlerRuntime50 = class extends PptxHandlerRuntime49 {
68709
68976
  }
68710
68977
  const data = this.parser.parse(xml);
68711
68978
  const root = data["Types"] ?? {};
68712
- const overrides10 = asArray4(root["Override"]);
68979
+ const overrides11 = asArray4(root["Override"]);
68713
68980
  const partName = `/${masterPath}`;
68714
- if (!overrides10.some((entry2) => entry2["@_PartName"] === partName)) {
68715
- overrides10.push({ "@_PartName": partName, "@_ContentType": HANDOUT_MASTER_CONTENT_TYPE });
68981
+ if (!overrides11.some((entry2) => entry2["@_PartName"] === partName)) {
68982
+ overrides11.push({ "@_PartName": partName, "@_ContentType": HANDOUT_MASTER_CONTENT_TYPE });
68716
68983
  }
68717
- root["Override"] = overrides10;
68984
+ root["Override"] = overrides11;
68718
68985
  data["Types"] = root;
68719
68986
  this.zip.file("[Content_Types].xml", this.builder.build(data));
68720
68987
  }
@@ -75732,8 +75999,8 @@ var PptxHandlerRuntime81 = class extends PptxHandlerRuntime80 {
75732
75999
  */
75733
76000
  aggregateFontScriptOverrides(perPathMap) {
75734
76001
  const aggregate2 = {};
75735
- for (const overrides10 of perPathMap.values()) {
75736
- for (const [script, typeface] of Object.entries(overrides10)) {
76002
+ for (const overrides11 of perPathMap.values()) {
76003
+ for (const [script, typeface] of Object.entries(overrides11)) {
75737
76004
  if (!(script in aggregate2)) {
75738
76005
  aggregate2[script] = typeface;
75739
76006
  }
@@ -75742,19 +76009,19 @@ var PptxHandlerRuntime81 = class extends PptxHandlerRuntime80 {
75742
76009
  return aggregate2;
75743
76010
  }
75744
76011
  collectFontScriptOverrides(fontNode) {
75745
- const overrides10 = {};
76012
+ const overrides11 = {};
75746
76013
  if (!fontNode) {
75747
- return overrides10;
76014
+ return overrides11;
75748
76015
  }
75749
76016
  const fontEntries = this.ensureArray(fontNode["a:font"]);
75750
76017
  for (const entry2 of fontEntries) {
75751
76018
  const script = String(entry2?.["@_script"] || "").trim();
75752
76019
  const typeface = this.normalizeTypefaceToken(String(entry2?.["@_typeface"] || ""));
75753
76020
  if (script && typeface) {
75754
- overrides10[script] = typeface;
76021
+ overrides11[script] = typeface;
75755
76022
  }
75756
76023
  }
75757
- return overrides10;
76024
+ return overrides11;
75758
76025
  }
75759
76026
  /**
75760
76027
  * Resolve the theme file path referenced by a given master's `.rels`.
@@ -78041,9 +78308,20 @@ var PptxHandlerRuntime91 = class extends PptxHandlerRuntime90 {
78041
78308
  false
78042
78309
  );
78043
78310
  }
78044
- const containerType = isCombo ? chartContainerLocalNameToType(this.compatibilityService.getXmlLocalName(containerKey)) : void 0;
78311
+ const resolvedContainerType = chartContainerLocalNameToType(
78312
+ this.compatibilityService.getXmlLocalName(containerKey)
78313
+ );
78314
+ const containerType = isCombo ? resolvedContainerType : void 0;
78045
78315
  const axisId = resolveChartContainerValueAxisId(container, axes ?? [], this.xmlLookupService);
78046
- series.push(...this.buildChartSeries(seriesList, categories, containerType, axisId));
78316
+ series.push(
78317
+ ...this.buildChartSeries(
78318
+ seriesList,
78319
+ categories,
78320
+ containerType,
78321
+ axisId,
78322
+ resolvedContainerType
78323
+ )
78324
+ );
78047
78325
  }
78048
78326
  return { categories, series };
78049
78327
  }
@@ -78087,9 +78365,15 @@ var PptxHandlerRuntime91 = class extends PptxHandlerRuntime90 {
78087
78365
  * @param categories - Pre-parsed category labels (used for fallback values).
78088
78366
  * @param seriesChartType - When set (combo charts), tags every series in this
78089
78367
  * container with its source chart type for round-trip.
78368
+ * @param axisId - The container's resolved value-axis id, if any.
78369
+ * @param containerChartType - The container's actual chart type, always
78370
+ * resolved (unlike `seriesChartType`, which is combo-only). Used to decide
78371
+ * whether this container's series read their colour from a direct fill or
78372
+ * from the outline (`a:ln/a:solidFill`), so a plain (non-combo)
78373
+ * line/scatter/radar/stock chart's authored colour is not dropped.
78090
78374
  * @returns The series array matching `PptxChartData["series"]`.
78091
78375
  */
78092
- buildChartSeries(seriesList, categories, seriesChartType, axisId) {
78376
+ buildChartSeries(seriesList, categories, seriesChartType, axisId, containerChartType) {
78093
78377
  return seriesList.map((seriesNode, seriesIndex) => {
78094
78378
  const seriesName = this.extractChartSeriesName(seriesNode);
78095
78379
  const valNode = this.xmlLookupService.getChildByLocalName(seriesNode, "val") || this.xmlLookupService.getChildByLocalName(seriesNode, "yVal");
@@ -78112,7 +78396,7 @@ var PptxHandlerRuntime91 = class extends PptxHandlerRuntime90 {
78112
78396
  ) ?? ""
78113
78397
  ).trim();
78114
78398
  const seriesShapeProperties = this.xmlLookupService.getChildByLocalName(seriesNode, "spPr");
78115
- const readsLineColor = seriesChartType === "line" || seriesChartType === "line3D" || seriesChartType === "scatter" || seriesChartType === "radar" || seriesChartType === "stock";
78399
+ const readsLineColor = isLineDrawnChartType(containerChartType);
78116
78400
  const seriesColor22 = this.parseColor(
78117
78401
  this.xmlLookupService.getChildByLocalName(seriesShapeProperties, "solidFill")
78118
78402
  ) ?? (readsLineColor ? this.parseColor(
@@ -83725,7 +84009,226 @@ function assign8(ids, facets) {
83725
84009
  overrides8[id] = facets;
83726
84010
  }
83727
84011
  }
83728
- assign8(["presentation:complexType:CT_SlideTransition", "presentation:element:transition"], {
84012
+ assign8(
84013
+ [
84014
+ "drawing:complexType:CT_LineProperties",
84015
+ "drawing:element:ln",
84016
+ "drawing:simpleType:ST_LineWidth"
84017
+ ],
84018
+ {
84019
+ parse: "native",
84020
+ preserve: "native",
84021
+ edit: "native",
84022
+ serialize: "native",
84023
+ 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.",
84024
+ evidence: [
84025
+ testEvidence(
84026
+ "src/core/core/builders/shape-style-line-helpers.test.ts",
84027
+ [
84028
+ "extracts line width from @_w (12700 EMU = 1pt \u2248 1.33px)",
84029
+ "extracts larger line width (38100 => 4px)"
84030
+ ],
84031
+ ["parse"]
84032
+ ),
84033
+ testEvidence(
84034
+ "src/core/core/runtime/PptxHandlerRuntimeSaveShapeStyleWriter.test.ts",
84035
+ ["should set stroke width in EMU and solid fill"],
84036
+ ["edit", "serialize"]
84037
+ ),
84038
+ testEvidence(
84039
+ "src/core/core/runtime/authored-shape-style.test.ts",
84040
+ [
84041
+ "does not invent an a:ln for an outline that comes from a:lnRef",
84042
+ "keeps an authored a:ln free of the theme width, colour, cap and join",
84043
+ "writes width and colour once the outline is edited"
84044
+ ],
84045
+ ["preserve", "edit", "serialize"]
84046
+ ),
84047
+ testEvidence(
84048
+ "src/core/core/runtime/save-line-fill.test.ts",
84049
+ [
84050
+ "keeps the fill ahead of an authored a:prstDash",
84051
+ "keeps the fill ahead of the join and the line ends"
84052
+ ],
84053
+ ["preserve", "serialize"]
84054
+ )
84055
+ ]
84056
+ }
84057
+ );
84058
+ assign8(["drawing:group:EG_LineFillProperties"], {
84059
+ parse: "native",
84060
+ preserve: "native",
84061
+ edit: "native",
84062
+ serialize: "native",
84063
+ 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.",
84064
+ evidence: [
84065
+ testEvidence(
84066
+ "src/core/core/builders/shape-style-line-helpers.test.ts",
84067
+ [
84068
+ "applies solid fill stroke color",
84069
+ "applies gradient fill stroke color via context callback",
84070
+ "applies pattern fill stroke color from foreground",
84071
+ "models a gradient outline and preserves the whole a:gradFill node",
84072
+ "models a pattern outline and preserves the whole a:pattFill node",
84073
+ 'models a noFill outline (no hidden line) as strokeFillMode "none"'
84074
+ ],
84075
+ ["parse"]
84076
+ ),
84077
+ testEvidence(
84078
+ "src/core/core/runtime/save-line-fill.test.ts",
84079
+ [
84080
+ "emits a single a:gradFill for a gradient outline, never a solid dual-fill",
84081
+ "emits a single a:pattFill for a pattern outline",
84082
+ "emits a single a:solidFill for a solid outline and clears any prior gradient",
84083
+ "emits a:noFill for a transparent / zero-width outline and clears fills"
84084
+ ],
84085
+ ["preserve", "edit", "serialize"]
84086
+ )
84087
+ ]
84088
+ });
84089
+ assign8(
84090
+ [
84091
+ "drawing:group:EG_LineDashProperties",
84092
+ "drawing:complexType:CT_PresetLineDashProperties",
84093
+ "drawing:element:prstDash",
84094
+ "drawing:simpleType:ST_PresetLineDashVal"
84095
+ ],
84096
+ {
84097
+ parse: "native",
84098
+ preserve: "native",
84099
+ edit: "native",
84100
+ serialize: "native",
84101
+ 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.",
84102
+ evidence: [
84103
+ testEvidence(
84104
+ "src/core/core/builders/shape-style-line-helpers.test.ts",
84105
+ [
84106
+ "applies preset dash type 'dash'",
84107
+ "applies preset dash type 'dot'",
84108
+ "applies preset dash type 'lgDash'",
84109
+ "applies preset dash type 'sysDash'",
84110
+ "applies preset dash type 'dashDot'"
84111
+ ],
84112
+ ["parse"]
84113
+ ),
84114
+ testEvidence(
84115
+ "src/core/core/runtime/PptxHandlerRuntimeSaveShapeStyleWriter.test.ts",
84116
+ ["should remove dash styles when dash is 'solid'", "should set preset dash"],
84117
+ ["edit", "serialize"]
84118
+ ),
84119
+ testEvidence(
84120
+ "src/core/utils/drawing-line-dash.test.ts",
84121
+ ["inserts custom dash before line joins and extensions"],
84122
+ ["preserve", "serialize"]
84123
+ )
84124
+ ]
84125
+ }
84126
+ );
84127
+ assign8(
84128
+ [
84129
+ "drawing:group:EG_LineJoinProperties",
84130
+ "drawing:complexType:CT_LineJoinRound",
84131
+ "drawing:complexType:CT_LineJoinBevel",
84132
+ "drawing:complexType:CT_LineJoinMiterProperties",
84133
+ "drawing:element:round",
84134
+ "drawing:element:bevel",
84135
+ "drawing:element:miter",
84136
+ "drawing:simpleType:ST_CompoundLine",
84137
+ "drawing:simpleType:ST_LineCap"
84138
+ ],
84139
+ {
84140
+ parse: "native",
84141
+ preserve: "native",
84142
+ edit: "native",
84143
+ serialize: "native",
84144
+ 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.",
84145
+ evidence: [
84146
+ testEvidence(
84147
+ "src/core/core/builders/shape-style-line-helpers.test.ts",
84148
+ [
84149
+ "applies round line join",
84150
+ "applies bevel line join",
84151
+ "applies miter line join",
84152
+ "parses miter @_lim into miterLimit (E-H6)",
84153
+ "applies cap type 'rnd'",
84154
+ "applies cap type 'sq'",
84155
+ "applies cap type 'flat'",
84156
+ "applies compound line type 'dbl'",
84157
+ "applies compound line type 'thickThin'",
84158
+ "applies compound line type 'tri'"
84159
+ ],
84160
+ ["parse"]
84161
+ ),
84162
+ testEvidence(
84163
+ "src/core/core/runtime/PptxHandlerRuntimeSaveShapeStyleWriter.test.ts",
84164
+ [
84165
+ "should set round join",
84166
+ "should set bevel join",
84167
+ "omits @lim on a miter join at the 800000 default",
84168
+ "emits @lim on a miter join with a non-default limit",
84169
+ "should set line cap",
84170
+ "should set compound line type"
84171
+ ],
84172
+ ["edit", "serialize"]
84173
+ ),
84174
+ testEvidence(
84175
+ "src/core/core/runtime/authored-shape-style.test.ts",
84176
+ ["keeps an outline property the shape authored on top of the reference"],
84177
+ ["preserve"]
84178
+ )
84179
+ ]
84180
+ }
84181
+ );
84182
+ assign8(
84183
+ [
84184
+ "drawing:complexType:CT_LineEndProperties",
84185
+ "drawing:element:headEnd",
84186
+ "drawing:element:tailEnd",
84187
+ "drawing:simpleType:ST_LineEndType",
84188
+ "drawing:simpleType:ST_LineEndWidth",
84189
+ "drawing:simpleType:ST_LineEndLength"
84190
+ ],
84191
+ {
84192
+ parse: "native",
84193
+ preserve: "native",
84194
+ edit: "native",
84195
+ serialize: "native",
84196
+ 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.',
84197
+ evidence: [
84198
+ testEvidence(
84199
+ "src/core/core/builders/shape-style-line-helpers.test.ts",
84200
+ [
84201
+ "applies head end arrow type 'triangle' with size 'lg'",
84202
+ "applies tail end arrow type 'stealth' with size 'sm'",
84203
+ "applies both head and tail arrows"
84204
+ ],
84205
+ ["parse"]
84206
+ ),
84207
+ testEvidence(
84208
+ "src/core/core/runtime/PptxHandlerRuntimeSaveShapeStyleWriter.test.ts",
84209
+ [
84210
+ "should set tail end arrow with width and length",
84211
+ "should remove tailEnd when endArrow is 'none'",
84212
+ "should set head end arrow"
84213
+ ],
84214
+ ["edit", "serialize"]
84215
+ ),
84216
+ testEvidence(
84217
+ "src/core/core/runtime/authored-shape-style.test.ts",
84218
+ ["keeps an authored a:ln free of the theme width, colour, cap and join"],
84219
+ ["preserve"]
84220
+ )
84221
+ ]
84222
+ }
84223
+ );
84224
+ var OPENXML_LINE_STROKE_PROPERTIES_COVERAGE = overrides8;
84225
+ var overrides9 = {};
84226
+ function assign9(ids, facets) {
84227
+ for (const id of ids) {
84228
+ overrides9[id] = facets;
84229
+ }
84230
+ }
84231
+ assign9(["presentation:complexType:CT_SlideTransition", "presentation:element:transition"], {
83729
84232
  parse: "partial",
83730
84233
  preserve: "native",
83731
84234
  edit: "partial",
@@ -83738,7 +84241,7 @@ assign8(["presentation:complexType:CT_SlideTransition", "presentation:element:tr
83738
84241
  ])
83739
84242
  ]
83740
84243
  });
83741
- assign8(
84244
+ assign9(
83742
84245
  [
83743
84246
  "presentation:complexType:CT_TransitionSoundAction",
83744
84247
  "presentation:complexType:CT_TransitionStartSoundAction",
@@ -83760,7 +84263,7 @@ assign8(
83760
84263
  ]
83761
84264
  }
83762
84265
  );
83763
- assign8(
84266
+ assign9(
83764
84267
  [
83765
84268
  "drawing:complexType:CT_Backdrop",
83766
84269
  "drawing:complexType:CT_Camera",
@@ -83794,7 +84297,7 @@ assign8(
83794
84297
  ]
83795
84298
  }
83796
84299
  );
83797
- assign8(["chart:complexType:CT_DTable", "chart:element:dTable"], {
84300
+ assign9(["chart:complexType:CT_DTable", "chart:element:dTable"], {
83798
84301
  parse: "partial",
83799
84302
  preserve: "native",
83800
84303
  edit: "partial",
@@ -83806,7 +84309,7 @@ assign8(["chart:complexType:CT_DTable", "chart:element:dTable"], {
83806
84309
  ])
83807
84310
  ]
83808
84311
  });
83809
- assign8(
84312
+ assign9(
83810
84313
  [
83811
84314
  "chart:element:showHorzBorder",
83812
84315
  "chart:element:showVertBorder",
@@ -83826,7 +84329,7 @@ assign8(
83826
84329
  ]
83827
84330
  }
83828
84331
  );
83829
- assign8(
84332
+ assign9(
83830
84333
  [
83831
84334
  "presentation:complexType:CT_PrintProperties",
83832
84335
  "presentation:simpleType:ST_PrintColorMode",
@@ -83857,14 +84360,14 @@ assign8(
83857
84360
  ]
83858
84361
  }
83859
84362
  );
83860
- var OPENXML_TRANSITIONS_SCENES_AND_CHART_TABLES_COVERAGE = overrides8;
83861
- var overrides9 = {};
83862
- function assign9(ids, facets) {
84363
+ var OPENXML_TRANSITIONS_SCENES_AND_CHART_TABLES_COVERAGE = overrides9;
84364
+ var overrides10 = {};
84365
+ function assign10(ids, facets) {
83863
84366
  for (const id of ids) {
83864
- overrides9[id] = facets;
84367
+ overrides10[id] = facets;
83865
84368
  }
83866
84369
  }
83867
- assign9(
84370
+ assign10(
83868
84371
  [
83869
84372
  "presentation:complexType:CT_CommonViewProperties",
83870
84373
  "presentation:complexType:CT_CommonSlideViewProperties",
@@ -83891,7 +84394,7 @@ assign9(
83891
84394
  ]
83892
84395
  }
83893
84396
  );
83894
- assign9(
84397
+ assign10(
83895
84398
  [
83896
84399
  "drawing:complexType:CT_ColorChangeEffect",
83897
84400
  "drawing:complexType:CT_ColorReplaceEffect",
@@ -83917,7 +84420,7 @@ assign9(
83917
84420
  ]
83918
84421
  }
83919
84422
  );
83920
- assign9(
84423
+ assign10(
83921
84424
  [
83922
84425
  "drawing:complexType:CT_GrayscaleEffect",
83923
84426
  "drawing:complexType:CT_BiLevelEffect",
@@ -83939,7 +84442,7 @@ assign9(
83939
84442
  ]
83940
84443
  }
83941
84444
  );
83942
- assign9(
84445
+ assign10(
83943
84446
  [
83944
84447
  "chart:complexType:CT_Marker",
83945
84448
  "chart:complexType:CT_DPt",
@@ -83959,7 +84462,7 @@ assign9(
83959
84462
  ]
83960
84463
  }
83961
84464
  );
83962
- assign9(
84465
+ assign10(
83963
84466
  [
83964
84467
  "chart:complexType:CT_MarkerSize",
83965
84468
  "chart:complexType:CT_MarkerStyle",
@@ -83983,7 +84486,7 @@ assign9(
83983
84486
  ]
83984
84487
  }
83985
84488
  );
83986
- assign9(
84489
+ assign10(
83987
84490
  [
83988
84491
  "drawing:complexType:CT_AlphaBiLevelEffect",
83989
84492
  "drawing:complexType:CT_AlphaCeilingEffect",
@@ -84017,7 +84520,7 @@ assign9(
84017
84520
  ]
84018
84521
  }
84019
84522
  );
84020
- assign9(
84523
+ assign10(
84021
84524
  [
84022
84525
  "drawing:complexType:CT_AlphaInverseEffect",
84023
84526
  "drawing:complexType:CT_AlphaModulateEffect",
@@ -84039,7 +84542,7 @@ assign9(
84039
84542
  ]
84040
84543
  }
84041
84544
  );
84042
- var OPENXML_VIEW_IMAGE_AND_CHART_POINT_FORMATTING_COVERAGE = overrides9;
84545
+ var OPENXML_VIEW_IMAGE_AND_CHART_POINT_FORMATTING_COVERAGE = overrides10;
84043
84546
  var OPENXML_STRICT_SCHEMA_CONSTRUCT_IDS = [
84044
84547
  "chart:attribute:alignWithMargins",
84045
84548
  "chart:attribute:b",
@@ -88501,6 +89004,7 @@ var COVERAGE_OVERRIDES = {
88501
89004
  ...OPENXML_VIEW_IMAGE_AND_CHART_POINT_FORMATTING_COVERAGE,
88502
89005
  ...OPENXML_FONTS_AUDIO_PIVOTS_AND_ALGORITHMS_COVERAGE,
88503
89006
  ...OPENXML_LINE_LAYOUT_AND_PIVOT_STRUCTURES_COVERAGE,
89007
+ ...OPENXML_LINE_STROKE_PROPERTIES_COVERAGE,
88504
89008
  "chart:complexType:CT_ManualLayout": {
88505
89009
  parse: "native",
88506
89010
  preserve: "native",
@@ -125274,6 +125778,318 @@ async function mountModel3D(container, modelUrl, options) {
125274
125778
  }
125275
125779
  };
125276
125780
  }
125781
+ var GRID_SPACING = 0.5;
125782
+ var MAX_HEIGHT = 1.5;
125783
+ function computeGridExtent(cols, rows) {
125784
+ return {
125785
+ gridWidth: Math.max(cols - 1, 1) * GRID_SPACING,
125786
+ gridDepth: Math.max(rows - 1, 1) * GRID_SPACING
125787
+ };
125788
+ }
125789
+ function buildSurfaceGeometry(three, cols, rows, heightMap, colorMap) {
125790
+ const widthSegs = Math.max(cols - 1, 0);
125791
+ const depthSegs = Math.max(rows - 1, 0);
125792
+ const { gridWidth, gridDepth } = computeGridExtent(cols, rows);
125793
+ const geo = new three.PlaneGeometry(gridWidth, gridDepth, widthSegs, depthSegs);
125794
+ geo.rotateX(-Math.PI / 2);
125795
+ const pos2 = geo.attributes.position;
125796
+ const vertexCount = pos2.count;
125797
+ const colors = new Float32Array(vertexCount * 3);
125798
+ for (let i = 0; i < vertexCount; i++) {
125799
+ const row = Math.floor(i / cols);
125800
+ const col = i % cols;
125801
+ const idx = row * cols + col;
125802
+ const h = idx < heightMap.length ? heightMap[idx] : 0;
125803
+ pos2.setY(i, h * MAX_HEIGHT);
125804
+ const ci = idx * 3;
125805
+ colors[i * 3] = ci < colorMap.length ? colorMap[ci] : 0.5;
125806
+ colors[i * 3 + 1] = ci + 1 < colorMap.length ? colorMap[ci + 1] : 0.5;
125807
+ colors[i * 3 + 2] = ci + 2 < colorMap.length ? colorMap[ci + 2] : 0.5;
125808
+ }
125809
+ geo.setAttribute("color", new three.BufferAttribute(colors, 3));
125810
+ geo.computeVertexNormals();
125811
+ pos2.needsUpdate = true;
125812
+ const wireGeometry = new three.WireframeGeometry(geo);
125813
+ return { geometry: geo, wireGeometry };
125814
+ }
125815
+ function buildSurfaceLabels(cols, rows, categoryLabels, seriesNames, maxCat = 8, maxSer = 6) {
125816
+ const { gridWidth, gridDepth } = computeGridExtent(cols, rows);
125817
+ const labels = [];
125818
+ const catStep = Math.max(1, Math.ceil(categoryLabels.length / maxCat));
125819
+ for (let i = 0; i < categoryLabels.length; i += catStep) {
125820
+ const x = -gridWidth / 2 + i / Math.max(cols - 1, 1) * gridWidth;
125821
+ labels.push({
125822
+ key: `cat-${i}`,
125823
+ text: categoryLabels[i],
125824
+ anchor: [x, -0.15, gridDepth / 2 + 0.25],
125825
+ axis: "category"
125826
+ });
125827
+ }
125828
+ const serStep = Math.max(1, Math.ceil(seriesNames.length / maxSer));
125829
+ for (let i = 0; i < seriesNames.length; i += serStep) {
125830
+ const z = -gridDepth / 2 + i / Math.max(rows - 1, 1) * gridDepth;
125831
+ labels.push({
125832
+ key: `ser-${i}`,
125833
+ text: seriesNames[i],
125834
+ anchor: [gridWidth / 2 + 0.3, -0.15, z],
125835
+ axis: "series"
125836
+ });
125837
+ }
125838
+ labels.push({
125839
+ key: "value-axis",
125840
+ text: "Value",
125841
+ anchor: [-gridWidth / 2 - 0.35, 0.75, -gridDepth / 2],
125842
+ axis: "value"
125843
+ });
125844
+ return labels;
125845
+ }
125846
+ function computeCameraPlacement(cols, rows) {
125847
+ const { gridWidth, gridDepth } = computeGridExtent(cols, rows);
125848
+ const maxExtent = Math.max(gridWidth, gridDepth, MAX_HEIGHT);
125849
+ const dist2 = maxExtent * 1.8;
125850
+ return {
125851
+ position: [dist2 * 0.8, dist2 * 0.7, dist2 * 0.8],
125852
+ target: [0, 0.3, 0]
125853
+ };
125854
+ }
125855
+ var SURFACE_THREE_UNAVAILABLE = {
125856
+ ok: false,
125857
+ resize: () => {
125858
+ },
125859
+ dispose: () => {
125860
+ }
125861
+ };
125862
+ var FOV2 = 45;
125863
+ async function loadThree2() {
125864
+ try {
125865
+ return await import('./three.module-AC7ESV4W.mjs');
125866
+ } catch {
125867
+ return null;
125868
+ }
125869
+ }
125870
+ async function loadOrbitControlsCtor2() {
125871
+ try {
125872
+ const mod = await import('./OrbitControls-ZTGHPI5G.mjs');
125873
+ return mod.OrbitControls;
125874
+ } catch {
125875
+ return null;
125876
+ }
125877
+ }
125878
+ function createLabelOverlay(doc, labels) {
125879
+ const layer = doc.createElement("div");
125880
+ Object.assign(layer.style, {
125881
+ position: "absolute",
125882
+ inset: "0",
125883
+ pointerEvents: "none",
125884
+ overflow: "hidden"
125885
+ });
125886
+ const nodes = labels.map((label) => {
125887
+ const node = doc.createElement("div");
125888
+ node.textContent = label.text;
125889
+ const color2 = label.axis === "value" ? "#999" : "#666";
125890
+ Object.assign(node.style, {
125891
+ position: "absolute",
125892
+ fontSize: "9px",
125893
+ color: color2,
125894
+ whiteSpace: "nowrap",
125895
+ userSelect: "none",
125896
+ transform: "translate(-50%, -50%)",
125897
+ willChange: "left, top"
125898
+ });
125899
+ if (label.axis === "value") {
125900
+ node.style.writingMode = "vertical-rl";
125901
+ }
125902
+ layer.appendChild(node);
125903
+ return node;
125904
+ });
125905
+ return { layer, nodes };
125906
+ }
125907
+ async function mountSurfaceChart3D(container, options) {
125908
+ const three = await loadThree2();
125909
+ const OrbitCtrlCtor = three ? await loadOrbitControlsCtor2() : null;
125910
+ if (!three || !OrbitCtrlCtor) {
125911
+ return SURFACE_THREE_UNAVAILABLE;
125912
+ }
125913
+ const { cols, rows } = options;
125914
+ let width = Math.max(1, options.width);
125915
+ let height = Math.max(1, options.height);
125916
+ const renderer = new three.WebGLRenderer({ antialias: true, alpha: true });
125917
+ renderer.setPixelRatio(
125918
+ Math.min(
125919
+ typeof window === "undefined" ? 1 : window.devicePixelRatio || 1,
125920
+ options.maxPixelRatio ?? 2
125921
+ )
125922
+ );
125923
+ renderer.setSize(width, height, false);
125924
+ const canvas = renderer.domElement;
125925
+ canvas.style.width = `${width}px`;
125926
+ canvas.style.height = `${height}px`;
125927
+ canvas.style.display = "block";
125928
+ canvas.style.willChange = "transform";
125929
+ container.appendChild(canvas);
125930
+ const scene = new three.Scene();
125931
+ scene.add(new three.AmbientLight(16777215, 0.6));
125932
+ const key2 = new three.DirectionalLight(16777215, 0.8);
125933
+ key2.position.set(5, 8, 5);
125934
+ scene.add(key2);
125935
+ const fill = new three.DirectionalLight(16777215, 0.3);
125936
+ fill.position.set(-3, 4, -2);
125937
+ scene.add(fill);
125938
+ const camera = new three.PerspectiveCamera(FOV2, width / height, 0.1, 1e3);
125939
+ const placement = computeCameraPlacement(cols, rows);
125940
+ camera.position.set(...placement.position);
125941
+ const target = new three.Vector3(...placement.target);
125942
+ camera.lookAt(target);
125943
+ const { gridWidth, gridDepth } = computeGridExtent(cols, rows);
125944
+ const floorSize = Math.max(gridWidth, gridDepth) * 1.2;
125945
+ const gridFloor = new three.GridHelper(floorSize, Math.max(cols, rows), 13421772, 15263976);
125946
+ gridFloor.position.y = -0.02;
125947
+ scene.add(gridFloor);
125948
+ const { geometry, wireGeometry } = buildSurfaceGeometry(
125949
+ three,
125950
+ cols,
125951
+ rows,
125952
+ options.heightMap,
125953
+ options.colorMap
125954
+ );
125955
+ const surfaceMaterial = new three.MeshPhongMaterial({
125956
+ vertexColors: true,
125957
+ side: three.DoubleSide,
125958
+ shininess: 30,
125959
+ transparent: true,
125960
+ opacity: 0.92
125961
+ });
125962
+ const surfaceMesh = new three.Mesh(geometry, surfaceMaterial);
125963
+ scene.add(surfaceMesh);
125964
+ let wireMaterial = null;
125965
+ if (options.wireframe) {
125966
+ wireMaterial = new three.LineBasicMaterial({
125967
+ color: 3355443,
125968
+ transparent: true,
125969
+ opacity: 0.25
125970
+ });
125971
+ scene.add(new three.LineSegments(wireGeometry, wireMaterial));
125972
+ }
125973
+ const controls = new OrbitCtrlCtor(camera, canvas);
125974
+ controls.enablePan = true;
125975
+ controls.enableZoom = true;
125976
+ controls.enableRotate = true;
125977
+ controls.minDistance = 1;
125978
+ controls.maxDistance = 20;
125979
+ controls.maxPolarAngle = Math.PI / 2 + 0.3;
125980
+ controls.target.copy(target);
125981
+ controls.update();
125982
+ const doc = container.ownerDocument ?? document;
125983
+ const labels = buildSurfaceLabels(cols, rows, options.categoryLabels, options.seriesNames);
125984
+ const { layer, nodes } = createLabelOverlay(doc, labels);
125985
+ container.appendChild(layer);
125986
+ const anchors = labels.map((l) => new three.Vector3(...l.anchor));
125987
+ const projected = new three.Vector3();
125988
+ const updateLabels = () => {
125989
+ for (let i = 0; i < nodes.length; i++) {
125990
+ projected.copy(anchors[i]).project(camera);
125991
+ const node = nodes[i];
125992
+ if (projected.z > 1) {
125993
+ node.style.display = "none";
125994
+ continue;
125995
+ }
125996
+ node.style.display = "";
125997
+ node.style.left = `${(projected.x + 1) / 2 * width}px`;
125998
+ node.style.top = `${(-projected.y + 1) / 2 * height}px`;
125999
+ }
126000
+ };
126001
+ let frame2 = 0;
126002
+ let disposed = false;
126003
+ const renderLoop = () => {
126004
+ if (disposed) {
126005
+ return;
126006
+ }
126007
+ frame2 = requestAnimationFrame(renderLoop);
126008
+ controls.update();
126009
+ renderer.render(scene, camera);
126010
+ updateLabels();
126011
+ };
126012
+ frame2 = requestAnimationFrame(renderLoop);
126013
+ return {
126014
+ ok: true,
126015
+ resize(w, h) {
126016
+ width = Math.max(1, w);
126017
+ height = Math.max(1, h);
126018
+ camera.aspect = width / height;
126019
+ camera.updateProjectionMatrix();
126020
+ renderer.setSize(width, height, false);
126021
+ canvas.style.width = `${width}px`;
126022
+ canvas.style.height = `${height}px`;
126023
+ },
126024
+ dispose() {
126025
+ if (disposed) {
126026
+ return;
126027
+ }
126028
+ disposed = true;
126029
+ cancelAnimationFrame(frame2);
126030
+ controls.dispose();
126031
+ geometry.dispose();
126032
+ wireGeometry.dispose();
126033
+ surfaceMaterial.dispose();
126034
+ wireMaterial?.dispose();
126035
+ gridFloor.dispose();
126036
+ scene.clear();
126037
+ renderer.dispose();
126038
+ canvas.remove();
126039
+ layer.remove();
126040
+ }
126041
+ };
126042
+ }
126043
+ function buildSurfaceChart3DData(chartData, categoryLabels, options) {
126044
+ const seriesCount = chartData.series.length;
126045
+ const catCount = categoryLabels.length;
126046
+ if (seriesCount === 0 || catCount === 0) {
126047
+ return null;
126048
+ }
126049
+ const range = computeValueRange2(chartData.series);
126050
+ const heightMap = new Float32Array(seriesCount * catCount);
126051
+ const colorMap = new Float32Array(seriesCount * catCount * 3);
126052
+ for (let row = 0; row < seriesCount; row++) {
126053
+ for (let col = 0; col < catCount; col++) {
126054
+ const idx = row * catCount + col;
126055
+ const val2 = chartData.series[row]?.values[col] ?? 0;
126056
+ const t = range.span > 0 ? (val2 - range.min) / range.span : 0;
126057
+ heightMap[idx] = t;
126058
+ const { r, g, b } = surfaceColor(t);
126059
+ const ci = idx * 3;
126060
+ colorMap[ci] = r / 255;
126061
+ colorMap[ci + 1] = g / 255;
126062
+ colorMap[ci + 2] = b / 255;
126063
+ }
126064
+ }
126065
+ return {
126066
+ cols: catCount,
126067
+ rows: seriesCount,
126068
+ heightMap,
126069
+ colorMap,
126070
+ wireframe: options.wireframe ?? true,
126071
+ categoryLabels,
126072
+ seriesNames: chartData.series.map((s) => s.name),
126073
+ width: options.width,
126074
+ height: options.height
126075
+ };
126076
+ }
126077
+ function buildSurfaceChart3DDataForElement(element, options) {
126078
+ if (element.type !== "chart") {
126079
+ return null;
126080
+ }
126081
+ const chartEl = element;
126082
+ const chartData = chartEl.chartData;
126083
+ if (!chartData || chartData.series.length === 0) {
126084
+ return null;
126085
+ }
126086
+ if (resolveChartKind(chartData.chartType ?? "bar") !== "surface") {
126087
+ return null;
126088
+ }
126089
+ const longestLen = chartData.series.reduce((m, s) => Math.max(m, s.values.length), 0);
126090
+ const categoryLabels = chartData.categories.length > 0 ? chartData.categories : Array.from({ length: longestLen }, (_, i) => String(i + 1));
126091
+ return buildSurfaceChart3DData(chartData, categoryLabels, options);
126092
+ }
125277
126093
  var AVERAGE_ADVANCE_RATIO = 0.5;
125278
126094
  function wrapTextByEstimatedWidth(text2, maxWidth, fontSize, options = {}) {
125279
126095
  if (!text2 || text2.trim().length === 0) {
@@ -134830,4 +135646,4 @@ function segmentFrameCount(durationMs, fps) {
134830
135646
  * `<p:extLst>` (optional)
134831
135647
  */
134832
135648
 
134833
- export { ACTION_BUTTON_PRESETS, ACTION_INDICATOR_CLASS, ACTION_INDICATOR_ICON_PATH, ARTISTIC_EFFECTS, AVATAR_COLOR_SWATCHES, BACKSTAGE_NAV, BACKSTAGE_TEMPLATES, BEVEL_PRESETS, BROADCAST_THROTTLE_MS, CATEGORIES, CHARACTER_SPACING_OPTIONS, COLOR_MAP_ALIAS_KEYS, COMMENT_MARKER_SIZE, COMMENT_MENTION_ATTRIBUTE, COMMENT_MENTION_CLASS, COMMON_FONTS, CONNECTION_TIMEOUT_MS, CONNECTOR_SITE_SNAP_PX, CUSTOM_FONT_ACCEPT, DEBOUNCE_MS, DEFAULT_BROADCAST_SERVER_URL, DEFAULT_COLOR_CHANGE_TOLERANCE, DEFAULT_COLOR_MAP, DEFAULT_FONT_FAMILY, DEFAULT_INSERT_CHART_KIND, DEFAULT_MOTION_PATH_PRESET_ID, DEFAULT_PALETTE2, DEFAULT_QUICK_ACCESS_COMMAND_IDS, DEFAULT_ROW_HEIGHT, DEFAULT_VIEWER_OPTIONS, DEFAULT_VIEWER_PROFILE, DEFAULT_VIRTUAL_OVERSCAN, DIRECTIONAL_PRESETS, DUOTONE_PRESETS, ELEMENT_ACTION_TYPE_OPTIONS, EMPHASIS_PRESET_VALUES, ENTRANCE_PRESET_VALUES, EQUATION_TEMPLATES, EXIT_PRESET_VALUES, EXPANDED_MAX_HEIGHT, EXPORT_ASSEMBLING_PERCENT, EXPORT_DONE_PERCENT, EncryptedFileError, FILL_MODE_OPTIONS, FILL_PATTERN_LABEL_KEYS, GRADIENT_TYPE_OPTIONS, HANDOUT_OPTIONS, HIDDEN_SLIDE_LABEL_KEY, HIDDEN_SLIDE_SLASH_GRADIENT, HIGHLIGHTER_COLORS, INDENT_PX, INK_REPLAY_KEYFRAMES, INSERT_CHART_TYPES, LBL, LINK_TOOLTIP_CLASS, LINK_TOOLTIP_HINT_CLASS, LINK_TOOLTIP_HOST_CLASS, LINK_TOOLTIP_LABEL_CLASS, LINK_TOOLTIP_PANEL_CLASS, LOCAL_SYNC_ORIGIN, MATERIAL_PRESETS, MAX_INDENT_LEVEL, MAX_ZOOM_SCALE, MEDIA_CHROME_ATTRIBUTE, MIN_ZOOM_SCALE, MOBILE_BREAKPOINT, MORPH_CROSSFADE_GROUP_STYLE, MORPH_CROSSFADE_HALF_STYLE, MOTION_PATH_FAMILIES, NOTES_FONT_SIZE_DEFAULT, NOTES_FONT_SIZE_MAX, NOTES_FONT_SIZE_MIN, NOTES_FONT_SIZE_STEP, NUM, OUTLINE_LEVEL_ATTR, OUTLINE_ROW_ATTR, OUTLINE_SLIDE_ATTR, OUTLINE_VIEW_ATTR, PATTERN_OPTIONS, PEN_COLORS, PPTX_OPEN_ACCEPT, PRESENTATION_CHANNEL_NAME, PRESENTATION_HASH, PRESENTATION_HIT_TEST_CSS, PRESENTATION_MESSAGE_ORIGIN, PRESENTATION_NONCE_KEY, PRESENTATION_OPEN_EXTENSIONS, PRESENTATION_STAGE_ATTRIBUTE, PRESENTER_CONSOLE_CLASSES, PRESENTER_CONSOLE_CONTROLS, PRESENTER_NAVIGATOR_LABEL_KEYS, PRESENT_TOOLBAR_CLASSES, PRESETS, PRESET_THEMES, PptxHandler, PptxMarkdownConverter, PresentationAnimationController, QUICK_ACCESS_COMMAND_CATALOG, READING_VIEW_ATTR, READING_VIEW_COUNTER_ATTR, READING_VIEW_STAGE_ATTR, RIBBON_SHAPE_SWATCHES, RIBBON_TRANSITION_PRESETS, RULER_FONT_SIZE, RULER_THICKNESS, SECTION_HEADING, SEL, SHAPE_PRESET_DEFS, SHAPE_QUICK_STYLES, SHORTCUT_REFERENCE_ITEMS, SLIDE_SHOW_OPTIONS, SLIDE_SIZE_PRESETS, SLIDE_TEMPLATES, SLIDE_TRANSITION_KEYFRAMES, SLIDE_TRANSITION_OPTIONS, SLIDE_VIRTUALIZATION_THRESHOLD, SMARTART_COLOR_SCHEME_LABEL_KEYS, SMARTART_STYLE_LABEL_KEYS, SORTER_MAX_ZOOM, SORTER_MIN_ZOOM, SORTER_ZOOM_STEP, STATUS_BAR_CLASSES, SWITCHABLE_LAYOUT_TYPES, SvgExporter, TABLET_BREAKPOINT, TABLE_STYLE_PRESETS, TAB_ROW_ACTION_CLASSES, TEXT_BUILD_ID_SEP, TEXT_WARP_PRESETS, THEME_CATALOG, THEME_COLOR_SCHEME_KEYS, THEME_COLOR_SLOT_LABEL_KEYS, THEME_PRESETS, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, TOOLBAR_TABS, TRANSITION_DIR_ARROWS, TRANSITION_ORIENTATION_TYPES, TRANSITION_VALID_DIRECTIONS, ThemePresets, VIEWER_OPTIONS_TABS, VIEWER_PREFS_STORAGE_KEY, VIEWER_SHORTCUT_REFERENCE, WEBM_MIME_CANDIDATES, acceptAutosaveRecovery, acceptsPresentationInput, actionAffordanceLabels, activateModalFocus, addChartCategory, addChartSeries, addCommentToList, addQuickAccessCommand, addSection, addSiblingAfter, addSmartArtNodeAsChild, addTagToCollections, advanceChartValueDrag, alignElements, animationEffectLabel, annotationOverlayZIndex, appendPresentationInkPoint, appendTableElementColumn, appendTableElementRow, apply3dEffects, applyAcceptAllSlides, applyAcceptSlide, applyCaseTransformToSegments, applyChartBuildReveal, applyChartPartHighlight, applyColorChange, applyDuotone, applyFindReplacements, applyFormatToElement, applyMotionPathPreset, applyOutlineEdit, applyPreferenceToOptions, applyReadingViewCommand, applyRehearsalTimings, applyReroutedConnectors, applyResize, applyStyleToSelectedSegments, applyTableStylePreset, applyThemeOverrideToSlide, applyThemeToData, attachPresentationVisibilityPause, authorConnectorBetweenSites, autosaveSnapshotMark, availableQuickAccessCommands, backstageCardsFor, beginChartValueDrag, beginShapeAdjustment, bringForward, bringToFront, build3DExtrusionData, buildActiveSessionUsers, buildAnimationTimelineBars, buildBarActions, buildBroadcastViewerUrl, buildCacheKey, buildCalloutLeaderLineSvgPath, buildChartViewModel, buildChromeStyle, buildCollaborationShareUrl, buildCommentMarkers, buildContextMenuEntries, buildCreateCollaborationConfig, buildCssGradientFromShapeStyle, buildDirectionGrid, buildDuotoneCacheKey, buildElementClipboardPayload, buildFieldSubstitutionContext, buildFontCatalog, buildHandoutsHtml, buildHollowHitOutline, buildInitialGuides, buildJoinCollaborationConfig, buildLayoutPreviewGeometry, buildMorphAnimationRules, buildMorphTransitionPlan, buildMotionPathPreview, buildNotesHtml, buildNotesPdfBytes, buildOutline, buildOutlineHtml, buildParagraphs, buildPresentationAudienceUrl, buildPreviewAnimation, buildPreviewElements, buildPrintDocument, buildPrintHtmlDocument, buildSaveSlides, buildSlideTemplateContent, buildSlideTemplateSlide, buildSlidesHtml, buildSlidesPdfBytes, buildSmartArt3DModel, buildSmartArtA11y, buildSmartArtPresetData, buildStrokeOutline, buildSummaryZoomView, buildSvgGradientDef, buildTableDataGrid, buildTextBlockStyle, buildTextBody3DSceneStyle, buildTextBodyLayoutStyle, buildTextBuildSpec, buildThemeColorGrid, buildThemeColorMap, buildUserFontFaceStyles, canAddTopLevelNode, canCommitActionType, canGoNext, canGoPrevious, canInteractWithElement, canRemoveTopLevelNode, canvasToJpegData, cellRunStyle, cellStyleToCss, centeredSvgTextLines, chartPartToAttrs, chartPreserveAspectRatio, clampCropValue, clampNotesFontSize, clampOptionNumber, clampPercent, clampSorterZoom, clampTransitionNumber, clampUnitInterval2 as clampUnitInterval, clampZoomScale, classifyExtraConnections, classifyMediaType, clearAllLocalViewerData, clearAudienceContent, clearLocalAwareness, clearMotionPath, clearStoredViewerPrefs, cloneElementForPaste, cloneHistorySnapshot, cloneSlide, cloneTemplateElementsBySlideId, collectConnectorSiteCandidates, collectImagePaths, collectMediaElements, collectUsedFonts, colorWithOpacity, commentTextSegments, comparePresentation, compileEquationTemplateMathMl, compileLatexEquation, computeAllNotesPages, computeChartLegendLayout, computeColorFilter, computeColumnBoundaries, computeDrawingViewBox, computeEntranceAnimationDelay, computeHandoutLayout, computeInlineEditorRect, computeKeyboardInset, computeMarqueeHitIds, computeMergeCellDown, computeMergeCellRight, computeResizedColumnWidths, computeResizedRowHeight, computeScrollDelta, computeSelectionRect, computeSlideIndices, computeSmartArtLayout2 as computeSmartArtLayout, computeSnapToShape, computeSplitCell, computeVirtualRange, convertLatexToOmml, convertOmmlToLatex, convertOmmlToMathMl, copyFormatFromElement, createBackstagePresentation, createBlankSlide, createCollaborationLivePatcher, createDefaultChartElement, createDepartureChannel, createInitialPresentationSnapshot, createPlainNotesSegments, createPresenceProjector, createPresentationKeyBuffer, createPresentationSessionId, createPresenterShowGuard, createPresenterTimer, createSyncGate, createTouchGestureRecognizer, createViewerOptionsStore, createViewerZoomStore, createWheelStepBuffer, customGeometryPathsToSvgSubpaths, defaultCssVars, defaultRadius, defaultThemeColors, deleteAutosaveSnapshot, deleteSection, deleteTableColumn, deleteTableRow, deleteTagFromCollections, demote, deriveSlideFieldContext, describeFontEmbedding, describeSmartArtBounds, detectOrientation, detectTouchDevice, discardAutosaveRecovery, distributeElements, downloadBlob, downloadDataUrl, editCommentInList, elementActionToPptxAction, elementLockTogglePatch, embeddedFontSaveOptions, encodeGif, endAudienceDisplay, ensureActionAffordanceStyles, ensureChartInteractionStyles, erasePresentationInkAt, escapeHtml22 as escapeHtml2, evenColumnWidths, evenRowHeights, exportDeckJson, extraQuickAccessCommands, extractPathPoints, filterCommands, filterInteractableIds, filterRenderedElements, findChartPartTarget, findConnectorSiteNear, findInSlides, findMediaElementByElementId, findSmartArtNodeText, firstShowSlideIndex, flattenNodes, flattenTagCollections, forgetSessionDeck, formatAxisValue, formatBackstageDate, formatBackstageSize, formatBytes, formatCommentTimestamp, formatElapsed, formatMobileElapsed, formatRelativeTime, formatSlideCounter, formatTime, formatVersionTimestamp, fpsToFrameIntervalMs, generateBroadcastRoomId, generateElementId, generateNoteLineCount, generatePackageReadme, generatePressureCircles, generateTicks, getAnimationInitialStyle, getAriaLabel, getAriaRole, getAriaRoleDescription, getCachedResult, getCalloutLeaderLineGeometry, getCalloutViewBoxBounds, getCellDiagonalBorders, getChartStylePalette, getCompoundLineOffsets, getCompoundLineWidths, getComputedEffectStyle, getComputedFillStyle, getComputedStrokeStyle, getConnectorEndpointHandles, getContentPartReplayStyles, getCurrentParagraphIndex, getDraggedShapeAdjustments, getDuotoneCachedResult, getElementLabel, getElementTransform, getElementTransformWithoutRotation, getGroupChildParentFill, getImageColorWashStyle, getImageEffectsFilter, getImageEffectsOpacity, getImageFitStyle, getImageSvgFilters, getImageTilingStyle, getInkReplayStyles, getInlineEditorSelection, getLocalStorageUsageSummary, getNotesPrintableArea, getOleBadgeLabel, getOleObjectTypeLabel, getOleTypeColor, getOleTypeLabel, getOverflowSegments, getPatternSvg, getPendingSelectionRestore, getPresetShapeClipPath, getPrintableArea, getResolvedShapeClipPath, getRoundRectRadiusPx2, getSessionTabId, getShapeAdjustmentHandleDescriptors, getShapeConnectionSites, getSlideBackgroundStyle, getSlideTransitionAnimations, getSoftEdgeSvgFilter, getSubstituteFontFamily, getSvgStrokeDasharray, getTableCellBandStyle, getTextBodyRotationTransform, getTextCompensationTransform, getWarpPath, groupElements, groupIntoParagraphs, groupSlidesBySection, guidePxToEmu, handleReadingViewKey, hasCopyableFormat, hasDistinctScriptFonts, hasPressureVariation, hasShapeProperties, hasShowSlideAfter, hasTextProperties, hexToRgbChannels2 as hexToRgbChannels, hiddenSlideCue, hollowTextFillStyle, inlineElementPointerEvents, insertTableColumn, insertTableRow, isActionHidden, isBlackboardActive, isBrowserOpenableMime, isCalloutShape, isCellInRect, isCurrentLayout, isEditableMotionPath, isEditableTextElement, isEditorTextInputTarget, isElementActionable, isElementLocked, isElementRendered, isExportAbortError, isHollowShapeElement, isImageLikeElement, isImageTiled, isInkElement, isKeyboardOpen, isLegacyBinaryPresentation, isLinkedTextBox, isMixedContentBlocked, isMobileViewport, isPpactionUrl, isPresentationAdvanceClick, isPresentationSessionMessage, isStrokeOnlyPresetElement, isSupportedPresentationFile, isTemplateElementId3 as isTemplateElementId, isUrlSafe, lastShowSlideIndex, listAutosaveSnapshots, listBackstageRecentFiles, loadAudienceContent, loadSessionDeck, makeCloneId, makeSlideId, mapEditingWheel, mapEditorKey, mapOutlineKey, mapPresentationKey, mapPresentationWheel, mapSlideSorterKey, masterViewBackgroundColor, masterViewElements, masterViewPseudoSlide, mayLeaveSlideShow, mediaFallbackIcon, mediaFallbackLabelKey, mediaFallbackVisual, mediaPlaybackAttributes, mediaTransportVisible, mergeAdditiveSelection, mergeCells, mergePresentationSnapshot, mergeShapes, mergeSlideTransition, mobileElapsedSince, mobileSlideCounter, morphOptionToMode, motionPathEndPixel, motionPathFamilyLabelKey, motionPathFor, motionPathPresetIdForPath, motionPathPresetLabelKey, motionPathPresetsByFamily, motionPathToSvgD, mountModel3D, movePresenterPointer, moveQuickAccessCommand, moveSectionDown, moveSectionUp, moveSlidesToSection, nestedTextDecorationStyle, newTableElement, nextPresentedSlide, nextShowSlideIndex, normalizeColorsForCapture, normalizeHexColor, normalizeSegments, normalizeStrokeDashType, notesSegmentsToSpans, observeYDocSlides, ooxmlGradientAngleToCssDegrees, openNativeEyeDropper, openPptxFile, openReadingView, openUrlInNewTab, paintedStrokeWidth, paragraphsToSegments, parseDrawingColor, parseDrawingColorOpacity, parsePanoseString, parsePpactionUrl, parseSegmentsFromRichEditor, partitionTemplateElements, patchChartData, pickSupportedMimeType, pieceLetterSpacing, placeAudienceWindow, placeCaretAtEnd, playSlideTransitionPreview, polygonsToSvgPath, pptxActionToElementAction, preprocessCssForCapture, presentationBaseName, presentationInkPath, presenterElapsed, presenterNextDisabled, presenterPaneAdvancesOnClick, presenterPrevDisabled, presenterTimerProgress, pressuresToWidths, previousShowSlideIndex, printPropertiesFrameSlides, printPropertiesSlidesPerPage, probeAutosaveRecovery, projectDrawingShapes, promote, publishLiveGeometry, publishLiveInlineText, quickStyleSwatchCss, reResolveSlideColors, readBackstageRecentFile, readRibbonTransitionDraft, readSlideShowOption, readSlidesFromYDoc, readStoredViewerPrefs, readViewportMetrics, readingViewFitScale, rebuildDrawingShapesIfCleared, rebuildTableStructureInRawXml, reconcileSlidesInYDoc, recordProgressPercent, rectToCells, redistributeColumnWidth, registerCollaborationTeardown, registerCustomFont, registerPersistentAudio, remapTextToSegments, rememberSessionDeck, removeChartCategory, removeChartSeries, removeCommentFromList, removeEmptyNode, removeLastTableElementColumn, removeLastTableElementRow, removeQuickAccessCommand, removeSmartArtNode, removeTableElementColumn, removeTableElementRow, renameSection, reorder2 as reorder, reorderAnimationTo, replaceMasterViewElements, replyToCommentInList, rerouteConnectorsForMovedElements, resetPresenterTimer, resetSlideLayoutPath, resolveActionType, resolveAudienceScreenPlacement, resolveAuthoredCustomShowId, resolveAutoAdvanceDelayMs, resolveAutoFitFontScale, resolveAutosaveActivation, resolveAutosaveIntervalMs, resolveAutosaveIntervalSeconds, resolveChartKind, resolveConnectorEndpointUpdate, resolveDefaultFontFamily, resolveDrawingShapeNodeId, resolveElementActionAffordance, resolveElementInteractivity, resolveFontForScript, resolveGroupChildFill, resolveInkColor, resolveInkOpacity, resolveInkWidth, resolveMetricTrackingPx, resolveOleType, resolvePalette, resolveProfileInitial, resolveSelectionPaneRename, resolveShapeGeometry, resolveShowSlideIndexes, resolveSlideSizeSelection, resolveTemplateBackgroundRows, resolveThemeCatalogEntry, resolveTitleBarStatusKey, resolveTransitionDurationMs, resolveTransportForServerUrl, resolveViewerAddinRows, restoreSegmentSelection, restoreSessionDeck, revealedSmartArtNodeCount, ribbonTransitionUpdates, rulerDragToGuidePosition, runMediaCommand, runPresentationAction, safeOpenUrl, sanitizeColor, sanitizeGradientStops, sanitizeMathMl, saveAutosaveSnapshot, saveDeckWithPassword, saveViewerProfile, savedPresentationFileName, scanAvailableFontFamilies, schemaLabel, scopeLayoutOptionsToSlide, segmentByScript, segmentFrameCount, segmentsToEditorHtml, segmentsToParagraphs, segmentsToPlainText, sendBackward, sendToBack, setCachedResult, setCellText, setChartAxisGridlineStyle, setChartAxisLogScale, setChartAxisTitleStyle, setChartCategoryLabel, setChartCellValue, setChartDataPointExplosion, setChartDataPointFill, setChartDataPointLabel, setChartDataPointMarker, setChartSeriesChartType, setChartSeriesMarker, setDuotoneCachedResult, setMasterViewBackgroundColor, setMotionPath, setMotionPathEnd, setPendingSelectionRestore, setSmartArtNodeStyle, setTableElementCellText, shapeFillChange, shapeOutlineChange, shouldAutoFollowBroadcaster, shouldCommitSmartArtNodeText, shouldConfirmExternalHyperlink, shouldLoopContinuously, shouldProbeAutosaveRecovery, shouldRoomSlidesReplaceLoad, shouldShowAutosaveRecoveryPrompt, shouldUseSvgWarp, shouldWriteAutosaveSnapshot, siblingCount, siblingIndex, slideProgressPercent, slideShowOptionChange, slideSizeFromPreset, slideSizeToCanvasPx, slideStatusLabel, snapBoxToGrid, splitCell, splitRunForMetrics, stepPresenterZoom, stopAllPersistentAudio, storeAudienceContent, strokeOutlineViewBox, styleShadowFilter, substituteFieldText, svgGradientFillRef, svgLineCap, svgPathToPolygons, swapPresentationWindows, switchSmartArtLayout, tableCellCss, tableContainerCss, templateSchemeFromTheme, text3dEmuToPt, text3dPtToEmu, textBuildSpanStyle, themeColorLabel, themeColorSchemesEqual, themeToCssVars, toCssTextOrientation, toCssVerticalDirection, toCssWritingMode, toSlideIndex, toggleBlackboard, toggleCommentResolvedInList, togglePresenterTimer, toggleSheet, toggleText3dExtrusion, transformTextCase, ungroupElements, updateCellTextInRawXml, updateCellTextStyleInRawXml, updateMasterViewElement, updateMergeAttrsInRawXml, updateSmartArtNodeText, updateTagInCollections, validateRoomId, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius, viewerOptionsToPreferences, warpPreviewPath, withChartTitle, withConnectorEndpointUpdate, withFrameSlides, withSlideSizeOrientation, withSlidesPerPage, writeStoredViewerPrefs };
135649
+ export { ACTION_BUTTON_PRESETS, ACTION_INDICATOR_CLASS, ACTION_INDICATOR_ICON_PATH, ARTISTIC_EFFECTS, AVATAR_COLOR_SWATCHES, BACKSTAGE_NAV, BACKSTAGE_TEMPLATES, BEVEL_PRESETS, BROADCAST_THROTTLE_MS, CATEGORIES, CHARACTER_SPACING_OPTIONS, COLOR_MAP_ALIAS_KEYS, COMMENT_MARKER_SIZE, COMMENT_MENTION_ATTRIBUTE, COMMENT_MENTION_CLASS, COMMON_FONTS, CONNECTION_TIMEOUT_MS, CONNECTOR_SITE_SNAP_PX, CUSTOM_FONT_ACCEPT, DEBOUNCE_MS, DEFAULT_BROADCAST_SERVER_URL, DEFAULT_COLOR_CHANGE_TOLERANCE, DEFAULT_COLOR_MAP, DEFAULT_FONT_FAMILY, DEFAULT_INSERT_CHART_KIND, DEFAULT_MOTION_PATH_PRESET_ID, DEFAULT_PALETTE2, DEFAULT_QUICK_ACCESS_COMMAND_IDS, DEFAULT_ROW_HEIGHT, DEFAULT_VIEWER_OPTIONS, DEFAULT_VIEWER_PROFILE, DEFAULT_VIRTUAL_OVERSCAN, DIRECTIONAL_PRESETS, DUOTONE_PRESETS, ELEMENT_ACTION_TYPE_OPTIONS, EMPHASIS_PRESET_VALUES, ENTRANCE_PRESET_VALUES, EQUATION_TEMPLATES, EXIT_PRESET_VALUES, EXPANDED_MAX_HEIGHT, EXPORT_ASSEMBLING_PERCENT, EXPORT_DONE_PERCENT, EncryptedFileError, FILL_MODE_OPTIONS, FILL_PATTERN_LABEL_KEYS, GRADIENT_TYPE_OPTIONS, HANDOUT_OPTIONS, HIDDEN_SLIDE_LABEL_KEY, HIDDEN_SLIDE_SLASH_GRADIENT, HIGHLIGHTER_COLORS, INDENT_PX, INK_REPLAY_KEYFRAMES, INSERT_CHART_TYPES, LBL, LINK_TOOLTIP_CLASS, LINK_TOOLTIP_HINT_CLASS, LINK_TOOLTIP_HOST_CLASS, LINK_TOOLTIP_LABEL_CLASS, LINK_TOOLTIP_PANEL_CLASS, LOCAL_SYNC_ORIGIN, MATERIAL_PRESETS, MAX_INDENT_LEVEL, MAX_ZOOM_SCALE, MEDIA_CHROME_ATTRIBUTE, MIN_ZOOM_SCALE, MOBILE_BREAKPOINT, MORPH_CROSSFADE_GROUP_STYLE, MORPH_CROSSFADE_HALF_STYLE, MOTION_PATH_FAMILIES, NOTES_FONT_SIZE_DEFAULT, NOTES_FONT_SIZE_MAX, NOTES_FONT_SIZE_MIN, NOTES_FONT_SIZE_STEP, NUM, OUTLINE_LEVEL_ATTR, OUTLINE_ROW_ATTR, OUTLINE_SLIDE_ATTR, OUTLINE_VIEW_ATTR, PATTERN_OPTIONS, PEN_COLORS, PPTX_OPEN_ACCEPT, PRESENTATION_CHANNEL_NAME, PRESENTATION_HASH, PRESENTATION_HIT_TEST_CSS, PRESENTATION_MESSAGE_ORIGIN, PRESENTATION_NONCE_KEY, PRESENTATION_OPEN_EXTENSIONS, PRESENTATION_STAGE_ATTRIBUTE, PRESENTER_CONSOLE_CLASSES, PRESENTER_CONSOLE_CONTROLS, PRESENTER_NAVIGATOR_LABEL_KEYS, PRESENT_TOOLBAR_CLASSES, PRESETS, PRESET_THEMES, PptxHandler, PptxMarkdownConverter, PresentationAnimationController, QUICK_ACCESS_COMMAND_CATALOG, READING_VIEW_ATTR, READING_VIEW_COUNTER_ATTR, READING_VIEW_STAGE_ATTR, RIBBON_SHAPE_SWATCHES, RIBBON_TRANSITION_PRESETS, RULER_FONT_SIZE, RULER_THICKNESS, SECTION_HEADING, SEL, SHAPE_PRESET_DEFS, SHAPE_QUICK_STYLES, SHORTCUT_REFERENCE_ITEMS, SLIDE_SHOW_OPTIONS, SLIDE_SIZE_PRESETS, SLIDE_TEMPLATES, SLIDE_TRANSITION_KEYFRAMES, SLIDE_TRANSITION_OPTIONS, SLIDE_VIRTUALIZATION_THRESHOLD, SMARTART_COLOR_SCHEME_LABEL_KEYS, SMARTART_STYLE_LABEL_KEYS, SORTER_MAX_ZOOM, SORTER_MIN_ZOOM, SORTER_ZOOM_STEP, STATUS_BAR_CLASSES, SWITCHABLE_LAYOUT_TYPES, SvgExporter, TABLET_BREAKPOINT, TABLE_STYLE_PRESETS, TAB_ROW_ACTION_CLASSES, TEXT_BUILD_ID_SEP, TEXT_WARP_PRESETS, THEME_CATALOG, THEME_COLOR_SCHEME_KEYS, THEME_COLOR_SLOT_LABEL_KEYS, THEME_PRESETS, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, TOOLBAR_TABS, TRANSITION_DIR_ARROWS, TRANSITION_ORIENTATION_TYPES, TRANSITION_VALID_DIRECTIONS, ThemePresets, VIEWER_OPTIONS_TABS, VIEWER_PREFS_STORAGE_KEY, VIEWER_SHORTCUT_REFERENCE, WEBM_MIME_CANDIDATES, acceptAutosaveRecovery, acceptsPresentationInput, actionAffordanceLabels, activateModalFocus, addChartCategory, addChartSeries, addCommentToList, addQuickAccessCommand, addSection, addSiblingAfter, addSmartArtNodeAsChild, addTagToCollections, advanceChartValueDrag, alignElements, animationEffectLabel, annotationOverlayZIndex, appendPresentationInkPoint, appendTableElementColumn, appendTableElementRow, apply3dEffects, applyAcceptAllSlides, applyAcceptSlide, applyCaseTransformToSegments, applyChartBuildReveal, applyChartPartHighlight, applyColorChange, applyDuotone, applyFindReplacements, applyFormatToElement, applyMotionPathPreset, applyOutlineEdit, applyPreferenceToOptions, applyReadingViewCommand, applyRehearsalTimings, applyReroutedConnectors, applyResize, applyStyleToSelectedSegments, applyTableStylePreset, applyThemeOverrideToSlide, applyThemeToData, attachPresentationVisibilityPause, authorConnectorBetweenSites, autosaveSnapshotMark, availableQuickAccessCommands, backstageCardsFor, beginChartValueDrag, beginShapeAdjustment, bringForward, bringToFront, build3DExtrusionData, buildActiveSessionUsers, buildAnimationTimelineBars, buildBarActions, buildBroadcastViewerUrl, buildCacheKey, buildCalloutLeaderLineSvgPath, buildChartViewModel, buildChromeStyle, buildCollaborationShareUrl, buildCommentMarkers, buildContextMenuEntries, buildCreateCollaborationConfig, buildCssGradientFromShapeStyle, buildDirectionGrid, buildDuotoneCacheKey, buildElementClipboardPayload, buildFieldSubstitutionContext, buildFontCatalog, buildHandoutsHtml, buildHollowHitOutline, buildInitialGuides, buildJoinCollaborationConfig, buildLayoutPreviewGeometry, buildMorphAnimationRules, buildMorphTransitionPlan, buildMotionPathPreview, buildNotesHtml, buildNotesPdfBytes, buildOutline, buildOutlineHtml, buildParagraphs, buildPresentationAudienceUrl, buildPreviewAnimation, buildPreviewElements, buildPrintDocument, buildPrintHtmlDocument, buildSaveSlides, buildSlideTemplateContent, buildSlideTemplateSlide, buildSlidesHtml, buildSlidesPdfBytes, buildSmartArt3DModel, buildSmartArtA11y, buildSmartArtPresetData, buildStrokeOutline, buildSummaryZoomView, buildSurfaceChart3DDataForElement, buildSvgGradientDef, buildTableDataGrid, buildTextBlockStyle, buildTextBody3DSceneStyle, buildTextBodyLayoutStyle, buildTextBuildSpec, buildThemeColorGrid, buildThemeColorMap, buildUserFontFaceStyles, canAddTopLevelNode, canCommitActionType, canGoNext, canGoPrevious, canInteractWithElement, canRemoveTopLevelNode, canvasToJpegData, cellRunStyle, cellStyleToCss, centeredSvgTextLines, chartPartToAttrs, chartPreserveAspectRatio, clampCropValue, clampNotesFontSize, clampOptionNumber, clampPercent, clampSorterZoom, clampTransitionNumber, clampUnitInterval2 as clampUnitInterval, clampZoomScale, classifyExtraConnections, classifyMediaType, clearAllLocalViewerData, clearAudienceContent, clearLocalAwareness, clearMotionPath, clearStoredViewerPrefs, cloneElementForPaste, cloneHistorySnapshot, cloneSlide, cloneTemplateElementsBySlideId, collectConnectorSiteCandidates, collectImagePaths, collectMediaElements, collectUsedFonts, colorWithOpacity, commentTextSegments, comparePresentation, compileEquationTemplateMathMl, compileLatexEquation, computeAllNotesPages, computeChartLegendLayout, computeColorFilter, computeColumnBoundaries, computeDrawingViewBox, computeEntranceAnimationDelay, computeHandoutLayout, computeInlineEditorRect, computeKeyboardInset, computeMarqueeHitIds, computeMergeCellDown, computeMergeCellRight, computeResizedColumnWidths, computeResizedRowHeight, computeScrollDelta, computeSelectionRect, computeSlideIndices, computeSmartArtLayout2 as computeSmartArtLayout, computeSnapToShape, computeSplitCell, computeVirtualRange, convertLatexToOmml, convertOmmlToLatex, convertOmmlToMathMl, copyFormatFromElement, createBackstagePresentation, createBlankSlide, createCollaborationLivePatcher, createDefaultChartElement, createDepartureChannel, createInitialPresentationSnapshot, createPlainNotesSegments, createPresenceProjector, createPresentationKeyBuffer, createPresentationSessionId, createPresenterShowGuard, createPresenterTimer, createSyncGate, createTouchGestureRecognizer, createViewerOptionsStore, createViewerZoomStore, createWheelStepBuffer, customGeometryPathsToSvgSubpaths, defaultCssVars, defaultRadius, defaultThemeColors, deleteAutosaveSnapshot, deleteSection, deleteTableColumn, deleteTableRow, deleteTagFromCollections, demote, deriveSlideFieldContext, describeFontEmbedding, describeSmartArtBounds, detectOrientation, detectTouchDevice, discardAutosaveRecovery, distributeElements, downloadBlob, downloadDataUrl, editCommentInList, elementActionToPptxAction, elementLockTogglePatch, embeddedFontSaveOptions, encodeGif, endAudienceDisplay, ensureActionAffordanceStyles, ensureChartInteractionStyles, erasePresentationInkAt, escapeHtml22 as escapeHtml2, evenColumnWidths, evenRowHeights, exportDeckJson, extraQuickAccessCommands, extractPathPoints, filterCommands, filterInteractableIds, filterRenderedElements, findChartPartTarget, findConnectorSiteNear, findInSlides, findMediaElementByElementId, findSmartArtNodeText, firstShowSlideIndex, flattenNodes, flattenTagCollections, forgetSessionDeck, formatAxisValue, formatBackstageDate, formatBackstageSize, formatBytes, formatCommentTimestamp, formatElapsed, formatMobileElapsed, formatRelativeTime, formatSlideCounter, formatTime, formatVersionTimestamp, fpsToFrameIntervalMs, generateBroadcastRoomId, generateElementId, generateNoteLineCount, generatePackageReadme, generatePressureCircles, generateTicks, getAnimationInitialStyle, getAriaLabel, getAriaRole, getAriaRoleDescription, getCachedResult, getCalloutLeaderLineGeometry, getCalloutViewBoxBounds, getCellDiagonalBorders, getChartStylePalette, getCompoundLineOffsets, getCompoundLineWidths, getComputedEffectStyle, getComputedFillStyle, getComputedStrokeStyle, getConnectorEndpointHandles, getContentPartReplayStyles, getCurrentParagraphIndex, getDraggedShapeAdjustments, getDuotoneCachedResult, getElementLabel, getElementTransform, getElementTransformWithoutRotation, getGroupChildParentFill, getImageColorWashStyle, getImageEffectsFilter, getImageEffectsOpacity, getImageFitStyle, getImageSvgFilters, getImageTilingStyle, getInkReplayStyles, getInlineEditorSelection, getLocalStorageUsageSummary, getNotesPrintableArea, getOleBadgeLabel, getOleObjectTypeLabel, getOleTypeColor, getOleTypeLabel, getOverflowSegments, getPatternSvg, getPendingSelectionRestore, getPresetShapeClipPath, getPrintableArea, getResolvedShapeClipPath, getRoundRectRadiusPx2, getSessionTabId, getShapeAdjustmentHandleDescriptors, getShapeConnectionSites, getSlideBackgroundStyle, getSlideTransitionAnimations, getSoftEdgeSvgFilter, getSubstituteFontFamily, getSvgStrokeDasharray, getTableCellBandStyle, getTextBodyRotationTransform, getTextCompensationTransform, getWarpPath, groupElements, groupIntoParagraphs, groupSlidesBySection, guidePxToEmu, handleReadingViewKey, hasCopyableFormat, hasDistinctScriptFonts, hasPressureVariation, hasShapeProperties, hasShowSlideAfter, hasTextProperties, hexToRgbChannels2 as hexToRgbChannels, hiddenSlideCue, hollowTextFillStyle, inlineElementPointerEvents, insertTableColumn, insertTableRow, isActionHidden, isBlackboardActive, isBrowserOpenableMime, isCalloutShape, isCellInRect, isCurrentLayout, isEditableMotionPath, isEditableTextElement, isEditorTextInputTarget, isElementActionable, isElementLocked, isElementRendered, isExportAbortError, isHollowShapeElement, isImageLikeElement, isImageTiled, isInkElement, isKeyboardOpen, isLegacyBinaryPresentation, isLinkedTextBox, isMixedContentBlocked, isMobileViewport, isPpactionUrl, isPresentationAdvanceClick, isPresentationSessionMessage, isStrokeOnlyPresetElement, isSupportedPresentationFile, isTemplateElementId3 as isTemplateElementId, isUrlSafe, lastShowSlideIndex, listAutosaveSnapshots, listBackstageRecentFiles, loadAudienceContent, loadSessionDeck, makeCloneId, makeSlideId, mapEditingWheel, mapEditorKey, mapOutlineKey, mapPresentationKey, mapPresentationWheel, mapSlideSorterKey, masterViewBackgroundColor, masterViewElements, masterViewPseudoSlide, mayLeaveSlideShow, mediaFallbackIcon, mediaFallbackLabelKey, mediaFallbackVisual, mediaPlaybackAttributes, mediaTransportVisible, mergeAdditiveSelection, mergeCells, mergePresentationSnapshot, mergeShapes, mergeSlideTransition, mobileElapsedSince, mobileSlideCounter, morphOptionToMode, motionPathEndPixel, motionPathFamilyLabelKey, motionPathFor, motionPathPresetIdForPath, motionPathPresetLabelKey, motionPathPresetsByFamily, motionPathToSvgD, mountModel3D, mountSurfaceChart3D, movePresenterPointer, moveQuickAccessCommand, moveSectionDown, moveSectionUp, moveSlidesToSection, nestedTextDecorationStyle, newTableElement, nextPresentedSlide, nextShowSlideIndex, normalizeColorsForCapture, normalizeHexColor, normalizeSegments, normalizeStrokeDashType, notesSegmentsToSpans, observeYDocSlides, ooxmlGradientAngleToCssDegrees, openNativeEyeDropper, openPptxFile, openReadingView, openUrlInNewTab, paintedStrokeWidth, paragraphsToSegments, parseDrawingColor, parseDrawingColorOpacity, parsePanoseString, parsePpactionUrl, parseSegmentsFromRichEditor, partitionTemplateElements, patchChartData, pickSupportedMimeType, pieceLetterSpacing, placeAudienceWindow, placeCaretAtEnd, playSlideTransitionPreview, polygonsToSvgPath, pptxActionToElementAction, preprocessCssForCapture, presentationBaseName, presentationInkPath, presenterElapsed, presenterNextDisabled, presenterPaneAdvancesOnClick, presenterPrevDisabled, presenterTimerProgress, pressuresToWidths, previousShowSlideIndex, printPropertiesFrameSlides, printPropertiesSlidesPerPage, probeAutosaveRecovery, projectDrawingShapes, promote, publishLiveGeometry, publishLiveInlineText, quickStyleSwatchCss, reResolveSlideColors, readBackstageRecentFile, readRibbonTransitionDraft, readSlideShowOption, readSlidesFromYDoc, readStoredViewerPrefs, readViewportMetrics, readingViewFitScale, rebuildDrawingShapesIfCleared, rebuildTableStructureInRawXml, reconcileSlidesInYDoc, recordProgressPercent, rectToCells, redistributeColumnWidth, registerCollaborationTeardown, registerCustomFont, registerPersistentAudio, remapTextToSegments, rememberSessionDeck, removeChartCategory, removeChartSeries, removeCommentFromList, removeEmptyNode, removeLastTableElementColumn, removeLastTableElementRow, removeQuickAccessCommand, removeSmartArtNode, removeTableElementColumn, removeTableElementRow, renameSection, reorder2 as reorder, reorderAnimationTo, replaceMasterViewElements, replyToCommentInList, rerouteConnectorsForMovedElements, resetPresenterTimer, resetSlideLayoutPath, resolveActionType, resolveAudienceScreenPlacement, resolveAuthoredCustomShowId, resolveAutoAdvanceDelayMs, resolveAutoFitFontScale, resolveAutosaveActivation, resolveAutosaveIntervalMs, resolveAutosaveIntervalSeconds, resolveChartKind, resolveConnectorEndpointUpdate, resolveDefaultFontFamily, resolveDrawingShapeNodeId, resolveElementActionAffordance, resolveElementInteractivity, resolveFontForScript, resolveGroupChildFill, resolveInkColor, resolveInkOpacity, resolveInkWidth, resolveMetricTrackingPx, resolveOleType, resolvePalette, resolveProfileInitial, resolveSelectionPaneRename, resolveShapeGeometry, resolveShowSlideIndexes, resolveSlideSizeSelection, resolveTemplateBackgroundRows, resolveThemeCatalogEntry, resolveTitleBarStatusKey, resolveTransitionDurationMs, resolveTransportForServerUrl, resolveViewerAddinRows, restoreSegmentSelection, restoreSessionDeck, revealedSmartArtNodeCount, ribbonTransitionUpdates, rulerDragToGuidePosition, runMediaCommand, runPresentationAction, safeOpenUrl, sanitizeColor, sanitizeGradientStops, sanitizeMathMl, saveAutosaveSnapshot, saveDeckWithPassword, saveViewerProfile, savedPresentationFileName, scanAvailableFontFamilies, schemaLabel, scopeLayoutOptionsToSlide, segmentByScript, segmentFrameCount, segmentsToEditorHtml, segmentsToParagraphs, segmentsToPlainText, sendBackward, sendToBack, setCachedResult, setCellText, setChartAxisGridlineStyle, setChartAxisLogScale, setChartAxisTitleStyle, setChartCategoryLabel, setChartCellValue, setChartDataPointExplosion, setChartDataPointFill, setChartDataPointLabel, setChartDataPointMarker, setChartSeriesChartType, setChartSeriesMarker, setDuotoneCachedResult, setMasterViewBackgroundColor, setMotionPath, setMotionPathEnd, setPendingSelectionRestore, setSmartArtNodeStyle, setTableElementCellText, shapeFillChange, shapeOutlineChange, shouldAutoFollowBroadcaster, shouldCommitSmartArtNodeText, shouldConfirmExternalHyperlink, shouldLoopContinuously, shouldProbeAutosaveRecovery, shouldRoomSlidesReplaceLoad, shouldShowAutosaveRecoveryPrompt, shouldUseSvgWarp, shouldWriteAutosaveSnapshot, siblingCount, siblingIndex, slideProgressPercent, slideShowOptionChange, slideSizeFromPreset, slideSizeToCanvasPx, slideStatusLabel, snapBoxToGrid, splitCell, splitRunForMetrics, stepPresenterZoom, stopAllPersistentAudio, storeAudienceContent, strokeOutlineViewBox, styleShadowFilter, substituteFieldText, svgGradientFillRef, svgLineCap, svgPathToPolygons, swapPresentationWindows, switchSmartArtLayout, tableCellCss, tableContainerCss, templateSchemeFromTheme, text3dEmuToPt, text3dPtToEmu, textBuildSpanStyle, themeColorLabel, themeColorSchemesEqual, themeToCssVars, toCssTextOrientation, toCssVerticalDirection, toCssWritingMode, toSlideIndex, toggleBlackboard, toggleCommentResolvedInList, togglePresenterTimer, toggleSheet, toggleText3dExtrusion, transformTextCase, ungroupElements, updateCellTextInRawXml, updateCellTextStyleInRawXml, updateMasterViewElement, updateMergeAttrsInRawXml, updateSmartArtNodeText, updateTagInCollections, validateRoomId, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius, viewerOptionsToPreferences, warpPreviewPath, withChartTitle, withConnectorEndpointUpdate, withFrameSlides, withSlideSizeOrientation, withSlidesPerPage, writeStoredViewerPrefs };