pptx-react-viewer 2.10.0 → 2.11.1

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 (125) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/{AiChatPanel-KTMWRUD5.js → AiChatPanel-E6W3EACA.js} +23 -23
  3. package/dist/AiChatPanel-E6W3EACA.js.br +0 -0
  4. package/dist/AiChatPanel-E6W3EACA.js.gz +0 -0
  5. package/dist/{AiChatPanel-35CHYS5N.mjs → AiChatPanel-RMQIJDUJ.mjs} +4 -4
  6. package/dist/AiChatPanel-RMQIJDUJ.mjs.br +0 -0
  7. package/dist/AiChatPanel-RMQIJDUJ.mjs.gz +0 -0
  8. package/dist/{Model3DScene-TMNUKCL6.js → Model3DScene-U4B4NZJT.js} +2 -2
  9. package/dist/Model3DScene-U4B4NZJT.js.br +0 -0
  10. package/dist/Model3DScene-U4B4NZJT.js.gz +0 -0
  11. package/dist/{Model3DScene-2VMN3B65.mjs → Model3DScene-WHSHBMR5.mjs} +1 -1
  12. package/dist/Model3DScene-WHSHBMR5.mjs.br +0 -0
  13. package/dist/Model3DScene-WHSHBMR5.mjs.gz +0 -0
  14. package/dist/{SurfaceChart3DScene-KPNP3QD5.js → SurfaceChart3DScene-5S43UBRD.js} +2 -2
  15. package/dist/SurfaceChart3DScene-5S43UBRD.js.br +0 -0
  16. package/dist/SurfaceChart3DScene-5S43UBRD.js.gz +0 -0
  17. package/dist/{SurfaceChart3DScene-GKRDDN2U.mjs → SurfaceChart3DScene-77JP5XH5.mjs} +1 -1
  18. package/dist/{SurfaceChart3DScene-GKRDDN2U.mjs.br → SurfaceChart3DScene-77JP5XH5.mjs.br} +0 -0
  19. package/dist/SurfaceChart3DScene-77JP5XH5.mjs.gz +0 -0
  20. package/dist/{chunk-FY2AFXKP.mjs → chunk-DD54KUDG.mjs} +29 -4
  21. package/dist/chunk-DD54KUDG.mjs.br +0 -0
  22. package/dist/chunk-DD54KUDG.mjs.gz +0 -0
  23. package/dist/{chunk-IJVDNQLG.js → chunk-FAP6OPLL.js} +275 -249
  24. package/dist/chunk-FAP6OPLL.js.br +0 -0
  25. package/dist/chunk-FAP6OPLL.js.gz +0 -0
  26. package/dist/{chunk-TJ55KUWH.mjs → chunk-FV7HEYCX.mjs} +1069 -114
  27. package/dist/chunk-FV7HEYCX.mjs.br +0 -0
  28. package/dist/chunk-FV7HEYCX.mjs.gz +0 -0
  29. package/dist/{chunk-LXTKPSIG.mjs → chunk-HF6L2CTF.mjs} +1 -1
  30. package/dist/chunk-HF6L2CTF.mjs.br +0 -0
  31. package/dist/chunk-HF6L2CTF.mjs.gz +0 -0
  32. package/dist/{chunk-MMK4K3QI.js → chunk-IOVOQ6ZJ.js} +136 -1
  33. package/dist/chunk-IOVOQ6ZJ.js.br +0 -0
  34. package/dist/chunk-IOVOQ6ZJ.js.gz +0 -0
  35. package/dist/{chunk-JWMXOYSX.js → chunk-IXBM3HWH.js} +2289 -1824
  36. package/dist/chunk-IXBM3HWH.js.br +0 -0
  37. package/dist/chunk-IXBM3HWH.js.gz +0 -0
  38. package/dist/{chunk-H74UXL4Q.js → chunk-KDJBWJJH.js} +1102 -113
  39. package/dist/chunk-KDJBWJJH.js.br +0 -0
  40. package/dist/chunk-KDJBWJJH.js.gz +0 -0
  41. package/dist/{chunk-OHPF2HTP.mjs → chunk-NJ4PTG4F.mjs} +40 -28
  42. package/dist/chunk-NJ4PTG4F.mjs.br +0 -0
  43. package/dist/chunk-NJ4PTG4F.mjs.gz +0 -0
  44. package/dist/{chunk-LCG7WBAG.mjs → chunk-PXYZFWDA.mjs} +625 -160
  45. package/dist/chunk-PXYZFWDA.mjs.br +0 -0
  46. package/dist/chunk-PXYZFWDA.mjs.gz +0 -0
  47. package/dist/{chunk-A7HLINZU.js → chunk-QT6BPOZM.js} +361 -349
  48. package/dist/chunk-QT6BPOZM.js.br +0 -0
  49. package/dist/chunk-QT6BPOZM.js.gz +0 -0
  50. package/dist/{chunk-SL3XPERE.mjs → chunk-RHR7GTDX.mjs} +136 -1
  51. package/dist/chunk-RHR7GTDX.mjs.br +0 -0
  52. package/dist/chunk-RHR7GTDX.mjs.gz +0 -0
  53. package/dist/{chunk-SPJR6MPI.js → chunk-X3SFCKAF.js} +3 -3
  54. package/dist/chunk-X3SFCKAF.js.br +0 -0
  55. package/dist/chunk-X3SFCKAF.js.gz +0 -0
  56. package/dist/i18n.js +4 -4
  57. package/dist/i18n.js.br +0 -0
  58. package/dist/i18n.js.gz +0 -0
  59. package/dist/i18n.mjs +1 -1
  60. package/dist/i18n.mjs.br +0 -0
  61. package/dist/i18n.mjs.gz +0 -0
  62. package/dist/index.d.ts +28 -3
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +36 -36
  65. package/dist/index.js.br +0 -0
  66. package/dist/index.js.gz +0 -0
  67. package/dist/index.mjs +6 -6
  68. package/dist/index.mjs.br +0 -0
  69. package/dist/index.mjs.gz +0 -0
  70. package/dist/internals.d.ts +38 -3
  71. package/dist/internals.d.ts.map +1 -1
  72. package/dist/internals.js +79 -79
  73. package/dist/internals.js.br +0 -0
  74. package/dist/internals.js.gz +0 -0
  75. package/dist/internals.mjs +4 -4
  76. package/dist/internals.mjs.br +0 -0
  77. package/dist/internals.mjs.gz +0 -0
  78. package/dist/pptx-viewer.css +1 -1
  79. package/dist/pptx-viewer.css.br +0 -0
  80. package/dist/pptx-viewer.css.gz +0 -0
  81. package/dist/{useViewerBuildingBlocks-CpUwhBD5.d.ts → useViewerBuildingBlocks-YvCYsxa3.d.ts} +21 -5
  82. package/dist/useViewerBuildingBlocks-YvCYsxa3.d.ts.map +1 -0
  83. package/dist/viewer/index.js +22 -22
  84. package/dist/viewer/index.js.br +0 -0
  85. package/dist/viewer/index.js.gz +0 -0
  86. package/dist/viewer/index.mjs +6 -6
  87. package/dist/viewer/index.mjs.br +0 -0
  88. package/dist/viewer/index.mjs.gz +0 -0
  89. package/package.json +1 -1
  90. package/dist/AiChatPanel-35CHYS5N.mjs.br +0 -0
  91. package/dist/AiChatPanel-35CHYS5N.mjs.gz +0 -0
  92. package/dist/AiChatPanel-KTMWRUD5.js.br +0 -0
  93. package/dist/AiChatPanel-KTMWRUD5.js.gz +0 -0
  94. package/dist/Model3DScene-2VMN3B65.mjs.br +0 -0
  95. package/dist/Model3DScene-2VMN3B65.mjs.gz +0 -0
  96. package/dist/Model3DScene-TMNUKCL6.js.br +0 -0
  97. package/dist/Model3DScene-TMNUKCL6.js.gz +0 -0
  98. package/dist/SurfaceChart3DScene-GKRDDN2U.mjs.gz +0 -0
  99. package/dist/SurfaceChart3DScene-KPNP3QD5.js.br +0 -0
  100. package/dist/SurfaceChart3DScene-KPNP3QD5.js.gz +0 -0
  101. package/dist/chunk-A7HLINZU.js.br +0 -0
  102. package/dist/chunk-A7HLINZU.js.gz +0 -0
  103. package/dist/chunk-FY2AFXKP.mjs.br +0 -0
  104. package/dist/chunk-FY2AFXKP.mjs.gz +0 -0
  105. package/dist/chunk-H74UXL4Q.js.br +0 -0
  106. package/dist/chunk-H74UXL4Q.js.gz +0 -0
  107. package/dist/chunk-IJVDNQLG.js.br +0 -0
  108. package/dist/chunk-IJVDNQLG.js.gz +0 -0
  109. package/dist/chunk-JWMXOYSX.js.br +0 -0
  110. package/dist/chunk-JWMXOYSX.js.gz +0 -0
  111. package/dist/chunk-LCG7WBAG.mjs.br +0 -0
  112. package/dist/chunk-LCG7WBAG.mjs.gz +0 -0
  113. package/dist/chunk-LXTKPSIG.mjs.br +0 -0
  114. package/dist/chunk-LXTKPSIG.mjs.gz +0 -0
  115. package/dist/chunk-MMK4K3QI.js.br +0 -0
  116. package/dist/chunk-MMK4K3QI.js.gz +0 -0
  117. package/dist/chunk-OHPF2HTP.mjs.br +0 -0
  118. package/dist/chunk-OHPF2HTP.mjs.gz +0 -0
  119. package/dist/chunk-SL3XPERE.mjs.br +0 -0
  120. package/dist/chunk-SL3XPERE.mjs.gz +0 -0
  121. package/dist/chunk-SPJR6MPI.js.br +0 -0
  122. package/dist/chunk-SPJR6MPI.js.gz +0 -0
  123. package/dist/chunk-TJ55KUWH.mjs.br +0 -0
  124. package/dist/chunk-TJ55KUWH.mjs.gz +0 -0
  125. package/dist/useViewerBuildingBlocks-CpUwhBD5.d.ts.map +0 -1
