pptx-react-viewer 2.16.0 → 2.16.2

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 +4 -0
  2. package/dist/{AiChatPanel-VKGWK23E.js → AiChatPanel-MCGNCS7Q.js} +22 -22
  3. package/dist/AiChatPanel-MCGNCS7Q.js.br +0 -0
  4. package/dist/AiChatPanel-MCGNCS7Q.js.gz +0 -0
  5. package/dist/{AiChatPanel-TYU52HDW.mjs → AiChatPanel-WJXPCHQK.mjs} +3 -3
  6. package/dist/AiChatPanel-WJXPCHQK.mjs.br +0 -0
  7. package/dist/AiChatPanel-WJXPCHQK.mjs.gz +0 -0
  8. package/dist/{Model3DScene-267BHD5T.mjs → Model3DScene-IXW2AKAU.mjs} +1 -1
  9. package/dist/{Model3DScene-267BHD5T.mjs.br → Model3DScene-IXW2AKAU.mjs.br} +0 -0
  10. package/dist/Model3DScene-IXW2AKAU.mjs.gz +0 -0
  11. package/dist/{Model3DScene-TG7OSR6V.js → Model3DScene-Q2DTGVQ7.js} +2 -2
  12. package/dist/Model3DScene-Q2DTGVQ7.js.br +0 -0
  13. package/dist/Model3DScene-Q2DTGVQ7.js.gz +0 -0
  14. package/dist/{SurfaceChart3DScene-GK4JHZAC.js → SurfaceChart3DScene-AD43LAOO.js} +2 -2
  15. package/dist/SurfaceChart3DScene-AD43LAOO.js.br +0 -0
  16. package/dist/SurfaceChart3DScene-AD43LAOO.js.gz +0 -0
  17. package/dist/{SurfaceChart3DScene-RPRVXRQZ.mjs → SurfaceChart3DScene-MODEHQ6G.mjs} +1 -1
  18. package/dist/{SurfaceChart3DScene-RPRVXRQZ.mjs.br → SurfaceChart3DScene-MODEHQ6G.mjs.br} +0 -0
  19. package/dist/SurfaceChart3DScene-MODEHQ6G.mjs.gz +0 -0
  20. package/dist/{chunk-P3Y3OMAD.js → chunk-4GX347MG.js} +517 -65
  21. package/dist/chunk-4GX347MG.js.br +0 -0
  22. package/dist/{chunk-P3Y3OMAD.js.gz → chunk-4GX347MG.js.gz} +0 -0
  23. package/dist/{chunk-PILJZ5OE.js → chunk-CIK6XUOH.js} +3 -3
  24. package/dist/chunk-CIK6XUOH.js.br +0 -0
  25. package/dist/{chunk-PILJZ5OE.js.gz → chunk-CIK6XUOH.js.gz} +0 -0
  26. package/dist/{chunk-7W5MCYBN.js → chunk-JV6DI7AK.js} +1100 -1073
  27. package/dist/chunk-JV6DI7AK.js.br +0 -0
  28. package/dist/chunk-JV6DI7AK.js.gz +0 -0
  29. package/dist/{chunk-VNVURLZM.mjs → chunk-LDD2UVCV.mjs} +54 -27
  30. package/dist/chunk-LDD2UVCV.mjs.br +0 -0
  31. package/dist/chunk-LDD2UVCV.mjs.gz +0 -0
  32. package/dist/{chunk-OIITLGKQ.mjs → chunk-MDFCBYEM.mjs} +510 -65
  33. package/dist/chunk-MDFCBYEM.mjs.br +0 -0
  34. package/dist/{chunk-OIITLGKQ.mjs.gz → chunk-MDFCBYEM.mjs.gz} +0 -0
  35. package/dist/{chunk-GOPIG4VW.js → chunk-NKE64XVV.js} +348 -344
  36. package/dist/chunk-NKE64XVV.js.br +0 -0
  37. package/dist/chunk-NKE64XVV.js.gz +0 -0
  38. package/dist/{chunk-AX75ONFY.js → chunk-P6KM7RO5.js} +415 -396
  39. package/dist/chunk-P6KM7RO5.js.br +0 -0
  40. package/dist/chunk-P6KM7RO5.js.gz +0 -0
  41. package/dist/{chunk-ULB35HMJ.mjs → chunk-QI2JCXTH.mjs} +1 -1
  42. package/dist/chunk-QI2JCXTH.mjs.br +0 -0
  43. package/dist/chunk-QI2JCXTH.mjs.gz +0 -0
  44. package/dist/{chunk-TWPZJXLC.mjs → chunk-UWYHBCLM.mjs} +11 -7
  45. package/dist/chunk-UWYHBCLM.mjs.br +0 -0
  46. package/dist/chunk-UWYHBCLM.mjs.gz +0 -0
  47. package/dist/{chunk-FFBY2TKD.mjs → chunk-Z4CS2ZYN.mjs} +173 -154
  48. package/dist/chunk-Z4CS2ZYN.mjs.br +0 -0
  49. package/dist/chunk-Z4CS2ZYN.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 +43 -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.br +0 -0
  77. package/dist/Model3DScene-TG7OSR6V.js.gz +0 -0
  78. package/dist/SurfaceChart3DScene-GK4JHZAC.js.br +0 -0
  79. package/dist/SurfaceChart3DScene-GK4JHZAC.js.gz +0 -0
  80. package/dist/SurfaceChart3DScene-RPRVXRQZ.mjs.gz +0 -0
  81. package/dist/chunk-7W5MCYBN.js.br +0 -0
  82. package/dist/chunk-7W5MCYBN.js.gz +0 -0
  83. package/dist/chunk-AX75ONFY.js.br +0 -0
  84. package/dist/chunk-AX75ONFY.js.gz +0 -0
  85. package/dist/chunk-FFBY2TKD.mjs.br +0 -0
  86. package/dist/chunk-FFBY2TKD.mjs.gz +0 -0
  87. package/dist/chunk-GOPIG4VW.js.br +0 -0
  88. package/dist/chunk-GOPIG4VW.js.gz +0 -0
  89. package/dist/chunk-OIITLGKQ.mjs.br +0 -0
  90. package/dist/chunk-P3Y3OMAD.js.br +0 -0
  91. package/dist/chunk-PILJZ5OE.js.br +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,118 @@ 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_TRACKING_PX_PER_CHAR = 1 / (2 * ADVANCE_STEPS_PER_PX);
