pptx-react-viewer 2.15.3 → 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 (99) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/{AiChatPanel-R7BYGQX5.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-OXAKUVYH.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-BK7RWDCU.js → Model3DScene-7FKWPESH.js} +2 -2
  9. package/dist/Model3DScene-7FKWPESH.js.br +0 -0
  10. package/dist/Model3DScene-7FKWPESH.js.gz +0 -0
  11. package/dist/{Model3DScene-TPUVF4FY.mjs → Model3DScene-KEUY3M7X.mjs} +1 -1
  12. package/dist/Model3DScene-KEUY3M7X.mjs.br +0 -0
  13. package/dist/Model3DScene-KEUY3M7X.mjs.gz +0 -0
  14. package/dist/{SurfaceChart3DScene-FXJ45DC5.mjs → SurfaceChart3DScene-2MLBPJ63.mjs} +1 -1
  15. package/dist/{SurfaceChart3DScene-FXJ45DC5.mjs.br → SurfaceChart3DScene-2MLBPJ63.mjs.br} +0 -0
  16. package/dist/SurfaceChart3DScene-2MLBPJ63.mjs.gz +0 -0
  17. package/dist/{SurfaceChart3DScene-WOLVZOW3.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-YBTRSG74.js → chunk-3NDRTC7T.js} +352 -40
  21. package/dist/chunk-3NDRTC7T.js.br +0 -0
  22. package/dist/{chunk-YBTRSG74.js.gz → chunk-3NDRTC7T.js.gz} +0 -0
  23. package/dist/{chunk-RPGAI65Z.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-T5IS3MGN.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-3XJODTAV.js → chunk-DQTTI6D4.js} +362 -341
  30. package/dist/chunk-DQTTI6D4.js.br +0 -0
  31. package/dist/chunk-DQTTI6D4.js.gz +0 -0
  32. package/dist/{chunk-6M6WP2TK.mjs → chunk-ENOHLGJ2.mjs} +344 -40
  33. package/dist/chunk-ENOHLGJ2.mjs.br +0 -0
  34. package/dist/{chunk-6M6WP2TK.mjs.gz → chunk-ENOHLGJ2.mjs.gz} +0 -0
  35. package/dist/{chunk-FHTEL3Q6.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-U2UPBBJV.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-IEXZ2JSO.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-OPX74QGH.mjs → chunk-RUK5XZGO.mjs} +31 -10
  45. package/dist/chunk-RUK5XZGO.mjs.br +0 -0
  46. package/dist/chunk-RUK5XZGO.mjs.gz +0 -0
  47. package/dist/{chunk-WJNWCKS7.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-OXAKUVYH.mjs.br +0 -0
  72. package/dist/AiChatPanel-OXAKUVYH.mjs.gz +0 -0
  73. package/dist/AiChatPanel-R7BYGQX5.js.br +0 -0
  74. package/dist/AiChatPanel-R7BYGQX5.js.gz +0 -0
  75. package/dist/Model3DScene-BK7RWDCU.js.br +0 -0
  76. package/dist/Model3DScene-BK7RWDCU.js.gz +0 -0
  77. package/dist/Model3DScene-TPUVF4FY.mjs.br +0 -0
  78. package/dist/Model3DScene-TPUVF4FY.mjs.gz +0 -0
  79. package/dist/SurfaceChart3DScene-FXJ45DC5.mjs.gz +0 -0
  80. package/dist/SurfaceChart3DScene-WOLVZOW3.js.br +0 -0
  81. package/dist/SurfaceChart3DScene-WOLVZOW3.js.gz +0 -0
  82. package/dist/chunk-3XJODTAV.js.br +0 -0
  83. package/dist/chunk-3XJODTAV.js.gz +0 -0
  84. package/dist/chunk-6M6WP2TK.mjs.br +0 -0
  85. package/dist/chunk-FHTEL3Q6.js.br +0 -0
  86. package/dist/chunk-FHTEL3Q6.js.gz +0 -0
  87. package/dist/chunk-IEXZ2JSO.js.br +0 -0
  88. package/dist/chunk-IEXZ2JSO.js.gz +0 -0
  89. package/dist/chunk-OPX74QGH.mjs.br +0 -0
  90. package/dist/chunk-OPX74QGH.mjs.gz +0 -0
  91. package/dist/chunk-RPGAI65Z.mjs.br +0 -0
  92. package/dist/chunk-RPGAI65Z.mjs.gz +0 -0
  93. package/dist/chunk-T5IS3MGN.js.br +0 -0
  94. package/dist/chunk-T5IS3MGN.js.gz +0 -0
  95. package/dist/chunk-U2UPBBJV.mjs.br +0 -0
  96. package/dist/chunk-U2UPBBJV.mjs.gz +0 -0
  97. package/dist/chunk-WJNWCKS7.mjs.br +0 -0
  98. package/dist/chunk-WJNWCKS7.mjs.gz +0 -0
  99. package/dist/chunk-YBTRSG74.js.br +0 -0
@@ -87046,6 +87046,52 @@ function buildHollowHitOutline(element) {
87046
87046
  const strokeWidth = hasShapeProperties(element) ? element.shapeStyle?.strokeWidth ?? 0 : 0;
87047
87047
  return { d, strokeWidth: Math.max(strokeWidth * 3, HOLLOW_HIT_MIN_WIDTH) };
87048
87048
  }
87049
+ function createWheelStepBuffer() {
87050
+ return { accumulated: 0 };
87051
+ }
87052
+ var LINE_PX = 16;
87053
+ var PAGE_PX = 400;
87054
+ var STEP_THRESHOLD_PX = 120;
87055
+ var ZOOM_PER_PX = 15e-4;
87056
+ function normalizeWheelDelta({ deltaY, deltaMode = 0 }) {
87057
+ if (deltaMode === 1) {
87058
+ return deltaY * LINE_PX;
87059
+ }
87060
+ if (deltaMode === 2) {
87061
+ return deltaY * PAGE_PX;
87062
+ }
87063
+ return deltaY;
87064
+ }
87065
+ function accumulate(buffer, px3) {
87066
+ if (px3 !== 0 && Math.sign(px3) !== Math.sign(buffer.accumulated)) {
87067
+ buffer.accumulated = 0;
87068
+ }
87069
+ buffer.accumulated += px3;
87070
+ if (buffer.accumulated >= STEP_THRESHOLD_PX) {
87071
+ buffer.accumulated = 0;
87072
+ return { intent: "next-slide" };
87073
+ }
87074
+ if (buffer.accumulated <= -STEP_THRESHOLD_PX) {
87075
+ buffer.accumulated = 0;
87076
+ return { intent: "previous-slide" };
87077
+ }
87078
+ return { intent: "none" };
87079
+ }
87080
+ function mapEditingWheel(input, buffer, canScrollFurther) {
87081
+ const px3 = normalizeWheelDelta(input);
87082
+ if (input.ctrlKey === true || input.metaKey === true) {
87083
+ buffer.accumulated = 0;
87084
+ return { intent: "zoom", deltaScale: -px3 * ZOOM_PER_PX };
87085
+ }
87086
+ if (canScrollFurther) {
87087
+ buffer.accumulated = 0;
87088
+ return { intent: "scroll" };
87089
+ }
87090
+ return accumulate(buffer, px3);
87091
+ }
87092
+ function mapPresentationWheel(input, buffer) {
87093
+ return accumulate(buffer, normalizeWheelDelta(input));
87094
+ }
87049
87095
  function hasStrokePaint(style) {
87050
87096
  if (!style || Math.max(0, style.strokeWidth ?? 0) <= 0) {
87051
87097
  return false;
@@ -101948,39 +101994,11 @@ function getImageFitStyle(el) {
101948
101994
  if (!isImageLikeElement(el)) {
101949
101995
  return uncropped;
101950
101996
  }
101951
- const frLeft = el.fillRectLeft ?? 0;
101952
- const frTop = el.fillRectTop ?? 0;
101953
- const frRight = el.fillRectRight ?? 0;
101954
- const frBottom = el.fillRectBottom ?? 0;
101955
- const hasFillRect = Math.abs(frLeft) + Math.abs(frTop) + Math.abs(frRight) + Math.abs(frBottom) > 1e-4;
101956
- const placementTransform = hasFillRect ? `translate(${round2(frLeft * 100)}%, ${round2(frTop * 100)}%) scale(${round6(
101957
- Math.max(0.01, 1 - frLeft - frRight)
101958
- )}, ${round6(Math.max(0.01, 1 - frTop - frBottom))})` : "";
101959
- const cropLeft = clampCropValue(el.cropLeft);
101960
- const cropTop = clampCropValue(el.cropTop);
101961
- const cropRight = clampCropValue(el.cropRight);
101962
- const cropBottom = clampCropValue(el.cropBottom);
101963
- const hasCrop = cropLeft + cropRight > 1e-4 || cropTop + cropBottom > 1e-4;
101964
- if (!hasCrop && !hasFillRect) {
101997
+ const { placement, crop } = imageFitTransformParts(el);
101998
+ if (!placement && !crop) {
101965
101999
  return uncropped;
101966
102000
  }
101967
- let cropTransform = "";
101968
- if (hasCrop) {
101969
- const horizontalScale = cropLeft + cropRight >= 0.99 ? 0.99 / (cropLeft + cropRight) : 1;
101970
- const verticalScale = cropTop + cropBottom >= 0.99 ? 0.99 / (cropTop + cropBottom) : 1;
101971
- const left = clampCropValue(cropLeft * horizontalScale);
101972
- const right = clampCropValue(cropRight * horizontalScale);
101973
- const top = clampCropValue(cropTop * verticalScale);
101974
- const bottom = clampCropValue(cropBottom * verticalScale);
101975
- const remainingWidth = Math.max(0.01, 1 - left - right);
101976
- const remainingHeight = Math.max(0.01, 1 - top - bottom);
101977
- const tx = Math.round(-left / remainingWidth * 1e4) / 100;
101978
- const ty = Math.round(-top / remainingHeight * 1e4) / 100;
101979
- const sx = Math.round(1 / remainingWidth * 1e6) / 1e6;
101980
- const sy = Math.round(1 / remainingHeight * 1e6) / 1e6;
101981
- cropTransform = `translate(${tx}%, ${ty}%) scale(${sx}, ${sy})`;
101982
- }
101983
- const transform = [placementTransform, cropTransform].filter(Boolean).join(" ");
102001
+ const transform = [placement, crop].filter(Boolean).join(" ");
101984
102002
  return {
101985
102003
  position: "absolute",
101986
102004
  width: "100%",
@@ -101992,6 +102010,47 @@ function getImageFitStyle(el) {
101992
102010
  transform
101993
102011
  };
101994
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
+ }
101995
102054
  function round2(value) {
101996
102055
  return Math.round(value * 100) / 100;
101997
102056
  }
@@ -107737,8 +107796,85 @@ function buildTextRunFilterChain(style) {
107737
107796
  }
107738
107797
  return parts.length > 0 ? parts.join(" ") : void 0;
107739
107798
  }
107740
- var POWERPOINT_METRIC_TRACKING_EM = 3e-3;
107741
- 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
+ }
107742
107878
  function resolveParagraphStrutFontSize(segments, bodyFontSize) {
107743
107879
  let largest;
107744
107880
  for (const segment of segments) {
@@ -108141,6 +108277,88 @@ ${body}
108141
108277
  keyframes
108142
108278
  };
108143
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
+ }
108144
108362
  var TEXT_MAX_DEPTH = 8;
108145
108363
  function elementText(element, depth = 0) {
108146
108364
  const own = element.text ?? "";
@@ -108549,7 +108767,7 @@ function morphPairNeedsCrossfade(fromElement, toElement) {
108549
108767
  }
108550
108768
  var GEOMETRY_EPSILON = 0.5;
108551
108769
  function isInertMorphPair(fromElement, toElement) {
108552
- 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);
108553
108771
  }
108554
108772
  function travelledBox(from, to) {
108555
108773
  const boxes = to ? [from, to] : [from];
@@ -108791,6 +109009,7 @@ function generateFullMorphTransition(fromSlide, toSlide, durationMs, mode = "obj
108791
109009
  allAnimations.push(geo);
108792
109010
  }
108793
109011
  }
109012
+ allAnimations.push(...generateImageCropMorphAnimations(matchResult.pairs, durationMs));
108794
109013
  if (mode === "word" || mode === "character") {
108795
109014
  for (let i = 0; i < matchResult.pairs.length; i++) {
108796
109015
  const pair = matchResult.pairs[i];
@@ -108807,6 +109026,7 @@ function generateFullMorphTransition(fromSlide, toSlide, durationMs, mode = "obj
108807
109026
  ghostIds
108808
109027
  );
108809
109028
  allAnimations.push(...ghosts);
109029
+ allAnimations.push(...generateImageCropGhostAnimations(matchResult.pairs, durationMs, ghostIds));
108810
109030
  const fadeOuts = generateUnmatchedFadeOutAnimations(
108811
109031
  matchResult.unmatchedFrom,
108812
109032
  durationMs,
@@ -108843,14 +109063,14 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = "object
108843
109063
  const outgoingIds = new Set(flattenedOutgoing.map((element) => element.id));
108844
109064
  const incomingAnimations = /* @__PURE__ */ new Map();
108845
109065
  const outgoingAnimations = /* @__PURE__ */ new Map();
109066
+ const incomingImageAnimations = /* @__PURE__ */ new Map();
109067
+ const outgoingImageAnimations = /* @__PURE__ */ new Map();
108846
109068
  const keyframes = [];
108847
109069
  for (const animation of animations) {
108848
109070
  keyframes.push(animation.keyframes);
108849
- if (outgoingIds.has(animation.elementId)) {
108850
- outgoingAnimations.set(animation.elementId, animation.animation);
108851
- } else {
108852
- incomingAnimations.set(animation.elementId, animation.animation);
108853
- }
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);
108854
109074
  }
108855
109075
  const outgoingElements = flattenedOutgoing.filter(
108856
109076
  (element) => outgoingAnimations.has(element.id)
@@ -108859,10 +109079,31 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = "object
108859
109079
  keyframesCss: keyframes.join("\n"),
108860
109080
  incomingAnimations,
108861
109081
  outgoingAnimations,
109082
+ incomingImageAnimations,
109083
+ outgoingImageAnimations,
108862
109084
  outgoingElements,
108863
109085
  durationMs
108864
109086
  };
108865
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
+ }
108866
109107
  function hexToRgb6(hex10) {
108867
109108
  const clean = hex10.replace(/^#/u, "");
108868
109109
  return {
@@ -119039,6 +119280,69 @@ function mediaTransportVisible(surface) {
119039
119280
  }
119040
119281
  return surface.canvasTransport;
119041
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";
119042
119346
  var persistentAudioMap = /* @__PURE__ */ new Map();
119043
119347
  function registerPersistentAudio(elementId, dataUrl, mimetype, loop, volume, trimStartSec) {
119044
119348
  if (persistentAudioMap.has(elementId) || typeof document === "undefined") {
@@ -123307,6 +123611,7 @@ exports.LINK_TOOLTIP_PANEL_CLASS = LINK_TOOLTIP_PANEL_CLASS;
123307
123611
  exports.LOCAL_SYNC_ORIGIN = LOCAL_SYNC_ORIGIN;
123308
123612
  exports.MATERIAL_PRESETS = MATERIAL_PRESETS;
123309
123613
  exports.MAX_ZOOM_SCALE = MAX_ZOOM_SCALE;
123614
+ exports.MEDIA_CHROME_ATTRIBUTE = MEDIA_CHROME_ATTRIBUTE;
123310
123615
  exports.MIN_ZOOM_SCALE = MIN_ZOOM_SCALE;
123311
123616
  exports.MOBILE_BREAKPOINT = MOBILE_BREAKPOINT;
123312
123617
  exports.MOTION_PATH_FAMILIES = MOTION_PATH_FAMILIES;
@@ -123321,7 +123626,6 @@ exports.OUTLINE_SLIDE_ATTR = OUTLINE_SLIDE_ATTR;
123321
123626
  exports.OUTLINE_VIEW_ATTR = OUTLINE_VIEW_ATTR;
123322
123627
  exports.PATTERN_OPTIONS = PATTERN_OPTIONS;
123323
123628
  exports.PEN_COLORS = PEN_COLORS;
123324
- exports.POWERPOINT_METRIC_TRACKING = POWERPOINT_METRIC_TRACKING;
123325
123629
  exports.PRESENTATION_CHANNEL_NAME = PRESENTATION_CHANNEL_NAME;
123326
123630
  exports.PRESENTATION_HASH = PRESENTATION_HASH;
123327
123631
  exports.PRESENTATION_MESSAGE_ORIGIN = PRESENTATION_MESSAGE_ORIGIN;
@@ -123434,6 +123738,7 @@ exports.buildHollowHitOutline = buildHollowHitOutline;
123434
123738
  exports.buildInitialGuides = buildInitialGuides;
123435
123739
  exports.buildInnerShadowCssFromShapeStyle = buildInnerShadowCssFromShapeStyle;
123436
123740
  exports.buildJoinCollaborationConfig = buildJoinCollaborationConfig;
123741
+ exports.buildMorphAnimationRules = buildMorphAnimationRules;
123437
123742
  exports.buildMorphTransitionPlan = buildMorphTransitionPlan;
123438
123743
  exports.buildMotionPathPreview = buildMotionPathPreview;
123439
123744
  exports.buildMultiLayerShadowCss = buildMultiLayerShadowCss;
@@ -123540,6 +123845,7 @@ exports.createSyncGate = createSyncGate;
123540
123845
  exports.createTouchGestureRecognizer = createTouchGestureRecognizer;
123541
123846
  exports.createViewerOptionsStore = createViewerOptionsStore;
123542
123847
  exports.createViewerZoomStore = createViewerZoomStore;
123848
+ exports.createWheelStepBuffer = createWheelStepBuffer;
123543
123849
  exports.customGeometryPathsToSvgSubpaths = customGeometryPathsToSvgSubpaths;
123544
123850
  exports.defaultCssVars = defaultCssVars;
123545
123851
  exports.defaultRadius = defaultRadius;
@@ -123702,10 +124008,15 @@ exports.loadAudienceContent = loadAudienceContent;
123702
124008
  exports.loadSessionDeck = loadSessionDeck;
123703
124009
  exports.makeCloneId = makeCloneId;
123704
124010
  exports.makeSlideId = makeSlideId;
124011
+ exports.mapEditingWheel = mapEditingWheel;
123705
124012
  exports.mapEditorKey = mapEditorKey;
123706
124013
  exports.mapOutlineKey = mapOutlineKey;
123707
124014
  exports.mapPresentationKey = mapPresentationKey;
124015
+ exports.mapPresentationWheel = mapPresentationWheel;
123708
124016
  exports.mayLeaveSlideShow = mayLeaveSlideShow;
124017
+ exports.mediaFallbackIcon = mediaFallbackIcon;
124018
+ exports.mediaFallbackLabelKey = mediaFallbackLabelKey;
124019
+ exports.mediaFallbackVisual = mediaFallbackVisual;
123709
124020
  exports.mediaPlaybackAttributes = mediaPlaybackAttributes;
123710
124021
  exports.mediaTransportVisible = mediaTransportVisible;
123711
124022
  exports.mergeAdditiveSelection = mergeAdditiveSelection;
@@ -123812,6 +124123,7 @@ exports.resolveGroupChildFill = resolveGroupChildFill;
123812
124123
  exports.resolveInkColor = resolveInkColor;
123813
124124
  exports.resolveInkOpacity = resolveInkOpacity;
123814
124125
  exports.resolveInkWidth = resolveInkWidth;
124126
+ exports.resolveMetricTrackingPx = resolveMetricTrackingPx;
123815
124127
  exports.resolveOleType = resolveOleType;
123816
124128
  exports.resolveParagraphAlign = resolveParagraphAlign;
123817
124129
  exports.resolveParagraphRtl = resolveParagraphRtl;
Binary file
@@ -1,8 +1,8 @@
1
- import { computeFocusTargets, aiChangeAnimationCss, changeGhostStyle, createChatHistoryStore, toRenderableParts } from './chunk-U2UPBBJV.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-OPX74QGH.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-WJNWCKS7.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-6M6WP2TK.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-TPUVF4FY.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.2" ;
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-OXAKUVYH.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 chunkYBTRSG74_js = require('./chunk-YBTRSG74.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 chunkYBTRSG74_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(chunkYBTRSG74_js.ThemePresets)
15474
+ availablePresets: Object.keys(chunk3NDRTC7T_js.ThemePresets)
15475
15475
  };
15476
15476
  };
15477
15477
  var readExecutors = {
Binary file