pptx-react-viewer 1.24.1 → 1.25.0

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 (92) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/{Model3DScene-RYR4SSOM.js → Model3DScene-G434BPF4.js} +2 -2
  3. package/dist/Model3DScene-G434BPF4.js.br +0 -0
  4. package/dist/Model3DScene-G434BPF4.js.gz +0 -0
  5. package/dist/{Model3DScene-E7YIHJ2R.mjs → Model3DScene-GGNUAOGD.mjs} +1 -1
  6. package/dist/Model3DScene-GGNUAOGD.mjs.br +0 -0
  7. package/dist/Model3DScene-GGNUAOGD.mjs.gz +0 -0
  8. package/dist/PowerPointViewer-CnADroqZ.d.ts.map +1 -1
  9. package/dist/{SurfaceChart3DScene-ZM3J67VQ.mjs → SurfaceChart3DScene-JU737NN5.mjs} +1 -1
  10. package/dist/SurfaceChart3DScene-JU737NN5.mjs.br +0 -0
  11. package/dist/SurfaceChart3DScene-JU737NN5.mjs.gz +0 -0
  12. package/dist/{SurfaceChart3DScene-PBSZVNAM.js → SurfaceChart3DScene-UFFJ3P6T.js} +2 -2
  13. package/dist/SurfaceChart3DScene-UFFJ3P6T.js.br +0 -0
  14. package/dist/SurfaceChart3DScene-UFFJ3P6T.js.gz +0 -0
  15. package/dist/{chunk-ZISXRMDJ.js → chunk-2EFVXYNA.js} +187 -1
  16. package/dist/chunk-2EFVXYNA.js.br +0 -0
  17. package/dist/{chunk-ZISXRMDJ.js.gz → chunk-2EFVXYNA.js.gz} +0 -0
  18. package/dist/{chunk-KVTSERRP.js → chunk-EM77GISR.js} +1667 -1029
  19. package/dist/chunk-EM77GISR.js.br +0 -0
  20. package/dist/chunk-EM77GISR.js.gz +0 -0
  21. package/dist/{chunk-DPTDFK2L.js → chunk-IHHK6WEQ.js} +520 -441
  22. package/dist/chunk-IHHK6WEQ.js.br +0 -0
  23. package/dist/chunk-IHHK6WEQ.js.gz +0 -0
  24. package/dist/{chunk-E3KJKCSV.mjs → chunk-M3SIFXWD.mjs} +187 -1
  25. package/dist/chunk-M3SIFXWD.mjs.br +0 -0
  26. package/dist/{chunk-E3KJKCSV.mjs.gz → chunk-M3SIFXWD.mjs.gz} +0 -0
  27. package/dist/{chunk-UDM2SYE3.mjs → chunk-NKSIDFYP.mjs} +964 -326
  28. package/dist/chunk-NKSIDFYP.mjs.br +0 -0
  29. package/dist/chunk-NKSIDFYP.mjs.gz +0 -0
  30. package/dist/{chunk-MEVZNYJK.mjs → chunk-QOBKJKLT.mjs} +859 -9
  31. package/dist/chunk-QOBKJKLT.mjs.br +0 -0
  32. package/dist/{chunk-MEVZNYJK.mjs.gz → chunk-QOBKJKLT.mjs.gz} +0 -0
  33. package/dist/{chunk-UCFXE6YS.mjs → chunk-VDALVGDT.mjs} +115 -37
  34. package/dist/chunk-VDALVGDT.mjs.br +0 -0
  35. package/dist/chunk-VDALVGDT.mjs.gz +0 -0
  36. package/dist/{chunk-275WERXZ.js → chunk-VKOVFVDJ.js} +874 -9
  37. package/dist/chunk-VKOVFVDJ.js.br +0 -0
  38. package/dist/{chunk-275WERXZ.js.gz → chunk-VKOVFVDJ.js.gz} +0 -0
  39. package/dist/hooks-unstable.d.ts +207 -2
  40. package/dist/hooks-unstable.d.ts.map +1 -1
  41. package/dist/hooks-unstable.js +81 -77
  42. package/dist/hooks-unstable.js.br +0 -0
  43. package/dist/hooks-unstable.js.gz +0 -0
  44. package/dist/hooks-unstable.mjs +3 -3
  45. package/dist/hooks-unstable.mjs.br +0 -0
  46. package/dist/hooks-unstable.mjs.gz +0 -0
  47. package/dist/i18n.js +4 -4
  48. package/dist/i18n.js.br +0 -0
  49. package/dist/i18n.js.gz +0 -0
  50. package/dist/i18n.mjs +1 -1
  51. package/dist/i18n.mjs.br +0 -0
  52. package/dist/i18n.mjs.gz +0 -0
  53. package/dist/{index-waNAYwmr.d.ts → index-DWvM1PBB.d.ts} +16 -1
  54. package/dist/index-DWvM1PBB.d.ts.map +1 -0
  55. package/dist/index.d.ts +146 -26
  56. package/dist/index.js +34 -34
  57. package/dist/index.js.br +0 -0
  58. package/dist/index.js.gz +0 -0
  59. package/dist/index.mjs +4 -4
  60. package/dist/index.mjs.br +0 -0
  61. package/dist/index.mjs.gz +0 -0
  62. package/dist/pptx-viewer.css +1 -1
  63. package/dist/pptx-viewer.css.br +0 -0
  64. package/dist/pptx-viewer.css.gz +0 -0
  65. package/dist/viewer/index.js +20 -20
  66. package/dist/viewer/index.js.br +0 -0
  67. package/dist/viewer/index.js.gz +0 -0
  68. package/dist/viewer/index.mjs +4 -4
  69. package/dist/viewer/index.mjs.br +0 -0
  70. package/dist/viewer/index.mjs.gz +0 -0
  71. package/package.json +1 -1
  72. package/dist/Model3DScene-E7YIHJ2R.mjs.br +0 -0
  73. package/dist/Model3DScene-E7YIHJ2R.mjs.gz +0 -0
  74. package/dist/Model3DScene-RYR4SSOM.js.br +0 -0
  75. package/dist/Model3DScene-RYR4SSOM.js.gz +0 -0
  76. package/dist/SurfaceChart3DScene-PBSZVNAM.js.br +0 -0
  77. package/dist/SurfaceChart3DScene-PBSZVNAM.js.gz +0 -0
  78. package/dist/SurfaceChart3DScene-ZM3J67VQ.mjs.br +0 -0
  79. package/dist/SurfaceChart3DScene-ZM3J67VQ.mjs.gz +0 -0
  80. package/dist/chunk-275WERXZ.js.br +0 -0
  81. package/dist/chunk-DPTDFK2L.js.br +0 -0
  82. package/dist/chunk-DPTDFK2L.js.gz +0 -0
  83. package/dist/chunk-E3KJKCSV.mjs.br +0 -0
  84. package/dist/chunk-KVTSERRP.js.br +0 -0
  85. package/dist/chunk-KVTSERRP.js.gz +0 -0
  86. package/dist/chunk-MEVZNYJK.mjs.br +0 -0
  87. package/dist/chunk-UCFXE6YS.mjs.br +0 -0
  88. package/dist/chunk-UCFXE6YS.mjs.gz +0 -0
  89. package/dist/chunk-UDM2SYE3.mjs.br +0 -0
  90. package/dist/chunk-UDM2SYE3.mjs.gz +0 -0
  91. package/dist/chunk-ZISXRMDJ.js.br +0 -0
  92. package/dist/index-waNAYwmr.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunk275WERXZ_js = require('./chunk-275WERXZ.js');
4
- var chunkZISXRMDJ_js = require('./chunk-ZISXRMDJ.js');
3
+ var chunkVKOVFVDJ_js = require('./chunk-VKOVFVDJ.js');
4
+ var chunk2EFVXYNA_js = require('./chunk-2EFVXYNA.js');
5
5
  var chunkKV3EOLP3_js = require('./chunk-KV3EOLP3.js');
6
6
  var React3 = require('react');
7
7
  var lu = require('react-icons/lu');
@@ -18,11 +18,11 @@ var JSZip__default = /*#__PURE__*/_interopDefault(JSZip);
18
18
 
19
19
  // src/viewer/utils/clone.ts
20
20
  function cloneHistorySnapshot2(snapshot) {
21
- return chunk275WERXZ_js.cloneHistorySnapshot(snapshot);
21
+ return chunkVKOVFVDJ_js.cloneHistorySnapshot(snapshot);
22
22
  }
23
23
 
24
24
  // src/viewer/hooks/useEditorHistory.ts
