pptx-react-viewer 4.63.1 → 4.64.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 (108) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/dist/{AiChatPanel-7DESUEAZ.js → AiChatPanel-7AFFNYEN.js} +19 -19
  3. package/dist/AiChatPanel-7AFFNYEN.js.br +0 -0
  4. package/dist/AiChatPanel-7AFFNYEN.js.gz +0 -0
  5. package/dist/{AiChatPanel-GQ64SIYP.mjs → AiChatPanel-7U7IJRNY.mjs} +1 -1
  6. package/dist/AiChatPanel-7U7IJRNY.mjs.br +0 -0
  7. package/dist/AiChatPanel-7U7IJRNY.mjs.gz +0 -0
  8. package/dist/ai.js +2 -2
  9. package/dist/ai.js.br +1 -2
  10. package/dist/ai.js.gz +0 -0
  11. package/dist/ai.mjs +1 -1
  12. package/dist/ai.mjs.br +0 -0
  13. package/dist/ai.mjs.gz +0 -0
  14. package/dist/{chunk-5KFSMXI4.js → chunk-5DBKW7F3.js} +8 -3
  15. package/dist/chunk-5DBKW7F3.js.br +0 -0
  16. package/dist/{chunk-5KFSMXI4.js.gz → chunk-5DBKW7F3.js.gz} +0 -0
  17. package/dist/{chunk-MR3ZSEHS.mjs → chunk-5ZW3GP6C.mjs} +6 -5
  18. package/dist/chunk-5ZW3GP6C.mjs.br +0 -0
  19. package/dist/chunk-5ZW3GP6C.mjs.gz +0 -0
  20. package/dist/{chunk-FYQVCABH.mjs → chunk-G5JGUSBL.mjs} +253 -230
  21. package/dist/chunk-G5JGUSBL.mjs.br +0 -0
  22. package/dist/chunk-G5JGUSBL.mjs.gz +0 -0
  23. package/dist/{chunk-MWFBZ5SJ.js → chunk-GXL2XMST.js} +832 -651
  24. package/dist/chunk-GXL2XMST.js.br +0 -0
  25. package/dist/chunk-GXL2XMST.js.gz +0 -0
  26. package/dist/{chunk-H6KYXOKK.mjs → chunk-HZBEKG5R.mjs} +281 -100
  27. package/dist/chunk-HZBEKG5R.mjs.br +0 -0
  28. package/dist/chunk-HZBEKG5R.mjs.gz +0 -0
  29. package/dist/{chunk-F6WCYCHV.js → chunk-PNDORR6S.js} +1 -1
  30. package/dist/chunk-PNDORR6S.js.br +0 -0
  31. package/dist/chunk-PNDORR6S.js.gz +0 -0
  32. package/dist/{chunk-TXVGYIO6.js → chunk-VGU5S37T.js} +450 -428
  33. package/dist/chunk-VGU5S37T.js.br +0 -0
  34. package/dist/chunk-VGU5S37T.js.gz +0 -0
  35. package/dist/{chunk-NE5JQMED.mjs → chunk-WAIX4VJ2.mjs} +1 -1
  36. package/dist/chunk-WAIX4VJ2.mjs.br +0 -0
  37. package/dist/chunk-WAIX4VJ2.mjs.gz +0 -0
  38. package/dist/i18n/de.cjs +89 -43
  39. package/dist/i18n/de.cjs.br +0 -0
  40. package/dist/i18n/de.cjs.gz +0 -0
  41. package/dist/i18n/de.mjs +89 -43
  42. package/dist/i18n/de.mjs.br +0 -0
  43. package/dist/i18n/de.mjs.gz +0 -0
  44. package/dist/i18n/es.cjs +89 -43
  45. package/dist/i18n/es.cjs.br +0 -0
  46. package/dist/i18n/es.cjs.gz +0 -0
  47. package/dist/i18n/es.mjs +89 -43
  48. package/dist/i18n/es.mjs.br +0 -0
  49. package/dist/i18n/es.mjs.gz +0 -0
  50. package/dist/i18n/fr.cjs +89 -43
  51. package/dist/i18n/fr.cjs.br +0 -0
  52. package/dist/i18n/fr.cjs.gz +0 -0
  53. package/dist/i18n/fr.mjs +89 -43
  54. package/dist/i18n/fr.mjs.br +0 -0
  55. package/dist/i18n/fr.mjs.gz +0 -0
  56. package/dist/i18n/zh-CN.cjs +95 -49
  57. package/dist/i18n/zh-CN.cjs.br +0 -0
  58. package/dist/i18n/zh-CN.cjs.gz +0 -0
  59. package/dist/i18n/zh-CN.mjs +95 -49
  60. package/dist/i18n/zh-CN.mjs.br +0 -0
  61. package/dist/i18n/zh-CN.mjs.gz +0 -0
  62. package/dist/index.d.ts +10 -1
  63. package/dist/index.js +27 -27
  64. package/dist/index.js.br +0 -0
  65. package/dist/index.js.gz +0 -0
  66. package/dist/index.mjs +4 -4
  67. package/dist/index.mjs.br +0 -0
  68. package/dist/index.mjs.gz +0 -0
  69. package/dist/internals.d.ts +10 -0
  70. package/dist/internals.js +81 -81
  71. package/dist/internals.js.br +0 -0
  72. package/dist/internals.js.gz +0 -0
  73. package/dist/internals.mjs +2 -2
  74. package/dist/internals.mjs.br +0 -0
  75. package/dist/internals.mjs.gz +0 -0
  76. package/dist/pptx-viewer-canvas.css +1 -1
  77. package/dist/pptx-viewer-canvas.css.br +0 -0
  78. package/dist/pptx-viewer-canvas.css.gz +0 -0
  79. package/dist/pptx-viewer.css +1 -1
  80. package/dist/pptx-viewer.css.br +0 -0
  81. package/dist/pptx-viewer.css.gz +0 -0
  82. package/dist/viewer/index.d.ts +10 -1
  83. package/dist/viewer/index.js +21 -21
  84. package/dist/viewer/index.js.br +0 -0
  85. package/dist/viewer/index.js.gz +0 -0
  86. package/dist/viewer/index.mjs +4 -4
  87. package/dist/viewer/index.mjs.br +0 -0
  88. package/dist/viewer/index.mjs.gz +0 -0
  89. package/package.json +3 -3
  90. package/dist/AiChatPanel-7DESUEAZ.js.br +0 -0
  91. package/dist/AiChatPanel-7DESUEAZ.js.gz +0 -0
  92. package/dist/AiChatPanel-GQ64SIYP.mjs.br +0 -0
  93. package/dist/AiChatPanel-GQ64SIYP.mjs.gz +0 -0
  94. package/dist/chunk-5KFSMXI4.js.br +0 -0
  95. package/dist/chunk-F6WCYCHV.js.br +0 -0
  96. package/dist/chunk-F6WCYCHV.js.gz +0 -0
  97. package/dist/chunk-FYQVCABH.mjs.br +0 -0
  98. package/dist/chunk-FYQVCABH.mjs.gz +0 -0
  99. package/dist/chunk-H6KYXOKK.mjs.br +0 -0
  100. package/dist/chunk-H6KYXOKK.mjs.gz +0 -0
  101. package/dist/chunk-MR3ZSEHS.mjs.br +0 -0
  102. package/dist/chunk-MR3ZSEHS.mjs.gz +0 -0
  103. package/dist/chunk-MWFBZ5SJ.js.br +0 -0
  104. package/dist/chunk-MWFBZ5SJ.js.gz +0 -0
  105. package/dist/chunk-NE5JQMED.mjs.br +0 -0
  106. package/dist/chunk-NE5JQMED.mjs.gz +0 -0
  107. package/dist/chunk-TXVGYIO6.js.br +0 -0
  108. package/dist/chunk-TXVGYIO6.js.gz +0 -0
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk5KFSMXI4_js = require('./chunk-5KFSMXI4.js');
3
+ var chunk5DBKW7F3_js = require('./chunk-5DBKW7F3.js');
4
4
  var pptx = require('ooxml-ui/pptx');
