pptx-react-viewer 4.6.0 → 4.8.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 (135) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/dist/{AiChatPanel-3C7GM6ZF.js → AiChatPanel-4LMJIJUU.js} +28 -28
  3. package/dist/AiChatPanel-4LMJIJUU.js.br +0 -0
  4. package/dist/AiChatPanel-4LMJIJUU.js.gz +0 -0
  5. package/dist/{AiChatPanel-L7DBCWE3.mjs → AiChatPanel-XWYLYN26.mjs} +4 -4
  6. package/dist/AiChatPanel-XWYLYN26.mjs.br +0 -0
  7. package/dist/AiChatPanel-XWYLYN26.mjs.gz +0 -0
  8. package/dist/{Model3DScene-IJ7YYTYU.mjs → Model3DScene-N6IZ7Q57.mjs} +1 -1
  9. package/dist/Model3DScene-N6IZ7Q57.mjs.br +0 -0
  10. package/dist/Model3DScene-N6IZ7Q57.mjs.gz +0 -0
  11. package/dist/{Model3DScene-USKNPWWH.js → Model3DScene-YAPQ5BCI.js} +2 -2
  12. package/dist/{Model3DScene-USKNPWWH.js.br → Model3DScene-YAPQ5BCI.js.br} +0 -0
  13. package/dist/Model3DScene-YAPQ5BCI.js.gz +0 -0
  14. package/dist/{chunk-ZAQFTO4P.mjs → chunk-KHEJXP4I.mjs} +1175 -149
  15. package/dist/chunk-KHEJXP4I.mjs.br +0 -0
  16. package/dist/chunk-KHEJXP4I.mjs.gz +0 -0
  17. package/dist/{chunk-3JUZOKFI.js → chunk-LTBTG2QB.js} +108 -96
  18. package/dist/chunk-LTBTG2QB.js.br +0 -0
  19. package/dist/chunk-LTBTG2QB.js.gz +0 -0
  20. package/dist/{chunk-ICEZL4TM.mjs → chunk-NPZOVIHG.mjs} +40855 -16211
  21. package/dist/chunk-NPZOVIHG.mjs.br +0 -0
  22. package/dist/chunk-NPZOVIHG.mjs.gz +0 -0
  23. package/dist/{chunk-DFSWCVRW.js → chunk-NV2H57Q4.js} +3083 -2057
  24. package/dist/chunk-NV2H57Q4.js.br +0 -0
  25. package/dist/chunk-NV2H57Q4.js.gz +0 -0
  26. package/dist/{chunk-VCAQSSGD.mjs → chunk-Q4XJSJYI.mjs} +1 -1
  27. package/dist/chunk-Q4XJSJYI.mjs.br +0 -0
  28. package/dist/chunk-Q4XJSJYI.mjs.gz +0 -0
  29. package/dist/{chunk-IBHIXBC5.js → chunk-Q7NWWIPQ.js} +890 -1091
  30. package/dist/chunk-Q7NWWIPQ.js.br +0 -0
  31. package/dist/chunk-Q7NWWIPQ.js.gz +0 -0
  32. package/dist/{chunk-Y4QUVWZC.js → chunk-SAYZSUNQ.js} +315 -274
  33. package/dist/chunk-SAYZSUNQ.js.br +0 -0
  34. package/dist/chunk-SAYZSUNQ.js.gz +0 -0
  35. package/dist/{chunk-INX3E37P.mjs → chunk-SOMUGI3Y.mjs} +84 -286
  36. package/dist/chunk-SOMUGI3Y.mjs.br +0 -0
  37. package/dist/chunk-SOMUGI3Y.mjs.gz +0 -0
  38. package/dist/{chunk-K6QHGABT.mjs → chunk-SSXGPYBF.mjs} +109 -68
  39. package/dist/chunk-SSXGPYBF.mjs.br +0 -0
  40. package/dist/chunk-SSXGPYBF.mjs.gz +0 -0
  41. package/dist/{chunk-5V5SMT5A.js → chunk-UTP22QYH.js} +5 -5
  42. package/dist/chunk-UTP22QYH.js.br +0 -0
  43. package/dist/chunk-UTP22QYH.js.gz +0 -0
  44. package/dist/{chunk-FZSYLXJT.js → chunk-YF2BQIW3.js} +40903 -16217
  45. package/dist/chunk-YF2BQIW3.js.br +0 -0
  46. package/dist/chunk-YF2BQIW3.js.gz +0 -0
  47. package/dist/{chunk-OOO4JL2N.mjs → chunk-YPDPSXPK.mjs} +108 -96
  48. package/dist/chunk-YPDPSXPK.mjs.br +0 -0
  49. package/dist/chunk-YPDPSXPK.mjs.gz +0 -0
  50. package/dist/i18n/de.cjs +134 -117
  51. package/dist/i18n/de.cjs.br +0 -0
  52. package/dist/i18n/de.cjs.gz +0 -0
  53. package/dist/i18n/de.mjs +134 -117
  54. package/dist/i18n/de.mjs.br +0 -0
  55. package/dist/i18n/de.mjs.gz +0 -0
  56. package/dist/i18n/es.cjs +134 -117
  57. package/dist/i18n/es.cjs.br +0 -0
  58. package/dist/i18n/es.cjs.gz +0 -0
  59. package/dist/i18n/es.mjs +134 -117
  60. package/dist/i18n/es.mjs.br +0 -0
  61. package/dist/i18n/es.mjs.gz +0 -0
  62. package/dist/i18n/fr.cjs +134 -117
  63. package/dist/i18n/fr.cjs.br +0 -0
  64. package/dist/i18n/fr.cjs.gz +0 -0
  65. package/dist/i18n/fr.mjs +134 -117
  66. package/dist/i18n/fr.mjs.br +0 -0
  67. package/dist/i18n/fr.mjs.gz +0 -0
  68. package/dist/i18n/zh-CN.cjs +111 -99
  69. package/dist/i18n/zh-CN.cjs.br +0 -0
  70. package/dist/i18n/zh-CN.cjs.gz +0 -0
  71. package/dist/i18n/zh-CN.mjs +111 -99
  72. package/dist/i18n/zh-CN.mjs.br +0 -0
  73. package/dist/i18n/zh-CN.mjs.gz +0 -0
  74. package/dist/i18n.js +4 -4
  75. package/dist/i18n.js.br +0 -0
  76. package/dist/i18n.js.gz +0 -0
  77. package/dist/i18n.mjs +1 -1
  78. package/dist/i18n.mjs.br +0 -0
  79. package/dist/i18n.mjs.gz +0 -0
  80. package/dist/index.d.ts +276 -18
  81. package/dist/index.js +63 -63
  82. package/dist/index.js.br +0 -0
  83. package/dist/index.js.gz +0 -0
  84. package/dist/index.mjs +6 -6
  85. package/dist/index.mjs.br +0 -0
  86. package/dist/index.mjs.gz +0 -0
  87. package/dist/internals.d.ts +329 -18
  88. package/dist/internals.js +105 -105
  89. package/dist/internals.js.br +0 -0
  90. package/dist/internals.js.gz +0 -0
  91. package/dist/internals.mjs +4 -4
  92. package/dist/internals.mjs.br +0 -0
  93. package/dist/internals.mjs.gz +0 -0
  94. package/dist/pptx-viewer.css +1 -1
  95. package/dist/pptx-viewer.css.br +0 -0
  96. package/dist/pptx-viewer.css.gz +0 -0
  97. package/dist/viewer/index.d.ts +231 -16
  98. package/dist/viewer/index.js +27 -27
  99. package/dist/viewer/index.js.br +0 -0
  100. package/dist/viewer/index.js.gz +0 -0
  101. package/dist/viewer/index.mjs +6 -6
  102. package/dist/viewer/index.mjs.br +2 -3
  103. package/dist/viewer/index.mjs.gz +0 -0
  104. package/package.json +1 -1
  105. package/dist/AiChatPanel-3C7GM6ZF.js.br +0 -0
  106. package/dist/AiChatPanel-3C7GM6ZF.js.gz +0 -0
  107. package/dist/AiChatPanel-L7DBCWE3.mjs.br +0 -0
  108. package/dist/AiChatPanel-L7DBCWE3.mjs.gz +0 -0
  109. package/dist/Model3DScene-IJ7YYTYU.mjs.br +0 -0
  110. package/dist/Model3DScene-IJ7YYTYU.mjs.gz +0 -0
  111. package/dist/Model3DScene-USKNPWWH.js.gz +0 -0
  112. package/dist/chunk-3JUZOKFI.js.br +0 -0
  113. package/dist/chunk-3JUZOKFI.js.gz +0 -0
  114. package/dist/chunk-5V5SMT5A.js.br +0 -0
  115. package/dist/chunk-5V5SMT5A.js.gz +0 -0
  116. package/dist/chunk-DFSWCVRW.js.br +0 -0
  117. package/dist/chunk-DFSWCVRW.js.gz +0 -0
  118. package/dist/chunk-FZSYLXJT.js.br +0 -0
  119. package/dist/chunk-FZSYLXJT.js.gz +0 -0
  120. package/dist/chunk-IBHIXBC5.js.br +0 -0
  121. package/dist/chunk-IBHIXBC5.js.gz +0 -0
  122. package/dist/chunk-ICEZL4TM.mjs.br +0 -0
  123. package/dist/chunk-ICEZL4TM.mjs.gz +0 -0
  124. package/dist/chunk-INX3E37P.mjs.br +0 -0
  125. package/dist/chunk-INX3E37P.mjs.gz +0 -0
  126. package/dist/chunk-K6QHGABT.mjs.br +0 -0
  127. package/dist/chunk-K6QHGABT.mjs.gz +0 -0
  128. package/dist/chunk-OOO4JL2N.mjs.br +0 -0
  129. package/dist/chunk-OOO4JL2N.mjs.gz +0 -0
  130. package/dist/chunk-VCAQSSGD.mjs.br +0 -0
  131. package/dist/chunk-VCAQSSGD.mjs.gz +0 -0
  132. package/dist/chunk-Y4QUVWZC.js.br +0 -0
  133. package/dist/chunk-Y4QUVWZC.js.gz +0 -0
  134. package/dist/chunk-ZAQFTO4P.mjs.br +0 -0
  135. package/dist/chunk-ZAQFTO4P.mjs.gz +0 -0
@@ -1,21 +1,21 @@
1
1
  'use strict';
2
2
 
3
- var chunkFZSYLXJT_js = require('./chunk-FZSYLXJT.js');
4
- var chunk3JUZOKFI_js = require('./chunk-3JUZOKFI.js');
3
+ var chunkYF2BQIW3_js = require('./chunk-YF2BQIW3.js');
4
+ var chunkLTBTG2QB_js = require('./chunk-LTBTG2QB.js');
5
5
  var clsx = require('clsx');
6
6
  var tailwindMerge = require('tailwind-merge');
7
- var React7 = require('react');
7
+ var React8 = require('react');
8
8
  var lu = require('react-icons/lu');
9
9
  var jsxRuntime = require('react/jsx-runtime');
10
10
  var reactI18next = require('react-i18next');
11
11
 
12
12
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
13
 
14
- var React7__default = /*#__PURE__*/_interopDefault(React7);
14
+ var React8__default = /*#__PURE__*/_interopDefault(React8);
15
15
 
16
16
  // src/viewer/utils/animation-effects.ts
17
17
  function getAnimationInitialStyle2(preset, nativeAnimation) {
18
- return chunkFZSYLXJT_js.getAnimationInitialStyle(preset, nativeAnimation);
18
+ return chunkYF2BQIW3_js.getAnimationInitialStyle(preset, nativeAnimation);
19
19
  }