25
- var MAX_HISTORY_ENTRIES = 120;
25
+ var DEFAULT_MAX_HISTORY_ENTRIES = 120;
26
26
  function useEditorHistory(input) {
27
27
  const {
28
28
  slides,
@@ -31,6 +31,7 @@ function useEditorHistory(input) {
31
31
  templateElementsBySlideId,
32
32
  loading,
33
33
  error,
34
+ maxHistoryEntries = DEFAULT_MAX_HISTORY_ENTRIES,
34
35
  hasActivePointerInteraction,
35
36
  pointerCommitNonce,
36
37
  setSlides,
@@ -66,8 +67,8 @@ function useEditorHistory(input) {
66
67
  width: canvasSize.width,
67
68
  height: canvasSize.height,
68
69
  activeSlideIndex,
69
- slides: slides.map(chunk275WERXZ_js.cloneSlide),
70
- templateElementsBySlideId: chunk275WERXZ_js.cloneTemplateElementsBySlideId(templateElementsBySlideId),
70
+ slides: slides.map(chunkVKOVFVDJ_js.cloneSlide),
71
+ templateElementsBySlideId: chunkVKOVFVDJ_js.cloneTemplateElementsBySlideId(templateElementsBySlideId),
71
72
  ...actionLabel ? { actionLabel } : {}
72
73
  };
73
74
  },
@@ -80,9 +81,9 @@ function useEditorHistory(input) {
80
81
  width: snapshot.width,
81
82
  height: snapshot.height
82
83
  });
83
- setSlides(snapshot.slides.map(chunk275WERXZ_js.cloneSlide));
84
+ setSlides(snapshot.slides.map(chunkVKOVFVDJ_js.cloneSlide));
84
85
  setTemplateElementsBySlideId(
85
- chunk275WERXZ_js.cloneTemplateElementsBySlideId(snapshot.templateElementsBySlideId)
86
+ chunkVKOVFVDJ_js.cloneTemplateElementsBySlideId(snapshot.templateElementsBySlideId)
86
87
  );
87
88
  setActiveSlideIndex(Math.min(snapshot.activeSlideIndex, maxSlideIndex));
88
89
  setSelectedElementIds([]);
@@ -205,7 +206,7 @@ function useEditorHistory(input) {
205
206
  return;
206
207
  }
207
208
  historyPastRef.current.push(cloneHistorySnapshot2(previousSnapshot));
208
- if (historyPastRef.current.length > MAX_HISTORY_ENTRIES) {
209
+ while (historyPastRef.current.length > Math.max(1, maxHistoryEntries)) {
209
210
  historyPastRef.current.shift();
210
211
  }
211
212
  historyFutureRef.current = [];
@@ -221,6 +222,7 @@ function useEditorHistory(input) {
221
222
  error,
222
223
  hasActivePointerInteraction,
223
224
  loading,
225
+ maxHistoryEntries,
224
226
  pointerCommitNonce,
225
227
  slides,
226
228
  updateHistoryAvailability
@@ -345,7 +347,7 @@ var GLYPH_COMPONENTS = {
345
347
  plus: lu.LuPlus,
346
348
  triangle: lu.LuTriangle
347
349
  };
348
- var SHAPE_PRESETS = chunk275WERXZ_js.SHAPE_PRESET_DEFS.map(
350
+ var SHAPE_PRESETS = chunkVKOVFVDJ_js.SHAPE_PRESET_DEFS.map(
349
351
  (def) => ({
350
352
  type: def.type,
351
353
  label: def.label,
@@ -662,19 +664,19 @@ function useAnimationPlayback(input) {
662
664
  if (anim.buildType && anim.buildType !== "allAtOnce" && anim.targetId) {
663
665
  const el = slide.elements.find((e) => e.id === anim.targetId);
664
666
  if (el && chunkKV3EOLP3_js.hasTextProperties(el) && el.textSegments && el.textSegments.length > 0) {
665
- segmentCounts.set(anim.targetId, chunk275WERXZ_js.countTextSegments(el.textSegments));
667
+ segmentCounts.set(anim.targetId, chunkVKOVFVDJ_js.countTextSegments(el.textSegments));
666
668
  }
667
669
  }
668
670
  }
669
- const expandedAnims = segmentCounts.size > 0 ? chunk275WERXZ_js.expandTextBuildAnimations(nativeAnims, segmentCounts) : nativeAnims;
670
- const engine = chunk275WERXZ_js.TimelineEngine.fromAnimations(expandedAnims);
671
+ const expandedAnims = segmentCounts.size > 0 ? chunkVKOVFVDJ_js.expandTextBuildAnimations(nativeAnims, segmentCounts) : nativeAnims;
672
+ const engine = chunkVKOVFVDJ_js.TimelineEngine.fromAnimations(expandedAnims);
671
673
  timelineEngineRef.current = engine;
672
674
  setPresentationKeyframesCss(engine.getTimeline().keyframesCss);
673
675
  setInteractiveTriggerShapeIds(engine.getInteractiveTriggerShapeIds());
674
676
  setHoverTriggerShapeIds(engine.getHoverTriggerShapeIds());
675
677
  const allIds = slide.elements.map((element) => element.id);
676
678
  for (const anim of expandedAnims) {
677
- if (anim.targetId && anim.targetId.includes(chunk275WERXZ_js.TEXT_BUILD_ID_SEP)) {
679
+ if (anim.targetId && anim.targetId.includes(chunkVKOVFVDJ_js.TEXT_BUILD_ID_SEP)) {
678
680
  allIds.push(anim.targetId);
679
681
  }
680
682
  }
@@ -806,7 +808,7 @@ function useAnimationPlayback(input) {
806
808
  }))
807
809
  );
808
810
  entranceAnimations.forEach((animation, animationIndex) => {
809
- const delay = chunk275WERXZ_js.computeEntranceAnimationDelay(animation.delayMs, animationIndex);
811
+ const delay = chunkVKOVFVDJ_js.computeEntranceAnimationDelay(animation.delayMs, animationIndex);
810
812
  const timer = window.setTimeout(() => {
811
813
  setPresentationAnimations(
812
814
  (previousAnimations) => previousAnimations.map(
@@ -863,7 +865,7 @@ function openDb() {
863
865
  }
864
866
  async function storeAudienceContent(content, sessionId) {
865
867
  if (sessionId) {
866
- return chunk275WERXZ_js.storePresentationDeck(sessionId, content);
868
+ return chunkVKOVFVDJ_js.storePresentationDeck(sessionId, content);
867
869
  }
868
870
  const db = await openDb();
869
871
  return new Promise((resolve, reject) => {
@@ -884,7 +886,7 @@ async function storeAudienceContent(content, sessionId) {
884
886
  }
885
887
  async function loadAudienceContent(sessionId) {
886
888
  if (sessionId) {
887
- return chunk275WERXZ_js.loadPresentationDeck(sessionId);
889
+ return chunkVKOVFVDJ_js.loadPresentationDeck(sessionId);
888
890
  }
889
891
  try {
890
892
  const db = await openDb();
@@ -925,7 +927,7 @@ async function loadAudienceContent(sessionId) {
925
927
  }
926
928
  async function clearAudienceContent(sessionId) {
927
929
  if (sessionId) {
928
- return chunk275WERXZ_js.clearPresentationDeck(sessionId);
930
+ return chunkVKOVFVDJ_js.clearPresentationDeck(sessionId);
929
931
  }
930
932
  try {
931
933
  const db = await openDb();
@@ -945,12 +947,12 @@ async function clearAudienceContent(sessionId) {
945
947
  } catch {
946
948
  }
947
949
  }
948
- var PRESENTER_CHANNEL_NAME = chunk275WERXZ_js.PRESENTATION_CHANNEL_NAME;
949
- var AUDIENCE_HASH = chunk275WERXZ_js.PRESENTATION_HASH;
950
- var PRESENTER_MSG_ORIGIN = chunk275WERXZ_js.PRESENTATION_MESSAGE_ORIGIN;
951
- var AUDIENCE_NONCE_KEY = chunk275WERXZ_js.PRESENTATION_NONCE_KEY;
950
+ var PRESENTER_CHANNEL_NAME = chunkVKOVFVDJ_js.PRESENTATION_CHANNEL_NAME;
951
+ var AUDIENCE_HASH = chunkVKOVFVDJ_js.PRESENTATION_HASH;
952
+ var PRESENTER_MSG_ORIGIN = chunkVKOVFVDJ_js.PRESENTATION_MESSAGE_ORIGIN;
953
+ var AUDIENCE_NONCE_KEY = chunkVKOVFVDJ_js.PRESENTATION_NONCE_KEY;
952
954
  function generateSessionId() {
953
- return chunk275WERXZ_js.createPresentationSessionId();
955
+ return chunkVKOVFVDJ_js.createPresentationSessionId();
954
956
  }
955
957
  function parseAudienceNonce() {
956
958
  const hash = window.location.hash;
@@ -986,7 +988,7 @@ function usePresenterWindow(input) {
986
988
  }, []);
987
989
  const swapDisplays = React3.useCallback(async () => {
988
990
  const audience = audienceWindowRef.current;
989
- return audience && !audience.closed ? chunk275WERXZ_js.swapPresentationWindows(window, audience) : false;
991
+ return audience && !audience.closed ? chunkVKOVFVDJ_js.swapPresentationWindows(window, audience) : false;
990
992
  }, []);
991
993
  const syncSlideToAudience = React3.useCallback(
992
994
  (slideIndex) => {
@@ -1068,10 +1070,10 @@ function usePresenterWindow(input) {
1068
1070
  audienceWindowRef.current = blankWin;
1069
1071
  const sessionId = generateSessionId();
1070
1072
  sessionIdRef.current = sessionId;
1071
- const audienceUrl = chunk275WERXZ_js.buildPresentationAudienceUrl(window.location.href, sessionId);
1072
- void chunk275WERXZ_js.resolveAudienceScreenPlacement(window).then((placement) => {
1073
+ const audienceUrl = chunkVKOVFVDJ_js.buildPresentationAudienceUrl(window.location.href, sessionId);
1074
+ void chunkVKOVFVDJ_js.resolveAudienceScreenPlacement(window).then((placement) => {
1073
1075
  if (placement && audienceWindowRef.current === blankWin && !blankWin.closed) {
1074
- chunk275WERXZ_js.placeAudienceWindow(blankWin, placement);
1076
+ chunkVKOVFVDJ_js.placeAudienceWindow(blankWin, placement);
1075
1077
  }
1076
1078
  return void 0;
1077
1079
  });
@@ -1127,7 +1129,7 @@ function usePresenterWindow(input) {
1127
1129
  }
1128
1130
  const handleMessage = (event) => {
1129
1131
  const message = event.data;
1130
- if (chunk275WERXZ_js.isPresentationSessionMessage(message) && message.type === "audience-ready" && message.sessionId === sessionIdRef.current) {
1132
+ if (chunkVKOVFVDJ_js.isPresentationSessionMessage(message) && message.type === "audience-ready" && message.sessionId === sessionIdRef.current) {
1131
1133
  syncStateToAudience(snapshotRef.current);
1132
1134
  }
1133
1135
  };
@@ -1209,7 +1211,7 @@ function useAudienceMode(input) {
1209
1211
  }
1210
1212
  channel.onmessage = (event) => {
1211
1213
  const data = event.data;
1212
- if (!chunk275WERXZ_js.isPresentationSessionMessage(data) || data.origin !== PRESENTER_MSG_ORIGIN) {
1214
+ if (!chunkVKOVFVDJ_js.isPresentationSessionMessage(data) || data.origin !== PRESENTER_MSG_ORIGIN) {
1213
1215
  return;
1214
1216
  }
1215
1217
  if (expectedSessionId && data.sessionId !== expectedSessionId) {
@@ -1235,7 +1237,7 @@ function useAudienceMode(input) {
1235
1237
  };
1236
1238
  if (expectedSessionId) {
1237
1239
  channel.postMessage({
1238
- origin: chunk275WERXZ_js.PRESENTATION_MESSAGE_ORIGIN,
1240
+ origin: chunkVKOVFVDJ_js.PRESENTATION_MESSAGE_ORIGIN,
1239
1241
  type: "audience-ready",
1240
1242
  sessionId: expectedSessionId
1241
1243
  });
@@ -1500,7 +1502,7 @@ function handlePresentationActionImpl(action, deps) {
1500
1502
  return;
1501
1503
  }
1502
1504
  if (action.url && !actionStr.includes("hlinksldjump")) {
1503
- if (chunk275WERXZ_js.isUrlSafe(action.url)) {
1505
+ if (chunkVKOVFVDJ_js.isUrlSafe(action.url)) {
1504
1506
  window.open(action.url, "_blank", "noopener,noreferrer");
1505
1507
  }
1506
1508
  }
@@ -1510,7 +1512,7 @@ function handlePresentationActionImpl(action, deps) {
1510
1512
  function executeSlideTransition(nextSlideIndex, deps) {
1511
1513
  const incomingSlide = deps.slides[nextSlideIndex];
1512
1514
  const transition = incomingSlide?.transition;
1513
- const durationMs = deps.playTransition ? chunk275WERXZ_js.resolveTransitionDurationMs(transition) : 0;
1515
+ const durationMs = deps.playTransition ? chunkVKOVFVDJ_js.resolveTransitionDurationMs(transition) : 0;
1514
1516
  deps.clearPresentationTimers();
1515
1517
  deps.setPresentationSlideIndex(nextSlideIndex);
1516
1518
  deps.onSetActiveSlideIndex(nextSlideIndex);
@@ -1551,6 +1553,7 @@ function useSlideNavigation(input) {
1551
1553
  onPlayActionSound,
1552
1554
  loopContinuously,
1553
1555
  useTimings,
1556
+ onAdvancePastLastSlide,
1554
1557
  playNextAnimationGroup,
1555
1558
  clearPresentationTimers,
1556
1559
  runPresentationEntranceAnimations,
@@ -1606,6 +1609,10 @@ function useSlideNavigation(input) {
1606
1609
  setShowRehearsalSummary(true);
1607
1610
  return;
1608
1611
  }
1612
+ if (!loopContinuously && !rehearsing && direction === 1 && nextPosition >= availableSlideIndexes.length && onAdvancePastLastSlide) {
1613
+ onAdvancePastLastSlide();
1614
+ return;
1615
+ }
1609
1616
  let resolvedPosition;
1610
1617
  if (loopContinuously && !rehearsing && direction === 1 && nextPosition >= availableSlideIndexes.length) {
1611
1618
  resolvedPosition = 0;
@@ -1638,6 +1645,7 @@ function useSlideNavigation(input) {
1638
1645
  [
1639
1646
  clearPresentationTimers,
1640
1647
  loopContinuously,
1648
+ onAdvancePastLastSlide,
1641
1649
  onPlayActionSound,
1642
1650
  onSetActiveSlideIndex,
1643
1651
  onSetMode,
@@ -1744,17 +1752,17 @@ function useZoomNavigation(input) {
1744
1752
  };
1745
1753
  }
1746
1754
  function usePresenterConsole(slideIndex) {
1747
- const timerRef = React3.useRef(chunk275WERXZ_js.createPresenterTimer());
1748
- const [snapshot, setSnapshot] = React3.useState(() => chunk275WERXZ_js.createInitialPresentationSnapshot(slideIndex));
1755
+ const timerRef = React3.useRef(chunkVKOVFVDJ_js.createPresenterTimer());
1756
+ const [snapshot, setSnapshot] = React3.useState(() => chunkVKOVFVDJ_js.createInitialPresentationSnapshot(slideIndex));
1749
1757
  const patch = React3.useCallback((value) => {
1750
- setSnapshot((current) => chunk275WERXZ_js.mergePresentationSnapshot(current, value));
1758
+ setSnapshot((current) => chunkVKOVFVDJ_js.mergePresentationSnapshot(current, value));
1751
1759
  }, []);
1752
1760
  React3.useEffect(() => patch({ slideIndex }), [patch, slideIndex]);
1753
1761
  React3.useEffect(() => {
1754
1762
  const timer = window.setInterval(() => {
1755
1763
  patch({
1756
1764
  paused: timerRef.current.paused,
1757
- elapsedMs: chunk275WERXZ_js.presenterElapsed(timerRef.current)
1765
+ elapsedMs: chunkVKOVFVDJ_js.presenterElapsed(timerRef.current)
1758
1766
  });
1759
1767
  }, 1e3);
1760
1768
  return () => window.clearInterval(timer);
@@ -1764,19 +1772,19 @@ function usePresenterConsole(slideIndex) {
1764
1772
  applyAudienceSnapshot: setSnapshot,
1765
1773
  setBlackout: (blackout) => patch({ blackout }),
1766
1774
  toggleTimer: () => {
1767
- timerRef.current = chunk275WERXZ_js.togglePresenterTimer(timerRef.current);
1775
+ timerRef.current = chunkVKOVFVDJ_js.togglePresenterTimer(timerRef.current);
1768
1776
  patch({
1769
1777
  paused: timerRef.current.paused,
1770
- elapsedMs: chunk275WERXZ_js.presenterElapsed(timerRef.current)
1778
+ elapsedMs: chunkVKOVFVDJ_js.presenterElapsed(timerRef.current)
1771
1779
  });
1772
1780
  },
1773
1781
  resetTimer: () => {
1774
- timerRef.current = chunk275WERXZ_js.resetPresenterTimer();
1782
+ timerRef.current = chunkVKOVFVDJ_js.resetPresenterTimer();
1775
1783
  patch({ paused: false, elapsedMs: 0 });
1776
1784
  },
1777
1785
  stepZoom: (direction) => setSnapshot(
1778
- (current) => chunk275WERXZ_js.mergePresentationSnapshot(current, {
1779
- zoom: chunk275WERXZ_js.stepPresenterZoom(
1786
+ (current) => chunkVKOVFVDJ_js.mergePresentationSnapshot(current, {
1787
+ zoom: chunkVKOVFVDJ_js.stepPresenterZoom(
1780
1788
  current.zoom ?? { scale: 1, originX: 0.5, originY: 0.5 },
1781
1789
  direction
1782
1790
  )
@@ -1808,7 +1816,8 @@ function usePresentationMode(input) {
1808
1816
  onSaveRehearsalTimings,
1809
1817
  loopContinuously,
1810
1818
  showWithAnimation,
1811
- useTimings
1819
+ useTimings,
1820
+ endWithBlackSlide = true
1812
1821
  } = input;
1813
1822
  const [presentationSlideIndex, setPresentationSlideIndex] = React3.useState(0);
1814
1823
  const [presentationSlideVisible, setPresentationSlideVisible] = React3.useState(true);
@@ -1817,6 +1826,7 @@ function usePresentationMode(input) {
1817
1826
  setTransitionOverlay(null);
1818
1827
  }, []);
1819
1828
  const [presenterMode, setPresenterMode] = React3.useState(false);
1829
+ const [endOfShowVisible, setEndOfShowVisible] = React3.useState(false);
1820
1830
  const [presentationStartTime, setPresentationStartTime] = React3.useState(null);
1821
1831
  const switchingToPresenterRef = React3.useRef(false);
1822
1832
  const {
@@ -1853,8 +1863,15 @@ function usePresentationMode(input) {
1853
1863
  setPresentationStartTime,
1854
1864
  setPresenterMode
1855
1865
  });
1866
+ const handleAdvancePastLastSlide = React3.useCallback(() => {
1867
+ if (endWithBlackSlide) {
1868
+ setEndOfShowVisible(true);
1869
+ } else {
1870
+ onSetMode("edit");
1871
+ }
1872
+ }, [endWithBlackSlide, onSetMode]);
1856
1873
  const {
1857
- movePresentationSlide,
1874
+ movePresentationSlide: moveNavigationSlide,
1858
1875
  navigateToSlide,
1859
1876
  handlePresentationAction,
1860
1877
  scheduleAutoAdvanceForSlide
@@ -1870,6 +1887,7 @@ function usePresentationMode(input) {
1870
1887
  onPlayActionSound,
1871
1888
  loopContinuously,
1872
1889
  useTimings,
1890
+ onAdvancePastLastSlide: handleAdvancePastLastSlide,
1873
1891
  playNextAnimationGroup,
1874
1892
  clearPresentationTimers,
1875
1893
  runPresentationEntranceAnimations,
@@ -1878,6 +1896,19 @@ function usePresentationMode(input) {
1878
1896
  recordCurrentSlideTime,
1879
1897
  setShowRehearsalSummary
1880
1898
  });
1899
+ const movePresentationSlide = React3.useCallback(
1900
+ (direction) => {
1901
+ if (endOfShowVisible) {
1902
+ setEndOfShowVisible(false);
1903
+ if (direction === 1) {
1904
+ onSetMode("edit");
1905
+ }
1906
+ return;
1907
+ }
1908
+ moveNavigationSlide(direction);
1909
+ },
1910
+ [endOfShowVisible, moveNavigationSlide, onSetMode]
1911
+ );
1881
1912
  const { handleZoomClick, zoomReturnSlideIndex, returnToZoomSlide, clearZoomReturn } = useZoomNavigation({ navigateToSlide });
1882
1913
  const presenterConsole = usePresenterConsole(presentationSlideIndex);
1883
1914
  const {
@@ -1983,6 +2014,7 @@ function usePresentationMode(input) {
1983
2014
  } else {
1984
2015
  setTransitionOverlay(null);
1985
2016
  }
2017
+ setEndOfShowVisible(false);
1986
2018
  }, [mode]);
1987
2019
  React3.useEffect(() => {
1988
2020
  if (mode !== "present") {
@@ -2054,6 +2086,7 @@ function usePresentationMode(input) {
2054
2086
  presentationKeyframesCss,
2055
2087
  clearPresentationTimers,
2056
2088
  runPresentationEntranceAnimations,
2089
+ endOfShowVisible,
2057
2090
  movePresentationSlide,
2058
2091
  navigateToSlide,
2059
2092
  handlePresentationAction,
@@ -2107,7 +2140,7 @@ function nextStrokeId() {
2107
2140
  return `stroke-${strokeIdCounter}`;
2108
2141
  }
2109
2142
  function usePresentationAnnotations(input) {
2110
- const { isActive, activeSlideIndex } = input;
2143
+ const { isActive, activeSlideIndex, popupToolbarEnabled = true } = input;
2111
2144
  const [presentationTool, setPresentationToolState] = React3.useState("none");
2112
2145
  const [penColor, setPenColor] = React3.useState("#ff0000");
2113
2146
  const [highlighterColor, setHighlighterColor] = React3.useState("#ffff00");
@@ -2260,6 +2293,9 @@ function usePresentationAnnotations(input) {
2260
2293
  setLaserPosition(null);
2261
2294
  return;
2262
2295
  }
2296
+ if (!popupToolbarEnabled) {
2297
+ return;
2298
+ }
2263
2299
  const handleMouseMove = () => {
2264
2300
  setToolbarVisible(true);
2265
2301
  window.clearTimeout(toolbarTimerRef.current);
@@ -2272,7 +2308,7 @@ function usePresentationAnnotations(input) {
2272
2308
  window.removeEventListener("mousemove", handleMouseMove);
2273
2309
  window.clearTimeout(toolbarTimerRef.current);
2274
2310
  };
2275
- }, [isActive]);
2311
+ }, [isActive, popupToolbarEnabled]);
2276
2312
  const getAllSlideAnnotations = React3.useCallback(() => {
2277
2313
  const map = new Map(slideAnnotationsRef.current);
2278
2314
  if (annotationStrokes.length > 0) {
@@ -3292,12 +3328,12 @@ function useViewerState(input) {
3292
3328
  function partitionTemplateElements(slides) {
3293
3329
  const templateElementsBySlideId = {};
3294
3330
  const nextSlides = slides.map((slide) => {
3295
- const template = slide.elements.filter((el) => chunk275WERXZ_js.isTemplateElement(el));
3331
+ const template = slide.elements.filter((el) => chunkVKOVFVDJ_js.isTemplateElement(el));
3296
3332
  if (template.length === 0) {
3297
3333
  return slide;
3298
3334
  }
3299
3335
  templateElementsBySlideId[slide.id] = template;
3300
- return { ...slide, elements: slide.elements.filter((el) => !chunk275WERXZ_js.isTemplateElement(el)) };
3336
+ return { ...slide, elements: slide.elements.filter((el) => !chunkVKOVFVDJ_js.isTemplateElement(el)) };
3301
3337
  });
3302
3338
  return { slides: nextSlides, templateElementsBySlideId };
3303
3339
  }
@@ -3383,7 +3419,7 @@ function useLoadContent({
3383
3419
  handlerRef.current = null;
3384
3420
  const mediaElements = [];
3385
3421
  for (const slide of parsed.slides) {
3386
- chunk275WERXZ_js.collectMediaElements(slide.elements, mediaElements);
3422
+ chunkVKOVFVDJ_js.collectMediaElements(slide.elements, mediaElements);
3387
3423
  }
3388
3424
  for (const url of mediaDataUrls.values()) {
3389
3425
  if (url.startsWith("blob:")) {
@@ -3424,7 +3460,7 @@ function useLoadContent({
3424
3460
  }
3425
3461
  })
3426
3462
  );
3427
- const { paths: imagePaths, refs: imageRefs } = chunk275WERXZ_js.collectImagePaths(parsed.slides);
3463
+ const { paths: imagePaths, refs: imageRefs } = chunkVKOVFVDJ_js.collectImagePaths(parsed.slides);
3428
3464
  let nextSlides = parsed.slides;
3429
3465
  if (imagePaths.size > 0) {
3430
3466
  const resolvedMap = /* @__PURE__ */ new Map();
@@ -3513,7 +3549,7 @@ function useLoadContent({
3513
3549
  setHasMacros(parsed.hasMacros === true);
3514
3550
  setHasDigitalSignatures(parsed.hasDigitalSignatures === true);
3515
3551
  setDigitalSignatureCount(parsed.digitalSignatureCount ?? 0);
3516
- setGuides(chunk275WERXZ_js.buildInitialGuides(parsed.presentationGuides, parsed.slides[0]?.guides));
3552
+ setGuides(chunkVKOVFVDJ_js.buildInitialGuides(parsed.presentationGuides, parsed.slides[0]?.guides));
3517
3553
  setActiveSlideIndex(0);
3518
3554
  clearSelection();
3519
3555
  setIsDirty(false);
@@ -3598,7 +3634,7 @@ function useAutosave(input) {
3598
3634
  isSavingRef.current = false;
3599
3635
  return;
3600
3636
  }
3601
- await chunk275WERXZ_js.saveAutosaveSnapshot(filePathRef.current, data);
3637
+ await chunkVKOVFVDJ_js.saveAutosaveSnapshot(filePathRef.current, data);
3602
3638
  setAutosaveStatus({ state: "saved", timestamp: Date.now() });
3603
3639
  } catch (err) {
3604
3640
  setAutosaveStatus({
@@ -3636,7 +3672,7 @@ function useAutosave(input) {
3636
3672
 
3637
3673
  // src/viewer/utils/animation-effects.ts
3638
3674
  function getAnimationInitialStyle2(preset, nativeAnimation) {
3639
- return chunk275WERXZ_js.getAnimationInitialStyle(preset, nativeAnimation);
3675
+ return chunkVKOVFVDJ_js.getAnimationInitialStyle(preset, nativeAnimation);
3640
3676
  }
3641
3677
  function cn(...inputs) {
3642
3678
  return tailwindMerge.twMerge(clsx.clsx(inputs));
@@ -3658,20 +3694,20 @@ function getTextStyleForElement(element, fallbackColor) {
3658
3694
  const textDecorationStyle = isDoubleStrike ? "double" : void 0;
3659
3695
  const hasItalicRuns = element.textStyle?.italic || Boolean(element.textSegments?.some((segment) => segment.style?.italic));
3660
3696
  const isRtl = element.textStyle?.rtl === true;
3661
- const resolvedTextColor = element.textStyle?.hyperlink ? chunk275WERXZ_js.normalizeHexColor(element.textStyle?.color, HYPERLINK_COLOR) : chunk275WERXZ_js.normalizeHexColor(element.textStyle?.color, fallbackColor);
3697
+ const resolvedTextColor = element.textStyle?.hyperlink ? chunkVKOVFVDJ_js.normalizeHexColor(element.textStyle?.color, HYPERLINK_COLOR) : chunkVKOVFVDJ_js.normalizeHexColor(element.textStyle?.color, fallbackColor);
3662
3698
  const bodyTop = element.textStyle?.bodyInsetTop ?? DEFAULT_BODY_INSET_TB_PX;
3663
3699
  const bodyBottom = element.textStyle?.bodyInsetBottom ?? DEFAULT_BODY_INSET_TB_PX;
3664
3700
  const bodyLeft = element.textStyle?.bodyInsetLeft ?? DEFAULT_BODY_INSET_LR_PX;
3665
3701
  const bodyRight = element.textStyle?.bodyInsetRight ?? DEFAULT_BODY_INSET_LR_PX;
3666
- const writingMode = chunk275WERXZ_js.toCssWritingMode(element.textStyle?.textDirection);
3667
- const textOrientation = chunk275WERXZ_js.toCssTextOrientation(element.textStyle?.textDirection);
3668
- const verticalDirection = chunk275WERXZ_js.toCssVerticalDirection(element.textStyle?.textDirection);
3702
+ const writingMode = chunkVKOVFVDJ_js.toCssWritingMode(element.textStyle?.textDirection);
3703
+ const textOrientation = chunkVKOVFVDJ_js.toCssTextOrientation(element.textStyle?.textDirection);
3704
+ const verticalDirection = chunkVKOVFVDJ_js.toCssVerticalDirection(element.textStyle?.textDirection);
3669
3705
  const resolvedDirection = verticalDirection || (isRtl ? "rtl" : "ltr");
3670
3706
  const resolvedUnicodeBidi = isRtl ? "plaintext" : void 0;
3671
3707
  const hasSegments = (element.textSegments?.length ?? 0) > 0;
3672
3708
  return {
3673
3709
  color: resolvedTextColor,
3674
- backgroundColor: !hasSegments && element.textStyle?.highlightColor ? chunk275WERXZ_js.normalizeHexColor(element.textStyle.highlightColor, void 0) : void 0,
3710
+ backgroundColor: !hasSegments && element.textStyle?.highlightColor ? chunkVKOVFVDJ_js.normalizeHexColor(element.textStyle.highlightColor, void 0) : void 0,
3675
3711
  textAlign: (() => {
3676
3712
  const a = element.textStyle?.align;
3677
3713
  if (a === "justLow" || a === "dist" || a === "thaiDist") {
@@ -3687,7 +3723,7 @@ function getTextStyleForElement(element, fallbackColor) {
3687
3723
  textDecorationLine: textDecorationTokens.length > 0 ? textDecorationTokens.join(" ") : "none",
3688
3724
  textDecorationStyle,
3689
3725
  fontFamily: element.textStyle?.fontFamily || DEFAULT_FONT_FAMILY,
3690
- lineHeight: chunk275WERXZ_js.resolveLineHeight(element.textStyle, hasItalicRuns),
3726
+ lineHeight: chunkVKOVFVDJ_js.resolveLineHeight(element.textStyle, hasItalicRuns),
3691
3727
  paddingTop: bodyTop + (hasItalicRuns ? 1 : 0),
3692
3728
  paddingBottom: bodyBottom + (hasItalicRuns ? 1 : 0),
3693
3729
  paddingLeft: bodyLeft + (element.textStyle?.paragraphMarginLeft || 0),
@@ -3700,7 +3736,7 @@ function getTextStyleForElement(element, fallbackColor) {
3700
3736
  // Auto-fit: use OOXML-provided fontScale/lnSpcReduction when available,
3701
3737
  // otherwise fall back to heuristic estimation. The pure font-scale maths
3702
3738
  // now lives in pptx-viewer-shared (computeAutoFitTextStyle).
3703
- ...chunk275WERXZ_js.computeAutoFitTextStyle({
3739
+ ...chunkVKOVFVDJ_js.computeAutoFitTextStyle({
3704
3740
  textStyle: element.textStyle,
3705
3741
  text: element.text ?? "",
3706
3742
  width: element.width,
@@ -3737,9 +3773,9 @@ function getTextLayoutStyle(element) {
3737
3773
  return {};
3738
3774
  }
3739
3775
  const verticalAlign = element.textStyle?.vAlign || "top";
3740
- const writingMode = chunk275WERXZ_js.toCssWritingMode(element.textStyle?.textDirection);
3741
- const textOrientation = chunk275WERXZ_js.toCssTextOrientation(element.textStyle?.textDirection);
3742
- const verticalDirection = chunk275WERXZ_js.toCssVerticalDirection(element.textStyle?.textDirection);
3776
+ const writingMode = chunkVKOVFVDJ_js.toCssWritingMode(element.textStyle?.textDirection);
3777
+ const textOrientation = chunkVKOVFVDJ_js.toCssTextOrientation(element.textStyle?.textDirection);
3778
+ const verticalDirection = chunkVKOVFVDJ_js.toCssVerticalDirection(element.textStyle?.textDirection);
3743
3779
  const parsedColumnCount = Number(element.textStyle?.columnCount);
3744
3780
  const columnCount = Number.isFinite(parsedColumnCount) ? Math.max(1, Math.min(16, Math.round(parsedColumnCount))) : 1;
3745
3781
  const hasColumns = columnCount > 1;
@@ -3756,7 +3792,7 @@ function getTextLayoutStyle(element) {
3756
3792
  const bodyBottom = element.textStyle?.bodyInsetBottom ?? DEFAULT_BODY_INSET_TB_PX;
3757
3793
  const parsedColumnSpacing = Number(element.textStyle?.columnSpacing);
3758
3794
  const columnGap = Number.isFinite(parsedColumnSpacing) && parsedColumnSpacing > 0 ? `${parsedColumnSpacing}px` : "0.75em";
3759
- const kinsokuStyles = chunk275WERXZ_js.getKinsokuLineBreakStyles(element.textStyle);
3795
+ const kinsokuStyles = chunkVKOVFVDJ_js.getKinsokuLineBreakStyles(element.textStyle);
3760
3796
  if (hasColumns) {
3761
3797
  return {
3762
3798
  display: "block",
@@ -3799,10 +3835,10 @@ function getTextLayoutStyle(element) {
3799
3835
 
3800
3836
  // src/viewer/utils/text-effects.tsx
3801
3837
  function buildTextFillCss2(style) {
3802
- return chunk275WERXZ_js.buildTextFillCss(style);
3838
+ return chunkVKOVFVDJ_js.buildTextFillCss(style);
3803
3839
  }
3804
3840
  function buildTextBody3DSceneStyle2(textStyle) {
3805
- return chunk275WERXZ_js.buildTextBody3DSceneStyle(textStyle);
3841
+ return chunkVKOVFVDJ_js.buildTextBody3DSceneStyle(textStyle);
3806
3842
  }
3807
3843
 
3808
3844
  // src/viewer/utils/text-warp-css.tsx
@@ -3987,17 +4023,17 @@ function wrapWithTextBuildAnimation(elementId, paraIndex, renderedSegments, para
3987
4023
  if (!subElementAnimStates || subElementAnimStates.size === 0) {
3988
4024
  return renderedSegments;
3989
4025
  }
3990
- const paraKey = `${elementId}${chunk275WERXZ_js.TEXT_BUILD_ID_SEP}p${paraIndex}`;
4026
+ const paraKey = `${elementId}${chunkVKOVFVDJ_js.TEXT_BUILD_ID_SEP}p${paraIndex}`;
3991
4027
  const paraState = subElementAnimStates.get(paraKey);
3992
4028
  if (paraState) {
3993
4029
  const style = buildAnimStyle(paraState);
3994
4030
  return /* @__PURE__ */ jsxRuntime.jsx("span", { "data-anim-id": paraKey, style: { display: "inline", ...style }, children: renderedSegments }, paraKey);
3995
4031
  }
3996
- const firstWordKey = `${elementId}${chunk275WERXZ_js.TEXT_BUILD_ID_SEP}w${paraIndex}-0`;
4032
+ const firstWordKey = `${elementId}${chunkVKOVFVDJ_js.TEXT_BUILD_ID_SEP}w${paraIndex}-0`;
3997
4033
  if (subElementAnimStates.has(firstWordKey)) {
3998
4034
  return wrapByWord(elementId, paraIndex, paraSegments, subElementAnimStates);
3999
4035
  }
4000
- const firstCharKey = `${elementId}${chunk275WERXZ_js.TEXT_BUILD_ID_SEP}c${paraIndex}-0`;
4036
+ const firstCharKey = `${elementId}${chunkVKOVFVDJ_js.TEXT_BUILD_ID_SEP}c${paraIndex}-0`;
4001
4037
  if (subElementAnimStates.has(firstCharKey)) {
4002
4038
  return wrapByChar(elementId, paraIndex, paraSegments, subElementAnimStates);
4003
4039
  }
@@ -4018,7 +4054,7 @@ function wrapByWord(elementId, paraIndex, paraSegments, states) {
4018
4054
  nodes.push(/* @__PURE__ */ jsxRuntime.jsx(React3__default.default.Fragment, { children: w }, `ws-${i}`));
4019
4055
  continue;
4020
4056
  }
4021
- const key = `${elementId}${chunk275WERXZ_js.TEXT_BUILD_ID_SEP}w${paraIndex}-${wordIdx}`;
4057
+ const key = `${elementId}${chunkVKOVFVDJ_js.TEXT_BUILD_ID_SEP}w${paraIndex}-${wordIdx}`;
4022
4058
  const state = states.get(key);
4023
4059
  const style = buildAnimStyle(state);
4024
4060
  nodes.push(
@@ -4032,7 +4068,7 @@ function wrapByChar(elementId, paraIndex, paraSegments, states) {
4032
4068
  const fullText = paraSegments.map((e) => e.segment.text).join("");
4033
4069
  const nodes = [];
4034
4070
  for (let i = 0; i < fullText.length; i++) {
4035
- const key = `${elementId}${chunk275WERXZ_js.TEXT_BUILD_ID_SEP}c${paraIndex}-${i}`;
4071
+ const key = `${elementId}${chunkVKOVFVDJ_js.TEXT_BUILD_ID_SEP}c${paraIndex}-${i}`;
4036
4072
  const state = states.get(key);
4037
4073
  const style = buildAnimStyle(state);
4038
4074
  nodes.push(
@@ -4045,10 +4081,10 @@ function renderScriptAwareText(text, needsScriptFonts, scriptFonts, baseFontFami
4045
4081
  if (!needsScriptFonts || !text) {
4046
4082
  return text;
4047
4083
  }
4048
- const runs = chunk275WERXZ_js.segmentByScript(text);
4084
+ const runs = chunkVKOVFVDJ_js.segmentByScript(text);
4049
4085
  if (runs.length <= 1) {
4050
4086
  if (runs.length === 1) {
4051
- const font = chunk275WERXZ_js.resolveFontForScript(runs[0].script, scriptFonts);
4087
+ const font = chunkVKOVFVDJ_js.resolveFontForScript(runs[0].script, scriptFonts);
4052
4088
  if (font && font !== baseFontFamily) {
4053
4089
  return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontFamily: font }, children: text });
4054
4090
  }
@@ -4056,7 +4092,7 @@ function renderScriptAwareText(text, needsScriptFonts, scriptFonts, baseFontFami
4056
4092
  return text;
4057
4093
  }
4058
4094
  return runs.map((run, i) => {
4059
- const font = chunk275WERXZ_js.resolveFontForScript(run.script, scriptFonts);
4095
+ const font = chunkVKOVFVDJ_js.resolveFontForScript(run.script, scriptFonts);
4060
4096
  if (!font || font === baseFontFamily) {
4061
4097
  return /* @__PURE__ */ jsxRuntime.jsx(React3__default.default.Fragment, { children: run.text }, `${keyPrefix}-r${i}`);
4062
4098
  }
@@ -4130,8 +4166,8 @@ function renderSegmentContent(elementId, segmentIndex, textValue, lines, needsSc
4130
4166
  );
4131
4167
  }
4132
4168
  function renderEquationSegment(elementId, segmentIndex, equationXml, equationNumber) {
4133
- const mathml = chunk275WERXZ_js.convertOmmlToMathMl(equationXml);
4134
- const safeMathml = mathml ? chunk275WERXZ_js.sanitizeMathMl(mathml) : "";
4169
+ const mathml = chunkVKOVFVDJ_js.convertOmmlToMathMl(equationXml);
4170
+ const safeMathml = mathml ? chunkVKOVFVDJ_js.sanitizeMathMl(mathml) : "";
4135
4171
  const equationContent = safeMathml ? /* @__PURE__ */ jsxRuntime.jsx(
4136
4172
  "span",
4137
4173
  {
@@ -4141,7 +4177,7 @@ function renderEquationSegment(elementId, segmentIndex, equationXml, equationNum
4141
4177
  },
4142
4178
  dangerouslySetInnerHTML: { __html: safeMathml }
4143
4179
  }
4144
- ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block px-1 py-0.5 rounded text-xs bg-gray-200/20 text-gray-400 italic", children: chunkZISXRMDJ_js.translationsEn["pptx.textSegment.equationFallback"] });
4180
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block px-1 py-0.5 rounded text-xs bg-gray-200/20 text-gray-400 italic", children: chunk2EFVXYNA_js.translationsEn["pptx.textSegment.equationFallback"] });
4145
4181
  if (equationNumber) {
4146
4182
  return /* @__PURE__ */ jsxRuntime.jsxs(
4147
4183
  "span",
@@ -4181,7 +4217,7 @@ function renderEquationSegment(elementId, segmentIndex, equationXml, equationNum
4181
4217
  return /* @__PURE__ */ jsxRuntime.jsx("span", { children: equationContent }, `${elementId}-seg-${segmentIndex}`);
4182
4218
  }
4183
4219
  function renderPictureBullet(elementId, segmentIndex, bulletInfo, baseFontSize) {
4184
- const picture = chunk275WERXZ_js.resolvePictureBullet(bulletInfo, baseFontSize) ?? {
4220
+ const picture = chunkVKOVFVDJ_js.resolvePictureBullet(bulletInfo, baseFontSize) ?? {
4185
4221
  sizePx: baseFontSize,
4186
4222
  fallbackMarker: "\u2022",
4187
4223
  accessibleLabel: "Bullet"
@@ -4231,7 +4267,7 @@ function renderSingleSegment(element, segment, segmentIndex, fallbackColor, find
4231
4267
  );
4232
4268
  }
4233
4269
  const segmentStyle = segment.style || {};
4234
- const textValue = chunk275WERXZ_js.substituteFieldText(segment.text || "", segment.fieldType, fieldContext);
4270
+ const textValue = chunkVKOVFVDJ_js.substituteFieldText(segment.text || "", segment.fieldType, fieldContext);
4235
4271
  const lines = textValue.split("\n");
4236
4272
  const textDecorationTokens = [];
4237
4273
  if (segmentStyle.underline || segmentStyle.hyperlink) {
@@ -4241,8 +4277,8 @@ function renderSingleSegment(element, segment, segmentIndex, fallbackColor, find
4241
4277
  textDecorationTokens.push("line-through");
4242
4278
  }
4243
4279
  const isDoubleStrike = segmentStyle.strikethrough && segmentStyle.strikeType === "dblStrike";
4244
- const resolvedSegmentColor = segmentStyle.hyperlink ? chunk275WERXZ_js.normalizeHexColor(segmentStyle.color || element.textStyle?.color, HYPERLINK_COLOR) : chunk275WERXZ_js.normalizeHexColor(segmentStyle.color || element.textStyle?.color, fallbackColor);
4245
- const underlineDecoration = chunk275WERXZ_js.resolveUnderlineDecorationStyle(
4280
+ const resolvedSegmentColor = segmentStyle.hyperlink ? chunkVKOVFVDJ_js.normalizeHexColor(segmentStyle.color || element.textStyle?.color, HYPERLINK_COLOR) : chunkVKOVFVDJ_js.normalizeHexColor(segmentStyle.color || element.textStyle?.color, fallbackColor);
4281
+ const underlineDecoration = chunkVKOVFVDJ_js.resolveUnderlineDecorationStyle(
4246
4282
  Boolean(isDoubleStrike),
4247
4283
  segmentStyle.underlineStyle
4248
4284
  );
@@ -4262,7 +4298,7 @@ function renderSingleSegment(element, segment, segmentIndex, fallbackColor, find
4262
4298
  complexScript: segmentStyle.complexScriptFont || element.textStyle?.complexScriptFont || baseFontFamily,
4263
4299
  symbol: segmentStyle.symbolFont || element.textStyle?.symbolFont || baseFontFamily
4264
4300
  };
4265
- const needsScriptFonts = chunk275WERXZ_js.hasDistinctScriptFonts(scriptFonts);
4301
+ const needsScriptFonts = chunkVKOVFVDJ_js.hasDistinctScriptFonts(scriptFonts);
4266
4302
  const spanStyle = {
4267
4303
  color: resolvedSegmentColor,
4268
4304
  fontSize: baseFontSize * baselineFontScale,
@@ -4276,15 +4312,15 @@ function renderSingleSegment(element, segment, segmentIndex, fallbackColor, find
4276
4312
  verticalAlign: baselineShift,
4277
4313
  letterSpacing,
4278
4314
  fontKerning,
4279
- backgroundColor: textFillStyles ? void 0 : segmentStyle.highlightColor ? chunk275WERXZ_js.normalizeHexColor(segmentStyle.highlightColor, "transparent") : void 0,
4315
+ backgroundColor: textFillStyles ? void 0 : segmentStyle.highlightColor ? chunkVKOVFVDJ_js.normalizeHexColor(segmentStyle.highlightColor, "transparent") : void 0,
4280
4316
  ...textFillStyles,
4281
- textDecorationColor: segmentStyle.underlineColor ? chunk275WERXZ_js.normalizeHexColor(segmentStyle.underlineColor, void 0) : void 0,
4282
- WebkitTextStroke: segmentStyle.textOutlineWidth && segmentStyle.textOutlineColor ? `${segmentStyle.textOutlineWidth}px ${chunk275WERXZ_js.normalizeHexColor(segmentStyle.textOutlineColor, "#000000")}` : segmentStyle.textOutlineWidth ? `${segmentStyle.textOutlineWidth}px currentColor` : void 0,
4317
+ textDecorationColor: segmentStyle.underlineColor ? chunkVKOVFVDJ_js.normalizeHexColor(segmentStyle.underlineColor, void 0) : void 0,
4318
+ WebkitTextStroke: segmentStyle.textOutlineWidth && segmentStyle.textOutlineColor ? `${segmentStyle.textOutlineWidth}px ${chunkVKOVFVDJ_js.normalizeHexColor(segmentStyle.textOutlineColor, "#000000")}` : segmentStyle.textOutlineWidth ? `${segmentStyle.textOutlineWidth}px currentColor` : void 0,
4283
4319
  paintOrder: segmentStyle.textOutlineWidth ? "stroke fill" : void 0,
4284
- textShadow: chunk275WERXZ_js.buildTextShadowCss(segmentStyle),
4285
- filter: chunk275WERXZ_js.buildTextRunFilterChain(segmentStyle),
4286
- opacity: chunk275WERXZ_js.getTextAlphaOpacity(segmentStyle),
4287
- WebkitBoxReflect: chunk275WERXZ_js.buildTextReflectionCss(segmentStyle)
4320
+ textShadow: chunkVKOVFVDJ_js.buildTextShadowCss(segmentStyle),
4321
+ filter: chunkVKOVFVDJ_js.buildTextRunFilterChain(segmentStyle),
4322
+ opacity: chunkVKOVFVDJ_js.getTextAlphaOpacity(segmentStyle),
4323
+ WebkitBoxReflect: chunkVKOVFVDJ_js.buildTextReflectionCss(segmentStyle)
4288
4324
  };
4289
4325
  const runRtl = segmentStyle.rtl;
4290
4326
  if (runRtl !== void 0 && runRtl !== paragraphRtl) {
@@ -4304,7 +4340,7 @@ function renderSingleSegment(element, segment, segmentIndex, fallbackColor, find
4304
4340
  spanStyle.fontSize = baseFontSize * (bulletInfo.sizePercent / 100) * baselineFontScale;
4305
4341
  }
4306
4342
  if (bulletInfo.color) {
4307
- spanStyle.color = chunk275WERXZ_js.normalizeHexColor(bulletInfo.color, resolvedSegmentColor);
4343
+ spanStyle.color = chunkVKOVFVDJ_js.normalizeHexColor(bulletInfo.color, resolvedSegmentColor);
4308
4344
  }
4309
4345
  }
4310
4346
  if (bulletInfo?.imageDataUrl || bulletInfo?.imageRelId) {
@@ -4336,7 +4372,7 @@ function renderSingleSegment(element, segment, segmentIndex, fallbackColor, find
4336
4372
  textAlign: segment.rubyAlignment === "l" ? "left" : segment.rubyAlignment === "r" ? "right" : segment.rubyAlignment === "dist" || segment.rubyAlignment === "distCat" || segment.rubyAlignment === "distLetter" ? "justify" : "center"
4337
4373
  };
4338
4374
  if (segment.rubyStyle?.color) {
4339
- rubyStyle.color = chunk275WERXZ_js.normalizeHexColor(segment.rubyStyle.color, resolvedSegmentColor);
4375
+ rubyStyle.color = chunkVKOVFVDJ_js.normalizeHexColor(segment.rubyStyle.color, resolvedSegmentColor);
4340
4376
  }
4341
4377
  innerContent = /* @__PURE__ */ jsxRuntime.jsxs("ruby", { children: [
4342
4378
  baseContent,
@@ -4443,14 +4479,14 @@ function renderTextSegments(element, fallbackColor, emptyFallback, findHighlight
4443
4479
  return Boolean(segment.text) && segment.text.trim().length > 0;
4444
4480
  });
4445
4481
  const hasBullet = bulletInfo && !bulletInfo.none && hasVisibleTextContent;
4446
- const paraRtl = chunk275WERXZ_js.resolveParagraphRtl(paraSegments, elementRtl);
4482
+ const paraRtl = chunkVKOVFVDJ_js.resolveParagraphRtl(paraSegments, elementRtl);
4447
4483
  const isRtlParagraph = paraRtl === true;
4448
- const paraAlign = chunk275WERXZ_js.resolveParagraphAlign(paraSegments, elementAlign);
4449
- const cssTextAlign = chunk275WERXZ_js.resolveCssTextAlign(paraAlign, isRtlParagraph);
4484
+ const paraAlign = chunkVKOVFVDJ_js.resolveParagraphAlign(paraSegments, elementAlign);
4485
+ const cssTextAlign = chunkVKOVFVDJ_js.resolveCssTextAlign(paraAlign, isRtlParagraph);
4450
4486
  const paraMarginLeft = isRtlParagraph ? void 0 : rawMarginLeft;
4451
4487
  const paraMarginRight = isRtlParagraph ? rawMarginLeft : void 0;
4452
4488
  const paraTextIndent = rawTextIndent;
4453
- const paraKinsokuStyle = chunk275WERXZ_js.getKinsokuLineBreakStyles(firstSeg?.segment.style);
4489
+ const paraKinsokuStyle = chunkVKOVFVDJ_js.getKinsokuLineBreakStyles(firstSeg?.segment.style);
4454
4490
  const hasParaKinsoku = Object.keys(paraKinsokuStyle).length > 0;
4455
4491
  const paraStyle = {
4456
4492
  ...paraKinsokuStyle
@@ -4650,8 +4686,8 @@ function buildLineShadowCss(element) {
4650
4686
  const offsetY = typeof ss.lineShadowOffsetY === "number" ? ss.lineShadowOffsetY : 2;
4651
4687
  const blur = typeof ss.lineShadowBlur === "number" ? Math.max(0, ss.lineShadowBlur) : 4;
4652
4688
  const opacity = typeof ss.lineShadowOpacity === "number" ? Math.max(0, Math.min(1, ss.lineShadowOpacity)) : 0.35;
4653
- return `${Math.round(offsetX)}px ${Math.round(offsetY)}px ${Math.round(blur)}px ${chunk275WERXZ_js.colorWithOpacity(
4654
- chunk275WERXZ_js.normalizeHexColor(ss.lineShadowColor, "#000000"),
4689
+ return `${Math.round(offsetX)}px ${Math.round(offsetY)}px ${Math.round(blur)}px ${chunkVKOVFVDJ_js.colorWithOpacity(
4690
+ chunkVKOVFVDJ_js.normalizeHexColor(ss.lineShadowColor, "#000000"),
4655
4691
  opacity
4656
4692
  )}`;
4657
4693
  }
@@ -4665,7 +4701,7 @@ function buildLineGlowFilter(element) {
4665
4701
  }
4666
4702
  const glowOpacity = typeof ss.lineGlowOpacity === "number" ? ss.lineGlowOpacity : 0.75;
4667
4703
  const glowRad = Math.round(Math.max(0, ss.lineGlowRadius));
4668
- const glowCol = chunk275WERXZ_js.colorWithOpacity(chunk275WERXZ_js.normalizeHexColor(ss.lineGlowColor, "#ffff00"), glowOpacity);
4704
+ const glowCol = chunkVKOVFVDJ_js.colorWithOpacity(chunkVKOVFVDJ_js.normalizeHexColor(ss.lineGlowColor, "#ffff00"), glowOpacity);
4669
4705
  return `drop-shadow(0 0 ${glowRad}px ${glowCol})`;
4670
4706
  }
4671
4707
  function mapDagBlendModeToCss(blend) {
@@ -4752,7 +4788,7 @@ function getRoundRectRadiusPx2(element) {
4752
4788
 
4753
4789
  // src/viewer/utils/shape-visual-3d.ts
4754
4790
  function build3DExtrusionData2(shape3d, scene3d, fillColor, elementWidth, elementHeight) {
4755
- return chunk275WERXZ_js.build3DExtrusionData(
4791
+ return chunkVKOVFVDJ_js.build3DExtrusionData(
4756
4792
  shape3d,
4757
4793
  scene3d,
4758
4794
  fillColor,
@@ -4761,7 +4797,7 @@ function build3DExtrusionData2(shape3d, scene3d, fillColor, elementWidth, elemen
4761
4797
  );
4762
4798
  }
4763
4799
  function apply3dEffects2(base, scene3d, shape3d) {
4764
- chunk275WERXZ_js.apply3dEffects(base, scene3d, shape3d);
4800
+ chunkVKOVFVDJ_js.apply3dEffects(base, scene3d, shape3d);
4765
4801
  }
4766
4802
 
4767
4803
  // src/viewer/utils/shape-visual-style.ts
@@ -4770,18 +4806,18 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
4770
4806
  return {};
4771
4807
  }
4772
4808
  const normalizedShapeType = getShapeType(element.shapeType);
4773
- const clipPath = chunk275WERXZ_js.getResolvedShapeClipPath(element);
4809
+ const clipPath = chunkVKOVFVDJ_js.getResolvedShapeClipPath(element);
4774
4810
  const fillOpacity = element.shapeStyle?.fillOpacity;
4775
4811
  const strokeOpacity = element.shapeStyle?.strokeOpacity;
4776
- const strokeDash = chunk275WERXZ_js.normalizeStrokeDashType(element.shapeStyle?.strokeDash);
4777
- const fillGradient = chunk275WERXZ_js.buildCssGradientFromShapeStyle(element.shapeStyle) || element.shapeStyle?.fillGradient;
4778
- const shadowCss = chunk275WERXZ_js.buildShadowCssFromShapeStyle(element.shapeStyle);
4779
- const innerShadowCss = chunk275WERXZ_js.buildInnerShadowCssFromShapeStyle(element.shapeStyle);
4780
- const resolvedFillColor = chunk275WERXZ_js.colorWithOpacity(fillColor, fillOpacity);
4781
- const resolvedStrokeColor = chunk275WERXZ_js.colorWithOpacity(strokeColor, strokeOpacity);
4812
+ const strokeDash = chunkVKOVFVDJ_js.normalizeStrokeDashType(element.shapeStyle?.strokeDash);
4813
+ const fillGradient = chunkVKOVFVDJ_js.buildCssGradientFromShapeStyle(element.shapeStyle) || element.shapeStyle?.fillGradient;
4814
+ const shadowCss = chunkVKOVFVDJ_js.buildShadowCssFromShapeStyle(element.shapeStyle);
4815
+ const innerShadowCss = chunkVKOVFVDJ_js.buildInnerShadowCssFromShapeStyle(element.shapeStyle);
4816
+ const resolvedFillColor = chunkVKOVFVDJ_js.colorWithOpacity(fillColor, fillOpacity);
4817
+ const resolvedStrokeColor = chunkVKOVFVDJ_js.colorWithOpacity(strokeColor, strokeOpacity);
4782
4818
  const ss = element.shapeStyle;
4783
4819
  const combinedShadowParts = [];
4784
- const multiLayerShadow = chunk275WERXZ_js.buildMultiLayerShadowCss(element.shapeStyle);
4820
+ const multiLayerShadow = chunkVKOVFVDJ_js.buildMultiLayerShadowCss(element.shapeStyle);
4785
4821
  if (multiLayerShadow) {
4786
4822
  combinedShadowParts.push(multiLayerShadow);
4787
4823
  } else if (shadowCss) {
@@ -4790,7 +4826,7 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
4790
4826
  if (innerShadowCss) {
4791
4827
  combinedShadowParts.push(innerShadowCss);
4792
4828
  }
4793
- const glowBoxShadow = chunk275WERXZ_js.buildGlowBoxShadow(ss?.glowColor, ss?.glowRadius, ss?.glowOpacity);
4829
+ const glowBoxShadow = chunkVKOVFVDJ_js.buildGlowBoxShadow(ss?.glowColor, ss?.glowRadius, ss?.glowOpacity);
4794
4830
  if (glowBoxShadow) {
4795
4831
  combinedShadowParts.push(glowBoxShadow);
4796
4832
  }
@@ -4798,7 +4834,7 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
4798
4834
  if (lineShadow) {
4799
4835
  combinedShadowParts.push(lineShadow);
4800
4836
  }
4801
- const compoundLineShadow = chunk275WERXZ_js.getCompoundLineBoxShadow(
4837
+ const compoundLineShadow = chunkVKOVFVDJ_js.getCompoundLineBoxShadow(
4802
4838
  element.shapeStyle?.compoundLine,
4803
4839
  strokeWidth,
4804
4840
  resolvedStrokeColor
@@ -4811,7 +4847,7 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
4811
4847
  if (ss?.glowColor && ss.glowColor !== "transparent" && ss.glowRadius) {
4812
4848
  const glowOpacity = typeof ss.glowOpacity === "number" ? ss.glowOpacity : 0.75;
4813
4849
  const glowRad = Math.round(Math.max(0, ss.glowRadius));
4814
- const glowCol = chunk275WERXZ_js.colorWithOpacity(chunk275WERXZ_js.normalizeHexColor(ss.glowColor, "#ffff00"), glowOpacity);
4850
+ const glowCol = chunkVKOVFVDJ_js.colorWithOpacity(chunkVKOVFVDJ_js.normalizeHexColor(ss.glowColor, "#ffff00"), glowOpacity);
4815
4851
  filterParts.push(`drop-shadow(0 0 ${glowRad}px ${glowCol})`);
4816
4852
  }
4817
4853
  if (typeof ss?.softEdgeRadius === "number" && ss.softEdgeRadius > 0) {
@@ -4824,12 +4860,12 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
4824
4860
  if (lineGlowCss) {
4825
4861
  filterParts.push(lineGlowCss);
4826
4862
  }
4827
- const dagFilter = chunk275WERXZ_js.getEffectDagFilter(ss, element.id);
4863
+ const dagFilter = chunkVKOVFVDJ_js.getEffectDagFilter(ss, element.id);
4828
4864
  if (dagFilter) {
4829
4865
  filterParts.push(dagFilter);
4830
4866
  }
4831
4867
  const lineJoinCss = ss?.lineJoin === "round" ? "round" : ss?.lineJoin === "bevel" ? "bevel" : void 0;
4832
- const patternFill = chunk275WERXZ_js.buildPatternFillCss(element.shapeStyle);
4868
+ const patternFill = chunkVKOVFVDJ_js.buildPatternFillCss(element.shapeStyle);
4833
4869
  const imageFillUrl = ss?.fillMode === "image" && ss.fillImageUrl ? ss.fillImageUrl : void 0;
4834
4870
  const imageFillMode = ss?.fillImageMode || "stretch";
4835
4871
  let reflectCss;
@@ -4841,7 +4877,7 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
4841
4877
  const endOpacity = typeof ss.reflectionEndOpacity === "number" ? ss.reflectionEndOpacity : 0;
4842
4878
  const fadeLength = typeof ss.reflectionEndPosition === "number" ? Math.round(ss.reflectionEndPosition * Math.max(element.height, 1)) : 100;
4843
4879
  const blurRadius = typeof ss.reflectionBlurRadius === "number" ? ss.reflectionBlurRadius : 0;
4844
- reflectCss = chunk275WERXZ_js.buildReflectionCss(distance, startOpacity, endOpacity, fadeLength, blurRadius);
4880
+ reflectCss = chunkVKOVFVDJ_js.buildReflectionCss(distance, startOpacity, endOpacity, fadeLength, blurRadius);
4845
4881
  }
4846
4882
  }
4847
4883
  const base = {
@@ -4855,9 +4891,9 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
4855
4891
  filter: filterParts.length > 0 ? filterParts.join(" ") : void 0,
4856
4892
  opacity: typeof ss?.dagAlphaModFix === "number" ? Math.max(0, Math.min(1, ss.dagAlphaModFix / 100)) : void 0,
4857
4893
  mixBlendMode: mapDagBlendModeToCss(ss?.dagFillOverlayBlend),
4858
- borderWidth: strokeWidth > 0 ? chunk275WERXZ_js.getCompoundLineBorderWidth(ss?.compoundLine, strokeWidth) : void 0,
4894
+ borderWidth: strokeWidth > 0 ? chunkVKOVFVDJ_js.getCompoundLineBorderWidth(ss?.compoundLine, strokeWidth) : void 0,
4859
4895
  borderColor: strokeWidth > 0 ? resolvedStrokeColor : void 0,
4860
- borderStyle: strokeWidth > 0 ? chunk275WERXZ_js.getCssBorderDashStyle(strokeDash, ss?.compoundLine) : void 0,
4896
+ borderStyle: strokeWidth > 0 ? chunkVKOVFVDJ_js.getCssBorderDashStyle(strokeDash, ss?.compoundLine) : void 0,
4861
4897
  strokeLinejoin: lineJoinCss,
4862
4898
  strokeLinecap: ss?.lineCap === "rnd" ? "round" : ss?.lineCap === "sq" ? "square" : void 0
4863
4899
  };
@@ -4898,7 +4934,7 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
4898
4934
  borderWidth: 0,
4899
4935
  borderTopWidth: Math.max(strokeWidth, 2),
4900
4936
  borderTopColor: resolvedStrokeColor,
4901
- borderTopStyle: chunk275WERXZ_js.getCssBorderDashStyle(strokeDash)
4937
+ borderTopStyle: chunkVKOVFVDJ_js.getCssBorderDashStyle(strokeDash)
4902
4938
  };
4903
4939
  }
4904
4940
  if (normalizedShapeType === "cylinder") {
@@ -4912,13 +4948,13 @@ function getShapeVisualStyle(element, hasFill, fillColor, strokeWidth, strokeCol
4912
4948
  function getConnectorAdjustment(element, key, fallback) {
4913
4949
  const direct = element.shapeAdjustments?.[key];
4914
4950
  if (typeof direct === "number" && Number.isFinite(direct)) {
4915
- return chunk275WERXZ_js.clampUnitInterval(direct / 1e5);
4951
+ return chunkVKOVFVDJ_js.clampUnitInterval(direct / 1e5);
4916
4952
  }
4917
4953
  const fallbackKey = element.shapeAdjustments?.adj;
4918
4954
  if (typeof fallbackKey === "number" && Number.isFinite(fallbackKey)) {
4919
- return chunk275WERXZ_js.clampUnitInterval(fallbackKey / 1e5);
4955
+ return chunkVKOVFVDJ_js.clampUnitInterval(fallbackKey / 1e5);
4920
4956
  }
4921
- return chunk275WERXZ_js.clampUnitInterval(fallback);
4957
+ return chunkVKOVFVDJ_js.clampUnitInterval(fallback);
4922
4958
  }
4923
4959
  function getConnectorPathGeometry(element) {
4924
4960
  const width = Math.max(element.width, 1);
@@ -5049,10 +5085,10 @@ function renderVectorShape(element, hasFill, fillColor, strokeWidth, strokeColor
5049
5085
  return null;
5050
5086
  }
5051
5087
  const normalizedType = (element.shapeType || "").toLowerCase();
5052
- const fillPaint = chunk275WERXZ_js.colorWithOpacity(fillColor, element.shapeStyle?.fillOpacity);
5053
- const strokePaint = chunk275WERXZ_js.colorWithOpacity(strokeColor, element.shapeStyle?.strokeOpacity);
5054
- const dashType = chunk275WERXZ_js.normalizeStrokeDashType(element.shapeStyle?.strokeDash);
5055
- const dashArray = chunk275WERXZ_js.getSvgStrokeDasharray(
5088
+ const fillPaint = chunkVKOVFVDJ_js.colorWithOpacity(fillColor, element.shapeStyle?.fillOpacity);
5089
+ const strokePaint = chunkVKOVFVDJ_js.colorWithOpacity(strokeColor, element.shapeStyle?.strokeOpacity);
5090
+ const dashType = chunkVKOVFVDJ_js.normalizeStrokeDashType(element.shapeStyle?.strokeDash);
5091
+ const dashArray = chunkVKOVFVDJ_js.getSvgStrokeDasharray(
5056
5092
  dashType,
5057
5093
  Math.max(strokeWidth, 1),
5058
5094
  element.shapeStyle?.customDashSegments
@@ -5211,8 +5247,8 @@ function renderVectorShape(element, hasFill, fillColor, strokeWidth, strokeColor
5211
5247
  const endArrowL = element.shapeStyle?.connectorEndArrowLength;
5212
5248
  const compoundLine = element.shapeStyle?.compoundLine;
5213
5249
  const hitTargetWidth = Math.max(strokeWidth * 3, 12);
5214
- const offsets = chunk275WERXZ_js.getCompoundLineOffsets(compoundLine, strokeWidth);
5215
- const widths = chunk275WERXZ_js.getCompoundLineWidths(compoundLine, strokeWidth);
5250
+ const offsets = chunkVKOVFVDJ_js.getCompoundLineOffsets(compoundLine, strokeWidth);
5251
+ const widths = chunkVKOVFVDJ_js.getCompoundLineWidths(compoundLine, strokeWidth);
5216
5252
  return /* @__PURE__ */ jsxRuntime.jsxs(
5217
5253
  "svg",
5218
5254
  {
@@ -5275,7 +5311,7 @@ function getImageMaskStyle(element) {
5275
5311
  }
5276
5312
  const normalized = shapeType.toLowerCase();
5277
5313
  if (normalized === "roundrect" || normalized === "round1rect" || normalized === "round2samerect" || normalized === "round2diagrect" || normalized === "sniproundrect" || normalized === "snip1rect" || normalized === "snip2diagrect") {
5278
- const radiusPx = chunk275WERXZ_js.getRoundRectRadiusPx(element);
5314
+ const radiusPx = chunkVKOVFVDJ_js.getRoundRectRadiusPx(element);
5279
5315
  if (radiusPx <= 0.01) {
5280
5316
  return void 0;
5281
5317
  }
@@ -5287,7 +5323,7 @@ function getImageMaskStyle(element) {
5287
5323
  if (normalized === "can" || normalized === "cylinder") {
5288
5324
  return { borderRadius: "48% / 12%" };
5289
5325
  }
5290
- const clipPath = chunk275WERXZ_js.getResolvedShapeClipPath(element);
5326
+ const clipPath = chunkVKOVFVDJ_js.getResolvedShapeClipPath(element);
5291
5327
  if (!clipPath) {
5292
5328
  return void 0;
5293
5329
  }
@@ -5303,10 +5339,10 @@ function getImageRenderStyle(element) {
5303
5339
  objectFit: "cover"
5304
5340
  };
5305
5341
  }
5306
- const cropLeft = chunk275WERXZ_js.clampCropValue(element.cropLeft);
5307
- const cropTop = chunk275WERXZ_js.clampCropValue(element.cropTop);
5308
- const cropRight = chunk275WERXZ_js.clampCropValue(element.cropRight);
5309
- const cropBottom = chunk275WERXZ_js.clampCropValue(element.cropBottom);
5342
+ const cropLeft = chunkVKOVFVDJ_js.clampCropValue(element.cropLeft);
5343
+ const cropTop = chunkVKOVFVDJ_js.clampCropValue(element.cropTop);
5344
+ const cropRight = chunkVKOVFVDJ_js.clampCropValue(element.cropRight);
5345
+ const cropBottom = chunkVKOVFVDJ_js.clampCropValue(element.cropBottom);
5310
5346
  const hasCrop = cropLeft + cropRight > 1e-4 || cropTop + cropBottom > 1e-4;
5311
5347
  if (!hasCrop) {
5312
5348
  return {
@@ -5318,10 +5354,10 @@ function getImageRenderStyle(element) {
5318
5354
  }
5319
5355
  const safeHorizontalScale = cropLeft + cropRight >= 0.99 ? 0.99 / (cropLeft + cropRight) : 1;
5320
5356
  const safeVerticalScale = cropTop + cropBottom >= 0.99 ? 0.99 / (cropTop + cropBottom) : 1;
5321
- const normalizedLeft = chunk275WERXZ_js.clampCropValue(cropLeft * safeHorizontalScale);
5322
- const normalizedRight = chunk275WERXZ_js.clampCropValue(cropRight * safeHorizontalScale);
5323
- const normalizedTop = chunk275WERXZ_js.clampCropValue(cropTop * safeVerticalScale);
5324
- const normalizedBottom = chunk275WERXZ_js.clampCropValue(cropBottom * safeVerticalScale);
5357
+ const normalizedLeft = chunkVKOVFVDJ_js.clampCropValue(cropLeft * safeHorizontalScale);
5358
+ const normalizedRight = chunkVKOVFVDJ_js.clampCropValue(cropRight * safeHorizontalScale);
5359
+ const normalizedTop = chunkVKOVFVDJ_js.clampCropValue(cropTop * safeVerticalScale);
5360
+ const normalizedBottom = chunkVKOVFVDJ_js.clampCropValue(cropBottom * safeVerticalScale);
5325
5361
  const remainingWidth = Math.max(0.01, 1 - normalizedLeft - normalizedRight);
5326
5362
  const remainingHeight = Math.max(0.01, 1 - normalizedTop - normalizedBottom);
5327
5363
  const tx = Math.round(-normalizedLeft / remainingWidth * 1e4) / 100;
@@ -5461,9 +5497,9 @@ function parseGradientFillCss(gradFill) {
5461
5497
  }
5462
5498
  const parsed = stops.map((gs) => {
5463
5499
  const pos = Number.parseInt(String(gs["@_pos"] || "0"), 10) / 1e3;
5464
- const color = chunk275WERXZ_js.parseDrawingColor(gs) ?? "#888888";
5465
- const opacity = chunk275WERXZ_js.parseDrawingColorOpacity(gs);
5466
- return { pos, color: chunk275WERXZ_js.colorWithOpacity(color, opacity) };
5500
+ const color = chunkVKOVFVDJ_js.parseDrawingColor(gs) ?? "#888888";
5501
+ const opacity = chunkVKOVFVDJ_js.parseDrawingColorOpacity(gs);
5502
+ return { pos, color: chunkVKOVFVDJ_js.colorWithOpacity(color, opacity) };
5467
5503
  }).sort((a, b) => a.pos - b.pos);
5468
5504
  const stopStrings = parsed.map((s) => `${s.color} ${s.pos.toFixed(1)}%`).join(", ");
5469
5505
  const lin = gradFill["a:lin"];
@@ -5504,8 +5540,8 @@ function parsePatternFillCss(pattFill) {
5504
5540
  if (!pattFill) {
5505
5541
  return void 0;
5506
5542
  }
5507
- const fgColor = chunk275WERXZ_js.parseDrawingColor(pattFill["a:fgClr"]) ?? "#000000";
5508
- const bgColor = chunk275WERXZ_js.parseDrawingColor(pattFill["a:bgClr"]) ?? "#ffffff";
5543
+ const fgColor = chunkVKOVFVDJ_js.parseDrawingColor(pattFill["a:fgClr"]) ?? "#000000";
5544
+ const bgColor = chunkVKOVFVDJ_js.parseDrawingColor(pattFill["a:bgClr"]) ?? "#ffffff";
5509
5545
  const preset = String(pattFill["@_prst"] || "ltDnDiag");
5510
5546
  switch (preset) {
5511
5547
  case "ltHorz":
@@ -5616,11 +5652,11 @@ function parseCellBorders(cellProperties) {
5616
5652
  const prstDash = ln["a:prstDash"];
5617
5653
  const dashVal = prstDash ? String(prstDash["@_val"] || "") : void 0;
5618
5654
  const cssBorderStyle = ooxmlDashToCss(dashVal);
5619
- const color = chunk275WERXZ_js.parseDrawingColor(ln["a:solidFill"]);
5655
+ const color = chunkVKOVFVDJ_js.parseDrawingColor(ln["a:solidFill"]);
5620
5656
  if (color) {
5621
- const opacity = chunk275WERXZ_js.parseDrawingColorOpacity(ln["a:solidFill"]);
5657
+ const opacity = chunkVKOVFVDJ_js.parseDrawingColorOpacity(ln["a:solidFill"]);
5622
5658
  const key = `${edge.prefix}`;
5623
- borderStyle[key] = `${widthPx}px ${cssBorderStyle} ${chunk275WERXZ_js.colorWithOpacity(color, opacity)}`;
5659
+ borderStyle[key] = `${widthPx}px ${cssBorderStyle} ${chunkVKOVFVDJ_js.colorWithOpacity(color, opacity)}`;
5624
5660
  }
5625
5661
  }
5626
5662
  return borderStyle;
@@ -5633,7 +5669,7 @@ function parseCellTextEffects(runProps) {
5633
5669
  const textShadowParts = [];
5634
5670
  const outerShdw = effectLst["a:outerShdw"];
5635
5671
  if (outerShdw) {
5636
- const shdwColor = chunk275WERXZ_js.parseDrawingColor(outerShdw);
5672
+ const shdwColor = chunkVKOVFVDJ_js.parseDrawingColor(outerShdw);
5637
5673
  if (shdwColor) {
5638
5674
  const blurRad = Number.parseInt(String(outerShdw["@_blurRad"] || "0"), 10);
5639
5675
  const blurPx = blurRad > 0 ? Math.round(blurRad / 12700) : 0;
@@ -5651,7 +5687,7 @@ function parseCellTextEffects(runProps) {
5651
5687
  }
5652
5688
  const glow = effectLst["a:glow"];
5653
5689
  if (glow) {
5654
- const glowColor = chunk275WERXZ_js.parseDrawingColor(glow);
5690
+ const glowColor = chunkVKOVFVDJ_js.parseDrawingColor(glow);
5655
5691
  if (glowColor) {
5656
5692
  const glowRad = Number.parseInt(String(glow["@_rad"] || "0"), 10);
5657
5693
  const glowPx = glowRad > 0 ? Math.round(glowRad / 12700) : 2;
@@ -5730,10 +5766,10 @@ function extractTableCellStyle(cellXml, fallbackStyle, schemeColorOverrides) {
5730
5766
  if (runProps?.["@_u"] !== void 0) {
5731
5767
  cellStyle.textDecorationLine = runProps["@_u"] === "sng" ? "underline" : "none";
5732
5768
  }
5733
- const runColor = chunk275WERXZ_js.parseDrawingColor(runProps?.["a:solidFill"], schemeColorOverrides) || chunk275WERXZ_js.parseDrawingColor(runProps?.["a:highlight"], schemeColorOverrides);
5769
+ const runColor = chunkVKOVFVDJ_js.parseDrawingColor(runProps?.["a:solidFill"], schemeColorOverrides) || chunkVKOVFVDJ_js.parseDrawingColor(runProps?.["a:highlight"], schemeColorOverrides);
5734
5770
  if (runColor) {
5735
- const opacity = chunk275WERXZ_js.parseDrawingColorOpacity(runProps?.["a:solidFill"]);
5736
- cellStyle.color = chunk275WERXZ_js.colorWithOpacity(runColor, opacity);
5771
+ const opacity = chunkVKOVFVDJ_js.parseDrawingColorOpacity(runProps?.["a:solidFill"]);
5772
+ cellStyle.color = chunkVKOVFVDJ_js.colorWithOpacity(runColor, opacity);
5737
5773
  }
5738
5774
  const fontFamily = runProps?.["a:latin"]?.["@_typeface"] || runProps?.["a:ea"]?.["@_typeface"] || runProps?.["a:cs"]?.["@_typeface"];
5739
5775
  if (fontFamily) {
@@ -5743,15 +5779,15 @@ function extractTableCellStyle(cellXml, fallbackStyle, schemeColorOverrides) {
5743
5779
  cellStyle.textAlign = parseParagraphAlignment(paragraphProperties["@_algn"]);
5744
5780
  }
5745
5781
  const cellProperties = cellXml["a:tcPr"];
5746
- const cellFill = chunk275WERXZ_js.parseDrawingColor(
5782
+ const cellFill = chunkVKOVFVDJ_js.parseDrawingColor(
5747
5783
  cellProperties?.["a:solidFill"],
5748
5784
  schemeColorOverrides
5749
5785
  );
5750
5786
  if (cellFill) {
5751
- const opacity = chunk275WERXZ_js.parseDrawingColorOpacity(
5787
+ const opacity = chunkVKOVFVDJ_js.parseDrawingColorOpacity(
5752
5788
  cellProperties?.["a:solidFill"]
5753
5789
  );
5754
- cellStyle.backgroundColor = chunk275WERXZ_js.colorWithOpacity(cellFill, opacity);
5790
+ cellStyle.backgroundColor = chunkVKOVFVDJ_js.colorWithOpacity(cellFill, opacity);
5755
5791
  } else {
5756
5792
  const gradCss = parseGradientFillCss(cellProperties?.["a:gradFill"]);
5757
5793
  if (gradCss) {
@@ -5766,16 +5802,16 @@ function extractTableCellStyle(cellXml, fallbackStyle, schemeColorOverrides) {
5766
5802
  const edgeBorders = parseCellBorders(cellProperties);
5767
5803
  Object.assign(cellStyle, edgeBorders);
5768
5804
  if (!cellStyle.borderLeftColor && !cellStyle.borderRightColor && !cellStyle.borderTopColor && !cellStyle.borderBottomColor) {
5769
- const borderColor = chunk275WERXZ_js.parseDrawingColor(
5805
+ const borderColor = chunkVKOVFVDJ_js.parseDrawingColor(
5770
5806
  cellProperties?.["a:lnL"]?.["a:solidFill"],
5771
5807
  schemeColorOverrides
5772
- ) || chunk275WERXZ_js.parseDrawingColor(
5808
+ ) || chunkVKOVFVDJ_js.parseDrawingColor(
5773
5809
  cellProperties?.["a:lnR"]?.["a:solidFill"],
5774
5810
  schemeColorOverrides
5775
- ) || chunk275WERXZ_js.parseDrawingColor(
5811
+ ) || chunkVKOVFVDJ_js.parseDrawingColor(
5776
5812
  cellProperties?.["a:lnT"]?.["a:solidFill"],
5777
5813
  schemeColorOverrides
5778
- ) || chunk275WERXZ_js.parseDrawingColor(
5814
+ ) || chunkVKOVFVDJ_js.parseDrawingColor(
5779
5815
  cellProperties?.["a:lnB"]?.["a:solidFill"],
5780
5816
  schemeColorOverrides
5781
5817
  );
@@ -5854,10 +5890,10 @@ function resolveTableStyleFillColor(fill, colorScheme) {
5854
5890
  }
5855
5891
  let color = base;
5856
5892
  if (fill.tint !== void 0 && fill.tint > 0) {
5857
- color = chunk275WERXZ_js.tintColor2(color, fill.tint / 1e5);
5893
+ color = chunkVKOVFVDJ_js.tintColor2(color, fill.tint / 1e5);
5858
5894
  }
5859
5895
  if (fill.shade !== void 0 && fill.shade > 0) {
5860
- color = chunk275WERXZ_js.shadeColor2(color, 1 - fill.shade / 1e5);
5896
+ color = chunkVKOVFVDJ_js.shadeColor2(color, 1 - fill.shade / 1e5);
5861
5897
  }
5862
5898
  return color;
5863
5899
  }
@@ -5879,10 +5915,10 @@ function applyTableStyleText(text, colorScheme, style) {
5879
5915
  if (base) {
5880
5916
  let color = base;
5881
5917
  if (text.fontTint !== void 0 && text.fontTint > 0) {
5882
- color = chunk275WERXZ_js.tintColor2(color, text.fontTint / 1e5);
5918
+ color = chunkVKOVFVDJ_js.tintColor2(color, text.fontTint / 1e5);
5883
5919
  }
5884
5920
  if (text.fontShade !== void 0 && text.fontShade > 0) {
5885
- color = chunk275WERXZ_js.shadeColor2(color, 1 - text.fontShade / 1e5);
5921
+ color = chunkVKOVFVDJ_js.shadeColor2(color, 1 - text.fontShade / 1e5);
5886
5922
  }
5887
5923
  style.color = color;
5888
5924
  applied = true;
@@ -6164,9 +6200,9 @@ function cellStyleToCss(style) {
6164
6200
  if (style.gradientFillCss) {
6165
6201
  css.background = style.gradientFillCss;
6166
6202
  } else if (style.fillMode === "pattern" && style.patternFillPreset) {
6167
- const fg = chunk275WERXZ_js.normalizeHexColor(style.patternFillForeground, "#000000");
6168
- const bg = chunk275WERXZ_js.normalizeHexColor(style.patternFillBackground, "#ffffff");
6169
- const svgPattern = chunk275WERXZ_js.getPatternSvg(style.patternFillPreset, fg, bg);
6203
+ const fg = chunkVKOVFVDJ_js.normalizeHexColor(style.patternFillForeground, "#000000");
6204
+ const bg = chunkVKOVFVDJ_js.normalizeHexColor(style.patternFillBackground, "#ffffff");
6205
+ const svgPattern = chunkVKOVFVDJ_js.getPatternSvg(style.patternFillPreset, fg, bg);
6170
6206
  if (svgPattern) {
6171
6207
  const encoded = encodeURIComponent(svgPattern);
6172
6208
  css.backgroundImage = `url("data:image/svg+xml,${encoded}")`;
@@ -6235,7 +6271,7 @@ function cellStyleToCss(style) {
6235
6271
  if (edge.width || edge.color) {
6236
6272
  const w = edge.width ?? 1;
6237
6273
  const c = edge.color ?? style.borderColor ?? "#000000";
6238
- const s = chunk275WERXZ_js.ooxmlDashToCssBorderStyle(edge.dash);
6274
+ const s = chunkVKOVFVDJ_js.ooxmlDashToCssBorderStyle(edge.dash);
6239
6275
  css[edge.prefix] = `${w}px ${s} ${c}`;
6240
6276
  }
6241
6277
  }
@@ -6277,7 +6313,7 @@ function TableResizeOverlay({
6277
6313
  const containerRef = React3.useRef(null);
6278
6314
  const [rowBounds, setRowBounds] = React3.useState([]);
6279
6315
  const dragRef = React3.useRef(null);
6280
- const colBoundaries = React3.useMemo(() => chunk275WERXZ_js.computeColumnBoundaries(columnWidths), [columnWidths]);
6316
+ const colBoundaries = React3.useMemo(() => chunkVKOVFVDJ_js.computeColumnBoundaries(columnWidths), [columnWidths]);
6281
6317
  const measureRows = React3.useCallback(() => {
6282
6318
  const container = containerRef.current;
6283
6319
  if (!container) {
@@ -6324,11 +6360,11 @@ function TableResizeOverlay({
6324
6360
  const rect = containerRef.current.getBoundingClientRect();
6325
6361
  if (drag.type === "col" && drag.initialWidths && onResizeColumns) {
6326
6362
  const deltaProp = (e.clientX - drag.startPos) / rect.width;
6327
- onResizeColumns(chunk275WERXZ_js.computeResizedColumnWidths(drag.initialWidths, drag.index, deltaProp));
6363
+ onResizeColumns(chunkVKOVFVDJ_js.computeResizedColumnWidths(drag.initialWidths, drag.index, deltaProp));
6328
6364
  } else if (drag.type === "row" && onResizeRow) {
6329
6365
  const deltaY = e.clientY - drag.startPos;
6330
- const newHeight = chunk275WERXZ_js.computeResizedRowHeight(
6331
- drag.initialRowHeight ?? chunk275WERXZ_js.DEFAULT_ROW_HEIGHT,
6366
+ const newHeight = chunkVKOVFVDJ_js.computeResizedRowHeight(
6367
+ drag.initialRowHeight ?? chunkVKOVFVDJ_js.DEFAULT_ROW_HEIGHT,
6332
6368
  deltaY
6333
6369
  );
6334
6370
  onResizeRow(drag.index, newHeight);
@@ -6366,7 +6402,7 @@ function TableResizeOverlay({
6366
6402
  e.stopPropagation();
6367
6403
  const table = containerRef.current?.querySelector("table");
6368
6404
  const tr = table?.querySelectorAll("tbody > tr")[index];
6369
- const actualHeight = tr?.offsetHeight ?? chunk275WERXZ_js.DEFAULT_ROW_HEIGHT;
6405
+ const actualHeight = tr?.offsetHeight ?? chunkVKOVFVDJ_js.DEFAULT_ROW_HEIGHT;
6370
6406
  document.body.style.cursor = "row-resize";
6371
6407
  document.body.style.userSelect = "none";
6372
6408
  dragRef.current = {
@@ -6412,7 +6448,7 @@ function renderTableFromTableData(element, textStyle, options) {
6412
6448
  }
6413
6449
  const first = selectedCell.selectedCells[0];
6414
6450
  const last = selectedCell.selectedCells[selectedCell.selectedCells.length - 1];
6415
- return chunk275WERXZ_js.computeSelectionRect(first.row, first.col, last.row, last.col, tableData);
6451
+ return chunkVKOVFVDJ_js.computeSelectionRect(first.row, first.col, last.row, last.col, tableData);
6416
6452
  })();
6417
6453
  return /* @__PURE__ */ jsxRuntime.jsx(
6418
6454
  TableResizeOverlay,
@@ -6445,7 +6481,7 @@ function renderTableFromTableData(element, textStyle, options) {
6445
6481
  return null;
6446
6482
  }
6447
6483
  const isCellSelected = selectedCell?.rowIndex === rowIndex && selectedCell?.columnIndex === cellIndex;
6448
- const isInMultiSelection = chunk275WERXZ_js.isCellInRect(rowIndex, cellIndex, selectionRect);
6484
+ const isInMultiSelection = chunkVKOVFVDJ_js.isCellInRect(rowIndex, cellIndex, selectionRect);
6449
6485
  const isCellEditing = isCellSelected && selectedCell?.isEditing;
6450
6486
  return /* @__PURE__ */ jsxRuntime.jsx(
6451
6487
  "td",
@@ -6468,7 +6504,7 @@ function renderTableFromTableData(element, textStyle, options) {
6468
6504
  }
6469
6505
  event.stopPropagation();
6470
6506
  if (event.shiftKey && selectedCell) {
6471
- const rect = chunk275WERXZ_js.computeSelectionRect(
6507
+ const rect = chunkVKOVFVDJ_js.computeSelectionRect(
6472
6508
  selectedCell.rowIndex,
6473
6509
  selectedCell.columnIndex,
6474
6510
  rowIndex,
@@ -6478,7 +6514,7 @@ function renderTableFromTableData(element, textStyle, options) {
6478
6514
  options?.onSelectCell?.({
6479
6515
  rowIndex: selectedCell.rowIndex,
6480
6516
  columnIndex: selectedCell.columnIndex,
6481
- selectedCells: chunk275WERXZ_js.rectToCells(rect)
6517
+ selectedCells: chunkVKOVFVDJ_js.rectToCells(rect)
6482
6518
  });
6483
6519
  } else {
6484
6520
  options?.onSelectCell?.({
@@ -6537,7 +6573,7 @@ function renderTableElement(element, textStyle, options) {
6537
6573
  if (tableEl2.tableData && tableEl2.tableData.rows.length > 0) {
6538
6574
  return renderTableFromTableData(tableEl2, textStyle, options);
6539
6575
  }
6540
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunkZISXRMDJ_js.translationsEn["pptx.table.title"] });
6576
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk2EFVXYNA_js.translationsEn["pptx.table.title"] });
6541
6577
  }
6542
6578
  const selectedCell = options?.selectedCell || null;
6543
6579
  const isEditable2 = Boolean(options?.editable);
@@ -6552,7 +6588,7 @@ function renderTableElement(element, textStyle, options) {
6552
6588
  }
6553
6589
  const first = selectedCell.selectedCells[0];
6554
6590
  const last = selectedCell.selectedCells[selectedCell.selectedCells.length - 1];
6555
- return chunk275WERXZ_js.computeSelectionRect(first.row, first.col, last.row, last.col, tableEl.tableData);
6591
+ return chunkVKOVFVDJ_js.computeSelectionRect(first.row, first.col, last.row, last.col, tableEl.tableData);
6556
6592
  })();
6557
6593
  const schemeOverrides = options?.styleCtx?.theme?.colorScheme ? options.styleCtx.theme.colorScheme : void 0;
6558
6594
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -6617,7 +6653,7 @@ function renderTableElement(element, textStyle, options) {
6617
6653
  "border px-1 py-0.5 align-top",
6618
6654
  isEditable2 && hasCellSelectionHandler ? "border-blue-200/70 cursor-cell" : "border-white/30",
6619
6655
  selectedCell?.rowIndex === rowIndex && selectedCell?.columnIndex === cellIndex ? "ring-1 ring-inset ring-blue-500" : null,
6620
- chunk275WERXZ_js.isCellInRect(rowIndex, cellIndex, xmlSelectionRect) && !(selectedCell?.rowIndex === rowIndex && selectedCell?.columnIndex === cellIndex) ? "bg-blue-500/15 ring-1 ring-inset ring-blue-400/50" : null
6656
+ chunkVKOVFVDJ_js.isCellInRect(rowIndex, cellIndex, xmlSelectionRect) && !(selectedCell?.rowIndex === rowIndex && selectedCell?.columnIndex === cellIndex) ? "bg-blue-500/15 ring-1 ring-inset ring-blue-400/50" : null
6621
6657
  ),
6622
6658
  colSpan,
6623
6659
  rowSpan: rSpan,
@@ -6628,7 +6664,7 @@ function renderTableElement(element, textStyle, options) {
6628
6664
  }
6629
6665
  event.stopPropagation();
6630
6666
  if (event.shiftKey && selectedCell && tableEl.tableData) {
6631
- const rect = chunk275WERXZ_js.computeSelectionRect(
6667
+ const rect = chunkVKOVFVDJ_js.computeSelectionRect(
6632
6668
  selectedCell.rowIndex,
6633
6669
  selectedCell.columnIndex,
6634
6670
  rowIndex,
@@ -6638,7 +6674,7 @@ function renderTableElement(element, textStyle, options) {
6638
6674
  options?.onSelectCell?.({
6639
6675
  rowIndex: selectedCell.rowIndex,
6640
6676
  columnIndex: selectedCell.columnIndex,
6641
- selectedCells: chunk275WERXZ_js.rectToCells(rect)
6677
+ selectedCells: chunkVKOVFVDJ_js.rectToCells(rect)
6642
6678
  });
6643
6679
  } else {
6644
6680
  options?.onSelectCell?.({
@@ -6690,24 +6726,24 @@ function renderTableElement(element, textStyle, options) {
6690
6726
  }
6691
6727
  var LEGEND_ITEM_WIDTH = 80;
6692
6728
  function partAttrs(part) {
6693
- return part ? chunk275WERXZ_js.chartPartToAttrs(part) : void 0;
6729
+ return part ? chunkVKOVFVDJ_js.chartPartToAttrs(part) : void 0;
6694
6730
  }
6695
6731
  function resolveReactPalette(chartData) {
6696
6732
  if (chartData.colorPalette && chartData.colorPalette.length > 0) {
6697
6733
  return chartData.colorPalette;
6698
6734
  }
6699
- return [...chunk275WERXZ_js.getChartStylePalette(chartData.style?.styleId)];
6735
+ return [...chunkVKOVFVDJ_js.getChartStylePalette(chartData.style?.styleId)];
6700
6736
  }
6701
6737
  function buildReactChartViewModel(element) {
6702
6738
  if (element.type !== "chart" || !element.chartData) {
6703
- return chunk275WERXZ_js.buildChartViewModel(element);
6739
+ return chunkVKOVFVDJ_js.buildChartViewModel(element);
6704
6740
  }
6705
6741
  const palette = resolveReactPalette(element.chartData);
6706
6742
  const themedElement = {
6707
6743
  ...element,
6708
6744
  chartData: { ...element.chartData, colorPalette: palette }
6709
6745
  };
6710
- return chunk275WERXZ_js.buildChartViewModel(themedElement);
6746
+ return chunkVKOVFVDJ_js.buildChartViewModel(themedElement);
6711
6747
  }
6712
6748
  function renderPrimitive(prim, key) {
6713
6749
  switch (prim.kind) {
@@ -7096,7 +7132,7 @@ function renderMapChart(element, chartData, categoryLabels) {
7096
7132
  const unmatchedRows = [];
7097
7133
  categories.forEach((cat, i) => {
7098
7134
  const value = values[i] ?? 0;
7099
- const code = chunk275WERXZ_js.resolveRegionCode(cat);
7135
+ const code = chunkVKOVFVDJ_js.resolveRegionCode(cat);
7100
7136
  if (code) {
7101
7137
  regionValueMap.set(code, { value, label: cat });
7102
7138
  } else {
@@ -7134,8 +7170,8 @@ function renderMapChart(element, chartData, categoryLabels) {
7134
7170
  let fill = "#e2e8f0";
7135
7171
  let dataLabel = null;
7136
7172
  if (entry) {
7137
- const t = chunk275WERXZ_js.normalizeValue(entry.value, minVal, maxVal);
7138
- fill = chunk275WERXZ_js.sequentialColorScale(t);
7173
+ const t = chunkVKOVFVDJ_js.normalizeValue(entry.value, minVal, maxVal);
7174
+ fill = chunkVKOVFVDJ_js.sequentialColorScale(t);
7139
7175
  dataLabel = /* @__PURE__ */ jsxRuntime.jsx(
7140
7176
  "text",
7141
7177
  {
@@ -7146,7 +7182,7 @@ function renderMapChart(element, chartData, categoryLabels) {
7146
7182
  fontWeight: 600,
7147
7183
  fill: "#1e293b",
7148
7184
  style: { pointerEvents: "none" },
7149
- children: chunk275WERXZ_js.formatAxisValue(entry.value)
7185
+ children: chunkVKOVFVDJ_js.formatAxisValue(entry.value)
7150
7186
  },
7151
7187
  `${element.id}-map-dl-${region.code}`
7152
7188
  );
@@ -7164,7 +7200,7 @@ function renderMapChart(element, chartData, categoryLabels) {
7164
7200
  opacity: 0.9,
7165
7201
  children: /* @__PURE__ */ jsxRuntime.jsxs("title", { children: [
7166
7202
  region.name,
7167
- entry ? `: ${chunk275WERXZ_js.formatAxisValue(entry.value)}` : ""
7203
+ entry ? `: ${chunkVKOVFVDJ_js.formatAxisValue(entry.value)}` : ""
7168
7204
  ] })
7169
7205
  }
7170
7206
  ),
@@ -7202,7 +7238,7 @@ function renderMapChart(element, chartData, categoryLabels) {
7202
7238
  fontSize: 7,
7203
7239
  fill: "#64748b",
7204
7240
  textAnchor: "middle",
7205
- children: chunk275WERXZ_js.formatAxisValue(minVal)
7241
+ children: chunkVKOVFVDJ_js.formatAxisValue(minVal)
7206
7242
  },
7207
7243
  `${element.id}-map-legend-min`
7208
7244
  ),
@@ -7214,7 +7250,7 @@ function renderMapChart(element, chartData, categoryLabels) {
7214
7250
  fontSize: 7,
7215
7251
  fill: "#64748b",
7216
7252
  textAnchor: "middle",
7217
- children: chunk275WERXZ_js.formatAxisValue(maxVal)
7253
+ children: chunkVKOVFVDJ_js.formatAxisValue(maxVal)
7218
7254
  },
7219
7255
  `${element.id}-map-legend-max`
7220
7256
  )
@@ -7233,7 +7269,7 @@ function renderMapChart(element, chartData, categoryLabels) {
7233
7269
  textAnchor: "middle",
7234
7270
  fontSize: 7,
7235
7271
  fill: "#94a3b8",
7236
- children: chunkZISXRMDJ_js.translationsEn["pptx.chart.additionalRegionsFallback"]
7272
+ children: chunk2EFVXYNA_js.translationsEn["pptx.chart.additionalRegionsFallback"]
7237
7273
  },
7238
7274
  `${element.id}-map-ft-hdr`
7239
7275
  )
@@ -7280,7 +7316,7 @@ function renderMapChart(element, chartData, categoryLabels) {
7280
7316
  y,
7281
7317
  fontSize,
7282
7318
  fill: "#475569",
7283
- children: chunk275WERXZ_js.formatAxisValue(row.value)
7319
+ children: chunkVKOVFVDJ_js.formatAxisValue(row.value)
7284
7320
  },
7285
7321
  `${element.id}-map-ft-val-${i}`
7286
7322
  )
@@ -7351,7 +7387,7 @@ function renderStackedBarChart(element, _chartData, _categoryLabels) {
7351
7387
 
7352
7388
  // src/viewer/utils/chart-overlay-utils.ts
7353
7389
  function sColor(series, idx) {
7354
- return chunk275WERXZ_js.seriesColor(series, idx);
7390
+ return chunkVKOVFVDJ_js.seriesColor(series, idx);
7355
7391
  }
7356
7392
  function valToY(val, range, topY, bottomY) {
7357
7393
  const usable = bottomY - topY;
@@ -7846,7 +7882,7 @@ function renderLegend(id, style, series, layout, colorPalette) {
7846
7882
  width: 10,
7847
7883
  height: 10,
7848
7884
  rx: 2,
7849
- fill: chunk275WERXZ_js.seriesColor(s, i, style?.styleId, colorPalette)
7885
+ fill: chunkVKOVFVDJ_js.seriesColor(s, i, style?.styleId, colorPalette)
7850
7886
  },
7851
7887
  `${id}-leg-r-${i}`
7852
7888
  )
@@ -7870,7 +7906,7 @@ function renderLegend(id, style, series, layout, colorPalette) {
7870
7906
  width: 10,
7871
7907
  height: 10,
7872
7908
  rx: 2,
7873
- fill: chunk275WERXZ_js.seriesColor(s, i, style?.styleId, colorPalette)
7909
+ fill: chunkVKOVFVDJ_js.seriesColor(s, i, style?.styleId, colorPalette)
7874
7910
  }
7875
7911
  ),
7876
7912
  /* @__PURE__ */ jsxRuntime.jsx("text", { x: x + 14, y: cy + 8, fontSize: 9, fill: "#475569", children: s.name || `Series ${i + 1}` })
@@ -7883,9 +7919,9 @@ function renderGridlines(id, style, range, layout) {
7883
7919
  }
7884
7920
  const lines = [];
7885
7921
  if (range.logScale && range.logBase) {
7886
- const ticks = chunk275WERXZ_js.generateLogTicks(range);
7922
+ const ticks = chunkVKOVFVDJ_js.generateLogTicks(range);
7887
7923
  ticks.forEach((tickVal, i) => {
7888
- const y = chunk275WERXZ_js.valueToY(tickVal, range, layout.plotTop, layout.plotBottom);
7924
+ const y = chunkVKOVFVDJ_js.valueToY(tickVal, range, layout.plotTop, layout.plotBottom);
7889
7925
  lines.push(
7890
7926
  /* @__PURE__ */ jsxRuntime.jsx(
7891
7927
  "line",
@@ -7906,7 +7942,7 @@ function renderGridlines(id, style, range, layout) {
7906
7942
  const steps = 4;
7907
7943
  for (let i = 0; i <= steps; i++) {
7908
7944
  const val = range.min + range.span * i / steps;
7909
- const y = chunk275WERXZ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
7945
+ const y = chunkVKOVFVDJ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
7910
7946
  lines.push(
7911
7947
  /* @__PURE__ */ jsxRuntime.jsx(
7912
7948
  "line",
@@ -7930,9 +7966,9 @@ function renderValueAxis(id, range, layout, axisFormatting) {
7930
7966
  const labels = [];
7931
7967
  const hasDisplayUnits = Boolean(axisFormatting?.displayUnits);
7932
7968
  if (range.logScale && range.logBase) {
7933
- const ticks = chunk275WERXZ_js.generateLogTicks(range);
7969
+ const ticks = chunkVKOVFVDJ_js.generateLogTicks(range);
7934
7970
  ticks.forEach((tickVal, i) => {
7935
- const y = chunk275WERXZ_js.valueToY(tickVal, range, layout.plotTop, layout.plotBottom);
7971
+ const y = chunkVKOVFVDJ_js.valueToY(tickVal, range, layout.plotTop, layout.plotBottom);
7936
7972
  labels.push(
7937
7973
  /* @__PURE__ */ jsxRuntime.jsx(
7938
7974
  "text",
@@ -7942,7 +7978,7 @@ function renderValueAxis(id, range, layout, axisFormatting) {
7942
7978
  textAnchor: "end",
7943
7979
  fontSize: 8,
7944
7980
  fill: "#64748b",
7945
- children: hasDisplayUnits ? chunk275WERXZ_js.formatAxisValueWithUnits(tickVal, axisFormatting) : chunk275WERXZ_js.formatAxisValue(tickVal)
7981
+ children: hasDisplayUnits ? chunkVKOVFVDJ_js.formatAxisValueWithUnits(tickVal, axisFormatting) : chunkVKOVFVDJ_js.formatAxisValue(tickVal)
7946
7982
  },
7947
7983
  `${id}-vaxis-log-${i}`
7948
7984
  )
@@ -7952,7 +7988,7 @@ function renderValueAxis(id, range, layout, axisFormatting) {
7952
7988
  const steps = 4;
7953
7989
  for (let i = 0; i <= steps; i++) {
7954
7990
  const val = range.min + range.span * i / steps;
7955
- const y = chunk275WERXZ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
7991
+ const y = chunkVKOVFVDJ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
7956
7992
  labels.push(
7957
7993
  /* @__PURE__ */ jsxRuntime.jsx(
7958
7994
  "text",
@@ -7962,7 +7998,7 @@ function renderValueAxis(id, range, layout, axisFormatting) {
7962
7998
  textAnchor: "end",
7963
7999
  fontSize: 8,
7964
8000
  fill: "#64748b",
7965
- children: hasDisplayUnits ? chunk275WERXZ_js.formatAxisValueWithUnits(val, axisFormatting) : chunk275WERXZ_js.formatAxisValue(val)
8001
+ children: hasDisplayUnits ? chunkVKOVFVDJ_js.formatAxisValueWithUnits(val, axisFormatting) : chunkVKOVFVDJ_js.formatAxisValue(val)
7966
8002
  },
7967
8003
  `${id}-vaxis-${i}`
7968
8004
  )
@@ -7970,7 +8006,7 @@ function renderValueAxis(id, range, layout, axisFormatting) {
7970
8006
  }
7971
8007
  }
7972
8008
  if (hasDisplayUnits) {
7973
- const unitLabel = chunk275WERXZ_js.getDisplayUnitLabel(
8009
+ const unitLabel = chunkVKOVFVDJ_js.getDisplayUnitLabel(
7974
8010
  axisFormatting.displayUnits,
7975
8011
  axisFormatting.displayUnitsLabel
7976
8012
  );
@@ -8045,7 +8081,7 @@ function renderZeroLine(id, range, layout) {
8045
8081
  if (range.min >= 0) {
8046
8082
  return null;
8047
8083
  }
8048
- const y = chunk275WERXZ_js.valueToY(0, range, layout.plotTop, layout.plotBottom);
8084
+ const y = chunkVKOVFVDJ_js.valueToY(0, range, layout.plotTop, layout.plotBottom);
8049
8085
  return /* @__PURE__ */ jsxRuntime.jsx(
8050
8086
  "line",
8051
8087
  {
@@ -8069,7 +8105,7 @@ function renderSecondaryValueAxis(id, range, layout, axisFormatting) {
8069
8105
  const hasDisplayUnits = Boolean(axisFormatting?.displayUnits);
8070
8106
  for (let i = 0; i <= steps; i++) {
8071
8107
  const val = range.min + range.span * i / steps;
8072
- const y = chunk275WERXZ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
8108
+ const y = chunkVKOVFVDJ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
8073
8109
  labels.push(
8074
8110
  /* @__PURE__ */ jsxRuntime.jsx(
8075
8111
  "text",
@@ -8081,7 +8117,7 @@ function renderSecondaryValueAxis(id, range, layout, axisFormatting) {
8081
8117
  fontFamily,
8082
8118
  fontWeight,
8083
8119
  fill: fontColor,
8084
- children: hasDisplayUnits ? chunk275WERXZ_js.formatAxisValueWithUnits(val, axisFormatting) : chunk275WERXZ_js.formatAxisValue(val)
8120
+ children: hasDisplayUnits ? chunkVKOVFVDJ_js.formatAxisValueWithUnits(val, axisFormatting) : chunkVKOVFVDJ_js.formatAxisValue(val)
8085
8121
  },
8086
8122
  `${id}-sec-vaxis-${i}`
8087
8123
  )
@@ -8105,7 +8141,7 @@ function renderSecondaryValueAxis(id, range, layout, axisFormatting) {
8105
8141
  );
8106
8142
  }
8107
8143
  if (hasDisplayUnits) {
8108
- const unitLabel = chunk275WERXZ_js.getDisplayUnitLabel(
8144
+ const unitLabel = chunkVKOVFVDJ_js.getDisplayUnitLabel(
8109
8145
  axisFormatting.displayUnits,
8110
8146
  axisFormatting.displayUnitsLabel
8111
8147
  );
@@ -8136,7 +8172,7 @@ function renderSecondaryAxisTicks(id, range, layout) {
8136
8172
  const ticks = [];
8137
8173
  for (let i = 0; i <= steps; i++) {
8138
8174
  const val = range.min + range.span * i / steps;
8139
- const y = chunk275WERXZ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
8175
+ const y = chunkVKOVFVDJ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
8140
8176
  ticks.push(
8141
8177
  /* @__PURE__ */ jsxRuntime.jsx(
8142
8178
  "line",
@@ -8163,7 +8199,7 @@ function renderSecondaryGridlines(id, range, layout, axisFormatting) {
8163
8199
  const gridColor = axisFormatting.majorGridlinesSpPr?.strokeColor ?? "#e2e8f0";
8164
8200
  for (let i = 0; i <= steps; i++) {
8165
8201
  const val = range.min + range.span * i / steps;
8166
- const y = chunk275WERXZ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
8202
+ const y = chunkVKOVFVDJ_js.valueToY(val, range, layout.plotTop, layout.plotBottom);
8167
8203
  lines.push(
8168
8204
  /* @__PURE__ */ jsxRuntime.jsx(
8169
8205
  "line",
@@ -8280,7 +8316,7 @@ function renderChartDataTable(elementId, chartData, svgWidth) {
8280
8316
  showK && /* @__PURE__ */ jsxRuntime.jsx(
8281
8317
  "th",
8282
8318
  {
8283
- "aria-label": chunkZISXRMDJ_js.translationsEn["pptx.chart.rowLabelsAria"],
8319
+ "aria-label": chunk2EFVXYNA_js.translationsEn["pptx.chart.rowLabelsAria"],
8284
8320
  style: {
8285
8321
  padding: "1px 4px",
8286
8322
  fontWeight: 400,
@@ -8324,7 +8360,7 @@ function renderChartDataTable(elementId, chartData, svgWidth) {
8324
8360
  width: 8,
8325
8361
  height: 8,
8326
8362
  borderRadius: 2,
8327
- backgroundColor: chunk275WERXZ_js.seriesColor(
8363
+ backgroundColor: chunkVKOVFVDJ_js.seriesColor(
8328
8364
  s,
8329
8365
  si,
8330
8366
  chartData.style?.styleId,
@@ -8363,8 +8399,8 @@ function renderChartDataTable(elementId, chartData, svgWidth) {
8363
8399
  function renderStockChart(element, chartData, categoryLabels) {
8364
8400
  const style = chartData.style;
8365
8401
  const legendPos = style?.legendPosition || "b";
8366
- const range = chunk275WERXZ_js.computeValueRangeForChart(chartData.series, chartData.axes);
8367
- const layout = chunk275WERXZ_js.computeLayout(element.width, element.height, style, true, legendPos);
8402
+ const range = chunkVKOVFVDJ_js.computeValueRangeForChart(chartData.series, chartData.axes);
8403
+ const layout = chunkVKOVFVDJ_js.computeLayout(element.width, element.height, style, true, legendPos);
8368
8404
  const catCount = Math.max(categoryLabels.length, 1);
8369
8405
  const barGroupWidth = layout.plotWidth / catCount;
8370
8406
  const candleWidth = barGroupWidth * 0.5;
@@ -8385,10 +8421,10 @@ function renderStockChart(element, chartData, categoryLabels) {
8385
8421
  const close = closeSeries.values[ci] ?? high;
8386
8422
  const isUp = close >= open;
8387
8423
  const cx = layout.plotLeft + barGroupWidth * ci + barGroupWidth / 2;
8388
- const highY = chunk275WERXZ_js.valueToY(high, range, layout.plotTop, layout.plotBottom);
8389
- const lowY = chunk275WERXZ_js.valueToY(low, range, layout.plotTop, layout.plotBottom);
8390
- const openY = chunk275WERXZ_js.valueToY(open, range, layout.plotTop, layout.plotBottom);
8391
- const closeY = chunk275WERXZ_js.valueToY(close, range, layout.plotTop, layout.plotBottom);
8424
+ const highY = chunkVKOVFVDJ_js.valueToY(high, range, layout.plotTop, layout.plotBottom);
8425
+ const lowY = chunkVKOVFVDJ_js.valueToY(low, range, layout.plotTop, layout.plotBottom);
8426
+ const openY = chunkVKOVFVDJ_js.valueToY(open, range, layout.plotTop, layout.plotBottom);
8427
+ const closeY = chunkVKOVFVDJ_js.valueToY(close, range, layout.plotTop, layout.plotBottom);
8392
8428
  elements.push(
8393
8429
  /* @__PURE__ */ jsxRuntime.jsx(
8394
8430
  "line",
@@ -8431,7 +8467,7 @@ function renderStockChart(element, chartData, categoryLabels) {
8431
8467
  textAnchor: "middle",
8432
8468
  fontSize: 7,
8433
8469
  fill: "#334155",
8434
- children: chunk275WERXZ_js.formatAxisValue(close)
8470
+ children: chunkVKOVFVDJ_js.formatAxisValue(close)
8435
8471
  },
8436
8472
  `${element.id}-stock-dl-${ci}`
8437
8473
  )
@@ -8473,7 +8509,7 @@ function FailedToLoad() {
8473
8509
  var LazySurfaceChart3DScene = React3__default.default.lazy(
8474
8510
  async () => {
8475
8511
  try {
8476
- return await import('./SurfaceChart3DScene-PBSZVNAM.js');
8512
+ return await import('./SurfaceChart3DScene-UFFJ3P6T.js');
8477
8513
  } catch {
8478
8514
  return { default: FailedToLoad };
8479
8515
  }
@@ -8497,7 +8533,7 @@ var SurfaceChart3DErrorBoundary = class extends React3__default.default.Componen
8497
8533
  function buildSurfaceData(chartData, categoryLabels) {
8498
8534
  const rows = chartData.series.length;
8499
8535
  const cols = Math.max(categoryLabels.length, 1);
8500
- const range = chunk275WERXZ_js.computeValueRangeForChart(chartData.series, chartData.axes);
8536
+ const range = chunkVKOVFVDJ_js.computeValueRangeForChart(chartData.series, chartData.axes);
8501
8537
  const heightMap = new Float32Array(rows * cols);
8502
8538
  const colorMap = new Float32Array(rows * cols * 3);
8503
8539
  for (let r = 0; r < rows; r++) {
@@ -8617,8 +8653,8 @@ function darkenRgb(r, g, b, factor) {
8617
8653
  function renderIsometricSurfaceChart(element, chartData, categoryLabels) {
8618
8654
  const style = chartData.style;
8619
8655
  const legendPos = style?.legendPosition || "b";
8620
- const layout = chunk275WERXZ_js.computeLayout(element.width, element.height, style, false, legendPos);
8621
- const range = chunk275WERXZ_js.computeValueRangeForChart(chartData.series, chartData.axes);
8656
+ const layout = chunkVKOVFVDJ_js.computeLayout(element.width, element.height, style, false, legendPos);
8657
+ const range = chunkVKOVFVDJ_js.computeValueRangeForChart(chartData.series, chartData.axes);
8622
8658
  const catCount = Math.max(categoryLabels.length, 1);
8623
8659
  const seriesCount = chartData.series.length;
8624
8660
  const cols = catCount - 1;
@@ -8708,8 +8744,8 @@ function renderIsometricSurfaceChart(element, chartData, categoryLabels) {
8708
8744
  function renderFlatSurfaceChart(element, chartData, categoryLabels) {
8709
8745
  const style = chartData.style;
8710
8746
  const legendPos = style?.legendPosition || "b";
8711
- const layout = chunk275WERXZ_js.computeLayout(element.width, element.height, style, true, legendPos);
8712
- const range = chunk275WERXZ_js.computeValueRangeForChart(chartData.series, chartData.axes);
8747
+ const layout = chunkVKOVFVDJ_js.computeLayout(element.width, element.height, style, true, legendPos);
8748
+ const range = chunkVKOVFVDJ_js.computeValueRangeForChart(chartData.series, chartData.axes);
8713
8749
  const catCount = Math.max(categoryLabels.length, 1);
8714
8750
  const seriesCount = chartData.series.length;
8715
8751
  const cellW = layout.plotWidth / Math.max(catCount - 1, 1);
@@ -8772,7 +8808,7 @@ function renderSurfaceChart(element, chartData, categoryLabels) {
8772
8808
  function renderTreemapChart(element, chartData, categoryLabels) {
8773
8809
  const style = chartData.style;
8774
8810
  const legendPos = style?.legendPosition || "b";
8775
- const layout = chunk275WERXZ_js.computeLayout(element.width, element.height, style, false, legendPos);
8811
+ const layout = chunkVKOVFVDJ_js.computeLayout(element.width, element.height, style, false, legendPos);
8776
8812
  const allValues = chartData.series.flatMap((s) => s.values);
8777
8813
  const totalAbs = allValues.reduce((sum, v) => sum + Math.abs(v), 0) || 1;
8778
8814
  const rects = [];
@@ -8795,7 +8831,7 @@ function renderTreemapChart(element, chartData, categoryLabels) {
8795
8831
  y: curY,
8796
8832
  width: Math.max(w - 1, 1),
8797
8833
  height: Math.max(h - 1, 1),
8798
- fill: chunk275WERXZ_js.paletteColor(item.index, chartData.style?.styleId, chartData.colorPalette),
8834
+ fill: chunkVKOVFVDJ_js.paletteColor(item.index, chartData.style?.styleId, chartData.colorPalette),
8799
8835
  rx: 2,
8800
8836
  opacity: 0.85
8801
8837
  },
@@ -8848,8 +8884,8 @@ function renderWaterfallChart(element, chartData, categoryLabels) {
8848
8884
  const style = chartData.style;
8849
8885
  const legendPos = style?.legendPosition || "b";
8850
8886
  const values = chartData.series[0]?.values ?? [];
8851
- const range = chunk275WERXZ_js.computeValueRangeForChart(chartData.series, chartData.axes);
8852
- const layout = chunk275WERXZ_js.computeLayout(element.width, element.height, style, true, legendPos);
8887
+ const range = chunkVKOVFVDJ_js.computeValueRangeForChart(chartData.series, chartData.axes);
8888
+ const layout = chunkVKOVFVDJ_js.computeLayout(element.width, element.height, style, true, legendPos);
8853
8889
  const catCount = Math.max(categoryLabels.length, values.length, 1);
8854
8890
  const barWidth = layout.plotWidth / catCount * 0.6;
8855
8891
  const gap = layout.plotWidth / catCount * 0.2;
@@ -8860,8 +8896,8 @@ function renderWaterfallChart(element, chartData, categoryLabels) {
8860
8896
  const isLast = i === values.length - 1;
8861
8897
  const startVal = isLast ? 0 : runningTotal;
8862
8898
  const endVal = isLast ? runningTotal + val : runningTotal + val;
8863
- const barStartY = chunk275WERXZ_js.valueToY(startVal, range, layout.plotTop, layout.plotBottom);
8864
- const barEndY = chunk275WERXZ_js.valueToY(endVal, range, layout.plotTop, layout.plotBottom);
8899
+ const barStartY = chunkVKOVFVDJ_js.valueToY(startVal, range, layout.plotTop, layout.plotBottom);
8900
+ const barEndY = chunkVKOVFVDJ_js.valueToY(endVal, range, layout.plotTop, layout.plotBottom);
8865
8901
  const x = layout.plotLeft + layout.plotWidth / catCount * i + gap;
8866
8902
  const y = Math.min(barStartY, barEndY);
8867
8903
  const h = Math.max(Math.abs(barEndY - barStartY), 1);
@@ -8890,7 +8926,7 @@ function renderWaterfallChart(element, chartData, categoryLabels) {
8890
8926
  textAnchor: "middle",
8891
8927
  fontSize: 7,
8892
8928
  fill: "#334155",
8893
- children: chunk275WERXZ_js.formatAxisValue(isLast ? endVal : val)
8929
+ children: chunkVKOVFVDJ_js.formatAxisValue(isLast ? endVal : val)
8894
8930
  },
8895
8931
  `${element.id}-wf-dl-${i}`
8896
8932
  )
@@ -8938,18 +8974,18 @@ function renderWaterfallChart(element, chartData, categoryLabels) {
8938
8974
  function renderComboChart(element, chartData, categoryLabels) {
8939
8975
  const style = chartData.style;
8940
8976
  const legendPos = style?.legendPosition || "b";
8941
- const layoutOpts = chunk275WERXZ_js.computeLayoutOptions(
8977
+ const layoutOpts = chunkVKOVFVDJ_js.computeLayoutOptions(
8942
8978
  chartData.axes,
8943
8979
  chartData.dataTable,
8944
8980
  chartData.series.length
8945
8981
  );
8946
- const layout = chunk275WERXZ_js.computeLayout(element.width, element.height, style, true, legendPos, layoutOpts);
8947
- const { primary, secondary } = chunk275WERXZ_js.splitSeriesByAxis(chartData.series, chartData.axes);
8982
+ const layout = chunkVKOVFVDJ_js.computeLayout(element.width, element.height, style, true, legendPos, layoutOpts);
8983
+ const { primary, secondary } = chunkVKOVFVDJ_js.splitSeriesByAxis(chartData.series, chartData.axes);
8948
8984
  const primarySeries = primary.length > 0 ? primary.map((e) => e.series) : chartData.series;
8949
8985
  const secondarySeries = secondary.map((e) => e.series);
8950
- const range = chunk275WERXZ_js.computeValueRangeForChart(primarySeries, chartData.axes);
8951
- const secondaryRange = secondarySeries.length > 0 ? chunk275WERXZ_js.computeValueRange(secondarySeries) : void 0;
8952
- const secondaryAxisFmt = chunk275WERXZ_js.getSecondaryValueAxis(chartData.axes);
8986
+ const range = chunkVKOVFVDJ_js.computeValueRangeForChart(primarySeries, chartData.axes);
8987
+ const secondaryRange = secondarySeries.length > 0 ? chunkVKOVFVDJ_js.computeValueRange(secondarySeries) : void 0;
8988
+ const secondaryAxisFmt = chunkVKOVFVDJ_js.getSecondaryValueAxis(chartData.axes);
8953
8989
  const catCount = Math.max(categoryLabels.length, 1);
8954
8990
  const barSeriesCount = 1;
8955
8991
  const barGroupWidth = layout.plotWidth / catCount;
@@ -8965,8 +9001,8 @@ function renderComboChart(element, chartData, categoryLabels) {
8965
9001
  const barRange = isBarSecondary && secondaryRange ? secondaryRange : range;
8966
9002
  barSeries.values.forEach((val, vi) => {
8967
9003
  const x = layout.plotLeft + barGroupWidth * vi + barOffset;
8968
- const zeroY = chunk275WERXZ_js.valueToY(0, barRange, layout.plotTop, layout.plotBottom);
8969
- const valY = chunk275WERXZ_js.valueToY(val, barRange, layout.plotTop, layout.plotBottom);
9004
+ const zeroY = chunkVKOVFVDJ_js.valueToY(0, barRange, layout.plotTop, layout.plotBottom);
9005
+ const valY = chunkVKOVFVDJ_js.valueToY(val, barRange, layout.plotTop, layout.plotBottom);
8970
9006
  const y = Math.min(zeroY, valY);
8971
9007
  const h = Math.max(Math.abs(zeroY - valY), 1);
8972
9008
  barElements.push(
@@ -8977,7 +9013,7 @@ function renderComboChart(element, chartData, categoryLabels) {
8977
9013
  y,
8978
9014
  width: barWidth,
8979
9015
  height: h,
8980
- fill: chunk275WERXZ_js.seriesColor(barSeries, 0, chartData.style?.styleId, chartData.colorPalette),
9016
+ fill: chunkVKOVFVDJ_js.seriesColor(barSeries, 0, chartData.style?.styleId, chartData.colorPalette),
8981
9017
  rx: 1
8982
9018
  },
8983
9019
  `${element.id}-combo-bar-${vi}`
@@ -8993,7 +9029,7 @@ function renderComboChart(element, chartData, categoryLabels) {
8993
9029
  textAnchor: "middle",
8994
9030
  fontSize: 7,
8995
9031
  fill: "#334155",
8996
- children: chunk275WERXZ_js.formatAxisValue(val)
9032
+ children: chunkVKOVFVDJ_js.formatAxisValue(val)
8997
9033
  },
8998
9034
  `${element.id}-combo-bar-dl-${vi}`
8999
9035
  )
@@ -9010,10 +9046,10 @@ function renderComboChart(element, chartData, categoryLabels) {
9010
9046
  const activeRange = isSecondary && secondaryRange ? secondaryRange : range;
9011
9047
  const points = series.values.map((val, vi) => {
9012
9048
  const x = layout.plotLeft + barGroupWidth * vi + barGroupWidth / 2;
9013
- const y = chunk275WERXZ_js.valueToY(val, activeRange, layout.plotTop, layout.plotBottom);
9049
+ const y = chunkVKOVFVDJ_js.valueToY(val, activeRange, layout.plotTop, layout.plotBottom);
9014
9050
  return { x, y, val };
9015
9051
  });
9016
- const c = chunk275WERXZ_js.seriesColor(series, seriesIdx, chartData.style?.styleId, chartData.colorPalette);
9052
+ const c = chunkVKOVFVDJ_js.seriesColor(series, seriesIdx, chartData.style?.styleId, chartData.colorPalette);
9017
9053
  lineElements.push(
9018
9054
  /* @__PURE__ */ jsxRuntime.jsx(
9019
9055
  "polyline",
@@ -9040,7 +9076,7 @@ function renderComboChart(element, chartData, categoryLabels) {
9040
9076
  textAnchor: "middle",
9041
9077
  fontSize: 7,
9042
9078
  fill: "#334155",
9043
- children: chunk275WERXZ_js.formatAxisValue(p.val)
9079
+ children: chunkVKOVFVDJ_js.formatAxisValue(p.val)
9044
9080
  },
9045
9081
  `${element.id}-combo-line-dl-${si}-${vi}`
9046
9082
  )
@@ -9078,11 +9114,11 @@ function renderComboChart(element, chartData, categoryLabels) {
9078
9114
  }
9079
9115
  function renderChartElement(element) {
9080
9116
  if (element.type !== "chart") {
9081
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunkZISXRMDJ_js.translationsEn["pptx.chart.heading"] });
9117
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk2EFVXYNA_js.translationsEn["pptx.chart.heading"] });
9082
9118
  }
9083
9119
  const chartData = element.chartData;
9084
9120
  if (!chartData || chartData.series.length === 0) {
9085
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunkZISXRMDJ_js.translationsEn["pptx.chart.heading"] });
9121
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk2EFVXYNA_js.translationsEn["pptx.chart.heading"] });
9086
9122
  }
9087
9123
  const longestSeriesLength = chartData.series.reduce(
9088
9124
  (maxLength, series) => Math.max(maxLength, series.values.length),
@@ -10599,7 +10635,7 @@ function PresentationMediaController({
10599
10635
  }
10600
10636
  function renderMediaElement(element, mediaDataUrls, options) {
10601
10637
  if (element.type !== "media") {
10602
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunkZISXRMDJ_js.translationsEn["pptx.media.title"] });
10638
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk2EFVXYNA_js.translationsEn["pptx.media.title"] });
10603
10639
  }
10604
10640
  const mediaType = element.mediaType;
10605
10641
  const mediaPath = element.mediaPath;
@@ -10629,7 +10665,7 @@ function renderMediaElement(element, mediaDataUrls, options) {
10629
10665
  "img",
10630
10666
  {
10631
10667
  src: posterUrl,
10632
- alt: chunkZISXRMDJ_js.translationsEn["pptx.media.posterAlt"],
10668
+ alt: chunk2EFVXYNA_js.translationsEn["pptx.media.posterAlt"],
10633
10669
  className: "w-full h-full object-contain opacity-50"
10634
10670
  }
10635
10671
  ),
@@ -10650,7 +10686,7 @@ function renderMediaElement(element, mediaDataUrls, options) {
10650
10686
  ]
10651
10687
  }
10652
10688
  ),
10653
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] text-white/60", children: chunkZISXRMDJ_js.translationsEn["pptx.media.notFound"] })
10689
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] text-white/60", children: chunk2EFVXYNA_js.translationsEn["pptx.media.notFound"] })
10654
10690
  ] })
10655
10691
  ] });
10656
10692
  }
@@ -10691,7 +10727,7 @@ function renderMediaElement(element, mediaDataUrls, options) {
10691
10727
  "img",
10692
10728
  {
10693
10729
  src: posterUrl,
10694
- alt: chunkZISXRMDJ_js.translationsEn["pptx.media.videoPosterAlt"],
10730
+ alt: chunk2EFVXYNA_js.translationsEn["pptx.media.videoPosterAlt"],
10695
10731
  className: "w-full h-full object-contain"
10696
10732
  }
10697
10733
  ),
@@ -10794,14 +10830,14 @@ function buildNotesPdf(pages) {
10794
10830
  notes: page.notes,
10795
10831
  slideNumber: page.slideNumber
10796
10832
  }));
10797
- const bytes = chunk275WERXZ_js.buildNotesPdfBytes(images, meta);
10833
+ const bytes = chunkVKOVFVDJ_js.buildNotesPdfBytes(images, meta);
10798
10834
  const blob = new Blob([bytes], { type: "application/pdf" });
10799
10835
  return URL.createObjectURL(blob);
10800
10836
  }
10801
10837
 
10802
10838
  // src/viewer/utils/pdf-builder-slides.ts
10803
10839
  function buildPdfFromImageData(images) {
10804
- const bytes = chunk275WERXZ_js.buildSlidesPdfBytes(images);
10840
+ const bytes = chunkVKOVFVDJ_js.buildSlidesPdfBytes(images);
10805
10841
  const blob = new Blob([bytes], { type: "application/pdf" });
10806
10842
  return URL.createObjectURL(blob);
10807
10843
  }
@@ -10810,7 +10846,7 @@ function buildPdfFromImageData(images) {
10810
10846
  var activePreview = null;
10811
10847
  function startPreviewAnimation(elementId, preset, options) {
10812
10848
  stopPreviewAnimation();
10813
- const descriptor = chunk275WERXZ_js.buildPreviewAnimation(preset, options);
10849
+ const descriptor = chunkVKOVFVDJ_js.buildPreviewAnimation(preset, options);
10814
10850
  if (!descriptor) {
10815
10851
  return;
10816
10852
  }
@@ -10888,7 +10924,7 @@ function useElementOperations(input) {
10888
10924
  }, [applySelection, setInlineEditingElementId, setContextMenuState]);
10889
10925
  const updateElementById = React3.useCallback(
10890
10926
  (elementId, updates) => {
10891
- if (chunk275WERXZ_js.isTemplateElementId(elementId)) {
10927
+ if (chunkVKOVFVDJ_js.isTemplateElementId(elementId)) {
10892
10928
  const slideId = activeSlide?.id;
10893
10929
  if (slideId) {
10894
10930
  setTemplateElementsBySlideId((prev) => ({
@@ -10942,14 +10978,14 @@ function useElementOperations(input) {
10942
10978
  if (!selectedElement || !chunkKV3EOLP3_js.hasTextProperties(selectedElement)) {
10943
10979
  return;
10944
10980
  }
10945
- const inlineSel = chunk275WERXZ_js.getInlineEditorSelection(selectedElement.textSegments);
10981
+ const inlineSel = chunkVKOVFVDJ_js.getInlineEditorSelection(selectedElement.textSegments);
10946
10982
  if (inlineSel && selectedElement.textSegments) {
10947
- const { newSegments: newSegments2, newSelection } = chunk275WERXZ_js.applyStyleToSelectedSegments(
10983
+ const { newSegments: newSegments2, newSelection } = chunkVKOVFVDJ_js.applyStyleToSelectedSegments(
10948
10984
  selectedElement.textSegments,
10949
10985
  inlineSel,
10950
10986
  updates
10951
10987
  );
10952
- chunk275WERXZ_js.setPendingSelectionRestore(newSelection);
10988
+ chunkVKOVFVDJ_js.setPendingSelectionRestore(newSelection);
10953
10989
  updateSelectedElement({
10954
10990
  textSegments: newSegments2
10955
10991
  });
@@ -10972,9 +11008,9 @@ function useElementOperations(input) {
10972
11008
  if (!selectedElement || !chunkKV3EOLP3_js.hasTextProperties(selectedElement)) {
10973
11009
  return;
10974
11010
  }
10975
- const inlineSel = chunk275WERXZ_js.getInlineEditorSelection(selectedElement.textSegments);
11011
+ const inlineSel = chunkVKOVFVDJ_js.getInlineEditorSelection(selectedElement.textSegments);
10976
11012
  if (inlineSel && selectedElement.textSegments) {
10977
- const newSegments = chunk275WERXZ_js.applyCaseTransformToSegments(
11013
+ const newSegments = chunkVKOVFVDJ_js.applyCaseTransformToSegments(
10978
11014
  selectedElement.textSegments,
10979
11015
  inlineSel,
10980
11016
  mode
@@ -10984,14 +11020,14 @@ function useElementOperations(input) {
10984
11020
  }
10985
11021
  const updates = {};
10986
11022
  if (selectedElement.textSegments && selectedElement.textSegments.length > 0) {
10987
- updates.textSegments = chunk275WERXZ_js.applyCaseTransformToSegments(
11023
+ updates.textSegments = chunkVKOVFVDJ_js.applyCaseTransformToSegments(
10988
11024
  selectedElement.textSegments,
10989
11025
  null,
10990
11026
  mode
10991
11027
  );
10992
11028
  }
10993
11029
  if (typeof selectedElement.text === "string") {
10994
- updates.text = chunk275WERXZ_js.transformTextCase(selectedElement.text, mode);
11030
+ updates.text = chunkVKOVFVDJ_js.transformTextCase(selectedElement.text, mode);
10995
11031
  }
10996
11032
  updateSelectedElement(updates);
10997
11033
  },
@@ -11046,7 +11082,7 @@ function useSectionOperations(input) {
11046
11082
  const { sections, setSections, slides, setSlides, markDirty } = input;
11047
11083
  const addSection2 = React3.useCallback(
11048
11084
  (name, afterSlideIndex) => {
11049
- const result = chunk275WERXZ_js.addSection(sections, slides, name, afterSlideIndex);
11085
+ const result = chunkVKOVFVDJ_js.addSection(sections, slides, name, afterSlideIndex);
11050
11086
  setSlides(result.slides);
11051
11087
  setSections(result.sections);
11052
11088
  markDirty();
@@ -11055,7 +11091,7 @@ function useSectionOperations(input) {
11055
11091
  );
11056
11092
  const renameSection2 = React3.useCallback(
11057
11093
  (sectionId, newName) => {
11058
- const result = chunk275WERXZ_js.renameSection(sections, slides, sectionId, newName);
11094
+ const result = chunkVKOVFVDJ_js.renameSection(sections, slides, sectionId, newName);
11059
11095
  setSections(result.sections);
11060
11096
  setSlides(result.slides);
11061
11097
  markDirty();
@@ -11064,7 +11100,7 @@ function useSectionOperations(input) {
11064
11100
  );
11065
11101
  const deleteSection2 = React3.useCallback(
11066
11102
  (sectionId) => {
11067
- const result = chunk275WERXZ_js.deleteSection(sections, slides, sectionId);
11103
+ const result = chunkVKOVFVDJ_js.deleteSection(sections, slides, sectionId);
11068
11104
  setSections(result.sections);
11069
11105
  setSlides(result.slides);
11070
11106
  markDirty();
@@ -11073,21 +11109,21 @@ function useSectionOperations(input) {
11073
11109
  );
11074
11110
  const moveSectionUp2 = React3.useCallback(
11075
11111
  (sectionId) => {
11076
- setSections(chunk275WERXZ_js.moveSectionUp(sections, sectionId));
11112
+ setSections(chunkVKOVFVDJ_js.moveSectionUp(sections, sectionId));
11077
11113
  markDirty();
11078
11114
  },
11079
11115
  [sections, setSections, markDirty]
11080
11116
  );
11081
11117
  const moveSectionDown2 = React3.useCallback(
11082
11118
  (sectionId) => {
11083
- setSections(chunk275WERXZ_js.moveSectionDown(sections, sectionId));
11119
+ setSections(chunkVKOVFVDJ_js.moveSectionDown(sections, sectionId));
11084
11120
  markDirty();
11085
11121
  },
11086
11122
  [sections, setSections, markDirty]
11087
11123
  );
11088
11124
  const moveSlidesToSection2 = React3.useCallback(
11089
11125
  (slideIndexes, targetSectionId) => {
11090
- const result = chunk275WERXZ_js.moveSlidesToSection(sections, slides, slideIndexes, targetSectionId);
11126
+ const result = chunkVKOVFVDJ_js.moveSlidesToSection(sections, slides, slideIndexes, targetSectionId);
11091
11127
  setSlides(result.slides);
11092
11128
  setSections(result.sections);
11093
11129
  markDirty();
@@ -11106,7 +11142,7 @@ function useSectionOperations(input) {
11106
11142
 
11107
11143
  // src/viewer/hooks/pointer-move-handlers.ts
11108
11144
  function computeResizeGeometry(handle, startX, startY, startWidth, startHeight, dx, dy, snapToGrid, gridSpacingPx) {
11109
- const resized = chunk275WERXZ_js.applyResize(
11145
+ const resized = chunkVKOVFVDJ_js.applyResize(
11110
11146
  { x: startX, y: startY, width: startWidth, height: startHeight },
11111
11147
  handle,
11112
11148
  dx,
@@ -11118,7 +11154,7 @@ function computeResizeGeometry(handle, startX, startY, startWidth, startHeight,
11118
11154
  if (!snapToGrid) {
11119
11155
  return box;
11120
11156
  }
11121
- return chunk275WERXZ_js.snapBoxToGrid(box, handle, gridSpacingPx, MIN_ELEMENT_SIZE);
11157
+ return chunkVKOVFVDJ_js.snapBoxToGrid(box, handle, gridSpacingPx, MIN_ELEMENT_SIZE);
11122
11158
  }
11123
11159
  function computeAdjustmentValue(startAdjustment, dx, startWidth) {
11124
11160
  const range = startWidth || 200;
@@ -11228,7 +11264,7 @@ function processDragMove(e, drag, editorScale, snapToGrid, snapToShape, gridSpac
11228
11264
  width: el.width,
11229
11265
  height: el.height
11230
11266
  }));
11231
- const snapResult = chunk275WERXZ_js.computeSnapToShape(
11267
+ const snapResult = chunkVKOVFVDJ_js.computeSnapToShape(
11232
11268
  targetX,
11233
11269
  targetY,
11234
11270
  primaryEl.width,
@@ -11371,13 +11407,13 @@ function processPointerUp(input) {
11371
11407
  if (i !== activeSlideIndex) {
11372
11408
  return s;
11373
11409
  }
11374
- const rerouted = chunk275WERXZ_js.rerouteConnectorsForMovedElements(s.elements, movedIds);
11410
+ const rerouted = chunkVKOVFVDJ_js.rerouteConnectorsForMovedElements(s.elements, movedIds);
11375
11411
  if (rerouted.length === 0) {
11376
11412
  return s;
11377
11413
  }
11378
11414
  return {
11379
11415
  ...s,
11380
- elements: chunk275WERXZ_js.applyReroutedConnectors(s.elements, rerouted)
11416
+ elements: chunkVKOVFVDJ_js.applyReroutedConnectors(s.elements, rerouted)
11381
11417
  };
11382
11418
  })
11383
11419
  );
@@ -11396,9 +11432,9 @@ function processPointerUp(input) {
11396
11432
  }
11397
11433
  function commitMarquee(marquee, editTemplateMode, templateElements, activeSlide, applySelection, clearSelection) {
11398
11434
  const sourceElements = editTemplateMode ? templateElements : activeSlide?.elements ?? [];
11399
- const hitIds = chunk275WERXZ_js.computeMarqueeHitIds(marquee, sourceElements);
11435
+ const hitIds = chunkVKOVFVDJ_js.computeMarqueeHitIds(marquee, sourceElements);
11400
11436
  if (marquee.additive) {
11401
- const merged = chunk275WERXZ_js.mergeAdditiveSelection(marquee.baseSelectionIds, hitIds);
11437
+ const merged = chunkVKOVFVDJ_js.mergeAdditiveSelection(marquee.baseSelectionIds, hitIds);
11402
11438
  if (merged.length > 0) {
11403
11439
  applySelection(merged[0], merged);
11404
11440
  } else {
@@ -11421,8 +11457,8 @@ function commitDrag(drag, editTemplateMode, activeSlide, activeSlideIndex, setTe
11421
11457
  }
11422
11458
  return { ...el, x: start.x + dx, y: start.y + dy };
11423
11459
  });
11424
- const rerouted = chunk275WERXZ_js.rerouteConnectorsForMovedElements(movedElements, movedIds);
11425
- return chunk275WERXZ_js.applyReroutedConnectors(movedElements, rerouted);
11460
+ const rerouted = chunkVKOVFVDJ_js.rerouteConnectorsForMovedElements(movedElements, movedIds);
11461
+ return chunkVKOVFVDJ_js.applyReroutedConnectors(movedElements, rerouted);
11426
11462
  };
11427
11463
  if (editTemplateMode) {
11428
11464
  const slideId = activeSlide?.id;
@@ -11563,7 +11599,8 @@ function useCanvasInteractions(input) {
11563
11599
  presentationHandleAction,
11564
11600
  setEditingEquationOmml,
11565
11601
  setIsEquationDialogOpen,
11566
- setPointerCommitNonce
11602
+ setPointerCommitNonce,
11603
+ transformCommittedText
11567
11604
  } = input;
11568
11605
  const justSelectedRef = React3.useRef(false);
11569
11606
  const handleInlineEditCommit = () => {
@@ -11573,9 +11610,10 @@ function useCanvasInteractions(input) {
11573
11610
  }
11574
11611
  const el = elementLookup.get(editId);
11575
11612
  if (el && chunkKV3EOLP3_js.hasTextProperties(el)) {
11576
- const newSegments = chunk275WERXZ_js.remapTextToSegments(inlineEditingText, el.textSegments, el.textStyle);
11613
+ const committedText = transformCommittedText ? transformCommittedText(inlineEditingText) : inlineEditingText;
11614
+ const newSegments = chunkVKOVFVDJ_js.remapTextToSegments(committedText, el.textSegments, el.textStyle);
11577
11615
  ops.updateElementById(editId, {
11578
- text: inlineEditingText,
11616
+ text: committedText,
11579
11617
  textSegments: newSegments
11580
11618
  });
11581
11619
  history.markDirty();
@@ -11677,6 +11715,9 @@ function useCanvasInteractions(input) {
11677
11715
  setSnapLines([]);
11678
11716
  };
11679
11717
  const handleElementContextMenu = (elementId, e) => {
11718
+ if (mode === "present") {
11719
+ return;
11720
+ }
11680
11721
  e.preventDefault();
11681
11722
  e.stopPropagation();
11682
11723
  if (!selectedElementIdSet.has(elementId)) {
@@ -11819,7 +11860,7 @@ function createFileHandlers(deps) {
11819
11860
  h = Math.round(h * scale);
11820
11861
  }
11821
11862
  addElement({
11822
- id: chunk275WERXZ_js.generateElementId(),
11863
+ id: chunkVKOVFVDJ_js.generateElementId(),
11823
11864
  type: "image",
11824
11865
  x: Math.round((canvasSize.width - w) / 2),
11825
11866
  y: Math.round((canvasSize.height - h) / 2),
@@ -11830,7 +11871,7 @@ function createFileHandlers(deps) {
11830
11871
  };
11831
11872
  img.onerror = () => {
11832
11873
  addElement({
11833
- id: chunk275WERXZ_js.generateElementId(),
11874
+ id: chunkVKOVFVDJ_js.generateElementId(),
11834
11875
  type: "image",
11835
11876
  x: 100,
11836
11877
  y: 100,
@@ -11856,7 +11897,7 @@ function createFileHandlers(deps) {
11856
11897
  const elFilePath = file.path;
11857
11898
  const insertMediaElement = (mediaSourceUrl, width, height) => {
11858
11899
  addElement({
11859
- id: chunk275WERXZ_js.generateElementId(),
11900
+ id: chunkVKOVFVDJ_js.generateElementId(),
11860
11901
  type: "media",
11861
11902
  mediaType,
11862
11903
  mediaMimeType: file.type || void 0,
@@ -12031,13 +12072,13 @@ function createStructuredElementHandlers(deps) {
12031
12072
  return;
12032
12073
  }
12033
12074
  addElement({
12034
- id: chunk275WERXZ_js.generateElementId(),
12075
+ id: chunkVKOVFVDJ_js.generateElementId(),
12035
12076
  type: "smartArt",
12036
12077
  x: 100,
12037
12078
  y: 120,
12038
12079
  width: 600,
12039
12080
  height: 340,
12040
- smartArtData: chunk275WERXZ_js.buildSmartArtPresetData(
12081
+ smartArtData: chunkVKOVFVDJ_js.buildSmartArtPresetData(
12041
12082
  layout,
12042
12083
  defaultItems,
12043
12084
  (i) => `node-${Date.now()}-${i}-${Math.random().toString(36).slice(2, 8)}`
@@ -12049,7 +12090,7 @@ function createStructuredElementHandlers(deps) {
12049
12090
  return;
12050
12091
  }
12051
12092
  addElement({
12052
- id: chunk275WERXZ_js.generateElementId(),
12093
+ id: chunkVKOVFVDJ_js.generateElementId(),
12053
12094
  type: "shape",
12054
12095
  x: 120,
12055
12096
  y: 200,
@@ -12108,7 +12149,7 @@ function createStructuredElementHandlers(deps) {
12108
12149
  const displayText = value || fieldTexts[fieldType] || fieldType;
12109
12150
  const fieldGuid = `{${crypto.randomUUID().toUpperCase()}}`;
12110
12151
  addElement({
12111
- id: chunk275WERXZ_js.generateElementId(),
12152
+ id: chunkVKOVFVDJ_js.generateElementId(),
12112
12153
  type: "shape",
12113
12154
  x: 120,
12114
12155
  y: 200,
@@ -12130,7 +12171,7 @@ function createStructuredElementHandlers(deps) {
12130
12171
  if (!activeSlide) {
12131
12172
  return;
12132
12173
  }
12133
- const preset = chunk275WERXZ_js.ACTION_BUTTON_PRESETS.find((p) => p.shapeType === shapeType);
12174
+ const preset = chunkVKOVFVDJ_js.ACTION_BUTTON_PRESETS.find((p) => p.shapeType === shapeType);
12134
12175
  if (!preset) {
12135
12176
  return;
12136
12177
  }
@@ -12143,7 +12184,7 @@ function createStructuredElementHandlers(deps) {
12143
12184
  defaultPptxAction.highlightClick = true;
12144
12185
  }
12145
12186
  addElement({
12146
- id: chunk275WERXZ_js.generateElementId(),
12187
+ id: chunkVKOVFVDJ_js.generateElementId(),
12147
12188
  type: "shape",
12148
12189
  x: 150,
12149
12190
  y: 150,
@@ -12210,7 +12251,7 @@ function useInsertElements(input) {
12210
12251
  return;
12211
12252
  }
12212
12253
  addElement({
12213
- id: chunk275WERXZ_js.generateElementId(),
12254
+ id: chunkVKOVFVDJ_js.generateElementId(),
12214
12255
  type: "text",
12215
12256
  x: 100,
12216
12257
  y: 100,
@@ -12225,7 +12266,7 @@ function useInsertElements(input) {
12225
12266
  return;
12226
12267
  }
12227
12268
  addElement({
12228
- id: chunk275WERXZ_js.generateElementId(),
12269
+ id: chunkVKOVFVDJ_js.generateElementId(),
12229
12270
  type: "shape",
12230
12271
  x: 150,
12231
12272
  y: 150,
@@ -12244,15 +12285,15 @@ function useInsertElements(input) {
12244
12285
  return;
12245
12286
  }
12246
12287
  addElement({
12247
- ...chunk275WERXZ_js.newTableElement(DEFAULT_TABLE_ROWS, DEFAULT_TABLE_COLUMNS, 100, 200),
12248
- id: chunk275WERXZ_js.generateElementId()
12288
+ ...chunkVKOVFVDJ_js.newTableElement(DEFAULT_TABLE_ROWS, DEFAULT_TABLE_COLUMNS, 100, 200),
12289
+ id: chunkVKOVFVDJ_js.generateElementId()
12249
12290
  });
12250
12291
  };
12251
12292
  const handleAddChart = (chartType) => {
12252
12293
  if (!activeSlide) {
12253
12294
  return;
12254
12295
  }
12255
- addElement(chunk275WERXZ_js.createDefaultChartElement(chartType));
12296
+ addElement(chunkVKOVFVDJ_js.createDefaultChartElement(chartType));
12256
12297
  };
12257
12298
  const structured = createStructuredElementHandlers({
12258
12299
  activeSlide,
@@ -12322,7 +12363,7 @@ function useClipboardHandlers(input) {
12322
12363
  if (!selectedElement) {
12323
12364
  return;
12324
12365
  }
12325
- setClipboardPayload(chunk275WERXZ_js.buildElementClipboardPayload(selectedElement, editTemplateMode));
12366
+ setClipboardPayload(chunkVKOVFVDJ_js.buildElementClipboardPayload(selectedElement, editTemplateMode));
12326
12367
  };
12327
12368
  const handleDelete = () => {
12328
12369
  const idsToDelete = effectiveSelectedIds;
@@ -12339,7 +12380,7 @@ function useClipboardHandlers(input) {
12339
12380
  handleDelete();
12340
12381
  };
12341
12382
  const insertClone = (source) => {
12342
- const clone = chunk275WERXZ_js.cloneElementForPaste(source, { intoTemplate: editTemplateMode });
12383
+ const clone = chunkVKOVFVDJ_js.cloneElementForPaste(source, { intoTemplate: editTemplateMode });
12343
12384
  ops.updateActiveElements((els) => [...els, clone]);
12344
12385
  ops.applySelection(clone.id);
12345
12386
  history.markDirty();
@@ -12549,7 +12590,7 @@ function useMergeShapesHandler(input) {
12549
12590
  bounds.height
12550
12591
  );
12551
12592
  const newEl = {
12552
- id: chunk275WERXZ_js.generateElementId(),
12593
+ id: chunkVKOVFVDJ_js.generateElementId(),
12553
12594
  type: "shape",
12554
12595
  x: bounds.x,
12555
12596
  y: bounds.y,
@@ -12608,7 +12649,7 @@ function useMergeShapesHandler(input) {
12608
12649
  );
12609
12650
  const primary = targets[0];
12610
12651
  const newEl = {
12611
- id: chunk275WERXZ_js.generateElementId(),
12652
+ id: chunkVKOVFVDJ_js.generateElementId(),
12612
12653
  type: "shape",
12613
12654
  x: bounds.x,
12614
12655
  y: bounds.y,
@@ -12671,7 +12712,7 @@ function useGroupAlignLayerHandlers(input) {
12671
12712
  if (ids.length < 2 || !activeSlide) {
12672
12713
  return;
12673
12714
  }
12674
- const { elements, groupId } = chunk275WERXZ_js.groupElements(ops.activeElements, ids, chunk275WERXZ_js.generateElementId());
12715
+ const { elements, groupId } = chunkVKOVFVDJ_js.groupElements(ops.activeElements, ids, chunkVKOVFVDJ_js.generateElementId());
12675
12716
  if (groupId === null) {
12676
12717
  return;
12677
12718
  }
@@ -12684,12 +12725,12 @@ function useGroupAlignLayerHandlers(input) {
12684
12725
  return;
12685
12726
  }
12686
12727
  const group = selectedElement;
12687
- const intoTemplate = chunk275WERXZ_js.isTemplateElementId(group.id);
12728
+ const intoTemplate = chunkVKOVFVDJ_js.isTemplateElementId(group.id);
12688
12729
  const ungrouped = group.children.map((child) => ({
12689
12730
  ...structuredClone(child),
12690
12731
  // Keep child ids in the same store as the group so later edits route
12691
12732
  // correctly: template groups yield template-prefixed child ids.
12692
- id: intoTemplate ? chunk275WERXZ_js.makeCloneId(true, child.id || group.id) : child.id || chunk275WERXZ_js.generateElementId(),
12733
+ id: intoTemplate ? chunkVKOVFVDJ_js.makeCloneId(true, child.id || group.id) : child.id || chunkVKOVFVDJ_js.generateElementId(),
12693
12734
  x: child.x + group.x,
12694
12735
  y: child.y + group.y
12695
12736
  }));
@@ -12713,7 +12754,7 @@ function useGroupAlignLayerHandlers(input) {
12713
12754
  if (!edge) {
12714
12755
  return;
12715
12756
  }
12716
- const positions = chunk275WERXZ_js.alignElements(selectedElements, edge);
12757
+ const positions = chunkVKOVFVDJ_js.alignElements(selectedElements, edge);
12717
12758
  for (const [id, pos] of positions) {
12718
12759
  const el = elementLookup.get(id);
12719
12760
  if (!el) {
@@ -12731,7 +12772,7 @@ function useGroupAlignLayerHandlers(input) {
12731
12772
  if (!distAxis) {
12732
12773
  return;
12733
12774
  }
12734
- const positions = chunk275WERXZ_js.distributeElements(selectedElements, distAxis);
12775
+ const positions = chunkVKOVFVDJ_js.distributeElements(selectedElements, distAxis);
12735
12776
  for (const [id, pos] of positions) {
12736
12777
  const el = elementLookup.get(id);
12737
12778
  if (!el) {
@@ -12748,7 +12789,7 @@ function useGroupAlignLayerHandlers(input) {
12748
12789
  }
12749
12790
  const id = selectedElement.id;
12750
12791
  ops.updateActiveElements(
12751
- (els) => direction === "forward" ? chunk275WERXZ_js.bringForward(els, id) : direction === "backward" ? chunk275WERXZ_js.sendBackward(els, id) : els
12792
+ (els) => direction === "forward" ? chunkVKOVFVDJ_js.bringForward(els, id) : direction === "backward" ? chunkVKOVFVDJ_js.sendBackward(els, id) : els
12752
12793
  );
12753
12794
  history.markDirty();
12754
12795
  };
@@ -12758,7 +12799,7 @@ function useGroupAlignLayerHandlers(input) {
12758
12799
  }
12759
12800
  const id = selectedElement.id;
12760
12801
  ops.updateActiveElements(
12761
- (els) => direction === "front" ? chunk275WERXZ_js.bringToFront(els, id) : chunk275WERXZ_js.sendToBack(els, id)
12802
+ (els) => direction === "front" ? chunkVKOVFVDJ_js.bringToFront(els, id) : chunkVKOVFVDJ_js.sendToBack(els, id)
12762
12803
  );
12763
12804
  history.markDirty();
12764
12805
  };
@@ -12880,7 +12921,7 @@ function insertSlideFromLayoutUpdater(slides, activeIndex, draft) {
12880
12921
  function useSlideManagement(input) {
12881
12922
  const { slides, activeSlideIndex, setActiveSlideIndex, ops, history, handlerRef } = input;
12882
12923
  const handleAddSlide = () => {
12883
- const newSlide = chunk275WERXZ_js.createBlankSlide(slides.length + 1);
12924
+ const newSlide = chunkVKOVFVDJ_js.createBlankSlide(slides.length + 1);
12884
12925
  ops.updateSlides((prev) => {
12885
12926
  const next = [...prev];
12886
12927
  next.splice(activeSlideIndex + 1, 0, newSlide);
@@ -12943,7 +12984,7 @@ function useSlideManagement(input) {
12943
12984
  }
12944
12985
  const clone = {
12945
12986
  ...src,
12946
- id: chunk275WERXZ_js.makeSlideId(),
12987
+ id: chunkVKOVFVDJ_js.makeSlideId(),
12947
12988
  elements: src.elements.map((el) => ({
12948
12989
  ...el,
12949
12990
  id: `${el.id}-dup-${Math.random().toString(36).slice(2, 6)}`
@@ -12975,7 +13016,7 @@ function useSlideManagement(input) {
12975
13016
  const handleInsertSlideFromLayout = (layoutPath, layoutName) => {
12976
13017
  const insertAt = activeSlideIndex + 1;
12977
13018
  const draft = {
12978
- ...chunk275WERXZ_js.createBlankSlide(slides.length + 1),
13019
+ ...chunkVKOVFVDJ_js.createBlankSlide(slides.length + 1),
12979
13020
  layoutPath,
12980
13021
  ...layoutName ? { layoutName } : {}
12981
13022
  };
@@ -13036,7 +13077,7 @@ function createTableMergeHandlers(input) {
13036
13077
  if (!nextCell || nextCell.hMerge || nextCell.vMerge) {
13037
13078
  return;
13038
13079
  }
13039
- const newTableData = chunk275WERXZ_js.mergeCells(
13080
+ const newTableData = chunkVKOVFVDJ_js.mergeCells(
13040
13081
  [
13041
13082
  { row: rowIndex, col: columnIndex },
13042
13083
  { row: rowIndex, col: nextColIdx }
@@ -13070,7 +13111,7 @@ function createTableMergeHandlers(input) {
13070
13111
  if (!targetNextCell || targetNextCell.hMerge || targetNextCell.vMerge) {
13071
13112
  return;
13072
13113
  }
13073
- const newTableData = chunk275WERXZ_js.mergeCells(
13114
+ const newTableData = chunkVKOVFVDJ_js.mergeCells(
13074
13115
  [
13075
13116
  { row: rowIndex, col: columnIndex },
13076
13117
  { row: targetNextRowIdx, col: columnIndex }
@@ -13093,7 +13134,7 @@ function createTableMergeHandlers(input) {
13093
13134
  return;
13094
13135
  }
13095
13136
  const td = selectedElement.tableData;
13096
- const newTableData = chunk275WERXZ_js.mergeCells(ts.selectedCells, td);
13137
+ const newTableData = chunkVKOVFVDJ_js.mergeCells(ts.selectedCells, td);
13097
13138
  const updates = { tableData: newTableData };
13098
13139
  const newRawXml = chunkKV3EOLP3_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
13099
13140
  if (newRawXml) {
@@ -13112,7 +13153,7 @@ function createTableMergeHandlers(input) {
13112
13153
  }
13113
13154
  const { rowIndex, columnIndex } = ts;
13114
13155
  const td = selectedElement.tableData;
13115
- const newTableData = chunk275WERXZ_js.splitCell(rowIndex, columnIndex, td);
13156
+ const newTableData = chunkVKOVFVDJ_js.splitCell(rowIndex, columnIndex, td);
13116
13157
  const updates = { tableData: newTableData };
13117
13158
  const newRawXml = chunkKV3EOLP3_js.updateMergeAttrsInRawXml(selectedElement, newTableData);
13118
13159
  if (newRawXml) {
@@ -13246,7 +13287,7 @@ function createTableStructHandlers(input) {
13246
13287
  return;
13247
13288
  }
13248
13289
  const rowIdx = ts?.rowIndex ?? 0;
13249
- const newTableData = chunk275WERXZ_js.insertTableRow(selectedElement.tableData, rowIdx, position);
13290
+ const newTableData = chunkVKOVFVDJ_js.insertTableRow(selectedElement.tableData, rowIdx, position);
13250
13291
  const updates = { tableData: newTableData };
13251
13292
  const newRawXml = chunkKV3EOLP3_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
13252
13293
  if (newRawXml) {
@@ -13261,7 +13302,7 @@ function createTableStructHandlers(input) {
13261
13302
  }
13262
13303
  const td = selectedElement.tableData;
13263
13304
  const rowIdx = ts?.rowIndex ?? 0;
13264
- const newTableData = chunk275WERXZ_js.deleteTableRow(td, rowIdx);
13305
+ const newTableData = chunkVKOVFVDJ_js.deleteTableRow(td, rowIdx);
13265
13306
  if (newTableData === td) {
13266
13307
  return;
13267
13308
  }
@@ -13278,7 +13319,7 @@ function createTableStructHandlers(input) {
13278
13319
  return;
13279
13320
  }
13280
13321
  const colIdx = ts?.columnIndex ?? 0;
13281
- const newTableData = chunk275WERXZ_js.insertTableColumn(selectedElement.tableData, colIdx, position);
13322
+ const newTableData = chunkVKOVFVDJ_js.insertTableColumn(selectedElement.tableData, colIdx, position);
13282
13323
  const updates = { tableData: newTableData };
13283
13324
  const newRawXml = chunkKV3EOLP3_js.rebuildTableStructureInRawXml(selectedElement, newTableData);
13284
13325
  if (newRawXml) {
@@ -13293,7 +13334,7 @@ function createTableStructHandlers(input) {
13293
13334
  }
13294
13335
  const td = selectedElement.tableData;
13295
13336
  const colIdx = ts?.columnIndex ?? 0;
13296
- const newTableData = chunk275WERXZ_js.deleteTableColumn(td, colIdx);
13337
+ const newTableData = chunkVKOVFVDJ_js.deleteTableColumn(td, colIdx);
13297
13338
  if (newTableData === td) {
13298
13339
  return;
13299
13340
  }
@@ -13334,8 +13375,8 @@ async function renderToCanvas(element, options = {}) {
13334
13375
  return html2canvasPro(element, {
13335
13376
  ...options,
13336
13377
  onclone: async (doc, clonedEl) => {
13337
- await chunk275WERXZ_js.normalizeColorsForCapture(doc, clonedEl);
13338
- chunk275WERXZ_js.preprocessCssForCapture(clonedEl);
13378
+ await chunkVKOVFVDJ_js.normalizeColorsForCapture(doc, clonedEl);
13379
+ chunkVKOVFVDJ_js.preprocessCssForCapture(clonedEl);
13339
13380
  if (typeof userOnClone === "function") {
13340
13381
  userOnClone(doc, clonedEl);
13341
13382
  }
@@ -13391,7 +13432,7 @@ async function exportSlideToPngBlob(slideElement, options = {}) {
13391
13432
  }
13392
13433
  async function exportSlideAsPng(slideElement, slideIndex, options = {}) {
13393
13434
  const blob = await exportSlideToPngBlob(slideElement, options);
13394
- chunk275WERXZ_js.downloadBlob(blob, `slide-${slideIndex + 1}.png`);
13435
+ chunkVKOVFVDJ_js.downloadBlob(blob, `slide-${slideIndex + 1}.png`);
13395
13436
  }
13396
13437
  async function copySlideToClipboard(slideElement, options = {}) {
13397
13438
  const blob = await exportSlideToPngBlob(slideElement, options);
@@ -13413,15 +13454,15 @@ async function exportAllSlidesAsPdf(slideStageRef, totalSlides, setActiveSlide,
13413
13454
  continue;
13414
13455
  }
13415
13456
  const canvas = await renderElementToCanvas(stageEl, scale);
13416
- images.push(chunk275WERXZ_js.canvasToJpegData(canvas));
13457
+ images.push(chunkVKOVFVDJ_js.canvasToJpegData(canvas));
13417
13458
  }
13418
13459
  onProgress?.(totalSlides, totalSlides);
13419
13460
  setActiveSlide(currentSlideIndex);
13420
13461
  if (images.length === 0) {
13421
- throw new Error(chunkZISXRMDJ_js.translationsEn["pptx.export.errorNoSlidesPdf"]);
13462
+ throw new Error(chunk2EFVXYNA_js.translationsEn["pptx.export.errorNoSlidesPdf"]);
13422
13463
  }
13423
13464
  const pdfBlobUrl = buildPdfFromImageData(images);
13424
- chunk275WERXZ_js.downloadDataUrl(pdfBlobUrl, filename);
13465
+ chunkVKOVFVDJ_js.downloadDataUrl(pdfBlobUrl, filename);
13425
13466
  }
13426
13467
  async function captureAllSlidesAsPngDataUrls(slideStageRef, totalSlides, setActiveSlide, currentSlideIndex, options = {}) {
13427
13468
  const { scale = 2, onProgress } = options;
@@ -13467,10 +13508,10 @@ async function exportAllSlidesAsNotesPdf(slideStageRef, totalSlides, setActiveSl
13467
13508
  onProgress?.(totalSlides, totalSlides);
13468
13509
  setActiveSlide(currentSlideIndex);
13469
13510
  if (pages.length === 0) {
13470
- throw new Error(chunkZISXRMDJ_js.translationsEn["pptx.export.errorNoSlidesNotesPdf"]);
13511
+ throw new Error(chunk2EFVXYNA_js.translationsEn["pptx.export.errorNoSlidesNotesPdf"]);
13471
13512
  }
13472
13513
  const pdfDataUrl = buildNotesPdf(pages);
13473
- chunk275WERXZ_js.downloadDataUrl(pdfDataUrl, filename);
13514
+ chunkVKOVFVDJ_js.downloadDataUrl(pdfDataUrl, filename);
13474
13515
  }
13475
13516
 
13476
13517
  // src/viewer/utils/export-video.ts
@@ -13501,7 +13542,7 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
13501
13542
  }
13502
13543
  setActiveSlide(currentSlideIndex);
13503
13544
  if (slideCanvases.length === 0) {
13504
- throw new Error(chunkZISXRMDJ_js.translationsEn["pptx.export.errorNoSlidesVideo"]);
13545
+ throw new Error(chunk2EFVXYNA_js.translationsEn["pptx.export.errorNoSlidesVideo"]);
13505
13546
  }
13506
13547
  const firstCanvas = slideCanvases[0];
13507
13548
  const recordingCanvas = document.createElement("canvas");
@@ -13509,12 +13550,12 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
13509
13550
  recordingCanvas.height = firstCanvas.height;
13510
13551
  const ctx = recordingCanvas.getContext("2d");
13511
13552
  if (!ctx) {
13512
- throw new Error(chunkZISXRMDJ_js.translationsEn["pptx.export.errorNo2dContext"]);
13553
+ throw new Error(chunk2EFVXYNA_js.translationsEn["pptx.export.errorNo2dContext"]);
13513
13554
  }
13514
13555
  const fps = 30;
13515
13556
  const stream = recordingCanvas.captureStream(fps);
13516
13557
  const recorder = new MediaRecorder(stream, {
13517
- mimeType: chunk275WERXZ_js.pickSupportedMimeType([...chunk275WERXZ_js.WEBM_MIME_CANDIDATES]),
13558
+ mimeType: chunkVKOVFVDJ_js.pickSupportedMimeType([...chunkVKOVFVDJ_js.WEBM_MIME_CANDIDATES]),
13518
13559
  videoBitsPerSecond: 5e6
13519
13560
  });
13520
13561
  const chunks = [];
@@ -13537,8 +13578,8 @@ async function exportAllSlidesAsVideo(slideStageRef, totalSlides, setActiveSlide
13537
13578
  const duration = slideTimingsMs?.[i] ?? slideDurationMs;
13538
13579
  ctx.clearRect(0, 0, recordingCanvas.width, recordingCanvas.height);
13539
13580
  ctx.drawImage(slideCanvases[i], 0, 0);
13540
- const frameInterval = chunk275WERXZ_js.fpsToFrameIntervalMs(fps);
13541
- const framesNeeded = chunk275WERXZ_js.segmentFrameCount(duration, fps);
13581
+ const frameInterval = chunkVKOVFVDJ_js.fpsToFrameIntervalMs(fps);
13582
+ const framesNeeded = chunkVKOVFVDJ_js.segmentFrameCount(duration, fps);
13542
13583
  for (let f = 0; f < framesNeeded; f++) {
13543
13584
  if (signal?.aborted) {
13544
13585
  recorder.stop();
@@ -13585,9 +13626,9 @@ async function exportAllSlidesAsGif(slideStageRef, totalSlides, setActiveSlide,
13585
13626
  }
13586
13627
  setActiveSlide(currentSlideIndex);
13587
13628
  if (frames.length === 0) {
13588
- throw new Error(chunkZISXRMDJ_js.translationsEn["pptx.export.errorNoSlidesGif"]);
13629
+ throw new Error(chunk2EFVXYNA_js.translationsEn["pptx.export.errorNoSlidesGif"]);
13589
13630
  }
13590
- const gifBytes = chunk275WERXZ_js.encodeGif(frames, Math.round(slideDurationMs / 10));
13631
+ const gifBytes = chunkVKOVFVDJ_js.encodeGif(frames, Math.round(slideDurationMs / 10));
13591
13632
  onProgress?.(totalSlides, totalSlides);
13592
13633
  const buf = new ArrayBuffer(gifBytes.length);
13593
13634
  new Uint8Array(buf).set(gifBytes);
@@ -13701,7 +13742,7 @@ function useExportSaveAs(input) {
13701
13742
  }
13702
13743
  setExportProgress(70);
13703
13744
  setExportStatusMessage("Writing README...");
13704
- const readme = chunk275WERXZ_js.generatePackageReadme(pptxFilename);
13745
+ const readme = chunkVKOVFVDJ_js.generatePackageReadme(pptxFilename);
13705
13746
  pkgFolder.file("README.txt", readme);
13706
13747
  if (abortCtrl.signal.aborted) {
13707
13748
  throw new DOMException("Export cancelled", "AbortError");
@@ -13712,7 +13753,7 @@ function useExportSaveAs(input) {
13712
13753
  setExportProgress(95);
13713
13754
  setExportStatusMessage("Downloading...");
13714
13755
  const baseName = pptxFilename.replace(/\.[^.]+$/u, "");
13715
- chunk275WERXZ_js.downloadBlob(zipBlob, `${baseName}-package.zip`);
13756
+ chunkVKOVFVDJ_js.downloadBlob(zipBlob, `${baseName}-package.zip`);
13716
13757
  setExportProgress(100);
13717
13758
  } catch (err) {
13718
13759
  if (err.name !== "AbortError") {
@@ -13735,7 +13776,7 @@ function useExportSaveAs(input) {
13735
13776
  const blob = new Blob([data], {
13736
13777
  type: "application/vnd.openxmlformats-officedocument.presentationml.presentation"
13737
13778
  });
13738
- chunk275WERXZ_js.downloadBlob(blob, `${baseName}.${ext}`);
13779
+ chunkVKOVFVDJ_js.downloadBlob(blob, `${baseName}.${ext}`);
13739
13780
  } catch (err) {
13740
13781
  console.error(`[PowerPointViewer] Save as .${ext} failed:`, err);
13741
13782
  }
@@ -13812,7 +13853,7 @@ function safeConfirm(message) {
13812
13853
  }
13813
13854
  }
13814
13855
  function downloadBlob2(blob, filename) {
13815
- chunk275WERXZ_js.downloadBlob(blob, chunk275WERXZ_js.sanitizeDownloadFilename(filename));
13856
+ chunkVKOVFVDJ_js.downloadBlob(blob, chunkVKOVFVDJ_js.sanitizeDownloadFilename(filename));
13816
13857
  }
13817
13858
 
13818
13859
  // src/viewer/hooks/useExportHandlers.ts
@@ -13913,21 +13954,21 @@ function useExportHandlers(input) {
13913
13954
  {
13914
13955
  scale: 2,
13915
13956
  onProgress: (current, total) => {
13916
- setExportProgress(chunk275WERXZ_js.slideProgressPercent(current, total));
13917
- setExportStatusMessage(chunk275WERXZ_js.slideStatusLabel("Rendering", current, total));
13957
+ setExportProgress(chunkVKOVFVDJ_js.slideProgressPercent(current, total));
13958
+ setExportStatusMessage(chunkVKOVFVDJ_js.slideStatusLabel("Rendering", current, total));
13918
13959
  },
13919
13960
  signal: abortCtrl.signal
13920
13961
  }
13921
13962
  );
13922
- setExportProgress(chunk275WERXZ_js.EXPORT_ASSEMBLING_PERCENT);
13963
+ setExportProgress(chunkVKOVFVDJ_js.EXPORT_ASSEMBLING_PERCENT);
13923
13964
  setExportStatusMessage("Building PDF...");
13924
13965
  await new Promise((r) => {
13925
13966
  setTimeout(r, 100);
13926
13967
  });
13927
- setExportProgress(chunk275WERXZ_js.EXPORT_DONE_PERCENT);
13968
+ setExportProgress(chunkVKOVFVDJ_js.EXPORT_DONE_PERCENT);
13928
13969
  setExportStatusMessage("Done!");
13929
13970
  } catch (err) {
13930
- if (!chunk275WERXZ_js.isExportAbortError(err)) {
13971
+ if (!chunkVKOVFVDJ_js.isExportAbortError(err)) {
13931
13972
  console.error("[PowerPointViewer] PDF export failed:", err);
13932
13973
  }
13933
13974
  } finally {
@@ -13957,21 +13998,21 @@ function useExportHandlers(input) {
13957
13998
  {
13958
13999
  scale: 2,
13959
14000
  onProgress: (current, total) => {
13960
- setExportProgress(chunk275WERXZ_js.slideProgressPercent(current, total));
13961
- setExportStatusMessage(chunk275WERXZ_js.slideStatusLabel("Rendering", current, total));
14001
+ setExportProgress(chunkVKOVFVDJ_js.slideProgressPercent(current, total));
14002
+ setExportStatusMessage(chunkVKOVFVDJ_js.slideStatusLabel("Rendering", current, total));
13962
14003
  },
13963
14004
  signal: abortCtrl.signal
13964
14005
  }
13965
14006
  );
13966
- setExportProgress(chunk275WERXZ_js.EXPORT_ASSEMBLING_PERCENT);
14007
+ setExportProgress(chunkVKOVFVDJ_js.EXPORT_ASSEMBLING_PERCENT);
13967
14008
  setExportStatusMessage("Building PDF...");
13968
14009
  await new Promise((r) => {
13969
14010
  setTimeout(r, 100);
13970
14011
  });
13971
- setExportProgress(chunk275WERXZ_js.EXPORT_DONE_PERCENT);
14012
+ setExportProgress(chunkVKOVFVDJ_js.EXPORT_DONE_PERCENT);
13972
14013
  setExportStatusMessage("Done!");
13973
14014
  } catch (err) {
13974
- if (!chunk275WERXZ_js.isExportAbortError(err)) {
14015
+ if (!chunkVKOVFVDJ_js.isExportAbortError(err)) {
13975
14016
  console.error("[PowerPointViewer] Notes PDF export failed:", err);
13976
14017
  }
13977
14018
  } finally {
@@ -14012,22 +14053,22 @@ function useExportHandlers(input) {
14012
14053
  scale: 1,
14013
14054
  slideDurationMs: 3e3,
14014
14055
  onProgress: (current, total) => {
14015
- setExportProgress(chunk275WERXZ_js.slideProgressPercent(current, total, 45));
14016
- setExportStatusMessage(chunk275WERXZ_js.slideStatusLabel("Capturing", current, total));
14056
+ setExportProgress(chunkVKOVFVDJ_js.slideProgressPercent(current, total, 45));
14057
+ setExportStatusMessage(chunkVKOVFVDJ_js.slideStatusLabel("Capturing", current, total));
14017
14058
  },
14018
14059
  onRecordProgress: (current, total) => {
14019
- setExportProgress(chunk275WERXZ_js.recordProgressPercent(current, total));
14020
- setExportStatusMessage(chunk275WERXZ_js.slideStatusLabel("Recording", current, total));
14060
+ setExportProgress(chunkVKOVFVDJ_js.recordProgressPercent(current, total));
14061
+ setExportStatusMessage(chunkVKOVFVDJ_js.slideStatusLabel("Recording", current, total));
14021
14062
  },
14022
14063
  signal: abortCtrl.signal
14023
14064
  }
14024
14065
  );
14025
- setExportProgress(chunk275WERXZ_js.EXPORT_ASSEMBLING_PERCENT);
14066
+ setExportProgress(chunkVKOVFVDJ_js.EXPORT_ASSEMBLING_PERCENT);
14026
14067
  setExportStatusMessage("Saving file...");
14027
14068
  downloadBlob2(blob, "presentation.webm");
14028
- setExportProgress(chunk275WERXZ_js.EXPORT_DONE_PERCENT);
14069
+ setExportProgress(chunkVKOVFVDJ_js.EXPORT_DONE_PERCENT);
14029
14070
  } catch (err) {
14030
- if (!chunk275WERXZ_js.isExportAbortError(err)) {
14071
+ if (!chunkVKOVFVDJ_js.isExportAbortError(err)) {
14031
14072
  console.error("[PowerPointViewer] Video export failed:", err);
14032
14073
  }
14033
14074
  } finally {
@@ -14055,18 +14096,18 @@ function useExportHandlers(input) {
14055
14096
  scale: 0.5,
14056
14097
  slideDurationMs: 2e3,
14057
14098
  onProgress: (current, total) => {
14058
- setExportProgress(chunk275WERXZ_js.slideProgressPercent(current, total));
14059
- setExportStatusMessage(chunk275WERXZ_js.slideStatusLabel("Encoding", current, total));
14099
+ setExportProgress(chunkVKOVFVDJ_js.slideProgressPercent(current, total));
14100
+ setExportStatusMessage(chunkVKOVFVDJ_js.slideStatusLabel("Encoding", current, total));
14060
14101
  },
14061
14102
  signal: abortCtrl.signal
14062
14103
  }
14063
14104
  );
14064
- setExportProgress(chunk275WERXZ_js.EXPORT_ASSEMBLING_PERCENT);
14105
+ setExportProgress(chunkVKOVFVDJ_js.EXPORT_ASSEMBLING_PERCENT);
14065
14106
  setExportStatusMessage("Saving file...");
14066
14107
  downloadBlob2(blob, "presentation.gif");
14067
- setExportProgress(chunk275WERXZ_js.EXPORT_DONE_PERCENT);
14108
+ setExportProgress(chunkVKOVFVDJ_js.EXPORT_DONE_PERCENT);
14068
14109
  } catch (err) {
14069
- if (!chunk275WERXZ_js.isExportAbortError(err)) {
14110
+ if (!chunkVKOVFVDJ_js.isExportAbortError(err)) {
14070
14111
  console.error("[PowerPointViewer] GIF export failed:", err);
14071
14112
  }
14072
14113
  } finally {
@@ -14106,7 +14147,7 @@ function openPrintWindow(title, bodyHtml, orientation, colorFilter, frameSlides)
14106
14147
  }
14107
14148
  printWindow.document.open();
14108
14149
  printWindow.document.write(
14109
- chunk275WERXZ_js.buildPrintHtmlDocument({ title, bodyHtml, orientation, colorFilter, frameSlides })
14150
+ chunkVKOVFVDJ_js.buildPrintHtmlDocument({ title, bodyHtml, orientation, colorFilter, frameSlides })
14110
14151
  );
14111
14152
  printWindow.document.close();
14112
14153
  printWindow.focus();
@@ -14167,7 +14208,7 @@ function usePrintHandlers(input) {
14167
14208
  if (svgs.length === 0) {
14168
14209
  return;
14169
14210
  }
14170
- const printDoc = chunk275WERXZ_js.buildPrintDocument(svgs, pptxData.width, pptxData.height, {
14211
+ const printDoc = chunkVKOVFVDJ_js.buildPrintDocument(svgs, pptxData.width, pptxData.height, {
14171
14212
  title: "Slides (Vector)",
14172
14213
  orientation: settings.orientation,
14173
14214
  colorFilter
@@ -14203,7 +14244,7 @@ function usePrintHandlers(input) {
14203
14244
  if (settings.printWhat === "outline") {
14204
14245
  openPrintWindow(
14205
14246
  "Outline",
14206
- `<div class="outline-page">${chunk275WERXZ_js.buildOutlineHtml(slideIndices, slides)}</div>`,
14247
+ `<div class="outline-page">${chunkVKOVFVDJ_js.buildOutlineHtml(slideIndices, slides)}</div>`,
14207
14248
  settings.orientation,
14208
14249
  colorFilter,
14209
14250
  settings.frameSlides
@@ -14228,7 +14269,7 @@ function usePrintHandlers(input) {
14228
14269
  if (settings.printWhat === "slides") {
14229
14270
  openPrintWindow(
14230
14271
  "Slides",
14231
- chunk275WERXZ_js.buildSlidesHtml(slideImages, slideIndices),
14272
+ chunkVKOVFVDJ_js.buildSlidesHtml(slideImages, slideIndices),
14232
14273
  settings.orientation,
14233
14274
  colorFilter,
14234
14275
  settings.frameSlides
@@ -14238,7 +14279,7 @@ function usePrintHandlers(input) {
14238
14279
  if (settings.printWhat === "notes") {
14239
14280
  openPrintWindow(
14240
14281
  "Notes Pages",
14241
- chunk275WERXZ_js.buildNotesHtml(slideImages, slideIndices, slides),
14282
+ chunkVKOVFVDJ_js.buildNotesHtml(slideImages, slideIndices, slides),
14242
14283
  "portrait",
14243
14284
  colorFilter,
14244
14285
  settings.frameSlides
@@ -14249,7 +14290,7 @@ function usePrintHandlers(input) {
14249
14290
  const spp = settings.slidesPerPage;
14250
14291
  openPrintWindow(
14251
14292
  `Handout ${spp} per page`,
14252
- chunk275WERXZ_js.buildHandoutsHtml(slideImages, slideIndices, spp),
14293
+ chunkVKOVFVDJ_js.buildHandoutsHtml(slideImages, slideIndices, spp),
14253
14294
  "portrait",
14254
14295
  colorFilter,
14255
14296
  settings.frameSlides
@@ -14532,7 +14573,7 @@ function usePropertyHandlers(input) {
14532
14573
  width: canvasSize.width,
14533
14574
  height: canvasSize.height
14534
14575
  };
14535
- setCompareResult(chunk275WERXZ_js.comparePresentation(cur, other));
14576
+ setCompareResult(chunkVKOVFVDJ_js.comparePresentation(cur, other));
14536
14577
  setIsComparePanelOpen(true);
14537
14578
  } catch (err) {
14538
14579
  console.warn("Compare failed:", err);
@@ -14549,7 +14590,7 @@ function usePropertyHandlers(input) {
14549
14590
  if (!diff || diff.status === "unchanged") {
14550
14591
  return;
14551
14592
  }
14552
- setSlides((prev) => chunk275WERXZ_js.applyAcceptSlide(prev, diff));
14593
+ setSlides((prev) => chunkVKOVFVDJ_js.applyAcceptSlide(prev, diff));
14553
14594
  setIsDirty(true);
14554
14595
  },
14555
14596
  [compareResult, setSlides, setIsDirty]
@@ -14560,10 +14601,10 @@ function usePropertyHandlers(input) {
14560
14601
  if (!compareResult) {
14561
14602
  return;
14562
14603
  }
14563
- setSlides((prev) => chunk275WERXZ_js.applyAcceptAllSlides(prev, compareResult));
14604
+ setSlides((prev) => chunkVKOVFVDJ_js.applyAcceptAllSlides(prev, compareResult));
14564
14605
  setIsDirty(true);
14565
14606
  }, [compareResult, setSlides, setIsDirty]);
14566
- const usedFontFamilies = React3.useMemo(() => chunk275WERXZ_js.collectUsedFonts(slides), [slides]);
14607
+ const usedFontFamilies = React3.useMemo(() => chunkVKOVFVDJ_js.collectUsedFonts(slides), [slides]);
14567
14608
  return {
14568
14609
  handleUpdateNotes,
14569
14610
  handleUpdateSlide,
@@ -14682,7 +14723,7 @@ function useIsMobile(input) {
14682
14723
  const containerRef = input?.containerRef;
14683
14724
  const isTouchDevice = React3.useSyncExternalStore(
14684
14725
  subscribeTouchCapability,
14685
- chunk275WERXZ_js.detectTouchDevice,
14726
+ chunkVKOVFVDJ_js.detectTouchDevice,
14686
14727
  () => false
14687
14728
  // server snapshot
14688
14729
  );
@@ -14698,7 +14739,7 @@ function useIsMobile(input) {
14698
14739
  }
14699
14740
  return containerRef?.current?.clientHeight ?? window.innerHeight;
14700
14741
  });
14701
- const [orientation, setOrientation] = React3.useState(chunk275WERXZ_js.detectOrientation);
14742
+ const [orientation, setOrientation] = React3.useState(chunkVKOVFVDJ_js.detectOrientation);
14702
14743
  const [isVirtualKeyboardOpen, setIsVirtualKeyboardOpen] = React3.useState(false);
14703
14744
  const [initialViewportHeight] = React3.useState(
14704
14745
  () => typeof window !== "undefined" ? window.innerHeight : 800
@@ -14742,7 +14783,7 @@ function useIsMobile(input) {
14742
14783
  return;
14743
14784
  }
14744
14785
  const handleOrientationChange = () => {
14745
- setOrientation(chunk275WERXZ_js.detectOrientation());
14786
+ setOrientation(chunkVKOVFVDJ_js.detectOrientation());
14746
14787
  };
14747
14788
  if (screen.orientation) {
14748
14789
  screen.orientation.addEventListener("change", handleOrientationChange);
@@ -14772,9 +14813,9 @@ function useIsMobile(input) {
14772
14813
  window.addEventListener("resize", handleResize);
14773
14814
  return () => window.removeEventListener("resize", handleResize);
14774
14815
  }, [isTouchDevice, initialViewportHeight]);
14775
- const isMobile = chunk275WERXZ_js.isMobileViewport(containerWidth, containerHeight, isTouchDevice);
14776
- const isTablet = !isMobile && containerWidth >= chunk275WERXZ_js.MOBILE_BREAKPOINT && containerWidth < chunk275WERXZ_js.TABLET_BREAKPOINT;
14777
- const isDesktop = !isMobile && containerWidth >= chunk275WERXZ_js.TABLET_BREAKPOINT;
14816
+ const isMobile = chunkVKOVFVDJ_js.isMobileViewport(containerWidth, containerHeight, isTouchDevice);
14817
+ const isTablet = !isMobile && containerWidth >= chunkVKOVFVDJ_js.MOBILE_BREAKPOINT && containerWidth < chunkVKOVFVDJ_js.TABLET_BREAKPOINT;
14818
+ const isDesktop = !isMobile && containerWidth >= chunkVKOVFVDJ_js.TABLET_BREAKPOINT;
14778
14819
  return {
14779
14820
  isMobile,
14780
14821
  isTablet,
@@ -14835,11 +14876,11 @@ function useViewerDialogs(input) {
14835
14876
  );
14836
14877
  const [embedFontsEnabled, setEmbedFontsEnabled] = React3.useState(false);
14837
14878
  const [isNarrowViewport, setIsNarrowViewport] = React3.useState(
14838
- () => typeof window !== "undefined" ? chunk275WERXZ_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch()) : false
14879
+ () => typeof window !== "undefined" ? chunkVKOVFVDJ_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch()) : false
14839
14880
  );
14840
14881
  React3.useEffect(() => {
14841
14882
  const handleWindow = () => setIsNarrowViewport(
14842
- chunk275WERXZ_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch())
14883
+ chunkVKOVFVDJ_js.isMobileViewport(window.innerWidth, window.innerHeight, viewportIsTouch())
14843
14884
  );
14844
14885
  let observer = null;
14845
14886
  let raf = 0;
@@ -14853,12 +14894,12 @@ function useViewerDialogs(input) {
14853
14894
  const entry = entries[0];
14854
14895
  if (entry) {
14855
14896
  setIsNarrowViewport(
14856
- chunk275WERXZ_js.isMobileViewport(entry.contentRect.width, entry.contentRect.height, viewportIsTouch())
14897
+ chunkVKOVFVDJ_js.isMobileViewport(entry.contentRect.width, entry.contentRect.height, viewportIsTouch())
14857
14898
  );
14858
14899
  }
14859
14900
  });
14860
14901
  observer.observe(el);
14861
- setIsNarrowViewport(chunk275WERXZ_js.isMobileViewport(el.clientWidth, el.clientHeight, viewportIsTouch()));
14902
+ setIsNarrowViewport(chunkVKOVFVDJ_js.isMobileViewport(el.clientWidth, el.clientHeight, viewportIsTouch()));
14862
14903
  };
14863
14904
  attach();
14864
14905
  window.addEventListener("resize", handleWindow);
@@ -15035,7 +15076,7 @@ function computeVisibleSlideIndexes(slides, activeCustomShowId, customShows) {
15035
15076
  return slides.map((_, i) => i).filter((i) => !slides[i]?.hidden);
15036
15077
  }
15037
15078
  function computeSlideSectionGroups(slides, sections) {
15038
- return chunk275WERXZ_js.groupSlidesBySection(sections, slides).map((group) => ({
15079
+ return chunkVKOVFVDJ_js.groupSlidesBySection(sections, slides).map((group) => ({
15039
15080
  id: group.section?.id ?? (sections.length > 0 ? UNGROUPED_SECTION_ID : "default"),
15040
15081
  label: group.section?.name ?? (sections.length > 0 ? "Ungrouped Slides" : "Slides"),
15041
15082
  slideIndexes: group.slideIndexes,
@@ -15113,26 +15154,17 @@ function useDerivedSlideState(input) {
15113
15154
  };
15114
15155
  }
15115
15156
  function useAnnotationHandlers(input) {
15116
- const { mode, presentation, annotations, history, setMode, setSlides } = input;
15157
+ const {
15158
+ mode,
15159
+ presentation,
15160
+ annotations,
15161
+ history,
15162
+ setMode,
15163
+ setSlides,
15164
+ promptKeepInkAnnotations = true
15165
+ } = input;
15117
15166
  const [showKeepAnnotationsDialog, setShowKeepAnnotationsDialog] = React3.useState(false);
15118
15167
  const pendingModeAfterAnnotationsRef = React3.useRef("edit");
15119
- const handleSetMode = React3.useCallback(
15120
- (nextMode) => {
15121
- if (nextMode === "present") {
15122
- presentation.enterPresentMode();
15123
- } else if (mode === "present" && annotations.hasAnyAnnotations) {
15124
- stopAllPersistentAudio();
15125
- pendingModeAfterAnnotationsRef.current = nextMode;
15126
- setShowKeepAnnotationsDialog(true);
15127
- } else {
15128
- if (mode === "present") {
15129
- stopAllPersistentAudio();
15130
- }
15131
- setMode(nextMode);
15132
- }
15133
- },
15134
- [presentation, mode, annotations.hasAnyAnnotations, setMode]
15135
- );
15136
15168
  const handleKeepAnnotations = React3.useCallback(() => {
15137
15169
  const annotationMap = annotations.allSlideAnnotations;
15138
15170
  if (annotationMap.size === 0) {
@@ -15201,6 +15233,34 @@ function useAnnotationHandlers(input) {
15201
15233
  setShowKeepAnnotationsDialog(false);
15202
15234
  setMode(pendingModeAfterAnnotationsRef.current);
15203
15235
  }, [annotations, setMode, setSlides, history]);
15236
+ const handleSetMode = React3.useCallback(
15237
+ (nextMode) => {
15238
+ if (nextMode === "present") {
15239
+ presentation.enterPresentMode();
15240
+ } else if (mode === "present" && annotations.hasAnyAnnotations) {
15241
+ stopAllPersistentAudio();
15242
+ pendingModeAfterAnnotationsRef.current = nextMode;
15243
+ if (promptKeepInkAnnotations) {
15244
+ setShowKeepAnnotationsDialog(true);
15245
+ } else {
15246
+ handleKeepAnnotations();
15247
+ }
15248
+ } else {
15249
+ if (mode === "present") {
15250
+ stopAllPersistentAudio();
15251
+ }
15252
+ setMode(nextMode);
15253
+ }
15254
+ },
15255
+ [
15256
+ presentation,
15257
+ mode,
15258
+ annotations.hasAnyAnnotations,
15259
+ promptKeepInkAnnotations,
15260
+ handleKeepAnnotations,
15261
+ setMode
15262
+ ]
15263
+ );
15204
15264
  const handleDiscardAnnotations = React3.useCallback(() => {
15205
15265
  annotations.clearAllAnnotations();
15206
15266
  setShowKeepAnnotationsDialog(false);
@@ -15259,7 +15319,7 @@ function useSerialize(input) {
15259
15319
  return {
15260
15320
  ...el,
15261
15321
  text: pendingEditText,
15262
- textSegments: chunk275WERXZ_js.remapTextToSegments(pendingEditText, el.textSegments, el.textStyle)
15322
+ textSegments: chunkVKOVFVDJ_js.remapTextToSegments(pendingEditText, el.textSegments, el.textStyle)
15263
15323
  };
15264
15324
  });
15265
15325
  if (updatedElements.some((el, i) => el !== slide.elements[i])) {
@@ -15427,14 +15487,18 @@ function usePresentationSetup(input) {
15427
15487
  setMode,
15428
15488
  setActiveSlideIndex,
15429
15489
  setSlides,
15430
- history
15490
+ history,
15491
+ endWithBlackSlide = true,
15492
+ promptKeepInkAnnotations = true,
15493
+ popupToolbarEnabled = true
15431
15494
  } = input;
15432
15495
  const actionSoundHandlerRef = React3.useRef(null);
15433
15496
  const [, setShowKeepAnnotationsDialog] = React3.useState(false);
15434
15497
  const pendingModeRef = React3.useRef("edit");
15435
15498
  const annotations = usePresentationAnnotations({
15436
15499
  isActive: mode === "present",
15437
- activeSlideIndex
15500
+ activeSlideIndex,
15501
+ popupToolbarEnabled
15438
15502
  });
15439
15503
  const presentation = usePresentationMode({
15440
15504
  mode,
@@ -15444,7 +15508,7 @@ function usePresentationSetup(input) {
15444
15508
  containerRef,
15445
15509
  content,
15446
15510
  onSetMode: (nextMode) => {
15447
- if (mode === "present" && nextMode !== "present" && annotations.hasAnyAnnotations) {
15511
+ if (mode === "present" && nextMode !== "present" && annotations.hasAnyAnnotations && promptKeepInkAnnotations) {
15448
15512
  pendingModeRef.current = nextMode;
15449
15513
  setShowKeepAnnotationsDialog(true);
15450
15514
  } else {
@@ -15492,12 +15556,13 @@ function usePresentationSetup(input) {
15492
15556
  onToggleEraser: () => annotations.setPresentationTool("eraser"),
15493
15557
  onToggleToolbar: () => annotations.setToolbarVisible(!annotations.toolbarVisible),
15494
15558
  onSaveRehearsalTimings: (timings) => {
15495
- setSlides((prev) => chunk275WERXZ_js.applyRehearsalTimings(prev, timings));
15559
+ setSlides((prev) => chunkVKOVFVDJ_js.applyRehearsalTimings(prev, timings));
15496
15560
  history.markDirty();
15497
15561
  },
15498
- loopContinuously: chunk275WERXZ_js.shouldLoopContinuously(presentationProperties),
15562
+ loopContinuously: chunkVKOVFVDJ_js.shouldLoopContinuously(presentationProperties),
15499
15563
  showWithAnimation: presentationProperties.showWithAnimation,
15500
- useTimings: presentationProperties.advanceMode !== "manual"
15564
+ useTimings: presentationProperties.advanceMode !== "manual",
15565
+ endWithBlackSlide
15501
15566
  });
15502
15567
  return { presentation, annotations, actionSoundHandlerRef };
15503
15568
  }
@@ -15518,7 +15583,8 @@ function useEditorOperations(input) {
15518
15583
  dialogs,
15519
15584
  presentation,
15520
15585
  userName,
15521
- handlerRef
15586
+ handlerRef,
15587
+ transformCommittedText
15522
15588
  } = input;
15523
15589
  const ops = useElementOperations({
15524
15590
  activeSlide,
@@ -15587,7 +15653,8 @@ function useEditorOperations(input) {
15587
15653
  presentationHandleAction: presentation.handlePresentationAction,
15588
15654
  setEditingEquationOmml: dialogs.setEditingEquationOmml,
15589
15655
  setIsEquationDialogOpen: dialogs.setIsEquationDialogOpen,
15590
- setPointerCommitNonce: state.setPointerCommitNonce
15656
+ setPointerCommitNonce: state.setPointerCommitNonce,
15657
+ transformCommittedText
15591
15658
  });
15592
15659
  const insertHandlers = useInsertElements({
15593
15660
  activeSlide,
@@ -15654,7 +15721,7 @@ function useEditorOperations(input) {
15654
15721
  const { formatPainterActive, setFormatPainterActive, elementLookup } = state;
15655
15722
  React3.useEffect(() => {
15656
15723
  if (formatPainterActive && !prevFormatPainterRef.current && selectedElement) {
15657
- copiedFormatRef.current = chunk275WERXZ_js.copyFormatFromElement(selectedElement);
15724
+ copiedFormatRef.current = chunkVKOVFVDJ_js.copyFormatFromElement(selectedElement);
15658
15725
  } else if (!formatPainterActive) {
15659
15726
  copiedFormatRef.current = null;
15660
15727
  }
@@ -15680,7 +15747,7 @@ function useEditorOperations(input) {
15680
15747
  e.stopPropagation();
15681
15748
  const element = elementLookup.get(elementId);
15682
15749
  if (element) {
15683
- const updated = chunk275WERXZ_js.applyFormatToElement(element, copiedFormatRef.current);
15750
+ const updated = chunkVKOVFVDJ_js.applyFormatToElement(element, copiedFormatRef.current);
15684
15751
  const updates = {};
15685
15752
  if (chunkKV3EOLP3_js.hasShapeProperties(updated)) {
15686
15753
  updates.shapeStyle = updated.shapeStyle;
@@ -16609,9 +16676,20 @@ function useReducedMotion() {
16609
16676
  setManualReducedMotion
16610
16677
  };
16611
16678
  }
16612
- var KNOWN_TAB_IDS = new Set(chunk275WERXZ_js.TOOLBAR_TABS.map((tab) => tab.id));
16679
+ function useViewerOptions() {
16680
+ const storeRef = React3.useRef(null);
16681
+ storeRef.current ??= chunkVKOVFVDJ_js.createViewerOptionsStore();
16682
+ const store = storeRef.current;
16683
+ const options = React3.useSyncExternalStore(
16684
+ (onStoreChange) => store.subscribe(onStoreChange),
16685
+ () => store.getOptions(),
16686
+ () => store.getOptions()
16687
+ );
16688
+ return { optionsStore: store, options };
16689
+ }
16690
+ var KNOWN_TAB_IDS = new Set(chunkVKOVFVDJ_js.TOOLBAR_TABS.map((tab) => tab.id));
16613
16691
  function computeToolbarVisibility(hiddenActions) {
16614
- const isHidden = (id) => chunk275WERXZ_js.isActionHidden(id, hiddenActions);
16692
+ const isHidden = (id) => chunkVKOVFVDJ_js.isActionHidden(id, hiddenActions);
16615
16693
  const isTabVisible = (id) => !KNOWN_TAB_IDS.has(id) || !isHidden(id);
16616
16694
  return { isHidden, isTabVisible };
16617
16695
  }
@@ -16628,7 +16706,7 @@ function useYjsProvider({ config }) {
16628
16706
  const timeoutRef = React3.useRef(null);
16629
16707
  const gateRef = React3.useRef(null);
16630
16708
  if (!gateRef.current) {
16631
- gateRef.current = chunk275WERXZ_js.createSyncGate(() => setSynced(true));
16709
+ gateRef.current = chunkVKOVFVDJ_js.createSyncGate(() => setSynced(true));
16632
16710
  }
16633
16711
  const teardown = React3.useCallback(() => {
16634
16712
  if (timeoutRef.current) {
@@ -16666,7 +16744,7 @@ function useYjsProvider({ config }) {
16666
16744
  if (config.authToken) {
16667
16745
  opts.password = config.authToken;
16668
16746
  }
16669
- const provider = new WebrtcProvider(chunk275WERXZ_js.validateRoomId(config.roomId), yDoc, opts);
16747
+ const provider = new WebrtcProvider(chunkVKOVFVDJ_js.validateRoomId(config.roomId), yDoc, opts);
16670
16748
  setDoc(yDoc);
16671
16749
  setAwareness(provider.awareness);
16672
16750
  setClientId(provider.awareness.clientID);
@@ -16708,13 +16786,13 @@ function useYjsProvider({ config }) {
16708
16786
  if (!config) {
16709
16787
  return;
16710
16788
  }
16711
- const roomId = chunk275WERXZ_js.validateRoomId(config.roomId);
16712
- const transport = config.transport ?? chunk275WERXZ_js.resolveTransportForServerUrl(config.serverUrl);
16789
+ const roomId = chunkVKOVFVDJ_js.validateRoomId(config.roomId);
16790
+ const transport = config.transport ?? chunkVKOVFVDJ_js.resolveTransportForServerUrl(config.serverUrl);
16713
16791
  if (transport === "webrtc") {
16714
16792
  await initWebrtc();
16715
16793
  return;
16716
16794
  }
16717
- if (chunk275WERXZ_js.isMixedContentBlocked(config.serverUrl)) {
16795
+ if (chunkVKOVFVDJ_js.isMixedContentBlocked(config.serverUrl)) {
16718
16796
  console.warn(
16719
16797
  `[pptx-viewer] Refusing to connect: insecure ws:// server "${config.serverUrl}" is blocked from a secure (https) page. Use a wss:// URL.`
16720
16798
  );
@@ -16774,7 +16852,7 @@ function useYjsProvider({ config }) {
16774
16852
  cleanupRef.current = null;
16775
16853
  setStatus("error");
16776
16854
  }
16777
- }, chunk275WERXZ_js.CONNECTION_TIMEOUT_MS);
16855
+ }, chunkVKOVFVDJ_js.CONNECTION_TIMEOUT_MS);
16778
16856
  }
16779
16857
  setDoc(yDoc);
16780
16858
  setAwareness(provider.awareness);
@@ -16847,7 +16925,7 @@ function usePresenceTracking({
16847
16925
  awareness.setLocalStateField("presence", state);
16848
16926
  lastBroadcastRef.current = Date.now();
16849
16927
  };
16850
- if (elapsed >= chunk275WERXZ_js.BROADCAST_THROTTLE_MS) {
16928
+ if (elapsed >= chunkVKOVFVDJ_js.BROADCAST_THROTTLE_MS) {
16851
16929
  if (pendingBroadcastRef.current) {
16852
16930
  clearTimeout(pendingBroadcastRef.current);
16853
16931
  pendingBroadcastRef.current = null;
@@ -16857,7 +16935,7 @@ function usePresenceTracking({
16857
16935
  pendingBroadcastRef.current = setTimeout(() => {
16858
16936
  pendingBroadcastRef.current = null;
16859
16937
  flush();
16860
- }, chunk275WERXZ_js.BROADCAST_THROTTLE_MS - elapsed);
16938
+ }, chunkVKOVFVDJ_js.BROADCAST_THROTTLE_MS - elapsed);
16861
16939
  }
16862
16940
  },
16863
16941
  [awareness, userName, userColor, userAvatar, role]
@@ -16882,7 +16960,7 @@ function usePresenceTracking({
16882
16960
  return;
16883
16961
  }
16884
16962
  const handleChange = () => {
16885
- const users = chunk275WERXZ_js.derivePresenceList(
16963
+ const users = chunkVKOVFVDJ_js.derivePresenceList(
16886
16964
  awareness.getStates(),
16887
16965
  localClientId,
16888
16966
  canvasWidth,
@@ -16930,7 +17008,7 @@ function useCollaborativeState({
16930
17008
  canvasWidth,
16931
17009
  canvasHeight
16932
17010
  }) {
16933
- const userColor = chunk275WERXZ_js.sanitizeColor(config?.userColor, "#6366f1");
17011
+ const userColor = chunkVKOVFVDJ_js.sanitizeColor(config?.userColor, "#6366f1");
16934
17012
  const { status, awareness, doc, clientId, synced, retry } = useYjsProvider({ config });
16935
17013
  const { remoteUsers, broadcastPresence } = usePresenceTracking({
16936
17014
  awareness,
@@ -17038,7 +17116,7 @@ function useYjsDocumentSync({
17038
17116
  const { PptxHandler: PptxHandler2 } = await import('./dist-XF3QJAEF.js');
17039
17117
  const handler = new PptxHandler2();
17040
17118
  await handler.load(sourceBytes.buffer);
17041
- const currentSlides = chunk275WERXZ_js.readSlidesFromYDoc(
17119
+ const currentSlides = chunkVKOVFVDJ_js.readSlidesFromYDoc(
17042
17120
  doc
17043
17121
  );
17044
17122
  const slidesToSave = buildSaveSlides(currentSlides, templateElementsBySlideId);
@@ -17056,7 +17134,7 @@ function useYjsDocumentSync({
17056
17134
  if (!doc || !isConnected) {
17057
17135
  return;
17058
17136
  }
17059
- const docSlides = chunk275WERXZ_js.readSlidesFromYDoc(
17137
+ const docSlides = chunkVKOVFVDJ_js.readSlidesFromYDoc(
17060
17138
  doc
17061
17139
  );
17062
17140
  if (docSlides.length === 0) {
@@ -17080,11 +17158,11 @@ function useYjsDocumentSync({
17080
17158
  lastSyncedRef.current = serialized;
17081
17159
  void (async () => {
17082
17160
  const factories = await getFactories();
17083
- chunk275WERXZ_js.reconcileSlidesInYDoc(
17161
+ chunkVKOVFVDJ_js.reconcileSlidesInYDoc(
17084
17162
  slides,
17085
17163
  doc,
17086
17164
  factories,
17087
- chunk275WERXZ_js.LOCAL_SYNC_ORIGIN
17165
+ chunkVKOVFVDJ_js.LOCAL_SYNC_ORIGIN
17088
17166
  );
17089
17167
  scheduleWriteBack();
17090
17168
  })();
@@ -17094,10 +17172,10 @@ function useYjsDocumentSync({
17094
17172
  return;
17095
17173
  }
17096
17174
  const handleChange = (_events, transaction) => {
17097
- if (transaction?.origin === chunk275WERXZ_js.LOCAL_SYNC_ORIGIN) {
17175
+ if (transaction?.origin === chunkVKOVFVDJ_js.LOCAL_SYNC_ORIGIN) {
17098
17176
  return;
17099
17177
  }
17100
- const remoteSlides = chunk275WERXZ_js.readSlidesFromYDoc(
17178
+ const remoteSlides = chunkVKOVFVDJ_js.readSlidesFromYDoc(
17101
17179
  doc
17102
17180
  );
17103
17181
  if (remoteSlides.length === 0) {
@@ -17115,7 +17193,7 @@ function useYjsDocumentSync({
17115
17193
  });
17116
17194
  scheduleWriteBack();
17117
17195
  };
17118
- const unobserve = chunk275WERXZ_js.observeYDocSlides(
17196
+ const unobserve = chunkVKOVFVDJ_js.observeYDocSlides(
17119
17197
  doc,
17120
17198
  handleChange
17121
17199
  );
@@ -17266,7 +17344,7 @@ function useLayoutSwitching(input) {
17266
17344
  function useVirtualizedSlides({
17267
17345
  totalItems,
17268
17346
  itemHeight,
17269
- overscan = chunk275WERXZ_js.DEFAULT_VIRTUAL_OVERSCAN
17347
+ overscan = chunkVKOVFVDJ_js.DEFAULT_VIRTUAL_OVERSCAN
17270
17348
  }) {
17271
17349
  const scrollContainerRef = React3.useRef(null);
17272
17350
  const [scrollTop, setScrollTop] = React3.useState(0);
@@ -17296,7 +17374,7 @@ function useVirtualizedSlides({
17296
17374
  resizeObserver?.disconnect();
17297
17375
  };
17298
17376
  }, []);
17299
- const range = chunk275WERXZ_js.computeVirtualRange(totalItems, itemHeight, scrollTop, viewportHeight, overscan);
17377
+ const range = chunkVKOVFVDJ_js.computeVirtualRange(totalItems, itemHeight, scrollTop, viewportHeight, overscan);
17300
17378
  const safeItemHeight = Math.max(itemHeight, 1);
17301
17379
  const scrollToIndex = React3.useCallback(
17302
17380
  (index, behavior = "smooth") => {
@@ -17342,7 +17420,7 @@ function useTouchGestures(input) {
17342
17420
  if (!el || !enabled) {
17343
17421
  return;
17344
17422
  }
17345
- const recognizer = chunk275WERXZ_js.createTouchGestureRecognizer({
17423
+ const recognizer = chunkVKOVFVDJ_js.createTouchGestureRecognizer({
17346
17424
  getScale: () => scaleRef.current,
17347
17425
  minScale: MIN_ZOOM_SCALE,
17348
17426
  maxScale: MAX_ZOOM_SCALE,
@@ -17385,7 +17463,7 @@ function scrollFocusedIntoView(keyboardInset) {
17385
17463
  return;
17386
17464
  }
17387
17465
  const rect = active.getBoundingClientRect();
17388
- const delta = chunk275WERXZ_js.computeScrollDelta(
17466
+ const delta = chunkVKOVFVDJ_js.computeScrollDelta(
17389
17467
  { top: rect.top, bottom: rect.bottom },
17390
17468
  window.innerHeight,
17391
17469
  keyboardInset
@@ -17405,8 +17483,8 @@ function useKeyboardInsets(enabled = true) {
17405
17483
  return;
17406
17484
  }
17407
17485
  const update = () => {
17408
- const metrics = chunk275WERXZ_js.readViewportMetrics(window);
17409
- const inset = metrics ? chunk275WERXZ_js.computeKeyboardInset(metrics) : 0;
17486
+ const metrics = chunkVKOVFVDJ_js.readViewportMetrics(window);
17487
+ const inset = metrics ? chunkVKOVFVDJ_js.computeKeyboardInset(metrics) : 0;
17410
17488
  setKeyboardInset(inset);
17411
17489
  if (inset > 0) {
17412
17490
  window.requestAnimationFrame(() => scrollFocusedIntoView(inset));
@@ -17417,8 +17495,8 @@ function useKeyboardInsets(enabled = true) {
17417
17495
  vv.addEventListener("scroll", update);
17418
17496
  const onFocusIn = () => {
17419
17497
  window.requestAnimationFrame(() => {
17420
- const metrics = chunk275WERXZ_js.readViewportMetrics(window);
17421
- const inset = metrics ? chunk275WERXZ_js.computeKeyboardInset(metrics) : 0;
17498
+ const metrics = chunkVKOVFVDJ_js.readViewportMetrics(window);
17499
+ const inset = metrics ? chunkVKOVFVDJ_js.computeKeyboardInset(metrics) : 0;
17422
17500
  if (inset > 0) {
17423
17501
  scrollFocusedIntoView(inset);
17424
17502
  }
@@ -17431,7 +17509,7 @@ function useKeyboardInsets(enabled = true) {
17431
17509
  document.removeEventListener("focusin", onFocusIn);
17432
17510
  };
17433
17511
  }, [enabled]);
17434
- return { keyboardInset, isKeyboardOpen: chunk275WERXZ_js.isKeyboardOpen(keyboardInset) };
17512
+ return { keyboardInset, isKeyboardOpen: chunkVKOVFVDJ_js.isKeyboardOpen(keyboardInset) };
17435
17513
  }
17436
17514
 
17437
17515
  // src/viewer/hooks/useViewerBuildingBlocks-canvas-props.ts
@@ -17486,13 +17564,13 @@ function buildCanvasProps(input) {
17486
17564
  if (mode === "present") {
17487
17565
  presentation.handlePresentationAction(action);
17488
17566
  } else if (action.url) {
17489
- chunk275WERXZ_js.safeOpenUrl(action.url);
17567
+ chunkVKOVFVDJ_js.safeOpenUrl(action.url);
17490
17568
  }
17491
17569
  };
17492
17570
  const handleHyperlinkClick = (url) => {
17493
- if (chunk275WERXZ_js.isPpactionUrl(url)) {
17571
+ if (chunkVKOVFVDJ_js.isPpactionUrl(url)) {
17494
17572
  if (mode === "present") {
17495
- const parsed = chunk275WERXZ_js.parsePpactionUrl(url);
17573
+ const parsed = chunkVKOVFVDJ_js.parsePpactionUrl(url);
17496
17574
  if (parsed) {
17497
17575
  presentation.handlePresentationAction({
17498
17576
  action: parsed.action,
@@ -17502,7 +17580,7 @@ function buildCanvasProps(input) {
17502
17580
  }
17503
17581
  return;
17504
17582
  }
17505
- chunk275WERXZ_js.safeOpenUrl(url);
17583
+ chunkVKOVFVDJ_js.safeOpenUrl(url);
17506
17584
  };
17507
17585
  return {
17508
17586
  activeSlide: effectiveSlide,
@@ -17822,7 +17900,7 @@ function buildToolbarProps(input) {
17822
17900
  onOpenFile,
17823
17901
  onOpenRecentFile,
17824
17902
  onCreatePresentation: (templateId) => {
17825
- s.setSlides(chunk275WERXZ_js.createBackstagePresentation(templateId));
17903
+ s.setSlides(chunkVKOVFVDJ_js.createBackstagePresentation(templateId));
17826
17904
  s.setActiveSlideIndex(0);
17827
17905
  s.setSelectedElementId(null);
17828
17906
  s.setSelectedElementIds([]);
@@ -17877,7 +17955,7 @@ function buildToolbarProps(input) {
17877
17955
  isCommentsPanelOpen: s.isInspectorPaneOpen,
17878
17956
  slideCommentCount: activeSlide?.comments?.length ?? 0,
17879
17957
  formatPainterActive: s.formatPainterActive,
17880
- canActivateFormatPainter: chunk275WERXZ_js.hasCopyableFormat(selectedElement),
17958
+ canActivateFormatPainter: chunkVKOVFVDJ_js.hasCopyableFormat(selectedElement),
17881
17959
  onToggleFormatPainter: () => s.setFormatPainterActive((p) => !p),
17882
17960
  isSelectionPaneOpen: s.isSelectionPaneOpen,
17883
17961
  onToggleSelectionPane: () => s.setIsSelectionPaneOpen((p) => !p),
@@ -18140,7 +18218,7 @@ function useViewerBuildingBlocks(input) {
18140
18218
  }, [incomingContent]);
18141
18219
  const onOpenFile = React3.useCallback(() => {
18142
18220
  void (async () => {
18143
- const picked = await chunk275WERXZ_js.openPptxFile();
18221
+ const picked = await chunkVKOVFVDJ_js.openPptxFile();
18144
18222
  if (picked) {
18145
18223
  setContent(picked.buffer);
18146
18224
  }
@@ -18148,7 +18226,7 @@ function useViewerBuildingBlocks(input) {
18148
18226
  }, []);
18149
18227
  const onOpenRecentFile = React3.useCallback((key) => {
18150
18228
  void (async () => {
18151
- const bytes = await chunk275WERXZ_js.readBackstageRecentFile(key);
18229
+ const bytes = await chunkVKOVFVDJ_js.readBackstageRecentFile(key);
18152
18230
  if (bytes) {
18153
18231
  setContent(bytes);
18154
18232
  }
@@ -18462,6 +18540,7 @@ exports.useViewerBuildingBlocks = useViewerBuildingBlocks;
18462
18540
  exports.useViewerCoreState = useViewerCoreState;
18463
18541
  exports.useViewerDialogs = useViewerDialogs;
18464
18542
  exports.useViewerIntegration = useViewerIntegration;
18543
+ exports.useViewerOptions = useViewerOptions;
18465
18544
  exports.useViewerState = useViewerState;
18466
18545
  exports.useViewerUIState = useViewerUIState;
18467
18546
  exports.useVirtualizedSlides = useVirtualizedSlides;