pptx-react-viewer 2.7.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/{AiChatPanel-G6DKXSM3.js → AiChatPanel-GTCK35EI.js} +22 -22
  3. package/dist/AiChatPanel-GTCK35EI.js.br +0 -0
  4. package/dist/AiChatPanel-GTCK35EI.js.gz +0 -0
  5. package/dist/{AiChatPanel-J5IGSCYA.mjs → AiChatPanel-UXPHPUQV.mjs} +3 -3
  6. package/dist/AiChatPanel-UXPHPUQV.mjs.br +0 -0
  7. package/dist/AiChatPanel-UXPHPUQV.mjs.gz +0 -0
  8. package/dist/{Model3DScene-ID6CQKEJ.mjs → Model3DScene-HDUHTKPF.mjs} +1 -1
  9. package/dist/Model3DScene-HDUHTKPF.mjs.br +0 -0
  10. package/dist/Model3DScene-HDUHTKPF.mjs.gz +0 -0
  11. package/dist/{Model3DScene-S7LKZ6IA.js → Model3DScene-USPBP3KE.js} +2 -2
  12. package/dist/Model3DScene-USPBP3KE.js.br +0 -0
  13. package/dist/Model3DScene-USPBP3KE.js.gz +0 -0
  14. package/dist/{SurfaceChart3DScene-V5H6MXYW.mjs → SurfaceChart3DScene-7SLM73XC.mjs} +1 -1
  15. package/dist/{SurfaceChart3DScene-V5H6MXYW.mjs.br → SurfaceChart3DScene-7SLM73XC.mjs.br} +0 -0
  16. package/dist/SurfaceChart3DScene-7SLM73XC.mjs.gz +0 -0
  17. package/dist/{SurfaceChart3DScene-XSJXJM6H.js → SurfaceChart3DScene-NZ3K5CC6.js} +2 -2
  18. package/dist/SurfaceChart3DScene-NZ3K5CC6.js.br +0 -0
  19. package/dist/SurfaceChart3DScene-NZ3K5CC6.js.gz +0 -0
  20. package/dist/{chunk-IGKLB7NQ.mjs → chunk-AHPZGUL7.mjs} +2 -2
  21. package/dist/chunk-AHPZGUL7.mjs.br +0 -0
  22. package/dist/chunk-AHPZGUL7.mjs.gz +0 -0
  23. package/dist/{chunk-4KMTZLNS.js → chunk-KGXDCDA5.js} +320 -327
  24. package/dist/chunk-KGXDCDA5.js.br +0 -0
  25. package/dist/chunk-KGXDCDA5.js.gz +0 -0
  26. package/dist/{chunk-2LOBDOTK.js → chunk-MZJMOEEX.js} +155 -66
  27. package/dist/chunk-MZJMOEEX.js.br +0 -0
  28. package/dist/chunk-MZJMOEEX.js.gz +0 -0
  29. package/dist/{chunk-YUHEJWUN.mjs → chunk-OIH753PJ.mjs} +7 -14
  30. package/dist/chunk-OIH753PJ.mjs.br +0 -0
  31. package/dist/chunk-OIH753PJ.mjs.gz +0 -0
  32. package/dist/{chunk-SOLHDKNK.mjs → chunk-PVCUYPU7.mjs} +1 -1
  33. package/dist/chunk-PVCUYPU7.mjs.br +0 -0
  34. package/dist/chunk-PVCUYPU7.mjs.gz +0 -0
  35. package/dist/{chunk-B4XJTZR4.js → chunk-SMW4QYGK.js} +236 -236
  36. package/dist/chunk-SMW4QYGK.js.br +0 -0
  37. package/dist/chunk-SMW4QYGK.js.gz +0 -0
  38. package/dist/{chunk-GLQFRVAN.js → chunk-SOBKYMMR.js} +988 -961
  39. package/dist/chunk-SOBKYMMR.js.br +0 -0
  40. package/dist/chunk-SOBKYMMR.js.gz +0 -0
  41. package/dist/{chunk-Y4EB65WB.mjs → chunk-TJ5QMUUJ.mjs} +152 -125
  42. package/dist/chunk-TJ5QMUUJ.mjs.br +0 -0
  43. package/dist/chunk-TJ5QMUUJ.mjs.gz +0 -0
  44. package/dist/{chunk-6C4UY7GX.js → chunk-VFLBLJ4G.js} +3 -3
  45. package/dist/chunk-VFLBLJ4G.js.br +0 -0
  46. package/dist/chunk-VFLBLJ4G.js.gz +0 -0
  47. package/dist/{chunk-WH46JCNF.mjs → chunk-VH2QF5CT.mjs} +154 -67
  48. package/dist/chunk-VH2QF5CT.mjs.br +0 -0
  49. package/dist/chunk-VH2QF5CT.mjs.gz +0 -0
  50. package/dist/index.js +34 -34
  51. package/dist/index.js.br +0 -0
  52. package/dist/index.js.gz +0 -0
  53. package/dist/index.mjs +5 -5
  54. package/dist/index.mjs.br +0 -0
  55. package/dist/index.mjs.gz +0 -0
  56. package/dist/internals.d.ts.map +1 -1
  57. package/dist/internals.js +78 -78
  58. package/dist/internals.js.br +0 -0
  59. package/dist/internals.js.gz +0 -0
  60. package/dist/internals.mjs +3 -3
  61. package/dist/internals.mjs.br +0 -0
  62. package/dist/internals.mjs.gz +0 -0
  63. package/dist/viewer/index.js +21 -21
  64. package/dist/viewer/index.js.br +0 -0
  65. package/dist/viewer/index.js.gz +0 -0
  66. package/dist/viewer/index.mjs +5 -5
  67. package/dist/viewer/index.mjs.br +0 -0
  68. package/dist/viewer/index.mjs.gz +0 -0
  69. package/package.json +1 -1
  70. package/dist/AiChatPanel-G6DKXSM3.js.br +0 -0
  71. package/dist/AiChatPanel-G6DKXSM3.js.gz +0 -0
  72. package/dist/AiChatPanel-J5IGSCYA.mjs.br +0 -0
  73. package/dist/AiChatPanel-J5IGSCYA.mjs.gz +0 -0
  74. package/dist/Model3DScene-ID6CQKEJ.mjs.br +0 -0
  75. package/dist/Model3DScene-ID6CQKEJ.mjs.gz +0 -0
  76. package/dist/Model3DScene-S7LKZ6IA.js.br +0 -0
  77. package/dist/Model3DScene-S7LKZ6IA.js.gz +0 -0
  78. package/dist/SurfaceChart3DScene-V5H6MXYW.mjs.gz +0 -0
  79. package/dist/SurfaceChart3DScene-XSJXJM6H.js.br +0 -0
  80. package/dist/SurfaceChart3DScene-XSJXJM6H.js.gz +0 -0
  81. package/dist/chunk-2LOBDOTK.js.br +0 -0
  82. package/dist/chunk-2LOBDOTK.js.gz +0 -0
  83. package/dist/chunk-4KMTZLNS.js.br +0 -0
  84. package/dist/chunk-4KMTZLNS.js.gz +0 -0
  85. package/dist/chunk-6C4UY7GX.js.br +0 -0
  86. package/dist/chunk-6C4UY7GX.js.gz +0 -0
  87. package/dist/chunk-B4XJTZR4.js.br +0 -0
  88. package/dist/chunk-B4XJTZR4.js.gz +0 -0
  89. package/dist/chunk-GLQFRVAN.js.br +0 -0
  90. package/dist/chunk-GLQFRVAN.js.gz +0 -0
  91. package/dist/chunk-IGKLB7NQ.mjs.br +0 -0
  92. package/dist/chunk-IGKLB7NQ.mjs.gz +0 -0
  93. package/dist/chunk-SOLHDKNK.mjs.br +0 -0
  94. package/dist/chunk-SOLHDKNK.mjs.gz +0 -0
  95. package/dist/chunk-WH46JCNF.mjs.br +0 -0
  96. package/dist/chunk-WH46JCNF.mjs.gz +0 -0
  97. package/dist/chunk-Y4EB65WB.mjs.br +0 -0
  98. package/dist/chunk-Y4EB65WB.mjs.gz +0 -0
  99. package/dist/chunk-YUHEJWUN.mjs.br +0 -0
  100. package/dist/chunk-YUHEJWUN.mjs.gz +0 -0