5
5
  var React17 = require('react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
@@ -604,9 +604,9 @@ function differsOnlyInMasterSet(previous, next) {
604
604
  }
605
605
  function recordExplicitSlideUpdate(history, previous, before, label) {
606
606
  if (previous && serializeHistoryDocument(previous) !== serializeHistoryDocument(before)) {
607
- history.record(chunk5KFSMXI4_js.cloneHistorySnapshot(previous), previous.actionLabel);
607
+ history.record(chunk5DBKW7F3_js.cloneHistorySnapshot(previous), previous.actionLabel);
608
608
  }
609
- history.record({ ...chunk5KFSMXI4_js.cloneHistorySnapshot(before), actionLabel: label }, label);
609
+ history.record({ ...chunk5DBKW7F3_js.cloneHistorySnapshot(before), actionLabel: label }, label);
610
610
  }
611
611
  var POLL_INTERVAL_MS = 16;
612
612
  function usePointerReleaseWakeup(hasActivePointerInteraction) {
@@ -688,8 +688,8 @@ function useEditorHistory(input) {
688
688
  width: canvasSize.width,
689
689
  height: canvasSize.height,
690
690
  activeSlideIndex,
691
- slides: slides.map(chunk5KFSMXI4_js.cloneSlide),
692
- templateElementsBySlideId: chunk5KFSMXI4_js.cloneTemplateElementsBySlideId(templateElementsBySlideId),
691
+ slides: slides.map(chunk5DBKW7F3_js.cloneSlide),
692
+ templateElementsBySlideId: chunk5DBKW7F3_js.cloneTemplateElementsBySlideId(templateElementsBySlideId),
693
693
  ...recordedTheme ? { theme: recordedTheme } : {},
694
694
  ...actionLabel ? { actionLabel } : {}
695
695
  };
@@ -703,9 +703,9 @@ function useEditorHistory(input) {
703
703
  width: snapshot.width,
704
704
  height: snapshot.height
705
705
  });
706
- setSlides(snapshot.slides.map(chunk5KFSMXI4_js.cloneSlide));
706
+ setSlides(snapshot.slides.map(chunk5DBKW7F3_js.cloneSlide));
707
707
  setTemplateElementsBySlideId(
708
- chunk5KFSMXI4_js.cloneTemplateElementsBySlideId(snapshot.templateElementsBySlideId)
708
+ chunk5DBKW7F3_js.cloneTemplateElementsBySlideId(snapshot.templateElementsBySlideId)
709
709
  );
710
710
  setActiveSlideIndex(Math.min(snapshot.activeSlideIndex, maxSlideIndex));
711
711
  setSelectedElementIds([]);
@@ -771,8 +771,8 @@ function useEditorHistory(input) {
771
771
  return;
772
772
  }
773
773
  isApplyingHistoryRef.current = true;
774
- const nextSnapshot = chunk5KFSMXI4_js.cloneHistorySnapshot(result.snapshot);
775
- lastHistorySnapshotRef.current = chunk5KFSMXI4_js.cloneHistorySnapshot(nextSnapshot);
774
+ const nextSnapshot = chunk5DBKW7F3_js.cloneHistorySnapshot(result.snapshot);
775
+ lastHistorySnapshotRef.current = chunk5DBKW7F3_js.cloneHistorySnapshot(nextSnapshot);
776
776
  lastHistorySerializedRef.current = serializeHistoryDocument(nextSnapshot);
777
777
  applyHistorySnapshot(nextSnapshot);
778
778
  restoreTheme(currentSnapshot, nextSnapshot);
@@ -796,8 +796,8 @@ function useEditorHistory(input) {
796
796
  return;
797
797
  }
798
798
  isApplyingHistoryRef.current = true;
799
- const targetSnapshot = chunk5KFSMXI4_js.cloneHistorySnapshot(result.snapshot);
800
- lastHistorySnapshotRef.current = chunk5KFSMXI4_js.cloneHistorySnapshot(targetSnapshot);
799
+ const targetSnapshot = chunk5DBKW7F3_js.cloneHistorySnapshot(result.snapshot);
800
+ lastHistorySnapshotRef.current = chunk5DBKW7F3_js.cloneHistorySnapshot(targetSnapshot);
801
801
  lastHistorySerializedRef.current = serializeHistoryDocument(targetSnapshot);
802
802
  applyHistorySnapshot(targetSnapshot);
803
803
  restoreTheme(currentSnapshot, targetSnapshot);
@@ -815,7 +815,7 @@ function useEditorHistory(input) {
815
815
  (initialSnapshot) => {
816
816
  history.clear();
817
817
  if (initialSnapshot) {
818
- const clonedInitial = chunk5KFSMXI4_js.cloneHistorySnapshot(initialSnapshot);
818
+ const clonedInitial = chunk5DBKW7F3_js.cloneHistorySnapshot(initialSnapshot);
819
819
  lastHistorySnapshotRef.current = clonedInitial;
820
820
  lastHistorySerializedRef.current = serializeHistoryDocument(clonedInitial);
821
821
  } else {
@@ -889,16 +889,16 @@ function useEditorHistory(input) {
889
889
  slides
890
890
  ]);
891
891
  const commitSlides = (nextSlides, label, beforeSlides = slides, nextSlideMasters) => {
892
- const before = { ...buildHistorySnapshot(), slides: beforeSlides.map(chunk5KFSMXI4_js.cloneSlide) };
892
+ const before = { ...buildHistorySnapshot(), slides: beforeSlides.map(chunk5DBKW7F3_js.cloneSlide) };
893
893
  const { theme: beforeTheme, ...unthemed } = before;
894
894
  const afterTheme = nextSlideMasters ? pptx.historyTheme(theme, nextSlideMasters) : beforeTheme;
895
895
  const after = {
896
896
  ...unthemed,
897
- slides: nextSlides.map(chunk5KFSMXI4_js.cloneSlide),
897
+ slides: nextSlides.map(chunk5DBKW7F3_js.cloneSlide),
898
898
  ...afterTheme ? { theme: afterTheme } : {}
899
899
  };
900
900
  recordExplicitSlideUpdate(history, lastHistorySnapshotRef.current, before, label);
901
- lastHistorySnapshotRef.current = chunk5KFSMXI4_js.cloneHistorySnapshot(after);
901
+ lastHistorySnapshotRef.current = chunk5DBKW7F3_js.cloneHistorySnapshot(after);
902
902
  lastHistorySerializedRef.current = serializeHistoryDocument(after);
903
903
  isApplyingHistoryRef.current = false;
904
904
  setSlides(nextSlides);
@@ -907,6 +907,11 @@ function useEditorHistory(input) {
907
907
  const holdTracking = React17.useCallback((held) => {
908
908
  trackingHeldRef.current = held;
909
909
  }, []);
910
+ const markSaved = React17.useCallback(() => {
911
+ const snapshot = buildHistorySnapshot();
912
+ lastHistorySnapshotRef.current = snapshot;
913
+ lastHistorySerializedRef.current = serializeHistoryDocument(snapshot);
914
+ }, [buildHistorySnapshot]);
910
915
  return {
911
916
  commitSlides,
912
917
  holdTracking,
@@ -920,6 +925,7 @@ function useEditorHistory(input) {
920
925
  forgetHistory: history.forget,
921
926
  attachCollaboration: history.attachCollaboration,
922
927
  markDirty,
928
+ markSaved,
923
929
  withoutUndoStep,
924
930
  buildHistorySnapshot
925
931
  };
@@ -1086,22 +1092,22 @@ function useZoomViewport({
1086
1092
  selectedElements.forEach((element) => {
1087
1093
  minX = Math.min(minX, element.x);
1088
1094
  minY = Math.min(minY, element.y);
1089
- maxX = Math.max(maxX, element.x + Math.max(element.width, chunk5KFSMXI4_js.MIN_ELEMENT_SIZE));
1090
- maxY = Math.max(maxY, element.y + Math.max(element.height, chunk5KFSMXI4_js.MIN_ELEMENT_SIZE));
1095
+ maxX = Math.max(maxX, element.x + Math.max(element.width, chunk5DBKW7F3_js.MIN_ELEMENT_SIZE));
1096
+ maxY = Math.max(maxY, element.y + Math.max(element.height, chunk5DBKW7F3_js.MIN_ELEMENT_SIZE));
1091
1097
  });
1092
1098
  if (!Number.isFinite(minX) || !Number.isFinite(minY) || !Number.isFinite(maxX) || !Number.isFinite(maxY)) {
1093
1099
  return;
1094
1100
  }
1095
1101
  const selectionBounds = { minX, minY, maxX, maxY };
1096
- const boundsWidth = Math.max(selectionBounds.maxX - selectionBounds.minX, chunk5KFSMXI4_js.MIN_ELEMENT_SIZE);
1097
- const boundsHeight = Math.max(selectionBounds.maxY - selectionBounds.minY, chunk5KFSMXI4_js.MIN_ELEMENT_SIZE);
1102
+ const boundsWidth = Math.max(selectionBounds.maxX - selectionBounds.minX, chunk5DBKW7F3_js.MIN_ELEMENT_SIZE);
1103
+ const boundsHeight = Math.max(selectionBounds.maxY - selectionBounds.minY, chunk5DBKW7F3_js.MIN_ELEMENT_SIZE);
1098
1104
  const availableWidth = Math.max(
1099
- effectiveEditorDimensions.width - chunk5KFSMXI4_js.ZOOM_TO_SELECTION_PADDING,
1100
- chunk5KFSMXI4_js.MIN_ELEMENT_SIZE
1105
+ effectiveEditorDimensions.width - chunk5DBKW7F3_js.ZOOM_TO_SELECTION_PADDING,
1106
+ chunk5DBKW7F3_js.MIN_ELEMENT_SIZE
1101
1107
  );
1102
1108
  const availableHeight = Math.max(
1103
- effectiveEditorDimensions.height - chunk5KFSMXI4_js.ZOOM_TO_SELECTION_PADDING,
1104
- chunk5KFSMXI4_js.MIN_ELEMENT_SIZE
1109
+ effectiveEditorDimensions.height - chunk5DBKW7F3_js.ZOOM_TO_SELECTION_PADDING,
1110
+ chunk5DBKW7F3_js.MIN_ELEMENT_SIZE
1105
1111
  );
1106
1112
  const targetEditorScale = Math.min(
1107
1113
  availableWidth / boundsWidth,
@@ -2915,9 +2921,13 @@ function usePresentationMode(input) {
2915
2921
  // `PresentationStage` stacks the incoming slide's elements above its
2916
2922
  // template shapes (`zIndex = templateElements.length + index`), so a
2917
2923
  // z-index journey has to start counting where the stage does.
2918
- { zIndexBase: incoming ? templateElementsBySlideId?.[incoming.id]?.length ?? 0 : 0 }
2924
+ // A turning flip is seen from the slide's centre (shared `morph-flip-turn`).
2925
+ {
2926
+ zIndexBase: incoming ? templateElementsBySlideId?.[incoming.id]?.length ?? 0 : 0,
2927
+ ...canvasSize ? { slideSize: canvasSize } : {}
2928
+ }
2919
2929
  );
2920
- }, [transitionOverlay, slides, templateElementsBySlideId]);
2930
+ }, [transitionOverlay, slides, templateElementsBySlideId, canvasSize]);
2921
2931
  const morphedElementStates = React17.useMemo(() => {
2922
2932
  if (!morphPlan || morphPlan.incomingAnimations.size === 0) {
2923
2933
  return presentationElementStates;
@@ -4016,8 +4026,8 @@ function useViewerCoreState(_input) {
4016
4026
  const { slides, setSlides, slidesRef } = useSlideState();
4017
4027
  const [templateElementsBySlideId, setTemplateElementsBySlideId] = React17.useState({});
4018
4028
  const [canvasSize, setCanvasSize] = React17.useState({
4019
- width: chunk5KFSMXI4_js.DEFAULT_CANVAS_WIDTH,
4020
- height: chunk5KFSMXI4_js.DEFAULT_CANVAS_HEIGHT
4029
+ width: chunk5DBKW7F3_js.DEFAULT_CANVAS_WIDTH,
4030
+ height: chunk5DBKW7F3_js.DEFAULT_CANVAS_HEIGHT
4021
4031
  });
4022
4032
  const [slideSizeEmu, setSlideSizeEmu] = React17.useState();
4023
4033
  const [activeSlideIndex, setActiveSlideIndex] = React17.useState(0);
@@ -4409,7 +4419,7 @@ function useLoadContent({
4409
4419
  initialSlideRef.current = initialSlide;
4410
4420
  const limitsRef = React17.useRef(limits);
4411
4421
  limitsRef.current = limits;
4412
- const { t } = chunk5KFSMXI4_js.useTranslation();
4422
+ const { t } = chunk5DBKW7F3_js.useTranslation();
4413
4423
  const translateRef = React17.useRef(t);
4414
4424
  translateRef.current = t;
4415
4425
  const originalBufferRef = React17.useRef(null);
@@ -4509,12 +4519,12 @@ function useLoadContent({
4509
4519
  }
4510
4520
  resources.commit();
4511
4521
  handlerRef.current = handler;
4512
- const partition = chunk5KFSMXI4_js.partitionTemplateElements(nextSlides);
4522
+ const partition = chunk5DBKW7F3_js.partitionTemplateElements(nextSlides);
4513
4523
  setSlides(partition.slides);
4514
4524
  setTemplateElementsBySlideId(partition.templateElementsBySlideId);
4515
4525
  setCanvasSize({
4516
- width: parsed.width ?? chunk5KFSMXI4_js.DEFAULT_CANVAS_WIDTH,
4517
- height: parsed.height ?? chunk5KFSMXI4_js.DEFAULT_CANVAS_HEIGHT
4526
+ width: parsed.width ?? chunk5DBKW7F3_js.DEFAULT_CANVAS_WIDTH,
4527
+ height: parsed.height ?? chunk5DBKW7F3_js.DEFAULT_CANVAS_HEIGHT
4518
4528
  });
4519
4529
  setSlideSizeEmu(
4520
4530
  typeof parsed.widthEmu === "number" && typeof parsed.heightEmu === "number" && parsed.widthEmu > 0 && parsed.heightEmu > 0 ? {
@@ -4930,7 +4940,7 @@ function useElementOperations(input) {
4930
4940
  );
4931
4941
  return;
4932
4942
  }
4933
- if (chunk5KFSMXI4_js.isTemplateElementId(elementId)) {
4943
+ if (chunk5DBKW7F3_js.isTemplateElementId(elementId)) {
4934
4944
  const slideId = activeSlide?.id;
4935
4945
  if (slideId) {
4936
4946
  setTemplateElementsBySlideId((prev) => ({
@@ -5217,8 +5227,8 @@ function createCanvasGestures(getInput, frames = animationFrames) {
5217
5227
  }
5218
5228
  function paintResize(resize, transform) {
5219
5229
  const { x, y } = transform;
5220
- const width = Math.max(transform.width, chunk5KFSMXI4_js.MIN_ELEMENT_SIZE);
5221
- const height = Math.max(transform.height, chunk5KFSMXI4_js.MIN_ELEMENT_SIZE);
5230
+ const width = Math.max(transform.width, chunk5DBKW7F3_js.MIN_ELEMENT_SIZE);
5231
+ const height = Math.max(transform.height, chunk5DBKW7F3_js.MIN_ELEMENT_SIZE);
5222
5232
  resize.lastX = x;
5223
5233
  resize.lastY = y;
5224
5234
  resize.lastWidth = transform.width;
@@ -5275,7 +5285,7 @@ function createCanvasGestures(getInput, frames = animationFrames) {
5275
5285
  getGridSize: () => getInput().gridSpacingPx,
5276
5286
  getSnapToShape: () => getInput().snapToShape,
5277
5287
  getGuides: () => getInput().guides.map(({ axis, position }) => ({ axis, position })),
5278
- getMinSize: () => chunk5KFSMXI4_js.MIN_ELEMENT_SIZE,
5288
+ getMinSize: () => chunk5DBKW7F3_js.MIN_ELEMENT_SIZE,
5279
5289
  getSnapExcludeIds: () => armed?.kind === "move" ? Object.keys(armed.drag.startPositionsById) : [],
5280
5290
  getStageOrigin: () => {
5281
5291
  const rect = getInput().canvasStageRef.current?.getBoundingClientRect();
@@ -5356,7 +5366,7 @@ function commitMove(input, drag) {
5356
5366
  const start = drag.startPositionsById[el.id];
5357
5367
  return start ? { ...el, x: start.x + dx, y: start.y + dy } : el;
5358
5368
  });
5359
- return chunk5KFSMXI4_js.applyReroutedConnectors(moved, chunk5KFSMXI4_js.rerouteConnectorsForMovedElements(moved, movedIds));
5369
+ return chunk5DBKW7F3_js.applyReroutedConnectors(moved, chunk5DBKW7F3_js.rerouteConnectorsForMovedElements(moved, movedIds));
5360
5370
  };
5361
5371
  if (input.editTemplateMode) {
5362
5372
  const slideId = input.activeSlide?.id;
@@ -5387,8 +5397,8 @@ function commitResize(input, resize) {
5387
5397
  if (i !== input.activeSlideIndex) {
5388
5398
  return s;
5389
5399
  }
5390
- const rerouted = chunk5KFSMXI4_js.rerouteConnectorsForMovedElements(s.elements, movedIds);
5391
- return rerouted.length === 0 ? s : { ...s, elements: chunk5KFSMXI4_js.applyReroutedConnectors(s.elements, rerouted) };
5400
+ const rerouted = chunk5DBKW7F3_js.rerouteConnectorsForMovedElements(s.elements, movedIds);
5401
+ return rerouted.length === 0 ? s : { ...s, elements: chunk5DBKW7F3_js.applyReroutedConnectors(s.elements, rerouted) };
5392
5402
  })
5393
5403
  );
5394
5404
  }
@@ -6223,7 +6233,7 @@ function createStructuredElementHandlers(deps) {
6223
6233
  return;
6224
6234
  }
6225
6235
  const resolved = resolveHyperlinkEditResult(data);
6226
- if (resolved.url && !chunk5KFSMXI4_js.isUrlSafe(resolved.url)) {
6236
+ if (resolved.url && !chunk5DBKW7F3_js.isUrlSafe(resolved.url)) {
6227
6237
  return;
6228
6238
  }
6229
6239
  const actionClick = {
@@ -6269,7 +6279,7 @@ function createStructuredElementHandlers(deps) {
6269
6279
  if (!activeSlide) {
6270
6280
  return;
6271
6281
  }
6272
- const preset = chunk5KFSMXI4_js.ACTION_BUTTON_PRESETS.find((p) => p.shapeType === shapeType);
6282
+ const preset = chunk5DBKW7F3_js.ACTION_BUTTON_PRESETS.find((p) => p.shapeType === shapeType);
6273
6283
  if (!preset) {
6274
6284
  return;
6275
6285
  }
@@ -6356,7 +6366,7 @@ function useInsertElements(input) {
6356
6366
  width: 300,
6357
6367
  height: 60,
6358
6368
  text: "",
6359
- textStyle: { fontSize: chunk5KFSMXI4_js.DEFAULT_TEXT_FONT_SIZE }
6369
+ textStyle: { fontSize: chunk5DBKW7F3_js.DEFAULT_TEXT_FONT_SIZE }
6360
6370
  });
6361
6371
  };
6362
6372
  const handleAddShape = () => {
@@ -6378,7 +6388,7 @@ function useInsertElements(input) {
6378
6388
  }
6379
6389
  });
6380
6390
  };
6381
- const handleAddTable = (rows = chunk5KFSMXI4_js.DEFAULT_TABLE_ROWS, columns = chunk5KFSMXI4_js.DEFAULT_TABLE_COLUMNS) => {
6391
+ const handleAddTable = (rows = chunk5DBKW7F3_js.DEFAULT_TABLE_ROWS, columns = chunk5DBKW7F3_js.DEFAULT_TABLE_COLUMNS) => {
6382
6392
  if (!activeSlide) {
6383
6393
  return;
6384
6394
  }
@@ -6552,7 +6562,7 @@ function useGroupAlignLayerHandlers(input) {
6552
6562
  history
6553
6563
  } = input;
6554
6564
  const updateElementsOwning = (elementId, updater) => {
6555
- if (editTemplateMode && !chunk5KFSMXI4_js.isTemplateElementId(elementId)) {
6565
+ if (editTemplateMode && !chunk5DBKW7F3_js.isTemplateElementId(elementId)) {
6556
6566
  ops.updateSlides(
6557
6567
  (prev) => prev.map(
6558
6568
  (slide, index) => index === activeSlideIndex ? { ...slide, elements: updater(slide.elements) } : slide
@@ -6586,9 +6596,9 @@ function useGroupAlignLayerHandlers(input) {
6586
6596
  return;
6587
6597
  }
6588
6598
  const group = selectedElement;
6589
- const intoTemplate = chunk5KFSMXI4_js.isTemplateElementId(group.id);
6599
+ const intoTemplate = chunk5DBKW7F3_js.isTemplateElementId(group.id);
6590
6600
  const childIds = group.children.map(
6591
- (child) => intoTemplate ? chunk5KFSMXI4_js.makeCloneId(true, child.id || group.id) : child.id || pptx.generateElementId()
6601
+ (child) => intoTemplate ? chunk5DBKW7F3_js.makeCloneId(true, child.id || group.id) : child.id || pptx.generateElementId()
6592
6602
  );
6593
6603
  const { elements, childIds: usedIds } = pptx.ungroupElements(
6594
6604
  ops.activeElements,
@@ -7024,7 +7034,7 @@ function createTableMergeHandlers(input) {
7024
7034
  if (!nextCell || nextCell.hMerge || nextCell.vMerge) {
7025
7035
  return;
7026
7036
  }
7027
- const newTableData = chunk5KFSMXI4_js.mergeCells(
7037
+ const newTableData = chunk5DBKW7F3_js.mergeCells(
7028
7038
  [
7029
7039
  { row: rowIndex, col: columnIndex },
7030
7040
  { row: rowIndex, col: nextColIdx }
@@ -7032,7 +7042,7 @@ function createTableMergeHandlers(input) {
7032
7042
  td
7033
7043
  );
7034
7044
  const updates = { tableData: newTableData };
7035
- const newRawXml = chunk5KFSMXI4_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
7045
+ const newRawXml = chunk5DBKW7F3_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
7036
7046
  if (newRawXml) {
7037
7047
  updates.rawXml = newRawXml;
7038
7048
  }
@@ -7058,7 +7068,7 @@ function createTableMergeHandlers(input) {
7058
7068
  if (!targetNextCell || targetNextCell.hMerge || targetNextCell.vMerge) {
7059
7069
  return;
7060
7070
  }
7061
- const newTableData = chunk5KFSMXI4_js.mergeCells(
7071
+ const newTableData = chunk5DBKW7F3_js.mergeCells(
7062
7072
  [
7063
7073
  { row: rowIndex, col: columnIndex },
7064
7074
  { row: targetNextRowIdx, col: columnIndex }
@@ -7066,7 +7076,7 @@ function createTableMergeHandlers(input) {
7066
7076
  td
7067
7077
  );
7068
7078
  const updates = { tableData: newTableData };
7069
- const newRawXml = chunk5KFSMXI4_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
7079
+ const newRawXml = chunk5DBKW7F3_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
7070
7080
  if (newRawXml) {
7071
7081
  updates.rawXml = newRawXml;
7072
7082
  }
@@ -7081,9 +7091,9 @@ function createTableMergeHandlers(input) {
7081
7091
  return;
7082
7092
  }
7083
7093
  const td = selectedElement.tableData;
7084
- const newTableData = chunk5KFSMXI4_js.mergeCells(ts.selectedCells, td);
7094
+ const newTableData = chunk5DBKW7F3_js.mergeCells(ts.selectedCells, td);
7085
7095
  const updates = { tableData: newTableData };
7086
- const newRawXml = chunk5KFSMXI4_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
7096
+ const newRawXml = chunk5DBKW7F3_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
7087
7097
  if (newRawXml) {
7088
7098
  updates.rawXml = newRawXml;
7089
7099
  }
@@ -7100,9 +7110,9 @@ function createTableMergeHandlers(input) {
7100
7110
  }
7101
7111
  const { rowIndex, columnIndex } = ts;
7102
7112
  const td = selectedElement.tableData;
7103
- const newTableData = chunk5KFSMXI4_js.splitCell(rowIndex, columnIndex, td);
7113
+ const newTableData = chunk5DBKW7F3_js.splitCell(rowIndex, columnIndex, td);
7104
7114
  const updates = { tableData: newTableData };
7105
- const newRawXml = chunk5KFSMXI4_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
7115
+ const newRawXml = chunk5DBKW7F3_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
7106
7116
  if (newRawXml) {
7107
7117
  updates.rawXml = newRawXml;
7108
7118
  }
@@ -7137,7 +7147,7 @@ function createTableStructHandlers(input) {
7137
7147
  updates.tableData = pptx.setCellText(el, rowIndex, colIndex, text).tableData;
7138
7148
  }
7139
7149
  if (el.rawXml) {
7140
- const newRawXml = chunk5KFSMXI4_js.updateCellTextInRawXml(el, rowIndex, colIndex, text);
7150
+ const newRawXml = chunk5DBKW7F3_js.updateCellTextInRawXml(el, rowIndex, colIndex, text);
7141
7151
  if (newRawXml) {
7142
7152
  updates.rawXml = newRawXml;
7143
7153
  }
@@ -7161,7 +7171,7 @@ function createTableStructHandlers(input) {
7161
7171
  const { rowIndex, columnIndex: colIndex } = ts;
7162
7172
  const updates = {};
7163
7173
  if (selectedElement.rawXml) {
7164
- const newRawXml = chunk5KFSMXI4_js.updateCellTextStyleInRawXml(
7174
+ const newRawXml = chunk5DBKW7F3_js.updateCellTextStyleInRawXml(
7165
7175
  selectedElement,
7166
7176
  rowIndex,
7167
7177
  colIndex,
@@ -7339,7 +7349,7 @@ function useExportSaveAs(input) {
7339
7349
  const sourceName = filePath ? filePath.replace(/\\/gu, "/").split("/").pop() : void 0;
7340
7350
  const slideSize = pptx.resolveSlideSizeSelection({ current: slideSizeEmu, canvas: canvasSize }).size;
7341
7351
  const data = {
7342
- slides: chunk5KFSMXI4_js.buildSaveSlides(slides, templateElementsBySlideId),
7352
+ slides: chunk5DBKW7F3_js.buildSaveSlides(slides, templateElementsBySlideId),
7343
7353
  width: canvasSize.width,
7344
7354
  height: canvasSize.height,
7345
7355
  widthEmu: slideSize.widthEmu,
@@ -7502,7 +7512,7 @@ async function captureSlidesAsPngDataUrls(slideStageRef, slideIndices, setActive
7502
7512
  }
7503
7513
  function tilesToPdfPage(tilesResult) {
7504
7514
  return tilesResult.tiles.map((tile) => ({
7505
- image: chunk5KFSMXI4_js.canvasToJpegData(tile.canvas),
7515
+ image: chunk5DBKW7F3_js.canvasToJpegData(tile.canvas),
7506
7516
  placement: pptx.placeTileOnPage(
7507
7517
  tile,
7508
7518
  tilesResult.fullWidth,
@@ -7535,7 +7545,7 @@ async function exportAllSlidesAsPdf(slideStageRef, totalSlides, setActiveSlide,
7535
7545
  if (pages.length === 0) {
7536
7546
  throw new Error(i18n.translationsEn["pptx.export.errorNoSlidesPdf"]);
7537
7547
  }
7538
- const pdfBlobUrl = chunk5KFSMXI4_js.buildPdfFromTiledImageData(pages);
7548
+ const pdfBlobUrl = chunk5DBKW7F3_js.buildPdfFromTiledImageData(pages);
7539
7549
  pptx.downloadDataUrl(pdfBlobUrl, filename);
7540
7550
  }
7541
7551
  async function exportAllSlidesAsNotesPdf(slideStageRef, totalSlides, setActiveSlide, currentSlideIndex, slideNotes, filename = "presentation-notes.pdf", options = {}) {
@@ -7565,7 +7575,7 @@ async function exportAllSlidesAsNotesPdf(slideStageRef, totalSlides, setActiveSl
7565
7575
  if (pages.length === 0) {
7566
7576
  throw new Error(i18n.translationsEn["pptx.export.errorNoSlidesNotesPdf"]);
7567
7577
  }
7568
- const pdfDataUrl = chunk5KFSMXI4_js.buildNotesPdf(pages);
7578
+ const pdfDataUrl = chunk5DBKW7F3_js.buildNotesPdf(pages);
7569
7579
  pptx.downloadDataUrl(pdfDataUrl, filename);
7570
7580
  }
7571
7581
  async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide, currentSlideIndex, options = {}) {
@@ -7745,20 +7755,6 @@ function exportSlideToSvg(slide, width, height, options = {}) {
7745
7755
  }
7746
7756
  return svg;
7747
7757
  }
7748
- function safePrompt(message, defaultValue) {
7749
- try {
7750
- return window.prompt(message, defaultValue);
7751
- } catch {
7752
- return null;
7753
- }
7754
- }
7755
- function safeConfirm(message) {
7756
- try {
7757
- return window.confirm(message);
7758
- } catch {
7759
- return false;
7760
- }
7761
- }
7762
7758
 
7763
7759
  // src/viewer/hooks/useExportMediaHandlers.ts
7764
7760
  function useExportMediaHandlers(input) {
@@ -8157,13 +8153,13 @@ function usePrintHandlers(input) {
8157
8153
  const { slides, activeSlideIndex, canvasStageRef, setActiveSlideIndex, canvasSize } = input;
8158
8154
  const handoutMaster = input.handoutMaster ?? input.pptxData?.handoutMaster;
8159
8155
  const [isPrintDialogOpen, setIsPrintDialogOpen] = React17.useState(false);
8160
- const { t } = chunk5KFSMXI4_js.useTranslation();
8156
+ const { t } = chunk5DBKW7F3_js.useTranslation();
8161
8157
  const viewerOptions = useViewerOptionsContext();
8162
8158
  const printRasterScale = (viewerOptions.advanced.printHighQuality ? 4 : 3) * pptx.resolveImageResolutionScale(viewerOptions);
8163
8159
  const handlePrint = () => {
8164
8160
  setIsPrintDialogOpen(true);
8165
8161
  };
8166
- const deckSlides = () => input.templateElementsBySlideId ? chunk5KFSMXI4_js.buildSaveSlides(slides, input.templateElementsBySlideId) : slides;
8162
+ const deckSlides = () => input.templateElementsBySlideId ? chunk5DBKW7F3_js.buildSaveSlides(slides, input.templateElementsBySlideId) : slides;
8167
8163
  const plan = (settings, deck) => pptx.planPrintJob(settings, {
8168
8164
  slides: deck,
8169
8165
  activeSlideIndex,
@@ -8578,7 +8574,7 @@ function usePropertyHandlers(input) {
8578
8574
  width: canvasSize.width,
8579
8575
  height: canvasSize.height
8580
8576
  };
8581
- setCompareResult(chunk5KFSMXI4_js.comparePresentation(cur, other));
8577
+ setCompareResult(chunk5DBKW7F3_js.comparePresentation(cur, other));
8582
8578
  setIsComparePanelOpen(true);
8583
8579
  } catch (err) {
8584
8580
  console.warn("Compare failed:", err);
@@ -8631,6 +8627,7 @@ function usePropertyHandlers(input) {
8631
8627
  };
8632
8628
  }
8633
8629
  function useDialogCustomShows(input) {
8630
+ const { t } = chunk5DBKW7F3_js.useTranslation();
8634
8631
  const {
8635
8632
  activeSlide,
8636
8633
  customShows,
@@ -8650,16 +8647,20 @@ function useDialogCustomShows(input) {
8650
8647
  );
8651
8648
  history.markDirty();
8652
8649
  };
8653
- const handleCreateCustomShow = () => {
8654
- const name = safePrompt("Custom show name", "Custom Show");
8655
- const safeName = name?.trim() || `Custom Show ${customShows.length + 1}`;
8650
+ const handleCreateCustomShow = async () => {
8651
+ const name = await pptx.promptNameDialog(
8652
+ t("pptx.customShows.newNameLabel"),
8653
+ t("pptx.customShows.newDefaultName"),
8654
+ { t }
8655
+ );
8656
+ const safeName = name?.trim() || `${t("pptx.customShows.newDefaultName")} ${customShows.length + 1}`;
8656
8657
  const id = pptx.generateCustomShowId(customShows);
8657
8658
  const initialSlideRIds = activeSlide?.rId && activeSlide.rId.length > 0 ? [activeSlide.rId] : [];
8658
8659
  setCustomShows((prev) => [...prev, { id, name: safeName, slideRIds: initialSlideRIds }]);
8659
8660
  setActiveCustomShowId(id);
8660
8661
  history.markDirty();
8661
8662
  };
8662
- const handleRenameActiveCustomShow = () => {
8663
+ const handleRenameActiveCustomShow = async () => {
8663
8664
  if (!activeCustomShowId) {
8664
8665
  return;
8665
8666
  }
@@ -8667,14 +8668,14 @@ function useDialogCustomShows(input) {
8667
8668
  if (!show) {
8668
8669
  return;
8669
8670
  }
8670
- const nextName = safePrompt("Rename custom show", show.name)?.trim();
8671
+ const nextName = (await pptx.promptNameDialog(t("pptx.customShows.renamePrompt"), show.name, { t }))?.trim();
8671
8672
  if (!nextName) {
8672
8673
  return;
8673
8674
  }
8674
8675
  setCustomShows((prev) => prev.map((s) => s.id === show.id ? { ...s, name: nextName } : s));
8675
8676
  history.markDirty();
8676
8677
  };
8677
- const handleDeleteActiveCustomShow = () => {
8678
+ const handleDeleteActiveCustomShow = async () => {
8678
8679
  const showId = activeCustomShowId;
8679
8680
  if (!showId) {
8680
8681
  return;
@@ -8683,7 +8684,7 @@ function useDialogCustomShows(input) {
8683
8684
  if (!show) {
8684
8685
  return;
8685
8686
  }
8686
- if (!safeConfirm(`Delete custom show "${show.name}"?`)) {
8687
+ if (!await pptx.confirmDeleteDialog(t("pptx.customShows.deleteConfirm", { name: show.name }), { t })) {
8687
8688
  return;
8688
8689
  }
8689
8690
  setCustomShows((prev) => prev.filter((s) => s.id !== showId));
@@ -8951,7 +8952,7 @@ function useViewerDialogs(input) {
8951
8952
  };
8952
8953
  }
8953
8954
  function computeGridSpacingPx(documentGridSpacing) {
8954
- return pptx.computeGridSpacingPx(documentGridSpacing, chunk5KFSMXI4_js.GRID_SIZE);
8955
+ return pptx.computeGridSpacingPx(documentGridSpacing, chunk5DBKW7F3_js.GRID_SIZE);
8955
8956
  }
8956
8957
  function computeVisibleSlideIndexes(slides, activeCustomShowId, customShows, presentationProperties) {
8957
8958
  const activeShow = activeCustomShowId ? customShows.find((show) => show.id === activeCustomShowId) : void 0;
@@ -8960,7 +8961,7 @@ function computeVisibleSlideIndexes(slides, activeCustomShowId, customShows, pre
8960
8961
  }
8961
8962
  function computeSlideSectionGroups(slides, sections) {
8962
8963
  return pptx.groupSlidesBySection(sections, slides).map((group) => ({
8963
- id: group.section?.id ?? (sections.length > 0 ? chunk5KFSMXI4_js.UNGROUPED_SECTION_ID : chunk5KFSMXI4_js.DEFAULT_SECTION_GROUP_ID),
8964
+ id: group.section?.id ?? (sections.length > 0 ? chunk5DBKW7F3_js.UNGROUPED_SECTION_ID : chunk5DBKW7F3_js.DEFAULT_SECTION_GROUP_ID),
8964
8965
  label: group.section?.name ?? (sections.length > 0 ? "Ungrouped Slides" : "Slides"),
8965
8966
  slideIndexes: group.slideIndexes,
8966
8967
  ...group.section?.color !== void 0 ? { color: group.section.color } : {},
@@ -8979,7 +8980,7 @@ function computeMasterPseudoSlide(mode, activeLayout, activeMaster) {
8979
8980
  });
8980
8981
  }
8981
8982
  function useDerivedSlideState(input) {
8982
- const { t } = chunk5KFSMXI4_js.useTranslation();
8983
+ const { t } = chunk5DBKW7F3_js.useTranslation();
8983
8984
  const {
8984
8985
  slides,
8985
8986
  sections,
@@ -9005,10 +9006,10 @@ function useDerivedSlideState(input) {
9005
9006
  );
9006
9007
  const slideSectionGroups = React17.useMemo(
9007
9008
  () => computeSlideSectionGroups(slides, sections).map((group) => {
9008
- if (group.id === chunk5KFSMXI4_js.UNGROUPED_SECTION_ID && group.label === "Ungrouped Slides") {
9009
+ if (group.id === chunk5DBKW7F3_js.UNGROUPED_SECTION_ID && group.label === "Ungrouped Slides") {
9009
9010
  return { ...group, label: t("pptx.slides.ungroupedSlides") };
9010
9011
  }
9011
- if (group.id === chunk5KFSMXI4_js.DEFAULT_SECTION_GROUP_ID && group.label === "Slides") {
9012
+ if (group.id === chunk5DBKW7F3_js.DEFAULT_SECTION_GROUP_ID && group.label === "Slides") {
9012
9013
  return { ...group, label: t("pptx.sections.slides") };
9013
9014
  }
9014
9015
  return group;
@@ -9115,7 +9116,7 @@ function useAnnotationHandlers(input) {
9115
9116
  if (nextMode === "present") {
9116
9117
  presentation.enterPresentMode();
9117
9118
  } else if (mode === "present" && annotations.hasAnyAnnotations) {
9118
- chunk5KFSMXI4_js.stopAllPersistentAudio();
9119
+ chunk5DBKW7F3_js.stopAllPersistentAudio();
9119
9120
  if (promptKeepInkAnnotations) {
9120
9121
  pendingModeAfterAnnotationsRef.current = nextMode;
9121
9122
  setShowKeepAnnotationsDialog(true);
@@ -9125,7 +9126,7 @@ function useAnnotationHandlers(input) {
9125
9126
  }
9126
9127
  } else {
9127
9128
  if (mode === "present") {
9128
- chunk5KFSMXI4_js.stopAllPersistentAudio();
9129
+ chunk5DBKW7F3_js.stopAllPersistentAudio();
9129
9130
  }
9130
9131
  setMode(nextMode);
9131
9132
  }
@@ -9293,7 +9294,7 @@ function useSerialize(input) {
9293
9294
  guides: pptxGuides.length > 0 ? pptxGuides : void 0
9294
9295
  };
9295
9296
  });
9296
- const slidesToSave = chunk5KFSMXI4_js.buildSaveSlides(slidesWithGuides, pending.templateElementsBySlideId);
9297
+ const slidesToSave = chunk5DBKW7F3_js.buildSaveSlides(slidesWithGuides, pending.templateElementsBySlideId);
9297
9298
  const saveOptions = pptx.buildDeckSaveOptions({
9298
9299
  // Without this the Slide Size card edited a viewer-only pixel value and
9299
9300
  // the saved `p:sldSz` never moved: passing `slideSize` is the only way a
@@ -9438,7 +9439,7 @@ function usePresentationSetup(input) {
9438
9439
  return;
9439
9440
  }
9440
9441
  if (mode === "present" && nextMode !== "present") {
9441
- chunk5KFSMXI4_js.stopAllPersistentAudio();
9442
+ chunk5DBKW7F3_js.stopAllPersistentAudio();
9442
9443
  stopAnimationSound();
9443
9444
  const exitHandler = exitModeHandlerRef.current;
9444
9445
  if (exitHandler) {
@@ -9559,7 +9560,7 @@ function useCanvasImagePaste(input) {
9559
9560
  );
9560
9561
  }
9561
9562
  function formatPatchFor(element, format) {
9562
- const updated = chunk5KFSMXI4_js.applyFormatToElement(element, format);
9563
+ const updated = chunk5DBKW7F3_js.applyFormatToElement(element, format);
9563
9564
  const updates = {};
9564
9565
  if (pptx$1.hasShapeProperties(updated)) {
9565
9566
  updates.shapeStyle = updated.shapeStyle;
@@ -9582,7 +9583,7 @@ function useFormatPainterEditing(input) {
9582
9583
  const prevFormatPainterRef = React17.useRef(false);
9583
9584
  React17.useEffect(() => {
9584
9585
  if (formatPainterActive && !prevFormatPainterRef.current && selectedElement) {
9585
- copiedFormatRef.current = chunk5KFSMXI4_js.copyFormatFromElement(selectedElement);
9586
+ copiedFormatRef.current = chunk5DBKW7F3_js.copyFormatFromElement(selectedElement);
9586
9587
  } else if (!formatPainterActive) {
9587
9588
  copiedFormatRef.current = null;
9588
9589
  }
@@ -10394,6 +10395,27 @@ function useContentLifecycle(input) {
10394
10395
  };
10395
10396
  const serializeSlides = useSerialize(serializeInput);
10396
10397
  const serializeForRecovery = useSerialize({ ...serializeInput, purpose: "recovery-snapshot" });
10398
+ const getChangeSources = () => [
10399
+ slides,
10400
+ state.templateElementsBySlideId,
10401
+ state.guides,
10402
+ state.headerFooter,
10403
+ state.presentationProperties,
10404
+ state.customShows,
10405
+ state.sections,
10406
+ state.coreProperties,
10407
+ state.appProperties,
10408
+ state.customProperties,
10409
+ state.tagCollections,
10410
+ state.notesMaster,
10411
+ state.handoutMaster,
10412
+ state.embeddedFonts,
10413
+ embedFonts,
10414
+ password,
10415
+ state.inlineEditingElementIdRef.current,
10416
+ state.inlineEditingTextRef.current,
10417
+ state.inlineEditingSnapshotRef.current
10418
+ ];
10397
10419
  const { autosaveStatus } = useAutosave({
10398
10420
  isDirty: state.isDirty,
10399
10421
  filePath,
@@ -10401,36 +10423,12 @@ function useContentLifecycle(input) {
10401
10423
  serializeSlides: serializeForRecovery,
10402
10424
  enabled: autosaveEnabled,
10403
10425
  ...autosaveIntervalMs === void 0 ? {} : { intervalMs: autosaveIntervalMs },
10404
- // Everything `serializeForRecovery` reads that changes by REASSIGNMENT,
10405
- // so a poll that finds all of them unchanged can skip re-serializing a
10406
- // deck it has already snapshotted. The two refs are read by `.current`
10407
- // because an inline edit in progress lives there and nowhere else yet.
10408
10426
  onSaved: input.onAutosave,
10409
10427
  inlineDraftSinkRef: state.autosaveDraftSinkRef,
10410
10428
  getInlineEditingId: () => state.inlineEditingElementIdRef.current,
10411
- getChangeSources: () => [
10412
- slides,
10413
- state.templateElementsBySlideId,
10414
- state.guides,
10415
- state.headerFooter,
10416
- state.presentationProperties,
10417
- state.customShows,
10418
- state.sections,
10419
- state.coreProperties,
10420
- state.appProperties,
10421
- state.customProperties,
10422
- state.tagCollections,
10423
- state.notesMaster,
10424
- state.handoutMaster,
10425
- state.embeddedFonts,
10426
- embedFonts,
10427
- password,
10428
- state.inlineEditingElementIdRef.current,
10429
- state.inlineEditingTextRef.current,
10430
- state.inlineEditingSnapshotRef.current
10431
- ]
10429
+ getChangeSources
10432
10430
  });
10433
- return { handlerRef, serializeSlides, serializeForRecovery, autosaveStatus };
10431
+ return { handlerRef, serializeSlides, serializeForRecovery, autosaveStatus, getChangeSources };
10434
10432
  }
10435
10433
  function useKeyboardShortcuts(input) {
10436
10434
  const inputRef = React17.useRef(input);
@@ -10775,7 +10773,7 @@ function useViewerIntegration(input) {
10775
10773
  });
10776
10774
  const [isEncryptedDialogOpen, setIsEncryptedDialogOpen] = React17.useState(false);
10777
10775
  const [loadVersion, setLoadVersion] = React17.useState(0);
10778
- const { handlerRef, serializeSlides, autosaveStatus } = useContentLifecycle({
10776
+ const { handlerRef, serializeSlides, autosaveStatus, getChangeSources } = useContentLifecycle({
10779
10777
  content,
10780
10778
  filePath,
10781
10779
  storage,
@@ -10858,164 +10856,167 @@ function useViewerIntegration(input) {
10858
10856
  });
10859
10857
  React17.useImperativeHandle(
10860
10858
  ref,
10861
- () => latestHandleRef.current = {
10862
- ...customizationApi,
10863
- async getContent() {
10864
- const data = await serializeSlides();
10865
- if (data && onContentChange) {
10866
- onContentChange(data);
10867
- }
10868
- return data ?? new Uint8Array(0);
10869
- },
10870
- goTo(index) {
10871
- if (index >= 0 && index < slides.length) {
10872
- state.setActiveSlideIndex(index);
10873
- }
10874
- },
10875
- goPrev() {
10876
- const next = activeSlideIndex - 1;
10877
- if (next >= 0) {
10878
- state.setActiveSlideIndex(next);
10879
- }
10880
- },
10881
- goNext() {
10882
- const next = activeSlideIndex + 1;
10883
- if (next < slides.length) {
10884
- state.setActiveSlideIndex(next);
10885
- }
10886
- },
10887
- undo() {
10888
- history.handleUndo();
10889
- },
10890
- redo() {
10891
- history.handleRedo();
10892
- },
10893
- canUndo() {
10894
- return history.canUndo;
10895
- },
10896
- canRedo() {
10897
- return history.canRedo;
10898
- },
10899
- getZoom() {
10900
- return zoom.scale;
10901
- },
10902
- setZoom(level) {
10903
- zoom.setScale(pptx.clampZoomScale(level));
10904
- },
10905
- zoomIn() {
10906
- zoom.handleZoomIn();
10907
- },
10908
- zoomOut() {
10909
- zoom.handleZoomOut();
10910
- },
10911
- zoomReset() {
10912
- zoom.handleResetZoom();
10913
- },
10914
- getMode() {
10915
- return mode;
10916
- },
10917
- setMode(newMode) {
10918
- state.setMode(newMode);
10919
- },
10920
- getActiveSlideIndex() {
10921
- return activeSlideIndex;
10922
- },
10923
- getSlideCount() {
10924
- return slides.length;
10925
- },
10926
- isDirty() {
10927
- return state.isDirty;
10928
- },
10929
- getSelectedElementIds() {
10930
- return state.effectiveSelectedIds;
10931
- },
10932
- selectElements(ids) {
10933
- state.setSelectedElementIds(ids);
10934
- state.setSelectedElementId(ids[0] ?? null);
10935
- },
10936
- clearSelection() {
10937
- state.setSelectedElementIds([]);
10938
- state.setSelectedElementId(null);
10939
- },
10940
- // -- Active slide (alias) --
10941
- setActiveSlideIndex(index) {
10942
- if (index >= 0 && index < slides.length) {
10943
- state.setActiveSlideIndex(index);
10944
- }
10945
- },
10946
- // -- Slide access --
10947
- getSlides() {
10948
- return slides;
10949
- },
10950
- getSlide(index) {
10951
- return slides[index];
10952
- },
10953
- getActiveSlide() {
10954
- return slides[activeSlideIndex];
10955
- },
10956
- // -- Slide manipulation --
10957
- addSlide(afterIndex) {
10958
- if (afterIndex === void 0) {
10959
- editorOps.slideOps.handleAddSlide();
10960
- } else {
10961
- editorOps.slideOps.handleAddSlideAfter(afterIndex);
10962
- }
10963
- },
10964
- deleteSlides(indexes) {
10965
- editorOps.slideOps.handleDeleteSlides(indexes);
10966
- },
10967
- duplicateSlides(indexes) {
10968
- editorOps.slideOps.handleDuplicateSlides(indexes);
10969
- },
10970
- moveSlide(fromIndex, toIndex) {
10971
- editorOps.slideOps.handleMoveSlide(fromIndex, toIndex);
10972
- },
10973
- toggleHideSlides(indexes) {
10974
- editorOps.slideOps.handleToggleHideSlides(indexes);
10975
- },
10976
- // -- Element access --
10977
- getElements(slideIndex) {
10978
- const idx = slideIndex ?? activeSlideIndex;
10979
- const s = slides[idx];
10980
- return s?.elements ?? [];
10981
- },
10982
- getElementById(elementId, slideIndex) {
10983
- const idx = slideIndex ?? activeSlideIndex;
10984
- const s = slides[idx];
10985
- return s ? pptx.slideSpaceElement(s.elements, elementId) ?? void 0 : void 0;
10986
- },
10987
- // -- Element manipulation --
10988
- addElement(element) {
10989
- const inserted = pptx.prepareElementForInsertion(element, {
10990
- canEdit: canEdit && canInsertElement,
10991
- mode,
10992
- hasActiveSlide: !loading && !error && Boolean(activeSlide),
10993
- editTemplateMode: state.editTemplateMode
10994
- });
10995
- if (!inserted) {
10996
- return void 0;
10859
+ () => latestHandleRef.current = pptx.gateViewerEdits(
10860
+ {
10861
+ ...customizationApi,
10862
+ async getContent() {
10863
+ const data = await serializeSlides();
10864
+ if (data && onContentChange) {
10865
+ onContentChange(data);
10866
+ }
10867
+ return data ?? new Uint8Array(0);
10868
+ },
10869
+ goTo(index) {
10870
+ if (index >= 0 && index < slides.length) {
10871
+ state.setActiveSlideIndex(index);
10872
+ }
10873
+ },
10874
+ goPrev() {
10875
+ const next = activeSlideIndex - 1;
10876
+ if (next >= 0) {
10877
+ state.setActiveSlideIndex(next);
10878
+ }
10879
+ },
10880
+ goNext() {
10881
+ const next = activeSlideIndex + 1;
10882
+ if (next < slides.length) {
10883
+ state.setActiveSlideIndex(next);
10884
+ }
10885
+ },
10886
+ undo() {
10887
+ history.handleUndo();
10888
+ },
10889
+ redo() {
10890
+ history.handleRedo();
10891
+ },
10892
+ canUndo() {
10893
+ return history.canUndo;
10894
+ },
10895
+ canRedo() {
10896
+ return history.canRedo;
10897
+ },
10898
+ getZoom() {
10899
+ return zoom.scale;
10900
+ },
10901
+ setZoom(level) {
10902
+ zoom.setScale(pptx.clampZoomScale(level));
10903
+ },
10904
+ zoomIn() {
10905
+ zoom.handleZoomIn();
10906
+ },
10907
+ zoomOut() {
10908
+ zoom.handleZoomOut();
10909
+ },
10910
+ zoomReset() {
10911
+ zoom.handleResetZoom();
10912
+ },
10913
+ getMode() {
10914
+ return pptx.resolveReportedViewerMode(mode, canEdit);
10915
+ },
10916
+ setMode(newMode) {
10917
+ state.setMode(newMode);
10918
+ },
10919
+ getActiveSlideIndex() {
10920
+ return activeSlideIndex;
10921
+ },
10922
+ getSlideCount() {
10923
+ return slides.length;
10924
+ },
10925
+ isDirty() {
10926
+ return state.isDirty;
10927
+ },
10928
+ getSelectedElementIds() {
10929
+ return state.effectiveSelectedIds;
10930
+ },
10931
+ selectElements(ids) {
10932
+ state.setSelectedElementIds(ids);
10933
+ state.setSelectedElementId(ids[0] ?? null);
10934
+ },
10935
+ clearSelection() {
10936
+ state.setSelectedElementIds([]);
10937
+ state.setSelectedElementId(null);
10938
+ },
10939
+ // -- Active slide (alias) --
10940
+ setActiveSlideIndex(index) {
10941
+ if (index >= 0 && index < slides.length) {
10942
+ state.setActiveSlideIndex(index);
10943
+ }
10944
+ },
10945
+ // -- Slide access --
10946
+ getSlides() {
10947
+ return slides;
10948
+ },
10949
+ getSlide(index) {
10950
+ return slides[index];
10951
+ },
10952
+ getActiveSlide() {
10953
+ return slides[activeSlideIndex];
10954
+ },
10955
+ // -- Slide manipulation --
10956
+ addSlide(afterIndex) {
10957
+ if (afterIndex === void 0) {
10958
+ editorOps.slideOps.handleAddSlide();
10959
+ } else {
10960
+ editorOps.slideOps.handleAddSlideAfter(afterIndex);
10961
+ }
10962
+ },
10963
+ deleteSlides(indexes) {
10964
+ editorOps.slideOps.handleDeleteSlides(indexes);
10965
+ },
10966
+ duplicateSlides(indexes) {
10967
+ editorOps.slideOps.handleDuplicateSlides(indexes);
10968
+ },
10969
+ moveSlide(fromIndex, toIndex) {
10970
+ editorOps.slideOps.handleMoveSlide(fromIndex, toIndex);
10971
+ },
10972
+ toggleHideSlides(indexes) {
10973
+ editorOps.slideOps.handleToggleHideSlides(indexes);
10974
+ },
10975
+ // -- Element access --
10976
+ getElements(slideIndex) {
10977
+ const idx = slideIndex ?? activeSlideIndex;
10978
+ const s = slides[idx];
10979
+ return s?.elements ?? [];
10980
+ },
10981
+ getElementById(elementId, slideIndex) {
10982
+ const idx = slideIndex ?? activeSlideIndex;
10983
+ const s = slides[idx];
10984
+ return s ? pptx.slideSpaceElement(s.elements, elementId) ?? void 0 : void 0;
10985
+ },
10986
+ // -- Element manipulation --
10987
+ addElement(element) {
10988
+ const inserted = pptx.prepareElementForInsertion(element, {
10989
+ canEdit: canEdit && canInsertElement,
10990
+ mode,
10991
+ hasActiveSlide: !loading && !error && Boolean(activeSlide),
10992
+ editTemplateMode: state.editTemplateMode
10993
+ });
10994
+ if (!inserted) {
10995
+ return void 0;
10996
+ }
10997
+ editorOps.canvasHandlers.handleInlineEditCommit();
10998
+ editorOps.insertHandlers.addElement(inserted);
10999
+ editorOps.ops.applySelection(inserted.id, [inserted.id]);
11000
+ return inserted.id;
11001
+ },
11002
+ updateElements,
11003
+ updateElement(elementId, updates) {
11004
+ editorOps.ops.updateElementById(elementId, updates);
11005
+ },
11006
+ deleteElements(elementIds) {
11007
+ state.setSelectedElementIds(elementIds);
11008
+ state.setSelectedElementId(elementIds[0] ?? null);
11009
+ editorOps.manipulation.handleDelete();
11010
+ },
11011
+ duplicateElement(elementId) {
11012
+ state.setSelectedElementIds([elementId]);
11013
+ state.setSelectedElementId(elementId);
11014
+ editorOps.manipulation.handleDuplicate();
11015
+ return state.selectedElementIds[0];
10997
11016
  }
10998
- editorOps.canvasHandlers.handleInlineEditCommit();
10999
- editorOps.insertHandlers.addElement(inserted);
11000
- editorOps.ops.applySelection(inserted.id, [inserted.id]);
11001
- return inserted.id;
11002
- },
11003
- updateElements,
11004
- updateElement(elementId, updates) {
11005
- editorOps.ops.updateElementById(elementId, updates);
11006
11017
  },
11007
- deleteElements(elementIds) {
11008
- state.setSelectedElementIds(elementIds);
11009
- state.setSelectedElementId(elementIds[0] ?? null);
11010
- editorOps.manipulation.handleDelete();
11011
- },
11012
- duplicateElement(elementId) {
11013
- state.setSelectedElementIds([elementId]);
11014
- state.setSelectedElementId(elementId);
11015
- editorOps.manipulation.handleDuplicate();
11016
- return state.selectedElementIds[0];
11017
- }
11018
- },
11018
+ () => canEdit
11019
+ ),
11019
11020
  [
11020
11021
  updateElements,
11021
11022
  serializeSlides,
@@ -11100,6 +11101,7 @@ function useViewerIntegration(input) {
11100
11101
  handleEnterPresenterView,
11101
11102
  handleEnterRehearsalMode,
11102
11103
  autosaveStatus,
11104
+ getChangeSources,
11103
11105
  recovery,
11104
11106
  isEncryptedDialogOpen,
11105
11107
  setIsEncryptedDialogOpen,
@@ -11218,7 +11220,7 @@ function useCollaborationWriteBack(input) {
11218
11220
  getSourceBytes: () => latest.current.getSourceBytes?.() ?? null,
11219
11221
  getSaveOptions: () => latest.current.getSaveOptions?.(),
11220
11222
  getTemplateElements: () => latest.current.templateElementsBySlideId,
11221
- mergeTemplateElements: chunk5KFSMXI4_js.buildSaveSlides,
11223
+ mergeTemplateElements: chunk5DBKW7F3_js.buildSaveSlides,
11222
11224
  onWriteBackStatus: () => latest.current.onWriteBackStatus?.(
11223
11225
  pptx.writeBackReport(latest.current.config, created.getState())
11224
11226
  )
@@ -11775,8 +11777,8 @@ function useTouchGestures(input) {
11775
11777
  }
11776
11778
  const recognizer = pptx.createTouchGestureRecognizer({
11777
11779
  getScale: () => scaleRef.current,
11778
- minScale: chunk5KFSMXI4_js.MIN_ZOOM_SCALE,
11779
- maxScale: chunk5KFSMXI4_js.MAX_ZOOM_SCALE,
11780
+ minScale: chunk5DBKW7F3_js.MIN_ZOOM_SCALE,
11781
+ maxScale: chunk5DBKW7F3_js.MAX_ZOOM_SCALE,
11780
11782
  callbacks: {
11781
11783
  onPinchZoom: (newScale) => callbacksRef.current.onPinchZoom?.(newScale),
11782
11784
  onSwipe: (direction) => callbacksRef.current.onSwipe?.(direction),
@@ -11885,7 +11887,7 @@ function buildCanvasProps(input) {
11885
11887
  findResults,
11886
11888
  findResultIndex,
11887
11889
  viewerOptions,
11888
- buildHyperlinkConfirmMessage
11890
+ t
11889
11891
  } = input;
11890
11892
  const effectiveSlide = mode === "master" ? masterPseudoSlide : activeSlide;
11891
11893
  const effectiveTemplateElements = mode === "master" ? s.activeLayout ? s.activeMaster?.elements ?? [] : [] : templateElements;
@@ -11897,10 +11899,7 @@ function buildCanvasProps(input) {
11897
11899
  });
11898
11900
  const tableStyleContext = s.theme || s.tableStyleMap ? { theme: s.theme, tableStyleMap: s.tableStyleMap } : void 0;
11899
11901
  const openExternalUrl = (url, target) => {
11900
- if (pptx.shouldConfirmExternalHyperlink(viewerOptions, url) && !window.confirm(buildHyperlinkConfirmMessage(url))) {
11901
- return;
11902
- }
11903
- chunk5KFSMXI4_js.safeOpenUrl(url, target);
11902
+ void pptx.openExternalHyperlinkConfirmed(viewerOptions, url, { t }, target);
11904
11903
  };
11905
11904
  const handleActionClick = (elementId, action) => {
11906
11905
  if (mode === "present") {
@@ -11915,9 +11914,9 @@ function buildCanvasProps(input) {
11915
11914
  }
11916
11915
  };
11917
11916
  const handleHyperlinkClick = (url, target) => {
11918
- if (chunk5KFSMXI4_js.isPpactionUrl(url)) {
11917
+ if (chunk5DBKW7F3_js.isPpactionUrl(url)) {
11919
11918
  if (mode === "present") {
11920
- const parsed = chunk5KFSMXI4_js.parsePpactionUrl(url);
11919
+ const parsed = chunk5DBKW7F3_js.parsePpactionUrl(url);
11921
11920
  if (parsed) {
11922
11921
  presentation.handlePresentationAction({
11923
11922
  action: parsed.action,
@@ -12409,7 +12408,7 @@ function buildToolbarProps(input) {
12409
12408
  markDirty: history.markDirty
12410
12409
  }),
12411
12410
  formatPainterActive: s.formatPainterActive,
12412
- canActivateFormatPainter: chunk5KFSMXI4_js.hasCopyableFormat(selectedElement),
12411
+ canActivateFormatPainter: chunk5DBKW7F3_js.hasCopyableFormat(selectedElement),
12413
12412
  onToggleFormatPainter: () => s.setFormatPainterActive((p) => !p),
12414
12413
  isSelectionPaneOpen: s.isSelectionPaneOpen,
12415
12414
  onToggleSelectionPane: () => s.setIsSelectionPaneOpen((p) => !p),
@@ -13134,7 +13133,7 @@ function useViewerBuildingBlocks(input) {
13134
13133
  } = input;
13135
13134
  const collaborationConfig = pptx.resolveCollaborationConfig(input.collaboration);
13136
13135
  const [collaborationReadOnly, setCollaborationReadOnly] = React17.useState(Boolean(collaborationConfig));
13137
- const { t } = chunk5KFSMXI4_js.useTranslation();
13136
+ const { t } = chunk5DBKW7F3_js.useTranslation();
13138
13137
  const [content, setContent] = React17.useState(incomingContent ?? null);
13139
13138
  const [loadOrigin, setLoadOrigin] = React17.useState("bootstrap");
13140
13139
  React17.useEffect(() => {
@@ -13281,9 +13280,7 @@ function useViewerBuildingBlocks(input) {
13281
13280
  findResults: editorOps.findReplace.findResults,
13282
13281
  findResultIndex: editorOps.findReplace.findResultIndex,
13283
13282
  viewerOptions,
13284
- buildHyperlinkConfirmMessage: (url) => `${t("pptx.options.trust.confirmHyperlinks")}
13285
-
13286
- ${url}`
13283
+ t
13287
13284
  });
13288
13285
  canvasProps.collaborationOverlay = overlay;
13289
13286
  const slidesPaneProps = useSlidesPaneProps({
@@ -13338,23 +13335,23 @@ function ColorChangedImage({
13338
13335
  className,
13339
13336
  alt
13340
13337
  }) {
13341
- const tolerance = tolerancePct ?? chunk5KFSMXI4_js.DEFAULT_COLOR_CHANGE_TOLERANCE;
13342
- const cacheKey = chunk5KFSMXI4_js.buildCacheKey(
13338
+ const tolerance = tolerancePct ?? chunk5DBKW7F3_js.DEFAULT_COLOR_CHANGE_TOLERANCE;
13339
+ const cacheKey = chunk5DBKW7F3_js.buildCacheKey(
13343
13340
  src,
13344
13341
  clrChange.clrFrom,
13345
13342
  clrChange.clrTo,
13346
13343
  tolerance,
13347
13344
  Boolean(clrChange.clrToTransparent)
13348
13345
  );
13349
- const cached = chunk5KFSMXI4_js.getCachedResult(cacheKey);
13346
+ const cached = chunk5DBKW7F3_js.getCachedResult(cacheKey);
13350
13347
  const [processedSrc, setProcessedSrc] = React17.useState(cached ?? null);
13351
13348
  React17.useEffect(() => {
13352
- if (chunk5KFSMXI4_js.getCachedResult(cacheKey)) {
13353
- setProcessedSrc(chunk5KFSMXI4_js.getCachedResult(cacheKey) ?? null);
13349
+ if (chunk5DBKW7F3_js.getCachedResult(cacheKey)) {
13350
+ setProcessedSrc(chunk5DBKW7F3_js.getCachedResult(cacheKey) ?? null);
13354
13351
  return;
13355
13352
  }
13356
13353
  let cancelled = false;
13357
- chunk5KFSMXI4_js.applyColorChange(
13354
+ chunk5DBKW7F3_js.applyColorChange(
13358
13355
  src,
13359
13356
  clrChange.clrFrom,
13360
13357
  clrChange.clrTo,
@@ -13362,7 +13359,7 @@ function ColorChangedImage({
13362
13359
  Boolean(clrChange.clrToTransparent)
13363
13360
  ).then((result) => {
13364
13361
  if (!cancelled) {
13365
- chunk5KFSMXI4_js.setCachedResult(cacheKey, result.dataUrl);
13362
+ chunk5DBKW7F3_js.setCachedResult(cacheKey, result.dataUrl);
13366
13363
  setProcessedSrc(result.dataUrl);
13367
13364
  }
13368
13365
  return void 0;
@@ -13454,7 +13451,7 @@ function TiledImageLayer({
13454
13451
  cancelled = true;
13455
13452
  };
13456
13453
  }, [src]);
13457
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className, style: { ...chunk5KFSMXI4_js.getImageTilingStyle(element, nativeSize), ...style } });
13454
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className, style: { ...chunk5DBKW7F3_js.getImageTilingStyle(element, nativeSize), ...style } });
13458
13455
  }
13459
13456
  function renderImageEffectDefinitions(element, excludeDuotone = false) {
13460
13457
  return pptx.getImageSvgFilters(element).filter((definition) => !excludeDuotone || definition.id !== `duotone-${element.id}`).map((definition) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -13523,7 +13520,7 @@ function renderImg(el, style, filter, alt, opacity) {
13523
13520
  ...filter ? { filter } : {},
13524
13521
  ...opacity !== void 0 ? { opacity } : {}
13525
13522
  };
13526
- if (chunk5KFSMXI4_js.isImageTiled(el)) {
13523
+ if (chunk5DBKW7F3_js.isImageTiled(el)) {
13527
13524
  const tileSrc = imgSrc(el);
13528
13525
  if (!tileSrc) {
13529
13526
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-gray-500 bg-gray-100", children: "Image" });
@@ -13545,9 +13542,9 @@ function renderImg(el, style, filter, alt, opacity) {
13545
13542
  pptx$1.isImageLikeElement(el) ? el.imageEffects?.colorWash : void 0
13546
13543
  );
13547
13544
  const clrChange = "imageEffects" in el ? el.imageEffects?.clrChange : void 0;
13548
- const duotoneColors = chunk5KFSMXI4_js.getDuotoneColors(el);
13545
+ const duotoneColors = chunk5DBKW7F3_js.getDuotoneColors(el);
13549
13546
  const useDuotoneCanvas = Boolean(duotoneColors && !clrChange);
13550
- const filterForImg = useDuotoneCanvas ? chunk5KFSMXI4_js.getImageEffectsFilter(el, { excludeDuotone: true }) : filter;
13547
+ const filterForImg = useDuotoneCanvas ? chunk5DBKW7F3_js.getImageEffectsFilter(el, { excludeDuotone: true }) : filter;
13551
13548
  const canvasEffectStyles = {
13552
13549
  ...filterForImg ? { filter: filterForImg } : {},
13553
13550
  ...opacity !== void 0 ? { opacity } : {}
@@ -13623,10 +13620,10 @@ function SlideBackgroundImageLayer({
13623
13620
  style: { zIndex: 0 },
13624
13621
  children: renderImg(
13625
13622
  backgroundElement,
13626
- chunk5KFSMXI4_js.getImageRenderStyle(backgroundElement),
13627
- chunk5KFSMXI4_js.getImageEffectsFilter(backgroundElement),
13623
+ chunk5DBKW7F3_js.getImageRenderStyle(backgroundElement),
13624
+ chunk5DBKW7F3_js.getImageEffectsFilter(backgroundElement),
13628
13625
  "",
13629
- chunk5KFSMXI4_js.getImageEffectsOpacity(backgroundElement)
13626
+ chunk5DBKW7F3_js.getImageEffectsOpacity(backgroundElement)
13630
13627
  )
13631
13628
  }
13632
13629
  );
@@ -13897,7 +13894,7 @@ function ChartElementView({
13897
13894
  onUpdateElement,
13898
13895
  animationState
13899
13896
  }) {
13900
- const { t } = chunk5KFSMXI4_js.useTranslation();
13897
+ const { t } = chunk5DBKW7F3_js.useTranslation();
13901
13898
  const wrapperRef = React17.useRef(null);
13902
13899
  const { selection, setSelection } = useChartPartSelection();
13903
13900
  const [titleDraft, setTitleDraft] = React17.useState(null);
@@ -13912,7 +13909,7 @@ function ChartElementView({
13912
13909
  pptx.getBarFacePicturePixelSampleVersion
13913
13910
  );
13914
13911
  const viewModel = React17.useMemo(() => {
13915
- return canEdit ? chunk5KFSMXI4_js.buildReactChartViewModel(element) : null;
13912
+ return canEdit ? chunk5DBKW7F3_js.buildReactChartViewModel(element) : null;
13916
13913
  }, [canEdit, element, barFacePictureSampleVersion]);
13917
13914
  React17.useEffect(pptx.ensureChartInteractionStyles, []);
13918
13915
  React17.useEffect(() => {
@@ -14017,9 +14014,9 @@ function ChartElementView({
14017
14014
  textStyle: animationState?.textStyle,
14018
14015
  onSelect: chart3D.onSelect,
14019
14016
  onDrag: chart3D.onDrag,
14020
- children: chunk5KFSMXI4_js.renderChartElement(renderedElement, (key) => t(key))
14017
+ children: chunk5DBKW7F3_js.renderChartElement(renderedElement, (key) => t(key))
14021
14018
  }
14022
- ) : chunk5KFSMXI4_js.renderChartElement(renderedElement, (key) => t(key)),
14019
+ ) : chunk5DBKW7F3_js.renderChartElement(renderedElement, (key) => t(key)),
14023
14020
  dragValue !== null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute top-1 right-1 z-10 rounded bg-primary/90 px-1.5 py-0.5 text-[10px] font-medium text-white pointer-events-none", children: pptx.formatAxisValue(dragValue) }),
14024
14021
  titleDraft !== null && /* @__PURE__ */ jsxRuntime.jsx(
14025
14022
  "input",
@@ -14047,7 +14044,7 @@ function ChartElementView({
14047
14044
  );
14048
14045
  }
14049
14046
  function useActionAffordance(element, canInteract) {
14050
- const { t } = chunk5KFSMXI4_js.useTranslation();
14047
+ const { t } = chunk5DBKW7F3_js.useTranslation();
14051
14048
  pptx.ensureActionAffordanceStyles();
14052
14049
  return React17.useMemo(
14053
14050
  () => pptx.resolveElementActionAffordance(element, {
@@ -14325,7 +14322,7 @@ function ResizeHandles({
14325
14322
  nonRotationTransform,
14326
14323
  onRotate
14327
14324
  }) {
14328
- const { t } = chunk5KFSMXI4_js.useTranslation();
14325
+ const { t } = chunk5DBKW7F3_js.useTranslation();
14329
14326
  const rotateRef = useRotateHandlePlacement(elementId, Boolean(onRotate));
14330
14327
  const peStyle = forcePointerEvents ? { ...HANDLE_TOUCH_ACTION, pointerEvents: "auto" } : HANDLE_TOUCH_ACTION;
14331
14328
  const resizeStyle = { ...HANDLE_TOUCH_ACTION, pointerEvents: "none" };
@@ -14358,7 +14355,7 @@ function ResizeHandles({
14358
14355
  "aria-label": t("pptx.selectionOverlay.resize", { handle }),
14359
14356
  "data-pptx-handle-kind": "resize",
14360
14357
  "data-pptx-compact": true,
14361
- className: chunk5KFSMXI4_js.cn(
14358
+ className: chunk5DBKW7F3_js.cn(
14362
14359
  "absolute z-10 group border-0 bg-transparent p-0",
14363
14360
  RESIZE_DEFAULT_CLASSES,
14364
14361
  posClass,
@@ -14384,7 +14381,7 @@ function ResizeHandles({
14384
14381
  "div",
14385
14382
  {
14386
14383
  "data-pptx-handle-hit": true,
14387
- className: chunk5KFSMXI4_js.cn(
14384
+ className: chunk5DBKW7F3_js.cn(
14388
14385
  "absolute -inset-px pointer-events-auto [--pptx-handle-hit-inset:-1px]",
14389
14386
  corner ? "max-md:-inset-1.5 max-md:[--pptx-handle-hit-inset:-6px]" : "max-md:-inset-2 max-md:[--pptx-handle-hit-inset:-8px]"
14390
14387
  ),
@@ -14405,7 +14402,7 @@ function ResizeHandles({
14405
14402
  "aria-label": t("pptx.selectionOverlay.rotate"),
14406
14403
  "data-pptx-handle-kind": "rotate",
14407
14404
  "data-pptx-compact": true,
14408
- className: chunk5KFSMXI4_js.cn(
14405
+ className: chunk5DBKW7F3_js.cn(
14409
14406
  "absolute left-1/2 top-0 -translate-x-1/2 -translate-y-1/2 z-20 border-0 bg-transparent p-0 cursor-grab active:cursor-grabbing",
14410
14407
  ROTATE_DEFAULT_CLASSES
14411
14408
  ),
@@ -14482,10 +14479,10 @@ var ConnectorElementRendererMemo = /* @__PURE__ */ React17__default.default.memo
14482
14479
  const svgHeight = Math.max(el.height, 1);
14483
14480
  const ss = shapeEl?.shapeStyle;
14484
14481
  const strokeWidth = Math.max(0, ss?.strokeWidth ?? 2);
14485
- const strokeColor = chunk5KFSMXI4_js.normalizeHexColor(ss?.strokeColor, chunk5KFSMXI4_js.DEFAULT_STROKE_COLOR);
14486
- const strokePaint = chunk5KFSMXI4_js.colorWithOpacity(strokeColor, ss?.strokeOpacity);
14487
- const dashType = chunk5KFSMXI4_js.normalizeStrokeDashType(ss?.strokeDash);
14488
- const dashArray = chunk5KFSMXI4_js.getSvgStrokeDasharray(
14482
+ const strokeColor = chunk5DBKW7F3_js.normalizeHexColor(ss?.strokeColor, chunk5DBKW7F3_js.DEFAULT_STROKE_COLOR);
14483
+ const strokePaint = chunk5DBKW7F3_js.colorWithOpacity(strokeColor, ss?.strokeOpacity);
14484
+ const dashType = chunk5DBKW7F3_js.normalizeStrokeDashType(ss?.strokeDash);
14485
+ const dashArray = chunk5DBKW7F3_js.getSvgStrokeDasharray(
14489
14486
  dashType,
14490
14487
  Math.max(strokeWidth, 1),
14491
14488
  ss?.customDashSegments
@@ -14496,14 +14493,14 @@ var ConnectorElementRendererMemo = /* @__PURE__ */ React17__default.default.memo
14496
14493
  const markerSeed = el.id.replace(/[^a-zA-Z0-9_-]/gu, "_");
14497
14494
  const startMarkerId = `${markerSeed}-sel-start`;
14498
14495
  const endMarkerId = `${markerSeed}-sel-end`;
14499
- const compoundOffsets = chunk5KFSMXI4_js.getCompoundLineOffsets(compoundLine, strokeWidth);
14500
- const compoundWidths = chunk5KFSMXI4_js.getCompoundLineWidths(compoundLine, strokeWidth);
14496
+ const compoundOffsets = chunk5DBKW7F3_js.getCompoundLineOffsets(compoundLine, strokeWidth);
14497
+ const compoundWidths = chunk5DBKW7F3_js.getCompoundLineWidths(compoundLine, strokeWidth);
14501
14498
  const strokeCap = pptx.svgLineCap(ss?.lineCap);
14502
14499
  const textEl = pptx$1.hasTextProperties(el) ? el : void 0;
14503
14500
  const connectorText = textEl?.text?.trim() ?? "";
14504
14501
  const connectorTextSegments = textEl?.textSegments;
14505
14502
  const connectorTextStyle = textEl?.textStyle;
14506
- const pathGeometry = shapeEl ? chunk5KFSMXI4_js.getConnectorPathGeometry(shapeEl) : {
14503
+ const pathGeometry = shapeEl ? chunk5DBKW7F3_js.getConnectorPathGeometry(shapeEl) : {
14507
14504
  pathData: `M 0 0 L ${viewWidth} ${viewHeight}`,
14508
14505
  startX: 0,
14509
14506
  startY: 0,
@@ -14511,17 +14508,23 @@ var ConnectorElementRendererMemo = /* @__PURE__ */ React17__default.default.memo
14511
14508
  endY: viewHeight
14512
14509
  };
14513
14510
  const hitTargetWidth = Math.max(strokeWidth * 3, 14);
14511
+ const snapTransform = pptx.connectorSnapTransform(
14512
+ el,
14513
+ !pptx.connectorNeedsPath(shapeEl?.shapeType),
14514
+ compoundOffsets.length,
14515
+ strokeWidth
14516
+ );
14514
14517
  const selColor = selClr === "blue-400" ? "#60a5fa" : "#3b82f6";
14515
- const lineShadow = chunk5KFSMXI4_js.buildLineShadowCss(el);
14516
- const lineGlow = chunk5KFSMXI4_js.buildLineGlowFilter(el);
14518
+ const lineShadow = chunk5DBKW7F3_js.buildLineShadowCss(el);
14519
+ const lineGlow = chunk5DBKW7F3_js.buildLineGlowFilter(el);
14517
14520
  return /* @__PURE__ */ jsxRuntime.jsxs(
14518
14521
  "div",
14519
14522
  {
14520
14523
  "data-pptx-element": "true",
14521
14524
  "data-element-id": el.id,
14522
- role: chunk5KFSMXI4_js.getAriaRole(el, { actionable: false }),
14523
- "aria-label": chunk5KFSMXI4_js.getAriaLabel(el),
14524
- "aria-roledescription": chunk5KFSMXI4_js.getAriaRoleDescription(el),
14525
+ role: chunk5DBKW7F3_js.getAriaRole(el, { actionable: false }),
14526
+ "aria-label": chunk5DBKW7F3_js.getAriaLabel(el),
14527
+ "aria-roledescription": chunk5DBKW7F3_js.getAriaRoleDescription(el),
14525
14528
  "aria-selected": isSelected ? true : void 0,
14526
14529
  className: "absolute",
14527
14530
  style: {
@@ -14554,14 +14557,14 @@ var ConnectorElementRendererMemo = /* @__PURE__ */ React17__default.default.memo
14554
14557
  style: { overflow: "visible", pointerEvents: "none" },
14555
14558
  children: [
14556
14559
  /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
14557
- chunk5KFSMXI4_js.renderConnectorMarker(
14560
+ chunk5DBKW7F3_js.renderConnectorMarker(
14558
14561
  startMarkerId,
14559
14562
  startArrow,
14560
14563
  strokePaint,
14561
14564
  ss?.connectorStartArrowWidth,
14562
14565
  ss?.connectorStartArrowLength
14563
14566
  ),
14564
- chunk5KFSMXI4_js.renderConnectorMarker(
14567
+ chunk5DBKW7F3_js.renderConnectorMarker(
14565
14568
  endMarkerId,
14566
14569
  endArrow,
14567
14570
  strokePaint,
@@ -14628,6 +14631,7 @@ var ConnectorElementRendererMemo = /* @__PURE__ */ React17__default.default.memo
14628
14631
  compoundOffsets.map((offset, idx) => /* @__PURE__ */ jsxRuntime.jsx(
14629
14632
  "path",
14630
14633
  {
14634
+ "data-pptx-line": "",
14631
14635
  d: pathGeometry.pathData,
14632
14636
  fill: "none",
14633
14637
  stroke: strokePaint,
@@ -14642,10 +14646,10 @@ var ConnectorElementRendererMemo = /* @__PURE__ */ React17__default.default.memo
14642
14646
  style: {
14643
14647
  pointerEvents: "none",
14644
14648
  // Never under one device pixel on screen (shared `device-pixel-stroke`).
14645
- strokeWidth: pptx.screenStrokeWidth(Math.max(compoundWidths[idx] ?? strokeWidth, 1)),
14649
+ strokeWidth: pptx.connectorStrandScreenWidth(compoundWidths, strokeWidth, idx),
14646
14650
  ...offset !== 0 ? {
14647
14651
  transform: `translate(0, ${offset}px)`
14648
- } : {}
14652
+ } : snapTransform ? { transform: snapTransform } : {}
14649
14653
  }
14650
14654
  },
14651
14655
  idx
@@ -14770,14 +14774,14 @@ function getElementInteractionProps({
14770
14774
  };
14771
14775
  }
14772
14776
  function renderDagDuotoneFilterForElement(el) {
14773
- if (!chunk5KFSMXI4_js.hasDagDuotoneEffect(el)) {
14777
+ if (!chunk5DBKW7F3_js.hasDagDuotoneEffect(el)) {
14774
14778
  return null;
14775
14779
  }
14776
14780
  const duotone = el.shapeStyle?.dagDuotone;
14777
14781
  if (!duotone) {
14778
14782
  return null;
14779
14783
  }
14780
- return chunk5KFSMXI4_js.renderDagDuotoneSvgFilter(el.id, duotone.color1, duotone.color2);
14784
+ return chunk5DBKW7F3_js.renderDagDuotoneSvgFilter(el.id, duotone.color1, duotone.color2);
14781
14785
  }
14782
14786
  function getContainerStyle({
14783
14787
  el,
@@ -14788,7 +14792,8 @@ function getContainerStyle({
14788
14792
  animationState,
14789
14793
  shapeVisualStyle,
14790
14794
  has3DExtrusion,
14791
- templateEditing
14795
+ templateEditing,
14796
+ edgeBleed
14792
14797
  }) {
14793
14798
  const ss = pptx$1.hasShapeProperties(el) ? el.shapeStyle : void 0;
14794
14799
  const isPicture = el.type === "picture" || el.type === "image";
@@ -14799,15 +14804,15 @@ function getContainerStyle({
14799
14804
  const painted = pptx.paintedElementSize(el);
14800
14805
  const fs = pptx.MEDIA_FULLSCREEN_OVERLAY_STYLE;
14801
14806
  const heightStyle = isFullscreenMedia ? { height: fs.height } : el.type === "table" ? pptx.elementContainerHeightStyle(el, painted.height) : { height: painted.height };
14802
- return {
14807
+ const style = {
14803
14808
  left: isFullscreenMedia ? fs.left : el.x,
14804
14809
  top: isFullscreenMedia ? fs.top : el.y,
14805
14810
  width: isFullscreenMedia ? fs.width : painted.width,
14806
14811
  ...heightStyle,
14807
- transform: isFullscreenMedia ? fs.transform : chunk5KFSMXI4_js.getElementTransform(el),
14812
+ transform: isFullscreenMedia ? fs.transform : chunk5DBKW7F3_js.getElementTransform(el),
14808
14813
  transformOrigin: "center",
14809
14814
  overflow: overflowValue,
14810
- clipPath: isPicture ? void 0 : isImg && !has3DExtrusion ? chunk5KFSMXI4_js.getCropShapeClipPath(el) : void 0,
14815
+ clipPath: isPicture ? void 0 : isImg && !has3DExtrusion ? chunk5DBKW7F3_js.getCropShapeClipPath(el) : void 0,
14811
14816
  zIndex: isFullscreenMedia ? fs.zIndex : zIndex,
14812
14817
  visibility: animationState?.visible === false ? "hidden" : "visible",
14813
14818
  animation: animationState?.cssAnimation,
@@ -14840,13 +14845,21 @@ function getContainerStyle({
14840
14845
  // set for normal slide content or while the mode is off.
14841
14846
  ...templateEditing ? { outline: "2px dashed rgb(217, 119, 6)", outlineOffset: "1px", opacity: opacity ?? 0.95 } : {}
14842
14847
  };
14848
+ return {
14849
+ ...style,
14850
+ ...pptx.abuttingEdgeBleedStyle(
14851
+ el,
14852
+ edgeBleed,
14853
+ style
14854
+ )
14855
+ };
14843
14856
  }
14844
14857
  function shapeParams(element) {
14845
14858
  const style = pptx$1.hasShapeProperties(element) ? element.shapeStyle : void 0;
14846
14859
  const strokeWidth = pptx.paintedStrokeWidth(style);
14847
- const strokeColor = chunk5KFSMXI4_js.normalizeHexColor(style?.strokeColor, chunk5KFSMXI4_js.DEFAULT_STROKE_COLOR);
14848
- const fillColor = chunk5KFSMXI4_js.normalizeHexColor(style?.fillColor, chunk5KFSMXI4_js.DEFAULT_FILL_COLOR);
14849
- const hasFill = style?.fillColor !== void 0 && style.fillColor !== "transparent" || Boolean(chunk5KFSMXI4_js.buildCssGradientFromShapeStyle(style) || style?.fillGradient) || style?.fillMode === "pattern" && Boolean(style.fillPatternPreset);
14860
+ const strokeColor = chunk5DBKW7F3_js.normalizeHexColor(style?.strokeColor, chunk5DBKW7F3_js.DEFAULT_STROKE_COLOR);
14861
+ const fillColor = chunk5DBKW7F3_js.normalizeHexColor(style?.fillColor, chunk5DBKW7F3_js.DEFAULT_FILL_COLOR);
14862
+ const hasFill = style?.fillColor !== void 0 && style.fillColor !== "transparent" || Boolean(chunk5DBKW7F3_js.buildCssGradientFromShapeStyle(style) || style?.fillGradient) || style?.fillMode === "pattern" && Boolean(style.fillPatternPreset);
14850
14863
  return { hf: hasFill, fc: fillColor, sw: strokeWidth, sc: strokeColor };
14851
14864
  }
14852
14865
  var Extrusion3DOverlayMemo = /* @__PURE__ */ React17__default.default.memo(
@@ -14954,7 +14967,7 @@ function ShapeEffectOverlay({
14954
14967
  const fillOverlayStyle = overlay ? {
14955
14968
  position: "absolute",
14956
14969
  inset: 0,
14957
- ...pptx$1.isImageLikeElement(element) ? chunk5KFSMXI4_js.getImageSurfaceMaskStyle(element) : {},
14970
+ ...pptx$1.isImageLikeElement(element) ? chunk5DBKW7F3_js.getImageSurfaceMaskStyle(element) : {},
14958
14971
  background: overlay.color,
14959
14972
  mixBlendMode: overlay.blendMode,
14960
14973
  pointerEvents: "none"
@@ -15019,6 +15032,7 @@ function ShapeEffectOverlay({
15019
15032
  "svg",
15020
15033
  {
15021
15034
  className: "pptx-react-gradient-outline",
15035
+ "data-pptx-outline": "",
15022
15036
  "aria-hidden": "true",
15023
15037
  viewBox: pptx.strokeOutlineViewBox(element),
15024
15038
  preserveAspectRatio: "none",
@@ -15050,7 +15064,7 @@ function ShapeEffectOverlay({
15050
15064
  style: {
15051
15065
  // Never under one device pixel on screen (shared `device-pixel-stroke`).
15052
15066
  strokeWidth: strand.cssStrokeWidth,
15053
- transform: strand.offset !== 0 ? `translate(0, ${strand.offset}px)` : void 0
15067
+ transform: strand.cssTransform ?? (strand.offset !== 0 ? `translate(0, ${strand.offset}px)` : void 0)
15054
15068
  }
15055
15069
  },
15056
15070
  idx
@@ -15115,6 +15129,7 @@ var ElementRenderer = /* @__PURE__ */ React17__default.default.memo(
15115
15129
  opacity,
15116
15130
  templateEditing,
15117
15131
  zIndex,
15132
+ edgeBleed,
15118
15133
  imageAltText,
15119
15134
  showResizeHandles,
15120
15135
  renderInk: doInk,
@@ -15161,10 +15176,10 @@ var ElementRenderer = /* @__PURE__ */ React17__default.default.memo(
15161
15176
  const backgroundAnimationState = pptx.getBackgroundAnimationState(el, presentationElementStates);
15162
15177
  const effectPlacement = pptx.getShapeEffectLayerPlacement(el);
15163
15178
  const visualAnimationState = backgroundAnimationState ?? animationState;
15164
- const isTxt = chunk5KFSMXI4_js.isEditableTextElement(el) && allow.textEditable;
15179
+ const isTxt = chunk5DBKW7F3_js.isEditableTextElement(el) && allow.textEditable;
15165
15180
  const txtSE = pptx$1.hasTextProperties(el) ? el.textStyle : void 0;
15166
15181
  const textStyleOverrideCss = pptx.buildTextStyleOverrideCss(el.id, visualAnimationState?.textStyle);
15167
- const ss = chunk5KFSMXI4_js.getShapeVisualStyle(
15182
+ const ss = chunk5DBKW7F3_js.getShapeVisualStyle(
15168
15183
  el,
15169
15184
  hf,
15170
15185
  fc,
@@ -15173,9 +15188,9 @@ var ElementRenderer = /* @__PURE__ */ React17__default.default.memo(
15173
15188
  visualAnimationState?.animatesFill,
15174
15189
  visualAnimationState?.animatesStroke
15175
15190
  );
15176
- const ts = chunk5KFSMXI4_js.getTextStyleForElement(el, chunk5KFSMXI4_js.DEFAULT_TEXT_COLOR);
15191
+ const ts = chunk5DBKW7F3_js.getTextStyleForElement(el, chunk5DBKW7F3_js.DEFAULT_TEXT_COLOR);
15177
15192
  const isImg = el.type === "picture" || el.type === "image";
15178
- const vs = chunk5KFSMXI4_js.renderVectorShape(
15193
+ const vs = chunk5DBKW7F3_js.renderVectorShape(
15179
15194
  el,
15180
15195
  isImg ? false : hf,
15181
15196
  fc,
@@ -15185,10 +15200,10 @@ var ElementRenderer = /* @__PURE__ */ React17__default.default.memo(
15185
15200
  visualAnimationState?.animatesStroke
15186
15201
  );
15187
15202
  const isModel3D = el.type === "model3d";
15188
- const isConn = chunk5KFSMXI4_js.isConnectorOrLineElement(el);
15203
+ const isConn = chunk5DBKW7F3_js.isConnectorOrLineElement(el);
15189
15204
  const shapeStyle3d = pptx$1.hasShapeProperties(el) ? el.shapeStyle : void 0;
15190
15205
  const extrusionData = React17.useMemo(
15191
- () => chunk5KFSMXI4_js.build3DExtrusionData(shapeStyle3d?.shape3d, shapeStyle3d?.scene3d, fc, el.width, el.height),
15206
+ () => chunk5DBKW7F3_js.build3DExtrusionData(shapeStyle3d?.shape3d, shapeStyle3d?.scene3d, fc, el.width, el.height),
15192
15207
  [shapeStyle3d?.shape3d, shapeStyle3d?.scene3d, fc, el.width, el.height]
15193
15208
  );
15194
15209
  const actionAffordance = useActionAffordance(el, canInteract);
@@ -15251,7 +15266,8 @@ var ElementRenderer = /* @__PURE__ */ React17__default.default.memo(
15251
15266
  animationState,
15252
15267
  shapeVisualStyle: backgroundAnimationState ? {} : ss,
15253
15268
  has3DExtrusion: extrusionData.hasExtrusion,
15254
- templateEditing
15269
+ templateEditing,
15270
+ edgeBleed
15255
15271
  });
15256
15272
  const interactionProps = getElementInteractionProps({
15257
15273
  element: el,
@@ -15278,7 +15294,7 @@ var ElementRenderer = /* @__PURE__ */ React17__default.default.memo(
15278
15294
  "aria-hidden": aria.hidden ? true : void 0,
15279
15295
  "aria-selected": isSelected ? true : void 0,
15280
15296
  tabIndex: isFocusable ? 0 : -1,
15281
- className: chunk5KFSMXI4_js.cn(
15297
+ className: chunk5DBKW7F3_js.cn(
15282
15298
  "absolute",
15283
15299
  "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-500",
15284
15300
  cur,
@@ -15351,9 +15367,9 @@ var ElementRenderer = /* @__PURE__ */ React17__default.default.memo(
15351
15367
  txtSE,
15352
15368
  txtS: ts,
15353
15369
  vecShape: backgroundAnimationState && !isImg ? null : vs,
15354
- imgStyle: chunk5KFSMXI4_js.getImageRenderStyle(el),
15355
- imgFilter: chunk5KFSMXI4_js.getImageEffectsFilter(el),
15356
- imgOpacity: chunk5KFSMXI4_js.getImageEffectsOpacity(el),
15370
+ imgStyle: chunk5DBKW7F3_js.getImageRenderStyle(el),
15371
+ imgFilter: chunk5DBKW7F3_js.getImageEffectsFilter(el),
15372
+ imgOpacity: chunk5DBKW7F3_js.getImageEffectsOpacity(el),
15357
15373
  imgAlt: imageAltText,
15358
15374
  isTxtEl: isTxt,
15359
15375
  media: mediaDataUrls,
@@ -15490,10 +15506,10 @@ function renderStrokeView(view, pressureSensitive, replayStyle, key) {
15490
15506
  }
15491
15507
  function renderInk(el, options) {
15492
15508
  const replay = options?.replay ?? false;
15493
- const strokes = chunk5KFSMXI4_js.buildInkGroupStrokes(el, { color: "#000", width: 3 });
15509
+ const strokes = chunk5DBKW7F3_js.buildInkGroupStrokes(el, { color: "#000", width: 3 });
15494
15510
  strokes.some((s) => s.circles || s.nibMarks);
15495
15511
  const pressureSensitive = options?.pressureSensitive;
15496
- const replayStyles = replay ? chunk5KFSMXI4_js.getInkReplayStyles(el, options?.replayConfig) : null;
15512
+ const replayStyles = replay ? chunk5DBKW7F3_js.getInkReplayStyles(el, options?.replayConfig) : null;
15497
15513
  return /* @__PURE__ */ jsxRuntime.jsxs(
15498
15514
  "svg",
15499
15515
  {
@@ -15501,7 +15517,7 @@ function renderInk(el, options) {
15501
15517
  viewBox: `0 0 ${Math.max(el.width, 1)} ${Math.max(el.height, 1)}`,
15502
15518
  preserveAspectRatio: "none",
15503
15519
  children: [
15504
- replay && /* @__PURE__ */ jsxRuntime.jsx("style", { children: chunk5KFSMXI4_js.INK_REPLAY_KEYFRAMES }),
15520
+ replay && /* @__PURE__ */ jsxRuntime.jsx("style", { children: chunk5DBKW7F3_js.INK_REPLAY_KEYFRAMES }),
15505
15521
  strokes.map(
15506
15522
  (s, i) => renderStrokeView(s, pressureSensitive, replayStyles?.[i], `${el.id}-ink-${i}`)
15507
15523
  )
@@ -15512,7 +15528,7 @@ function renderInk(el, options) {
15512
15528
  function renderGroup(children, parentGroupFill) {
15513
15529
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative w-full h-full pointer-events-none", children: pptx.filterRenderedElements(children).map((c, childIndex) => {
15514
15530
  const { hf, fc, sw, sc } = shapeParams(c);
15515
- const baseSs = chunk5KFSMXI4_js.getShapeVisualStyle(c, hf, fc, sw, sc);
15531
+ const baseSs = chunk5DBKW7F3_js.getShapeVisualStyle(c, hf, fc, sw, sc);
15516
15532
  const inheritedFill = pptx.resolveGroupChildFill(c, parentGroupFill);
15517
15533
  const ss = inheritedFill ? {
15518
15534
  ...baseSs,
@@ -15523,9 +15539,9 @@ function renderGroup(children, parentGroupFill) {
15523
15539
  backgroundPosition: inheritedFill.backgroundPosition
15524
15540
  } : baseSs;
15525
15541
  const isI = c.type === "picture" || c.type === "image";
15526
- const vs = chunk5KFSMXI4_js.renderVectorShape(c, isI ? false : hf, fc, sw, sc);
15527
- const ts = chunk5KFSMXI4_js.getTextStyleForElement(c, chunk5KFSMXI4_js.DEFAULT_TEXT_COLOR);
15528
- const isTxt = chunk5KFSMXI4_js.isEditableTextElement(c);
15542
+ const vs = chunk5DBKW7F3_js.renderVectorShape(c, isI ? false : hf, fc, sw, sc);
15543
+ const ts = chunk5DBKW7F3_js.getTextStyleForElement(c, chunk5DBKW7F3_js.DEFAULT_TEXT_COLOR);
15544
+ const isTxt = chunk5DBKW7F3_js.isEditableTextElement(c);
15529
15545
  return /* @__PURE__ */ jsxRuntime.jsxs(
15530
15546
  "div",
15531
15547
  {
@@ -15534,9 +15550,9 @@ function renderGroup(children, parentGroupFill) {
15534
15550
  style: {
15535
15551
  left: c.x,
15536
15552
  top: c.y,
15537
- width: Math.max(c.width, chunk5KFSMXI4_js.MIN_ELEMENT_SIZE),
15538
- height: Math.max(c.height, chunk5KFSMXI4_js.MIN_ELEMENT_SIZE),
15539
- transform: chunk5KFSMXI4_js.getElementTransform(c),
15553
+ width: Math.max(c.width, chunk5DBKW7F3_js.MIN_ELEMENT_SIZE),
15554
+ height: Math.max(c.height, chunk5DBKW7F3_js.MIN_ELEMENT_SIZE),
15555
+ transform: chunk5DBKW7F3_js.getElementTransform(c),
15540
15556
  transformOrigin: "center",
15541
15557
  ...ss,
15542
15558
  ...isI ? {
@@ -15561,8 +15577,8 @@ function renderGroup(children, parentGroupFill) {
15561
15577
  // A nested group: recurse, chaining the inherited fill so a
15562
15578
  // `grpFill` shape under a fill-less sub-group still paints.
15563
15579
  renderGroup(c.children, pptx.getGroupChildParentFill(c, parentGroupFill))
15564
- ) : isI && ("svgData" in c && c.svgData || "imageData" in c && c.imageData) ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 pointer-events-none", style: chunk5KFSMXI4_js.getImageSurfaceStyle(c), children: [
15565
- chunk5KFSMXI4_js.isImageTiled(c) ? /* @__PURE__ */ jsxRuntime.jsx(
15580
+ ) : isI && ("svgData" in c && c.svgData || "imageData" in c && c.imageData) ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 pointer-events-none", style: chunk5DBKW7F3_js.getImageSurfaceStyle(c), children: [
15581
+ chunk5DBKW7F3_js.isImageTiled(c) ? /* @__PURE__ */ jsxRuntime.jsx(
15566
15582
  TiledImageLayer,
15567
15583
  {
15568
15584
  element: c,
@@ -15575,7 +15591,7 @@ function renderGroup(children, parentGroupFill) {
15575
15591
  src: "svgData" in c && c.svgData ? c.svgData : c.imageData,
15576
15592
  alt: i18n.translationsEn["pptx.ink.groupChildAlt"],
15577
15593
  className: "pointer-events-none select-none",
15578
- style: chunk5KFSMXI4_js.getImageRenderStyle(c),
15594
+ style: chunk5DBKW7F3_js.getImageRenderStyle(c),
15579
15595
  draggable: false
15580
15596
  }
15581
15597
  ),
@@ -15587,7 +15603,7 @@ function renderGroup(children, parentGroupFill) {
15587
15603
  {
15588
15604
  className: "relative z-10 w-full h-full pointer-events-none whitespace-pre-wrap break-words leading-[1.3]",
15589
15605
  style: ts,
15590
- children: chunk5KFSMXI4_js.renderTextSegments(c, chunk5KFSMXI4_js.DEFAULT_TEXT_COLOR)
15606
+ children: chunk5DBKW7F3_js.renderTextSegments(c, chunk5DBKW7F3_js.DEFAULT_TEXT_COLOR)
15591
15607
  }
15592
15608
  ) : null
15593
15609
  ] })
@@ -15601,8 +15617,8 @@ function renderContentPart(el, options) {
15601
15617
  if (el.inkStrokes && el.inkStrokes.length > 0) {
15602
15618
  const replay = options?.replay ?? false;
15603
15619
  const pressureSensitive = options?.pressureSensitive ?? true;
15604
- const strokes = chunk5KFSMXI4_js.buildContentPartStrokes(el);
15605
- const replayStyles = replay ? chunk5KFSMXI4_js.getContentPartReplayStyles(el.inkStrokes, options?.replayConfig) : null;
15620
+ const strokes = chunk5DBKW7F3_js.buildContentPartStrokes(el);
15621
+ const replayStyles = replay ? chunk5DBKW7F3_js.getContentPartReplayStyles(el.inkStrokes, options?.replayConfig) : null;
15606
15622
  return /* @__PURE__ */ jsxRuntime.jsxs(
15607
15623
  "svg",
15608
15624
  {
@@ -15610,7 +15626,7 @@ function renderContentPart(el, options) {
15610
15626
  viewBox: `0 0 ${Math.max(el.width, 1)} ${Math.max(el.height, 1)}`,
15611
15627
  preserveAspectRatio: "none",
15612
15628
  children: [
15613
- replay && /* @__PURE__ */ jsxRuntime.jsx("style", { children: chunk5KFSMXI4_js.INK_REPLAY_KEYFRAMES }),
15629
+ replay && /* @__PURE__ */ jsxRuntime.jsx("style", { children: chunk5DBKW7F3_js.INK_REPLAY_KEYFRAMES }),
15614
15630
  strokes.map(
15615
15631
  (s, i) => renderStrokeView(s, pressureSensitive, replayStyles?.[i], `${el.id}-cp-ink-${i}`)
15616
15632
  )
@@ -15837,9 +15853,9 @@ function useInlineListEditor(element, rootRef, onChange, onModelReplacement) {
15837
15853
  collaboration: connected,
15838
15854
  model: pptx.createInlineListModelObserver(element),
15839
15855
  activationSelection,
15840
- children: seed && !connected ? chunk5KFSMXI4_js.renderTextSegments(
15856
+ children: seed && !connected ? chunk5DBKW7F3_js.renderTextSegments(
15841
15857
  element,
15842
- chunk5KFSMXI4_js.DEFAULT_TEXT_COLOR,
15858
+ chunk5DBKW7F3_js.DEFAULT_TEXT_COLOR,
15843
15859
  void 0,
15844
15860
  void 0,
15845
15861
  void 0,
@@ -16075,8 +16091,8 @@ function InlineTextEditor({
16075
16091
  pending.endOffset
16076
16092
  );
16077
16093
  });
16078
- const warpStyle = chunk5KFSMXI4_js.getTextWarpStyle(textStyleRaw);
16079
- const compensationTransform = chunk5KFSMXI4_js.getTextCompensationTransform(element);
16094
+ const warpStyle = chunk5DBKW7F3_js.getTextWarpStyle(textStyleRaw);
16095
+ const compensationTransform = chunk5DBKW7F3_js.getTextCompensationTransform(element);
16080
16096
  const warpTransform = warpStyle?.transform;
16081
16097
  const mergedTransform = [compensationTransform, warpTransform].filter(Boolean).join(" ") || void 0;
16082
16098
  const wrapperStyle = {
@@ -16084,7 +16100,7 @@ function InlineTextEditor({
16084
16100
  ...textStyle,
16085
16101
  ...warpStyle,
16086
16102
  transform: mergedTransform,
16087
- transformOrigin: warpStyle?.transformOrigin || "center"
16103
+ transformOrigin: warpStyle?.transformOrigin || (compensationTransform ? chunk5DBKW7F3_js.getTextCompensationOrigin(element) : "center")
16088
16104
  };
16089
16105
  const nextInlineStyleValue = (property) => {
16090
16106
  if (!pptx$1.hasTextProperties(element)) {
@@ -16159,7 +16175,7 @@ function InlineTextEditor({
16159
16175
  const text = e.clipboardData.getData("text/plain");
16160
16176
  document.execCommand("insertText", false, text);
16161
16177
  },
16162
- children: list.seed ? list.children : seed.hasRichSegments ? chunk5KFSMXI4_js.renderTextSegments(element, chunk5KFSMXI4_js.DEFAULT_TEXT_COLOR) : seed.initialText
16178
+ children: list.seed ? list.children : seed.hasRichSegments ? chunk5DBKW7F3_js.renderTextSegments(element, chunk5DBKW7F3_js.DEFAULT_TEXT_COLOR) : seed.initialText
16163
16179
  },
16164
16180
  list.seed?.paragraphs[0].token ?? "plain"
16165
16181
  );
@@ -16324,7 +16340,7 @@ function OleActionFooter({
16324
16340
  info,
16325
16341
  showActions
16326
16342
  }) {
16327
- const { t } = chunk5KFSMXI4_js.useTranslation();
16343
+ const { t } = chunk5DBKW7F3_js.useTranslation();
16328
16344
  if (!showActions || !info.canDownload || !el.oleEmbeddedData) {
16329
16345
  return null;
16330
16346
  }
@@ -16433,7 +16449,7 @@ function SmartArtInlineNodeEditor({
16433
16449
  onCommit,
16434
16450
  onCancel
16435
16451
  }) {
16436
- const { t } = chunk5KFSMXI4_js.useTranslation();
16452
+ const { t } = chunk5DBKW7F3_js.useTranslation();
16437
16453
  const ref = React17__default.default.useRef(null);
16438
16454
  const [value, setValue] = React17__default.default.useState(initialText);
16439
16455
  const settled = React17__default.default.useRef(false);
@@ -17061,7 +17077,7 @@ function SmartArtRendererImpl({
17061
17077
  onUpdateElement,
17062
17078
  animationState
17063
17079
  }) {
17064
- const { t } = chunk5KFSMXI4_js.useTranslation();
17080
+ const { t } = chunk5DBKW7F3_js.useTranslation();
17065
17081
  if (element.type !== "smartArt" || !element.smartArtData) {
17066
17082
  return /* @__PURE__ */ jsxRuntime.jsx(
17067
17083
  "div",
@@ -17307,7 +17323,7 @@ function groupIntoParagraphs(element, fieldContext) {
17307
17323
  element,
17308
17324
  fieldContext ? (seg) => {
17309
17325
  if (seg.fieldType) {
17310
- const substituted = chunk5KFSMXI4_js.substituteFieldText(
17326
+ const substituted = chunk5DBKW7F3_js.substituteFieldText(
17311
17327
  seg.text,
17312
17328
  seg.fieldType,
17313
17329
  fieldContext,
@@ -17342,13 +17358,13 @@ function getSegmentTspanProps(segment, element, fallbackColor) {
17342
17358
  if (s.strikethrough) {
17343
17359
  decos.push("line-through");
17344
17360
  }
17345
- const fill = s.hyperlink ? chunk5KFSMXI4_js.normalizeHexColor(s.color || element.textStyle?.color, chunk5KFSMXI4_js.HYPERLINK_COLOR) : chunk5KFSMXI4_js.normalizeHexColor(s.color || element.textStyle?.color, fallbackColor);
17361
+ const fill = s.hyperlink ? chunk5DBKW7F3_js.normalizeHexColor(s.color || element.textStyle?.color, chunk5DBKW7F3_js.HYPERLINK_COLOR) : chunk5DBKW7F3_js.normalizeHexColor(s.color || element.textStyle?.color, fallbackColor);
17346
17362
  return {
17347
17363
  fill,
17348
- fontSize: s.fontSize ?? element.textStyle?.fontSize ?? chunk5KFSMXI4_js.DEFAULT_TEXT_FONT_SIZE,
17364
+ fontSize: s.fontSize ?? element.textStyle?.fontSize ?? chunk5DBKW7F3_js.DEFAULT_TEXT_FONT_SIZE,
17349
17365
  fontWeight: pptx.resolveFontWeight(s.fontFamily || element.textStyle?.fontFamily, s.bold),
17350
17366
  fontStyle: pptx.resolveFontItalic(s.fontFamily || element.textStyle?.fontFamily, s.italic) ? "italic" : void 0,
17351
- fontFamily: s.fontFamily || element.textStyle?.fontFamily ? pptx$1.getSubstituteFontFamily(s.fontFamily || element.textStyle?.fontFamily || "") : chunk5KFSMXI4_js.DEFAULT_FONT_FAMILY,
17367
+ fontFamily: s.fontFamily || element.textStyle?.fontFamily ? pptx$1.getSubstituteFontFamily(s.fontFamily || element.textStyle?.fontFamily || "") : chunk5DBKW7F3_js.DEFAULT_FONT_FAMILY,
17352
17368
  textDecoration: decos.length > 0 ? decos.join(" ") : void 0
17353
17369
  };
17354
17370
  }
@@ -17356,8 +17372,8 @@ function resolveSegmentFont(segment, element) {
17356
17372
  const s = segment.style || {};
17357
17373
  const family = s.fontFamily || element.textStyle?.fontFamily;
17358
17374
  return {
17359
- fontFamily: family ? pptx$1.getSubstituteFontFamily(family) : chunk5KFSMXI4_js.DEFAULT_FONT_FAMILY,
17360
- fontSizePx: s.fontSize ?? element.textStyle?.fontSize ?? chunk5KFSMXI4_js.DEFAULT_TEXT_FONT_SIZE,
17375
+ fontFamily: family ? pptx$1.getSubstituteFontFamily(family) : chunk5DBKW7F3_js.DEFAULT_FONT_FAMILY,
17376
+ fontSizePx: s.fontSize ?? element.textStyle?.fontSize ?? chunk5DBKW7F3_js.DEFAULT_TEXT_FONT_SIZE,
17361
17377
  bold: s.bold ?? element.textStyle?.bold,
17362
17378
  italic: s.italic ?? element.textStyle?.italic
17363
17379
  };
@@ -17446,9 +17462,9 @@ function WarpedText({
17446
17462
  const warpAdj2 = textEl.textStyle?.textWarpAdj2;
17447
17463
  const align = textEl.textStyle?.align ?? "center";
17448
17464
  const { startOffset, textAnchor } = getAlignmentProps(align);
17449
- const baseFontSize = textEl.textStyle?.fontSize ?? chunk5KFSMXI4_js.DEFAULT_TEXT_FONT_SIZE;
17450
- const baseFontFamily = textEl.textStyle?.fontFamily ? pptx$1.getSubstituteFontFamily(textEl.textStyle.fontFamily) : chunk5KFSMXI4_js.DEFAULT_FONT_FAMILY;
17451
- const baseFill = chunk5KFSMXI4_js.normalizeHexColor(textEl.textStyle?.color, fallbackColor);
17465
+ const baseFontSize = textEl.textStyle?.fontSize ?? chunk5DBKW7F3_js.DEFAULT_TEXT_FONT_SIZE;
17466
+ const baseFontFamily = textEl.textStyle?.fontFamily ? pptx$1.getSubstituteFontFamily(textEl.textStyle.fontFamily) : chunk5DBKW7F3_js.DEFAULT_FONT_FAMILY;
17467
+ const baseFill = chunk5DBKW7F3_js.normalizeHexColor(textEl.textStyle?.color, fallbackColor);
17452
17468
  if (pptx.hasGlyphEnvelope(preset)) {
17453
17469
  const perLine = pptx.buildGlyphEnvelopeBlock(
17454
17470
  preset,
@@ -17551,7 +17567,7 @@ function WarpedText({
17551
17567
  var GLYPH_BY_SHAPE = /* @__PURE__ */ buildGlyphByShape();
17552
17568
  function buildGlyphByShape() {
17553
17569
  const glyphs = Object.fromEntries(
17554
- chunk5KFSMXI4_js.ACTION_BUTTON_PRESETS.map((p) => [p.shapeType, p.iconPath])
17570
+ chunk5DBKW7F3_js.ACTION_BUTTON_PRESETS.map((p) => [p.shapeType, p.iconPath])
17555
17571
  );
17556
17572
  glyphs["actionButtonForwardOrNext"] = glyphs["actionButtonForwardNext"];
17557
17573
  glyphs["actionButtonBackOrPrevious"] = glyphs["actionButtonBackPrevious"];
@@ -17625,9 +17641,10 @@ function renderTextElementBody(options) {
17625
17641
  const useSvgWarp = pptx.shouldUseSvgWarp(
17626
17642
  pptx$1.hasTextProperties(el) ? el.textStyle?.textWarpPreset : void 0
17627
17643
  );
17628
- const scene3dStyle = pptx$1.hasTextProperties(el) ? chunk5KFSMXI4_js.buildTextBody3DSceneStyle(el.textStyle, { width: el.width, height: el.height }) : void 0;
17644
+ const scene3dStyle = pptx$1.hasTextProperties(el) ? chunk5DBKW7F3_js.buildTextBody3DSceneStyle(el.textStyle, { width: el.width, height: el.height }) : void 0;
17629
17645
  const rotationTransform = pptx.getTextBodyRotationTransform(el);
17630
- const composedTransform = [rotationTransform, chunk5KFSMXI4_js.getTextCompensationTransform(el), scene3dStyle?.transform].filter(Boolean).join(" ") || void 0;
17646
+ const compensation = pptx.getTextCompensationStyle(el);
17647
+ const composedTransform = [rotationTransform, compensation?.transform, scene3dStyle?.transform].filter(Boolean).join(" ") || void 0;
17631
17648
  const transformStyle = {
17632
17649
  transform: composedTransform,
17633
17650
  // A COM-measured homography (`scene3dStyle.transformOrigin === '0 0'`)
@@ -17638,7 +17655,7 @@ function renderTextElementBody(options) {
17638
17655
  // hardcoded to `'center'` unconditionally, silently clobbering
17639
17656
  // `scene3dStyle.transformOrigin` the same way Svelte's `ElementRenderer`
17640
17657
  // once re-clobbered `pointerEvents` from its own interactive flag.
17641
- transformOrigin: scene3dStyle?.transformOrigin ?? "center",
17658
+ transformOrigin: scene3dStyle?.transformOrigin ?? compensation?.transformOrigin ?? "center",
17642
17659
  ...scene3dStyle?.perspective ? { perspective: scene3dStyle.perspective } : {},
17643
17660
  // COM-calibrated off-axis correction for a handful of camera presets
17644
17661
  // (see `visual-3d-camera`'s module doc comment); only reachable when an
@@ -17657,18 +17674,18 @@ function renderTextElementBody(options) {
17657
17674
  shouldRenderText && (useSvgWarp ? /* @__PURE__ */ jsxRuntime.jsx(
17658
17675
  "div",
17659
17676
  {
17660
- className: chunk5KFSMXI4_js.cn(
17677
+ className: chunk5DBKW7F3_js.cn(
17661
17678
  "relative z-10 w-full h-full",
17662
17679
  onHyperlinkClick ? "" : "pointer-events-none"
17663
17680
  ),
17664
- style: { ...chunk5KFSMXI4_js.getTextLayoutStyle(el), ...transformStyle },
17681
+ style: { ...chunk5DBKW7F3_js.getTextLayoutStyle(el), ...transformStyle },
17665
17682
  children: /* @__PURE__ */ jsxRuntime.jsx(
17666
17683
  WarpedText,
17667
17684
  {
17668
17685
  element: el,
17669
17686
  width: el.width,
17670
17687
  height: el.height,
17671
- fallbackColor: chunk5KFSMXI4_js.DEFAULT_TEXT_COLOR,
17688
+ fallbackColor: chunk5DBKW7F3_js.DEFAULT_TEXT_COLOR,
17672
17689
  findHighlights: findHl,
17673
17690
  fieldContext
17674
17691
  }
@@ -17677,19 +17694,19 @@ function renderTextElementBody(options) {
17677
17694
  ) : /* @__PURE__ */ jsxRuntime.jsx(
17678
17695
  "div",
17679
17696
  {
17680
- className: chunk5KFSMXI4_js.cn(
17697
+ className: chunk5DBKW7F3_js.cn(
17681
17698
  "relative z-10 w-full h-full whitespace-pre-wrap break-words leading-[1.3]",
17682
17699
  onHyperlinkClick ? "" : "pointer-events-none"
17683
17700
  ),
17684
17701
  style: {
17685
- ...chunk5KFSMXI4_js.getTextLayoutStyle(el),
17702
+ ...chunk5DBKW7F3_js.getTextLayoutStyle(el),
17686
17703
  ...txtS,
17687
- ...chunk5KFSMXI4_js.getTextWarpStyle(txtSE),
17704
+ ...chunk5DBKW7F3_js.getTextWarpStyle(txtSE),
17688
17705
  ...transformStyle
17689
17706
  },
17690
- children: chunk5KFSMXI4_js.renderTextSegments(
17707
+ children: chunk5DBKW7F3_js.renderTextSegments(
17691
17708
  el,
17692
- chunk5KFSMXI4_js.DEFAULT_TEXT_COLOR,
17709
+ chunk5DBKW7F3_js.DEFAULT_TEXT_COLOR,
17693
17710
  void 0,
17694
17711
  findHl,
17695
17712
  onHyperlinkClick,
@@ -17710,7 +17727,7 @@ function ZoomElementRenderer({
17710
17727
  onZoomClick,
17711
17728
  sourceSlideIndex
17712
17729
  }) {
17713
- const { t } = chunk5KFSMXI4_js.useTranslation();
17730
+ const { t } = chunk5DBKW7F3_js.useTranslation();
17714
17731
  const summaryView = pptx.buildSummaryZoomView(
17715
17732
  element,
17716
17733
  (index) => {
@@ -18008,7 +18025,7 @@ function renderBody(options) {
18008
18025
  );
18009
18026
  }
18010
18027
  if (isImg) {
18011
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 pointer-events-none", style: chunk5KFSMXI4_js.getImageSurfaceStyle(el), children: [
18028
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 pointer-events-none", style: chunk5DBKW7F3_js.getImageSurfaceStyle(el), children: [
18012
18029
  renderImg(el, imgStyle, imgFilter, imgAlt, imgOpacity),
18013
18030
  vecShape ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0", children: vecShape }) : null
18014
18031
  ] });
@@ -18025,7 +18042,7 @@ function renderBody(options) {
18025
18042
  textDirection: txtSE?.textDirection,
18026
18043
  textStyle: txtS,
18027
18044
  textStyleRaw: txtSE,
18028
- layoutStyle: chunk5KFSMXI4_js.getTextLayoutStyle(el),
18045
+ layoutStyle: chunk5DBKW7F3_js.getTextLayoutStyle(el),
18029
18046
  element: el,
18030
18047
  onCommit,
18031
18048
  onCancel,
@@ -18036,7 +18053,7 @@ function renderBody(options) {
18036
18053
  ] });
18037
18054
  }
18038
18055
  if (el.type === "table") {
18039
- return chunk5KFSMXI4_js.renderTableElement(el, txtS, {
18056
+ return chunk5DBKW7F3_js.renderTableElement(el, txtS, {
18040
18057
  editable: isSel,
18041
18058
  selectedCell: isSel ? tableSt : null,
18042
18059
  onSelectCell: onCellSel,
@@ -18069,7 +18086,7 @@ function renderBody(options) {
18069
18086
  );
18070
18087
  }
18071
18088
  if (el.type === "media") {
18072
- return chunk5KFSMXI4_js.renderMediaElement(el, media, {
18089
+ return chunk5DBKW7F3_js.renderMediaElement(el, media, {
18073
18090
  // Present mode autoplays every media element on the active slide,
18074
18091
  // not only ones persisted with their own `autoPlay` flag (matching
18075
18092
  // the other four bindings' unconditional `presenting`-gated
@@ -18121,27 +18138,27 @@ function renderBody(options) {
18121
18138
  }
18122
18139
  return renderGroup(el.children, pptx.getGroupChildParentFill(el));
18123
18140
  }
18124
- if (chunk5KFSMXI4_js.shouldRenderFallbackLabel(el, isTxtEl)) {
18125
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk5KFSMXI4_js.getElementLabel(el) });
18141
+ if (chunk5DBKW7F3_js.shouldRenderFallbackLabel(el, isTxtEl)) {
18142
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk5DBKW7F3_js.getElementLabel(el) });
18126
18143
  }
18127
18144
  return renderTextElementBody(options);
18128
18145
  }
18129
18146
  function defaultTextColorForFill(fillColor) {
18130
18147
  const hex = String(fillColor ?? "").replace(/^#/u, "");
18131
18148
  if (!/^[0-9a-f]{6}$/iu.test(hex)) {
18132
- return chunk5KFSMXI4_js.DEFAULT_TEXT_COLOR;
18149
+ return chunk5DBKW7F3_js.DEFAULT_TEXT_COLOR;
18133
18150
  }
18134
18151
  const channels = [0, 2, 4].map((offset) => Number.parseInt(hex.slice(offset, offset + 2), 16) / 255).map((channel) => channel <= 0.04045 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4);
18135
18152
  const luminance = channels[0] * 0.2126 + channels[1] * 0.7152 + channels[2] * 0.0722;
18136
- return luminance > 0.179 ? chunk5KFSMXI4_js.DEFAULT_TEXT_COLOR : "#ffffff";
18153
+ return luminance > 0.179 ? chunk5DBKW7F3_js.DEFAULT_TEXT_COLOR : "#ffffff";
18137
18154
  }
18138
18155
  function getStaticElementVisualState(element, parentGroupFill) {
18139
18156
  const style = pptx$1.hasShapeProperties(element) ? element.shapeStyle : void 0;
18140
- const hasFill = style?.fillColor !== void 0 && style.fillColor !== "transparent" || Boolean(chunk5KFSMXI4_js.buildCssGradientFromShapeStyle(style) || style?.fillGradient) || style?.fillMode === "pattern" && Boolean(style.fillPatternPreset);
18141
- const fill = chunk5KFSMXI4_js.normalizeHexColor(style?.fillColor, chunk5KFSMXI4_js.DEFAULT_FILL_COLOR);
18157
+ const hasFill = style?.fillColor !== void 0 && style.fillColor !== "transparent" || Boolean(chunk5DBKW7F3_js.buildCssGradientFromShapeStyle(style) || style?.fillGradient) || style?.fillMode === "pattern" && Boolean(style.fillPatternPreset);
18158
+ const fill = chunk5DBKW7F3_js.normalizeHexColor(style?.fillColor, chunk5DBKW7F3_js.DEFAULT_FILL_COLOR);
18142
18159
  const strokeWidth = pptx.paintedStrokeWidth(style);
18143
- const stroke = chunk5KFSMXI4_js.normalizeHexColor(style?.strokeColor, chunk5KFSMXI4_js.DEFAULT_STROKE_COLOR);
18144
- const baseVisualStyle = chunk5KFSMXI4_js.getShapeVisualStyle(element, hasFill, fill, strokeWidth, stroke);
18160
+ const stroke = chunk5DBKW7F3_js.normalizeHexColor(style?.strokeColor, chunk5DBKW7F3_js.DEFAULT_STROKE_COLOR);
18161
+ const baseVisualStyle = chunk5DBKW7F3_js.getShapeVisualStyle(element, hasFill, fill, strokeWidth, stroke);
18145
18162
  const inheritedFill = pptx.resolveGroupChildFill(element, parentGroupFill);
18146
18163
  const visualStyle = inheritedFill ? {
18147
18164
  ...baseVisualStyle,
@@ -18151,12 +18168,12 @@ function getStaticElementVisualState(element, parentGroupFill) {
18151
18168
  backgroundSize: inheritedFill.backgroundSize,
18152
18169
  backgroundPosition: inheritedFill.backgroundPosition
18153
18170
  } : baseVisualStyle;
18154
- const textStyle = chunk5KFSMXI4_js.getTextStyleForElement(
18171
+ const textStyle = chunk5DBKW7F3_js.getTextStyleForElement(
18155
18172
  element,
18156
- element.type === "shape" && hasFill ? defaultTextColorForFill(fill) : chunk5KFSMXI4_js.DEFAULT_TEXT_COLOR
18173
+ element.type === "shape" && hasFill ? defaultTextColorForFill(fill) : chunk5DBKW7F3_js.DEFAULT_TEXT_COLOR
18157
18174
  );
18158
18175
  const isImage = element.type === "picture" || element.type === "image";
18159
- const letsTextOverflow = pptx$1.hasTextProperties(element) && element.textStyle?.autoFitMode === "shrink" && (element.type === "text" || element.locks?.txBox === true);
18176
+ const letsTextOverflow = pptx$1.hasTextProperties(element) && Boolean(element.text?.trim());
18160
18177
  const shapeType = pptx$1.hasShapeProperties(element) ? element.shapeType : void 0;
18161
18178
  const isCallout = pptx.isWedgeCalloutPresetShape(shapeType) || String(shapeType ?? "").toLowerCase().includes("callout");
18162
18179
  return {
@@ -18178,7 +18195,7 @@ function getStaticElementInteractionState(element, hasActionHandler, exposeEleme
18178
18195
  return { action, isActionable, contractRole };
18179
18196
  }
18180
18197
  function getStaticElementWrapperClassName(element, visual, positioned, isActionable) {
18181
- const overflowClass = visual.isImage || visual.strokeWidth > 0 || element.type === "group" || chunk5KFSMXI4_js.isConnectorOrLineElement(element) || visual.isCallout || visual.letsTextOverflow ? "" : "overflow-hidden";
18198
+ const overflowClass = visual.isImage || visual.strokeWidth > 0 || element.type === "group" || chunk5DBKW7F3_js.isConnectorOrLineElement(element) || visual.isCallout || visual.letsTextOverflow ? "" : "overflow-hidden";
18182
18199
  const pointerClass = isActionable ? "pointer-events-auto cursor-pointer" : "pointer-events-none";
18183
18200
  return `${positioned ? "absolute" : "relative"} ${overflowClass} ${pointerClass}`;
18184
18201
  }
@@ -18261,7 +18278,7 @@ function StaticElementRendererImpl({
18261
18278
  top: positioned ? element.y : void 0,
18262
18279
  width: positioned ? Math.max(element.width, 1) : "100%",
18263
18280
  height: positioned ? Math.max(element.height, 1) : "100%",
18264
- transform: positioned ? chunk5KFSMXI4_js.getElementTransform(element) : void 0,
18281
+ transform: positioned ? chunk5DBKW7F3_js.getElementTransform(element) : void 0,
18265
18282
  transformOrigin: "center",
18266
18283
  zIndex,
18267
18284
  ...visualStyle,
@@ -18304,18 +18321,18 @@ function StaticElementRendererImpl({
18304
18321
  spellCheck: false,
18305
18322
  txtSE: pptx$1.hasTextProperties(element) ? element.textStyle : void 0,
18306
18323
  txtS: textStyle,
18307
- vecShape: chunk5KFSMXI4_js.renderVectorShape(
18324
+ vecShape: chunk5DBKW7F3_js.renderVectorShape(
18308
18325
  element,
18309
18326
  isImage ? false : hasFill,
18310
18327
  fill,
18311
18328
  strokeWidth,
18312
18329
  stroke
18313
18330
  ),
18314
- imgStyle: imageAnimation ? { ...chunk5KFSMXI4_js.getImageRenderStyle(element), animation: imageAnimation } : chunk5KFSMXI4_js.getImageRenderStyle(element),
18315
- imgFilter: chunk5KFSMXI4_js.getImageEffectsFilter(element),
18316
- imgOpacity: chunk5KFSMXI4_js.getImageEffectsOpacity(element),
18331
+ imgStyle: imageAnimation ? { ...chunk5DBKW7F3_js.getImageRenderStyle(element), animation: imageAnimation } : chunk5DBKW7F3_js.getImageRenderStyle(element),
18332
+ imgFilter: chunk5DBKW7F3_js.getImageEffectsFilter(element),
18333
+ imgOpacity: chunk5DBKW7F3_js.getImageEffectsOpacity(element),
18317
18334
  imgAlt: "",
18318
- isTxtEl: chunk5KFSMXI4_js.isEditableTextElement(element),
18335
+ isTxtEl: chunk5DBKW7F3_js.isEditableTextElement(element),
18319
18336
  media: mediaDataUrls,
18320
18337
  tableSt: null,
18321
18338
  isSel: false,
@@ -18363,7 +18380,7 @@ function SlideLayer({
18363
18380
  style: {
18364
18381
  width: safeWidth,
18365
18382
  height: safeHeight,
18366
- backgroundColor: slide.backgroundColor ? chunk5KFSMXI4_js.normalizeHexColor(slide.backgroundColor, "#ffffff") : "#ffffff",
18383
+ backgroundColor: slide.backgroundColor ? chunk5DBKW7F3_js.normalizeHexColor(slide.backgroundColor, "#ffffff") : "#ffffff",
18367
18384
  backgroundImage: slide.backgroundImage ? `url(${slide.backgroundImage})` : slide.backgroundGradient ? slide.backgroundGradient : void 0,
18368
18385
  backgroundSize: slide.backgroundImage ? "cover" : void 0,
18369
18386
  backgroundPosition: slide.backgroundImage ? "center" : void 0
@@ -18437,7 +18454,8 @@ function FragmentedTransitionLayer({
18437
18454
  );
18438
18455
  }
18439
18456
  function overlayEntries(plan, incomingSlide) {
18440
- return plan.overlayLayers.filter((layer) => layer.side === "outgoing" || incomingSlide !== void 0).flatMap((layer) => layer.elements.map((element) => ({ element, side: layer.side }))).map((entry, zIndex) => ({ ...entry, zIndex }));
18457
+ const slots = pptx.morphOverlayElementSlots(plan);
18458
+ return plan.overlayLayers.filter((layer) => layer.side === "outgoing" || incomingSlide !== void 0).flatMap((layer) => layer.elements.map((element) => ({ element, side: layer.side }))).map((entry, index) => ({ ...entry, zIndex: slots.elements.get(entry.element.id) ?? index }));
18441
18459
  }
18442
18460
  function MorphTransitionOverlay({
18443
18461
  canvasSize,
@@ -18447,6 +18465,7 @@ function MorphTransitionOverlay({
18447
18465
  incomingSlide,
18448
18466
  containerRef
18449
18467
  }) {
18468
+ const groupSlots = pptx.morphOverlayElementSlots(morphPlan).groups;
18450
18469
  return /* @__PURE__ */ jsxRuntime.jsxs(
18451
18470
  "div",
18452
18471
  {
@@ -18456,7 +18475,11 @@ function MorphTransitionOverlay({
18456
18475
  className: "pptx-react-transition-overlay absolute inset-0 pointer-events-none overflow-hidden",
18457
18476
  style: { zIndex: 40 },
18458
18477
  children: [
18459
- /* @__PURE__ */ jsxRuntime.jsx("style", { children: morphPlan.keyframesCss }),
18478
+ /* @__PURE__ */ jsxRuntime.jsx("style", { children: [
18479
+ morphPlan.keyframesCss,
18480
+ pptx.buildMorphOutlineRules(morphPlan, "data-pptx-morph-outgoing"),
18481
+ pptx.buildMorphOutlineRules(morphPlan, "data-pptx-morph-lifted")
18482
+ ].filter(Boolean).join("\n") }),
18460
18483
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsxs(
18461
18484
  "div",
18462
18485
  {
@@ -18522,7 +18545,7 @@ function MorphTransitionOverlay({
18522
18545
  "data-pptx-morph-crossfade": group.incoming.id,
18523
18546
  style: {
18524
18547
  ...pptx.MORPH_CROSSFADE_GROUP_STYLE,
18525
- zIndex: morphPlan.outgoingElements.length + morphPlan.overlayIncomingElements.length + index
18548
+ zIndex: groupSlots[index] ?? morphPlan.outgoingElements.length + morphPlan.overlayIncomingElements.length + index
18526
18549
  },
18527
18550
  children: [
18528
18551
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -18900,7 +18923,6 @@ exports.playAnimationSound = playAnimationSound;
18900
18923
  exports.renderStrokeView = renderStrokeView;
18901
18924
  exports.renderToCanvas = renderToCanvas;
18902
18925
  exports.resolveSmartArtDataPalette = resolveSmartArtDataPalette;
18903
- exports.safePrompt = safePrompt;
18904
18926
  exports.scopeLayoutOptionsToActiveSlide = scopeLayoutOptionsToActiveSlide;
18905
18927
  exports.useAnimationPlayback = useAnimationPlayback;
18906
18928
  exports.useAnnotationHandlers = useAnnotationHandlers;