pptx-react-viewer 4.64.0 → 4.65.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 (105) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/{AiChatPanel-DRY6JUQE.js → AiChatPanel-7AFFNYEN.js} +19 -19
  3. package/dist/AiChatPanel-7AFFNYEN.js.br +0 -0
  4. package/dist/AiChatPanel-7AFFNYEN.js.gz +0 -0
  5. package/dist/{AiChatPanel-KBSDSD5Y.mjs → AiChatPanel-7U7IJRNY.mjs} +1 -1
  6. package/dist/AiChatPanel-7U7IJRNY.mjs.br +0 -0
  7. package/dist/AiChatPanel-7U7IJRNY.mjs.gz +0 -0
  8. package/dist/ai.js +2 -2
  9. package/dist/ai.js.br +0 -0
  10. package/dist/ai.js.gz +0 -0
  11. package/dist/ai.mjs +1 -1
  12. package/dist/ai.mjs.br +0 -0
  13. package/dist/ai.mjs.gz +0 -0
  14. package/dist/{chunk-JKSUB7DR.js → chunk-5DBKW7F3.js} +3 -3
  15. package/dist/chunk-5DBKW7F3.js.br +0 -0
  16. package/dist/{chunk-JKSUB7DR.js.gz → chunk-5DBKW7F3.js.gz} +0 -0
  17. package/dist/{chunk-46VMP4EH.mjs → chunk-5ZW3GP6C.mjs} +4 -4
  18. package/dist/chunk-5ZW3GP6C.mjs.br +0 -0
  19. package/dist/chunk-5ZW3GP6C.mjs.gz +0 -0
  20. package/dist/{chunk-FYYQ4OGF.mjs → chunk-G5JGUSBL.mjs} +12 -5
  21. package/dist/chunk-G5JGUSBL.mjs.br +0 -0
  22. package/dist/chunk-G5JGUSBL.mjs.gz +0 -0
  23. package/dist/{chunk-PX46BOMQ.js → chunk-LUKGXRHZ.js} +571 -561
  24. package/dist/chunk-LUKGXRHZ.js.br +0 -0
  25. package/dist/chunk-LUKGXRHZ.js.gz +0 -0
  26. package/dist/{chunk-7UFO4OZQ.js → chunk-PNDORR6S.js} +1 -1
  27. package/dist/chunk-PNDORR6S.js.br +0 -0
  28. package/dist/chunk-PNDORR6S.js.gz +0 -0
  29. package/dist/{chunk-73SDWM6K.js → chunk-VGU5S37T.js} +212 -205
  30. package/dist/chunk-VGU5S37T.js.br +0 -0
  31. package/dist/chunk-VGU5S37T.js.gz +0 -0
  32. package/dist/{chunk-SHI3PQ5F.mjs → chunk-VMX3IDQB.mjs} +16 -6
  33. package/dist/chunk-VMX3IDQB.mjs.br +0 -0
  34. package/dist/chunk-VMX3IDQB.mjs.gz +0 -0
  35. package/dist/{chunk-SGWF6GUX.mjs → chunk-WAIX4VJ2.mjs} +1 -1
  36. package/dist/chunk-WAIX4VJ2.mjs.br +0 -0
  37. package/dist/chunk-WAIX4VJ2.mjs.gz +0 -0
  38. package/dist/i18n/de.cjs +5 -0
  39. package/dist/i18n/de.cjs.br +0 -0
  40. package/dist/i18n/de.cjs.gz +0 -0
  41. package/dist/i18n/de.mjs +5 -0
  42. package/dist/i18n/de.mjs.br +0 -0
  43. package/dist/i18n/de.mjs.gz +0 -0
  44. package/dist/i18n/es.cjs +5 -0
  45. package/dist/i18n/es.cjs.br +0 -0
  46. package/dist/i18n/es.cjs.gz +0 -0
  47. package/dist/i18n/es.mjs +5 -0
  48. package/dist/i18n/es.mjs.br +0 -0
  49. package/dist/i18n/es.mjs.gz +0 -0
  50. package/dist/i18n/fr.cjs +5 -0
  51. package/dist/i18n/fr.cjs.br +0 -0
  52. package/dist/i18n/fr.cjs.gz +0 -0
  53. package/dist/i18n/fr.mjs +5 -0
  54. package/dist/i18n/fr.mjs.br +0 -0
  55. package/dist/i18n/fr.mjs.gz +0 -0
  56. package/dist/i18n/zh-CN.cjs +5 -0
  57. package/dist/i18n/zh-CN.cjs.br +0 -0
  58. package/dist/i18n/zh-CN.cjs.gz +0 -0
  59. package/dist/i18n/zh-CN.mjs +5 -0
  60. package/dist/i18n/zh-CN.mjs.br +0 -0
  61. package/dist/i18n/zh-CN.mjs.gz +0 -0
  62. package/dist/index.js +27 -27
  63. package/dist/index.js.br +0 -0
  64. package/dist/index.js.gz +0 -0
  65. package/dist/index.mjs +4 -4
  66. package/dist/index.mjs.br +0 -0
  67. package/dist/index.mjs.gz +0 -0
  68. package/dist/internals.js +81 -81
  69. package/dist/internals.js.br +0 -0
  70. package/dist/internals.js.gz +0 -0
  71. package/dist/internals.mjs +2 -2
  72. package/dist/internals.mjs.br +0 -0
  73. package/dist/internals.mjs.gz +0 -0
  74. package/dist/pptx-viewer-canvas.css +1 -1
  75. package/dist/pptx-viewer-canvas.css.br +0 -0
  76. package/dist/pptx-viewer-canvas.css.gz +0 -0
  77. package/dist/pptx-viewer.css +1 -1
  78. package/dist/pptx-viewer.css.br +0 -0
  79. package/dist/pptx-viewer.css.gz +0 -0
  80. package/dist/viewer/index.js +21 -21
  81. package/dist/viewer/index.js.br +0 -0
  82. package/dist/viewer/index.js.gz +0 -0
  83. package/dist/viewer/index.mjs +4 -4
  84. package/dist/viewer/index.mjs.br +0 -0
  85. package/dist/viewer/index.mjs.gz +0 -0
  86. package/package.json +3 -3
  87. package/dist/AiChatPanel-DRY6JUQE.js.br +0 -0
  88. package/dist/AiChatPanel-DRY6JUQE.js.gz +0 -0
  89. package/dist/AiChatPanel-KBSDSD5Y.mjs.br +0 -0
  90. package/dist/AiChatPanel-KBSDSD5Y.mjs.gz +0 -0
  91. package/dist/chunk-46VMP4EH.mjs.br +0 -0
  92. package/dist/chunk-46VMP4EH.mjs.gz +0 -0
  93. package/dist/chunk-73SDWM6K.js.br +0 -0
  94. package/dist/chunk-73SDWM6K.js.gz +0 -0
  95. package/dist/chunk-7UFO4OZQ.js.br +0 -0
  96. package/dist/chunk-7UFO4OZQ.js.gz +0 -0
  97. package/dist/chunk-FYYQ4OGF.mjs.br +0 -0
  98. package/dist/chunk-FYYQ4OGF.mjs.gz +0 -0
  99. package/dist/chunk-JKSUB7DR.js.br +0 -0
  100. package/dist/chunk-PX46BOMQ.js.br +0 -0
  101. package/dist/chunk-PX46BOMQ.js.gz +0 -0
  102. package/dist/chunk-SGWF6GUX.mjs.br +0 -0
  103. package/dist/chunk-SGWF6GUX.mjs.gz +0 -0
  104. package/dist/chunk-SHI3PQ5F.mjs.br +0 -0
  105. package/dist/chunk-SHI3PQ5F.mjs.gz +0 -0
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunk7UFO4OZQ_js = require('./chunk-7UFO4OZQ.js');
4
- var chunk73SDWM6K_js = require('./chunk-73SDWM6K.js');
5
- var chunkJKSUB7DR_js = require('./chunk-JKSUB7DR.js');
3
+ var chunkPNDORR6S_js = require('./chunk-PNDORR6S.js');
4
+ var chunkVGU5S37T_js = require('./chunk-VGU5S37T.js');
5
+ var chunk5DBKW7F3_js = require('./chunk-5DBKW7F3.js');
6
6
  var pptx = require('ooxml-ui/pptx');
7
7
  var React108 = require('react');
8
8
  var jsxRuntime = require('react/jsx-runtime');
