pptx-react-viewer 2.16.0 → 2.16.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 (97) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/{AiChatPanel-VKGWK23E.js → AiChatPanel-OHB6CVLY.js} +22 -22
  3. package/dist/AiChatPanel-OHB6CVLY.js.br +0 -0
  4. package/dist/AiChatPanel-OHB6CVLY.js.gz +0 -0
  5. package/dist/{AiChatPanel-TYU52HDW.mjs → AiChatPanel-UPNVIENY.mjs} +3 -3
  6. package/dist/AiChatPanel-UPNVIENY.mjs.br +0 -0
  7. package/dist/AiChatPanel-UPNVIENY.mjs.gz +0 -0
  8. package/dist/{Model3DScene-TG7OSR6V.js → Model3DScene-7FKWPESH.js} +2 -2
  9. package/dist/{Model3DScene-TG7OSR6V.js.br → Model3DScene-7FKWPESH.js.br} +0 -0
  10. package/dist/Model3DScene-7FKWPESH.js.gz +0 -0
  11. package/dist/{Model3DScene-267BHD5T.mjs → Model3DScene-KEUY3M7X.mjs} +1 -1
  12. package/dist/{Model3DScene-267BHD5T.mjs.br → Model3DScene-KEUY3M7X.mjs.br} +0 -0
  13. package/dist/Model3DScene-KEUY3M7X.mjs.gz +0 -0
  14. package/dist/{SurfaceChart3DScene-RPRVXRQZ.mjs → SurfaceChart3DScene-2MLBPJ63.mjs} +1 -1
  15. package/dist/{SurfaceChart3DScene-RPRVXRQZ.mjs.br → SurfaceChart3DScene-2MLBPJ63.mjs.br} +0 -0
  16. package/dist/SurfaceChart3DScene-2MLBPJ63.mjs.gz +0 -0
  17. package/dist/{SurfaceChart3DScene-GK4JHZAC.js → SurfaceChart3DScene-NPJQXIGW.js} +2 -2
  18. package/dist/SurfaceChart3DScene-NPJQXIGW.js.br +0 -0
  19. package/dist/SurfaceChart3DScene-NPJQXIGW.js.gz +0 -0
  20. package/dist/{chunk-P3Y3OMAD.js → chunk-3NDRTC7T.js} +303 -40
  21. package/dist/chunk-3NDRTC7T.js.br +0 -0
  22. package/dist/{chunk-P3Y3OMAD.js.gz → chunk-3NDRTC7T.js.gz} +0 -0
  23. package/dist/{chunk-VNVURLZM.mjs → chunk-6ROCCY4M.mjs} +14 -9
  24. package/dist/chunk-6ROCCY4M.mjs.br +0 -0
  25. package/dist/chunk-6ROCCY4M.mjs.gz +0 -0
  26. package/dist/{chunk-PILJZ5OE.js → chunk-7UBDMCI7.js} +3 -3
  27. package/dist/chunk-7UBDMCI7.js.br +0 -0
  28. package/dist/chunk-7UBDMCI7.js.gz +0 -0
  29. package/dist/{chunk-GOPIG4VW.js → chunk-DQTTI6D4.js} +348 -344
  30. package/dist/chunk-DQTTI6D4.js.br +0 -0
  31. package/dist/chunk-DQTTI6D4.js.gz +0 -0
  32. package/dist/{chunk-OIITLGKQ.mjs → chunk-ENOHLGJ2.mjs} +298 -40
  33. package/dist/chunk-ENOHLGJ2.mjs.br +0 -0
  34. package/dist/{chunk-OIITLGKQ.mjs.gz → chunk-ENOHLGJ2.mjs.gz} +0 -0
  35. package/dist/{chunk-AX75ONFY.js → chunk-IN7D2T4R.js} +373 -375
  36. package/dist/chunk-IN7D2T4R.js.br +0 -0
  37. package/dist/chunk-IN7D2T4R.js.gz +0 -0
  38. package/dist/{chunk-ULB35HMJ.mjs → chunk-LJZFG6YP.mjs} +1 -1
  39. package/dist/chunk-LJZFG6YP.mjs.br +0 -0
  40. package/dist/chunk-LJZFG6YP.mjs.gz +0 -0
  41. package/dist/{chunk-7W5MCYBN.js → chunk-N6IE34HX.js} +1060 -1055
  42. package/dist/chunk-N6IE34HX.js.br +0 -0
  43. package/dist/chunk-N6IE34HX.js.gz +0 -0
  44. package/dist/{chunk-TWPZJXLC.mjs → chunk-RUK5XZGO.mjs} +11 -7
  45. package/dist/chunk-RUK5XZGO.mjs.br +0 -0
  46. package/dist/chunk-RUK5XZGO.mjs.gz +0 -0
  47. package/dist/{chunk-FFBY2TKD.mjs → chunk-ZOOGEDYG.mjs} +131 -133
  48. package/dist/chunk-ZOOGEDYG.mjs.br +0 -0
  49. package/dist/chunk-ZOOGEDYG.mjs.gz +0 -0
  50. package/dist/index.js +39 -39
  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 +16 -0
  57. package/dist/internals.d.ts.map +1 -1
  58. package/dist/internals.js +78 -78
  59. package/dist/internals.js.br +0 -0
  60. package/dist/internals.js.gz +0 -0
  61. package/dist/internals.mjs +3 -3
  62. package/dist/internals.mjs.br +0 -0
  63. package/dist/internals.mjs.gz +0 -0
  64. package/dist/viewer/index.js +26 -26
  65. package/dist/viewer/index.js.br +0 -0
  66. package/dist/viewer/index.js.gz +0 -0
  67. package/dist/viewer/index.mjs +5 -5
  68. package/dist/viewer/index.mjs.br +0 -0
  69. package/dist/viewer/index.mjs.gz +0 -0
  70. package/package.json +1 -1
  71. package/dist/AiChatPanel-TYU52HDW.mjs.br +0 -0
  72. package/dist/AiChatPanel-TYU52HDW.mjs.gz +0 -0
  73. package/dist/AiChatPanel-VKGWK23E.js.br +0 -0
  74. package/dist/AiChatPanel-VKGWK23E.js.gz +0 -0
  75. package/dist/Model3DScene-267BHD5T.mjs.gz +0 -0
  76. package/dist/Model3DScene-TG7OSR6V.js.gz +0 -0
  77. package/dist/SurfaceChart3DScene-GK4JHZAC.js.br +0 -0
  78. package/dist/SurfaceChart3DScene-GK4JHZAC.js.gz +0 -0
  79. package/dist/SurfaceChart3DScene-RPRVXRQZ.mjs.gz +0 -0
  80. package/dist/chunk-7W5MCYBN.js.br +0 -0
  81. package/dist/chunk-7W5MCYBN.js.gz +0 -0
  82. package/dist/chunk-AX75ONFY.js.br +0 -0
  83. package/dist/chunk-AX75ONFY.js.gz +0 -0
  84. package/dist/chunk-FFBY2TKD.mjs.br +0 -0
  85. package/dist/chunk-FFBY2TKD.mjs.gz +0 -0
  86. package/dist/chunk-GOPIG4VW.js.br +0 -0
  87. package/dist/chunk-GOPIG4VW.js.gz +0 -0
  88. package/dist/chunk-OIITLGKQ.mjs.br +0 -0
  89. package/dist/chunk-P3Y3OMAD.js.br +0 -0
  90. package/dist/chunk-PILJZ5OE.js.br +0 -0
  91. package/dist/chunk-PILJZ5OE.js.gz +0 -0
  92. package/dist/chunk-TWPZJXLC.mjs.br +0 -0
  93. package/dist/chunk-TWPZJXLC.mjs.gz +0 -0
  94. package/dist/chunk-ULB35HMJ.mjs.br +0 -0
  95. package/dist/chunk-ULB35HMJ.mjs.gz +0 -0
  96. package/dist/chunk-VNVURLZM.mjs.br +0 -0
  97. package/dist/chunk-VNVURLZM.mjs.gz +0 -0