Binary file
Binary file
@@ -19829,6 +19829,13 @@ function extractChildBehaviourDurationMs(cTn, toArray2) {
19829
19829
  }
19830
19830
  return longest;
19831
19831
  }
19832
+ function isInteractiveSequence(seq) {
19833
+ const cTn = seq["p:cTn"];
19834
+ if (!cTn || String(cTn["@_nodeType"] || "") === "mainSeq") {
19835
+ return false;
19836
+ }
19837
+ return extractTriggerShapeId(cTn) !== void 0;
19838
+ }
19832
19839
  var PptxNativeAnimationService = class {
19833
19840
  /**
19834
19841
  * Parse native OOXML animations from a slide's timing tree.
@@ -20029,6 +20036,9 @@ var PptxNativeAnimationService = class {
20029
20036
  );
20030
20037
  }
20031
20038
  for (const sequence of sequences) {
20039
+ if (isInteractiveSequence(sequence)) {
20040
+ continue;
20041
+ }
20032
20042
  this.walkTimingTree(sequence, animations, trigger, group);
20033
20043
  }
20034
20044
  for (const excl of exclusives) {
@@ -20054,6 +20064,9 @@ var PptxNativeAnimationService = class {
20054
20064
  );
20055
20065
  }
20056
20066
  for (const sequence of directSequences) {
20067
+ if (isInteractiveSequence(sequence)) {
20068
+ continue;
20069
+ }
20057
20070
  this.walkTimingTree(sequence, animations, currentTrigger, group);
20058
20071
  }
20059
20072
  }
@@ -20157,6 +20170,36 @@ var PptxNativeAnimationService = class {
20157
20170
  }
20158
20171
  return void 0;
20159
20172
  }
20173
+ /**
20174
+ * Collect every interactive `p:seq` reachable from `node`.
20175
+ *
20176
+ * Interactive sequences are normally siblings of the main sequence under the
20177
+ * root `p:par`, but a deck may nest one deeper. The generic walk skips every
20178
+ * sequence {@link isInteractiveSequence} matches, so this collector has to
20179
+ * reach exactly the same set or those effects would be dropped entirely.
20180
+ * Collection stops at an interactive sequence: its own subtree is walked by
20181
+ * {@link parseInteractiveSequences} under that sequence's trigger shape.
20182
+ */
20183
+ collectInteractiveSequences(node, found) {
20184
+ const containers = [];
20185
+ const cTn = node["p:cTn"];
20186
+ const childTnList = cTn?.["p:childTnLst"];
20187
+ if (childTnList) {
20188
+ containers.push(
20189
+ ...ensureArray5(childTnList["p:par"]),
20190
+ ...ensureArray5(childTnList["p:seq"]),
20191
+ ...ensureArray5(childTnList["p:excl"])
20192
+ );
20193
+ }
20194
+ containers.push(...ensureArray5(node["p:par"]), ...ensureArray5(node["p:seq"]));
20195
+ for (const container of containers) {
20196
+ if (isInteractiveSequence(container)) {
20197
+ found.push(container);
20198
+ continue;
20199
+ }
20200
+ this.collectInteractiveSequences(container, found);
20201
+ }
20202
+ }
20160
20203
  /**
20161
20204
  * Parse interactive sequences from the root `p:par` node.
20162
20205
  *
@@ -20167,25 +20210,11 @@ var PptxNativeAnimationService = class {
20167
20210
  * See ISO/IEC 29500-1 S19.5.60 (CT_TLTimeNodeSequence).
20168
20211
  */
20169
20212
  parseInteractiveSequences(rootPar, animations) {
20170
- const rootCTn = rootPar["p:cTn"];
20171
- if (!rootCTn) {
20172
- return;
20173
- }
20174
- const childTnList = rootCTn["p:childTnLst"];
20175
- if (!childTnList) {
20176
- return;
20177
- }
20178
- const sequences = ensureArray5(childTnList["p:seq"]);
20213
+ const sequences = [];
20214
+ this.collectInteractiveSequences(rootPar, sequences);
20179
20215
  for (const seq of sequences) {
20180
20216
  const seqCTn = seq["p:cTn"];
20181
- if (!seqCTn) {
20182
- continue;
20183
- }
20184
- const nodeType = String(seqCTn["@_nodeType"] || "");
20185
- if (nodeType === "mainSeq") {
20186
- continue;
20187
- }
20188
- const triggerShapeId = extractTriggerShapeId(seqCTn);
20217
+ const triggerShapeId = seqCTn ? extractTriggerShapeId(seqCTn) : void 0;
20189
20218
  if (!triggerShapeId) {
20190
20219
  continue;
20191
20220
  }
@@ -98273,6 +98302,10 @@ function interpolateOutline(from, to, t) {
98273
98302
  return parts.join(" ");
98274
98303
  }
98275
98304
  var MORPH_EASING = "cubic-bezier(0.4, 0, 0.2, 1)";
98305
+ var MORPH_FADE_OUT_HOLD_PERCENT = 4;
98306
+ var MORPH_FADE_OUT_END_PERCENT = 23;
98307
+ var MORPH_FADE_IN_START_PERCENT = 42;
98308
+ var MORPH_FADE_IN_EASING = "cubic-bezier(0, 0, 0.35, 1)";
98276
98309
  var PROXIMITY_THRESHOLD = 300;
98277
98310
  var PROXIMITY_SIZE_RATIO_LIMIT = 2;
98278
98311
  var GEOMETRY_MORPH_STEPS = 8;
@@ -98334,6 +98367,21 @@ ${body}
98334
98367
  keyframes
98335
98368
  };
98336
98369
  }
98370
+ function getElementMorphName(element) {
98371
+ if (element.name) {
98372
+ const name = element.name.trim();
98373
+ if (name.startsWith("!!")) {
98374
+ return name;
98375
+ }
98376
+ }
98377
+ if (hasTextProperties(element) && element.text) {
98378
+ const text2 = element.text.trim();
98379
+ if (text2.startsWith("!!")) {
98380
+ return text2;
98381
+ }
98382
+ }
98383
+ return void 0;
98384
+ }
98337
98385
  function groupChildren(element) {
98338
98386
  if (element.type !== "group") {
98339
98387
  return void 0;
@@ -98359,34 +98407,42 @@ function toAbsolute(child22, offsetX, offsetY) {
98359
98407
  }
98360
98408
  return { ...child22, x: child22.x + offsetX, y: child22.y + offsetY };
98361
98409
  }
98362
- function flattenMorphElements(elements, offsetX = 0, offsetY = 0) {
98410
+ function sameBox(a, b) {
98411
+ return Math.abs(a.x - b.x) <= 0.5 && Math.abs(a.y - b.y) <= 0.5 && Math.abs(a.width - b.width) <= 0.5 && Math.abs(a.height - b.height) <= 0.5;
98412
+ }
98413
+ function correspondingGroup(group, candidates) {
98414
+ const morphName = getElementMorphName(group);
98415
+ return candidates.find((candidate) => {
98416
+ if (candidate.type !== "group") {
98417
+ return false;
98418
+ }
98419
+ if (morphName !== void 0 && getElementMorphName(candidate) === morphName) {
98420
+ return true;
98421
+ }
98422
+ if (group.name && candidate.name === group.name) {
98423
+ return true;
98424
+ }
98425
+ return sameBox(group, candidate);
98426
+ });
98427
+ }
98428
+ function flattenMorphElements(elements, counterpart, offsetX = 0, offsetY = 0) {
98363
98429
  const out = [];
98364
98430
  for (const element of elements) {
98365
98431
  const children8 = groupChildren(element);
98366
98432
  if (children8 && containsMorphNamedDescendant(element)) {
98367
- out.push(...flattenMorphElements(children8, offsetX + element.x, offsetY + element.y));
98368
- continue;
98433
+ const twin = correspondingGroup(element, counterpart);
98434
+ const twinChildren = twin ? groupChildren(twin) ?? [] : void 0;
98435
+ if (twinChildren) {
98436
+ out.push(
98437
+ ...flattenMorphElements(children8, twinChildren, offsetX + element.x, offsetY + element.y)
98438
+ );
98439
+ continue;
98440
+ }
98369
98441
  }
98370
98442
  out.push(toAbsolute(element, offsetX, offsetY));
98371
98443
  }
98372
98444
  return out;
98373
98445
  }
98374
- var SAME_BOX_TOLERANCE_PX = 0.5;
98375
- function getElementMorphName(element) {
98376
- if (element.name) {
98377
- const name = element.name.trim();
98378
- if (name.startsWith("!!")) {
98379
- return name;
98380
- }
98381
- }
98382
- if (hasTextProperties(element) && element.text) {
98383
- const text2 = element.text.trim();
98384
- if (text2.startsWith("!!")) {
98385
- return text2;
98386
- }
98387
- }
98388
- return void 0;
98389
- }
98390
98446
  var NV_PR_KEYS = [
98391
98447
  "p:nvSpPr",
98392
98448
  "p:nvPicPr",
@@ -98422,8 +98478,8 @@ function matchMorphElementsFull(fromSlide, toSlide) {
98422
98478
  const pairs2 = [];
98423
98479
  const usedFrom = /* @__PURE__ */ new Set();
98424
98480
  const usedTo = /* @__PURE__ */ new Set();
98425
- const fromElements = flattenMorphElements(fromSlide.elements);
98426
- const toElements = flattenMorphElements(toSlide.elements);
98481
+ const fromElements = flattenMorphElements(fromSlide.elements, toSlide.elements);
98482
+ const toElements = flattenMorphElements(toSlide.elements, fromSlide.elements);
98427
98483
  for (const fromEl of fromElements) {
98428
98484
  const fromName = getElementMorphName(fromEl);
98429
98485
  if (!fromName) {
@@ -98520,22 +98576,6 @@ function matchMorphElementsFull(fromSlide, toSlide) {
98520
98576
  usedTo.add(bestMatch.id);
98521
98577
  }
98522
98578
  }
98523
- for (const fromEl of fromElements) {
98524
- if (usedFrom.has(fromEl.id)) {
98525
- continue;
98526
- }
98527
- for (const toEl of toElements) {
98528
- if (usedTo.has(toEl.id)) {
98529
- continue;
98530
- }
98531
- if (Math.abs(fromEl.x - toEl.x) <= SAME_BOX_TOLERANCE_PX && Math.abs(fromEl.y - toEl.y) <= SAME_BOX_TOLERANCE_PX && Math.abs(fromEl.width - toEl.width) <= SAME_BOX_TOLERANCE_PX && Math.abs(fromEl.height - toEl.height) <= SAME_BOX_TOLERANCE_PX) {
98532
- pairs2.push({ fromElement: fromEl, toElement: toEl });
98533
- usedFrom.add(fromEl.id);
98534
- usedTo.add(toEl.id);
98535
- break;
98536
- }
98537
- }
98538
- }
98539
98579
  const unmatchedFrom = fromElements.filter((el) => !usedFrom.has(el.id));
98540
98580
  const unmatchedTo = toElements.filter((el) => !usedTo.has(el.id));
98541
98581
  return { pairs: pairs2, unmatchedFrom, unmatchedTo };
@@ -98860,9 +98900,13 @@ function shortestRotationTarget(fromDeg, toDeg) {
98860
98900
  let delta = (toDeg - fromDeg) % 360;
98861
98901
  if (delta > 180) {
98862
98902
  delta -= 360;
98863
- } else if (delta <= -180) {
98903
+ } else if (delta < -180) {
98864
98904
  delta += 360;
98865
98905
  }
98906
+ if (Math.abs(Math.abs(delta) - 180) < 1e-9) {
98907
+ const start = (fromDeg % 360 + 360) % 360;
98908
+ delta = start >= 90 && start < 270 ? 180 : -180;
98909
+ }
98866
98910
  return fromDeg + delta;
98867
98911
  }
98868
98912
  function staticTransformSuffix(el) {
@@ -98872,20 +98916,29 @@ function staticTransformSuffix(el) {
98872
98916
  function generateUnmatchedFadeOutAnimations(elements, durationMs, startIndex) {
98873
98917
  return elements.map((el, i) => {
98874
98918
  const safeName = `pptx-morph-fadeout-${startIndex + i}-${el.id.replace(/[^a-zA-Z0-9]/gu, "")}`;
98919
+ const transform = ` transform: scale(1)${staticTransformSuffix(el)};`;
98875
98920
  const keyframes = `
98876
98921
  @keyframes ${safeName} {
98877
- from {
98922
+ 0% {
98878
98923
  opacity: ${el.opacity ?? 1};
98879
- transform: scale(1)${staticTransformSuffix(el)};
98924
+ ${transform}
98880
98925
  }
98881
- to {
98926
+ ${MORPH_FADE_OUT_HOLD_PERCENT}% {
98927
+ opacity: ${el.opacity ?? 1};
98928
+ ${transform}
98929
+ }
98930
+ ${MORPH_FADE_OUT_END_PERCENT}% {
98931
+ opacity: 0;
98932
+ ${transform}
98933
+ }
98934
+ 100% {
98882
98935
  opacity: 0;
98883
- transform: scale(0.95)${staticTransformSuffix(el)};
98936
+ ${transform}
98884
98937
  }
98885
98938
  }`;
98886
98939
  return {
98887
98940
  elementId: el.id,
98888
- animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
98941
+ animation: `${safeName} ${durationMs}ms linear forwards`,
98889
98942
  keyframes
98890
98943
  };
98891
98944
  });
@@ -98893,20 +98946,26 @@ function generateUnmatchedFadeOutAnimations(elements, durationMs, startIndex) {
98893
98946
  function generateUnmatchedFadeInAnimations(elements, durationMs, startIndex) {
98894
98947
  return elements.map((el, i) => {
98895
98948
  const safeName = `pptx-morph-fadein-${startIndex + i}-${el.id.replace(/[^a-zA-Z0-9]/gu, "")}`;
98949
+ const transform = ` transform: scale(1)${staticTransformSuffix(el)};`;
98896
98950
  const keyframes = `
98897
98951
  @keyframes ${safeName} {
98898
- from {
98952
+ 0% {
98899
98953
  opacity: 0;
98900
- transform: scale(0.95)${staticTransformSuffix(el)};
98954
+ ${transform}
98901
98955
  }
98902
- to {
98956
+ ${MORPH_FADE_IN_START_PERCENT}% {
98957
+ opacity: 0;
98958
+ animation-timing-function: ${MORPH_FADE_IN_EASING};
98959
+ ${transform}
98960
+ }
98961
+ 100% {
98903
98962
  opacity: ${el.opacity ?? 1};
98904
- transform: scale(1)${staticTransformSuffix(el)};
98963
+ ${transform}
98905
98964
  }
98906
98965
  }`;
98907
98966
  return {
98908
98967
  elementId: el.id,
98909
- animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
98968
+ animation: `${safeName} ${durationMs}ms linear forwards`,
98910
98969
  keyframes
98911
98970
  };
98912
98971
  });
@@ -98980,7 +99039,7 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = "object
98980
99039
  return void 0;
98981
99040
  }
98982
99041
  const animations = generateFullMorphTransition(fromSlide, toSlide, durationMs, mode);
98983
- const outgoingElements = flattenMorphElements(fromSlide.elements);
99042
+ const outgoingElements = flattenMorphElements(fromSlide.elements, toSlide.elements);
98984
99043
  const outgoingIds = new Set(outgoingElements.map((element) => element.id));
98985
99044
  const incomingAnimations = /* @__PURE__ */ new Map();
98986
99045
  const outgoingAnimations = /* @__PURE__ */ new Map();
@@ -108183,6 +108242,34 @@ var SHORTCUT_REFERENCE_ITEMS = VIEWER_SHORTCUT_REFERENCE;
108183
108242
  function shouldLoopContinuously(input) {
108184
108243
  return Boolean(input.loopContinuously) || input.showType === "kiosk";
108185
108244
  }
108245
+ function resolveAutoAdvanceDelayMs(slide, options) {
108246
+ if (options?.useTimings === false) {
108247
+ return void 0;
108248
+ }
108249
+ const advanceAfterMs = slide?.transition?.advanceAfterMs;
108250
+ if (typeof advanceAfterMs !== "number" || !Number.isFinite(advanceAfterMs) || advanceAfterMs < 0) {
108251
+ return void 0;
108252
+ }
108253
+ return advanceAfterMs;
108254
+ }
108255
+ var PRESENTATION_INERT_CLICK_SELECTOR = 'a, button, input, select, textarea, video, audio, [data-pptx-action], [role="dialog"]';
108256
+ function isInertMedia(node) {
108257
+ return (node.tagName === "VIDEO" || node.tagName === "AUDIO") && !node.controls;
108258
+ }
108259
+ function isPresentationAdvanceClick(target) {
108260
+ if (typeof Element === "undefined" || !(target instanceof Element)) {
108261
+ return false;
108262
+ }
108263
+ for (let node = target; node !== null; node = node.parentElement) {
108264
+ if (isInertMedia(node)) {
108265
+ continue;
108266
+ }
108267
+ if (node.matches(PRESENTATION_INERT_CLICK_SELECTOR)) {
108268
+ return false;
108269
+ }
108270
+ }
108271
+ return true;
108272
+ }
108186
108273
  function applyRehearsalTimings(slides, timings) {
108187
108274
  return slides.map((slide, index) => {
108188
108275
  const advanceAfterMs = timings[index];
@@ -111124,6 +111211,7 @@ exports.isLastSlide = isLastSlide;
111124
111211
  exports.isMixedContentBlocked = isMixedContentBlocked;
111125
111212
  exports.isMobileViewport = isMobileViewport;
111126
111213
  exports.isPpactionUrl = isPpactionUrl;
111214
+ exports.isPresentationAdvanceClick = isPresentationAdvanceClick;
111127
111215
  exports.isPresentationSessionMessage = isPresentationSessionMessage;
111128
111216
  exports.isTemplateElement = isTemplateElement;
111129
111217
  exports.isTemplateElementId = isTemplateElementId2;
@@ -111198,6 +111286,7 @@ exports.reorderSmartArtNode = reorderSmartArtNode;
111198
111286
  exports.rerouteConnectorsForMovedElements = rerouteConnectorsForMovedElements;
111199
111287
  exports.resetPresenterTimer = resetPresenterTimer;
111200
111288
  exports.resolveAudienceScreenPlacement = resolveAudienceScreenPlacement;
111289
+ exports.resolveAutoAdvanceDelayMs = resolveAutoAdvanceDelayMs;
111201
111290
  exports.resolveCssTextAlign = resolveCssTextAlign;
111202
111291
  exports.resolveDrawingShapeNodeId = resolveDrawingShapeNodeId;
111203
111292
  exports.resolveFontForScript = resolveFontForScript;
Binary file
Binary file
@@ -1,6 +1,6 @@
1
- import { cloneHistorySnapshot, MAX_ZOOM_SCALE, MIN_ZOOM_SCALE, MIN_ELEMENT_SIZE, ZOOM_TO_SELECTION_PADDING, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, partitionTemplateElements, UNGROUPED_SECTION_ID, stopAllPersistentAudio, buildSaveSlides, DEFAULT_TABLE_ROWS, DEFAULT_TABLE_COLUMNS, executeMediaCommand, buildPdfFromImageData, buildNotesPdf, EMU_PER_PX, GRID_SIZE, DEFAULT_TEXT_FONT_SIZE } from './chunk-IGKLB7NQ.mjs';
1
+ import { cloneHistorySnapshot, MAX_ZOOM_SCALE, MIN_ZOOM_SCALE, MIN_ELEMENT_SIZE, ZOOM_TO_SELECTION_PADDING, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, partitionTemplateElements, UNGROUPED_SECTION_ID, stopAllPersistentAudio, buildSaveSlides, DEFAULT_TABLE_ROWS, DEFAULT_TABLE_COLUMNS, executeMediaCommand, buildPdfFromImageData, buildNotesPdf, EMU_PER_PX, GRID_SIZE, DEFAULT_TEXT_FONT_SIZE } from './chunk-AHPZGUL7.mjs';
2
2
  import { translationsEn } from './chunk-Z6HIZWIQ.mjs';
3
- import { TOOLBAR_TABS, computeVirtualRange, DEFAULT_VIRTUAL_OVERSCAN, BROADCAST_THROTTLE_MS, createSyncGate, clearLocalAwareness, validateRoomId, createDepartureChannel, resolveTransportForServerUrl, isMixedContentBlocked, CONNECTION_TIMEOUT_MS, registerCollaborationTeardown, sanitizeColor, cloneTemplateElementsBySlideId, cloneSlide, PresentationAnimationController, computeEntranceAnimationDelay, PRESENTATION_HASH, PRESENTATION_NONCE_KEY, PRESENTATION_CHANNEL_NAME, swapPresentationWindows, PRESENTATION_MESSAGE_ORIGIN, clearAudienceContent, buildPresentationAudienceUrl, resolveAudienceScreenPlacement, placeAudienceWindow, storeAudienceContent, isPresentationSessionMessage, endAudienceDisplay, createPresentationKeyBuffer, acceptsPresentationInput, buildMorphTransitionPlan, morphOptionToMode, createCollaborationLivePatcher, publishLiveInlineText, PptxHandler, collectMediaElements, collectImagePaths, buildInitialGuides, EncryptedFileError, saveAutosaveSnapshot, isTemplateElementId, hasShapeProperties, hasTextProperties, getInlineEditorSelection, applyStyleToSelectedSegments, setPendingSelectionRestore, applyCaseTransformToSegments, transformTextCase, addSection, renameSection, deleteSection, moveSectionUp, moveSectionDown, moveSlidesToSection, normalizeColorsForCapture, preprocessCssForCapture, downloadBlob, sanitizeDownloadFilename, slideProgressPercent, slideStatusLabel, EXPORT_ASSEMBLING_PERCENT, EXPORT_DONE_PERCENT, isExportAbortError, recordProgressPercent, applyThemeToData, THEME_PRESETS, themeColorSchemesEqual, comparePresentation, applyAcceptSlide, applyAcceptAllSlides, collectUsedFonts, detectTouchDevice, detectOrientation, isMobileViewport, MOBILE_BREAKPOINT, TABLET_BREAKPOINT, mayLeaveSlideShow, remapTextToSegments, guidePxToEmu, shouldLoopContinuously, applyRehearsalTimings, copyFormatFromElement, applyFormatToElement, createViewerOptionsStore, readSlidesFromYDoc, reconcileSlidesInYDoc, LOCAL_SYNC_ORIGIN, observeYDocSlides, shouldAutoFollowBroadcaster, createTouchGestureRecognizer, isKeyboardOpen, openPptxFile, readBackstageRecentFile, isActionHidden, buildElementClipboardPayload, generatePackageReadme, groupElements, generateElementId, makeCloneId, alignElements, distributeElements, bringForward, sendBackward, bringToFront, sendToBack, newTableElement, createDefaultChartElement, readViewportMetrics, computeKeyboardInset, mergeShapes, derivePresenceList, mapPresentationKey, buildPrintDocument, buildOutlineHtml, buildSlidesHtml, buildNotesHtml, buildHandoutsHtml, createBlankSlide, makeSlideId, buildThemeColorMap, reResolveSlideColors, createPresentationSessionId, resolveTransitionDurationMs, isUrlSafe, createPresenterTimer, createInitialPresentationSnapshot, mergePresentationSnapshot, presenterElapsed, stepPresenterZoom, resetPresenterTimer, togglePresenterTimer, canvasToJpegData, downloadDataUrl, pickSupportedMimeType, WEBM_MIME_CANDIDATES, fpsToFrameIntervalMs, segmentFrameCount, encodeGif, groupSlidesBySection, hasCopyableFormat, createBackstagePresentation, cloneElementForPaste, computeScrollDelta, getPresetShapeClipPath, svgPathToPolygons, polygonsToSvgPath, rerouteConnectorsForMovedElements, applyReroutedConnectors, SvgExporter, buildPrintHtmlDocument, deleteTableColumn, rebuildTableStructureInRawXml, insertTableColumn, deleteTableRow, insertTableRow, updateCellTextStyleInRawXml, updateCellTextInRawXml, splitCell, updateMergeAttrsInRawXml, mergeCells, isPpactionUrl, parsePpactionUrl, safeOpenUrl, ACTION_BUTTON_PRESETS, elementActionToPptxAction, buildSmartArtPresetData, computeSnapToShape, publishLiveGeometry, computeMarqueeHitIds, mergeAdditiveSelection, applyResize, snapBoxToGrid } from './chunk-WH46JCNF.mjs';
3
+ import { TOOLBAR_TABS, computeVirtualRange, DEFAULT_VIRTUAL_OVERSCAN, BROADCAST_THROTTLE_MS, createSyncGate, clearLocalAwareness, validateRoomId, createDepartureChannel, resolveTransportForServerUrl, isMixedContentBlocked, CONNECTION_TIMEOUT_MS, registerCollaborationTeardown, sanitizeColor, cloneTemplateElementsBySlideId, cloneSlide, PresentationAnimationController, computeEntranceAnimationDelay, PRESENTATION_HASH, PRESENTATION_NONCE_KEY, PRESENTATION_CHANNEL_NAME, swapPresentationWindows, PRESENTATION_MESSAGE_ORIGIN, clearAudienceContent, buildPresentationAudienceUrl, resolveAudienceScreenPlacement, placeAudienceWindow, storeAudienceContent, isPresentationSessionMessage, endAudienceDisplay, createPresentationKeyBuffer, acceptsPresentationInput, resolveAutoAdvanceDelayMs, buildMorphTransitionPlan, morphOptionToMode, createCollaborationLivePatcher, publishLiveInlineText, PptxHandler, collectMediaElements, collectImagePaths, buildInitialGuides, EncryptedFileError, saveAutosaveSnapshot, isTemplateElementId, hasShapeProperties, hasTextProperties, getInlineEditorSelection, applyStyleToSelectedSegments, setPendingSelectionRestore, applyCaseTransformToSegments, transformTextCase, addSection, renameSection, deleteSection, moveSectionUp, moveSectionDown, moveSlidesToSection, normalizeColorsForCapture, preprocessCssForCapture, downloadBlob, sanitizeDownloadFilename, slideProgressPercent, slideStatusLabel, EXPORT_ASSEMBLING_PERCENT, EXPORT_DONE_PERCENT, isExportAbortError, recordProgressPercent, applyThemeToData, THEME_PRESETS, themeColorSchemesEqual, comparePresentation, applyAcceptSlide, applyAcceptAllSlides, collectUsedFonts, detectTouchDevice, detectOrientation, isMobileViewport, MOBILE_BREAKPOINT, TABLET_BREAKPOINT, mayLeaveSlideShow, remapTextToSegments, guidePxToEmu, shouldLoopContinuously, applyRehearsalTimings, copyFormatFromElement, applyFormatToElement, createViewerOptionsStore, readSlidesFromYDoc, reconcileSlidesInYDoc, LOCAL_SYNC_ORIGIN, observeYDocSlides, shouldAutoFollowBroadcaster, createTouchGestureRecognizer, isKeyboardOpen, openPptxFile, readBackstageRecentFile, isActionHidden, buildElementClipboardPayload, generatePackageReadme, groupElements, generateElementId, makeCloneId, alignElements, distributeElements, bringForward, sendBackward, bringToFront, sendToBack, newTableElement, createDefaultChartElement, readViewportMetrics, computeKeyboardInset, mergeShapes, derivePresenceList, mapPresentationKey, buildPrintDocument, buildOutlineHtml, buildSlidesHtml, buildNotesHtml, buildHandoutsHtml, createBlankSlide, makeSlideId, buildThemeColorMap, reResolveSlideColors, createPresentationSessionId, resolveTransitionDurationMs, isUrlSafe, createPresenterTimer, createInitialPresentationSnapshot, mergePresentationSnapshot, presenterElapsed, stepPresenterZoom, resetPresenterTimer, togglePresenterTimer, canvasToJpegData, downloadDataUrl, pickSupportedMimeType, WEBM_MIME_CANDIDATES, fpsToFrameIntervalMs, segmentFrameCount, encodeGif, groupSlidesBySection, hasCopyableFormat, createBackstagePresentation, cloneElementForPaste, computeScrollDelta, getPresetShapeClipPath, svgPathToPolygons, polygonsToSvgPath, rerouteConnectorsForMovedElements, applyReroutedConnectors, SvgExporter, buildPrintHtmlDocument, deleteTableColumn, rebuildTableStructureInRawXml, insertTableColumn, deleteTableRow, insertTableRow, updateCellTextStyleInRawXml, updateCellTextInRawXml, splitCell, updateMergeAttrsInRawXml, mergeCells, isPpactionUrl, parsePpactionUrl, safeOpenUrl, ACTION_BUTTON_PRESETS, elementActionToPptxAction, buildSmartArtPresetData, computeSnapToShape, publishLiveGeometry, computeMarqueeHitIds, mergeAdditiveSelection, applyResize, snapBoxToGrid } from './chunk-VH2QF5CT.mjs';
4
4
  import { useRef, useState, useEffect, useCallback, useMemo, useSyncExternalStore, useImperativeHandle } from 'react';
5
5
  import JSZip from 'jszip';
6
6
  import { useTranslation } from 'react-i18next';
@@ -1882,20 +1882,13 @@ function useSlideNavigation(input) {
1882
1882
  });
1883
1883
  const scheduleAutoAdvanceForSlide = useCallback(
1884
1884
  (slideIndex) => {
1885
- if (useTimings === false) {
1885
+ const delayMs = resolveAutoAdvanceDelayMs(slides[slideIndex], { useTimings });
1886
+ if (delayMs === void 0) {
1886
1887
  return;
1887
1888
  }
1888
- const slide = slides[slideIndex];
1889
- const advanceAfterMs = slide?.transition?.advanceAfterMs;
1890
- if (typeof advanceAfterMs !== "number" || !Number.isFinite(advanceAfterMs) || advanceAfterMs < 0) {
1891
- return;
1892
- }
1893
- const timer = window.setTimeout(
1894
- () => {
1895
- movePresentationSlideRef.current(1);
1896
- },
1897
- Math.max(0, advanceAfterMs)
1898
- );
1889
+ const timer = window.setTimeout(() => {
1890
+ movePresentationSlideRef.current(1);
1891
+ }, delayMs);
1899
1892
  presentationTimersRef.current.push(timer);
1900
1893
  },
1901
1894
  [slides, presentationTimersRef, useTimings]
Binary file
Binary file
@@ -1,4 +1,4 @@
1
- import { ThemePresets, PptxMarkdownConverter } from './chunk-WH46JCNF.mjs';
1
+ import { ThemePresets, PptxMarkdownConverter } from './chunk-VH2QF5CT.mjs';
2
2
  import { __export } from './chunk-XGB3TDIC.mjs';
3
3
  import * as mcp from 'pptx-viewer-mcp';
4
4
  import * as mcpSchemas from 'pptx-viewer-mcp/schemas';
Binary file
Binary file