pptx-react-viewer 3.1.2 → 3.1.4

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 (154) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/{AiChatPanel-UCFQIWOQ.mjs → AiChatPanel-ITCVRVKP.mjs} +3 -3
  3. package/dist/AiChatPanel-ITCVRVKP.mjs.br +0 -0
  4. package/dist/AiChatPanel-ITCVRVKP.mjs.gz +0 -0
  5. package/dist/{AiChatPanel-4EYZDQXM.js → AiChatPanel-TO5PHBGW.js} +23 -23
  6. package/dist/AiChatPanel-TO5PHBGW.js.br +0 -0
  7. package/dist/AiChatPanel-TO5PHBGW.js.gz +0 -0
  8. package/dist/{Area3DChartScene-YBMC6NKY.js → Area3DChartScene-2UNQ3J3V.js} +2 -2
  9. package/dist/Area3DChartScene-2UNQ3J3V.js.br +0 -0
  10. package/dist/Area3DChartScene-2UNQ3J3V.js.gz +0 -0
  11. package/dist/{Area3DChartScene-PMYXO4MR.mjs → Area3DChartScene-7PHPDOTG.mjs} +1 -1
  12. package/dist/Area3DChartScene-7PHPDOTG.mjs.br +0 -0
  13. package/dist/Area3DChartScene-7PHPDOTG.mjs.gz +0 -0
  14. package/dist/{Bar3DChartScene-CEOI6SU6.mjs → Bar3DChartScene-BLPUHYRZ.mjs} +1 -1
  15. package/dist/Bar3DChartScene-BLPUHYRZ.mjs.br +0 -0
  16. package/dist/Bar3DChartScene-BLPUHYRZ.mjs.gz +0 -0
  17. package/dist/{Bar3DChartScene-75DCA2ZA.js → Bar3DChartScene-MC5S3AGT.js} +2 -2
  18. package/dist/Bar3DChartScene-MC5S3AGT.js.br +0 -0
  19. package/dist/Bar3DChartScene-MC5S3AGT.js.gz +0 -0
  20. package/dist/{Line3DChartScene-STGX6N6V.js → Line3DChartScene-JVVZRIDD.js} +2 -2
  21. package/dist/Line3DChartScene-JVVZRIDD.js.br +0 -0
  22. package/dist/Line3DChartScene-JVVZRIDD.js.gz +0 -0
  23. package/dist/{Line3DChartScene-EZZKWUZR.mjs → Line3DChartScene-L5B4YFG3.mjs} +1 -1
  24. package/dist/Line3DChartScene-L5B4YFG3.mjs.br +0 -0
  25. package/dist/Line3DChartScene-L5B4YFG3.mjs.gz +0 -0
  26. package/dist/{Model3DScene-FGQJKWL6.mjs → Model3DScene-6TNWS5LV.mjs} +1 -1
  27. package/dist/Model3DScene-6TNWS5LV.mjs.br +0 -0
  28. package/dist/Model3DScene-6TNWS5LV.mjs.gz +0 -0
  29. package/dist/{Model3DScene-DWRD63FH.js → Model3DScene-LRDNQNKJ.js} +2 -2
  30. package/dist/Model3DScene-LRDNQNKJ.js.br +0 -0
  31. package/dist/Model3DScene-LRDNQNKJ.js.gz +0 -0
  32. package/dist/{PieChart3DScene-R3Y7OVVO.js → PieChart3DScene-PZWZCXHX.js} +2 -2
  33. package/dist/PieChart3DScene-PZWZCXHX.js.br +0 -0
  34. package/dist/PieChart3DScene-PZWZCXHX.js.gz +0 -0
  35. package/dist/{PieChart3DScene-DH6RSJO6.mjs → PieChart3DScene-XXAIVP4I.mjs} +1 -1
  36. package/dist/PieChart3DScene-XXAIVP4I.mjs.br +0 -0
  37. package/dist/PieChart3DScene-XXAIVP4I.mjs.gz +0 -0
  38. package/dist/{SurfaceChart3DScene-BMBU5RKI.mjs → SurfaceChart3DScene-CRUGJSCY.mjs} +1 -1
  39. package/dist/SurfaceChart3DScene-CRUGJSCY.mjs.br +1 -0
  40. package/dist/SurfaceChart3DScene-CRUGJSCY.mjs.gz +0 -0
  41. package/dist/{SurfaceChart3DScene-UM5HA3VO.js → SurfaceChart3DScene-UBQV3ZN2.js} +2 -2
  42. package/dist/SurfaceChart3DScene-UBQV3ZN2.js.br +0 -0
  43. package/dist/SurfaceChart3DScene-UBQV3ZN2.js.gz +0 -0
  44. package/dist/UTIF-LAD5QYGQ.mjs +6400 -0
  45. package/dist/UTIF-LAD5QYGQ.mjs.br +0 -0
  46. package/dist/UTIF-LAD5QYGQ.mjs.gz +0 -0
  47. package/dist/UTIF-POYWAAGO.js +6402 -0
  48. package/dist/UTIF-POYWAAGO.js.br +0 -0
  49. package/dist/UTIF-POYWAAGO.js.gz +0 -0
  50. package/dist/{chunk-VLLZ3QL2.mjs → chunk-57MGKBJ4.mjs} +284 -81
  51. package/dist/chunk-57MGKBJ4.mjs.br +0 -0
  52. package/dist/chunk-57MGKBJ4.mjs.gz +0 -0
  53. package/dist/{chunk-4VVOTEQ4.mjs → chunk-A2UAUSJM.mjs} +114 -8
  54. package/dist/chunk-A2UAUSJM.mjs.br +0 -0
  55. package/dist/chunk-A2UAUSJM.mjs.gz +0 -0
  56. package/dist/{chunk-W3J6SNVE.mjs → chunk-BPWSJLLG.mjs} +158 -29
  57. package/dist/chunk-BPWSJLLG.mjs.br +0 -0
  58. package/dist/chunk-BPWSJLLG.mjs.gz +0 -0
  59. package/dist/{chunk-YNUYFR2T.js → chunk-LGVNUG3G.js} +3 -3
  60. package/dist/chunk-LGVNUG3G.js.br +0 -0
  61. package/dist/chunk-LGVNUG3G.js.gz +0 -0
  62. package/dist/{chunk-WVIKFMNS.js → chunk-LXYDXLKZ.js} +511 -405
  63. package/dist/chunk-LXYDXLKZ.js.br +0 -0
  64. package/dist/chunk-LXYDXLKZ.js.gz +0 -0
  65. package/dist/{chunk-O5DKWJDK.mjs → chunk-QOLYY7E3.mjs} +1 -1
  66. package/dist/chunk-QOLYY7E3.mjs.br +0 -0
  67. package/dist/chunk-QOLYY7E3.mjs.gz +0 -0
  68. package/dist/{chunk-2HLDBQH7.js → chunk-T2QG2HD5.js} +302 -171
  69. package/dist/chunk-T2QG2HD5.js.br +0 -0
  70. package/dist/chunk-T2QG2HD5.js.gz +0 -0
  71. package/dist/{chunk-MQEG5GOV.js → chunk-T44LBKF6.js} +1373 -1170
  72. package/dist/chunk-T44LBKF6.js.br +0 -0
  73. package/dist/chunk-T44LBKF6.js.gz +0 -0
  74. package/dist/{chunk-S546O4W2.mjs → chunk-XIHK52SB.mjs} +1526 -342
  75. package/dist/chunk-XIHK52SB.mjs.br +0 -0
  76. package/dist/chunk-XIHK52SB.mjs.gz +0 -0
  77. package/dist/{chunk-7ZQ2FZXE.js → chunk-YDEEINER.js} +1529 -344
  78. package/dist/chunk-YDEEINER.js.br +0 -0
  79. package/dist/chunk-YDEEINER.js.gz +0 -0
  80. package/dist/index.d.ts +139 -3
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +49 -49
  83. package/dist/index.js.br +0 -0
  84. package/dist/index.js.gz +0 -0
  85. package/dist/index.mjs +5 -5
  86. package/dist/index.mjs.br +0 -0
  87. package/dist/index.mjs.gz +0 -0
  88. package/dist/internals.d.ts +139 -3
  89. package/dist/internals.d.ts.map +1 -1
  90. package/dist/internals.js +78 -78
  91. package/dist/internals.js.br +0 -0
  92. package/dist/internals.js.gz +0 -0
  93. package/dist/internals.mjs +3 -3
  94. package/dist/internals.mjs.br +0 -0
  95. package/dist/internals.mjs.gz +0 -0
  96. package/dist/pptx-viewer.css +1 -1
  97. package/dist/pptx-viewer.css.br +0 -0
  98. package/dist/pptx-viewer.css.gz +0 -0
  99. package/dist/viewer/index.d.ts +139 -3
  100. package/dist/viewer/index.js +26 -26
  101. package/dist/viewer/index.js.br +0 -0
  102. package/dist/viewer/index.js.gz +0 -0
  103. package/dist/viewer/index.mjs +5 -5
  104. package/dist/viewer/index.mjs.br +0 -0
  105. package/dist/viewer/index.mjs.gz +0 -0
  106. package/package.json +2 -2
  107. package/dist/AiChatPanel-4EYZDQXM.js.br +0 -0
  108. package/dist/AiChatPanel-4EYZDQXM.js.gz +0 -0
  109. package/dist/AiChatPanel-UCFQIWOQ.mjs.br +0 -0
  110. package/dist/AiChatPanel-UCFQIWOQ.mjs.gz +0 -0
  111. package/dist/Area3DChartScene-PMYXO4MR.mjs.br +0 -0
  112. package/dist/Area3DChartScene-PMYXO4MR.mjs.gz +0 -0
  113. package/dist/Area3DChartScene-YBMC6NKY.js.br +0 -0
  114. package/dist/Area3DChartScene-YBMC6NKY.js.gz +0 -0
  115. package/dist/Bar3DChartScene-75DCA2ZA.js.br +0 -0
  116. package/dist/Bar3DChartScene-75DCA2ZA.js.gz +0 -0
  117. package/dist/Bar3DChartScene-CEOI6SU6.mjs.br +0 -0
  118. package/dist/Bar3DChartScene-CEOI6SU6.mjs.gz +0 -0
  119. package/dist/Line3DChartScene-EZZKWUZR.mjs.br +0 -0
  120. package/dist/Line3DChartScene-EZZKWUZR.mjs.gz +0 -0
  121. package/dist/Line3DChartScene-STGX6N6V.js.br +0 -0
  122. package/dist/Line3DChartScene-STGX6N6V.js.gz +0 -0
  123. package/dist/Model3DScene-DWRD63FH.js.br +0 -0
  124. package/dist/Model3DScene-DWRD63FH.js.gz +0 -0
  125. package/dist/Model3DScene-FGQJKWL6.mjs.br +0 -0
  126. package/dist/Model3DScene-FGQJKWL6.mjs.gz +0 -0
  127. package/dist/PieChart3DScene-DH6RSJO6.mjs.br +0 -0
  128. package/dist/PieChart3DScene-DH6RSJO6.mjs.gz +0 -0
  129. package/dist/PieChart3DScene-R3Y7OVVO.js.br +0 -0
  130. package/dist/PieChart3DScene-R3Y7OVVO.js.gz +0 -0
  131. package/dist/SurfaceChart3DScene-BMBU5RKI.mjs.br +0 -0
  132. package/dist/SurfaceChart3DScene-BMBU5RKI.mjs.gz +0 -0
  133. package/dist/SurfaceChart3DScene-UM5HA3VO.js.br +0 -0
  134. package/dist/SurfaceChart3DScene-UM5HA3VO.js.gz +0 -0
  135. package/dist/chunk-2HLDBQH7.js.br +0 -0
  136. package/dist/chunk-2HLDBQH7.js.gz +0 -0
  137. package/dist/chunk-4VVOTEQ4.mjs.br +0 -0
  138. package/dist/chunk-4VVOTEQ4.mjs.gz +0 -0
  139. package/dist/chunk-7ZQ2FZXE.js.br +0 -0
  140. package/dist/chunk-7ZQ2FZXE.js.gz +0 -0
  141. package/dist/chunk-MQEG5GOV.js.br +0 -0
  142. package/dist/chunk-MQEG5GOV.js.gz +0 -0
  143. package/dist/chunk-O5DKWJDK.mjs.br +0 -0
  144. package/dist/chunk-O5DKWJDK.mjs.gz +0 -0
  145. package/dist/chunk-S546O4W2.mjs.br +0 -0
  146. package/dist/chunk-S546O4W2.mjs.gz +0 -0
  147. package/dist/chunk-VLLZ3QL2.mjs.br +0 -0
  148. package/dist/chunk-VLLZ3QL2.mjs.gz +0 -0
  149. package/dist/chunk-W3J6SNVE.mjs.br +0 -0
  150. package/dist/chunk-W3J6SNVE.mjs.gz +0 -0
  151. package/dist/chunk-WVIKFMNS.js.br +0 -0
  152. package/dist/chunk-WVIKFMNS.js.gz +0 -0
  153. package/dist/chunk-YNUYFR2T.js.br +0 -0
  154. package/dist/chunk-YNUYFR2T.js.gz +0 -0
@@ -7021,6 +7021,7 @@ var SLIDE_FIELD_KIND = {
7021
7021
  elements: "nested",
7022
7022
  backgroundColor: "scalar",
7023
7023
  backgroundImage: "scalar",
7024
+ backgroundImageProperties: "complex",
7024
7025
  backgroundGradient: "scalar",
7025
7026
  backgroundPattern: "complex",
7026
7027
  backgroundShadeToTitle: "scalar",
@@ -17829,6 +17830,31 @@ function parseDrawingHueDegrees(value) {
17829
17830
  }
17830
17831
  return parsed / 6e4;
17831
17832
  }