@@ -101994,39 +101994,11 @@ function getImageFitStyle(el) {
101994
101994
  if (!isImageLikeElement(el)) {
101995
101995
  return uncropped;
101996
101996
  }
101997
- const frLeft = el.fillRectLeft ?? 0;
101998
- const frTop = el.fillRectTop ?? 0;
101999
- const frRight = el.fillRectRight ?? 0;
102000
- const frBottom = el.fillRectBottom ?? 0;
102001
- const hasFillRect = Math.abs(frLeft) + Math.abs(frTop) + Math.abs(frRight) + Math.abs(frBottom) > 1e-4;
102002
- const placementTransform = hasFillRect ? `translate(${round2(frLeft * 100)}%, ${round2(frTop * 100)}%) scale(${round6(
102003
- Math.max(0.01, 1 - frLeft - frRight)
102004
- )}, ${round6(Math.max(0.01, 1 - frTop - frBottom))})` : "";
102005
- const cropLeft = clampCropValue(el.cropLeft);
102006
- const cropTop = clampCropValue(el.cropTop);
102007
- const cropRight = clampCropValue(el.cropRight);
102008
- const cropBottom = clampCropValue(el.cropBottom);
102009
- const hasCrop = cropLeft + cropRight > 1e-4 || cropTop + cropBottom > 1e-4;
102010
- if (!hasCrop && !hasFillRect) {
101997
+ const { placement, crop } = imageFitTransformParts(el);
101998
+ if (!placement && !crop) {
102011
101999
  return uncropped;
102012
102000
  }
102013
- let cropTransform = "";
102014
- if (hasCrop) {
102015
- const horizontalScale = cropLeft + cropRight >= 0.99 ? 0.99 / (cropLeft + cropRight) : 1;
102016
- const verticalScale = cropTop + cropBottom >= 0.99 ? 0.99 / (cropTop + cropBottom) : 1;
102017
- const left = clampCropValue(cropLeft * horizontalScale);
102018
- const right = clampCropValue(cropRight * horizontalScale);
102019
- const top = clampCropValue(cropTop * verticalScale);
102020
- const bottom = clampCropValue(cropBottom * verticalScale);
102021
- const remainingWidth = Math.max(0.01, 1 - left - right);
102022
- const remainingHeight = Math.max(0.01, 1 - top - bottom);
102023
- const tx = Math.round(-left / remainingWidth * 1e4) / 100;
102024
- const ty = Math.round(-top / remainingHeight * 1e4) / 100;
102025
- const sx = Math.round(1 / remainingWidth * 1e6) / 1e6;
102026
- const sy = Math.round(1 / remainingHeight * 1e6) / 1e6;
102027
- cropTransform = `translate(${tx}%, ${ty}%) scale(${sx}, ${sy})`;
102028
- }
102029
- const transform = [placementTransform, cropTransform].filter(Boolean).join(" ");
102001
+ const transform = [placement, crop].filter(Boolean).join(" ");
102030
102002
  return {
102031
102003
  position: "absolute",
102032
102004
  width: "100%",
@@ -102038,6 +102010,47 @@ function getImageFitStyle(el) {
102038
102010
  transform
102039
102011
  };
102040
102012
  }
102013
+ var IDENTITY_TRANSFORM_PAIR = "translate(0%, 0%) scale(1, 1)";
102014
+ function imageFitTransformParts(el) {
102015
+ if (!isImageLikeElement(el)) {
102016
+ return { placement: "", crop: "" };
102017
+ }
102018
+ const frLeft = el.fillRectLeft ?? 0;
102019
+ const frTop = el.fillRectTop ?? 0;
102020
+ const frRight = el.fillRectRight ?? 0;
102021
+ const frBottom = el.fillRectBottom ?? 0;
102022
+ const hasFillRect = Math.abs(frLeft) + Math.abs(frTop) + Math.abs(frRight) + Math.abs(frBottom) > 1e-4;
102023
+ const placement = hasFillRect ? `translate(${round2(frLeft * 100)}%, ${round2(frTop * 100)}%) scale(${round6(
102024
+ Math.max(0.01, 1 - frLeft - frRight)
102025
+ )}, ${round6(Math.max(0.01, 1 - frTop - frBottom))})` : "";
102026
+ const cropLeft = clampCropValue(el.cropLeft);
102027
+ const cropTop = clampCropValue(el.cropTop);
102028
+ const cropRight = clampCropValue(el.cropRight);
102029
+ const cropBottom = clampCropValue(el.cropBottom);
102030
+ if (cropLeft + cropRight <= 1e-4 && cropTop + cropBottom <= 1e-4) {
102031
+ return { placement, crop: "" };
102032
+ }
102033
+ const horizontalScale = cropLeft + cropRight >= 0.99 ? 0.99 / (cropLeft + cropRight) : 1;
102034
+ const verticalScale = cropTop + cropBottom >= 0.99 ? 0.99 / (cropTop + cropBottom) : 1;
102035
+ const left = clampCropValue(cropLeft * horizontalScale);
102036
+ const right = clampCropValue(cropRight * horizontalScale);
102037
+ const top = clampCropValue(cropTop * verticalScale);
102038
+ const bottom = clampCropValue(cropBottom * verticalScale);
102039
+ const remainingWidth = Math.max(0.01, 1 - left - right);
102040
+ const remainingHeight = Math.max(0.01, 1 - top - bottom);
102041
+ const tx = Math.round(-left / remainingWidth * 1e4) / 100;
102042
+ const ty = Math.round(-top / remainingHeight * 1e4) / 100;
102043
+ const sx = Math.round(1 / remainingWidth * 1e6) / 1e6;
102044
+ const sy = Math.round(1 / remainingHeight * 1e6) / 1e6;
102045
+ return { placement, crop: `translate(${tx}%, ${ty}%) scale(${sx}, ${sy})` };
102046
+ }
102047
+ function buildImageFitTransform(el, padToIdentity = false) {
102048
+ const { placement, crop } = imageFitTransformParts(el);
102049
+ if (!padToIdentity) {
102050
+ return [placement, crop].filter(Boolean).join(" ");
102051
+ }
102052
+ return `${placement || IDENTITY_TRANSFORM_PAIR} ${crop || IDENTITY_TRANSFORM_PAIR}`;
102053
+ }
102041
102054
  function round2(value) {
102042
102055
  return Math.round(value * 100) / 100;
102043
102056
  }
@@ -107783,8 +107796,85 @@ function buildTextRunFilterChain(style) {
107783
107796
  }
107784
107797
  return parts.length > 0 ? parts.join(" ") : void 0;
107785
107798
  }
107786
- var POWERPOINT_METRIC_TRACKING_EM = 3e-3;
107787
- var POWERPOINT_METRIC_TRACKING = `${POWERPOINT_METRIC_TRACKING_EM}em`;
107799
+ var ADVANCE_STEPS_PER_PX = 6;
107800
+ var MAX_CACHE_ENTRIES = 2e4;
107801
+ var measureContext;
107802
+ var advanceCache = /* @__PURE__ */ new Map();
107803
+ var trackingCache = /* @__PURE__ */ new Map();
107804
+ var fontsHookInstalled = false;
107805
+ function installFontLoadHook() {
107806
+ if (fontsHookInstalled || typeof document === "undefined") {
107807
+ return;
107808
+ }
107809
+ fontsHookInstalled = true;
107810
+ document.fonts?.addEventListener?.("loadingdone", () => {
107811
+ advanceCache = /* @__PURE__ */ new Map();
107812
+ trackingCache = /* @__PURE__ */ new Map();
107813
+ });
107814
+ }
107815
+ function getMeasureContext() {
107816
+ if (measureContext !== void 0) {
107817
+ return measureContext;
107818
+ }
107819
+ if (typeof document === "undefined") {
107820
+ measureContext = null;
107821
+ return null;
107822
+ }
107823
+ installFontLoadHook();
107824
+ measureContext = document.createElement("canvas").getContext("2d");
107825
+ return measureContext;
107826
+ }
107827
+ function toCanvasFont(font) {
107828
+ const size = font.fontSizePx && font.fontSizePx > 0 ? font.fontSizePx : DEFAULT_TEXT_FONT_SIZE;
107829
+ const family = font.fontFamily || DEFAULT_FONT_FAMILY;
107830
+ return `${font.italic ? "italic " : ""}${font.bold ? "bold " : ""}${size}px ${family}`;
107831
+ }
107832
+ function advanceOf(ctx, canvasFont, char) {
107833
+ const key = `${canvasFont}\0${char}`;
107834
+ const cached = advanceCache.get(key);
107835
+ if (cached !== void 0) {
107836
+ return cached;
107837
+ }
107838
+ ctx.font = canvasFont;
107839
+ const width = ctx.measureText(char).width;
107840
+ if (advanceCache.size >= MAX_CACHE_ENTRIES) {
107841
+ advanceCache = /* @__PURE__ */ new Map();
107842
+ }
107843
+ advanceCache.set(key, width);
107844
+ return width;
107845
+ }
107846
+ function resolveMetricTrackingPx(text2, font) {
107847
+ if (!text2) {
107848
+ return 0;
107849
+ }
107850
+ const canvasFont = toCanvasFont(font);
107851
+ const key = `${canvasFont}\0${text2}`;
107852
+ const cached = trackingCache.get(key);
107853
+ if (cached !== void 0) {
107854
+ return cached;
107855
+ }
107856
+ const ctx = getMeasureContext();
107857
+ if (!ctx) {
107858
+ return 0;
107859
+ }
107860
+ const chars = [...text2];
107861
+ ctx.font = canvasFont;
107862
+ const natural = ctx.measureText(text2).width;
107863
+ if (!(natural > 0)) {
107864
+ return 0;
107865
+ }
107866
+ let powerPoint = 0;
107867
+ for (const char of chars) {
107868
+ powerPoint += Math.round(advanceOf(ctx, canvasFont, char) * ADVANCE_STEPS_PER_PX);
107869
+ }
107870
+ powerPoint /= ADVANCE_STEPS_PER_PX;
107871
+ const tracking = (powerPoint - natural) / chars.length;
107872
+ if (trackingCache.size >= MAX_CACHE_ENTRIES) {
107873
+ trackingCache = /* @__PURE__ */ new Map();
107874
+ }
107875
+ trackingCache.set(key, tracking);
107876
+ return tracking;
107877
+ }
107788
107878
  function resolveParagraphStrutFontSize(segments, bodyFontSize) {
107789
107879
  let largest;
107790
107880
  for (const segment of segments) {
@@ -108187,6 +108277,88 @@ ${body}
108187
108277
  keyframes
108188
108278
  };
108189
108279
  }
108280
+ var CROP_EPSILON = 1e-4;
108281
+ function cropInsets(element) {
108282
+ if (!isImageLikeElement(element)) {
108283
+ return [0, 0, 0, 0, 0, 0, 0, 0];
108284
+ }
108285
+ return [
108286
+ element.cropLeft ?? 0,
108287
+ element.cropTop ?? 0,
108288
+ element.cropRight ?? 0,
108289
+ element.cropBottom ?? 0,
108290
+ element.fillRectLeft ?? 0,
108291
+ element.fillRectTop ?? 0,
108292
+ element.fillRectRight ?? 0,
108293
+ element.fillRectBottom ?? 0
108294
+ ];
108295
+ }
108296
+ function morphImageCropChanged(fromElement, toElement) {
108297
+ if (!isImageLikeElement(fromElement) || !isImageLikeElement(toElement)) {
108298
+ return false;
108299
+ }
108300
+ const from = cropInsets(fromElement);
108301
+ const to = cropInsets(toElement);
108302
+ return from.some((value, index) => Math.abs(value - to[index]) > CROP_EPSILON);
108303
+ }
108304
+ function cropKeyframes(name, fromTransform, toTransform) {
108305
+ return `
108306
+ @keyframes ${name} {
108307
+ from {
108308
+ transform-origin: top left;
108309
+ transform: ${fromTransform};
108310
+ }
108311
+ to {
108312
+ transform-origin: top left;
108313
+ transform: ${toTransform};
108314
+ }
108315
+ }`;
108316
+ }
108317
+ function generateImageCropMorphAnimations(pairs2, durationMs) {
108318
+ const animations = [];
108319
+ for (let index = 0; index < pairs2.length; index++) {
108320
+ const { fromElement, toElement } = pairs2[index];
108321
+ if (!morphImageCropChanged(fromElement, toElement)) {
108322
+ continue;
108323
+ }
108324
+ const safeName = `pptx-morph-crop-${index}-${toElement.id.replace(/[^a-zA-Z0-9]/gu, "")}`;
108325
+ animations.push({
108326
+ elementId: toElement.id,
108327
+ target: "image",
108328
+ animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
108329
+ keyframes: cropKeyframes(
108330
+ safeName,
108331
+ buildImageFitTransform(fromElement, true),
108332
+ buildImageFitTransform(toElement, true)
108333
+ )
108334
+ });
108335
+ }
108336
+ return animations;
108337
+ }
108338
+ function generateImageCropGhostAnimations(pairs2, durationMs, ghostIds) {
108339
+ const animations = [];
108340
+ for (let index = 0; index < pairs2.length; index++) {
108341
+ const { fromElement, toElement } = pairs2[index];
108342
+ if (ghostIds && !ghostIds.has(fromElement.id)) {
108343
+ continue;
108344
+ }
108345
+ if (!morphImageCropChanged(fromElement, toElement)) {
108346
+ continue;
108347
+ }
108348
+ const safeName = `pptx-morph-crop-ghost-${index}-${fromElement.id.replace(/[^a-zA-Z0-9]/gu, "")}`;
108349
+ animations.push({
108350
+ elementId: fromElement.id,
108351
+ target: "image",
108352
+ animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
108353
+ keyframes: cropKeyframes(
108354
+ safeName,
108355
+ buildImageFitTransform(fromElement, true),
108356
+ buildImageFitTransform(toElement, true)
108357
+ )
108358
+ });
108359
+ }
108360
+ return animations;
108361
+ }
108190
108362
  var TEXT_MAX_DEPTH = 8;
108191
108363
  function elementText(element, depth = 0) {
108192
108364
  const own = element.text ?? "";
@@ -108595,7 +108767,7 @@ function morphPairNeedsCrossfade(fromElement, toElement) {
108595
108767
  }
108596
108768
  var GEOMETRY_EPSILON = 0.5;
108597
108769
  function isInertMorphPair(fromElement, toElement) {
108598
- 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);
108770
+ return !morphImageCropChanged(fromElement, toElement) && 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);
108599
108771
  }