107801
+ var MAX_CACHE_ENTRIES = 2e4;
107802
+ var measureContext;
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
+ trackingCache = /* @__PURE__ */ new Map();
107812
+ });
107813
+ }
107814
+ function getMeasureContext() {
107815
+ if (measureContext !== void 0) {
107816
+ return measureContext;
107817
+ }
107818
+ if (typeof document === "undefined") {
107819
+ measureContext = null;
107820
+ return null;
107821
+ }
107822
+ installFontLoadHook();
107823
+ measureContext = document.createElement("canvas").getContext("2d");
107824
+ return measureContext;
107825
+ }
107826
+ function toCanvasFont(font) {
107827
+ const size = font.fontSizePx && font.fontSizePx > 0 ? font.fontSizePx : DEFAULT_TEXT_FONT_SIZE;
107828
+ const family = font.fontFamily || DEFAULT_FONT_FAMILY;
107829
+ return `${font.italic ? "italic " : ""}${font.bold ? "bold " : ""}${size}px ${family}`;
107830
+ }
107831
+ function advancesOf(ctx, canvasFont, chars) {
107832
+ ctx.font = canvasFont;
107833
+ ctx.fontKerning = "none";
107834
+ const advances = [];
107835
+ let previous = 0;
107836
+ let prefix = "";
107837
+ for (const char of chars) {
107838
+ prefix += char;
107839
+ const width = ctx.measureText(prefix).width;
107840
+ advances.push(width - previous);
107841
+ previous = width;
107842
+ }
107843
+ return advances;
107844
+ }
107845
+ function resolveMetricTrackingPx(text2, font) {
107846
+ if (!text2) {
107847
+ return 0;
107848
+ }
107849
+ const canvasFont = toCanvasFont(font);
107850
+ const key = `${canvasFont}\0${text2}`;
107851
+ const cached = trackingCache.get(key);
107852
+ if (cached !== void 0) {
107853
+ return cached;
107854
+ }
107855
+ const ctx = getMeasureContext();
107856
+ if (!ctx) {
107857
+ return 0;
107858
+ }
107859
+ const chars = [...text2];
107860
+ let powerPoint = 0;
107861
+ for (const advance of advancesOf(ctx, canvasFont, chars)) {
107862
+ powerPoint += Math.round(advance * ADVANCE_STEPS_PER_PX);
107863
+ }
107864
+ ctx.fontKerning = "auto";
107865
+ const natural = ctx.measureText(text2).width;
107866
+ if (!(natural > 0)) {
107867
+ return 0;
107868
+ }
107869
+ powerPoint /= ADVANCE_STEPS_PER_PX;
107870
+ const limit = MAX_TRACKING_PX_PER_CHAR;
107871
+ const raw = (powerPoint - natural) / chars.length;
107872
+ const tracking = Math.min(limit, Math.max(-limit, raw));
107873
+ if (trackingCache.size >= MAX_CACHE_ENTRIES) {
107874
+ trackingCache = /* @__PURE__ */ new Map();
107875
+ }
107876
+ trackingCache.set(key, tracking);
107877
+ return tracking;
107878
+ }
107879
+ function isBreakBoundary(previous, next) {
107880
+ const previousSpace = /\s/u.test(previous);
107881
+ const nextSpace = /\s/u.test(next);
107882
+ if (previousSpace !== nextSpace) {
107883
+ return true;
107884
+ }
107885
+ return previous === "-" && next !== "-" && !nextSpace;
107886
+ }
107887
+ function splitRunForMetrics(text2, font) {
107888
+ const chars = [...text2];
107889
+ if (chars.length < 2 || !getMeasureContext()) {
107890
+ return [{ text: text2, tracking: resolveMetricTrackingPx(text2, font) }];
107891
+ }
107892
+ const pieces = [];
107893
+ let current = chars[0];
107894
+ for (let i = 1; i < chars.length; i++) {
107895
+ if (isBreakBoundary(chars[i - 1], chars[i])) {
107896
+ pieces.push(current);
107897
+ current = "";
107898
+ }
107899
+ current += chars[i];
107900
+ }
107901
+ pieces.push(current);
107902
+ if (pieces.length === 1) {
107903
+ return [{ text: text2, tracking: resolveMetricTrackingPx(text2, font) }];
107904
+ }
107905
+ return pieces.map((piece) => ({ text: piece, tracking: resolveMetricTrackingPx(piece, font) }));
107906
+ }
107907
+ function pieceLetterSpacing(authoredPx, tracking) {
107908
+ const spacing = authoredPx + tracking;
107909
+ return spacing === 0 ? void 0 : `${spacing}px`;
107910
+ }
107788
107911
  function resolveParagraphStrutFontSize(segments, bodyFontSize) {
107789
107912
  let largest;
107790
107913
  for (const segment of segments) {
@@ -107895,6 +108018,43 @@ function correspondingGroup(group2, candidates) {
107895
108018
  return sameBox(group2, candidate);
107896
108019
  });
107897
108020
  }