20
20
  function cn(...inputs) {
21
21
  return tailwindMerge.twMerge(clsx.clsx(inputs));
@@ -23,7 +23,7 @@ function cn(...inputs) {
23
23
 
24
24
  // src/viewer/utils/clone.ts
25
25
  function cloneHistorySnapshot2(snapshot) {
26
- return chunkFZSYLXJT_js.cloneHistorySnapshot(snapshot);
26
+ return chunkYF2BQIW3_js.cloneHistorySnapshot(snapshot);
27
27
  }
28
28
 
29
29
  // src/viewer/constants/scalar.ts
@@ -61,7 +61,7 @@ var TOOLBAR_SECTIONS = [
61
61
  { id: "view", labelKey: "pptx.ribbon.tab.view" },
62
62
  { id: "help", labelKey: "pptx.ribbon.tab.help" }
63
63
  ];
64
- var SHORTCUT_REFERENCE_ITEMS = chunkFZSYLXJT_js.VIEWER_SHORTCUT_REFERENCE;
64
+ var SHORTCUT_REFERENCE_ITEMS = chunkYF2BQIW3_js.VIEWER_SHORTCUT_REFERENCE;
65
65
 
66
66
  // src/viewer/constants/transitions-animations.ts
67
67
  var ANIMATION_PRESET_OPTIONS = [
@@ -89,12 +89,12 @@ var GLYPH_COMPONENTS = {
89
89
  plus: lu.LuPlus,
90
90
  triangle: lu.LuTriangle
91
91
  };
92
- var SHAPE_PRESETS = chunkFZSYLXJT_js.SHAPE_PRESET_DEFS.map(
92
+ var SHAPE_PRESETS = chunkYF2BQIW3_js.SHAPE_PRESET_DEFS.map(
93
93
  (def) => ({
94
94
  type: def.type,
95
95
  label: def.label,
96
96
  i18nKey: def.i18nKey,
97
- icon: React7__default.default.createElement(GLYPH_COMPONENTS[def.glyph], {
97
+ icon: React8__default.default.createElement(GLYPH_COMPONENTS[def.glyph], {
98
98
  className: def.glyphClass ? `w-3.5 h-3.5 ${def.glyphClass}` : "w-3.5 h-3.5"
99
99
  })
100
100
  })
@@ -114,7 +114,7 @@ var ARROW_SIZE_OPTIONS = [
114
114
  { value: "med", label: "Medium", i18nKey: "pptx.connectorOptions.sizeMedium" },
115
115
  { value: "lg", label: "Large", i18nKey: "pptx.connectorOptions.sizeLarge" }
116
116
  ];
117
- var STROKE_DASH_OPTIONS2 = chunkFZSYLXJT_js.STROKE_DASH_OPTIONS;
117
+ var STROKE_DASH_OPTIONS2 = chunkYF2BQIW3_js.STROKE_DASH_OPTIONS;
118
118
 
119
119
  // src/viewer/utils/shape-types.tsx
120
120
  function getShapeType(shapeType) {
@@ -223,7 +223,7 @@ function isConnectorOrLineElement(element) {
223
223
  if (element.type === "connector") {
224
224
  return true;
225
225
  }
226
- if (!chunkFZSYLXJT_js.hasShapeProperties(element)) {
226
+ if (!chunkYF2BQIW3_js.hasShapeProperties(element)) {
227
227
  return false;
228
228
  }
229
229
  const st = getShapeType(element.shapeType);
@@ -232,18 +232,18 @@ function isConnectorOrLineElement(element) {
232
232
 
233
233
  // src/viewer/utils/image-style.ts
234
234
  function getImageMaskStyle(element) {
235
- if (!chunkFZSYLXJT_js.hasShapeProperties(element)) {
235
+ if (!chunkYF2BQIW3_js.hasShapeProperties(element)) {
236
236
  return void 0;
237
237
  }
238
- const geometry = chunkFZSYLXJT_js.resolveShapeGeometry(element);
238
+ const geometry = chunkYF2BQIW3_js.resolveShapeGeometry(element);
239
239
  if (geometry.kind === "borderRadius") {
240
240
  return { borderRadius: geometry.radius };
241
241
  }
242
242
  return geometry.kind === "clipPath" ? { clipPath: geometry.clipPath } : void 0;
243
243
  }
244
244
  function getImageRenderStyle(element) {
245
- const fit = chunkFZSYLXJT_js.getImageFitStyle(element);
246
- const counterTransform = chunkFZSYLXJT_js.getImageFillCounterTransform(element, Boolean(fit.transform));
245
+ const fit = chunkYF2BQIW3_js.getImageFitStyle(element);
246
+ const counterTransform = chunkYF2BQIW3_js.getImageFillCounterTransform(element, Boolean(fit.transform));
247
247
  return {
248
248
  // A translated/scaled crop, or a rotWithShape=false counter-transform,
249
249
  // must be masked by the stationary wrapper, not by the moving/counter-
@@ -262,7 +262,7 @@ function getImageSurfaceMaskStyle(element) {
262
262
  };
263
263
  }
264
264
  function getImageSurfaceStyle(element) {
265
- const fill = chunkFZSYLXJT_js.hasShapeProperties(element) ? chunkFZSYLXJT_js.getComputedFillStyle(element) : void 0;
265
+ const fill = chunkYF2BQIW3_js.hasShapeProperties(element) ? chunkYF2BQIW3_js.getComputedFillStyle(element) : void 0;
266
266
  return {
267
267
  position: "absolute",
268
268
  inset: 0,
@@ -275,13 +275,13 @@ function getImageSurfaceStyle(element) {
275
275
  };
276
276
  }
277
277
  function getCropShapeClipPath2(element) {
278
- if (!chunkFZSYLXJT_js.isImageLikeElement(element)) {
278
+ if (!chunkYF2BQIW3_js.isImageLikeElement(element)) {
279
279
  return void 0;
280
280
  }
281
- return chunkFZSYLXJT_js.getCropShapeClipPath(element.cropShape, element.width, element.height);
281
+ return chunkYF2BQIW3_js.getCropShapeClipPath(element.cropShape, element.width, element.height);
282
282
  }
283
283
  function getImageTilingStyle2(element, nativeSize) {
284
- return chunkFZSYLXJT_js.getImageTilingStyle(element, nativeSize);
284
+ return chunkYF2BQIW3_js.getImageTilingStyle(element, nativeSize);
285
285
  }
286
286
 
287
287
  // src/viewer/utils/geometry-image.ts
@@ -329,8 +329,8 @@ function buildTrimFragment(element) {
329
329
  return `#t=${(start / 1e3).toFixed(3)}`;
330
330
  }
331
331
  function useMediaMetadataExtraction(mediaRef, element) {
332
- const [metadata, setMetadata] = React7.useState(element.metadata);
333
- React7.useEffect(() => {
332
+ const [metadata, setMetadata] = React8.useState(element.metadata);
333
+ React8.useEffect(() => {
334
334
  const el = mediaRef.current;
335
335
  if (!el) {
336
336
  return;
@@ -413,7 +413,7 @@ function VideoWithMetadata({
413
413
  {
414
414
  ref: mediaRef,
415
415
  className: "w-full h-full pointer-events-auto",
416
- style: isFullScreen ? { objectFit: "cover" } : chunkFZSYLXJT_js.getImageFitStyle(element),
416
+ style: isFullScreen ? { objectFit: "cover" } : chunkYF2BQIW3_js.getImageFitStyle(element),
417
417
  controls: showTransport,
418
418
  preload: "metadata",
419
419
  playsInline: true,
@@ -466,28 +466,28 @@ function PresentationMediaController({
466
466
  children
467
467
  }) {
468
468
  const { t } = reactI18next.useTranslation();
469
- const mediaRef = React7.useRef(null);
470
- const [isMediaPlaying, setIsMediaPlaying] = React7.useState(false);
469
+ const mediaRef = React8.useRef(null);
470
+ const [isMediaPlaying, setIsMediaPlaying] = React8.useState(false);
471
471
  const trimStartSec = element.trimStartMs !== void 0 ? element.trimStartMs / 1e3 : 0;
472
472
  const hideWhenNotPlaying = isPresentationMode && element.hideWhenNotPlaying === true;
473
- const { volume: playbackVolume, playbackRate } = chunkFZSYLXJT_js.mediaPlaybackAttributes({
473
+ const { volume: playbackVolume, playbackRate } = chunkYF2BQIW3_js.mediaPlaybackAttributes({
474
474
  loop: element.loop,
475
475
  volume: element.volume,
476
476
  playbackSpeed: element.playbackSpeed
477
477
  });
478
- React7.useEffect(() => {
478
+ React8.useEffect(() => {
479
479
  const el = mediaRef.current;
480
480
  if (el) {
481
481
  el.volume = playbackVolume;
482
482
  }
483
483
  }, [playbackVolume]);
484
- React7.useEffect(() => {
484
+ React8.useEffect(() => {
485
485
  const el = mediaRef.current;
486
486
  if (el) {
487
487
  el.playbackRate = playbackRate;
488
488
  }
489
489
  }, [playbackRate]);
490
- React7.useEffect(() => {
490
+ React8.useEffect(() => {
491
491
  const el = mediaRef.current;
492
492
  if (!el) {
493
493
  return;
@@ -513,12 +513,12 @@ function PresentationMediaController({
513
513
  el.removeEventListener("ended", handleEnded);
514
514
  };
515
515
  }, [onPlayStateChange]);
516
- React7.useEffect(() => {
516
+ React8.useEffect(() => {
517
517
  const el = mediaRef.current;
518
518
  if (!el || !isPresentationMode) {
519
519
  return;
520
520
  }
521
- return chunkFZSYLXJT_js.scheduleMediaTrimAndFade(el, {
521
+ return chunkYF2BQIW3_js.scheduleMediaTrimAndFade(el, {
522
522
  trimStartMs: element.trimStartMs,
523
523
  trimEndMs: element.trimEndMs,
524
524
  fadeInDuration: element.fadeInDuration,
@@ -533,13 +533,13 @@ function PresentationMediaController({
533
533
  element.fadeOutDuration,
534
534
  playbackVolume
535
535
  ]);
536
- React7.useEffect(() => {
536
+ React8.useEffect(() => {
537
537
  if (!isPresentationMode || !shouldAutoPlay) {
538
538
  return;
539
539
  }
540
540
  if (element.playAcrossSlides && element.mediaType === "audio") {
541
541
  const dataUrl = element.mediaData ?? resolvedDataUrl;
542
- if (chunkFZSYLXJT_js.registerCrossSlideAudio(element, dataUrl)) {
542
+ if (chunkYF2BQIW3_js.registerCrossSlideAudio(element, dataUrl)) {
543
543
  return;
544
544
  }
545
545
  }
@@ -561,17 +561,17 @@ function PresentationMediaController({
561
561
  transition: "opacity 0.3s ease",
562
562
  pointerEvents: isMediaPlaying ? "auto" : "none"
563
563
  } : {};
564
- const handleStopFullScreen = React7.useCallback(() => {
564
+ const handleStopFullScreen = React8.useCallback(() => {
565
565
  const el = mediaRef.current;
566
566
  if (el && !el.paused) {
567
567
  el.pause();
568
568
  }
569
569
  }, []);
570
- const noopOnPlay = React7.useCallback(() => {
570
+ const noopOnPlay = React8.useCallback(() => {
571
571
  }, []);
572
572
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full h-full", style: wrapperStyle, children: [
573
573
  children({ mediaRef, onPlay: noopOnPlay, isMediaPlaying }),
574
- chunkFZSYLXJT_js.shouldShowMediaFullscreenStopButton({
574
+ chunkYF2BQIW3_js.shouldShowMediaFullscreenStopButton({
575
575
  fullScreen: isFullScreen,
576
576
  presenting: isPresentationMode,
577
577
  playing: isMediaPlaying
@@ -588,7 +588,7 @@ function PresentationMediaController({
588
588
  ] });
589
589
  }
590
590
  function label(key) {
591
- return key === void 0 ? void 0 : chunk3JUZOKFI_js.translationsEn[key];
591
+ return key === void 0 ? void 0 : chunkLTBTG2QB_js.translationsEn[key];
592
592
  }
593
593
  function FallbackIcon({
594
594
  paths,
@@ -624,17 +624,17 @@ function Badge({
624
624
  "div",
625
625
  {
626
626
  className: `absolute inset-0 flex flex-col items-center justify-center ${isMissing ? "gap-1" : ""}`,
627
- ...{ [chunkFZSYLXJT_js.MEDIA_CHROME_ATTRIBUTE]: visual.badge },
627
+ ...{ [chunkYF2BQIW3_js.MEDIA_CHROME_ATTRIBUTE]: visual.badge },
628
628
  children: [
629
629
  /* @__PURE__ */ jsxRuntime.jsx(
630
630
  FallbackIcon,
631
631
  {
632
- paths: chunkFZSYLXJT_js.mediaFallbackIcon(visual, element.mediaType),
632
+ paths: chunkYF2BQIW3_js.mediaFallbackIcon(visual, element.mediaType),
633
633
  size: isMissing ? 32 : 48,
634
634
  className: isMissing ? "text-white/60" : "text-white/80 drop-shadow-md"
635
635
  }
636
636
  ),
637
- isMissing && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] text-white/60", children: label(chunkFZSYLXJT_js.mediaFallbackLabelKey(visual, element.mediaType)) })
637
+ isMissing && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] text-white/60", children: label(chunkYF2BQIW3_js.mediaFallbackLabelKey(visual, element.mediaType)) })
638
638
  ]
639
639
  }
640
640
  );
@@ -651,17 +651,17 @@ function Placeholder({
651
651
  "div",
652
652
  {
653
653
  className: `w-full h-full flex flex-col items-center justify-center gap-1 pointer-events-none rounded ${isMissing ? "bg-black/30 border border-dashed border-white/20" : element.mediaType === "audio" ? "bg-black/10" : "bg-black/20"}`,
654
- ...{ [chunkFZSYLXJT_js.MEDIA_CHROME_ATTRIBUTE]: visual.placeholder },
654
+ ...{ [chunkYF2BQIW3_js.MEDIA_CHROME_ATTRIBUTE]: visual.placeholder },
655
655
  children: [
656
656
  /* @__PURE__ */ jsxRuntime.jsx(
657
657
  FallbackIcon,
658
658
  {
659
- paths: chunkFZSYLXJT_js.mediaFallbackIcon(visual, element.mediaType),
659
+ paths: chunkYF2BQIW3_js.mediaFallbackIcon(visual, element.mediaType),
660
660
  size: isMissing ? 36 : element.mediaType === "audio" ? 24 : 32,
661
661
  className: isMissing ? "text-white/50" : "text-white/70"
662
662
  }
663
663
  ),
664
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: `text-[10px] ${isMissing ? "text-white/50" : "text-white/70"}`, children: label(chunkFZSYLXJT_js.mediaFallbackLabelKey(visual, element.mediaType)) })
664
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: `text-[10px] ${isMissing ? "text-white/50" : "text-white/70"}`, children: label(chunkYF2BQIW3_js.mediaFallbackLabelKey(visual, element.mediaType)) })
665
665
  ]
666
666
  }
667
667
  );
@@ -671,7 +671,7 @@ function renderMediaFallback({
671
671
  posterUrl,
672
672
  surface
673
673
  }) {
674
- const visual = chunkFZSYLXJT_js.mediaFallbackVisual(surface, {
674
+ const visual = chunkYF2BQIW3_js.mediaFallbackVisual(surface, {
675
675
  hasPoster: Boolean(posterUrl),
676
676
  missing: element.mediaMissing === true
677
677
  });
@@ -681,9 +681,9 @@ function renderMediaFallback({
681
681
  "img",
682
682
  {
683
683
  src: posterUrl,
684
- alt: visual.dimPoster ? chunk3JUZOKFI_js.translationsEn["pptx.media.posterAlt"] : chunk3JUZOKFI_js.translationsEn["pptx.media.videoPosterAlt"],
684
+ alt: visual.dimPoster ? chunkLTBTG2QB_js.translationsEn["pptx.media.posterAlt"] : chunkLTBTG2QB_js.translationsEn["pptx.media.videoPosterAlt"],
685
685
  className: `w-full h-full${visual.dimPoster ? " opacity-50" : ""}`,
686
- style: chunkFZSYLXJT_js.getImageFitStyle(element)
686
+ style: chunkYF2BQIW3_js.getImageFitStyle(element)
687
687
  }
688
688
  ),
689
689
  /* @__PURE__ */ jsxRuntime.jsx(Badge, { visual, element })
@@ -693,7 +693,7 @@ function renderMediaFallback({
693
693
  }
694
694
  function renderMediaElement(element, mediaDataUrls, options) {
695
695
  if (element.type !== "media") {
696
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk3JUZOKFI_js.translationsEn["pptx.media.title"] });
696
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunkLTBTG2QB_js.translationsEn["pptx.media.title"] });
697
697
  }
698
698
  const mediaType = element.mediaType;
699
699
  const mediaPath = element.mediaPath;
@@ -701,7 +701,7 @@ function renderMediaElement(element, mediaDataUrls, options) {
701
701
  const dataUrl = element.mediaData ?? (mediaPath ? mediaDataUrls.get(mediaPath) : void 0);
702
702
  const trimFragment = buildTrimFragment(element);
703
703
  const posterUrl = element.posterFrameData ?? void 0;
704
- const shouldLoop = chunkFZSYLXJT_js.mediaPlaybackAttributes(element).loop;
704
+ const shouldLoop = chunkYF2BQIW3_js.mediaPlaybackAttributes(element).loop;
705
705
  const shouldAutoPlay = options?.autoPlay === true || element.autoPlay === true;
706
706
  const isFullScreen = options?.fullScreen === true;
707
707
  const isPresentationMode = options?.isPresentationMode === true;
@@ -714,17 +714,17 @@ function renderMediaElement(element, mediaDataUrls, options) {
714
714
  return renderMediaFallback({ element, posterUrl, surface });
715
715
  }
716
716
  if (mediaType === "video") {
717
- const onlineVideo = chunkFZSYLXJT_js.getOnlineVideoEmbed(element);
717
+ const onlineVideo = chunkYF2BQIW3_js.getOnlineVideoEmbed(element);
718
718
  if (onlineVideo) {
719
719
  return /* @__PURE__ */ jsxRuntime.jsx(
720
720
  "iframe",
721
721
  {
722
722
  src: onlineVideo.embedUrl,
723
- title: chunk3JUZOKFI_js.translationsEn["pptx.media.onlineVideoTitle"],
723
+ title: chunkLTBTG2QB_js.translationsEn["pptx.media.onlineVideoTitle"],
724
724
  className: "w-full h-full border-0 pointer-events-auto",
725
- allow: chunkFZSYLXJT_js.ONLINE_VIDEO_IFRAME_ALLOW,
725
+ allow: chunkYF2BQIW3_js.ONLINE_VIDEO_IFRAME_ALLOW,
726
726
  allowFullScreen: true,
727
- sandbox: chunkFZSYLXJT_js.ONLINE_VIDEO_IFRAME_SANDBOX
727
+ sandbox: chunkYF2BQIW3_js.ONLINE_VIDEO_IFRAME_SANDBOX
728
728
  }
729
729
  );
730
730
  }
@@ -793,32 +793,32 @@ function renderMediaElement(element, mediaDataUrls, options) {
793
793
  if (surface.presenting || surface.preview) {
794
794
  return null;
795
795
  }
796
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk3JUZOKFI_js.translationsEn["pptx.media.title"] });
796
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunkLTBTG2QB_js.translationsEn["pptx.media.title"] });
797
797
  }
798
798
 
799
799
  // src/viewer/utils/text-utils.tsx
800
800
  function getTextStyleForElement(element, fallbackColor) {
801
- return chunkFZSYLXJT_js.buildTextBlockStyle(element, { fallbackColor });
801
+ return chunkYF2BQIW3_js.buildTextBlockStyle(element, { fallbackColor });
802
802
  }
803
803
 
804
804
  // src/viewer/utils/text-layout.tsx
805
805
  function getTextLayoutStyle(element) {
806
- if (!chunkFZSYLXJT_js.hasTextProperties(element)) {
806
+ if (!chunkYF2BQIW3_js.hasTextProperties(element)) {
807
807
  return {};
808
808
  }
809
- const writingMode = chunkFZSYLXJT_js.toCssWritingMode(element.textStyle?.textDirection);
810
- const textOrientation = chunkFZSYLXJT_js.toCssTextOrientation(element.textStyle?.textDirection);
811
- const verticalDirection = chunkFZSYLXJT_js.toCssVerticalDirection(element.textStyle?.textDirection);
809
+ const writingMode = chunkYF2BQIW3_js.toCssWritingMode(element.textStyle?.textDirection);
810
+ const textOrientation = chunkYF2BQIW3_js.toCssTextOrientation(element.textStyle?.textDirection);
811
+ const verticalDirection = chunkYF2BQIW3_js.toCssVerticalDirection(element.textStyle?.textDirection);
812
812
  const textWrapNone = element.textStyle?.textWrap === "none";
813
813
  const shapeAutoFitTextBox = element.textStyle?.autoFitMode === "shrink" && (element.type === "text" || element.locks?.txBox === true);
814
- const hasParagraphIndents = chunkFZSYLXJT_js.hasTextProperties(element) && element.paragraphIndents && element.paragraphIndents.length > 0;
814
+ const hasParagraphIndents = chunkYF2BQIW3_js.hasTextProperties(element) && element.paragraphIndents && element.paragraphIndents.length > 0;
815
815
  const paragraphMarginLeft = element.textStyle?.paragraphMarginLeft;
816
816
  const paragraphIndent = element.textStyle?.paragraphIndent;
817
817
  const marginLeft = !hasParagraphIndents && typeof paragraphMarginLeft === "number" && paragraphMarginLeft !== 0 ? paragraphMarginLeft : void 0;
818
818
  const textIndent = !hasParagraphIndents && typeof paragraphIndent === "number" && paragraphIndent !== 0 ? paragraphIndent : void 0;
819
819
  const bodyTop = element.textStyle?.bodyInsetTop ?? DEFAULT_BODY_INSET_TB_PX;
820
820
  const bodyBottom = element.textStyle?.bodyInsetBottom ?? DEFAULT_BODY_INSET_TB_PX;
821
- const bodyLayoutStyle = chunkFZSYLXJT_js.buildTextBodyLayoutStyle(element);
821
+ const bodyLayoutStyle = chunkYF2BQIW3_js.buildTextBodyLayoutStyle(element);
822
822
  return {
823
823
  ...bodyLayoutStyle,
824
824
  // Body inset only. Paragraph spacing (spcBef/spcAft) is applied
@@ -848,7 +848,7 @@ function getTextLayoutStyle(element) {
848
848
 
849
849
  // src/viewer/utils/text-effects.tsx
850
850
  function buildTextBody3DSceneStyle2(textStyle, elementSize) {
851
- return chunkFZSYLXJT_js.buildTextBody3DSceneStyle(textStyle, elementSize);
851
+ return chunkYF2BQIW3_js.buildTextBody3DSceneStyle(textStyle, elementSize);
852
852
  }
853
853
 
854
854
  // src/viewer/utils/text-warp-css.tsx
@@ -1033,13 +1033,13 @@ function wrapWithTextBuildAnimation(elementId, paraIndex, renderedSegments, para
1033
1033
  if (!subElementAnimStates || subElementAnimStates.size === 0) {
1034
1034
  return renderedSegments;
1035
1035
  }
1036
- const paraKey = `${elementId}${chunkFZSYLXJT_js.TEXT_BUILD_ID_SEP}p${paraIndex}`;
1036
+ const paraKey = `${elementId}${chunkYF2BQIW3_js.TEXT_BUILD_ID_SEP}p${paraIndex}`;
1037
1037
  const paraState = subElementAnimStates.get(paraKey);
1038
1038
  if (paraState) {
1039
1039
  const style = buildAnimStyle(paraState);
1040
1040
  return /* @__PURE__ */ jsxRuntime.jsx("span", { "data-anim-id": paraKey, style: { display: "inline", ...style }, children: renderedSegments }, paraKey);
1041
1041
  }
1042
- const spec = chunkFZSYLXJT_js.buildTextBuildSpec(
1042
+ const spec = chunkYF2BQIW3_js.buildTextBuildSpec(
1043
1043
  elementId,
1044
1044
  paraIndex,
1045
1045
  paraRuns.map((run) => ({ text: run.text, style: run })),
@@ -1051,13 +1051,13 @@ function wrapWithTextBuildAnimation(elementId, paraIndex, renderedSegments, para
1051
1051
  return spec.spans.map((span, index) => {
1052
1052
  const content = span.style && renderPiece ? renderPiece(span.style, span.text, String(index)) : span.text;
1053
1053
  if (!span.animId) {
1054
- return /* @__PURE__ */ jsxRuntime.jsx(React7__default.default.Fragment, { children: content }, `ws-${index}`);
1054
+ return /* @__PURE__ */ jsxRuntime.jsx(React8__default.default.Fragment, { children: content }, `ws-${index}`);
1055
1055
  }
1056
1056
  return /* @__PURE__ */ jsxRuntime.jsx(
1057
1057
  "span",
1058
1058
  {
1059
1059
  "data-anim-id": span.animId,
1060
- style: chunkFZSYLXJT_js.textBuildSpanStyle(span),
1060
+ style: chunkYF2BQIW3_js.textBuildSpanStyle(span),
1061
1061
  children: content
1062
1062
  },
1063
1063
  span.animId
@@ -1068,18 +1068,18 @@ function renderUnderlineWords(text, isUnderlineWords, wordDecoration, metric, ke
1068
1068
  if (!isUnderlineWords || !text) {
1069
1069
  return inner(text, keyPrefix, metric);
1070
1070
  }
1071
- const pieces = chunkFZSYLXJT_js.splitWordsForUnderline(text);
1071
+ const pieces = chunkYF2BQIW3_js.splitWordsForUnderline(text);
1072
1072
  if (pieces.length === 0) {
1073
1073
  return inner(text, keyPrefix, metric);
1074
1074
  }
1075
1075
  const gapMetric = metric ? {
1076
1076
  ...metric,
1077
- nestedStyle: metric.nestedStyle ? chunkFZSYLXJT_js.stripUnderlineDecoration(metric.nestedStyle) : void 0
1077
+ nestedStyle: metric.nestedStyle ? chunkYF2BQIW3_js.stripUnderlineDecoration(metric.nestedStyle) : void 0
1078
1078
  } : void 0;
1079
1079
  return pieces.map((piece, i) => {
1080
1080
  const key = `${keyPrefix}-u${i}`;
1081
1081
  if (!piece.underline) {
1082
- return /* @__PURE__ */ jsxRuntime.jsx(React7__default.default.Fragment, { children: inner(piece.text, key, gapMetric) }, key);
1082
+ return /* @__PURE__ */ jsxRuntime.jsx(React8__default.default.Fragment, { children: inner(piece.text, key, gapMetric) }, key);
1083
1083
  }
1084
1084
  return /* @__PURE__ */ jsxRuntime.jsx("span", { style: wordDecoration, children: inner(piece.text, key, metric) }, key);
1085
1085
  });
@@ -1107,7 +1107,7 @@ function makeSegmentPieceRenderer(needsScriptFonts, scriptFonts, baseFontFamily,
1107
1107
  );
1108
1108
  }
1109
1109
  function renderTabbedLine(line, ctx, keyPrefix, renderPiece, nestedStyle, underlineWords = false) {
1110
- const [lineLayout] = chunkFZSYLXJT_js.buildRunTabLines(
1110
+ const [lineLayout] = chunkYF2BQIW3_js.buildRunTabLines(
1111
1111
  line,
1112
1112
  ctx,
1113
1113
  nestedStyle,
@@ -1116,17 +1116,44 @@ function renderTabbedLine(line, ctx, keyPrefix, renderPiece, nestedStyle, underl
1116
1116
  );
1117
1117
  return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { display: "inline-block", whiteSpace: "nowrap" }, children: lineLayout.pieces.map((piece, i) => {
1118
1118
  const key = `${keyPrefix}-tab-${i}`;
1119
- return /* @__PURE__ */ jsxRuntime.jsxs(React7__default.default.Fragment, { children: [
1119
+ return /* @__PURE__ */ jsxRuntime.jsxs(React8__default.default.Fragment, { children: [
1120
1120
  piece.leaderStyle ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", style: piece.leaderStyle, children: piece.leaderText }) : null,
1121
1121
  piece.words ? piece.words.map((word, w) => /* @__PURE__ */ jsxRuntime.jsx("span", { style: word.style, children: renderPiece(word.text, `${key}-w${w}`) }, `${key}-w${w}`)) : /* @__PURE__ */ jsxRuntime.jsx("span", { style: piece.style, children: renderPiece(piece.text, key) })
1122
1122
  ] }, key);
1123
1123
  }) });
1124
1124
  }
1125
+ function renderEastAsianPieces(text, metric, keyPrefix, inner, baseStyle) {
1126
+ const parts = chunkYF2BQIW3_js.splitEastAsianBreaks(text, metric.eastAsian, metric.font);
1127
+ if (parts.length === 1 && !parts[0].style) {
1128
+ return inner(parts[0].text, keyPrefix);
1129
+ }
1130
+ return parts.map((part, i) => {
1131
+ const key = `${keyPrefix}-e${i}`;
1132
+ return part.style ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { ...baseStyle ?? metric.nestedStyle, ...part.style }, children: inner(part.text, key) }, key) : /* @__PURE__ */ jsxRuntime.jsx(React8__default.default.Fragment, { children: inner(part.text, key) }, key);
1133
+ });
1134
+ }
1135
+ function renderMetricPieces(text, metric, keyPrefix, inner) {
1136
+ if (!metric || !text) {
1137
+ return inner(text, keyPrefix);
1138
+ }
1139
+ const pieces = chunkYF2BQIW3_js.splitRunForMetrics(text, metric.font);
1140
+ if (pieces.length <= 1) {
1141
+ return renderEastAsianPieces(text, metric, keyPrefix, inner, void 0);
1142
+ }
1143
+ return pieces.map((piece, i) => {
1144
+ const key = `${keyPrefix}-w${i}`;
1145
+ const style = {
1146
+ ...metric.nestedStyle,
1147
+ letterSpacing: chunkYF2BQIW3_js.pieceLetterSpacing(metric.authoredPx, piece.tracking)
1148
+ };
1149
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { style, children: renderEastAsianPieces(piece.text, metric, key, inner, style) }, key);
1150
+ });
1151
+ }
1125
1152
  function renderScriptAwareText(text, needsScriptFonts, scriptFonts, baseFontFamily, keyPrefix, nestedStyle) {
1126
1153
  if (!needsScriptFonts || !text) {
1127
1154
  return text;
1128
1155
  }
1129
- const pieces = chunkFZSYLXJT_js.splitRunByScriptFont(
1156
+ const pieces = chunkYF2BQIW3_js.splitRunByScriptFont(
1130
1157
  text,
1131
1158
  scriptFonts,
1132
1159
  baseFontFamily,
@@ -1136,29 +1163,9 @@ function renderScriptAwareText(text, needsScriptFonts, scriptFonts, baseFontFami
1136
1163
  return text;
1137
1164
  }
1138
1165
  return pieces.map(
1139
- (piece, i) => piece.style ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: piece.style, children: piece.text }, `${keyPrefix}-r${i}`) : /* @__PURE__ */ jsxRuntime.jsx(React7__default.default.Fragment, { children: piece.text }, `${keyPrefix}-r${i}`)
1166
+ (piece, i) => piece.style ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: piece.style, children: piece.text }, `${keyPrefix}-r${i}`) : /* @__PURE__ */ jsxRuntime.jsx(React8__default.default.Fragment, { children: piece.text }, `${keyPrefix}-r${i}`)
1140
1167
  );
1141
1168
  }
1142
- function renderMetricPieces(text, metric, keyPrefix, inner) {
1143
- if (!metric || !text) {
1144
- return inner(text, keyPrefix);
1145
- }
1146
- const pieces = chunkFZSYLXJT_js.splitRunForMetrics(text, metric.font);
1147
- if (pieces.length <= 1) {
1148
- return inner(text, keyPrefix);
1149
- }
1150
- return pieces.map((piece, i) => /* @__PURE__ */ jsxRuntime.jsx(
1151
- "span",
1152
- {
1153
- style: {
1154
- ...metric.nestedStyle,
1155
- letterSpacing: chunkFZSYLXJT_js.pieceLetterSpacing(metric.authoredPx, piece.tracking)
1156
- },
1157
- children: inner(piece.text, `${keyPrefix}-w${i}`)
1158
- },
1159
- `${keyPrefix}-w${i}`
1160
- ));
1161
- }
1162
1169
  function renderSegmentContent(elementId, segmentIndex, textValue, lines, needsScriptFonts, scriptFonts, baseFontFamily, findHighlights, tabContext, metric, isUnderlineWords = false, wordDecoration) {
1163
1170
  const segHl = findHighlights?.get(segmentIndex);
1164
1171
  const renderLeaf = makeSegmentPieceRenderer(
@@ -1172,7 +1179,7 @@ function renderSegmentContent(elementId, segmentIndex, textValue, lines, needsSc
1172
1179
  if (!segHl || segHl.length === 0) {
1173
1180
  return lines.map((line, lineIndex) => {
1174
1181
  const lineKey = `${elementId}-seg-${segmentIndex}-line-${lineIndex}`;
1175
- return /* @__PURE__ */ jsxRuntime.jsxs(React7__default.default.Fragment, { children: [
1182
+ return /* @__PURE__ */ jsxRuntime.jsxs(React8__default.default.Fragment, { children: [
1176
1183
  tabContext && line.includes(" ") ? renderTabbedLine(
1177
1184
  line,
1178
1185
  tabContext,
@@ -1224,12 +1231,12 @@ function renderSegmentContent(elementId, segmentIndex, textValue, lines, needsSc
1224
1231
  children: renderLeaf(chunk.text, chunkKey)
1225
1232
  },
1226
1233
  chunkKey
1227
- ) : /* @__PURE__ */ jsxRuntime.jsx(React7__default.default.Fragment, { children: renderLeaf(chunk.text, chunkKey) }, chunkKey);
1234
+ ) : /* @__PURE__ */ jsxRuntime.jsx(React8__default.default.Fragment, { children: renderLeaf(chunk.text, chunkKey) }, chunkKey);
1228
1235
  });
1229
1236
  }
1230
1237
  function renderEquationSegment(elementId, segmentIndex, equationXml, equationNumber, fontSize) {
1231
- const mathml = chunkFZSYLXJT_js.convertOmmlToMathMl(equationXml);
1232
- const safeMathml = mathml ? chunkFZSYLXJT_js.sanitizeMathMl(mathml) : "";
1238
+ const mathml = chunkYF2BQIW3_js.convertOmmlToMathMl(equationXml);
1239
+ const safeMathml = mathml ? chunkYF2BQIW3_js.sanitizeMathMl(mathml) : "";
1233
1240
  const equationContent = safeMathml ? /* @__PURE__ */ jsxRuntime.jsx(
1234
1241
  "span",
1235
1242
  {
@@ -1239,7 +1246,7 @@ function renderEquationSegment(elementId, segmentIndex, equationXml, equationNum
1239
1246
  },
1240
1247
  dangerouslySetInnerHTML: { __html: safeMathml }
1241
1248
  }
1242
- ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block px-1 py-0.5 rounded text-xs bg-gray-200/20 text-gray-400 italic", children: chunk3JUZOKFI_js.translationsEn["pptx.textSegment.equationFallback"] });
1249
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block px-1 py-0.5 rounded text-xs bg-gray-200/20 text-gray-400 italic", children: chunkLTBTG2QB_js.translationsEn["pptx.textSegment.equationFallback"] });
1243
1250
  if (equationNumber) {
1244
1251
  return /* @__PURE__ */ jsxRuntime.jsxs(
1245
1252
  "span",
@@ -1369,7 +1376,7 @@ function renderParagraphRun(run, segment, ctx, keySuffix = "") {
1369
1376
  const segmentStyle = segment?.style ?? {};
1370
1377
  const textValue = run.text;
1371
1378
  const lines = textValue.split("\n");
1372
- const resolvedSegmentColor = chunkFZSYLXJT_js.normalizeHexColor(
1379
+ const resolvedSegmentColor = chunkYF2BQIW3_js.normalizeHexColor(
1373
1380
  segmentStyle.color || element.textStyle?.color,
1374
1381
  run.hyperlink ? HYPERLINK_COLOR : fallbackColor
1375
1382
  );
@@ -1377,42 +1384,47 @@ function renderParagraphRun(run, segment, ctx, keySuffix = "") {
1377
1384
  const baselineFraction = rawBaseline === 0 ? 0 : Math.abs(rawBaseline) >= 1e3 ? rawBaseline / 1e5 : rawBaseline / 100;
1378
1385
  const baselineFontScale = baselineFraction !== 0 ? BASELINE_FONT_SCALE : 1;
1379
1386
  const rawFontSize = segmentStyle.fontSize || element.textStyle?.fontSize || DEFAULT_TEXT_FONT_SIZE;
1380
- const baseFontSize = chunkFZSYLXJT_js.scaleFontSizeForAutoFit(
1387
+ const baseFontSize = chunkYF2BQIW3_js.scaleFontSizeForAutoFit(
1381
1388
  rawFontSize,
1382
- chunkFZSYLXJT_js.resolveAutoFitFontScale(element.textStyle)
1389
+ chunkYF2BQIW3_js.resolveAutoFitFontScale(element.textStyle)
1383
1390
  );
1384
1391
  const baselineShift = baselineFraction !== 0 ? `${baselineFraction * baseFontSize}px` : void 0;
1385
- const fontKerning = chunkFZSYLXJT_js.resolveFontKerning(segmentStyle.kerning, baseFontSize);
1392
+ const fontKerning = chunkYF2BQIW3_js.resolveFontKerning(segmentStyle.kerning, baseFontSize);
1386
1393
  const scriptFallbackWins = Boolean(
1387
1394
  segmentStyle.scriptFallbackFont && segmentStyle.fontFamilyIsCascadeDefault
1388
1395
  );
1389
1396
  const rawFontFamily = segmentStyle.fontFamily || element.textStyle?.fontFamily;
1390
- const baseFontFamily = scriptFallbackWins ? chunkFZSYLXJT_js.getSubstituteFontFamily(segmentStyle.scriptFallbackFont) : rawFontFamily ? chunkFZSYLXJT_js.getSubstituteFontFamily(
1397
+ const baseFontFamily = scriptFallbackWins ? chunkYF2BQIW3_js.getSubstituteFontFamily(segmentStyle.scriptFallbackFont) : rawFontFamily ? chunkYF2BQIW3_js.getSubstituteFontFamily(
1391
1398
  rawFontFamily,
1392
- chunkFZSYLXJT_js.parsePanoseString(segmentStyle.latinFontPanose ?? element.textStyle?.latinFontPanose)
1399
+ chunkYF2BQIW3_js.parsePanoseString(segmentStyle.latinFontPanose ?? element.textStyle?.latinFontPanose)
1393
1400
  ) : DEFAULT_FONT_FAMILY2;
1394
- const scriptFonts = chunkFZSYLXJT_js.resolveScriptFontSet(segmentStyle, element.textStyle, baseFontFamily);
1395
- const needsScriptFonts = chunkFZSYLXJT_js.hasDistinctScriptFonts(scriptFonts);
1396
- const authoredLetterSpacing = typeof segmentStyle.characterSpacing === "number" && segmentStyle.characterSpacing !== 0 ? segmentStyle.characterSpacing / 100 * (96 / 72) : 0;
1401
+ const scriptFonts = chunkYF2BQIW3_js.resolveScriptFontSet(segmentStyle, element.textStyle, baseFontFamily);
1402
+ const needsScriptFonts = chunkYF2BQIW3_js.hasDistinctScriptFonts(scriptFonts);
1403
+ const authoredLetterSpacing = chunkYF2BQIW3_js.authoredLetterSpacingPx(segmentStyle);
1397
1404
  const metricFont = {
1398
1405
  fontFamily: baseFontFamily,
1399
1406
  fontSizePx: baseFontSize * baselineFontScale,
1400
1407
  bold: Boolean(segmentStyle.bold),
1401
1408
  italic: Boolean(segmentStyle.italic)
1402
1409
  };
1403
- const nestedStyle = chunkFZSYLXJT_js.nestedTextDecorationStyle(run.style);
1404
- const metricContext = { font: metricFont, authoredPx: authoredLetterSpacing, nestedStyle };
1410
+ const nestedStyle = chunkYF2BQIW3_js.nestedTextDecorationStyle(run.style);
1411
+ const metricContext = {
1412
+ font: metricFont,
1413
+ authoredPx: authoredLetterSpacing,
1414
+ nestedStyle,
1415
+ eastAsian: ctx.eastAsianBreaks
1416
+ };
1405
1417
  const spanStyle = { ...run.style };
1406
1418
  spanStyle.color = resolvedSegmentColor;
1407
1419
  spanStyle.fontSize = baseFontSize * baselineFontScale;
1408
1420
  spanStyle.fontFamily = baseFontFamily;
1409
1421
  spanStyle.verticalAlign = baselineShift;
1410
1422
  spanStyle.fontKerning = fontKerning;
1411
- spanStyle.letterSpacing = chunkFZSYLXJT_js.pieceLetterSpacing(
1423
+ spanStyle.letterSpacing = chunkYF2BQIW3_js.pieceLetterSpacing(
1412
1424
  authoredLetterSpacing,
1413
- chunkFZSYLXJT_js.resolveMetricTrackingPx(textValue, metricFont)
1425
+ chunkYF2BQIW3_js.resolveMetricTrackingPx(textValue, metricFont)
1414
1426
  );
1415
- const hollow = chunkFZSYLXJT_js.hollowTextFillStyle(segmentStyle, {
1427
+ const hollow = chunkYF2BQIW3_js.hollowTextFillStyle(segmentStyle, {
1416
1428
  color: resolvedSegmentColor,
1417
1429
  textStroke: typeof spanStyle.WebkitTextStroke === "string" ? spanStyle.WebkitTextStroke : void 0
1418
1430
  });
@@ -1424,10 +1436,10 @@ function renderParagraphRun(run, segment, ctx, keySuffix = "") {
1424
1436
  spanStyle.direction = runRtl ? "rtl" : "ltr";
1425
1437
  spanStyle.unicodeBidi = runRtl !== ctx.paragraphRtl ? "bidi-override" : "embed";
1426
1438
  }
1427
- const isUnderlineWords = Boolean(segmentStyle.underline) && segmentStyle.underlineStyle === "words";
1439
+ const isUnderlineWords = chunkYF2BQIW3_js.splitsUnderlineIntoWords(segmentStyle);
1428
1440
  const wordDecoration = isUnderlineWords ? nestedStyle ?? run.underlineWordPieces?.find((piece) => piece.style)?.style : void 0;
1429
1441
  if (isUnderlineWords) {
1430
- const stripped = chunkFZSYLXJT_js.stripUnderlineDecoration(spanStyle);
1442
+ const stripped = chunkYF2BQIW3_js.stripUnderlineDecoration(spanStyle);
1431
1443
  spanStyle.textDecoration = stripped.textDecoration;
1432
1444
  delete spanStyle.textDecorationStyle;
1433
1445
  delete spanStyle.textDecorationThickness;
@@ -1443,13 +1455,14 @@ function renderParagraphRun(run, segment, ctx, keySuffix = "") {
1443
1455
  scriptFonts,
1444
1456
  baseFontFamily,
1445
1457
  findHighlights,
1446
- chunkFZSYLXJT_js.buildTabContext(
1458
+ chunkYF2BQIW3_js.buildTabContext(
1447
1459
  element.textStyle?.tabStops,
1448
1460
  element.textStyle?.defaultTabSize,
1449
1461
  baseFontSize,
1450
1462
  baseFontFamily,
1451
1463
  Boolean(segmentStyle.bold),
1452
- Boolean(segmentStyle.italic)
1464
+ Boolean(segmentStyle.italic),
1465
+ { language: segmentStyle.language, rtl: ctx.paragraphRtl === true }
1453
1466
  ),
1454
1467
  metricContext,
1455
1468
  isUnderlineWords,
@@ -1475,29 +1488,29 @@ function renderSeededListRun(seed, runs, segments, context) {
1475
1488
  const segment = sourceRun ? segments[seed.segmentIndex] : { text: seed.text, style: seed.style };
1476
1489
  const resolvedSegment = {
1477
1490
  ...segment,
1478
- style: chunkFZSYLXJT_js.withInlineListDecorationDefaults(segment.style, context.element.textStyle)
1491
+ style: chunkYF2BQIW3_js.withInlineListDecorationDefaults(segment.style, context.element.textStyle)
1479
1492
  };
1480
- const decorationCss = chunkFZSYLXJT_js.segmentStyleToCss(
1493
+ const decorationCss = chunkYF2BQIW3_js.segmentStyleToCss(
1481
1494
  resolvedSegment,
1482
- chunkFZSYLXJT_js.resolveAutoFitFontScale(context.element.textStyle)
1495
+ chunkYF2BQIW3_js.resolveAutoFitFontScale(context.element.textStyle)
1483
1496
  );
1484
- chunkFZSYLXJT_js.applyUnderlineVariant(decorationCss, resolvedSegment);
1485
- const run = sourceRun ? { ...sourceRun, style: { ...sourceRun.style, ...chunkFZSYLXJT_js.nestedTextDecorationStyle(decorationCss) } } : {
1497
+ chunkYF2BQIW3_js.applyUnderlineVariant(decorationCss, resolvedSegment);
1498
+ const run = sourceRun ? { ...sourceRun, style: { ...sourceRun.style, ...chunkYF2BQIW3_js.nestedTextDecorationStyle(decorationCss) } } : {
1486
1499
  text: seed.text,
1487
1500
  style: decorationCss,
1488
1501
  segmentIndex: seed.segmentIndex
1489
1502
  };
1490
1503
  const rendered = renderParagraphRun(run, resolvedSegment, context);
1491
- if (!React7__default.default.isValidElement(rendered)) {
1504
+ if (!React8__default.default.isValidElement(rendered)) {
1492
1505
  return rendered;
1493
1506
  }
1494
- return React7__default.default.cloneElement(rendered, {
1507
+ return React8__default.default.cloneElement(rendered, {
1495
1508
  "data-pptx-list-run": seed.token,
1496
1509
  ...seed.text === "" ? { children: /* @__PURE__ */ jsxRuntime.jsx("br", {}) } : {}
1497
1510
  });
1498
1511
  }
1499
1512
  function renderTextSegments(element, fallbackColor, emptyFallback, findHighlights, onHyperlinkClick, fieldContext, subElementAnimStates, segmentOverrides, requireCtrlClick, placeholderPrompt, inlineListSeed) {
1500
- if (!chunkFZSYLXJT_js.hasTextProperties(element)) {
1513
+ if (!chunkYF2BQIW3_js.hasTextProperties(element)) {
1501
1514
  return emptyFallback || null;
1502
1515
  }
1503
1516
  const segments = segmentOverrides ?? element.textSegments;
@@ -1507,12 +1520,10 @@ function renderTextSegments(element, fallbackColor, emptyFallback, findHighlight
1507
1520
  }
1508
1521
  return element.text || emptyFallback || "";
1509
1522
  }
1510
- const paragraphs = chunkFZSYLXJT_js.buildParagraphs(
1511
- element,
1512
- fieldContext,
1513
- segmentOverrides,
1514
- inlineListSeed ? { preserveTrailingEmpty: true } : void 0
1515
- );
1523
+ const paragraphs = chunkYF2BQIW3_js.buildParagraphs(element, fieldContext, segmentOverrides, {
1524
+ preserveTrailingEmpty: inlineListSeed ? true : void 0,
1525
+ eastAsianRunPieces: false
1526
+ });
1516
1527
  const ctx = {
1517
1528
  element,
1518
1529
  fallbackColor,
@@ -1546,7 +1557,11 @@ function joinRunsBySegment(runs) {
1546
1557
  }
1547
1558
  function renderParagraph(para, paraIndex, paraCount, segments, ctx, subElementAnimStates, inlineListSeed) {
1548
1559
  const element = ctx.element;
1549
- const runCtx = { ...ctx, paragraphRtl: para.rtl };
1560
+ const runCtx = {
1561
+ ...ctx,
1562
+ paragraphRtl: para.rtl,
1563
+ eastAsianBreaks: para.eastAsianBreaks
1564
+ };
1550
1565
  const runs = joinRunsBySegment(para.runs);
1551
1566
  const listParagraph = inlineListSeed?.paragraphs[paraIndex];
1552
1567
  const renderedRuns = listParagraph ? listParagraph.runs.map((run) => renderSeededListRun(run, runs, segments, runCtx)) : runs.map((run) => renderParagraphRun(run, segments[run.segmentIndex ?? -1], runCtx));
@@ -1596,7 +1611,7 @@ function renderParagraph(para, paraIndex, paraCount, segments, ctx, subElementAn
1596
1611
  );
1597
1612
  const needsWrapper = Boolean(listParagraph) || Object.keys(paraStyle).length > 0 || marker !== null;
1598
1613
  if (!needsWrapper) {
1599
- return /* @__PURE__ */ jsxRuntime.jsxs(React7__default.default.Fragment, { children: [
1614
+ return /* @__PURE__ */ jsxRuntime.jsxs(React8__default.default.Fragment, { children: [
1600
1615
  wrappedContent,
1601
1616
  paraIndex < paraCount - 1 ? /* @__PURE__ */ jsxRuntime.jsx("br", {}) : null
1602
1617
  ] }, `${element.id}-para-${paraIndex}`);
@@ -1653,13 +1668,13 @@ function renderBulletMarker(para, paraIndex, elementId) {
1653
1668
  );
1654
1669
  }
1655
1670
  function getDuotoneColors(element) {
1656
- if (!chunkFZSYLXJT_js.isImageLikeElement(element)) {
1671
+ if (!chunkYF2BQIW3_js.isImageLikeElement(element)) {
1657
1672
  return void 0;
1658
1673
  }
1659
1674
  return element.imageEffects?.duotone;
1660
1675
  }
1661
1676
  function buildLineShadowCss(element) {
1662
- if (!chunkFZSYLXJT_js.hasShapeProperties(element)) {
1677
+ if (!chunkYF2BQIW3_js.hasShapeProperties(element)) {
1663
1678
  return void 0;
1664
1679
  }
1665
1680
  const ss = element.shapeStyle;
@@ -1670,13 +1685,13 @@ function buildLineShadowCss(element) {
1670
1685
  const offsetY = typeof ss.lineShadowOffsetY === "number" ? ss.lineShadowOffsetY : 2;
1671
1686
  const blur = typeof ss.lineShadowBlur === "number" ? Math.max(0, ss.lineShadowBlur) : 4;
1672
1687
  const opacity = typeof ss.lineShadowOpacity === "number" ? Math.max(0, Math.min(1, ss.lineShadowOpacity)) : 0.35;
1673
- return `${Math.round(offsetX)}px ${Math.round(offsetY)}px ${Math.round(blur)}px ${chunkFZSYLXJT_js.colorWithOpacity(
1674
- chunkFZSYLXJT_js.normalizeHexColor(ss.lineShadowColor, "#000000"),
1688
+ return `${Math.round(offsetX)}px ${Math.round(offsetY)}px ${Math.round(blur)}px ${chunkYF2BQIW3_js.colorWithOpacity(
1689
+ chunkYF2BQIW3_js.normalizeHexColor(ss.lineShadowColor, "#000000"),
1675
1690
  opacity
1676
1691
  )}`;
1677
1692
  }
1678
1693
  function buildLineGlowFilter(element) {
1679
- if (!chunkFZSYLXJT_js.hasShapeProperties(element)) {
1694
+ if (!chunkYF2BQIW3_js.hasShapeProperties(element)) {
1680
1695
  return void 0;
1681
1696
  }
1682
1697
  const ss = element.shapeStyle;
@@ -1685,22 +1700,22 @@ function buildLineGlowFilter(element) {
1685
1700
  }
1686
1701
  const glowOpacity = typeof ss.lineGlowOpacity === "number" ? ss.lineGlowOpacity : 0.75;
1687
1702
  const glowRad = Math.round(Math.max(0, ss.lineGlowRadius));
1688
- const glowCol = chunkFZSYLXJT_js.colorWithOpacity(chunkFZSYLXJT_js.normalizeHexColor(ss.lineGlowColor, "#ffff00"), glowOpacity);
1703
+ const glowCol = chunkYF2BQIW3_js.colorWithOpacity(chunkYF2BQIW3_js.normalizeHexColor(ss.lineGlowColor, "#ffff00"), glowOpacity);
1689
1704
  return `drop-shadow(0 0 ${glowRad}px ${glowCol})`;
1690
1705
  }
1691
1706
  function getDagDuotoneFilterId(elementId) {
1692
1707
  return `dag-duotone-${elementId}`;
1693
1708
  }
1694
1709
  function hasDagDuotoneEffect(element) {
1695
- if (!chunkFZSYLXJT_js.hasShapeProperties(element)) {
1710
+ if (!chunkYF2BQIW3_js.hasShapeProperties(element)) {
1696
1711
  return false;
1697
1712
  }
1698
1713
  return Boolean(element.shapeStyle?.dagDuotone);
1699
1714
  }
1700
1715
  function renderDagDuotoneSvgFilter(elementId, color1, color2) {
1701
1716
  const filterId = getDagDuotoneFilterId(elementId);
1702
- const c1 = chunkFZSYLXJT_js.hexToRgbUnit(color1);
1703
- const c2 = chunkFZSYLXJT_js.hexToRgbUnit(color2);
1717
+ const c1 = chunkYF2BQIW3_js.hexToRgbUnit(color1);
1718
+ const c2 = chunkYF2BQIW3_js.hexToRgbUnit(color2);
1704
1719
  const grayscaleMatrix = [
1705
1720
  0.2126,
1706
1721
  0.7152,
@@ -1744,7 +1759,7 @@ function renderDagDuotoneSvgFilter(elementId, color1, color2) {
1744
1759
 
1745
1760
  // src/viewer/utils/shape-visual-3d.ts
1746
1761
  function build3DExtrusionData2(shape3d, scene3d, fillColor, elementWidth, elementHeight) {
1747
- return chunkFZSYLXJT_js.build3DExtrusionData(
1762
+ return chunkYF2BQIW3_js.build3DExtrusionData(
1748
1763
  shape3d,
1749
1764
  scene3d,
1750
1765
  fillColor,
@@ -1753,7 +1768,7 @@ function build3DExtrusionData2(shape3d, scene3d, fillColor, elementWidth, elemen
1753
1768
  );
1754
1769
  }
1755
1770
  function apply3dEffects2(base, scene3d, shape3d, fillColorFallback, elementSize, elementId) {
1756
- chunkFZSYLXJT_js.apply3dEffects(
1771
+ chunkYF2BQIW3_js.apply3dEffects(
1757
1772
  base,
1758
1773
  scene3d,
1759
1774
  shape3d,
@@ -1768,11 +1783,11 @@ function rendersCustomVectorPath(element) {
1768
1783
  return (element.type === "shape" || element.type === "image" || element.type === "picture") && Boolean(element.pathData) && typeof element.pathWidth === "number" && element.pathWidth > 0 && typeof element.pathHeight === "number" && element.pathHeight > 0;
1769
1784
  }
1770
1785
  function rendersWedgeCalloutVector(element) {
1771
- return element.type === "shape" && chunkFZSYLXJT_js.isWedgeCalloutPresetShape(element.shapeType);
1786
+ return element.type === "shape" && chunkYF2BQIW3_js.isWedgeCalloutPresetShape(element.shapeType);
1772
1787
  }
1773
1788
  function getShapeVisualStyle(element, _hasFill, fillColor, _strokeWidth, _strokeColor, animatesFill, animatesStroke, parentGroupFill) {
1774
1789
  if (element.type === "group") {
1775
- const fx2 = chunkFZSYLXJT_js.getComputedEffectStyle(element);
1790
+ const fx2 = chunkYF2BQIW3_js.getComputedEffectStyle(element);
1776
1791
  const groupStyle = {};
1777
1792
  if (fx2.filter) {
1778
1793
  groupStyle.filter = fx2.filter;
@@ -1782,13 +1797,13 @@ function getShapeVisualStyle(element, _hasFill, fillColor, _strokeWidth, _stroke
1782
1797
  }
1783
1798
  return groupStyle;
1784
1799
  }
1785
- if (!chunkFZSYLXJT_js.hasShapeProperties(element)) {
1800
+ if (!chunkYF2BQIW3_js.hasShapeProperties(element)) {
1786
1801
  return {};
1787
1802
  }
1788
1803
  const ss = element.shapeStyle;
1789
- const fill = animatesFill ? void 0 : chunkFZSYLXJT_js.getComputedFillStyle(element, parentGroupFill);
1790
- const fx = chunkFZSYLXJT_js.getComputedEffectStyle(element);
1791
- const stroke = chunkFZSYLXJT_js.getComputedStrokeStyle(element);
1804
+ const fill = animatesFill ? void 0 : chunkYF2BQIW3_js.getComputedFillStyle(element, parentGroupFill);
1805
+ const fx = chunkYF2BQIW3_js.getComputedEffectStyle(element);
1806
+ const stroke = chunkYF2BQIW3_js.getComputedStrokeStyle(element);
1792
1807
  const base = {
1793
1808
  // A gradient fill REPLACES the solid fill, it does not sit on top of it;
1794
1809
  // the whole precedence lives in shared's `getComputedFillStyle`.
@@ -1827,7 +1842,7 @@ function getShapeVisualStyle(element, _hasFill, fillColor, _strokeWidth, _stroke
1827
1842
  };
1828
1843
  Object.assign(
1829
1844
  base,
1830
- chunkFZSYLXJT_js.getAnimationColorBaseStyle(element, {
1845
+ chunkYF2BQIW3_js.getAnimationColorBaseStyle(element, {
1831
1846
  animatesFill,
1832
1847
  animatesStroke,
1833
1848
  parentGroupFill
@@ -1849,7 +1864,7 @@ function getShapeVisualStyle(element, _hasFill, fillColor, _strokeWidth, _stroke
1849
1864
  },
1850
1865
  element.id
1851
1866
  );
1852
- if (rendersCustomVectorPath(element) || rendersWedgeCalloutVector(element) || chunkFZSYLXJT_js.isStrokeOnlyPresetElement(element)) {
1867
+ if (rendersCustomVectorPath(element) || rendersWedgeCalloutVector(element) || chunkYF2BQIW3_js.isStrokeOnlyPresetElement(element)) {
1853
1868
  base.backgroundColor = "transparent";
1854
1869
  base.backgroundImage = void 0;
1855
1870
  base.borderWidth = void 0;
@@ -1863,7 +1878,7 @@ function getShapeVisualStyle(element, _hasFill, fillColor, _strokeWidth, _stroke
1863
1878
  if (rendersWedgeCalloutVector(element)) {
1864
1879
  return base;
1865
1880
  }
1866
- const geometry = chunkFZSYLXJT_js.resolveShapeGeometry(element);
1881
+ const geometry = chunkYF2BQIW3_js.resolveShapeGeometry(element);
1867
1882
  switch (geometry.kind) {
1868
1883
  case "bare":
1869
1884
  return { backgroundColor: "transparent", borderWidth: 0, borderStyle: "none" };
@@ -1887,7 +1902,7 @@ function getShapeVisualStyle(element, _hasFill, fillColor, _strokeWidth, _stroke
1887
1902
  }
1888
1903
  }
1889
1904
  function getConnectorPathGeometry2(element) {
1890
- return chunkFZSYLXJT_js.getConnectorPathGeometry(element);
1905
+ return chunkYF2BQIW3_js.getConnectorPathGeometry(element);
1891
1906
  }
1892
1907
  var ARROW_SIZE_SCALE = {
1893
1908
  sm: 0.6,
@@ -1956,11 +1971,11 @@ function strokeContext(shapeStyle, strokePaint, strokeWidth, dashArray) {
1956
1971
  strokePaint,
1957
1972
  strokeWidth,
1958
1973
  dashArray,
1959
- lineCap: chunkFZSYLXJT_js.svgLineCap(shapeStyle?.lineCap),
1974
+ lineCap: chunkYF2BQIW3_js.svgLineCap(shapeStyle?.lineCap),
1960
1975
  lineJoin,
1961
1976
  miterLimit,
1962
- offsets: chunkFZSYLXJT_js.getCompoundLineOffsets(shapeStyle?.compoundLine, strokeWidth),
1963
- widths: chunkFZSYLXJT_js.getCompoundLineWidths(shapeStyle?.compoundLine, strokeWidth)
1977
+ offsets: chunkYF2BQIW3_js.getCompoundLineOffsets(shapeStyle?.compoundLine, strokeWidth),
1978
+ widths: chunkYF2BQIW3_js.getCompoundLineWidths(shapeStyle?.compoundLine, strokeWidth)
1964
1979
  };
1965
1980
  }
1966
1981
  function strokeStrands(d, keyBase, ctx) {
@@ -1983,12 +1998,12 @@ function strokeStrands(d, keyBase, ctx) {
1983
1998
  }
1984
1999
  function renderCustomGeometryVector(pathData, pathWidth, pathHeight, structuredPaths, shapeStyle, hasFill, fillColor, fillOpacity, strokePaint, strokeWidth, dashArray, animatesFill = false, gradient) {
1985
2000
  const ctx = strokeContext(shapeStyle, strokePaint, strokeWidth, dashArray);
1986
- const subpaths = structuredPaths && structuredPaths.length > 0 ? chunkFZSYLXJT_js.customGeometryPathsToSvgSubpaths(structuredPaths, pathWidth, pathHeight) : void 0;
2001
+ const subpaths = structuredPaths && structuredPaths.length > 0 ? chunkYF2BQIW3_js.customGeometryPathsToSvgSubpaths(structuredPaths, pathWidth, pathHeight) : void 0;
1987
2002
  const needsPerSubpath = subpaths !== void 0 && subpaths.some((sp) => sp.fillMode && sp.fillMode !== "norm" || sp.stroke === false);
1988
- const gradientPaint = gradient ? chunkFZSYLXJT_js.svgGradientFillRef(gradient) : void 0;
2003
+ const gradientPaint = gradient ? chunkYF2BQIW3_js.svgGradientFillRef(gradient) : void 0;
1989
2004
  const nodes = [];
1990
2005
  if (subpaths && needsPerSubpath) {
1991
- const paints = chunkFZSYLXJT_js.buildSubpathPaints(subpaths, hasFill, fillColor, fillOpacity);
2006
+ const paints = chunkYF2BQIW3_js.buildSubpathPaints(subpaths, hasFill, fillColor, fillOpacity);
1992
2007
  paints.forEach((paint, idx) => {
1993
2008
  if (paint.fill !== "none") {
1994
2009
  const mode = subpaths[idx]?.fillMode;
@@ -2017,7 +2032,7 @@ function renderCustomGeometryVector(pathData, pathWidth, pathHeight, structuredP
2017
2032
  "path",
2018
2033
  {
2019
2034
  d: pathData,
2020
- fill: animatesFill ? "inherit" : gradientPaint ?? chunkFZSYLXJT_js.colorWithOpacity(fillColor, fillOpacity),
2035
+ fill: animatesFill ? "inherit" : gradientPaint ?? chunkYF2BQIW3_js.colorWithOpacity(fillColor, fillOpacity),
2021
2036
  stroke: "none",
2022
2037
  vectorEffect: "non-scaling-stroke"
2023
2038
  },
@@ -2033,7 +2048,7 @@ function renderCustomGeometryVector(pathData, pathWidth, pathHeight, structuredP
2033
2048
  "svg",
2034
2049
  {
2035
2050
  viewBox: `0 0 ${pathWidth} ${pathHeight}`,
2036
- className: "w-full h-full pointer-events-none",
2051
+ className: "absolute inset-0 w-full h-full pointer-events-none",
2037
2052
  preserveAspectRatio: "none",
2038
2053
  children: [
2039
2054
  animatesFill ? null : renderSvgGradientDefs(gradient),
@@ -2043,14 +2058,14 @@ function renderCustomGeometryVector(pathData, pathWidth, pathHeight, structuredP
2043
2058
  );
2044
2059
  }
2045
2060
  function renderVectorShape(element, hasFill, fillColor, strokeWidth, strokeColor, animatesFill, animatesStroke) {
2046
- if (!chunkFZSYLXJT_js.hasShapeProperties(element)) {
2061
+ if (!chunkYF2BQIW3_js.hasShapeProperties(element)) {
2047
2062
  return null;
2048
2063
  }
2049
2064
  const normalizedType = (element.shapeType || "").toLowerCase();
2050
- const fillPaint = animatesFill ? "inherit" : chunkFZSYLXJT_js.colorWithOpacity(fillColor, element.shapeStyle?.fillOpacity);
2051
- const strokePaint = animatesStroke ? "inherit" : chunkFZSYLXJT_js.colorWithOpacity(strokeColor, element.shapeStyle?.strokeOpacity);
2052
- const dashType = chunkFZSYLXJT_js.normalizeStrokeDashType(element.shapeStyle?.strokeDash);
2053
- const dashArray = chunkFZSYLXJT_js.getSvgStrokeDasharray(
2065
+ const fillPaint = animatesFill ? "inherit" : chunkYF2BQIW3_js.colorWithOpacity(fillColor, element.shapeStyle?.fillOpacity);
2066
+ const strokePaint = animatesStroke ? "inherit" : chunkYF2BQIW3_js.colorWithOpacity(strokeColor, element.shapeStyle?.strokeOpacity);
2067
+ const dashType = chunkYF2BQIW3_js.normalizeStrokeDashType(element.shapeStyle?.strokeDash);
2068
+ const dashArray = chunkYF2BQIW3_js.getSvgStrokeDasharray(
2054
2069
  dashType,
2055
2070
  Math.max(strokeWidth, 1),
2056
2071
  element.shapeStyle?.customDashSegments
@@ -2131,13 +2146,13 @@ function renderVectorShape(element, hasFill, fillColor, strokeWidth, strokeColor
2131
2146
  // container's `background-image` is suppressed for custom geometry, so
2132
2147
  // without this the shape fell back to the parser's representative solid
2133
2148
  // and lost every fade (issue #132).
2134
- chunkFZSYLXJT_js.buildSvgGradientDef(element.shapeStyle, element.id)
2149
+ chunkYF2BQIW3_js.buildSvgGradientDef(element.shapeStyle, element.id)
2135
2150
  );
2136
2151
  }
2137
- if ((element.type === "image" || element.type === "picture") && strokeWidth > 0 && !chunkFZSYLXJT_js.buildStrokeOutline(element)) {
2152
+ if ((element.type === "image" || element.type === "picture") && strokeWidth > 0 && !chunkYF2BQIW3_js.buildStrokeOutline(element)) {
2138
2153
  const width = Math.max(element.width, 1);
2139
2154
  const height = Math.max(element.height, 1);
2140
- const geometry = chunkFZSYLXJT_js.getPresetShapeVectorGeometry(
2155
+ const geometry = chunkYF2BQIW3_js.getPresetShapeVectorGeometry(
2141
2156
  element.shapeType || "rect",
2142
2157
  width,
2143
2158
  height,
@@ -2165,18 +2180,18 @@ function renderVectorShape(element, hasFill, fillColor, strokeWidth, strokeColor
2165
2180
  );
2166
2181
  }
2167
2182
  }
2168
- if (element.type === "shape" && chunkFZSYLXJT_js.isWedgeCalloutPresetShape(element.shapeType)) {
2183
+ if (element.type === "shape" && chunkYF2BQIW3_js.isWedgeCalloutPresetShape(element.shapeType)) {
2169
2184
  const width = Math.max(element.width, 1);
2170
2185
  const height = Math.max(element.height, 1);
2171
- const geometry = chunkFZSYLXJT_js.getPresetShapeVectorGeometry(
2186
+ const geometry = chunkYF2BQIW3_js.getPresetShapeVectorGeometry(
2172
2187
  element.shapeType,
2173
2188
  width,
2174
2189
  height,
2175
2190
  element.shapeAdjustments
2176
2191
  );
2177
2192
  if (geometry) {
2178
- const gradient = chunkFZSYLXJT_js.buildSvgGradientDef(element.shapeStyle, element.id);
2179
- const gradientPaint = gradient ? chunkFZSYLXJT_js.svgGradientFillRef(gradient) : void 0;
2193
+ const gradient = chunkYF2BQIW3_js.buildSvgGradientDef(element.shapeStyle, element.id);
2194
+ const gradientPaint = gradient ? chunkYF2BQIW3_js.svgGradientFillRef(gradient) : void 0;
2180
2195
  return /* @__PURE__ */ jsxRuntime.jsxs(
2181
2196
  "svg",
2182
2197
  {
@@ -2209,18 +2224,18 @@ function renderVectorShape(element, hasFill, fillColor, strokeWidth, strokeColor
2209
2224
  );
2210
2225
  }
2211
2226
  }
2212
- if (chunkFZSYLXJT_js.isCalloutShape(normalizedType)) {
2227
+ if (chunkYF2BQIW3_js.isCalloutShape(normalizedType)) {
2213
2228
  const width = Math.max(element.width, 1);
2214
2229
  const height = Math.max(element.height, 1);
2215
- const geometry = chunkFZSYLXJT_js.getCalloutLeaderLineGeometry(
2230
+ const geometry = chunkYF2BQIW3_js.getCalloutLeaderLineGeometry(
2216
2231
  normalizedType,
2217
2232
  width,
2218
2233
  height,
2219
2234
  element.shapeAdjustments
2220
2235
  );
2221
2236
  if (geometry && geometry.points.length >= 2) {
2222
- const leaderPath = chunkFZSYLXJT_js.buildCalloutLeaderLineSvgPath(geometry);
2223
- const bounds = chunkFZSYLXJT_js.getCalloutViewBoxBounds(width, height, geometry);
2237
+ const leaderPath = chunkYF2BQIW3_js.buildCalloutLeaderLineSvgPath(geometry);
2238
+ const bounds = chunkYF2BQIW3_js.getCalloutViewBoxBounds(width, height, geometry);
2224
2239
  const lineStroke = Math.max(strokeWidth, 1);
2225
2240
  const offsetLeft = bounds.minX;
2226
2241
  const offsetTop = bounds.minY;
@@ -2283,10 +2298,10 @@ function renderVectorShape(element, hasFill, fillColor, strokeWidth, strokeColor
2283
2298
  const endArrowW = element.shapeStyle?.connectorEndArrowWidth;
2284
2299
  const endArrowL = element.shapeStyle?.connectorEndArrowLength;
2285
2300
  const compoundLine = element.shapeStyle?.compoundLine;
2286
- const connectorLineCap = chunkFZSYLXJT_js.svgLineCap(element.shapeStyle?.lineCap);
2301
+ const connectorLineCap = chunkYF2BQIW3_js.svgLineCap(element.shapeStyle?.lineCap);
2287
2302
  const hitTargetWidth = Math.max(strokeWidth * 3, 12);
2288
- const offsets = chunkFZSYLXJT_js.getCompoundLineOffsets(compoundLine, strokeWidth);
2289
- const widths = chunkFZSYLXJT_js.getCompoundLineWidths(compoundLine, strokeWidth);
2303
+ const offsets = chunkYF2BQIW3_js.getCompoundLineOffsets(compoundLine, strokeWidth);
2304
+ const widths = chunkYF2BQIW3_js.getCompoundLineWidths(compoundLine, strokeWidth);
2290
2305
  return /* @__PURE__ */ jsxRuntime.jsxs(
2291
2306
  "svg",
2292
2307
  {
@@ -2353,15 +2368,15 @@ function parseGradientFillCss(gradFill) {
2353
2368
  }
2354
2369
  const rawStops = stops.map((gs) => {
2355
2370
  const pos = Number.parseInt(String(gs["@_pos"] || "0"), 10) / 1e3;
2356
- const color = chunkFZSYLXJT_js.parseDrawingColor(gs) ?? "#888888";
2357
- const opacity = chunkFZSYLXJT_js.parseDrawingColorOpacity(gs);
2371
+ const color = chunkYF2BQIW3_js.parseDrawingColor(gs) ?? "#888888";
2372
+ const opacity = chunkYF2BQIW3_js.parseDrawingColorOpacity(gs);
2358
2373
  return { position: pos, color, opacity };
2359
2374
  }).sort((a, b) => a.position - b.position);
2360
- const stopStrings = rawStops.map((s) => `${chunkFZSYLXJT_js.colorWithOpacity(s.color, s.opacity)} ${s.position.toFixed(1)}%`).join(", ");
2375
+ const stopStrings = rawStops.map((s) => `${chunkYF2BQIW3_js.colorWithOpacity(s.color, s.opacity)} ${s.position.toFixed(1)}%`).join(", ");
2361
2376
  const lin = gradFill["a:lin"];
2362
2377
  if (lin) {
2363
2378
  const angRaw = Number.parseInt(String(lin["@_ang"] || "0"), 10);
2364
- const angleDeg = Math.round(chunkFZSYLXJT_js.ooxmlGradientAngleToCssDegrees(angRaw / 6e4));
2379
+ const angleDeg = Math.round(chunkYF2BQIW3_js.ooxmlGradientAngleToCssDegrees(angRaw / 6e4));
2365
2380
  return `linear-gradient(${angleDeg}deg, ${stopStrings})`;
2366
2381
  }
2367
2382
  const path = gradFill["a:path"];
@@ -2375,7 +2390,7 @@ function parseGradientFillCss(gradFill) {
2375
2390
  b: Number.parseInt(String(fillToRectXml["@_b"] || "0"), 10) / 1e5
2376
2391
  } : void 0;
2377
2392
  if (pathType === "rect") {
2378
- return chunkFZSYLXJT_js.buildRectPathGradient(rawStops, void 0, fillToRect);
2393
+ return chunkYF2BQIW3_js.buildRectPathGradient(rawStops, void 0, fillToRect);
2379
2394
  }
2380
2395
  let cx = 50;
2381
2396
  let cy = 50;
@@ -2397,8 +2412,8 @@ function parsePatternFillCss(pattFill) {
2397
2412
  if (!pattFill) {
2398
2413
  return void 0;
2399
2414
  }
2400
- const fgColor = chunkFZSYLXJT_js.parseDrawingColor(pattFill["a:fgClr"]) ?? "#000000";
2401
- const bgColor = chunkFZSYLXJT_js.parseDrawingColor(pattFill["a:bgClr"]) ?? "#ffffff";
2415
+ const fgColor = chunkYF2BQIW3_js.parseDrawingColor(pattFill["a:fgClr"]) ?? "#000000";
2416
+ const bgColor = chunkYF2BQIW3_js.parseDrawingColor(pattFill["a:bgClr"]) ?? "#ffffff";
2402
2417
  const preset = String(pattFill["@_prst"] || "ltDnDiag");
2403
2418
  switch (preset) {
2404
2419
  case "ltHorz":
@@ -2509,11 +2524,11 @@ function parseCellBorders(cellProperties) {
2509
2524
  const prstDash = ln["a:prstDash"];
2510
2525
  const dashVal = prstDash ? String(prstDash["@_val"] || "") : void 0;
2511
2526
  const cssBorderStyle = ooxmlDashToCss(dashVal);
2512
- const color = chunkFZSYLXJT_js.parseDrawingColor(ln["a:solidFill"]);
2527
+ const color = chunkYF2BQIW3_js.parseDrawingColor(ln["a:solidFill"]);
2513
2528
  if (color) {
2514
- const opacity = chunkFZSYLXJT_js.parseDrawingColorOpacity(ln["a:solidFill"]);
2529
+ const opacity = chunkYF2BQIW3_js.parseDrawingColorOpacity(ln["a:solidFill"]);
2515
2530
  const key = `${edge.prefix}`;
2516
- borderStyle[key] = `${widthPx}px ${cssBorderStyle} ${chunkFZSYLXJT_js.colorWithOpacity(color, opacity)}`;
2531
+ borderStyle[key] = `${widthPx}px ${cssBorderStyle} ${chunkYF2BQIW3_js.colorWithOpacity(color, opacity)}`;
2517
2532
  }
2518
2533
  }
2519
2534
  return borderStyle;
@@ -2526,7 +2541,7 @@ function parseCellTextEffects(runProps) {
2526
2541
  const textShadowParts = [];
2527
2542
  const outerShdw = effectLst["a:outerShdw"];
2528
2543
  if (outerShdw) {
2529
- const shdwColor = chunkFZSYLXJT_js.parseDrawingColor(outerShdw);
2544
+ const shdwColor = chunkYF2BQIW3_js.parseDrawingColor(outerShdw);
2530
2545
  if (shdwColor) {
2531
2546
  const blurRad = Number.parseInt(String(outerShdw["@_blurRad"] || "0"), 10);
2532
2547
  const blurPx = blurRad > 0 ? Math.round(blurRad / 12700) : 0;
@@ -2544,7 +2559,7 @@ function parseCellTextEffects(runProps) {
2544
2559
  }
2545
2560
  const glow = effectLst["a:glow"];
2546
2561
  if (glow) {
2547
- const glowColor = chunkFZSYLXJT_js.parseDrawingColor(glow);
2562
+ const glowColor = chunkYF2BQIW3_js.parseDrawingColor(glow);
2548
2563
  if (glowColor) {
2549
2564
  const glowRad = Number.parseInt(String(glow["@_rad"] || "0"), 10);
2550
2565
  const glowPx = glowRad > 0 ? Math.round(glowRad / 12700) : 2;
@@ -2566,11 +2581,11 @@ function extractCellText(cellXml) {
2566
2581
  const textParts = [];
2567
2582
  const runs = ensureArrayValue(paragraph["a:r"]);
2568
2583
  runs.forEach((run) => {
2569
- textParts.push(chunkFZSYLXJT_js.xmlText(run["a:t"]) ?? "");
2584
+ textParts.push(chunkYF2BQIW3_js.xmlText(run["a:t"]) ?? "");
2570
2585
  });
2571
2586
  const fields = ensureArrayValue(paragraph["a:fld"]);
2572
2587
  fields.forEach((field) => {
2573
- textParts.push(chunkFZSYLXJT_js.xmlText(field["a:t"]) ?? "");
2588
+ textParts.push(chunkYF2BQIW3_js.xmlText(field["a:t"]) ?? "");
2574
2589
  });
2575
2590
  paragraphTexts.push(textParts.join(""));
2576
2591
  });
@@ -2614,10 +2629,10 @@ function extractTableCellStyle(cellXml, fallbackStyle, schemeColorOverrides) {
2614
2629
  if (runProps?.["@_u"] !== void 0) {
2615
2630
  cellStyle.textDecorationLine = runProps["@_u"] === "sng" ? "underline" : "none";
2616
2631
  }
2617
- const runColor = chunkFZSYLXJT_js.parseDrawingColor(runProps?.["a:solidFill"], schemeColorOverrides) || chunkFZSYLXJT_js.parseDrawingColor(runProps?.["a:highlight"], schemeColorOverrides);
2632
+ const runColor = chunkYF2BQIW3_js.parseDrawingColor(runProps?.["a:solidFill"], schemeColorOverrides) || chunkYF2BQIW3_js.parseDrawingColor(runProps?.["a:highlight"], schemeColorOverrides);
2618
2633
  if (runColor) {
2619
- const opacity = chunkFZSYLXJT_js.parseDrawingColorOpacity(runProps?.["a:solidFill"]);
2620
- cellStyle.color = chunkFZSYLXJT_js.colorWithOpacity(runColor, opacity);
2634
+ const opacity = chunkYF2BQIW3_js.parseDrawingColorOpacity(runProps?.["a:solidFill"]);
2635
+ cellStyle.color = chunkYF2BQIW3_js.colorWithOpacity(runColor, opacity);
2621
2636
  }
2622
2637
  const fontFamily = runProps?.["a:latin"]?.["@_typeface"] || runProps?.["a:ea"]?.["@_typeface"] || runProps?.["a:cs"]?.["@_typeface"];
2623
2638
  if (fontFamily) {
@@ -2627,15 +2642,15 @@ function extractTableCellStyle(cellXml, fallbackStyle, schemeColorOverrides) {
2627
2642
  cellStyle.textAlign = parseParagraphAlignment(paragraphProperties["@_algn"]);
2628
2643
  }
2629
2644
  const cellProperties = cellXml["a:tcPr"];
2630
- const cellFill = chunkFZSYLXJT_js.parseDrawingColor(
2645
+ const cellFill = chunkYF2BQIW3_js.parseDrawingColor(
2631
2646
  cellProperties?.["a:solidFill"],
2632
2647
  schemeColorOverrides
2633
2648
  );
2634
2649
  if (cellFill) {
2635
- const opacity = chunkFZSYLXJT_js.parseDrawingColorOpacity(
2650
+ const opacity = chunkYF2BQIW3_js.parseDrawingColorOpacity(
2636
2651
  cellProperties?.["a:solidFill"]
2637
2652
  );
2638
- cellStyle.backgroundColor = chunkFZSYLXJT_js.colorWithOpacity(cellFill, opacity);
2653
+ cellStyle.backgroundColor = chunkYF2BQIW3_js.colorWithOpacity(cellFill, opacity);
2639
2654
  } else {
2640
2655
  const gradCss = parseGradientFillCss(cellProperties?.["a:gradFill"]);
2641
2656
  if (gradCss) {
@@ -2650,16 +2665,16 @@ function extractTableCellStyle(cellXml, fallbackStyle, schemeColorOverrides) {
2650
2665
  const edgeBorders = parseCellBorders(cellProperties);
2651
2666
  Object.assign(cellStyle, edgeBorders);
2652
2667
  if (!cellStyle.borderLeftColor && !cellStyle.borderRightColor && !cellStyle.borderTopColor && !cellStyle.borderBottomColor) {
2653
- const borderColor = chunkFZSYLXJT_js.parseDrawingColor(
2668
+ const borderColor = chunkYF2BQIW3_js.parseDrawingColor(
2654
2669
  cellProperties?.["a:lnL"]?.["a:solidFill"],
2655
2670
  schemeColorOverrides
2656
- ) || chunkFZSYLXJT_js.parseDrawingColor(
2671
+ ) || chunkYF2BQIW3_js.parseDrawingColor(
2657
2672
  cellProperties?.["a:lnR"]?.["a:solidFill"],
2658
2673
  schemeColorOverrides
2659
- ) || chunkFZSYLXJT_js.parseDrawingColor(
2674
+ ) || chunkYF2BQIW3_js.parseDrawingColor(
2660
2675
  cellProperties?.["a:lnT"]?.["a:solidFill"],
2661
2676
  schemeColorOverrides
2662
- ) || chunkFZSYLXJT_js.parseDrawingColor(
2677
+ ) || chunkYF2BQIW3_js.parseDrawingColor(
2663
2678
  cellProperties?.["a:lnB"]?.["a:solidFill"],
2664
2679
  schemeColorOverrides
2665
2680
  );
@@ -2731,7 +2746,7 @@ function getTableCellBandStyle2(element, rowIndex, cellIndex, rowCount, columnCo
2731
2746
  if (element.type !== "table") {
2732
2747
  return void 0;
2733
2748
  }
2734
- return chunkFZSYLXJT_js.getTableCellBandStyle(element.tableData, rowIndex, cellIndex, rowCount, columnCount, {
2749
+ return chunkYF2BQIW3_js.getTableCellBandStyle(element.tableData, rowIndex, cellIndex, rowCount, columnCount, {
2735
2750
  tableStyleMap: styleCtx?.tableStyleMap,
2736
2751
  colorScheme: styleCtx?.theme?.colorScheme,
2737
2752
  fontScheme: styleCtx?.theme?.fontScheme
@@ -2811,7 +2826,7 @@ function renderTableCellContent(cell, fallbackText) {
2811
2826
  return /* @__PURE__ */ jsxRuntime.jsx(
2812
2827
  "span",
2813
2828
  {
2814
- style: { position: "relative", ...chunkFZSYLXJT_js.cellRunStyle(run) },
2829
+ style: { position: "relative", ...chunkYF2BQIW3_js.cellRunStyle(run) },
2815
2830
  children: run.text
2816
2831
  },
2817
2832
  `r-${index}`
@@ -2819,7 +2834,7 @@ function renderTableCellContent(cell, fallbackText) {
2819
2834
  });
2820
2835
  }
2821
2836
  function getCellDiagonalBorders2(style, tableData, pos, styleCtx) {
2822
- return chunkFZSYLXJT_js.getCellDiagonalBorders(style, tableData, pos, {
2837
+ return chunkYF2BQIW3_js.getCellDiagonalBorders(style, tableData, pos, {
2823
2838
  tableStyleMap: styleCtx?.tableStyleMap,
2824
2839
  colorScheme: styleCtx?.theme?.colorScheme,
2825
2840
  fontScheme: styleCtx?.theme?.fontScheme
@@ -2878,18 +2893,18 @@ function TableCellInput({
2878
2893
  onCommit,
2879
2894
  onCancel
2880
2895
  }) {
2881
- const inputRef = React7.useRef(null);
2882
- const committedRef = React7.useRef(false);
2883
- const onCommitRef = React7.useRef(onCommit);
2896
+ const inputRef = React8.useRef(null);
2897
+ const committedRef = React8.useRef(false);
2898
+ const onCommitRef = React8.useRef(onCommit);
2884
2899
  onCommitRef.current = onCommit;
2885
- React7.useEffect(() => {
2900
+ React8.useEffect(() => {
2886
2901
  const el = inputRef.current;
2887
2902
  if (el) {
2888
2903
  el.focus();
2889
2904
  el.select();
2890
2905
  }
2891
2906
  }, []);
2892
- React7.useEffect(() => {
2907
+ React8.useEffect(() => {
2893
2908
  const input = inputRef.current;
2894
2909
  return () => {
2895
2910
  if (!committedRef.current && input) {
@@ -2949,11 +2964,11 @@ function TableResizeOverlay({
2949
2964
  onResizeColumns,
2950
2965
  onResizeRow
2951
2966
  }) {
2952
- const containerRef = React7.useRef(null);
2953
- const [rowBounds, setRowBounds] = React7.useState([]);
2954
- const dragRef = React7.useRef(null);
2955
- const colBoundaries = React7.useMemo(() => chunkFZSYLXJT_js.computeColumnBoundaries(columnWidths), [columnWidths]);
2956
- const measureRows = React7.useCallback(() => {
2967
+ const containerRef = React8.useRef(null);
2968
+ const [rowBounds, setRowBounds] = React8.useState([]);
2969
+ const dragRef = React8.useRef(null);
2970
+ const colBoundaries = React8.useMemo(() => chunkYF2BQIW3_js.computeColumnBoundaries(columnWidths), [columnWidths]);
2971
+ const measureRows = React8.useCallback(() => {
2957
2972
  const container = containerRef.current;
2958
2973
  if (!container) {
2959
2974
  return;
@@ -2978,10 +2993,10 @@ function TableResizeOverlay({
2978
2993
  return bounds;
2979
2994
  });
2980
2995
  }, []);
2981
- React7.useLayoutEffect(() => {
2996
+ React8.useLayoutEffect(() => {
2982
2997
  measureRows();
2983
2998
  });
2984
- React7.useEffect(() => {
2999
+ React8.useEffect(() => {
2985
3000
  const handleMouseMove = (e) => {
2986
3001
  const drag = dragRef.current;
2987
3002
  if (!drag) {
@@ -2999,11 +3014,11 @@ function TableResizeOverlay({
2999
3014
  const rect = containerRef.current.getBoundingClientRect();
3000
3015
  if (e.clientX !== drag.startPos && drag.type === "col" && drag.initialWidths && onResizeColumns) {
3001
3016
  const deltaProp = (e.clientX - drag.startPos) / rect.width;
3002
- onResizeColumns(chunkFZSYLXJT_js.computeResizedColumnWidths(drag.initialWidths, drag.index, deltaProp));
3017
+ onResizeColumns(chunkYF2BQIW3_js.computeResizedColumnWidths(drag.initialWidths, drag.index, deltaProp));
3003
3018
  } else if (e.clientY !== drag.startPos && drag.type === "row" && onResizeRow) {
3004
3019
  const deltaY = e.clientY - drag.startPos;
3005
- const newHeight = chunkFZSYLXJT_js.computeResizedRowHeight(
3006
- drag.initialRowHeight ?? chunkFZSYLXJT_js.DEFAULT_ROW_HEIGHT,
3020
+ const newHeight = chunkYF2BQIW3_js.computeResizedRowHeight(
3021
+ drag.initialRowHeight ?? chunkYF2BQIW3_js.DEFAULT_ROW_HEIGHT,
3007
3022
  deltaY
3008
3023
  );
3009
3024
  onResizeRow(drag.index, newHeight);
@@ -3041,7 +3056,7 @@ function TableResizeOverlay({
3041
3056
  e.stopPropagation();
3042
3057
  const table = containerRef.current?.querySelector("table");
3043
3058
  const tr = table?.querySelectorAll("tbody > tr")[index];
3044
- const actualHeight = tr?.offsetHeight ?? chunkFZSYLXJT_js.DEFAULT_ROW_HEIGHT;
3059
+ const actualHeight = tr?.offsetHeight ?? chunkYF2BQIW3_js.DEFAULT_ROW_HEIGHT;
3045
3060
  document.body.style.cursor = "row-resize";
3046
3061
  document.body.style.userSelect = "none";
3047
3062
  dragRef.current = {
@@ -3081,14 +3096,14 @@ function renderTableFromTableData(element, textStyle, options) {
3081
3096
  const rowCount = tableData.rows.length;
3082
3097
  const columnCount = tableData.columnWidths.length;
3083
3098
  const selectedCell = options?.selectedCell || null;
3084
- const isEditable = Boolean(options?.editable) && chunkFZSYLXJT_js.canDrillDown(element);
3099
+ const isEditable = Boolean(options?.editable) && chunkYF2BQIW3_js.canDrillDown(element);
3085
3100
  const hasCellSelectionHandler = typeof options?.onSelectCell === "function";
3086
3101
  const sharedCtx = {
3087
3102
  tableStyleMap: options?.styleCtx?.tableStyleMap,
3088
3103
  colorScheme: options?.styleCtx?.theme?.colorScheme,
3089
3104
  fontScheme: options?.styleCtx?.theme?.fontScheme
3090
3105
  };
3091
- const cellCss = (cell, rowIndex, cellIndex) => chunkFZSYLXJT_js.tableCellCss(
3106
+ const cellCss = (cell, rowIndex, cellIndex) => chunkYF2BQIW3_js.tableCellCss(
3092
3107
  tableData,
3093
3108
  cell,
3094
3109
  { rowIndex, cellIndex, rowCount, columnCount },
@@ -3101,7 +3116,7 @@ function renderTableFromTableData(element, textStyle, options) {
3101
3116
  }
3102
3117
  const first = selectedCell.selectedCells[0];
3103
3118
  const last = selectedCell.selectedCells[selectedCell.selectedCells.length - 1];
3104
- return chunkFZSYLXJT_js.computeSelectionRect(first.row, first.col, last.row, last.col, tableData);
3119
+ return chunkYF2BQIW3_js.computeSelectionRect(first.row, first.col, last.row, last.col, tableData);
3105
3120
  })();
3106
3121
  return /* @__PURE__ */ jsxRuntime.jsx(
3107
3122
  TableResizeOverlay,
@@ -3122,9 +3137,9 @@ function renderTableFromTableData(element, textStyle, options) {
3122
3137
  {
3123
3138
  className: "w-full h-full border-collapse table-fixed",
3124
3139
  style: {
3125
- fontFamily: chunkFZSYLXJT_js.DEFAULT_FONT_FAMILY,
3140
+ fontFamily: chunkYF2BQIW3_js.DEFAULT_FONT_FAMILY,
3126
3141
  // `a:tblPr@rtl` mirrors the column order for RTL decks.
3127
- ...chunkFZSYLXJT_js.tableContainerCss(tableData)
3142
+ ...chunkYF2BQIW3_js.tableContainerCss(tableData)
3128
3143
  },
3129
3144
  children: [
3130
3145
  tableData.columnWidths.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("colgroup", { children: tableData.columnWidths.map((w, ci) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -3143,7 +3158,7 @@ function renderTableFromTableData(element, textStyle, options) {
3143
3158
  return null;
3144
3159
  }
3145
3160
  const isCellSelected = selectedCell?.rowIndex === rowIndex && selectedCell?.columnIndex === cellIndex;
3146
- const isInMultiSelection = chunkFZSYLXJT_js.isCellInRect(rowIndex, cellIndex, selectionRect);
3161
+ const isInMultiSelection = chunkYF2BQIW3_js.isCellInRect(rowIndex, cellIndex, selectionRect);
3147
3162
  const isCellEditing = isCellSelected && selectedCell?.isEditing;
3148
3163
  const diag = getCellDiagonalBorders2(
3149
3164
  cell.style,
@@ -3172,7 +3187,7 @@ function renderTableFromTableData(element, textStyle, options) {
3172
3187
  }
3173
3188
  event.stopPropagation();
3174
3189
  if (event.shiftKey && selectedCell) {
3175
- const rect = chunkFZSYLXJT_js.computeSelectionRect(
3190
+ const rect = chunkYF2BQIW3_js.computeSelectionRect(
3176
3191
  selectedCell.rowIndex,
3177
3192
  selectedCell.columnIndex,
3178
3193
  rowIndex,
@@ -3182,7 +3197,7 @@ function renderTableFromTableData(element, textStyle, options) {
3182
3197
  options?.onSelectCell?.({
3183
3198
  rowIndex: selectedCell.rowIndex,
3184
3199
  columnIndex: selectedCell.columnIndex,
3185
- selectedCells: chunkFZSYLXJT_js.rectToCells(rect)
3200
+ selectedCells: chunkYF2BQIW3_js.rectToCells(rect)
3186
3201
  });
3187
3202
  } else {
3188
3203
  options?.onSelectCell?.({
@@ -3243,10 +3258,10 @@ function renderTableElement(element, textStyle, options) {
3243
3258
  if (tableEl2.tableData && tableEl2.tableData.rows.length > 0) {
3244
3259
  return renderTableFromTableData(tableEl2, textStyle, options);
3245
3260
  }
3246
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk3JUZOKFI_js.translationsEn["pptx.table.title"] });
3261
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunkLTBTG2QB_js.translationsEn["pptx.table.title"] });
3247
3262
  }
3248
3263
  const selectedCell = options?.selectedCell || null;
3249
- const isEditable = Boolean(options?.editable) && chunkFZSYLXJT_js.canDrillDown(element);
3264
+ const isEditable = Boolean(options?.editable) && chunkYF2BQIW3_js.canDrillDown(element);
3250
3265
  const hasCellSelectionHandler = typeof options?.onSelectCell === "function";
3251
3266
  const tableEl = element;
3252
3267
  const xmlSelectionRect = (() => {
@@ -3258,7 +3273,7 @@ function renderTableElement(element, textStyle, options) {
3258
3273
  }
3259
3274
  const first = selectedCell.selectedCells[0];
3260
3275
  const last = selectedCell.selectedCells[selectedCell.selectedCells.length - 1];
3261
- return chunkFZSYLXJT_js.computeSelectionRect(first.row, first.col, last.row, last.col, tableEl.tableData);
3276
+ return chunkYF2BQIW3_js.computeSelectionRect(first.row, first.col, last.row, last.col, tableEl.tableData);
3262
3277
  })();
3263
3278
  const schemeOverrides = options?.styleCtx?.theme?.colorScheme ? options.styleCtx.theme.colorScheme : void 0;
3264
3279
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -3280,9 +3295,9 @@ function renderTableElement(element, textStyle, options) {
3280
3295
  {
3281
3296
  className: "w-full h-full border-collapse table-fixed",
3282
3297
  style: {
3283
- fontFamily: chunkFZSYLXJT_js.DEFAULT_FONT_FAMILY,
3298
+ fontFamily: chunkYF2BQIW3_js.DEFAULT_FONT_FAMILY,
3284
3299
  // `a:tblPr@rtl` mirrors the column order for RTL decks.
3285
- ...chunkFZSYLXJT_js.tableContainerCss(tableEl.tableData)
3300
+ ...chunkYF2BQIW3_js.tableContainerCss(tableEl.tableData)
3286
3301
  },
3287
3302
  children: [
3288
3303
  parsedTable.columnPercentages.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("colgroup", { children: parsedTable.columnPercentages.map((percentage, columnIndex) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -3339,7 +3354,7 @@ function renderTableElement(element, textStyle, options) {
3339
3354
  color: textStyle.color,
3340
3355
  ...bandStyle,
3341
3356
  ...xmlCellStyle,
3342
- ...tdCellOverride ? chunkFZSYLXJT_js.cellStyleToCss(tdCellOverride) : void 0,
3357
+ ...tdCellOverride ? chunkYF2BQIW3_js.cellStyleToCss(tdCellOverride) : void 0,
3343
3358
  ...diag ? { position: "relative" } : void 0
3344
3359
  };
3345
3360
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -3349,7 +3364,7 @@ function renderTableElement(element, textStyle, options) {
3349
3364
  "border px-1 py-0.5 align-top",
3350
3365
  isEditable && hasCellSelectionHandler ? "border-blue-200/70 cursor-cell" : "border-white/30",
3351
3366
  selectedCell?.rowIndex === rowIndex && selectedCell?.columnIndex === cellIndex ? "ring-1 ring-inset ring-blue-500" : null,
3352
- chunkFZSYLXJT_js.isCellInRect(rowIndex, cellIndex, xmlSelectionRect) && !(selectedCell?.rowIndex === rowIndex && selectedCell?.columnIndex === cellIndex) ? "bg-blue-500/15 ring-1 ring-inset ring-blue-400/50" : null
3367
+ chunkYF2BQIW3_js.isCellInRect(rowIndex, cellIndex, xmlSelectionRect) && !(selectedCell?.rowIndex === rowIndex && selectedCell?.columnIndex === cellIndex) ? "bg-blue-500/15 ring-1 ring-inset ring-blue-400/50" : null
3353
3368
  ),
3354
3369
  colSpan,
3355
3370
  rowSpan: rSpan,
@@ -3360,7 +3375,7 @@ function renderTableElement(element, textStyle, options) {
3360
3375
  }
3361
3376
  event.stopPropagation();
3362
3377
  if (event.shiftKey && selectedCell && tableEl.tableData) {
3363
- const rect = chunkFZSYLXJT_js.computeSelectionRect(
3378
+ const rect = chunkYF2BQIW3_js.computeSelectionRect(
3364
3379
  selectedCell.rowIndex,
3365
3380
  selectedCell.columnIndex,
3366
3381
  rowIndex,
@@ -3370,7 +3385,7 @@ function renderTableElement(element, textStyle, options) {
3370
3385
  options?.onSelectCell?.({
3371
3386
  rowIndex: selectedCell.rowIndex,
3372
3387
  columnIndex: selectedCell.columnIndex,
3373
- selectedCells: chunkFZSYLXJT_js.rectToCells(rect)
3388
+ selectedCells: chunkYF2BQIW3_js.rectToCells(rect)
3374
3389
  });
3375
3390
  } else {
3376
3391
  options?.onSelectCell?.({
@@ -3428,24 +3443,27 @@ function renderTableElement(element, textStyle, options) {
3428
3443
  }
3429
3444
  );
3430
3445
  }
3446
+ function renderGradientStops(stops) {
3447
+ return stops.map((stop, i) => /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: stop.offset, stopColor: stop.color, stopOpacity: stop.opacity }, i));
3448
+ }
3431
3449
  function partAttrs(part) {
3432
- return part ? chunkFZSYLXJT_js.chartPartToAttrs(part) : void 0;
3450
+ return part ? chunkYF2BQIW3_js.chartPartToAttrs(part) : void 0;
3433
3451
  }
3434
3452
  function resolveReactPalette(chartData) {
3435
3453
  if (chartData.colorPalette && chartData.colorPalette.length > 0) {
3436
3454
  return chartData.colorPalette;
3437
3455
  }
3438
- return [...chunkFZSYLXJT_js.getChartStylePalette(chartData.style?.styleId)];
3456
+ return [...chunkYF2BQIW3_js.getChartStylePalette(chartData.style?.styleId)];
3439
3457
  }
3440
3458
  function buildReactChartViewModel(element) {
3441
3459
  if (element.type !== "chart" || !element.chartData) {
3442
- return chunkFZSYLXJT_js.buildChartViewModel(element);
3460
+ return chunkYF2BQIW3_js.buildChartViewModel(element);
3443
3461
  }
3444
3462
  const palette = resolveReactPalette(element.chartData), themedElement = {
3445
3463
  ...element,
3446
3464
  chartData: { ...element.chartData, colorPalette: palette }
3447
3465
  };
3448
- return chunkFZSYLXJT_js.buildChartViewModel(themedElement);
3466
+ return chunkYF2BQIW3_js.buildChartViewModel(themedElement);
3449
3467
  }
3450
3468
  function renderPrimitive(prim, key) {
3451
3469
  switch (prim.kind) {
@@ -3597,7 +3615,7 @@ function renderText(t, key) {
3597
3615
  );
3598
3616
  }
3599
3617
  function renderChartViewModel(elementId, vm, preserveAspectRatio = "none") {
3600
- const legendItems = chunkFZSYLXJT_js.computeChartLegendLayout(vm);
3618
+ const legendItems = chunkYF2BQIW3_js.computeChartLegendLayout(vm);
3601
3619
  return /* @__PURE__ */ jsxRuntime.jsxs(
3602
3620
  "svg",
3603
3621
  {
@@ -3605,29 +3623,52 @@ function renderChartViewModel(elementId, vm, preserveAspectRatio = "none") {
3605
3623
  viewBox: `0 0 ${vm.svgWidth} ${vm.svgHeight}`,
3606
3624
  preserveAspectRatio,
3607
3625
  children: [
3608
- vm.defs && vm.defs.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("defs", { children: vm.defs.map((def, i) => /* @__PURE__ */ jsxRuntime.jsx(
3609
- "pattern",
3610
- {
3611
- id: def.id,
3612
- patternUnits: def.patternUnits,
3613
- x: def.x,
3614
- y: def.y,
3615
- width: def.width,
3616
- height: def.height,
3617
- children: /* @__PURE__ */ jsxRuntime.jsx(
3618
- "image",
3619
- {
3620
- href: def.href,
3621
- x: 0,
3622
- y: 0,
3623
- width: def.width,
3624
- height: def.height,
3625
- preserveAspectRatio: def.preserveAspectRatio
3626
- }
3627
- )
3628
- },
3629
- `${elementId}-def-${i}`
3630
- )) }),
3626
+ vm.defs && vm.defs.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("defs", { children: vm.defs.map(
3627
+ (def, i) => def.kind === "linearGradient" ? /* @__PURE__ */ jsxRuntime.jsx(
3628
+ "linearGradient",
3629
+ {
3630
+ id: def.id,
3631
+ x1: def.x1,
3632
+ y1: def.y1,
3633
+ x2: def.x2,
3634
+ y2: def.y2,
3635
+ children: renderGradientStops(def.stops)
3636
+ },
3637
+ `${elementId}-def-${i}`
3638
+ ) : def.kind === "radialGradient" ? /* @__PURE__ */ jsxRuntime.jsx(
3639
+ "radialGradient",
3640
+ {
3641
+ id: def.id,
3642
+ cx: def.cx,
3643
+ cy: def.cy,
3644
+ r: def.r,
3645
+ children: renderGradientStops(def.stops)
3646
+ },
3647
+ `${elementId}-def-${i}`
3648
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
3649
+ "pattern",
3650
+ {
3651
+ id: def.id,
3652
+ patternUnits: def.patternUnits,
3653
+ x: def.x,
3654
+ y: def.y,
3655
+ width: def.width,
3656
+ height: def.height,
3657
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3658
+ "image",
3659
+ {
3660
+ href: def.href,
3661
+ x: 0,
3662
+ y: 0,
3663
+ width: def.width,
3664
+ height: def.height,
3665
+ preserveAspectRatio: def.preserveAspectRatio
3666
+ }
3667
+ )
3668
+ },
3669
+ `${elementId}-def-${i}`
3670
+ )
3671
+ ) }),
3631
3672
  vm.areaFill && /* @__PURE__ */ jsxRuntime.jsx(
3632
3673
  "rect",
3633
3674
  {
@@ -3737,17 +3778,17 @@ function renderChartViewModel(elementId, vm, preserveAspectRatio = "none") {
3737
3778
  }
3738
3779
  function renderChartElement(element) {
3739
3780
  if (element.type !== "chart") {
3740
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk3JUZOKFI_js.translationsEn["pptx.chart.heading"] });
3781
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunkLTBTG2QB_js.translationsEn["pptx.chart.heading"] });
3741
3782
  }
3742
3783
  const chartData = element.chartData;
3743
3784
  if (!chartData || chartData.series.length === 0) {
3744
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk3JUZOKFI_js.translationsEn["pptx.chart.heading"] });
3785
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunkLTBTG2QB_js.translationsEn["pptx.chart.heading"] });
3745
3786
  }
3746
- const kind = chunkFZSYLXJT_js.resolveChartKind(chartData.chartType ?? "bar");
3787
+ const kind = chunkYF2BQIW3_js.resolveChartKind(chartData.chartType ?? "bar");
3747
3788
  return renderChartViewModel(
3748
3789
  element.id,
3749
3790
  buildReactChartViewModel(element),
3750
- chunkFZSYLXJT_js.chartPreserveAspectRatio(kind)
3791
+ chunkYF2BQIW3_js.chartPreserveAspectRatio(kind)
3751
3792
  );
3752
3793
  }
3753
3794
 
@@ -3767,14 +3808,14 @@ function buildNotesPdf(pages) {
3767
3808
  notes: page.notes,
3768
3809
  slideNumber: page.slideNumber
3769
3810
  }));
3770
- const bytes = chunkFZSYLXJT_js.buildNotesPdfBytes(images, meta);
3811
+ const bytes = chunkYF2BQIW3_js.buildNotesPdfBytes(images, meta);
3771
3812
  const blob = new Blob([bytes], { type: "application/pdf" });
3772
3813
  return URL.createObjectURL(blob);
3773
3814
  }
3774
3815
 
3775
3816
  // src/viewer/utils/pdf-builder-slides.ts
3776
3817
  function buildPdfFromTiledImageData(pages) {
3777
- const bytes = chunkFZSYLXJT_js.buildTiledSlidesPdfBytes(pages);
3818
+ const bytes = chunkYF2BQIW3_js.buildTiledSlidesPdfBytes(pages);
3778
3819
  const blob = new Blob([bytes], { type: "application/pdf" });
3779
3820
  return URL.createObjectURL(blob);
3780
3821
  }
@@ -3783,7 +3824,7 @@ function buildPdfFromTiledImageData(pages) {
3783
3824
  var activePreview = null;
3784
3825
  function startPreviewAnimation(elementId, preset, options) {
3785
3826
  stopPreviewAnimation();
3786
- const descriptor = chunkFZSYLXJT_js.buildPreviewAnimation(preset, options);
3827
+ const descriptor = chunkYF2BQIW3_js.buildPreviewAnimation(preset, options);
3787
3828
  if (!descriptor) {
3788
3829
  return;
3789
3830
  }
@@ -3796,7 +3837,7 @@ function startMotionPathPreview(elementId, path, options) {
3796
3837
  return;
3797
3838
  }
3798
3839
  const stage = domEl.offsetParent;
3799
- const descriptor = chunkFZSYLXJT_js.buildMotionPathPreview({
3840
+ const descriptor = chunkYF2BQIW3_js.buildMotionPathPreview({
3800
3841
  path,
3801
3842
  slideWidth: stage?.offsetWidth || DEFAULT_PREVIEW_SLIDE_WIDTH,
3802
3843
  slideHeight: stage?.offsetHeight || DEFAULT_PREVIEW_SLIDE_HEIGHT,