17833
+ var TEXT_ORIENTATION_IDENTITY = [1, 0, 0, 1];
17834
+ function isTextOrientationMatrix(value) {
17835
+ return Array.isArray(value) && value.length === 4 && value.every((entry2) => typeof entry2 === "number" && Number.isFinite(entry2));
17836
+ }
17837
+ function multiplyTextOrientationMatrices(left, right) {
17838
+ return [
17839
+ left[0] * right[0] + left[2] * right[1],
17840
+ left[1] * right[0] + left[3] * right[1],
17841
+ left[0] * right[2] + left[2] * right[3],
17842
+ left[1] * right[2] + left[3] * right[3]
17843
+ ];
17844
+ }
17845
+ function getElementOrientationMatrix(element) {
17846
+ const radians = (Number(element.rotation) || 0) * Math.PI / 180;
17847
+ const cosine = Math.cos(radians);
17848
+ const sine = Math.sin(radians);
17849
+ const rotation = [cosine, sine, -sine, cosine];
17850
+ const flip = [
17851
+ element.flipHorizontal ? -1 : 1,
17852
+ 0,
17853
+ 0,
17854
+ element.flipVertical ? -1 : 1
17855
+ ];
17856
+ return multiplyTextOrientationMatrices(rotation, flip);
17857
+ }
17832
17858
  function parseBoolean(value) {
17833
17859
  if (value === true || value === "1" || value === "true") {
17834
17860
  return true;
@@ -19660,6 +19686,21 @@ function serializePlaceholderLevelStyle(style, existing) {
19660
19686
  if (style.indent !== void 0) {
19661
19687
  attrEdits.indent = String(Math.round(style.indent * EMU_PER_PX));
19662
19688
  }
19689
+ if (style.defaultTabSize !== void 0) {
19690
+ attrEdits.defTabSz = String(Math.round(style.defaultTabSize * EMU_PER_PX));
19691
+ }
19692
+ if (style.eaLineBreak !== void 0) {
19693
+ attrEdits.eaLnBrk = style.eaLineBreak ? "1" : "0";
19694
+ }
19695
+ if (style.latinLineBreak !== void 0) {
19696
+ attrEdits.latinLnBrk = style.latinLineBreak ? "1" : "0";
19697
+ }
19698
+ if (style.fontAlignment !== void 0) {
19699
+ attrEdits.fontAlgn = style.fontAlignment;
19700
+ }
19701
+ if (style.hangingPunctuation !== void 0) {
19702
+ attrEdits.hangingPunct = style.hangingPunctuation ? "1" : "0";
19703
+ }
19663
19704
  const childEdits = /* @__PURE__ */ new Map();
19664
19705
  if (style.lineSpacing !== void 0) {
19665
19706
  childEdits.set("a:lnSpc", {
@@ -26996,7 +27037,7 @@ function parseRunFontElements(rPr) {
26996
27037
  const latin = rPr["a:latin"];
26997
27038
  const eastAsian = rPr["a:ea"];
26998
27039
  const complexScript = rPr["a:cs"];
26999
- const chosenTypeface = latin?.["@_typeface"] || eastAsian?.["@_typeface"] || complexScript?.["@_typeface"];
27040
+ const chosenTypeface = latin?.["@_typeface"];
27000
27041
  if (typeof chosenTypeface === "string" && chosenTypeface.trim().length > 0) {
27001
27042
  result.fontFamily = chosenTypeface.trim();
27002
27043
  }
@@ -35374,6 +35415,13 @@ var FONT_SUBSTITUTION_MAP = {
35374
35415
  NSimSun: ["Noto Serif CJK SC", "STSong", "serif"],
35375
35416
  FangSong: ["Noto Serif CJK SC", "STFangsong", "serif"],
35376
35417
  KaiTi: ["Noto Serif CJK SC", "STKaiti", "serif"],
35418
+ DengXian: ["Microsoft YaHei", "PingFang SC", "Noto Sans CJK SC", "sans-serif"],
35419
+ \u7B49\u7EBF: ["DengXian", "Microsoft YaHei", "PingFang SC", "Noto Sans CJK SC", "sans-serif"],
35420
+ \u5B8B\u4F53: ["SimSun", "Songti SC", "STSong", "Noto Serif CJK SC", "serif"],
35421
+ \u65B0\u5B8B\u4F53: ["NSimSun", "Songti SC", "STSong", "Noto Serif CJK SC", "serif"],
35422
+ \u9ED1\u4F53: ["SimHei", "Heiti SC", "STHeiti", "PingFang SC", "Noto Sans CJK SC", "sans-serif"],
35423
+ \u4EFF\u5B8B: ["FangSong", "STFangsong", "Songti SC", "Noto Serif CJK SC", "serif"],
35424
+ \u6977\u4F53: ["KaiTi", "Kaiti SC", "STKaiti", "Noto Serif CJK SC", "serif"],
35377
35425
  Batang: ["Noto Serif CJK KR", "AppleMyungjo", "serif"],
35378
35426
  Dotum: ["Noto Sans CJK KR", "AppleGothic", "sans-serif"],
35379
35427
  Gulim: ["Noto Sans CJK KR", "AppleGothic", "sans-serif"],
@@ -43095,7 +43143,12 @@ function parseTimeTargetElement(tgtEl) {
43095
43143
  const rawXml = tgtEl;
43096
43144
  const shape = tgtEl["p:spTgt"];
43097
43145
  if (shape?.["@_spid"] !== void 0) {
43098
- return { type: "shape", shapeId: String(shape["@_spid"]), rawXml };
43146
+ return {
43147
+ type: "shape",
43148
+ shapeId: String(shape["@_spid"]),
43149
+ ...shape["p:bg"] !== void 0 ? { backgroundOnly: true } : {},
43150
+ rawXml
43151
+ };
43099
43152
  }
43100
43153
  if (tgtEl["p:sldTgt"] !== void 0) {
43101
43154
  return { type: "slide", rawXml };
@@ -43262,7 +43315,11 @@ function extractColorAnimation(childTnList) {
43262
43315
  if (animClrNodes.length === 0) {
43263
43316
  return void 0;
43264
43317
  }
43265
- const node = animClrNodes[0];
43318
+ const components = animClrNodes.map(extractSingleColorAnimation);
43319
+ const primary = components[0];
43320
+ return components.length > 1 ? { ...primary, components } : primary;
43321
+ }
43322
+ function extractSingleColorAnimation(node) {
43266
43323
  const clrSpc = String(node["@_clrSpc"] || "rgb").toLowerCase();
43267
43324
  const colorSpace = clrSpc === "hsl" ? "hsl" : "rgb";
43268
43325
  const dir = String(node["@_dir"] || "").toLowerCase();
@@ -43270,7 +43327,9 @@ function extractColorAnimation(childTnList) {
43270
43327
  const path = node["@_path"] !== void 0 ? String(node["@_path"]) : void 0;
43271
43328
  const fromColor = extractColorValue(node["p:from"]);
43272
43329
  const toColor = extractColorValue(node["p:to"]);
43273
- const byColor = extractHslDeltaOrColorValue(node["p:by"], colorSpace);
43330
+ const byContainer = node["p:by"];
43331
+ const byColor = extractHslDeltaOrColorValue(byContainer, colorSpace);
43332
+ const hslDelta = colorSpace === "hsl" ? extractHslDelta(byContainer) : void 0;
43274
43333
  const targetAttribute = extractAttrNameFromCBhvr(node["p:cBhvr"]);
43275
43334
  return {
43276
43335
  colorSpace,
@@ -43279,9 +43338,21 @@ function extractColorAnimation(childTnList) {
43279
43338
  fromColor,
43280
43339
  toColor,
43281
43340
  byColor,
43341
+ hslDelta,
43282
43342
  targetAttribute
43283
43343
  };
43284
43344
  }
43345
+ function extractHslDelta(colorContainer) {
43346
+ const hsl = colorContainer?.["p:hsl"];
43347
+ if (!hsl) {
43348
+ return void 0;
43349
+ }
43350
+ return {
43351
+ hue: Number(hsl["@_h"] ?? 0) / 6e4,
43352
+ saturation: Number(hsl["@_s"] ?? 0) / 1e3,
43353
+ lightness: Number(hsl["@_l"] ?? 0) / 1e3
43354
+ };
43355
+ }
43285
43356
  function extractHslDeltaOrColorValue(colorContainer, colorSpace) {
43286
43357
  if (!colorContainer) {
43287
43358
  return void 0;
@@ -43604,6 +43675,9 @@ function extractChildMotionValues(childTnList) {
43604
43675
  const motionPathRotateAuto = void 0;
43605
43676
  let motionPathEditMode;
43606
43677
  let motionPtsTypes;
43678
+ let motionPathRotationAngle;
43679
+ let motionPathRotationCenterX;
43680
+ let motionPathRotationCenterY;
43607
43681
  let rotationBy;
43608
43682
  let rotationFrom;
43609
43683
  let rotationTo;
@@ -43621,6 +43695,9 @@ function extractChildMotionValues(childTnList) {
43621
43695
  motionPathRotateAuto,
43622
43696
  motionPathEditMode,
43623
43697
  motionPtsTypes,
43698
+ motionPathRotationAngle,
43699
+ motionPathRotationCenterX,
43700
+ motionPathRotationCenterY,
43624
43701
  rotationBy,
43625
43702
  rotationFrom,
43626
43703
  rotationTo,
@@ -43644,6 +43721,25 @@ function extractChildMotionValues(childTnList) {
43644
43721
  if (motionNode["@_ptsTypes"] !== void 0) {
43645
43722
  motionPtsTypes = String(motionNode["@_ptsTypes"]);
43646
43723
  }
43724
+ if (motionNode["@_rAng"] !== void 0) {
43725
+ const parsed = Number.parseInt(String(motionNode["@_rAng"]), 10);
43726
+ if (Number.isFinite(parsed)) {
43727
+ motionPathRotationAngle = parsed / 6e4;
43728
+ }
43729
+ }
43730
+ const rotationCenter = motionNode["p:rCtr"];
43731
+ if (rotationCenter?.["@_x"] !== void 0) {
43732
+ const parsed = Number.parseInt(String(rotationCenter["@_x"]), 10);
43733
+ if (Number.isFinite(parsed)) {
43734
+ motionPathRotationCenterX = parsed / 1e3;
43735
+ }
43736
+ }
43737
+ if (rotationCenter?.["@_y"] !== void 0) {
43738
+ const parsed = Number.parseInt(String(rotationCenter["@_y"]), 10);
43739
+ if (Number.isFinite(parsed)) {
43740
+ motionPathRotationCenterY = parsed / 1e3;
43741
+ }
43742
+ }
43647
43743
  }
43648
43744
  }
43649
43745
  const rotationNodes = ensureArray8(childTnList["p:animRot"]);
@@ -43698,6 +43794,9 @@ function extractChildMotionValues(childTnList) {
43698
43794
  motionPathRotateAuto,
43699
43795
  motionPathEditMode,
43700
43796
  motionPtsTypes,
43797
+ motionPathRotationAngle,
43798
+ motionPathRotationCenterX,
43799
+ motionPathRotationCenterY,
43701
43800
  rotationBy,
43702
43801
  rotationFrom,
43703
43802
  rotationTo,
@@ -44488,6 +44587,7 @@ var PptxSlideLoaderService = class {
44488
44587
  const ownBackgroundColor = params.extractBackgroundColor(slideXmlObj);
44489
44588
  const ownBackgroundGradient = params.extractBackgroundGradient(slideXmlObj);
44490
44589
  let ownBackgroundImage;
44590
+ let backgroundImageProperties;
44491
44591
  const [
44492
44592
  backgroundColor,
44493
44593
  backgroundGradient,
@@ -44502,7 +44602,12 @@ var PptxSlideLoaderService = class {
44502
44602
  (async () => {
44503
44603
  const own = await params.extractBackgroundImage(slideXmlObj, path);
44504
44604
  ownBackgroundImage = own;
44505
- return own || params.getLayoutBackgroundImage(path);
44605
+ if (own) {
44606
+ backgroundImageProperties = params.extractBackgroundImageProperties(slideXmlObj);
44607
+ return own;
44608
+ }
44609
+ backgroundImageProperties = await params.getLayoutBackgroundImageProperties(path);
44610
+ return params.getLayoutBackgroundImage(path);
44506
44611
  })(),
44507
44612
  params.extractSlideNotes(path),
44508
44613
  params.extractSlideComments(path),
@@ -44570,6 +44675,7 @@ var PptxSlideLoaderService = class {
44570
44675
  backgroundColor,
44571
44676
  backgroundGradient: backgroundGradient || void 0,
44572
44677
  backgroundImage,
44678
+ backgroundImageProperties,
44573
44679
  transition,
44574
44680
  animations,
44575
44681
  animationTimelineAnchors,
@@ -45171,7 +45277,7 @@ var TIME_NODE_EVENTS = /* @__PURE__ */ new Set(["onBegin", "onEnd", "begin", "en
45171
45277
  function createGroupContext() {
45172
45278
  return { parCounter: { next: 0 } };
45173
45279
  }
45174
- function conditionsStartAutomatically(cTn) {
45280
+ function conditionsStartAutomatically(cTn, mainSequence) {
45175
45281
  if (!cTn) {
45176
45282
  return true;
45177
45283
  }
@@ -45187,6 +45293,14 @@ function conditionsStartAutomatically(cTn) {
45187
45293
  const event = condition["@_evt"] === void 0 ? void 0 : String(condition["@_evt"]);
45188
45294
  const hasTimeNode = condition["p:tn"] !== void 0 || condition["@_tn"] !== void 0;
45189
45295
  if (event !== void 0 && TIME_NODE_EVENTS.has(event) && hasTimeNode) {
45296
+ const timeNode = condition["p:tn"];
45297
+ const targetTimeNodeId = timeNode?.["@_val"] ?? condition["@_tn"];
45298
+ if (mainSequence !== void 0 && targetTimeNodeId !== void 0 && String(targetTimeNodeId) === mainSequence.id) {
45299
+ if (mainSequence.autoStart) {
45300
+ return true;
45301
+ }
45302
+ continue;
45303
+ }
45190
45304
  return true;
45191
45305
  }
45192
45306
  if (event !== void 0) {
@@ -45205,11 +45319,33 @@ function isMainSequence(cTn) {
45205
45319
  function isEffectNode(cTn) {
45206
45320
  return cTn !== void 0 && cTn["@_presetClass"] !== void 0;
45207
45321
  }
45322
+ function extractWrapperStartDelayMs(cTn) {
45323
+ if (!cTn) {
45324
+ return void 0;
45325
+ }
45326
+ const directDelay = readTimingAttr(cTn["@_delay"]);
45327
+ if (directDelay !== void 0 && directDelay >= 0) {
45328
+ return directDelay;
45329
+ }
45330
+ const stCondLst = cTn["p:stCondLst"];
45331
+ if (!stCondLst) {
45332
+ return void 0;
45333
+ }
45334
+ let smallest;
45335
+ for (const condition of ensureArray8(stCondLst["p:cond"])) {
45336
+ const delay = readTimingAttr(condition["@_delay"]);
45337
+ if (delay !== void 0 && delay >= 0 && (smallest === void 0 || delay < smallest)) {
45338
+ smallest = delay;
45339
+ }
45340
+ }
45341
+ return smallest;
45342
+ }
45208
45343
  function childGroupContext(parent, cTn, options) {
45209
45344
  if (options.isClickLevelGroup) {
45210
45345
  return {
45211
- groupAutoStart: conditionsStartAutomatically(cTn),
45346
+ groupAutoStart: conditionsStartAutomatically(cTn, options.mainSequence),
45212
45347
  parGroupIndex: parent.parGroupIndex,
45348
+ parGroupDelayMs: parent.parGroupDelayMs,
45213
45349
  parCounter: parent.parCounter,
45214
45350
  // The innermost enclosing `p:seq`'s attrs are unrelated to click-level
45215
45351
  // grouping; carry them through rather than dropping them here.
@@ -45221,15 +45357,74 @@ function childGroupContext(parent, cTn, options) {
45221
45357
  if (isEffectNode(cTn)) {
45222
45358
  return parent;
45223
45359
  }
45360
+ const localDelayMs = extractWrapperStartDelayMs(cTn);
45224
45361
  return {
45225
45362
  groupAutoStart: parent.groupAutoStart,
45226
45363
  parGroupIndex: parent.parCounter.next++,
45364
+ parGroupDelayMs: localDelayMs === void 0 ? parent.parGroupDelayMs : (parent.parGroupDelayMs ?? 0) + localDelayMs,
45227
45365
  parCounter: parent.parCounter,
45228
45366
  seqConcurrent: parent.seqConcurrent,
45229
45367
  seqNextAction: parent.seqNextAction,
45230
45368
  seqPrevAction: parent.seqPrevAction
45231
45369
  };
45232
45370
  }
45371
+ function extractAttributeAnimations(childTnList) {
45372
+ if (!childTnList) {
45373
+ return void 0;
45374
+ }
45375
+ const components = [];
45376
+ for (const node of ensureArray8(childTnList["p:anim"])) {
45377
+ const attrName = extractAttrNameFromCBhvr(node["p:cBhvr"]);
45378
+ const keyframes = extractKeyframes(node);
45379
+ if (!attrName || !keyframes || keyframes.length === 0) {
45380
+ continue;
45381
+ }
45382
+ const behavior = node["p:cBhvr"];
45383
+ const cTn = behavior?.["p:cTn"];
45384
+ components.push({
45385
+ attrName,
45386
+ keyframes,
45387
+ durationMs: readTimingAttr(cTn?.["@_dur"]),
45388
+ delayMs: cTn ? extractStartConditionDelayMs(cTn) : void 0
45389
+ });
45390
+ }
45391
+ return components.length > 0 ? components : void 0;
45392
+ }
45393
+ var PRIMARY_BEHAVIOUR_FAMILIES = [
45394
+ ["p:animMotion", "p:animRot", "p:animScale"],
45395
+ ["p:animClr"],
45396
+ ["p:animEffect"],
45397
+ ["p:anim"]
45398
+ ];
45399
+ function isEnabled(value) {
45400
+ return value === true || value === 1 || value === "1" || value === "true";
45401
+ }
45402
+ function extractChildAutoReverseTiming(cTn, toArray5) {
45403
+ const childTnLst = cTn["p:childTnLst"];
45404
+ if (!childTnLst) {
45405
+ return void 0;
45406
+ }
45407
+ for (const family of PRIMARY_BEHAVIOUR_FAMILIES) {
45408
+ const behaviours = family.flatMap((tag) => toArray5(childTnLst[tag]));
45409
+ if (behaviours.length === 0) {
45410
+ continue;
45411
+ }
45412
+ const timings = behaviours.map((behaviour) => {
45413
+ const common = behaviour["p:cBhvr"];
45414
+ const inner = common?.["p:cTn"];
45415
+ return {
45416
+ autoReverse: isEnabled(inner?.["@_autoRev"]),
45417
+ durationMs: readTimingAttr(inner?.["@_dur"])
45418
+ };
45419
+ });
45420
+ const durationMs = timings[0]?.durationMs;
45421
+ if (durationMs !== void 0 && timings.every((timing) => timing.autoReverse && timing.durationMs === durationMs)) {
45422
+ return { autoReverse: true, durationMs };
45423
+ }
45424
+ return void 0;
45425
+ }
45426
+ return void 0;
45427
+ }
45233
45428
  var defaultLookup = new PptxXmlLookupService();
45234
45429
  function resolveSlideTimingNode(slideRoot) {
45235
45430
  const direct = slideRoot?.["p:timing"];
@@ -45420,7 +45615,8 @@ var PptxNativeAnimationService = class {
45420
45615
  const presetClass = cTn["@_presetClass"];
45421
45616
  const presetId = cTn["@_presetID"] ? Number.parseInt(String(cTn["@_presetID"]), 10) : void 0;
45422
45617
  const presetSubtype = cTn["@_presetSubtype"] !== void 0 ? Number.parseInt(String(cTn["@_presetSubtype"]), 10) : void 0;
45423
- const durationMs = readTimingAttr(cTn["@_dur"]) ?? extractChildBehaviourDurationMs(cTn, ensureArray8);
45618
+ const childAutoReverseTiming = extractChildAutoReverseTiming(cTn, ensureArray8);
45619
+ const durationMs = readTimingAttr(cTn["@_dur"]) ?? childAutoReverseTiming?.durationMs ?? extractChildBehaviourDurationMs(cTn, ensureArray8);
45424
45620
  const delayMs = readTimingAttr(cTn["@_delay"]) ?? extractStartConditionDelayMs(cTn);
45425
45621
  const accel = parseTimingPercentFraction(cTn["@_accel"]);
45426
45622
  const decel = parseTimingPercentFraction(cTn["@_decel"]);
@@ -45468,6 +45664,7 @@ var PptxNativeAnimationService = class {
45468
45664
  const textTarget = this.extractTextTargetFromCTn(cTn);
45469
45665
  const keyframes = extractChildKeyframes(childTnList2);
45470
45666
  const keyframeAttrName = extractChildKeyframeAttrName(childTnList2);
45667
+ const attributeAnimations = extractAttributeAnimations(childTnList2);
45471
45668
  const roundTripAttrs = captureRoundTripCTnAttrs(cTn);
45472
45669
  const afterEffectFlag = extractAfterEffect(cTn);
45473
45670
  const timingAttrs = extractCTnTimingAttrs(cTn);
@@ -45495,6 +45692,9 @@ var PptxNativeAnimationService = class {
45495
45692
  motionPathRotateAuto: childMotion.motionPathRotateAuto,
45496
45693
  motionPathEditMode: childMotion.motionPathEditMode,
45497
45694
  motionPtsTypes: childMotion.motionPtsTypes,
45695
+ motionPathRotationAngle: childMotion.motionPathRotationAngle,
45696
+ motionPathRotationCenterX: childMotion.motionPathRotationCenterX,
45697
+ motionPathRotationCenterY: childMotion.motionPathRotationCenterY,
45498
45698
  rotationBy: childMotion.rotationBy,
45499
45699
  rotationFrom: childMotion.rotationFrom,
45500
45700
  rotationTo: childMotion.rotationTo,
@@ -45507,8 +45707,9 @@ var PptxNativeAnimationService = class {
45507
45707
  scaleZoomContents: childMotion.scaleZoomContents,
45508
45708
  keyframes: keyframes ?? void 0,
45509
45709
  attrName: keyframeAttrName,
45710
+ attributeAnimations,
45510
45711
  repeatCount: repeatInfo.repeatCount,
45511
- autoReverse: repeatInfo.autoReverse,
45712
+ autoReverse: repeatInfo.autoReverse ?? childAutoReverseTiming?.autoReverse,
45512
45713
  soundRId: soundInfo.soundRId,
45513
45714
  stopSound: soundInfo.stopSound,
45514
45715
  startConditions: startConditions ?? void 0,
@@ -45523,6 +45724,7 @@ var PptxNativeAnimationService = class {
45523
45724
  afterEffect: afterEffectFlag,
45524
45725
  groupAutoStart: group2.groupAutoStart,
45525
45726
  parGroupIndex: group2.parGroupIndex,
45727
+ parGroupDelayMs: group2.parGroupDelayMs,
45526
45728
  effectFilter
45527
45729
  });
45528
45730
  }
@@ -45533,12 +45735,17 @@ var PptxNativeAnimationService = class {
45533
45735
  const sequences = ensureArray8(childTnList["p:seq"]);
45534
45736
  const exclusives = ensureArray8(childTnList["p:excl"]);
45535
45737
  for (const parallel of parallels) {
45738
+ const mainSequenceId = cTn["@_id"];
45536
45739
  this.walkTimingTree(
45537
45740
  parallel,
45538
45741
  animations,
45539
45742
  trigger,
45540
45743
  childGroupContext(group2, parallel["p:cTn"], {
45541
- isClickLevelGroup: isClickLevel
45744
+ isClickLevelGroup: isClickLevel,
45745
+ mainSequence: isClickLevel && mainSequenceId !== void 0 ? {
45746
+ autoStart: group2.seqConcurrent === true && group2.seqNextAction === "seek",
45747
+ id: String(mainSequenceId)
45748
+ } : void 0
45542
45749
  })
45543
45750
  );
45544
45751
  }
@@ -45729,6 +45936,9 @@ var PptxNativeAnimationService = class {
45729
45936
  if (!triggerShapeId) {
45730
45937
  continue;
45731
45938
  }
45939
+ const endSync = seqCTn?.["p:endSync"];
45940
+ const runtimeTrigger = endSync?.["p:rtn"];
45941
+ const restartable = String(runtimeTrigger?.["@_val"] ?? "") === "all";
45732
45942
  const interactiveAnims = [];
45733
45943
  const seqAttrs = extractSeqAttrs(seq);
45734
45944
  this.walkTimingTree(seq, interactiveAnims, "onShapeClick", {
@@ -45737,7 +45947,11 @@ var PptxNativeAnimationService = class {
45737
45947
  });
45738
45948
  for (const anim of interactiveAnims) {
45739
45949
  anim.triggerShapeId = triggerShapeId;
45740
- anim.trigger = "onShapeClick";
45950
+ anim.interactiveSequence = true;
45951
+ anim.interactiveRestart = restartable;
45952
+ if (anim.trigger === "onClick") {
45953
+ anim.trigger = "onShapeClick";
45954
+ }
45741
45955
  animations.push(anim);
45742
45956
  }
45743
45957
  }
@@ -47217,6 +47431,15 @@ function buildMotionPathNode(anim, allocateId) {
47217
47431
  }
47218
47432
  }
47219
47433
  };
47434
+ if (anim.motionPathRotationAngle !== void 0) {
47435
+ motionNode["@_rAng"] = String(Math.round(anim.motionPathRotationAngle * 6e4));
47436
+ }
47437
+ if (anim.motionPathRotationCenterX !== void 0 || anim.motionPathRotationCenterY !== void 0) {
47438
+ motionNode["p:rCtr"] = {
47439
+ "@_x": String(Math.round((anim.motionPathRotationCenterX ?? 0) * 1e3)),
47440
+ "@_y": String(Math.round((anim.motionPathRotationCenterY ?? 0) * 1e3))
47441
+ };
47442
+ }
47220
47443
  const effectCTn = {
47221
47444
  "@_id": String(effectId),
47222
47445
  "@_presetID": "0",
@@ -47388,6 +47611,8 @@ function wrapInInteractiveSequence(effectNodes, triggerShapeId, allocateId) {
47388
47611
  }
47389
47612
  function buildMainSequenceNode(mainSeqId, children11) {
47390
47613
  const node = {
47614
+ "@_concurrent": "1",
47615
+ "@_nextAc": "seek",
47391
47616
  "p:cTn": {
47392
47617
  "@_id": String(mainSeqId),
47393
47618
  "@_dur": "indefinite",
@@ -50999,10 +51224,6 @@ function scaleElementSubtree(el, scaleX, scaleY) {
50999
51224
  el.y *= scaleY;
51000
51225
  el.width *= scaleX;
51001
51226
  el.height *= scaleY;
51002
- const avgScale = (Math.abs(scaleX) + Math.abs(scaleY)) / 2;
51003
- if (hasShapeProperties(el) && el.shapeStyle?.strokeWidth) {
51004
- el.shapeStyle.strokeWidth *= avgScale;
51005
- }
51006
51227
  if (el.type === "group") {
51007
51228
  for (const nested of el.children) {
51008
51229
  scaleElementSubtree(nested, scaleX, scaleY);
@@ -51016,10 +51237,6 @@ function transformGroupChild(el, t) {
51016
51237
  el.y = t.parentY + relativeY * t.scaleY;
51017
51238
  el.width *= t.scaleX;
51018
51239
  el.height *= t.scaleY;
51019
- const avgScale = (Math.abs(t.scaleX) + Math.abs(t.scaleY)) / 2;
51020
- if (hasShapeProperties(el) && el.shapeStyle?.strokeWidth) {
51021
- el.shapeStyle.strokeWidth *= avgScale;
51022
- }
51023
51240
  if (el.type === "group") {
51024
51241
  for (const nested of el.children) {
51025
51242
  scaleElementSubtree(nested, t.scaleX, t.scaleY);
@@ -56426,6 +56643,32 @@ function parseMasterColorMap(node) {
56426
56643
  }
56427
56644
  return Object.keys(result).length > 0 ? result : void 0;
56428
56645
  }
56646
+ var HEX_COLOR = /^#?[0-9a-f]{6}$/iu;
56647
+ function resolveToken2(value, resolveThemeColor) {
56648
+ if (!value || HEX_COLOR.test(value)) {
56649
+ return value;
56650
+ }
56651
+ return resolveThemeColor(value) ?? value;
56652
+ }
56653
+ function resolveColorAnimation(animation, resolveThemeColor) {
56654
+ return {
56655
+ ...animation,
56656
+ fromColor: resolveToken2(animation.fromColor, resolveThemeColor),
56657
+ toColor: resolveToken2(animation.toColor, resolveThemeColor),
56658
+ byColor: resolveToken2(animation.byColor, resolveThemeColor),
56659
+ components: animation.components?.map(
56660
+ (component) => resolveColorAnimation(component, resolveThemeColor)
56661
+ )
56662
+ };
56663
+ }
56664
+ function resolveNativeAnimationThemeColors(animations, resolveThemeColor) {
56665
+ return animations.map(
56666
+ (animation) => animation.colorAnimation ? {
56667
+ ...animation,
56668
+ colorAnimation: resolveColorAnimation(animation.colorAnimation, resolveThemeColor)
56669
+ } : animation
56670
+ );
56671
+ }
56429
56672
  function getXmlShapeIdFromXml(rawXml) {
56430
56673
  if (!rawXml) {
56431
56674
  return void 0;
@@ -59415,7 +59658,42 @@ var PptxHandlerRuntime6 = class extends PptxHandlerRuntime5 {
59415
59658
  }
59416
59659
  };
59417
59660
  var CAN_USE_BLOB_URLS = typeof globalThis.URL?.createObjectURL === "function" && typeof globalThis.Blob !== "undefined";
59661
+ async function decodeTiffToPngBlob(bytes) {
59662
+ if (typeof document === "undefined") {
59663
+ return void 0;
59664
+ }
59665
+ const imported = await import('./UTIF-LAD5QYGQ.mjs');
59666
+ const decoder = "default" in imported ? imported.default : imported;
59667
+ const page = decoder.decode(bytes)[0];
59668
+ if (!page) {
59669
+ return void 0;
59670
+ }
59671
+ decoder.decodeImage(bytes, page);
59672
+ const width = Number(page.width);
59673
+ const height = Number(page.height);
59674
+ if (!Number.isFinite(width) || width <= 0 || !Number.isFinite(height) || height <= 0) {
59675
+ return void 0;
59676
+ }
59677
+ const rgba = new Uint8ClampedArray(decoder.toRGBA8(page));
59678
+ const canvas = document.createElement("canvas");
59679
+ canvas.width = width;
59680
+ canvas.height = height;
59681
+ const context = canvas.getContext("2d");
59682
+ if (!context) {
59683
+ return void 0;
59684
+ }
59685
+ const imageData = context.createImageData(width, height);
59686
+ imageData.data.set(rgba);
59687
+ context.putImageData(imageData, 0, 0);
59688
+ return await new Promise((resolve2) => {
59689
+ canvas.toBlob((blob) => resolve2(blob ?? void 0), "image/png");
59690
+ });
59691
+ }
59418
59692
  var PptxHandlerRuntime7 = class extends PptxHandlerRuntime6 {
59693
+ /** Forward declaration implemented later in the runtime inheritance chain. */
59694
+ resolveThemeColor(_schemeKey) {
59695
+ return void 0;
59696
+ }
59419
59697
  /**
59420
59698
  * Convert raw image bytes to a URL suitable for <img src>.
59421
59699
  * Uses Blob URLs in browsers (avoids 33% base64 overhead),
@@ -59482,6 +59760,18 @@ var PptxHandlerRuntime7 = class extends PptxHandlerRuntime6 {
59482
59760
  }
59483
59761
  return void 0;
59484
59762
  }
59763
+ if (ext === "tif" || ext === "tiff") {
59764
+ const binaryBuffer = await imageFile.async("arraybuffer");
59765
+ const pngBlob = await decodeTiffToPngBlob(binaryBuffer);
59766
+ if (pngBlob) {
59767
+ const converted = this.createImageUrl(await pngBlob.arrayBuffer(), "image/png");
59768
+ this.imageDataCache.set(imagePath, converted);
59769
+ return converted;
59770
+ }
59771
+ const imageData2 = this.createImageUrl(binaryBuffer, this.getImageMimeType(imagePath));
59772
+ this.imageDataCache.set(imagePath, imageData2);
59773
+ return imageData2;
59774
+ }
59485
59775
  const imageBytes = await imageFile.async("arraybuffer");
59486
59776
  const imageData = this.createImageUrl(imageBytes, this.getImageMimeType(imagePath));
59487
59777
  this.imageDataCache.set(imagePath, imageData);
@@ -59580,10 +59870,14 @@ var PptxHandlerRuntime7 = class extends PptxHandlerRuntime6 {
59580
59870
  * anything.
59581
59871
  */
59582
59872
  parseNativeAnimations(slideXml3, slidePath) {
59583
- const animations = this.nativeAnimationService.parseNativeAnimations(slideXml3);
59584
- if (!animations) {
59873
+ const parsedAnimations = this.nativeAnimationService.parseNativeAnimations(slideXml3);
59874
+ if (!parsedAnimations) {
59585
59875
  return void 0;
59586
59876
  }
59877
+ const animations = resolveNativeAnimationThemeColors(
59878
+ parsedAnimations,
59879
+ (token2) => this.resolveThemeColor(token2)
59880
+ );
59587
59881
  for (const anim of animations) {
59588
59882
  if (anim.soundRId) {
59589
59883
  anim.soundPath = this.resolveRelationshipTarget(slidePath, anim.soundRId);
@@ -63085,7 +63379,7 @@ var PptxHandlerRuntime19 = class _PptxHandlerRuntime5 extends PptxHandlerRuntime
63085
63379
  const latinTypefaceToken = xmlAttr(latin, "typeface");
63086
63380
  const eaTypefaceToken = xmlAttr(eastAsian, "typeface");
63087
63381
  const csTypefaceToken = xmlAttr(complexScript, "typeface");
63088
- const chosenTypeface = latinTypefaceToken || eaTypefaceToken || csTypefaceToken;
63382
+ const chosenTypeface = latinTypefaceToken;
63089
63383
  const resolvedTypeface = this.resolveThemeTypeface(chosenTypeface);
63090
63384
  if (resolvedTypeface) {
63091
63385
  style.fontFamily = resolvedTypeface;
@@ -73982,6 +74276,7 @@ var PptxHandlerRuntime57 = class _PptxHandlerRuntime24 extends PptxHandlerRuntim
73982
74276
  const rEmbed = xmlAttr(blip, "r:embed");
73983
74277
  const rLink = xmlAttr(blip, "r:link");
73984
74278
  const crop = this.readImageCropFromBlipFill(blipFill);
74279
+ const imageEffects = this.extractImageEffects(blip);
73985
74280
  const tileNode = blipFill?.["a:tile"];
73986
74281
  const tileProps = {};
73987
74282
  if (tileNode) {
@@ -74041,6 +74336,7 @@ var PptxHandlerRuntime57 = class _PptxHandlerRuntime24 extends PptxHandlerRuntim
74041
74336
  }
74042
74337
  const styleNode = shape["p:style"] || inheritedPlaceholder?.shape?.["p:style"] || inheritedPlaceholder?.picture?.["p:style"];
74043
74338
  const sifCNvPr = xmlPath(shape, "p:nvSpPr", "p:cNvPr");
74339
+ const sifElementName = xmlAttr(sifCNvPr, "name")?.trim() || void 0;
74044
74340
  const sifSlideRels = this.slideRelsMap.get(slidePath);
74045
74341
  const { actionClick: sifActionClick, actionHover: sifActionHover } = this.parseElementActions(
74046
74342
  sifCNvPr,
@@ -74056,6 +74352,7 @@ var PptxHandlerRuntime57 = class _PptxHandlerRuntime24 extends PptxHandlerRuntim
74056
74352
  height,
74057
74353
  imageData,
74058
74354
  imagePath,
74355
+ imageEffects: imageEffects || void 0,
74059
74356
  ...crop,
74060
74357
  ...tileProps,
74061
74358
  shapeType,
@@ -74071,6 +74368,7 @@ var PptxHandlerRuntime57 = class _PptxHandlerRuntime24 extends PptxHandlerRuntim
74071
74368
  flipHorizontal,
74072
74369
  flipVertical,
74073
74370
  rawXml: shape,
74371
+ name: sifElementName,
74074
74372
  actionClick: sifActionClick,
74075
74373
  actionHover: sifActionHover
74076
74374
  };
@@ -74273,6 +74571,21 @@ var PptxHandlerRuntime58 = class extends PptxHandlerRuntime57 {
74273
74571
  if (textStyle.align === void 0 && levelStyle.alignment !== void 0) {
74274
74572
  textStyle.align = levelStyle.alignment;
74275
74573
  }
74574
+ if (textStyle.defaultTabSize === void 0 && levelStyle.defaultTabSize !== void 0) {
74575
+ textStyle.defaultTabSize = levelStyle.defaultTabSize;
74576
+ }
74577
+ if (textStyle.eaLineBreak === void 0 && levelStyle.eaLineBreak !== void 0) {
74578
+ textStyle.eaLineBreak = levelStyle.eaLineBreak;
74579
+ }
74580
+ if (textStyle.latinLineBreak === void 0 && levelStyle.latinLineBreak !== void 0) {
74581
+ textStyle.latinLineBreak = levelStyle.latinLineBreak;
74582
+ }
74583
+ if (textStyle.fontAlignment === void 0 && levelStyle.fontAlignment !== void 0) {
74584
+ textStyle.fontAlignment = levelStyle.fontAlignment;
74585
+ }
74586
+ if (textStyle.hangingPunctuation === void 0 && levelStyle.hangingPunctuation !== void 0) {
74587
+ textStyle.hangingPunctuation = levelStyle.hangingPunctuation;
74588
+ }
74276
74589
  }
74277
74590
  };
74278
74591
  var PptxHandlerRuntime59 = class extends PptxHandlerRuntime58 {
@@ -74923,17 +75236,10 @@ var PptxHandlerRuntime61 = class _PptxHandlerRuntime26 extends PptxHandlerRuntim
74923
75236
  ctx.slideRelationshipMap,
74924
75237
  false
74925
75238
  );
74926
- const endParagraphStyle = this.extractTextRunStyle(
74927
- p?.["a:endParaRPr"],
74928
- paraAlign,
74929
- ctx.slideRelationshipMap,
74930
- false
74931
- );
74932
75239
  const mergedDefaultRunStyle = {
74933
75240
  ...ctx.bodyDefaultRunStyle,
74934
75241
  ...inheritedLevelStyle,
74935
75242
  ...bodyLevelStyle,
74936
- ...endParagraphStyle,
74937
75243
  ...defaultRunStyle
74938
75244
  };
74939
75245
  if (mergedDefaultRunStyle.color === void 0 && ctx.styleFontRefColor !== void 0) {
@@ -75798,6 +76104,7 @@ var PptxHandlerRuntime64 = class _PptxHandlerRuntime28 extends PptxHandlerRuntim
75798
76104
  isLinked: mediaReference.isLinked,
75799
76105
  posterFramePath,
75800
76106
  posterFrameData,
76107
+ ...this.readImageCropFromBlipFill(posterBlipFill),
75801
76108
  // Real PowerPoint media is `p:pic`-shaped even though the
75802
76109
  // `media` type buckets as `p:graphicFrame`, so its locks live
75803
76110
  // in `a:picLocks`. The writer resolves the same container from
@@ -76501,6 +76808,23 @@ var PptxHandlerRuntime66 = class _PptxHandlerRuntime30 extends PptxHandlerRuntim
76501
76808
  el.height = parseEmuInt(ext["@_cy"]) / _PptxHandlerRuntime30.EMU_PER_PX;
76502
76809
  }
76503
76810
  }
76811
+ applyAncestorGroupTextTransform(children11, groupTransform) {
76812
+ for (const child252 of children11) {
76813
+ if (child252.type === "group") {
76814
+ this.applyAncestorGroupTextTransform(child252.children, groupTransform);
76815
+ continue;
76816
+ }
76817
+ if (!hasTextProperties(child252)) {
76818
+ continue;
76819
+ }
76820
+ const existing = child252.textStyle?.ancestorGroupTransform;
76821
+ const nestedTransform = isTextOrientationMatrix(existing) ? existing : TEXT_ORIENTATION_IDENTITY;
76822
+ child252.textStyle = {
76823
+ ...child252.textStyle,
76824
+ ancestorGroupTransform: multiplyTextOrientationMatrices(groupTransform, nestedTransform)
76825
+ };
76826
+ }
76827
+ }
76504
76828
  /**
76505
76829
  * Push a group fill down to every descendant whose own fill is `a:grpFill`
76506
76830
  * ("inherit from my group").
@@ -76629,6 +76953,16 @@ var PptxHandlerRuntime66 = class _PptxHandlerRuntime30 extends PptxHandlerRuntim
76629
76953
  if (hasGroupFill && grpFillStyle.fillMode !== "group") {
76630
76954
  this.applyGroupFillInheritance(children11, grpFillStyle);
76631
76955
  }
76956
+ if (raw.rotation || raw.flipHorizontal || raw.flipVertical) {
76957
+ this.applyAncestorGroupTextTransform(
76958
+ children11,
76959
+ getElementOrientationMatrix({
76960
+ rotation: raw.rotation,
76961
+ flipHorizontal: raw.flipHorizontal,
76962
+ flipVertical: raw.flipVertical
76963
+ })
76964
+ );
76965
+ }
76632
76966
  for (const child252 of children11) {
76633
76967
  child252.x -= parentX;
76634
76968
  child252.y -= parentY;
@@ -76924,6 +77258,52 @@ var PptxHandlerRuntime68 = class extends PptxHandlerRuntime67 {
76924
77258
  }
76925
77259
  };
76926
77260
  var PptxHandlerRuntime69 = class extends PptxHandlerRuntime68 {
77261
+ /**
77262
+ * Preserve the visual properties authored on a background `a:blipFill`.
77263
+ *
77264
+ * The decoded image URL alone is not enough to reproduce PowerPoint: crop,
77265
+ * stretch/tile placement and blip effects such as `a:alphaModFix` live next
77266
+ * to the relationship id and otherwise disappear during slide assembly.
77267
+ */
77268
+ extractBackgroundImageProperties(slideXml3, rootElement = "p:sld") {
77269
+ try {
77270
+ const blipFill = xmlPath(slideXml3, rootElement, "p:cSld", "p:bg", "p:bgPr", "a:blipFill");
77271
+ const blip = xmlChild(blipFill, "a:blip");
77272
+ if (!blipFill || !blip) {
77273
+ return void 0;
77274
+ }
77275
+ const properties = {
77276
+ ...this.readImageCropFromBlipFill(blipFill)
77277
+ };
77278
+ const imageEffects = this.extractImageEffects(blip);
77279
+ if (imageEffects) {
77280
+ properties.imageEffects = imageEffects;
77281
+ }
77282
+ const tileNode = xmlChild(blipFill, "a:tile");
77283
+ if (tileNode) {
77284
+ const txRaw = Number.parseInt(String(tileNode["@_tx"] ?? ""), 10);
77285
+ const tyRaw = Number.parseInt(String(tileNode["@_ty"] ?? ""), 10);
77286
+ const sxRaw = Number.parseInt(String(tileNode["@_sx"] ?? ""), 10);
77287
+ const syRaw = Number.parseInt(String(tileNode["@_sy"] ?? ""), 10);
77288
+ properties.tileOffsetX = Number.isFinite(txRaw) ? txRaw / 9525 : 0;
77289
+ properties.tileOffsetY = Number.isFinite(tyRaw) ? tyRaw / 9525 : 0;
77290
+ properties.tileScaleX = Number.isFinite(sxRaw) ? sxRaw / 1e5 : 1;
77291
+ properties.tileScaleY = Number.isFinite(syRaw) ? syRaw / 1e5 : 1;
77292
+ const flip = String(tileNode["@_flip"] ?? "none").trim();
77293
+ if (flip === "x" || flip === "y" || flip === "xy" || flip === "none") {
77294
+ properties.tileFlip = flip;
77295
+ }
77296
+ const alignment = String(tileNode["@_algn"] ?? "tl").trim();
77297
+ if (alignment.length > 0) {
77298
+ properties.tileAlignment = alignment;
77299
+ }
77300
+ }
77301
+ return Object.keys(properties).length > 0 ? properties : void 0;
77302
+ } catch (error) {
77303
+ console.warn("Failed to extract background image properties:", error);
77304
+ return void 0;
77305
+ }
77306
+ }
76927
77307
  async extractBackgroundImage(slideXml3, slidePath, rootElement = "p:sld") {
76928
77308
  try {
76929
77309
  const blip = xmlPath(
@@ -77192,6 +77572,26 @@ var PptxHandlerRuntime69 = class extends PptxHandlerRuntime68 {
77192
77572
  }
77193
77573
  return void 0;
77194
77574
  }
77575
+ async getMasterBackgroundImageProperties(layoutPath) {
77576
+ const layoutRels = this.slideRelsMap.get(layoutPath);
77577
+ if (!layoutRels) {
77578
+ return void 0;
77579
+ }
77580
+ for (const [, target] of layoutRels.entries()) {
77581
+ if (!target.includes("slideMaster")) {
77582
+ continue;
77583
+ }
77584
+ const layoutDir = layoutPath.substring(0, layoutPath.lastIndexOf("/") + 1);
77585
+ const masterPath = target.startsWith("/") ? target.substring(1) : target.startsWith("..") ? this.resolvePath(layoutDir, target) : `ppt/${stripParentDirSegments(target)}`;
77586
+ try {
77587
+ const masterXmlObj = await this.resolveCachedMasterXml(masterPath);
77588
+ return masterXmlObj ? this.extractBackgroundImageProperties(masterXmlObj, "p:sldMaster") : void 0;
77589
+ } catch {
77590
+ return void 0;
77591
+ }
77592
+ }
77593
+ return void 0;
77594
+ }
77195
77595
  async getLayoutBackgroundImage(slidePath) {
77196
77596
  const slideRels = this.slideRelsMap.get(slidePath);
77197
77597
  if (!slideRels) {
@@ -77206,7 +77606,7 @@ var PptxHandlerRuntime69 = class extends PptxHandlerRuntime68 {
77206
77606
  if (layoutXmlObj) {
77207
77607
  const layoutRelsPath = partRelsPath(layoutPath);
77208
77608
  await this.loadSlideRelationships(layoutPath, layoutRelsPath);
77209
- const bg = this.extractBackgroundImage(layoutXmlObj, layoutPath, "p:sldLayout");
77609
+ const bg = await this.extractBackgroundImage(layoutXmlObj, layoutPath, "p:sldLayout");
77210
77610
  if (bg) {
77211
77611
  return bg;
77212
77612
  }
@@ -77219,6 +77619,36 @@ var PptxHandlerRuntime69 = class extends PptxHandlerRuntime68 {
77219
77619
  }
77220
77620
  return void 0;
77221
77621
  }
77622
+ async getLayoutBackgroundImageProperties(slidePath) {
77623
+ const slideRels = this.slideRelsMap.get(slidePath);
77624
+ if (!slideRels) {
77625
+ return void 0;
77626
+ }
77627
+ for (const [, target] of slideRels.entries()) {
77628
+ if (!target.includes("slideLayout")) {
77629
+ continue;
77630
+ }
77631
+ const slideDir = slidePath.substring(0, slidePath.lastIndexOf("/") + 1);
77632
+ const layoutPath = target.startsWith("/") ? target.substring(1) : target.startsWith("..") ? this.resolvePath(slideDir, target) : `ppt/${stripParentDirSegments(target)}`;
77633
+ try {
77634
+ const layoutXmlObj = await this.resolveCachedLayoutXml(layoutPath);
77635
+ if (!layoutXmlObj) {
77636
+ return void 0;
77637
+ }
77638
+ const layoutRelsPath = partRelsPath(layoutPath);
77639
+ await this.loadSlideRelationships(layoutPath, layoutRelsPath);
77640
+ const layoutImage = await this.extractBackgroundImage(
77641
+ layoutXmlObj,
77642
+ layoutPath,
77643
+ "p:sldLayout"
77644
+ );
77645
+ return layoutImage ? this.extractBackgroundImageProperties(layoutXmlObj, "p:sldLayout") : this.getMasterBackgroundImageProperties(layoutPath);
77646
+ } catch {
77647
+ return void 0;
77648
+ }
77649
+ }
77650
+ return void 0;
77651
+ }
77222
77652
  async getLayoutBackgroundColor(slidePath) {
77223
77653
  const slideRels = this.slideRelsMap.get(slidePath);
77224
77654
  if (!slideRels) {
@@ -77644,6 +78074,29 @@ var PptxHandlerRuntime71 = class _PptxHandlerRuntime31 extends PptxHandlerRuntim
77644
78074
  style.indent = indent / _PptxHandlerRuntime31.EMU_PER_PX;
77645
78075
  }
77646
78076
  }
78077
+ const defaultTabSizeRaw = levelProps["@_defTabSz"];
78078
+ if (defaultTabSizeRaw !== void 0) {
78079
+ const defaultTabSize = Number.parseInt(String(defaultTabSizeRaw), 10);
78080
+ if (Number.isFinite(defaultTabSize)) {
78081
+ style.defaultTabSize = defaultTabSize / _PptxHandlerRuntime31.EMU_PER_PX;
78082
+ }
78083
+ }
78084
+ const eaLineBreak = this.parseOptionalBooleanAttr(levelProps["@_eaLnBrk"]);
78085
+ if (eaLineBreak !== void 0) {
78086
+ style.eaLineBreak = eaLineBreak;
78087
+ }
78088
+ const latinLineBreak = this.parseOptionalBooleanAttr(levelProps["@_latinLnBrk"]);
78089
+ if (latinLineBreak !== void 0) {
78090
+ style.latinLineBreak = latinLineBreak;
78091
+ }
78092
+ const fontAlignment = String(levelProps["@_fontAlgn"] ?? "").trim();
78093
+ if (fontAlignment.length > 0) {
78094
+ style.fontAlignment = fontAlignment;
78095
+ }
78096
+ const hangingPunctuation = this.parseOptionalBooleanAttr(levelProps["@_hangingPunct"]);
78097
+ if (hangingPunctuation !== void 0) {
78098
+ style.hangingPunctuation = hangingPunctuation;
78099
+ }
77647
78100
  const lnSpc = levelProps["a:lnSpc"];
77648
78101
  if (lnSpc) {
77649
78102
  const multiplier = this.parseLineSpacingMultiplier(lnSpc);
@@ -78219,6 +78672,7 @@ var PptxHandlerRuntime74 = class extends PptxHandlerRuntime73 {
78219
78672
  await this.loadSlideRelationships(partPath, `${partDirectory}/_rels/${fileName}.rels`);
78220
78673
  }
78221
78674
  part.backgroundImage = await this.extractBackgroundImage(data, partPath, rootTag2);
78675
+ part.backgroundImageProperties = this.extractBackgroundImageProperties(data, rootTag2);
78222
78676
  this.unwrapAlternateContent(spTree);
78223
78677
  const previousClrMapOverride = this.currentSlideClrMapOverride;
78224
78678
  if (rootTag2 === "p:sldLayout") {
@@ -79243,6 +79697,7 @@ var PptxHandlerRuntime79 = class extends PptxHandlerRuntime78 {
79243
79697
  * scheme fill style list.
79244
79698
  *
79245
79699
  * Per the OOXML spec:
79700
+ * - idx 0 or 1000 → no fill
79246
79701
  * - idx 1-3 → fillStyleLst[idx-1]
79247
79702
  * - idx 1001-1003 → bgFillStyleLst[idx-1001]
79248
79703
  *
@@ -79259,6 +79714,12 @@ var PptxHandlerRuntime79 = class extends PptxHandlerRuntime78 {
79259
79714
  if (overrideColorXml) {
79260
79715
  style.fillRefColorXml = overrideColorXml;
79261
79716
  }
79717
+ if (idx === 0 || idx === 1e3) {
79718
+ style.fillMode = "none";
79719
+ style.fillColor = "transparent";
79720
+ style.fillOpacity = 0;
79721
+ return;
79722
+ }
79262
79723
  if (!Number.isFinite(idx) || idx <= 0 || !this.themeFormatScheme) {
79263
79724
  style.fillMode = "theme";
79264
79725
  style.fillColor = this.parseColor(refNode);
@@ -80400,33 +80861,109 @@ function extractDrawingShapeFill(spPr, deps) {
80400
80861
  }
80401
80862
  return result;
80402
80863
  }
80403
- function extractDrawingShapeTextStyle(txBody, deps) {
80864
+ function drawingTextEmuAttribute(node, name, emuPerPx) {
80865
+ if (!node || node[`@_${name}`] === void 0) {
80866
+ return void 0;
80867
+ }
80868
+ const value = Number.parseInt(String(node[`@_${name}`]), 10);
80869
+ return Number.isFinite(value) ? value / emuPerPx : void 0;
80870
+ }
80871
+ function drawingTextBoolean(value) {
80872
+ return value === true || value === 1 || value === "1" || value === "true";
80873
+ }
80874
+ function extractDrawingShapeTextStyle(txBody, deps, emuPerPx) {
80404
80875
  let fontSize;
80405
80876
  let fontColor;
80877
+ let fontFamily;
80878
+ let fontWeight;
80879
+ let fontStyle;
80880
+ let lineHeight;
80881
+ let lineHeightRatio;
80882
+ let lineSpacingAfter;
80883
+ let lineSpacingAfterRatio;
80406
80884
  if (!txBody) {
80407
80885
  return { fontSize, fontColor };
80408
80886
  }
80887
+ const bodyPr = deps.getChild(txBody, "bodyPr");
80409
80888
  const paragraphs = deps.getChildren(txBody, "p");
80410
80889
  for (const p of paragraphs) {
80890
+ const pPr = deps.getChild(p, "pPr");
80891
+ const lineSpacing = deps.getChild(pPr, "lnSpc");
80892
+ const lineSpacingPercent = deps.getChild(lineSpacing, "spcPct");
80893
+ const lineSpacingPoints = deps.getChild(lineSpacing, "spcPts");
80894
+ const spacingAfter = deps.getChild(pPr, "spcAft");
80895
+ const spacingAfterPercent = deps.getChild(spacingAfter, "spcPct");
80896
+ const spacingAfterPoints = deps.getChild(spacingAfter, "spcPts");
80897
+ if (lineHeightRatio === void 0 && lineSpacingPercent?.["@_val"] !== void 0) {
80898
+ const raw = Number.parseInt(String(lineSpacingPercent["@_val"]), 10);
80899
+ if (Number.isFinite(raw) && raw > 0) {
80900
+ lineHeightRatio = raw / 1e5;
80901
+ }
80902
+ }
80903
+ if (lineHeight === void 0 && lineSpacingPoints?.["@_val"] !== void 0) {
80904
+ const raw = Number.parseInt(String(lineSpacingPoints["@_val"]), 10);
80905
+ if (Number.isFinite(raw) && raw > 0) {
80906
+ lineHeight = raw / 100 * (96 / 72);
80907
+ }
80908
+ }
80909
+ if (lineSpacingAfterRatio === void 0 && spacingAfterPercent?.["@_val"] !== void 0) {
80910
+ const raw = Number.parseInt(String(spacingAfterPercent["@_val"]), 10);
80911
+ if (Number.isFinite(raw) && raw >= 0) {
80912
+ lineSpacingAfterRatio = raw / 1e5;
80913
+ }
80914
+ }
80915
+ if (lineSpacingAfter === void 0 && spacingAfterPoints?.["@_val"] !== void 0) {
80916
+ const raw = Number.parseInt(String(spacingAfterPoints["@_val"]), 10);
80917
+ if (Number.isFinite(raw) && raw >= 0) {
80918
+ lineSpacingAfter = raw / 100 * (96 / 72);
80919
+ }
80920
+ }
80411
80921
  const runs = deps.getChildren(p, "r");
80412
80922
  for (const r of runs) {
80413
80923
  const rPr = deps.getChild(r, "rPr");
80414
- if (rPr && !fontSize) {
80924
+ if (rPr) {
80415
80925
  const szRaw = parseInt(String(rPr["@_sz"] || ""), 10);
80416
- if (Number.isFinite(szRaw) && szRaw > 0) {
80417
- fontSize = szRaw / 100;
80926
+ if (fontSize === void 0 && Number.isFinite(szRaw) && szRaw > 0) {
80927
+ fontSize = szRaw / 100 * (96 / 72);
80928
+ }
80929
+ fontColor ??= deps.parseColor(deps.getChild(rPr, "solidFill")) ?? void 0;
80930
+ const eastAsian = deps.getChild(rPr, "ea");
80931
+ const latin = deps.getChild(rPr, "latin");
80932
+ const complexScript = deps.getChild(rPr, "cs");
80933
+ fontFamily ??= String(
80934
+ eastAsian?.["@_typeface"] || latin?.["@_typeface"] || complexScript?.["@_typeface"] || ""
80935
+ ).trim() || void 0;
80936
+ if (fontWeight === void 0 && rPr["@_b"] !== void 0) {
80937
+ fontWeight = drawingTextBoolean(rPr["@_b"]) ? 700 : 400;
80938
+ }
80939
+ if (fontStyle === void 0 && rPr["@_i"] !== void 0) {
80940
+ fontStyle = drawingTextBoolean(rPr["@_i"]) ? "italic" : "normal";
80418
80941
  }
80419
- fontColor = deps.parseColor(deps.getChild(rPr, "solidFill")) ?? void 0;
80420
80942
  }
80421
- if (fontSize) {
80943
+ if (fontSize !== void 0 && fontFamily !== void 0 && fontColor !== void 0) {
80422
80944
  break;
80423
80945
  }
80424
80946
  }
80425
- if (fontSize) {
80947
+ if (fontSize !== void 0 && fontFamily !== void 0 && fontColor !== void 0) {
80426
80948
  break;
80427
80949
  }
80428
80950
  }
80429
- return { fontSize, fontColor };
80951
+ return {
80952
+ fontSize,
80953
+ fontColor,
80954
+ fontFamily,
80955
+ fontWeight,
80956
+ fontStyle,
80957
+ lineHeight,
80958
+ lineHeightRatio,
80959
+ lineSpacingAfter,
80960
+ lineSpacingAfterRatio,
80961
+ textInsetLeft: drawingTextEmuAttribute(bodyPr, "lIns", emuPerPx),
80962
+ textInsetTop: drawingTextEmuAttribute(bodyPr, "tIns", emuPerPx),
80963
+ textInsetRight: drawingTextEmuAttribute(bodyPr, "rIns", emuPerPx),
80964
+ textInsetBottom: drawingTextEmuAttribute(bodyPr, "bIns", emuPerPx),
80965
+ textVerticalAnchor: String(bodyPr?.["@_anchor"] || "").trim() || void 0
80966
+ };
80430
80967
  }
80431
80968
  function resolveSmartArtTextStyles(paragraphs, resolve2) {
80432
80969
  for (const paragraph of paragraphs ?? []) {
@@ -80566,10 +81103,13 @@ var PptxHandlerRuntime84 = class _PptxHandlerRuntime35 extends PptxHandlerRuntim
80566
81103
  const width = Math.round(parseInt(String(ext["@_cx"] || "0"), 10) / emuPerPx);
80567
81104
  const height = Math.round(parseInt(String(ext["@_cy"] || "0"), 10) / emuPerPx);
80568
81105
  const rotation = xfrm?.["@_rot"] ? parseInt(String(xfrm["@_rot"]), 10) / 6e4 : void 0;
81106
+ const flipHorizontal = ["1", "true"].includes(String(xfrm?.["@_flipH"] ?? "").toLowerCase());
81107
+ const flipVertical = ["1", "true"].includes(String(xfrm?.["@_flipV"] ?? "").toLowerCase());
80569
81108
  const skewX = xfrm?.["@_skewX"] ? parseInt(String(xfrm["@_skewX"]), 10) / 6e4 : void 0;
80570
81109
  const skewY = xfrm?.["@_skewY"] ? parseInt(String(xfrm["@_skewY"]), 10) / 6e4 : void 0;
80571
81110
  const prstGeom = this.xmlLookupService.getChildByLocalName(spPr, "prstGeom");
80572
81111
  const custGeom = this.xmlLookupService.getChildByLocalName(spPr, "custGeom");
81112
+ const shapeAdjustments = prstGeom ? this.parseGeometryAdjustments(prstGeom) : void 0;
80573
81113
  let shapeType = prstGeom ? String(prstGeom["@_prst"] || "rect") : "rect";
80574
81114
  let customGeometry = {};
80575
81115
  if (custGeom) {
@@ -80607,10 +81147,15 @@ var PptxHandlerRuntime84 = class _PptxHandlerRuntime35 extends PptxHandlerRuntim
80607
81147
  this.collectLocalTextValues(txBody, "t", textValues2);
80608
81148
  }
80609
81149
  const text2 = textValues2.join("").trim() || void 0;
80610
- const { fontSize, fontColor } = extractDrawingShapeTextStyle(
80611
- txBody,
80612
- this.drawingShapeStyleDeps()
80613
- );
81150
+ const textStyle = extractDrawingShapeTextStyle(txBody, this.drawingShapeStyleDeps(), emuPerPx);
81151
+ const { fontSize, fontColor } = textStyle;
81152
+ const txXfrm = this.xmlLookupService.getChildByLocalName(sp, "txXfrm");
81153
+ const txOff = this.xmlLookupService.getChildByLocalName(txXfrm, "off");
81154
+ const txExt = this.xmlLookupService.getChildByLocalName(txXfrm, "ext");
81155
+ const textFrameX = drawingTextEmuAttribute(txOff, "x", emuPerPx);
81156
+ const textFrameY = drawingTextEmuAttribute(txOff, "y", emuPerPx);
81157
+ const textFrameWidth = drawingTextEmuAttribute(txExt, "cx", emuPerPx);
81158
+ const textFrameHeight = drawingTextEmuAttribute(txExt, "cy", emuPerPx);
80614
81159
  const paragraphs = txBody ? resolveSmartArtTextStyles(
80615
81160
  parseSmartArtTextParagraphs({ "dgm:t": txBody }),
80616
81161
  (rPr) => this.extractTextRunStyle(rPr, void 0, void 0, false)
@@ -80634,16 +81179,22 @@ var PptxHandlerRuntime84 = class _PptxHandlerRuntime35 extends PptxHandlerRuntim
80634
81179
  width,
80635
81180
  height,
80636
81181
  rotation,
81182
+ flipHorizontal,
81183
+ flipVertical,
80637
81184
  skewX,
80638
81185
  skewY,
81186
+ shapeAdjustments,
80639
81187
  ...fill,
80640
81188
  fillColor: fill.fillColor ?? void 0,
80641
81189
  strokeColor: strokeColor ?? void 0,
80642
81190
  strokeWidth,
80643
81191
  text: structuredText,
80644
81192
  textSegments,
80645
- fontSize,
80646
- fontColor,
81193
+ ...textStyle,
81194
+ textFrameX,
81195
+ textFrameY,
81196
+ textFrameWidth,
81197
+ textFrameHeight,
80647
81198
  ...customGeometry
80648
81199
  };
80649
81200
  }
@@ -82940,7 +83491,9 @@ var PptxHandlerRuntime93 = class _PptxHandlerRuntime37 extends PptxHandlerRuntim
82940
83491
  extractBackgroundGradient: (slideXml3) => this.extractBackgroundGradient(slideXml3),
82941
83492
  getLayoutBackgroundGradient: (slidePath) => this.getLayoutBackgroundGradient(slidePath),
82942
83493
  extractBackgroundImage: (slideXml3, slidePath) => this.extractBackgroundImage(slideXml3, slidePath),
83494
+ extractBackgroundImageProperties: (slideXml3, rootElement) => this.extractBackgroundImageProperties(slideXml3, rootElement),
82943
83495
  getLayoutBackgroundImage: (slidePath) => this.getLayoutBackgroundImage(slidePath),
83496
+ getLayoutBackgroundImageProperties: (slidePath) => this.getLayoutBackgroundImageProperties(slidePath),
82944
83497
  rememberSlideBackgroundOrigin: (slidePath, origin) => rememberSlideBackgroundOrigin(this, slidePath, origin),
82945
83498
  extractSlideNotes: (slidePath) => this.extractSlideNotes(slidePath),
82946
83499
  extractSlideComments: (slidePath) => this.extractSlideComments(slidePath),
@@ -99580,8 +100133,8 @@ function buildCustomGeometryClipPath(pathData, pathWidth, pathHeight, elemWidth,
99580
100133
  return `path('${out.join(" ")}')`;
99581
100134
  }
99582
100135
  function getResolvedShapeClipPath(element, width, height) {
99583
- const w = typeof width === "number" ? width : element.width;
99584
- const h = typeof height === "number" ? height : element.height;
100136
+ const w = element.width;
100137
+ const h = element.height;
99585
100138
  const custom = element;
99586
100139
  if (custom.pathData && custom.pathWidth && custom.pathHeight) {
99587
100140
  const customClip = buildCustomGeometryClipPath(
@@ -100499,6 +101052,33 @@ function resolveComputedFill(ss, element) {
100499
101052
  }
100500
101053
  return {};
100501
101054
  }
101055
+ function isTextOrientationMatrix2(value) {
101056
+ return Array.isArray(value) && value.length === 4 && value.every((entry2) => typeof entry2 === "number" && Number.isFinite(entry2));
101057
+ }
101058
+ function multiplyTextOrientationMatrices2(left, right) {
101059
+ return [
101060
+ left[0] * right[0] + left[2] * right[1],
101061
+ left[1] * right[0] + left[3] * right[1],
101062
+ left[0] * right[2] + left[2] * right[3],
101063
+ left[1] * right[2] + left[3] * right[3]
101064
+ ];
101065
+ }
101066
+ function getElementOrientationMatrix2(element) {
101067
+ const radians = (Number(element.rotation) || 0) * Math.PI / 180;
101068
+ const cosine = Math.cos(radians);
101069
+ const sine = Math.sin(radians);
101070
+ const rotation = [cosine, sine, -sine, cosine];
101071
+ const flip = [
101072
+ element.flipHorizontal ? -1 : 1,
101073
+ 0,
101074
+ 0,
101075
+ element.flipVertical ? -1 : 1
101076
+ ];
101077
+ return multiplyTextOrientationMatrices2(rotation, flip);
101078
+ }
101079
+ function textOrientationAngleScore(matrix) {
101080
+ return Math.abs(Math.atan2(matrix[1], matrix[0]));
101081
+ }
100502
101082
  function normalizeStrokeDashType(value) {
100503
101083
  const normalized = String(value || "").trim().toLowerCase();
100504
101084
  if (!normalized) {
@@ -100600,12 +101180,37 @@ function getElementTransformWithoutRotation(element) {
100600
101180
  }
100601
101181
  function getTextCompensationTransform(element) {
100602
101182
  const transforms = [];
100603
- if (element.flipHorizontal) {
101183
+ const normalizedRotation = ((Number(element.rotation) || 0) % 360 + 360) % 360;
101184
+ const swapFlipAxis = normalizedRotation > 90 && normalizedRotation < 270 && element.flipHorizontal !== element.flipVertical;
101185
+ const compensateHorizontal = swapFlipAxis ? element.flipVertical : element.flipHorizontal;
101186
+ const compensateVertical = swapFlipAxis ? element.flipHorizontal : element.flipVertical;
101187
+ if (compensateHorizontal) {
100604
101188
  transforms.push("scaleX(-1)");
100605
101189
  }
100606
- if (element.flipVertical) {
101190
+ if (compensateVertical) {
100607
101191
  transforms.push("scaleY(-1)");
100608
101192
  }
101193
+ const ancestorGroupTransform = "textStyle" in element ? element.textStyle?.ancestorGroupTransform : void 0;
101194
+ if (isTextOrientationMatrix2(ancestorGroupTransform)) {
101195
+ const localCompensation = [
101196
+ compensateHorizontal ? -1 : 1,
101197
+ 0,
101198
+ 0,
101199
+ compensateVertical ? -1 : 1
101200
+ ];
101201
+ const visibleTransform = multiplyTextOrientationMatrices2(
101202
+ multiplyTextOrientationMatrices2(ancestorGroupTransform, getElementOrientationMatrix2(element)),
101203
+ localCompensation
101204
+ );
101205
+ const determinant = visibleTransform[0] * visibleTransform[3] - visibleTransform[1] * visibleTransform[2];
101206
+ if (determinant < -1e-6) {
101207
+ const horizontalCandidate = multiplyTextOrientationMatrices2(visibleTransform, [-1, 0, 0, 1]);
101208
+ const verticalCandidate = multiplyTextOrientationMatrices2(visibleTransform, [1, 0, 0, -1]);
101209
+ transforms.push(
101210
+ textOrientationAngleScore(horizontalCandidate) <= textOrientationAngleScore(verticalCandidate) ? "scaleX(-1)" : "scaleY(-1)"
101211
+ );
101212
+ }
101213
+ }
100609
101214
  return transforms.length > 0 ? transforms.join(" ") : void 0;
100610
101215
  }
100611
101216
  function parseDrawingPercent2(value) {
@@ -100799,6 +101404,7 @@ function getOuterShadowCss(style, context) {
100799
101404
  if (!style?.shadowColor || style.shadowColor === "transparent") {
100800
101405
  return void 0;
100801
101406
  }
101407
+ const usesOoxmlDefaults = style.outerShadowXml !== void 0;
100802
101408
  let offsetX;
100803
101409
  let offsetY;
100804
101410
  if (typeof style.shadowAngle === "number" && typeof style.shadowDistance === "number") {
@@ -100807,11 +101413,12 @@ function getOuterShadowCss(style, context) {
100807
101413
  offsetX = Math.cos(angleRad) * style.shadowDistance;
100808
101414
  offsetY = Math.sin(angleRad) * style.shadowDistance;
100809
101415
  } else {
100810
- offsetX = typeof style.shadowOffsetX === "number" && Number.isFinite(style.shadowOffsetX) ? style.shadowOffsetX : 4;
100811
- offsetY = typeof style.shadowOffsetY === "number" && Number.isFinite(style.shadowOffsetY) ? style.shadowOffsetY : 4;
101416
+ offsetX = typeof style.shadowOffsetX === "number" && Number.isFinite(style.shadowOffsetX) ? style.shadowOffsetX : usesOoxmlDefaults ? 0 : 4;
101417
+ offsetY = typeof style.shadowOffsetY === "number" && Number.isFinite(style.shadowOffsetY) ? style.shadowOffsetY : usesOoxmlDefaults ? 0 : 4;
100812
101418
  }
100813
- const blur = typeof style.shadowBlur === "number" && Number.isFinite(style.shadowBlur) ? Math.max(0, style.shadowBlur) : 6;
100814
- const opacity2 = typeof style.shadowOpacity === "number" && Number.isFinite(style.shadowOpacity) ? clampUnitInterval22(style.shadowOpacity) : 0.35;
101419
+ const rawBlur = typeof style.shadowBlur === "number" && Number.isFinite(style.shadowBlur) ? Math.max(0, style.shadowBlur) : usesOoxmlDefaults ? 0 : 6;
101420
+ const blur = usesOoxmlDefaults ? rawBlur / 2 : rawBlur;
101421
+ const opacity2 = typeof style.shadowOpacity === "number" && Number.isFinite(style.shadowOpacity) ? clampUnitInterval22(style.shadowOpacity) : usesOoxmlDefaults ? 1 : 0.35;
100815
101422
  const spread = getShadowScaleSpread(style.shadowScaleX, style.shadowScaleY, blur);
100816
101423
  const color2 = colorWithOpacity2(
100817
101424
  normalizeHexColor2(style.shadowColor, DEFAULT_SHADOW_COLOR),
@@ -100820,6 +101427,48 @@ function getOuterShadowCss(style, context) {
100820
101427
  const geometry = `${Math.round(offsetX)}px ${Math.round(offsetY)}px ${Math.round(blur)}px`;
100821
101428
  return spread === 0 ? `${geometry} ${color2}` : `${geometry} ${spread}px ${color2}`;
100822
101429
  }
101430
+ function getCompositeOuterShadowFilterCss(style, context) {
101431
+ if (!style) {
101432
+ return void 0;
101433
+ }
101434
+ const usesOoxmlDefaults = style.outerShadowXml !== void 0;
101435
+ const shadows = style.shadows && style.shadows.length > 0 ? style.shadows : style.shadowColor && style.shadowColor !== "transparent" ? [
101436
+ {
101437
+ angle: style.shadowAngle,
101438
+ distance: style.shadowDistance,
101439
+ offsetX: style.shadowOffsetX,
101440
+ offsetY: style.shadowOffsetY,
101441
+ blur: style.shadowBlur,
101442
+ color: style.shadowColor,
101443
+ opacity: style.shadowOpacity
101444
+ }
101445
+ ] : [];
101446
+ const parts = [];
101447
+ for (const shadow of shadows) {
101448
+ if (!shadow.color || shadow.color === "transparent") {
101449
+ continue;
101450
+ }
101451
+ let offsetX;
101452
+ let offsetY;
101453
+ if (typeof shadow.angle === "number" && typeof shadow.distance === "number") {
101454
+ const angle = style.shadowRotateWithShape === false && typeof context?.rotation === "number" ? shadow.angle - context.rotation : shadow.angle;
101455
+ const angleRad = angle * Math.PI / 180;
101456
+ offsetX = Math.cos(angleRad) * shadow.distance;
101457
+ offsetY = Math.sin(angleRad) * shadow.distance;
101458
+ } else {
101459
+ offsetX = typeof shadow.offsetX === "number" && Number.isFinite(shadow.offsetX) ? shadow.offsetX : usesOoxmlDefaults ? 0 : 4;
101460
+ offsetY = typeof shadow.offsetY === "number" && Number.isFinite(shadow.offsetY) ? shadow.offsetY : usesOoxmlDefaults ? 0 : 4;
101461
+ }
101462
+ const rawBlur = typeof shadow.blur === "number" && Number.isFinite(shadow.blur) ? Math.max(0, shadow.blur) : usesOoxmlDefaults ? 0 : 6;
101463
+ const blur = usesOoxmlDefaults ? rawBlur / 2 : rawBlur;
101464
+ const opacity2 = typeof shadow.opacity === "number" && Number.isFinite(shadow.opacity) ? clampUnitInterval22(shadow.opacity) : usesOoxmlDefaults ? 1 : 0.35;
101465
+ const color2 = colorWithOpacity2(normalizeHexColor2(shadow.color, DEFAULT_SHADOW_COLOR), opacity2);
101466
+ parts.push(
101467
+ `drop-shadow(${Math.round(offsetX)}px ${Math.round(offsetY)}px ${Math.round(blur)}px ${color2})`
101468
+ );
101469
+ }
101470
+ return parts.length > 0 ? parts.join(" ") : void 0;
101471
+ }
100823
101472
  function getShadowScaleSpread(scaleX, scaleY, blur) {
100824
101473
  const sx = typeof scaleX === "number" && Number.isFinite(scaleX) ? scaleX / 1e5 : 1;
100825
101474
  const sy = typeof scaleY === "number" && Number.isFinite(scaleY) ? scaleY / 1e5 : 1;
@@ -100988,7 +101637,7 @@ function getEffectFilterCss(style, elementId) {
100988
101637
  const parts = [];
100989
101638
  if (style.glowColor && style.glowColor !== "transparent" && style.glowRadius) {
100990
101639
  const glowOpacity = typeof style.glowOpacity === "number" ? style.glowOpacity : 0.75;
100991
- const glowRad = Math.round(Math.max(0, style.glowRadius));
101640
+ const glowRad = Math.max(0, style.glowRadius / 2);
100992
101641
  const glowCol = colorWithOpacity2(
100993
101642
  normalizeHexColor2(style.glowColor, DEFAULT_GLOW_COLOR),
100994
101643
  glowOpacity
@@ -101069,7 +101718,9 @@ function getComputedEffectStyle(element, options = {}) {
101069
101718
  return result;
101070
101719
  }
101071
101720
  const paintsLineEffectsItself = element.type === "connector" || getShapeType("shapeType" in element ? element.shapeType : void 0) === "connector";
101072
- const boxShadow = getBoxShadowCss(
101721
+ const shadowsCompositePixels = element.type === "group" || element.type === "text" || element.type === "image" || element.type === "picture";
101722
+ const compositeShadow = shadowsCompositePixels ? getCompositeOuterShadowFilterCss(style, { rotation: element.rotation }) : void 0;
101723
+ const boxShadow = shadowsCompositePixels ? void 0 : getBoxShadowCss(
101073
101724
  style,
101074
101725
  { includeGlow: options.includeGlowBoxShadow },
101075
101726
  { rotation: element.rotation }
@@ -101083,7 +101734,7 @@ function getComputedEffectStyle(element, options = {}) {
101083
101734
  }
101084
101735
  const filter = getEffectFilterCss(style, element.id);
101085
101736
  const lineGlow = paintsLineEffectsItself ? void 0 : getLineGlowFilterCss(style);
101086
- const filterParts = [filter, lineGlow].filter(
101737
+ const filterParts = [compositeShadow, filter, lineGlow].filter(
101087
101738
  (part) => part !== void 0 && part !== ""
101088
101739
  );
101089
101740
  if (filterParts.length > 0) {
@@ -101229,6 +101880,55 @@ function outlinePathData(clipPath, width, height) {
101229
101880
  }
101230
101881
  return rect2;
101231
101882
  }
101883
+ var WEDGE_CALLOUT_PRESET_NAMES = /* @__PURE__ */ new Set([
101884
+ "wedgerectcallout",
101885
+ "wedgeroundrectcallout",
101886
+ "wedgeellipsecallout"
101887
+ ]);
101888
+ function isWedgeCalloutPresetShape(shapeType) {
101889
+ return typeof shapeType === "string" && WEDGE_CALLOUT_PRESET_NAMES.has(shapeType.toLowerCase());
101890
+ }
101891
+ function clipPathPolygonPoints(clipPath, width, height) {
101892
+ const asPolygon = /^polygon\((.*)\)$/su.exec(clipPath.trim());
101893
+ if (!asPolygon) {
101894
+ return [];
101895
+ }
101896
+ const toPx2 = (token2, extent) => token2.endsWith("%") ? Number.parseFloat(token2) / 100 * extent : Number.parseFloat(token2);
101897
+ return asPolygon[1].split(",").map((pair) => pair.trim().split(/\s+/u)).filter((parts) => parts.length === 2).map(([rawX, rawY]) => [toPx2(rawX, width), toPx2(rawY, height)]).filter(([x, y]) => Number.isFinite(x) && Number.isFinite(y));
101898
+ }
101899
+ function getPresetShapeVectorGeometry(shapeType, width, height, adjustments) {
101900
+ const normalizedWidth = Math.max(Number.isFinite(width) ? width : 0, 1);
101901
+ const normalizedHeight = Math.max(Number.isFinite(height) ? height : 0, 1);
101902
+ const clipPath = getResolvedShapeClipPathFor(
101903
+ shapeType,
101904
+ normalizedWidth,
101905
+ normalizedHeight,
101906
+ adjustments
101907
+ );
101908
+ const d = outlinePathData(clipPath, normalizedWidth, normalizedHeight);
101909
+ if (!d) {
101910
+ return void 0;
101911
+ }
101912
+ let minX = 0;
101913
+ let minY = 0;
101914
+ let maxX = normalizedWidth;
101915
+ let maxY = normalizedHeight;
101916
+ for (const [x, y] of clipPath ? clipPathPolygonPoints(clipPath, normalizedWidth, normalizedHeight) : []) {
101917
+ minX = Math.min(minX, x);
101918
+ minY = Math.min(minY, y);
101919
+ maxX = Math.max(maxX, x);
101920
+ maxY = Math.max(maxY, y);
101921
+ }
101922
+ return {
101923
+ d,
101924
+ minX,
101925
+ minY,
101926
+ maxX,
101927
+ maxY,
101928
+ viewWidth: Math.max(maxX - minX, 1),
101929
+ viewHeight: Math.max(maxY - minY, 1)
101930
+ };
101931
+ }
101232
101932
  function outlineStrands(compoundLine, strokeWidth) {
101233
101933
  const offsets = getCompoundLineOffsets(compoundLine, strokeWidth);
101234
101934
  if (offsets.length <= 1) {
@@ -113224,6 +113924,7 @@ var KEYFRAME_DEFINITIONS = {
113224
113924
  function getEffectKeyframes(effect) {
113225
113925
  return KEYFRAME_DEFINITIONS[effect] ?? "";
113226
113926
  }
113927
+ var HEX_COLOR2 = /^#?[0-9a-f]{6}$/iu;
113227
113928
  function hexToRgb4(hex4) {
113228
113929
  const cleaned = hex4.replace(/^#/u, "");
113229
113930
  const val2 = parseInt(cleaned, 16);
@@ -113338,48 +114039,145 @@ function resolveCssProperties(attrName) {
113338
114039
  }
113339
114040
  return ATTR_NAME_TO_CSS_PROPERTIES[attrName] ?? ["color"];
113340
114041
  }
113341
- function resolveColorAnimationTargets(targetAttribute) {
113342
- const cssProperties = resolveCssProperties(targetAttribute);
114042
+ function resolveColorAnimationTargets(animationOrAttribute) {
114043
+ const attributes = typeof animationOrAttribute === "string" || animationOrAttribute === void 0 ? [animationOrAttribute] : colorAnimationComponents(animationOrAttribute).map(
114044
+ (component) => component.targetAttribute
114045
+ );
113343
114046
  const targets = [];
113344
- if (cssProperties.includes("fill")) {
113345
- targets.push("fill");
113346
- }
113347
- if (cssProperties.includes("stroke")) {
113348
- targets.push("stroke");
114047
+ for (const attribute2 of attributes) {
114048
+ const cssProperties = resolveCssProperties(attribute2);
114049
+ if (cssProperties.includes("fill") && !targets.includes("fill")) {
114050
+ targets.push("fill");
114051
+ }
114052
+ if (cssProperties.includes("stroke") && !targets.includes("stroke")) {
114053
+ targets.push("stroke");
114054
+ }
113349
114055
  }
113350
114056
  return targets;
113351
114057
  }
113352
- function buildColorAnimationKeyframes(colorAnim, keyframeName, steps = 10) {
113353
- const { colorSpace, direction, fromColor, toColor, byColor, targetAttribute } = colorAnim;
114058
+ var ANIMATION_COLOR_BASE_PROPERTIES = {
114059
+ color: "--pptx-animation-color-base",
114060
+ fill: "--pptx-animation-fill-base",
114061
+ stroke: "--pptx-animation-stroke-base"
114062
+ };
114063
+ function colorAnimationComponents(colorAnim) {
114064
+ return colorAnim.components && colorAnim.components.length > 0 ? colorAnim.components : [colorAnim];
114065
+ }
114066
+ function clampPercent(value) {
114067
+ return Math.max(0, Math.min(100, value));
114068
+ }
114069
+ function applyHslDelta(fromColor, delta, progress) {
114070
+ const fromRgb = hexToRgb4(fromColor);
114071
+ const fromHsl = rgbToHsl2(fromRgb.r, fromRgb.g, fromRgb.b);
114072
+ const hue = ((fromHsl.h + delta.hue * progress) % 360 + 360) % 360;
114073
+ const saturation = clampPercent(fromHsl.s + delta.saturation * progress);
114074
+ const lightness = clampPercent(fromHsl.l + delta.lightness * progress);
114075
+ const rgb = hslToRgb2(hue, saturation, lightness);
114076
+ return rgbToHex3(rgb.r, rgb.g, rgb.b);
114077
+ }
114078
+ function cssNumber(value) {
114079
+ const rounded = Math.round(value * 1e6) / 1e6;
114080
+ return String(Object.is(rounded, -0) ? 0 : rounded);
114081
+ }
114082
+ function baseColorForProperty(property) {
114083
+ if (property === "fill" || property === "background-color" || property === "backgroundColor") {
114084
+ return `var(${ANIMATION_COLOR_BASE_PROPERTIES.fill}, currentColor)`;
114085
+ }
114086
+ if (property === "stroke" || property === "border-color" || property === "borderColor") {
114087
+ return `var(${ANIMATION_COLOR_BASE_PROPERTIES.stroke}, currentColor)`;
114088
+ }
114089
+ return `var(${ANIMATION_COLOR_BASE_PROPERTIES.color}, currentColor)`;
114090
+ }
114091
+ function relativeHslColor(property, delta, progress) {
114092
+ const hue = cssNumber(delta.hue * progress);
114093
+ const saturation = cssNumber(delta.saturation * progress);
114094
+ const lightness = cssNumber(delta.lightness * progress);
114095
+ return `hsl(from ${baseColorForProperty(property)} calc(h + ${hue}) calc(s + ${saturation}) calc(l + ${lightness}) / alpha)`;
114096
+ }
114097
+ function absoluteComponentColor(component, progress) {
114098
+ const { colorSpace, direction, fromColor, toColor, byColor } = component;
113354
114099
  let effectiveFrom;
113355
114100
  let effectiveTo;
113356
114101
  if (fromColor && toColor) {
114102
+ if (!HEX_COLOR2.test(fromColor) || !HEX_COLOR2.test(toColor)) {
114103
+ return void 0;
114104
+ }
113357
114105
  effectiveFrom = fromColor;
113358
114106
  effectiveTo = toColor;
113359
114107
  } else if (fromColor && byColor) {
114108
+ if (!HEX_COLOR2.test(fromColor) || !HEX_COLOR2.test(byColor)) {
114109
+ return void 0;
114110
+ }
113360
114111
  const fromRgb = hexToRgb4(fromColor);
113361
114112
  const byRgb = hexToRgb4(byColor);
113362
114113
  effectiveFrom = fromColor;
113363
114114
  effectiveTo = rgbToHex3(fromRgb.r + byRgb.r, fromRgb.g + byRgb.g, fromRgb.b + byRgb.b);
113364
114115
  } else if (toColor) {
114116
+ if (!HEX_COLOR2.test(toColor)) {
114117
+ return void 0;
114118
+ }
113365
114119
  effectiveFrom = "#000000";
113366
114120
  effectiveTo = toColor;
113367
114121
  } else {
113368
114122
  return void 0;
113369
114123
  }
113370
- const cssProperties = resolveCssProperties(targetAttribute);
114124
+ return interpolateColor(effectiveFrom, effectiveTo, progress, colorSpace, direction);
114125
+ }
114126
+ function buildColorAnimationKeyframes(colorAnim, keyframeName2, steps = 10) {
114127
+ const components = colorAnimationComponents(colorAnim);
114128
+ if (!components.some(
114129
+ (component) => component.hslDelta !== void 0 || component.toColor !== void 0 || component.fromColor !== void 0 && component.byColor !== void 0
114130
+ )) {
114131
+ return void 0;
114132
+ }
113371
114133
  const lines = [];
114134
+ let hasDeclarations = false;
113372
114135
  const actualSteps = Math.max(2, steps);
113373
114136
  for (let i = 0; i <= actualSteps; i++) {
113374
114137
  const t = i / actualSteps;
113375
114138
  const pct = Math.round(t * 100);
113376
- const color2 = interpolateColor(effectiveFrom, effectiveTo, t, colorSpace, direction);
113377
- const decls = cssProperties.map((prop) => `${prop}: ${color2};`).join(" ");
114139
+ const declarations = [];
114140
+ for (const component of components) {
114141
+ const cssProperties = resolveCssProperties(component.targetAttribute);
114142
+ if (component.hslDelta) {
114143
+ if (component.fromColor && !HEX_COLOR2.test(component.fromColor)) {
114144
+ continue;
114145
+ }
114146
+ for (const property of cssProperties) {
114147
+ const color22 = component.fromColor ? applyHslDelta(component.fromColor, component.hslDelta, t) : relativeHslColor(property, component.hslDelta, t);
114148
+ declarations.push(`${property}: ${color22};`);
114149
+ hasDeclarations = true;
114150
+ }
114151
+ continue;
114152
+ }
114153
+ const color2 = absoluteComponentColor(component, t);
114154
+ if (color2) {
114155
+ declarations.push(...cssProperties.map((property) => `${property}: ${color2};`));
114156
+ hasDeclarations = true;
114157
+ }
114158
+ }
114159
+ const decls = declarations.join(" ");
113378
114160
  lines.push(` ${pct}% { ${decls} }`);
113379
114161
  }
113380
- return `@keyframes ${keyframeName} {
114162
+ return hasDeclarations ? `@keyframes ${keyframeName2} {
113381
114163
  ${lines.join("\n")}
113382
- }`;
114164
+ }` : void 0;
114165
+ }
114166
+ function getAnimationColorBaseStyle(element, options = {}) {
114167
+ if (!hasShapeProperties(element) || !options.animatesFill && !options.animatesStroke) {
114168
+ return {};
114169
+ }
114170
+ const style = {};
114171
+ if (options.animatesFill) {
114172
+ const fill = getComputedFillStyle(element, options.parentGroupFill);
114173
+ style[ANIMATION_COLOR_BASE_PROPERTIES.fill] = fill?.backgroundColor ?? element.shapeStyle?.fillColor ?? "currentColor";
114174
+ }
114175
+ if (options.animatesStroke) {
114176
+ const stroke = getComputedStrokeStyle(element);
114177
+ style[ANIMATION_COLOR_BASE_PROPERTIES.stroke] = stroke.borderColor ?? element.shapeStyle?.strokeColor ?? "currentColor";
114178
+ }
114179
+ style[ANIMATION_COLOR_BASE_PROPERTIES.color] = (hasTextProperties(element) ? element.textStyle?.color : void 0) ?? "currentColor";
114180
+ return style;
113383
114181
  }
113384
114182
  function resolveChartBuildMode(token2) {
113385
114183
  switch (token2) {
@@ -113546,6 +114344,141 @@ function revealedSmartArtNodeCount(nodes, build) {
113546
114344
  }
113547
114345
  return revealedStageCount(build.progress, nodes.length);
113548
114346
  }
114347
+ var ATTRIBUTE_KINDS = {
114348
+ opacity: "opacity",
114349
+ ppt_h: "scaleY",
114350
+ ppt_w: "scaleX",
114351
+ ppt_x: "translateX",
114352
+ ppt_y: "translateY",
114353
+ "style.opacity": "opacity",
114354
+ "style.rotation": "rotation"
114355
+ };
114356
+ var SELF_REFERENCE_RE = /^#?ppt_([whxy])(?:([+-])(\d*\.?\d+))?$/iu;
114357
+ function clamp0122(value) {
114358
+ return Math.max(0, Math.min(1, value));
114359
+ }
114360
+ function numericValue(keyframe) {
114361
+ const parsed = Number(keyframe.value);
114362
+ return Number.isFinite(parsed) ? parsed : void 0;
114363
+ }
114364
+ function parseSelfReference(keyframe, expectedAxis) {
114365
+ const token2 = String(keyframe.value).replaceAll(" ", "").toLowerCase();
114366
+ const match = SELF_REFERENCE_RE.exec(token2);
114367
+ if (!match || match[1] !== expectedAxis) {
114368
+ return void 0;
114369
+ }
114370
+ const magnitude = match[3] === void 0 ? 0 : Number(match[3]);
114371
+ if (!Number.isFinite(magnitude)) {
114372
+ return void 0;
114373
+ }
114374
+ return { offset: match[2] === "-" ? -magnitude : magnitude };
114375
+ }
114376
+ function parseValue(kind, keyframe) {
114377
+ if (kind === "rotation") {
114378
+ return numericValue(keyframe);
114379
+ }
114380
+ if (kind === "opacity") {
114381
+ const value = numericValue(keyframe);
114382
+ return value === void 0 ? void 0 : clamp0122(value);
114383
+ }
114384
+ if (kind === "scaleX" || kind === "scaleY") {
114385
+ const numeric = numericValue(keyframe);
114386
+ if (numeric === 0) {
114387
+ return 0;
114388
+ }
114389
+ const axis2 = kind === "scaleX" ? "w" : "h";
114390
+ const reference2 = parseSelfReference(keyframe, axis2);
114391
+ return reference2?.offset === 0 ? 1 : void 0;
114392
+ }
114393
+ const axis = kind === "translateX" ? "x" : "y";
114394
+ const reference = parseSelfReference(keyframe, axis);
114395
+ return reference === void 0 ? void 0 : reference.offset * 100;
114396
+ }
114397
+ function parseComponent(component, effectDurationMs) {
114398
+ const kind = ATTRIBUTE_KINDS[component.attrName];
114399
+ if (!kind) {
114400
+ return void 0;
114401
+ }
114402
+ const stops = [];
114403
+ for (const keyframe of component.keyframes) {
114404
+ if (typeof keyframe.tm !== "number" || !Number.isFinite(keyframe.tm)) {
114405
+ return void 0;
114406
+ }
114407
+ const value = parseValue(kind, keyframe);
114408
+ if (value === void 0) {
114409
+ return void 0;
114410
+ }
114411
+ stops.push({ progress: clamp0122(keyframe.tm / 1e5), value });
114412
+ }
114413
+ if (stops.length < 2) {
114414
+ return void 0;
114415
+ }
114416
+ stops.sort((left, right) => left.progress - right.progress);
114417
+ return {
114418
+ delayMs: component.delayMs ?? 0,
114419
+ durationMs: component.durationMs ?? effectDurationMs,
114420
+ kind,
114421
+ stops
114422
+ };
114423
+ }
114424
+ function valueAt(component, progress, effectDurationMs) {
114425
+ const elapsedMs = progress * effectDurationMs - component.delayMs;
114426
+ const localProgress = clamp0122(elapsedMs / Math.max(1, component.durationMs));
114427
+ const first = component.stops[0];
114428
+ const last = component.stops[component.stops.length - 1];
114429
+ if (localProgress <= first.progress) {
114430
+ return first.value;
114431
+ }
114432
+ if (localProgress >= last.progress) {
114433
+ return last.value;
114434
+ }
114435
+ for (let index = 1; index < component.stops.length; index += 1) {
114436
+ const right = component.stops[index];
114437
+ const left = component.stops[index - 1];
114438
+ if (localProgress <= right.progress) {
114439
+ const span = Math.max(Number.EPSILON, right.progress - left.progress);
114440
+ const ratio = (localProgress - left.progress) / span;
114441
+ return left.value + (right.value - left.value) * ratio;
114442
+ }
114443
+ }
114444
+ return last.value;
114445
+ }
114446
+ function createAttributeTransformModel(anim) {
114447
+ const effectDurationMs = Math.max(1, anim.durationMs ?? 1e3);
114448
+ const supportedComponents = (anim.attributeAnimations ?? []).filter(
114449
+ (component) => ATTRIBUTE_KINDS[component.attrName] !== void 0
114450
+ );
114451
+ const components = supportedComponents.map(
114452
+ (component) => parseComponent(component, effectDurationMs)
114453
+ );
114454
+ const parsedComponents = components.filter(
114455
+ (component) => component !== void 0
114456
+ );
114457
+ if (parsedComponents.length !== supportedComponents.length) {
114458
+ return void 0;
114459
+ }
114460
+ if (parsedComponents.length === 0) {
114461
+ return void 0;
114462
+ }
114463
+ const progressSet = /* @__PURE__ */ new Set([0, 1]);
114464
+ for (const component of parsedComponents) {
114465
+ for (const stop of component.stops) {
114466
+ progressSet.add(
114467
+ clamp0122((component.delayMs + stop.progress * component.durationMs) / effectDurationMs)
114468
+ );
114469
+ }
114470
+ }
114471
+ return {
114472
+ progresses: [...progressSet].sort((left, right) => left - right),
114473
+ stateAt(progress) {
114474
+ const state = {};
114475
+ for (const component of parsedComponents) {
114476
+ state[component.kind] = valueAt(component, progress, effectDurationMs);
114477
+ }
114478
+ return state;
114479
+ }
114480
+ };
114481
+ }
113549
114482
  var BEZIER_SAMPLES = 8;
113550
114483
  function cubicAt(p0, c1, c2, p3, t) {
113551
114484
  const mt = 1 - t;
@@ -113631,119 +114564,150 @@ function parseMotionPathPoints(motionPath) {
113631
114564
  }
113632
114565
  return points3;
113633
114566
  }
113634
- function buildAbsoluteRotationKeyframe(anim, namePrefix, uid) {
113635
- if (anim.rotationBy !== void 0) {
113636
- return void 0;
114567
+ function slideOffset(percent3, axis) {
114568
+ const fallback = axis === "w" ? "1280px" : "720px";
114569
+ return `calc(var(--pptx-slide-${axis}, ${fallback}) * ${(percent3 / 100).toFixed(4)})`;
114570
+ }
114571
+ function hasRotation(anim) {
114572
+ return anim.rotationBy !== void 0 || anim.rotationFrom !== void 0 || anim.rotationTo !== void 0;
114573
+ }
114574
+ function hasScale(anim) {
114575
+ return anim.scaleByX !== void 0 || anim.scaleByY !== void 0 || anim.scaleFromX !== void 0 || anim.scaleFromY !== void 0 || anim.scaleToX !== void 0 || anim.scaleToY !== void 0;
114576
+ }
114577
+ function hasAuthoredTransform(anim) {
114578
+ return Boolean(anim.motionPath) || hasRotation(anim) || hasScale(anim) || createAttributeTransformModel(anim) !== void 0;
114579
+ }
114580
+ function rotationAt(anim, progress) {
114581
+ const from = anim.rotationFrom ?? 0;
114582
+ const to = anim.rotationTo ?? (anim.rotationBy !== void 0 ? from + anim.rotationBy : from);
114583
+ return from + (to - from) * progress;
114584
+ }
114585
+ function scaleAt(anim, axis, progress) {
114586
+ const from = axis === "x" ? anim.scaleFromX ?? 1 : anim.scaleFromY ?? 1;
114587
+ const authoredTo = axis === "x" ? anim.scaleToX : anim.scaleToY;
114588
+ const by = axis === "x" ? anim.scaleByX : anim.scaleByY;
114589
+ const to = authoredTo ?? (by !== void 0 ? from * by : from);
114590
+ return from + (to - from) * progress;
114591
+ }
114592
+ function opacityAt(anim, progress) {
114593
+ if (anim.presetClass === "entr") {
114594
+ return progress;
113637
114595
  }
113638
- if (anim.rotationFrom === void 0 && anim.rotationTo === void 0) {
113639
- return void 0;
114596
+ if (anim.presetClass === "exit") {
114597
+ return 1 - progress;
113640
114598
  }
113641
- const from = anim.rotationFrom ?? anim.rotationTo ?? 0;
113642
- const to = anim.rotationTo ?? anim.rotationFrom ?? 0;
113643
- const name = `${namePrefix}-${uid}`;
114599
+ return void 0;
114600
+ }
114601
+ function formatNumber(value, fractionDigits = 4) {
114602
+ return String(Number(value.toFixed(fractionDigits)));
114603
+ }
114604
+ function tangentAngle(points3, index) {
114605
+ const point = points3[index];
114606
+ const next = index < points3.length - 1 ? points3[index + 1] : point;
114607
+ const previous = index > 0 ? points3[index - 1] : point;
114608
+ const dx = index < points3.length - 1 ? next.x - point.x : point.x - previous.x;
114609
+ const dy = index < points3.length - 1 ? next.y - point.y : point.y - previous.y;
114610
+ return Math.atan2(dy, dx) * (180 / Math.PI);
114611
+ }
114612
+ function rotateMotionPathPoints(points3, anim) {
114613
+ const angle = anim.motionPathRotationAngle ?? 0;
114614
+ if (!Number.isFinite(angle) || angle === 0) {
114615
+ return [...points3];
114616
+ }
114617
+ const radians = angle * Math.PI / 180;
114618
+ const cosine = Math.cos(radians);
114619
+ const sine = Math.sin(radians);
114620
+ const centerX = anim.motionPathRotationCenterX ?? 0;
114621
+ const centerY = anim.motionPathRotationCenterY ?? 0;
114622
+ return points3.map((point) => {
114623
+ const x = point.x - centerX;
114624
+ const y = point.y - centerY;
114625
+ return {
114626
+ x: centerX + x * cosine - y * sine,
114627
+ y: centerY + x * sine + y * cosine
114628
+ };
114629
+ });
114630
+ }
114631
+ function pointAt(points3, progress) {
114632
+ if (points3.length < 2) {
114633
+ return { x: 0, y: 0 };
114634
+ }
114635
+ const position2 = progress * (points3.length - 1);
114636
+ const leftIndex = Math.floor(position2);
114637
+ const rightIndex = Math.min(points3.length - 1, leftIndex + 1);
114638
+ const ratio = position2 - leftIndex;
114639
+ const left = points3[leftIndex];
114640
+ const right = points3[rightIndex];
113644
114641
  return {
113645
- keyframeName: name,
113646
- css: `@keyframes ${name} {
113647
- from { transform: rotate(${from}deg); }
113648
- to { transform: rotate(${to}deg); }
113649
- }`
114642
+ x: left.x + (right.x - left.x) * ratio,
114643
+ y: left.y + (right.y - left.y) * ratio
113650
114644
  };
113651
114645
  }
113652
- function buildAbsoluteScaleKeyframe(anim, namePrefix, uid) {
113653
- if (anim.scaleByX !== void 0 || anim.scaleByY !== void 0) {
113654
- return void 0;
114646
+ function keyframeName(anim, prefixes, uid, hasAttributeAnimation) {
114647
+ const motion = Boolean(anim.motionPath);
114648
+ const rotation = hasRotation(anim);
114649
+ const scale = hasScale(anim);
114650
+ if (hasAttributeAnimation || Number(motion) + Number(rotation) + Number(scale) > 1) {
114651
+ return `${prefixes.transform}-${uid}`;
113655
114652
  }
113656
- if (anim.scaleFromX === void 0 && anim.scaleFromY === void 0 && anim.scaleToX === void 0 && anim.scaleToY === void 0) {
113657
- return void 0;
114653
+ if (motion) {
114654
+ return `${prefixes.motion}-${uid}`;
113658
114655
  }
113659
- const fromX = anim.scaleFromX ?? 1;
113660
- const fromY = anim.scaleFromY ?? 1;
113661
- const toX = anim.scaleToX ?? fromX;
113662
- const toY = anim.scaleToY ?? fromY;
113663
- const name = `${namePrefix}-${uid}`;
113664
- return {
113665
- keyframeName: name,
113666
- css: `@keyframes ${name} {
113667
- from { transform: scale(${fromX}, ${fromY}); }
113668
- to { transform: scale(${toX}, ${toY}); }
113669
- }`
113670
- };
113671
- }
113672
- function clamp0122(value) {
113673
- return Math.max(0, Math.min(1, value));
114656
+ if (rotation) {
114657
+ return `${anim.rotationBy === void 0 ? prefixes.rotationAbsolute : prefixes.rotationRelative}-${uid}`;
114658
+ }
114659
+ return `${anim.scaleByX === void 0 && anim.scaleByY === void 0 ? prefixes.scaleAbsolute : prefixes.scaleRelative}-${uid}`;
113674
114660
  }
113675
- var KNOWN_OPACITY_ATTR_NAMES = /* @__PURE__ */ new Set(["style.opacity", "opacity"]);
113676
- function buildOpacityTavKeyframe(anim, namePrefix, uid) {
113677
- if (anim.presetClass !== "emph") {
114661
+ function buildTransformKeyframes(anim, uid, prefixes) {
114662
+ const rotation = hasRotation(anim);
114663
+ const scale = hasScale(anim);
114664
+ const attributeModel = createAttributeTransformModel(anim);
114665
+ const parsedPoints = anim.motionPath ? rotateMotionPathPoints(parseMotionPathPoints(anim.motionPath), anim) : [];
114666
+ const points3 = parsedPoints.length >= 2 ? parsedPoints : [];
114667
+ if (points3.length === 0 && !rotation && !scale && !attributeModel) {
113678
114668
  return void 0;
113679
114669
  }
113680
- if (anim.attrName !== void 0 && !KNOWN_OPACITY_ATTR_NAMES.has(anim.attrName)) {
113681
- return void 0;
114670
+ const progressSet = new Set(attributeModel?.progresses ?? [0, 1]);
114671
+ for (let index = 0; index < points3.length; index += 1) {
114672
+ progressSet.add(index / (points3.length - 1));
113682
114673
  }
113683
- const frames = anim.keyframes;
113684
- if (!frames || frames.length < 2) {
113685
- return void 0;
113686
- }
113687
- const stops = [];
113688
- for (const kf of frames) {
113689
- if (typeof kf.tm !== "number" || !Number.isFinite(kf.tm)) {
113690
- return void 0;
114674
+ const progresses = [...progressSet].sort((left, right) => left - right);
114675
+ const lines = progresses.map((progress) => {
114676
+ const point = pointAt(points3, progress);
114677
+ const attributeState = attributeModel?.stateAt(progress);
114678
+ const declarations = [];
114679
+ const opacity2 = attributeState?.opacity ?? opacityAt(anim, progress);
114680
+ if (opacity2 !== void 0) {
114681
+ declarations.push(`opacity: ${formatNumber(opacity2)};`);
113691
114682
  }
113692
- if (kf.valueType !== "flt" && kf.valueType !== "int") {
113693
- return void 0;
114683
+ const transforms = [];
114684
+ if (points3.length > 0) {
114685
+ transforms.push(`translate(${slideOffset(point.x, "w")}, ${slideOffset(point.y, "h")})`);
113694
114686
  }
113695
- const opacity2 = Number(kf.value);
113696
- if (!Number.isFinite(opacity2) || opacity2 < 0 || opacity2 > 1) {
113697
- return void 0;
114687
+ if (attributeState?.translateX !== void 0 || attributeState?.translateY !== void 0) {
114688
+ transforms.push(
114689
+ `translate(${slideOffset(attributeState.translateX ?? 0, "w")}, ${slideOffset(attributeState.translateY ?? 0, "h")})`
114690
+ );
113698
114691
  }
113699
- stops.push({ pct: clamp0122(kf.tm / 1e5) * 100, opacity: opacity2 });
113700
- }
113701
- stops.sort((a, b) => a.pct - b.pct);
113702
- const name = `${namePrefix}-${uid}`;
113703
- const lines = stops.map((s) => ` ${Number(s.pct.toFixed(2))}% { opacity: ${s.opacity}; }`);
113704
- return { keyframeName: name, css: `@keyframes ${name} {
113705
- ${lines.join("\n")}
113706
- }` };
113707
- }
113708
- var KNOWN_COLOR_ATTR_NAMES = /* @__PURE__ */ new Set([
113709
- "fillcolor",
113710
- "fill.color",
113711
- "style.color",
113712
- "stroke.color"
113713
- ]);
113714
- var HEX_COLOR_RE = /^#[0-9a-f]{6}$/iu;
113715
- function buildColorTavKeyframe(anim, namePrefix, uid) {
113716
- if (anim.colorAnimation) {
113717
- return void 0;
113718
- }
113719
- if (!anim.attrName || !KNOWN_COLOR_ATTR_NAMES.has(anim.attrName)) {
113720
- return void 0;
113721
- }
113722
- const frames = anim.keyframes;
113723
- if (!frames || frames.length < 2) {
113724
- return void 0;
113725
- }
113726
- const stops = [];
113727
- for (const kf of frames) {
113728
- if (typeof kf.tm !== "number" || !Number.isFinite(kf.tm)) {
113729
- return void 0;
114692
+ if (rotation || points3.length > 0 && anim.motionPathRotateAuto || attributeState?.rotation !== void 0) {
114693
+ const pointIndex = Math.round(progress * Math.max(0, points3.length - 1));
114694
+ const pathRotation = anim.motionPathRotateAuto ? tangentAngle(points3, pointIndex) : 0;
114695
+ const angle = pathRotation + (attributeState?.rotation ?? rotationAt(anim, progress));
114696
+ transforms.push(
114697
+ `rotate(${anim.motionPathRotateAuto ? angle.toFixed(2) : formatNumber(angle, 2)}deg)`
114698
+ );
113730
114699
  }
113731
- if (kf.valueType !== "clr") {
113732
- return void 0;
114700
+ if (scale || attributeState?.scaleX !== void 0 || attributeState?.scaleY !== void 0) {
114701
+ transforms.push(
114702
+ `scale(${formatNumber(attributeState?.scaleX ?? scaleAt(anim, "x", progress))}, ${formatNumber(attributeState?.scaleY ?? scaleAt(anim, "y", progress))})`
114703
+ );
113733
114704
  }
113734
- const color2 = String(kf.value);
113735
- if (!HEX_COLOR_RE.test(color2)) {
113736
- return void 0;
114705
+ if (transforms.length > 0) {
114706
+ declarations.push(`transform: ${transforms.join(" ")};`);
113737
114707
  }
113738
- stops.push({ pct: clamp0122(kf.tm / 1e5) * 100, color: color2.toLowerCase() });
113739
- }
113740
- stops.sort((a, b) => a.pct - b.pct);
113741
- const cssProperties = resolveCssProperties(anim.attrName);
113742
- const name = `${namePrefix}-${uid}`;
113743
- const lines = stops.map((s) => {
113744
- const decls = cssProperties.map((prop) => `${prop}: ${s.color};`).join(" ");
113745
- return ` ${Number(s.pct.toFixed(2))}% { ${decls} }`;
114708
+ return ` ${formatNumber(progress * 100, 2)}% { ${declarations.join(" ")} }`;
113746
114709
  });
114710
+ const name = keyframeName(anim, prefixes, uid, attributeModel !== void 0);
113747
114711
  return { keyframeName: name, css: `@keyframes ${name} {
113748
114712
  ${lines.join("\n")}
113749
114713
  }` };
@@ -113788,71 +114752,18 @@ function applyFlyDirection(effect, subtype) {
113788
114752
  const suffix = `${edge.charAt(0).toUpperCase()}${edge.slice(1)}`;
113789
114753
  return `${prefix}${suffix}`;
113790
114754
  }
113791
- function slideOffset(percent3, axis) {
113792
- const fallback = axis === "w" ? "1280px" : "720px";
113793
- return `calc(var(--pptx-slide-${axis}, ${fallback}) * ${(percent3 / 100).toFixed(4)})`;
113794
- }
114755
+ var TIMELINE_TRANSFORM_PREFIXES = {
114756
+ motion: "pptx-tl-motion",
114757
+ rotationAbsolute: "pptx-tl-rotateAbs",
114758
+ rotationRelative: "pptx-tl-rotate",
114759
+ scaleAbsolute: "pptx-tl-scaleAbs",
114760
+ scaleRelative: "pptx-tl-scale",
114761
+ transform: "pptx-tl-transform"
114762
+ };
113795
114763
  function buildDynamicKeyframe(anim, uid) {
113796
- if (anim.motionPath) {
113797
- const name = `pptx-tl-motion-${uid}`;
113798
- const points3 = parseMotionPathPoints(anim.motionPath);
113799
- if (points3.length < 2) {
113800
- return void 0;
113801
- }
113802
- const lines = [];
113803
- for (let i = 0; i < points3.length; i++) {
113804
- const pct = Math.round(i / (points3.length - 1) * 100);
113805
- const tx = slideOffset(points3[i].x, "w");
113806
- const ty = slideOffset(points3[i].y, "h");
113807
- if (anim.motionPathRotateAuto) {
113808
- const next = i < points3.length - 1 ? points3[i + 1] : points3[i];
113809
- const prev = i > 0 ? points3[i - 1] : points3[i];
113810
- const dx = i < points3.length - 1 ? next.x - points3[i].x : points3[i].x - prev.x;
113811
- const dy = i < points3.length - 1 ? next.y - points3[i].y : points3[i].y - prev.y;
113812
- const angleDeg = Math.atan2(dy, dx) * (180 / Math.PI);
113813
- lines.push(
113814
- ` ${pct}% { transform: translate(${tx}, ${ty}) rotate(${angleDeg.toFixed(2)}deg); }`
113815
- );
113816
- } else {
113817
- lines.push(` ${pct}% { transform: translate(${tx}, ${ty}); }`);
113818
- }
113819
- }
113820
- return {
113821
- keyframeName: name,
113822
- css: `@keyframes ${name} {
113823
- ${lines.join("\n")}
113824
- }`
113825
- };
113826
- }
113827
- if (anim.rotationBy !== void 0) {
113828
- const name = `pptx-tl-rotate-${uid}`;
113829
- return {
113830
- keyframeName: name,
113831
- css: `@keyframes ${name} {
113832
- from { transform: rotate(0deg); }
113833
- to { transform: rotate(${anim.rotationBy}deg); }
113834
- }`
113835
- };
113836
- }
113837
- const absoluteRotate = buildAbsoluteRotationKeyframe(anim, "pptx-tl-rotateAbs", uid);
113838
- if (absoluteRotate) {
113839
- return absoluteRotate;
113840
- }
113841
- if (anim.scaleByX !== void 0 || anim.scaleByY !== void 0) {
113842
- const name = `pptx-tl-scale-${uid}`;
113843
- const sx = anim.scaleByX ?? 1;
113844
- const sy = anim.scaleByY ?? 1;
113845
- return {
113846
- keyframeName: name,
113847
- css: `@keyframes ${name} {
113848
- from { transform: scale(1); }
113849
- to { transform: scale(${sx}, ${sy}); }
113850
- }`
113851
- };
113852
- }
113853
- const absoluteScale = buildAbsoluteScaleKeyframe(anim, "pptx-tl-scaleAbs", uid);
113854
- if (absoluteScale) {
113855
- return absoluteScale;
114764
+ const transform = buildTransformKeyframes(anim, uid, TIMELINE_TRANSFORM_PREFIXES);
114765
+ if (transform) {
114766
+ return transform;
113856
114767
  }
113857
114768
  if (anim.colorAnimation) {
113858
114769
  const name = `pptx-tl-color-${uid}`;
@@ -113921,6 +114832,85 @@ function finalizeClickGroup(steps, options) {
113921
114832
  }
113922
114833
  return group2;
113923
114834
  }
114835
+ function clamp013(value) {
114836
+ return Math.max(0, Math.min(1, value));
114837
+ }
114838
+ var KNOWN_OPACITY_ATTR_NAMES = /* @__PURE__ */ new Set(["style.opacity", "opacity"]);
114839
+ function buildOpacityTavKeyframe(anim, namePrefix, uid) {
114840
+ if (anim.presetClass !== "emph") {
114841
+ return void 0;
114842
+ }
114843
+ if (anim.attrName !== void 0 && !KNOWN_OPACITY_ATTR_NAMES.has(anim.attrName)) {
114844
+ return void 0;
114845
+ }
114846
+ const frames = anim.keyframes;
114847
+ if (!frames || frames.length < 2) {
114848
+ return void 0;
114849
+ }
114850
+ const stops = [];
114851
+ for (const kf of frames) {
114852
+ if (typeof kf.tm !== "number" || !Number.isFinite(kf.tm)) {
114853
+ return void 0;
114854
+ }
114855
+ if (kf.valueType !== "flt" && kf.valueType !== "int") {
114856
+ return void 0;
114857
+ }
114858
+ const opacity2 = Number(kf.value);
114859
+ if (!Number.isFinite(opacity2) || opacity2 < 0 || opacity2 > 1) {
114860
+ return void 0;
114861
+ }
114862
+ stops.push({ pct: clamp013(kf.tm / 1e5) * 100, opacity: opacity2 });
114863
+ }
114864
+ stops.sort((a, b) => a.pct - b.pct);
114865
+ const name = `${namePrefix}-${uid}`;
114866
+ const lines = stops.map((s) => ` ${Number(s.pct.toFixed(2))}% { opacity: ${s.opacity}; }`);
114867
+ return { keyframeName: name, css: `@keyframes ${name} {
114868
+ ${lines.join("\n")}
114869
+ }` };
114870
+ }
114871
+ var KNOWN_COLOR_ATTR_NAMES = /* @__PURE__ */ new Set([
114872
+ "fillcolor",
114873
+ "fill.color",
114874
+ "style.color",
114875
+ "stroke.color"
114876
+ ]);
114877
+ var HEX_COLOR_RE = /^#[0-9a-f]{6}$/iu;
114878
+ function buildColorTavKeyframe(anim, namePrefix, uid) {
114879
+ if (anim.colorAnimation) {
114880
+ return void 0;
114881
+ }
114882
+ if (!anim.attrName || !KNOWN_COLOR_ATTR_NAMES.has(anim.attrName)) {
114883
+ return void 0;
114884
+ }
114885
+ const frames = anim.keyframes;
114886
+ if (!frames || frames.length < 2) {
114887
+ return void 0;
114888
+ }
114889
+ const stops = [];
114890
+ for (const kf of frames) {
114891
+ if (typeof kf.tm !== "number" || !Number.isFinite(kf.tm)) {
114892
+ return void 0;
114893
+ }
114894
+ if (kf.valueType !== "clr") {
114895
+ return void 0;
114896
+ }
114897
+ const color2 = String(kf.value);
114898
+ if (!HEX_COLOR_RE.test(color2)) {
114899
+ return void 0;
114900
+ }
114901
+ stops.push({ pct: clamp013(kf.tm / 1e5) * 100, color: color2.toLowerCase() });
114902
+ }
114903
+ stops.sort((a, b) => a.pct - b.pct);
114904
+ const cssProperties = resolveCssProperties(anim.attrName);
114905
+ const name = `${namePrefix}-${uid}`;
114906
+ const lines = stops.map((s) => {
114907
+ const decls = cssProperties.map((prop) => `${prop}: ${s.color};`).join(" ");
114908
+ return ` ${Number(s.pct.toFixed(2))}% { ${decls} }`;
114909
+ });
114910
+ return { keyframeName: name, css: `@keyframes ${name} {
114911
+ ${lines.join("\n")}
114912
+ }` };
114913
+ }
113924
114914
  function applySpeedToDuration(speedPct, baseDurationMs) {
113925
114915
  if (speedPct === void 0 || !Number.isFinite(speedPct) || speedPct <= 0) {
113926
114916
  return baseDurationMs;
@@ -113950,10 +114940,13 @@ function shouldHoldEndState(anim) {
113950
114940
  }
113951
114941
  function resolveEffectTiming(anim, baseDurationMs) {
113952
114942
  const durationMs = applySpeedToDuration(anim.speedPct, baseDurationMs);
113953
- const iterationCount = resolveIterationCount(anim.repeatCount, anim.repeatDurMs, durationMs);
114943
+ const authoredIterations = resolveIterationCount(anim.repeatCount, anim.repeatDurMs, durationMs);
114944
+ const iterationCount = anim.autoReverse && anim.repeatDurMs === void 0 ? authoredIterations * 2 : authoredIterations;
114945
+ const activeDurationMs = Number.isFinite(iterationCount) ? durationMs * iterationCount : durationMs;
113954
114946
  return {
113955
114947
  durationMs,
113956
114948
  iterationCount,
114949
+ activeDurationMs,
113957
114950
  holdEndState: shouldHoldEndState(anim)
113958
114951
  };
113959
114952
  }
@@ -114204,7 +115197,8 @@ function emitStaggeredPieces(anim, kind, counts, output, newClickStepPerParagrap
114204
115197
  ...isFirstStep ? {} : {
114205
115198
  triggerDelayMs: void 0,
114206
115199
  startConditions: void 0,
114207
- parGroupIndex: void 0
115200
+ parGroupIndex: void 0,
115201
+ parGroupDelayMs: void 0
114208
115202
  },
114209
115203
  buildType: void 0,
114210
115204
  iterate: void 0
@@ -114252,6 +115246,7 @@ function expandSingleBuildAnimation(anim, buildType, counts, output) {
114252
115246
  triggerDelayMs: void 0,
114253
115247
  startConditions: void 0,
114254
115248
  parGroupIndex: void 0,
115249
+ parGroupDelayMs: void 0,
114255
115250
  buildType: void 0,
114256
115251
  buildReverse: void 0,
114257
115252
  buildAdvAutoMs: void 0,
@@ -114273,7 +115268,8 @@ function joinPreviousFields() {
114273
115268
  trigger: "withPrevious",
114274
115269
  triggerDelayMs: void 0,
114275
115270
  startConditions: void 0,
114276
- parGroupIndex: void 0
115271
+ parGroupIndex: void 0,
115272
+ parGroupDelayMs: void 0
114277
115273
  };
114278
115274
  }
114279
115275
  function expandParagraphRange(anim, targetId, start, end, output) {
@@ -114474,13 +115470,13 @@ function applyAfterAnimationFromEditorList(nativeAnimations, editorAnimations) {
114474
115470
  };
114475
115471
  });
114476
115472
  }
114477
- function buildAfterAnimationDimKeyframes(color2, keyframeName) {
114478
- return `@keyframes ${keyframeName} {
115473
+ function buildAfterAnimationDimKeyframes(color2, keyframeName2) {
115474
+ return `@keyframes ${keyframeName2} {
114479
115475
  100% { color: ${color2}; }
114480
115476
  }`;
114481
115477
  }
114482
- function appendDimAnimation(cssAnimation, keyframeName, startDelayMs) {
114483
- return `${cssAnimation}, ${keyframeName} 1ms linear ${Math.max(0, startDelayMs)}ms 1 forwards`;
115478
+ function appendDimAnimation(cssAnimation, keyframeName2, startDelayMs) {
115479
+ return `${cssAnimation}, ${keyframeName2} 1ms linear ${Math.max(0, startDelayMs)}ms 1 forwards`;
114484
115480
  }
114485
115481
  function resolveAfterAnimationStepFields(anim, cssAnimation, baseHoldEndState, dimStartDelayMs, dimKeyframeName) {
114486
115482
  if (anim.afterAnimationAction === "dimToColor" && anim.afterAnimationColor) {
@@ -114629,12 +115625,39 @@ function parseMediaCommand(commandString) {
114629
115625
  }
114630
115626
  return void 0;
114631
115627
  }
114632
- function clamp013(value) {
115628
+ var COLOR_KEYFRAME = /^pptx-tl-(?:color|tavclr)-/u;
115629
+ var TRANSFORM_KEYFRAME = /^pptx-tl-(?:motion|rotate(?:Abs)?|scale(?:Abs)?|transform)-/u;
115630
+ function sameOptionalValue(left, right) {
115631
+ return left === right;
115632
+ }
115633
+ function hasIndependentColourAndTransform(left, right) {
115634
+ return COLOR_KEYFRAME.test(left.keyframeName) && TRANSFORM_KEYFRAME.test(right.keyframeName) || TRANSFORM_KEYFRAME.test(left.keyframeName) && COLOR_KEYFRAME.test(right.keyframeName);
115635
+ }
115636
+ function canComposeParallelSteps(left, right) {
115637
+ return hasIndependentColourAndTransform(left, right) && left.elementId !== "" && left.elementId === right.elementId && left.cssAnimation !== "" && right.cssAnimation !== "" && left.delayMs === right.delayMs && left.durationMs === right.durationMs && left.presetClass === right.presetClass && left.fillMode === right.fillMode && sameOptionalValue(left.holdEndState, right.holdEndState) && sameOptionalValue(left.hideAfterEffect, right.hideAfterEffect) && sameOptionalValue(left.pendingHideOnNextClick, right.pendingHideOnNextClick) && sameOptionalValue(left.seqConcurrent, right.seqConcurrent) && sameOptionalValue(left.seqNextAction, right.seqNextAction) && sameOptionalValue(left.seqPrevAction, right.seqPrevAction) && !left.command && !right.command && !left.build && !right.build && !left.soundPath && !right.soundPath && !left.stopSound && !right.stopSound && !left.restart && !right.restart && left.exclGroupId === void 0 && right.exclGroupId === void 0;
115638
+ }
115639
+ function composeParallelSteps(left, right) {
115640
+ const colorTargets = [.../* @__PURE__ */ new Set([...left.colorTargets ?? [], ...right.colorTargets ?? []])];
115641
+ return {
115642
+ ...left,
115643
+ cssAnimation: `${left.cssAnimation}, ${right.cssAnimation}`,
115644
+ colorTargets: colorTargets.length > 0 ? colorTargets : void 0
115645
+ };
115646
+ }
115647
+ var BACKGROUND_ANIMATION_ID_SUFFIX = "::pptx-bg";
115648
+ function resolveAnimationTargetId(animation) {
115649
+ const targetId = animation.targetId ?? "";
115650
+ if (targetId && animation.target?.type === "shape" && animation.target.backgroundOnly === true) {
115651
+ return `${targetId}${BACKGROUND_ANIMATION_ID_SUFFIX}`;
115652
+ }
115653
+ return targetId;
115654
+ }
115655
+ function clamp014(value) {
114633
115656
  return Math.max(0, Math.min(1, value));
114634
115657
  }
114635
115658
  function cssEasingForAnimation(anim) {
114636
- const accel = anim.accel !== void 0 && anim.accel > 0 ? clamp013(anim.accel) : 0;
114637
- const decel = anim.decel !== void 0 && anim.decel > 0 ? clamp013(anim.decel) : 0;
115659
+ const accel = anim.accel !== void 0 && anim.accel > 0 ? clamp014(anim.accel) : 0;
115660
+ const decel = anim.decel !== void 0 && anim.decel > 0 ? clamp014(anim.decel) : 0;
114638
115661
  if (accel === 0 && decel === 0) {
114639
115662
  return "ease";
114640
115663
  }
@@ -114643,11 +115666,11 @@ function cssEasingForAnimation(anim) {
114643
115666
  return `cubic-bezier(${x1}, 0, ${x2}, 1)`;
114644
115667
  }
114645
115668
  function stepColorTargets(anim, tavColorApplied) {
114646
- const targetAttribute = anim.colorAnimation?.targetAttribute ?? (tavColorApplied ? anim.attrName : void 0);
114647
- if (!targetAttribute) {
115669
+ const colorSource = anim.colorAnimation ?? (tavColorApplied ? anim.attrName : void 0);
115670
+ if (!colorSource) {
114648
115671
  return void 0;
114649
115672
  }
114650
- const targets = resolveColorAnimationTargets(targetAttribute);
115673
+ const targets = resolveColorAnimationTargets(colorSource);
114651
115674
  return targets.length > 0 ? targets : void 0;
114652
115675
  }
114653
115676
  function fallbackEffectForClass(presetClass) {
@@ -114669,17 +115692,22 @@ function buildTimeline(nativeAnimations) {
114669
115692
  entranceElementIds: /* @__PURE__ */ new Set(),
114670
115693
  keyframesCss: "",
114671
115694
  interactiveSequences: /* @__PURE__ */ new Map(),
115695
+ restartableInteractiveSequences: /* @__PURE__ */ new Set(),
114672
115696
  hoverSequences: /* @__PURE__ */ new Map()
114673
115697
  };
114674
115698
  }
114675
115699
  const regularAnims = [];
114676
115700
  const interactiveAnims = /* @__PURE__ */ new Map();
115701
+ const restartableInteractiveSequences = /* @__PURE__ */ new Set();
114677
115702
  const hoverAnims = [];
114678
115703
  for (const anim of nativeAnimations) {
114679
- if (anim.trigger === "onShapeClick" && anim.triggerShapeId) {
115704
+ if ((anim.interactiveSequence === true || anim.trigger === "onShapeClick") && anim.triggerShapeId) {
114680
115705
  const existing = interactiveAnims.get(anim.triggerShapeId) ?? [];
114681
115706
  existing.push(anim);
114682
115707
  interactiveAnims.set(anim.triggerShapeId, existing);
115708
+ if (anim.interactiveRestart === true) {
115709
+ restartableInteractiveSequences.add(anim.triggerShapeId);
115710
+ }
114683
115711
  } else if (anim.trigger === "onHover" && anim.targetId) {
114684
115712
  hoverAnims.push(anim);
114685
115713
  } else {
@@ -114692,6 +115720,7 @@ function buildTimeline(nativeAnimations) {
114692
115720
  const dynamicBlocks = [];
114693
115721
  let dynamicUid = 0;
114694
115722
  let currentGroup = [];
115723
+ let currentGroupLastParallelIndex;
114695
115724
  let currentGroupIsClick = false;
114696
115725
  let currentGroupAutoStart = false;
114697
115726
  let subGroupIndex;
@@ -114699,8 +115728,11 @@ function buildTimeline(nativeAnimations) {
114699
115728
  for (const anim of regularAnims) {
114700
115729
  const expandedSteps = expandIterateAnimation(anim);
114701
115730
  for (const singleAnim of expandedSteps) {
114702
- let effect = resolveEffect(singleAnim);
114703
- let dynamic = effect ? void 0 : buildDynamicKeyframe(singleAnim, dynamicUid++);
115731
+ let dynamic = hasAuthoredTransform(singleAnim) ? buildDynamicKeyframe(singleAnim, dynamicUid++) : void 0;
115732
+ let effect = dynamic ? void 0 : resolveEffect(singleAnim);
115733
+ if (!effect && !dynamic) {
115734
+ dynamic = buildDynamicKeyframe(singleAnim, dynamicUid++);
115735
+ }
114704
115736
  if (effect === "transparency" || !effect) {
114705
115737
  const tavOpacity = buildOpacityTavKeyframe(singleAnim, "pptx-tl-tav", dynamicUid);
114706
115738
  if (tavOpacity) {
@@ -114747,7 +115779,7 @@ function buildTimeline(nativeAnimations) {
114747
115779
  if (dynamic) {
114748
115780
  dynamicBlocks.push(dynamic.css);
114749
115781
  }
114750
- const elementId = isCommand ? "" : singleAnim.targetId ?? "";
115782
+ const elementId = isCommand ? "" : resolveAnimationTargetId(singleAnim);
114751
115783
  const effective = resolveAnimationStart(singleAnim);
114752
115784
  const trigger = effective.trigger;
114753
115785
  const baseDuration = isCommand ? 0 : singleAnim.durationMs ?? defaultDuration(singleAnim.presetClass);
@@ -114761,7 +115793,7 @@ function buildTimeline(nativeAnimations) {
114761
115793
  const triggerDelay = 0;
114762
115794
  const presetClass = isCommand ? "emph" : singleAnim.presetClass ?? "entr";
114763
115795
  const fill = fillModeForClass(singleAnim.presetClass);
114764
- const timing = isCommand ? { durationMs: 0, iterationCount: 1, holdEndState: false } : resolveEffectTiming(singleAnim, baseDuration);
115796
+ const timing = isCommand ? { durationMs: 0, iterationCount: 1, activeDurationMs: 0, holdEndState: false } : resolveEffectTiming(singleAnim, baseDuration);
114765
115797
  const duration = timing.durationMs;
114766
115798
  const iterCount = timing.iterationCount;
114767
115799
  const direction = singleAnim.autoReverse ? "alternate" : "normal";
@@ -114779,17 +115811,18 @@ function buildTimeline(nativeAnimations) {
114779
115811
  clickGroups.push(group2);
114780
115812
  }
114781
115813
  currentGroup = [];
115814
+ currentGroupLastParallelIndex = void 0;
114782
115815
  currentGroupIsClick = isOnClick || isFirstAnimation;
114783
115816
  currentGroupAutoStart = singleAnim.groupAutoStart === true && !effective.requiresInteraction;
114784
115817
  subGroupIndex = singleAnim.parGroupIndex;
114785
- subGroupStartMs = 0;
115818
+ subGroupStartMs = singleAnim.parGroupDelayMs ?? 0;
114786
115819
  }
114787
115820
  const prevStep = currentGroup.length > 0 ? currentGroup[currentGroup.length - 1] : void 0;
114788
115821
  let delayMs;
114789
- if (singleAnim.parGroupIndex !== void 0 && prevStep) {
115822
+ if (singleAnim.parGroupIndex !== void 0) {
114790
115823
  if (singleAnim.parGroupIndex !== subGroupIndex) {
114791
115824
  subGroupIndex = singleAnim.parGroupIndex;
114792
- subGroupStartMs = trigger === "withPrevious" ? prevStep.delayMs : prevStep.delayMs + prevStep.durationMs;
115825
+ subGroupStartMs = singleAnim.parGroupDelayMs ?? (prevStep ? trigger === "withPrevious" ? prevStep.delayMs : prevStep.delayMs + prevStep.durationMs : 0);
114793
115826
  }
114794
115827
  delayMs = subGroupStartMs + animDelay + triggerDelay;
114795
115828
  } else if (trigger === "withPrevious" && prevStep) {
@@ -114806,19 +115839,19 @@ function buildTimeline(nativeAnimations) {
114806
115839
  singleAnim,
114807
115840
  baseCssAnimation,
114808
115841
  timing.holdEndState,
114809
- delayMs + duration,
115842
+ delayMs + timing.activeDurationMs,
114810
115843
  `pptx-tl-dim-${dynamicUid++}`
114811
115844
  );
114812
115845
  if (afterFields.dimKeyframeBlock) {
114813
115846
  dynamicBlocks.push(afterFields.dimKeyframeBlock);
114814
115847
  }
114815
- currentGroup.push({
115848
+ const step = {
114816
115849
  elementId,
114817
115850
  cssAnimation: afterFields.cssAnimation,
114818
115851
  keyframeName: keyframe,
114819
115852
  trigger,
114820
115853
  delayMs,
114821
- durationMs: duration,
115854
+ durationMs: timing.activeDurationMs,
114822
115855
  fillMode: fill,
114823
115856
  presetClass,
114824
115857
  soundPath: singleAnim.soundPath,
@@ -114834,7 +115867,14 @@ function buildTimeline(nativeAnimations) {
114834
115867
  seqNextAction: singleAnim.seqNextAction,
114835
115868
  seqPrevAction: singleAnim.seqPrevAction,
114836
115869
  exclGroupId: singleAnim.exclGroupId
114837
- });
115870
+ };
115871
+ const previousParallelStep = currentGroup[currentGroup.length - 1];
115872
+ if (singleAnim.parGroupIndex !== void 0 && singleAnim.parGroupIndex === currentGroupLastParallelIndex && previousParallelStep && canComposeParallelSteps(previousParallelStep, step)) {
115873
+ currentGroup[currentGroup.length - 1] = composeParallelSteps(previousParallelStep, step);
115874
+ } else {
115875
+ currentGroup.push(step);
115876
+ }
115877
+ currentGroupLastParallelIndex = singleAnim.parGroupIndex;
114838
115878
  }
114839
115879
  }
114840
115880
  if (currentGroup.length > 0) {
@@ -114877,6 +115917,7 @@ function buildTimeline(nativeAnimations) {
114877
115917
  entranceElementIds: entranceIds,
114878
115918
  keyframesCss: keyframeBlocks.join("\n\n"),
114879
115919
  interactiveSequences,
115920
+ restartableInteractiveSequences,
114880
115921
  hoverSequences
114881
115922
  };
114882
115923
  }
@@ -114901,9 +115942,15 @@ function buildSequenceGroups(animsByKey, entranceIds, neededKeyframes, dynamicBl
114901
115942
  for (const [shapeId, anims] of animsByKey) {
114902
115943
  const seqGroups = [];
114903
115944
  let seqGroup = [];
115945
+ let seqGroupLastParallelIndex;
115946
+ let subGroupIndex;
115947
+ let subGroupStartMs = 0;
114904
115948
  for (const anim of anims) {
114905
- let effect = resolveEffect(anim);
114906
- let dynamic = effect ? void 0 : buildDynamicKeyframe(anim, dynamicUid++);
115949
+ let dynamic = hasAuthoredTransform(anim) ? buildDynamicKeyframe(anim, dynamicUid++) : void 0;
115950
+ let effect = dynamic ? void 0 : resolveEffect(anim);
115951
+ if (!effect && !dynamic) {
115952
+ dynamic = buildDynamicKeyframe(anim, dynamicUid++);
115953
+ }
114907
115954
  if (effect === "transparency" || !effect) {
114908
115955
  const tavOpacity = buildOpacityTavKeyframe(anim, "pptx-tl-tav", dynamicUid);
114909
115956
  if (tavOpacity) {
@@ -114935,14 +115982,14 @@ function buildSequenceGroups(animsByKey, entranceIds, neededKeyframes, dynamicBl
114935
115982
  if (dynamic) {
114936
115983
  dynamicBlocks.push(dynamic.css);
114937
115984
  }
114938
- const elementId = isCommand ? "" : anim.targetId ?? "";
115985
+ const elementId = isCommand ? "" : resolveAnimationTargetId(anim);
114939
115986
  const seqTrigger = anim.trigger ?? "onShapeClick";
114940
115987
  const baseDuration = isCommand ? 0 : anim.durationMs ?? defaultDuration(anim.presetClass);
114941
115988
  const animDelay = Math.max(anim.delayMs ?? 0, anim.triggerDelayMs ?? 0);
114942
115989
  const triggerDelay = 0;
114943
115990
  const presetClass = isCommand ? "emph" : anim.presetClass ?? "entr";
114944
115991
  const fill = fillModeForClass(anim.presetClass);
114945
- const timing = isCommand ? { durationMs: 0, iterationCount: 1, holdEndState: false } : resolveEffectTiming(anim, baseDuration);
115992
+ const timing = isCommand ? { durationMs: 0, iterationCount: 1, activeDurationMs: 0, holdEndState: false } : resolveEffectTiming(anim, baseDuration);
114946
115993
  const duration = timing.durationMs;
114947
115994
  const iterCount = timing.iterationCount;
114948
115995
  const direction = anim.autoReverse ? "alternate" : "normal";
@@ -114954,13 +116001,18 @@ function buildSequenceGroups(animsByKey, entranceIds, neededKeyframes, dynamicBl
114954
116001
  seqGroups.push(finalizeClickGroup(seqGroup));
114955
116002
  seqGroup = [];
114956
116003
  }
116004
+ const prevStep = seqGroup.length > 0 ? seqGroup[seqGroup.length - 1] : void 0;
114957
116005
  let delayMs;
114958
- if (seqTrigger === "withPrevious" && seqGroup.length > 0) {
114959
- const prev = seqGroup[seqGroup.length - 1];
114960
- delayMs = prev.delayMs + animDelay + triggerDelay;
114961
- } else if ((seqTrigger === "afterPrevious" || seqTrigger === "afterDelay") && seqGroup.length > 0) {
114962
- const prev = seqGroup[seqGroup.length - 1];
114963
- delayMs = prev.delayMs + prev.durationMs + animDelay + triggerDelay;
116006
+ if (anim.parGroupIndex !== void 0) {
116007
+ if (anim.parGroupIndex !== subGroupIndex) {
116008
+ subGroupIndex = anim.parGroupIndex;
116009
+ subGroupStartMs = anim.parGroupDelayMs ?? (prevStep ? seqTrigger === "withPrevious" ? prevStep.delayMs : prevStep.delayMs + prevStep.durationMs : 0);
116010
+ }
116011
+ delayMs = subGroupStartMs + animDelay + triggerDelay;
116012
+ } else if (seqTrigger === "withPrevious" && prevStep) {
116013
+ delayMs = prevStep.delayMs + animDelay + triggerDelay;
116014
+ } else if ((seqTrigger === "afterPrevious" || seqTrigger === "afterDelay") && prevStep) {
116015
+ delayMs = prevStep.delayMs + prevStep.durationMs + animDelay + triggerDelay;
114964
116016
  } else {
114965
116017
  delayMs = animDelay + triggerDelay;
114966
116018
  }
@@ -114971,19 +116023,19 @@ function buildSequenceGroups(animsByKey, entranceIds, neededKeyframes, dynamicBl
114971
116023
  anim,
114972
116024
  baseCssAnimation,
114973
116025
  timing.holdEndState,
114974
- delayMs + duration,
116026
+ delayMs + timing.activeDurationMs,
114975
116027
  `pptx-tl-dim-${dynamicUid++}`
114976
116028
  );
114977
116029
  if (afterFields.dimKeyframeBlock) {
114978
116030
  dynamicBlocks.push(afterFields.dimKeyframeBlock);
114979
116031
  }
114980
- seqGroup.push({
116032
+ const step = {
114981
116033
  elementId,
114982
116034
  cssAnimation: afterFields.cssAnimation,
114983
116035
  keyframeName: keyframe,
114984
116036
  trigger: seqTrigger,
114985
116037
  delayMs,
114986
- durationMs: duration,
116038
+ durationMs: timing.activeDurationMs,
114987
116039
  fillMode: fill,
114988
116040
  presetClass,
114989
116041
  soundPath: anim.soundPath,
@@ -114999,7 +116051,14 @@ function buildSequenceGroups(animsByKey, entranceIds, neededKeyframes, dynamicBl
114999
116051
  seqNextAction: anim.seqNextAction,
115000
116052
  seqPrevAction: anim.seqPrevAction,
115001
116053
  exclGroupId: anim.exclGroupId
115002
- });
116054
+ };
116055
+ const previousParallelStep = seqGroup[seqGroup.length - 1];
116056
+ if (anim.parGroupIndex !== void 0 && anim.parGroupIndex === seqGroupLastParallelIndex && previousParallelStep && canComposeParallelSteps(previousParallelStep, step)) {
116057
+ seqGroup[seqGroup.length - 1] = composeParallelSteps(previousParallelStep, step);
116058
+ } else {
116059
+ seqGroup.push(step);
116060
+ }
116061
+ seqGroupLastParallelIndex = anim.parGroupIndex;
115003
116062
  }
115004
116063
  if (seqGroup.length > 0) {
115005
116064
  seqGroups.push(finalizeClickGroup(seqGroup));
@@ -115351,14 +116410,20 @@ var TimelineEngine = class _TimelineEngine {
115351
116410
  advanceInteractive(triggerShapeId, nowMs = Date.now()) {
115352
116411
  const groups = this.timeline.interactiveSequences.get(triggerShapeId);
115353
116412
  const currentIdx = this.interactiveGroupIndexes.get(triggerShapeId) ?? -1;
115354
- const result = this.advanceSequenceGroup(
116413
+ let result = this.advanceSequenceGroup(
115355
116414
  groups,
115356
116415
  currentIdx,
115357
116416
  this.interactiveGroupStartedAtMs.get(triggerShapeId),
115358
116417
  nowMs
115359
116418
  );
115360
116419
  if (result === "exhausted") {
115361
- return null;
116420
+ if (!this.timeline.restartableInteractiveSequences?.has(triggerShapeId)) {
116421
+ return null;
116422
+ }
116423
+ result = this.advanceSequenceGroup(groups, -1, void 0, nowMs);
116424
+ if (result === "exhausted") {
116425
+ return null;
116426
+ }
115362
116427
  }
115363
116428
  if (result === "blocked") {
115364
116429
  return EMPTY_CLICK_GROUP;
@@ -115556,7 +116621,7 @@ function buildPreviewAnimation(preset, options) {
115556
116621
  if (!effectName) {
115557
116622
  return void 0;
115558
116623
  }
115559
- const keyframeName = `pptx-${effectName}`;
116624
+ const keyframeName2 = `pptx-${effectName}`;
115560
116625
  const keyframesCss = getEffectKeyframes(effectName);
115561
116626
  if (!keyframesCss) {
115562
116627
  return void 0;
@@ -115564,9 +116629,9 @@ function buildPreviewAnimation(preset, options) {
115564
116629
  const duration = options?.durationMs ?? 600;
115565
116630
  const easing = timingCurveToCss(options?.timingCurve, options?.cubicBezier);
115566
116631
  return {
115567
- keyframeName,
116632
+ keyframeName: keyframeName2,
115568
116633
  keyframesCss,
115569
- cssAnimation: `${keyframeName} ${duration}ms ${easing} 0ms 1 normal both`,
116634
+ cssAnimation: `${keyframeName2} ${duration}ms ${easing} 0ms 1 normal both`,
115570
116635
  durationMs: duration
115571
116636
  };
115572
116637
  }
@@ -115888,16 +116953,19 @@ function motionPathNativeAnimations(slide) {
115888
116953
  durationMs: animation.durationMs ?? DEFAULT_MOTION_PATH_DURATION_MS,
115889
116954
  delayMs: animation.delayMs ?? 0,
115890
116955
  motionPath: animation.motionPath,
115891
- motionPathEditMode: animation.motionPathEditMode ?? "relative"
116956
+ motionPathEditMode: animation.motionPathEditMode ?? "relative",
116957
+ motionPathRotationAngle: animation.motionPathRotationAngle,
116958
+ motionPathRotationCenterX: animation.motionPathRotationCenterX,
116959
+ motionPathRotationCenterY: animation.motionPathRotationCenterY
115892
116960
  }));
115893
116961
  }
115894
116962
  function buildMotionPathPreview(args) {
115895
- const keyframeName = `pptx-motion-preview-${args.uid ?? 0}`;
116963
+ const keyframeName2 = `pptx-motion-preview-${args.uid ?? 0}`;
115896
116964
  const keyframes = buildMotionPathKeyframes({
115897
116965
  path: args.path,
115898
116966
  slideWidth: args.slideWidth,
115899
116967
  slideHeight: args.slideHeight,
115900
- keyframeName
116968
+ keyframeName: keyframeName2
115901
116969
  });
115902
116970
  if (!keyframes) {
115903
116971
  return void 0;
@@ -115906,9 +116974,9 @@ function buildMotionPathPreview(args) {
115906
116974
  const delayMs = args.delayMs ?? 0;
115907
116975
  const easing = timingCurveToCss(args.timingCurve);
115908
116976
  return {
115909
- keyframeName,
116977
+ keyframeName: keyframeName2,
115910
116978
  keyframesCss: keyframes.css,
115911
- cssAnimation: `${keyframeName} ${durationMs}ms ${easing} ${delayMs}ms 1 normal both`,
116979
+ cssAnimation: `${keyframeName2} ${durationMs}ms ${easing} ${delayMs}ms 1 normal both`,
115912
116980
  durationMs
115913
116981
  };
115914
116982
  }
@@ -115955,8 +117023,9 @@ var PresentationAnimationController = class _PresentationAnimationController {
115955
117023
  const engine = TimelineEngine.fromAnimations(expandedAnims);
115956
117024
  const elementIds = slide.elements.map((element) => element.id);
115957
117025
  for (const anim of expandedAnims) {
115958
- if (anim.targetId && anim.targetId.includes(TEXT_BUILD_ID_SEP)) {
115959
- elementIds.push(anim.targetId);
117026
+ const targetId = resolveAnimationTargetId(anim);
117027
+ if (targetId.includes(TEXT_BUILD_ID_SEP)) {
117028
+ elementIds.push(targetId);
115960
117029
  }
115961
117030
  }
115962
117031
  return new _PresentationAnimationController(engine, elementIds);
@@ -116885,8 +117954,8 @@ function apply3dEffects(base, scene3d, shape3d, fillColorFallback) {
116885
117954
  if (perspective) {
116886
117955
  base.perspective = perspective;
116887
117956
  }
116888
- const hasRotation = rotateX !== 0 || rotateY !== 0 || rotateZ !== 0;
116889
- if (hasRotation) {
117957
+ const hasRotation2 = rotateX !== 0 || rotateY !== 0 || rotateZ !== 0;
117958
+ if (hasRotation2) {
116890
117959
  const transforms = [];
116891
117960
  if (rotateX !== 0) {
116892
117961
  transforms.push(`rotateX(${rotateX}deg)`);
@@ -116911,7 +117980,7 @@ function apply3dEffects(base, scene3d, shape3d, fillColorFallback) {
116911
117980
  const zTranslate = `translateZ(${halfDepth}px)`;
116912
117981
  base.transform = base.transform ? `${base.transform} ${zTranslate}` : zTranslate;
116913
117982
  }
116914
- if (hasRotation || perspective || shape3d) {
117983
+ if (hasRotation2 || perspective || shape3d) {
116915
117984
  base.willChange = "transform";
116916
117985
  base.transformStyle = "preserve-3d";
116917
117986
  }
@@ -118963,7 +120032,7 @@ function getImageFitStyle(el) {
118963
120032
  height: "100%",
118964
120033
  objectFit: "fill"
118965
120034
  };
118966
- if (!isImageLikeElement(el)) {
120035
+ if (!isImageLikeElement(el) && el.type !== "media") {
118967
120036
  return uncropped;
118968
120037
  }
118969
120038
  const { placement, crop } = imageFitTransformParts(el);
@@ -118984,7 +120053,7 @@ function getImageFitStyle(el) {
118984
120053
  }
118985
120054
  var IDENTITY_TRANSFORM_PAIR = "translate(0%, 0%) scale(1, 1)";
118986
120055
  function imageFitTransformParts(el) {
118987
- if (!isImageLikeElement(el)) {
120056
+ if (!isImageLikeElement(el) && el.type !== "media") {
118988
120057
  return { placement: "", crop: "" };
118989
120058
  }
118990
120059
  const frLeft = el.fillRectLeft ?? 0;
@@ -125581,8 +126650,8 @@ function buildTextBody3DSceneStyle(textStyle) {
125581
126650
  if (!perspective && (rotateX !== 0 || rotateY !== 0 || rotateZ !== 0)) {
125582
126651
  perspective = "800px";
125583
126652
  }
125584
- const hasRotation = rotateX !== 0 || rotateY !== 0 || rotateZ !== 0;
125585
- const hasScene = hasRotation || Boolean(perspective);
126653
+ const hasRotation2 = rotateX !== 0 || rotateY !== 0 || rotateZ !== 0;
126654
+ const hasScene = hasRotation2 || Boolean(perspective);
125586
126655
  if (!hasScene) {
125587
126656
  return void 0;
125588
126657
  }
@@ -125590,7 +126659,7 @@ function buildTextBody3DSceneStyle(textStyle) {
125590
126659
  if (perspective) {
125591
126660
  style.perspective = perspective;
125592
126661
  }
125593
- if (hasRotation) {
126662
+ if (hasRotation2) {
125594
126663
  const transforms = [];
125595
126664
  if (rotateX !== 0) {
125596
126665
  transforms.push(`rotateX(${rotateX}deg)`);
@@ -126430,7 +127499,8 @@ function buildParagraphs(element, fieldContext, segmentOverrides) {
126430
127499
  paragraphIndents?.[paraIndex],
126431
127500
  firstSeg?.paragraphLevel
126432
127501
  );
126433
- const bulletStyle = buildBulletMarkerStyle(bullet, firstSeg, fontScale, indent.textIndentPx);
127502
+ const textIndentPx = indent.textIndentPx !== void 0 && (indent.textIndentPx >= 0 || indent.marginLeftPx !== void 0 || bullet !== void 0) ? indent.textIndentPx : void 0;
127503
+ const bulletStyle = buildBulletMarkerStyle(bullet, firstSeg, fontScale, textIndentPx);
126434
127504
  const spacing = resolveParagraphSpacing({
126435
127505
  paraProps: propsCarrier?.paragraphProperties,
126436
127506
  bodyStyle,
@@ -126471,7 +127541,7 @@ function buildParagraphs(element, fieldContext, segmentOverrides) {
126471
127541
  bulletPicture: bullet?.picture,
126472
127542
  bulletStyle,
126473
127543
  marginLeftPx: indent.marginLeftPx,
126474
- textIndentPx: indent.textIndentPx,
127544
+ textIndentPx,
126475
127545
  lineHeight: spacing.lineHeight,
126476
127546
  spaceBeforePx: spacing.spaceBeforePx,
126477
127547
  spaceAfterPx: spacing.spaceAfterPx,
@@ -129384,21 +130454,9 @@ function solveShapeAdjustments(solvers, localX, localY) {
129384
130454
  }
129385
130455
  var SHAPE_ADJUSTMENT_MIN = 0;
129386
130456
  var SHAPE_ADJUSTMENT_MAX = 5e4;
129387
- var DEFAULT_ROUND_RECT_ADJUSTMENT = 16667;
129388
130457
  function clampShapeAdjustmentValue(value) {
129389
130458
  return Math.max(SHAPE_ADJUSTMENT_MIN, Math.min(SHAPE_ADJUSTMENT_MAX, Math.round(value)));
129390
130459
  }
129391
- function getRoundRectAdjustmentValue(element) {
129392
- const adjustment = element.shapeAdjustments?.adj;
129393
- if (typeof adjustment === "number" && Number.isFinite(adjustment)) {
129394
- return clampShapeAdjustmentValue(adjustment);
129395
- }
129396
- return DEFAULT_ROUND_RECT_ADJUSTMENT;
129397
- }
129398
- function getRoundRectRadiusPx2(element) {
129399
- const normalizedAdjustment = getRoundRectAdjustmentValue(element) / SHAPE_ADJUSTMENT_MAX;
129400
- return Math.min(Math.max(element.width, 1), Math.max(element.height, 1)) * 0.5 * normalizedAdjustment;
129401
- }
129402
130460
  function getShapeAdjustmentHandleDescriptors(element) {
129403
130461
  if (!hasShapeProperties(element) || element.type === "connector") {
129404
130462
  return [];
@@ -130170,6 +131228,7 @@ var COMPLEX_SLIDE_FIELDS = {
130170
131228
  activeXControls: "_ax",
130171
131229
  legacyVmlElements: "_lvml",
130172
131230
  backgroundPattern: "_bp",
131231
+ backgroundImageProperties: "_bip",
130173
131232
  modernCommentPart: "_mc",
130174
131233
  headerFooterFlags: "_hff",
130175
131234
  slideSynchronization: "_sync"
@@ -136153,13 +137212,59 @@ function buildPieChart3DDataForElement(element, options) {
136153
137212
  const categoryLabels = chartData.categories.length > 0 ? chartData.categories : Array.from({ length: pieSeries.values.length }, (_, i) => String(i + 1));
136154
137213
  return buildPieChart3DData(chartData, categoryLabels, options);
136155
137214
  }
136156
- var AVERAGE_ADVANCE_RATIO = 0.5;
137215
+ function estimatedGlyphAdvanceRatio(glyph) {
137216
+ if (/\p{Mark}/u.test(glyph)) {
137217
+ return 0;
137218
+ }
137219
+ if (/\s/u.test(glyph)) {
137220
+ return 0.33;
137221
+ }
137222
+ if (/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Extended_Pictographic}]/u.test(
137223
+ glyph
137224
+ )) {
137225
+ return 1;
137226
+ }
137227
+ if (/[A-Z]/u.test(glyph)) {
137228
+ return 0.65;
137229
+ }
137230
+ if (/[a-z0-9]/u.test(glyph)) {
137231
+ return 0.55;
137232
+ }
137233
+ if (/[,.;:!?()\u005b\u005d{}'"`\-_/\\]/u.test(glyph)) {
137234
+ return 0.35;
137235
+ }
137236
+ return 0.6;
137237
+ }
137238
+ function estimatedTextWidth(glyphs, fontSize) {
137239
+ return glyphs.reduce((sum, glyph) => sum + estimatedGlyphAdvanceRatio(glyph) * fontSize, 0);
137240
+ }
137241
+ var HANGING_PUNCTUATION_RE = /^[\u3001\u3002\uff0c\uff0e\uff01\uff1f\uff1b\uff1a\u3009\u300b\u300d\u300f\u3011\u3015\u3017\u3019\u301b\uff09\uff3d\uff5d\u2019\u201d\u00bb\u203a]$/u;
137242
+ var BREAKABLE_GLYPH_RE = /^[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Extended_Pictographic}]$/u;
137243
+ function estimatedWrapUnits(text2) {
137244
+ const units = [];
137245
+ let unbreakableRun = "";
137246
+ const flushRun = () => {
137247
+ if (unbreakableRun.length > 0) {
137248
+ units.push(unbreakableRun);
137249
+ unbreakableRun = "";
137250
+ }
137251
+ };
137252
+ for (const glyph of Array.from(text2)) {
137253
+ if (/\s/u.test(glyph) || BREAKABLE_GLYPH_RE.test(glyph)) {
137254
+ flushRun();
137255
+ units.push(glyph);
137256
+ } else {
137257
+ unbreakableRun += glyph;
137258
+ }
137259
+ }
137260
+ flushRun();
137261
+ return units;
137262
+ }
136157
137263
  function wrapTextByEstimatedWidth(text2, maxWidth, fontSize, options = {}) {
136158
137264
  if (!text2 || text2.trim().length === 0) {
136159
137265
  return [];
136160
137266
  }
136161
- const charactersPerLine = Math.floor(maxWidth / Math.max(fontSize * AVERAGE_ADVANCE_RATIO, 1));
136162
- if (charactersPerLine <= 0) {
137267
+ if (!(maxWidth > 0) || !(fontSize > 0)) {
136163
137268
  return [];
136164
137269
  }
136165
137270
  const lines = [];
@@ -136171,18 +137276,31 @@ function wrapTextByEstimatedWidth(text2, maxWidth, fontSize, options = {}) {
136171
137276
  continue;
136172
137277
  }
136173
137278
  let current = "";
136174
- for (const word of paragraph.split(/\s+/u)) {
136175
- if (current.length === 0) {
136176
- current = word;
136177
- } else if (current.length + 1 + word.length <= charactersPerLine) {
136178
- current += ` ${word}`;
136179
- } else {
136180
- lines.push(current);
136181
- current = word;
137279
+ let pendingWhitespace = false;
137280
+ for (const unit of estimatedWrapUnits(paragraph)) {
137281
+ if (/^\s+$/u.test(unit)) {
137282
+ pendingWhitespace = current.length > 0;
137283
+ continue;
137284
+ }
137285
+ const separator = pendingWhitespace && current.length > 0 ? " " : "";
137286
+ const candidate = `${current}${separator}${unit}`;
137287
+ if (current.length === 0 || estimatedTextWidth(Array.from(candidate), fontSize) <= maxWidth) {
137288
+ current = candidate;
137289
+ pendingWhitespace = false;
137290
+ continue;
137291
+ }
137292
+ if (HANGING_PUNCTUATION_RE.test(unit)) {
137293
+ current += unit;
137294
+ pendingWhitespace = false;
137295
+ continue;
136182
137296
  }
136183
- }
136184
- if (current.length > 0) {
136185
137297
  lines.push(current);
137298
+ current = unit;
137299
+ pendingWhitespace = false;
137300
+ }
137301
+ const completed = current.trimEnd();
137302
+ if (completed.length > 0) {
137303
+ lines.push(completed);
136186
137304
  }
136187
137305
  }
136188
137306
  return lines;
@@ -136194,7 +137312,7 @@ function centeredSvgTextLines(text2, fontSize, options = {}) {
136194
137312
  if (lines.length === 0) {
136195
137313
  return [{ text: "", y: centerY }];
136196
137314
  }
136197
- const lineHeight = fontSize * LINE_HEIGHT_RATIO;
137315
+ const lineHeight = options.lineHeight ?? fontSize * (options.lineHeightRatio ?? LINE_HEIGHT_RATIO);
136198
137316
  const blockTop = centerY - lines.length * lineHeight / 2;
136199
137317
  return lines.map((line22, index) => ({
136200
137318
  text: line22,
@@ -136241,6 +137359,12 @@ function buildChromeStyle(chrome) {
136241
137359
  return s;
136242
137360
  }
136243
137361
  var TEXT_WIDTH_FRACTION = 0.82;
137362
+ var CJK_SMARTART_TEXT_RE = /[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}]/u;
137363
+ var CJK_SMARTART_LINE_HEIGHT_RATIO = 1.33;
137364
+ var DEFAULT_SMARTART_LINE_HEIGHT_RATIO = 1.2;
137365
+ function drawingTextBaseLineHeightRatio(text2) {
137366
+ return CJK_SMARTART_TEXT_RE.test(text2 ?? "") ? CJK_SMARTART_LINE_HEIGHT_RATIO : DEFAULT_SMARTART_LINE_HEIGHT_RATIO;
137367
+ }
136244
137368
  function underlyingFill(shape, shapes, index) {
136245
137369
  const centerX = shape.x + shape.width / 2;
136246
137370
  const centerY = shape.y + shape.height / 2;
@@ -136265,17 +137389,27 @@ function computeDrawingViewBox(shapes) {
136265
137389
  let maxX = -Infinity;
136266
137390
  let maxY = -Infinity;
136267
137391
  for (const s of shapes) {
136268
- if (s.x < minX) {
136269
- minX = s.x;
137392
+ const shapeMinX = Math.min(s.x, s.textFrameX ?? s.x);
137393
+ const shapeMinY = Math.min(s.y, s.textFrameY ?? s.y);
137394
+ const shapeMaxX = Math.max(
137395
+ s.x + s.width,
137396
+ (s.textFrameX ?? s.x) + (s.textFrameWidth ?? s.width)
137397
+ );
137398
+ const shapeMaxY = Math.max(
137399
+ s.y + s.height,
137400
+ (s.textFrameY ?? s.y) + (s.textFrameHeight ?? s.height)
137401
+ );
137402
+ if (shapeMinX < minX) {
137403
+ minX = shapeMinX;
136270
137404
  }
136271
- if (s.y < minY) {
136272
- minY = s.y;
137405
+ if (shapeMinY < minY) {
137406
+ minY = shapeMinY;
136273
137407
  }
136274
- if (s.x + s.width > maxX) {
136275
- maxX = s.x + s.width;
137408
+ if (shapeMaxX > maxX) {
137409
+ maxX = shapeMaxX;
136276
137410
  }
136277
- if (s.y + s.height > maxY) {
136278
- maxY = s.y + s.height;
137411
+ if (shapeMaxY > maxY) {
137412
+ maxY = shapeMaxY;
136279
137413
  }
136280
137414
  }
136281
137415
  if (!Number.isFinite(minX)) {
@@ -136319,10 +137453,23 @@ function resolveShapeKind(shape, hasImage) {
136319
137453
  return "image";
136320
137454
  }
136321
137455
  const normalized = (shape.shapeType ?? "").trim().toLowerCase();
136322
- if (normalized === "chevron" || normalized === "homeplate") {
136323
- return "polygon";
137456
+ if (normalized === "ellipse" || normalized === "oval") {
137457
+ return "ellipse";
137458
+ }
137459
+ const identityPresets = /* @__PURE__ */ new Set(["rect", "flowchartprocess", "roundrect"]);
137460
+ return identityPresets.has(normalized) || normalized.length === 0 ? "rect" : "path";
137461
+ }
137462
+ function drawingShapeTransform(shape, cx, cy) {
137463
+ const transforms = [];
137464
+ if (shape.rotation) {
137465
+ transforms.push(`rotate(${shape.rotation} ${cx} ${cy})`);
137466
+ }
137467
+ if (shape.flipHorizontal || shape.flipVertical) {
137468
+ transforms.push(
137469
+ `translate(${cx} ${cy}) scale(${shape.flipHorizontal ? -1 : 1} ${shape.flipVertical ? -1 : 1}) translate(${-cx} ${-cy})`
137470
+ );
136324
137471
  }
136325
- return getShapeType(shape.shapeType) === "ellipse" ? "ellipse" : "rect";
137472
+ return transforms.length > 0 ? transforms.join(" ") : void 0;
136326
137473
  }
136327
137474
  function projectDrawingShapes(elementId, shapes, viewBox, palette, style) {
136328
137475
  const { minX, minY } = viewBox;
@@ -136337,12 +137484,38 @@ function projectDrawingShapes(elementId, shapes, viewBox, palette, style) {
136337
137484
  const cx = relX + shape.width / 2;
136338
137485
  const cy = relY + shape.height / 2;
136339
137486
  const stroke = shape.strokeColor ?? (sw > 0 ? "rgba(255,255,255,0.3)" : "none");
136340
- const transform = shape.rotation !== void 0 ? `rotate(${shape.rotation} ${cx} ${cy})` : void 0;
137487
+ const transform = drawingShapeTransform(shape, cx, cy);
137488
+ const presetGeometry = kind === "path" ? getPresetShapeVectorGeometry(
137489
+ shape.shapeType,
137490
+ shape.width,
137491
+ shape.height,
137492
+ shape.shapeAdjustments
137493
+ ) : void 0;
136341
137494
  const fontSize = shape.fontSize ?? Math.max(8, Math.min(14, shape.height * 0.2));
137495
+ const hasTextFrame = Number.isFinite(shape.textFrameX) && Number.isFinite(shape.textFrameY) && Number.isFinite(shape.textFrameWidth) && Number.isFinite(shape.textFrameHeight) && (shape.textFrameWidth ?? 0) > 0 && (shape.textFrameHeight ?? 0) > 0;
137496
+ const textFrameX = (hasTextFrame ? shape.textFrameX : shape.x) - minX;
137497
+ const textFrameY = (hasTextFrame ? shape.textFrameY : shape.y) - minY;
137498
+ const textFrameWidth = hasTextFrame ? shape.textFrameWidth : shape.width;
137499
+ const textFrameHeight = hasTextFrame ? shape.textFrameHeight : shape.height;
137500
+ const textInsetLeft = shape.textInsetLeft ?? 0;
137501
+ const textInsetRight = shape.textInsetRight ?? 0;
137502
+ const textInsetTop = shape.textInsetTop ?? 0;
137503
+ const textInsetBottom = shape.textInsetBottom ?? 0;
137504
+ const textContentWidth = Math.max(1, textFrameWidth - textInsetLeft - textInsetRight);
137505
+ const textContentHeight = Math.max(1, textFrameHeight - textInsetTop - textInsetBottom);
137506
+ const textCenterX = textFrameX + textInsetLeft + textContentWidth / 2;
137507
+ const textCenterY = textFrameY + textInsetTop + textContentHeight / 2;
137508
+ const textWrapWidth = hasTextFrame ? textContentWidth : shape.width * TEXT_WIDTH_FRACTION;
137509
+ const authoredLineHeightRatio = shape.lineHeightRatio ?? 1;
137510
+ const lineHeightRatio = drawingTextBaseLineHeightRatio(shape.text) * authoredLineHeightRatio + (shape.lineSpacingAfterRatio ?? 0);
137511
+ const lineHeight = shape.lineHeight !== void 0 || shape.lineSpacingAfter !== void 0 ? (shape.lineHeight ?? fontSize * drawingTextBaseLineHeightRatio(shape.text) * authoredLineHeightRatio) + (shape.lineSpacingAfter ?? 0) : void 0;
136342
137512
  return {
136343
137513
  key: `${elementId}-dsp-${shape.id}-${i}`,
136344
137514
  kind,
136345
- ...kind === "polygon" ? { points: chevronPoints(relX, relY, shape.width, shape.height) } : {},
137515
+ ...presetGeometry ? {
137516
+ pathData: presetGeometry.d,
137517
+ pathTransform: [transform, `translate(${relX} ${relY})`].filter(Boolean).join(" ")
137518
+ } : {},
136346
137519
  ...gradient ? { gradient } : {},
136347
137520
  x: relX,
136348
137521
  y: relY,
@@ -136357,13 +137530,20 @@ function projectDrawingShapes(elementId, shapes, viewBox, palette, style) {
136357
137530
  transform,
136358
137531
  imageUrl: shape.fillImageUrl,
136359
137532
  textLines: shape.text ? centeredSvgTextLines(shape.text, fontSize, {
136360
- maxWidth: shape.width * TEXT_WIDTH_FRACTION,
136361
- centerY: cy
137533
+ maxWidth: textWrapWidth,
137534
+ centerY: textCenterY,
137535
+ lineHeight,
137536
+ lineHeightRatio
136362
137537
  }) : [],
136363
- textX: cx,
136364
- textY: cy,
137538
+ textX: textCenterX,
137539
+ textY: textCenterY,
137540
+ textWidth: textContentWidth,
137541
+ textHeight: textContentHeight,
136365
137542
  fontColor: shape.fontColor ?? drawingShapeLabelColor(shape, shapes, i, fill),
136366
- fontSize
137543
+ fontSize,
137544
+ fontFamily: shape.fontFamily ? getSubstituteFontFamily(shape.fontFamily) : void 0,
137545
+ fontWeight: shape.fontWeight,
137546
+ fontStyle: shape.fontStyle
136367
137547
  };
136368
137548
  });
136369
137549
  }
@@ -136513,7 +137693,7 @@ function resolveSlideSizeSelection(input) {
136513
137693
  }
136514
137694
  var EXPORT_ASSEMBLING_PERCENT = 95;
136515
137695
  var EXPORT_DONE_PERCENT = 100;
136516
- function clampPercent(value) {
137696
+ function clampPercent2(value) {
136517
137697
  if (Number.isNaN(value)) {
136518
137698
  return 0;
136519
137699
  }
@@ -136523,13 +137703,13 @@ function slideProgressPercent(current, total, span = 90) {
136523
137703
  if (total <= 0) {
136524
137704
  return 0;
136525
137705
  }
136526
- return clampPercent(current / total * span);
137706
+ return clampPercent2(current / total * span);
136527
137707
  }
136528
137708
  function recordProgressPercent(current, total) {
136529
137709
  if (total <= 0) {
136530
137710
  return 45;
136531
137711
  }
136532
- return clampPercent(45 + current / total * 45);
137712
+ return clampPercent2(45 + current / total * 45);
136533
137713
  }
136534
137714
  function slideStatusLabel(verb, current, total) {
136535
137715
  return `${verb} slide ${current + 1} of ${total}...`;
@@ -142737,7 +143917,8 @@ function masterViewParts(document2, target) {
142737
143917
  masterIndex: target.masterIndex,
142738
143918
  elements: master.elements ?? [],
142739
143919
  backgroundColor: master.backgroundColor,
142740
- backgroundImage: master.backgroundImage
143920
+ backgroundImage: master.backgroundImage,
143921
+ backgroundImageProperties: master.backgroundImageProperties
142741
143922
  };
142742
143923
  const layout = target.layoutIndex === null ? void 0 : master.layouts?.[target.layoutIndex];
142743
143924
  if (!layout || target.layoutIndex === null) {
@@ -142752,7 +143933,8 @@ function masterViewParts(document2, target) {
142752
143933
  layoutIndex: target.layoutIndex,
142753
143934
  elements: layout.elements ?? [],
142754
143935
  backgroundColor: layout.backgroundColor ?? master.backgroundColor,
142755
- backgroundImage: layout.backgroundImage ?? master.backgroundImage
143936
+ backgroundImage: layout.backgroundImage ?? master.backgroundImage,
143937
+ backgroundImageProperties: layout.backgroundImage ? layout.backgroundImageProperties : master.backgroundImageProperties
142756
143938
  }
142757
143939
  ];
142758
143940
  }
@@ -142763,7 +143945,8 @@ function auxiliaryParts(kind, part) {
142763
143945
  path: part.path,
142764
143946
  elements: part.elements ?? [],
142765
143947
  backgroundColor: part.backgroundColor,
142766
- backgroundImage: part.backgroundImage
143948
+ backgroundImage: part.backgroundImage,
143949
+ backgroundImageProperties: part.backgroundImageProperties
142767
143950
  }
142768
143951
  ] : [];
142769
143952
  }
@@ -142782,7 +143965,8 @@ function masterViewPseudoSlide(document2, target) {
142782
143965
  slideNumber: 0,
142783
143966
  elements: parts.flatMap((part) => [...part.elements]),
142784
143967
  backgroundColor: primary.backgroundColor,
142785
- backgroundImage: primary.backgroundImage
143968
+ backgroundImage: primary.backgroundImage,
143969
+ backgroundImageProperties: primary.backgroundImageProperties
142786
143970
  };
142787
143971
  }
142788
143972
  function masterViewElements(document2, target) {
@@ -145900,7 +147084,7 @@ function buildPrintHtmlDocument(options) {
145900
147084
  </html>`;
145901
147085
  }
145902
147086
  function openPendingPrintWindow(preparingLabel) {
145903
- const printWindow = window.open("", "_blank", "noopener,noreferrer");
147087
+ const printWindow = window.open("", "_blank");
145904
147088
  if (!printWindow) {
145905
147089
  return null;
145906
147090
  }
@@ -146004,4 +147188,4 @@ function segmentFrameCount(durationMs, fps) {
146004
147188
  * `<p:extLst>` (optional)
146005
147189
  */
146006
147190
 
146007
- 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, CHART_TYPE_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_MORPH_OPTIONS, TRANSITION_ORIENTATION_TYPES, TRANSITION_SOUND_NONE_VALUE, TRANSITION_SOUND_OTHER_VALUE, TRANSITION_SPEED_OPTIONS, 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, applyAnimationTimelineOrder, applyAutoCorrect, applyCaseTransformToSegments, applyChartBuildReveal, applyChartPartHighlight, applyColorChange, applyDuotone, applyFindReplacements, applyFormatToElement, applyMotionPathPreset, applyOutlineEdit, applyPreferenceToOptions, applyReadingViewCommand, applyRehearsalTimings, applyReroutedConnectors, applyResize, applyStyleToSelectedSegments, applyTableCellImagePatches, applyTableStyleImagePatches, applyTableStylePreset, applyThemeOverrideToSlide, applyThemeToData, applyTransitionSoundFile, attachPresentationVisibilityPause, authorConnectorBetweenSites, autosaveSnapshotMark, availableQuickAccessCommands, backstageCardsFor, beginChartValueDrag, beginShapeAdjustment, bringForward, bringToFront, build3DExtrusionData, buildActiveSessionUsers, buildAnimationTimelineBars, buildAnimationTimelineRows, buildAreaChart3DDataForElement, buildBarActions, buildBarChart3DDataForElement, buildBroadcastViewerUrl, buildCacheKey, buildCalloutLeaderLineSvgPath, buildChartViewModel, buildChromeStyle, buildCollaborationShareUrl, buildCommentMarkers, buildContextMenuEntries, buildCreateCollaborationConfig, buildCssGradientFromShapeStyle, buildDirectionGrid, buildDuotoneCacheKey, buildElementClipboardPayload, buildFieldSubstitutionContext, buildFontCatalog, buildHandoutsHtml, buildHollowHitOutline, buildInitialGuides, buildJoinCollaborationConfig, buildLayoutPreviewGeometry, buildLineChart3DDataForElement, buildMorphAnimationRules, buildMorphTransitionPlan, buildMotionPathPreview, buildNotesHtml, buildNotesPdfBytes, buildNotesPrintHtml, buildOleObjectNamePatch, buildOutline, buildOutlineHtml, buildParagraphs, buildPieChart3DDataForElement, buildPresentationAudienceUrl, buildPreviewAnimation, buildPreviewElements, buildPrintDocument, buildPrintHtmlDocument, buildRectPathGradient, buildRunTabLines, buildSaveSlides, buildSlideTemplateContent, buildSlideTemplateSlide, buildSlidesHtml, buildSlidesPdfBytes, buildSmartArt3DModel, buildSmartArtA11y, buildSmartArtPresetData, buildStrokeOutline, buildSubpathFillOverlay, buildSubpathPaints, buildSummaryZoomView, buildSurfaceChart3DDataForElement, buildSvgGradientDef, buildTabContext, 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, clearTransitionSound, cloneElementForPaste, cloneHistorySnapshot, cloneSlide, cloneTemplateElementsBySlideId, collectConnectorSiteCandidates, collectImagePaths, collectMediaElements, collectTableCellImagePaths, collectTableStyleImagePaths, collectUsedFonts, colorWithOpacity, commentTextSegments, comparePresentation, compileEquationTemplateMathMl, compileLatexEquation, computeAllNotesPages, computeAnchoredPopupPosition, computeChartLegendLayout, computeColorFilter, computeColumnBoundaries, computeDrawingViewBox, computeEntranceAnimationDelay, computeGridSpacingPx, computeHandoutLayout, computeInlineEditorRect, computeKeyboardInset, computeMarqueeHitIds, computeMergeCellDown, computeMergeCellRight, computeResizedColumnWidths, computeResizedRowHeight, computeScrollDelta, computeSelectionRect, computeSlideIndices, computeSmartArtElementLayout, 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, deriveViewportBreakpoints, describeFontEmbedding, describeSmartArtBounds, detectOrientation, detectTouchDevice, discardAutosaveRecovery, distributeElements, downloadBlob, downloadDataUrl, editCommentInList, elementActionToPptxAction, elementLockTogglePatch, embeddedFontSaveOptions, encodeGif, endAudienceDisplay, ensureActionAffordanceStyles, ensureChartInteractionStyles, erasePresentationInkAt, evenColumnWidths, evenRowHeights, exportDeckJson, extraQuickAccessCommands, extractPathPoints, filterCommands, filterHiddenSlideIndices, filterInteractableIds, filterRenderedElements, findChartPartTarget, findConnectorSiteNear, findEraserHitElementId, findInSlides, findMediaElementByElementId, findSmartArtNodeText, finishPrintWindow, firstShowSlideIndex, flattenNodes, flattenTagCollections, forgetSessionDeck, formatAxisValue, formatBackstageDate, formatBackstageSize, formatBytes, formatCommentTimestamp, formatElapsed, formatMobileElapsed, formatRelativeTime, formatSlideCounter, formatTime, formatVersionTimestamp, fpsToFrameIntervalMs, generateBroadcastRoomId, generateElementId, generateNibMarks, generateNoteLineCount, generatePressureCircles, generateTicks, getAnimationInitialStyle, getAriaLabel, getAriaRole, getAriaRoleDescription, getCachedResult, getCalloutLeaderLineGeometry, getCalloutViewBoxBounds, getCellDiagonalBorders, getChartStylePalette, getCompoundLineOffsets, getCompoundLineWidths, getComputedEffectStyle, getComputedFillStyle, getComputedStrokeStyle, getConnectorEndpointHandles, getContentPartReplayStyles, getCurrentParagraphIndex, getDraggedShapeAdjustments, getDuotoneCachedResult, getEffectSoundState, getElementLabel, getElementTransform, getElementTransformWithoutRotation, getGroupChildParentFill, getImageColorWashStyle, getImageEffectsFilter, getImageEffectsOpacity, getImageFitStyle, getImageSvgFilters, getImageTilingStyle, getInkReplayStyles, getInlineEditorSelection, getLocalStorageUsageSummary, getNotesPrintableArea, getOleAriaLabel, getOleBadgeLabel, getOleDisplayName, 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, 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, mountAreaChart3D, mountBarChart3D, mountLineChart3D, mountModel3D, mountPieChart3D, mountSurfaceChart3D, movePresenterPointer, moveQuickAccessCommand, moveSectionDown, moveSectionUp, moveSlidesToSection, nestedTextDecorationStyle, newTableElement, nextPresentedSlide, nextShowSlideIndex, normalizeColorsForCapture, normalizeHexColor, normalizeStrokeDashType, notesSegmentsToSpans, observeYDocSlides, ooxmlGradientAngleToCssDegrees, openNativeEyeDropper, openPendingPrintWindow, openPptxFile, openReadingView, openUrlInNewTab, paintedStrokeWidth, paragraphsToSegments, parseDrawingColor, parseDrawingColorOpacity, parsePanoseString, parsePpactionUrl, parseSegmentsFromRichEditor, partitionTemplateElements, patchChartData, pickSupportedMimeType, pieceLetterSpacing, placeAudienceWindow, placeCaretAtEnd, playFeedbackSound, 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, readSoundFileAsDataUrl, 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, reorderAnimationTimelineRows, replaceMasterViewElements, replyToCommentInList, rerouteConnectorsForMovedElements, resetPresenterTimer, resetSlideLayoutPath, resolve3DRenderingFlags, resolveActionType, resolveAudienceScreenPlacement, resolveAuthoredCustomShowId, resolveAutoAdvanceDelayMs, resolveAutoFitFontScale, resolveAutosaveActivation, resolveAutosaveIntervalMs, resolveAutosaveIntervalSeconds, resolveChartKind, resolveConnectorEndpointUpdate, resolveDefaultFontFamily, resolveDefaultPrintSettings, resolveDrawingShapeNodeId, resolveElementActionAffordance, resolveElementInteractivity, resolveExpiredAutosaveSnapshots, resolveFontKerning, resolveGroupChildFill, resolveHistoryDepth, resolveImageResolutionScale, resolveInkColor, resolveInkOpacity, resolveInkWidth, resolveInlineEditAutoFitHeight, resolveMetricTrackingPx, resolveNotesSchematicBodyFontSizePx, resolveNotesSegments, resolveOleType, resolveOptionRootClasses, resolvePalette, resolvePresentationAction, resolveProfileInitial, resolveScreenTip, resolveScriptFontSet, 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, segmentFrameCount, segmentsToEditorHtml, segmentsToParagraphs, segmentsToPlainText, sendBackward, sendToBack, setAfterAnimation, setAfterAnimationColor, setCachedResult, setCellText, setChartAxisGridlineStyle, setChartAxisLogScale, setChartAxisTitleStyle, setChartCategoryLabel, setChartCellValue, setChartDataPointExplosion, setChartDataPointFill, setChartDataPointLabel, setChartDataPointMarker, setChartSeriesChartType, setChartSeriesMarker, setDuotoneCachedResult, setEffectSound, setMasterViewBackgroundColor, setMotionPath, setMotionPathEnd, setPendingSelectionRestore, setSmartArtNodeStyle, setTableElementCellText, shapeFillChange, shapeOutlineChange, shouldAutoFollowBroadcaster, shouldClearAutosaveCacheOnClose, shouldCommitSmartArtNodeText, shouldConfirmExternalHyperlink, shouldDiscardAutosaveOnSuccessfulSave, shouldLoopContinuously, shouldProbeAutosaveRecovery, shouldRoomSlidesReplaceLoad, shouldShowAutosaveRecoveryPrompt, shouldUseSvgWarp, shouldWriteAutosaveSnapshot, siblingCount, siblingIndex, slideProgressPercent, slideShowOptionChange, slideSizeFromPreset, slideSizeToCanvasPx, slideStatusLabel, snapBoxToGrid, splitCell, splitRunByScriptFont, 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, transitionSoundOptions, transitionSoundSelectedValue, ungroupElements, updateCellTextInRawXml, updateCellTextStyleInRawXml, updateMasterViewElement, updateMergeAttrsInRawXml, updateSmartArtNodeText, updateTagInCollections, validateRoomId, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius, viewerOptionsToPreferences, warpPreviewPath, withChartTitle, withConnectorEndpointUpdate, withFrameSlides, withSlideSizeOrientation, withSlidesPerPage, writeStoredViewerPrefs };
147191
+ 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, CHART_TYPE_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_MORPH_OPTIONS, TRANSITION_ORIENTATION_TYPES, TRANSITION_SOUND_NONE_VALUE, TRANSITION_SOUND_OTHER_VALUE, TRANSITION_SPEED_OPTIONS, 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, applyAnimationTimelineOrder, applyAutoCorrect, applyCaseTransformToSegments, applyChartBuildReveal, applyChartPartHighlight, applyColorChange, applyDuotone, applyFindReplacements, applyFormatToElement, applyMotionPathPreset, applyOutlineEdit, applyPreferenceToOptions, applyReadingViewCommand, applyRehearsalTimings, applyReroutedConnectors, applyResize, applyStyleToSelectedSegments, applyTableCellImagePatches, applyTableStyleImagePatches, applyTableStylePreset, applyThemeOverrideToSlide, applyThemeToData, applyTransitionSoundFile, attachPresentationVisibilityPause, authorConnectorBetweenSites, autosaveSnapshotMark, availableQuickAccessCommands, backstageCardsFor, beginChartValueDrag, beginShapeAdjustment, bringForward, bringToFront, build3DExtrusionData, buildActiveSessionUsers, buildAnimationTimelineBars, buildAnimationTimelineRows, buildAreaChart3DDataForElement, buildBarActions, buildBarChart3DDataForElement, buildBroadcastViewerUrl, buildCacheKey, buildCalloutLeaderLineSvgPath, buildChartViewModel, buildChromeStyle, buildCollaborationShareUrl, buildCommentMarkers, buildContextMenuEntries, buildCreateCollaborationConfig, buildCssGradientFromShapeStyle, buildDirectionGrid, buildDuotoneCacheKey, buildElementClipboardPayload, buildFieldSubstitutionContext, buildFontCatalog, buildHandoutsHtml, buildHollowHitOutline, buildInitialGuides, buildJoinCollaborationConfig, buildLayoutPreviewGeometry, buildLineChart3DDataForElement, buildMorphAnimationRules, buildMorphTransitionPlan, buildMotionPathPreview, buildNotesHtml, buildNotesPdfBytes, buildNotesPrintHtml, buildOleObjectNamePatch, buildOutline, buildOutlineHtml, buildParagraphs, buildPieChart3DDataForElement, buildPresentationAudienceUrl, buildPreviewAnimation, buildPreviewElements, buildPrintDocument, buildPrintHtmlDocument, buildRectPathGradient, buildRunTabLines, buildSaveSlides, buildSlideTemplateContent, buildSlideTemplateSlide, buildSlidesHtml, buildSlidesPdfBytes, buildSmartArt3DModel, buildSmartArtA11y, buildSmartArtPresetData, buildStrokeOutline, buildSubpathFillOverlay, buildSubpathPaints, buildSummaryZoomView, buildSurfaceChart3DDataForElement, buildSvgGradientDef, buildTabContext, buildTableDataGrid, buildTextBlockStyle, buildTextBody3DSceneStyle, buildTextBodyLayoutStyle, buildTextBuildSpec, buildThemeColorGrid, buildThemeColorMap, buildUserFontFaceStyles, canAddTopLevelNode, canCommitActionType, canGoNext, canGoPrevious, canInteractWithElement, canRemoveTopLevelNode, canvasToJpegData, cellRunStyle, cellStyleToCss, centeredSvgTextLines, chartPartToAttrs, chartPreserveAspectRatio, clampCropValue, clampNotesFontSize, clampOptionNumber, clampPercent2, clampSorterZoom, clampTransitionNumber, clampUnitInterval2 as clampUnitInterval, clampZoomScale, classifyExtraConnections, classifyMediaType, clearAllLocalViewerData, clearAudienceContent, clearLocalAwareness, clearMotionPath, clearStoredViewerPrefs, clearTransitionSound, cloneElementForPaste, cloneHistorySnapshot, cloneSlide, cloneTemplateElementsBySlideId, collectConnectorSiteCandidates, collectImagePaths, collectMediaElements, collectTableCellImagePaths, collectTableStyleImagePaths, collectUsedFonts, colorWithOpacity, commentTextSegments, comparePresentation, compileEquationTemplateMathMl, compileLatexEquation, computeAllNotesPages, computeAnchoredPopupPosition, computeChartLegendLayout, computeColorFilter, computeColumnBoundaries, computeDrawingViewBox, computeEntranceAnimationDelay, computeGridSpacingPx, computeHandoutLayout, computeInlineEditorRect, computeKeyboardInset, computeMarqueeHitIds, computeMergeCellDown, computeMergeCellRight, computeResizedColumnWidths, computeResizedRowHeight, computeScrollDelta, computeSelectionRect, computeSlideIndices, computeSmartArtElementLayout, 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, deriveViewportBreakpoints, describeFontEmbedding, describeSmartArtBounds, detectOrientation, detectTouchDevice, discardAutosaveRecovery, distributeElements, downloadBlob, downloadDataUrl, editCommentInList, elementActionToPptxAction, elementLockTogglePatch, embeddedFontSaveOptions, encodeGif, endAudienceDisplay, ensureActionAffordanceStyles, ensureChartInteractionStyles, erasePresentationInkAt, evenColumnWidths, evenRowHeights, exportDeckJson, extraQuickAccessCommands, extractPathPoints, filterCommands, filterHiddenSlideIndices, filterInteractableIds, filterRenderedElements, findChartPartTarget, findConnectorSiteNear, findEraserHitElementId, findInSlides, findMediaElementByElementId, findSmartArtNodeText, finishPrintWindow, firstShowSlideIndex, flattenNodes, flattenTagCollections, forgetSessionDeck, formatAxisValue, formatBackstageDate, formatBackstageSize, formatBytes, formatCommentTimestamp, formatElapsed, formatMobileElapsed, formatRelativeTime, formatSlideCounter, formatTime, formatVersionTimestamp, fpsToFrameIntervalMs, generateBroadcastRoomId, generateElementId, generateNibMarks, generateNoteLineCount, generatePressureCircles, generateTicks, getAnimationColorBaseStyle, getAnimationInitialStyle, getAriaLabel, getAriaRole, getAriaRoleDescription, getCachedResult, getCalloutLeaderLineGeometry, getCalloutViewBoxBounds, getCellDiagonalBorders, getChartStylePalette, getCompoundLineOffsets, getCompoundLineWidths, getComputedEffectStyle, getComputedFillStyle, getComputedStrokeStyle, getConnectorEndpointHandles, getContentPartReplayStyles, getCurrentParagraphIndex, getDraggedShapeAdjustments, getDuotoneCachedResult, getEffectSoundState, getElementLabel, getElementTransform, getElementTransformWithoutRotation, getGroupChildParentFill, getImageColorWashStyle, getImageEffectsFilter, getImageEffectsOpacity, getImageFitStyle, getImageSvgFilters, getImageTilingStyle, getInkReplayStyles, getInlineEditorSelection, getLocalStorageUsageSummary, getNotesPrintableArea, getOleAriaLabel, getOleBadgeLabel, getOleDisplayName, getOleObjectTypeLabel, getOleTypeColor, getOleTypeLabel, getOverflowSegments, getPatternSvg, getPendingSelectionRestore, getPresetShapeClipPath, getPresetShapeVectorGeometry, getPrintableArea, getSessionTabId, getShapeAdjustmentHandleDescriptors, getShapeConnectionSites, getSlideBackgroundStyle, getSlideTransitionAnimations, getSoftEdgeSvgFilter, getSubstituteFontFamily, getSvgStrokeDasharray, getTableCellBandStyle, getTextBodyRotationTransform, getTextCompensationTransform, getWarpPath, groupElements, groupIntoParagraphs, groupSlidesBySection, guidePxToEmu, handleReadingViewKey, hasCopyableFormat, hasDistinctScriptFonts, hasPressureVariation, hasShapeProperties, hasShowSlideAfter, hasTextProperties, 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, isWedgeCalloutPresetShape, 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, mountAreaChart3D, mountBarChart3D, mountLineChart3D, mountModel3D, mountPieChart3D, mountSurfaceChart3D, movePresenterPointer, moveQuickAccessCommand, moveSectionDown, moveSectionUp, moveSlidesToSection, nestedTextDecorationStyle, newTableElement, nextPresentedSlide, nextShowSlideIndex, normalizeColorsForCapture, normalizeHexColor, normalizeStrokeDashType, notesSegmentsToSpans, observeYDocSlides, ooxmlGradientAngleToCssDegrees, openNativeEyeDropper, openPendingPrintWindow, openPptxFile, openReadingView, openUrlInNewTab, paintedStrokeWidth, paragraphsToSegments, parseDrawingColor, parseDrawingColorOpacity, parsePanoseString, parsePpactionUrl, parseSegmentsFromRichEditor, partitionTemplateElements, patchChartData, pickSupportedMimeType, pieceLetterSpacing, placeAudienceWindow, placeCaretAtEnd, playFeedbackSound, 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, readSoundFileAsDataUrl, 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, reorderAnimationTimelineRows, replaceMasterViewElements, replyToCommentInList, rerouteConnectorsForMovedElements, resetPresenterTimer, resetSlideLayoutPath, resolve3DRenderingFlags, resolveActionType, resolveAudienceScreenPlacement, resolveAuthoredCustomShowId, resolveAutoAdvanceDelayMs, resolveAutoFitFontScale, resolveAutosaveActivation, resolveAutosaveIntervalMs, resolveAutosaveIntervalSeconds, resolveChartKind, resolveConnectorEndpointUpdate, resolveDefaultFontFamily, resolveDefaultPrintSettings, resolveDrawingShapeNodeId, resolveElementActionAffordance, resolveElementInteractivity, resolveExpiredAutosaveSnapshots, resolveFontKerning, resolveGroupChildFill, resolveHistoryDepth, resolveImageResolutionScale, resolveInkColor, resolveInkOpacity, resolveInkWidth, resolveInlineEditAutoFitHeight, resolveMetricTrackingPx, resolveNotesSchematicBodyFontSizePx, resolveNotesSegments, resolveOleType, resolveOptionRootClasses, resolvePalette, resolvePresentationAction, resolveProfileInitial, resolveScreenTip, resolveScriptFontSet, 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, segmentFrameCount, segmentsToEditorHtml, segmentsToParagraphs, segmentsToPlainText, sendBackward, sendToBack, setAfterAnimation, setAfterAnimationColor, setCachedResult, setCellText, setChartAxisGridlineStyle, setChartAxisLogScale, setChartAxisTitleStyle, setChartCategoryLabel, setChartCellValue, setChartDataPointExplosion, setChartDataPointFill, setChartDataPointLabel, setChartDataPointMarker, setChartSeriesChartType, setChartSeriesMarker, setDuotoneCachedResult, setEffectSound, setMasterViewBackgroundColor, setMotionPath, setMotionPathEnd, setPendingSelectionRestore, setSmartArtNodeStyle, setTableElementCellText, shapeFillChange, shapeOutlineChange, shouldAutoFollowBroadcaster, shouldClearAutosaveCacheOnClose, shouldCommitSmartArtNodeText, shouldConfirmExternalHyperlink, shouldDiscardAutosaveOnSuccessfulSave, shouldLoopContinuously, shouldProbeAutosaveRecovery, shouldRoomSlidesReplaceLoad, shouldShowAutosaveRecoveryPrompt, shouldUseSvgWarp, shouldWriteAutosaveSnapshot, siblingCount, siblingIndex, slideProgressPercent, slideShowOptionChange, slideSizeFromPreset, slideSizeToCanvasPx, slideStatusLabel, snapBoxToGrid, splitCell, splitRunByScriptFont, 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, transitionSoundOptions, transitionSoundSelectedValue, ungroupElements, updateCellTextInRawXml, updateCellTextStyleInRawXml, updateMasterViewElement, updateMergeAttrsInRawXml, updateSmartArtNodeText, updateTagInCollections, validateRoomId, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius, viewerOptionsToPreferences, warpPreviewPath, withChartTitle, withConnectorEndpointUpdate, withFrameSlides, withSlideSizeOrientation, withSlidesPerPage, writeStoredViewerPrefs };