108600
108772
  function travelledBox(from, to) {
108601
108773
  const boxes = to ? [from, to] : [from];
@@ -108837,6 +109009,7 @@ function generateFullMorphTransition(fromSlide, toSlide, durationMs, mode = "obj
108837
109009
  allAnimations.push(geo);
108838
109010
  }
108839
109011
  }
109012
+ allAnimations.push(...generateImageCropMorphAnimations(matchResult.pairs, durationMs));
108840
109013
  if (mode === "word" || mode === "character") {
108841
109014
  for (let i = 0; i < matchResult.pairs.length; i++) {
108842
109015
  const pair = matchResult.pairs[i];
@@ -108853,6 +109026,7 @@ function generateFullMorphTransition(fromSlide, toSlide, durationMs, mode = "obj
108853
109026
  ghostIds
108854
109027
  );
108855
109028
  allAnimations.push(...ghosts);
109029
+ allAnimations.push(...generateImageCropGhostAnimations(matchResult.pairs, durationMs, ghostIds));
108856
109030
  const fadeOuts = generateUnmatchedFadeOutAnimations(
108857
109031
  matchResult.unmatchedFrom,
108858
109032
  durationMs,
@@ -108889,14 +109063,14 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = "object
108889
109063
  const outgoingIds = new Set(flattenedOutgoing.map((element) => element.id));
108890
109064
  const incomingAnimations = /* @__PURE__ */ new Map();
108891
109065
  const outgoingAnimations = /* @__PURE__ */ new Map();
109066
+ const incomingImageAnimations = /* @__PURE__ */ new Map();
109067
+ const outgoingImageAnimations = /* @__PURE__ */ new Map();
108892
109068
  const keyframes = [];
108893
109069
  for (const animation of animations) {
108894
109070
  keyframes.push(animation.keyframes);
108895
- if (outgoingIds.has(animation.elementId)) {
108896
- outgoingAnimations.set(animation.elementId, animation.animation);
108897
- } else {
108898
- incomingAnimations.set(animation.elementId, animation.animation);
108899
- }
109071
+ const isOutgoing = outgoingIds.has(animation.elementId);
109072
+ const target = animation.target === "image" ? isOutgoing ? outgoingImageAnimations : incomingImageAnimations : isOutgoing ? outgoingAnimations : incomingAnimations;
109073
+ target.set(animation.elementId, animation.animation);
108900
109074
  }
108901
109075
  const outgoingElements = flattenedOutgoing.filter(
108902
109076
  (element) => outgoingAnimations.has(element.id)
@@ -108905,10 +109079,31 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = "object
108905
109079
  keyframesCss: keyframes.join("\n"),
108906
109080
  incomingAnimations,
108907
109081
  outgoingAnimations,
109082
+ incomingImageAnimations,
109083
+ outgoingImageAnimations,
108908
109084
  outgoingElements,
108909
109085
  durationMs
108910
109086
  };
108911
109087
  }
109088
+ function cssAttributeValue(value) {
109089
+ return value.replace(/\\/gu, "\\\\").replace(/"/gu, '\\"');
109090
+ }
109091
+ function buildMorphAnimationRules(plan, scopeAttribute, which = "incoming", only) {
109092
+ const prefix = scopeAttribute ? `[${scopeAttribute}] ` : "";
109093
+ const rules = [];
109094
+ const emit = (animations, suffix) => {
109095
+ for (const [elementId, animation] of animations) {
109096
+ rules.push(
109097
+ `${prefix}[data-element-id="${cssAttributeValue(elementId)}"]${suffix} { animation: ${animation}; }`
109098
+ );
109099
+ }
109100
+ };
109101
+ if (only !== "image") {
109102
+ emit(which === "incoming" ? plan.incomingAnimations : plan.outgoingAnimations, "");
109103
+ }
109104
+ emit(which === "incoming" ? plan.incomingImageAnimations : plan.outgoingImageAnimations, " img");
109105
+ return rules.join("\n");
109106
+ }
108912
109107
  function hexToRgb6(hex10) {
108913
109108
  const clean = hex10.replace(/^#/u, "");
108914
109109
  return {
@@ -119085,6 +119280,69 @@ function mediaTransportVisible(surface) {
119085
119280
  }
119086
119281
  return surface.canvasTransport;
119087
119282
  }
119283
+ function mediaFallbackVisual(surface, input) {
119284
+ const contentOnly = surface.presenting || surface.preview;
119285
+ if (contentOnly) {
119286
+ return { poster: input.hasPoster, dimPoster: false, badge: "none", placeholder: "none" };
119287
+ }
119288
+ const missing = input.missing === true;
119289
+ if (input.hasPoster) {
119290
+ return {
119291
+ poster: true,
119292
+ dimPoster: missing,
119293
+ badge: missing ? "missing" : "play",
119294
+ placeholder: "none"
119295
+ };
119296
+ }
119297
+ return {
119298
+ poster: false,
119299
+ dimPoster: false,
119300
+ badge: "none",
119301
+ placeholder: missing ? "missing" : "typed"
119302
+ };
119303
+ }
119304
+ var MEDIA_FALLBACK_ICONS = {
119305
+ play: ["M5 3 L19 12 L5 21 Z"],
119306
+ missing: ["M12 2 a10 10 0 1 0 0 20 a10 10 0 1 0 0-20", "M4 4 L20 20"],
119307
+ audio: [
119308
+ "M9 18V5l12-2v13",
119309
+ "M6 15 a3 3 0 1 0 0 6 a3 3 0 1 0 0-6",
119310
+ "M18 13 a3 3 0 1 0 0 6 a3 3 0 1 0 0-6"
119311
+ ]
119312
+ };
119313
+ function mediaFallbackIcon(visual, mediaType) {
119314
+ if (visual.badge === "missing" || visual.placeholder === "missing") {
119315
+ return MEDIA_FALLBACK_ICONS.missing;
119316
+ }
119317
+ if (visual.badge === "play") {
119318
+ return MEDIA_FALLBACK_ICONS.play;
119319
+ }
119320
+ if (visual.placeholder === "typed") {
119321
+ if (mediaType === "audio") {
119322
+ return MEDIA_FALLBACK_ICONS.audio;
119323
+ }
119324
+ if (mediaType === "video") {
119325
+ return MEDIA_FALLBACK_ICONS.play;
119326
+ }
119327
+ }
119328
+ return [];
119329
+ }
119330
+ function mediaFallbackLabelKey(visual, mediaType) {
119331
+ if (visual.badge === "missing" || visual.placeholder === "missing") {
119332
+ return "pptx.media.notFound";
119333
+ }
119334
+ if (visual.placeholder !== "typed") {
119335
+ return void 0;
119336
+ }
119337
+ if (mediaType === "video") {
119338
+ return "pptx.media.videoClip";
119339
+ }
119340
+ if (mediaType === "audio") {
119341
+ return "pptx.media.audioClip";
119342
+ }
119343
+ return "pptx.elementType.media";
119344
+ }
119345
+ var MEDIA_CHROME_ATTRIBUTE = "data-pptx-media-chrome";
119088
119346
  var persistentAudioMap = /* @__PURE__ */ new Map();
119089
119347
  function registerPersistentAudio(elementId, dataUrl, mimetype, loop, volume, trimStartSec) {
119090
119348
  if (persistentAudioMap.has(elementId) || typeof document === "undefined") {
@@ -123353,6 +123611,7 @@ exports.LINK_TOOLTIP_PANEL_CLASS = LINK_TOOLTIP_PANEL_CLASS;
123353
123611
  exports.LOCAL_SYNC_ORIGIN = LOCAL_SYNC_ORIGIN;
123354
123612
  exports.MATERIAL_PRESETS = MATERIAL_PRESETS;
123355
123613
  exports.MAX_ZOOM_SCALE = MAX_ZOOM_SCALE;
123614
+ exports.MEDIA_CHROME_ATTRIBUTE = MEDIA_CHROME_ATTRIBUTE;
123356
123615
  exports.MIN_ZOOM_SCALE = MIN_ZOOM_SCALE;
123357
123616
  exports.MOBILE_BREAKPOINT = MOBILE_BREAKPOINT;
123358
123617
  exports.MOTION_PATH_FAMILIES = MOTION_PATH_FAMILIES;
@@ -123367,7 +123626,6 @@ exports.OUTLINE_SLIDE_ATTR = OUTLINE_SLIDE_ATTR;
123367
123626
  exports.OUTLINE_VIEW_ATTR = OUTLINE_VIEW_ATTR;
123368
123627
  exports.PATTERN_OPTIONS = PATTERN_OPTIONS;
123369
123628
  exports.PEN_COLORS = PEN_COLORS;
123370
- exports.POWERPOINT_METRIC_TRACKING = POWERPOINT_METRIC_TRACKING;
123371
123629
  exports.PRESENTATION_CHANNEL_NAME = PRESENTATION_CHANNEL_NAME;
123372
123630
  exports.PRESENTATION_HASH = PRESENTATION_HASH;
123373
123631
  exports.PRESENTATION_MESSAGE_ORIGIN = PRESENTATION_MESSAGE_ORIGIN;
@@ -123480,6 +123738,7 @@ exports.buildHollowHitOutline = buildHollowHitOutline;
123480
123738
  exports.buildInitialGuides = buildInitialGuides;
123481
123739
  exports.buildInnerShadowCssFromShapeStyle = buildInnerShadowCssFromShapeStyle;
123482
123740
  exports.buildJoinCollaborationConfig = buildJoinCollaborationConfig;
123741
+ exports.buildMorphAnimationRules = buildMorphAnimationRules;
123483
123742
  exports.buildMorphTransitionPlan = buildMorphTransitionPlan;
123484
123743
  exports.buildMotionPathPreview = buildMotionPathPreview;
123485
123744
  exports.buildMultiLayerShadowCss = buildMultiLayerShadowCss;
@@ -123755,6 +124014,9 @@ exports.mapOutlineKey = mapOutlineKey;
123755
124014
  exports.mapPresentationKey = mapPresentationKey;
123756
124015
  exports.mapPresentationWheel = mapPresentationWheel;
123757
124016
  exports.mayLeaveSlideShow = mayLeaveSlideShow;
124017
+ exports.mediaFallbackIcon = mediaFallbackIcon;
124018
+ exports.mediaFallbackLabelKey = mediaFallbackLabelKey;
124019
+ exports.mediaFallbackVisual = mediaFallbackVisual;
123758
124020
  exports.mediaPlaybackAttributes = mediaPlaybackAttributes;
123759
124021
  exports.mediaTransportVisible = mediaTransportVisible;
123760
124022
  exports.mergeAdditiveSelection = mergeAdditiveSelection;
@@ -123861,6 +124123,7 @@ exports.resolveGroupChildFill = resolveGroupChildFill;
123861
124123
  exports.resolveInkColor = resolveInkColor;
123862
124124
  exports.resolveInkOpacity = resolveInkOpacity;
123863
124125
  exports.resolveInkWidth = resolveInkWidth;
124126
+ exports.resolveMetricTrackingPx = resolveMetricTrackingPx;
123864
124127
  exports.resolveOleType = resolveOleType;
123865
124128
  exports.resolveParagraphAlign = resolveParagraphAlign;
123866
124129
  exports.resolveParagraphRtl = resolveParagraphRtl;
Binary file
@@ -1,8 +1,8 @@
1
- import { computeFocusTargets, aiChangeAnimationCss, changeGhostStyle, createChatHistoryStore, toRenderableParts } from './chunk-ULB35HMJ.mjs';
2
- import { useReducedMotion, useViewerState, useViewerOptions, useIsMobile, useResizablePanels, useDerivedSlideState, useZoomViewport, useEditorHistory, usePresentationSetup, useTouchGestures, useViewerDialogs, useEditorOperations, useViewerIntegration, useYjsDocumentSync, useCollaborationLivePatch, useFollowMode, useBroadcastFollower, scopeLayoutOptionsToActiveSlide, useToolbarVisibility, useKeyboardInsets, useModalDismissDrag, useCollaborativeState, useVirtualizedSlides, useSwipeNavigation, useSheetDismissDrag, detectTargetType, parseEmailUrl, parseSlideFromUrl, ACTION_VERB_MAP, downloadBlob } from './chunk-TWPZJXLC.mjs';
3
- import { MIN_ELEMENT_SIZE, DEFAULT_STROKE_COLOR, getConnectorPathGeometry, buildLineShadowCss, buildLineGlowFilter, renderConnectorMarker, getShapeVisualStyle, getTextStyleForElement, DEFAULT_TEXT_COLOR, renderVectorShape, isConnectorOrLineElement, build3DExtrusionData, getImageRenderStyle, cn, getTextLayoutStyle, renderTableElement, renderMediaElement, shouldRenderFallbackLabel, SHAPE_PRESETS, ANIMATION_PRESET_OPTIONS, DEFAULT_FILL_COLOR, hasDagDuotoneEffect, renderDagDuotoneSvgFilter, getCropShapeClipPath, resolvePalette, resolveStyle, layoutToCategory, wrapChrome, isImageTiled, getImageTilingStyle, getDuotoneColors, getTextWarpStyle, renderTextSegments, buildReactChartViewModel, renderChartElement, buildTextBody3DSceneStyle, SLIDE_NAV_THUMBNAIL_WIDTH, styleShadow, styleStroke, colour, fitFontSize, smartArtNodeGroupProps, chevronPoints, SmartArtNodeText, truncate, renderStepDownProcess, renderAlternatingFlow, renderDescendingProcess, renderPictureAccentList, renderVerticalBlockList, renderGroupedList, renderPyramidList, renderHorizontalPictureList, renderAccentProcess, renderVerticalChevronList, DEFAULT_TEXT_FONT_SIZE, DEFAULT_FONT_FAMILY, TOOLBAR_SECTIONS, SHORTCUT_REFERENCE_ITEMS as SHORTCUT_REFERENCE_ITEMS$1, buildTree, treeWidth, treeDepth, nodeOpacity, gearPath, resolveSmartArtDataPalette, HYPERLINK_COLOR, GRID_SIZE, CONNECTOR_ARROW_OPTIONS, ARROW_SIZE_OPTIONS, startMotionPathPreview, startPreviewAnimation, stopPreviewAnimation, THEME_COLOR_SWATCHES, STROKE_DASH_OPTIONS } from './chunk-FFBY2TKD.mjs';
1
+ import { computeFocusTargets, aiChangeAnimationCss, changeGhostStyle, createChatHistoryStore, toRenderableParts } from './chunk-LJZFG6YP.mjs';
2
+ import { useReducedMotion, useViewerState, useViewerOptions, useIsMobile, useResizablePanels, useDerivedSlideState, useZoomViewport, useEditorHistory, usePresentationSetup, useTouchGestures, useViewerDialogs, useEditorOperations, useViewerIntegration, useYjsDocumentSync, useCollaborationLivePatch, useFollowMode, useBroadcastFollower, scopeLayoutOptionsToActiveSlide, useToolbarVisibility, useKeyboardInsets, useModalDismissDrag, useCollaborativeState, useVirtualizedSlides, useSwipeNavigation, useSheetDismissDrag, detectTargetType, parseEmailUrl, parseSlideFromUrl, ACTION_VERB_MAP, downloadBlob } from './chunk-RUK5XZGO.mjs';
3
+ import { MIN_ELEMENT_SIZE, DEFAULT_STROKE_COLOR, getConnectorPathGeometry, buildLineShadowCss, buildLineGlowFilter, renderConnectorMarker, getShapeVisualStyle, getTextStyleForElement, DEFAULT_TEXT_COLOR, renderVectorShape, isConnectorOrLineElement, build3DExtrusionData, getImageRenderStyle, cn, getTextLayoutStyle, renderTableElement, renderMediaElement, shouldRenderFallbackLabel, SHAPE_PRESETS, ANIMATION_PRESET_OPTIONS, DEFAULT_FILL_COLOR, hasDagDuotoneEffect, renderDagDuotoneSvgFilter, getCropShapeClipPath, resolvePalette, resolveStyle, layoutToCategory, wrapChrome, isImageTiled, getImageTilingStyle, getDuotoneColors, getTextWarpStyle, renderTextSegments, buildReactChartViewModel, renderChartElement, buildTextBody3DSceneStyle, SLIDE_NAV_THUMBNAIL_WIDTH, styleShadow, styleStroke, colour, fitFontSize, smartArtNodeGroupProps, chevronPoints, SmartArtNodeText, truncate, renderStepDownProcess, renderAlternatingFlow, renderDescendingProcess, renderPictureAccentList, renderVerticalBlockList, renderGroupedList, renderPyramidList, renderHorizontalPictureList, renderAccentProcess, renderVerticalChevronList, DEFAULT_TEXT_FONT_SIZE, DEFAULT_FONT_FAMILY, TOOLBAR_SECTIONS, SHORTCUT_REFERENCE_ITEMS as SHORTCUT_REFERENCE_ITEMS$1, buildTree, treeWidth, treeDepth, nodeOpacity, gearPath, resolveSmartArtDataPalette, HYPERLINK_COLOR, GRID_SIZE, CONNECTOR_ARROW_OPTIONS, ARROW_SIZE_OPTIONS, startMotionPathPreview, startPreviewAnimation, stopPreviewAnimation, THEME_COLOR_SWATCHES, STROKE_DASH_OPTIONS } from './chunk-ZOOGEDYG.mjs';
4
4
  import { LOCALE_CATALOG, translationsEn } from './chunk-5YV26HMJ.mjs';
5
- import { hasShapeProperties, normalizeHexColor, colorWithOpacity, normalizeStrokeDashType, getSvgStrokeDasharray, getCompoundLineOffsets, getCompoundLineWidths, svgLineCap, hasTextProperties, getElementTransform, isEditableTextElement, isElementRendered, isElementActionable, getAriaRole, getAriaLabel, getAriaRoleDescription, getImageEffectsOpacity, getImageEffectsFilter, getElementTransformWithoutRotation, isHollowShapeElement, LINK_TOOLTIP_HOST_CLASS, ACTION_BUTTON_PRESETS, mediaTransportVisible, isInkElement, getElementLabel, SWITCHABLE_LAYOUT_TYPES, DEFAULT_VIEWER_OPTIONS, compileEquationTemplateMathMl, buildUserFontFaceStyles, readStoredViewerPrefs, resolveThemeCatalogEntry, THEME_CATALOG, writeStoredViewerPrefs, openPptxFile, readBackstageRecentFile, viewerOptionsToPreferences, applyPreferenceToOptions, listAutosaveSnapshots, deleteAutosaveSnapshot, paintedStrokeWidth, buildCssGradientFromShapeStyle, ensureActionAffordanceStyles, resolveElementActionAffordance, actionAffordanceLabels, getComputedEffectStyle, getSoftEdgeSvgFilter, buildStrokeOutline, buildHollowHitOutline, strokeOutlineViewBox, getGroupChildParentFill, revealedSmartArtNodeCount, buildSmartArtA11y, buildSummaryZoomView, getImageColorWashStyle, isImageLikeElement, placeCaretAtEnd, getPendingSelectionRestore, restoreSegmentSelection, getTextCompensationTransform, applyChartBuildReveal, formatAxisValue, hasPressureVariation, getInkReplayStyles, INK_REPLAY_KEYFRAMES, resolveInkColor, resolveInkWidth, resolveInkOpacity, pressuresToWidths, getContentPartReplayStyles, resolveOleType, getOleTypeColor, getOleTypeLabel, filterRenderedElements, resolveGroupChildFill, isLinkedTextBox, getOverflowSegments, shouldUseSvgWarp, RULER_THICKNESS, RULER_FONT_SIZE, buildPreviewElements, deriveSlideFieldContext, SLIDE_TRANSITION_OPTIONS, hiddenSlideCue, HIDDEN_SLIDE_SLASH_GRADIENT, HIDDEN_SLIDE_LABEL_KEY, themeToCssVars, applyMotionPathPreset, DEFAULT_INSERT_CHART_KIND, hasCopyableFormat, templateSchemeFromTheme, createBackstagePresentation, printPropertiesFrameSlides, printPropertiesSlidesPerPage, VIEWER_OPTIONS_TABS, DEFAULT_QUICK_ACCESS_COMMAND_IDS, buildJoinCollaborationConfig, buildCreateCollaborationConfig, generateBroadcastRoomId, DEFAULT_BROADCAST_SERVER_URL, buildBroadcastViewerUrl, resolveTransportForServerUrl, ACTION_INDICATOR_CLASS, ACTION_INDICATOR_ICON_PATH, LINK_TOOLTIP_CLASS, LINK_TOOLTIP_PANEL_CLASS, LINK_TOOLTIP_LABEL_CLASS, LINK_TOOLTIP_HINT_CLASS, resolveDrawingShapeNodeId, getImageSvgFilters, buildDuotoneCacheKey, getDuotoneCachedResult, applyDuotone, setDuotoneCachedResult, buildCacheKey, DEFAULT_COLOR_CHANGE_TOLERANCE, getCachedResult, applyColorChange, setCachedResult, findChartPartTarget, dragValueForPart, withChartPointValue, dragAnchorViewY, withChartTitle, computeSmartArtLayout, buildSmartArt3DModel, extractPathPoints, generatePressureCircles, isBrowserOpenableMime, formatBytes, getOleBadgeLabel, openUrlInNewTab, getSubstituteFontFamily, getWarpPath, getSlideBackgroundStyle, filterCommands, resolveTitleBarStatusKey, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, buildFieldSubstitutionContext, shouldConfirmExternalHyperlink, safeOpenUrl, isPpactionUrl, parsePpactionUrl, isPresentationAdvanceClick, toggleBlackboard, PRESENT_TOOLBAR_CLASSES, buildContextMenuEntries, themeColorSchemesEqual, STATUS_BAR_CLASSES, formatVersionTimestamp, formatRelativeTime, scanAvailableFontFamilies, PRESETS, CATEGORIES, convertOmmlToLatex, compileLatexEquation, convertLatexToOmml, EQUATION_TEMPLATES, clampPercent, HANDOUT_OPTIONS, TOOLBAR_TABS, SHORTCUT_REFERENCE_ITEMS, resolveViewerAddinRows, availableQuickAccessCommands, addQuickAccessCommand, removeQuickAccessCommand, moveQuickAccessCommand, activateModalFocus, buildCollaborationShareUrl, canGoPrevious, formatSlideCounter, READING_VIEW_COUNTER_ATTR, canGoNext, READING_VIEW_ATTR, OUTLINE_LEVEL_ATTR, OUTLINE_SLIDE_ATTR, OUTLINE_ROW_ATTR, OUTLINE_VIEW_ATTR, mobileElapsedSince, nextPresentedSlide, presenterPrevDisabled, presenterNextDisabled, formatMobileElapsed, mobileSlideCounter, presenterPaneAdvancesOnClick, presenterTimerProgress, PRESENTER_CONSOLE_CLASSES, formatElapsed, computeInlineEditorRect, findSmartArtNodeText, setSmartArtNodeStyle, rebuildDrawingShapesIfCleared, shouldCommitSmartArtNodeText, updateSmartArtNodeText, groupIntoParagraphs, substituteFieldText, extraQuickAccessCommands, TAB_ROW_ACTION_CLASSES, listBackstageRecentFiles, BACKSTAGE_NAV, INSERT_CHART_TYPES, CHARACTER_SPACING_OPTIONS, DEFAULT_MOTION_PATH_PRESET_ID, SLIDE_VIRTUALIZATION_THRESHOLD, PRESENTATION_STAGE_ATTRIBUTE, getSlideTransitionAnimations, SLIDE_TRANSITION_KEYFRAMES, annotationOverlayZIndex, presentationInkPath, motionPathFor, setMotionPath, getShapeAdjustmentHandleDescriptor, PRESENTER_NAVIGATOR_LABEL_KEYS, PEN_COLORS, HIGHLIGHTER_COLORS, isBlackboardActive, PRESET_THEMES, isUrlSafe, sanitizeMathMl, computeHandoutLayout, getPrintableArea, generateNoteLineCount, computeAllNotesPages, getNotesPrintableArea, QUICK_ACCESS_COMMAND_CATALOG, openReadingView, applyReadingViewCommand, createPresentationKeyBuffer, readingViewFitScale, READING_VIEW_STAGE_ATTR, buildOutline, applyOutlineEdit, mapOutlineKey, notesSegmentsToSpans, erasePresentationInkAt, movePresenterPointer, appendPresentationInkPoint, PRESENTER_CONSOLE_CONTROLS, NOTES_FONT_SIZE_DEFAULT, formatTime, NOTES_FONT_SIZE_MIN, clampNotesFontSize, NOTES_FONT_SIZE_STEP, NOTES_FONT_SIZE_MAX, BACKSTAGE_TEMPLATES, formatBackstageDate, formatBackstageSize, backstageCardsFor, DEFAULT_VIEWER_PROFILE, resolveProfileInitial, AVATAR_COLOR_SWATCHES, ENTRANCE_PRESET_VALUES, EMPHASIS_PRESET_VALUES, EXIT_PRESET_VALUES, MOTION_PATH_FAMILIES, motionPathFamilyLabelKey, motionPathPresetsByFamily, motionPathPresetLabelKey, getConnectionSites, generateTicks, rulerDragToGuidePosition, getCommentMarkerPosition, motionPathToSvgD, motionPathEndPixel, isEditableMotionPath, setMotionPathEnd, themeColorLabel, buildThemeColorGrid, THEME_COLOR_SCHEME_KEYS, COMMON_FONTS, buildSmartArtPresetData, handleReadingViewKey, getLocalStorageUsageSummary, saveViewerProfile, clearAllLocalViewerData, SLIDE_TEMPLATES, mergeSlideTransition, buildSlideTemplateContent, buildTableDataGrid, appendTableElementRow, removeLastTableElementRow, appendTableElementColumn, removeLastTableElementColumn, removeTableElementColumn, removeTableElementRow, setTableElementCellText, TABLE_STYLE_PRESETS, chartDataChangeType, setChartCategoryLabel, setChartCellValue, addChartCategory, removeChartCategory, addChartSeries, removeChartSeries, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, setChartDataPointMarker, setChartDataPointLabel, getOleObjectTypeLabel, sanitizeGradientStops, pptxActionToElementAction, withFrameSlides, withSlidesPerPage, applyThemeOverrideToSlide, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, schemaLabel, THEME_COLOR_SLOT_LABEL_KEYS, TRANSITION_VALID_DIRECTIONS, TRANSITION_ORIENTATION_TYPES, clampTransitionNumber, flattenTagCollections, formatCommentTimestamp, clearMotionPath, DIRECTIONAL_PRESETS, motionPathPresetIdForPath, computeMergeCellRight, computeMergeCellDown, computeSplitCell, SMARTART_COLOR_SCHEME_LABEL_KEYS, SMARTART_STYLE_LABEL_KEYS, addSmartArtNodeAsChild, removeSmartArtNode, clampCropValue, DUOTONE_PRESETS, ARTISTIC_EFFECTS, resolveActionType, ELEMENT_ACTION_TYPE_OPTIONS, toSlideIndex, elementActionToPptxAction, canCommitActionType, TRANSITION_DIR_ARROWS, buildDirectionGrid, updateTagInCollections, deleteTagFromCollections, addTagToCollections, animationEffectLabel, LBL, SEL, FILL_MODE_OPTIONS, SECTION_HEADING, NUM, switchSmartArtLayout, addSmartArtNode, demoteSmartArtNode, promoteSmartArtNode, reorderSmartArtNode, SHAPE_QUICK_STYLES, quickStyleSwatchCss, getPatternSvg, TEXT_WARP_PRESETS, warpPreviewPath, text3dPtToEmu, text3dEmuToPt, MATERIAL_PRESETS, GRADIENT_TYPE_OPTIONS, PATTERN_OPTIONS, FILL_PATTERN_LABEL_KEYS, openNativeEyeDropper, toggleText3dExtrusion, BEVEL_PRESETS } from './chunk-OIITLGKQ.mjs';
5
+ import { hasShapeProperties, normalizeHexColor, colorWithOpacity, normalizeStrokeDashType, getSvgStrokeDasharray, getCompoundLineOffsets, getCompoundLineWidths, svgLineCap, hasTextProperties, getElementTransform, isEditableTextElement, isElementRendered, isElementActionable, getAriaRole, getAriaLabel, getAriaRoleDescription, getImageEffectsOpacity, getImageEffectsFilter, getElementTransformWithoutRotation, isHollowShapeElement, LINK_TOOLTIP_HOST_CLASS, ACTION_BUTTON_PRESETS, mediaTransportVisible, isInkElement, getElementLabel, SWITCHABLE_LAYOUT_TYPES, DEFAULT_VIEWER_OPTIONS, compileEquationTemplateMathMl, buildUserFontFaceStyles, readStoredViewerPrefs, resolveThemeCatalogEntry, THEME_CATALOG, writeStoredViewerPrefs, openPptxFile, readBackstageRecentFile, viewerOptionsToPreferences, applyPreferenceToOptions, listAutosaveSnapshots, deleteAutosaveSnapshot, paintedStrokeWidth, buildCssGradientFromShapeStyle, ensureActionAffordanceStyles, resolveElementActionAffordance, actionAffordanceLabels, getComputedEffectStyle, getSoftEdgeSvgFilter, buildStrokeOutline, buildHollowHitOutline, strokeOutlineViewBox, getGroupChildParentFill, revealedSmartArtNodeCount, buildSmartArtA11y, buildSummaryZoomView, getImageColorWashStyle, isImageLikeElement, placeCaretAtEnd, getPendingSelectionRestore, restoreSegmentSelection, getTextCompensationTransform, applyChartBuildReveal, formatAxisValue, hasPressureVariation, getInkReplayStyles, INK_REPLAY_KEYFRAMES, resolveInkColor, resolveInkWidth, resolveInkOpacity, pressuresToWidths, getContentPartReplayStyles, resolveOleType, getOleTypeColor, getOleTypeLabel, filterRenderedElements, resolveGroupChildFill, isLinkedTextBox, getOverflowSegments, shouldUseSvgWarp, RULER_THICKNESS, RULER_FONT_SIZE, buildPreviewElements, deriveSlideFieldContext, SLIDE_TRANSITION_OPTIONS, hiddenSlideCue, HIDDEN_SLIDE_SLASH_GRADIENT, HIDDEN_SLIDE_LABEL_KEY, themeToCssVars, applyMotionPathPreset, DEFAULT_INSERT_CHART_KIND, hasCopyableFormat, templateSchemeFromTheme, createBackstagePresentation, printPropertiesFrameSlides, printPropertiesSlidesPerPage, VIEWER_OPTIONS_TABS, DEFAULT_QUICK_ACCESS_COMMAND_IDS, buildJoinCollaborationConfig, buildCreateCollaborationConfig, generateBroadcastRoomId, DEFAULT_BROADCAST_SERVER_URL, buildBroadcastViewerUrl, resolveTransportForServerUrl, ACTION_INDICATOR_CLASS, ACTION_INDICATOR_ICON_PATH, LINK_TOOLTIP_CLASS, LINK_TOOLTIP_PANEL_CLASS, LINK_TOOLTIP_LABEL_CLASS, LINK_TOOLTIP_HINT_CLASS, resolveDrawingShapeNodeId, getImageSvgFilters, buildDuotoneCacheKey, getDuotoneCachedResult, applyDuotone, setDuotoneCachedResult, buildCacheKey, DEFAULT_COLOR_CHANGE_TOLERANCE, getCachedResult, applyColorChange, setCachedResult, findChartPartTarget, dragValueForPart, withChartPointValue, dragAnchorViewY, withChartTitle, computeSmartArtLayout, buildSmartArt3DModel, extractPathPoints, generatePressureCircles, isBrowserOpenableMime, formatBytes, getOleBadgeLabel, openUrlInNewTab, getSubstituteFontFamily, getWarpPath, getSlideBackgroundStyle, filterCommands, resolveTitleBarStatusKey, TITLE_BAR_CLASSES, TITLE_BAR_DEFAULT_FILE_KEY, buildFieldSubstitutionContext, shouldConfirmExternalHyperlink, safeOpenUrl, isPpactionUrl, parsePpactionUrl, isPresentationAdvanceClick, toggleBlackboard, PRESENT_TOOLBAR_CLASSES, buildContextMenuEntries, themeColorSchemesEqual, STATUS_BAR_CLASSES, formatVersionTimestamp, formatRelativeTime, scanAvailableFontFamilies, PRESETS, CATEGORIES, convertOmmlToLatex, compileLatexEquation, convertLatexToOmml, EQUATION_TEMPLATES, clampPercent, HANDOUT_OPTIONS, TOOLBAR_TABS, SHORTCUT_REFERENCE_ITEMS, resolveViewerAddinRows, availableQuickAccessCommands, addQuickAccessCommand, removeQuickAccessCommand, moveQuickAccessCommand, activateModalFocus, buildCollaborationShareUrl, canGoPrevious, formatSlideCounter, READING_VIEW_COUNTER_ATTR, canGoNext, READING_VIEW_ATTR, OUTLINE_LEVEL_ATTR, OUTLINE_SLIDE_ATTR, OUTLINE_ROW_ATTR, OUTLINE_VIEW_ATTR, mobileElapsedSince, nextPresentedSlide, presenterPrevDisabled, presenterNextDisabled, formatMobileElapsed, mobileSlideCounter, presenterPaneAdvancesOnClick, presenterTimerProgress, PRESENTER_CONSOLE_CLASSES, formatElapsed, computeInlineEditorRect, findSmartArtNodeText, setSmartArtNodeStyle, rebuildDrawingShapesIfCleared, shouldCommitSmartArtNodeText, updateSmartArtNodeText, groupIntoParagraphs, substituteFieldText, extraQuickAccessCommands, TAB_ROW_ACTION_CLASSES, listBackstageRecentFiles, BACKSTAGE_NAV, INSERT_CHART_TYPES, CHARACTER_SPACING_OPTIONS, DEFAULT_MOTION_PATH_PRESET_ID, SLIDE_VIRTUALIZATION_THRESHOLD, PRESENTATION_STAGE_ATTRIBUTE, getSlideTransitionAnimations, SLIDE_TRANSITION_KEYFRAMES, annotationOverlayZIndex, presentationInkPath, motionPathFor, setMotionPath, getShapeAdjustmentHandleDescriptor, PRESENTER_NAVIGATOR_LABEL_KEYS, PEN_COLORS, HIGHLIGHTER_COLORS, isBlackboardActive, PRESET_THEMES, isUrlSafe, sanitizeMathMl, computeHandoutLayout, getPrintableArea, generateNoteLineCount, computeAllNotesPages, getNotesPrintableArea, QUICK_ACCESS_COMMAND_CATALOG, openReadingView, applyReadingViewCommand, createPresentationKeyBuffer, readingViewFitScale, READING_VIEW_STAGE_ATTR, buildOutline, applyOutlineEdit, mapOutlineKey, notesSegmentsToSpans, erasePresentationInkAt, movePresenterPointer, appendPresentationInkPoint, PRESENTER_CONSOLE_CONTROLS, NOTES_FONT_SIZE_DEFAULT, formatTime, NOTES_FONT_SIZE_MIN, clampNotesFontSize, NOTES_FONT_SIZE_STEP, NOTES_FONT_SIZE_MAX, BACKSTAGE_TEMPLATES, formatBackstageDate, formatBackstageSize, backstageCardsFor, DEFAULT_VIEWER_PROFILE, resolveProfileInitial, AVATAR_COLOR_SWATCHES, ENTRANCE_PRESET_VALUES, EMPHASIS_PRESET_VALUES, EXIT_PRESET_VALUES, MOTION_PATH_FAMILIES, motionPathFamilyLabelKey, motionPathPresetsByFamily, motionPathPresetLabelKey, getConnectionSites, generateTicks, rulerDragToGuidePosition, getCommentMarkerPosition, motionPathToSvgD, motionPathEndPixel, isEditableMotionPath, setMotionPathEnd, themeColorLabel, buildThemeColorGrid, THEME_COLOR_SCHEME_KEYS, COMMON_FONTS, buildSmartArtPresetData, handleReadingViewKey, getLocalStorageUsageSummary, saveViewerProfile, clearAllLocalViewerData, SLIDE_TEMPLATES, mergeSlideTransition, buildSlideTemplateContent, buildTableDataGrid, appendTableElementRow, removeLastTableElementRow, appendTableElementColumn, removeLastTableElementColumn, removeTableElementColumn, removeTableElementRow, setTableElementCellText, TABLE_STYLE_PRESETS, chartDataChangeType, setChartCategoryLabel, setChartCellValue, addChartCategory, removeChartCategory, addChartSeries, removeChartSeries, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, setChartDataPointMarker, setChartDataPointLabel, getOleObjectTypeLabel, sanitizeGradientStops, pptxActionToElementAction, withFrameSlides, withSlidesPerPage, applyThemeOverrideToSlide, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, schemaLabel, THEME_COLOR_SLOT_LABEL_KEYS, TRANSITION_VALID_DIRECTIONS, TRANSITION_ORIENTATION_TYPES, clampTransitionNumber, flattenTagCollections, formatCommentTimestamp, clearMotionPath, DIRECTIONAL_PRESETS, motionPathPresetIdForPath, computeMergeCellRight, computeMergeCellDown, computeSplitCell, SMARTART_COLOR_SCHEME_LABEL_KEYS, SMARTART_STYLE_LABEL_KEYS, addSmartArtNodeAsChild, removeSmartArtNode, clampCropValue, DUOTONE_PRESETS, ARTISTIC_EFFECTS, resolveActionType, ELEMENT_ACTION_TYPE_OPTIONS, toSlideIndex, elementActionToPptxAction, canCommitActionType, TRANSITION_DIR_ARROWS, buildDirectionGrid, updateTagInCollections, deleteTagFromCollections, addTagToCollections, animationEffectLabel, LBL, SEL, FILL_MODE_OPTIONS, SECTION_HEADING, NUM, switchSmartArtLayout, addSmartArtNode, demoteSmartArtNode, promoteSmartArtNode, reorderSmartArtNode, SHAPE_QUICK_STYLES, quickStyleSwatchCss, getPatternSvg, TEXT_WARP_PRESETS, warpPreviewPath, text3dPtToEmu, text3dEmuToPt, MATERIAL_PRESETS, GRADIENT_TYPE_OPTIONS, PATTERN_OPTIONS, FILL_PATTERN_LABEL_KEYS, openNativeEyeDropper, toggleText3dExtrusion, BEVEL_PRESETS } from './chunk-ENOHLGJ2.mjs';
6
6
  import React14, { createContext, useMemo, useState, useCallback, lazy, forwardRef, useEffect, useRef, Suspense, useLayoutEffect, useContext, Fragment as Fragment$1, useDeferredValue } from 'react';
7
7
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
8
8
  import { useTranslation } from 'react-i18next';
@@ -2563,7 +2563,7 @@ function FailedToLoad() {
2563
2563
  var LazyModel3DScene = React14.lazy(
2564
2564
  async () => {
2565
2565
  try {
2566
- return await import('./Model3DScene-267BHD5T.mjs');
2566
+ return await import('./Model3DScene-KEUY3M7X.mjs');
2567
2567
  } catch {
2568
2568
  return { default: FailedToLoad };
2569
2569
  }
@@ -5293,6 +5293,9 @@ function renderBody(options) {
5293
5293
  preview: isStaticSurface === true,
5294
5294
  canvasTransport: true
5295
5295
  }),
5296
+ // ...and never the play badge / placeholder box either: a still is
5297
+ // slide content, and the transition overlay paints one (issue #147).
5298
+ preview: isStaticSurface === true,
5296
5299
  onPlayStateChange: handleMediaPlayStateChange
5297
5300
  });
5298
5301
  }
@@ -5336,6 +5339,7 @@ function StaticElementRendererImpl({
5336
5339
  onActionClick,
5337
5340
  actionRequiresModifier = false,
5338
5341
  animation,
5342
+ imageAnimation,
5339
5343
  exposeElementId = false
5340
5344
  }) {
5341
5345
  if (!isElementRendered(element)) {
@@ -5432,7 +5436,7 @@ function StaticElementRendererImpl({
5432
5436
  txtSE: hasTextProperties(element) ? element.textStyle : void 0,
5433
5437
  txtS: textStyle,
5434
5438
  vecShape: renderVectorShape(element, hasFill, fill, strokeWidth, stroke),
5435
- imgStyle: getImageRenderStyle(element),
5439
+ imgStyle: imageAnimation ? { ...getImageRenderStyle(element), animation: imageAnimation } : getImageRenderStyle(element),
5436
5440
  imgFilter: getImageEffectsFilter(element),
5437
5441
  imgOpacity: getImageEffectsOpacity(element),
5438
5442
  imgAlt: "",
@@ -6663,7 +6667,7 @@ function AccountPage() {
6663
6667
  return void 0;
6664
6668
  });
6665
6669
  };
6666
- const version = "2.15.3" ;
6670
+ const version = "2.16.0" ;
6667
6671
  return /* @__PURE__ */ jsxs("div", { className: "mt-8 max-w-[700px] space-y-6", children: [
6668
6672
  /* @__PURE__ */ jsxs("section", { className: cardClass, children: [
6669
6673
  /* @__PURE__ */ jsxs("h2", { className: "flex items-center gap-2 text-sm font-semibold", children: [
@@ -30875,7 +30879,8 @@ function PresentationTransitionOverlay({
30875
30879
  activeSlide: outgoingSlide,
30876
30880
  allSlides: [outgoingSlide],
30877
30881
  zIndex: index,
30878
- animation: morphPlan.outgoingAnimations.get(element.id)
30882
+ animation: morphPlan.outgoingAnimations.get(element.id),
30883
+ imageAnimation: morphPlan.outgoingImageAnimations.get(element.id)
30879
30884
  }
30880
30885
  )
30881
30886
  },
@@ -35369,7 +35374,7 @@ ${url}`)) {
35369
35374
  var AiChatPanel = lazy(async () => {
35370
35375
  const [{ useChat }, { default: Panel }] = await Promise.all([
35371
35376
  import('@ai-sdk/react'),
35372
- import('./AiChatPanel-TYU52HDW.mjs')
35377
+ import('./AiChatPanel-UPNVIENY.mjs')
35373
35378
  ]);
35374
35379
  function BoundAiChatPanel(props) {
35375
35380
  return /* @__PURE__ */ jsx(Panel, { ...props, useChat });
Binary file
Binary file
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkP3Y3OMAD_js = require('./chunk-P3Y3OMAD.js');
3
+ var chunk3NDRTC7T_js = require('./chunk-3NDRTC7T.js');
4
4
  var chunk4VNS5WPM_js = require('./chunk-4VNS5WPM.js');
5
5
  var mcp = require('pptx-viewer-mcp');
6
6
  var mcpSchemas = require('pptx-viewer-mcp/schemas');
@@ -14879,7 +14879,7 @@ async function buildSlideMarkdown(slides, slideIndex2, meta3, options = {}) {
14879
14879
  };
14880
14880
  let markdown;
14881
14881
  try {
14882
- const converter = new chunkP3Y3OMAD_js.PptxMarkdownConverter(
14882
+ const converter = new chunk3NDRTC7T_js.PptxMarkdownConverter(
14883
14883
  "",
14884
14884
  {
14885
14885
  sourceName: meta3.title ?? "deck.pptx",
@@ -15471,7 +15471,7 @@ var getTheme = (ctx) => {
15471
15471
  name: theme?.name,
15472
15472
  colorScheme: theme?.colorScheme,
15473
15473
  fontScheme: theme?.fontScheme,
15474
- availablePresets: Object.keys(chunkP3Y3OMAD_js.ThemePresets)
15474
+ availablePresets: Object.keys(chunk3NDRTC7T_js.ThemePresets)
15475
15475
  };
15476
15476
  };
15477
15477
  var readExecutors = {
Binary file
Binary file