pptx-react-viewer 2.6.7 → 2.7.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 (99) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/{AiChatPanel-I22AHEBC.js → AiChatPanel-SRKOMEW6.js} +22 -22
  3. package/dist/AiChatPanel-SRKOMEW6.js.br +0 -0
  4. package/dist/AiChatPanel-SRKOMEW6.js.gz +0 -0
  5. package/dist/{AiChatPanel-E5PVW4MN.mjs → AiChatPanel-YAYQ5KUT.mjs} +3 -3
  6. package/dist/AiChatPanel-YAYQ5KUT.mjs.br +0 -0
  7. package/dist/AiChatPanel-YAYQ5KUT.mjs.gz +0 -0
  8. package/dist/{Model3DScene-UYOY6QJN.mjs → Model3DScene-HYMOPMAM.mjs} +1 -1
  9. package/dist/Model3DScene-HYMOPMAM.mjs.br +0 -0
  10. package/dist/Model3DScene-HYMOPMAM.mjs.gz +0 -0
  11. package/dist/{Model3DScene-VC3HMMBO.js → Model3DScene-ONKC5Z6A.js} +2 -2
  12. package/dist/Model3DScene-ONKC5Z6A.js.br +0 -0
  13. package/dist/Model3DScene-ONKC5Z6A.js.gz +0 -0
  14. package/dist/{SurfaceChart3DScene-PDULQ4DY.mjs → SurfaceChart3DScene-B3FK4Q2U.mjs} +1 -1
  15. package/dist/SurfaceChart3DScene-B3FK4Q2U.mjs.br +0 -0
  16. package/dist/SurfaceChart3DScene-B3FK4Q2U.mjs.gz +0 -0
  17. package/dist/{SurfaceChart3DScene-YMRRZC5V.js → SurfaceChart3DScene-YJFWGG5L.js} +2 -2
  18. package/dist/SurfaceChart3DScene-YJFWGG5L.js.br +0 -0
  19. package/dist/SurfaceChart3DScene-YJFWGG5L.js.gz +0 -0
  20. package/dist/{chunk-CKERNV36.mjs → chunk-2UCJYJUS.mjs} +15 -9
  21. package/dist/chunk-2UCJYJUS.mjs.br +0 -0
  22. package/dist/chunk-2UCJYJUS.mjs.gz +0 -0
  23. package/dist/{chunk-5XXNNTE2.js → chunk-BVK7K74O.js} +851 -845
  24. package/dist/chunk-BVK7K74O.js.br +0 -0
  25. package/dist/chunk-BVK7K74O.js.gz +0 -0
  26. package/dist/{chunk-AB4WM3RK.js → chunk-GRW7HM6X.js} +236 -236
  27. package/dist/chunk-GRW7HM6X.js.br +0 -0
  28. package/dist/chunk-GRW7HM6X.js.gz +0 -0
  29. package/dist/{chunk-LR546YFN.mjs → chunk-HEAJOHLJ.mjs} +178 -46
  30. package/dist/chunk-HEAJOHLJ.mjs.br +0 -0
  31. package/dist/chunk-HEAJOHLJ.mjs.gz +0 -0
  32. package/dist/{chunk-Y6WE6JJO.mjs → chunk-HQGLKAIY.mjs} +2 -2
  33. package/dist/chunk-HQGLKAIY.mjs.br +0 -0
  34. package/dist/chunk-HQGLKAIY.mjs.gz +0 -0
  35. package/dist/{chunk-B7DXNZPM.mjs → chunk-IDK6XECR.mjs} +2 -2
  36. package/dist/chunk-IDK6XECR.mjs.br +0 -0
  37. package/dist/{chunk-B7DXNZPM.mjs.gz → chunk-IDK6XECR.mjs.gz} +0 -0
  38. package/dist/{chunk-C4JFU2XG.js → chunk-JEIMWRKF.js} +315 -315
  39. package/dist/chunk-JEIMWRKF.js.br +0 -0
  40. package/dist/chunk-JEIMWRKF.js.gz +0 -0
  41. package/dist/{chunk-TJFZ7ZP6.js → chunk-JVE7BZ25.js} +3 -3
  42. package/dist/chunk-JVE7BZ25.js.br +0 -0
  43. package/dist/chunk-JVE7BZ25.js.gz +0 -0
  44. package/dist/{chunk-QOWFOMZP.js → chunk-LYS44KMG.js} +178 -46
  45. package/dist/chunk-LYS44KMG.js.br +0 -0
  46. package/dist/chunk-LYS44KMG.js.gz +0 -0
  47. package/dist/{chunk-5QS6ANI7.mjs → chunk-N7EZIKF4.mjs} +1 -1
  48. package/dist/chunk-N7EZIKF4.mjs.br +0 -0
  49. package/dist/chunk-N7EZIKF4.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.js +78 -78
  57. package/dist/internals.js.br +0 -0
  58. package/dist/internals.js.gz +0 -0
  59. package/dist/internals.mjs +3 -3
  60. package/dist/internals.mjs.br +0 -0
  61. package/dist/internals.mjs.gz +0 -0
  62. package/dist/viewer/index.js +21 -21
  63. package/dist/viewer/index.js.br +0 -0
  64. package/dist/viewer/index.js.gz +0 -0
  65. package/dist/viewer/index.mjs +5 -5
  66. package/dist/viewer/index.mjs.br +0 -0
  67. package/dist/viewer/index.mjs.gz +0 -0
  68. package/package.json +1 -1
  69. package/dist/AiChatPanel-E5PVW4MN.mjs.br +0 -0
  70. package/dist/AiChatPanel-E5PVW4MN.mjs.gz +0 -0
  71. package/dist/AiChatPanel-I22AHEBC.js.br +0 -0
  72. package/dist/AiChatPanel-I22AHEBC.js.gz +0 -0
  73. package/dist/Model3DScene-UYOY6QJN.mjs.br +0 -0
  74. package/dist/Model3DScene-UYOY6QJN.mjs.gz +0 -0
  75. package/dist/Model3DScene-VC3HMMBO.js.br +0 -0
  76. package/dist/Model3DScene-VC3HMMBO.js.gz +0 -0
  77. package/dist/SurfaceChart3DScene-PDULQ4DY.mjs.br +0 -0
  78. package/dist/SurfaceChart3DScene-PDULQ4DY.mjs.gz +0 -0
  79. package/dist/SurfaceChart3DScene-YMRRZC5V.js.br +0 -0
  80. package/dist/SurfaceChart3DScene-YMRRZC5V.js.gz +0 -0
  81. package/dist/chunk-5QS6ANI7.mjs.br +0 -0
  82. package/dist/chunk-5QS6ANI7.mjs.gz +0 -0
  83. package/dist/chunk-5XXNNTE2.js.br +0 -0
  84. package/dist/chunk-5XXNNTE2.js.gz +0 -0
  85. package/dist/chunk-AB4WM3RK.js.br +0 -0
  86. package/dist/chunk-AB4WM3RK.js.gz +0 -0
  87. package/dist/chunk-B7DXNZPM.mjs.br +0 -0
  88. package/dist/chunk-C4JFU2XG.js.br +0 -0
  89. package/dist/chunk-C4JFU2XG.js.gz +0 -0
  90. package/dist/chunk-CKERNV36.mjs.br +0 -0
  91. package/dist/chunk-CKERNV36.mjs.gz +0 -0
  92. package/dist/chunk-LR546YFN.mjs.br +0 -0
  93. package/dist/chunk-LR546YFN.mjs.gz +0 -0
  94. package/dist/chunk-QOWFOMZP.js.br +0 -0
  95. package/dist/chunk-QOWFOMZP.js.gz +0 -0
  96. package/dist/chunk-TJFZ7ZP6.js.br +0 -0
  97. package/dist/chunk-TJFZ7ZP6.js.gz +0 -0
  98. package/dist/chunk-Y6WE6JJO.mjs.br +0 -0
  99. package/dist/chunk-Y6WE6JJO.mjs.gz +0 -0