@@ -49,7 +49,7 @@ function AvatarCircle({
49
49
  avatar,
50
50
  isLocal
51
51
  }) {
52
- const { t } = chunkJKSUB7DR_js.useTranslation();
52
+ const { t } = chunk5DBKW7F3_js.useTranslation();
53
53
  const initials = getInitials(name);
54
54
  const title = isLocal ? t("pptx.collaboration.youLabel", { name }) : name;
55
55
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -84,7 +84,7 @@ function UserAvatarBar({
84
84
  status,
85
85
  maxVisible = 5
86
86
  }) {
87
- const { t } = chunkJKSUB7DR_js.useTranslation();
87
+ const { t } = chunk5DBKW7F3_js.useTranslation();
88
88
  if (status === "disconnected" || status === "error") {
89
89
  return null;
90
90
  }
@@ -158,7 +158,7 @@ function CollaborationStatusIndicator({
158
158
  connectedCount,
159
159
  onRetry
160
160
  }) {
161
- const { t } = chunkJKSUB7DR_js.useTranslation();
161
+ const { t } = chunk5DBKW7F3_js.useTranslation();
162
162
  const style = STATUS_STYLES[status];
163
163
  return /* @__PURE__ */ jsxRuntime.jsxs(
164
164
  "div",
@@ -199,7 +199,7 @@ function FollowModeBar({
199
199
  followedClientId,
200
200
  onFollow
201
201
  }) {
202
- const { t } = chunkJKSUB7DR_js.useTranslation();
202
+ const { t } = chunk5DBKW7F3_js.useTranslation();
203
203
  if (presences.length === 0) {
204
204
  return null;
205
205
  }
@@ -304,7 +304,7 @@ function SectionContextMenu({
304
304
  onAddSection,
305
305
  onClose
306
306
  }) {
307
- const { t } = chunkJKSUB7DR_js.useTranslation();
307
+ const { t } = chunk5DBKW7F3_js.useTranslation();
308
308
  React108.useEffect(() => {
309
309
  const onKeyDown = (event) => {
310
310
  if (event.key === "Escape") {
@@ -405,7 +405,7 @@ function SectionHeader({
405
405
  /* @__PURE__ */ jsxRuntime.jsx(
406
406
  lu.LuChevronDown,
407
407
  {
408
- className: chunkJKSUB7DR_js.cn(
408
+ className: chunk5DBKW7F3_js.cn(
409
409
  "h-3 w-3 flex-shrink-0 transition-transform",
410
410
  isCollapsed ? "-rotate-90" : "rotate-0"
411
411
  )
@@ -480,7 +480,7 @@ function SlideContextMenu({
480
480
  onAddSection,
481
481
  onClose
482
482
  }) {
483
- const { t } = chunkJKSUB7DR_js.useTranslation();
483
+ const { t } = chunk5DBKW7F3_js.useTranslation();
484
484
  const selected = state.selectedIndexes;
485
485
  const selectedSlides = selected.map((i) => slides[i]).filter((s) => Boolean(s));
486
486
  const entries = pptx.buildSlidePaneContextMenuEntries({
@@ -544,14 +544,14 @@ function SlideThumbnailImpl({
544
544
  }) {
545
545
  const safeCanvasWidth = Math.max(canvasSize.width, 1);
546
546
  const safeCanvasHeight = Math.max(canvasSize.height, 1);
547
- const width = previewWidth ?? chunkJKSUB7DR_js.SLIDE_NAV_THUMBNAIL_WIDTH;
547
+ const width = previewWidth ?? chunk5DBKW7F3_js.SLIDE_NAV_THUMBNAIL_WIDTH;
548
548
  const scale = width / safeCanvasWidth;
549
549
  const previewHeight = pptx.editorThumbnailHeight(safeCanvasWidth, safeCanvasHeight, width);
550
550
  const previewElements = pptx.buildPreviewElements(slide, templateElements);
551
551
  const slideFieldContext = pptx.deriveSlideFieldContext(fieldContext, slide);
552
- const { t } = chunkJKSUB7DR_js.useTranslation();
552
+ const { t } = chunk5DBKW7F3_js.useTranslation();
553
553
  const transitionLabel = slide.transition ? (() => {
554
- const opt = chunkJKSUB7DR_js.SLIDE_TRANSITION_OPTIONS.find((o) => o.value === slide.transition?.type);
554
+ const opt = chunk5DBKW7F3_js.SLIDE_TRANSITION_OPTIONS.find((o) => o.value === slide.transition?.type);
555
555
  return opt ? t(opt.i18nKey) : slide.transition.type;
556
556
  })() : void 0;
557
557
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -577,7 +577,7 @@ function SlideThumbnailImpl({
577
577
  ...pptx.deviceStrokeStageStyle(scale)
578
578
  },
579
579
  children: [
580
- /* @__PURE__ */ jsxRuntime.jsx(chunk73SDWM6K_js.SlideBackgroundImageLayer, { slide }),
580
+ /* @__PURE__ */ jsxRuntime.jsx(chunkVGU5S37T_js.SlideBackgroundImageLayer, { slide }),
581
581
  slide.transition && slide.transition.type !== "none" && slide.transition.type !== "cut" && /* @__PURE__ */ jsxRuntime.jsx(
582
582
  "div",
583
583
  {
@@ -587,7 +587,7 @@ function SlideThumbnailImpl({
587
587
  }
588
588
  ),
589
589
  previewElements.map((element, index) => /* @__PURE__ */ jsxRuntime.jsx(
590
- chunk73SDWM6K_js.StaticElementRenderer,
590
+ chunkVGU5S37T_js.StaticElementRenderer,
591
591
  {
592
592
  element,
593
593
  activeSlide: slide,
@@ -713,7 +713,7 @@ function LazyThumbnailInner({
713
713
  }
714
714
  var LazyThumbnail = /* @__PURE__ */ React108__default.default.memo(LazyThumbnailInner);
715
715
  function declaredSectionFacts(groups, sectionId) {
716
- const declared = groups.filter((group) => group.id !== chunkJKSUB7DR_js.DEFAULT_SECTION_GROUP_ID && group.id !== chunkJKSUB7DR_js.UNGROUPED_SECTION_ID).map((group) => group.id);
716
+ const declared = groups.filter((group) => group.id !== chunk5DBKW7F3_js.DEFAULT_SECTION_GROUP_ID && group.id !== chunk5DBKW7F3_js.UNGROUPED_SECTION_ID).map((group) => group.id);
717
717
  return {
718
718
  isDeclared: declared.includes(sectionId),
719
719
  index: declared.indexOf(sectionId),
@@ -770,7 +770,7 @@ function SlideItemInner({
770
770
  onDrop,
771
771
  slideRef
772
772
  }) {
773
- const { t } = chunkJKSUB7DR_js.useTranslation();
773
+ const { t } = chunk5DBKW7F3_js.useTranslation();
774
774
  const isHidden = Boolean(slide.hidden);
775
775
  const cue = pptx.hiddenSlideCue(slide.hidden, "rail", slideIndex);
776
776
  const handleContextMenu = React108.useCallback(
@@ -798,7 +798,7 @@ function SlideItemInner({
798
798
  "data-pptx-chrome": "slide-row",
799
799
  "aria-describedby": cue.labelId,
800
800
  "data-pptx-slide-hidden": cue.marker,
801
- className: chunkJKSUB7DR_js.cn(
801
+ className: chunk5DBKW7F3_js.cn(
802
802
  "group relative flex w-full items-center gap-1 cursor-pointer border-0 bg-transparent py-0.5 px-1 text-left transition-all",
803
803
  isActive && "bg-accent/40 before:absolute before:left-0 before:top-1 before:bottom-1 before:w-[3px] before:bg-primary before:rounded-r",
804
804
  isSelected && !isActive && "bg-accent/20 ring-1 ring-inset ring-primary/50",
@@ -820,7 +820,7 @@ function SlideItemInner({
820
820
  /* @__PURE__ */ jsxRuntime.jsx(
821
821
  "span",
822
822
  {
823
- className: chunkJKSUB7DR_js.cn(
823
+ className: chunk5DBKW7F3_js.cn(
824
824
  "text-[10px] tabular-nums text-right select-none w-full",
825
825
  isActive ? "text-primary font-medium" : "text-muted-foreground"
826
826
  ),
@@ -843,7 +843,7 @@ function SlideItemInner({
843
843
  /* @__PURE__ */ jsxRuntime.jsxs(
844
844
  "div",
845
845
  {
846
- className: chunkJKSUB7DR_js.cn(
846
+ className: chunk5DBKW7F3_js.cn(
847
847
  "relative shrink-0 overflow-hidden border transition-colors bg-white",
848
848
  isActive ? "border-primary/60" : "border-transparent group-hover:border-border/40"
849
849
  ),
@@ -1041,8 +1041,8 @@ function SlidesPaneSidebar({
1041
1041
  fieldContext,
1042
1042
  tableStyleContext
1043
1043
  }) {
1044
- const { t } = chunkJKSUB7DR_js.useTranslation();
1045
- const collab = chunk73SDWM6K_js.useCollaboration();
1044
+ const { t } = chunk5DBKW7F3_js.useTranslation();
1045
+ const collab = chunkVGU5S37T_js.useCollaboration();
1046
1046
  const slideRefs = React108.useRef(/* @__PURE__ */ new Map());
1047
1047
  const renameInputRef = React108.useRef(null);
1048
1048
  const slidePresenceMap = React108.useMemo(() => {
@@ -1067,7 +1067,7 @@ function SlidesPaneSidebar({
1067
1067
  () => estimateSlideItemHeight(canvasSize.width, canvasSize.height, previewWidth),
1068
1068
  [canvasSize.width, canvasSize.height, previewWidth]
1069
1069
  );
1070
- const showSectionHeaders = sectionGroups.some((group) => group.id !== chunkJKSUB7DR_js.DEFAULT_SECTION_GROUP_ID);
1070
+ const showSectionHeaders = sectionGroups.some((group) => group.id !== chunk5DBKW7F3_js.DEFAULT_SECTION_GROUP_ID);
1071
1071
  const {
1072
1072
  collapsedSections,
1073
1073
  renamingSectionId,
@@ -1137,7 +1137,7 @@ function SlidesPaneSidebar({
1137
1137
  [sectionGroups, showSectionHeaders, effectiveCollapsed]
1138
1138
  );
1139
1139
  const shouldVirtualize = slides.length >= VIRTUALIZATION_THRESHOLD;
1140
- const { startIndex, endIndex, totalHeight, offsetY, scrollContainerRef, scrollToIndex } = chunk73SDWM6K_js.useVirtualizedSlides({
1140
+ const { startIndex, endIndex, totalHeight, offsetY, scrollContainerRef, scrollToIndex } = chunkVGU5S37T_js.useVirtualizedSlides({
1141
1141
  totalItems: shouldVirtualize ? flatItems.length : 0,
1142
1142
  itemHeight: estimatedItemHeight
1143
1143
  });
@@ -1421,7 +1421,7 @@ function SlideTemplatePreview({
1421
1421
  transformOrigin: "top left"
1422
1422
  },
1423
1423
  children: previewSlide.elements.map((element, index) => /* @__PURE__ */ jsxRuntime.jsx(
1424
- chunk73SDWM6K_js.StaticElementRenderer,
1424
+ chunkVGU5S37T_js.StaticElementRenderer,
1425
1425
  {
1426
1426
  element,
1427
1427
  activeSlide: previewSlide,
@@ -1489,8 +1489,8 @@ function SlideTemplateGalleryDialog({
1489
1489
  onInsert,
1490
1490
  scheme
1491
1491
  }) {
1492
- const { t } = chunkJKSUB7DR_js.useTranslation();
1493
- const { panelStyle, handlers: dragHandlers } = chunk73SDWM6K_js.useModalDismissDrag(onClose);
1492
+ const { t } = chunk5DBKW7F3_js.useTranslation();
1493
+ const { panelStyle, handlers: dragHandlers } = chunkVGU5S37T_js.useModalDismissDrag(onClose);
1494
1494
  const [selected, setSelected] = React108.useState(null);
1495
1495
  const dialogRef = React108.useRef(null);
1496
1496
  useModalFocus(isOpen, dialogRef, onClose);
@@ -1575,7 +1575,7 @@ function SlideTemplateGalleryDialog({
1575
1575
  onInsert(spec.id);
1576
1576
  onClose();
1577
1577
  },
1578
- className: chunkJKSUB7DR_js.cn(
1578
+ className: chunk5DBKW7F3_js.cn(
1579
1579
  "flex flex-col items-center gap-1 p-2 rounded border transition-colors",
1580
1580
  selected === spec.id ? "border-primary bg-primary/20" : "border-border hover:border-border hover:bg-muted/50"
1581
1581
  ),
@@ -1785,7 +1785,7 @@ function nowLocalInputValue() {
1785
1785
  return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}T${pad(now.getHours())}:${pad(now.getMinutes())}`;
1786
1786
  }
1787
1787
  function DateTimeFieldDialog(p) {
1788
- const { t } = chunkJKSUB7DR_js.useTranslation();
1788
+ const { t } = chunk5DBKW7F3_js.useTranslation();
1789
1789
  const [datePickerValue, setDatePickerValue] = React108.useState(nowLocalInputValue);
1790
1790
  const [dateFormat, setDateFormat] = React108.useState("locale");
1791
1791
  const confirmDatePicker = React108.useCallback(() => {
@@ -1891,7 +1891,7 @@ function useViewerCustomizationContext() {
1891
1891
  return React108.useContext(ViewerCustomizationContext);
1892
1892
  }
1893
1893
  function InsertSection(p) {
1894
- const { t } = chunkJKSUB7DR_js.useTranslation();
1894
+ const { t } = chunk5DBKW7F3_js.useTranslation();
1895
1895
  const customization = useViewerCustomizationContext();
1896
1896
  const ref = React108.useRef(null);
1897
1897
  const [datePickerOpen, setDatePickerOpen] = React108.useState(false);
@@ -2040,8 +2040,8 @@ function MobileSheet({
2040
2040
  headerRight
2041
2041
  }) {
2042
2042
  const sheetRef = React108.useRef(null);
2043
- const { t } = chunkJKSUB7DR_js.useTranslation();
2044
- const { dragY, dragging, handlers } = chunk73SDWM6K_js.useSheetDismissDrag(onClose);
2043
+ const { t } = chunk5DBKW7F3_js.useTranslation();
2044
+ const { dragY, dragging, handlers } = chunkVGU5S37T_js.useSheetDismissDrag(onClose);
2045
2045
  useModalFocus(open, sheetRef, onClose);
2046
2046
  if (!open) {
2047
2047
  return null;
@@ -2065,7 +2065,7 @@ function MobileSheet({
2065
2065
  "aria-modal": "true",
2066
2066
  "aria-label": typeof title === "string" ? title : t("pptx.mobileSheet.ariaLabel"),
2067
2067
  tabIndex: -1,
2068
- className: chunkJKSUB7DR_js.cn(
2068
+ className: chunk5DBKW7F3_js.cn(
2069
2069
  "relative bg-background border-t border-border rounded-t-2xl shadow-2xl flex flex-col overflow-hidden",
2070
2070
  "animate-in slide-in-from-bottom duration-200",
2071
2071
  className
@@ -2112,7 +2112,7 @@ function MobileSheet({
2112
2112
  ] });
2113
2113
  }
2114
2114
  function MobileInsertSheet(p) {
2115
- const { t } = chunkJKSUB7DR_js.useTranslation();
2115
+ const { t } = chunk5DBKW7F3_js.useTranslation();
2116
2116
  const close = () => p.onCloseMobileInsert?.();
2117
2117
  const customization = useViewerCustomizationContext();
2118
2118
  const [dateOpen, setDateOpen] = React108.useState(false);
@@ -2188,7 +2188,7 @@ function MobileInsertSheet(p) {
2188
2188
  ] });
2189
2189
  }
2190
2190
  function AnimationsSection(p) {
2191
- const { t } = chunkJKSUB7DR_js.useTranslation();
2191
+ const { t } = chunk5DBKW7F3_js.useTranslation();
2192
2192
  const ref = React108.useRef(null);
2193
2193
  const [previewActive, setPreviewActive] = React108.useState(false);
2194
2194
  const timer = React108.useRef(void 0);
@@ -2269,7 +2269,7 @@ function WebHomeControls({
2269
2269
  onPopup,
2270
2270
  layoutArtwork
2271
2271
  }) {
2272
- const { t } = chunkJKSUB7DR_js.useTranslation();
2272
+ const { t } = chunk5DBKW7F3_js.useTranslation();
2273
2273
  const ref = React108.useRef(null);
2274
2274
  React108.useEffect(() => {
2275
2275
  if (ref.current) {
@@ -2310,7 +2310,7 @@ function WebHomeControls({
2310
2310
  function ShapeArrangeExtras(p) {
2311
2311
  const commands = useShapeFormatContext();
2312
2312
  const crop = commands?.crop;
2313
- const { isHidden } = chunk73SDWM6K_js.useToolbarVisibility(p.hiddenActions);
2313
+ const { isHidden } = chunkVGU5S37T_js.useToolbarVisibility(p.hiddenActions);
2314
2314
  const { onGroupElements, onUngroupElement, onUpdateElementStyle } = p;
2315
2315
  const controls = React108.useMemo(
2316
2316
  () => pptx.arrangeShapeHomeControls({
@@ -2361,7 +2361,7 @@ function ShapeArrangeExtras(p) {
2361
2361
  return /* @__PURE__ */ jsxRuntime.jsx(WebHomeControls, { family: "arrange-shape", controls, onRequest: request });
2362
2362
  }
2363
2363
  function ArrangeSection(p) {
2364
- const { t } = chunkJKSUB7DR_js.useTranslation();
2364
+ const { t } = chunk5DBKW7F3_js.useTranslation();
2365
2365
  const {
2366
2366
  onAlignElements,
2367
2367
  onDistributeElements,
@@ -2468,7 +2468,7 @@ function RibbonGallery({
2468
2468
  tagControl = true,
2469
2469
  onCommand
2470
2470
  }) {
2471
- const { t } = chunkJKSUB7DR_js.useTranslation();
2471
+ const { t } = chunk5DBKW7F3_js.useTranslation();
2472
2472
  const ref = React108.useRef(null);
2473
2473
  const commands = useRibbonGalleryCommands();
2474
2474
  const context = commands?.context;
@@ -2603,7 +2603,7 @@ function WebRibbonToggle({
2603
2603
  );
2604
2604
  }
2605
2605
  function TransitionsSection(p) {
2606
- const { t } = chunkJKSUB7DR_js.useTranslation();
2606
+ const { t } = chunk5DBKW7F3_js.useTranslation();
2607
2607
  const ref = React108.useRef(null);
2608
2608
  const draft = React108.useMemo(() => pptx.readRibbonTransitionDraft(p.activeSlide), [p.activeSlide]);
2609
2609
  const transition = p.activeSlide?.transition;
@@ -2645,7 +2645,7 @@ function TransitionsSection(p) {
2645
2645
  case "soundPreview": {
2646
2646
  const url = pptx.ribbonTransitionStockSoundUrl(transition);
2647
2647
  if (url) {
2648
- chunk73SDWM6K_js.playAnimationSound(url);
2648
+ chunkVGU5S37T_js.playAnimationSound(url);
2649
2649
  }
2650
2650
  break;
2651
2651
  }
@@ -2664,7 +2664,7 @@ function TransitionsSection(p) {
2664
2664
  return /* @__PURE__ */ jsxRuntime.jsx("pptx-ui-ribbon-transitions", { ref });
2665
2665
  }
2666
2666
  function DesignSection(p) {
2667
- const { t } = chunkJKSUB7DR_js.useTranslation();
2667
+ const { t } = chunk5DBKW7F3_js.useTranslation();
2668
2668
  const actions = {
2669
2669
  "design.themes.browseThemes": p.onToggleThemeGallery,
2670
2670
  "design.themes.editTheme": p.onToggleThemeEditor,
@@ -2727,7 +2727,7 @@ function useRecentColors() {
2727
2727
  return React108.useContext(RecentColorsContext);
2728
2728
  }
2729
2729
  function DrawSection(p) {
2730
- const { t } = chunkJKSUB7DR_js.useTranslation();
2730
+ const { t } = chunk5DBKW7F3_js.useTranslation();
2731
2731
  const { pushColor, recentColors } = useRecentColors();
2732
2732
  const ref = React108.useRef(null);
2733
2733
  React108.useEffect(() => {
@@ -2825,7 +2825,7 @@ var AccountAuthContext = /* @__PURE__ */ React108.createContext(
2825
2825
  );
2826
2826
  var cardClass = "border border-border bg-card p-6 text-card-foreground";
2827
2827
  function AccountPage() {
2828
- const { t } = chunkJKSUB7DR_js.useTranslation();
2828
+ const { t } = chunk5DBKW7F3_js.useTranslation();
2829
2829
  const accountAuth = React108.useContext(AccountAuthContext);
2830
2830
  const storage = useViewerStorage();
2831
2831
  const cloud = useViewerCloudFiles();
@@ -2853,7 +2853,7 @@ function AccountPage() {
2853
2853
  refreshUsage();
2854
2854
  setTimeout(() => setCleared(false), 4e3);
2855
2855
  };
2856
- const version = "4.64.0" ;
2856
+ const version = "4.65.0" ;
2857
2857
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-8 max-w-[700px] space-y-6", children: [
2858
2858
  /* @__PURE__ */ jsxRuntime.jsxs("section", { className: cardClass, children: [
2859
2859
  /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "flex items-center gap-2 text-sm font-semibold", children: [
@@ -2893,7 +2893,7 @@ function AccountPage() {
2893
2893
  "aria-label": color,
2894
2894
  "aria-pressed": profile.avatarColor === color,
2895
2895
  onClick: () => updateProfile({ avatarColor: color }),
2896
- className: chunkJKSUB7DR_js.cn(
2896
+ className: chunk5DBKW7F3_js.cn(
2897
2897
  "size-7 rounded-full border-2 transition-transform",
2898
2898
  profile.avatarColor === color ? "border-foreground scale-110" : "border-transparent hover:scale-105"
2899
2899
  ),
@@ -2968,7 +2968,7 @@ function BackstageAction(props) {
2968
2968
  ] });
2969
2969
  }
2970
2970
  function BackstageNewGallery(props) {
2971
- const { t } = chunkJKSUB7DR_js.useTranslation();
2971
+ const { t } = chunk5DBKW7F3_js.useTranslation();
2972
2972
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2973
2973
  /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "mt-7 text-[17px] font-semibold", children: t("pptx.backstage.newHeading") }),
2974
2974
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-5 grid grid-cols-[repeat(auto-fill,minmax(150px,1fr))] gap-6", children: pptx.BACKSTAGE_TEMPLATES.map((template) => /* @__PURE__ */ jsxRuntime.jsxs(
@@ -2994,7 +2994,7 @@ function BackstageNewGallery(props) {
2994
2994
  ] });
2995
2995
  }
2996
2996
  function BackstageRecentList(props) {
2997
- const { t } = chunkJKSUB7DR_js.useTranslation();
2997
+ const { t } = chunk5DBKW7F3_js.useTranslation();
2998
2998
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-5 border-t border-border", children: [
2999
2999
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1fr_120px_90px] px-3 py-2 text-[11px] font-semibold text-muted-foreground", children: [
3000
3000
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("pptx.backstage.columnName") }),
@@ -3048,7 +3048,7 @@ function BackstageCards({
3048
3048
  props,
3049
3049
  run
3050
3050
  }) {
3051
- const { t } = chunkJKSUB7DR_js.useTranslation();
3051
+ const { t } = chunk5DBKW7F3_js.useTranslation();
3052
3052
  const handlers = {
3053
3053
  protect: props.onOpenPasswordProtection,
3054
3054
  inspect: props.onOpenDocumentProperties,
@@ -3110,7 +3110,7 @@ function BackstageNavIcon({ page }) {
3110
3110
  return Icon ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "size-[17px] shrink-0", "aria-hidden": "true" }) : null;
3111
3111
  }
3112
3112
  function FileSection(p) {
3113
- const { t, locale } = chunkJKSUB7DR_js.useTranslation();
3113
+ const { t, locale } = chunk5DBKW7F3_js.useTranslation();
3114
3114
  const [requestedPage, setRequestedPage] = React108.useState("home");
3115
3115
  const customization = useViewerCustomizationContext();
3116
3116
  const nav = pptx.backstageNavEntries(pptx.BACKSTAGE_NAV, customization);
@@ -3118,7 +3118,7 @@ function FileSection(p) {
3118
3118
  const page = offered(requestedPage) ? requestedPage : offered("home") ? "home" : nav.find((item) => item.id !== "save" && item.id !== "close")?.id ?? "home";
3119
3119
  const [query, setQuery] = React108.useState("");
3120
3120
  const [recent, setRecent] = React108.useState([]);
3121
- const { isHidden } = chunk73SDWM6K_js.useToolbarVisibility(p.hiddenActions);
3121
+ const { isHidden } = chunkVGU5S37T_js.useToolbarVisibility(p.hiddenActions);
3122
3122
  const exportHidden = isHidden("export");
3123
3123
  const storage = useViewerStorage();
3124
3124
  const cloud = useViewerCloudFiles();
@@ -3387,7 +3387,7 @@ function RibbonMenu({
3387
3387
  return /* @__PURE__ */ jsxRuntime.jsx(
3388
3388
  "div",
3389
3389
  {
3390
- className: chunkJKSUB7DR_js.cn("fixed z-50", className),
3390
+ className: chunk5DBKW7F3_js.cn("fixed z-50", className),
3391
3391
  style: pos ? { left: pos.left, top: pos.top } : { visibility: "hidden" },
3392
3392
  children
3393
3393
  }
@@ -3397,7 +3397,7 @@ var THUMB_WIDTH = 128;
3397
3397
  var THUMB_HEIGHT = 72;
3398
3398
  var MAX_PREVIEW_ELEMENTS = 100;
3399
3399
  function LayoutGalleryMenu(p) {
3400
- const { t } = chunkJKSUB7DR_js.useTranslation();
3400
+ const { t } = chunk5DBKW7F3_js.useTranslation();
3401
3401
  return /* @__PURE__ */ jsxRuntime.jsx(RibbonMenu, { anchorRef: p.anchorRef, className: "flex flex-col w-[620px] pt-1", children: /* @__PURE__ */ jsxRuntime.jsxs(
3402
3402
  "div",
3403
3403
  {
@@ -3413,7 +3413,7 @@ function LayoutGalleryMenu(p) {
3413
3413
  type: "button",
3414
3414
  "aria-current": isCurrent ? "true" : void 0,
3415
3415
  title: isCurrent ? `${layout.name} (${t("pptx.layoutGallery.current")})` : layout.name,
3416
- className: chunkJKSUB7DR_js.cn(
3416
+ className: chunk5DBKW7F3_js.cn(
3417
3417
  "relative flex min-w-0 flex-col items-center gap-1 rounded border-2 p-1 text-xs text-foreground transition-colors hover:bg-muted",
3418
3418
  isCurrent ? "border-primary bg-primary/10" : "border-transparent"
3419
3419
  ),
@@ -3487,7 +3487,7 @@ function LayoutArtwork({
3487
3487
  backgroundColor
3488
3488
  };
3489
3489
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: (preview?.elements ?? []).slice(0, MAX_PREVIEW_ELEMENTS).map((element, index) => /* @__PURE__ */ jsxRuntime.jsx(
3490
- chunk73SDWM6K_js.StaticElementRenderer,
3490
+ chunkVGU5S37T_js.StaticElementRenderer,
3491
3491
  {
3492
3492
  element,
3493
3493
  activeSlide: slide,
@@ -3762,7 +3762,7 @@ function WebRibbonSection({
3762
3762
  return /* @__PURE__ */ jsxRuntime.jsx("pptx-ui-ribbon-section", { ref });
3763
3763
  }
3764
3764
  function ReviewSection(p) {
3765
- const { t } = chunkJKSUB7DR_js.useTranslation();
3765
+ const { t } = chunk5DBKW7F3_js.useTranslation();
3766
3766
  const [activeCommentId, setActiveCommentId] = React108.useState(null);
3767
3767
  React108.useEffect(() => pptx.trackActiveComment(document, setActiveCommentId), []);
3768
3768
  const host = p.commentsHost;
@@ -3822,7 +3822,7 @@ function SlideShowOptions({
3822
3822
  children
3823
3823
  }) {
3824
3824
  const ref = React108.useRef(null);
3825
- const { t } = chunkJKSUB7DR_js.useTranslation();
3825
+ const { t } = chunk5DBKW7F3_js.useTranslation();
3826
3826
  React108.useLayoutEffect(() => {
3827
3827
  if (!ref.current) {
3828
3828
  return;
@@ -3841,8 +3841,8 @@ function SlideShowOptions({
3841
3841
  return /* @__PURE__ */ jsxRuntime.jsx("pptx-ui-slide-show-options", { ref, children });
3842
3842
  }
3843
3843
  function SubtitleSettingsControl() {
3844
- const { t } = chunkJKSUB7DR_js.useTranslation();
3845
- const supplied = React108.useContext(chunk73SDWM6K_js.ViewerOptionsStoreContext);
3844
+ const { t } = chunk5DBKW7F3_js.useTranslation();
3845
+ const supplied = React108.useContext(chunkVGU5S37T_js.ViewerOptionsStoreContext);
3846
3846
  const fallback = React108.useRef(null);
3847
3847
  if (!supplied) {
3848
3848
  fallback.current ??= pptx.createViewerOptionsStore({ persist: false });
@@ -3875,8 +3875,8 @@ function SubtitleSettingsControl() {
3875
3875
  );
3876
3876
  }
3877
3877
  function SlideShowSection(p) {
3878
- const { t } = chunkJKSUB7DR_js.useTranslation();
3879
- const { isHidden } = chunk73SDWM6K_js.useToolbarVisibility(p.hiddenActions);
3878
+ const { t } = chunk5DBKW7F3_js.useTranslation();
3879
+ const { isHidden } = chunkVGU5S37T_js.useToolbarVisibility(p.hiddenActions);
3880
3880
  const actions = {
3881
3881
  "slideShow.startSlideShow.fromBeginning": p.onPresentFromBeginning ?? (() => p.onSetMode("present")),
3882
3882
  "slideShow.startSlideShow.fromCurrent": p.onPresent,
@@ -4120,7 +4120,7 @@ function FontFormatGroup(p) {
4120
4120
  return /* @__PURE__ */ jsxRuntime.jsx(WebHomeControls, { family: "font", controls, onRequest: request });
4121
4121
  }
4122
4122
  function FontPickerGroup(p) {
4123
- const { t } = chunkJKSUB7DR_js.useTranslation();
4123
+ const { t } = chunk5DBKW7F3_js.useTranslation();
4124
4124
  const { enabled, fontFamily, fontSize, themeFonts, embeddedFonts, customFonts } = p;
4125
4125
  const { onFamily, onSize } = p;
4126
4126
  const controls = React108.useMemo(
@@ -4143,7 +4143,7 @@ function FontPickerGroup(p) {
4143
4143
  return /* @__PURE__ */ jsxRuntime.jsx(WebHomeControls, { family: "font-picker", controls, onRequest: request });
4144
4144
  }
4145
4145
  function ParagraphGroup(p) {
4146
- const { t } = chunkJKSUB7DR_js.useTranslation();
4146
+ const { t } = chunk5DBKW7F3_js.useTranslation();
4147
4147
  const { canMut, canFormat, effectiveTs, onUpdateTextStyle, onToggleBullets } = p;
4148
4148
  const commands = useRibbonGalleryCommands();
4149
4149
  const align = pptx.paragraphHomeAlign(effectiveTs?.align);
@@ -4244,7 +4244,7 @@ function useParagraphListKind(element) {
4244
4244
  return React108.useSyncExternalStore(subscribe, read, readServer);
4245
4245
  }
4246
4246
  function TextSection(p) {
4247
- const { t } = chunkJKSUB7DR_js.useTranslation();
4247
+ const { t } = chunk5DBKW7F3_js.useTranslation();
4248
4248
  const hasSel = Boolean(p.selectedElement);
4249
4249
  const canMut = hasSel && p.canEdit;
4250
4250
  const { fontFamily, fontSize } = extractFontInfo(p.selectedElement, p.themeFonts);
@@ -4320,7 +4320,7 @@ function TextSection(p) {
4320
4320
  ] });
4321
4321
  }
4322
4322
  function ViewSection(p) {
4323
- const { t } = chunkJKSUB7DR_js.useTranslation();
4323
+ const { t } = chunk5DBKW7F3_js.useTranslation();
4324
4324
  const ref = React108.useRef(null);
4325
4325
  React108.useEffect(() => {
4326
4326
  const host = ref.current;
@@ -4393,10 +4393,10 @@ var MENU_ITEMS = [
4393
4393
  { key: "file", label: "pptx.ribbon.tab.file", icon: lu.LuFile }
4394
4394
  ];
4395
4395
  function MobileMenuSheet(props) {
4396
- const { t } = chunkJKSUB7DR_js.useTranslation();
4396
+ const { t } = chunk5DBKW7F3_js.useTranslation();
4397
4397
  const { open, onClose } = props;
4398
4398
  const [active, setActive] = React108.useState("home");
4399
- const { isTabVisible } = chunk73SDWM6K_js.useToolbarVisibility(props.hiddenActions);
4399
+ const { isTabVisible } = chunkVGU5S37T_js.useToolbarVisibility(props.hiddenActions);
4400
4400
  return /* @__PURE__ */ jsxRuntime.jsx(
4401
4401
  MobileSheet,
4402
4402
  {
@@ -4410,7 +4410,7 @@ function MobileMenuSheet(props) {
4410
4410
  {
4411
4411
  type: "button",
4412
4412
  onClick: () => setActive(active === key ? null : key),
4413
- className: chunkJKSUB7DR_js.cn(
4413
+ className: chunk5DBKW7F3_js.cn(
4414
4414
  "inline-flex items-center gap-1.5 shrink-0 px-3 py-2 rounded-full text-[12px] font-medium border transition-colors min-h-[36px]",
4415
4415
  active === key ? "bg-primary text-white border-primary" : "border-border text-muted-foreground hover:text-foreground hover:bg-accent/40"
4416
4416
  ),
@@ -4685,10 +4685,10 @@ function MobileSectionBody({
4685
4685
  }
4686
4686
  }
4687
4687
  function MobileToolbar(props) {
4688
- const { t } = chunkJKSUB7DR_js.useTranslation();
4688
+ const { t } = chunk5DBKW7F3_js.useTranslation();
4689
4689
  const { mode, canUndo, canRedo, onUndo, onRedo, onSetMode, onSaveAsPptx } = props;
4690
4690
  const [menuOpen, setMenuOpen] = React108.useState(false);
4691
- const { isHidden } = chunk73SDWM6K_js.useToolbarVisibility(props.hiddenActions);
4691
+ const { isHidden } = chunkVGU5S37T_js.useToolbarVisibility(props.hiddenActions);
4692
4692
  const showEdit = mode === "edit" || mode === "master";
4693
4693
  const hidden = [];
4694
4694
  if (isHidden("undo")) {
@@ -4734,8 +4734,8 @@ function MobileToolbar(props) {
4734
4734
  ] });
4735
4735
  }
4736
4736
  function ChartSelectionStrip() {
4737
- const { t } = chunkJKSUB7DR_js.useTranslation();
4738
- const commands = chunk73SDWM6K_js.useChartFormatContext();
4737
+ const { t } = chunk5DBKW7F3_js.useTranslation();
4738
+ const commands = chunkVGU5S37T_js.useChartFormatContext();
4739
4739
  const chart = commands?.chart;
4740
4740
  const chartData = chart?.type === "chart" ? chart.chartData : void 0;
4741
4741
  const controls = React108.useMemo(
@@ -4766,7 +4766,7 @@ function PictureSizeStrip({
4766
4766
  hiddenActions
4767
4767
  }) {
4768
4768
  const crop = useShapeFormatContext()?.crop;
4769
- const { isHidden } = chunk73SDWM6K_js.useToolbarVisibility(hiddenActions);
4769
+ const { isHidden } = chunkVGU5S37T_js.useToolbarVisibility(hiddenActions);
4770
4770
  const controls = React108.useMemo(
4771
4771
  () => pptx.pictureSizeHomeControls({
4772
4772
  editable: Boolean(crop),
@@ -4783,7 +4783,7 @@ function PictureSizeStrip({
4783
4783
  return /* @__PURE__ */ jsxRuntime.jsx(WebHomeControls, { family: "picture-size", controls, onRequest: request });
4784
4784
  }
4785
4785
  function useTranslateOr() {
4786
- const { t } = chunkJKSUB7DR_js.useTranslation();
4786
+ const { t } = chunk5DBKW7F3_js.useTranslation();
4787
4787
  return (key, fallback) => pptx.galleryTextLabel(t, key, fallback);
4788
4788
  }
4789
4789
  function ContextualTabSection({
@@ -4806,7 +4806,7 @@ function ContextualTabSection({
4806
4806
  )) });
4807
4807
  }
4808
4808
  function DrawingGroup(p) {
4809
- const { t } = chunkJKSUB7DR_js.useTranslation();
4809
+ const { t } = chunk5DBKW7F3_js.useTranslation();
4810
4810
  const { recentColors, pushColor } = useRecentColors();
4811
4811
  const themeColors = useThemeColorMap();
4812
4812
  const commands = useRibbonGalleryCommands();
@@ -4892,7 +4892,7 @@ function DrawingGroup(p) {
4892
4892
  ] });
4893
4893
  }
4894
4894
  function EditingSection(p) {
4895
- const { t } = chunkJKSUB7DR_js.useTranslation();
4895
+ const { t } = chunk5DBKW7F3_js.useTranslation();
4896
4896
  const { onToggleFindReplace, onSelectAll } = p;
4897
4897
  const controls = React108.useMemo(
4898
4898
  () => pptx.editingHomeControls({ selectAll: Boolean(onSelectAll) }),
@@ -4938,8 +4938,8 @@ function RibbonAddInSection({ tab }) {
4938
4938
  var TAB_BASE = "relative px-3.5 py-2 text-[12px] font-medium whitespace-nowrap transition-colors max-md:min-h-[36px] max-md:px-3";
4939
4939
  var TAB_UNDERLINE = "after:absolute after:-bottom-px after:left-0 after:right-0 after:h-[2.5px] after:bg-primary";
4940
4940
  function RibbonTabBar(p) {
4941
- const { t } = chunkJKSUB7DR_js.useTranslation();
4942
- const viewerOptions = chunk73SDWM6K_js.useViewerOptionsContext();
4941
+ const { t } = chunk5DBKW7F3_js.useTranslation();
4942
+ const viewerOptions = chunkVGU5S37T_js.useViewerOptionsContext();
4943
4943
  return /* @__PURE__ */ jsxRuntime.jsxs(
4944
4944
  "div",
4945
4945
  {
@@ -4947,7 +4947,7 @@ function RibbonTabBar(p) {
4947
4947
  "data-pptx-chrome": "ribbon-tabs",
4948
4948
  className: "flex items-center border-b border-border/60 px-1 max-md:overflow-x-auto max-md:scrollbar-none",
4949
4949
  children: [
4950
- chunkJKSUB7DR_js.TOOLBAR_SECTIONS.filter((s) => p.isTabVisible(s.id)).map((s) => {
4950
+ chunk5DBKW7F3_js.TOOLBAR_SECTIONS.filter((s) => p.isTabVisible(s.id)).map((s) => {
4951
4951
  const selected = p.activeSection === s.id;
4952
4952
  return /* @__PURE__ */ jsxRuntime.jsx(
4953
4953
  "button",
@@ -4957,7 +4957,7 @@ function RibbonTabBar(p) {
4957
4957
  "aria-selected": selected,
4958
4958
  title: pptx.resolveScreenTip(viewerOptions, t(s.labelKey)),
4959
4959
  onClick: () => p.onSelectSection(s.id),
4960
- className: chunkJKSUB7DR_js.cn(
4960
+ className: chunk5DBKW7F3_js.cn(
4961
4961
  TAB_BASE,
4962
4962
  selected ? s.id === "file" ? "text-white bg-primary/80 rounded-sm" : `text-foreground ${TAB_UNDERLINE}` : s.id === "file" ? "text-primary hover:bg-primary/15 rounded-sm" : "text-muted-foreground hover:text-foreground hover:bg-accent/30"
4963
4963
  ),
@@ -4977,7 +4977,7 @@ function RibbonTabBar(p) {
4977
4977
  ...{ [pptx.RIBBON_ADD_IN_TAB_ATTR]: tab.id },
4978
4978
  title: pptx.resolveScreenTip(viewerOptions, tab.label),
4979
4979
  onClick: () => p.onSelectAddIn?.(tab.id),
4980
- className: chunkJKSUB7DR_js.cn(
4980
+ className: chunk5DBKW7F3_js.cn(
4981
4981
  TAB_BASE,
4982
4982
  selected ? `text-foreground ${TAB_UNDERLINE}` : "text-muted-foreground hover:text-foreground hover:bg-accent/30"
4983
4983
  ),
@@ -4998,7 +4998,7 @@ function RibbonTabBar(p) {
4998
4998
  ...{ [pptx.RIBBON_CONTEXTUAL_TAB_ATTR]: id },
4999
4999
  title: pptx.resolveScreenTip(viewerOptions, label),
5000
5000
  onClick: () => p.onSelectContextual(id),
5001
- className: chunkJKSUB7DR_js.cn(
5001
+ className: chunk5DBKW7F3_js.cn(
5002
5002
  TAB_BASE,
5003
5003
  "text-primary",
5004
5004
  selected ? TAB_UNDERLINE : "hover:bg-primary/10"
@@ -5015,10 +5015,10 @@ function RibbonTabBar(p) {
5015
5015
  );
5016
5016
  }
5017
5017
  function TabRowActions(p) {
5018
- const { t } = chunkJKSUB7DR_js.useTranslation();
5019
- const collab = chunk73SDWM6K_js.useCollaboration();
5018
+ const { t } = chunk5DBKW7F3_js.useTranslation();
5019
+ const collab = chunkVGU5S37T_js.useCollaboration();
5020
5020
  const isCollaborating = Boolean(collab && collab.status === "connected");
5021
- const { isHidden } = chunk73SDWM6K_js.useToolbarVisibility(p.hiddenActions);
5021
+ const { isHidden } = chunkVGU5S37T_js.useToolbarVisibility(p.hiddenActions);
5022
5022
  const customization = useViewerCustomizationContext();
5023
5023
  const ref = React108.useRef(null);
5024
5024
  const handlers = React108.useRef(p);
@@ -5072,8 +5072,8 @@ function TabRowActions(p) {
5072
5072
  ] });
5073
5073
  }
5074
5074
  function TitleBarElement(p) {
5075
- const { t } = chunkJKSUB7DR_js.useTranslation();
5076
- const options = chunk73SDWM6K_js.useViewerOptionsContext();
5075
+ const { t } = chunk5DBKW7F3_js.useTranslation();
5076
+ const options = chunkVGU5S37T_js.useViewerOptionsContext();
5077
5077
  const customization = useViewerCustomizationContext();
5078
5078
  const ref = React108.useRef(null);
5079
5079
  const stripVisible = options.quickAccess.visible && pptx.isPanelVisible(customization, "quickAccessToolbar");
@@ -5138,7 +5138,7 @@ function CustomShowsControls({
5138
5138
  onDeleteActiveCustomShow,
5139
5139
  onToggleCurrentSlideInActiveShow
5140
5140
  }) {
5141
- const { t } = chunkJKSUB7DR_js.useTranslation();
5141
+ const { t } = chunk5DBKW7F3_js.useTranslation();
5142
5142
  if (customShows.length > 0) {
5143
5143
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5144
5144
  sep,
@@ -5193,7 +5193,7 @@ function CustomShowsControls({
5193
5193
  {
5194
5194
  type: "button",
5195
5195
  onClick: onToggleCurrentSlideInActiveShow,
5196
- className: chunkJKSUB7DR_js.cn(
5196
+ className: chunk5DBKW7F3_js.cn(
5197
5197
  "px-2 py-1 rounded text-[11px] transition-colors",
5198
5198
  isCurrentSlideInActiveShow ? "bg-primary text-white" : "bg-muted hover:bg-accent"
5199
5199
  ),
@@ -5232,7 +5232,7 @@ function PresentDropdown({
5232
5232
  onToggleSubtitles,
5233
5233
  showSubtitles
5234
5234
  }) {
5235
- const { t } = chunkJKSUB7DR_js.useTranslation();
5235
+ const { t } = chunk5DBKW7F3_js.useTranslation();
5236
5236
  const [open, setOpen] = React108.useState(false);
5237
5237
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
5238
5238
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-stretch rounded border border-border bg-muted text-xs overflow-hidden", children: [
@@ -5241,7 +5241,7 @@ function PresentDropdown({
5241
5241
  {
5242
5242
  type: "button",
5243
5243
  onClick: onPresent,
5244
- className: chunkJKSUB7DR_js.cn(
5244
+ className: chunk5DBKW7F3_js.cn(
5245
5245
  "px-2 py-1 transition-colors",
5246
5246
  isActive ? "bg-primary text-white" : "hover:bg-accent text-foreground"
5247
5247
  ),
@@ -5254,7 +5254,7 @@ function PresentDropdown({
5254
5254
  {
5255
5255
  type: "button",
5256
5256
  onClick: () => setOpen((prev) => !prev),
5257
- className: chunkJKSUB7DR_js.cn(
5257
+ className: chunk5DBKW7F3_js.cn(
5258
5258
  "inline-flex items-center px-1 transition-colors border-l border-border",
5259
5259
  open ? "bg-primary text-white" : "hover:bg-accent text-foreground"
5260
5260
  ),
@@ -5382,7 +5382,7 @@ function ModeSwitcher({
5382
5382
  onToggleSubtitles,
5383
5383
  showSubtitles
5384
5384
  }) {
5385
- const { t } = chunkJKSUB7DR_js.useTranslation();
5385
+ const { t } = chunk5DBKW7F3_js.useTranslation();
5386
5386
  if (mode === "master") {
5387
5387
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-1.5", children: [
5388
5388
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center px-2 py-0.5 rounded-sm bg-amber-600/90 text-[10px] text-amber-50", children: t("pptx.mode.masterView") }),
@@ -5420,7 +5420,7 @@ var EXPORT_CARD_OF = {
5420
5420
  copyImg: "copyImage"
5421
5421
  };
5422
5422
  function OverflowMenu(p) {
5423
- const { t } = chunkJKSUB7DR_js.useTranslation();
5423
+ const { t } = chunk5DBKW7F3_js.useTranslation();
5424
5424
  const customization = useViewerCustomizationContext();
5425
5425
  const offered = (k) => {
5426
5426
  const card = EXPORT_CARD_OF[k];
@@ -5457,7 +5457,7 @@ function OverflowMenu(p) {
5457
5457
  {
5458
5458
  type: "button",
5459
5459
  onClick: () => p.onSetOverflowMenuOpen(!p.isOverflowMenuOpen),
5460
- className: chunkJKSUB7DR_js.cn(
5460
+ className: chunk5DBKW7F3_js.cn(
5461
5461
  "p-1.5 rounded transition-colors",
5462
5462
  p.isOverflowMenuOpen ? "bg-primary/80 text-white" : "bg-muted hover:bg-accent"
5463
5463
  ),
@@ -5495,7 +5495,7 @@ function OverflowMenu(p) {
5495
5495
  ] });
5496
5496
  }
5497
5497
  function ToolbarPrimaryRow(p) {
5498
- const { t } = chunkJKSUB7DR_js.useTranslation();
5498
+ const { t } = chunk5DBKW7F3_js.useTranslation();
5499
5499
  const {
5500
5500
  mode,
5501
5501
  canEdit,
@@ -5504,7 +5504,7 @@ function ToolbarPrimaryRow(p) {
5504
5504
  onToggleSidebar,
5505
5505
  onToggleInspector
5506
5506
  } = p;
5507
- const collab = chunk73SDWM6K_js.useCollaboration();
5507
+ const collab = chunkVGU5S37T_js.useCollaboration();
5508
5508
  const customization = useViewerCustomizationContext();
5509
5509
  const showSlidesToggle = pptx.isPanelVisible(customization, "slidesPane");
5510
5510
  const showInspectorToggle = pptx.isPanelVisible(customization, "inspector");
@@ -5524,7 +5524,7 @@ function ToolbarPrimaryRow(p) {
5524
5524
  {
5525
5525
  type: "button",
5526
5526
  onClick: onToggleSidebar,
5527
- className: chunkJKSUB7DR_js.cn(qab, !isSidebarCollapsed ? "text-foreground" : "text-muted-foreground"),
5527
+ className: chunk5DBKW7F3_js.cn(qab, !isSidebarCollapsed ? "text-foreground" : "text-muted-foreground"),
5528
5528
  title: t("pptx.toolbar.toggleSlidesPanel"),
5529
5529
  "aria-label": t("pptx.toolbar.toggleSlidesPanel"),
5530
5530
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuPanelLeft, { className: ic })
@@ -5585,7 +5585,7 @@ function ToolbarPrimaryRow(p) {
5585
5585
  {
5586
5586
  type: "button",
5587
5587
  onClick: onToggleInspector,
5588
- className: chunkJKSUB7DR_js.cn(qab, isInspectorPaneOpen ? "text-foreground" : "text-muted-foreground"),
5588
+ className: chunk5DBKW7F3_js.cn(qab, isInspectorPaneOpen ? "text-foreground" : "text-muted-foreground"),
5589
5589
  title: t("pptx.toolbar.toggleInspector"),
5590
5590
  "aria-label": t("pptx.toolbar.toggleInspector"),
5591
5591
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuPanelRight, { className: ic })
@@ -5596,7 +5596,7 @@ function ToolbarPrimaryRow(p) {
5596
5596
  {
5597
5597
  type: "button",
5598
5598
  onClick: p.onToggleAiPanel,
5599
- className: chunkJKSUB7DR_js.cn(qab, p.isAiPanelOpen ? "text-primary" : "text-muted-foreground"),
5599
+ className: chunk5DBKW7F3_js.cn(qab, p.isAiPanelOpen ? "text-primary" : "text-muted-foreground"),
5600
5600
  title: t("pptx.toolbar.toggleAiAssistant"),
5601
5601
  "aria-label": t("pptx.toolbar.toggleAiAssistant"),
5602
5602
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuSparkles, { className: ic })
@@ -5607,7 +5607,7 @@ function ToolbarPrimaryRow(p) {
5607
5607
  {
5608
5608
  type: "button",
5609
5609
  onClick: p.onOpenSettings ?? p.onToggleShortcuts,
5610
- className: chunkJKSUB7DR_js.cn(qab, "text-muted-foreground"),
5610
+ className: chunk5DBKW7F3_js.cn(qab, "text-muted-foreground"),
5611
5611
  title: t("pptx.toolbar.settingsShortcuts"),
5612
5612
  "aria-label": t("pptx.toolbar.settings"),
5613
5613
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuSettings, { className: ics })
@@ -5651,7 +5651,7 @@ function useContextualRibbonTab(selectedElement, customization, onFallback) {
5651
5651
  return { visible, active, fellBack, select: setChosen };
5652
5652
  }
5653
5653
  function HelpSection(p) {
5654
- const { t } = chunkJKSUB7DR_js.useTranslation();
5654
+ const { t } = chunk5DBKW7F3_js.useTranslation();
5655
5655
  const groups = pptx.buildHelpRibbon(t, {
5656
5656
  options: pptx.isDialogAvailable(useViewerCustomizationContext(), "options")
5657
5657
  });
@@ -5671,7 +5671,7 @@ function HelpSection(p) {
5671
5671
  return /* @__PURE__ */ jsxRuntime.jsx(WebRibbonSection, { groups, onCommand: request });
5672
5672
  }
5673
5673
  function RecordSection(props) {
5674
- const { t } = chunkJKSUB7DR_js.useTranslation();
5674
+ const { t } = chunk5DBKW7F3_js.useTranslation();
5675
5675
  const request = (id) => {
5676
5676
  if (id === "record.record.fromBeginning") {
5677
5677
  props.onRecordFromBeginning();
@@ -5804,9 +5804,9 @@ function ToolbarLateTabs({
5804
5804
  }
5805
5805
  function Toolbar(p) {
5806
5806
  const { mode, isNarrowViewport, isCompactToolbarOpen, toolbarSection, onSetToolbarSection } = p;
5807
- const { t } = chunkJKSUB7DR_js.useTranslation();
5808
- const { isTabVisible } = chunk73SDWM6K_js.useToolbarVisibility(p.hiddenActions);
5809
- const viewerOptions = chunk73SDWM6K_js.useViewerOptionsContext();
5807
+ const { t } = chunk5DBKW7F3_js.useTranslation();
5808
+ const { isTabVisible } = chunkVGU5S37T_js.useToolbarVisibility(p.hiddenActions);
5809
+ const viewerOptions = chunkVGU5S37T_js.useViewerOptionsContext();
5810
5810
  const customization = useViewerCustomizationContext();
5811
5811
  const belowInput = React108.useMemo(
5812
5812
  () => ({
@@ -5904,7 +5904,7 @@ function Toolbar(p) {
5904
5904
  {
5905
5905
  type: "button",
5906
5906
  onClick: p.onToggleCompactToolbar,
5907
- className: chunkJKSUB7DR_js.cn(
5907
+ className: chunk5DBKW7F3_js.cn(
5908
5908
  "px-2 py-1 rounded text-[11px] transition-colors mr-1",
5909
5909
  isCompactToolbarOpen ? "bg-primary/80 text-white" : "text-muted-foreground hover:text-foreground"
5910
5910
  ),
@@ -5930,7 +5930,7 @@ function Toolbar(p) {
5930
5930
  {
5931
5931
  ref: attachOverflow,
5932
5932
  "data-pptx-chrome": "ribbon-content",
5933
- className: chunkJKSUB7DR_js.cn(
5933
+ className: chunk5DBKW7F3_js.cn(
5934
5934
  // Plain controls stay compact; labelled RibbonGroups opt into stretching.
5935
5935
  // `RibbonGroupScope` wraps controls in a `display: contents` div, so its
5936
5936
  // children are this row's flex items too and must not shrink (a shrunk
@@ -6120,7 +6120,7 @@ function Toolbar(p) {
6120
6120
  );
6121
6121
  }
6122
6122
  function CanvasGuides({ guides, onDeleteGuide, onStartGuideDrag }) {
6123
- const { t } = chunkJKSUB7DR_js.useTranslation();
6123
+ const { t } = chunk5DBKW7F3_js.useTranslation();
6124
6124
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: guides.map((guide) => /* @__PURE__ */ jsxRuntime.jsx(
6125
6125
  "div",
6126
6126
  {
@@ -6332,7 +6332,7 @@ function ChartQuickActionsOverlay({
6332
6332
  scale: stageScale = 1,
6333
6333
  onUpdateElement
6334
6334
  }) {
6335
- const { t } = chunkJKSUB7DR_js.useTranslation();
6335
+ const { t } = chunk5DBKW7F3_js.useTranslation();
6336
6336
  const [open, setOpen] = React108.useState(null);
6337
6337
  const hostRef = React108.useRef(null);
6338
6338
  React108.useEffect(() => {
@@ -6503,7 +6503,7 @@ function CommentMarkersOverlay({
6503
6503
  canvasSize,
6504
6504
  onCommentMarkerClick
6505
6505
  }) {
6506
- const { t } = chunkJKSUB7DR_js.useTranslation(), half = pptx.COMMENT_MARKER_SIZE / 2, markers = pptx.buildCommentMarkers(
6506
+ const { t } = chunk5DBKW7F3_js.useTranslation(), half = pptx.COMMENT_MARKER_SIZE / 2, markers = pptx.buildCommentMarkers(
6507
6507
  comments,
6508
6508
  canvasSize.width,
6509
6509
  canvasSize.height,
@@ -6547,7 +6547,7 @@ function ConnectorEndpointOverlay({
6547
6547
  canvasStageRef,
6548
6548
  onUpdateElement
6549
6549
  }) {
6550
- const { t } = chunkJKSUB7DR_js.useTranslation();
6550
+ const { t } = chunk5DBKW7F3_js.useTranslation();
6551
6551
  const [drag, setDrag] = React108.useState(null);
6552
6552
  const candidates = React108.useMemo(
6553
6553
  () => pptx.collectConnectorSiteCandidates(elements.filter((el) => el.id !== connector.id)),
@@ -6783,7 +6783,7 @@ function DrawingOverlaySvg({
6783
6783
  onPointerDown,
6784
6784
  onPointerMove,
6785
6785
  onPointerUp,
6786
- children: isStrokeActive && liveStrokeView ? chunk73SDWM6K_js.renderStrokeView(liveStrokeView, true, void 0, "ink-live-preview") : isStrokeActive && liveStrokeD && /* @__PURE__ */ jsxRuntime.jsx(
6786
+ children: isStrokeActive && liveStrokeView ? chunkVGU5S37T_js.renderStrokeView(liveStrokeView, true, void 0, "ink-live-preview") : isStrokeActive && liveStrokeD && /* @__PURE__ */ jsxRuntime.jsx(
6787
6787
  "path",
6788
6788
  {
6789
6789
  d: liveStrokeD,
@@ -6798,7 +6798,7 @@ function DrawingOverlaySvg({
6798
6798
  }
6799
6799
  );
6800
6800
  }
6801
- function GridOverlay({ canvasSize, gridSpacingPx = chunkJKSUB7DR_js.GRID_SIZE, visible }) {
6801
+ function GridOverlay({ canvasSize, gridSpacingPx = chunk5DBKW7F3_js.GRID_SIZE, visible }) {
6802
6802
  const spacing = Math.max(gridSpacingPx, 2);
6803
6803
  const patternId = React108.useMemo(() => `grid-dot-pattern-${Math.random().toString(36).slice(2, 8)}`, []);
6804
6804
  if (!visible) {
@@ -6826,7 +6826,7 @@ function MotionPathOverlay({
6826
6826
  canEdit,
6827
6827
  onChangePath
6828
6828
  }) {
6829
- const { t } = chunkJKSUB7DR_js.useTranslation();
6829
+ const { t } = chunk5DBKW7F3_js.useTranslation();
6830
6830
  const dragRef = React108.useRef(null);
6831
6831
  const frame = {
6832
6832
  originX: element.x + element.width / 2,
@@ -6940,7 +6940,7 @@ function MotionPathOverlay({
6940
6940
  );
6941
6941
  }
6942
6942
  function EditPointsMenu({ menu, onRun }) {
6943
- const { t } = chunkJKSUB7DR_js.useTranslation();
6943
+ const { t } = chunk5DBKW7F3_js.useTranslation();
6944
6944
  const stop2 = (event) => event.stopPropagation();
6945
6945
  return /* @__PURE__ */ jsxRuntime.jsx(
6946
6946
  "div",
@@ -6986,7 +6986,7 @@ function EditPointsOverlay({
6986
6986
  onCommit,
6987
6987
  onExit
6988
6988
  }) {
6989
- const { t } = chunkJKSUB7DR_js.useTranslation();
6989
+ const { t } = chunk5DBKW7F3_js.useTranslation();
6990
6990
  const [, rerender] = React108.useReducer((n) => n + 1, 0);
6991
6991
  const svgRef = React108.useRef(null);
6992
6992
  const latest = React108.useRef({ onCommit, onExit });
@@ -7142,7 +7142,7 @@ function FreeformToolOverlay({
7142
7142
  onCommit,
7143
7143
  onCancel
7144
7144
  }) {
7145
- const { t } = chunkJKSUB7DR_js.useTranslation();
7145
+ const { t } = chunk5DBKW7F3_js.useTranslation();
7146
7146
  const [, rerender] = React108.useReducer((n) => n + 1, 0);
7147
7147
  const svgRef = React108.useRef(null);
7148
7148
  const latest = React108.useRef({ onCommit, onCancel });
@@ -7285,7 +7285,7 @@ function PictureCropOverlay({
7285
7285
  onUpdate,
7286
7286
  onContextMenu
7287
7287
  }) {
7288
- const { t } = chunkJKSUB7DR_js.useTranslation();
7288
+ const { t } = chunk5DBKW7F3_js.useTranslation();
7289
7289
  const overlay = pptx.buildCropOverlay(element, scale);
7290
7290
  const dragRef = React108.useRef(null);
7291
7291
  const latest = React108.useRef({ scale, onUpdate });
@@ -7333,7 +7333,7 @@ function PictureCropOverlay({
7333
7333
  };
7334
7334
  };
7335
7335
  const { ghost, frame, handles } = overlay;
7336
- const src = chunk73SDWM6K_js.imgSrc(element);
7336
+ const src = chunkVGU5S37T_js.imgSrc(element);
7337
7337
  return /* @__PURE__ */ jsxRuntime.jsxs(
7338
7338
  "div",
7339
7339
  {
@@ -7509,7 +7509,7 @@ function HorizontalRulerView({ ticks, widthPx, highlight }) {
7509
7509
  }
7510
7510
  );
7511
7511
  }
7512
- var HorizontalRuler = /* @__PURE__ */ chunk73SDWM6K_js.withDisplayName(
7512
+ var HorizontalRuler = /* @__PURE__ */ chunkVGU5S37T_js.withDisplayName(
7513
7513
  /* @__PURE__ */ React108__default.default.memo(HorizontalRulerView),
7514
7514
  "HorizontalRuler"
7515
7515
  );
@@ -7583,7 +7583,7 @@ function VerticalRulerView({ ticks, heightPx, highlight }) {
7583
7583
  }
7584
7584
  );
7585
7585
  }
7586
- var VerticalRuler = /* @__PURE__ */ chunk73SDWM6K_js.withDisplayName(
7586
+ var VerticalRuler = /* @__PURE__ */ chunkVGU5S37T_js.withDisplayName(
7587
7587
  /* @__PURE__ */ React108__default.default.memo(VerticalRulerView),
7588
7588
  "VerticalRuler"
7589
7589
  );
@@ -7750,10 +7750,10 @@ function SelectionHandleOverlay({
7750
7750
  position: "absolute",
7751
7751
  left: element.x,
7752
7752
  top: element.y,
7753
- width: Math.max(element.width, chunkJKSUB7DR_js.MIN_ELEMENT_SIZE),
7754
- height: Math.max(element.height, chunkJKSUB7DR_js.MIN_ELEMENT_SIZE),
7755
- ["--pptx-selection-width"]: `${Math.max(element.width, chunkJKSUB7DR_js.MIN_ELEMENT_SIZE)}px`,
7756
- ["--pptx-selection-height"]: `${Math.max(element.height, chunkJKSUB7DR_js.MIN_ELEMENT_SIZE)}px`,
7753
+ width: Math.max(element.width, chunk5DBKW7F3_js.MIN_ELEMENT_SIZE),
7754
+ height: Math.max(element.height, chunk5DBKW7F3_js.MIN_ELEMENT_SIZE),
7755
+ ["--pptx-selection-width"]: `${Math.max(element.width, chunk5DBKW7F3_js.MIN_ELEMENT_SIZE)}px`,
7756
+ ["--pptx-selection-height"]: `${Math.max(element.height, chunk5DBKW7F3_js.MIN_ELEMENT_SIZE)}px`,
7757
7757
  // Every slide element carries an explicit numeric `zIndex` (see
7758
7758
  // `getContainerStyle`), so a sibling with no z-index at all paints
7759
7759
  // at the CSS "z-index: 0" level regardless of DOM order: any
@@ -7765,7 +7765,7 @@ function SelectionHandleOverlay({
7765
7765
  // (marquee z-50, connector overlay z-55/56) to match, well clear of
7766
7766
  // any realistic per-slide element count.
7767
7767
  zIndex: 58,
7768
- transform: chunkJKSUB7DR_js.getElementTransform(element),
7768
+ transform: chunk5DBKW7F3_js.getElementTransform(element),
7769
7769
  transformOrigin: "center",
7770
7770
  // Transparent everywhere a handle button is not, so a click that
7771
7771
  // misses every handle still reaches the shape (or whatever is
@@ -7777,14 +7777,14 @@ function SelectionHandleOverlay({
7777
7777
  onDoubleClick: (e) => onDoubleClick(element.id, e),
7778
7778
  onContextMenu: (e) => onContextMenu(element.id, e),
7779
7779
  children: /* @__PURE__ */ jsxRuntime.jsx(
7780
- chunk73SDWM6K_js.ResizeHandles,
7780
+ chunkVGU5S37T_js.ResizeHandles,
7781
7781
  {
7782
7782
  elementId: element.id,
7783
7783
  adjustmentHandles,
7784
7784
  onResizePointerDown,
7785
7785
  onAdjustmentPointerDown,
7786
7786
  rotation: element.rotation,
7787
- nonRotationTransform: chunkJKSUB7DR_js.getElementTransformWithoutRotation(element),
7787
+ nonRotationTransform: chunk5DBKW7F3_js.getElementTransformWithoutRotation(element),
7788
7788
  onRotate: allow.rotatable ? onRotate : void 0,
7789
7789
  forcePointerEvents: true
7790
7790
  }
@@ -8488,7 +8488,7 @@ function SlideCanvas(props) {
8488
8488
  props.registerInlineEditReader
8489
8489
  ]
8490
8490
  );
8491
- return /* @__PURE__ */ jsxRuntime.jsx(chunk73SDWM6K_js.InlineCollaborationContext.Provider, { value, children: /* @__PURE__ */ jsxRuntime.jsx(SlideCanvasContent, { ...props }) });
8491
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkVGU5S37T_js.InlineCollaborationContext.Provider, { value, children: /* @__PURE__ */ jsxRuntime.jsx(SlideCanvasContent, { ...props }) });
8492
8492
  }
8493
8493
  function SlideCanvasContent({
8494
8494
  imagePaste,
@@ -8761,7 +8761,7 @@ function SlideCanvasContent({
8761
8761
  onPointerMove: handleStagePointerMove,
8762
8762
  onPointerUp: handleStagePointerUp,
8763
8763
  children: [
8764
- /* @__PURE__ */ jsxRuntime.jsx(chunk73SDWM6K_js.SlideBackgroundImageLayer, { slide: activeSlide }),
8764
+ /* @__PURE__ */ jsxRuntime.jsx(chunkVGU5S37T_js.SlideBackgroundImageLayer, { slide: activeSlide }),
8765
8765
  presentationKeyframesCss && /* @__PURE__ */ jsxRuntime.jsx("style", { children: presentationKeyframesCss }),
8766
8766
  /* @__PURE__ */ jsxRuntime.jsx(GridOverlay, { canvasSize, gridSpacingPx, visible: showGrid }),
8767
8767
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -8773,7 +8773,7 @@ function SlideCanvasContent({
8773
8773
  }
8774
8774
  ),
8775
8775
  templateElements.map((element, index) => /* @__PURE__ */ jsxRuntime.jsx(
8776
- chunk73SDWM6K_js.ElementRenderer,
8776
+ chunkVGU5S37T_js.ElementRenderer,
8777
8777
  {
8778
8778
  element,
8779
8779
  activeSlide,
@@ -8796,7 +8796,7 @@ function SlideCanvasContent({
8796
8796
  ),
8797
8797
  renderInk: false,
8798
8798
  renderGroups: true,
8799
- adjustmentHandles: isEditableCanvas && selectedElement?.id === element.id ? chunkJKSUB7DR_js.getShapeAdjustmentHandleDescriptors(element) : EMPTY_ADJUSTMENT_HANDLES,
8799
+ adjustmentHandles: isEditableCanvas && selectedElement?.id === element.id ? chunk5DBKW7F3_js.getShapeAdjustmentHandleDescriptors(element) : EMPTY_ADJUSTMENT_HANDLES,
8800
8800
  onResizePointerDown: stableResizePointerDown,
8801
8801
  onAdjustmentPointerDown: stableAdjustmentPointerDown,
8802
8802
  onRotate: stableRotate,
@@ -8818,7 +8818,7 @@ function SlideCanvasContent({
8818
8818
  `tpl-${element.id}`
8819
8819
  )),
8820
8820
  activeSlide?.elements.map((element, index) => /* @__PURE__ */ jsxRuntime.jsx(
8821
- chunk73SDWM6K_js.ElementRenderer,
8821
+ chunkVGU5S37T_js.ElementRenderer,
8822
8822
  {
8823
8823
  element,
8824
8824
  activeSlide,
@@ -8841,7 +8841,7 @@ function SlideCanvasContent({
8841
8841
  ),
8842
8842
  renderInk: true,
8843
8843
  renderGroups: true,
8844
- adjustmentHandles: isEditableCanvas && selectedElement?.id === element.id ? chunkJKSUB7DR_js.getShapeAdjustmentHandleDescriptors(element) : EMPTY_ADJUSTMENT_HANDLES,
8844
+ adjustmentHandles: isEditableCanvas && selectedElement?.id === element.id ? chunk5DBKW7F3_js.getShapeAdjustmentHandleDescriptors(element) : EMPTY_ADJUSTMENT_HANDLES,
8845
8845
  onResizePointerDown: stableResizePointerDown,
8846
8846
  onAdjustmentPointerDown: stableAdjustmentPointerDown,
8847
8847
  onRotate: stableRotate,
@@ -8885,7 +8885,7 @@ function SlideCanvasContent({
8885
8885
  editingMember && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
8886
8886
  /* @__PURE__ */ jsxRuntime.jsx("style", { children: `[data-element-id="${cssAttr(editingMember.parentId)}"] [data-element-id="${cssAttr(editingMember.member.id)}"]{visibility:hidden}` }),
8887
8887
  /* @__PURE__ */ jsxRuntime.jsx(
8888
- chunk73SDWM6K_js.ElementRenderer,
8888
+ chunkVGU5S37T_js.ElementRenderer,
8889
8889
  {
8890
8890
  element: editingMember.member,
8891
8891
  activeSlide,
@@ -8920,11 +8920,11 @@ function SlideCanvasContent({
8920
8920
  `group-member-edit-${editingMember.member.id}`
8921
8921
  )
8922
8922
  ] }),
8923
- selectedElement && selectedElement.id !== cropElement?.id && pptx.shouldShowElementHandles(isEditableCanvas, true, selectedElementIdSet.size) && !chunkJKSUB7DR_js.isConnectorOrLineElement(selectedElement) && outlineAuthoring?.editPointsElementId !== selectedElement.id && /* @__PURE__ */ jsxRuntime.jsx(
8923
+ selectedElement && selectedElement.id !== cropElement?.id && pptx.shouldShowElementHandles(isEditableCanvas, true, selectedElementIdSet.size) && !chunk5DBKW7F3_js.isConnectorOrLineElement(selectedElement) && outlineAuthoring?.editPointsElementId !== selectedElement.id && /* @__PURE__ */ jsxRuntime.jsx(
8924
8924
  SelectionHandleOverlay,
8925
8925
  {
8926
8926
  element: selectedElement,
8927
- adjustmentHandles: chunkJKSUB7DR_js.getShapeAdjustmentHandleDescriptors(selectedElement),
8927
+ adjustmentHandles: chunk5DBKW7F3_js.getShapeAdjustmentHandleDescriptors(selectedElement),
8928
8928
  onResizePointerDown: stableResizePointerDown,
8929
8929
  onAdjustmentPointerDown: stableAdjustmentPointerDown,
8930
8930
  onRotate: stableRotate,
@@ -9031,14 +9031,14 @@ function SlideCanvasContent({
9031
9031
  );
9032
9032
  }
9033
9033
  function LoadingState({ className }) {
9034
- const { t } = chunkJKSUB7DR_js.useTranslation();
9034
+ const { t } = chunk5DBKW7F3_js.useTranslation();
9035
9035
  return /* @__PURE__ */ jsxRuntime.jsx(
9036
9036
  "div",
9037
9037
  {
9038
9038
  role: "status",
9039
9039
  "aria-live": "polite",
9040
9040
  "aria-atomic": "true",
9041
- className: chunkJKSUB7DR_js.cn(
9041
+ className: chunk5DBKW7F3_js.cn(
9042
9042
  "h-full w-full flex items-center justify-center text-muted-foreground",
9043
9043
  className
9044
9044
  ),
@@ -9061,7 +9061,7 @@ function ErrorState({ className, error }) {
9061
9061
  {
9062
9062
  role: "alert",
9063
9063
  "aria-live": "assertive",
9064
- className: chunkJKSUB7DR_js.cn(
9064
+ className: chunk5DBKW7F3_js.cn(
9065
9065
  "h-full w-full flex items-center justify-center p-6 text-center text-red-400",
9066
9066
  className
9067
9067
  ),
@@ -9070,7 +9070,7 @@ function ErrorState({ className, error }) {
9070
9070
  );
9071
9071
  }
9072
9072
  function ShortcutPanel({ isOpen, onClose }) {
9073
- const { t } = chunkJKSUB7DR_js.useTranslation();
9073
+ const { t } = chunk5DBKW7F3_js.useTranslation();
9074
9074
  if (!isOpen) {
9075
9075
  return null;
9076
9076
  }
@@ -9092,7 +9092,7 @@ function ShortcutPanel({ isOpen, onClose }) {
9092
9092
  }
9093
9093
  )
9094
9094
  ] }),
9095
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-64 overflow-y-auto p-2 space-y-1", children: chunkJKSUB7DR_js.SHORTCUT_REFERENCE_ITEMS.map((shortcut) => /* @__PURE__ */ jsxRuntime.jsxs(
9095
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-64 overflow-y-auto p-2 space-y-1", children: chunk5DBKW7F3_js.SHORTCUT_REFERENCE_ITEMS.map((shortcut) => /* @__PURE__ */ jsxRuntime.jsxs(
9096
9096
  "div",
9097
9097
  {
9098
9098
  className: "flex items-center justify-between gap-3 rounded bg-muted/80 px-2 py-1.5",
@@ -9114,7 +9114,7 @@ function AccessibilityPanel({
9114
9114
  reducedMotion,
9115
9115
  onToggleReducedMotion
9116
9116
  }) {
9117
- const { t } = chunkJKSUB7DR_js.useTranslation();
9117
+ const { t } = chunk5DBKW7F3_js.useTranslation();
9118
9118
  if (!isOpen) {
9119
9119
  return null;
9120
9120
  }
@@ -9152,14 +9152,14 @@ function AccessibilityPanel({
9152
9152
  "aria-label": t("pptx.accessibility.reduceMotion"),
9153
9153
  "aria-checked": reducedMotion ?? false,
9154
9154
  onClick: onToggleReducedMotion,
9155
- className: chunkJKSUB7DR_js.cn(
9155
+ className: chunk5DBKW7F3_js.cn(
9156
9156
  "relative inline-flex h-5 w-9 items-center rounded-full transition-colors",
9157
9157
  reducedMotion ? "bg-primary" : "bg-muted-foreground/30"
9158
9158
  ),
9159
9159
  children: /* @__PURE__ */ jsxRuntime.jsx(
9160
9160
  "span",
9161
9161
  {
9162
- className: chunkJKSUB7DR_js.cn(
9162
+ className: chunk5DBKW7F3_js.cn(
9163
9163
  "inline-block h-3.5 w-3.5 rounded-full bg-white transition-transform",
9164
9164
  reducedMotion ? "translate-x-4" : "translate-x-0.5"
9165
9165
  )
@@ -9178,7 +9178,7 @@ function AccessibilityPanel({
9178
9178
  "div",
9179
9179
  {
9180
9180
  role: "listitem",
9181
- className: chunkJKSUB7DR_js.cn(
9181
+ className: chunk5DBKW7F3_js.cn(
9182
9182
  "flex items-start gap-2 rounded px-2 py-1.5 text-xs",
9183
9183
  /* Severity-based background and text colouring */
9184
9184
  issue.severity === "error" ? "bg-red-900/30 text-red-300" : issue.severity === "warning" ? "bg-amber-900/30 text-amber-300" : "bg-muted/50 text-muted-foreground"
@@ -9206,7 +9206,7 @@ function ExportProgressModal({
9206
9206
  statusMessage,
9207
9207
  onCancel
9208
9208
  }) {
9209
- const { t } = chunkJKSUB7DR_js.useTranslation();
9209
+ const { t } = chunk5DBKW7F3_js.useTranslation();
9210
9210
  const ref = useWebControl(
9211
9211
  { open: isOpen, title, progress, status: statusMessage, translate: t },
9212
9212
  { "export-cancel": () => onCancel() }
@@ -9214,7 +9214,7 @@ function ExportProgressModal({
9214
9214
  return /* @__PURE__ */ jsxRuntime.jsx("pptx-ui-export-progress", { ref });
9215
9215
  }
9216
9216
  function StatusBar(p) {
9217
- const { t } = chunkJKSUB7DR_js.useTranslation();
9217
+ const { t } = chunk5DBKW7F3_js.useTranslation();
9218
9218
  const ref = React108.useRef(null);
9219
9219
  React108.useEffect(() => {
9220
9220
  const host = ref.current;
@@ -9226,6 +9226,7 @@ function StatusBar(p) {
9226
9226
  activeSlideIndex: p.activeSlideIndex,
9227
9227
  dirty: p.isDirty,
9228
9228
  autosave: p.autosaveStatus,
9229
+ saveProgress: p.saveProgress ? pptx.saveProgressStatus(p.saveProgress, t) : void 0,
9229
9230
  zoomPercent: p.scale !== void 0 && !p.hideZoomControls ? p.scale * 100 : void 0,
9230
9231
  notesExpanded: p.isNotesExpanded,
9231
9232
  viewMode: pptx.statusBarViewMode(p.mode),
@@ -9294,7 +9295,7 @@ function ResizeHandle({
9294
9295
  {
9295
9296
  role: "separator",
9296
9297
  "aria-orientation": direction,
9297
- className: chunkJKSUB7DR_js.cn(
9298
+ className: chunk5DBKW7F3_js.cn(
9298
9299
  // Outer container: generous hit area for easy clicking.
9299
9300
  // The visible indicator is rendered via the inner pseudo-element (::after).
9300
9301
  "relative flex-shrink-0 z-20 group",
@@ -9305,7 +9306,7 @@ function ResizeHandle({
9305
9306
  children: /* @__PURE__ */ jsxRuntime.jsx(
9306
9307
  "div",
9307
9308
  {
9308
- className: chunkJKSUB7DR_js.cn(
9309
+ className: chunk5DBKW7F3_js.cn(
9309
9310
  "absolute transition-colors",
9310
9311
  direction === "horizontal" ? "top-0 bottom-0 left-1/2 -translate-x-1/2 w-0.5 group-hover:w-1 group-hover:bg-primary/40 group-active:w-1 group-active:bg-primary/60" : "left-0 right-0 top-1/2 -translate-y-1/2 h-0.5 group-hover:h-1 group-hover:bg-primary/40 group-active:h-1 group-active:bg-primary/60"
9311
9312
  )
@@ -9394,10 +9395,10 @@ function contextMenuHandlers(props, shapeFormat = null) {
9394
9395
  }
9395
9396
  function ContextMenu(props) {
9396
9397
  const { contextMenuState, mode, onClose } = props;
9397
- const { t } = chunkJKSUB7DR_js.useTranslation();
9398
+ const { t } = chunk5DBKW7F3_js.useTranslation();
9398
9399
  const customization = useViewerCustomizationContext();
9399
9400
  const shapeFormat = useShapeFormatContext();
9400
- const chartFormat = chunk73SDWM6K_js.useChartFormatContext();
9401
+ const chartFormat = chunkVGU5S37T_js.useChartFormatContext();
9401
9402
  const open = Boolean(contextMenuState) && mode === "edit";
9402
9403
  const handlers = {
9403
9404
  ...contextMenuHandlers(props, shapeFormat),
@@ -9473,7 +9474,7 @@ function canvasContextMenuHandlers(props) {
9473
9474
  }
9474
9475
  function CanvasContextMenu(props) {
9475
9476
  const { canvasContextMenuState, mode, onClose } = props;
9476
- const { t } = chunkJKSUB7DR_js.useTranslation();
9477
+ const { t } = chunk5DBKW7F3_js.useTranslation();
9477
9478
  const customization = useViewerCustomizationContext();
9478
9479
  const open = Boolean(canvasContextMenuState) && mode === "edit";
9479
9480
  const handlers = canvasContextMenuHandlers(props);
@@ -9536,7 +9537,7 @@ function FindReplacePanel({
9536
9537
  onReplaceAll,
9537
9538
  onClose
9538
9539
  }) {
9539
- const { t } = chunkJKSUB7DR_js.useTranslation();
9540
+ const { t } = chunk5DBKW7F3_js.useTranslation();
9540
9541
  const searchInputRef = React108.useRef(null);
9541
9542
  React108.useEffect(() => {
9542
9543
  searchInputRef.current?.focus();
@@ -9727,7 +9728,7 @@ function HandoutMasterPanel({
9727
9728
  onSlidesPerPageChange,
9728
9729
  onBackgroundChange
9729
9730
  }) {
9730
- const { t } = chunkJKSUB7DR_js.useTranslation();
9731
+ const { t } = chunk5DBKW7F3_js.useTranslation();
9731
9732
  if (!handoutMaster) {
9732
9733
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-4 text-center text-xs text-muted-foreground", children: t("pptx.master.noHandoutMaster") });
9733
9734
  }
@@ -9739,7 +9740,7 @@ function HandoutMasterPanel({
9739
9740
  {
9740
9741
  type: "button",
9741
9742
  "aria-pressed": slidesPerPage === count,
9742
- className: chunkJKSUB7DR_js.cn(
9743
+ className: chunk5DBKW7F3_js.cn(
9743
9744
  "px-2 py-1.5 rounded text-[11px] font-medium transition-colors",
9744
9745
  slidesPerPage === count ? "bg-primary text-white" : "bg-accent/50 text-muted-foreground hover:bg-accent/70 hover:text-foreground"
9745
9746
  ),
@@ -9782,7 +9783,7 @@ function NotesMasterPanel({
9782
9783
  notesMaster,
9783
9784
  onBackgroundChange
9784
9785
  }) {
9785
- const { t } = chunkJKSUB7DR_js.useTranslation();
9786
+ const { t } = chunk5DBKW7F3_js.useTranslation();
9786
9787
  const placeholderLabels = React108.useMemo(() => {
9787
9788
  if (!notesMaster?.placeholders) {
9788
9789
  return [];
@@ -9844,7 +9845,7 @@ function SlideMastersList({
9844
9845
  React108.useEffect(() => {
9845
9846
  activeRef.current?.scrollIntoView({ behavior: "smooth", block: "nearest" });
9846
9847
  }, [activeMasterIndex, activeLayoutIndex]);
9847
- const { t } = chunkJKSUB7DR_js.useTranslation();
9848
+ const { t } = chunk5DBKW7F3_js.useTranslation();
9848
9849
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
9849
9850
  slideMasters.map((master, masterIdx) => {
9850
9851
  const isMasterActive = masterIdx === activeMasterIndex && activeLayoutIndex === null;
@@ -9857,7 +9858,7 @@ function SlideMastersList({
9857
9858
  ref: isMasterActive ? activeRef : void 0,
9858
9859
  "aria-pressed": isMasterActive,
9859
9860
  "aria-label": master.name || t("pptx.master.master"),
9860
- className: chunkJKSUB7DR_js.cn(
9861
+ className: chunk5DBKW7F3_js.cn(
9861
9862
  "group relative block w-full cursor-pointer rounded-lg border-2 p-1 text-left transition-all",
9862
9863
  isMasterActive ? "border-amber-500 bg-amber-500/10" : "border-border bg-background/40 hover:border-border"
9863
9864
  ),
@@ -9874,7 +9875,7 @@ function SlideMastersList({
9874
9875
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 px-1", children: /* @__PURE__ */ jsxRuntime.jsx(
9875
9876
  "span",
9876
9877
  {
9877
- className: chunkJKSUB7DR_js.cn(
9878
+ className: chunk5DBKW7F3_js.cn(
9878
9879
  "text-[10px] font-medium",
9879
9880
  isMasterActive ? "text-amber-400" : "text-muted-foreground"
9880
9881
  ),
@@ -9893,7 +9894,7 @@ function SlideMastersList({
9893
9894
  ref: isLayoutActive ? activeRef : void 0,
9894
9895
  "aria-pressed": isLayoutActive,
9895
9896
  "aria-label": layout.name || t("pptx.master.layout"),
9896
- className: chunkJKSUB7DR_js.cn(
9897
+ className: chunk5DBKW7F3_js.cn(
9897
9898
  "group relative block w-full cursor-pointer rounded-md border-2 p-0.5 text-left transition-all",
9898
9899
  isLayoutActive ? "border-primary bg-primary/10" : "border-border bg-background/40 hover:border-border"
9899
9900
  ),
@@ -9910,7 +9911,7 @@ function SlideMastersList({
9910
9911
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 px-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(
9911
9912
  "span",
9912
9913
  {
9913
- className: chunkJKSUB7DR_js.cn(
9914
+ className: chunk5DBKW7F3_js.cn(
9914
9915
  "text-[9px]",
9915
9916
  isLayoutActive ? "text-primary" : "text-muted-foreground"
9916
9917
  ),
@@ -9954,7 +9955,7 @@ function MasterViewSidebar({
9954
9955
  onSlidesBackgroundChange
9955
9956
  }) {
9956
9957
  const scrollRef = React108.useRef(null);
9957
- const { t } = chunkJKSUB7DR_js.useTranslation();
9958
+ const { t } = chunk5DBKW7F3_js.useTranslation();
9958
9959
  const slidesBackground = pptx.masterViewBackgroundColor(
9959
9960
  { slideMasters },
9960
9961
  { tab: "slides", masterIndex: activeMasterIndex, layoutIndex: activeLayoutIndex }
@@ -10002,7 +10003,7 @@ function MasterViewSidebar({
10002
10003
  type: "button",
10003
10004
  role: "tab",
10004
10005
  "aria-selected": masterViewTab === tab.key,
10005
- className: chunkJKSUB7DR_js.cn(
10006
+ className: chunk5DBKW7F3_js.cn(
10006
10007
  "flex-1 px-1 py-1.5 text-[10px] font-medium transition-colors border-b-2",
10007
10008
  masterViewTab === tab.key ? "border-amber-500 text-amber-400" : "border-transparent text-muted-foreground hover:text-foreground"
10008
10009
  ),
@@ -10104,7 +10105,7 @@ function NotesMasterCanvas({
10104
10105
  notesText,
10105
10106
  slideNumber
10106
10107
  }) {
10107
- const { t } = chunkJKSUB7DR_js.useTranslation();
10108
+ const { t } = chunk5DBKW7F3_js.useTranslation();
10108
10109
  const pageWidth = notesCanvasSize?.width ?? DEFAULT_NOTES_WIDTH;
10109
10110
  const pageHeight = notesCanvasSize?.height ?? DEFAULT_NOTES_HEIGHT;
10110
10111
  const scale = React108.useMemo(() => {
@@ -10364,7 +10365,7 @@ function HandoutMasterCanvas({
10364
10365
  slideThumbnails,
10365
10366
  pageNumber
10366
10367
  }) {
10367
- const { t } = chunkJKSUB7DR_js.useTranslation();
10368
+ const { t } = chunk5DBKW7F3_js.useTranslation();
10368
10369
  const slideAspect = 4 / 3;
10369
10370
  const scale = React108.useMemo(() => {
10370
10371
  const scaleX = canvasSize.width / PAGE_WIDTH;
@@ -10505,7 +10506,7 @@ function SectionBlock({
10505
10506
  /* @__PURE__ */ jsxRuntime.jsx(
10506
10507
  lu.LuChevronDown,
10507
10508
  {
10508
- className: chunkJKSUB7DR_js.cn("h-3 w-3 transition-transform", collapsed ? "-rotate-90" : "rotate-0")
10509
+ className: chunk5DBKW7F3_js.cn("h-3 w-3 transition-transform", collapsed ? "-rotate-90" : "rotate-0")
10509
10510
  }
10510
10511
  ),
10511
10512
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-left", children: section.label }),
@@ -10549,12 +10550,12 @@ function SlideCardImpl({
10549
10550
  onDragLeave,
10550
10551
  onDrop
10551
10552
  }) {
10552
- const { t } = chunkJKSUB7DR_js.useTranslation();
10553
+ const { t } = chunk5DBKW7F3_js.useTranslation();
10553
10554
  const cue = pptx.hiddenSlideCue(slide.hidden, "sorter", index);
10554
10555
  return /* @__PURE__ */ jsxRuntime.jsxs(
10555
10556
  "div",
10556
10557
  {
10557
- className: chunkJKSUB7DR_js.cn(
10558
+ className: chunk5DBKW7F3_js.cn(
10558
10559
  "group relative cursor-pointer rounded-lg border-2 p-1 transition-all",
10559
10560
  isDragTarget ? "border-primary bg-primary/20" : isSelected ? "border-primary bg-primary/10 ring-1 ring-primary/50" : isActive ? "border-primary/50 bg-primary/5" : "border-border bg-background/50 hover:border-border",
10560
10561
  slide.hidden && "opacity-40"
@@ -10577,7 +10578,7 @@ function SlideCardImpl({
10577
10578
  /* @__PURE__ */ jsxRuntime.jsx(
10578
10579
  "span",
10579
10580
  {
10580
- className: chunkJKSUB7DR_js.cn(
10581
+ className: chunk5DBKW7F3_js.cn(
10581
10582
  "text-[11px] font-medium px-0.5",
10582
10583
  isSelected ? "text-primary" : isActive ? "text-primary/70" : "text-muted-foreground"
10583
10584
  ),
@@ -10655,7 +10656,7 @@ function SorterContextMenu({
10655
10656
  onToggleHide,
10656
10657
  onClose
10657
10658
  }) {
10658
- const { t } = chunkJKSUB7DR_js.useTranslation();
10659
+ const { t } = chunk5DBKW7F3_js.useTranslation();
10659
10660
  const menuX = Math.max(8, Math.min(x, window.innerWidth - 220));
10660
10661
  const menuY = Math.max(8, Math.min(y, window.innerHeight - 300));
10661
10662
  const entries = pptx.buildSlideSorterContextMenuEntries({
@@ -11010,7 +11011,7 @@ function SlideSorterOverlay({
11010
11011
  onToggleHideSlides,
11011
11012
  onClose
11012
11013
  }) {
11013
- const { t } = chunkJKSUB7DR_js.useTranslation();
11014
+ const { t } = chunk5DBKW7F3_js.useTranslation();
11014
11015
  const state = useSlideSorterState({
11015
11016
  slides,
11016
11017
  templateElementsBySlideId,
@@ -11256,7 +11257,7 @@ function OutlineViewOverlay({
11256
11257
  bumpHistory,
11257
11258
  onClose
11258
11259
  }) {
11259
- const { t } = chunkJKSUB7DR_js.useTranslation();
11260
+ const { t } = chunk5DBKW7F3_js.useTranslation();
11260
11261
  const { rows, containerRef, run, onRowKeyDown } = useOutlineView({
11261
11262
  slides,
11262
11263
  canvasSize,
@@ -11347,7 +11348,7 @@ function ReadingViewStage({
11347
11348
  "div",
11348
11349
  {
11349
11350
  className: "absolute inset-0",
11350
- style: { backgroundColor: chunkJKSUB7DR_js.normalizeHexColor(slide.backgroundColor, "#ffffff") }
11351
+ style: { backgroundColor: chunk5DBKW7F3_js.normalizeHexColor(slide.backgroundColor, "#ffffff") }
11351
11352
  }
11352
11353
  ),
11353
11354
  slide.backgroundImage && /* @__PURE__ */ jsxRuntime.jsx(
@@ -11366,7 +11367,7 @@ function ReadingViewStage({
11366
11367
  className: "absolute left-0 top-0 origin-top-left",
11367
11368
  style: { width, height, transform: `scale(${scale})`, ...pptx.deviceStrokeStageStyle(scale) },
11368
11369
  children: elements.map((element, index) => /* @__PURE__ */ jsxRuntime.jsx(
11369
- chunk73SDWM6K_js.StaticElementRenderer,
11370
+ chunkVGU5S37T_js.StaticElementRenderer,
11370
11371
  {
11371
11372
  element,
11372
11373
  activeSlide: slide,
@@ -11447,7 +11448,7 @@ function ReadingViewOverlay({
11447
11448
  activeSlideIndex,
11448
11449
  onExit
11449
11450
  }) {
11450
- const { t } = chunkJKSUB7DR_js.useTranslation();
11451
+ const { t } = chunk5DBKW7F3_js.useTranslation();
11451
11452
  const { state, viewportRef, scale, run } = useReadingView({
11452
11453
  slideCount: slides.length,
11453
11454
  canvasSize,
@@ -11578,7 +11579,7 @@ function renderRichNotesSegments(segments) {
11578
11579
  if (segment.style.fontFamily) {
11579
11580
  style.fontFamily = segment.style.fontFamily;
11580
11581
  }
11581
- if (segment.style.hyperlink && chunkJKSUB7DR_js.isUrlSafe(segment.style.hyperlink)) {
11582
+ if (segment.style.hyperlink && chunk5DBKW7F3_js.isUrlSafe(segment.style.hyperlink)) {
11582
11583
  const safeHref = segment.style.hyperlink;
11583
11584
  style.color = "#4a9eff";
11584
11585
  style.textDecoration = "underline";
@@ -11591,7 +11592,7 @@ function renderRichNotesSegments(segments) {
11591
11592
  style,
11592
11593
  onClick: (e) => {
11593
11594
  e.preventDefault();
11594
- chunkJKSUB7DR_js.safeOpenUrl(safeHref);
11595
+ chunk5DBKW7F3_js.safeOpenUrl(safeHref);
11595
11596
  },
11596
11597
  children: segment.text
11597
11598
  },
@@ -11615,7 +11616,7 @@ function NotesPrintDialog({
11615
11616
  onClose,
11616
11617
  notesStyle
11617
11618
  }) {
11618
- const { t } = chunkJKSUB7DR_js.useTranslation();
11619
+ const { t } = chunk5DBKW7F3_js.useTranslation();
11619
11620
  const printFrameRef = React108.useRef(null);
11620
11621
  const handlePrint = React108.useCallback(() => {
11621
11622
  const iframe = printFrameRef.current;
@@ -11673,7 +11674,7 @@ function NotesPrintDialog({
11673
11674
  ] }) });
11674
11675
  }
11675
11676
  function NotesToolbar(p) {
11676
- const { t } = chunkJKSUB7DR_js.useTranslation();
11677
+ const { t } = chunk5DBKW7F3_js.useTranslation();
11677
11678
  const ref = React108.useRef(null);
11678
11679
  React108.useEffect(() => {
11679
11680
  const host = ref.current;
@@ -11940,7 +11941,7 @@ function useSlideNotes({
11940
11941
  const href = target.getAttribute("data-hyperlink") || target.getAttribute("href");
11941
11942
  if (href && (e.ctrlKey || e.metaKey)) {
11942
11943
  e.preventDefault();
11943
- chunkJKSUB7DR_js.safeOpenUrl(href);
11944
+ chunk5DBKW7F3_js.safeOpenUrl(href);
11944
11945
  }
11945
11946
  }, []);
11946
11947
  return {
@@ -11977,7 +11978,7 @@ function SlideNotesPanel({
11977
11978
  notesStyle,
11978
11979
  onHeightChange
11979
11980
  }) {
11980
- const { t } = chunkJKSUB7DR_js.useTranslation();
11981
+ const { t } = chunk5DBKW7F3_js.useTranslation();
11981
11982
  const rootRef = React108__default.default.useRef(null);
11982
11983
  React108__default.default.useEffect(() => {
11983
11984
  const el = rootRef.current;
@@ -12021,7 +12022,7 @@ function SlideNotesPanel({
12021
12022
  });
12022
12023
  const hasNotes = draft.trim().length > 0;
12023
12024
  const slideLabel = activeSlide ? t("pptx.notes.slideN", { n: activeSlide.slideNumber }) : t("pptx.notes.noSlide");
12024
- const { dragY, handlers: dragHandlers } = chunk73SDWM6K_js.useSheetDismissDrag(onToggle);
12025
+ const { dragY, handlers: dragHandlers } = chunkVGU5S37T_js.useSheetDismissDrag(onToggle);
12025
12026
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
12026
12027
  isExpanded && /* @__PURE__ */ jsxRuntime.jsx(
12027
12028
  "button",
@@ -12037,7 +12038,7 @@ function SlideNotesPanel({
12037
12038
  {
12038
12039
  ref: rootRef,
12039
12040
  "data-pptx-chrome": "notes",
12040
- className: chunkJKSUB7DR_js.cn(
12041
+ className: chunk5DBKW7F3_js.cn(
12041
12042
  "flex flex-col border-t border-border/60 bg-background select-none",
12042
12043
  // On mobile, hide the entire notes strip when collapsed: the
12043
12044
  // MobileBottomBar's Notes button is the entry point instead.
@@ -12221,7 +12222,7 @@ function VersionHistoryPanel({
12221
12222
  onClose,
12222
12223
  onRestore
12223
12224
  }) {
12224
- const { t } = chunkJKSUB7DR_js.useTranslation();
12225
+ const { t } = chunk5DBKW7F3_js.useTranslation();
12225
12226
  const [versions, setVersions] = React108.useState([]);
12226
12227
  const [loading, setLoading] = React108.useState(false);
12227
12228
  const [restoringKey, setRestoringKey] = React108.useState(null);
@@ -12367,7 +12368,7 @@ function SlideDiffRow({
12367
12368
  onAccept,
12368
12369
  onReject
12369
12370
  }) {
12370
- const { t } = chunkJKSUB7DR_js.useTranslation();
12371
+ const { t } = chunk5DBKW7F3_js.useTranslation();
12371
12372
  const [expanded, setExpanded] = React108.useState(diff.status === "changed");
12372
12373
  const statusLabel = (() => {
12373
12374
  switch (diff.status) {
@@ -12401,7 +12402,7 @@ function SlideDiffRow({
12401
12402
  return /* @__PURE__ */ jsxRuntime.jsxs(
12402
12403
  "div",
12403
12404
  {
12404
- className: chunkJKSUB7DR_js.cn(
12405
+ className: chunk5DBKW7F3_js.cn(
12405
12406
  "rounded-lg border transition-colors",
12406
12407
  isResolved ? "border-border/60 bg-card/40 opacity-60" : "border-border bg-background/70"
12407
12408
  ),
@@ -12415,7 +12416,7 @@ function SlideDiffRow({
12415
12416
  children: [
12416
12417
  expanded ? /* @__PURE__ */ jsxRuntime.jsx(lu.LuChevronDown, { className: "w-3.5 h-3.5 text-muted-foreground flex-shrink-0" }) : /* @__PURE__ */ jsxRuntime.jsx(lu.LuChevronRight, { className: "w-3.5 h-3.5 text-muted-foreground flex-shrink-0" }),
12417
12418
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-foreground", children: t("pptx.compare.slideNumber", { number: slideNumber }) }),
12418
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkJKSUB7DR_js.cn("rounded-full px-2 py-0.5 text-[10px] font-medium", statusColor), children: statusLabel }),
12419
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunk5DBKW7F3_js.cn("rounded-full px-2 py-0.5 text-[10px] font-medium", statusColor), children: statusLabel }),
12419
12420
  diff.changes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[10px] text-muted-foreground", children: [
12420
12421
  diff.changes.length,
12421
12422
  " ",
@@ -12425,7 +12426,7 @@ function SlideDiffRow({
12425
12426
  isResolved && /* @__PURE__ */ jsxRuntime.jsx(
12426
12427
  "span",
12427
12428
  {
12428
- className: chunkJKSUB7DR_js.cn(
12429
+ className: chunk5DBKW7F3_js.cn(
12429
12430
  "text-[10px] font-medium",
12430
12431
  accepted ? "text-green-400" : "text-muted-foreground"
12431
12432
  ),
@@ -12453,7 +12454,7 @@ function SlideDiffRow({
12453
12454
  /* @__PURE__ */ jsxRuntime.jsx(
12454
12455
  "div",
12455
12456
  {
12456
- className: chunkJKSUB7DR_js.cn(
12457
+ className: chunk5DBKW7F3_js.cn(
12457
12458
  "rounded border overflow-hidden",
12458
12459
  diff.status === "added" ? "border-green-700/60" : diff.status === "changed" ? "border-amber-700/60" : "border-border"
12459
12460
  ),
@@ -12520,7 +12521,7 @@ function ComparePanel({
12520
12521
  onRejectSlide,
12521
12522
  onAcceptAll
12522
12523
  }) {
12523
- const { t } = chunkJKSUB7DR_js.useTranslation();
12524
+ const { t } = chunk5DBKW7F3_js.useTranslation();
12524
12525
  const [accepted, setAccepted] = React108.useState({});
12525
12526
  const [rejected, setRejected] = React108.useState({});
12526
12527
  const handleAccept = React108.useCallback(
@@ -12649,7 +12650,7 @@ function PasswordProtectionDialog({
12649
12650
  onSetPassword,
12650
12651
  onRemovePassword
12651
12652
  }) {
12652
- const { t } = chunkJKSUB7DR_js.useTranslation();
12653
+ const { t } = chunk5DBKW7F3_js.useTranslation();
12653
12654
  const [password, setPassword] = React108.useState("");
12654
12655
  const [confirmPassword, setConfirmPassword] = React108.useState("");
12655
12656
  const [showPassword, setShowPassword] = React108.useState(false);
@@ -12865,7 +12866,7 @@ function DocumentPropertiesCustomTab({
12865
12866
  customProperties,
12866
12867
  onUpdate
12867
12868
  }) {
12868
- const { t } = chunkJKSUB7DR_js.useTranslation();
12869
+ const { t } = chunk5DBKW7F3_js.useTranslation();
12869
12870
  const handleAdd = React108.useCallback(() => {
12870
12871
  onUpdate([...customProperties, { name: "", value: "", type: "lpwstr" }]);
12871
12872
  }, [customProperties, onUpdate]);
@@ -13067,7 +13068,7 @@ function DocumentPropertiesStatisticsTab({
13067
13068
  onUpdateAppProperties,
13068
13069
  canEdit
13069
13070
  }) {
13070
- const { t } = chunkJKSUB7DR_js.useTranslation();
13071
+ const { t } = chunk5DBKW7F3_js.useTranslation();
13071
13072
  const handleEditableChange = React108.useCallback(
13072
13073
  (key, value) => {
13073
13074
  onUpdateAppProperties({ [key]: value });
@@ -13107,7 +13108,7 @@ function DocumentPropertiesDialog({
13107
13108
  onClose,
13108
13109
  onSave
13109
13110
  }) {
13110
- const { t } = chunkJKSUB7DR_js.useTranslation();
13111
+ const { t } = chunk5DBKW7F3_js.useTranslation();
13111
13112
  const [activeTab, setActiveTab] = React108.useState("summary");
13112
13113
  const [draftCore, setDraftCore] = React108.useState({});
13113
13114
  const [draftCustom, setDraftCustom] = React108.useState([]);
@@ -13158,7 +13159,7 @@ function DocumentPropertiesDialog({
13158
13159
  const handleClose = React108.useCallback(() => {
13159
13160
  onClose();
13160
13161
  }, [onClose]);
13161
- const { panelStyle, handlers: dragHandlers } = chunk73SDWM6K_js.useModalDismissDrag(handleClose);
13162
+ const { panelStyle, handlers: dragHandlers } = chunkVGU5S37T_js.useModalDismissDrag(handleClose);
13162
13163
  if (!isOpen) {
13163
13164
  return null;
13164
13165
  }
@@ -13295,7 +13296,7 @@ function FontEmbeddingPanel({
13295
13296
  onClose,
13296
13297
  onToggleEmbedFonts
13297
13298
  }) {
13298
- const { t } = chunkJKSUB7DR_js.useTranslation();
13299
+ const { t } = chunk5DBKW7F3_js.useTranslation();
13299
13300
  const [availableFamilies, setAvailableFamilies] = React108.useState(/* @__PURE__ */ new Set());
13300
13301
  const [scanning, setScanning] = React108.useState(false);
13301
13302
  const [scanned, setScanned] = React108.useState(false);
@@ -13423,7 +13424,7 @@ function DigitalSignaturesDialog({
13423
13424
  hasSignatures,
13424
13425
  signatureCount
13425
13426
  }) {
13426
- const { t } = chunkJKSUB7DR_js.useTranslation();
13427
+ const { t } = chunk5DBKW7F3_js.useTranslation();
13427
13428
  if (!isOpen) {
13428
13429
  return null;
13429
13430
  }
@@ -13495,7 +13496,7 @@ function SignatureStatusBadge({
13495
13496
  signatureCount,
13496
13497
  onClick
13497
13498
  }) {
13498
- const { t } = chunkJKSUB7DR_js.useTranslation();
13499
+ const { t } = chunk5DBKW7F3_js.useTranslation();
13499
13500
  if (!hasSignatures || signatureCount === 0) {
13500
13501
  return null;
13501
13502
  }
@@ -13521,7 +13522,7 @@ function SignatureStrippedDialog({
13521
13522
  onConfirm,
13522
13523
  onCancel
13523
13524
  }) {
13524
- const { t } = chunkJKSUB7DR_js.useTranslation();
13525
+ const { t } = chunk5DBKW7F3_js.useTranslation();
13525
13526
  if (!isOpen) {
13526
13527
  return null;
13527
13528
  }
@@ -13590,7 +13591,7 @@ function EncryptedFileDialog({
13590
13591
  isOpen,
13591
13592
  onClose
13592
13593
  }) {
13593
- const { t } = chunkJKSUB7DR_js.useTranslation();
13594
+ const { t } = chunk5DBKW7F3_js.useTranslation();
13594
13595
  if (!isOpen) {
13595
13596
  return null;
13596
13597
  }
@@ -13737,7 +13738,7 @@ function PresentationAudienceEffects({ snapshot }) {
13737
13738
  ] });
13738
13739
  }
13739
13740
  function PresentationEndOverlay({ onExit }) {
13740
- const { t } = chunkJKSUB7DR_js.useTranslation();
13741
+ const { t } = chunk5DBKW7F3_js.useTranslation();
13741
13742
  return /* @__PURE__ */ jsxRuntime.jsx(
13742
13743
  "button",
13743
13744
  {
@@ -13753,9 +13754,9 @@ function PresentationSubtitleBar({
13753
13754
  visible,
13754
13755
  onCaptionChange
13755
13756
  }) {
13756
- const { t } = chunkJKSUB7DR_js.useTranslation();
13757
+ const { t } = chunk5DBKW7F3_js.useTranslation();
13757
13758
  const language = pptx.subtitleRecognitionLanguage(
13758
- pptx.subtitleSettingsFromOptions(chunk73SDWM6K_js.useViewerOptionsContext()),
13759
+ pptx.subtitleSettingsFromOptions(chunkVGU5S37T_js.useViewerOptionsContext()),
13759
13760
  typeof navigator === "undefined" ? "en-US" : navigator.language
13760
13761
  );
13761
13762
  const [captionText, setCaptionText] = React108.useState("");
@@ -13832,7 +13833,7 @@ function renderNotesSegments(segments) {
13832
13833
  });
13833
13834
  }
13834
13835
  function PresenterConsoleToolbar(p) {
13835
- const { t } = chunkJKSUB7DR_js.useTranslation();
13836
+ const { t } = chunk5DBKW7F3_js.useTranslation();
13836
13837
  const ref = useWebControl(
13837
13838
  { ...pptx.presenterConsoleViewState(p.snapshot, p.audienceOpen), translate: t },
13838
13839
  {
@@ -13923,7 +13924,7 @@ function ScaledSlidePreviewImpl({
13923
13924
  {
13924
13925
  className: "absolute inset-0",
13925
13926
  style: {
13926
- backgroundColor: chunkJKSUB7DR_js.normalizeHexColor(slide.backgroundColor, "#ffffff")
13927
+ backgroundColor: chunk5DBKW7F3_js.normalizeHexColor(slide.backgroundColor, "#ffffff")
13927
13928
  }
13928
13929
  }
13929
13930
  ),
@@ -13949,7 +13950,7 @@ function ScaledSlidePreviewImpl({
13949
13950
  ...pptx.deviceStrokeStageStyle(scale)
13950
13951
  },
13951
13952
  children: previewElements.map((element, index) => /* @__PURE__ */ jsxRuntime.jsx(
13952
- chunk73SDWM6K_js.StaticElementRenderer,
13953
+ chunkVGU5S37T_js.StaticElementRenderer,
13953
13954
  {
13954
13955
  element,
13955
13956
  activeSlide: slide,
@@ -14016,7 +14017,7 @@ function PresenterNotesRail({
14016
14017
  onMove,
14017
14018
  onUpdateNotes
14018
14019
  }) {
14019
- const { t } = chunkJKSUB7DR_js.useTranslation();
14020
+ const { t } = chunk5DBKW7F3_js.useTranslation();
14020
14021
  const slide = slides[current];
14021
14022
  const nextSlide = pptx.nextPresentedSlide(slides, current, activeCustomShow, authoredRange);
14022
14023
  const notesText = slide?.notes ?? "";
@@ -14141,7 +14142,7 @@ function PresenterNotesRail({
14141
14142
  ] });
14142
14143
  }
14143
14144
  function PresenterSlideNavigator(props) {
14144
- const { t } = chunkJKSUB7DR_js.useTranslation();
14145
+ const { t } = chunk5DBKW7F3_js.useTranslation();
14145
14146
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${pptx.PRESENTER_CONSOLE_CLASSES.navigator} text-foreground`, children: [
14146
14147
  /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "mb-4 flex items-center justify-between border-b border-border pb-4", children: [
14147
14148
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
@@ -14283,7 +14284,7 @@ function PresenterView({
14283
14284
  onSwapDisplays,
14284
14285
  onUpdateNotes
14285
14286
  }) {
14286
- const { t } = chunkJKSUB7DR_js.useTranslation();
14287
+ const { t } = chunk5DBKW7F3_js.useTranslation();
14287
14288
  const [now, setNow] = React108.useState(Date.now());
14288
14289
  React108.useEffect(() => {
14289
14290
  const interval = window.setInterval(() => setNow(Date.now()), 1e3);
@@ -14440,7 +14441,7 @@ function MobilePresenterView({
14440
14441
  onMovePresentationSlide,
14441
14442
  onExit
14442
14443
  }) {
14443
- const { t } = chunkJKSUB7DR_js.useTranslation();
14444
+ const { t } = chunk5DBKW7F3_js.useTranslation();
14444
14445
  const [now, setNow] = React108.useState(Date.now());
14445
14446
  React108.useEffect(() => {
14446
14447
  const interval = window.setInterval(() => setNow(Date.now()), 1e3);
@@ -14553,7 +14554,7 @@ function RehearseTimingsHud({
14553
14554
  paused,
14554
14555
  onTogglePause
14555
14556
  }) {
14556
- const { t } = chunkJKSUB7DR_js.useTranslation();
14557
+ const { t } = chunk5DBKW7F3_js.useTranslation();
14557
14558
  const [tick, setTick] = React108.useState(0);
14558
14559
  React108.useEffect(() => {
14559
14560
  if (paused) {
@@ -14601,7 +14602,7 @@ function RehearseTimingsSummary({
14601
14602
  onSave,
14602
14603
  onDiscard
14603
14604
  }) {
14604
- const { t } = chunkJKSUB7DR_js.useTranslation();
14605
+ const { t } = chunk5DBKW7F3_js.useTranslation();
14605
14606
  const totalMs = Object.values(recordedTimings).reduce((sum, ms) => sum + ms, 0);
14606
14607
  const sortedEntries = Object.entries(recordedTimings).map(([idx, ms]) => ({ slideIndex: Number(idx), ms })).sort((a, b) => a.slideIndex - b.slideIndex);
14607
14608
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed inset-0 z-[9999] flex items-center justify-center bg-black/60 backdrop-blur-sm", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full max-w-lg rounded-xl border border-border bg-background shadow-2xl", children: [
@@ -14685,7 +14686,7 @@ function SelectionPane({
14685
14686
  markDirty,
14686
14687
  onClose
14687
14688
  }) {
14688
- const { t } = chunkJKSUB7DR_js.useTranslation();
14689
+ const { t } = chunk5DBKW7F3_js.useTranslation();
14689
14690
  const activeSlide = slides[activeSlideIndex];
14690
14691
  const elements = activeSlide?.elements ?? [];
14691
14692
  const [editingId, setEditingId] = React108.useState(null);
@@ -14840,7 +14841,7 @@ function SelectionPane({
14840
14841
  setDragIndex(null);
14841
14842
  setDragOverIndex(null);
14842
14843
  },
14843
- className: chunkJKSUB7DR_js.cn(
14844
+ className: chunk5DBKW7F3_js.cn(
14844
14845
  "flex items-center gap-1.5 px-2 py-1 text-xs cursor-pointer transition-colors",
14845
14846
  isSelected ? "bg-primary/30 text-primary" : "hover:bg-muted text-foreground",
14846
14847
  dragOverIndex === realIndex ? "border-t-2 border-primary" : ""
@@ -14894,13 +14895,13 @@ function SelectionPane({
14894
14895
  }
14895
14896
  var INPUT_CLS = "bg-muted border border-border rounded px-2 py-1 w-full text-[11px] max-md:min-h-[44px]!";
14896
14897
  var SELECT_CLS = "bg-muted border border-border rounded px-2 py-1 w-full text-[11px] max-md:min-h-[44px]!";
14897
- var ENTRANCE_PRESETS = /* @__PURE__ */ chunkJKSUB7DR_js.ANIMATION_PRESET_OPTIONS.filter(
14898
+ var ENTRANCE_PRESETS = /* @__PURE__ */ chunk5DBKW7F3_js.ANIMATION_PRESET_OPTIONS.filter(
14898
14899
  (o) => o.value === "fadeIn" || o.value === "flyIn" || o.value === "zoomIn"
14899
14900
  );
14900
- var EXIT_PRESETS = /* @__PURE__ */ chunkJKSUB7DR_js.ANIMATION_PRESET_OPTIONS.filter(
14901
+ var EXIT_PRESETS = /* @__PURE__ */ chunk5DBKW7F3_js.ANIMATION_PRESET_OPTIONS.filter(
14901
14902
  (o) => o.value === "fadeOut" || o.value === "flyOut" || o.value === "zoomOut"
14902
14903
  );
14903
- var EMPHASIS_PRESETS = /* @__PURE__ */ chunkJKSUB7DR_js.ANIMATION_PRESET_OPTIONS.filter(
14904
+ var EMPHASIS_PRESETS = /* @__PURE__ */ chunk5DBKW7F3_js.ANIMATION_PRESET_OPTIONS.filter(
14904
14905
  (o) => o.value === "spin" || o.value === "pulse" || o.value === "colorWave" || o.value === "bounce" || o.value === "flash" || o.value === "growShrink" || o.value === "teeter"
14905
14906
  );
14906
14907
  var TIMING_CURVE_OPTIONS = [
@@ -15001,7 +15002,7 @@ function AfterAnimationRow({
15001
15002
  onActionChange,
15002
15003
  onColorChange
15003
15004
  }) {
15004
- const { t } = chunkJKSUB7DR_js.useTranslation();
15005
+ const { t } = chunk5DBKW7F3_js.useTranslation();
15005
15006
  const commitRecentColor = useRecentColorCommit();
15006
15007
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
15007
15008
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex flex-col gap-1", children: [
@@ -15052,7 +15053,7 @@ function AnimationTimelineSection({
15052
15053
  canEdit,
15053
15054
  handlers
15054
15055
  }) {
15055
- const { t } = chunkJKSUB7DR_js.useTranslation();
15056
+ const { t } = chunk5DBKW7F3_js.useTranslation();
15056
15057
  const effectLabel = (anim) => pptx.animationEffectLabel(anim, (key) => t(key));
15057
15058
  const {
15058
15059
  sortedAnimations,
@@ -15083,7 +15084,7 @@ function AnimationTimelineSection({
15083
15084
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative h-6 rounded bg-muted/50 border border-border overflow-hidden", children: timelineBarData.map((bar) => /* @__PURE__ */ jsxRuntime.jsx(
15084
15085
  "div",
15085
15086
  {
15086
- className: chunkJKSUB7DR_js.cn(
15087
+ className: chunk5DBKW7F3_js.cn(
15087
15088
  "absolute top-0.5 bottom-0.5 rounded-sm transition-colors",
15088
15089
  animationTypeColor(bar.anim),
15089
15090
  bar.anim.elementId === selectedElementId && "ring-1 ring-primary"
@@ -15112,7 +15113,7 @@ function AnimationTimelineSection({
15112
15113
  onDragLeave: handleDragLeave,
15113
15114
  onDrop: (e) => handleDrop(index, e),
15114
15115
  title: t("pptx.animation.nativeEffectHint"),
15115
- className: chunkJKSUB7DR_js.cn(
15116
+ className: chunk5DBKW7F3_js.cn(
15116
15117
  "flex items-center gap-1 px-1 py-0.5 rounded text-[10px] italic",
15117
15118
  "bg-muted/20 text-muted-foreground/70",
15118
15119
  isDragOver && "border-t-2 border-primary"
@@ -15151,7 +15152,7 @@ function AnimationTimelineSection({
15151
15152
  onDragEnd: handleDragEnd,
15152
15153
  onMouseEnter: () => handleAnimationHover(anim),
15153
15154
  onMouseLeave: handleAnimationHoverEnd,
15154
- className: chunkJKSUB7DR_js.cn(
15155
+ className: chunk5DBKW7F3_js.cn(
15155
15156
  "flex items-center gap-1 px-1 py-0.5 rounded text-[10px] cursor-grab transition-colors",
15156
15157
  isSelected ? "bg-primary/30 text-primary" : "bg-muted/50 text-muted-foreground",
15157
15158
  isDragging && "opacity-40",
@@ -15212,7 +15213,7 @@ function BookmarkTriggerRow({
15212
15213
  style,
15213
15214
  onChange
15214
15215
  }) {
15215
- const { t } = chunkJKSUB7DR_js.useTranslation();
15216
+ const { t } = chunk5DBKW7F3_js.useTranslation();
15216
15217
  const options = pptx.listMediaBookmarkOptions(elements);
15217
15218
  return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex flex-col gap-1", children: [
15218
15219
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground text-[11px]", children: t("pptx.animation.trigger.bookmarkLabel") }),
@@ -15245,7 +15246,7 @@ function EffectSoundRow({
15245
15246
  onPick,
15246
15247
  onPickStock
15247
15248
  }) {
15248
- const { t } = chunkJKSUB7DR_js.useTranslation();
15249
+ const { t } = chunk5DBKW7F3_js.useTranslation();
15249
15250
  const fileInputRef = React108__default.default.useRef(null);
15250
15251
  const selectedValue = soundState.catalogueId ?? (soundState.hasSound ? CURRENT_VALUE : NONE_VALUE);
15251
15252
  const handleSelectChange = (event) => {
@@ -15283,7 +15284,7 @@ function EffectSoundRow({
15283
15284
  }
15284
15285
  const asset = pptx.getEffectSoundAsset(soundState.catalogueId);
15285
15286
  if (asset) {
15286
- chunk73SDWM6K_js.playAnimationSound(asset.dataUrl);
15287
+ chunkVGU5S37T_js.playAnimationSound(asset.dataUrl);
15287
15288
  }
15288
15289
  };
15289
15290
  return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex flex-col gap-1", children: [
@@ -15336,7 +15337,7 @@ function MotionPathRow({
15336
15337
  canEdit,
15337
15338
  onChange
15338
15339
  }) {
15339
- const { t } = chunkJKSUB7DR_js.useTranslation();
15340
+ const { t } = chunk5DBKW7F3_js.useTranslation();
15340
15341
  const presetId = pptx.motionPathPresetIdForPath(motionPath);
15341
15342
  const isCustom = Boolean(motionPath) && !presetId;
15342
15343
  return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex flex-col gap-1", children: [
@@ -15458,7 +15459,7 @@ function useAnimationPreview({
15458
15459
  }) {
15459
15460
  const handleAnimationHover = React108.useCallback((anim) => {
15460
15461
  if (anim.motionPath) {
15461
- chunkJKSUB7DR_js.startMotionPathPreview(anim.elementId, anim.motionPath, {
15462
+ chunk5DBKW7F3_js.startMotionPathPreview(anim.elementId, anim.motionPath, {
15462
15463
  durationMs: anim.durationMs,
15463
15464
  delayMs: anim.delayMs,
15464
15465
  timingCurve: anim.timingCurve
@@ -15469,19 +15470,19 @@ function useAnimationPreview({
15469
15470
  if (!preset || preset === "none") {
15470
15471
  return;
15471
15472
  }
15472
- chunkJKSUB7DR_js.startPreviewAnimation(anim.elementId, preset, {
15473
+ chunk5DBKW7F3_js.startPreviewAnimation(anim.elementId, preset, {
15473
15474
  direction: anim.direction,
15474
15475
  durationMs: anim.durationMs ?? 500,
15475
15476
  timingCurve: anim.timingCurve
15476
15477
  });
15477
15478
  }, []);
15478
- const handleAnimationHoverEnd = React108.useCallback(() => chunkJKSUB7DR_js.stopPreviewAnimation(), []);
15479
+ const handleAnimationHoverEnd = React108.useCallback(() => chunk5DBKW7F3_js.stopPreviewAnimation(), []);
15479
15480
  const handlePreviewClick = React108.useCallback(() => {
15480
15481
  if (!selectedElementAnimation) {
15481
15482
  return;
15482
15483
  }
15483
15484
  if (selectedElementAnimation.motionPath) {
15484
- chunkJKSUB7DR_js.startMotionPathPreview(selectedElementId, selectedElementAnimation.motionPath, {
15485
+ chunk5DBKW7F3_js.startMotionPathPreview(selectedElementId, selectedElementAnimation.motionPath, {
15485
15486
  durationMs: selectedElementAnimation.durationMs,
15486
15487
  delayMs: selectedElementAnimation.delayMs,
15487
15488
  timingCurve: selectedElementAnimation.timingCurve
@@ -15492,7 +15493,7 @@ function useAnimationPreview({
15492
15493
  if (!preset || preset === "none") {
15493
15494
  return;
15494
15495
  }
15495
- chunkJKSUB7DR_js.startPreviewAnimation(selectedElementId, preset, {
15496
+ chunk5DBKW7F3_js.startPreviewAnimation(selectedElementId, preset, {
15496
15497
  direction: selectedElementAnimation.direction,
15497
15498
  durationMs: selectedElementAnimation.durationMs ?? 500,
15498
15499
  timingCurve: selectedElementAnimation.timingCurve
@@ -15727,7 +15728,7 @@ function useAnimationHandlers({
15727
15728
  return anim.elementId.slice(0, 8);
15728
15729
  }
15729
15730
  const text = pptx$1.hasTextProperties(el) ? el.text : void 0;
15730
- return text || chunkJKSUB7DR_js.getElementLabel(el);
15731
+ return text || chunk5DBKW7F3_js.getElementLabel(el);
15731
15732
  },
15732
15733
  [activeSlide.elements]
15733
15734
  );
@@ -15738,7 +15739,7 @@ function useAnimationHandlers({
15738
15739
  return id.slice(0, 8);
15739
15740
  }
15740
15741
  const text = pptx$1.hasTextProperties(el) ? el.text : void 0;
15741
- return text || chunkJKSUB7DR_js.getElementLabel(el);
15742
+ return text || chunk5DBKW7F3_js.getElementLabel(el);
15742
15743
  }).join(", "),
15743
15744
  [activeSlide.elements]
15744
15745
  );
@@ -15794,8 +15795,8 @@ function AnimationPanel({
15794
15795
  canEdit,
15795
15796
  onUpdateSlide
15796
15797
  }) {
15797
- const { t } = chunkJKSUB7DR_js.useTranslation();
15798
- const { viewportWidth } = chunk73SDWM6K_js.useIsMobile();
15798
+ const { t } = chunk5DBKW7F3_js.useTranslation();
15799
+ const { viewportWidth } = chunkVGU5S37T_js.useIsMobile();
15799
15800
  const directionBtnPx = Math.max(28, pptx.getDensePanelTouchTargetPx(viewportWidth));
15800
15801
  const fieldStyle = { minHeight: pptx.getDensePanelTouchTargetPx(viewportWidth) };
15801
15802
  const handlers = useAnimationHandlers({
@@ -15923,7 +15924,7 @@ function AnimationPanel({
15923
15924
  type: "button",
15924
15925
  disabled: !canEdit,
15925
15926
  style: { minWidth: directionBtnPx, minHeight: directionBtnPx },
15926
- className: chunkJKSUB7DR_js.cn(
15927
+ className: chunk5DBKW7F3_js.cn(
15927
15928
  "flex items-center justify-center rounded border transition-colors",
15928
15929
  isActive ? "border-primary bg-primary/20 text-primary" : "border-border bg-muted text-muted-foreground hover:bg-accent"
15929
15930
  ),
@@ -15989,7 +15990,7 @@ function AnimationPanel({
15989
15990
  style: fieldStyle,
15990
15991
  children: [
15991
15992
  /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: t("pptx.animation.trigger.selectShape") }),
15992
- activeSlide.elements.filter((el) => el.id !== selectedElement.id).map((el) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: el.id, children: chunkJKSUB7DR_js.getElementLabel(el) }, el.id))
15993
+ activeSlide.elements.filter((el) => el.id !== selectedElement.id).map((el) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: el.id, children: chunk5DBKW7F3_js.getElementLabel(el) }, el.id))
15993
15994
  ]
15994
15995
  }
15995
15996
  )
@@ -16133,7 +16134,7 @@ function ActionTargetFields({
16133
16134
  returnAfter,
16134
16135
  onChange
16135
16136
  }) {
16136
- const { t } = chunkJKSUB7DR_js.useTranslation();
16137
+ const { t } = chunk5DBKW7F3_js.useTranslation();
16137
16138
  const urlLabelKey = URL_LABEL_KEY[type];
16138
16139
  if (urlLabelKey) {
16139
16140
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16142,7 +16143,7 @@ function ActionTargetFields({
16142
16143
  type: "text",
16143
16144
  disabled: !canEdit,
16144
16145
  "aria-label": t(urlLabelKey),
16145
- className: chunkJKSUB7DR_js.cn(INPUT2, "w-full"),
16146
+ className: chunk5DBKW7F3_js.cn(INPUT2, "w-full"),
16146
16147
  placeholder: "https://...",
16147
16148
  value: url ?? "",
16148
16149
  onChange: (e) => onChange({ url: e.target.value })
@@ -16156,7 +16157,7 @@ function ActionTargetFields({
16156
16157
  type: "number",
16157
16158
  disabled: !canEdit,
16158
16159
  "aria-label": t("pptx.action.gotoSlide"),
16159
- className: chunkJKSUB7DR_js.cn(INPUT2, "w-full"),
16160
+ className: chunk5DBKW7F3_js.cn(INPUT2, "w-full"),
16160
16161
  placeholder: t("pptx.action.slideNumberPlaceholder"),
16161
16162
  min: 1,
16162
16163
  max: slideCount,
@@ -16178,7 +16179,7 @@ function ActionTargetFields({
16178
16179
  "data-testid": "pptx-action-custom-show",
16179
16180
  disabled: !canEdit,
16180
16181
  "aria-label": t("pptx.hyperlink.customShowLabel"),
16181
- className: chunkJKSUB7DR_js.cn(INPUT2, "w-full"),
16182
+ className: chunk5DBKW7F3_js.cn(INPUT2, "w-full"),
16182
16183
  value: customShowId ?? "",
16183
16184
  onChange: (e) => onChange({ customShowId: e.target.value, returnAfter }),
16184
16185
  children: [
@@ -16210,7 +16211,7 @@ function ActionSettingsPanel({
16210
16211
  customShows,
16211
16212
  onUpdateElement
16212
16213
  }) {
16213
- const { t } = chunkJKSUB7DR_js.useTranslation();
16214
+ const { t } = chunk5DBKW7F3_js.useTranslation();
16214
16215
  const clickAction = selectedElement.actionClick ? pptx$1.pptxActionToElementAction(selectedElement.actionClick, "click") : void 0;
16215
16216
  const hoverAction = selectedElement.actionHover ? pptx$1.pptxActionToElementAction(selectedElement.actionHover, "hover") : void 0;
16216
16217
  const updateAction = (trigger, type, patch) => {
@@ -16286,7 +16287,7 @@ function ActionTriggerSection({
16286
16287
  onChangeType,
16287
16288
  onChangeTarget
16288
16289
  }) {
16289
- const { t } = chunkJKSUB7DR_js.useTranslation();
16290
+ const { t } = chunk5DBKW7F3_js.useTranslation();
16290
16291
  const [pendingType, setPendingType] = React108.useState(void 0);
16291
16292
  const effectiveType = pptx.resolveActionType(pendingType, activeType);
16292
16293
  const changeType = (type) => {
@@ -16300,7 +16301,7 @@ function ActionTriggerSection({
16300
16301
  {
16301
16302
  disabled: !canEdit,
16302
16303
  "aria-label": label,
16303
- className: chunkJKSUB7DR_js.cn(INPUT2, "w-full"),
16304
+ className: chunk5DBKW7F3_js.cn(INPUT2, "w-full"),
16304
16305
  value: effectiveType,
16305
16306
  onChange: (e) => changeType(e.target.value),
16306
16307
  children: pptx.ELEMENT_ACTION_TYPE_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.labelKey) }, o.value))
@@ -16328,7 +16329,7 @@ var AXIS_ROWS = [
16328
16329
  { type: "catAx", labelKey: "pptx.chart.categoryAxis", hasScale: false }
16329
16330
  ];
16330
16331
  function ChartAxisOptions({ axes, canEdit, onUpdateAxis }) {
16331
- const { t } = chunkJKSUB7DR_js.useTranslation();
16332
+ const { t } = chunk5DBKW7F3_js.useTranslation();
16332
16333
  const rows = AXIS_ROWS.map((row) => ({
16333
16334
  ...row,
16334
16335
  axis: axes?.find((a) => a.axisType === row.type)
@@ -16473,7 +16474,7 @@ function ChartAxisStyleOptions({
16473
16474
  onSetTitleStyle,
16474
16475
  onSetGridlineStyle
16475
16476
  }) {
16476
- const { t } = chunkJKSUB7DR_js.useTranslation();
16477
+ const { t } = chunk5DBKW7F3_js.useTranslation();
16477
16478
  const commitRecentColor = useRecentColorCommit();
16478
16479
  const rows = SCALE_AXES.map((row) => ({
16479
16480
  ...row,
@@ -16645,7 +16646,7 @@ function ChartComboTypeOptions({
16645
16646
  canEdit,
16646
16647
  onSetSeriesType
16647
16648
  }) {
16648
- const { t } = chunkJKSUB7DR_js.useTranslation();
16649
+ const { t } = chunk5DBKW7F3_js.useTranslation();
16649
16650
  if (!COMBO_SUPPORTED_TYPES.has(chartType) || series.length < 2) {
16650
16651
  return null;
16651
16652
  }
@@ -16674,7 +16675,7 @@ function ChartDataLabelOptions({
16674
16675
  canEdit,
16675
16676
  onUpdateStyle
16676
16677
  }) {
16677
- const { t } = chunkJKSUB7DR_js.useTranslation();
16678
+ const { t } = chunk5DBKW7F3_js.useTranslation();
16678
16679
  if (!style?.hasDataLabels) {
16679
16680
  return null;
16680
16681
  }
@@ -16722,7 +16723,7 @@ function ChartDataPointMarkerOptions({
16722
16723
  canEdit,
16723
16724
  onSetPointMarker
16724
16725
  }) {
16725
- const { t } = chunkJKSUB7DR_js.useTranslation();
16726
+ const { t } = chunk5DBKW7F3_js.useTranslation();
16726
16727
  const commitRecentColor = useRecentColorCommit();
16727
16728
  const [seriesIndex, setSeriesIndex] = React108.useState(0);
16728
16729
  if (!MARKER_SUPPORTED_TYPES.has(chartType) || series.length === 0 || categories.length === 0) {
@@ -16828,7 +16829,7 @@ function ChartDataPointOptions({
16828
16829
  onSetPointExplosion,
16829
16830
  onSetPointLabel
16830
16831
  }) {
16831
- const { t } = chunkJKSUB7DR_js.useTranslation();
16832
+ const { t } = chunk5DBKW7F3_js.useTranslation();
16832
16833
  const commitRecentColor = useRecentColorCommit();
16833
16834
  const [seriesIndex, setSeriesIndex] = React108.useState(0);
16834
16835
  if (series.length === 0 || categories.length === 0) {
@@ -16930,7 +16931,7 @@ function ChartDataSheet({
16930
16931
  highlightCell,
16931
16932
  onChange
16932
16933
  }) {
16933
- const { t } = chunkJKSUB7DR_js.useTranslation();
16934
+ const { t } = chunk5DBKW7F3_js.useTranslation();
16934
16935
  const ref = React108.useRef(null);
16935
16936
  React108.useLayoutEffect(() => {
16936
16937
  if (ref.current) {
@@ -16961,7 +16962,7 @@ function ChartDisplayOptions({
16961
16962
  hasGridlines,
16962
16963
  onToggleGridlines
16963
16964
  }) {
16964
- const { t } = chunkJKSUB7DR_js.useTranslation();
16965
+ const { t } = chunk5DBKW7F3_js.useTranslation();
16965
16966
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: CARD, children: [
16966
16967
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING, children: t("pptx.chart.display") }),
16967
16968
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
@@ -17038,7 +17039,7 @@ function ChartErrorBarOptions({
17038
17039
  canEdit,
17039
17040
  onSetErrorBars
17040
17041
  }) {
17041
- const { t } = chunkJKSUB7DR_js.useTranslation();
17042
+ const { t } = chunk5DBKW7F3_js.useTranslation();
17042
17043
  if (!ERROR_BAR_SUPPORTED_TYPES.has(chartType) || series.length === 0) {
17043
17044
  return null;
17044
17045
  }
@@ -17118,7 +17119,7 @@ function ChartFilteredSeriesOptions({
17118
17119
  onRestoreSeries,
17119
17120
  onSetDataLabelsRangeCache
17120
17121
  }) {
17121
- const { t } = chunkJKSUB7DR_js.useTranslation();
17122
+ const { t } = chunk5DBKW7F3_js.useTranslation();
17122
17123
  const filteredSeries = chartData.filteredSeries ?? [];
17123
17124
  const seriesWithRange = chartData.series.map((series, index) => ({ series, index })).filter(({ series }) => series.dataLabelOptions?.dataLabelsRange);
17124
17125
  if (filteredSeries.length === 0 && seriesWithRange.length === 0 && chartData.series.length <= 1) {
@@ -17198,7 +17199,7 @@ function ChartMarkerOptions({
17198
17199
  canEdit,
17199
17200
  onSetMarker
17200
17201
  }) {
17201
- const { t } = chunkJKSUB7DR_js.useTranslation();
17202
+ const { t } = chunk5DBKW7F3_js.useTranslation();
17202
17203
  const commitRecentColor = useRecentColorCommit();
17203
17204
  if (!MARKER_SUPPORTED_TYPES.has(chartType) || series.length === 0) {
17204
17205
  return null;
@@ -17307,7 +17308,7 @@ function ChartSeriesColorOptions({
17307
17308
  onSetColor,
17308
17309
  onToggleSecondaryAxis
17309
17310
  }) {
17310
- const { t } = chunkJKSUB7DR_js.useTranslation();
17311
+ const { t } = chunk5DBKW7F3_js.useTranslation();
17311
17312
  const series = chartData.series;
17312
17313
  if (series.length === 0) {
17313
17314
  return null;
@@ -17357,7 +17358,7 @@ function ChartSubtypeOptions({
17357
17358
  canEdit,
17358
17359
  onUpdateChartData
17359
17360
  }) {
17360
- const { t } = chunkJKSUB7DR_js.useTranslation();
17361
+ const { t } = chunk5DBKW7F3_js.useTranslation();
17361
17362
  if (chartData.chartType !== "bar3D" && chartData.chartType !== "radar" && chartData.chartType !== "surface") {
17362
17363
  return null;
17363
17364
  }
@@ -17423,7 +17424,7 @@ function ChartTrendlineOptions({
17423
17424
  canEdit,
17424
17425
  onSetTrendline
17425
17426
  }) {
17426
- const { t } = chunkJKSUB7DR_js.useTranslation();
17427
+ const { t } = chunk5DBKW7F3_js.useTranslation();
17427
17428
  if (!TRENDLINE_SUPPORTED_TYPES.has(chartType) || series.length === 0) {
17428
17429
  return null;
17429
17430
  }
@@ -17496,7 +17497,7 @@ function ChartTypeSelector({
17496
17497
  onUpdateChartData,
17497
17498
  onTitleChange
17498
17499
  }) {
17499
- const { t } = chunkJKSUB7DR_js.useTranslation();
17500
+ const { t } = chunk5DBKW7F3_js.useTranslation();
17500
17501
  const supportsGrouping = GROUPING_SUPPORTED_TYPES.has(chartType);
17501
17502
  const displayedType = pptx.resolveDisplayedChartType(chartData);
17502
17503
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: CARD, children: [
@@ -17577,7 +17578,7 @@ function RotationField({
17577
17578
  canEdit,
17578
17579
  onRotationPatch
17579
17580
  }) {
17580
- const { t } = chunkJKSUB7DR_js.useTranslation();
17581
+ const { t } = chunk5DBKW7F3_js.useTranslation();
17581
17582
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17582
17583
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: t("pptx.chart.userShapeRotation") }),
17583
17584
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -17599,7 +17600,7 @@ function FlipFields({
17599
17600
  canEdit,
17600
17601
  onFlipPatch
17601
17602
  }) {
17602
- const { t } = chunkJKSUB7DR_js.useTranslation();
17603
+ const { t } = chunk5DBKW7F3_js.useTranslation();
17603
17604
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17604
17605
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-1 cursor-pointer", children: [
17605
17606
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -17638,7 +17639,7 @@ function ChartUserShapePositionFields({
17638
17639
  onRotationPatch,
17639
17640
  onFlipPatch
17640
17641
  }) {
17641
- const { t } = chunkJKSUB7DR_js.useTranslation();
17642
+ const { t } = chunk5DBKW7F3_js.useTranslation();
17642
17643
  const update = (patch) => onPatch(row.path, patch);
17643
17644
  if (row.depth === 0) {
17644
17645
  const from = row.from;
@@ -17762,7 +17763,7 @@ function ChartUserShapeOptions({
17762
17763
  canEdit,
17763
17764
  onUpdateChartData
17764
17765
  }) {
17765
- const { t } = chunkJKSUB7DR_js.useTranslation();
17766
+ const { t } = chunk5DBKW7F3_js.useTranslation();
17766
17767
  const shapes = chartData.userShapes;
17767
17768
  const rows = pptx.listChartUserShapeRows(shapes);
17768
17769
  const kindLabel = (kind) => {
@@ -17920,8 +17921,8 @@ function ChartUserShapeOptions({
17920
17921
  }
17921
17922
  function ChartDataPanel({ selectedElement, canEdit, onUpdateElement }) {
17922
17923
  const chartData = selectedElement.chartData;
17923
- const followDataPoint = chunk73SDWM6K_js.useViewerOptionsContext().advanced.chartPropertiesFollowDataPoint;
17924
- const { selection: partSelection } = chunk73SDWM6K_js.useChartPartSelection();
17924
+ const followDataPoint = chunkVGU5S37T_js.useViewerOptionsContext().advanced.chartPropertiesFollowDataPoint;
17925
+ const { selection: partSelection } = chunkVGU5S37T_js.useChartPartSelection();
17925
17926
  const canvasPart = partSelection?.elementId === selectedElement.id ? partSelection.part : null;
17926
17927
  const title = chartData?.title;
17927
17928
  const chartType = chartData?.chartType;
@@ -18359,7 +18360,7 @@ function OleEditorDialog({
18359
18360
  element,
18360
18361
  onUpdateElement
18361
18362
  }) {
18362
- const { t } = chunkJKSUB7DR_js.useTranslation();
18363
+ const { t } = chunk5DBKW7F3_js.useTranslation();
18363
18364
  const dialogRef = React108.useRef(null);
18364
18365
  const fileInputRef = React108.useRef(null);
18365
18366
  const descriptor = pptx.buildOleEditDialogDescriptor(element);
@@ -18607,7 +18608,7 @@ function ConnectorArrowsSection({
18607
18608
  onUpdateShapeStyle,
18608
18609
  markDirty
18609
18610
  }) {
18610
- const { t } = chunkJKSUB7DR_js.useTranslation();
18611
+ const { t } = chunk5DBKW7F3_js.useTranslation();
18611
18612
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
18612
18613
  ["Start", "End"].map((end) => {
18613
18614
  const key = end === "Start" ? "connectorStartArrow" : "connectorEndArrow";
@@ -18626,7 +18627,7 @@ function ConnectorArrowsSection({
18626
18627
  },
18627
18628
  disabled: !canEdit,
18628
18629
  className: SELECT_CLS2,
18629
- children: chunkJKSUB7DR_js.CONNECTOR_ARROW_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.i18nKey) }, o.value))
18630
+ children: chunk5DBKW7F3_js.CONNECTOR_ARROW_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.i18nKey) }, o.value))
18630
18631
  }
18631
18632
  )
18632
18633
  ] }, end);
@@ -18650,7 +18651,7 @@ function ConnectorArrowsSection({
18650
18651
  },
18651
18652
  disabled: !canEdit,
18652
18653
  className: SELECT_CLS2,
18653
- children: chunkJKSUB7DR_js.ARROW_SIZE_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.i18nKey) }, o.value))
18654
+ children: chunk5DBKW7F3_js.ARROW_SIZE_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.i18nKey) }, o.value))
18654
18655
  }
18655
18656
  )
18656
18657
  ] }),
@@ -18669,7 +18670,7 @@ function ConnectorArrowsSection({
18669
18670
  },
18670
18671
  disabled: !canEdit,
18671
18672
  className: SELECT_CLS2,
18672
- children: chunkJKSUB7DR_js.ARROW_SIZE_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.i18nKey) }, o.value))
18673
+ children: chunk5DBKW7F3_js.ARROW_SIZE_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.i18nKey) }, o.value))
18673
18674
  }
18674
18675
  )
18675
18676
  ] })
@@ -18700,7 +18701,7 @@ function ConnectorPanel({
18700
18701
  function GroupInfoPanel({
18701
18702
  selectedElement
18702
18703
  }) {
18703
- const { t } = chunkJKSUB7DR_js.useTranslation();
18704
+ const { t } = chunk5DBKW7F3_js.useTranslation();
18704
18705
  if (selectedElement.type !== "group") {
18705
18706
  return null;
18706
18707
  }
@@ -18715,7 +18716,7 @@ function OlePropertiesPanel({
18715
18716
  canEdit,
18716
18717
  onUpdateElement
18717
18718
  }) {
18718
- const { t } = chunkJKSUB7DR_js.useTranslation();
18719
+ const { t } = chunk5DBKW7F3_js.useTranslation();
18719
18720
  const [isEditorOpen, setIsEditorOpen] = React108.useState(false);
18720
18721
  if (selectedElement.type !== "ole") {
18721
18722
  return null;
@@ -18760,7 +18761,7 @@ function OlePropertiesPanel({
18760
18761
  /* @__PURE__ */ jsxRuntime.jsx(
18761
18762
  "span",
18762
18763
  {
18763
- className: chunkJKSUB7DR_js.cn(
18764
+ className: chunk5DBKW7F3_js.cn(
18764
18765
  "inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium",
18765
18766
  ole.isLinked ? "bg-blue-500/20 text-blue-400" : "bg-green-500/20 text-green-400"
18766
18767
  ),
@@ -18813,7 +18814,7 @@ function LayerOrderButtons({
18813
18814
  "button",
18814
18815
  {
18815
18816
  type: "button",
18816
- className: chunkJKSUB7DR_js.cn("flex-1", BTN2),
18817
+ className: chunk5DBKW7F3_js.cn("flex-1", BTN2),
18817
18818
  disabled: !canEdit,
18818
18819
  onClick: () => onMoveLayer("forward"),
18819
18820
  children: "\u2191 Forward"
@@ -18823,7 +18824,7 @@ function LayerOrderButtons({
18823
18824
  "button",
18824
18825
  {
18825
18826
  type: "button",
18826
- className: chunkJKSUB7DR_js.cn("flex-1", BTN2),
18827
+ className: chunk5DBKW7F3_js.cn("flex-1", BTN2),
18827
18828
  disabled: !canEdit,
18828
18829
  onClick: () => onMoveLayer("backward"),
18829
18830
  children: "\u2193 Backward"
@@ -18837,7 +18838,7 @@ function ArtisticEffectsGallery({
18837
18838
  canEdit,
18838
18839
  updateEffects
18839
18840
  }) {
18840
- const { t } = chunkJKSUB7DR_js.useTranslation();
18841
+ const { t } = chunk5DBKW7F3_js.useTranslation();
18841
18842
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1 text-[11px]", children: [
18842
18843
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: t("pptx.image.artisticEffects") }),
18843
18844
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-4 gap-1", children: pptx.ARTISTIC_EFFECTS.map(([effectName, tKey, cssFilter]) => {
@@ -18847,7 +18848,7 @@ function ArtisticEffectsGallery({
18847
18848
  {
18848
18849
  type: "button",
18849
18850
  disabled: !canEdit,
18850
- className: chunkJKSUB7DR_js.cn(
18851
+ className: chunk5DBKW7F3_js.cn(
18851
18852
  "flex flex-col items-center gap-0.5 rounded border p-0.5 hover:bg-accent/50",
18852
18853
  isActive ? "border-primary bg-primary/10" : "border-border"
18853
18854
  ),
@@ -18882,7 +18883,7 @@ function ColorChangeSection({
18882
18883
  canEdit,
18883
18884
  updateEffects
18884
18885
  }) {
18885
- const { t } = chunkJKSUB7DR_js.useTranslation();
18886
+ const { t } = chunk5DBKW7F3_js.useTranslation();
18886
18887
  const cc = fx?.clrChange;
18887
18888
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1 text-[11px]", children: [
18888
18889
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center justify-between gap-2", children: [
@@ -18909,7 +18910,7 @@ function ColorChangeSection({
18909
18910
  DebouncedColorInput,
18910
18911
  {
18911
18912
  disabled: !canEdit,
18912
- value: chunkJKSUB7DR_js.normalizeHexColor(cc.clrFrom, "#ffffff"),
18913
+ value: chunk5DBKW7F3_js.normalizeHexColor(cc.clrFrom, "#ffffff"),
18913
18914
  className: "h-6 w-8 rounded border border-border bg-transparent cursor-pointer",
18914
18915
  onCommit: (hex) => updateEffects({
18915
18916
  clrChange: {
@@ -18927,7 +18928,7 @@ function ColorChangeSection({
18927
18928
  DebouncedColorInput,
18928
18929
  {
18929
18930
  disabled: !canEdit || Boolean(cc.clrToTransparent),
18930
- value: chunkJKSUB7DR_js.normalizeHexColor(cc.clrTo, "#000000"),
18931
+ value: chunk5DBKW7F3_js.normalizeHexColor(cc.clrTo, "#000000"),
18931
18932
  className: "h-6 w-8 rounded border border-border bg-transparent cursor-pointer",
18932
18933
  onCommit: (hex) => updateEffects({
18933
18934
  clrChange: {
@@ -18964,7 +18965,7 @@ function ColorWashSection({
18964
18965
  canEdit,
18965
18966
  updateEffects
18966
18967
  }) {
18967
- const { t } = chunkJKSUB7DR_js.useTranslation();
18968
+ const { t } = chunk5DBKW7F3_js.useTranslation();
18968
18969
  const wash = fx?.colorWash;
18969
18970
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1 text-[11px]", children: [
18970
18971
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center justify-between gap-2", children: [
@@ -18987,7 +18988,7 @@ function ColorWashSection({
18987
18988
  DebouncedColorInput,
18988
18989
  {
18989
18990
  disabled: !canEdit,
18990
- value: chunkJKSUB7DR_js.normalizeHexColor(wash.color, "#0066cc"),
18991
+ value: chunk5DBKW7F3_js.normalizeHexColor(wash.color, "#0066cc"),
18991
18992
  className: "h-6 w-8 rounded border border-border bg-transparent cursor-pointer",
18992
18993
  onCommit: (hex) => updateEffects({
18993
18994
  colorWash: { color: hex, opacity: wash.opacity ?? 40 }
@@ -19064,7 +19065,7 @@ function DuotonePanel({
19064
19065
  canEdit,
19065
19066
  onUpdateElement
19066
19067
  }) {
19067
- const { t } = chunkJKSUB7DR_js.useTranslation();
19068
+ const { t } = chunk5DBKW7F3_js.useTranslation();
19068
19069
  const effects = "imageEffects" in selectedElement ? selectedElement.imageEffects : void 0;
19069
19070
  const commitDuotone = React108.useCallback(
19070
19071
  (color1, color2) => {
@@ -19085,8 +19086,8 @@ function DuotonePanel({
19085
19086
  }
19086
19087
  });
19087
19088
  }, [effects, onUpdateElement]);
19088
- const shadowColor = chunkJKSUB7DR_js.normalizeHexColor(effects?.duotone?.color1, "#000000");
19089
- const highlightColor = chunkJKSUB7DR_js.normalizeHexColor(effects?.duotone?.color2, "#ffffff");
19089
+ const shadowColor = chunk5DBKW7F3_js.normalizeHexColor(effects?.duotone?.color1, "#000000");
19090
+ const highlightColor = chunk5DBKW7F3_js.normalizeHexColor(effects?.duotone?.color2, "#ffffff");
19090
19091
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2 text-[11px]", children: [
19091
19092
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-muted-foreground font-medium", children: t("pptx.image.duotone") }),
19092
19093
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
@@ -19117,7 +19118,7 @@ function DuotonePanel({
19117
19118
  ] }),
19118
19119
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
19119
19120
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-muted-foreground text-[10px]", children: t("pptx.image.duotonePresets") }),
19120
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-4 gap-1", children: chunk73SDWM6K_js.DUOTONE_PRESETS.map((preset) => /* @__PURE__ */ jsxRuntime.jsxs(
19121
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-4 gap-1", children: chunkVGU5S37T_js.DUOTONE_PRESETS.map((preset) => /* @__PURE__ */ jsxRuntime.jsxs(
19121
19122
  "button",
19122
19123
  {
19123
19124
  type: "button",
@@ -19153,7 +19154,7 @@ function ImageAdjustmentsPanel({
19153
19154
  canEdit,
19154
19155
  onUpdateElement
19155
19156
  }) {
19156
- const { t } = chunkJKSUB7DR_js.useTranslation();
19157
+ const { t } = chunk5DBKW7F3_js.useTranslation();
19157
19158
  const effects = React108.useMemo(
19158
19159
  () => "imageEffects" in selectedElement ? selectedElement.imageEffects : void 0,
19159
19160
  [selectedElement]
@@ -19254,7 +19255,7 @@ function ImageCropSection({
19254
19255
  canEdit,
19255
19256
  onUpdateElement
19256
19257
  }) {
19257
- const { t } = chunkJKSUB7DR_js.useTranslation();
19258
+ const { t } = chunk5DBKW7F3_js.useTranslation();
19258
19259
  if (!pptx$1.isImageLikeElement(selectedElement)) {
19259
19260
  return null;
19260
19261
  }
@@ -19272,7 +19273,7 @@ function ImageCropSection({
19272
19273
  max: MAX_CROP_PERCENT,
19273
19274
  disabled: !croppable,
19274
19275
  className: "accent-primary",
19275
- value: Math.round(chunkJKSUB7DR_js.clampCropValue(selectedElement[key]) * 100),
19276
+ value: Math.round(chunk5DBKW7F3_js.clampCropValue(selectedElement[key]) * 100),
19276
19277
  onChange: (e) => onUpdateElement({
19277
19278
  [key]: Number(e.target.value) / 100
19278
19279
  })
@@ -19319,7 +19320,7 @@ function ImagePropertiesPanel({
19319
19320
  canEdit,
19320
19321
  onUpdateElement
19321
19322
  }) {
19322
- const { t } = chunkJKSUB7DR_js.useTranslation();
19323
+ const { t } = chunk5DBKW7F3_js.useTranslation();
19323
19324
  const fx = selectedElement.imageEffects;
19324
19325
  const updateEffects = (patch) => {
19325
19326
  onUpdateElement({
@@ -19336,7 +19337,7 @@ function ImagePropertiesPanel({
19336
19337
  {
19337
19338
  rows: 2,
19338
19339
  disabled: !canEdit,
19339
- className: chunkJKSUB7DR_js.cn(INPUT2, "resize-none text-[11px]"),
19340
+ className: chunk5DBKW7F3_js.cn(INPUT2, "resize-none text-[11px]"),
19340
19341
  value: selectedElement.altText ?? "",
19341
19342
  onChange: (e) => onUpdateElement({
19342
19343
  altText: e.target.value
@@ -19524,7 +19525,7 @@ function InspectorFields({
19524
19525
  liveTarget,
19525
19526
  livePatch
19526
19527
  }) {
19527
- const { t } = chunkJKSUB7DR_js.useTranslation();
19528
+ const { t } = chunk5DBKW7F3_js.useTranslation();
19528
19529
  const views = pptx.resolveInspectorSections(sections, target);
19529
19530
  const change = (sectionId, fieldId, raw) => {
19530
19531
  const patch = pptx.inspectorFieldPatch(sections, sectionId, fieldId, target, raw);
@@ -19752,7 +19753,7 @@ function MediaInspector({
19752
19753
  durationSeconds,
19753
19754
  onUpdateElement
19754
19755
  }) {
19755
- const { t } = chunkJKSUB7DR_js.useTranslation();
19756
+ const { t } = chunk5DBKW7F3_js.useTranslation();
19756
19757
  const trimStartMs = element.trimStartMs ?? 0;
19757
19758
  const trimEndMs = element.trimEndMs ?? 0;
19758
19759
  const durationMs = durationSeconds * 1e3;
@@ -19982,7 +19983,7 @@ function MediaPlaybackBookmarks({
19982
19983
  onUpdateElement,
19983
19984
  onSeekTo
19984
19985
  }) {
19985
- const { t } = chunkJKSUB7DR_js.useTranslation();
19986
+ const { t } = chunk5DBKW7F3_js.useTranslation();
19986
19987
  const [newBookmarkLabel, setNewBookmarkLabel] = React108.useState("");
19987
19988
  const volumePercent = Math.round((element.volume ?? 1) * 100);
19988
19989
  const handleAddBookmark = React108.useCallback(() => {
@@ -20232,7 +20233,7 @@ function MediaPropertiesPanel({
20232
20233
  canEdit,
20233
20234
  onUpdateElement
20234
20235
  }) {
20235
- const { t } = chunkJKSUB7DR_js.useTranslation();
20236
+ const { t } = chunk5DBKW7F3_js.useTranslation();
20236
20237
  const mediaRef = React108.useRef(null);
20237
20238
  const [isPlaying, setIsPlaying] = React108.useState(false);
20238
20239
  const [currentTime, setCurrentTime] = React108.useState(0);
@@ -20466,7 +20467,7 @@ function AccessibilityTextSection({
20466
20467
  canEdit,
20467
20468
  onUpdateElement
20468
20469
  }) {
20469
- const { t } = chunkJKSUB7DR_js.useTranslation();
20470
+ const { t } = chunk5DBKW7F3_js.useTranslation();
20470
20471
  const fields = pptx.getNonVisualDescriptionFields(selectedElement);
20471
20472
  if (!fields.showAltText && !fields.showTitle) {
20472
20473
  return null;
@@ -20481,7 +20482,7 @@ function AccessibilityTextSection({
20481
20482
  rows: 2,
20482
20483
  disabled: !canEdit,
20483
20484
  placeholder: t("pptx.elementAccessibility.altTextPlaceholder"),
20484
- className: chunkJKSUB7DR_js.cn(INPUT2, "resize-none text-[11px]"),
20485
+ className: chunk5DBKW7F3_js.cn(INPUT2, "resize-none text-[11px]"),
20485
20486
  value: fields.altText,
20486
20487
  onChange: (e) => onUpdateElement({ altText: e.target.value })
20487
20488
  }
@@ -20495,7 +20496,7 @@ function AccessibilityTextSection({
20495
20496
  type: "text",
20496
20497
  disabled: !canEdit,
20497
20498
  placeholder: t("pptx.elementAccessibility.titlePlaceholder"),
20498
- className: chunkJKSUB7DR_js.cn(INPUT2, "text-[11px]"),
20499
+ className: chunk5DBKW7F3_js.cn(INPUT2, "text-[11px]"),
20499
20500
  value: fields.title,
20500
20501
  onChange: (e) => onUpdateElement({ title: e.target.value })
20501
20502
  }
@@ -20523,7 +20524,7 @@ function RecentColorsRow({
20523
20524
  disabled,
20524
20525
  onCommit
20525
20526
  }) {
20526
- const { t } = chunkJKSUB7DR_js.useTranslation();
20527
+ const { t } = chunk5DBKW7F3_js.useTranslation();
20527
20528
  const { recentColors, pushColor } = useRecentColors();
20528
20529
  const shown = recentColors.length > 0;
20529
20530
  const ref = React108.useRef(null);
@@ -20565,7 +20566,7 @@ function ThemeColorSwatchGrid({
20565
20566
  selectedHex,
20566
20567
  onPick
20567
20568
  }) {
20568
- const { t } = chunkJKSUB7DR_js.useTranslation();
20569
+ const { t } = chunk5DBKW7F3_js.useTranslation();
20569
20570
  const themeColorMap = useThemeColorMap();
20570
20571
  const columns = React108.useMemo(
20571
20572
  () => pptx.buildThemeColorSwatchGrid(themeColorMap, (key, params) => t(key, params)),
@@ -20612,7 +20613,7 @@ function SelectRow({
20612
20613
  options,
20613
20614
  onChange
20614
20615
  }) {
20615
- const { t } = chunkJKSUB7DR_js.useTranslation();
20616
+ const { t } = chunk5DBKW7F3_js.useTranslation();
20616
20617
  return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: `flex flex-col gap-1 ${span2 ? COL2 : ""}`, children: [
20617
20618
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: LBL, children: label }),
20618
20619
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -20636,14 +20637,14 @@ function ColorPickerRow({
20636
20637
  onChange,
20637
20638
  styleChange
20638
20639
  }) {
20639
- const { t } = chunkJKSUB7DR_js.useTranslation();
20640
+ const { t } = chunk5DBKW7F3_js.useTranslation();
20640
20641
  const { pushColor } = useRecentColors();
20641
20642
  const commit = (color, ref) => {
20642
20643
  onChange(color, ref);
20643
20644
  pushColor(color);
20644
20645
  };
20645
20646
  const handleEyedropper = async () => {
20646
- const color = await chunkJKSUB7DR_js.openNativeEyeDropper();
20647
+ const color = await chunk5DBKW7F3_js.openNativeEyeDropper();
20647
20648
  if (color) {
20648
20649
  commit(color);
20649
20650
  }
@@ -20716,7 +20717,7 @@ function GradientStopRow({
20716
20717
  onUpdate,
20717
20718
  allStops
20718
20719
  }) {
20719
- const { t } = chunkJKSUB7DR_js.useTranslation();
20720
+ const { t } = chunk5DBKW7F3_js.useTranslation();
20720
20721
  const { pushColor } = useRecentColors();
20721
20722
  const commitRecentColor = useRecentColorCommit();
20722
20723
  const patchStop = (patch) => {
@@ -20729,9 +20730,9 @@ function GradientStopRow({
20729
20730
  "input",
20730
20731
  {
20731
20732
  type: "color",
20732
- value: chunkJKSUB7DR_js.normalizeHexColor(stop2.color, "#3b82f6"),
20733
+ value: chunk5DBKW7F3_js.normalizeHexColor(stop2.color, "#3b82f6"),
20733
20734
  ref: commitRecentColor,
20734
- onChange: (e) => patchStop({ color: chunkJKSUB7DR_js.normalizeHexColor(e.target.value, "#3b82f6"), colorRef: void 0 }),
20735
+ onChange: (e) => patchStop({ color: chunk5DBKW7F3_js.normalizeHexColor(e.target.value, "#3b82f6"), colorRef: void 0 }),
20735
20736
  className: "h-7 w-10 rounded border border-border bg-muted"
20736
20737
  }
20737
20738
  ),
@@ -20806,7 +20807,7 @@ function FillAdvancedControls({
20806
20807
  onUpdateGradientStops,
20807
20808
  onSetFillColor: _onSetFillColor
20808
20809
  }) {
20809
- const { t } = chunkJKSUB7DR_js.useTranslation();
20810
+ const { t } = chunk5DBKW7F3_js.useTranslation();
20810
20811
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
20811
20812
  showGradient && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
20812
20813
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -20860,7 +20861,7 @@ function FillAdvancedControls({
20860
20861
  onClick: () => onUpdateGradientStops([
20861
20862
  ...gradientStops,
20862
20863
  {
20863
- color: chunkJKSUB7DR_js.normalizeHexColor(style?.fillColor, chunkJKSUB7DR_js.DEFAULT_FILL_COLOR),
20864
+ color: chunk5DBKW7F3_js.normalizeHexColor(style?.fillColor, chunk5DBKW7F3_js.DEFAULT_FILL_COLOR),
20864
20865
  position: 50,
20865
20866
  opacity: 1
20866
20867
  }
@@ -20874,9 +20875,9 @@ function FillAdvancedControls({
20874
20875
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${COL2} flex flex-col gap-2`, children: [
20875
20876
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: LBL, children: "Pattern" }),
20876
20877
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-8 gap-1 max-h-48 overflow-y-auto rounded border border-border p-2", children: PATTERN_PRESET_OPTIONS.map((opt) => {
20877
- const fgColor = chunkJKSUB7DR_js.normalizeHexColor(style?.fillColor, chunkJKSUB7DR_js.DEFAULT_FILL_COLOR);
20878
- const bgColor = chunkJKSUB7DR_js.normalizeHexColor(style?.fillPatternBackgroundColor, "#ffffff");
20879
- const svgPattern = chunkJKSUB7DR_js.getPatternSvg(opt.value, fgColor, bgColor);
20878
+ const fgColor = chunk5DBKW7F3_js.normalizeHexColor(style?.fillColor, chunk5DBKW7F3_js.DEFAULT_FILL_COLOR);
20879
+ const bgColor = chunk5DBKW7F3_js.normalizeHexColor(style?.fillPatternBackgroundColor, "#ffffff");
20880
+ const svgPattern = chunk5DBKW7F3_js.getPatternSvg(opt.value, fgColor, bgColor);
20880
20881
  const isSelected = (style.fillPatternPreset || "pct20") === opt.value;
20881
20882
  return /* @__PURE__ */ jsxRuntime.jsx(
20882
20883
  "button",
@@ -20909,7 +20910,7 @@ function FillAdvancedControls({
20909
20910
  {
20910
20911
  label: t("pptx.fillAdvanced.foregroundColor"),
20911
20912
  prefix: "pattern-fg",
20912
- value: chunkJKSUB7DR_js.normalizeHexColor(style?.fillColor, chunkJKSUB7DR_js.DEFAULT_FILL_COLOR),
20913
+ value: chunk5DBKW7F3_js.normalizeHexColor(style?.fillColor, chunk5DBKW7F3_js.DEFAULT_FILL_COLOR),
20913
20914
  disabled: isLine,
20914
20915
  onChange: (color) => onUpdateShapeStyle(patternForeground(color)),
20915
20916
  styleChange: patternForeground
@@ -20920,7 +20921,7 @@ function FillAdvancedControls({
20920
20921
  {
20921
20922
  label: t("pptx.fillAdvanced.backgroundColor"),
20922
20923
  prefix: "pattern-bg",
20923
- value: chunkJKSUB7DR_js.normalizeHexColor(style?.fillPatternBackgroundColor, "#ffffff"),
20924
+ value: chunk5DBKW7F3_js.normalizeHexColor(style?.fillPatternBackgroundColor, "#ffffff"),
20924
20925
  disabled: isLine,
20925
20926
  onChange: (color) => onUpdateShapeStyle(patternBackground(color)),
20926
20927
  styleChange: patternBackground
@@ -20985,7 +20986,7 @@ var QUICK_STYLES = pptx.buildQuickStylesGallery();
20985
20986
  function QuickStylesGallery({
20986
20987
  onUpdateShapeStyle
20987
20988
  }) {
20988
- const { t } = chunkJKSUB7DR_js.useTranslation();
20989
+ const { t } = chunk5DBKW7F3_js.useTranslation();
20989
20990
  const ref = React108.useRef(null);
20990
20991
  React108.useLayoutEffect(() => {
20991
20992
  const gallery = ref.current;
@@ -21022,14 +21023,14 @@ function StrokeEffectsSection({
21022
21023
  onUpdateShapeStyle,
21023
21024
  onSetStrokeColor
21024
21025
  }) {
21025
- const { t } = chunkJKSUB7DR_js.useTranslation();
21026
+ const { t } = chunk5DBKW7F3_js.useTranslation();
21026
21027
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
21027
21028
  /* @__PURE__ */ jsxRuntime.jsx(
21028
21029
  ColorPickerRow,
21029
21030
  {
21030
21031
  label: t("pptx.inspector.stroke"),
21031
21032
  prefix: "stroke",
21032
- value: chunkJKSUB7DR_js.normalizeHexColor(style?.strokeColor, chunkJKSUB7DR_js.DEFAULT_STROKE_COLOR),
21033
+ value: chunk5DBKW7F3_js.normalizeHexColor(style?.strokeColor, chunk5DBKW7F3_js.DEFAULT_STROKE_COLOR),
21033
21034
  selectedRef: style?.strokeColorRef,
21034
21035
  onChange: onSetStrokeColor,
21035
21036
  styleChange: (hex, current) => pptx.shapeOutlineChange(hex, void 0, current)
@@ -21072,7 +21073,7 @@ function FillStrokeProperties({
21072
21073
  onSetFillColor,
21073
21074
  onSetStrokeColor
21074
21075
  }) {
21075
- const { t } = chunkJKSUB7DR_js.useTranslation();
21076
+ const { t } = chunk5DBKW7F3_js.useTranslation();
21076
21077
  const line = isLineish(selectedElement, selectedShapeType);
21077
21078
  const style = selectedShapeStyle;
21078
21079
  const handleFillModeChange = (nextMode) => {
@@ -21088,10 +21089,10 @@ function FillStrokeProperties({
21088
21089
  return;
21089
21090
  }
21090
21091
  if (nextMode === "gradient") {
21091
- const existing = chunkJKSUB7DR_js.sanitizeGradientStops(style?.fillGradientStops);
21092
+ const existing = chunk5DBKW7F3_js.sanitizeGradientStops(style?.fillGradientStops);
21092
21093
  const stops = existing.length >= 2 ? existing : [
21093
21094
  {
21094
- color: chunkJKSUB7DR_js.normalizeHexColor(style?.fillColor, chunkJKSUB7DR_js.DEFAULT_FILL_COLOR),
21095
+ color: chunk5DBKW7F3_js.normalizeHexColor(style?.fillColor, chunk5DBKW7F3_js.DEFAULT_FILL_COLOR),
21095
21096
  position: 0,
21096
21097
  opacity: 1
21097
21098
  },
@@ -21116,7 +21117,7 @@ function FillStrokeProperties({
21116
21117
  onUpdateShapeStyle({ fillMode: "solid" });
21117
21118
  };
21118
21119
  const gradientStops = selectedGradientStops.length > 0 ? selectedGradientStops : [
21119
- { color: chunkJKSUB7DR_js.DEFAULT_FILL_COLOR, position: 0 },
21120
+ { color: chunk5DBKW7F3_js.DEFAULT_FILL_COLOR, position: 0 },
21120
21121
  { color: "#ffffff", position: 100 }
21121
21122
  ];
21122
21123
  const showGradient = style?.fillMode === "gradient" || selectedGradientStops.length > 0;
@@ -21143,7 +21144,7 @@ function FillStrokeProperties({
21143
21144
  {
21144
21145
  label: t("pptx.fill.fill"),
21145
21146
  prefix: "fill",
21146
- value: chunkJKSUB7DR_js.normalizeHexColor(style?.fillColor, chunkJKSUB7DR_js.DEFAULT_FILL_COLOR),
21147
+ value: chunk5DBKW7F3_js.normalizeHexColor(style?.fillColor, chunk5DBKW7F3_js.DEFAULT_FILL_COLOR),
21147
21148
  selectedRef: style?.fillColorRef,
21148
21149
  disabled: line,
21149
21150
  onChange: onSetFillColor,
@@ -21181,7 +21182,7 @@ function Text3DProperties({
21181
21182
  ts,
21182
21183
  onUpdateTextStyle
21183
21184
  }) {
21184
- const { t } = chunkJKSUB7DR_js.useTranslation();
21185
+ const { t } = chunk5DBKW7F3_js.useTranslation();
21185
21186
  const commitRecentColor = useRecentColorCommit();
21186
21187
  const t3d = ts?.text3d;
21187
21188
  const hasExtrusion = Boolean(t3d?.extrusionHeight && t3d.extrusionHeight > 0);
@@ -21228,7 +21229,7 @@ function Text3DProperties({
21228
21229
  "input",
21229
21230
  {
21230
21231
  type: "color",
21231
- value: chunkJKSUB7DR_js.normalizeHexColor(t3d?.extrusionColor, "#888888"),
21232
+ value: chunk5DBKW7F3_js.normalizeHexColor(t3d?.extrusionColor, "#888888"),
21232
21233
  ref: commitRecentColor,
21233
21234
  onChange: (e) => update3d({ extrusionColor: e.target.value }),
21234
21235
  className: COLOR_CLS
@@ -21395,7 +21396,7 @@ function AdvancedTextFormatting({
21395
21396
  onUpdateTextStyle,
21396
21397
  numChange
21397
21398
  }) {
21398
- const { t } = chunkJKSUB7DR_js.useTranslation();
21399
+ const { t } = chunk5DBKW7F3_js.useTranslation();
21399
21400
  const commitRecentColor = useRecentColorCommit();
21400
21401
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 rounded border border-border bg-card p-2 space-y-2", children: [
21401
21402
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[11px] uppercase tracking-wide text-muted-foreground", children: t("pptx.textProperties.advancedTextHeading") }),
@@ -21417,7 +21418,7 @@ function AdvancedTextFormatting({
21417
21418
  "input",
21418
21419
  {
21419
21420
  type: "color",
21420
- value: chunkJKSUB7DR_js.normalizeHexColor(ts?.highlightColor, "#ffff00"),
21421
+ value: chunk5DBKW7F3_js.normalizeHexColor(ts?.highlightColor, "#ffff00"),
21421
21422
  ref: commitRecentColor,
21422
21423
  onChange: (e) => onUpdateTextStyle({ highlightColor: e.target.value }),
21423
21424
  disabled: !canEdit,
@@ -21559,7 +21560,7 @@ function TextReflectionSection({
21559
21560
  onUpdateTextStyle,
21560
21561
  numChange
21561
21562
  }) {
21562
- const { t } = chunkJKSUB7DR_js.useTranslation();
21563
+ const { t } = chunk5DBKW7F3_js.useTranslation();
21563
21564
  const hasReflection = Boolean(ts?.textReflection);
21564
21565
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
21565
21566
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "inline-flex items-center gap-2 text-foreground", children: [
@@ -21667,7 +21668,7 @@ function TextEffectsPanel({
21667
21668
  onUpdateTextStyle,
21668
21669
  numChange
21669
21670
  }) {
21670
- const { t } = chunkJKSUB7DR_js.useTranslation();
21671
+ const { t } = chunk5DBKW7F3_js.useTranslation();
21671
21672
  const commitRecentColor = useRecentColorCommit();
21672
21673
  const hasShadow = Boolean(
21673
21674
  ts?.textShadowColor || typeof ts?.textShadowBlur === "number" && ts.textShadowBlur > 0
@@ -21713,7 +21714,7 @@ function TextEffectsPanel({
21713
21714
  "input",
21714
21715
  {
21715
21716
  type: "color",
21716
- value: chunkJKSUB7DR_js.normalizeHexColor(ts?.textShadowColor, "#000000"),
21717
+ value: chunk5DBKW7F3_js.normalizeHexColor(ts?.textShadowColor, "#000000"),
21717
21718
  ref: commitRecentColor,
21718
21719
  onChange: (e) => onUpdateTextStyle({ textShadowColor: e.target.value }),
21719
21720
  className: COLOR_CLS2
@@ -21818,7 +21819,7 @@ function TextEffectsPanel({
21818
21819
  "input",
21819
21820
  {
21820
21821
  type: "color",
21821
- value: chunkJKSUB7DR_js.normalizeHexColor(ts?.textGlowColor, "#ffff00"),
21822
+ value: chunk5DBKW7F3_js.normalizeHexColor(ts?.textGlowColor, "#ffff00"),
21822
21823
  ref: commitRecentColor,
21823
21824
  onChange: (e) => onUpdateTextStyle({ textGlowColor: e.target.value }),
21824
21825
  className: COLOR_CLS2
@@ -21868,7 +21869,7 @@ function TextWarpGallery({
21868
21869
  ts,
21869
21870
  onUpdateTextStyle
21870
21871
  }) {
21871
- const { t } = chunkJKSUB7DR_js.useTranslation();
21872
+ const { t } = chunk5DBKW7F3_js.useTranslation();
21872
21873
  const [expanded, setExpanded] = React108__default.default.useState(false);
21873
21874
  const currentPreset = ts?.textWarpPreset || "textNoShape";
21874
21875
  const descriptor = React108.useMemo(() => pptx.buildTextWarpGallery(ts?.textWarpPreset), [ts?.textWarpPreset]);
@@ -21949,7 +21950,7 @@ function ShapeTextPanels({
21949
21950
  onUpdateElementStyle,
21950
21951
  onUpdateTextStyle
21951
21952
  }) {
21952
- const { t } = chunkJKSUB7DR_js.useTranslation();
21953
+ const { t } = chunk5DBKW7F3_js.useTranslation();
21953
21954
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
21954
21955
  pptx$1.hasShapeProperties(selectedElement) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: CARD2, children: [
21955
21956
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING2, children: t("pptx.shape.type", "Shape Type") }),
@@ -21958,11 +21959,11 @@ function ShapeTextPanels({
21958
21959
  {
21959
21960
  value: selectedElement.shapeType || "rect",
21960
21961
  disabled: !canEdit,
21961
- className: chunkJKSUB7DR_js.cn(INPUT2, "w-full"),
21962
+ className: chunk5DBKW7F3_js.cn(INPUT2, "w-full"),
21962
21963
  onChange: (e) => onUpdateElement({
21963
21964
  shapeType: e.target.value
21964
21965
  }),
21965
- children: chunkJKSUB7DR_js.SHAPE_PRESETS.filter((p) => p.type !== "connector").map((p) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: p.type, children: t(p.i18nKey) }, p.type))
21966
+ children: chunk5DBKW7F3_js.SHAPE_PRESETS.filter((p) => p.type !== "connector").map((p) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: p.type, children: t(p.i18nKey) }, p.type))
21966
21967
  }
21967
21968
  )
21968
21969
  ] }),
@@ -21974,7 +21975,7 @@ function ShapeTextPanels({
21974
21975
  selectedElement,
21975
21976
  selectedShapeStyle: selectedElement.shapeStyle,
21976
21977
  selectedShapeType: selectedElement.shapeType,
21977
- selectedGradientStops: chunkJKSUB7DR_js.sanitizeGradientStops(
21978
+ selectedGradientStops: chunk5DBKW7F3_js.sanitizeGradientStops(
21978
21979
  selectedElement.shapeStyle?.fillGradientStops
21979
21980
  ),
21980
21981
  canEdit,
@@ -22010,7 +22011,7 @@ function ShapeTextPanels({
22010
22011
  {
22011
22012
  disabled: !canEdit,
22012
22013
  "aria-label": "Text Color",
22013
- value: chunkJKSUB7DR_js.normalizeHexColor(selectedElement.textStyle?.color, "#000000"),
22014
+ value: chunk5DBKW7F3_js.normalizeHexColor(selectedElement.textStyle?.color, "#000000"),
22014
22015
  className: "w-full h-7 rounded border border-border bg-transparent cursor-pointer",
22015
22016
  onApply: (hex) => onUpdateTextStyle({ color: hex, colorRef: void 0 }),
22016
22017
  patch: textColorPatch
@@ -22101,7 +22102,7 @@ function TextFormatToggle({
22101
22102
  {
22102
22103
  type: "button",
22103
22104
  disabled,
22104
- className: chunkJKSUB7DR_js.cn(
22105
+ className: chunk5DBKW7F3_js.cn(
22105
22106
  "px-2 py-1 rounded text-[11px] transition-colors max-md:min-w-[44px]! max-md:min-h-[44px]!",
22106
22107
  italic && "italic",
22107
22108
  underline && "underline",
@@ -22270,7 +22271,7 @@ function SmartArtLayoutSwitcher({
22270
22271
  canEdit,
22271
22272
  onUpdateSmartArt
22272
22273
  }) {
22273
- const { t } = chunkJKSUB7DR_js.useTranslation();
22274
+ const { t } = chunk5DBKW7F3_js.useTranslation();
22274
22275
  const currentLayout = smartArtData.resolvedLayoutType ?? "list";
22275
22276
  const handleLayoutSwitch = (newLayout) => {
22276
22277
  if (!canEdit || newLayout === currentLayout) {
@@ -22289,7 +22290,7 @@ function SmartArtLayoutSwitcher({
22289
22290
  type: "button",
22290
22291
  "data-testid": `smartart-layout-${type}`,
22291
22292
  disabled: !canEdit,
22292
- className: chunkJKSUB7DR_js.cn(
22293
+ className: chunk5DBKW7F3_js.cn(
22293
22294
  "flex flex-col items-center gap-0.5 rounded border p-1.5 transition-colors",
22294
22295
  "text-[9px] leading-tight",
22295
22296
  isActive ? "border-primary bg-primary/15 text-primary" : "border-border text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -22316,7 +22317,7 @@ function SmartArtStyleControls({
22316
22317
  onChangeColorScheme,
22317
22318
  onChangeStyle
22318
22319
  }) {
22319
- const { t } = chunkJKSUB7DR_js.useTranslation();
22320
+ const { t } = chunk5DBKW7F3_js.useTranslation();
22320
22321
  const translate = React108__default.default.useCallback((key) => t(key), [t]);
22321
22322
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
22322
22323
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex flex-col gap-1 text-[11px]", children: [
@@ -22327,7 +22328,7 @@ function SmartArtStyleControls({
22327
22328
  disabled: !canEdit,
22328
22329
  "data-testid": "smartart-color-scheme",
22329
22330
  "aria-label": t("pptx.smartart.colorScheme"),
22330
- className: chunkJKSUB7DR_js.cn(INPUT2, "w-full"),
22331
+ className: chunk5DBKW7F3_js.cn(INPUT2, "w-full"),
22331
22332
  value: colorScheme,
22332
22333
  onChange: (e) => onChangeColorScheme(e.target.value),
22333
22334
  children: colorSchemes.map((cs) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: cs, children: pptx.schemaLabel(pptx.SMARTART_COLOR_SCHEME_LABEL_KEYS, cs, translate) }, cs))
@@ -22342,7 +22343,7 @@ function SmartArtStyleControls({
22342
22343
  type: "button",
22343
22344
  disabled: !canEdit,
22344
22345
  "aria-pressed": style === s,
22345
- className: chunkJKSUB7DR_js.cn(
22346
+ className: chunk5DBKW7F3_js.cn(
22346
22347
  "flex-1 px-2 py-1 text-[10px] rounded border transition-colors",
22347
22348
  style === s ? "border-primary bg-primary/20 text-primary" : "border-border text-muted-foreground hover:bg-muted"
22348
22349
  ),
@@ -22368,14 +22369,14 @@ function SmartArtPropertiesPanel({
22368
22369
  onUpdateElement,
22369
22370
  box
22370
22371
  }) {
22371
- const { t } = chunkJKSUB7DR_js.useTranslation();
22372
+ const { t } = chunk5DBKW7F3_js.useTranslation();
22372
22373
  const { pushColor } = useRecentColors();
22373
22374
  const paneRef = React108__default.default.useRef(null);
22374
22375
  const applySmartArtData = (newData) => {
22375
22376
  const reflowed = box ? pptx.rebuildDrawingShapesIfCleared(
22376
22377
  newData,
22377
22378
  newData.layout,
22378
- chunk73SDWM6K_js.resolveSmartArtDataPalette(newData),
22379
+ chunkVGU5S37T_js.resolveSmartArtDataPalette(newData),
22379
22380
  newData.style ?? "flat",
22380
22381
  "inspector",
22381
22382
  box
@@ -22446,9 +22447,9 @@ function TableDataGrid({
22446
22447
  canEdit,
22447
22448
  onUpdateElement
22448
22449
  }) {
22449
- const { t } = chunkJKSUB7DR_js.useTranslation();
22450
+ const { t } = chunk5DBKW7F3_js.useTranslation();
22450
22451
  const grid = pptx.buildTableDataGrid(tableElement);
22451
- const { viewportWidth } = chunk73SDWM6K_js.useIsMobile();
22452
+ const { viewportWidth } = chunkVGU5S37T_js.useIsMobile();
22452
22453
  const gridPlan = pptx.getDenseGridLayoutPlan(viewportWidth);
22453
22454
  const touchTargetPx = pptx.getDensePanelTouchTargetPx(viewportWidth);
22454
22455
  const stickyGutterClass = gridPlan.stickyFirstColumn ? "sticky left-0 z-10" : "";
@@ -22612,7 +22613,7 @@ function TableCellPatternFill({
22612
22613
  canEdit,
22613
22614
  onUpdateCellStyle
22614
22615
  }) {
22615
- const { t } = chunkJKSUB7DR_js.useTranslation();
22616
+ const { t } = chunk5DBKW7F3_js.useTranslation();
22616
22617
  const commitRecentColor = useRecentColorCommit();
22617
22618
  const translate = (key) => t(key);
22618
22619
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
@@ -22667,7 +22668,7 @@ function TableCellAdvancedFill({
22667
22668
  canEdit,
22668
22669
  onUpdateCellStyle
22669
22670
  }) {
22670
- const { t } = chunkJKSUB7DR_js.useTranslation();
22671
+ const { t } = chunk5DBKW7F3_js.useTranslation();
22671
22672
  const fillMode = cellStyle.fillMode ?? "solid";
22672
22673
  const handleFillModeChange = (mode) => {
22673
22674
  const next = mode;
@@ -22755,7 +22756,7 @@ function GradientControls({
22755
22756
  canEdit,
22756
22757
  onUpdateCellStyle
22757
22758
  }) {
22758
- const { t } = chunkJKSUB7DR_js.useTranslation();
22759
+ const { t } = chunk5DBKW7F3_js.useTranslation();
22759
22760
  const commitRecentColor = useRecentColorCommit();
22760
22761
  const stops = cellStyle.gradientFillStops ?? [];
22761
22762
  const gradType = cellStyle.gradientFillType ?? "linear";
@@ -22853,7 +22854,7 @@ function TableCellColorField({
22853
22854
  disabled,
22854
22855
  onCommit
22855
22856
  }) {
22856
- const hex = chunkJKSUB7DR_js.normalizeHexColor(value, fallback);
22857
+ const hex = chunk5DBKW7F3_js.normalizeHexColor(value, fallback);
22857
22858
  return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex flex-col gap-1", children: [
22858
22859
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: label }),
22859
22860
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -22883,7 +22884,7 @@ function TableCellFormattingPanel({
22883
22884
  onUpdateTableData,
22884
22885
  onUpdateMergeRows
22885
22886
  }) {
22886
- const { t } = chunkJKSUB7DR_js.useTranslation();
22887
+ const { t } = chunk5DBKW7F3_js.useTranslation();
22887
22888
  const { rowIndex, columnIndex } = tableEditorState;
22888
22889
  const cell = td.rows[rowIndex]?.cells[columnIndex];
22889
22890
  if (!cell) {
@@ -22961,7 +22962,7 @@ function TableCellFormattingPanel({
22961
22962
  {
22962
22963
  type: "button",
22963
22964
  disabled: !canEdit,
22964
- className: chunkJKSUB7DR_js.cn(
22965
+ className: chunk5DBKW7F3_js.cn(
22965
22966
  "px-2 py-1 rounded text-[11px] transition-colors",
22966
22967
  cls,
22967
22968
  cs[key] ? "bg-primary text-white" : "bg-muted hover:bg-accent"
@@ -22980,7 +22981,7 @@ function TableCellFormattingPanel({
22980
22981
  {
22981
22982
  type: "button",
22982
22983
  disabled: !canEdit,
22983
- className: chunkJKSUB7DR_js.cn(
22984
+ className: chunk5DBKW7F3_js.cn(
22984
22985
  "px-2 py-1 rounded text-[11px] transition-colors",
22985
22986
  cs.align === val ? "bg-primary text-white" : "bg-muted hover:bg-accent"
22986
22987
  ),
@@ -22998,7 +22999,7 @@ function TableCellFormattingPanel({
22998
22999
  {
22999
23000
  type: "button",
23000
23001
  disabled: !canEdit,
23001
- className: chunkJKSUB7DR_js.cn(
23002
+ className: chunk5DBKW7F3_js.cn(
23002
23003
  "px-2 py-1 rounded text-[11px] transition-colors",
23003
23004
  cs.vAlign === val ? "bg-primary text-white" : "bg-muted hover:bg-accent"
23004
23005
  ),
@@ -23021,7 +23022,7 @@ function TableCellFormattingPanel({
23021
23022
  DebouncedColorInput,
23022
23023
  {
23023
23024
  disabled: !canEdit,
23024
- value: chunkJKSUB7DR_js.normalizeHexColor(cs[colorKey], "#374151"),
23025
+ value: chunk5DBKW7F3_js.normalizeHexColor(cs[colorKey], "#374151"),
23025
23026
  className: "w-7 h-6 rounded border border-border bg-transparent cursor-pointer shrink-0",
23026
23027
  onCommit: (hex) => updateCellStyle({ [colorKey]: hex })
23027
23028
  }
@@ -23031,7 +23032,7 @@ function TableCellFormattingPanel({
23031
23032
  {
23032
23033
  type: "number",
23033
23034
  disabled: !canEdit,
23034
- className: chunkJKSUB7DR_js.cn(INPUT2, "w-14"),
23035
+ className: chunk5DBKW7F3_js.cn(INPUT2, "w-14"),
23035
23036
  min: 0,
23036
23037
  max: 10,
23037
23038
  value: pptx.inspectorNumber(cs[widthKey], 1),
@@ -23047,7 +23048,7 @@ function TableCellFormattingPanel({
23047
23048
  {
23048
23049
  type: "button",
23049
23050
  disabled: !canEdit,
23050
- className: chunkJKSUB7DR_js.cn(BTN2, "text-center"),
23051
+ className: chunk5DBKW7F3_js.cn(BTN2, "text-center"),
23051
23052
  onClick: () => {
23052
23053
  const newRows = pptx.computeMergeCellRight(td, rowIndex, columnIndex);
23053
23054
  if (newRows) {
@@ -23062,7 +23063,7 @@ function TableCellFormattingPanel({
23062
23063
  {
23063
23064
  type: "button",
23064
23065
  disabled: !canEdit,
23065
- className: chunkJKSUB7DR_js.cn(BTN2, "text-center"),
23066
+ className: chunk5DBKW7F3_js.cn(BTN2, "text-center"),
23066
23067
  onClick: () => {
23067
23068
  const newRows = pptx.computeMergeCellDown(td, rowIndex, columnIndex);
23068
23069
  if (newRows) {
@@ -23077,7 +23078,7 @@ function TableCellFormattingPanel({
23077
23078
  {
23078
23079
  type: "button",
23079
23080
  disabled: !canEdit,
23080
- className: chunkJKSUB7DR_js.cn(BTN2, "text-center"),
23081
+ className: chunk5DBKW7F3_js.cn(BTN2, "text-center"),
23081
23082
  onClick: () => {
23082
23083
  const newRows = pptx.computeSplitCell(td, rowIndex, columnIndex);
23083
23084
  if (newRows) {
@@ -23096,7 +23097,7 @@ function TableStyleEditorFields({
23096
23097
  canEdit,
23097
23098
  onEdit
23098
23099
  }) {
23099
- const { t } = chunkJKSUB7DR_js.useTranslation();
23100
+ const { t } = chunk5DBKW7F3_js.useTranslation();
23100
23101
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
23101
23102
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
23102
23103
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING2, children: t("pptx.tableStyleEditor.fillSection") }),
@@ -23201,7 +23202,7 @@ function BorderSideRow({
23201
23202
  canEdit,
23202
23203
  onEdit
23203
23204
  }) {
23204
- const { t } = chunkJKSUB7DR_js.useTranslation();
23205
+ const { t } = chunk5DBKW7F3_js.useTranslation();
23205
23206
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 text-[11px]", children: [
23206
23207
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-28 shrink-0 text-muted-foreground", children: t(pptx.TABLE_STYLE_BORDER_SIDE_LABEL_KEYS[side]) }),
23207
23208
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -23258,7 +23259,7 @@ function TableStyleEditor({
23258
23259
  onAssignStyle,
23259
23260
  onClose
23260
23261
  }) {
23261
- const { t } = chunkJKSUB7DR_js.useTranslation();
23262
+ const { t } = chunk5DBKW7F3_js.useTranslation();
23262
23263
  const themeColorMap = useThemeColorMap();
23263
23264
  const [activeStyleId, setActiveStyleId] = React108.useState(
23264
23265
  styleId ? pptx$1.normalizeTableStyleGuid(styleId) : ""
@@ -23350,7 +23351,7 @@ function TablePropertiesPanel({
23350
23351
  onTableStyleMapChange,
23351
23352
  onDeleteTableStyle
23352
23353
  }) {
23353
- const { t } = chunkJKSUB7DR_js.useTranslation();
23354
+ const { t } = chunk5DBKW7F3_js.useTranslation();
23354
23355
  const [showStyleEditor, setShowStyleEditor] = React108.useState(false);
23355
23356
  const td = tableElement.tableData;
23356
23357
  if (!td) {
@@ -23432,7 +23433,7 @@ function TablePropertiesPanel({
23432
23433
  ] }),
23433
23434
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: CARD2, children: [
23434
23435
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING2, children: t("pptx.table.stylePresets") }),
23435
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-3 gap-1.5", children: chunkJKSUB7DR_js.TABLE_STYLE_PRESETS.map((preset) => /* @__PURE__ */ jsxRuntime.jsx(
23436
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-3 gap-1.5", children: chunk5DBKW7F3_js.TABLE_STYLE_PRESETS.map((preset) => /* @__PURE__ */ jsxRuntime.jsx(
23436
23437
  "button",
23437
23438
  {
23438
23439
  type: "button",
@@ -23580,7 +23581,7 @@ function ElementInspectorBody({
23580
23581
  onUpdateTextStyle,
23581
23582
  onMoveLayer
23582
23583
  }) {
23583
- const { t } = chunkJKSUB7DR_js.useTranslation();
23584
+ const { t } = chunk5DBKW7F3_js.useTranslation();
23584
23585
  const isLocked = pptx.isElementLocked(selectedElement);
23585
23586
  const handleToggleLock = () => {
23586
23587
  if (!canEdit) {
@@ -23730,7 +23731,7 @@ function CommentMentionTextarea({
23730
23731
  className,
23731
23732
  ariaLabel
23732
23733
  }) {
23733
- const { t } = chunkJKSUB7DR_js.useTranslation();
23734
+ const { t } = chunk5DBKW7F3_js.useTranslation();
23734
23735
  const textareaRef = React108.useRef(null);
23735
23736
  const [caret, setCaret] = React108.useState(value.length);
23736
23737
  const [highlighted, setHighlighted] = React108.useState(0);
@@ -23819,7 +23820,7 @@ function CommentMentionTextarea({
23819
23820
  "data-testid": "pptx-comment-mention-option",
23820
23821
  role: "option",
23821
23822
  "aria-selected": index === safeHighlighted,
23822
- className: chunkJKSUB7DR_js.cn(
23823
+ className: chunk5DBKW7F3_js.cn(
23823
23824
  "block w-full px-2 py-1 text-left text-[11px] hover:bg-accent",
23824
23825
  index === safeHighlighted && "bg-accent"
23825
23826
  ),
@@ -23866,7 +23867,7 @@ function InspectorCommentReplyForm({
23866
23867
  onSubmit,
23867
23868
  onCancel
23868
23869
  }) {
23869
- const { t } = chunkJKSUB7DR_js.useTranslation();
23870
+ const { t } = chunk5DBKW7F3_js.useTranslation();
23870
23871
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 space-y-1.5 pl-3 border-l-2 border-l-primary/40", children: [
23871
23872
  /* @__PURE__ */ jsxRuntime.jsx(
23872
23873
  CommentMentionTextarea,
@@ -23932,7 +23933,7 @@ function InspectorCommentRow({
23932
23933
  onSelectElement,
23933
23934
  depth = 0
23934
23935
  }) {
23935
- const { t } = chunkJKSUB7DR_js.useTranslation();
23936
+ const { t } = chunk5DBKW7F3_js.useTranslation();
23936
23937
  const isEditing = editingCommentId === comment.id;
23937
23938
  const isReplying = replyingToCommentId === comment.id;
23938
23939
  const replyDraft = replyDraftByCommentId[comment.id] ?? "";
@@ -23942,7 +23943,7 @@ function InspectorCommentRow({
23942
23943
  return /* @__PURE__ */ jsxRuntime.jsxs(
23943
23944
  "div",
23944
23945
  {
23945
- className: chunkJKSUB7DR_js.cn(
23946
+ className: chunk5DBKW7F3_js.cn(
23946
23947
  "rounded border border-border bg-card p-2",
23947
23948
  depth > 0 && "ml-3 border-l-2 border-l-primary/40"
23948
23949
  ),
@@ -23956,7 +23957,7 @@ function InspectorCommentRow({
23956
23957
  t("pptx.comments.resolved")
23957
23958
  ] })
23958
23959
  ] }),
23959
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] text-muted-foreground flex-shrink-0", children: chunkJKSUB7DR_js.formatCommentTimestamp(comment.createdAt) })
23960
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] text-muted-foreground flex-shrink-0", children: chunk5DBKW7F3_js.formatCommentTimestamp(comment.createdAt) })
23960
23961
  ] }),
23961
23962
  comment.elementId && (targetElement ? /* @__PURE__ */ jsxRuntime.jsxs(
23962
23963
  "button",
@@ -23964,12 +23965,12 @@ function InspectorCommentRow({
23964
23965
  type: "button",
23965
23966
  className: "mt-1 inline-flex items-center gap-1 rounded bg-primary/20 px-1.5 py-0.5 text-[10px] text-primary hover:bg-primary/30 transition-colors",
23966
23967
  title: t("pptx.comments.commentingOn", {
23967
- element: chunkJKSUB7DR_js.getElementLabel(targetElement)
23968
+ element: chunk5DBKW7F3_js.getElementLabel(targetElement)
23968
23969
  }),
23969
23970
  onClick: () => onSelectElement(targetElement.id),
23970
23971
  children: [
23971
23972
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuType, { className: "h-2.5 w-2.5" }),
23972
- chunkJKSUB7DR_js.getElementLabel(targetElement)
23973
+ chunk5DBKW7F3_js.getElementLabel(targetElement)
23973
23974
  ]
23974
23975
  }
23975
23976
  ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-1 inline-flex items-center gap-1 rounded bg-muted/60 px-1.5 py-0.5 text-[10px] text-muted-foreground", children: t("pptx.comments.deletedElement") })),
@@ -24038,7 +24039,7 @@ function InspectorCommentRow({
24038
24039
  "button",
24039
24040
  {
24040
24041
  type: "button",
24041
- className: chunkJKSUB7DR_js.cn(
24042
+ className: chunk5DBKW7F3_js.cn(
24042
24043
  "inline-flex items-center justify-center p-1.5 border-l border-border transition-colors",
24043
24044
  comment.resolved ? "bg-green-900/40 text-green-300 hover:bg-green-900/60" : "hover:bg-accent text-foreground hover:text-foreground"
24044
24045
  ),
@@ -24144,7 +24145,7 @@ function InspectorCommentsSection({
24144
24145
  onSubmitReply,
24145
24146
  onSelectElement
24146
24147
  }) {
24147
- const { t } = chunkJKSUB7DR_js.useTranslation();
24148
+ const { t } = chunk5DBKW7F3_js.useTranslation();
24148
24149
  const HEADING_CLS = "text-[11px] uppercase tracking-wide text-muted-foreground";
24149
24150
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
24150
24151
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
@@ -24181,7 +24182,7 @@ function InspectorCommentsSection({
24181
24182
  selectedElement && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-1 rounded bg-primary/20 px-1.5 py-0.5 text-[10px] text-primary", children: [
24182
24183
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuType, { className: "h-2.5 w-2.5" }),
24183
24184
  t("pptx.comments.commentingOn", {
24184
- element: chunkJKSUB7DR_js.getElementLabel(selectedElement)
24185
+ element: chunk5DBKW7F3_js.getElementLabel(selectedElement)
24185
24186
  })
24186
24187
  ] }),
24187
24188
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -24192,7 +24193,7 @@ function InspectorCommentsSection({
24192
24193
  authors: commentAuthors,
24193
24194
  rows: 2,
24194
24195
  placeholder: selectedElement ? t("pptx.comments.addOnElement", {
24195
- element: chunkJKSUB7DR_js.getElementLabel(selectedElement)
24196
+ element: chunk5DBKW7F3_js.getElementLabel(selectedElement)
24196
24197
  }) : t("pptx.comments.addPlaceholder"),
24197
24198
  className: "w-full bg-muted border border-border rounded px-2 py-1 text-xs resize-y outline-none focus:border-primary",
24198
24199
  onChange: onSetCommentDraft,
@@ -24205,7 +24206,7 @@ function InspectorCommentsSection({
24205
24206
  type: "button",
24206
24207
  onClick: onAddComment,
24207
24208
  disabled: !commentDraft.trim(),
24208
- className: chunkJKSUB7DR_js.cn(
24209
+ className: chunk5DBKW7F3_js.cn(
24209
24210
  "w-full inline-flex items-center justify-center gap-1 rounded px-2 py-1 text-[11px] font-medium transition-colors max-md:min-h-[44px]!",
24210
24211
  commentDraft.trim() ? "bg-primary hover:bg-primary/80 text-white" : "bg-muted text-muted-foreground cursor-not-allowed"
24211
24212
  ),
@@ -24230,7 +24231,7 @@ function InspectorElementsTab({
24230
24231
  onSelectElement,
24231
24232
  onUpdateSlide
24232
24233
  }) {
24233
- const { t } = chunkJKSUB7DR_js.useTranslation();
24234
+ const { t } = chunk5DBKW7F3_js.useTranslation();
24234
24235
  const toggleHidden = (elementId2) => {
24235
24236
  const elements2 = activeSlide?.elements;
24236
24237
  if (!canEdit || !elements2) {
@@ -24246,13 +24247,13 @@ function InspectorElementsTab({
24246
24247
  };
24247
24248
  if (!activeSlide) {
24248
24249
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
24249
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkJKSUB7DR_js.cn(HEADING2, "mb-2"), children: t("pptx.inspector.layerOrder") }),
24250
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunk5DBKW7F3_js.cn(HEADING2, "mb-2"), children: t("pptx.inspector.layerOrder") }),
24250
24251
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-muted-foreground italic", children: t("pptx.inspector.noSlideSelected") })
24251
24252
  ] });
24252
24253
  }
24253
24254
  const elements = activeSlide.elements || [];
24254
24255
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", "data-pptx-elements-tab": true, children: [
24255
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkJKSUB7DR_js.cn(HEADING2, "mb-2"), children: t("pptx.inspector.layerOrder") }),
24256
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunk5DBKW7F3_js.cn(HEADING2, "mb-2"), children: t("pptx.inspector.layerOrder") }),
24256
24257
  [...elements].reverse().map((el, reversedIndex) => {
24257
24258
  const index = elements.length - 1 - reversedIndex;
24258
24259
  const selected = selectedElementId === el.id || selectedElementIds.includes(el.id);
@@ -24260,7 +24261,7 @@ function InspectorElementsTab({
24260
24261
  "div",
24261
24262
  {
24262
24263
  title: `${el.type} - ${el.id}`,
24263
- className: chunkJKSUB7DR_js.cn(
24264
+ className: chunk5DBKW7F3_js.cn(
24264
24265
  "flex items-center gap-2 px-2 py-1 rounded cursor-pointer transition-colors",
24265
24266
  selected ? "bg-primary/30 text-primary" : "hover:bg-muted text-foreground"
24266
24267
  ),
@@ -24296,8 +24297,8 @@ function InspectorPaneHeader({
24296
24297
  onSetActiveTab,
24297
24298
  onClose
24298
24299
  }) {
24299
- const { t } = chunkJKSUB7DR_js.useTranslation();
24300
- const { viewportWidth } = chunk73SDWM6K_js.useIsMobile();
24300
+ const { t } = chunk5DBKW7F3_js.useTranslation();
24301
+ const { viewportWidth } = chunkVGU5S37T_js.useIsMobile();
24301
24302
  const touchTargetPx = pptx.getDensePanelTouchTargetPx(viewportWidth);
24302
24303
  const touchBtnStyle = { minWidth: touchTargetPx, minHeight: touchTargetPx };
24303
24304
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -24320,7 +24321,7 @@ function InspectorPaneHeader({
24320
24321
  type: "button",
24321
24322
  title: t(labelKey),
24322
24323
  style: touchBtnStyle,
24323
- className: chunkJKSUB7DR_js.cn(
24324
+ className: chunk5DBKW7F3_js.cn(
24324
24325
  "flex items-center justify-center gap-1 px-2 py-1 rounded text-[11px] transition-colors",
24325
24326
  activeTab === key ? "bg-primary text-white" : "text-muted-foreground hover:text-foreground hover:bg-accent"
24326
24327
  ),
@@ -24380,7 +24381,7 @@ function CustomPropertiesBlock({
24380
24381
  canEdit,
24381
24382
  onUpdate
24382
24383
  }) {
24383
- const { t } = chunkJKSUB7DR_js.useTranslation();
24384
+ const { t } = chunk5DBKW7F3_js.useTranslation();
24384
24385
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
24385
24386
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
24386
24387
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: t("pptx.documentProperties.custom.heading") }),
@@ -24434,7 +24435,7 @@ function CustomPropertiesBlock({
24434
24435
  "button",
24435
24436
  {
24436
24437
  type: "button",
24437
- className: chunkJKSUB7DR_js.cn(BTN2, "px-1.5 text-red-400 hover:text-red-300"),
24438
+ className: chunk5DBKW7F3_js.cn(BTN2, "px-1.5 text-red-400 hover:text-red-300"),
24438
24439
  onClick: () => onUpdate(customProperties.filter((_, i) => i !== index)),
24439
24440
  children: "\xD7"
24440
24441
  }
@@ -24447,7 +24448,7 @@ function NotesHandoutCard({
24447
24448
  notesMaster,
24448
24449
  handoutMaster
24449
24450
  }) {
24450
- const { t } = chunkJKSUB7DR_js.useTranslation();
24451
+ const { t } = chunk5DBKW7F3_js.useTranslation();
24451
24452
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: CARD2, children: [
24452
24453
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING2, children: t("pptx.documentProperties.notesHandoutHeading") }),
24453
24454
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1 text-[11px] text-muted-foreground", children: [
@@ -24484,7 +24485,7 @@ function DocumentPropertiesCard({
24484
24485
  onUpdateAppProperties,
24485
24486
  onUpdateCustomProperties
24486
24487
  }) {
24487
- const { t } = chunkJKSUB7DR_js.useTranslation();
24488
+ const { t } = chunk5DBKW7F3_js.useTranslation();
24488
24489
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: CARD2, children: [
24489
24490
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING2, children: t("pptx.documentProperties.documentHeading") }),
24490
24491
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2 text-[11px] text-muted-foreground", children: [
@@ -24538,7 +24539,7 @@ function DocumentPropertiesCard({
24538
24539
  function SlideSizeRescalePrompt({
24539
24540
  onChoose
24540
24541
  }) {
24541
- const { t } = chunkJKSUB7DR_js.useTranslation();
24542
+ const { t } = chunk5DBKW7F3_js.useTranslation();
24542
24543
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5 rounded border border-border bg-muted/40 p-2 text-[11px]", children: [
24543
24544
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium", children: t("pptx.slideSize.rescaleTitle") }),
24544
24545
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-muted-foreground", children: t("pptx.slideSize.rescaleDescription") }),
@@ -24580,7 +24581,7 @@ function SlideSizeCard({
24580
24581
  onUpdateSlideSize,
24581
24582
  hasContent
24582
24583
  }) {
24583
- const { t } = chunkJKSUB7DR_js.useTranslation();
24584
+ const { t } = chunk5DBKW7F3_js.useTranslation();
24584
24585
  const selection = pptx.resolveSlideSizeSelection({ current: slideSizeEmu, canvas: canvasSize });
24585
24586
  const presetDisabled = !canEdit || !onUpdateSlideSize;
24586
24587
  const [pendingSize, setPendingSize] = React108.useState(null);
@@ -24691,7 +24692,7 @@ function PresentationSettingsCard({
24691
24692
  canEdit,
24692
24693
  onUpdate
24693
24694
  }) {
24694
- const { t } = chunkJKSUB7DR_js.useTranslation();
24695
+ const { t } = chunk5DBKW7F3_js.useTranslation();
24695
24696
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${CARD2} pptx-editor-presentation-card`, children: [
24696
24697
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING2, children: t("pptx.slideInspector.presentation") }),
24697
24698
  /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-pptx-chrome": "presentation-fields", className: "space-y-1.5 text-[11px]", children: [
@@ -24762,7 +24763,7 @@ function PresentationSettingsCard({
24762
24763
  min: 1,
24763
24764
  max: 16,
24764
24765
  disabled: !canEdit,
24765
- className: chunkJKSUB7DR_js.cn(INPUT2, "w-20"),
24766
+ className: chunk5DBKW7F3_js.cn(INPUT2, "w-20"),
24766
24767
  value: pptx.printPropertiesSlidesPerPage(presentationProperties.printProperties),
24767
24768
  onChange: (e) => onUpdate({
24768
24769
  printProperties: pptx.withSlidesPerPage(
@@ -24783,7 +24784,7 @@ function ThemeSelectorCard({
24783
24784
  canEdit,
24784
24785
  onApplyTheme
24785
24786
  }) {
24786
- const { t } = chunkJKSUB7DR_js.useTranslation();
24787
+ const { t } = chunk5DBKW7F3_js.useTranslation();
24787
24788
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: CARD2, children: [
24788
24789
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING2, children: t("pptx.documentProperties.themeHeading") }),
24789
24790
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2 text-[11px]", children: [
@@ -24846,7 +24847,7 @@ function SlideThemeOverridePanel({
24846
24847
  canEdit,
24847
24848
  onUpdateSlide
24848
24849
  }) {
24849
- const { t } = chunkJKSUB7DR_js.useTranslation();
24850
+ const { t } = chunk5DBKW7F3_js.useTranslation();
24850
24851
  const translate = React108.useCallback((key) => t(key), [t]);
24851
24852
  const override = activeSlide?.clrMapOverride;
24852
24853
  const isOverrideActive = override !== void 0;
@@ -24953,7 +24954,7 @@ function DirectionPicker({
24953
24954
  disabled,
24954
24955
  onChange
24955
24956
  }) {
24956
- const { t } = chunkJKSUB7DR_js.useTranslation();
24957
+ const { t } = chunk5DBKW7F3_js.useTranslation();
24957
24958
  if (directions.length <= 3) {
24958
24959
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-1", children: directions.map((dir) => /* @__PURE__ */ jsxRuntime.jsx(
24959
24960
  "button",
@@ -24995,10 +24996,10 @@ function TransitionPreview({
24995
24996
  const previewRef = React108.useRef(null);
24996
24997
  const [playing, setPlaying] = React108.useState(false);
24997
24998
  const [animKey, setAnimKey] = React108.useState(0);
24998
- const { t } = chunkJKSUB7DR_js.useTranslation();
24999
+ const { t } = chunk5DBKW7F3_js.useTranslation();
24999
25000
  const durationMs = transition.durationMs ?? 500;
25000
25001
  const animations = React108.useMemo(
25001
- () => chunk73SDWM6K_js.getSlideTransitionAnimations(
25002
+ () => chunkVGU5S37T_js.getSlideTransitionAnimations(
25002
25003
  transition.type,
25003
25004
  durationMs,
25004
25005
  transition.direction,
@@ -25067,7 +25068,7 @@ function TransitionPreview({
25067
25068
  ]
25068
25069
  }
25069
25070
  ),
25070
- /* @__PURE__ */ jsxRuntime.jsx("style", { children: chunk73SDWM6K_js.SLIDE_TRANSITION_KEYFRAMES })
25071
+ /* @__PURE__ */ jsxRuntime.jsx("style", { children: chunkVGU5S37T_js.SLIDE_TRANSITION_KEYFRAMES })
25071
25072
  ] });
25072
25073
  }
25073
25074
  var DEFAULT_DURATION_MS = 320;
@@ -25079,7 +25080,7 @@ function SlideTransitionSection({
25079
25080
  canEdit = true,
25080
25081
  onTransitionChange
25081
25082
  }) {
25082
- const { t } = chunkJKSUB7DR_js.useTranslation();
25083
+ const { t } = chunk5DBKW7F3_js.useTranslation();
25083
25084
  if (!activeSlide) {
25084
25085
  return null;
25085
25086
  }
@@ -25110,7 +25111,7 @@ function SlideTransitionSection({
25110
25111
  type: e.target.value
25111
25112
  }),
25112
25113
  className: "bg-muted border border-border rounded px-2 py-1 max-md:min-h-[44px]!",
25113
- children: chunkJKSUB7DR_js.SLIDE_TRANSITION_OPTIONS.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option.value, children: t(option.i18nKey) }, option.value))
25114
+ children: chunk5DBKW7F3_js.SLIDE_TRANSITION_OPTIONS.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option.value, children: t(option.i18nKey) }, option.value))
25114
25115
  }
25115
25116
  )
25116
25117
  ] }),
@@ -25268,7 +25269,7 @@ function TagsSection({
25268
25269
  onUpdateTagCollections,
25269
25270
  canEdit
25270
25271
  }) {
25271
- const { t } = chunkJKSUB7DR_js.useTranslation();
25272
+ const { t } = chunk5DBKW7F3_js.useTranslation();
25272
25273
  const [collapsed, setCollapsed] = React108.useState(true);
25273
25274
  const allTags = pptx.flattenTagCollections(tagCollections);
25274
25275
  const updateTag = (colIdx, tagIdx, field, newValue) => {
@@ -25326,7 +25327,7 @@ function TagsSection({
25326
25327
  "button",
25327
25328
  {
25328
25329
  type: "button",
25329
- className: chunkJKSUB7DR_js.cn(BTN2, "px-1.5 text-red-400 hover:text-red-300"),
25330
+ className: chunk5DBKW7F3_js.cn(BTN2, "px-1.5 text-red-400 hover:text-red-300"),
25330
25331
  title: t("pptx.tags.deleteTag"),
25331
25332
  onClick: () => deleteTag(tag.colIdx, tag.tagIdx),
25332
25333
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuTrash2, { className: "w-3 h-3" })
@@ -25368,7 +25369,7 @@ function PresentationPropertiesPanel({
25368
25369
  tagCollections,
25369
25370
  onUpdateTagCollections
25370
25371
  }) {
25371
- const { t } = chunkJKSUB7DR_js.useTranslation();
25372
+ const { t } = chunk5DBKW7F3_js.useTranslation();
25372
25373
  const handleTransitionChange = React108__default.default.useCallback(
25373
25374
  (updates) => {
25374
25375
  onUpdateSlide({
@@ -25455,7 +25456,7 @@ function PresentationPropertiesPanel({
25455
25456
  canEdit
25456
25457
  }
25457
25458
  ) }),
25458
- activeSlide && /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-pptx-inspector-card": "slide", className: chunkJKSUB7DR_js.cn(CARD2, "space-y-1"), children: [
25459
+ activeSlide && /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-pptx-inspector-card": "slide", className: chunk5DBKW7F3_js.cn(CARD2, "space-y-1"), children: [
25459
25460
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING2, children: "Slide" }),
25460
25461
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-[11px] text-muted-foreground", children: [
25461
25462
  activeSlide.elements?.length ?? 0,
@@ -25473,17 +25474,17 @@ function SlideBackgroundPanel({
25473
25474
  onSetTemplateBackground,
25474
25475
  onGetTemplateBackgroundColor
25475
25476
  }) {
25476
- const { t } = chunkJKSUB7DR_js.useTranslation();
25477
+ const { t } = chunk5DBKW7F3_js.useTranslation();
25477
25478
  const bgImageInputRef = React108.useRef(null);
25478
25479
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
25479
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkJKSUB7DR_js.cn(CARD2, "space-y-2"), children: [
25480
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk5DBKW7F3_js.cn(CARD2, "space-y-2"), children: [
25480
25481
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING2, children: t("pptx.viewer.background") }),
25481
25482
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 text-[11px]", children: [
25482
25483
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground w-10 shrink-0", children: t("pptx.slideBackground.colour") }),
25483
25484
  /* @__PURE__ */ jsxRuntime.jsx(
25484
25485
  DebouncedColorInput,
25485
25486
  {
25486
- value: chunkJKSUB7DR_js.normalizeHexColor(activeSlide.backgroundColor, "#ffffff"),
25487
+ value: chunk5DBKW7F3_js.normalizeHexColor(activeSlide.backgroundColor, "#ffffff"),
25487
25488
  disabled: !canEdit,
25488
25489
  className: "h-6 w-8 rounded border border-border bg-muted cursor-pointer",
25489
25490
  onCommit: (hex) => onUpdateSlide({ backgroundColor: hex })
@@ -25522,7 +25523,7 @@ function SlideBackgroundPanel({
25522
25523
  "button",
25523
25524
  {
25524
25525
  type: "button",
25525
- className: chunkJKSUB7DR_js.cn(BTN2, "flex-1 text-center"),
25526
+ className: chunk5DBKW7F3_js.cn(BTN2, "flex-1 text-center"),
25526
25527
  disabled: !canEdit,
25527
25528
  onClick: () => bgImageInputRef.current?.click(),
25528
25529
  children: activeSlide.backgroundImage ? t("pptx.slideBackground.replaceImage") : t("pptx.slideBackground.chooseImage")
@@ -25555,7 +25556,7 @@ function SlideBackgroundPanel({
25555
25556
  "button",
25556
25557
  {
25557
25558
  type: "button",
25558
- className: chunkJKSUB7DR_js.cn(BTN2, "w-full text-center text-red-400 hover:text-red-300"),
25559
+ className: chunk5DBKW7F3_js.cn(BTN2, "w-full text-center text-red-400 hover:text-red-300"),
25559
25560
  disabled: !pptx.slideBackgroundClearState(activeSlide, canEdit).enabled,
25560
25561
  onClick: () => onUpdateSlide(pptx.slideBackgroundClearPatch()),
25561
25562
  children: t("pptx.slideBackground.clearBackground")
@@ -25592,21 +25593,21 @@ function TemplateBackgroundCard({
25592
25593
  onSetTemplateBackground,
25593
25594
  onGetTemplateBackgroundColor
25594
25595
  }) {
25595
- const { t } = chunkJKSUB7DR_js.useTranslation();
25596
+ const { t } = chunk5DBKW7F3_js.useTranslation();
25596
25597
  const rows = pptx.resolveTemplateBackgroundRows(
25597
25598
  activeSlide,
25598
25599
  slideMasters,
25599
25600
  t("pptx.master.layout"),
25600
25601
  t("pptx.master.master")
25601
25602
  );
25602
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkJKSUB7DR_js.cn(CARD2, "space-y-2"), children: [
25603
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk5DBKW7F3_js.cn(CARD2, "space-y-2"), children: [
25603
25604
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING2, children: t("pptx.slideBackground.templateBackgroundsHeading") }),
25604
25605
  rows.layout && /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 text-[11px]", children: [
25605
25606
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground w-14 shrink-0 truncate", title: rows.layout.title, children: t("pptx.master.layout") }),
25606
25607
  /* @__PURE__ */ jsxRuntime.jsx(
25607
25608
  DebouncedColorInput,
25608
25609
  {
25609
- value: chunkJKSUB7DR_js.normalizeHexColor(onGetTemplateBackgroundColor(rows.layout.path), "#ffffff"),
25610
+ value: chunk5DBKW7F3_js.normalizeHexColor(onGetTemplateBackgroundColor(rows.layout.path), "#ffffff"),
25610
25611
  disabled: !canEdit,
25611
25612
  className: "h-6 w-8 rounded border border-border bg-muted cursor-pointer",
25612
25613
  onCommit: (hex) => onSetTemplateBackground(rows.layout.path, hex)
@@ -25619,7 +25620,7 @@ function TemplateBackgroundCard({
25619
25620
  /* @__PURE__ */ jsxRuntime.jsx(
25620
25621
  DebouncedColorInput,
25621
25622
  {
25622
- value: chunkJKSUB7DR_js.normalizeHexColor(onGetTemplateBackgroundColor(rows.master.path), "#ffffff"),
25623
+ value: chunk5DBKW7F3_js.normalizeHexColor(onGetTemplateBackgroundColor(rows.master.path), "#ffffff"),
25623
25624
  disabled: !canEdit,
25624
25625
  className: "h-6 w-8 rounded border border-border bg-muted cursor-pointer",
25625
25626
  onCommit: (hex) => onSetTemplateBackground(rows.master.path, hex)
@@ -25729,8 +25730,8 @@ function InspectorPane(props) {
25729
25730
  panelWidth
25730
25731
  } = props;
25731
25732
  const hasSelection = selectedElement !== null;
25732
- const { t } = chunkJKSUB7DR_js.useTranslation();
25733
- const { dragY, handlers: dragHandlers } = chunk73SDWM6K_js.useSheetDismissDrag(onClose);
25733
+ const { t } = chunk5DBKW7F3_js.useTranslation();
25734
+ const { dragY, handlers: dragHandlers } = chunkVGU5S37T_js.useSheetDismissDrag(onClose);
25734
25735
  const {
25735
25736
  animationPanelHeight,
25736
25737
  effectiveThemeOptions,
@@ -25752,7 +25753,7 @@ function InspectorPane(props) {
25752
25753
  "div",
25753
25754
  {
25754
25755
  "data-pptx-chrome": "inspector",
25755
- className: chunkJKSUB7DR_js.cn(
25756
+ className: chunk5DBKW7F3_js.cn(
25756
25757
  // Shared styles
25757
25758
  "bg-background flex flex-col text-xs text-foreground shadow-xl",
25758
25759
  // Mobile: absolute bottom sheet overlay sized via dvh so it
@@ -26083,7 +26084,7 @@ function PresentationAnnotationOverlay({
26083
26084
  );
26084
26085
  }
26085
26086
  function PresentationToolbar(p) {
26086
- const { t } = chunkJKSUB7DR_js.useTranslation();
26087
+ const { t } = chunk5DBKW7F3_js.useTranslation();
26087
26088
  const ref = useWebControl(
26088
26089
  {
26089
26090
  current: p.currentSlideIndex,
@@ -26142,8 +26143,8 @@ function PresentationTouchControls({
26142
26143
  onEndPresentation,
26143
26144
  hideNavigation = false
26144
26145
  }) {
26145
- const { t } = chunkJKSUB7DR_js.useTranslation();
26146
- const { isTouchDevice } = chunk73SDWM6K_js.useIsMobile();
26146
+ const { t } = chunk5DBKW7F3_js.useTranslation();
26147
+ const { isTouchDevice } = chunkVGU5S37T_js.useIsMobile();
26147
26148
  if (!isTouchDevice) {
26148
26149
  return null;
26149
26150
  }
@@ -26225,7 +26226,7 @@ function KeepAnnotationsDialog({
26225
26226
  onKeep,
26226
26227
  onDiscard
26227
26228
  }) {
26228
- const { t } = chunkJKSUB7DR_js.useTranslation();
26229
+ const { t } = chunk5DBKW7F3_js.useTranslation();
26229
26230
  if (!isOpen) {
26230
26231
  return null;
26231
26232
  }
@@ -26273,7 +26274,7 @@ function PasteSpecialDialog({
26273
26274
  onCancel,
26274
26275
  onConfirm
26275
26276
  }) {
26276
- const { t } = chunkJKSUB7DR_js.useTranslation();
26277
+ const { t } = chunk5DBKW7F3_js.useTranslation();
26277
26278
  const [selected, setSelected] = React108.useState("keep-source-formatting");
26278
26279
  if (!isOpen) {
26279
26280
  return null;
@@ -26331,7 +26332,7 @@ function PasteOptionsToolbar({
26331
26332
  onChoose,
26332
26333
  onDismiss
26333
26334
  }) {
26334
- const { t } = chunkJKSUB7DR_js.useTranslation();
26335
+ const { t } = chunk5DBKW7F3_js.useTranslation();
26335
26336
  const [rect, setRect] = React108.useState(null);
26336
26337
  React108.useEffect(() => {
26337
26338
  const node = elementId2 ? pptx.findCanvasElementNode(document, elementId2, { canvasOnly: true }) : null;
@@ -26358,7 +26359,7 @@ function NotesPagePreview({
26358
26359
  frameSlides,
26359
26360
  maxPages = 3
26360
26361
  }) {
26361
- const { t } = chunkJKSUB7DR_js.useTranslation();
26362
+ const { t } = chunk5DBKW7F3_js.useTranslation();
26362
26363
  const pages = React108.useMemo(() => pptx.computeAllNotesPages(slideIndices), [slideIndices]);
26363
26364
  const printable = React108.useMemo(() => pptx.getNotesPrintableArea(), []);
26364
26365
  const visiblePages = pages.slice(0, maxPages);
@@ -26446,15 +26447,15 @@ function PrintPreview({
26446
26447
  frameSlides,
26447
26448
  maxPages = 3
26448
26449
  }) {
26449
- const { t } = chunkJKSUB7DR_js.useTranslation();
26450
+ const { t } = chunk5DBKW7F3_js.useTranslation();
26450
26451
  const pages = React108.useMemo(
26451
- () => chunkJKSUB7DR_js.computeHandoutLayout(slideIndices, slidesPerPage, orientation),
26452
+ () => chunk5DBKW7F3_js.computeHandoutLayout(slideIndices, slidesPerPage, orientation),
26452
26453
  [slideIndices, slidesPerPage, orientation]
26453
26454
  );
26454
- const printable = React108.useMemo(() => chunkJKSUB7DR_js.getPrintableArea(orientation), [orientation]);
26455
+ const printable = React108.useMemo(() => chunk5DBKW7F3_js.getPrintableArea(orientation), [orientation]);
26455
26456
  const visiblePages = pages.slice(0, maxPages);
26456
26457
  const isThreePerPage = slidesPerPage === 3;
26457
- const noteLineCount = chunkJKSUB7DR_js.generateNoteLineCount();
26458
+ const noteLineCount = chunk5DBKW7F3_js.generateNoteLineCount();
26458
26459
  const scaledW = printable.width * PREVIEW_SCALE3;
26459
26460
  const scaledH = printable.height * PREVIEW_SCALE3;
26460
26461
  const noteAreaFraction = 0.5;
@@ -26552,7 +26553,7 @@ function PrintSettingsPanel({
26552
26553
  totalSlides,
26553
26554
  activeSlideIndex
26554
26555
  }) {
26555
- const { t } = chunkJKSUB7DR_js.useTranslation();
26556
+ const { t } = chunk5DBKW7F3_js.useTranslation();
26556
26557
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 space-y-5 min-w-0", children: [
26557
26558
  /* @__PURE__ */ jsxRuntime.jsxs("fieldset", { children: [
26558
26559
  /* @__PURE__ */ jsxRuntime.jsx("legend", { className: "text-xs font-medium text-muted-foreground mb-2 uppercase tracking-wide", children: t("pptx.print.printWhat") }),
@@ -26788,13 +26789,13 @@ function PrintDialog({
26788
26789
  defaultSlidesPerPage,
26789
26790
  defaultFrameSlides
26790
26791
  }) {
26791
- const { t } = chunkJKSUB7DR_js.useTranslation();
26792
+ const { t } = chunk5DBKW7F3_js.useTranslation();
26792
26793
  const regionRenderer = useRegionRenderer("dialog.print");
26793
- const { panelStyle, handlers: dragHandlers } = chunk73SDWM6K_js.useModalDismissDrag(onClose);
26794
- const { viewportWidth } = chunk73SDWM6K_js.useIsMobile();
26794
+ const { panelStyle, handlers: dragHandlers } = chunkVGU5S37T_js.useModalDismissDrag(onClose);
26795
+ const { viewportWidth } = chunkVGU5S37T_js.useIsMobile();
26795
26796
  const touchTargetPx = pptx.getDensePanelTouchTargetPx(viewportWidth);
26796
26797
  const closeBtnStyle = { minWidth: touchTargetPx, minHeight: touchTargetPx };
26797
- const printOptionDefaults = pptx.resolveDefaultPrintSettings(chunk73SDWM6K_js.useViewerOptionsContext());
26798
+ const printOptionDefaults = pptx.resolveDefaultPrintSettings(chunkVGU5S37T_js.useViewerOptionsContext());
26798
26799
  const [printWhat, setPrintWhat] = React108.useState(printOptionDefaults?.printWhat ?? "slides");
26799
26800
  const [orientation, setOrientation] = React108.useState("landscape");
26800
26801
  const [colorMode, setColorMode] = React108.useState(
@@ -26978,7 +26979,7 @@ function ShowOptionsFieldset({
26978
26979
  draft,
26979
26980
  update
26980
26981
  }) {
26981
- const { t } = chunkJKSUB7DR_js.useTranslation();
26982
+ const { t } = chunk5DBKW7F3_js.useTranslation();
26982
26983
  return /* @__PURE__ */ jsxRuntime.jsxs("fieldset", { className: "space-y-1.5", children: [
26983
26984
  /* @__PURE__ */ jsxRuntime.jsx("legend", { className: "text-[11px] font-medium text-muted-foreground uppercase tracking-wide mb-1", children: t("pptx.slideShow.showOptions") }),
26984
26985
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
@@ -27036,7 +27037,7 @@ function ShowSlidesFieldset({
27036
27037
  slideCount,
27037
27038
  customShows
27038
27039
  }) {
27039
- const { t } = chunkJKSUB7DR_js.useTranslation();
27040
+ const { t } = chunk5DBKW7F3_js.useTranslation();
27040
27041
  return /* @__PURE__ */ jsxRuntime.jsxs("fieldset", { className: "space-y-1.5", children: [
27041
27042
  /* @__PURE__ */ jsxRuntime.jsx("legend", { className: "text-[11px] font-medium text-muted-foreground uppercase tracking-wide mb-1", children: t("pptx.slideShow.showSlides") }),
27042
27043
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
@@ -27146,7 +27147,7 @@ function SetUpSlideShowDialog({
27146
27147
  customShows,
27147
27148
  slideCount
27148
27149
  }) {
27149
- const { t } = chunkJKSUB7DR_js.useTranslation();
27150
+ const { t } = chunk5DBKW7F3_js.useTranslation();
27150
27151
  const [draft, setDraft] = React108.useState({
27151
27152
  ...properties
27152
27153
  });
@@ -27282,16 +27283,16 @@ function BroadcastDialog({
27282
27283
  defaultUserName,
27283
27284
  defaultServerUrl
27284
27285
  }) {
27285
- const { t } = chunkJKSUB7DR_js.useTranslation();
27286
+ const { t } = chunk5DBKW7F3_js.useTranslation();
27286
27287
  const regionRenderer = useRegionRenderer("dialog.broadcast");
27287
- const collab = chunk73SDWM6K_js.useCollaboration();
27288
+ const collab = chunkVGU5S37T_js.useCollaboration();
27288
27289
  const isBroadcasting = collab !== null && collab.status !== "disconnected" && collab.status !== "error" && collab.config.role === "owner";
27289
27290
  const [roomId, setRoomId] = React108.useState("");
27290
27291
  const [userName, setUserName] = React108.useState("");
27291
27292
  const [serverUrl, setServerUrl] = React108.useState("");
27292
27293
  const [copied, setCopied] = React108.useState(false);
27293
27294
  const dialogRef = React108.useRef(null);
27294
- const { panelStyle, handlers: dragHandlers } = chunk73SDWM6K_js.useModalDismissDrag(onClose);
27295
+ const { panelStyle, handlers: dragHandlers } = chunkVGU5S37T_js.useModalDismissDrag(onClose);
27295
27296
  useModalFocus(open, dialogRef, onClose);
27296
27297
  React108.useEffect(() => {
27297
27298
  if (open && !isBroadcasting) {
@@ -27450,7 +27451,7 @@ function StartBroadcastForm({
27450
27451
  onUserNameChange,
27451
27452
  onServerUrlChange
27452
27453
  }) {
27453
- const { t } = chunkJKSUB7DR_js.useTranslation();
27454
+ const { t } = chunk5DBKW7F3_js.useTranslation();
27454
27455
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
27455
27456
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[13px] text-muted-foreground leading-relaxed", children: t("pptx.broadcast.description") }),
27456
27457
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
@@ -27526,7 +27527,7 @@ function ActiveBroadcastView({
27526
27527
  onCopyUrl,
27527
27528
  onStopBroadcast
27528
27529
  }) {
27529
- const { t } = chunkJKSUB7DR_js.useTranslation();
27530
+ const { t } = chunk5DBKW7F3_js.useTranslation();
27530
27531
  const statusColor = collab.status === "connected" ? "text-green-400" : collab.status === "connecting" ? "text-yellow-400" : "text-red-400";
27531
27532
  const statusIcon = collab.status === "connected" || collab.status === "connecting" ? /* @__PURE__ */ jsxRuntime.jsx(lu.LuWifi, { className: "w-4 h-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lu.LuWifiOff, { className: "w-4 h-4" });
27532
27533
  const viewerCount = collab.remoteUsers.filter((u) => u.role === "viewer").length;
@@ -27607,7 +27608,7 @@ function ActiveSessionView({
27607
27608
  onCopyRoomId,
27608
27609
  onStopCollaboration
27609
27610
  }) {
27610
- const { t } = chunkJKSUB7DR_js.useTranslation(), viewerOptions = chunk73SDWM6K_js.useViewerOptionsContext(), statusColor = collab.status === "connected" ? "text-green-400" : collab.status === "connecting" ? "text-yellow-400" : "text-red-400", statusIcon = collab.status === "connected" || collab.status === "connecting" ? /* @__PURE__ */ jsxRuntime.jsx(lu.LuWifi, { className: "w-4 h-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lu.LuWifiOff, { className: "w-4 h-4" }), sessionUsers = pptx.buildActiveSessionUsers({
27611
+ const { t } = chunk5DBKW7F3_js.useTranslation(), viewerOptions = chunkVGU5S37T_js.useViewerOptionsContext(), statusColor = collab.status === "connected" ? "text-green-400" : collab.status === "connecting" ? "text-yellow-400" : "text-red-400", statusIcon = collab.status === "connected" || collab.status === "connecting" ? /* @__PURE__ */ jsxRuntime.jsx(lu.LuWifi, { className: "w-4 h-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lu.LuWifiOff, { className: "w-4 h-4" }), sessionUsers = pptx.buildActiveSessionUsers({
27611
27612
  localUserName: activeCollaboration?.userName ?? collab.config.userName,
27612
27613
  localUserInitials: viewerOptions.general.userInitials,
27613
27614
  localUserColor: collab.config.userColor,
@@ -27705,8 +27706,8 @@ function StartSessionForm({
27705
27706
  connectionFailed,
27706
27707
  onRetry
27707
27708
  }) {
27708
- const { t } = chunkJKSUB7DR_js.useTranslation();
27709
- const { viewportWidth } = chunk73SDWM6K_js.useIsMobile();
27709
+ const { t } = chunk5DBKW7F3_js.useTranslation();
27710
+ const { viewportWidth } = chunkVGU5S37T_js.useIsMobile();
27710
27711
  const tabBtnStyle = { minHeight: pptx.getDensePanelTouchTargetPx(viewportWidth) };
27711
27712
  const inputReadOnlyClass = preconfigured ? " opacity-70 cursor-not-allowed" : "";
27712
27713
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
@@ -27840,9 +27841,9 @@ function ShareDialog({
27840
27841
  defaultUserName,
27841
27842
  defaultServerUrl
27842
27843
  }) {
27843
- const collab = chunk73SDWM6K_js.useCollaboration();
27844
+ const collab = chunkVGU5S37T_js.useCollaboration();
27844
27845
  const isActive = collab !== null && collab.status !== "disconnected" && collab.status !== "error";
27845
- const { t } = chunkJKSUB7DR_js.useTranslation();
27846
+ const { t } = chunk5DBKW7F3_js.useTranslation();
27846
27847
  const regionRenderer = useRegionRenderer("dialog.share");
27847
27848
  const [roomId, setRoomId] = React108.useState(defaultRoomId ?? "");
27848
27849
  const [userName, setUserName] = React108.useState(defaultUserName ?? "");
@@ -27851,9 +27852,9 @@ function ShareDialog({
27851
27852
  const [invitation, setInvitation] = React108.useState("");
27852
27853
  const [copied, setCopied] = React108.useState(false);
27853
27854
  const dialogRef = React108.useRef(null);
27854
- const { panelStyle, handlers: dragHandlers } = chunk73SDWM6K_js.useModalDismissDrag(onClose);
27855
+ const { panelStyle, handlers: dragHandlers } = chunkVGU5S37T_js.useModalDismissDrag(onClose);
27855
27856
  useModalFocus(open, dialogRef, onClose);
27856
- const { viewportWidth, viewportHeight } = chunk73SDWM6K_js.useIsMobile();
27857
+ const { viewportWidth, viewportHeight } = chunkVGU5S37T_js.useIsMobile();
27857
27858
  const touchTargetPx = pptx.getDensePanelTouchTargetPx(viewportWidth);
27858
27859
  const touchBtnStyle = { minWidth: touchTargetPx, minHeight: touchTargetPx };
27859
27860
  const stickyFooterClass = pptx.shouldStickyActionRow(viewportWidth, viewportHeight) ? "sticky bottom-0 bg-popover" : "";
@@ -28026,7 +28027,7 @@ function HyperlinkTabContent({
28026
28027
  inputCls,
28027
28028
  onEnterConfirm
28028
28029
  }) {
28029
- const { t } = chunkJKSUB7DR_js.useTranslation();
28030
+ const { t } = chunk5DBKW7F3_js.useTranslation();
28030
28031
  const handleEnterKey = (e) => {
28031
28032
  if (e.key === "Enter") {
28032
28033
  onEnterConfirm();
@@ -28151,13 +28152,13 @@ function HyperlinkEditDialog({
28151
28152
  onConfirm,
28152
28153
  onCancel
28153
28154
  }) {
28154
- const { t } = chunkJKSUB7DR_js.useTranslation();
28155
- const { panelStyle, handlers: dragHandlers } = chunk73SDWM6K_js.useModalDismissDrag(onCancel);
28155
+ const { t } = chunk5DBKW7F3_js.useTranslation();
28156
+ const { panelStyle, handlers: dragHandlers } = chunkVGU5S37T_js.useModalDismissDrag(onCancel);
28156
28157
  const inputRef = React108.useRef(null);
28157
- const detectedType = chunk73SDWM6K_js.detectTargetType(initialUrl, initialAction);
28158
- const emailParts = chunk73SDWM6K_js.parseEmailUrl(initialUrl || "");
28159
- const detectedSlide = chunk73SDWM6K_js.parseSlideFromUrl(initialUrl, initialAction);
28160
- const detectedVerb = initialAction ? chunk73SDWM6K_js.ACTION_VERB_MAP[initialAction.toLowerCase()] || "nextSlide" : "nextSlide";
28158
+ const detectedType = chunkVGU5S37T_js.detectTargetType(initialUrl, initialAction);
28159
+ const emailParts = chunkVGU5S37T_js.parseEmailUrl(initialUrl || "");
28160
+ const detectedSlide = chunkVGU5S37T_js.parseSlideFromUrl(initialUrl, initialAction);
28161
+ const detectedVerb = initialAction ? chunkVGU5S37T_js.ACTION_VERB_MAP[initialAction.toLowerCase()] || "nextSlide" : "nextSlide";
28161
28162
  const [targetType, setTargetType] = React108.useState(detectedType);
28162
28163
  const [url, setUrl] = React108.useState(
28163
28164
  detectedType === "email" || detectedType === "slide" || detectedType === "action" ? "" : initialUrl || ""
@@ -28188,7 +28189,7 @@ function HyperlinkEditDialog({
28188
28189
  actionVerb
28189
28190
  });
28190
28191
  };
28191
- const tabCls = (active) => chunkJKSUB7DR_js.cn(
28192
+ const tabCls = (active) => chunk5DBKW7F3_js.cn(
28192
28193
  "px-3 py-1.5 text-xs rounded-t border-b-2 transition-colors",
28193
28194
  active ? "border-primary text-primary font-medium" : "border-transparent text-muted-foreground hover:text-foreground hover:border-border"
28194
28195
  );
@@ -28417,6 +28418,7 @@ function ViewerBottomPanels({
28417
28418
  activeSlideIndex,
28418
28419
  isDirty,
28419
28420
  autosaveStatus,
28421
+ saveProgress,
28420
28422
  onToggleNotes,
28421
28423
  onUpdateNotes,
28422
28424
  collaborationSlot,
@@ -28434,7 +28436,7 @@ function ViewerBottomPanels({
28434
28436
  notesStyle,
28435
28437
  onNotesHeightChange
28436
28438
  }) {
28437
- const { isHidden } = chunk73SDWM6K_js.useToolbarVisibility(hiddenActions);
28439
+ const { isHidden } = chunkVGU5S37T_js.useToolbarVisibility(hiddenActions);
28438
28440
  const customization = useViewerCustomizationContext();
28439
28441
  const showNotes = pptx.isPanelVisible(customization, "notes");
28440
28442
  const notesRenderer = useRegionRenderer("notes");
@@ -28490,6 +28492,7 @@ function ViewerBottomPanels({
28490
28492
  activeSlideIndex,
28491
28493
  isDirty,
28492
28494
  autosaveStatus,
28495
+ saveProgress,
28493
28496
  scale,
28494
28497
  onZoomIn,
28495
28498
  onZoomOut,
@@ -28563,7 +28566,7 @@ function ViewerInspector({
28563
28566
  onPreviewElement,
28564
28567
  elementById
28565
28568
  }) {
28566
- const { t } = chunkJKSUB7DR_js.useTranslation();
28569
+ const { t } = chunk5DBKW7F3_js.useTranslation();
28567
28570
  const regionRenderer = useRegionRenderer("inspector");
28568
28571
  const liveEdit = onPreviewElement ? {
28569
28572
  element: selectedElement,
@@ -28778,7 +28781,7 @@ function ViewerToolbarSection(props) {
28778
28781
  onSetSnapToShape,
28779
28782
  onSetShowGuides
28780
28783
  } = props;
28781
- const { t } = chunkJKSUB7DR_js.useTranslation();
28784
+ const { t } = chunk5DBKW7F3_js.useTranslation();
28782
28785
  const customization = useViewerCustomizationContext();
28783
28786
  const handleAddAnimation = React108.useCallback(
28784
28787
  (preset, group) => {
@@ -28831,7 +28834,7 @@ function ViewerToolbarSection(props) {
28831
28834
  [activeSlide, propertyHandlers]
28832
28835
  );
28833
28836
  const scopedLayoutOptions = React108__default.default.useMemo(
28834
- () => chunk73SDWM6K_js.scopeLayoutOptionsToActiveSlide(s.layoutOptions, activeSlide),
28837
+ () => chunkVGU5S37T_js.scopeLayoutOptionsToActiveSlide(s.layoutOptions, activeSlide),
28835
28838
  [s.layoutOptions, activeSlide]
28836
28839
  );
28837
28840
  const handleResetSlide = React108.useCallback(() => {
@@ -29238,14 +29241,14 @@ function ViewerToolbarSection(props) {
29238
29241
  isMobileInsertOpen: s.isMobileInsertOpen,
29239
29242
  onCloseMobileInsert: () => s.setIsMobileInsertOpen(false),
29240
29243
  slideCommentCount: activeSlide?.comments?.length ?? 0,
29241
- reviewComments: chunk73SDWM6K_js.createReviewCommentsHost({
29244
+ reviewComments: chunkVGU5S37T_js.createReviewCommentsHost({
29242
29245
  state: s,
29243
29246
  activeSlideIndex,
29244
29247
  updateSlides: ops.updateSlides,
29245
29248
  markDirty: history.markDirty
29246
29249
  }),
29247
29250
  formatPainterActive: s.formatPainterActive,
29248
- canActivateFormatPainter: chunkJKSUB7DR_js.hasCopyableFormat(selectedElement),
29251
+ canActivateFormatPainter: chunk5DBKW7F3_js.hasCopyableFormat(selectedElement),
29249
29252
  onToggleFormatPainter: onToggleFormatPainterProp ?? (() => s.setFormatPainterActive((p) => !p)),
29250
29253
  isSelectionPaneOpen: s.isSelectionPaneOpen,
29251
29254
  onToggleSelectionPane: () => s.setIsSelectionPaneOpen((p) => !p),
@@ -29354,14 +29357,14 @@ function CustomShowsDialog({
29354
29357
  onRun,
29355
29358
  onClose
29356
29359
  }) {
29357
- const { t } = chunkJKSUB7DR_js.useTranslation();
29360
+ const { t } = chunk5DBKW7F3_js.useTranslation();
29358
29361
  const controller = React108.useMemo(
29359
29362
  () => pptx.createCustomShowsController(customShows, activeCustomShowId),
29360
29363
  // A fresh draft per open: the host mounts this only while the dialog is open.
29361
29364
  // eslint-disable-next-line react-hooks/exhaustive-deps
29362
29365
  []
29363
29366
  );
29364
- chunk73SDWM6K_js.useController(controller);
29367
+ chunkVGU5S37T_js.useController(controller);
29365
29368
  const view = controller.view(slides);
29366
29369
  const [active, setActive] = React108.useState(activeCustomShowId ?? "");
29367
29370
  const pickerValue = view.shows.some(({ id }) => id === active) ? active : "";
@@ -29640,8 +29643,8 @@ function EquationEditorDialog({
29640
29643
  onInsert,
29641
29644
  existingOmml
29642
29645
  }) {
29643
- const { t } = chunkJKSUB7DR_js.useTranslation();
29644
- const { panelStyle, handlers: dragHandlers } = chunk73SDWM6K_js.useModalDismissDrag(onClose);
29646
+ const { t } = chunk5DBKW7F3_js.useTranslation();
29647
+ const { panelStyle, handlers: dragHandlers } = chunkVGU5S37T_js.useModalDismissDrag(onClose);
29645
29648
  const initialLatex = React108.useMemo(() => {
29646
29649
  if (!existingOmml) {
29647
29650
  return "";
@@ -29763,7 +29766,7 @@ function EquationEditorDialog({
29763
29766
  {
29764
29767
  type: "button",
29765
29768
  onClick: () => handleTemplateClick(tmpl.latex),
29766
- className: chunkJKSUB7DR_js.cn(
29769
+ className: chunk5DBKW7F3_js.cn(
29767
29770
  "flex flex-col items-center gap-1 p-2 rounded-lg border transition-colors",
29768
29771
  latex === tmpl.latex ? "border-primary bg-primary/10" : "border-border bg-muted/40 hover:bg-accent/60 hover:border-border"
29769
29772
  ),
@@ -29828,7 +29831,7 @@ function InsertSmartArtDialog({
29828
29831
  onInsert
29829
29832
  }) {
29830
29833
  const ref = React108.useRef(null);
29831
- const { t } = chunkJKSUB7DR_js.useTranslation();
29834
+ const { t } = chunk5DBKW7F3_js.useTranslation();
29832
29835
  React108.useLayoutEffect(() => {
29833
29836
  if (ref.current) {
29834
29837
  ref.current.translateLabel = t;
@@ -29852,7 +29855,7 @@ function InsertChartDialog({
29852
29855
  onInsert
29853
29856
  }) {
29854
29857
  const ref = React108.useRef(null);
29855
- const { t } = chunkJKSUB7DR_js.useTranslation();
29858
+ const { t } = chunk5DBKW7F3_js.useTranslation();
29856
29859
  React108.useLayoutEffect(() => {
29857
29860
  if (ref.current) {
29858
29861
  ref.current.translateLabel = t;
@@ -30359,11 +30362,11 @@ function PresentationStage({
30359
30362
  })
30360
30363
  },
30361
30364
  children: [
30362
- /* @__PURE__ */ jsxRuntime.jsx(chunk73SDWM6K_js.SlideBackgroundImageLayer, { slide: activeSlide }),
30365
+ /* @__PURE__ */ jsxRuntime.jsx(chunkVGU5S37T_js.SlideBackgroundImageLayer, { slide: activeSlide }),
30363
30366
  /* @__PURE__ */ jsxRuntime.jsx("style", { children: pptx.PRESENTATION_HIT_TEST_CSS }),
30364
30367
  presentationKeyframesCss && /* @__PURE__ */ jsxRuntime.jsx("style", { children: presentationKeyframesCss }),
30365
30368
  templateElements.map((element, index) => /* @__PURE__ */ jsxRuntime.jsx(
30366
- chunk73SDWM6K_js.ElementRenderer,
30369
+ chunkVGU5S37T_js.ElementRenderer,
30367
30370
  {
30368
30371
  element,
30369
30372
  activeSlide,
@@ -30401,7 +30404,7 @@ function PresentationStage({
30401
30404
  `tpl-${element.id}`
30402
30405
  )),
30403
30406
  activeSlide?.elements.map((element, index) => /* @__PURE__ */ jsxRuntime.jsx(
30404
- chunk73SDWM6K_js.ElementRenderer,
30407
+ chunkVGU5S37T_js.ElementRenderer,
30405
30408
  {
30406
30409
  element,
30407
30410
  activeSlide,
@@ -30454,7 +30457,7 @@ function PresentationStage({
30454
30457
  function noop() {
30455
30458
  }
30456
30459
  function PresentationContextMenu(p) {
30457
- const { t } = chunkJKSUB7DR_js.useTranslation();
30460
+ const { t } = chunk5DBKW7F3_js.useTranslation();
30458
30461
  const sections = pptx.getPresentationContextMenuSections({
30459
30462
  seeAllSlides: Boolean(p.onSeeAllSlides),
30460
30463
  presenterView: Boolean(p.onShowPresenterView),
@@ -30513,7 +30516,7 @@ function PresentationTransitionMount({
30513
30516
  templateElementsBySlideId
30514
30517
  );
30515
30518
  return /* @__PURE__ */ jsxRuntime.jsx(
30516
- chunk73SDWM6K_js.PresentationTransitionOverlay,
30519
+ chunkVGU5S37T_js.PresentationTransitionOverlay,
30517
30520
  {
30518
30521
  outgoingSlide,
30519
30522
  templateElements: templates.outgoing,
@@ -30558,9 +30561,9 @@ function ViewerCanvasArea(props) {
30558
30561
  aiHighlightOverlay,
30559
30562
  aiCanvasActive = false
30560
30563
  } = props;
30561
- const { t } = chunkJKSUB7DR_js.useTranslation();
30562
- const { isHidden } = chunk73SDWM6K_js.useToolbarVisibility(hiddenActions);
30563
- const viewerOptions = chunk73SDWM6K_js.useViewerOptionsContext();
30564
+ const { t } = chunk5DBKW7F3_js.useTranslation();
30565
+ const { isHidden } = chunkVGU5S37T_js.useToolbarVisibility(hiddenActions);
30566
+ const viewerOptions = chunkVGU5S37T_js.useViewerOptionsContext();
30564
30567
  const outlineAuthoring = useOutlineAuthoring({
30565
30568
  state: s,
30566
30569
  updateElement: canvasHandlers.handleUpdateSmartArtElement,
@@ -30606,9 +30609,9 @@ function ViewerCanvasArea(props) {
30606
30609
  );
30607
30610
  const handleHyperlinkClick = React108.useCallback(
30608
30611
  (url) => {
30609
- if (chunkJKSUB7DR_js.isPpactionUrl(url)) {
30612
+ if (chunk5DBKW7F3_js.isPpactionUrl(url)) {
30610
30613
  if (mode === "present") {
30611
- const parsed = chunkJKSUB7DR_js.parsePpactionUrl(url);
30614
+ const parsed = chunk5DBKW7F3_js.parsePpactionUrl(url);
30612
30615
  if (parsed) {
30613
30616
  const action = {
30614
30617
  action: parsed.action,
@@ -30693,7 +30696,7 @@ function ViewerCanvasArea(props) {
30693
30696
  s.setActiveSlideIndex((i) => Math.max(0, i - 1));
30694
30697
  }
30695
30698
  }, [mode, presentation, s]);
30696
- const swipe = chunk73SDWM6K_js.useSwipeNavigation({
30699
+ const swipe = chunkVGU5S37T_js.useSwipeNavigation({
30697
30700
  enabled: swipeEnabled,
30698
30701
  onNext: handleSwipeNext,
30699
30702
  onPrev: handleSwipePrev
@@ -30879,14 +30882,14 @@ function ViewerCanvasArea(props) {
30879
30882
  outlineAuthoring,
30880
30883
  collaborationOverlay: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
30881
30884
  /* @__PURE__ */ jsxRuntime.jsx(
30882
- chunk73SDWM6K_js.RemoteSelectionOverlay,
30885
+ chunkVGU5S37T_js.RemoteSelectionOverlay,
30883
30886
  {
30884
30887
  elements: effectiveSlide?.elements ?? [],
30885
30888
  activeSlideIndex
30886
30889
  }
30887
30890
  ),
30888
30891
  /* @__PURE__ */ jsxRuntime.jsx(
30889
- chunk73SDWM6K_js.CollaborationCursorOverlay,
30892
+ chunkVGU5S37T_js.CollaborationCursorOverlay,
30890
30893
  {
30891
30894
  activeSlideIndex,
30892
30895
  canvasWidth: canvasSize.width,
@@ -31123,8 +31126,8 @@ function AiChangeOverlay({ batch, activeSlideIndex }) {
31123
31126
  ] });
31124
31127
  }
31125
31128
  function ChartFormatPanel() {
31126
- const { t } = chunkJKSUB7DR_js.useTranslation();
31127
- const commands = chunk73SDWM6K_js.useChartFormatContext();
31129
+ const { t } = chunk5DBKW7F3_js.useTranslation();
31130
+ const commands = chunkVGU5S37T_js.useChartFormatContext();
31128
31131
  const ref = React108.useRef(null);
31129
31132
  const chart = commands?.chart;
31130
31133
  const chartData = chart?.type === "chart" ? chart.chartData : void 0;
@@ -31159,7 +31162,7 @@ function ChartFormatPanel() {
31159
31162
  return /* @__PURE__ */ jsxRuntime.jsx("pptx-ui-chart-format-pane", { ref, "data-testid": "chart-format-pane" });
31160
31163
  }
31161
31164
  function ThemeEditorPanel({ theme, canEdit, onApply, onClose }) {
31162
- const { t } = chunkJKSUB7DR_js.useTranslation();
31165
+ const { t } = chunk5DBKW7F3_js.useTranslation();
31163
31166
  const ref = React108.useRef(null);
31164
31167
  React108.useEffect(() => {
31165
31168
  const node = ref.current;
@@ -31196,8 +31199,8 @@ function MobileDismissSheet({
31196
31199
  className,
31197
31200
  children
31198
31201
  }) {
31199
- const { t } = chunkJKSUB7DR_js.useTranslation();
31200
- const { dragY, handlers } = chunk73SDWM6K_js.useSheetDismissDrag(onClose);
31202
+ const { t } = chunk5DBKW7F3_js.useTranslation();
31203
+ const { dragY, handlers } = chunkVGU5S37T_js.useSheetDismissDrag(onClose);
31201
31204
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
31202
31205
  /* @__PURE__ */ jsxRuntime.jsx(
31203
31206
  "button",
@@ -31466,7 +31469,7 @@ function ThemeThumbnail({
31466
31469
  {
31467
31470
  type: "button",
31468
31471
  onClick,
31469
- className: chunkJKSUB7DR_js.cn(
31472
+ className: chunk5DBKW7F3_js.cn(
31470
31473
  "group relative flex flex-col rounded-lg border-2 transition-all overflow-hidden",
31471
31474
  selected ? "border-primary shadow-lg scale-[1.02]" : "border-border hover:border-primary/50 hover:shadow-md"
31472
31475
  ),
@@ -31497,7 +31500,7 @@ function ThemeGallery({
31497
31500
  onApplyTheme,
31498
31501
  onImportTheme
31499
31502
  }) {
31500
- const { t } = chunkJKSUB7DR_js.useTranslation();
31503
+ const { t } = chunk5DBKW7F3_js.useTranslation();
31501
31504
  const [selectedTheme, setSelectedTheme] = React108.useState(currentTheme ?? null);
31502
31505
  const fileInputRef = React108.useRef(null);
31503
31506
  React108.useEffect(() => {
@@ -31634,8 +31637,8 @@ function ViewerSidePanels(props) {
31634
31637
  aiBridge,
31635
31638
  aiPanel
31636
31639
  } = props;
31637
- const aiAssistant = chunk7UFO4OZQ_js.aiAssistants.resolve(aiConfig);
31638
- const AiPanel = aiAssistant?.panel ?? chunk7UFO4OZQ_js.AiChatPanelLazy;
31640
+ const aiAssistant = chunkPNDORR6S_js.aiAssistants.resolve(aiConfig);
31641
+ const AiPanel = aiAssistant?.panel ?? chunkPNDORR6S_js.AiChatPanelLazy;
31639
31642
  const handleSetSlideSize = (size, rescaleMode) => {
31640
31643
  if (rescaleMode && s.slideSizeEmu) {
31641
31644
  s.setSlides(pptx.scaleSlidesForSizeChange(slides, s.slideSizeEmu, size, rescaleMode));
@@ -31941,7 +31944,7 @@ function ViewerMainContent(props) {
31941
31944
  );
31942
31945
  const layoutGalleryAnchorRef = React108.useRef(null);
31943
31946
  const layoutGalleryPreviews = useLayoutPreviews(loadLayoutPreviews, layoutGalleryAnchor !== null);
31944
- return /* @__PURE__ */ jsxRuntime.jsx(chunk73SDWM6K_js.ChartPartSelectionProvider, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-pptx-chrome": "body", className: "relative z-10 flex flex-1 min-h-0", children: [
31947
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkVGU5S37T_js.ChartPartSelectionProvider, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-pptx-chrome": "body", className: "relative z-10 flex flex-1 min-h-0", children: [
31945
31948
  showSlidesPane && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
31946
31949
  slidesPaneRenderer ? (
31947
31950
  // The rail's slot (width, collapse, resize handle) stays the viewer's.
@@ -32151,7 +32154,7 @@ function AutosaveRecoveryDialog({
32151
32154
  onDiscard,
32152
32155
  busy = false
32153
32156
  }) {
32154
- const { t } = chunkJKSUB7DR_js.useTranslation();
32157
+ const { t } = chunk5DBKW7F3_js.useTranslation();
32155
32158
  if (!prompt) {
32156
32159
  return null;
32157
32160
  }
@@ -32207,7 +32210,7 @@ function CompatibilityToasts({
32207
32210
  rightInset = 0,
32208
32211
  bottomInset = 0
32209
32212
  }) {
32210
- const { t } = chunkJKSUB7DR_js.useTranslation();
32213
+ const { t } = chunk5DBKW7F3_js.useTranslation();
32211
32214
  const ref = useWebControl(
32212
32215
  { toasts, rightInset, bottomInset, translate: t },
32213
32216
  {
@@ -32252,7 +32255,7 @@ function HeaderFooterPanel({
32252
32255
  onApplyToCurrent,
32253
32256
  onClose
32254
32257
  }) {
32255
- const { t } = chunkJKSUB7DR_js.useTranslation();
32258
+ const { t } = chunk5DBKW7F3_js.useTranslation();
32256
32259
  const showDateTime = headerFooter.hasDateTime ?? false;
32257
32260
  const dateTimeAuto = headerFooter.dateTimeAuto ?? false;
32258
32261
  const showDateText = pptx.isHeaderFooterDateTextVisible(headerFooter);
@@ -32393,7 +32396,7 @@ function HeaderFooterPanel({
32393
32396
  ] }) });
32394
32397
  }
32395
32398
  function MobileBottomBar(p) {
32396
- const { t } = chunkJKSUB7DR_js.useTranslation();
32399
+ const { t } = chunk5DBKW7F3_js.useTranslation();
32397
32400
  const handlers = {
32398
32401
  slides: p.onOpenSlides,
32399
32402
  insert: p.onOpenInsert,
@@ -32419,7 +32422,7 @@ function MobileSlidesSheet({
32419
32422
  onClose,
32420
32423
  ...sidebar
32421
32424
  }) {
32422
- const { t } = chunkJKSUB7DR_js.useTranslation();
32425
+ const { t } = chunk5DBKW7F3_js.useTranslation();
32423
32426
  return /* @__PURE__ */ jsxRuntime.jsx(
32424
32427
  MobileSheet,
32425
32428
  {
@@ -32446,7 +32449,7 @@ function MobileChromeOverlay(props) {
32446
32449
  slideSectionGroups,
32447
32450
  canEdit,
32448
32451
  commentCount
32449
- } = props, { keyboardInset, isKeyboardOpen } = chunk73SDWM6K_js.useKeyboardInsets(), activeSheet = s.isMobileInsertOpen ? "insert" : s.isSlidesPaneOpen ? "slides" : s.isInspectorPaneOpen ? s.sidebarPanelMode === "comments" ? "comments" : "inspector" : !s.isSlideNotesCollapsed ? "notes" : null, closeAllSheets = () => {
32452
+ } = props, { keyboardInset, isKeyboardOpen } = chunkVGU5S37T_js.useKeyboardInsets(), activeSheet = s.isMobileInsertOpen ? "insert" : s.isSlidesPaneOpen ? "slides" : s.isInspectorPaneOpen ? s.sidebarPanelMode === "comments" ? "comments" : "inspector" : !s.isSlideNotesCollapsed ? "notes" : null, closeAllSheets = () => {
32450
32453
  s.setIsSlidesPaneOpen(false);
32451
32454
  s.setIsMobileInsertOpen(false);
32452
32455
  s.setIsInspectorPaneOpen(false);
@@ -32546,7 +32549,7 @@ function MobileChromeOverlay(props) {
32546
32549
  ] });
32547
32550
  }
32548
32551
  function ReadOnlyBanner(p) {
32549
- const { t } = chunkJKSUB7DR_js.useTranslation();
32552
+ const { t } = chunk5DBKW7F3_js.useTranslation();
32550
32553
  const ref = useWebControl(
32551
32554
  pptx.readOnlyBannerState(
32552
32555
  p.recommendation,
@@ -32580,7 +32583,7 @@ function RibbonCustomizationStyle({
32580
32583
  return /* @__PURE__ */ jsxRuntime.jsx("style", { "data-pptx-ribbon-customization": "", children: css });
32581
32584
  }
32582
32585
  function RunProgramNotices({ notices, onDismiss }) {
32583
- const { t } = chunkJKSUB7DR_js.useTranslation();
32586
+ const { t } = chunk5DBKW7F3_js.useTranslation();
32584
32587
  if (notices.length === 0) {
32585
32588
  return null;
32586
32589
  }
@@ -32638,14 +32641,14 @@ function AddinTable({
32638
32641
  selectedId,
32639
32642
  onSelect
32640
32643
  }) {
32641
- const { t } = chunkJKSUB7DR_js.useTranslation();
32644
+ const { t } = chunk5DBKW7F3_js.useTranslation();
32642
32645
  return /* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
32643
32646
  /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "mb-1 text-xs font-semibold text-foreground", children: title }),
32644
32647
  rows.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-2 py-1 text-xs italic text-muted-foreground", children: t("pptx.options.addIns.description") }) : /* @__PURE__ */ jsxRuntime.jsx("table", { className: "w-full border-collapse text-left", children: /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map((row) => /* @__PURE__ */ jsxRuntime.jsxs(
32645
32648
  "tr",
32646
32649
  {
32647
32650
  onClick: () => onSelect(row.id),
32648
- className: chunkJKSUB7DR_js.cn(
32651
+ className: chunk5DBKW7F3_js.cn(
32649
32652
  "cursor-pointer border-b border-border/40 transition-colors",
32650
32653
  selectedId === row.id ? "bg-primary/10" : "hover:bg-accent"
32651
32654
  ),
@@ -32660,7 +32663,7 @@ function AddinTable({
32660
32663
  ] });
32661
32664
  }
32662
32665
  function OptionsAddInsPane({ addinStatus }) {
32663
- const { t } = chunkJKSUB7DR_js.useTranslation();
32666
+ const { t } = chunk5DBKW7F3_js.useTranslation();
32664
32667
  const [selectedId, setSelectedId] = React108.useState(null);
32665
32668
  const rows = pptx.resolveViewerAddinRows(addinStatus);
32666
32669
  const active = rows.filter((row) => row.active);
@@ -32703,7 +32706,7 @@ function CommandList({
32703
32706
  selectedId,
32704
32707
  onSelect
32705
32708
  }) {
32706
- const { t } = chunkJKSUB7DR_js.useTranslation();
32709
+ const { t } = chunk5DBKW7F3_js.useTranslation();
32707
32710
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1", children: [
32708
32711
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-1 text-xs font-medium text-muted-foreground", children: title }),
32709
32712
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -32724,7 +32727,7 @@ function CommandList({
32724
32727
  role: "option",
32725
32728
  "aria-selected": selectedId === id,
32726
32729
  onClick: () => onSelect(id),
32727
- className: chunkJKSUB7DR_js.cn(
32730
+ className: chunk5DBKW7F3_js.cn(
32728
32731
  "flex w-full items-center rounded px-2 py-1.5 text-left text-sm transition-colors",
32729
32732
  selectedId === id ? "bg-primary/15 text-primary" : "text-foreground hover:bg-accent"
32730
32733
  ),
@@ -32742,7 +32745,7 @@ function OptionsQuickAccessPane({
32742
32745
  onQuickAccessCommandsChange,
32743
32746
  onResetQuickAccess
32744
32747
  }) {
32745
- const { t } = chunkJKSUB7DR_js.useTranslation();
32748
+ const { t } = chunk5DBKW7F3_js.useTranslation();
32746
32749
  const [selectedAvailable, setSelectedAvailable] = React108.useState(null);
32747
32750
  const [selectedCurrent, setSelectedCurrent] = React108.useState(null);
32748
32751
  const current = options.quickAccess.commandIds;
@@ -32856,7 +32859,7 @@ function OptionsRibbonPane({
32856
32859
  onRibbonTabHiddenChange,
32857
32860
  onResetRibbon
32858
32861
  }) {
32859
- const { t } = chunkJKSUB7DR_js.useTranslation();
32862
+ const { t } = chunk5DBKW7F3_js.useTranslation();
32860
32863
  const hidden = new Set(options.ribbon.hiddenTabIds);
32861
32864
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-5", children: [
32862
32865
  /* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
@@ -32868,7 +32871,7 @@ function OptionsRibbonPane({
32868
32871
  return /* @__PURE__ */ jsxRuntime.jsxs(
32869
32872
  "label",
32870
32873
  {
32871
- className: chunkJKSUB7DR_js.cn(
32874
+ className: chunk5DBKW7F3_js.cn(
32872
32875
  "flex items-center gap-2 rounded px-2 py-1.5",
32873
32876
  isFile ? "cursor-not-allowed opacity-60" : "cursor-pointer hover:bg-accent"
32874
32877
  ),
@@ -32902,7 +32905,7 @@ function OptionsRibbonPane({
32902
32905
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: pptx.SHORTCUT_REFERENCE_ITEMS.map((shortcut, i) => /* @__PURE__ */ jsxRuntime.jsxs(
32903
32906
  "div",
32904
32907
  {
32905
- className: chunkJKSUB7DR_js.cn(
32908
+ className: chunk5DBKW7F3_js.cn(
32906
32909
  "flex items-center justify-between gap-3 rounded px-3 py-2",
32907
32910
  i % 2 === 0 ? "bg-muted/60" : ""
32908
32911
  ),
@@ -32923,12 +32926,12 @@ async function exportAiChatLogs(options) {
32923
32926
  chats,
32924
32927
  { format: options?.format, detailed: options?.detailed, now: options?.now },
32925
32928
  (filename, content, mime) => {
32926
- chunk73SDWM6K_js.downloadBlob(new Blob([content], { type: mime }), filename);
32929
+ chunkVGU5S37T_js.downloadBlob(new Blob([content], { type: mime }), filename);
32927
32930
  }
32928
32931
  );
32929
32932
  }
32930
32933
  function SettingsAiTab({ store }) {
32931
- const { t } = chunkJKSUB7DR_js.useTranslation();
32934
+ const { t } = chunk5DBKW7F3_js.useTranslation();
32932
32935
  const activeStore = React108.useMemo(() => store ?? host.createChatHistoryStore(), [store]);
32933
32936
  const [chatCount, setChatCount] = React108.useState(null);
32934
32937
  const [detailed, setDetailed] = React108.useState(true);
@@ -33020,7 +33023,7 @@ function SettingsAppearanceTab({
33020
33023
  themes,
33021
33024
  onSelectTheme
33022
33025
  }) {
33023
- const { t } = chunkJKSUB7DR_js.useTranslation();
33026
+ const { t } = chunk5DBKW7F3_js.useTranslation();
33024
33027
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-3", children: themes.map((entry) => {
33025
33028
  const isActive = entry.key === activeThemeKey;
33026
33029
  const previewBackground = entry.theme?.colors?.background ?? "#0b0f19";
@@ -33031,7 +33034,7 @@ function SettingsAppearanceTab({
33031
33034
  type: "button",
33032
33035
  onClick: () => onSelectTheme(entry.key),
33033
33036
  "aria-pressed": isActive,
33034
- className: chunkJKSUB7DR_js.cn(
33037
+ className: chunk5DBKW7F3_js.cn(
33035
33038
  "flex items-center gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors",
33036
33039
  isActive ? "border-primary bg-primary/10" : "border-border hover:border-primary/50 hover:bg-accent"
33037
33040
  ),
@@ -33048,7 +33051,7 @@ function SettingsAppearanceTab({
33048
33051
  /* @__PURE__ */ jsxRuntime.jsx(
33049
33052
  "span",
33050
33053
  {
33051
- className: chunkJKSUB7DR_js.cn("text-xs font-medium", isActive ? "text-primary" : "text-foreground"),
33054
+ className: chunk5DBKW7F3_js.cn("text-xs font-medium", isActive ? "text-primary" : "text-foreground"),
33052
33055
  children: t(entry.labelKey)
33053
33056
  }
33054
33057
  )
@@ -33063,7 +33066,7 @@ function SettingsCustomFontsSection({
33063
33066
  families,
33064
33067
  onRegistered
33065
33068
  }) {
33066
- const { t } = chunkJKSUB7DR_js.useTranslation();
33069
+ const { t } = chunk5DBKW7F3_js.useTranslation();
33067
33070
  const inputRef = React108.useRef(null);
33068
33071
  const [error, setError] = React108.useState(false);
33069
33072
  const handleFile = async (file) => {
@@ -33128,7 +33131,7 @@ function SettingsLanguageTab({
33128
33131
  type: "button",
33129
33132
  onClick: () => onSelectLocale(locale.code),
33130
33133
  "aria-pressed": isActive,
33131
- className: chunkJKSUB7DR_js.cn(
33134
+ className: chunk5DBKW7F3_js.cn(
33132
33135
  "flex w-full items-center justify-between rounded px-3 py-2.5 text-left transition-colors",
33133
33136
  isActive ? "bg-primary/10 text-primary" : "text-foreground hover:bg-accent"
33134
33137
  ),
@@ -33167,7 +33170,7 @@ function OpenSettingsDialog({
33167
33170
  customFontFamilies = NO_CUSTOM_FONT_FAMILIES,
33168
33171
  onCustomFontRegistered
33169
33172
  }) {
33170
- const { t } = chunkJKSUB7DR_js.useTranslation();
33173
+ const { t } = chunk5DBKW7F3_js.useTranslation();
33171
33174
  const viewerCustomization = useViewerCustomizationContext();
33172
33175
  const customization = React108.useMemo(
33173
33176
  () => languageSelectable ? viewerCustomization : {
@@ -33276,7 +33279,7 @@ function ViewerOptionsProvider({
33276
33279
  store,
33277
33280
  children
33278
33281
  }) {
33279
- return /* @__PURE__ */ jsxRuntime.jsx(chunk73SDWM6K_js.ViewerOptionsStoreContext.Provider, { value: store, children: /* @__PURE__ */ jsxRuntime.jsx(chunk73SDWM6K_js.ViewerOptionsContext.Provider, { value: options, children }) });
33282
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkVGU5S37T_js.ViewerOptionsStoreContext.Provider, { value: store, children: /* @__PURE__ */ jsxRuntime.jsx(chunkVGU5S37T_js.ViewerOptionsContext.Provider, { value: options, children }) });
33280
33283
  }
33281
33284
  function useAiBridge(input) {
33282
33285
  const ref = React108.useRef(input);
@@ -33359,7 +33362,7 @@ function useAiPanelController(input) {
33359
33362
  getSelectedElement: () => inputRef.current.selectedElement
33360
33363
  })
33361
33364
  );
33362
- const state = chunk73SDWM6K_js.useController(controller);
33365
+ const state = chunkVGU5S37T_js.useController(controller);
33363
33366
  React108.useEffect(() => () => controller.dispose(), [controller]);
33364
33367
  const liveFocusTargets = React108.useMemo(
33365
33368
  () => host.computeFocusTargets({ activeSlideIndex, selectedElementIds, selectedElementId }),
@@ -33592,7 +33595,7 @@ function useMasterViewCrud(input) {
33592
33595
  forgetHistory,
33593
33596
  pushToast
33594
33597
  } = input;
33595
- const { t } = chunkJKSUB7DR_js.useTranslation();
33598
+ const { t } = chunk5DBKW7F3_js.useTranslation();
33596
33599
  const data = React108.useMemo(
33597
33600
  () => ({ slides, slideMasters }),
33598
33601
  [slides, slideMasters]
@@ -33981,7 +33984,7 @@ function useHostLanguage({
33981
33984
  availableLocales,
33982
33985
  onLocaleChange
33983
33986
  }) {
33984
- const { t, i18n } = chunkJKSUB7DR_js.useHostI18next();
33987
+ const { t, i18n } = chunk5DBKW7F3_js.useHostI18next();
33985
33988
  const [localeCode, setLocaleCode] = React108.useState(
33986
33989
  () => defaultLocale ?? pptx.readStoredViewerPrefs().localeCode ?? "en"
33987
33990
  );
@@ -34021,7 +34024,7 @@ function useProvidedLanguage({
34021
34024
  availableLocales,
34022
34025
  onLocaleChange
34023
34026
  }) {
34024
- const state = React108.useContext(chunkJKSUB7DR_js.PptxI18nContext);
34027
+ const state = React108.useContext(chunk5DBKW7F3_js.PptxI18nContext);
34025
34028
  const { locale } = state;
34026
34029
  const locales = availableLocales ?? NO_LOCALES;
34027
34030
  const controls = React108.useMemo(
@@ -34041,7 +34044,7 @@ function useProvidedLanguage({
34041
34044
  return { state, controls };
34042
34045
  }
34043
34046
  function provideLanguage({ state, controls }, children) {
34044
- return /* @__PURE__ */ jsxRuntime.jsx(chunkJKSUB7DR_js.ViewerI18nContext.Provider, { value: state, children: /* @__PURE__ */ jsxRuntime.jsx(chunkJKSUB7DR_js.ViewerLocaleControlsContext.Provider, { value: controls, children }) });
34047
+ return /* @__PURE__ */ jsxRuntime.jsx(chunk5DBKW7F3_js.ViewerI18nContext.Provider, { value: state, children: /* @__PURE__ */ jsxRuntime.jsx(chunk5DBKW7F3_js.ViewerLocaleControlsContext.Provider, { value: controls, children }) });
34045
34048
  }
34046
34049
  function HostLanguageRoot({ children, ...props }) {
34047
34050
  return provideLanguage(useHostLanguage(props), children);
@@ -34050,11 +34053,11 @@ function ProvidedLanguageRoot({ children, ...props }) {
34050
34053
  return provideLanguage(useProvidedLanguage(props), children);
34051
34054
  }
34052
34055
  function ViewerI18nRoot(props) {
34053
- const Root = React108.useContext(chunkJKSUB7DR_js.PptxI18nContext) ? ProvidedLanguageRoot : HostLanguageRoot;
34056
+ const Root = React108.useContext(chunk5DBKW7F3_js.PptxI18nContext) ? ProvidedLanguageRoot : HostLanguageRoot;
34054
34057
  return /* @__PURE__ */ jsxRuntime.jsx(Root, { ...props });
34055
34058
  }
34056
34059
  function useViewerLocaleControls() {
34057
- return React108.useContext(chunkJKSUB7DR_js.ViewerLocaleControlsContext);
34060
+ return React108.useContext(chunk5DBKW7F3_js.ViewerLocaleControlsContext);
34058
34061
  }
34059
34062
  var NO_RIBBON_ADD_INS = [];
34060
34063
  var NO_FILE_PROVIDERS = [];
@@ -34133,9 +34136,9 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34133
34136
  limits
34134
34137
  } = props;
34135
34138
  const cloudDocument = React108.useMemo(() => pptx.createCloudDocumentController(), []);
34136
- const cloudFile = chunk73SDWM6K_js.useController(cloudDocument).file;
34139
+ const cloudFile = chunkVGU5S37T_js.useController(cloudDocument).file;
34137
34140
  const {
34138
- storage,
34141
+ storage: viewerStorage,
34139
34142
  fileName,
34140
34143
  filePath,
34141
34144
  // `readOnly` takes editing away from a host that also allows it.
@@ -34146,6 +34149,12 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34146
34149
  fileName: hostFileName,
34147
34150
  filePath: hostFilePath
34148
34151
  });
34152
+ const saveProgress = React108.useMemo(() => pptx.createSaveProgressController(), []);
34153
+ const saveProgressState = chunkVGU5S37T_js.useController(saveProgress);
34154
+ const storage = React108.useMemo(
34155
+ () => viewerStorage ? saveProgress.wrap(viewerStorage) : viewerStorage,
34156
+ [viewerStorage, saveProgress]
34157
+ );
34149
34158
  const collaboration = pptx.resolveCollaborationConfig(collaborationInput);
34150
34159
  const rootOptions = pptx.resolveViewerRootOptions(props);
34151
34160
  React108.useEffect(() => {
@@ -34182,7 +34191,7 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34182
34191
  (current) => current.includes(family) ? current : [...current, family]
34183
34192
  );
34184
34193
  }, []);
34185
- const { t } = chunkJKSUB7DR_js.useTranslation();
34194
+ const { t } = chunk5DBKW7F3_js.useTranslation();
34186
34195
  const {
34187
34196
  localeCode,
34188
34197
  locales: resolvedLocales,
@@ -34239,7 +34248,7 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34239
34248
  },
34240
34249
  [hostStorage, cloudDocument]
34241
34250
  );
34242
- const { optionsStore, options: viewerOptions } = chunk73SDWM6K_js.useViewerOptions();
34251
+ const { optionsStore, options: viewerOptions } = chunkVGU5S37T_js.useViewerOptions();
34243
34252
  const custom = useViewerCustomization(
34244
34253
  customization,
34245
34254
  legacyHiddenActions,
@@ -34258,8 +34267,8 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34258
34267
  const handleEnableEditing = React108.useCallback(() => {
34259
34268
  setProtectedViewOverridden(true);
34260
34269
  }, []);
34261
- const readOnlyRec = chunk73SDWM6K_js.useReadOnlyRecommendationState(content);
34262
- const compatToastsState = chunk73SDWM6K_js.useCompatibilityToastsState();
34270
+ const readOnlyRec = chunkVGU5S37T_js.useReadOnlyRecommendationState(content);
34271
+ const compatToastsState = chunkVGU5S37T_js.useCompatibilityToastsState();
34263
34272
  const [notesBarHeight, setNotesBarHeight] = React108.useState(0);
34264
34273
  const runProgramNoticesState = useRunProgramNoticesState();
34265
34274
  const [collaborationReadOnly, setCollaborationReadOnly] = React108.useState(Boolean(collaboration));
@@ -34282,8 +34291,8 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34282
34291
  filePath
34283
34292
  });
34284
34293
  const [isShareDialogOpen, setIsShareDialogOpen] = React108.useState(false);
34285
- const { reducedMotion, toggleReducedMotion } = chunk73SDWM6K_js.useReducedMotion();
34286
- const state = chunk73SDWM6K_js.useViewerState({
34294
+ const { reducedMotion, toggleReducedMotion } = chunkVGU5S37T_js.useReducedMotion();
34295
+ const state = chunkVGU5S37T_js.useViewerState({
34287
34296
  content,
34288
34297
  canEdit,
34289
34298
  inspectorInitiallyOpen: props.inspectorInitiallyOpen
@@ -34410,16 +34419,16 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34410
34419
  }
34411
34420
  }, [settings, optionsStore]);
34412
34421
  const handleClearOptionsCache = useAutosaveCacheMaintenance(viewerOptions, storage);
34413
- const mobile = chunk73SDWM6K_js.useIsMobile();
34422
+ const mobile = chunkVGU5S37T_js.useIsMobile();
34414
34423
  const { isMobile, isTouchDevice, isVirtualKeyboardOpen } = mobile;
34415
- const resizablePanels = chunk73SDWM6K_js.useResizablePanels();
34424
+ const resizablePanels = chunkVGU5S37T_js.useResizablePanels();
34416
34425
  const {
34417
34426
  gridSpacingPx,
34418
34427
  visibleSlideIndexes,
34419
34428
  slideSectionGroups,
34420
34429
  masterPseudoSlide,
34421
34430
  authoredRange
34422
- } = chunk73SDWM6K_js.useDerivedSlideState({
34431
+ } = chunkVGU5S37T_js.useDerivedSlideState({
34423
34432
  slides,
34424
34433
  sections: state.sections,
34425
34434
  customShows: state.customShows,
@@ -34444,7 +34453,7 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34444
34453
  state.cropSessionRef
34445
34454
  ]
34446
34455
  );
34447
- const zoom = chunk73SDWM6K_js.useZoomViewport({
34456
+ const zoom = chunkVGU5S37T_js.useZoomViewport({
34448
34457
  canvasSize,
34449
34458
  selectedElements: state.selectedElements,
34450
34459
  fitPadding: props.fitPadding,
@@ -34460,7 +34469,7 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34460
34469
  onChangeCallback.current?.();
34461
34470
  }, [setIsDirty]);
34462
34471
  const restoreHistoryThemeRef = React108.useRef(void 0);
34463
- const history = chunk73SDWM6K_js.useEditorHistory({
34472
+ const history = chunkVGU5S37T_js.useEditorHistory({
34464
34473
  slides,
34465
34474
  canvasSize,
34466
34475
  activeSlideIndex,
@@ -34489,7 +34498,7 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34489
34498
  setEditTemplateMode: state.setEditTemplateMode,
34490
34499
  setHeaderFooter: state.setHeaderFooter
34491
34500
  });
34492
- const { presentation, annotations, actionSoundHandlerRef, setExitModeHandler } = chunk73SDWM6K_js.usePresentationSetup({
34501
+ const { presentation, annotations, actionSoundHandlerRef, setExitModeHandler } = chunkVGU5S37T_js.usePresentationSetup({
34493
34502
  mode,
34494
34503
  slides,
34495
34504
  visibleSlideIndexes,
@@ -34568,7 +34577,7 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34568
34577
  loading,
34569
34578
  error
34570
34579
  ]);
34571
- chunk73SDWM6K_js.useTouchGestures({
34580
+ chunkVGU5S37T_js.useTouchGestures({
34572
34581
  targetRef: zoom.canvasViewportRef,
34573
34582
  currentScale: zoom.scale,
34574
34583
  callbacks: {
@@ -34590,7 +34599,7 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34590
34599
  },
34591
34600
  enabled: isTouchDevice
34592
34601
  });
34593
- const dialogs = chunk73SDWM6K_js.useViewerDialogs({
34602
+ const dialogs = chunkVGU5S37T_js.useViewerDialogs({
34594
34603
  mode,
34595
34604
  slides,
34596
34605
  activeSlide,
@@ -34618,7 +34627,7 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34618
34627
  history,
34619
34628
  embeddedFontFamilies: state.embeddedFonts.map((font) => font.name)
34620
34629
  });
34621
- chunk73SDWM6K_js.useClearSelectionOnSlideChange(state, activeSlideIndex);
34630
+ chunkVGU5S37T_js.useClearSelectionOnSlideChange(state, activeSlideIndex);
34622
34631
  const zoomBeforePresentRef = React108.useRef(null);
34623
34632
  React108.useEffect(() => {
34624
34633
  if (mode !== "present") {
@@ -34636,7 +34645,7 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34636
34645
  zoom.handleZoomToFit();
34637
34646
  zoom.canvasViewportRef.current?.scrollTo({ left: 0, top: 0 });
34638
34647
  }, [mode]);
34639
- const editorOps = chunk73SDWM6K_js.useEditorOperations({
34648
+ const editorOps = chunkVGU5S37T_js.useEditorOperations({
34640
34649
  state,
34641
34650
  history,
34642
34651
  zoom,
@@ -34681,7 +34690,7 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34681
34690
  handlerRef,
34682
34691
  viewerApi,
34683
34692
  loadVersion
34684
- } = chunk73SDWM6K_js.useViewerIntegration({
34693
+ } = chunkVGU5S37T_js.useViewerIntegration({
34685
34694
  transformCommittedText: (text, previous) => pptx.applyAutoCorrectToEdit(text, previous, viewerOptions.proofing),
34686
34695
  state,
34687
34696
  zoom,
@@ -34824,7 +34833,7 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34824
34833
  updateElementById: editorOps.ops.updateElementById
34825
34834
  });
34826
34835
  const ribbonScope = useRibbonScopeToken();
34827
- const viewPreferencesSync = chunk73SDWM6K_js.useViewPreferencesSync({
34836
+ const viewPreferencesSync = chunkVGU5S37T_js.useViewPreferencesSync({
34828
34837
  loadVersion,
34829
34838
  viewProperties: state.viewProperties,
34830
34839
  setViewProperties: state.setViewProperties,
@@ -34875,7 +34884,7 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34875
34884
  },
34876
34885
  [state]
34877
34886
  );
34878
- const layoutSwitching = chunk73SDWM6K_js.useLayoutSwitching({
34887
+ const layoutSwitching = chunkVGU5S37T_js.useLayoutSwitching({
34879
34888
  handler: handlerRef.current,
34880
34889
  slides,
34881
34890
  activeSlideIndex,
@@ -34994,7 +35003,7 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
34994
35003
  "data-pptx-editor-chrome": "",
34995
35004
  ...{ [pptx.RIBBON_SCOPE_ATTR]: ribbonScope },
34996
35005
  "aria-busy": loading,
34997
- className: chunkJKSUB7DR_js.cn(
35006
+ className: chunk5DBKW7F3_js.cn(
34998
35007
  "h-full w-full bg-background text-foreground relative",
34999
35008
  ...pptx.resolveOptionRootClasses(viewerOptions, "pptx")
35000
35009
  ),
@@ -35144,6 +35153,7 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
35144
35153
  activeSlideIndex,
35145
35154
  isDirty: state.isDirty,
35146
35155
  autosaveStatus,
35156
+ saveProgress: saveProgressState,
35147
35157
  onToggleNotes: () => state.setIsSlideNotesCollapsed((p) => !p),
35148
35158
  onUpdateNotes: propertyHandlers.handleUpdateNotes,
35149
35159
  collaborationSlot: collaboration && shareAvailable ? /* @__PURE__ */ jsxRuntime.jsx(CollaborationStatusStrip, {}) : void 0,
@@ -35394,8 +35404,8 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
35394
35404
  // Nothing previously provided it, so every one of those consumers was
35395
35405
  // silently reading `DEFAULT_VIEWER_OPTIONS` forever, no matter what
35396
35406
  // the user changed in the Options dialog.
35397
- /* @__PURE__ */ jsxRuntime.jsx(ViewerOptionsProvider, { options: viewerOptions, store: optionsStore, children: /* @__PURE__ */ jsxRuntime.jsx(ViewerCustomizationContext.Provider, { value: customizationResolved, children: /* @__PURE__ */ jsxRuntime.jsx(ViewerStorageContext.Provider, { value: hostStorage, children: /* @__PURE__ */ jsxRuntime.jsx(ViewerCloudFilesContext.Provider, { value: cloudFiles, children: /* @__PURE__ */ jsxRuntime.jsx(ViewerRegionBaseContext.Provider, { value: regionBase, children: /* @__PURE__ */ jsxRuntime.jsx(RibbonAddInsContext.Provider, { value: ribbonAddIns ?? NO_RIBBON_ADD_INS, children: /* @__PURE__ */ jsxRuntime.jsx(AccountAuthContext.Provider, { value: accountAuth, children: /* @__PURE__ */ jsxRuntime.jsx(chunk73SDWM6K_js.Rendering3DFlagsContext.Provider, { value: effective3D, children: /* @__PURE__ */ jsxRuntime.jsx(ViewerThemeProvider, { theme: effectiveTheme, children: /* @__PURE__ */ jsxRuntime.jsxs(
35398
- chunk73SDWM6K_js.CollaborationProvider,
35407
+ /* @__PURE__ */ jsxRuntime.jsx(ViewerOptionsProvider, { options: viewerOptions, store: optionsStore, children: /* @__PURE__ */ jsxRuntime.jsx(ViewerCustomizationContext.Provider, { value: customizationResolved, children: /* @__PURE__ */ jsxRuntime.jsx(ViewerStorageContext.Provider, { value: hostStorage, children: /* @__PURE__ */ jsxRuntime.jsx(ViewerCloudFilesContext.Provider, { value: cloudFiles, children: /* @__PURE__ */ jsxRuntime.jsx(ViewerRegionBaseContext.Provider, { value: regionBase, children: /* @__PURE__ */ jsxRuntime.jsx(RibbonAddInsContext.Provider, { value: ribbonAddIns ?? NO_RIBBON_ADD_INS, children: /* @__PURE__ */ jsxRuntime.jsx(AccountAuthContext.Provider, { value: accountAuth, children: /* @__PURE__ */ jsxRuntime.jsx(chunkVGU5S37T_js.Rendering3DFlagsContext.Provider, { value: effective3D, children: /* @__PURE__ */ jsxRuntime.jsx(ViewerThemeProvider, { theme: effectiveTheme, children: /* @__PURE__ */ jsxRuntime.jsxs(
35408
+ chunkVGU5S37T_js.CollaborationProvider,
35399
35409
  {
35400
35410
  config: collaboration,
35401
35411
  canvasWidth: canvasSize.width,
@@ -35452,19 +35462,19 @@ var PowerPointViewerBody = /* @__PURE__ */ React108.forwardRef(
35452
35462
  slideCount: slides.length
35453
35463
  }
35454
35464
  ),
35455
- /* @__PURE__ */ jsxRuntime.jsx(ShapeFormatContext.Provider, { value: shapeFormat, children: /* @__PURE__ */ jsxRuntime.jsx(RibbonGalleryCommandsContext.Provider, { value: ribbonGalleries, children: /* @__PURE__ */ jsxRuntime.jsx(chunk73SDWM6K_js.ChartFormatContext.Provider, { value: chartFormat, children: viewerContent }) }) })
35465
+ /* @__PURE__ */ jsxRuntime.jsx(ShapeFormatContext.Provider, { value: shapeFormat, children: /* @__PURE__ */ jsxRuntime.jsx(RibbonGalleryCommandsContext.Provider, { value: ribbonGalleries, children: /* @__PURE__ */ jsxRuntime.jsx(chunkVGU5S37T_js.ChartFormatContext.Provider, { value: chartFormat, children: viewerContent }) }) })
35456
35466
  ]
35457
35467
  }
35458
35468
  ) }) }) }) }) }) }) }) }) })
35459
35469
  );
35460
35470
  }
35461
35471
  );
35462
- var PowerPointViewer2 = /* @__PURE__ */ chunk73SDWM6K_js.withDisplayName(
35472
+ var PowerPointViewer2 = /* @__PURE__ */ chunkVGU5S37T_js.withDisplayName(
35463
35473
  PowerPointViewerComponent,
35464
35474
  "PowerPointViewer"
35465
35475
  );
35466
35476
  function CollaborationStatusStrip() {
35467
- const collab = chunk73SDWM6K_js.useCollaboration();
35477
+ const collab = chunkVGU5S37T_js.useCollaboration();
35468
35478
  if (!collab) {
35469
35479
  return null;
35470
35480
  }
@@ -35481,9 +35491,9 @@ function CollaborationStateReporter({
35481
35491
  onChange,
35482
35492
  onStatus
35483
35493
  }) {
35484
- const collab = chunk73SDWM6K_js.useCollaboration();
35494
+ const collab = chunkVGU5S37T_js.useCollaboration();
35485
35495
  useCollaborationStateReport(collab, onChange);
35486
- chunk73SDWM6K_js.useReportOnChange(collab?.status ?? "disconnected", onStatus, "disconnected");
35496
+ chunkVGU5S37T_js.useReportOnChange(collab?.status ?? "disconnected", onStatus, "disconnected");
35487
35497
  return null;
35488
35498
  }
35489
35499
  function CollaborationDocumentSync({
@@ -35498,8 +35508,8 @@ function CollaborationDocumentSync({
35498
35508
  onReadOnlyChange,
35499
35509
  history
35500
35510
  }) {
35501
- const collab = chunk73SDWM6K_js.useCollaboration();
35502
- chunk73SDWM6K_js.useCollaborationDocumentSync({
35511
+ const collab = chunkVGU5S37T_js.useCollaboration();
35512
+ chunkVGU5S37T_js.useCollaborationDocumentSync({
35503
35513
  collaboration: collab,
35504
35514
  history,
35505
35515
  slides,
@@ -35519,14 +35529,14 @@ function CollaborationFollowLayer({
35519
35529
  setActiveSlideIndex,
35520
35530
  slideCount
35521
35531
  }) {
35522
- const collab = chunk73SDWM6K_js.useCollaboration();
35523
- const { followedClientId, followUser } = chunk73SDWM6K_js.useFollowMode({
35532
+ const collab = chunkVGU5S37T_js.useCollaboration();
35533
+ const { followedClientId, followUser } = chunkVGU5S37T_js.useFollowMode({
35524
35534
  collab,
35525
35535
  activeSlideIndex,
35526
35536
  setActiveSlideIndex,
35527
35537
  slideCount
35528
35538
  });
35529
- chunk73SDWM6K_js.useBroadcastFollower({
35539
+ chunkVGU5S37T_js.useBroadcastFollower({
35530
35540
  collab,
35531
35541
  activeSlideIndex,
35532
35542
  setActiveSlideIndex,
@@ -35568,7 +35578,7 @@ function PptxI18nProvider({
35568
35578
  () => ({ t: withEnglishFallback(translate), locale }),
35569
35579
  [translate, locale]
35570
35580
  );
35571
- return /* @__PURE__ */ jsxRuntime.jsx(chunkJKSUB7DR_js.PptxI18nContext.Provider, { value: state, children });
35581
+ return /* @__PURE__ */ jsxRuntime.jsx(chunk5DBKW7F3_js.PptxI18nContext.Provider, { value: state, children });
35572
35582
  }
35573
35583
 
35574
35584
  Object.defineProperty(exports, "THEME_CATALOG", {