@@ -46608,8 +46608,8 @@ function applyImageColorEffects(blip, effects, parseColor, extractOpacity) {
46608
46608
  const rawFrom = child19(change.rawXml, "clrFrom");
46609
46609
  const rawTo = child19(change.rawXml, "clrTo");
46610
46610
  const rawTransparent = rawTo ? (opacity(rawTo, extractOpacity) ?? 1) <= 0 : void 0;
46611
- const unchanged = sameRawColor(rawFrom, change.clrFrom, parseColor) && sameRawColor(rawTo, change.clrTo, parseColor) && (rawTransparent === void 0 || change.clrToTransparent === rawTransparent);
46612
- if (unchanged && change.rawXml) {
46611
+ const unchanged2 = sameRawColor(rawFrom, change.clrFrom, parseColor) && sameRawColor(rawTo, change.clrTo, parseColor) && (rawTransparent === void 0 || change.clrToTransparent === rawTransparent);
46612
+ if (unchanged2 && change.rawXml) {
46613
46613
  setChild6(blip, "clrChange", change.rawXml);
46614
46614
  } else {
46615
46615
  const fromChoice = sameRawColor(rawFrom, change.clrFrom, parseColor) ? extractColorChoiceXml(rawFrom) : buildSrgbColorChoice(change.clrFrom);
@@ -50614,8 +50614,8 @@ var PptxHandlerRuntime14 = class extends PptxHandlerRuntime13 {
50614
50614
  }
50615
50615
  const notesBodyShape = shapes.find((shape) => {
50616
50616
  const placeholder = shape?.["p:nvSpPr"]?.["p:nvPr"]?.["p:ph"];
50617
- const placeholderType = String(placeholder?.["@_type"] || "").trim().toLowerCase();
50618
- return placeholderType === "body";
50617
+ const placeholderType2 = String(placeholder?.["@_type"] || "").trim().toLowerCase();
50618
+ return placeholderType2 === "body";
50619
50619
  }) || shapes.find((shape) => Boolean(shape?.["p:txBody"])) || shapes[0];
50620
50620
  if (!notesBodyShape) {
50621
50621
  return false;
@@ -51453,10 +51453,16 @@ var PptxHandlerRuntime17 = class extends PptxHandlerRuntime16 {
51453
51453
  * survive a save: collapsing them to the plain-text path silently downgrades
51454
51454
  * a field to static text (e.g. a slide-number field becomes a frozen number)
51455
51455
  * or drops the equation, ruby, or bullet.
51456
+ *
51457
+ * `paragraphLevel` (`a:pPr/@lvl`) belongs on this list for the same reason
51458
+ * and used to be missing from it: a nested bullet whose runs all share one
51459
+ * style looked "uniform", so the save path discarded its segments and rebuilt
51460
+ * the paragraph from the flat string, which carries no indent level. Every
51461
+ * such paragraph came back from a round-trip flattened to the top level.
51456
51462
  */
51457
51463
  isStructuralTextSegment(segment) {
51458
51464
  return Boolean(
51459
- segment.fieldType || segment.equationXml || segment.rubyText || segment.bulletInfo
51465
+ segment.fieldType || segment.equationXml || segment.rubyText || segment.bulletInfo || segment.paragraphLevel
51460
51466
  );
51461
51467
  }
51462
51468
  areTextSegmentsUniform(textSegments) {
@@ -87147,6 +87153,105 @@ function resolveDataPointExplosion(series, pointIndex) {
87147
87153
  const point = findDataPoint(series, pointIndex);
87148
87154
  return point?.explosion ?? series.explosion ?? 0;
87149
87155
  }
87156
+ function resolveDataPointMarker(series, pointIndex) {
87157
+ const point = findDataPoint(series, pointIndex)?.marker;
87158
+ return {
87159
+ symbol: point?.symbol ?? series.marker?.symbol,
87160
+ size: point?.size ?? series.marker?.size,
87161
+ fill: point?.spPr?.fillColor ?? series.marker?.spPr?.fillColor
87162
+ };
87163
+ }
87164
+ function schemaLabel(keys, token2, translate) {
87165
+ if (token2 === void 0) {
87166
+ return "";
87167
+ }
87168
+ const key = keys[token2];
87169
+ return key === void 0 ? token2 : translate(key);
87170
+ }
87171
+ var THEME_COLOR_SLOT_LABEL_KEYS = {
87172
+ dk1: "pptx.themeColor.dark1",
87173
+ lt1: "pptx.themeColor.light1",
87174
+ dk2: "pptx.themeColor.dark2",
87175
+ lt2: "pptx.themeColor.light2",
87176
+ accent1: "pptx.themeColor.accent1",
87177
+ accent2: "pptx.themeColor.accent2",
87178
+ accent3: "pptx.themeColor.accent3",
87179
+ accent4: "pptx.themeColor.accent4",
87180
+ accent5: "pptx.themeColor.accent5",
87181
+ accent6: "pptx.themeColor.accent6",
87182
+ hlink: "pptx.themeColor.hyperlink",
87183
+ folHlink: "pptx.themeColor.followedHyperlink"
87184
+ };
87185
+ var SMARTART_COLOR_SCHEME_LABEL_KEYS = {
87186
+ colorful1: "pptx.smartart.schemeColorful1",
87187
+ colorful2: "pptx.smartart.schemeColorful2",
87188
+ colorful3: "pptx.smartart.schemeColorful3",
87189
+ monochromatic1: "pptx.smartart.schemeMonochromatic1",
87190
+ monochromatic2: "pptx.smartart.schemeMonochromatic2"
87191
+ };
87192
+ var SMARTART_STYLE_LABEL_KEYS = {
87193
+ flat: "pptx.smartart.styleFlat",
87194
+ moderate: "pptx.smartart.styleModerate",
87195
+ intense: "pptx.smartart.styleIntense"
87196
+ };
87197
+ var FILL_PATTERN_LABEL_KEYS = {
87198
+ pct5: "pptx.fillPatterns.pct5",
87199
+ pct10: "pptx.fillPatterns.pct10",
87200
+ pct20: "pptx.fillPatterns.pct20",
87201
+ pct25: "pptx.fillPatterns.pct25",
87202
+ pct30: "pptx.fillPatterns.pct30",
87203
+ pct40: "pptx.fillPatterns.pct40",
87204
+ pct50: "pptx.fillPatterns.pct50",
87205
+ pct60: "pptx.fillPatterns.pct60",
87206
+ pct70: "pptx.fillPatterns.pct70",
87207
+ pct75: "pptx.fillPatterns.pct75",
87208
+ pct80: "pptx.fillPatterns.pct80",
87209
+ pct90: "pptx.fillPatterns.pct90",
87210
+ horz: "pptx.fillPatterns.horizontal",
87211
+ vert: "pptx.fillPatterns.vertical",
87212
+ ltHorz: "pptx.fillPatterns.lightHorizontal",
87213
+ ltVert: "pptx.fillPatterns.lightVertical",
87214
+ dkHorz: "pptx.fillPatterns.darkHorizontal",
87215
+ dkVert: "pptx.fillPatterns.darkVertical",
87216
+ narHorz: "pptx.fillPatterns.narrowHorizontal",
87217
+ narVert: "pptx.fillPatterns.narrowVertical",
87218
+ wdHorz: "pptx.fillPatterns.wideHorizontal",
87219
+ wdVert: "pptx.fillPatterns.wideVertical",
87220
+ dashHorz: "pptx.fillPatterns.dashedHorizontal",
87221
+ dashVert: "pptx.fillPatterns.dashedVertical",
87222
+ cross: "pptx.fillPatterns.cross",
87223
+ dnDiag: "pptx.fillPatterns.downDiagonal",
87224
+ upDiag: "pptx.fillPatterns.upDiagonal",
87225
+ ltDnDiag: "pptx.fillPatterns.lightDownDiagonal",
87226
+ ltUpDiag: "pptx.fillPatterns.lightUpDiagonal",
87227
+ dkDnDiag: "pptx.fillPatterns.darkDownDiagonal",
87228
+ dkUpDiag: "pptx.fillPatterns.darkUpDiagonal",
87229
+ wdDnDiag: "pptx.fillPatterns.wideDownDiagonal",
87230
+ wdUpDiag: "pptx.fillPatterns.wideUpDiagonal",
87231
+ dashDnDiag: "pptx.fillPatterns.dashedDownDiagonal",
87232
+ dashUpDiag: "pptx.fillPatterns.dashedUpDiagonal",
87233
+ diagCross: "pptx.fillPatterns.diagonalCross",
87234
+ smCheck: "pptx.fillPatterns.smallCheck",
87235
+ lgCheck: "pptx.fillPatterns.largeCheck",
87236
+ smGrid: "pptx.fillPatterns.smallGrid",
87237
+ lgGrid: "pptx.fillPatterns.largeGrid",
87238
+ dotGrid: "pptx.fillPatterns.dotGrid",
87239
+ smConfetti: "pptx.fillPatterns.smallConfetti",
87240
+ lgConfetti: "pptx.fillPatterns.largeConfetti",
87241
+ horzBrick: "pptx.fillPatterns.horizontalBrick",
87242
+ diagBrick: "pptx.fillPatterns.diagonalBrick",
87243
+ solidDmnd: "pptx.fillPatterns.solidDiamond",
87244
+ openDmnd: "pptx.fillPatterns.openDiamond",
87245
+ dotDmnd: "pptx.fillPatterns.dottedDiamond",
87246
+ plaid: "pptx.fillPatterns.plaid",
87247
+ sphere: "pptx.fillPatterns.sphere",
87248
+ weave: "pptx.fillPatterns.weave",
87249
+ divot: "pptx.fillPatterns.divot",
87250
+ shingle: "pptx.fillPatterns.shingle",
87251
+ wave: "pptx.fillPatterns.wave",
87252
+ trellis: "pptx.fillPatterns.trellis",
87253
+ zigZag: "pptx.fillPatterns.zigZag"
87254
+ };
87150
87255
  function addChartSeries(data) {
87151
87256
  return chartDataAddSeries(data, {
87152
87257
  name: `Series ${data.series.length + 1}`,
@@ -88034,13 +88139,16 @@ function buildMarkerPrimitive(input) {
88034
88139
  return { kind: "circle", cx, cy, r, fill, part };
88035
88140
  }
88036
88141
  }
88037
- function pushMarker(out, series, cx, cy, fill, defaultRadius2, part, opacity2) {
88142
+ function pushMarker(out, series, pointIndex, cx, cy, fill, defaultRadius2, part, opacity2) {
88143
+ const marker = resolveDataPointMarker(series, pointIndex);
88038
88144
  const m = buildMarkerPrimitive({
88039
- symbol: series.marker?.symbol,
88040
- size: series.marker?.size,
88145
+ symbol: marker.symbol,
88146
+ size: marker.size,
88041
88147
  cx,
88042
88148
  cy,
88043
- fill,
88149
+ // A marker fill (series or per-point) wins over the plot fill, which is
88150
+ // what the line/area body is drawn with.
88151
+ fill: marker.fill ?? fill,
88044
88152
  defaultRadius: defaultRadius2,
88045
88153
  part
88046
88154
  });
@@ -88120,6 +88228,7 @@ function buildLines(chartData, catCount, layout, primaryRange, secondaryRange, s
88120
88228
  pushMarker(
88121
88229
  primitives,
88122
88230
  series,
88231
+ idx,
88123
88232
  pt.x,
88124
88233
  pt.y,
88125
88234
  resolveDataPointFill(series, idx, c) ?? c,
@@ -88191,6 +88300,7 @@ function buildAreas(chartData, catCount, layout, range, sourceIndices2, xPositio
88191
88300
  pushMarker(
88192
88301
  primitives,
88193
88302
  series,
88303
+ idx,
88194
88304
  pt.x,
88195
88305
  pt.y,
88196
88306
  resolveDataPointFill(series, idx, c) ?? c,
@@ -88234,6 +88344,7 @@ function buildScatter(chartData, layout, range) {
88234
88344
  pushMarker(
88235
88345
  primitives,
88236
88346
  series,
88347
+ vi,
88237
88348
  dot.cx,
88238
88349
  dot.cy,
88239
88350
  resolveDataPointFill(series, vi, c) ?? c,
@@ -93703,6 +93814,10 @@ function applyFlyDirection(effect, subtype) {
93703
93814
  const suffix = `${edge.charAt(0).toUpperCase()}${edge.slice(1)}`;
93704
93815
  return `${prefix}${suffix}`;
93705
93816
  }
93817
+ function slideOffset(percent2, axis) {
93818
+ const fallback = axis === "w" ? "1280px" : "720px";
93819
+ return `calc(var(--pptx-slide-${axis}, ${fallback}) * ${(percent2 / 100).toFixed(4)})`;
93820
+ }
93706
93821
  function buildDynamicKeyframe(anim, uid) {
93707
93822
  if (anim.motionPath) {
93708
93823
  const name = `pptx-tl-motion-${uid}`;
@@ -93713,8 +93828,8 @@ function buildDynamicKeyframe(anim, uid) {
93713
93828
  const lines = [];
93714
93829
  for (let i = 0; i < points3.length; i++) {
93715
93830
  const pct = Math.round(i / (points3.length - 1) * 100);
93716
- const tx = points3[i].x.toFixed(2);
93717
- const ty = points3[i].y.toFixed(2);
93831
+ const tx = slideOffset(points3[i].x, "w");
93832
+ const ty = slideOffset(points3[i].y, "h");
93718
93833
  if (anim.motionPathRotateAuto) {
93719
93834
  const next = i < points3.length - 1 ? points3[i + 1] : points3[i];
93720
93835
  const prev = i > 0 ? points3[i - 1] : points3[i];
@@ -93722,10 +93837,10 @@ function buildDynamicKeyframe(anim, uid) {
93722
93837
  const dy = i < points3.length - 1 ? next.y - points3[i].y : points3[i].y - prev.y;
93723
93838
  const angleDeg = Math.atan2(dy, dx) * (180 / Math.PI);
93724
93839
  lines.push(
93725
- ` ${pct}% { transform: translate(${tx}%, ${ty}%) rotate(${angleDeg.toFixed(2)}deg); }`
93840
+ ` ${pct}% { transform: translate(${tx}, ${ty}) rotate(${angleDeg.toFixed(2)}deg); }`
93726
93841
  );
93727
93842
  } else {
93728
- lines.push(` ${pct}% { transform: translate(${tx}%, ${ty}%); }`);
93843
+ lines.push(` ${pct}% { transform: translate(${tx}, ${ty}); }`);
93729
93844
  }
93730
93845
  }
93731
93846
  return {
@@ -94860,6 +94975,422 @@ var TimelineEngine = class _TimelineEngine {
94860
94975
  }
94861
94976
  }
94862
94977
  };
94978
+ var PRESET_TO_EFFECT = {
94979
+ fadeIn: "fadeIn",
94980
+ flyIn: "flyInBottom",
94981
+ zoomIn: "zoomIn",
94982
+ fadeOut: "fadeOut",
94983
+ flyOut: "flyOutBottom",
94984
+ zoomOut: "zoomOut",
94985
+ spin: "spin",
94986
+ pulse: "pulse",
94987
+ colorWave: "colorWave",
94988
+ bounce: "bounce",
94989
+ flash: "flash"
94990
+ };
94991
+ var DIRECTION_FLY_MAP = {
94992
+ fromLeft: { flyIn: "flyInLeft", flyOut: "flyOutLeft" },
94993
+ fromRight: { flyIn: "flyInRight", flyOut: "flyOutRight" },
94994
+ fromTop: { flyIn: "flyInTop", flyOut: "flyOutTop" },
94995
+ fromBottom: { flyIn: "flyInBottom", flyOut: "flyOutBottom" },
94996
+ fromTopLeft: { flyIn: "flyInTop", flyOut: "flyOutTop" },
94997
+ fromTopRight: { flyIn: "flyInTop", flyOut: "flyOutTop" },
94998
+ fromBottomLeft: { flyIn: "flyInBottom", flyOut: "flyOutBottom" },
94999
+ fromBottomRight: { flyIn: "flyInBottom", flyOut: "flyOutBottom" }
95000
+ };
95001
+ function resolvePreviewEffect(preset, direction) {
95002
+ if ((preset === "flyIn" || preset === "flyOut") && direction) {
95003
+ const dirMap = DIRECTION_FLY_MAP[direction];
95004
+ if (dirMap) {
95005
+ return preset === "flyIn" ? dirMap.flyIn : dirMap.flyOut;
95006
+ }
95007
+ }
95008
+ return PRESET_TO_EFFECT[preset];
95009
+ }
95010
+ function timingCurveToCss(curve, cubicBezierValues) {
95011
+ if (cubicBezierValues) {
95012
+ const parts = cubicBezierValues.split(",").map((s) => s.trim());
95013
+ if (parts.length === 4 && parts.every((p) => !Number.isNaN(Number(p)))) {
95014
+ return `cubic-bezier(${parts.join(", ")})`;
95015
+ }
95016
+ }
95017
+ switch (curve) {
95018
+ case "ease":
95019
+ return "ease";
95020
+ case "ease-in":
95021
+ return "ease-in";
95022
+ case "ease-out":
95023
+ return "ease-out";
95024
+ case "linear":
95025
+ return "linear";
95026
+ default:
95027
+ return "ease";
95028
+ }
95029
+ }
95030
+ function buildPreviewAnimation(preset, options) {
95031
+ if (preset === "none") {
95032
+ return void 0;
95033
+ }
95034
+ const effectName = resolvePreviewEffect(preset, options?.direction);
95035
+ if (!effectName) {
95036
+ return void 0;
95037
+ }
95038
+ const keyframeName = `pptx-${effectName}`;
95039
+ const keyframesCss = getEffectKeyframes(effectName);
95040
+ if (!keyframesCss) {
95041
+ return void 0;
95042
+ }
95043
+ const duration = options?.durationMs ?? 600;
95044
+ const easing = timingCurveToCss(options?.timingCurve, options?.cubicBezier);
95045
+ return {
95046
+ keyframeName,
95047
+ keyframesCss,
95048
+ cssAnimation: `${keyframeName} ${duration}ms ${easing} 0ms 1 normal both`,
95049
+ durationMs: duration
95050
+ };
95051
+ }
95052
+ var EDITABLE = /* @__PURE__ */ new Set(["M", "L", "C", "Z", "m", "l", "c", "z"]);
95053
+ var ARITY = { m: 2, l: 2, c: 6, z: 0 };
95054
+ function scanPath(path) {
95055
+ const tokens = path.match(/[A-Za-z]|-?\d*\.?\d+(?:[eE][-+]?\d+)?/gu);
95056
+ if (!tokens) {
95057
+ return void 0;
95058
+ }
95059
+ const segments = [];
95060
+ let i = 0;
95061
+ let cmd = "";
95062
+ while (i < tokens.length) {
95063
+ if (/^[A-Za-z]$/u.test(tokens[i])) {
95064
+ cmd = tokens[i];
95065
+ i++;
95066
+ if (!EDITABLE.has(cmd)) {
95067
+ return void 0;
95068
+ }
95069
+ if (cmd === "Z" || cmd === "z") {
95070
+ segments.push({ cmd, coords: [] });
95071
+ }
95072
+ continue;
95073
+ }
95074
+ const arity = ARITY[cmd.toLowerCase()];
95075
+ if (!arity) {
95076
+ return void 0;
95077
+ }
95078
+ const coords = [];
95079
+ for (let n = 0; n < arity; n++) {
95080
+ const value = Number(tokens[i++]);
95081
+ if (!Number.isFinite(value)) {
95082
+ return void 0;
95083
+ }
95084
+ coords.push(value);
95085
+ }
95086
+ segments.push({ cmd, coords });
95087
+ if (cmd === "M") {
95088
+ cmd = "L";
95089
+ } else if (cmd === "m") {
95090
+ cmd = "l";
95091
+ }
95092
+ }
95093
+ return segments.length > 0 ? segments : void 0;
95094
+ }
95095
+ function formatPath(segments) {
95096
+ return segments.map(
95097
+ (segment) => segment.coords.length === 0 ? segment.cmd : `${segment.cmd} ${segment.coords.map((n) => trimNumber(n)).join(" ")}`
95098
+ ).join(" ");
95099
+ }
95100
+ function trimNumber(value) {
95101
+ return String(Number(value.toFixed(4)));
95102
+ }
95103
+ function motionPathFractionPoints(path) {
95104
+ return parseMotionPathPoints(path).map((point) => ({ x: point.x / 100, y: point.y / 100 }));
95105
+ }
95106
+ function toPixels(point, frame2) {
95107
+ return {
95108
+ x: frame2.originX + point.x * frame2.slideWidth,
95109
+ y: frame2.originY + point.y * frame2.slideHeight
95110
+ };
95111
+ }
95112
+ function motionPathToSvgD(path, frame2) {
95113
+ const points3 = motionPathFractionPoints(path).map((point) => toPixels(point, frame2));
95114
+ if (points3.length === 0) {
95115
+ return "";
95116
+ }
95117
+ const head = `M ${trimNumber(frame2.originX)} ${trimNumber(frame2.originY)}`;
95118
+ const rest = points3.map((point) => `L ${trimNumber(point.x)} ${trimNumber(point.y)}`);
95119
+ return [head, ...rest].join(" ");
95120
+ }
95121
+ function motionPathEndPixel(path, frame2) {
95122
+ const points3 = motionPathFractionPoints(path);
95123
+ const last = points3.length > 0 ? points3[points3.length - 1] : void 0;
95124
+ return last ? toPixels(last, frame2) : { x: frame2.originX, y: frame2.originY };
95125
+ }
95126
+ function setMotionPathEnd(path, x, y) {
95127
+ const segments = scanPath(path);
95128
+ if (!segments) {
95129
+ return path;
95130
+ }
95131
+ let lastIndex = -1;
95132
+ for (let i = segments.length - 1; i >= 0; i--) {
95133
+ if (segments[i].coords.length > 0) {
95134
+ lastIndex = i;
95135
+ break;
95136
+ }
95137
+ }
95138
+ if (lastIndex < 0 || segments.some((segment) => segment.cmd === "Z" || segment.cmd === "z")) {
95139
+ return path;
95140
+ }
95141
+ const last = segments[lastIndex];
95142
+ if (last.cmd === last.cmd.toLowerCase()) {
95143
+ return path;
95144
+ }
95145
+ const coords = [...last.coords];
95146
+ const endX = coords[coords.length - 2];
95147
+ const endY = coords[coords.length - 1];
95148
+ const dx = x - endX;
95149
+ const dy = y - endY;
95150
+ coords[coords.length - 2] = x;
95151
+ coords[coords.length - 1] = y;
95152
+ if (last.cmd === "C") {
95153
+ coords[2] += dx;
95154
+ coords[3] += dy;
95155
+ }
95156
+ const next = segments.map(
95157
+ (segment, index) => index === lastIndex ? { ...last, coords } : segment
95158
+ );
95159
+ return formatPath(next);
95160
+ }
95161
+ function isEditableMotionPath(path) {
95162
+ const segments = scanPath(path);
95163
+ if (!segments) {
95164
+ return false;
95165
+ }
95166
+ return !segments.some((segment) => segment.cmd === "Z" || segment.cmd === "z");
95167
+ }
95168
+ function buildMotionPathKeyframes(args) {
95169
+ const points3 = motionPathFractionPoints(args.path);
95170
+ if (points3.length < 2) {
95171
+ return void 0;
95172
+ }
95173
+ const frames = points3.map((point, index) => {
95174
+ const percent2 = Math.round(index / (points3.length - 1) * 100);
95175
+ const x = trimNumber(point.x * args.slideWidth);
95176
+ const y = trimNumber(point.y * args.slideHeight);
95177
+ return ` ${percent2}% { transform: translate(${x}px, ${y}px); }`;
95178
+ });
95179
+ return {
95180
+ keyframeName: args.keyframeName,
95181
+ css: `@keyframes ${args.keyframeName} {
95182
+ ${frames.join("\n")}
95183
+ }`
95184
+ };
95185
+ }
95186
+ var K = 0.5523;
95187
+ var RX = 0.125;
95188
+ var RY = 0.2222;
95189
+ var CIRCLE = [
95190
+ "M 0 0",
95191
+ `C ${-K * RX} 0 ${-RX} ${-RY + K * RY} ${-RX} ${-RY}`,
95192
+ `C ${-RX} ${-RY - K * RY} ${-K * RX} ${ -2 * RY} 0 ${ -2 * RY}`,
95193
+ `C ${K * RX} ${ -2 * RY} ${RX} ${-RY - K * RY} ${RX} ${-RY}`,
95194
+ `C ${RX} ${-RY + K * RY} ${K * RX} 0 0 0`
95195
+ ].join(" ").replace(/(\d\.\d{4})\d+/gu, "$1");
95196
+ var MOTION_PATH_PRESETS2 = [
95197
+ // -- Lines ---------------------------------------------------------------
95198
+ { id: "lineRight", family: "lines", path: "M 0 0 L 0.25 0" },
95199
+ { id: "lineLeft", family: "lines", path: "M 0 0 L -0.25 0" },
95200
+ { id: "lineDown", family: "lines", path: "M 0 0 L 0 0.25" },
95201
+ { id: "lineUp", family: "lines", path: "M 0 0 L 0 -0.25" },
95202
+ { id: "lineDiagonalUpRight", family: "lines", path: "M 0 0 L 0.25 -0.25" },
95203
+ { id: "lineDiagonalDownRight", family: "lines", path: "M 0 0 L 0.25 0.25" },
95204
+ { id: "lineDiagonalUpLeft", family: "lines", path: "M 0 0 L -0.25 -0.25" },
95205
+ { id: "lineDiagonalDownLeft", family: "lines", path: "M 0 0 L -0.25 0.25" },
95206
+ // -- Arcs ----------------------------------------------------------------
95207
+ {
95208
+ id: "arcUp",
95209
+ family: "arcs",
95210
+ path: "M 0 0 C 0 -0.1227 0.0559 -0.2222 0.125 -0.2222 C 0.1941 -0.2222 0.25 -0.1227 0.25 0"
95211
+ },
95212
+ {
95213
+ id: "arcDown",
95214
+ family: "arcs",
95215
+ path: "M 0 0 C 0 0.1227 0.0559 0.2222 0.125 0.2222 C 0.1941 0.2222 0.25 0.1227 0.25 0"
95216
+ },
95217
+ {
95218
+ id: "arcRight",
95219
+ family: "arcs",
95220
+ path: "M 0 0 C 0.069 0 0.125 0.0995 0.125 0.2222 C 0.125 0.3449 0.069 0.4444 0 0.4444"
95221
+ },
95222
+ {
95223
+ id: "arcLeft",
95224
+ family: "arcs",
95225
+ path: "M 0 0 C -0.069 0 -0.125 0.0995 -0.125 0.2222 C -0.125 0.3449 -0.069 0.4444 0 0.4444"
95226
+ },
95227
+ // -- Turns ---------------------------------------------------------------
95228
+ { id: "turnUp", family: "turns", path: "M 0 0 L 0.25 0 L 0.25 -0.25" },
95229
+ { id: "turnDown", family: "turns", path: "M 0 0 L 0.25 0 L 0.25 0.25" },
95230
+ { id: "turnRight", family: "turns", path: "M 0 0 L 0 0.25 L 0.25 0.25" },
95231
+ { id: "turnLeft", family: "turns", path: "M 0 0 L 0 0.25 L -0.25 0.25" },
95232
+ {
95233
+ id: "sCurve",
95234
+ family: "turns",
95235
+ path: "M 0 0 C 0.0833 -0.1111 0.1667 0.1111 0.25 0"
95236
+ },
95237
+ {
95238
+ id: "zigzag",
95239
+ family: "turns",
95240
+ path: "M 0 0 L 0.0625 -0.1111 L 0.125 0 L 0.1875 -0.1111 L 0.25 0"
95241
+ },
95242
+ // -- Shapes --------------------------------------------------------------
95243
+ { id: "circle", family: "shapes", path: CIRCLE },
95244
+ { id: "square", family: "shapes", path: "M 0 0 L 0.125 0 L 0.125 -0.2222 L 0 -0.2222 Z" },
95245
+ { id: "triangle", family: "shapes", path: "M 0 0 L 0.0625 -0.2222 L 0.125 0 Z" },
95246
+ {
95247
+ id: "diamond",
95248
+ family: "shapes",
95249
+ path: "M 0 0 L 0.0625 -0.1111 L 0.125 0 L 0.0625 0.1111 Z"
95250
+ },
95251
+ {
95252
+ id: "hexagon",
95253
+ family: "shapes",
95254
+ path: "M 0 0 L 0.0417 -0.1111 L 0.125 -0.1111 L 0.1667 0 L 0.125 0.1111 L 0.0417 0.1111 Z"
95255
+ },
95256
+ // -- Loops ---------------------------------------------------------------
95257
+ {
95258
+ id: "loopDeLoop",
95259
+ family: "loops",
95260
+ path: "M 0 0 C 0.0625 0 0.0972 -0.2222 0.1667 -0.2222 C 0.2361 -0.2222 0.2708 0 0.1667 0 L 0.3333 0"
95261
+ },
95262
+ {
95263
+ id: "figureEight",
95264
+ family: "loops",
95265
+ path: "M 0 0 C -0.0833 0 -0.0833 -0.2222 0 -0.2222 C 0.0833 -0.2222 0.0833 0 0.1667 0 C 0.25 0 0.25 -0.2222 0.1667 -0.2222 C 0.0833 -0.2222 0.0833 0 0 0"
95266
+ },
95267
+ {
95268
+ id: "spiral",
95269
+ family: "loops",
95270
+ path: "M 0 0 C 0.0417 0 0.0417 -0.0741 0 -0.0741 C -0.0625 -0.0741 -0.0625 -0.1852 0 -0.1852 C 0.0833 -0.1852 0.0833 -0.3333 0 -0.3333"
95271
+ }
95272
+ ];
95273
+ var MOTION_PATH_FAMILIES = [
95274
+ "lines",
95275
+ "arcs",
95276
+ "turns",
95277
+ "shapes",
95278
+ "loops"
95279
+ ];
95280
+ function motionPathFamilyLabelKey(family) {
95281
+ return `pptx.animation.motionPath.family.${family}`;
95282
+ }
95283
+ function motionPathPresetLabelKey(presetId) {
95284
+ return `pptx.animation.motionPath.preset.${presetId}`;
95285
+ }
95286
+ function motionPathPresetById(presetId) {
95287
+ return MOTION_PATH_PRESETS2.find((preset) => preset.id === presetId);
95288
+ }
95289
+ function motionPathPresetsByFamily(family) {
95290
+ return MOTION_PATH_PRESETS2.filter((preset) => preset.family === family);
95291
+ }
95292
+ function motionPathPresetIdForPath(path) {
95293
+ if (!path) {
95294
+ return void 0;
95295
+ }
95296
+ const normalized = path.trim().replace(/\s+/gu, " ");
95297
+ return MOTION_PATH_PRESETS2.find(
95298
+ (preset) => preset.path.trim().replace(/\s+/gu, " ") === normalized
95299
+ )?.id;
95300
+ }
95301
+ var DEFAULT_MOTION_PATH_PRESET_ID = "lineRight";
95302
+ var DEFAULT_MOTION_PATH_DURATION_MS = 2e3;
95303
+ var DEFAULT_TRIGGER2 = "onClick";
95304
+ function motionPathFor(animations, elementId) {
95305
+ return animations.find((animation) => animation.elementId === elementId)?.motionPath;
95306
+ }
95307
+ function setMotionPath(animations, elementId, path) {
95308
+ const index = animations.findIndex((animation) => animation.elementId === elementId);
95309
+ if (index >= 0) {
95310
+ return animations.map(
95311
+ (animation, i) => i === index ? {
95312
+ ...animation,
95313
+ motionPath: path,
95314
+ motionPathEditMode: animation.motionPathEditMode ?? "relative",
95315
+ durationMs: animation.durationMs ?? DEFAULT_MOTION_PATH_DURATION_MS
95316
+ } : animation
95317
+ );
95318
+ }
95319
+ return [
95320
+ ...animations,
95321
+ {
95322
+ elementId,
95323
+ motionPath: path,
95324
+ motionPathEditMode: "relative",
95325
+ durationMs: DEFAULT_MOTION_PATH_DURATION_MS,
95326
+ order: animations.length,
95327
+ trigger: DEFAULT_TRIGGER2
95328
+ }
95329
+ ];
95330
+ }
95331
+ function applyMotionPathPreset(animations, elementId, presetId) {
95332
+ const preset = motionPathPresetById(presetId);
95333
+ if (!preset) {
95334
+ return [...animations];
95335
+ }
95336
+ return setMotionPath(animations, elementId, preset.path);
95337
+ }
95338
+ function clearMotionPath(animations, elementId) {
95339
+ const index = animations.findIndex((animation) => animation.elementId === elementId);
95340
+ if (index < 0) {
95341
+ return [...animations];
95342
+ }
95343
+ const current = animations[index];
95344
+ const stillHasEffect = Boolean(current.entrance || current.emphasis || current.exit);
95345
+ if (!stillHasEffect) {
95346
+ return animations.filter((animation) => animation.elementId !== elementId).map((animation, i) => ({ ...animation, order: i }));
95347
+ }
95348
+ return animations.map(
95349
+ (animation, i) => i === index ? {
95350
+ ...animation,
95351
+ motionPath: void 0,
95352
+ motionPathEditMode: void 0,
95353
+ motionPtsTypes: void 0
95354
+ } : animation
95355
+ );
95356
+ }
95357
+ function motionPathNativeAnimations(slide) {
95358
+ const native = slide.nativeAnimations ?? [];
95359
+ const alreadyNative = new Set(
95360
+ native.filter((animation) => animation.motionPath).map((animation) => animation.targetId)
95361
+ );
95362
+ return (slide.animations ?? []).filter((animation) => Boolean(animation.motionPath) && !alreadyNative.has(animation.elementId)).map((animation) => ({
95363
+ targetId: animation.elementId,
95364
+ trigger: animation.trigger ?? DEFAULT_TRIGGER2,
95365
+ triggerShapeId: animation.triggerShapeId,
95366
+ presetClass: "path",
95367
+ durationMs: animation.durationMs ?? DEFAULT_MOTION_PATH_DURATION_MS,
95368
+ delayMs: animation.delayMs ?? 0,
95369
+ motionPath: animation.motionPath,
95370
+ motionPathEditMode: animation.motionPathEditMode ?? "relative"
95371
+ }));
95372
+ }
95373
+ function buildMotionPathPreview(args) {
95374
+ const keyframeName = `pptx-motion-preview-${args.uid ?? 0}`;
95375
+ const keyframes = buildMotionPathKeyframes({
95376
+ path: args.path,
95377
+ slideWidth: args.slideWidth,
95378
+ slideHeight: args.slideHeight,
95379
+ keyframeName
95380
+ });
95381
+ if (!keyframes) {
95382
+ return void 0;
95383
+ }
95384
+ const durationMs = args.durationMs ?? DEFAULT_MOTION_PATH_DURATION_MS;
95385
+ const delayMs = args.delayMs ?? 0;
95386
+ const easing = timingCurveToCss(args.timingCurve);
95387
+ return {
95388
+ keyframeName,
95389
+ keyframesCss: keyframes.css,
95390
+ cssAnimation: `${keyframeName} ${durationMs}ms ${easing} ${delayMs}ms 1 normal both`,
95391
+ durationMs
95392
+ };
95393
+ }
94863
95394
  function buildSegmentCounts(slide, nativeAnims) {
94864
95395
  const segmentCounts = /* @__PURE__ */ new Map();
94865
95396
  for (const anim of nativeAnims) {
@@ -94892,7 +95423,7 @@ var PresentationAnimationController = class _PresentationAnimationController {
94892
95423
  * id list (base element ids + text-build sub-element ids) to track.
94893
95424
  */
94894
95425
  static fromSlide(slide) {
94895
- const nativeAnims = slide.nativeAnimations ?? [];
95426
+ const nativeAnims = [...slide.nativeAnimations ?? [], ...motionPathNativeAnimations(slide)];
94896
95427
  const segmentCounts = buildSegmentCounts(slide, nativeAnims);
94897
95428
  const expandedAnims = segmentCounts.size > 0 ? expandTextBuildAnimations(nativeAnims, segmentCounts) : nativeAnims;
94898
95429
  const engine = TimelineEngine.fromAnimations(expandedAnims);
@@ -95083,80 +95614,6 @@ function runMediaCommand(command, resolve) {
95083
95614
  }
95084
95615
  return applyMediaCommandVerb(el, parsed);
95085
95616
  }
95086
- var PRESET_TO_EFFECT = {
95087
- fadeIn: "fadeIn",
95088
- flyIn: "flyInBottom",
95089
- zoomIn: "zoomIn",
95090
- fadeOut: "fadeOut",
95091
- flyOut: "flyOutBottom",
95092
- zoomOut: "zoomOut",
95093
- spin: "spin",
95094
- pulse: "pulse",
95095
- colorWave: "colorWave",
95096
- bounce: "bounce",
95097
- flash: "flash"
95098
- };
95099
- var DIRECTION_FLY_MAP = {
95100
- fromLeft: { flyIn: "flyInLeft", flyOut: "flyOutLeft" },
95101
- fromRight: { flyIn: "flyInRight", flyOut: "flyOutRight" },
95102
- fromTop: { flyIn: "flyInTop", flyOut: "flyOutTop" },
95103
- fromBottom: { flyIn: "flyInBottom", flyOut: "flyOutBottom" },
95104
- fromTopLeft: { flyIn: "flyInTop", flyOut: "flyOutTop" },
95105
- fromTopRight: { flyIn: "flyInTop", flyOut: "flyOutTop" },
95106
- fromBottomLeft: { flyIn: "flyInBottom", flyOut: "flyOutBottom" },
95107
- fromBottomRight: { flyIn: "flyInBottom", flyOut: "flyOutBottom" }
95108
- };
95109
- function resolvePreviewEffect(preset, direction) {
95110
- if ((preset === "flyIn" || preset === "flyOut") && direction) {
95111
- const dirMap = DIRECTION_FLY_MAP[direction];
95112
- if (dirMap) {
95113
- return preset === "flyIn" ? dirMap.flyIn : dirMap.flyOut;
95114
- }
95115
- }
95116
- return PRESET_TO_EFFECT[preset];
95117
- }
95118
- function timingCurveToCss(curve, cubicBezierValues) {
95119
- if (cubicBezierValues) {
95120
- const parts = cubicBezierValues.split(",").map((s) => s.trim());
95121
- if (parts.length === 4 && parts.every((p) => !Number.isNaN(Number(p)))) {
95122
- return `cubic-bezier(${parts.join(", ")})`;
95123
- }
95124
- }
95125
- switch (curve) {
95126
- case "ease":
95127
- return "ease";
95128
- case "ease-in":
95129
- return "ease-in";
95130
- case "ease-out":
95131
- return "ease-out";
95132
- case "linear":
95133
- return "linear";
95134
- default:
95135
- return "ease";
95136
- }
95137
- }
95138
- function buildPreviewAnimation(preset, options) {
95139
- if (preset === "none") {
95140
- return void 0;
95141
- }
95142
- const effectName = resolvePreviewEffect(preset, options?.direction);
95143
- if (!effectName) {
95144
- return void 0;
95145
- }
95146
- const keyframeName = `pptx-${effectName}`;
95147
- const keyframesCss = getEffectKeyframes(effectName);
95148
- if (!keyframesCss) {
95149
- return void 0;
95150
- }
95151
- const duration = options?.durationMs ?? 600;
95152
- const easing = timingCurveToCss(options?.timingCurve, options?.cubicBezier);
95153
- return {
95154
- keyframeName,
95155
- keyframesCss,
95156
- cssAnimation: `${keyframeName} ${duration}ms ${easing} 0ms 1 normal both`,
95157
- durationMs: duration
95158
- };
95159
- }
95160
95617
  var CAMERA_PRESET_MAP = {
95161
95618
  orthographicFront: { rotateX: 0, rotateY: 0, rotateZ: 0 },
95162
95619
  perspectiveFront: { perspective: "1000px", rotateX: 0, rotateY: 0, rotateZ: 0 },
@@ -99413,6 +99870,12 @@ function flattenMorphElements(elements, counterpart, offsetX = 0, offsetY = 0) {
99413
99870
  }
99414
99871
  return out;
99415
99872
  }
99873
+ function differentText(a, b) {
99874
+ const textOf2 = (element) => (element.text ?? "").replace(/\s+/gu, " ").trim();
99875
+ const fromText = textOf2(a);
99876
+ const toText = textOf2(b);
99877
+ return fromText !== "" && toText !== "" && fromText !== toText;
99878
+ }
99416
99879
  var NV_PR_KEYS = [
99417
99880
  "p:nvSpPr",
99418
99881
  "p:nvPicPr",
@@ -99527,6 +99990,9 @@ function matchMorphElementsFull(fromSlide, toSlide) {
99527
99990
  if (fromEl.type !== toEl.type) {
99528
99991
  continue;
99529
99992
  }
99993
+ if (differentText(fromEl, toEl)) {
99994
+ continue;
99995
+ }
99530
99996
  const widthRatio = Math.max(fromEl.width, toEl.width, 1) / Math.max(Math.min(fromEl.width, toEl.width), 1);
99531
99997
  const heightRatio = Math.max(fromEl.height, toEl.height, 1) / Math.max(Math.min(fromEl.height, toEl.height), 1);
99532
99998
  if (widthRatio > PROXIMITY_SIZE_RATIO_LIMIT || heightRatio > PROXIMITY_SIZE_RATIO_LIMIT) {
@@ -99783,6 +100249,27 @@ function appearanceSignature(element, depth = 0) {
99783
100249
  function morphPairNeedsCrossfade(fromElement, toElement) {
99784
100250
  return appearanceSignature(fromElement) !== appearanceSignature(toElement);
99785
100251
  }
100252
+ var GEOMETRY_EPSILON = 0.5;
100253
+ function isInertMorphPair(fromElement, toElement) {
100254
+ return Math.abs(fromElement.x - toElement.x) <= GEOMETRY_EPSILON && Math.abs(fromElement.y - toElement.y) <= GEOMETRY_EPSILON && Math.abs(fromElement.width - toElement.width) <= GEOMETRY_EPSILON && Math.abs(fromElement.height - toElement.height) <= GEOMETRY_EPSILON && (fromElement.rotation ?? 0) === (toElement.rotation ?? 0) && Boolean(fromElement.flipHorizontal) === Boolean(toElement.flipHorizontal) && Boolean(fromElement.flipVertical) === Boolean(toElement.flipVertical) && (fromElement.opacity ?? 1) === (toElement.opacity ?? 1) && !morphPairNeedsCrossfade(fromElement, toElement);
100255
+ }
100256
+ function crossfadeIncomingMayFadeIn(element) {
100257
+ const image = element;
100258
+ if (image.imagePath || image.svgPath) {
100259
+ return false;
100260
+ }
100261
+ if (!hasShapeProperties(element)) {
100262
+ return true;
100263
+ }
100264
+ const style = element.shapeStyle;
100265
+ if (!style) {
100266
+ return true;
100267
+ }
100268
+ if (style.fillMode === "none" || (style.fillOpacity ?? 1) === 0) {
100269
+ return true;
100270
+ }
100271
+ return !(style.fillColor || style.fillGradient || style.fillGradientStops?.length || style.fillPatternPreset || style.fillImageUrl);
100272
+ }
99786
100273
  function generateMorphAnimations(pairs2, durationMs, _mode = "object") {
99787
100274
  const animations = [];
99788
100275
  for (let index = 0; index < pairs2.length; index++) {
@@ -99797,13 +100284,15 @@ function generateMorphAnimations(pairs2, durationMs, _mode = "object") {
99797
100284
  const toRot = toElement.rotation ?? 0;
99798
100285
  const fromRot = shortestRotationTarget(toRot, fromElement.rotation ?? 0);
99799
100286
  const flips = `${toElement.flipHorizontal ? " scaleX(-1)" : ""}${toElement.flipVertical ? " scaleY(-1)" : ""}`;
100287
+ const inert = isInertMorphPair(fromElement, toElement);
100288
+ const crossfadesIn = !inert && morphPairNeedsCrossfade(fromElement, toElement) && crossfadeIncomingMayFadeIn(toElement);
99800
100289
  const fromProps = [
99801
100290
  ` transform: translate(${dx}px, ${dy}px) scale(${sx}, ${sy}) rotate(${fromRot}deg)${flips};`,
99802
- ` opacity: ${fromOpacity};`
100291
+ ` opacity: ${inert ? 0 : crossfadesIn ? 0 : fromOpacity};`
99803
100292
  ];
99804
100293
  const toProps = [
99805
100294
  ` transform: translate(0, 0) scale(1, 1) rotate(${toRot}deg)${flips};`,
99806
- ` opacity: ${toOpacity};`
100295
+ ` opacity: ${inert ? 0 : toOpacity};`
99807
100296
  ];
99808
100297
  const colorInterp = buildColorInterpolationProps(fromElement, toElement);
99809
100298
  if (colorInterp) {
@@ -107203,6 +107692,410 @@ function clampIndex(index, slideCount) {
107203
107692
  }
107204
107693
  return Math.min(Math.max(Math.trunc(index), 0), slideCount - 1);
107205
107694
  }
107695
+ var OUTLINE_VIEW_ATTR = "data-pptx-outline-view";
107696
+ var OUTLINE_ROW_ATTR = "data-pptx-outline-row";
107697
+ var OUTLINE_SLIDE_ATTR = "data-pptx-outline-slide";
107698
+ var OUTLINE_LEVEL_ATTR = "data-pptx-outline-level";
107699
+ var MAX_PARAGRAPH_LEVEL = 8;
107700
+ var TITLE_PH_TYPES = /* @__PURE__ */ new Set(["title", "ctrtitle"]);
107701
+ var CHROME_PH_TYPES = /* @__PURE__ */ new Set(["ftr", "hdr", "dt", "sldnum"]);
107702
+ var OUTLINE_TITLE_ELEMENT_NAME = "Title";
107703
+ function placeholderType(element) {
107704
+ const ph = element.rawXml?.["p:nvSpPr"]?.["p:nvPr"]?.["p:ph"];
107705
+ if (!ph) {
107706
+ return void 0;
107707
+ }
107708
+ const type = typeof ph["@_type"] === "string" ? ph["@_type"].trim().toLowerCase() : "";
107709
+ return type.length > 0 ? type : "body";
107710
+ }
107711
+ function isTextBearing(element) {
107712
+ return hasTextProperties(element);
107713
+ }
107714
+ function elementHasText(element) {
107715
+ if (!hasTextProperties(element)) {
107716
+ return false;
107717
+ }
107718
+ if (typeof element.text === "string" && element.text.trim().length > 0) {
107719
+ return true;
107720
+ }
107721
+ return (element.textSegments ?? []).some((segment) => segment.text.trim().length > 0);
107722
+ }
107723
+ function resolveSlideOutlineElements(slide) {
107724
+ const elements = (slide.elements ?? []).filter(isTextBearing);
107725
+ const placeholderTitle = elements.find((element) => {
107726
+ const type = placeholderType(element);
107727
+ return type !== void 0 && TITLE_PH_TYPES.has(type);
107728
+ });
107729
+ const placeholderBody = elements.filter((element) => {
107730
+ const type = placeholderType(element);
107731
+ return type !== void 0 && !TITLE_PH_TYPES.has(type) && !CHROME_PH_TYPES.has(type);
107732
+ });
107733
+ if (placeholderTitle || placeholderBody.length > 0) {
107734
+ return { title: placeholderTitle ?? null, body: placeholderBody };
107735
+ }
107736
+ const named = elements.find(
107737
+ (element) => (element.name ?? "").trim().toLowerCase() === OUTLINE_TITLE_ELEMENT_NAME.toLowerCase()
107738
+ );
107739
+ const withText = elements.filter(elementHasText);
107740
+ const title = named ?? withText[0] ?? null;
107741
+ return { title, body: withText.filter((element) => element !== title) };
107742
+ }
107743
+ function isBulletMarker(segment) {
107744
+ const bullet = segment.bulletInfo;
107745
+ if (!bullet) {
107746
+ return false;
107747
+ }
107748
+ const marker = bullet.char ? `${bullet.char} ` : bullet.imageRelId || bullet.imageDataUrl ? "\u{1F4CE} " : bullet.autoNumType ? void 0 : "\u2022 ";
107749
+ return marker ? segment.text === marker : bullet.paragraphIndex !== void 0;
107750
+ }
107751
+ function isParagraphSeparator(segment) {
107752
+ return Boolean(segment.isParagraphBreak) || segment.text === "\n" && !segment.isLineBreak;
107753
+ }
107754
+ function groupElementParagraphs(element) {
107755
+ const withText = hasTextProperties(element) ? element : void 0;
107756
+ const segments = withText?.textSegments;
107757
+ if (!segments || segments.length === 0) {
107758
+ const style = { ...withText?.textStyle ?? {} };
107759
+ return (withText?.text ?? "").split("\n").map((text2) => ({
107760
+ content: [{ text: text2, style: { ...style } }]
107761
+ }));
107762
+ }
107763
+ const groups = [{ content: [] }];
107764
+ for (const segment of segments) {
107765
+ if (isParagraphSeparator(segment)) {
107766
+ groups.push({ content: [] });
107767
+ continue;
107768
+ }
107769
+ const current = groups[groups.length - 1];
107770
+ if (current.content.length === 0 && current.marker === void 0 && isBulletMarker(segment)) {
107771
+ current.marker = segment;
107772
+ continue;
107773
+ }
107774
+ current.content.push(segment);
107775
+ }
107776
+ return groups;
107777
+ }
107778
+ function paragraphGroupText(group) {
107779
+ return group.content.map((segment) => segment.isLineBreak ? " " : segment.text).join("");
107780
+ }
107781
+ function paragraphGroupLevel(group) {
107782
+ const first = group.marker ?? group.content[0];
107783
+ const level = first?.paragraphLevel;
107784
+ return typeof level === "number" && level > 0 ? Math.min(level, MAX_PARAGRAPH_LEVEL) : 0;
107785
+ }
107786
+ function readElementParagraphs(element) {
107787
+ const groups = groupElementParagraphs(element);
107788
+ const paragraphs = groups.map((group) => ({
107789
+ text: paragraphGroupText(group),
107790
+ level: paragraphGroupLevel(group)
107791
+ }));
107792
+ let last = paragraphs.length - 1;
107793
+ while (last >= 0 && paragraphs[last].text.length === 0) {
107794
+ last -= 1;
107795
+ }
107796
+ return paragraphs.slice(0, last + 1);
107797
+ }
107798
+ function outlineRowKey(slideId, elementId, paragraphIndex) {
107799
+ return `${slideId}|${elementId ?? "\0new-title"}|${paragraphIndex}`;
107800
+ }
107801
+ function pushElementRows(rows, element, kind, slide, slideIndex) {
107802
+ for (const [paragraphIndex, paragraph] of readElementParagraphs(element).entries()) {
107803
+ rows.push({
107804
+ key: outlineRowKey(slide.id, element.id, paragraphIndex),
107805
+ slideIndex,
107806
+ slideId: slide.id,
107807
+ kind,
107808
+ elementId: element.id,
107809
+ paragraphIndex,
107810
+ // A title always sits in the leftmost column; body text is pushed one
107811
+ // column right of it, so authored level 0 reads as outline level 1.
107812
+ level: kind === "title" ? 0 : paragraph.level + 1,
107813
+ text: paragraph.text
107814
+ });
107815
+ }
107816
+ }
107817
+ function buildOutline(slides) {
107818
+ const rows = [];
107819
+ for (const [slideIndex, slide] of slides.entries()) {
107820
+ const { title, body } = resolveSlideOutlineElements(slide);
107821
+ const before = rows.length;
107822
+ if (title) {
107823
+ pushElementRows(rows, title, "title", slide, slideIndex);
107824
+ }
107825
+ if (rows.length === before) {
107826
+ rows.push({
107827
+ key: outlineRowKey(slide.id, title?.id ?? null, 0),
107828
+ slideIndex,
107829
+ slideId: slide.id,
107830
+ kind: "title",
107831
+ elementId: title?.id ?? null,
107832
+ paragraphIndex: 0,
107833
+ level: 0,
107834
+ text: ""
107835
+ });
107836
+ }
107837
+ for (const element of body) {
107838
+ pushElementRows(rows, element, "body", slide, slideIndex);
107839
+ }
107840
+ }
107841
+ return rows;
107842
+ }
107843
+ function findOutlineRow(rows, key) {
107844
+ return rows.find((row) => row.key === key);
107845
+ }
107846
+ var PASTE_OFFSET_PX = 20;
107847
+ function generateElementId() {
107848
+ return `el-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
107849
+ }
107850
+ function makeCloneId(intoTemplate, sourceId) {
107851
+ if (!intoTemplate) {
107852
+ return generateElementId();
107853
+ }
107854
+ if (sourceId.startsWith("master-")) {
107855
+ return `master-${generateElementId()}`;
107856
+ }
107857
+ return `layout-${generateElementId()}`;
107858
+ }
107859
+ function buildElementClipboardPayload(element, isTemplate) {
107860
+ return { element: structuredClone(element), isTemplate };
107861
+ }
107862
+ function cloneElementForPaste(element, options = {}) {
107863
+ const clone3 = structuredClone(element);
107864
+ clone3.id = makeCloneId(options.intoTemplate ?? false, element.id);
107865
+ clone3.x += options.offsetX ?? PASTE_OFFSET_PX;
107866
+ clone3.y += options.offsetY ?? PASTE_OFFSET_PX;
107867
+ return clone3;
107868
+ }
107869
+ function mapOutlineKey(input, rowKey) {
107870
+ const none = { edit: null, preventDefault: false };
107871
+ if (input.ctrlKey || input.metaKey) {
107872
+ return none;
107873
+ }
107874
+ if (input.key === "Tab" && !input.altKey) {
107875
+ return {
107876
+ edit: { type: "indent", key: rowKey, delta: input.shiftKey ? -1 : 1 },
107877
+ preventDefault: true
107878
+ };
107879
+ }
107880
+ if (input.altKey && input.shiftKey && (input.key === "ArrowRight" || input.key === "ArrowLeft")) {
107881
+ return {
107882
+ edit: { type: "indent", key: rowKey, delta: input.key === "ArrowRight" ? 1 : -1 },
107883
+ preventDefault: true
107884
+ };
107885
+ }
107886
+ if (input.key === "Enter" && !input.shiftKey && !input.altKey) {
107887
+ return { edit: { type: "insertAfter", key: rowKey }, preventDefault: true };
107888
+ }
107889
+ return none;
107890
+ }
107891
+ function withLevel(segments, level) {
107892
+ return segments.map((segment, index) => {
107893
+ if (index > 0) {
107894
+ return segment;
107895
+ }
107896
+ const next = { ...segment };
107897
+ if (level > 0) {
107898
+ next.paragraphLevel = Math.min(level, MAX_PARAGRAPH_LEVEL);
107899
+ } else {
107900
+ delete next.paragraphLevel;
107901
+ }
107902
+ return next;
107903
+ });
107904
+ }
107905
+ function rebuildParagraph(group, donor, text2, elementStyle) {
107906
+ if (group && paragraphGroupText(group) === text2) {
107907
+ return [...group.marker ? [group.marker] : [], ...group.content];
107908
+ }
107909
+ const source = group ?? donor;
107910
+ const marker = source?.marker ? [source.marker] : [];
107911
+ const content = remapTextToSegments(text2, source?.content, elementStyle);
107912
+ return [...marker, ...content];
107913
+ }
107914
+ function writeElementParagraphs(element, paragraphs) {
107915
+ const groups = groupElementParagraphs(element);
107916
+ const donor = groups[groups.length - 1];
107917
+ const style = hasTextProperties(element) ? element.textStyle : void 0;
107918
+ const segments = [];
107919
+ for (const [index, paragraph] of paragraphs.entries()) {
107920
+ if (index > 0) {
107921
+ const previous = segments[segments.length - 1];
107922
+ segments.push({
107923
+ text: "\n",
107924
+ style: { ...previous?.style ?? style ?? {} },
107925
+ isParagraphBreak: true
107926
+ });
107927
+ }
107928
+ segments.push(
107929
+ ...withLevel(rebuildParagraph(groups[index], donor, paragraph.text, style), paragraph.level)
107930
+ );
107931
+ }
107932
+ return {
107933
+ ...element,
107934
+ text: paragraphs.map((paragraph) => paragraph.text).join("\n"),
107935
+ textSegments: segments
107936
+ };
107937
+ }
107938
+ var DEFAULT_CANVAS = { width: 960, height: 540 };
107939
+ function createTitleElement(text2, options) {
107940
+ const canvas = options.canvas ?? DEFAULT_CANVAS;
107941
+ return {
107942
+ type: "text",
107943
+ id: options.idGenerator ? options.idGenerator() : generateElementId(),
107944
+ name: OUTLINE_TITLE_ELEMENT_NAME,
107945
+ x: Math.round(canvas.width * 0.06),
107946
+ y: Math.round(canvas.height * 0.08),
107947
+ width: Math.round(canvas.width * 0.88),
107948
+ height: Math.round(canvas.height * 0.17),
107949
+ text: text2,
107950
+ textStyle: { fontSize: 36, bold: true },
107951
+ textSegments: [{ text: text2, style: { fontSize: 36, bold: true } }]
107952
+ };
107953
+ }
107954
+ function renumber(slides) {
107955
+ return slides.map((slide, index) => ({ ...slide, slideNumber: index + 1 }));
107956
+ }
107957
+ function unchanged(slides, row) {
107958
+ return {
107959
+ slides,
107960
+ changed: false,
107961
+ focusKey: row?.key ?? null,
107962
+ activeSlideIndex: row?.slideIndex ?? 0
107963
+ };
107964
+ }
107965
+ function replaceElement(slides, slideIndex, elementId, next) {
107966
+ return slides.map(
107967
+ (slide, index) => index === slideIndex ? {
107968
+ ...slide,
107969
+ elements: (slide.elements ?? []).map(
107970
+ (element) => element.id === elementId ? next : element
107971
+ )
107972
+ } : slide
107973
+ );
107974
+ }
107975
+ function editParagraphs(slides, row, mutate) {
107976
+ const slide = slides[row.slideIndex];
107977
+ const element = (slide?.elements ?? []).find((candidate) => candidate.id === row.elementId);
107978
+ if (!element) {
107979
+ return null;
107980
+ }
107981
+ const paragraphs = readElementParagraphs(element);
107982
+ while (paragraphs.length <= row.paragraphIndex) {
107983
+ paragraphs.push({ text: "", level: 0 });
107984
+ }
107985
+ const next = mutate(paragraphs);
107986
+ if (!next) {
107987
+ return null;
107988
+ }
107989
+ return {
107990
+ slides: replaceElement(
107991
+ slides,
107992
+ row.slideIndex,
107993
+ element.id,
107994
+ writeElementParagraphs(element, next)
107995
+ ),
107996
+ changed: true,
107997
+ focusKey: row.key,
107998
+ activeSlideIndex: row.slideIndex
107999
+ };
108000
+ }
108001
+ function oneLine(text2) {
108002
+ return text2.replace(/[\r\n]+/g, " ");
108003
+ }
108004
+ function applySetText(slides, row, raw, options) {
108005
+ const text2 = oneLine(raw);
108006
+ if (row.elementId === null) {
108007
+ if (text2.length === 0) {
108008
+ return unchanged([...slides], row);
108009
+ }
108010
+ const element = createTitleElement(text2, options);
108011
+ const next = slides.map(
108012
+ (slide, index) => index === row.slideIndex ? { ...slide, elements: [element, ...slide.elements ?? []] } : slide
108013
+ );
108014
+ return {
108015
+ slides: next,
108016
+ changed: true,
108017
+ focusKey: outlineRowKey(row.slideId, element.id, 0),
108018
+ activeSlideIndex: row.slideIndex
108019
+ };
108020
+ }
108021
+ const result = editParagraphs(slides, row, (paragraphs) => {
108022
+ if (paragraphs[row.paragraphIndex].text === text2) {
108023
+ return null;
108024
+ }
108025
+ const next = [...paragraphs];
108026
+ next[row.paragraphIndex] = { ...next[row.paragraphIndex], text: text2 };
108027
+ return next;
108028
+ });
108029
+ return result ?? unchanged([...slides], row);
108030
+ }
108031
+ function applyIndent(slides, row, delta) {
108032
+ if (row.kind !== "body" || row.elementId === null || delta === 0) {
108033
+ return unchanged([...slides], row);
108034
+ }
108035
+ const result = editParagraphs(slides, row, (paragraphs) => {
108036
+ const current = paragraphs[row.paragraphIndex];
108037
+ const level = Math.min(Math.max(current.level + (delta > 0 ? 1 : -1), 0), MAX_PARAGRAPH_LEVEL);
108038
+ if (level === current.level) {
108039
+ return null;
108040
+ }
108041
+ const next = [...paragraphs];
108042
+ next[row.paragraphIndex] = { ...current, level };
108043
+ return next;
108044
+ });
108045
+ return result ?? unchanged([...slides], row);
108046
+ }
108047
+ function applyInsertAfter(slides, row, options) {
108048
+ if (row.kind === "title") {
108049
+ const slide = {
108050
+ id: makeSlideId(options.idGenerator),
108051
+ rId: "",
108052
+ slideNumber: row.slideIndex + 2,
108053
+ elements: []
108054
+ };
108055
+ const next = renumber([
108056
+ ...slides.slice(0, row.slideIndex + 1),
108057
+ slide,
108058
+ ...slides.slice(row.slideIndex + 1)
108059
+ ]);
108060
+ return {
108061
+ slides: next,
108062
+ changed: true,
108063
+ focusKey: outlineRowKey(slide.id, null, 0),
108064
+ activeSlideIndex: row.slideIndex + 1
108065
+ };
108066
+ }
108067
+ const result = editParagraphs(slides, row, (paragraphs) => {
108068
+ const next = [...paragraphs];
108069
+ next.splice(row.paragraphIndex + 1, 0, {
108070
+ text: "",
108071
+ level: paragraphs[row.paragraphIndex].level
108072
+ });
108073
+ return next;
108074
+ });
108075
+ if (!result) {
108076
+ return unchanged([...slides], row);
108077
+ }
108078
+ return {
108079
+ ...result,
108080
+ focusKey: outlineRowKey(row.slideId, row.elementId, row.paragraphIndex + 1)
108081
+ };
108082
+ }
108083
+ function applyOutlineEdit(slides, edit, options = {}) {
108084
+ const row = findOutlineRow(buildOutline(slides), edit.key);
108085
+ if (!row) {
108086
+ return unchanged([...slides]);
108087
+ }
108088
+ switch (edit.type) {
108089
+ case "setText":
108090
+ return applySetText(slides, row, edit.text, options);
108091
+ case "indent":
108092
+ return applyIndent(slides, row, edit.delta);
108093
+ case "insertAfter":
108094
+ return applyInsertAfter(slides, row, options);
108095
+ default:
108096
+ return unchanged([...slides], row);
108097
+ }
108098
+ }
107206
108099
  var NUDGE_SMALL = 1;
107207
108100
  var NUDGE_LARGE = 10;
107208
108101
  var GUARD_DEFAULTS = {
@@ -109227,29 +110120,6 @@ var COMMON_FONTS = [
109227
110120
  "Tw Cen MT",
109228
110121
  "Verdana"
109229
110122
  ];
109230
- var PASTE_OFFSET_PX = 20;
109231
- function generateElementId() {
109232
- return `el-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
109233
- }
109234
- function makeCloneId(intoTemplate, sourceId) {
109235
- if (!intoTemplate) {
109236
- return generateElementId();
109237
- }
109238
- if (sourceId.startsWith("master-")) {
109239
- return `master-${generateElementId()}`;
109240
- }
109241
- return `layout-${generateElementId()}`;
109242
- }
109243
- function buildElementClipboardPayload(element, isTemplate) {
109244
- return { element: structuredClone(element), isTemplate };
109245
- }
109246
- function cloneElementForPaste(element, options = {}) {
109247
- const clone3 = structuredClone(element);
109248
- clone3.id = makeCloneId(options.intoTemplate ?? false, element.id);
109249
- clone3.x += options.offsetX ?? PASTE_OFFSET_PX;
109250
- clone3.y += options.offsetY ?? PASTE_OFFSET_PX;
109251
- return clone3;
109252
- }
109253
110123
  var DEFAULT_PREVIEW_ELEMENT_CAP = 500;
109254
110124
  function buildPreviewElements(slide, templateElements = [], options) {
109255
110125
  const cap = options?.cap ?? DEFAULT_PREVIEW_ELEMENT_CAP;
@@ -110278,6 +111148,91 @@ function applyRehearsalTimings(slides, timings) {
110278
111148
  function computeEntranceAnimationDelay(delayMs, animationIndex) {
110279
111149
  return Math.max(0, delayMs || 0) + animationIndex * 60;
110280
111150
  }
111151
+ function resolveCustomShowIndexes(slides, customShow) {
111152
+ const keys = customShow.slideRIds ?? customShow.slideIds;
111153
+ if (!keys || keys.length === 0) {
111154
+ return [];
111155
+ }
111156
+ const byKey = /* @__PURE__ */ new Map();
111157
+ slides.forEach((slide, index) => {
111158
+ if (slide.id !== void 0 && !byKey.has(slide.id)) {
111159
+ byKey.set(slide.id, index);
111160
+ }
111161
+ });
111162
+ slides.forEach((slide, index) => {
111163
+ if (slide.rId !== void 0) {
111164
+ byKey.set(slide.rId, index);
111165
+ }
111166
+ });
111167
+ const resolved = [];
111168
+ for (const key of keys) {
111169
+ const index = byKey.get(key);
111170
+ if (index !== void 0) {
111171
+ resolved.push(index);
111172
+ }
111173
+ }
111174
+ return resolved;
111175
+ }
111176
+ function resolveShowSlideIndexes(slides, activeCustomShow) {
111177
+ const all = [];
111178
+ for (let index = 0; index < slides.length; index++) {
111179
+ all.push(index);
111180
+ }
111181
+ const base = activeCustomShow ? resolveCustomShowIndexes(slides, activeCustomShow) : all;
111182
+ const effectiveBase = base.length > 0 ? base : all;
111183
+ const visible = effectiveBase.filter((index) => !slides[index]?.hidden);
111184
+ return visible.length > 0 ? visible : effectiveBase;
111185
+ }
111186
+ function showPosition(deckIndex, showIndexes) {
111187
+ return showIndexes.indexOf(deckIndex);
111188
+ }
111189
+ function nextShowSlideIndex(deckIndex, showIndexes, options) {
111190
+ if (showIndexes.length === 0) {
111191
+ return void 0;
111192
+ }
111193
+ const position2 = showPosition(deckIndex, showIndexes);
111194
+ if (position2 >= 0) {
111195
+ if (position2 + 1 < showIndexes.length) {
111196
+ return showIndexes[position2 + 1];
111197
+ }
111198
+ return options?.loop ? showIndexes[0] : void 0;
111199
+ }
111200
+ for (const candidate of showIndexes) {
111201
+ if (candidate > deckIndex) {
111202
+ return candidate;
111203
+ }
111204
+ }
111205
+ return options?.loop ? showIndexes[0] : void 0;
111206
+ }
111207
+ function previousShowSlideIndex(deckIndex, showIndexes) {
111208
+ if (showIndexes.length === 0) {
111209
+ return void 0;
111210
+ }
111211
+ const position2 = showPosition(deckIndex, showIndexes);
111212
+ if (position2 >= 0) {
111213
+ return position2 > 0 ? showIndexes[position2 - 1] : void 0;
111214
+ }
111215
+ let previous;
111216
+ for (const candidate of showIndexes) {
111217
+ if (candidate < deckIndex) {
111218
+ previous = candidate;
111219
+ }
111220
+ }
111221
+ return previous;
111222
+ }
111223
+ function hasShowSlideAfter(deckIndex, showIndexes) {
111224
+ return nextShowSlideIndex(deckIndex, showIndexes) !== void 0;
111225
+ }
111226
+ function nextPresentedSlide(slides, deckIndex) {
111227
+ const next = nextShowSlideIndex(deckIndex, resolveShowSlideIndexes(slides));
111228
+ return next === void 0 ? void 0 : slides[next];
111229
+ }
111230
+ function firstShowSlideIndex(showIndexes) {
111231
+ return showIndexes.length > 0 ? showIndexes[0] : void 0;
111232
+ }
111233
+ function lastShowSlideIndex(showIndexes) {
111234
+ return showIndexes.length > 0 ? showIndexes[showIndexes.length - 1] : void 0;
111235
+ }
110281
111236
  var VIEWER_PREFS_STORAGE_KEY = "pptx-viewer-prefs";
110282
111237
  function hasLocalStorage() {
110283
111238
  return typeof localStorage !== "undefined";
@@ -112898,6 +113853,7 @@ exports.DEFAULT_BROADCAST_SERVER_URL = DEFAULT_BROADCAST_SERVER_URL;
112898
113853
  exports.DEFAULT_COLOR_CHANGE_TOLERANCE = DEFAULT_COLOR_CHANGE_TOLERANCE;
112899
113854
  exports.DEFAULT_COLOR_MAP = DEFAULT_COLOR_MAP;
112900
113855
  exports.DEFAULT_INSERT_CHART_TYPE = DEFAULT_INSERT_CHART_TYPE;
113856
+ exports.DEFAULT_MOTION_PATH_PRESET_ID = DEFAULT_MOTION_PATH_PRESET_ID;
112901
113857
  exports.DEFAULT_QUICK_ACCESS_COMMAND_IDS = DEFAULT_QUICK_ACCESS_COMMAND_IDS;
112902
113858
  exports.DEFAULT_ROW_HEIGHT = DEFAULT_ROW_HEIGHT;
112903
113859
  exports.DEFAULT_VIEWER_OPTIONS = DEFAULT_VIEWER_OPTIONS;
@@ -112914,6 +113870,7 @@ exports.EXPORT_ASSEMBLING_PERCENT = EXPORT_ASSEMBLING_PERCENT;
112914
113870
  exports.EXPORT_DONE_PERCENT = EXPORT_DONE_PERCENT;
112915
113871
  exports.EncryptedFileError = EncryptedFileError;
112916
113872
  exports.FILL_MODE_OPTIONS = FILL_MODE_OPTIONS;
113873
+ exports.FILL_PATTERN_LABEL_KEYS = FILL_PATTERN_LABEL_KEYS;
112917
113874
  exports.GRADIENT_TYPE_OPTIONS = GRADIENT_TYPE_OPTIONS;
112918
113875
  exports.HANDOUT_OPTIONS = HANDOUT_OPTIONS;
112919
113876
  exports.INK_REPLAY_KEYFRAMES = INK_REPLAY_KEYFRAMES;
@@ -112924,11 +113881,16 @@ exports.MATERIAL_PRESETS = MATERIAL_PRESETS;
112924
113881
  exports.MAX_ZOOM_SCALE = MAX_ZOOM_SCALE;
112925
113882
  exports.MIN_ZOOM_SCALE = MIN_ZOOM_SCALE;
112926
113883
  exports.MOBILE_BREAKPOINT = MOBILE_BREAKPOINT;
113884
+ exports.MOTION_PATH_FAMILIES = MOTION_PATH_FAMILIES;
112927
113885
  exports.NOTES_FONT_SIZE_DEFAULT = NOTES_FONT_SIZE_DEFAULT;
112928
113886
  exports.NOTES_FONT_SIZE_MAX = NOTES_FONT_SIZE_MAX;
112929
113887
  exports.NOTES_FONT_SIZE_MIN = NOTES_FONT_SIZE_MIN;
112930
113888
  exports.NOTES_FONT_SIZE_STEP = NOTES_FONT_SIZE_STEP;
112931
113889
  exports.NUM = NUM;
113890
+ exports.OUTLINE_LEVEL_ATTR = OUTLINE_LEVEL_ATTR;
113891
+ exports.OUTLINE_ROW_ATTR = OUTLINE_ROW_ATTR;
113892
+ exports.OUTLINE_SLIDE_ATTR = OUTLINE_SLIDE_ATTR;
113893
+ exports.OUTLINE_VIEW_ATTR = OUTLINE_VIEW_ATTR;
112932
113894
  exports.PATTERN_OPTIONS = PATTERN_OPTIONS;
112933
113895
  exports.PRESENTATION_CHANNEL_NAME = PRESENTATION_CHANNEL_NAME;
112934
113896
  exports.PRESENTATION_HASH = PRESENTATION_HASH;
@@ -112953,6 +113915,8 @@ exports.SHORTCUT_REFERENCE_ITEMS = SHORTCUT_REFERENCE_ITEMS;
112953
113915
  exports.SLIDE_TRANSITION_KEYFRAMES = SLIDE_TRANSITION_KEYFRAMES;
112954
113916
  exports.SLIDE_TRANSITION_OPTIONS = SLIDE_TRANSITION_OPTIONS;
112955
113917
  exports.SLIDE_VIRTUALIZATION_THRESHOLD = SLIDE_VIRTUALIZATION_THRESHOLD;
113918
+ exports.SMARTART_COLOR_SCHEME_LABEL_KEYS = SMARTART_COLOR_SCHEME_LABEL_KEYS;
113919
+ exports.SMARTART_STYLE_LABEL_KEYS = SMARTART_STYLE_LABEL_KEYS;
112956
113920
  exports.STATUS_BAR_CLASSES = STATUS_BAR_CLASSES;
112957
113921
  exports.SWITCHABLE_LAYOUT_TYPES = SWITCHABLE_LAYOUT_TYPES;
112958
113922
  exports.SvgExporter = SvgExporter;
@@ -112964,6 +113928,7 @@ exports.TEXT_WARP_PRESETS = TEXT_WARP_PRESETS;
112964
113928
  exports.THEME_CATALOG = THEME_CATALOG;
112965
113929
  exports.THEME_COLOR_LABELS = THEME_COLOR_LABELS;
112966
113930
  exports.THEME_COLOR_SCHEME_KEYS = THEME_COLOR_SCHEME_KEYS;
113931
+ exports.THEME_COLOR_SLOT_LABEL_KEYS = THEME_COLOR_SLOT_LABEL_KEYS;
112967
113932
  exports.THEME_PRESETS = THEME_PRESETS;
112968
113933
  exports.TITLE_BAR_CLASSES = TITLE_BAR_CLASSES;
112969
113934
  exports.TITLE_BAR_DEFAULT_FILE_KEY = TITLE_BAR_DEFAULT_FILE_KEY;
@@ -112997,6 +113962,8 @@ exports.applyChartBuildReveal = applyChartBuildReveal;
112997
113962
  exports.applyColorChange = applyColorChange;
112998
113963
  exports.applyDuotone = applyDuotone;
112999
113964
  exports.applyFormatToElement = applyFormatToElement;
113965
+ exports.applyMotionPathPreset = applyMotionPathPreset;
113966
+ exports.applyOutlineEdit = applyOutlineEdit;
113000
113967
  exports.applyPreferenceToOptions = applyPreferenceToOptions;
113001
113968
  exports.applyReadingViewCommand = applyReadingViewCommand;
113002
113969
  exports.applyRehearsalTimings = applyRehearsalTimings;
@@ -113028,9 +113995,11 @@ exports.buildInitialGuides = buildInitialGuides;
113028
113995
  exports.buildInnerShadowCssFromShapeStyle = buildInnerShadowCssFromShapeStyle;
113029
113996
  exports.buildJoinCollaborationConfig = buildJoinCollaborationConfig;
113030
113997
  exports.buildMorphTransitionPlan = buildMorphTransitionPlan;
113998
+ exports.buildMotionPathPreview = buildMotionPathPreview;
113031
113999
  exports.buildMultiLayerShadowCss = buildMultiLayerShadowCss;
113032
114000
  exports.buildNotesHtml = buildNotesHtml;
113033
114001
  exports.buildNotesPdfBytes = buildNotesPdfBytes;
114002
+ exports.buildOutline = buildOutline;
113034
114003
  exports.buildOutlineHtml = buildOutlineHtml;
113035
114004
  exports.buildPatternFillCss = buildPatternFillCss;
113036
114005
  exports.buildPresentationAudienceUrl = buildPresentationAudienceUrl;
@@ -113075,6 +114044,7 @@ exports.clampZoomScale = clampZoomScale;
113075
114044
  exports.clearAllLocalViewerData = clearAllLocalViewerData;
113076
114045
  exports.clearAudienceContent = clearAudienceContent;
113077
114046
  exports.clearLocalAwareness = clearLocalAwareness;
114047
+ exports.clearMotionPath = clearMotionPath;
113078
114048
  exports.clearStoredViewerPrefs = clearStoredViewerPrefs;
113079
114049
  exports.cloneElementForPaste = cloneElementForPaste;
113080
114050
  exports.cloneHistorySnapshot = cloneHistorySnapshot;
@@ -113155,6 +114125,7 @@ exports.filterRenderedElements = filterRenderedElements;
113155
114125
  exports.findChartPartTarget = findChartPartTarget;
113156
114126
  exports.findMediaElementByElementId = findMediaElementByElementId;
113157
114127
  exports.findSmartArtNodeText = findSmartArtNodeText;
114128
+ exports.firstShowSlideIndex = firstShowSlideIndex;
113158
114129
  exports.flattenTagCollections = flattenTagCollections;
113159
114130
  exports.formatAxisValue = formatAxisValue;
113160
114131
  exports.formatAxisValueWithUnits = formatAxisValueWithUnits;
@@ -113243,6 +114214,7 @@ exports.hasCopyableFormat = hasCopyableFormat;
113243
114214
  exports.hasDistinctScriptFonts = hasDistinctScriptFonts;
113244
114215
  exports.hasPressureVariation = hasPressureVariation;
113245
114216
  exports.hasShapeProperties = hasShapeProperties;
114217
+ exports.hasShowSlideAfter = hasShowSlideAfter;
113246
114218
  exports.hasTextProperties = hasTextProperties;
113247
114219
  exports.hexToRgbChannels = hexToRgbChannels2;
113248
114220
  exports.insertTableColumn = insertTableColumn;
@@ -113251,6 +114223,7 @@ exports.isActionHidden = isActionHidden;
113251
114223
  exports.isBrowserOpenableMime = isBrowserOpenableMime;
113252
114224
  exports.isCalloutShape = isCalloutShape;
113253
114225
  exports.isCellInRect = isCellInRect;
114226
+ exports.isEditableMotionPath = isEditableMotionPath;
113254
114227
  exports.isEditableTextElement = isEditableTextElement;
113255
114228
  exports.isEditorTextInputTarget = isEditorTextInputTarget;
113256
114229
  exports.isElementActionable = isElementActionable;
@@ -113270,12 +114243,14 @@ exports.isPresentationSessionMessage = isPresentationSessionMessage;
113270
114243
  exports.isTemplateElement = isTemplateElement;
113271
114244
  exports.isTemplateElementId = isTemplateElementId2;
113272
114245
  exports.isUrlSafe = isUrlSafe;
114246
+ exports.lastShowSlideIndex = lastShowSlideIndex;
113273
114247
  exports.listAutosaveSnapshots = listAutosaveSnapshots;
113274
114248
  exports.listBackstageRecentFiles = listBackstageRecentFiles;
113275
114249
  exports.loadAudienceContent = loadAudienceContent;
113276
114250
  exports.makeCloneId = makeCloneId;
113277
114251
  exports.makeSlideId = makeSlideId;
113278
114252
  exports.mapEditorKey = mapEditorKey;
114253
+ exports.mapOutlineKey = mapOutlineKey;
113279
114254
  exports.mapPresentationKey = mapPresentationKey;
113280
114255
  exports.mayLeaveSlideShow = mayLeaveSlideShow;
113281
114256
  exports.mergeAdditiveSelection = mergeAdditiveSelection;
@@ -113286,6 +114261,13 @@ exports.mergeSlideTransition = mergeSlideTransition;
113286
114261
  exports.mobileElapsedSince = mobileElapsedSince;
113287
114262
  exports.mobileSlideCounter = mobileSlideCounter;
113288
114263
  exports.morphOptionToMode = morphOptionToMode;
114264
+ exports.motionPathEndPixel = motionPathEndPixel;
114265
+ exports.motionPathFamilyLabelKey = motionPathFamilyLabelKey;
114266
+ exports.motionPathFor = motionPathFor;
114267
+ exports.motionPathPresetIdForPath = motionPathPresetIdForPath;
114268
+ exports.motionPathPresetLabelKey = motionPathPresetLabelKey;
114269
+ exports.motionPathPresetsByFamily = motionPathPresetsByFamily;
114270
+ exports.motionPathToSvgD = motionPathToSvgD;
113289
114271
  exports.mountModel3D = mountModel3D;
113290
114272
  exports.mountSurfaceChart3D = mountSurfaceChart3D;
113291
114273
  exports.movePresenterPointer = movePresenterPointer;
@@ -113294,6 +114276,8 @@ exports.moveSectionDown = moveSectionDown;
113294
114276
  exports.moveSectionUp = moveSectionUp;
113295
114277
  exports.moveSlidesToSection = moveSlidesToSection;
113296
114278
  exports.newTableElement = newTableElement;
114279
+ exports.nextPresentedSlide = nextPresentedSlide;
114280
+ exports.nextShowSlideIndex = nextShowSlideIndex;
113297
114281
  exports.normalizeColorsForCapture = normalizeColorsForCapture;
113298
114282
  exports.normalizeHexColor = normalizeHexColor;
113299
114283
  exports.normalizeStrokeDashType = normalizeStrokeDashType;
@@ -113319,6 +114303,7 @@ exports.presentationInkPath = presentationInkPath;
113319
114303
  exports.presenterElapsed = presenterElapsed;
113320
114304
  exports.presenterPaneAdvancesOnClick = presenterPaneAdvancesOnClick;
113321
114305
  exports.pressuresToWidths = pressuresToWidths;
114306
+ exports.previousShowSlideIndex = previousShowSlideIndex;
113322
114307
  exports.printPropertiesFrameSlides = printPropertiesFrameSlides;
113323
114308
  exports.printPropertiesSlidesPerPage = printPropertiesSlidesPerPage;
113324
114309
  exports.promoteSmartArtNode = promoteSmartArtNode;
@@ -113369,6 +114354,7 @@ exports.resolveParagraphStrutFontSize = resolveParagraphStrutFontSize;
113369
114354
  exports.resolvePictureBullet = resolvePictureBullet;
113370
114355
  exports.resolveProfileInitial = resolveProfileInitial;
113371
114356
  exports.resolveRegionCode = resolveRegionCode;
114357
+ exports.resolveShowSlideIndexes = resolveShowSlideIndexes;
113372
114358
  exports.resolveThemeCatalogEntry = resolveThemeCatalogEntry;
113373
114359
  exports.resolveTitleBarStatusKey = resolveTitleBarStatusKey;
113374
114360
  exports.resolveTransitionDurationMs = resolveTransitionDurationMs;
@@ -113387,6 +114373,7 @@ exports.sanitizeMathMl = sanitizeMathMl;
113387
114373
  exports.saveAutosaveSnapshot = saveAutosaveSnapshot;
113388
114374
  exports.saveViewerProfile = saveViewerProfile;
113389
114375
  exports.scanAvailableFontFamilies = scanAvailableFontFamilies;
114376
+ exports.schemaLabel = schemaLabel;
113390
114377
  exports.segmentByScript = segmentByScript;
113391
114378
  exports.segmentFrameCount = segmentFrameCount;
113392
114379
  exports.sendBackward = sendBackward;
@@ -113406,6 +114393,8 @@ exports.setChartDataPointMarker = setChartDataPointMarker;
113406
114393
  exports.setChartSeriesChartType = setChartSeriesChartType;
113407
114394
  exports.setChartSeriesMarker = setChartSeriesMarker;
113408
114395
  exports.setDuotoneCachedResult = setDuotoneCachedResult;
114396
+ exports.setMotionPath = setMotionPath;
114397
+ exports.setMotionPathEnd = setMotionPathEnd;
113409
114398
  exports.setPendingSelectionRestore = setPendingSelectionRestore;
113410
114399
  exports.setSmartArtNodeStyle = setSmartArtNodeStyle;
113411
114400
  exports.setTableElementCellText = setTableElementCellText;