108021
+ var CHILD_OVERLAP_RATIO = 0.5;
108022
+ function boxOverlapRatio(a, b) {
108023
+ const left = Math.max(a.x, b.x);
108024
+ const top = Math.max(a.y, b.y);
108025
+ const right = Math.min(a.x + a.width, b.x + b.width);
108026
+ const bottom = Math.min(a.y + a.height, b.y + b.height);
108027
+ if (right <= left || bottom <= top) {
108028
+ return 0;
108029
+ }
108030
+ const intersection = (right - left) * (bottom - top);
108031
+ const union = a.width * a.height + b.width * b.height - intersection;
108032
+ return union > 0 ? intersection / union : 0;
108033
+ }
108034
+ function childrenPair(a, b) {
108035
+ const morphName = getElementMorphName(a);
108036
+ if (morphName !== void 0 && getElementMorphName(b) === morphName) {
108037
+ return true;
108038
+ }
108039
+ if (a.name && a.name === b.name) {
108040
+ return true;
108041
+ }
108042
+ return boxOverlapRatio(a, b) >= CHILD_OVERLAP_RATIO;
108043
+ }
108044
+ function childrenCorrespond(a, b) {
108045
+ if (a.length !== b.length || a.length === 0) {
108046
+ return false;
108047
+ }
108048
+ const unclaimed = b.map((child22) => child22);
108049
+ for (const child22 of a) {
108050
+ const index = unclaimed.findIndex((candidate) => childrenPair(child22, candidate));
108051
+ if (index < 0) {
108052
+ return false;
108053
+ }
108054
+ unclaimed.splice(index, 1);
108055
+ }
108056
+ return true;
108057
+ }
107898
108058
  function flattenMorphElements(elements, counterpart, offsetX = 0, offsetY = 0) {
107899
108059
  const out = [];
107900
108060
  for (const element of elements) {
@@ -107902,7 +108062,7 @@ function flattenMorphElements(elements, counterpart, offsetX = 0, offsetY = 0) {
107902
108062
  if (children8 && containsMorphNamedDescendant(element)) {
107903
108063
  const twin = correspondingGroup(element, counterpart);
107904
108064
  const twinChildren = twin ? groupChildren(twin) ?? [] : void 0;
107905
- if (twinChildren) {
108065
+ if (twinChildren && childrenCorrespond(children8, twinChildren)) {
107906
108066
  out.push(
107907
108067
  ...flattenMorphElements(children8, twinChildren, offsetX + element.x, offsetY + element.y)
107908
108068
  );
@@ -108122,6 +108282,7 @@ function interpolateOutline(from, to, t) {
108122
108282
  return parts.join(" ");
108123
108283
  }
108124
108284
  var MORPH_EASING = "cubic-bezier(0.4, 0, 0.2, 1)";
108285
+ var MORPH_CROSSFADE_EASING = "cubic-bezier(0.2, 0, 0.4, 1)";
108125
108286
  var MORPH_FADE_OUT_HOLD_PERCENT = 4;
108126
108287
  var MORPH_FADE_OUT_END_PERCENT = 23;
108127
108288
  var MORPH_FADE_IN_START_PERCENT = 42;
@@ -108187,6 +108348,88 @@ ${body}
108187
108348
  keyframes
108188
108349
  };
108189
108350
  }
108351
+ var CROP_EPSILON = 1e-4;
108352
+ function cropInsets(element) {
108353
+ if (!isImageLikeElement(element)) {
108354
+ return [0, 0, 0, 0, 0, 0, 0, 0];
108355
+ }
108356
+ return [
108357
+ element.cropLeft ?? 0,
108358
+ element.cropTop ?? 0,
108359
+ element.cropRight ?? 0,
108360
+ element.cropBottom ?? 0,
108361
+ element.fillRectLeft ?? 0,
108362
+ element.fillRectTop ?? 0,
108363
+ element.fillRectRight ?? 0,
108364
+ element.fillRectBottom ?? 0
108365
+ ];
108366
+ }
108367
+ function morphImageCropChanged(fromElement, toElement) {
108368
+ if (!isImageLikeElement(fromElement) || !isImageLikeElement(toElement)) {
108369
+ return false;
108370
+ }
108371
+ const from = cropInsets(fromElement);
108372
+ const to = cropInsets(toElement);
108373
+ return from.some((value, index) => Math.abs(value - to[index]) > CROP_EPSILON);
108374
+ }
108375
+ function cropKeyframes(name, fromTransform, toTransform) {
108376
+ return `
108377
+ @keyframes ${name} {
108378
+ from {
108379
+ transform-origin: top left;
108380
+ transform: ${fromTransform};
108381
+ }
108382
+ to {
108383
+ transform-origin: top left;
108384
+ transform: ${toTransform};
108385
+ }
108386
+ }`;
108387
+ }
108388
+ function generateImageCropMorphAnimations(pairs2, durationMs) {
108389
+ const animations = [];
108390
+ for (let index = 0; index < pairs2.length; index++) {
108391
+ const { fromElement, toElement } = pairs2[index];
108392
+ if (!morphImageCropChanged(fromElement, toElement)) {
108393
+ continue;
108394
+ }
108395
+ const safeName = `pptx-morph-crop-${index}-${toElement.id.replace(/[^a-zA-Z0-9]/gu, "")}`;
108396
+ animations.push({
108397
+ elementId: toElement.id,
108398
+ target: "image",
108399
+ animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
108400
+ keyframes: cropKeyframes(
108401
+ safeName,
108402
+ buildImageFitTransform(fromElement, true),
108403
+ buildImageFitTransform(toElement, true)
108404
+ )
108405
+ });
108406
+ }
108407
+ return animations;
108408
+ }
108409
+ function generateImageCropGhostAnimations(pairs2, durationMs, ghostIds) {
108410
+ const animations = [];
108411
+ for (let index = 0; index < pairs2.length; index++) {
108412
+ const { fromElement, toElement } = pairs2[index];
108413
+ if (ghostIds && !ghostIds.has(fromElement.id)) {
108414
+ continue;
108415
+ }
108416
+ if (!morphImageCropChanged(fromElement, toElement)) {
108417
+ continue;
108418
+ }
108419
+ const safeName = `pptx-morph-crop-ghost-${index}-${fromElement.id.replace(/[^a-zA-Z0-9]/gu, "")}`;
108420
+ animations.push({
108421
+ elementId: fromElement.id,
108422
+ target: "image",
108423
+ animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
108424
+ keyframes: cropKeyframes(
108425
+ safeName,
108426
+ buildImageFitTransform(fromElement, true),
108427
+ buildImageFitTransform(toElement, true)
108428
+ )
108429
+ });
108430
+ }
108431
+ return animations;
108432
+ }
108190
108433
  var TEXT_MAX_DEPTH = 8;
108191
108434
  function elementText(element, depth = 0) {
108192
108435
  const own = element.text ?? "";
@@ -108360,6 +108603,69 @@ function matchMorphElementsFull(fromSlide, toSlide) {
108360
108603
  const unmatchedTo = toElements.filter((el) => !usedTo.has(el.id));
108361
108604
  return { pairs: pairs2, unmatchedFrom, unmatchedTo };
108362
108605
  }
108606
+ function travelledBox(from, to) {
108607
+ const boxes = to ? [from, to] : [from];
108608
+ return {
108609
+ left: Math.min(...boxes.map((element) => element.x)),
108610
+ top: Math.min(...boxes.map((element) => element.y)),
108611
+ right: Math.max(...boxes.map((element) => element.x + element.width)),
108612
+ bottom: Math.max(...boxes.map((element) => element.y + element.height))
108613
+ };
108614
+ }
108615
+ function boxesOverlap(a, b) {
108616
+ return a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom;
108617
+ }
108618
+ function buildMorphMergedOrder(outgoing, incoming, pairs2) {
108619
+ const partnerOf = new Map(pairs2.map((pair) => [pair.toElement.id, pair.fromElement.id]));
108620
+ const outgoingIndex = new Map(outgoing.map((element, index) => [element.id, index]));
108621
+ const rank = /* @__PURE__ */ new Map();
108622
+ let next = 0;
108623
+ let cursor = 0;
108624
+ const flushOutgoingBelow = (limit) => {
108625
+ while (cursor < limit) {
108626
+ const element = outgoing[cursor];
108627
+ cursor += 1;
108628
+ if (!rank.has(element.id)) {
108629
+ rank.set(element.id, next);
108630
+ next += 1;
108631
+ }
108632
+ }
108633
+ };
108634
+ for (const element of incoming) {
108635
+ const partner = partnerOf.get(element.id);
108636
+ const partnerIndex = partner === void 0 ? void 0 : outgoingIndex.get(partner);
108637
+ if (partner === void 0 || partnerIndex === void 0) {
108638
+ rank.set(element.id, next);
108639
+ next += 1;
108640
+ continue;
108641
+ }
108642
+ flushOutgoingBelow(partnerIndex + 1);
108643
+ rank.set(element.id, rank.get(partner) ?? next);
108644
+ }
108645
+ flushOutgoingBelow(outgoing.length);
108646
+ return rank;
108647
+ }
108648
+ function resolveMorphOverlayArrivals(outgoing, incoming, pairs2, holdingGhostIds) {
108649
+ const rank = buildMorphMergedOrder(outgoing, incoming, pairs2);
108650
+ const matched = new Set(pairs2.map((pair) => pair.toElement.id));
108651
+ const counterpart = new Map(pairs2.map((pair) => [pair.fromElement.id, pair.toElement]));
108652
+ const ghosts = outgoing.filter((element) => holdingGhostIds.has(element.id)).map((element) => ({
108653
+ rank: rank.get(element.id) ?? 0,
108654
+ box: travelledBox(element, counterpart.get(element.id))
108655
+ }));
108656
+ const lifted = /* @__PURE__ */ new Set();
108657
+ for (const element of incoming) {
108658
+ if (matched.has(element.id)) {
108659
+ continue;
108660
+ }
108661
+ const mine = rank.get(element.id) ?? 0;
108662
+ const box = travelledBox(element);
108663
+ if (ghosts.some((ghost) => ghost.rank < mine && boxesOverlap(ghost.box, box))) {
108664
+ lifted.add(element.id);
108665
+ }
108666
+ }
108667
+ return lifted;
108668
+ }
108363
108669
  function tokenizeText(element, mode) {
108364
108670
  if (!hasTextProperties(element) || !element.text) {
108365
108671
  return [];
@@ -108595,19 +108901,7 @@ function morphPairNeedsCrossfade(fromElement, toElement) {
108595
108901
  }
108596
108902
  var GEOMETRY_EPSILON = 0.5;
108597
108903
  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);
108599
- }
108600
- function travelledBox(from, to) {
108601
- const boxes = to ? [from, to] : [from];
108602
- return {
108603
- left: Math.min(...boxes.map((element) => element.x)),
108604
- top: Math.min(...boxes.map((element) => element.y)),
108605
- right: Math.max(...boxes.map((element) => element.x + element.width)),
108606
- bottom: Math.max(...boxes.map((element) => element.y + element.height))
108607
- };
108608
- }
108609
- function boxesOverlap(a, b) {
108610
- return a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom;
108904
+ 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);
108611
108905
  }
108612
108906
  function resolveMorphGhostIds(outgoingElements, pairs2) {
108613
108907
  const counterparts = new Map(pairs2.map((pair) => [pair.fromElement.id, pair.toElement]));
@@ -108629,6 +108923,10 @@ function crossfadeIncomingMayFadeIn(element) {
108629
108923
  if (image.imagePath || image.svgPath) {
108630
108924
  return false;
108631
108925
  }
108926
+ const children8 = element.children;
108927
+ if (children8?.length) {
108928
+ return children8.every((child22) => crossfadeIncomingMayFadeIn(child22));
108929
+ }
108632
108930
  if (!hasShapeProperties(element)) {
108633
108931
  return true;
108634
108932
  }
@@ -108662,13 +108960,15 @@ function generateMorphAnimations(pairs2, durationMs, _mode = "object", ghostIds)
108662
108960
  const inert = ghosted && isInertMorphPair(fromElement, toElement);
108663
108961
  const crossfadesIn = !inert && morphPairNeedsCrossfade(fromElement, toElement) && crossfadeIncomingMayFadeIn(toElement);
108664
108962
  const fromProps = [
108665
- ` transform: translate(${dx}px, ${dy}px) scale(${sx}, ${sy}) rotate(${fromRot}deg)${flips};`,
108666
- ` opacity: ${inert ? 0 : crossfadesIn ? 0 : fromOpacity};`
108963
+ ` transform: translate(${dx}px, ${dy}px) scale(${sx}, ${sy}) rotate(${fromRot}deg)${flips};`
108667
108964
  ];
108668
108965
  const toProps = [
108669
- ` transform: translate(0, 0) scale(1, 1) rotate(${toRot}deg)${flips};`,
108670
- ` opacity: ${inert ? 0 : toOpacity};`
108966
+ ` transform: translate(0, 0) scale(1, 1) rotate(${toRot}deg)${flips};`
108671
108967
  ];
108968
+ if (!crossfadesIn) {
108969
+ fromProps.push(` opacity: ${inert ? 0 : fromOpacity};`);
108970
+ toProps.push(` opacity: ${inert ? 0 : toOpacity};`);
108971
+ }
108672
108972
  const colorInterp = buildColorInterpolationProps(fromElement, toElement);
108673
108973
  if (colorInterp) {
108674
108974
  fromProps.push(` background-color: ${colorInterp.fromBg};`);
@@ -108687,10 +108987,18 @@ ${fromProps.join("\n")}
108687
108987
  to {
108688
108988
  ${toProps.join("\n")}
108689
108989
  }
108690
- }`;
108990
+ }${crossfadesIn ? `
108991
+ @keyframes ${safeName}-fade {
108992
+ from {
108993
+ opacity: 0;
108994
+ }
108995
+ to {
108996
+ opacity: ${toOpacity};
108997
+ }
108998
+ }` : ""}`;
108691
108999
  animations.push({
108692
109000
  elementId: toElement.id,
108693
- animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
109001
+ animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards${crossfadesIn ? `, ${safeName}-fade ${durationMs}ms ${MORPH_CROSSFADE_EASING} forwards` : ""}`,
108694
109002
  keyframes
108695
109003
  });
108696
109004
  }
@@ -108712,22 +109020,31 @@ function generateMorphGhostAnimations(pairs2, durationMs, startIndex, ghostIds)
108712
109020
  const fromRot = fromElement.rotation ?? 0;
108713
109021
  const toRot = shortestRotationTarget(fromRot, toElement.rotation ?? 0);
108714
109022
  const flips = `${fromElement.flipHorizontal ? " scaleX(-1)" : ""}${fromElement.flipVertical ? " scaleY(-1)" : ""}`;
109023
+ const opacity2 = fromElement.opacity ?? 1;
108715
109024
  const keyframes = `
108716
109025
  @keyframes ${safeName} {
108717
109026
  from {
108718
109027
  transform-origin: center;
108719
- transform: translate(0, 0) scale(1, 1) rotate(${fromRot}deg)${flips};
108720
- opacity: ${fromElement.opacity ?? 1};
109028
+ transform: translate(0, 0) scale(1, 1) rotate(${fromRot}deg)${flips};${fadesOut ? "" : `
109029
+ opacity: ${opacity2};`}
108721
109030
  }
108722
109031
  to {
108723
109032
  transform-origin: center;
108724
- transform: translate(${dx}px, ${dy}px) scale(${sx}, ${sy}) rotate(${toRot}deg)${flips};
108725
- opacity: ${fadesOut ? 0 : fromElement.opacity ?? 1};
109033
+ transform: translate(${dx}px, ${dy}px) scale(${sx}, ${sy}) rotate(${toRot}deg)${flips};${fadesOut ? "" : `
109034
+ opacity: ${opacity2};`}
108726
109035
  }
108727
- }`;
109036
+ }${fadesOut ? `
109037
+ @keyframes ${safeName}-fade {
109038
+ from {
109039
+ opacity: ${opacity2};
109040
+ }
109041
+ to {
109042
+ opacity: 0;
109043
+ }
109044
+ }` : ""}`;
108728
109045
  animations.push({
108729
109046
  elementId: fromElement.id,
108730
- animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards`,
109047
+ animation: `${safeName} ${durationMs}ms ${MORPH_EASING} forwards${fadesOut ? `, ${safeName}-fade ${durationMs}ms ${MORPH_CROSSFADE_EASING} forwards` : ""}`,
108731
109048
  keyframes
108732
109049
  });
108733
109050
  }
@@ -108837,6 +109154,7 @@ function generateFullMorphTransition(fromSlide, toSlide, durationMs, mode = "obj
108837
109154
  allAnimations.push(geo);
108838
109155
  }
108839
109156
  }
109157
+ allAnimations.push(...generateImageCropMorphAnimations(matchResult.pairs, durationMs));
108840
109158
  if (mode === "word" || mode === "character") {
108841
109159
  for (let i = 0; i < matchResult.pairs.length; i++) {
108842
109160
  const pair = matchResult.pairs[i];
@@ -108853,6 +109171,7 @@ function generateFullMorphTransition(fromSlide, toSlide, durationMs, mode = "obj
108853
109171
  ghostIds
108854
109172
  );
108855
109173
  allAnimations.push(...ghosts);
109174
+ allAnimations.push(...generateImageCropGhostAnimations(matchResult.pairs, durationMs, ghostIds));
108856
109175
  const fadeOuts = generateUnmatchedFadeOutAnimations(
108857
109176
  matchResult.unmatchedFrom,
108858
109177
  durationMs,
@@ -108867,6 +109186,16 @@ function generateFullMorphTransition(fromSlide, toSlide, durationMs, mode = "obj
108867
109186
  allAnimations.push(...fadeIns);
108868
109187
  return allAnimations;
108869
109188
  }
109189
+ var LIFTED_HIDDEN_NAME = "pptx-morph-lifted-hidden";
109190
+ var LIFTED_HIDDEN_KEYFRAMES = `
109191
+ @keyframes ${LIFTED_HIDDEN_NAME} {
109192
+ from {
109193
+ opacity: 0;
109194
+ }
109195
+ to {
109196
+ opacity: 0;
109197
+ }
109198
+ }`;
108870
109199
  function morphOptionToMode(option) {
108871
109200
  if (option === "byWord") {
108872
109201
  return "word";
@@ -108889,26 +109218,79 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = "object
108889
109218
  const outgoingIds = new Set(flattenedOutgoing.map((element) => element.id));
108890
109219
  const incomingAnimations = /* @__PURE__ */ new Map();
108891
109220
  const outgoingAnimations = /* @__PURE__ */ new Map();
109221
+ const incomingImageAnimations = /* @__PURE__ */ new Map();
109222
+ const outgoingImageAnimations = /* @__PURE__ */ new Map();
108892
109223
  const keyframes = [];
108893
109224
  for (const animation of animations) {
108894
109225
  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
- }
109226
+ const isOutgoing = outgoingIds.has(animation.elementId);
109227
+ const target = animation.target === "image" ? isOutgoing ? outgoingImageAnimations : incomingImageAnimations : isOutgoing ? outgoingAnimations : incomingAnimations;
109228
+ target.set(animation.elementId, animation.animation);
108900
109229
  }
108901
109230
  const outgoingElements = flattenedOutgoing.filter(
108902
109231
  (element) => outgoingAnimations.has(element.id)
108903
109232
  );
109233
+ const flattenedIncoming = flattenMorphElements(toSlide.elements, fromSlide.elements);
109234
+ const holdingGhostIds = new Set(
109235
+ match.pairs.filter(
109236
+ (candidate) => outgoingAnimations.has(candidate.fromElement.id) && !morphPairNeedsCrossfade(candidate.fromElement, candidate.toElement)
109237
+ ).map((candidate) => candidate.fromElement.id)
109238
+ );
109239
+ const lifted = resolveMorphOverlayArrivals(
109240
+ flattenedOutgoing,
109241
+ flattenedIncoming,
109242
+ match.pairs,
109243
+ holdingGhostIds
109244
+ );
109245
+ const overlayIncomingAnimations = /* @__PURE__ */ new Map();
109246
+ for (const id of lifted) {
109247
+ const animation = incomingAnimations.get(id);
109248
+ if (animation === void 0) {
109249
+ continue;
109250
+ }
109251
+ overlayIncomingAnimations.set(id, animation);
109252
+ incomingAnimations.set(id, `${LIFTED_HIDDEN_NAME} ${durationMs}ms linear forwards`);
109253
+ }
109254
+ if (overlayIncomingAnimations.size > 0) {
109255
+ keyframes.push(LIFTED_HIDDEN_KEYFRAMES);
109256
+ }
109257
+ const overlayIncomingElements = flattenedIncoming.filter(
109258
+ (element) => overlayIncomingAnimations.has(element.id)
109259
+ );
108904
109260
  return {
108905
109261
  keyframesCss: keyframes.join("\n"),
108906
109262
  incomingAnimations,
108907
109263
  outgoingAnimations,
109264
+ incomingImageAnimations,
109265
+ outgoingImageAnimations,
109266
+ overlayIncomingAnimations,
108908
109267
  outgoingElements,
109268
+ overlayIncomingElements,
108909
109269
  durationMs
108910
109270
  };
108911
109271
  }
109272
+ function cssAttributeValue(value) {
109273
+ return value.replace(/\\/gu, "\\\\").replace(/"/gu, '\\"');
109274
+ }
109275
+ function buildMorphAnimationRules(plan, scopeAttribute, which = "incoming", only) {
109276
+ const prefix = scopeAttribute ? `[${scopeAttribute}] ` : "";
109277
+ const rules = [];
109278
+ const emit = (animations, suffix) => {
109279
+ for (const [elementId, animation] of animations) {
109280
+ rules.push(
109281
+ `${prefix}[data-element-id="${cssAttributeValue(elementId)}"]${suffix} { animation: ${animation}; }`
109282
+ );
109283
+ }
109284
+ };
109285
+ if (only !== "image") {
109286
+ emit(
109287
+ which === "outgoing" ? plan.outgoingAnimations : which === "lifted" ? plan.overlayIncomingAnimations : plan.incomingAnimations,
109288
+ ""
109289
+ );
109290
+ }
109291
+ emit(which === "outgoing" ? plan.outgoingImageAnimations : plan.incomingImageAnimations, " img");
109292
+ return rules.join("\n");
109293
+ }
108912
109294
  function hexToRgb6(hex10) {
108913
109295
  const clean = hex10.replace(/^#/u, "");
108914
109296
  return {
@@ -119085,6 +119467,69 @@ function mediaTransportVisible(surface) {
119085
119467
  }
119086
119468
  return surface.canvasTransport;
119087
119469
  }
119470
+ function mediaFallbackVisual(surface, input) {
119471
+ const contentOnly = surface.presenting || surface.preview;
119472
+ if (contentOnly) {
119473
+ return { poster: input.hasPoster, dimPoster: false, badge: "none", placeholder: "none" };
119474
+ }
119475
+ const missing = input.missing === true;
119476
+ if (input.hasPoster) {
119477
+ return {
119478
+ poster: true,
119479
+ dimPoster: missing,
119480
+ badge: missing ? "missing" : "play",
119481
+ placeholder: "none"
119482
+ };
119483
+ }
119484
+ return {
119485
+ poster: false,
119486
+ dimPoster: false,
119487
+ badge: "none",
119488
+ placeholder: missing ? "missing" : "typed"
119489
+ };
119490
+ }
119491
+ var MEDIA_FALLBACK_ICONS = {
119492
+ play: ["M5 3 L19 12 L5 21 Z"],
119493
+ missing: ["M12 2 a10 10 0 1 0 0 20 a10 10 0 1 0 0-20", "M4 4 L20 20"],
119494
+ audio: [
119495
+ "M9 18V5l12-2v13",
119496
+ "M6 15 a3 3 0 1 0 0 6 a3 3 0 1 0 0-6",
119497
+ "M18 13 a3 3 0 1 0 0 6 a3 3 0 1 0 0-6"
119498
+ ]
119499
+ };
119500
+ function mediaFallbackIcon(visual, mediaType) {
119501
+ if (visual.badge === "missing" || visual.placeholder === "missing") {
119502
+ return MEDIA_FALLBACK_ICONS.missing;
119503
+ }
119504
+ if (visual.badge === "play") {
119505
+ return MEDIA_FALLBACK_ICONS.play;
119506
+ }
119507
+ if (visual.placeholder === "typed") {
119508
+ if (mediaType === "audio") {
119509
+ return MEDIA_FALLBACK_ICONS.audio;
119510
+ }
119511
+ if (mediaType === "video") {
119512
+ return MEDIA_FALLBACK_ICONS.play;
119513
+ }
119514
+ }
119515
+ return [];
119516
+ }
119517
+ function mediaFallbackLabelKey(visual, mediaType) {
119518
+ if (visual.badge === "missing" || visual.placeholder === "missing") {
119519
+ return "pptx.media.notFound";
119520
+ }
119521
+ if (visual.placeholder !== "typed") {
119522
+ return void 0;
119523
+ }
119524
+ if (mediaType === "video") {
119525
+ return "pptx.media.videoClip";
119526
+ }
119527
+ if (mediaType === "audio") {
119528
+ return "pptx.media.audioClip";
119529
+ }
119530
+ return "pptx.elementType.media";
119531
+ }
119532
+ var MEDIA_CHROME_ATTRIBUTE = "data-pptx-media-chrome";
119088
119533
  var persistentAudioMap = /* @__PURE__ */ new Map();
119089
119534
  function registerPersistentAudio(elementId, dataUrl, mimetype, loop, volume, trimStartSec) {
119090
119535
  if (persistentAudioMap.has(elementId) || typeof document === "undefined") {
@@ -123353,6 +123798,7 @@ exports.LINK_TOOLTIP_PANEL_CLASS = LINK_TOOLTIP_PANEL_CLASS;
123353
123798
  exports.LOCAL_SYNC_ORIGIN = LOCAL_SYNC_ORIGIN;
123354
123799
  exports.MATERIAL_PRESETS = MATERIAL_PRESETS;
123355
123800
  exports.MAX_ZOOM_SCALE = MAX_ZOOM_SCALE;
123801
+ exports.MEDIA_CHROME_ATTRIBUTE = MEDIA_CHROME_ATTRIBUTE;
123356
123802
  exports.MIN_ZOOM_SCALE = MIN_ZOOM_SCALE;
123357
123803
  exports.MOBILE_BREAKPOINT = MOBILE_BREAKPOINT;
123358
123804
  exports.MOTION_PATH_FAMILIES = MOTION_PATH_FAMILIES;
@@ -123367,7 +123813,6 @@ exports.OUTLINE_SLIDE_ATTR = OUTLINE_SLIDE_ATTR;
123367
123813
  exports.OUTLINE_VIEW_ATTR = OUTLINE_VIEW_ATTR;
123368
123814
  exports.PATTERN_OPTIONS = PATTERN_OPTIONS;
123369
123815
  exports.PEN_COLORS = PEN_COLORS;
123370
- exports.POWERPOINT_METRIC_TRACKING = POWERPOINT_METRIC_TRACKING;
123371
123816
  exports.PRESENTATION_CHANNEL_NAME = PRESENTATION_CHANNEL_NAME;
123372
123817
  exports.PRESENTATION_HASH = PRESENTATION_HASH;
123373
123818
  exports.PRESENTATION_MESSAGE_ORIGIN = PRESENTATION_MESSAGE_ORIGIN;
@@ -123480,6 +123925,7 @@ exports.buildHollowHitOutline = buildHollowHitOutline;
123480
123925
  exports.buildInitialGuides = buildInitialGuides;
123481
123926
  exports.buildInnerShadowCssFromShapeStyle = buildInnerShadowCssFromShapeStyle;
123482
123927
  exports.buildJoinCollaborationConfig = buildJoinCollaborationConfig;
123928
+ exports.buildMorphAnimationRules = buildMorphAnimationRules;
123483
123929
  exports.buildMorphTransitionPlan = buildMorphTransitionPlan;
123484
123930
  exports.buildMotionPathPreview = buildMotionPathPreview;
123485
123931
  exports.buildMultiLayerShadowCss = buildMultiLayerShadowCss;
@@ -123755,6 +124201,9 @@ exports.mapOutlineKey = mapOutlineKey;
123755
124201
  exports.mapPresentationKey = mapPresentationKey;
123756
124202
  exports.mapPresentationWheel = mapPresentationWheel;
123757
124203
  exports.mayLeaveSlideShow = mayLeaveSlideShow;
124204
+ exports.mediaFallbackIcon = mediaFallbackIcon;
124205
+ exports.mediaFallbackLabelKey = mediaFallbackLabelKey;
124206
+ exports.mediaFallbackVisual = mediaFallbackVisual;
123758
124207
  exports.mediaPlaybackAttributes = mediaPlaybackAttributes;
123759
124208
  exports.mediaTransportVisible = mediaTransportVisible;
123760
124209
  exports.mergeAdditiveSelection = mergeAdditiveSelection;
@@ -123801,6 +124250,7 @@ exports.parseDrawingColorOpacity = parseDrawingColorOpacity;
123801
124250
  exports.parsePanoseString = parsePanoseString;
123802
124251
  exports.parsePpactionUrl = parsePpactionUrl;
123803
124252
  exports.pickSupportedMimeType = pickSupportedMimeType;
124253
+ exports.pieceLetterSpacing = pieceLetterSpacing;
123804
124254
  exports.placeAudienceWindow = placeAudienceWindow;
123805
124255
  exports.placeCaretAtEnd = placeCaretAtEnd;
123806
124256
  exports.polygonsToSvgPath = polygonsToSvgPath;
@@ -123861,6 +124311,7 @@ exports.resolveGroupChildFill = resolveGroupChildFill;
123861
124311
  exports.resolveInkColor = resolveInkColor;
123862
124312
  exports.resolveInkOpacity = resolveInkOpacity;
123863
124313
  exports.resolveInkWidth = resolveInkWidth;
124314
+ exports.resolveMetricTrackingPx = resolveMetricTrackingPx;
123864
124315
  exports.resolveOleType = resolveOleType;
123865
124316
  exports.resolveParagraphAlign = resolveParagraphAlign;
123866
124317
  exports.resolveParagraphRtl = resolveParagraphRtl;
@@ -123924,6 +124375,7 @@ exports.slideProgressPercent = slideProgressPercent;
123924
124375
  exports.slideStatusLabel = slideStatusLabel;
123925
124376
  exports.snapBoxToGrid = snapBoxToGrid;
123926
124377
  exports.splitCell = splitCell;
124378
+ exports.splitRunForMetrics = splitRunForMetrics;
123927
124379
  exports.splitSeriesByAxis = splitSeriesByAxis;
123928
124380
  exports.stepPresenterZoom = stepPresenterZoom;
123929
124381
  exports.stopAllPersistentAudio = stopAllPersistentAudio;