Binary file
Binary file
@@ -19822,6 +19822,13 @@ function extractChildBehaviourDurationMs(cTn, toArray2) {
19822
19822
  }
19823
19823
  return longest;
19824
19824
  }
19825
+ function isInteractiveSequence(seq) {
19826
+ const cTn = seq["p:cTn"];
19827
+ if (!cTn || String(cTn["@_nodeType"] || "") === "mainSeq") {
19828
+ return false;
19829
+ }
19830
+ return extractTriggerShapeId(cTn) !== void 0;
19831
+ }
19825
19832
  var PptxNativeAnimationService = class {
19826
19833
  /**
19827
19834
  * Parse native OOXML animations from a slide's timing tree.
@@ -20022,6 +20029,9 @@ var PptxNativeAnimationService = class {
20022
20029
  );
20023
20030
  }
20024
20031
  for (const sequence of sequences) {
20032
+ if (isInteractiveSequence(sequence)) {
20033
+ continue;
20034
+ }
20025
20035
  this.walkTimingTree(sequence, animations, trigger, group);
20026
20036
  }
20027
20037
  for (const excl of exclusives) {
@@ -20047,6 +20057,9 @@ var PptxNativeAnimationService = class {
20047
20057
  );
20048
20058
  }
20049
20059
  for (const sequence of directSequences) {
20060
+ if (isInteractiveSequence(sequence)) {
20061
+ continue;
20062
+ }
20050
20063
  this.walkTimingTree(sequence, animations, currentTrigger, group);
20051
20064
  }
20052
20065
  }
@@ -20150,6 +20163,36 @@ var PptxNativeAnimationService = class {
20150
20163
  }
20151
20164
  return void 0;
20152
20165
  }
20166
+ /**
20167
+ * Collect every interactive `p:seq` reachable from `node`.
20168
+ *
20169
+ * Interactive sequences are normally siblings of the main sequence under the
20170
+ * root `p:par`, but a deck may nest one deeper. The generic walk skips every
20171
+ * sequence {@link isInteractiveSequence} matches, so this collector has to
20172
+ * reach exactly the same set or those effects would be dropped entirely.
20173
+ * Collection stops at an interactive sequence: its own subtree is walked by
20174
+ * {@link parseInteractiveSequences} under that sequence's trigger shape.
20175
+ */
20176
+ collectInteractiveSequences(node, found) {
20177
+ const containers = [];
20178
+ const cTn = node["p:cTn"];
20179
+ const childTnList = cTn?.["p:childTnLst"];
20180
+ if (childTnList) {
20181
+ containers.push(
20182
+ ...ensureArray5(childTnList["p:par"]),
20183
+ ...ensureArray5(childTnList["p:seq"]),
20184
+ ...ensureArray5(childTnList["p:excl"])
20185
+ );
20186
+ }
20187
+ containers.push(...ensureArray5(node["p:par"]), ...ensureArray5(node["p:seq"]));
20188
+ for (const container of containers) {
20189
+ if (isInteractiveSequence(container)) {
20190
+ found.push(container);
20191
+ continue;
20192
+ }
20193
+ this.collectInteractiveSequences(container, found);
20194
+ }
20195
+ }
20153
20196
  /**
20154
20197
  * Parse interactive sequences from the root `p:par` node.
20155
20198
  *
@@ -20160,25 +20203,11 @@ var PptxNativeAnimationService = class {
20160
20203
  * See ISO/IEC 29500-1 S19.5.60 (CT_TLTimeNodeSequence).
20161
20204
  */
20162
20205
  parseInteractiveSequences(rootPar, animations) {
20163
- const rootCTn = rootPar["p:cTn"];
20164
- if (!rootCTn) {
20165
- return;
20166
- }
20167
- const childTnList = rootCTn["p:childTnLst"];
20168
- if (!childTnList) {
20169
- return;
20170
- }
20171
- const sequences = ensureArray5(childTnList["p:seq"]);
20206
+ const sequences = [];
20207
+ this.collectInteractiveSequences(rootPar, sequences);
20172
20208
  for (const seq of sequences) {
20173
20209
  const seqCTn = seq["p:cTn"];
20174
- if (!seqCTn) {
20175
- continue;
20176
- }
20177
- const nodeType = String(seqCTn["@_nodeType"] || "");
20178
- if (nodeType === "mainSeq") {
20179
- continue;
20180
- }
20181
- const triggerShapeId = extractTriggerShapeId(seqCTn);
20210
+ const triggerShapeId = seqCTn ? extractTriggerShapeId(seqCTn) : void 0;
20182
20211
  if (!triggerShapeId) {
20183
20212
  continue;
20184
20213
  }
@@ -44631,7 +44660,7 @@ function applySeriesDataLabelsToXml(seriesNode, dataLabels, getLocalName2) {
44631
44660
  const dLblsKey = findKey13(seriesNode, "dLbls", getLocalName2);
44632
44661
  const labels = dataLabels ?? [];
44633
44662
  const existingByIdx = /* @__PURE__ */ new Map();
44634
- let groupChildren = [];
44663
+ let groupChildren2 = [];
44635
44664
  if (dLblsKey) {
44636
44665
  const dLbls = seriesNode[dLblsKey];
44637
44666
  const dLblKey = findKey13(dLbls, "dLbl", getLocalName2);
@@ -44646,9 +44675,9 @@ function applySeriesDataLabelsToXml(seriesNode, dataLabels, getLocalName2) {
44646
44675
  }
44647
44676
  }
44648
44677
  }
44649
- groupChildren = Object.keys(dLbls).filter((k) => getLocalName2(k) !== "dLbl").map((k) => [k, dLbls[k]]);
44678
+ groupChildren2 = Object.keys(dLbls).filter((k) => getLocalName2(k) !== "dLbl").map((k) => [k, dLbls[k]]);
44650
44679
  }
44651
- if (labels.length === 0 && groupChildren.length === 0) {
44680
+ if (labels.length === 0 && groupChildren2.length === 0) {
44652
44681
  if (dLblsKey) {
44653
44682
  delete seriesNode[dLblsKey];
44654
44683
  }
@@ -44659,7 +44688,7 @@ function applySeriesDataLabelsToXml(seriesNode, dataLabels, getLocalName2) {
44659
44688
  if (built.length > 0) {
44660
44689
  newDLbls["c:dLbl"] = built.length === 1 ? built[0] : built;
44661
44690
  }
44662
- const ordered32 = [...groupChildren].sort((a, b) => {
44691
+ const ordered32 = [...groupChildren2].sort((a, b) => {
44663
44692
  const ai = DLBLS_GROUP_ORDER.indexOf(getLocalName2(a[0]));
44664
44693
  const bi = DLBLS_GROUP_ORDER.indexOf(getLocalName2(b[0]));
44665
44694
  return (ai === -1 ? DLBLS_GROUP_ORDER.length : ai) - (bi === -1 ? DLBLS_GROUP_ORDER.length : bi);
@@ -98266,6 +98295,10 @@ function interpolateOutline(from, to, t) {
98266
98295
  return parts.join(" ");
98267
98296
  }
98268
98297
  var MORPH_EASING = "cubic-bezier(0.4, 0, 0.2, 1)";
98298
+ var MORPH_FADE_OUT_HOLD_PERCENT = 4;
98299
+ var MORPH_FADE_OUT_END_PERCENT = 23;
98300
+ var MORPH_FADE_IN_START_PERCENT = 42;
98301
+ var MORPH_FADE_IN_EASING = "cubic-bezier(0, 0, 0.35, 1)";
98269
98302
  var PROXIMITY_THRESHOLD = 300;
98270
98303
  var PROXIMITY_SIZE_RATIO_LIMIT = 2;
98271
98304
  var GEOMETRY_MORPH_STEPS = 8;
@@ -98342,6 +98375,67 @@ function getElementMorphName(element) {
98342
98375
  }
98343
98376
  return void 0;
98344
98377
  }
98378
+ function groupChildren(element) {
98379
+ if (element.type !== "group") {
98380
+ return void 0;
98381
+ }
98382
+ const children8 = element.children;
98383
+ return Array.isArray(children8) && children8.length > 0 ? children8 : void 0;
98384
+ }
98385
+ function containsMorphNamedDescendant(element) {
98386
+ const children8 = groupChildren(element);
98387
+ if (!children8) {
98388
+ return false;
98389
+ }
98390
+ for (const child22 of children8) {
98391
+ if (getElementMorphName(child22) !== void 0 || containsMorphNamedDescendant(child22)) {
98392
+ return true;
98393
+ }
98394
+ }
98395
+ return false;
98396
+ }
98397
+ function toAbsolute(child22, offsetX, offsetY) {
98398
+ if (offsetX === 0 && offsetY === 0) {
98399
+ return child22;
98400
+ }
98401
+ return { ...child22, x: child22.x + offsetX, y: child22.y + offsetY };
98402
+ }
98403
+ function sameBox(a, b) {
98404
+ 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;
98405
+ }
98406
+ function correspondingGroup(group, candidates) {
98407
+ const morphName = getElementMorphName(group);
98408
+ return candidates.find((candidate) => {
98409
+ if (candidate.type !== "group") {
98410
+ return false;
98411
+ }
98412
+ if (morphName !== void 0 && getElementMorphName(candidate) === morphName) {
98413
+ return true;
98414
+ }
98415
+ if (group.name && candidate.name === group.name) {
98416
+ return true;
98417
+ }
98418
+ return sameBox(group, candidate);
98419
+ });
98420
+ }
98421
+ function flattenMorphElements(elements, counterpart, offsetX = 0, offsetY = 0) {
98422
+ const out = [];
98423
+ for (const element of elements) {
98424
+ const children8 = groupChildren(element);
98425
+ if (children8 && containsMorphNamedDescendant(element)) {
98426
+ const twin = correspondingGroup(element, counterpart);
98427
+ const twinChildren = twin ? groupChildren(twin) ?? [] : void 0;
98428
+ if (twinChildren) {
98429
+ out.push(
98430
+ ...flattenMorphElements(children8, twinChildren, offsetX + element.x, offsetY + element.y)
98431
+ );
98432
+ continue;
98433
+ }
98434
+ }
98435
+ out.push(toAbsolute(element, offsetX, offsetY));
98436
+ }
98437
+ return out;
98438
+ }
98345
98439
  var NV_PR_KEYS = [
98346
98440
  "p:nvSpPr",
98347
98441
  "p:nvPicPr",
@@ -98377,12 +98471,14 @@ function matchMorphElementsFull(fromSlide, toSlide) {
98377
98471
  const pairs2 = [];
98378
98472
  const usedFrom = /* @__PURE__ */ new Set();
98379
98473
  const usedTo = /* @__PURE__ */ new Set();
98380
- for (const fromEl of fromSlide.elements) {
98474
+ const fromElements = flattenMorphElements(fromSlide.elements, toSlide.elements);
98475
+ const toElements = flattenMorphElements(toSlide.elements, fromSlide.elements);
98476
+ for (const fromEl of fromElements) {
98381
98477
  const fromName = getElementMorphName(fromEl);
98382
98478
  if (!fromName) {
98383
98479
  continue;
98384
98480
  }
98385
- for (const toEl of toSlide.elements) {
98481
+ for (const toEl of toElements) {
98386
98482
  if (usedTo.has(toEl.id)) {
98387
98483
  continue;
98388
98484
  }
@@ -98402,7 +98498,7 @@ function matchMorphElementsFull(fromSlide, toSlide) {
98402
98498
  }
98403
98499
  return creationIds.get(el.id);
98404
98500
  };
98405
- for (const fromEl of fromSlide.elements) {
98501
+ for (const fromEl of fromElements) {
98406
98502
  if (usedFrom.has(fromEl.id)) {
98407
98503
  continue;
98408
98504
  }
@@ -98410,7 +98506,7 @@ function matchMorphElementsFull(fromSlide, toSlide) {
98410
98506
  if (!fromGuid) {
98411
98507
  continue;
98412
98508
  }
98413
- for (const toEl of toSlide.elements) {
98509
+ for (const toEl of toElements) {
98414
98510
  if (usedTo.has(toEl.id) || fromEl.type !== toEl.type) {
98415
98511
  continue;
98416
98512
  }
@@ -98422,11 +98518,11 @@ function matchMorphElementsFull(fromSlide, toSlide) {
98422
98518
  }
98423
98519
  }
98424
98520
  }
98425
- for (const fromEl of fromSlide.elements) {
98521
+ for (const fromEl of fromElements) {
98426
98522
  if (usedFrom.has(fromEl.id) || !fromEl.shapeId) {
98427
98523
  continue;
98428
98524
  }
98429
- for (const toEl of toSlide.elements) {
98525
+ for (const toEl of toElements) {
98430
98526
  if (usedTo.has(toEl.id)) {
98431
98527
  continue;
98432
98528
  }
@@ -98441,13 +98537,13 @@ function matchMorphElementsFull(fromSlide, toSlide) {
98441
98537
  }
98442
98538
  }
98443
98539
  }
98444
- for (const fromEl of fromSlide.elements) {
98540
+ for (const fromEl of fromElements) {
98445
98541
  if (usedFrom.has(fromEl.id)) {
98446
98542
  continue;
98447
98543
  }
98448
98544
  let bestMatch = null;
98449
98545
  let bestDist = Infinity;
98450
- for (const toEl of toSlide.elements) {
98546
+ for (const toEl of toElements) {
98451
98547
  if (usedTo.has(toEl.id)) {
98452
98548
  continue;
98453
98549
  }
@@ -98473,8 +98569,8 @@ function matchMorphElementsFull(fromSlide, toSlide) {
98473
98569
  usedTo.add(bestMatch.id);
98474
98570
  }
98475
98571
  }
98476
- const unmatchedFrom = fromSlide.elements.filter((el) => !usedFrom.has(el.id));
98477
- const unmatchedTo = toSlide.elements.filter((el) => !usedTo.has(el.id));
98572
+ const unmatchedFrom = fromElements.filter((el) => !usedFrom.has(el.id));
98573
+ const unmatchedTo = toElements.filter((el) => !usedTo.has(el.id));
98478
98574
  return { pairs: pairs2, unmatchedFrom, unmatchedTo };
98479
98575
  }
98480
98576
  function tokenizeText(element, mode) {
@@ -98721,13 +98817,12 @@ function generateMorphAnimations(pairs2, durationMs, _mode = "object") {
98721
98817
  const sy = Math.max(fromElement.height, 1) / Math.max(toElement.height, 1);
98722
98818
  const fromOpacity = fromElement.opacity ?? 1;
98723
98819
  const toOpacity = toElement.opacity ?? 1;
98724
- const fromRot = fromElement.rotation ?? 0;
98725
98820
  const toRot = toElement.rotation ?? 0;
98821
+ const fromRot = shortestRotationTarget(toRot, fromElement.rotation ?? 0);
98726
98822
  const flips = `${toElement.flipHorizontal ? " scaleX(-1)" : ""}${toElement.flipVertical ? " scaleY(-1)" : ""}`;
98727
- const crossfades = morphPairNeedsCrossfade(fromElement, toElement);
98728
98823
  const fromProps = [
98729
98824
  ` transform: translate(${dx}px, ${dy}px) scale(${sx}, ${sy}) rotate(${fromRot}deg)${flips};`,
98730
- ` opacity: ${crossfades ? 0 : fromOpacity};`
98825
+ ` opacity: ${fromOpacity};`
98731
98826
  ];
98732
98827
  const toProps = [
98733
98828
  ` transform: translate(0, 0) scale(1, 1) rotate(${toRot}deg)${flips};`,
@@ -98771,7 +98866,7 @@ function generateMorphGhostAnimations(pairs2, durationMs, startIndex) {
98771
98866
  const sx = Math.max(toElement.width, 1) / Math.max(fromElement.width, 1);
98772
98867
  const sy = Math.max(toElement.height, 1) / Math.max(fromElement.height, 1);
98773
98868
  const fromRot = fromElement.rotation ?? 0;
98774
- const toRot = toElement.rotation ?? 0;
98869
+ const toRot = shortestRotationTarget(fromRot, toElement.rotation ?? 0);
98775
98870
  const flips = `${fromElement.flipHorizontal ? " scaleX(-1)" : ""}${fromElement.flipVertical ? " scaleY(-1)" : ""}`;
98776
98871
  const keyframes = `
98777
98872
  @keyframes ${safeName} {
@@ -98794,6 +98889,19 @@ function generateMorphGhostAnimations(pairs2, durationMs, startIndex) {
98794
98889
  }
98795
98890
  return animations;
98796
98891
  }
98892
+ function shortestRotationTarget(fromDeg, toDeg) {
98893
+ let delta = (toDeg - fromDeg) % 360;
98894
+ if (delta > 180) {
98895
+ delta -= 360;
98896
+ } else if (delta < -180) {
98897
+ delta += 360;
98898
+ }
98899
+ if (Math.abs(Math.abs(delta) - 180) < 1e-9) {
98900
+ const start = (fromDeg % 360 + 360) % 360;
98901
+ delta = start >= 90 && start < 270 ? 180 : -180;
98902
+ }
98903
+ return fromDeg + delta;
98904
+ }
98797
98905
  function staticTransformSuffix(el) {
98798
98906
  const rot = el.rotation ?? 0;
98799
98907
  return ` rotate(${rot}deg)${el.flipHorizontal ? " scaleX(-1)" : ""}${el.flipVertical ? " scaleY(-1)" : ""}`;
@@ -98801,20 +98909,29 @@ function staticTransformSuffix(el) {
98801
98909
  function generateUnmatchedFadeOutAnimations(elements, durationMs, startIndex) {
98802
98910
  return elements.map((el, i) => {
98803
98911
  const safeName = `pptx-morph-fadeout-${startIndex + i}-${el.id.replace(/[^a-zA-Z0-9]/gu, "")}`;
98912
+ const transform = ` transform: scale(1)${staticTransformSuffix(el)};`;
98804
98913
  const keyframes = `
98805
98914
  @keyframes ${safeName} {
98806
- from {
98915
+ 0% {
98807
98916
  opacity: ${el.opacity ?? 1};
98808
- transform: scale(1)${staticTransformSuffix(el)};
98917
+ ${transform}
98809
98918
  }
98810
- to {
98919
+ ${MORPH_FADE_OUT_HOLD_PERCENT}% {
98920
+ opacity: ${el.opacity ?? 1};
98921
+ ${transform}
98922
+ }
98923
+ ${MORPH_FADE_OUT_END_PERCENT}% {
98811
98924
  opacity: 0;
98812
- transform: scale(0.95)${staticTransformSuffix(el)};
98925
+ ${transform}
98926
+ }
98927
+ 100% {
98928
+ opacity: 0;
98929
+ ${transform}
98813
98930
  }
98814
98931
  }`;
98815
98932
  return {
98816
98933
  elementId: el.id,
98817
- animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
98934
+ animation: `${safeName} ${durationMs}ms linear forwards`,
98818
98935
  keyframes
98819
98936
  };
98820
98937
  });
@@ -98822,20 +98939,26 @@ function generateUnmatchedFadeOutAnimations(elements, durationMs, startIndex) {
98822
98939
  function generateUnmatchedFadeInAnimations(elements, durationMs, startIndex) {
98823
98940
  return elements.map((el, i) => {
98824
98941
  const safeName = `pptx-morph-fadein-${startIndex + i}-${el.id.replace(/[^a-zA-Z0-9]/gu, "")}`;
98942
+ const transform = ` transform: scale(1)${staticTransformSuffix(el)};`;
98825
98943
  const keyframes = `
98826
98944
  @keyframes ${safeName} {
98827
- from {
98945
+ 0% {
98828
98946
  opacity: 0;
98829
- transform: scale(0.95)${staticTransformSuffix(el)};
98947
+ ${transform}
98830
98948
  }
98831
- to {
98949
+ ${MORPH_FADE_IN_START_PERCENT}% {
98950
+ opacity: 0;
98951
+ animation-timing-function: ${MORPH_FADE_IN_EASING};
98952
+ ${transform}
98953
+ }
98954
+ 100% {
98832
98955
  opacity: ${el.opacity ?? 1};
98833
- transform: scale(1)${staticTransformSuffix(el)};
98956
+ ${transform}
98834
98957
  }
98835
98958
  }`;
98836
98959
  return {
98837
98960
  elementId: el.id,
98838
- animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
98961
+ animation: `${safeName} ${durationMs}ms linear forwards`,
98839
98962
  keyframes
98840
98963
  };
98841
98964
  });
@@ -98909,7 +99032,7 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = "object
98909
99032
  return void 0;
98910
99033
  }
98911
99034
  const animations = generateFullMorphTransition(fromSlide, toSlide, durationMs, mode);
98912
- const outgoingElements = [...fromSlide.elements];
99035
+ const outgoingElements = flattenMorphElements(fromSlide.elements, toSlide.elements);
98913
99036
  const outgoingIds = new Set(outgoingElements.map((element) => element.id));
98914
99037
  const incomingAnimations = /* @__PURE__ */ new Map();
98915
99038
  const outgoingAnimations = /* @__PURE__ */ new Map();
@@ -101287,6 +101410,11 @@ var INSTANT = {
101287
101410
  };
101288
101411
  var DEFAULT_TRANSITION_DURATION_MS = 1e3;
101289
101412
  var DEFAULT_MORPH_DURATION_MS = 2e3;
101413
+ var TRANSITION_SPEED_DURATION_MS = {
101414
+ fast: 500,
101415
+ med: 750,
101416
+ slow: 1e3
101417
+ };
101290
101418
  var EASE = "ease-in-out";
101291
101419
  var P14_TRANSITION_KEYFRAMES = `
101292
101420
  /* \u2500\u2500 Conveyor (translate X with staggered timing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
@@ -102497,6 +102625,10 @@ function resolveTransitionDurationMs(transition) {
102497
102625
  if (typeof transition.durationMs === "number" && transition.durationMs > 0) {
102498
102626
  return transition.durationMs;
102499
102627
  }
102628
+ const speedMs = transition.speed ? TRANSITION_SPEED_DURATION_MS[transition.speed] : void 0;
102629
+ if (typeof speedMs === "number") {
102630
+ return speedMs;
102631
+ }
102500
102632
  if (transition.type === "morph") {
102501
102633
  return DEFAULT_MORPH_DURATION_MS;
102502
102634
  }
Binary file
Binary file
@@ -1,5 +1,5 @@
1
1
  import { translationsEn } from './chunk-Z6HIZWIQ.mjs';
2
- import { SHAPE_PRESET_DEFS, computeValueRangeForChart, getAnimationInitialStyle, cloneHistorySnapshot, hasShapeProperties, isTemplateElement, isImageLikeElement, clampCropValue, parseMediaCommand, hasTextProperties, normalizeHexColor, toCssWritingMode, toCssTextOrientation, toCssVerticalDirection, computeAutoFitTextStyle, resolveLineHeight, getKinsokuLineBreakStyles, buildTextBody3DSceneStyle, resolveParagraphRtl, resolveParagraphAlign, resolveCssTextAlign, resolveParagraphStrutFontSize, colorWithOpacity, build3DExtrusionData, getResolvedShapeClipPath, normalizeStrokeDashType, buildCssGradientFromShapeStyle, buildShadowCssFromShapeStyle, buildInnerShadowCssFromShapeStyle, buildMultiLayerShadowCss, buildGlowBoxShadow, getCompoundLineBoxShadow, getSoftEdgeFilterId, getEffectDagFilter, buildPatternFillCss, buildReflectionCss, getCssBorderDashStyle, getCompoundLineBorderWidth, getSvgStrokeDasharray, isCalloutShape, getCalloutLeaderLineGeometry, buildCalloutLeaderLineSvgPath, getCalloutViewBoxBounds, svgLineCap, getCompoundLineOffsets, getCompoundLineWidths, computeSelectionRect, rectToCells, isCellInRect, buildChartViewModel, buildNotesPdfBytes, buildSlidesPdfBytes, buildPreviewAnimation, getRoundRectRadiusPx, substituteFieldText, resolveUnderlineDecorationStyle, getSubstituteFontFamily, hasDistinctScriptFonts, buildTextReflectionCss, getTextAlphaOpacity, buildTextRunFilterChain, buildTextShadowCss, TEXT_BUILD_ID_SEP, buildTextBuildSpec, textBuildSpanStyle, evaluatePresetShape, apply3dEffects, clampUnitInterval, customGeometryPathsToSvgSubpaths, computeColumnBoundaries, parseDrawingColor, parseDrawingColorOpacity, getCellDiagonalBorders, getPatternSvg, ooxmlDashToCssBorderStyle, cell3DBevelCss, getChartStylePalette, computeLayout, valueToY, formatAxisValue, computeLayoutOptions, splitSeriesByAxis, computeValueRange, getSecondaryValueAxis, seriesColor, paletteColor, resolveRegionCode, normalizeValue, sequentialColorScale, convertOmmlToMathMl, sanitizeMathMl, buildTextFillCss, resolvePictureBullet, computeResizedColumnWidths, computeResizedRowHeight, DEFAULT_ROW_HEIGHT, resolveFontRefIdx, tintColor2, shadeColor2, ooxmlGradientAngleToCssDegrees, segmentByScript, resolveFontForScript, generateLogTicks, formatAxisValueWithUnits, getDisplayUnitLabel, hexToRgbChannels, chartPartToAttrs } from './chunk-LR546YFN.mjs';
2
+ import { SHAPE_PRESET_DEFS, computeValueRangeForChart, getAnimationInitialStyle, cloneHistorySnapshot, hasShapeProperties, isTemplateElement, isImageLikeElement, clampCropValue, parseMediaCommand, hasTextProperties, normalizeHexColor, toCssWritingMode, toCssTextOrientation, toCssVerticalDirection, computeAutoFitTextStyle, resolveLineHeight, getKinsokuLineBreakStyles, buildTextBody3DSceneStyle, resolveParagraphRtl, resolveParagraphAlign, resolveCssTextAlign, resolveParagraphStrutFontSize, colorWithOpacity, build3DExtrusionData, getResolvedShapeClipPath, normalizeStrokeDashType, buildCssGradientFromShapeStyle, buildShadowCssFromShapeStyle, buildInnerShadowCssFromShapeStyle, buildMultiLayerShadowCss, buildGlowBoxShadow, getCompoundLineBoxShadow, getSoftEdgeFilterId, getEffectDagFilter, buildPatternFillCss, buildReflectionCss, getCssBorderDashStyle, getCompoundLineBorderWidth, getSvgStrokeDasharray, isCalloutShape, getCalloutLeaderLineGeometry, buildCalloutLeaderLineSvgPath, getCalloutViewBoxBounds, svgLineCap, getCompoundLineOffsets, getCompoundLineWidths, computeSelectionRect, rectToCells, isCellInRect, buildChartViewModel, buildNotesPdfBytes, buildSlidesPdfBytes, buildPreviewAnimation, getRoundRectRadiusPx, substituteFieldText, resolveUnderlineDecorationStyle, getSubstituteFontFamily, hasDistinctScriptFonts, buildTextReflectionCss, getTextAlphaOpacity, buildTextRunFilterChain, buildTextShadowCss, TEXT_BUILD_ID_SEP, buildTextBuildSpec, textBuildSpanStyle, evaluatePresetShape, apply3dEffects, clampUnitInterval, customGeometryPathsToSvgSubpaths, computeColumnBoundaries, parseDrawingColor, parseDrawingColorOpacity, getCellDiagonalBorders, getPatternSvg, ooxmlDashToCssBorderStyle, cell3DBevelCss, getChartStylePalette, computeLayout, valueToY, formatAxisValue, computeLayoutOptions, splitSeriesByAxis, computeValueRange, getSecondaryValueAxis, seriesColor, paletteColor, resolveRegionCode, normalizeValue, sequentialColorScale, convertOmmlToMathMl, sanitizeMathMl, buildTextFillCss, resolvePictureBullet, computeResizedColumnWidths, computeResizedRowHeight, DEFAULT_ROW_HEIGHT, resolveFontRefIdx, tintColor2, shadeColor2, ooxmlGradientAngleToCssDegrees, segmentByScript, resolveFontForScript, generateLogTicks, formatAxisValueWithUnits, getDisplayUnitLabel, hexToRgbChannels, chartPartToAttrs } from './chunk-HEAJOHLJ.mjs';
3
3
  import { clsx } from 'clsx';
4
4
  import { twMerge } from 'tailwind-merge';
5
5
  import React6, { useState, useEffect, useMemo, Suspense, useRef, useCallback, useLayoutEffect } from 'react';
@@ -6287,7 +6287,7 @@ function FailedToLoad() {
6287
6287
  var LazySurfaceChart3DScene = React6.lazy(
6288
6288
  async () => {
6289
6289
  try {
6290
- return await import('./SurfaceChart3DScene-PDULQ4DY.mjs');
6290
+ return await import('./SurfaceChart3DScene-B3FK4Q2U.mjs');
6291
6291
  } catch {
6292
6292
  return { default: FailedToLoad };
6293
6293
  }
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-Y6WE6JJO.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-HQGLKAIY.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-LR546YFN.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-HEAJOHLJ.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';
Binary file