pptx-react-viewer 3.17.0 → 3.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/{AiChatPanel-VWVGQ5DD.js → AiChatPanel-GYH43XWW.js} +10 -10
  3. package/dist/AiChatPanel-GYH43XWW.js.br +0 -0
  4. package/dist/AiChatPanel-GYH43XWW.js.gz +0 -0
  5. package/dist/{AiChatPanel-4LKH44IE.mjs → AiChatPanel-SINEEZBW.mjs} +2 -2
  6. package/dist/AiChatPanel-SINEEZBW.mjs.br +0 -0
  7. package/dist/AiChatPanel-SINEEZBW.mjs.gz +0 -0
  8. package/dist/{chunk-3AJ54EAB.js → chunk-64FUV37N.js} +9 -0
  9. package/dist/chunk-64FUV37N.js.br +0 -0
  10. package/dist/{chunk-3AJ54EAB.js.gz → chunk-64FUV37N.js.gz} +0 -0
  11. package/dist/{chunk-NJ3WCYYG.js → chunk-7FBKS7OS.js} +9 -9
  12. package/dist/chunk-7FBKS7OS.js.br +0 -0
  13. package/dist/chunk-7FBKS7OS.js.gz +0 -0
  14. package/dist/{chunk-3UGVURWU.js → chunk-E55VEC37.js} +40 -40
  15. package/dist/chunk-E55VEC37.js.br +0 -0
  16. package/dist/chunk-E55VEC37.js.gz +0 -0
  17. package/dist/{chunk-72LYFUGL.js → chunk-IRG7SIUX.js} +359 -362
  18. package/dist/chunk-IRG7SIUX.js.br +0 -0
  19. package/dist/chunk-IRG7SIUX.js.gz +0 -0
  20. package/dist/{chunk-EDMJYVCS.mjs → chunk-IXKAIIA2.mjs} +23 -26
  21. package/dist/chunk-IXKAIIA2.mjs.br +0 -0
  22. package/dist/chunk-IXKAIIA2.mjs.gz +0 -0
  23. package/dist/{chunk-HMX3MQR7.mjs → chunk-LAU34UMB.mjs} +9 -1
  24. package/dist/chunk-LAU34UMB.mjs.br +0 -0
  25. package/dist/{chunk-HMX3MQR7.mjs.gz → chunk-LAU34UMB.mjs.gz} +0 -0
  26. package/dist/{chunk-7YOA4HNP.mjs → chunk-OAKDJYYT.mjs} +2 -2
  27. package/dist/chunk-OAKDJYYT.mjs.br +0 -0
  28. package/dist/chunk-OAKDJYYT.mjs.gz +0 -0
  29. package/dist/{chunk-23PW4Y4R.mjs → chunk-VYSMTC5C.mjs} +1 -1
  30. package/dist/chunk-VYSMTC5C.mjs.br +0 -0
  31. package/dist/chunk-VYSMTC5C.mjs.gz +0 -0
  32. package/dist/i18n.js +4 -4
  33. package/dist/i18n.js.br +0 -0
  34. package/dist/i18n.js.gz +0 -0
  35. package/dist/i18n.mjs +1 -1
  36. package/dist/i18n.mjs.br +0 -0
  37. package/dist/i18n.mjs.gz +0 -0
  38. package/dist/index.js +15 -15
  39. package/dist/index.js.br +0 -0
  40. package/dist/index.js.gz +0 -0
  41. package/dist/index.mjs +4 -4
  42. package/dist/index.mjs.br +0 -0
  43. package/dist/index.mjs.gz +0 -0
  44. package/dist/internals.js +75 -75
  45. package/dist/internals.js.br +0 -0
  46. package/dist/internals.js.gz +0 -0
  47. package/dist/internals.mjs +3 -3
  48. package/dist/internals.mjs.br +0 -0
  49. package/dist/internals.mjs.gz +0 -0
  50. package/dist/viewer/index.js +17 -17
  51. package/dist/viewer/index.js.br +0 -0
  52. package/dist/viewer/index.js.gz +0 -0
  53. package/dist/viewer/index.mjs +4 -4
  54. package/dist/viewer/index.mjs.br +0 -0
  55. package/dist/viewer/index.mjs.gz +0 -0
  56. package/package.json +1 -1
  57. package/dist/AiChatPanel-4LKH44IE.mjs.br +0 -0
  58. package/dist/AiChatPanel-4LKH44IE.mjs.gz +0 -0
  59. package/dist/AiChatPanel-VWVGQ5DD.js.br +0 -0
  60. package/dist/AiChatPanel-VWVGQ5DD.js.gz +0 -0
  61. package/dist/chunk-23PW4Y4R.mjs.br +0 -0
  62. package/dist/chunk-23PW4Y4R.mjs.gz +0 -0
  63. package/dist/chunk-3AJ54EAB.js.br +0 -0
  64. package/dist/chunk-3UGVURWU.js.br +0 -0
  65. package/dist/chunk-3UGVURWU.js.gz +0 -0
  66. package/dist/chunk-72LYFUGL.js.br +0 -0
  67. package/dist/chunk-72LYFUGL.js.gz +0 -0
  68. package/dist/chunk-7YOA4HNP.mjs.br +0 -0
  69. package/dist/chunk-7YOA4HNP.mjs.gz +0 -0
  70. package/dist/chunk-EDMJYVCS.mjs.br +0 -0
  71. package/dist/chunk-EDMJYVCS.mjs.gz +0 -0
  72. package/dist/chunk-HMX3MQR7.mjs.br +0 -0
  73. package/dist/chunk-NJ3WCYYG.js.br +0 -0
  74. package/dist/chunk-NJ3WCYYG.js.gz +0 -0
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkKVXB22D3_js = require('./chunk-KVXB22D3.js');
4
- var chunk3UGVURWU_js = require('./chunk-3UGVURWU.js');
5
- var chunkNJ3WCYYG_js = require('./chunk-NJ3WCYYG.js');
4
+ var chunkE55VEC37_js = require('./chunk-E55VEC37.js');
5
+ var chunk7FBKS7OS_js = require('./chunk-7FBKS7OS.js');
6
6
  var chunk4SPZ5IZN_js = require('./chunk-4SPZ5IZN.js');
7
- var chunk3AJ54EAB_js = require('./chunk-3AJ54EAB.js');
7
+ var chunk64FUV37N_js = require('./chunk-64FUV37N.js');
8
8
  var React20 = require('react');
9
9
  var jsxRuntime = require('react/jsx-runtime');
10
10
  var reactI18next = require('react-i18next');
@@ -43,7 +43,7 @@ function CollaborationProvider({
43
43
  canvasHeight,
44
44
  children
45
45
  }) {
46
- const value = chunk3UGVURWU_js.useCollaborativeState({
46
+ const value = chunkE55VEC37_js.useCollaborativeState({
47
47
  config,
48
48
  canvasWidth,
49
49
  canvasHeight
@@ -497,7 +497,7 @@ function LoadingState({ className }) {
497
497
  role: "status",
498
498
  "aria-live": "polite",
499
499
  "aria-atomic": "true",
500
- className: chunkNJ3WCYYG_js.cn(
500
+ className: chunk7FBKS7OS_js.cn(
501
501
  "h-full w-full flex items-center justify-center text-muted-foreground",
502
502
  className
503
503
  ),
@@ -565,7 +565,7 @@ function Area3DChartRenderer({
565
565
  () => chunk4SPZ5IZN_js.buildAreaChart3DDataForElement(element, { width: element.width, height: element.height }),
566
566
  [element]
567
567
  );
568
- const svgFallback = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkNJ3WCYYG_js.renderChartElement(element) });
568
+ const svgFallback = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk7FBKS7OS_js.renderChartElement(element) });
569
569
  if (!options || threeAvailable === false) {
570
570
  return svgFallback;
571
571
  }
@@ -634,7 +634,7 @@ function Bar3DChartRenderer({
634
634
  () => chunk4SPZ5IZN_js.buildBarChart3DDataForElement(element, { width: element.width, height: element.height }),
635
635
  [element]
636
636
  );
637
- const svgFallback = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkNJ3WCYYG_js.renderChartElement(element) });
637
+ const svgFallback = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk7FBKS7OS_js.renderChartElement(element) });
638
638
  if (!options || threeAvailable === false) {
639
639
  return svgFallback;
640
640
  }
@@ -737,7 +737,7 @@ function Line3DChartRenderer({
737
737
  () => chunk4SPZ5IZN_js.buildLineChart3DDataForElement(element, { width: element.width, height: element.height }),
738
738
  [element]
739
739
  );
740
- const svgFallback = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkNJ3WCYYG_js.renderChartElement(element) });
740
+ const svgFallback = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk7FBKS7OS_js.renderChartElement(element) });
741
741
  if (!options || threeAvailable === false) {
742
742
  return svgFallback;
743
743
  }
@@ -805,7 +805,7 @@ function PieChart3DRenderer({
805
805
  () => chunk4SPZ5IZN_js.buildPieChart3DDataForElement(element, { width: element.width, height: element.height }),
806
806
  [element]
807
807
  );
808
- const svgFallback = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkNJ3WCYYG_js.renderChartElement(element) });
808
+ const svgFallback = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk7FBKS7OS_js.renderChartElement(element) });
809
809
  if (!options || threeAvailable === false) {
810
810
  return svgFallback;
811
811
  }
@@ -873,7 +873,7 @@ function SurfaceChart3DRenderer({
873
873
  () => chunk4SPZ5IZN_js.buildSurfaceChart3DDataForElement(element, { width: element.width, height: element.height }),
874
874
  [element]
875
875
  );
876
- const svgFallback = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkNJ3WCYYG_js.renderChartElement(element) });
876
+ const svgFallback = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk7FBKS7OS_js.renderChartElement(element) });
877
877
  if (!options || threeAvailable === false) {
878
878
  return svgFallback;
879
879
  }
@@ -1057,7 +1057,7 @@ function ChartElementView({
1057
1057
  chunk4SPZ5IZN_js.getBarFacePicturePixelSampleVersion
1058
1058
  );
1059
1059
  const viewModel = React20.useMemo(() => {
1060
- return canEdit ? chunkNJ3WCYYG_js.buildReactChartViewModel(element) : null;
1060
+ return canEdit ? chunk7FBKS7OS_js.buildReactChartViewModel(element) : null;
1061
1061
  }, [canEdit, element, barFacePictureSampleVersion]);
1062
1062
  React20.useEffect(chunk4SPZ5IZN_js.ensureChartInteractionStyles, []);
1063
1063
  React20.useEffect(() => {
@@ -1171,7 +1171,7 @@ function ChartElementView({
1171
1171
  interaction: chart3DInteraction,
1172
1172
  selectedPart
1173
1173
  }
1174
- ) : chunkNJ3WCYYG_js.renderChartElement(renderedElement),
1174
+ ) : chunk7FBKS7OS_js.renderChartElement(renderedElement),
1175
1175
  dragValue !== null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute top-1 right-1 z-10 rounded bg-primary/90 px-1.5 py-0.5 text-[10px] font-medium text-white pointer-events-none", children: chunk4SPZ5IZN_js.formatAxisValue(dragValue) }),
1176
1176
  titleDraft !== null && /* @__PURE__ */ jsxRuntime.jsx(
1177
1177
  "input",
@@ -1358,7 +1358,7 @@ function renderImg(el, style, filter, alt, opacity) {
1358
1358
  ] });
1359
1359
  }
1360
1360
  }
1361
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-gray-500 bg-gray-100", children: chunk3AJ54EAB_js.translationsEn["pptx.elementType.image"] });
1361
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-gray-500 bg-gray-100", children: chunk64FUV37N_js.translationsEn["pptx.elementType.image"] });
1362
1362
  }
1363
1363
  const effectStyles = {
1364
1364
  ...filter ? { filter } : {},
@@ -1375,7 +1375,7 @@ function renderImg(el, style, filter, alt, opacity) {
1375
1375
  "div",
1376
1376
  {
1377
1377
  className: "pointer-events-none select-none w-full h-full",
1378
- style: { ...chunkNJ3WCYYG_js.getImageTilingStyle(el), ...effectStyles }
1378
+ style: { ...chunk7FBKS7OS_js.getImageTilingStyle(el), ...effectStyles }
1379
1379
  }
1380
1380
  )
1381
1381
  ] });
@@ -1384,7 +1384,7 @@ function renderImg(el, style, filter, alt, opacity) {
1384
1384
  chunk4SPZ5IZN_js.isImageLikeElement(el) ? el.imageEffects?.colorWash : void 0
1385
1385
  );
1386
1386
  const clrChange = "imageEffects" in el ? el.imageEffects?.clrChange : void 0;
1387
- const duotoneColors = chunkNJ3WCYYG_js.getDuotoneColors(el);
1387
+ const duotoneColors = chunk7FBKS7OS_js.getDuotoneColors(el);
1388
1388
  const useDuotoneCanvas = Boolean(duotoneColors && !clrChange);
1389
1389
  const filterForImg = useDuotoneCanvas ? chunk4SPZ5IZN_js.getImageEffectsFilter(el, { excludeDuotone: true }) : filter;
1390
1390
  const canvasEffectStyles = {
@@ -1613,7 +1613,7 @@ function ResizeHandles({
1613
1613
  last = deg;
1614
1614
  const transform = `rotate(${deg}deg)${base}`;
1615
1615
  wrapper.style.transform = transform;
1616
- chunk3UGVURWU_js.syncSelectionHandleOverlay(wrapper, elementId, { transform });
1616
+ chunkE55VEC37_js.syncSelectionHandleOverlay(wrapper, elementId, { transform });
1617
1617
  };
1618
1618
  const onPointerMove = (ev) => apply(ev.clientX, ev.clientY, ev.shiftKey);
1619
1619
  const end = () => {
@@ -1634,7 +1634,7 @@ function ResizeHandles({
1634
1634
  {
1635
1635
  type: "button",
1636
1636
  "aria-label": t("pptx.selectionOverlay.resize", { handle }),
1637
- className: chunkNJ3WCYYG_js.cn("absolute z-10 group", posClass, cursor),
1637
+ className: chunk7FBKS7OS_js.cn("absolute z-10 group", posClass, cursor),
1638
1638
  style: peStyle,
1639
1639
  onPointerDown: (e) => handleResizePointer(e, handle),
1640
1640
  onMouseDown: (e) => {
@@ -1653,7 +1653,7 @@ function ResizeHandles({
1653
1653
  {
1654
1654
  type: "button",
1655
1655
  "aria-label": t("pptx.selectionOverlay.resize", { handle }),
1656
- className: chunkNJ3WCYYG_js.cn("absolute z-10", posClass, cursor),
1656
+ className: chunk7FBKS7OS_js.cn("absolute z-10", posClass, cursor),
1657
1657
  style: peStyle,
1658
1658
  onPointerDown: (e) => handleResizePointer(e, handle),
1659
1659
  onMouseDown: (e) => {
@@ -1661,7 +1661,7 @@ function ResizeHandles({
1661
1661
  onResizePointerDown(elementId, e, handle);
1662
1662
  },
1663
1663
  children: [
1664
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkNJ3WCYYG_js.cn(sizeClass, "border border-white bg-primary shadow") }),
1664
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunk7FBKS7OS_js.cn(sizeClass, "border border-white bg-primary shadow") }),
1665
1665
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -inset-2 max-md:-inset-1" })
1666
1666
  ]
1667
1667
  },
@@ -1742,13 +1742,13 @@ var ConnectorElementRenderer = React20__default.default.memo(
1742
1742
  textStyleOverrideCss
1743
1743
  }) {
1744
1744
  const shapeEl = chunk4SPZ5IZN_js.hasShapeProperties(el) ? el : void 0;
1745
- const boxWidth = Math.max(el.width, chunkNJ3WCYYG_js.MIN_ELEMENT_SIZE);
1746
- const boxHeight = Math.max(el.height, chunkNJ3WCYYG_js.MIN_ELEMENT_SIZE);
1745
+ const boxWidth = Math.max(el.width, chunk7FBKS7OS_js.MIN_ELEMENT_SIZE);
1746
+ const boxHeight = Math.max(el.height, chunk7FBKS7OS_js.MIN_ELEMENT_SIZE);
1747
1747
  const viewWidth = Math.max(el.width, 0);
1748
1748
  const viewHeight = Math.max(el.height, 0);
1749
1749
  const ss = shapeEl?.shapeStyle;
1750
1750
  const strokeWidth = Math.max(0, ss?.strokeWidth ?? 2);
1751
- const strokeColor = chunk4SPZ5IZN_js.normalizeHexColor(ss?.strokeColor, chunkNJ3WCYYG_js.DEFAULT_STROKE_COLOR);
1751
+ const strokeColor = chunk4SPZ5IZN_js.normalizeHexColor(ss?.strokeColor, chunk7FBKS7OS_js.DEFAULT_STROKE_COLOR);
1752
1752
  const strokePaint = chunk4SPZ5IZN_js.colorWithOpacity(strokeColor, ss?.strokeOpacity);
1753
1753
  const dashType = chunk4SPZ5IZN_js.normalizeStrokeDashType(ss?.strokeDash);
1754
1754
  const dashArray = chunk4SPZ5IZN_js.getSvgStrokeDasharray(
@@ -1769,7 +1769,7 @@ var ConnectorElementRenderer = React20__default.default.memo(
1769
1769
  const connectorText = textEl?.text?.trim() ?? "";
1770
1770
  const connectorTextSegments = textEl?.textSegments;
1771
1771
  const connectorTextStyle = textEl?.textStyle;
1772
- const pathGeometry = shapeEl ? chunkNJ3WCYYG_js.getConnectorPathGeometry(shapeEl) : {
1772
+ const pathGeometry = shapeEl ? chunk7FBKS7OS_js.getConnectorPathGeometry(shapeEl) : {
1773
1773
  pathData: `M 0 0 L ${viewWidth} ${viewHeight}`,
1774
1774
  startX: 0,
1775
1775
  startY: 0,
@@ -1778,8 +1778,8 @@ var ConnectorElementRenderer = React20__default.default.memo(
1778
1778
  };
1779
1779
  const hitTargetWidth = Math.max(strokeWidth * 3, 14);
1780
1780
  const selColor = selClr === "blue-400" ? "#60a5fa" : "#3b82f6";
1781
- const lineShadow = chunkNJ3WCYYG_js.buildLineShadowCss(el);
1782
- const lineGlow = chunkNJ3WCYYG_js.buildLineGlowFilter(el);
1781
+ const lineShadow = chunk7FBKS7OS_js.buildLineShadowCss(el);
1782
+ const lineGlow = chunk7FBKS7OS_js.buildLineGlowFilter(el);
1783
1783
  return /* @__PURE__ */ jsxRuntime.jsxs(
1784
1784
  "div",
1785
1785
  {
@@ -1817,14 +1817,14 @@ var ConnectorElementRenderer = React20__default.default.memo(
1817
1817
  style: { overflow: "visible", pointerEvents: "none" },
1818
1818
  children: [
1819
1819
  /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
1820
- chunkNJ3WCYYG_js.renderConnectorMarker(
1820
+ chunk7FBKS7OS_js.renderConnectorMarker(
1821
1821
  startMarkerId,
1822
1822
  startArrow,
1823
1823
  strokePaint,
1824
1824
  ss?.connectorStartArrowWidth,
1825
1825
  ss?.connectorStartArrowLength
1826
1826
  ),
1827
- chunkNJ3WCYYG_js.renderConnectorMarker(
1827
+ chunk7FBKS7OS_js.renderConnectorMarker(
1828
1828
  endMarkerId,
1829
1829
  endArrow,
1830
1830
  strokePaint,
@@ -2030,14 +2030,14 @@ function getElementInteractionProps({
2030
2030
 
2031
2031
  // src/viewer/components/elements/element-renderer-helpers.tsx
2032
2032
  function renderDagDuotoneFilterForElement(el) {
2033
- if (!chunkNJ3WCYYG_js.hasDagDuotoneEffect(el)) {
2033
+ if (!chunk7FBKS7OS_js.hasDagDuotoneEffect(el)) {
2034
2034
  return null;
2035
2035
  }
2036
2036
  const duotone = el.shapeStyle?.dagDuotone;
2037
2037
  if (!duotone) {
2038
2038
  return null;
2039
2039
  }
2040
- return chunkNJ3WCYYG_js.renderDagDuotoneSvgFilter(el.id, duotone.color1, duotone.color2);
2040
+ return chunk7FBKS7OS_js.renderDagDuotoneSvgFilter(el.id, duotone.color1, duotone.color2);
2041
2041
  }
2042
2042
  function getContainerStyle({
2043
2043
  el,
@@ -2059,12 +2059,12 @@ function getContainerStyle({
2059
2059
  return {
2060
2060
  left: isFullscreenMedia ? 0 : el.x,
2061
2061
  top: isFullscreenMedia ? 0 : el.y,
2062
- width: isFullscreenMedia ? "100%" : Math.max(el.width, chunkNJ3WCYYG_js.MIN_ELEMENT_SIZE),
2063
- height: isFullscreenMedia ? "100%" : Math.max(el.height, chunkNJ3WCYYG_js.MIN_ELEMENT_SIZE),
2062
+ width: isFullscreenMedia ? "100%" : Math.max(el.width, chunk7FBKS7OS_js.MIN_ELEMENT_SIZE),
2063
+ height: isFullscreenMedia ? "100%" : Math.max(el.height, chunk7FBKS7OS_js.MIN_ELEMENT_SIZE),
2064
2064
  transform: isFullscreenMedia ? "none" : chunk4SPZ5IZN_js.getElementTransform(el),
2065
2065
  transformOrigin: "center",
2066
2066
  overflow: overflowValue,
2067
- clipPath: isPicture ? void 0 : isImg && !has3DExtrusion ? chunkNJ3WCYYG_js.getCropShapeClipPath(el) : void 0,
2067
+ clipPath: isPicture ? void 0 : isImg && !has3DExtrusion ? chunk7FBKS7OS_js.getCropShapeClipPath(el) : void 0,
2068
2068
  zIndex: isFullscreenMedia ? 20 : zIndex,
2069
2069
  visibility: animationState?.visible === false ? "hidden" : "visible",
2070
2070
  animation: animationState?.cssAnimation,
@@ -2100,8 +2100,8 @@ function getContainerStyle({
2100
2100
  function shapeParams(element) {
2101
2101
  const style = chunk4SPZ5IZN_js.hasShapeProperties(element) ? element.shapeStyle : void 0;
2102
2102
  const strokeWidth = chunk4SPZ5IZN_js.paintedStrokeWidth(style);
2103
- const strokeColor = chunk4SPZ5IZN_js.normalizeHexColor(style?.strokeColor, chunkNJ3WCYYG_js.DEFAULT_STROKE_COLOR);
2104
- const fillColor = chunk4SPZ5IZN_js.normalizeHexColor(style?.fillColor, chunkNJ3WCYYG_js.DEFAULT_FILL_COLOR);
2103
+ const strokeColor = chunk4SPZ5IZN_js.normalizeHexColor(style?.strokeColor, chunk7FBKS7OS_js.DEFAULT_STROKE_COLOR);
2104
+ const fillColor = chunk4SPZ5IZN_js.normalizeHexColor(style?.fillColor, chunk7FBKS7OS_js.DEFAULT_FILL_COLOR);
2105
2105
  const hasFill = style?.fillColor !== void 0 && style.fillColor !== "transparent" || Boolean(chunk4SPZ5IZN_js.buildCssGradientFromShapeStyle(style) || style?.fillGradient) || style?.fillMode === "pattern" && Boolean(style.fillPatternPreset);
2106
2106
  return { hf: hasFill, fc: fillColor, sw: strokeWidth, sc: strokeColor };
2107
2107
  }
@@ -2207,7 +2207,7 @@ function ShapeEffectOverlay({
2207
2207
  const fillOverlayStyle = overlay ? {
2208
2208
  position: "absolute",
2209
2209
  inset: 0,
2210
- ...chunk4SPZ5IZN_js.isImageLikeElement(element) ? chunkNJ3WCYYG_js.getImageSurfaceMaskStyle(element) : {},
2210
+ ...chunk4SPZ5IZN_js.isImageLikeElement(element) ? chunk7FBKS7OS_js.getImageSurfaceMaskStyle(element) : {},
2211
2211
  background: overlay.color,
2212
2212
  mixBlendMode: overlay.blendMode,
2213
2213
  pointerEvents: "none"
@@ -2405,7 +2405,7 @@ var ElementRenderer = React20__default.default.memo(
2405
2405
  const isTxt = chunk4SPZ5IZN_js.isEditableTextElement(el) && allow.textEditable;
2406
2406
  const txtSE = chunk4SPZ5IZN_js.hasTextProperties(el) ? el.textStyle : void 0;
2407
2407
  const textStyleOverrideCss = chunk4SPZ5IZN_js.buildTextStyleOverrideCss(el.id, visualAnimationState?.textStyle);
2408
- const ss = chunkNJ3WCYYG_js.getShapeVisualStyle(
2408
+ const ss = chunk7FBKS7OS_js.getShapeVisualStyle(
2409
2409
  el,
2410
2410
  hf,
2411
2411
  fc,
@@ -2414,9 +2414,9 @@ var ElementRenderer = React20__default.default.memo(
2414
2414
  visualAnimationState?.animatesFill,
2415
2415
  visualAnimationState?.animatesStroke
2416
2416
  );
2417
- const ts = chunkNJ3WCYYG_js.getTextStyleForElement(el, chunkNJ3WCYYG_js.DEFAULT_TEXT_COLOR);
2417
+ const ts = chunk7FBKS7OS_js.getTextStyleForElement(el, chunk7FBKS7OS_js.DEFAULT_TEXT_COLOR);
2418
2418
  const isImg = el.type === "picture" || el.type === "image";
2419
- const vs = chunkNJ3WCYYG_js.renderVectorShape(
2419
+ const vs = chunk7FBKS7OS_js.renderVectorShape(
2420
2420
  el,
2421
2421
  isImg ? false : hf,
2422
2422
  fc,
@@ -2426,10 +2426,10 @@ var ElementRenderer = React20__default.default.memo(
2426
2426
  visualAnimationState?.animatesStroke
2427
2427
  );
2428
2428
  const isModel3D = el.type === "model3d";
2429
- const isConn = chunkNJ3WCYYG_js.isConnectorOrLineElement(el);
2429
+ const isConn = chunk7FBKS7OS_js.isConnectorOrLineElement(el);
2430
2430
  const shapeStyle3d = chunk4SPZ5IZN_js.hasShapeProperties(el) ? el.shapeStyle : void 0;
2431
2431
  const extrusionData = React20.useMemo(
2432
- () => chunkNJ3WCYYG_js.build3DExtrusionData(shapeStyle3d?.shape3d, shapeStyle3d?.scene3d, fc, el.width, el.height),
2432
+ () => chunk7FBKS7OS_js.build3DExtrusionData(shapeStyle3d?.shape3d, shapeStyle3d?.scene3d, fc, el.width, el.height),
2433
2433
  [shapeStyle3d?.shape3d, shapeStyle3d?.scene3d, fc, el.width, el.height]
2434
2434
  );
2435
2435
  const actionAffordance = useActionAffordance(el, canInteract);
@@ -2499,7 +2499,7 @@ var ElementRenderer = React20__default.default.memo(
2499
2499
  "aria-hidden": aria.hidden ? true : void 0,
2500
2500
  "aria-selected": isSelected ? true : void 0,
2501
2501
  tabIndex: isFocusable ? 0 : -1,
2502
- className: chunkNJ3WCYYG_js.cn(
2502
+ className: chunk7FBKS7OS_js.cn(
2503
2503
  "absolute",
2504
2504
  "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-500",
2505
2505
  cur,
@@ -2586,7 +2586,7 @@ var ElementRenderer = React20__default.default.memo(
2586
2586
  txtSE,
2587
2587
  txtS: ts,
2588
2588
  vecShape: backgroundAnimationState && !isImg ? null : vs,
2589
- imgStyle: chunkNJ3WCYYG_js.getImageRenderStyle(el),
2589
+ imgStyle: chunk7FBKS7OS_js.getImageRenderStyle(el),
2590
2590
  imgFilter: chunk4SPZ5IZN_js.getImageEffectsFilter(el),
2591
2591
  imgOpacity: chunk4SPZ5IZN_js.getImageEffectsOpacity(el),
2592
2592
  imgAlt: imageAltText,
@@ -2717,7 +2717,7 @@ function renderInk(el, options) {
2717
2717
  function renderGroup(children, parentGroupFill) {
2718
2718
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative w-full h-full pointer-events-none", children: chunk4SPZ5IZN_js.filterRenderedElements(children).map((c, childIndex) => {
2719
2719
  const { hf, fc, sw, sc } = shapeParams(c);
2720
- const baseSs = chunkNJ3WCYYG_js.getShapeVisualStyle(c, hf, fc, sw, sc);
2720
+ const baseSs = chunk7FBKS7OS_js.getShapeVisualStyle(c, hf, fc, sw, sc);
2721
2721
  const inheritedFill = chunk4SPZ5IZN_js.resolveGroupChildFill(c, parentGroupFill);
2722
2722
  const ss = inheritedFill ? {
2723
2723
  ...baseSs,
@@ -2728,8 +2728,8 @@ function renderGroup(children, parentGroupFill) {
2728
2728
  backgroundPosition: inheritedFill.backgroundPosition
2729
2729
  } : baseSs;
2730
2730
  const isI = c.type === "picture" || c.type === "image";
2731
- const vs = chunkNJ3WCYYG_js.renderVectorShape(c, isI ? false : hf, fc, sw, sc);
2732
- const ts = chunkNJ3WCYYG_js.getTextStyleForElement(c, chunkNJ3WCYYG_js.DEFAULT_TEXT_COLOR);
2731
+ const vs = chunk7FBKS7OS_js.renderVectorShape(c, isI ? false : hf, fc, sw, sc);
2732
+ const ts = chunk7FBKS7OS_js.getTextStyleForElement(c, chunk7FBKS7OS_js.DEFAULT_TEXT_COLOR);
2733
2733
  const isTxt = chunk4SPZ5IZN_js.isEditableTextElement(c);
2734
2734
  return /* @__PURE__ */ jsxRuntime.jsxs(
2735
2735
  "div",
@@ -2739,8 +2739,8 @@ function renderGroup(children, parentGroupFill) {
2739
2739
  style: {
2740
2740
  left: c.x,
2741
2741
  top: c.y,
2742
- width: Math.max(c.width, chunkNJ3WCYYG_js.MIN_ELEMENT_SIZE),
2743
- height: Math.max(c.height, chunkNJ3WCYYG_js.MIN_ELEMENT_SIZE),
2742
+ width: Math.max(c.width, chunk7FBKS7OS_js.MIN_ELEMENT_SIZE),
2743
+ height: Math.max(c.height, chunk7FBKS7OS_js.MIN_ELEMENT_SIZE),
2744
2744
  transform: chunk4SPZ5IZN_js.getElementTransform(c),
2745
2745
  transformOrigin: "center",
2746
2746
  ...ss,
@@ -2766,20 +2766,20 @@ function renderGroup(children, parentGroupFill) {
2766
2766
  // A nested group: recurse, chaining the inherited fill so a
2767
2767
  // `grpFill` shape under a fill-less sub-group still paints.
2768
2768
  renderGroup(c.children, chunk4SPZ5IZN_js.getGroupChildParentFill(c, parentGroupFill))
2769
- ) : isI && ("svgData" in c && c.svgData || "imageData" in c && c.imageData) ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 pointer-events-none", style: chunkNJ3WCYYG_js.getImageSurfaceStyle(c), children: [
2769
+ ) : isI && ("svgData" in c && c.svgData || "imageData" in c && c.imageData) ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 pointer-events-none", style: chunk7FBKS7OS_js.getImageSurfaceStyle(c), children: [
2770
2770
  chunk4SPZ5IZN_js.isImageTiled(c) ? /* @__PURE__ */ jsxRuntime.jsx(
2771
2771
  "div",
2772
2772
  {
2773
2773
  className: "pointer-events-none select-none w-full h-full",
2774
- style: chunkNJ3WCYYG_js.getImageTilingStyle(c)
2774
+ style: chunk7FBKS7OS_js.getImageTilingStyle(c)
2775
2775
  }
2776
2776
  ) : /* @__PURE__ */ jsxRuntime.jsx(
2777
2777
  "img",
2778
2778
  {
2779
2779
  src: "svgData" in c && c.svgData ? c.svgData : c.imageData,
2780
- alt: chunk3AJ54EAB_js.translationsEn["pptx.ink.groupChildAlt"],
2780
+ alt: chunk64FUV37N_js.translationsEn["pptx.ink.groupChildAlt"],
2781
2781
  className: "pointer-events-none select-none",
2782
- style: chunkNJ3WCYYG_js.getImageRenderStyle(c),
2782
+ style: chunk7FBKS7OS_js.getImageRenderStyle(c),
2783
2783
  draggable: false
2784
2784
  }
2785
2785
  ),
@@ -2791,7 +2791,7 @@ function renderGroup(children, parentGroupFill) {
2791
2791
  {
2792
2792
  className: "relative z-10 w-full h-full pointer-events-none whitespace-pre-wrap break-words leading-[1.3]",
2793
2793
  style: ts,
2794
- children: chunkNJ3WCYYG_js.renderTextSegments(c, chunkNJ3WCYYG_js.DEFAULT_TEXT_COLOR)
2794
+ children: chunk7FBKS7OS_js.renderTextSegments(c, chunk7FBKS7OS_js.DEFAULT_TEXT_COLOR)
2795
2795
  }
2796
2796
  ) : null
2797
2797
  ] })
@@ -2822,7 +2822,7 @@ function renderContentPart(el, options) {
2822
2822
  }
2823
2823
  );
2824
2824
  }
2825
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk3AJ54EAB_js.translationsEn["pptx.ink.contentPartFallback"] });
2825
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk64FUV37N_js.translationsEn["pptx.ink.contentPartFallback"] });
2826
2826
  }
2827
2827
  function ExcelIcon(color, size = 32) {
2828
2828
  return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", children: [
@@ -2880,7 +2880,7 @@ function PdfIcon(color, size = 32) {
2880
2880
  fill: "none"
2881
2881
  }
2882
2882
  ),
2883
- /* @__PURE__ */ jsxRuntime.jsx("text", { x: "12", y: "14", textAnchor: "middle", fill: color, fontSize: "7", fontWeight: "bold", children: chunk3AJ54EAB_js.translationsEn["pptx.file.pdf"] })
2883
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: "12", y: "14", textAnchor: "middle", fill: color, fontSize: "7", fontWeight: "bold", children: chunk64FUV37N_js.translationsEn["pptx.file.pdf"] })
2884
2884
  ] });
2885
2885
  }
2886
2886
  function VisioIcon(color, size = 32) {
@@ -3094,7 +3094,7 @@ function InlineTextEditor({
3094
3094
  pending.endOffset
3095
3095
  );
3096
3096
  });
3097
- const warpStyle = chunkNJ3WCYYG_js.getTextWarpStyle(textStyleRaw);
3097
+ const warpStyle = chunk7FBKS7OS_js.getTextWarpStyle(textStyleRaw);
3098
3098
  const compensationTransform = chunk4SPZ5IZN_js.getTextCompensationTransform(element);
3099
3099
  const warpTransform = warpStyle?.transform;
3100
3100
  const mergedTransform = [compensationTransform, warpTransform].filter(Boolean).join(" ") || void 0;
@@ -3177,7 +3177,7 @@ function InlineTextEditor({
3177
3177
  const text = e.clipboardData.getData("text/plain");
3178
3178
  document.execCommand("insertText", false, text);
3179
3179
  },
3180
- children: seed.hasRichSegments ? chunkNJ3WCYYG_js.renderTextSegments(element, chunkNJ3WCYYG_js.DEFAULT_TEXT_COLOR) : seed.initialText
3180
+ children: seed.hasRichSegments ? chunk7FBKS7OS_js.renderTextSegments(element, chunk7FBKS7OS_js.DEFAULT_TEXT_COLOR) : seed.initialText
3181
3181
  }
3182
3182
  );
3183
3183
  }
@@ -4412,13 +4412,13 @@ function getSegmentTspanProps(segment, element, fallbackColor) {
4412
4412
  if (s.strikethrough) {
4413
4413
  decos.push("line-through");
4414
4414
  }
4415
- const fill = s.hyperlink ? chunk4SPZ5IZN_js.normalizeHexColor(s.color || element.textStyle?.color, chunkNJ3WCYYG_js.HYPERLINK_COLOR) : chunk4SPZ5IZN_js.normalizeHexColor(s.color || element.textStyle?.color, fallbackColor);
4415
+ const fill = s.hyperlink ? chunk4SPZ5IZN_js.normalizeHexColor(s.color || element.textStyle?.color, chunk7FBKS7OS_js.HYPERLINK_COLOR) : chunk4SPZ5IZN_js.normalizeHexColor(s.color || element.textStyle?.color, fallbackColor);
4416
4416
  return {
4417
4417
  fill,
4418
- fontSize: s.fontSize ?? element.textStyle?.fontSize ?? chunkNJ3WCYYG_js.DEFAULT_TEXT_FONT_SIZE,
4418
+ fontSize: s.fontSize ?? element.textStyle?.fontSize ?? chunk7FBKS7OS_js.DEFAULT_TEXT_FONT_SIZE,
4419
4419
  fontWeight: s.bold ? 700 : 400,
4420
4420
  fontStyle: s.italic ? "italic" : void 0,
4421
- fontFamily: s.fontFamily || element.textStyle?.fontFamily ? chunk4SPZ5IZN_js.getSubstituteFontFamily(s.fontFamily || element.textStyle?.fontFamily || "") : chunkNJ3WCYYG_js.DEFAULT_FONT_FAMILY,
4421
+ fontFamily: s.fontFamily || element.textStyle?.fontFamily ? chunk4SPZ5IZN_js.getSubstituteFontFamily(s.fontFamily || element.textStyle?.fontFamily || "") : chunk7FBKS7OS_js.DEFAULT_FONT_FAMILY,
4422
4422
  textDecoration: decos.length > 0 ? decos.join(" ") : void 0
4423
4423
  };
4424
4424
  }
@@ -4426,8 +4426,8 @@ function resolveSegmentFont(segment, element) {
4426
4426
  const s = segment.style || {};
4427
4427
  const family = s.fontFamily || element.textStyle?.fontFamily;
4428
4428
  return {
4429
- fontFamily: family ? chunk4SPZ5IZN_js.getSubstituteFontFamily(family) : chunkNJ3WCYYG_js.DEFAULT_FONT_FAMILY,
4430
- fontSizePx: s.fontSize ?? element.textStyle?.fontSize ?? chunkNJ3WCYYG_js.DEFAULT_TEXT_FONT_SIZE,
4429
+ fontFamily: family ? chunk4SPZ5IZN_js.getSubstituteFontFamily(family) : chunk7FBKS7OS_js.DEFAULT_FONT_FAMILY,
4430
+ fontSizePx: s.fontSize ?? element.textStyle?.fontSize ?? chunk7FBKS7OS_js.DEFAULT_TEXT_FONT_SIZE,
4431
4431
  bold: s.bold ?? element.textStyle?.bold,
4432
4432
  italic: s.italic ?? element.textStyle?.italic
4433
4433
  };
@@ -4511,8 +4511,8 @@ function WarpedText({
4511
4511
  const warpAdj2 = textEl.textStyle?.textWarpAdj2;
4512
4512
  const align = textEl.textStyle?.align ?? "center";
4513
4513
  const { startOffset, textAnchor } = getAlignmentProps(align);
4514
- const baseFontSize = textEl.textStyle?.fontSize ?? chunkNJ3WCYYG_js.DEFAULT_TEXT_FONT_SIZE;
4515
- const baseFontFamily = textEl.textStyle?.fontFamily ? chunk4SPZ5IZN_js.getSubstituteFontFamily(textEl.textStyle.fontFamily) : chunkNJ3WCYYG_js.DEFAULT_FONT_FAMILY;
4514
+ const baseFontSize = textEl.textStyle?.fontSize ?? chunk7FBKS7OS_js.DEFAULT_TEXT_FONT_SIZE;
4515
+ const baseFontFamily = textEl.textStyle?.fontFamily ? chunk4SPZ5IZN_js.getSubstituteFontFamily(textEl.textStyle.fontFamily) : chunk7FBKS7OS_js.DEFAULT_FONT_FAMILY;
4516
4516
  const baseFill = chunk4SPZ5IZN_js.normalizeHexColor(textEl.textStyle?.color, fallbackColor);
4517
4517
  if (chunk4SPZ5IZN_js.hasGlyphEnvelope(preset)) {
4518
4518
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -4540,7 +4540,7 @@ function WarpedText({
4540
4540
  warpAdj2,
4541
4541
  paraIdx,
4542
4542
  lineCount,
4543
- chunk3UGVURWU_js.getGlyphOutline
4543
+ chunkE55VEC37_js.getGlyphOutline
4544
4544
  );
4545
4545
  return /* @__PURE__ */ jsxRuntime.jsx(
4546
4546
  EnvelopeLine,
@@ -4685,7 +4685,7 @@ function renderTextElementBody(options) {
4685
4685
  const useSvgWarp = chunk4SPZ5IZN_js.shouldUseSvgWarp(
4686
4686
  chunk4SPZ5IZN_js.hasTextProperties(el) ? el.textStyle?.textWarpPreset : void 0
4687
4687
  );
4688
- const scene3dStyle = chunk4SPZ5IZN_js.hasTextProperties(el) ? chunkNJ3WCYYG_js.buildTextBody3DSceneStyle(el.textStyle, { width: el.width, height: el.height }) : void 0;
4688
+ const scene3dStyle = chunk4SPZ5IZN_js.hasTextProperties(el) ? chunk7FBKS7OS_js.buildTextBody3DSceneStyle(el.textStyle, { width: el.width, height: el.height }) : void 0;
4689
4689
  const rotationTransform = chunk4SPZ5IZN_js.getTextBodyRotationTransform(el);
4690
4690
  const composedTransform = [rotationTransform, chunk4SPZ5IZN_js.getTextCompensationTransform(el), scene3dStyle?.transform].filter(Boolean).join(" ") || void 0;
4691
4691
  const transformStyle = {
@@ -4717,18 +4717,18 @@ function renderTextElementBody(options) {
4717
4717
  shouldRenderText && (useSvgWarp ? /* @__PURE__ */ jsxRuntime.jsx(
4718
4718
  "div",
4719
4719
  {
4720
- className: chunkNJ3WCYYG_js.cn(
4720
+ className: chunk7FBKS7OS_js.cn(
4721
4721
  "relative z-10 w-full h-full",
4722
4722
  onHyperlinkClick ? "" : "pointer-events-none"
4723
4723
  ),
4724
- style: { ...chunkNJ3WCYYG_js.getTextLayoutStyle(el), ...transformStyle },
4724
+ style: { ...chunk7FBKS7OS_js.getTextLayoutStyle(el), ...transformStyle },
4725
4725
  children: /* @__PURE__ */ jsxRuntime.jsx(
4726
4726
  WarpedText,
4727
4727
  {
4728
4728
  element: el,
4729
4729
  width: el.width,
4730
4730
  height: el.height,
4731
- fallbackColor: chunkNJ3WCYYG_js.DEFAULT_TEXT_COLOR,
4731
+ fallbackColor: chunk7FBKS7OS_js.DEFAULT_TEXT_COLOR,
4732
4732
  findHighlights: findHl,
4733
4733
  fieldContext
4734
4734
  }
@@ -4737,19 +4737,19 @@ function renderTextElementBody(options) {
4737
4737
  ) : /* @__PURE__ */ jsxRuntime.jsx(
4738
4738
  "div",
4739
4739
  {
4740
- className: chunkNJ3WCYYG_js.cn(
4740
+ className: chunk7FBKS7OS_js.cn(
4741
4741
  "relative z-10 w-full h-full whitespace-pre-wrap break-words leading-[1.3]",
4742
4742
  onHyperlinkClick ? "" : "pointer-events-none"
4743
4743
  ),
4744
4744
  style: {
4745
- ...chunkNJ3WCYYG_js.getTextLayoutStyle(el),
4745
+ ...chunk7FBKS7OS_js.getTextLayoutStyle(el),
4746
4746
  ...txtS,
4747
- ...chunkNJ3WCYYG_js.getTextWarpStyle(txtSE),
4747
+ ...chunk7FBKS7OS_js.getTextWarpStyle(txtSE),
4748
4748
  ...transformStyle
4749
4749
  },
4750
- children: chunkNJ3WCYYG_js.renderTextSegments(
4750
+ children: chunk7FBKS7OS_js.renderTextSegments(
4751
4751
  el,
4752
- chunkNJ3WCYYG_js.DEFAULT_TEXT_COLOR,
4752
+ chunk7FBKS7OS_js.DEFAULT_TEXT_COLOR,
4753
4753
  void 0,
4754
4754
  findHl,
4755
4755
  onHyperlinkClick,
@@ -5045,7 +5045,7 @@ function renderBody(options) {
5045
5045
  );
5046
5046
  }
5047
5047
  if (isImg) {
5048
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 pointer-events-none", style: chunkNJ3WCYYG_js.getImageSurfaceStyle(el), children: [
5048
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 pointer-events-none", style: chunk7FBKS7OS_js.getImageSurfaceStyle(el), children: [
5049
5049
  renderImg(el, imgStyle, imgFilter, imgAlt, imgOpacity),
5050
5050
  vecShape ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0", children: vecShape }) : null
5051
5051
  ] });
@@ -5062,7 +5062,7 @@ function renderBody(options) {
5062
5062
  textDirection: txtSE?.textDirection,
5063
5063
  textStyle: txtS,
5064
5064
  textStyleRaw: txtSE,
5065
- layoutStyle: chunkNJ3WCYYG_js.getTextLayoutStyle(el),
5065
+ layoutStyle: chunk7FBKS7OS_js.getTextLayoutStyle(el),
5066
5066
  element: el,
5067
5067
  onCommit,
5068
5068
  onCancel,
@@ -5073,7 +5073,7 @@ function renderBody(options) {
5073
5073
  ] });
5074
5074
  }
5075
5075
  if (el.type === "table") {
5076
- return chunkNJ3WCYYG_js.renderTableElement(el, txtS, {
5076
+ return chunk7FBKS7OS_js.renderTableElement(el, txtS, {
5077
5077
  editable: isSel,
5078
5078
  selectedCell: isSel ? tableSt : null,
5079
5079
  onSelectCell: onCellSel,
@@ -5106,7 +5106,7 @@ function renderBody(options) {
5106
5106
  );
5107
5107
  }
5108
5108
  if (el.type === "media") {
5109
- return chunkNJ3WCYYG_js.renderMediaElement(el, media, {
5109
+ return chunk7FBKS7OS_js.renderMediaElement(el, media, {
5110
5110
  // Present mode autoplays every media element on the active slide,
5111
5111
  // not only ones persisted with their own `autoPlay` flag (matching
5112
5112
  // the other four bindings' unconditional `presenting`-gated
@@ -5149,7 +5149,7 @@ function renderBody(options) {
5149
5149
  }
5150
5150
  return renderGroup(el.children, chunk4SPZ5IZN_js.getGroupChildParentFill(el));
5151
5151
  }
5152
- if (chunkNJ3WCYYG_js.shouldRenderFallbackLabel(el, isTxtEl)) {
5152
+ if (chunk7FBKS7OS_js.shouldRenderFallbackLabel(el, isTxtEl)) {
5153
5153
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunk4SPZ5IZN_js.getElementLabel(el) });
5154
5154
  }
5155
5155
  return renderTextElementBody(options);
@@ -5159,19 +5159,19 @@ function renderBody(options) {
5159
5159
  function defaultTextColorForFill(fillColor) {
5160
5160
  const hex = String(fillColor ?? "").replace(/^#/u, "");
5161
5161
  if (!/^[0-9a-f]{6}$/iu.test(hex)) {
5162
- return chunkNJ3WCYYG_js.DEFAULT_TEXT_COLOR;
5162
+ return chunk7FBKS7OS_js.DEFAULT_TEXT_COLOR;
5163
5163
  }
5164
5164
  const channels = [0, 2, 4].map((offset) => Number.parseInt(hex.slice(offset, offset + 2), 16) / 255).map((channel) => channel <= 0.04045 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4);
5165
5165
  const luminance = channels[0] * 0.2126 + channels[1] * 0.7152 + channels[2] * 0.0722;
5166
- return luminance > 0.179 ? chunkNJ3WCYYG_js.DEFAULT_TEXT_COLOR : "#ffffff";
5166
+ return luminance > 0.179 ? chunk7FBKS7OS_js.DEFAULT_TEXT_COLOR : "#ffffff";
5167
5167
  }
5168
5168
  function getStaticElementVisualState(element, parentGroupFill) {
5169
5169
  const style = chunk4SPZ5IZN_js.hasShapeProperties(element) ? element.shapeStyle : void 0;
5170
5170
  const hasFill = style?.fillColor !== void 0 && style.fillColor !== "transparent" || Boolean(chunk4SPZ5IZN_js.buildCssGradientFromShapeStyle(style) || style?.fillGradient) || style?.fillMode === "pattern" && Boolean(style.fillPatternPreset);
5171
- const fill = chunk4SPZ5IZN_js.normalizeHexColor(style?.fillColor, chunkNJ3WCYYG_js.DEFAULT_FILL_COLOR);
5171
+ const fill = chunk4SPZ5IZN_js.normalizeHexColor(style?.fillColor, chunk7FBKS7OS_js.DEFAULT_FILL_COLOR);
5172
5172
  const strokeWidth = chunk4SPZ5IZN_js.paintedStrokeWidth(style);
5173
- const stroke = chunk4SPZ5IZN_js.normalizeHexColor(style?.strokeColor, chunkNJ3WCYYG_js.DEFAULT_STROKE_COLOR);
5174
- const baseVisualStyle = chunkNJ3WCYYG_js.getShapeVisualStyle(element, hasFill, fill, strokeWidth, stroke);
5173
+ const stroke = chunk4SPZ5IZN_js.normalizeHexColor(style?.strokeColor, chunk7FBKS7OS_js.DEFAULT_STROKE_COLOR);
5174
+ const baseVisualStyle = chunk7FBKS7OS_js.getShapeVisualStyle(element, hasFill, fill, strokeWidth, stroke);
5175
5175
  const inheritedFill = chunk4SPZ5IZN_js.resolveGroupChildFill(element, parentGroupFill);
5176
5176
  const visualStyle = inheritedFill ? {
5177
5177
  ...baseVisualStyle,
@@ -5181,9 +5181,9 @@ function getStaticElementVisualState(element, parentGroupFill) {
5181
5181
  backgroundSize: inheritedFill.backgroundSize,
5182
5182
  backgroundPosition: inheritedFill.backgroundPosition
5183
5183
  } : baseVisualStyle;
5184
- const textStyle = chunkNJ3WCYYG_js.getTextStyleForElement(
5184
+ const textStyle = chunk7FBKS7OS_js.getTextStyleForElement(
5185
5185
  element,
5186
- element.type === "shape" && hasFill ? defaultTextColorForFill(fill) : chunkNJ3WCYYG_js.DEFAULT_TEXT_COLOR
5186
+ element.type === "shape" && hasFill ? defaultTextColorForFill(fill) : chunk7FBKS7OS_js.DEFAULT_TEXT_COLOR
5187
5187
  );
5188
5188
  const isImage = element.type === "picture" || element.type === "image";
5189
5189
  const letsTextOverflow = chunk4SPZ5IZN_js.hasTextProperties(element) && element.textStyle?.autoFitMode === "shrink" && (element.type === "text" || element.locks?.txBox === true);
@@ -5208,7 +5208,7 @@ function getStaticElementInteractionState(element, hasActionHandler, exposeEleme
5208
5208
  return { action, isActionable, contractRole };
5209
5209
  }
5210
5210
  function getStaticElementWrapperClassName(element, visual, positioned, isActionable) {
5211
- const overflowClass = visual.isImage || element.type === "group" || chunkNJ3WCYYG_js.isConnectorOrLineElement(element) || visual.isCallout || visual.letsTextOverflow ? "" : "overflow-hidden";
5211
+ const overflowClass = visual.isImage || element.type === "group" || chunk7FBKS7OS_js.isConnectorOrLineElement(element) || visual.isCallout || visual.letsTextOverflow ? "" : "overflow-hidden";
5212
5212
  const pointerClass = isActionable ? "pointer-events-auto cursor-pointer" : "pointer-events-none";
5213
5213
  return `${positioned ? "absolute" : "relative"} ${overflowClass} ${pointerClass}`;
5214
5214
  }
@@ -5334,14 +5334,14 @@ function StaticElementRendererImpl({
5334
5334
  spellCheck: false,
5335
5335
  txtSE: chunk4SPZ5IZN_js.hasTextProperties(element) ? element.textStyle : void 0,
5336
5336
  txtS: textStyle,
5337
- vecShape: chunkNJ3WCYYG_js.renderVectorShape(
5337
+ vecShape: chunk7FBKS7OS_js.renderVectorShape(
5338
5338
  element,
5339
5339
  isImage ? false : hasFill,
5340
5340
  fill,
5341
5341
  strokeWidth,
5342
5342
  stroke
5343
5343
  ),
5344
- imgStyle: imageAnimation ? { ...chunkNJ3WCYYG_js.getImageRenderStyle(element), animation: imageAnimation } : chunkNJ3WCYYG_js.getImageRenderStyle(element),
5344
+ imgStyle: imageAnimation ? { ...chunk7FBKS7OS_js.getImageRenderStyle(element), animation: imageAnimation } : chunk7FBKS7OS_js.getImageRenderStyle(element),
5345
5345
  imgFilter: chunk4SPZ5IZN_js.getImageEffectsFilter(element),
5346
5346
  imgOpacity: chunk4SPZ5IZN_js.getImageEffectsOpacity(element),
5347
5347
  imgAlt: "",
@@ -5457,7 +5457,7 @@ function SlideTemplateGalleryDialog({
5457
5457
  scheme
5458
5458
  }) {
5459
5459
  const { t } = reactI18next.useTranslation();
5460
- const { panelStyle, handlers: dragHandlers } = chunk3UGVURWU_js.useModalDismissDrag(onClose);
5460
+ const { panelStyle, handlers: dragHandlers } = chunkE55VEC37_js.useModalDismissDrag(onClose);
5461
5461
  const [selected, setSelected] = React20.useState(null);
5462
5462
  const dialogRef = React20.useRef(null);
5463
5463
  useModalFocus(isOpen, dialogRef, onClose);
@@ -5540,7 +5540,7 @@ function SlideTemplateGalleryDialog({
5540
5540
  onInsert(spec.id);
5541
5541
  onClose();
5542
5542
  },
5543
- className: chunkNJ3WCYYG_js.cn(
5543
+ className: chunk7FBKS7OS_js.cn(
5544
5544
  "flex flex-col items-center gap-1 p-2 rounded border transition-colors",
5545
5545
  selected === spec.id ? "border-primary bg-primary/20" : "border-border hover:border-border hover:bg-muted/50"
5546
5546
  ),
@@ -5569,7 +5569,7 @@ function SlideTemplateGalleryDialog({
5569
5569
  type: "button",
5570
5570
  onClick: handleInsert,
5571
5571
  disabled: !selected,
5572
- className: chunkNJ3WCYYG_js.cn(
5572
+ className: chunk7FBKS7OS_js.cn(
5573
5573
  "px-3 py-1.5 text-xs rounded transition-colors",
5574
5574
  selected ? "bg-primary hover:bg-primary/80 text-white" : "bg-muted text-muted-foreground cursor-not-allowed"
5575
5575
  ),
@@ -5686,7 +5686,7 @@ function RibbonGroup({
5686
5686
  return /* @__PURE__ */ jsxRuntime.jsxs(
5687
5687
  "section",
5688
5688
  {
5689
- className: chunkNJ3WCYYG_js.cn(
5689
+ className: chunk7FBKS7OS_js.cn(
5690
5690
  "relative flex min-h-[78px] shrink-0 items-start gap-1 border-r border-border/60 px-2 pb-4 pt-1 last:border-r-0",
5691
5691
  className
5692
5692
  ),
@@ -5716,7 +5716,7 @@ function RibbonCommand({
5716
5716
  disabled,
5717
5717
  title: title ?? label,
5718
5718
  "aria-pressed": pressed,
5719
- className: chunkNJ3WCYYG_js.cn(
5719
+ className: chunk7FBKS7OS_js.cn(
5720
5720
  "inline-flex rounded-sm text-foreground transition-colors hover:bg-accent disabled:cursor-not-allowed disabled:opacity-35",
5721
5721
  active && "bg-primary/15 text-primary ring-1 ring-primary/35",
5722
5722
  compact ? "h-[26px] min-w-[88px] items-center gap-1.5 px-1.5 text-left text-[10px] leading-3" : "h-[58px] min-w-[54px] max-w-[72px] flex-col items-center justify-start gap-0.5 px-1 py-1 text-center text-[9px] leading-[11px]"
@@ -5725,7 +5725,7 @@ function RibbonCommand({
5725
5725
  /* @__PURE__ */ jsxRuntime.jsx(
5726
5726
  "span",
5727
5727
  {
5728
- className: chunkNJ3WCYYG_js.cn(
5728
+ className: chunk7FBKS7OS_js.cn(
5729
5729
  "grid shrink-0 place-items-center text-primary",
5730
5730
  compact ? "h-4 w-4 [&>svg]:h-4 [&>svg]:w-4" : "h-7 w-7 [&>svg]:h-6 [&>svg]:w-6"
5731
5731
  ),
@@ -5754,7 +5754,7 @@ function RibbonToggle({
5754
5754
  "label",
5755
5755
  {
5756
5756
  title,
5757
- className: chunkNJ3WCYYG_js.cn(
5757
+ className: chunk7FBKS7OS_js.cn(
5758
5758
  "flex h-[19px] items-center gap-1 whitespace-nowrap rounded-sm px-1 text-[10px] text-foreground",
5759
5759
  checked && "bg-primary/15 text-primary"
5760
5760
  ),
@@ -6148,7 +6148,7 @@ function ArrangeSection(p) {
6148
6148
  onClick: () => p.onAlignElements(a.k),
6149
6149
  disabled: !canMut,
6150
6150
  className: i < arr.length - 1 ? gB : gL,
6151
- title: t("pptx.arrange.align", { direction: a.k }),
6151
+ title: t(chunk64FUV37N_js.ALIGNMENT_LABEL_KEYS[a.k]),
6152
6152
  children: a.el
6153
6153
  },
6154
6154
  a.k
@@ -6173,7 +6173,7 @@ function ArrangeSection(p) {
6173
6173
  disabled: !p.canEdit || p.canActivateFormatPainter === false && !p.formatPainterActive,
6174
6174
  "data-testid": "format-painter-toggle",
6175
6175
  "data-active": p.formatPainterActive ? "true" : "false",
6176
- className: chunkNJ3WCYYG_js.cn(
6176
+ className: chunk7FBKS7OS_js.cn(
6177
6177
  pill,
6178
6178
  p.formatPainterActive ? "bg-amber-600 hover:bg-amber-500 text-amber-50" : ""
6179
6179
  ),
@@ -6341,7 +6341,7 @@ function useTransitionSoundPicker(activeSlide, onTransitionChange) {
6341
6341
  }
6342
6342
  const asset = chunk4SPZ5IZN_js.getEffectSoundAsset(stockSoundId);
6343
6343
  if (asset) {
6344
- chunk3UGVURWU_js.playAnimationSound(asset.dataUrl);
6344
+ chunkE55VEC37_js.playAnimationSound(asset.dataUrl);
6345
6345
  }
6346
6346
  }, [stockSoundId]);
6347
6347
  return {
@@ -6392,7 +6392,7 @@ function TransitionsSection(p) {
6392
6392
  type: "button",
6393
6393
  disabled: !canEdit,
6394
6394
  onClick: () => commit({ type: preset.type }),
6395
- className: chunkNJ3WCYYG_js.cn(
6395
+ className: chunk7FBKS7OS_js.cn(
6396
6396
  "flex-shrink-0 px-2 py-1 max-md:min-h-[44px] rounded border text-[11px] leading-tight transition-colors",
6397
6397
  draft.type === preset.type ? "border-primary bg-primary/10 text-primary font-medium" : "border-border bg-muted hover:bg-accent text-foreground"
6398
6398
  ),
@@ -6530,7 +6530,7 @@ function TransitionsSection(p) {
6530
6530
  {
6531
6531
  type: "button",
6532
6532
  onClick: p.onToggleInspector,
6533
- className: chunkNJ3WCYYG_js.cn(
6533
+ className: chunk7FBKS7OS_js.cn(
6534
6534
  pill,
6535
6535
  p.isInspectorPaneOpen ? "bg-primary hover:bg-primary/80 text-white" : ""
6536
6536
  ),
@@ -6551,7 +6551,7 @@ function DesignSection(p) {
6551
6551
  {
6552
6552
  onClick: p.onToggleThemeGallery,
6553
6553
  disabled: !p.canEdit,
6554
- className: chunkNJ3WCYYG_js.cn(
6554
+ className: chunk7FBKS7OS_js.cn(
6555
6555
  pill,
6556
6556
  p.isThemeGalleryOpen ? "bg-primary hover:bg-primary/80 text-white" : ""
6557
6557
  ),
@@ -6567,7 +6567,7 @@ function DesignSection(p) {
6567
6567
  {
6568
6568
  onClick: p.onToggleThemeEditor,
6569
6569
  disabled: !p.canEdit,
6570
- className: chunkNJ3WCYYG_js.cn(pill, p.isThemeEditorOpen ? "bg-primary hover:bg-primary/80 text-white" : ""),
6570
+ className: chunk7FBKS7OS_js.cn(pill, p.isThemeEditorOpen ? "bg-primary hover:bg-primary/80 text-white" : ""),
6571
6571
  title: t("pptx.ribbon.editThemeTitle"),
6572
6572
  children: [
6573
6573
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuPencil, { className: ics }),
@@ -6592,7 +6592,7 @@ function DesignSection(p) {
6592
6592
  "button",
6593
6593
  {
6594
6594
  onClick: p.onToggleInspector,
6595
- className: chunkNJ3WCYYG_js.cn(
6595
+ className: chunk7FBKS7OS_js.cn(
6596
6596
  pill,
6597
6597
  p.isInspectorPaneOpen ? "bg-primary hover:bg-primary/80 text-white" : ""
6598
6598
  ),
@@ -6634,7 +6634,7 @@ function DrawSection(p) {
6634
6634
  {
6635
6635
  type: "button",
6636
6636
  onClick: () => p.onSetActiveTool(tool.id),
6637
- className: chunkNJ3WCYYG_js.cn(
6637
+ className: chunk7FBKS7OS_js.cn(
6638
6638
  i < a.length - 1 ? gB : gL,
6639
6639
  p.activeTool === tool.id ? tool.ac ?? "bg-accent text-foreground" : ""
6640
6640
  ),
@@ -6719,7 +6719,7 @@ function AccountPage() {
6719
6719
  return void 0;
6720
6720
  });
6721
6721
  };
6722
- const version = "3.16.7" ;
6722
+ const version = "3.17.0" ;
6723
6723
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-8 max-w-[700px] space-y-6", children: [
6724
6724
  /* @__PURE__ */ jsxRuntime.jsxs("section", { className: cardClass, children: [
6725
6725
  /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "flex items-center gap-2 text-sm font-semibold", children: [
@@ -6759,7 +6759,7 @@ function AccountPage() {
6759
6759
  "aria-label": color,
6760
6760
  "aria-pressed": profile.avatarColor === color,
6761
6761
  onClick: () => updateProfile({ avatarColor: color }),
6762
- className: chunkNJ3WCYYG_js.cn(
6762
+ className: chunk7FBKS7OS_js.cn(
6763
6763
  "size-7 rounded-full border-2 transition-transform",
6764
6764
  profile.avatarColor === color ? "border-foreground scale-110" : "border-transparent hover:scale-105"
6765
6765
  ),
@@ -6977,7 +6977,7 @@ function FileSection(p) {
6977
6977
  const [page, setPage] = React20.useState("home");
6978
6978
  const [query, setQuery] = React20.useState("");
6979
6979
  const [recent, setRecent] = React20.useState([]);
6980
- const { isHidden } = chunk3UGVURWU_js.useToolbarVisibility(p.hiddenActions);
6980
+ const { isHidden } = chunkE55VEC37_js.useToolbarVisibility(p.hiddenActions);
6981
6981
  const exportHidden = isHidden("export");
6982
6982
  React20.useEffect(() => {
6983
6983
  void chunk4SPZ5IZN_js.listBackstageRecentFiles(t, p.recentPresentationsCount).then(setRecent);
@@ -7144,7 +7144,7 @@ function RibbonMenu({
7144
7144
  return /* @__PURE__ */ jsxRuntime.jsx(
7145
7145
  "div",
7146
7146
  {
7147
- className: chunkNJ3WCYYG_js.cn("fixed z-50", className),
7147
+ className: chunk7FBKS7OS_js.cn("fixed z-50", className),
7148
7148
  style: pos ? { left: pos.left, top: pos.top } : { visibility: "hidden" },
7149
7149
  children
7150
7150
  }
@@ -7227,7 +7227,7 @@ function LayoutGalleryMenu(p) {
7227
7227
  type: "button",
7228
7228
  "aria-current": isCurrent ? "true" : void 0,
7229
7229
  title: isCurrent ? `${layout.name} (${t("pptx.layoutGallery.current")})` : layout.name,
7230
- className: chunkNJ3WCYYG_js.cn(
7230
+ className: chunk7FBKS7OS_js.cn(
7231
7231
  "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",
7232
7232
  isCurrent ? "border-primary bg-primary/10" : "border-transparent"
7233
7233
  ),
@@ -7352,7 +7352,7 @@ function SlidesGroup(p) {
7352
7352
  type: "button",
7353
7353
  onClick: handleNewSlide,
7354
7354
  disabled: !p.canEdit || p.layoutOptions.length === 0,
7355
- className: chunkNJ3WCYYG_js.cn(
7355
+ className: chunk7FBKS7OS_js.cn(
7356
7356
  pill,
7357
7357
  "whitespace-nowrap",
7358
7358
  p.layoutOptions.length > 0 ? "rounded-r-none" : ""
@@ -7460,7 +7460,7 @@ function SlidesGroup(p) {
7460
7460
  }
7461
7461
  )
7462
7462
  ] }),
7463
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] text-muted-foreground leading-none", children: "Slides" })
7463
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] text-muted-foreground leading-none", children: t("pptx.ribbon.slides") })
7464
7464
  ] }),
7465
7465
  sep,
7466
7466
  p.onInsertSlideFromTemplate && /* @__PURE__ */ jsxRuntime.jsx(
@@ -7550,7 +7550,7 @@ function HomeSection(p) {
7550
7550
  setTimeout(() => setCutFeedback(false), 600);
7551
7551
  },
7552
7552
  disabled: !p.canEdit || !hasSelection,
7553
- className: chunkNJ3WCYYG_js.cn(gB, cutFeedback && "bg-green-600/20 text-green-400"),
7553
+ className: chunk7FBKS7OS_js.cn(gB, cutFeedback && "bg-green-600/20 text-green-400"),
7554
7554
  title: t("pptx.arrange.cut"),
7555
7555
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuScissors, { className: ic })
7556
7556
  }
@@ -7565,7 +7565,7 @@ function HomeSection(p) {
7565
7565
  setTimeout(() => setCopiedFeedback(false), 600);
7566
7566
  },
7567
7567
  disabled: !hasSelection,
7568
- className: chunkNJ3WCYYG_js.cn(gB, copiedFeedback && "bg-green-600/20 text-green-400"),
7568
+ className: chunk7FBKS7OS_js.cn(gB, copiedFeedback && "bg-green-600/20 text-green-400"),
7569
7569
  title: t("pptx.arrange.copy"),
7570
7570
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuCopy, { className: ic })
7571
7571
  }
@@ -7578,7 +7578,7 @@ function HomeSection(p) {
7578
7578
  disabled: !p.canEdit || p.canActivateFormatPainter === false && !p.formatPainterActive,
7579
7579
  "data-testid": "format-painter-toggle",
7580
7580
  "data-active": p.formatPainterActive ? "true" : "false",
7581
- className: chunkNJ3WCYYG_js.cn(
7581
+ className: chunk7FBKS7OS_js.cn(
7582
7582
  gL,
7583
7583
  p.formatPainterActive ? "bg-amber-600 hover:bg-amber-500 text-amber-50" : ""
7584
7584
  ),
@@ -7666,7 +7666,7 @@ function HomeSection(p) {
7666
7666
  )) }) })
7667
7667
  ] })
7668
7668
  ] }),
7669
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] text-muted-foreground leading-none", children: "Font" })
7669
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] text-muted-foreground leading-none", children: t("pptx.ribbon.font") })
7670
7670
  ] }),
7671
7671
  sep
7672
7672
  ] });
@@ -7779,7 +7779,7 @@ function InsertSection(p) {
7779
7779
  onChange: (e) => p.onSetNewShapeType(e.target.value),
7780
7780
  className: "bg-transparent py-1.5 pl-2 pr-1 outline-none text-xs",
7781
7781
  title: t("pptx.insert.shapeType"),
7782
- children: chunkNJ3WCYYG_js.SHAPE_PRESETS.map((sp) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: sp.type, className: "bg-background", children: t(sp.i18nKey) }, sp.type))
7782
+ children: chunk7FBKS7OS_js.SHAPE_PRESETS.map((sp) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: sp.type, className: "bg-background", children: t(sp.i18nKey) }, sp.type))
7783
7783
  }
7784
7784
  ),
7785
7785
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -7790,7 +7790,7 @@ function InsertSection(p) {
7790
7790
  className: "inline-flex items-center gap-1.5 px-2.5 py-1.5 border-l border-border hover:bg-accent transition-colors text-xs",
7791
7791
  title: t("pptx.insert.addShape"),
7792
7792
  children: [
7793
- chunkNJ3WCYYG_js.SHAPE_PRESETS.find((sp) => sp.type === p.newShapeType)?.icon || /* @__PURE__ */ jsxRuntime.jsx(lu.LuSquare, { className: ic }),
7793
+ chunk7FBKS7OS_js.SHAPE_PRESETS.find((sp) => sp.type === p.newShapeType)?.icon || /* @__PURE__ */ jsxRuntime.jsx(lu.LuSquare, { className: ic }),
7794
7794
  t("pptx.insert.shape")
7795
7795
  ]
7796
7796
  }
@@ -8074,7 +8074,7 @@ function InsertSection(p) {
8074
8074
  {
8075
8075
  type: "button",
8076
8076
  disabled: !canEdit,
8077
- className: chunkNJ3WCYYG_js.cn(pill, "whitespace-nowrap"),
8077
+ className: chunk7FBKS7OS_js.cn(pill, "whitespace-nowrap"),
8078
8078
  onClick: p.onOpenHeaderFooter,
8079
8079
  children: t("pptx.headerFooter.title")
8080
8080
  }
@@ -8370,7 +8370,7 @@ function CustomShowsControls({
8370
8370
  {
8371
8371
  type: "button",
8372
8372
  onClick: onToggleCurrentSlideInActiveShow,
8373
- className: chunkNJ3WCYYG_js.cn(
8373
+ className: chunk7FBKS7OS_js.cn(
8374
8374
  "px-2 py-1 rounded text-[11px] transition-colors",
8375
8375
  isCurrentSlideInActiveShow ? "bg-primary text-white" : "bg-muted hover:bg-accent"
8376
8376
  ),
@@ -8401,7 +8401,7 @@ function CustomShowsControls({
8401
8401
  }
8402
8402
  function SlideShowSection(p) {
8403
8403
  const { t } = reactI18next.useTranslation();
8404
- const { isHidden } = chunk3UGVURWU_js.useToolbarVisibility(p.hiddenActions);
8404
+ const { isHidden } = chunkE55VEC37_js.useToolbarVisibility(p.hiddenActions);
8405
8405
  const [showsOpen, setShowsOpen] = React20.useState(false);
8406
8406
  const showsRef = React20.useRef(null);
8407
8407
  React20.useEffect(() => {
@@ -9324,7 +9324,7 @@ function TextSection(p) {
9324
9324
  ] }) })
9325
9325
  ] })
9326
9326
  ] }),
9327
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] text-muted-foreground leading-none", children: "Font" })
9327
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] text-muted-foreground leading-none", children: t("pptx.ribbon.font") })
9328
9328
  ] }),
9329
9329
  sep,
9330
9330
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-0.5", children: [
@@ -9446,7 +9446,7 @@ function TextSection(p) {
9446
9446
  }
9447
9447
  )
9448
9448
  ] }),
9449
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] text-muted-foreground leading-none", children: "Paragraph" })
9449
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] text-muted-foreground leading-none", children: t("pptx.ribbon.paragraph") })
9450
9450
  ] })
9451
9451
  ] });
9452
9452
  }
@@ -9652,7 +9652,7 @@ function MobileSheet({
9652
9652
  headerRight
9653
9653
  }) {
9654
9654
  const sheetRef = React20.useRef(null);
9655
- const { dragY, dragging, handlers } = chunk3UGVURWU_js.useSheetDismissDrag(onClose);
9655
+ const { dragY, dragging, handlers } = chunkE55VEC37_js.useSheetDismissDrag(onClose);
9656
9656
  useModalFocus(open, sheetRef, onClose);
9657
9657
  if (!open) {
9658
9658
  return null;
@@ -9676,7 +9676,7 @@ function MobileSheet({
9676
9676
  "aria-modal": "true",
9677
9677
  "aria-label": typeof title === "string" ? title : "Mobile panel",
9678
9678
  tabIndex: -1,
9679
- className: chunkNJ3WCYYG_js.cn(
9679
+ className: chunk7FBKS7OS_js.cn(
9680
9680
  "relative bg-background border-t border-border rounded-t-2xl shadow-2xl flex flex-col overflow-hidden",
9681
9681
  "animate-in slide-in-from-bottom duration-200",
9682
9682
  className
@@ -9740,14 +9740,14 @@ function MobileMenuSheet(props) {
9740
9740
  const { t } = reactI18next.useTranslation();
9741
9741
  const { open, onClose } = props;
9742
9742
  const [active, setActive] = React20.useState("home");
9743
- const { isTabVisible } = chunk3UGVURWU_js.useToolbarVisibility(props.hiddenActions);
9743
+ const { isTabVisible } = chunkE55VEC37_js.useToolbarVisibility(props.hiddenActions);
9744
9744
  return /* @__PURE__ */ jsxRuntime.jsx(MobileSheet, { open, onClose, autoHeight: true, title: t("pptx.mobileToolbar.menu"), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
9745
9745
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sticky top-0 z-10 bg-background border-b border-border", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5 px-3 py-2", children: MENU_ITEMS.filter(({ key }) => isTabVisible(key)).map(({ key, label, icon: Icon }) => /* @__PURE__ */ jsxRuntime.jsxs(
9746
9746
  "button",
9747
9747
  {
9748
9748
  type: "button",
9749
9749
  onClick: () => setActive(active === key ? null : key),
9750
- className: chunkNJ3WCYYG_js.cn(
9750
+ className: chunk7FBKS7OS_js.cn(
9751
9751
  "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]",
9752
9752
  active === key ? "bg-primary text-white border-primary" : "border-border text-muted-foreground hover:text-foreground hover:bg-accent/40"
9753
9753
  ),
@@ -10005,7 +10005,7 @@ function MobileToolbar(props) {
10005
10005
  const { t } = reactI18next.useTranslation();
10006
10006
  const { mode, canUndo, canRedo, onUndo, onRedo, onSetMode, onSaveAsPptx } = props;
10007
10007
  const [menuOpen, setMenuOpen] = React20.useState(false);
10008
- const { isHidden } = chunk3UGVURWU_js.useToolbarVisibility(props.hiddenActions);
10008
+ const { isHidden } = chunkE55VEC37_js.useToolbarVisibility(props.hiddenActions);
10009
10009
  const showEdit = mode === "edit" || mode === "master";
10010
10010
  const btn = "inline-flex items-center justify-center min-w-[44px] min-h-[44px] rounded-md text-foreground/80 hover:bg-accent/60 disabled:opacity-40 disabled:cursor-not-allowed active:scale-95 transition-transform";
10011
10011
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -10056,7 +10056,7 @@ function MobileToolbar(props) {
10056
10056
  {
10057
10057
  type: "button",
10058
10058
  onClick: props.onToggleAiPanel,
10059
- className: chunkNJ3WCYYG_js.cn(btn, props.isAiPanelOpen ? "text-primary" : void 0),
10059
+ className: chunk7FBKS7OS_js.cn(btn, props.isAiPanelOpen ? "text-primary" : void 0),
10060
10060
  title: t("pptx.toolbar.toggleAiAssistant"),
10061
10061
  "aria-label": t("pptx.toolbar.toggleAiAssistant"),
10062
10062
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuSparkles, { className: "w-5 h-5" })
@@ -10078,7 +10078,7 @@ function MobileToolbar(props) {
10078
10078
  {
10079
10079
  type: "button",
10080
10080
  onClick: () => onSetMode("present"),
10081
- className: chunkNJ3WCYYG_js.cn(btn, "text-primary"),
10081
+ className: chunk7FBKS7OS_js.cn(btn, "text-primary"),
10082
10082
  title: t("pptx.toolbar.present"),
10083
10083
  "aria-label": t("pptx.toolbar.present"),
10084
10084
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuPresentation, { className: "w-5 h-5" })
@@ -10089,7 +10089,7 @@ function MobileToolbar(props) {
10089
10089
  {
10090
10090
  type: "button",
10091
10091
  onClick: props.onOpenShareDialog,
10092
- className: chunkNJ3WCYYG_js.cn(btn, "bg-primary text-white hover:bg-primary/90 px-3"),
10092
+ className: chunk7FBKS7OS_js.cn(btn, "bg-primary text-white hover:bg-primary/90 px-3"),
10093
10093
  title: t("pptx.toolbar.share"),
10094
10094
  "aria-label": t("pptx.toolbar.share"),
10095
10095
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuShare2, { className: "w-4 h-4" })
@@ -10162,7 +10162,7 @@ function ShapeColorPopover({
10162
10162
  ] }) })
10163
10163
  ] });
10164
10164
  }
10165
- var TOP_SHAPES = chunkNJ3WCYYG_js.SHAPE_PRESETS.slice(0, 12);
10165
+ var TOP_SHAPES = chunk7FBKS7OS_js.SHAPE_PRESETS.slice(0, 12);
10166
10166
  function DrawingGroup(p) {
10167
10167
  const { t } = reactI18next.useTranslation();
10168
10168
  const { pushColor } = useRecentColors();
@@ -10245,7 +10245,7 @@ function DrawingGroup(p) {
10245
10245
  "button",
10246
10246
  {
10247
10247
  type: "button",
10248
- className: chunkNJ3WCYYG_js.cn(
10248
+ className: chunk7FBKS7OS_js.cn(
10249
10249
  "flex items-center gap-2 w-full px-3 py-1.5 text-xs text-foreground hover:bg-muted transition-colors",
10250
10250
  p.newShapeType === s.type && "bg-accent"
10251
10251
  ),
@@ -10379,7 +10379,7 @@ function DrawingGroup(p) {
10379
10379
  }
10380
10380
  )
10381
10381
  ] }),
10382
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] text-muted-foreground leading-none", children: "Drawing" })
10382
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] text-muted-foreground leading-none", children: t("pptx.ribbon.groupDrawing") })
10383
10383
  ] }),
10384
10384
  sep
10385
10385
  ] });
@@ -10455,7 +10455,7 @@ function EditingSection(p) {
10455
10455
  ) }) })
10456
10456
  ] })
10457
10457
  ] }),
10458
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] text-muted-foreground leading-none", children: "Editing" })
10458
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] text-muted-foreground leading-none", children: t("pptx.ribbon.editing") })
10459
10459
  ] })
10460
10460
  ] });
10461
10461
  }
@@ -10515,7 +10515,7 @@ function TabRowActions(p) {
10515
10515
  const { t } = reactI18next.useTranslation();
10516
10516
  const collab = useCollaboration();
10517
10517
  const isCollaborating = collab && collab.status === "connected";
10518
- const { isHidden } = chunk3UGVURWU_js.useToolbarVisibility(p.hiddenActions);
10518
+ const { isHidden } = chunkE55VEC37_js.useToolbarVisibility(p.hiddenActions);
10519
10519
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1 pr-1", children: [
10520
10520
  p.onEnterRehearsalMode && !isHidden("record") && /* @__PURE__ */ jsxRuntime.jsxs(
10521
10521
  "button",
@@ -10536,7 +10536,7 @@ function TabRowActions(p) {
10536
10536
  {
10537
10537
  type: "button",
10538
10538
  onClick: p.onOpenShareDialog,
10539
- className: chunkNJ3WCYYG_js.cn(
10539
+ className: chunk7FBKS7OS_js.cn(
10540
10540
  "relative inline-flex items-center gap-1 px-2.5 py-1 rounded-sm text-[11px] font-medium transition-colors whitespace-nowrap",
10541
10541
  isCollaborating ? "bg-green-600 hover:bg-green-500 text-white" : "bg-primary hover:bg-primary/90 text-white"
10542
10542
  ),
@@ -10607,7 +10607,7 @@ function PresentDropdown({
10607
10607
  {
10608
10608
  type: "button",
10609
10609
  onClick: onPresent,
10610
- className: chunkNJ3WCYYG_js.cn(
10610
+ className: chunk7FBKS7OS_js.cn(
10611
10611
  "px-2 py-1 transition-colors",
10612
10612
  isActive ? "bg-primary text-white" : "hover:bg-accent text-foreground"
10613
10613
  ),
@@ -10620,7 +10620,7 @@ function PresentDropdown({
10620
10620
  {
10621
10621
  type: "button",
10622
10622
  onClick: () => setOpen((prev) => !prev),
10623
- className: chunkNJ3WCYYG_js.cn(
10623
+ className: chunk7FBKS7OS_js.cn(
10624
10624
  "inline-flex items-center px-1 transition-colors border-l border-border",
10625
10625
  open ? "bg-primary text-white" : "hover:bg-accent text-foreground"
10626
10626
  ),
@@ -10808,7 +10808,7 @@ function OverflowMenu(p) {
10808
10808
  {
10809
10809
  type: "button",
10810
10810
  onClick: () => p.onSetOverflowMenuOpen(!p.isOverflowMenuOpen),
10811
- className: chunkNJ3WCYYG_js.cn(
10811
+ className: chunk7FBKS7OS_js.cn(
10812
10812
  "p-1.5 rounded transition-colors",
10813
10813
  p.isOverflowMenuOpen ? "bg-primary/80 text-white" : "bg-muted hover:bg-accent"
10814
10814
  ),
@@ -10863,7 +10863,7 @@ function ToolbarPrimaryRow(p) {
10863
10863
  {
10864
10864
  type: "button",
10865
10865
  onClick: onToggleSidebar,
10866
- className: chunkNJ3WCYYG_js.cn(qab, !isSidebarCollapsed ? "text-foreground" : "text-muted-foreground"),
10866
+ className: chunk7FBKS7OS_js.cn(qab, !isSidebarCollapsed ? "text-foreground" : "text-muted-foreground"),
10867
10867
  title: t("pptx.toolbar.toggleSlidesPanel"),
10868
10868
  "aria-label": t("pptx.toolbar.toggleSlidesPanel"),
10869
10869
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuPanelLeft, { className: ic })
@@ -10875,7 +10875,7 @@ function ToolbarPrimaryRow(p) {
10875
10875
  {
10876
10876
  type: "button",
10877
10877
  onClick: p.onToggleComments,
10878
- className: chunkNJ3WCYYG_js.cn(
10878
+ className: chunk7FBKS7OS_js.cn(
10879
10879
  qab,
10880
10880
  "relative max-md:hidden",
10881
10881
  p.isCommentsPanelOpen ? "text-foreground" : "text-muted-foreground"
@@ -10942,7 +10942,7 @@ function ToolbarPrimaryRow(p) {
10942
10942
  {
10943
10943
  type: "button",
10944
10944
  onClick: onToggleInspector,
10945
- className: chunkNJ3WCYYG_js.cn(qab, isInspectorPaneOpen ? "text-foreground" : "text-muted-foreground"),
10945
+ className: chunk7FBKS7OS_js.cn(qab, isInspectorPaneOpen ? "text-foreground" : "text-muted-foreground"),
10946
10946
  title: t("pptx.toolbar.toggleInspector"),
10947
10947
  "aria-label": t("pptx.toolbar.toggleInspector"),
10948
10948
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuPanelRight, { className: ic })
@@ -10953,7 +10953,7 @@ function ToolbarPrimaryRow(p) {
10953
10953
  {
10954
10954
  type: "button",
10955
10955
  onClick: p.onToggleAiPanel,
10956
- className: chunkNJ3WCYYG_js.cn(qab, p.isAiPanelOpen ? "text-primary" : "text-muted-foreground"),
10956
+ className: chunk7FBKS7OS_js.cn(qab, p.isAiPanelOpen ? "text-primary" : "text-muted-foreground"),
10957
10957
  title: t("pptx.toolbar.toggleAiAssistant"),
10958
10958
  "aria-label": t("pptx.toolbar.toggleAiAssistant"),
10959
10959
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuSparkles, { className: ic })
@@ -10964,7 +10964,7 @@ function ToolbarPrimaryRow(p) {
10964
10964
  {
10965
10965
  type: "button",
10966
10966
  onClick: p.onOpenSettings ?? p.onToggleShortcuts,
10967
- className: chunkNJ3WCYYG_js.cn(qab, "text-muted-foreground"),
10967
+ className: chunk7FBKS7OS_js.cn(qab, "text-muted-foreground"),
10968
10968
  title: t("pptx.toolbar.settingsShortcuts"),
10969
10969
  "aria-label": t("pptx.toolbar.settings"),
10970
10970
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuSettings, { className: ics })
@@ -10986,8 +10986,8 @@ function ToolbarPrimaryRow(p) {
10986
10986
  function Toolbar(p) {
10987
10987
  const { mode, isNarrowViewport, isCompactToolbarOpen, toolbarSection, onSetToolbarSection } = p;
10988
10988
  const { t } = reactI18next.useTranslation();
10989
- const { isTabVisible } = chunk3UGVURWU_js.useToolbarVisibility(p.hiddenActions);
10990
- const viewerOptions = chunk3UGVURWU_js.useViewerOptionsContext();
10989
+ const { isTabVisible } = chunkE55VEC37_js.useToolbarVisibility(p.hiddenActions);
10990
+ const viewerOptions = chunkE55VEC37_js.useViewerOptionsContext();
10991
10991
  if (isNarrowViewport && mode !== "present") {
10992
10992
  return /* @__PURE__ */ jsxRuntime.jsx(MobileToolbar, { ...p });
10993
10993
  }
@@ -11020,7 +11020,7 @@ function Toolbar(p) {
11020
11020
  role: "tablist",
11021
11021
  className: "flex items-center border-b border-border/60 px-1 max-md:overflow-x-auto max-md:scrollbar-none",
11022
11022
  children: [
11023
- chunkNJ3WCYYG_js.TOOLBAR_SECTIONS.filter((s) => isTabVisible(s.id)).map((s) => /* @__PURE__ */ jsxRuntime.jsx(
11023
+ chunk7FBKS7OS_js.TOOLBAR_SECTIONS.filter((s) => isTabVisible(s.id)).map((s) => /* @__PURE__ */ jsxRuntime.jsx(
11024
11024
  "button",
11025
11025
  {
11026
11026
  type: "button",
@@ -11028,7 +11028,7 @@ function Toolbar(p) {
11028
11028
  "aria-selected": toolbarSection === s.id,
11029
11029
  title: chunk4SPZ5IZN_js.resolveScreenTip(viewerOptions, t(s.labelKey)),
11030
11030
  onClick: () => onSetToolbarSection(s.id),
11031
- className: chunkNJ3WCYYG_js.cn(
11031
+ className: chunk7FBKS7OS_js.cn(
11032
11032
  "relative px-3.5 py-2 text-[12px] font-medium whitespace-nowrap transition-colors max-md:min-h-[36px] max-md:px-3",
11033
11033
  toolbarSection === s.id ? s.id === "file" ? "text-white bg-primary/80 rounded-sm" : "text-foreground after:absolute after:-bottom-px after:left-0 after:right-0 after:h-[2.5px] after:bg-primary" : s.id === "file" ? "text-primary hover:bg-primary/15 rounded-sm" : "text-muted-foreground hover:text-foreground hover:bg-accent/30"
11034
11034
  ),
@@ -11050,7 +11050,7 @@ function Toolbar(p) {
11050
11050
  {
11051
11051
  type: "button",
11052
11052
  onClick: p.onToggleCompactToolbar,
11053
- className: chunkNJ3WCYYG_js.cn(
11053
+ className: chunk7FBKS7OS_js.cn(
11054
11054
  "px-2 py-1 rounded text-[11px] transition-colors mr-1",
11055
11055
  isCompactToolbarOpen ? "bg-primary/80 text-white" : "text-muted-foreground hover:text-foreground"
11056
11056
  ),
@@ -11073,7 +11073,7 @@ function Toolbar(p) {
11073
11073
  showRibbon && /* @__PURE__ */ jsxRuntime.jsxs(
11074
11074
  "div",
11075
11075
  {
11076
- className: chunkNJ3WCYYG_js.cn(
11076
+ className: chunk7FBKS7OS_js.cn(
11077
11077
  /*
11078
11078
  * `items-stretch` (not `items-center`): `RibbonGroup` pins its
11079
11079
  * caption to `bottom-0.5` of ITS OWN box (`position: relative`), so
@@ -11743,7 +11743,7 @@ function DrawingOverlaySvg({
11743
11743
  }
11744
11744
  );
11745
11745
  }
11746
- function GridOverlay({ canvasSize, gridSpacingPx = chunkNJ3WCYYG_js.GRID_SIZE, visible }) {
11746
+ function GridOverlay({ canvasSize, gridSpacingPx = chunk7FBKS7OS_js.GRID_SIZE, visible }) {
11747
11747
  const spacing = Math.max(gridSpacingPx, 2);
11748
11748
  const patternId = React20.useMemo(() => `grid-dot-pattern-${Math.random().toString(36).slice(2, 8)}`, []);
11749
11749
  if (!visible) {
@@ -12183,8 +12183,8 @@ function SelectionHandleOverlay({
12183
12183
  position: "absolute",
12184
12184
  left: element.x,
12185
12185
  top: element.y,
12186
- width: Math.max(element.width, chunkNJ3WCYYG_js.MIN_ELEMENT_SIZE),
12187
- height: Math.max(element.height, chunkNJ3WCYYG_js.MIN_ELEMENT_SIZE),
12186
+ width: Math.max(element.width, chunk7FBKS7OS_js.MIN_ELEMENT_SIZE),
12187
+ height: Math.max(element.height, chunk7FBKS7OS_js.MIN_ELEMENT_SIZE),
12188
12188
  // Every slide element carries an explicit numeric `zIndex` (see
12189
12189
  // `getContainerStyle`), so a sibling with no z-index at all paints
12190
12190
  // at the CSS "z-index: 0" level regardless of DOM order: any
@@ -12927,7 +12927,7 @@ function SlideBackgroundImageLayer({
12927
12927
  style: { zIndex: 0 },
12928
12928
  children: renderImg(
12929
12929
  backgroundElement,
12930
- chunkNJ3WCYYG_js.getImageRenderStyle(backgroundElement),
12930
+ chunk7FBKS7OS_js.getImageRenderStyle(backgroundElement),
12931
12931
  chunk4SPZ5IZN_js.getImageEffectsFilter(backgroundElement),
12932
12932
  "",
12933
12933
  opacity
@@ -13271,7 +13271,7 @@ function SlideCanvas({
13271
13271
  },
13272
13272
  element.id
13273
13273
  )),
13274
- selectedElement && chunk4SPZ5IZN_js.shouldShowElementHandles(isEditableCanvas, true, selectedElementIdSet.size) && !chunkNJ3WCYYG_js.isConnectorOrLineElement(selectedElement) && /* @__PURE__ */ jsxRuntime.jsx(
13274
+ selectedElement && chunk4SPZ5IZN_js.shouldShowElementHandles(isEditableCanvas, true, selectedElementIdSet.size) && !chunk7FBKS7OS_js.isConnectorOrLineElement(selectedElement) && /* @__PURE__ */ jsxRuntime.jsx(
13275
13275
  SelectionHandleOverlay,
13276
13276
  {
13277
13277
  element: selectedElement,
@@ -13360,7 +13360,7 @@ function ErrorState({ className, error }) {
13360
13360
  {
13361
13361
  role: "alert",
13362
13362
  "aria-live": "assertive",
13363
- className: chunkNJ3WCYYG_js.cn(
13363
+ className: chunk7FBKS7OS_js.cn(
13364
13364
  "h-full w-full flex items-center justify-center p-6 text-center text-red-400",
13365
13365
  className
13366
13366
  ),
@@ -13391,7 +13391,7 @@ function ShortcutPanel({ isOpen, onClose }) {
13391
13391
  }
13392
13392
  )
13393
13393
  ] }),
13394
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-64 overflow-y-auto p-2 space-y-1", children: chunkNJ3WCYYG_js.SHORTCUT_REFERENCE_ITEMS.map((shortcut) => /* @__PURE__ */ jsxRuntime.jsxs(
13394
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-64 overflow-y-auto p-2 space-y-1", children: chunk7FBKS7OS_js.SHORTCUT_REFERENCE_ITEMS.map((shortcut) => /* @__PURE__ */ jsxRuntime.jsxs(
13395
13395
  "div",
13396
13396
  {
13397
13397
  className: "flex items-center justify-between gap-3 rounded bg-muted/80 px-2 py-1.5",
@@ -13451,14 +13451,14 @@ function AccessibilityPanel({
13451
13451
  "aria-label": t("pptx.accessibility.reduceMotion"),
13452
13452
  "aria-checked": reducedMotion ?? false,
13453
13453
  onClick: onToggleReducedMotion,
13454
- className: chunkNJ3WCYYG_js.cn(
13454
+ className: chunk7FBKS7OS_js.cn(
13455
13455
  "relative inline-flex h-5 w-9 items-center rounded-full transition-colors",
13456
13456
  reducedMotion ? "bg-primary" : "bg-muted-foreground/30"
13457
13457
  ),
13458
13458
  children: /* @__PURE__ */ jsxRuntime.jsx(
13459
13459
  "span",
13460
13460
  {
13461
- className: chunkNJ3WCYYG_js.cn(
13461
+ className: chunk7FBKS7OS_js.cn(
13462
13462
  "inline-block h-3.5 w-3.5 rounded-full bg-white transition-transform",
13463
13463
  reducedMotion ? "translate-x-4" : "translate-x-0.5"
13464
13464
  )
@@ -13477,7 +13477,7 @@ function AccessibilityPanel({
13477
13477
  "div",
13478
13478
  {
13479
13479
  role: "listitem",
13480
- className: chunkNJ3WCYYG_js.cn(
13480
+ className: chunk7FBKS7OS_js.cn(
13481
13481
  "flex items-start gap-2 rounded px-2 py-1.5 text-xs",
13482
13482
  /* Severity-based background and text colouring */
13483
13483
  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"
@@ -13593,7 +13593,7 @@ function StatusBar({
13593
13593
  return /* @__PURE__ */ jsxRuntime.jsxs(
13594
13594
  "div",
13595
13595
  {
13596
- className: chunkNJ3WCYYG_js.cn(
13596
+ className: chunk7FBKS7OS_js.cn(
13597
13597
  "w-full px-2 py-0.5 border-t border-border bg-secondary/50 text-[10px] text-muted-foreground flex items-center gap-1",
13598
13598
  // Pins the row height to the shared metric instead of letting it fall
13599
13599
  // out of the padding + button box, which is how the Vanilla and Svelte
@@ -13611,7 +13611,7 @@ function StatusBar({
13611
13611
  /* @__PURE__ */ jsxRuntime.jsx(
13612
13612
  "span",
13613
13613
  {
13614
- className: chunkNJ3WCYYG_js.cn(
13614
+ className: chunk7FBKS7OS_js.cn(
13615
13615
  "shrink-0 max-md:hidden",
13616
13616
  autosaveStatus?.state === "error" ? "text-red-400" : autosaveStatus?.state === "saving" ? "text-yellow-400" : ""
13617
13617
  ),
@@ -13624,7 +13624,7 @@ function StatusBar({
13624
13624
  {
13625
13625
  type: "button",
13626
13626
  onClick: onToggleNotes,
13627
- className: chunkNJ3WCYYG_js.cn(
13627
+ className: chunk7FBKS7OS_js.cn(
13628
13628
  vb,
13629
13629
  "flex items-center gap-1 text-[10px]",
13630
13630
  isNotesExpanded && "text-primary"
@@ -13644,7 +13644,7 @@ function StatusBar({
13644
13644
  {
13645
13645
  type: "button",
13646
13646
  onClick: () => onSetMode("edit"),
13647
- className: chunkNJ3WCYYG_js.cn(vb, mode === "edit" && "text-primary"),
13647
+ className: chunk7FBKS7OS_js.cn(vb, mode === "edit" && "text-primary"),
13648
13648
  title: t("pptx.statusBar.normalView"),
13649
13649
  "aria-label": t("pptx.statusBar.normalView"),
13650
13650
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuMonitor, { className: "w-3.5 h-3.5" })
@@ -13666,7 +13666,7 @@ function StatusBar({
13666
13666
  {
13667
13667
  type: "button",
13668
13668
  onClick: () => onSetMode("present"),
13669
- className: chunkNJ3WCYYG_js.cn(vb, mode === "present" && "text-primary"),
13669
+ className: chunk7FBKS7OS_js.cn(vb, mode === "present" && "text-primary"),
13670
13670
  title: t("pptx.statusBar.slideShow"),
13671
13671
  "aria-label": t("pptx.statusBar.slideShow"),
13672
13672
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuPresentation, { className: "w-3.5 h-3.5" })
@@ -13758,7 +13758,7 @@ function ResizeHandle({
13758
13758
  {
13759
13759
  role: "separator",
13760
13760
  "aria-orientation": direction,
13761
- className: chunkNJ3WCYYG_js.cn(
13761
+ className: chunk7FBKS7OS_js.cn(
13762
13762
  // Outer container: generous hit area for easy clicking.
13763
13763
  // The visible indicator is rendered via the inner pseudo-element (::after).
13764
13764
  "relative flex-shrink-0 z-20 group",
@@ -13769,7 +13769,7 @@ function ResizeHandle({
13769
13769
  children: /* @__PURE__ */ jsxRuntime.jsx(
13770
13770
  "div",
13771
13771
  {
13772
- className: chunkNJ3WCYYG_js.cn(
13772
+ className: chunk7FBKS7OS_js.cn(
13773
13773
  "absolute transition-colors",
13774
13774
  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"
13775
13775
  )
@@ -13787,7 +13787,7 @@ function SlideThumbnailImpl({
13787
13787
  }) {
13788
13788
  const safeCanvasWidth = Math.max(canvasSize.width, 1);
13789
13789
  const safeCanvasHeight = Math.max(canvasSize.height, 1);
13790
- const scale = chunkNJ3WCYYG_js.SLIDE_NAV_THUMBNAIL_WIDTH / safeCanvasWidth;
13790
+ const scale = chunk7FBKS7OS_js.SLIDE_NAV_THUMBNAIL_WIDTH / safeCanvasWidth;
13791
13791
  const previewHeight = Math.max(56, Math.round(safeCanvasHeight * scale));
13792
13792
  const previewElements = chunk4SPZ5IZN_js.buildPreviewElements(slide, templateElements);
13793
13793
  const slideFieldContext = chunk4SPZ5IZN_js.deriveSlideFieldContext(fieldContext, slide);
@@ -14316,7 +14316,7 @@ function SectionHeader({
14316
14316
  /* @__PURE__ */ jsxRuntime.jsx(
14317
14317
  lu.LuChevronDown,
14318
14318
  {
14319
- className: chunkNJ3WCYYG_js.cn(
14319
+ className: chunk7FBKS7OS_js.cn(
14320
14320
  "h-3 w-3 flex-shrink-0 transition-transform",
14321
14321
  isCollapsed ? "-rotate-90" : "rotate-0"
14322
14322
  )
@@ -14429,7 +14429,7 @@ function LazyThumbnailInner({
14429
14429
  className: "relative w-full overflow-hidden rounded border border-border bg-muted/30 animate-pulse",
14430
14430
  style: {
14431
14431
  height: previewHeight,
14432
- minWidth: chunkNJ3WCYYG_js.SLIDE_NAV_THUMBNAIL_WIDTH
14432
+ minWidth: chunk7FBKS7OS_js.SLIDE_NAV_THUMBNAIL_WIDTH
14433
14433
  }
14434
14434
  }
14435
14435
  ) });
@@ -14466,7 +14466,7 @@ function buildFlatPaneItems(sectionGroups, showSectionHeaders, collapsedSections
14466
14466
  function estimateSlideItemHeight(canvasWidth, canvasHeight) {
14467
14467
  const safeW = Math.max(canvasWidth, 1);
14468
14468
  const safeH = Math.max(canvasHeight, 1);
14469
- const scale = chunkNJ3WCYYG_js.SLIDE_NAV_THUMBNAIL_WIDTH / safeW;
14469
+ const scale = chunk7FBKS7OS_js.SLIDE_NAV_THUMBNAIL_WIDTH / safeW;
14470
14470
  const previewHeight = Math.max(56, Math.round(safeH * scale));
14471
14471
  return previewHeight + 30;
14472
14472
  }
@@ -14507,7 +14507,7 @@ function SlideItemInner({
14507
14507
  );
14508
14508
  const safeCanvasWidth = Math.max(canvasSize.width, 1);
14509
14509
  const safeCanvasHeight = Math.max(canvasSize.height, 1);
14510
- const scale = chunkNJ3WCYYG_js.SLIDE_NAV_THUMBNAIL_WIDTH / safeCanvasWidth;
14510
+ const scale = chunk7FBKS7OS_js.SLIDE_NAV_THUMBNAIL_WIDTH / safeCanvasWidth;
14511
14511
  const previewHeight = Math.max(56, Math.round(safeCanvasHeight * scale));
14512
14512
  return /* @__PURE__ */ jsxRuntime.jsxs(
14513
14513
  "button",
@@ -14518,7 +14518,7 @@ function SlideItemInner({
14518
14518
  "aria-current": isActive ? "true" : void 0,
14519
14519
  "aria-describedby": cue.labelId,
14520
14520
  "data-pptx-slide-hidden": cue.marker,
14521
- className: chunkNJ3WCYYG_js.cn(
14521
+ className: chunk7FBKS7OS_js.cn(
14522
14522
  "group relative flex w-full items-center gap-1 cursor-pointer border-0 bg-transparent py-0.5 px-1 text-left transition-all",
14523
14523
  isActive && "bg-accent/40 before:absolute before:left-0 before:top-1 before:bottom-1 before:w-[3px] before:bg-primary before:rounded-r",
14524
14524
  isHidden && "opacity-50"
@@ -14534,7 +14534,7 @@ function SlideItemInner({
14534
14534
  /* @__PURE__ */ jsxRuntime.jsx(
14535
14535
  "span",
14536
14536
  {
14537
- className: chunkNJ3WCYYG_js.cn(
14537
+ className: chunk7FBKS7OS_js.cn(
14538
14538
  "text-[10px] tabular-nums text-right select-none w-full",
14539
14539
  isActive ? "text-primary font-medium" : "text-muted-foreground"
14540
14540
  ),
@@ -14555,7 +14555,7 @@ function SlideItemInner({
14555
14555
  /* @__PURE__ */ jsxRuntime.jsxs(
14556
14556
  "div",
14557
14557
  {
14558
- className: chunkNJ3WCYYG_js.cn(
14558
+ className: chunk7FBKS7OS_js.cn(
14559
14559
  "relative flex-1 overflow-hidden border transition-colors bg-white",
14560
14560
  isActive ? "border-primary/60" : "border-transparent group-hover:border-border/40"
14561
14561
  ),
@@ -14747,7 +14747,7 @@ function SlidesPaneSidebar({
14747
14747
  () => estimateSlideItemHeight(canvasSize.width, canvasSize.height),
14748
14748
  [canvasSize.width, canvasSize.height]
14749
14749
  );
14750
- const showSectionHeaders = sectionGroups.some((group) => group.id !== chunkNJ3WCYYG_js.DEFAULT_SECTION_GROUP_ID);
14750
+ const showSectionHeaders = sectionGroups.some((group) => group.id !== chunk7FBKS7OS_js.DEFAULT_SECTION_GROUP_ID);
14751
14751
  const {
14752
14752
  collapsedSections,
14753
14753
  renamingSectionId,
@@ -14779,7 +14779,7 @@ function SlidesPaneSidebar({
14779
14779
  [sectionGroups, showSectionHeaders, effectiveCollapsed]
14780
14780
  );
14781
14781
  const shouldVirtualize = slides.length >= VIRTUALIZATION_THRESHOLD;
14782
- const { startIndex, endIndex, totalHeight, offsetY, scrollContainerRef, scrollToIndex } = chunk3UGVURWU_js.useVirtualizedSlides({
14782
+ const { startIndex, endIndex, totalHeight, offsetY, scrollContainerRef, scrollToIndex } = chunkE55VEC37_js.useVirtualizedSlides({
14783
14783
  totalItems: shouldVirtualize ? flatItems.length : 0,
14784
14784
  itemHeight: estimatedItemHeight
14785
14785
  });
@@ -15013,7 +15013,7 @@ function HandoutMasterPanel({
15013
15013
  {
15014
15014
  type: "button",
15015
15015
  "aria-pressed": slidesPerPage === count,
15016
- className: chunkNJ3WCYYG_js.cn(
15016
+ className: chunk7FBKS7OS_js.cn(
15017
15017
  "px-2 py-1.5 rounded text-[11px] font-medium transition-colors",
15018
15018
  slidesPerPage === count ? "bg-primary text-white" : "bg-accent/50 text-muted-foreground hover:bg-accent/70 hover:text-foreground"
15019
15019
  ),
@@ -15131,7 +15131,7 @@ function SlideMastersList({
15131
15131
  ref: isMasterActive ? activeRef : void 0,
15132
15132
  "aria-pressed": isMasterActive,
15133
15133
  "aria-label": master.name || t("pptx.master.master"),
15134
- className: chunkNJ3WCYYG_js.cn(
15134
+ className: chunk7FBKS7OS_js.cn(
15135
15135
  "group relative block w-full cursor-pointer rounded-lg border-2 p-1 text-left transition-all",
15136
15136
  isMasterActive ? "border-amber-500 bg-amber-500/10" : "border-border bg-background/40 hover:border-border"
15137
15137
  ),
@@ -15148,7 +15148,7 @@ function SlideMastersList({
15148
15148
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 px-1", children: /* @__PURE__ */ jsxRuntime.jsx(
15149
15149
  "span",
15150
15150
  {
15151
- className: chunkNJ3WCYYG_js.cn(
15151
+ className: chunk7FBKS7OS_js.cn(
15152
15152
  "text-[10px] font-medium",
15153
15153
  isMasterActive ? "text-amber-400" : "text-muted-foreground"
15154
15154
  ),
@@ -15167,7 +15167,7 @@ function SlideMastersList({
15167
15167
  ref: isLayoutActive ? activeRef : void 0,
15168
15168
  "aria-pressed": isLayoutActive,
15169
15169
  "aria-label": layout.name || t("pptx.master.layout"),
15170
- className: chunkNJ3WCYYG_js.cn(
15170
+ className: chunk7FBKS7OS_js.cn(
15171
15171
  "group relative block w-full cursor-pointer rounded-md border-2 p-0.5 text-left transition-all",
15172
15172
  isLayoutActive ? "border-primary bg-primary/10" : "border-border bg-background/40 hover:border-border"
15173
15173
  ),
@@ -15184,7 +15184,7 @@ function SlideMastersList({
15184
15184
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 px-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(
15185
15185
  "span",
15186
15186
  {
15187
- className: chunkNJ3WCYYG_js.cn(
15187
+ className: chunk7FBKS7OS_js.cn(
15188
15188
  "text-[9px]",
15189
15189
  isLayoutActive ? "text-primary" : "text-muted-foreground"
15190
15190
  ),
@@ -15276,7 +15276,7 @@ function MasterViewSidebar({
15276
15276
  type: "button",
15277
15277
  role: "tab",
15278
15278
  "aria-selected": masterViewTab === tab.key,
15279
- className: chunkNJ3WCYYG_js.cn(
15279
+ className: chunk7FBKS7OS_js.cn(
15280
15280
  "flex-1 px-1 py-1.5 text-[10px] font-medium transition-colors border-b-2",
15281
15281
  masterViewTab === tab.key ? "border-amber-500 text-amber-400" : "border-transparent text-muted-foreground hover:text-foreground"
15282
15282
  ),
@@ -15779,7 +15779,7 @@ function SectionBlock({
15779
15779
  /* @__PURE__ */ jsxRuntime.jsx(
15780
15780
  lu.LuChevronDown,
15781
15781
  {
15782
- className: chunkNJ3WCYYG_js.cn("h-3 w-3 transition-transform", collapsed ? "-rotate-90" : "rotate-0")
15782
+ className: chunk7FBKS7OS_js.cn("h-3 w-3 transition-transform", collapsed ? "-rotate-90" : "rotate-0")
15783
15783
  }
15784
15784
  ),
15785
15785
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-left", children: section.label }),
@@ -15828,7 +15828,7 @@ function SlideCardImpl({
15828
15828
  return /* @__PURE__ */ jsxRuntime.jsxs(
15829
15829
  "div",
15830
15830
  {
15831
- className: chunkNJ3WCYYG_js.cn(
15831
+ className: chunk7FBKS7OS_js.cn(
15832
15832
  "group relative cursor-pointer rounded-lg border-2 p-1 transition-all",
15833
15833
  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",
15834
15834
  slide.hidden && "opacity-40"
@@ -15849,7 +15849,7 @@ function SlideCardImpl({
15849
15849
  /* @__PURE__ */ jsxRuntime.jsx(
15850
15850
  "span",
15851
15851
  {
15852
- className: chunkNJ3WCYYG_js.cn(
15852
+ className: chunk7FBKS7OS_js.cn(
15853
15853
  "text-[11px] font-medium px-0.5",
15854
15854
  isSelected ? "text-primary" : isActive ? "text-primary/70" : "text-muted-foreground"
15855
15855
  ),
@@ -17502,7 +17502,7 @@ function SlideNotesPanel({
17502
17502
  });
17503
17503
  const hasNotes = draft.trim().length > 0;
17504
17504
  const slideLabel = activeSlide ? t("pptx.notes.slideN", { n: activeSlide.slideNumber }) : t("pptx.notes.noSlide");
17505
- const { dragY, handlers: dragHandlers } = chunk3UGVURWU_js.useSheetDismissDrag(onToggle);
17505
+ const { dragY, handlers: dragHandlers } = chunkE55VEC37_js.useSheetDismissDrag(onToggle);
17506
17506
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17507
17507
  isExpanded && /* @__PURE__ */ jsxRuntime.jsx(
17508
17508
  "button",
@@ -17516,7 +17516,7 @@ function SlideNotesPanel({
17516
17516
  /* @__PURE__ */ jsxRuntime.jsxs(
17517
17517
  "div",
17518
17518
  {
17519
- className: chunkNJ3WCYYG_js.cn(
17519
+ className: chunk7FBKS7OS_js.cn(
17520
17520
  "flex flex-col border-t border-border/60 bg-background select-none",
17521
17521
  // On mobile, hide the entire notes strip when collapsed: the
17522
17522
  // MobileBottomBar's Notes button is the entry point instead.
@@ -17883,7 +17883,7 @@ function SlideDiffRow({
17883
17883
  return /* @__PURE__ */ jsxRuntime.jsxs(
17884
17884
  "div",
17885
17885
  {
17886
- className: chunkNJ3WCYYG_js.cn(
17886
+ className: chunk7FBKS7OS_js.cn(
17887
17887
  "rounded-lg border transition-colors",
17888
17888
  isResolved ? "border-border/60 bg-card/40 opacity-60" : "border-border bg-background/70"
17889
17889
  ),
@@ -17897,7 +17897,7 @@ function SlideDiffRow({
17897
17897
  children: [
17898
17898
  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" }),
17899
17899
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-foreground", children: t("pptx.compare.slideNumber", { number: slideNumber }) }),
17900
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkNJ3WCYYG_js.cn("rounded-full px-2 py-0.5 text-[10px] font-medium", statusColor), children: statusLabel }),
17900
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunk7FBKS7OS_js.cn("rounded-full px-2 py-0.5 text-[10px] font-medium", statusColor), children: statusLabel }),
17901
17901
  diff.changes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[10px] text-muted-foreground", children: [
17902
17902
  diff.changes.length,
17903
17903
  " ",
@@ -17907,7 +17907,7 @@ function SlideDiffRow({
17907
17907
  isResolved && /* @__PURE__ */ jsxRuntime.jsx(
17908
17908
  "span",
17909
17909
  {
17910
- className: chunkNJ3WCYYG_js.cn(
17910
+ className: chunk7FBKS7OS_js.cn(
17911
17911
  "text-[10px] font-medium",
17912
17912
  accepted ? "text-green-400" : "text-muted-foreground"
17913
17913
  ),
@@ -17935,7 +17935,7 @@ function SlideDiffRow({
17935
17935
  /* @__PURE__ */ jsxRuntime.jsx(
17936
17936
  "div",
17937
17937
  {
17938
- className: chunkNJ3WCYYG_js.cn(
17938
+ className: chunk7FBKS7OS_js.cn(
17939
17939
  "rounded border overflow-hidden",
17940
17940
  diff.status === "added" ? "border-green-700/60" : diff.status === "changed" ? "border-amber-700/60" : "border-border"
17941
17941
  ),
@@ -18647,7 +18647,7 @@ function DocumentPropertiesDialog({
18647
18647
  const handleClose = React20.useCallback(() => {
18648
18648
  onClose();
18649
18649
  }, [onClose]);
18650
- const { panelStyle, handlers: dragHandlers } = chunk3UGVURWU_js.useModalDismissDrag(handleClose);
18650
+ const { panelStyle, handlers: dragHandlers } = chunkE55VEC37_js.useModalDismissDrag(handleClose);
18651
18651
  if (!isOpen) {
18652
18652
  return null;
18653
18653
  }
@@ -20433,7 +20433,7 @@ function SelectionPane({
20433
20433
  setDragIndex(null);
20434
20434
  setDragOverIndex(null);
20435
20435
  },
20436
- className: chunkNJ3WCYYG_js.cn(
20436
+ className: chunk7FBKS7OS_js.cn(
20437
20437
  "flex items-center gap-1.5 px-2 py-1 text-xs cursor-pointer transition-colors",
20438
20438
  isSelected ? "bg-primary/30 text-primary" : "hover:bg-muted text-foreground",
20439
20439
  dragOverIndex === realIndex ? "border-t-2 border-primary" : ""
@@ -20487,13 +20487,13 @@ function SelectionPane({
20487
20487
  }
20488
20488
  var INPUT_CLS = "bg-muted border border-border rounded px-2 py-1 w-full text-[11px] max-md:min-h-[44px]!";
20489
20489
  var SELECT_CLS = "bg-muted border border-border rounded px-2 py-1 w-full text-[11px] max-md:min-h-[44px]!";
20490
- var ENTRANCE_PRESETS = chunkNJ3WCYYG_js.ANIMATION_PRESET_OPTIONS.filter(
20490
+ var ENTRANCE_PRESETS = chunk7FBKS7OS_js.ANIMATION_PRESET_OPTIONS.filter(
20491
20491
  (o) => o.value === "fadeIn" || o.value === "flyIn" || o.value === "zoomIn"
20492
20492
  );
20493
- var EXIT_PRESETS = chunkNJ3WCYYG_js.ANIMATION_PRESET_OPTIONS.filter(
20493
+ var EXIT_PRESETS = chunk7FBKS7OS_js.ANIMATION_PRESET_OPTIONS.filter(
20494
20494
  (o) => o.value === "fadeOut" || o.value === "flyOut" || o.value === "zoomOut"
20495
20495
  );
20496
- var EMPHASIS_PRESETS = chunkNJ3WCYYG_js.ANIMATION_PRESET_OPTIONS.filter(
20496
+ var EMPHASIS_PRESETS = chunk7FBKS7OS_js.ANIMATION_PRESET_OPTIONS.filter(
20497
20497
  (o) => o.value === "spin" || o.value === "pulse" || o.value === "colorWave" || o.value === "bounce" || o.value === "flash" || o.value === "growShrink" || o.value === "teeter"
20498
20498
  );
20499
20499
  var TRIGGER_OPTIONS = [
@@ -20645,7 +20645,7 @@ function AnimationTimelineSection({
20645
20645
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative h-6 rounded bg-muted/50 border border-border overflow-hidden", children: timelineBarData.map((bar) => /* @__PURE__ */ jsxRuntime.jsx(
20646
20646
  "div",
20647
20647
  {
20648
- className: chunkNJ3WCYYG_js.cn(
20648
+ className: chunk7FBKS7OS_js.cn(
20649
20649
  "absolute top-0.5 bottom-0.5 rounded-sm transition-colors",
20650
20650
  animationTypeColor(bar.anim),
20651
20651
  bar.anim.elementId === selectedElementId && "ring-1 ring-primary"
@@ -20674,7 +20674,7 @@ function AnimationTimelineSection({
20674
20674
  onDragLeave: handleDragLeave,
20675
20675
  onDrop: (e) => handleDrop(index, e),
20676
20676
  title: t("pptx.animation.nativeEffectHint"),
20677
- className: chunkNJ3WCYYG_js.cn(
20677
+ className: chunk7FBKS7OS_js.cn(
20678
20678
  "flex items-center gap-1 px-1 py-0.5 rounded text-[10px] italic",
20679
20679
  "bg-muted/20 text-muted-foreground/70",
20680
20680
  isDragOver && "border-t-2 border-primary"
@@ -20713,7 +20713,7 @@ function AnimationTimelineSection({
20713
20713
  onDragEnd: handleDragEnd,
20714
20714
  onMouseEnter: () => handleAnimationHover(anim),
20715
20715
  onMouseLeave: handleAnimationHoverEnd,
20716
- className: chunkNJ3WCYYG_js.cn(
20716
+ className: chunk7FBKS7OS_js.cn(
20717
20717
  "flex items-center gap-1 px-1 py-0.5 rounded text-[10px] cursor-grab transition-colors",
20718
20718
  isSelected ? "bg-primary/30 text-primary" : "bg-muted/50 text-muted-foreground",
20719
20719
  isDragging && "opacity-40",
@@ -20814,7 +20814,7 @@ function EffectSoundRow({
20814
20814
  }
20815
20815
  const asset = chunk4SPZ5IZN_js.getEffectSoundAsset(soundState.catalogueId);
20816
20816
  if (asset) {
20817
- chunk3UGVURWU_js.playAnimationSound(asset.dataUrl);
20817
+ chunkE55VEC37_js.playAnimationSound(asset.dataUrl);
20818
20818
  }
20819
20819
  };
20820
20820
  return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex flex-col gap-1", children: [
@@ -20989,7 +20989,7 @@ function useAnimationPreview({
20989
20989
  }) {
20990
20990
  const handleAnimationHover = React20.useCallback((anim) => {
20991
20991
  if (anim.motionPath) {
20992
- chunkNJ3WCYYG_js.startMotionPathPreview(anim.elementId, anim.motionPath, {
20992
+ chunk7FBKS7OS_js.startMotionPathPreview(anim.elementId, anim.motionPath, {
20993
20993
  durationMs: anim.durationMs,
20994
20994
  delayMs: anim.delayMs,
20995
20995
  timingCurve: anim.timingCurve
@@ -21000,19 +21000,19 @@ function useAnimationPreview({
21000
21000
  if (!preset || preset === "none") {
21001
21001
  return;
21002
21002
  }
21003
- chunkNJ3WCYYG_js.startPreviewAnimation(anim.elementId, preset, {
21003
+ chunk7FBKS7OS_js.startPreviewAnimation(anim.elementId, preset, {
21004
21004
  direction: anim.direction,
21005
21005
  durationMs: anim.durationMs ?? 500,
21006
21006
  timingCurve: anim.timingCurve
21007
21007
  });
21008
21008
  }, []);
21009
- const handleAnimationHoverEnd = React20.useCallback(() => chunkNJ3WCYYG_js.stopPreviewAnimation(), []);
21009
+ const handleAnimationHoverEnd = React20.useCallback(() => chunk7FBKS7OS_js.stopPreviewAnimation(), []);
21010
21010
  const handlePreviewClick = React20.useCallback(() => {
21011
21011
  if (!selectedElementAnimation) {
21012
21012
  return;
21013
21013
  }
21014
21014
  if (selectedElementAnimation.motionPath) {
21015
- chunkNJ3WCYYG_js.startMotionPathPreview(selectedElementId, selectedElementAnimation.motionPath, {
21015
+ chunk7FBKS7OS_js.startMotionPathPreview(selectedElementId, selectedElementAnimation.motionPath, {
21016
21016
  durationMs: selectedElementAnimation.durationMs,
21017
21017
  delayMs: selectedElementAnimation.delayMs,
21018
21018
  timingCurve: selectedElementAnimation.timingCurve
@@ -21023,7 +21023,7 @@ function useAnimationPreview({
21023
21023
  if (!preset || preset === "none") {
21024
21024
  return;
21025
21025
  }
21026
- chunkNJ3WCYYG_js.startPreviewAnimation(selectedElementId, preset, {
21026
+ chunk7FBKS7OS_js.startPreviewAnimation(selectedElementId, preset, {
21027
21027
  direction: selectedElementAnimation.direction,
21028
21028
  durationMs: selectedElementAnimation.durationMs ?? 500,
21029
21029
  timingCurve: selectedElementAnimation.timingCurve
@@ -21322,7 +21322,7 @@ function AnimationPanel({
21322
21322
  onUpdateSlide
21323
21323
  }) {
21324
21324
  const { t } = reactI18next.useTranslation();
21325
- const { viewportWidth } = chunk3UGVURWU_js.useIsMobile();
21325
+ const { viewportWidth } = chunkE55VEC37_js.useIsMobile();
21326
21326
  const directionBtnPx = Math.max(28, chunk4SPZ5IZN_js.getDensePanelTouchTargetPx(viewportWidth));
21327
21327
  const fieldStyle = { minHeight: chunk4SPZ5IZN_js.getDensePanelTouchTargetPx(viewportWidth) };
21328
21328
  const handlers = useAnimationHandlers({
@@ -21447,7 +21447,7 @@ function AnimationPanel({
21447
21447
  type: "button",
21448
21448
  disabled: !canEdit,
21449
21449
  style: { minWidth: directionBtnPx, minHeight: directionBtnPx },
21450
- className: chunkNJ3WCYYG_js.cn(
21450
+ className: chunk7FBKS7OS_js.cn(
21451
21451
  "flex items-center justify-center rounded border transition-colors",
21452
21452
  isActive ? "border-primary bg-primary/20 text-primary" : "border-border bg-muted text-muted-foreground hover:bg-accent"
21453
21453
  ),
@@ -21622,9 +21622,9 @@ function AnimationPanel({
21622
21622
  ] });
21623
21623
  }
21624
21624
  var INSPECTOR_TABS = [
21625
- { key: "elements", label: "Elements", icon: lu.LuLayers },
21626
- { key: "properties", label: "Properties", icon: lu.LuSettings2 },
21627
- { key: "comments", label: "Comments", icon: lu.LuMessageSquare }
21625
+ { key: "elements", labelKey: "pptx.documentProperties.statistics.elements", icon: lu.LuLayers },
21626
+ { key: "properties", labelKey: "pptx.inspector.properties", icon: lu.LuSettings2 },
21627
+ { key: "comments", labelKey: "pptx.toolbar.comments", icon: lu.LuMessageSquare }
21628
21628
  ];
21629
21629
  var HEADING = "text-[11px] uppercase tracking-wide text-muted-foreground";
21630
21630
  var CARD = "rounded border border-border bg-card p-2 space-y-2";
@@ -21662,7 +21662,7 @@ function ActionTargetFields({
21662
21662
  type: "text",
21663
21663
  disabled: !canEdit,
21664
21664
  "aria-label": t(urlLabelKey),
21665
- className: chunkNJ3WCYYG_js.cn(INPUT, "w-full"),
21665
+ className: chunk7FBKS7OS_js.cn(INPUT, "w-full"),
21666
21666
  placeholder: "https://...",
21667
21667
  value: url ?? "",
21668
21668
  onChange: (e) => onChange({ url: e.target.value })
@@ -21676,7 +21676,7 @@ function ActionTargetFields({
21676
21676
  type: "number",
21677
21677
  disabled: !canEdit,
21678
21678
  "aria-label": t("pptx.action.gotoSlide"),
21679
- className: chunkNJ3WCYYG_js.cn(INPUT, "w-full"),
21679
+ className: chunk7FBKS7OS_js.cn(INPUT, "w-full"),
21680
21680
  placeholder: t("pptx.action.slideNumberPlaceholder"),
21681
21681
  min: 1,
21682
21682
  max: slideCount,
@@ -21698,7 +21698,7 @@ function ActionTargetFields({
21698
21698
  "data-testid": "pptx-action-custom-show",
21699
21699
  disabled: !canEdit,
21700
21700
  "aria-label": t("pptx.hyperlink.customShowLabel"),
21701
- className: chunkNJ3WCYYG_js.cn(INPUT, "w-full"),
21701
+ className: chunk7FBKS7OS_js.cn(INPUT, "w-full"),
21702
21702
  value: customShowId ?? "",
21703
21703
  onChange: (e) => onChange({ customShowId: e.target.value, returnAfter }),
21704
21704
  children: [
@@ -21821,7 +21821,7 @@ function ActionTriggerSection({
21821
21821
  {
21822
21822
  disabled: !canEdit,
21823
21823
  "aria-label": label,
21824
- className: chunkNJ3WCYYG_js.cn(INPUT, "w-full"),
21824
+ className: chunk7FBKS7OS_js.cn(INPUT, "w-full"),
21825
21825
  value: effectiveType,
21826
21826
  onChange: (e) => changeType(e.target.value),
21827
21827
  children: chunk4SPZ5IZN_js.ELEMENT_ACTION_TYPE_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.labelKey) }, o.value))
@@ -22342,7 +22342,7 @@ function ChartDataGrid({
22342
22342
  }) {
22343
22343
  const { t } = reactI18next.useTranslation();
22344
22344
  const highlightRef = React20.useRef(null);
22345
- const { viewportWidth } = chunk3UGVURWU_js.useIsMobile();
22345
+ const { viewportWidth } = chunkE55VEC37_js.useIsMobile();
22346
22346
  const gridPlan = chunk4SPZ5IZN_js.getDenseGridLayoutPlan(viewportWidth);
22347
22347
  const touchTargetPx = chunk4SPZ5IZN_js.getDensePanelTouchTargetPx(viewportWidth);
22348
22348
  const rowHeaderClass = gridPlan.stickyFirstColumn ? "sticky left-0 z-10 bg-card" : "";
@@ -23711,7 +23711,7 @@ function ChartUserShapeOptions({
23711
23711
  }
23712
23712
  function ChartDataPanel({ selectedElement, canEdit, onUpdateElement }) {
23713
23713
  const chartData = selectedElement.chartData;
23714
- const followDataPoint = chunk3UGVURWU_js.useViewerOptionsContext().advanced.chartPropertiesFollowDataPoint;
23714
+ const followDataPoint = chunkE55VEC37_js.useViewerOptionsContext().advanced.chartPropertiesFollowDataPoint;
23715
23715
  const { selection: partSelection } = useChartPartSelection();
23716
23716
  const canvasPart = partSelection?.elementId === selectedElement.id ? partSelection.part : null;
23717
23717
  const title = chartData?.title;
@@ -24468,7 +24468,7 @@ function ConnectorArrowsSection({
24468
24468
  },
24469
24469
  disabled: !canEdit,
24470
24470
  className: SELECT_CLS2,
24471
- children: chunkNJ3WCYYG_js.CONNECTOR_ARROW_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.i18nKey) }, o.value))
24471
+ children: chunk7FBKS7OS_js.CONNECTOR_ARROW_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.i18nKey) }, o.value))
24472
24472
  }
24473
24473
  )
24474
24474
  ] }, end);
@@ -24492,7 +24492,7 @@ function ConnectorArrowsSection({
24492
24492
  },
24493
24493
  disabled: !canEdit,
24494
24494
  className: SELECT_CLS2,
24495
- children: chunkNJ3WCYYG_js.ARROW_SIZE_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.i18nKey) }, o.value))
24495
+ children: chunk7FBKS7OS_js.ARROW_SIZE_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.i18nKey) }, o.value))
24496
24496
  }
24497
24497
  )
24498
24498
  ] }),
@@ -24511,7 +24511,7 @@ function ConnectorArrowsSection({
24511
24511
  },
24512
24512
  disabled: !canEdit,
24513
24513
  className: SELECT_CLS2,
24514
- children: chunkNJ3WCYYG_js.ARROW_SIZE_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.i18nKey) }, o.value))
24514
+ children: chunk7FBKS7OS_js.ARROW_SIZE_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.i18nKey) }, o.value))
24515
24515
  }
24516
24516
  )
24517
24517
  ] })
@@ -24602,7 +24602,7 @@ function OlePropertiesPanel({
24602
24602
  /* @__PURE__ */ jsxRuntime.jsx(
24603
24603
  "span",
24604
24604
  {
24605
- className: chunkNJ3WCYYG_js.cn(
24605
+ className: chunk7FBKS7OS_js.cn(
24606
24606
  "inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium",
24607
24607
  ole.isLinked ? "bg-blue-500/20 text-blue-400" : "bg-green-500/20 text-green-400"
24608
24608
  ),
@@ -24670,7 +24670,7 @@ function LayerOrderButtons({
24670
24670
  "button",
24671
24671
  {
24672
24672
  type: "button",
24673
- className: chunkNJ3WCYYG_js.cn("flex-1", BTN),
24673
+ className: chunk7FBKS7OS_js.cn("flex-1", BTN),
24674
24674
  disabled: !canEdit,
24675
24675
  onClick: () => onMoveLayer("forward"),
24676
24676
  children: "\u2191 Forward"
@@ -24680,7 +24680,7 @@ function LayerOrderButtons({
24680
24680
  "button",
24681
24681
  {
24682
24682
  type: "button",
24683
- className: chunkNJ3WCYYG_js.cn("flex-1", BTN),
24683
+ className: chunk7FBKS7OS_js.cn("flex-1", BTN),
24684
24684
  disabled: !canEdit,
24685
24685
  onClick: () => onMoveLayer("backward"),
24686
24686
  children: "\u2193 Backward"
@@ -24704,7 +24704,7 @@ function ArtisticEffectsGallery({
24704
24704
  {
24705
24705
  type: "button",
24706
24706
  disabled: !canEdit,
24707
- className: chunkNJ3WCYYG_js.cn(
24707
+ className: chunk7FBKS7OS_js.cn(
24708
24708
  "flex flex-col items-center gap-0.5 rounded border p-0.5 hover:bg-accent/50",
24709
24709
  isActive ? "border-primary bg-primary/10" : "border-border"
24710
24710
  ),
@@ -25128,10 +25128,7 @@ function ImageCropSection({
25128
25128
  CROP_SIDES.map((side) => {
25129
25129
  const key = `crop${side}`;
25130
25130
  return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex flex-col gap-1 text-[11px]", children: [
25131
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-muted-foreground", children: [
25132
- "Crop ",
25133
- side
25134
- ] }),
25131
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: t(`pptx.image.crop${side}`) }),
25135
25132
  /* @__PURE__ */ jsxRuntime.jsx(
25136
25133
  "input",
25137
25134
  {
@@ -25209,7 +25206,7 @@ function ImagePropertiesPanel({
25209
25206
  {
25210
25207
  rows: 2,
25211
25208
  disabled: !canEdit,
25212
- className: chunkNJ3WCYYG_js.cn(INPUT, "resize-none text-[11px]"),
25209
+ className: chunk7FBKS7OS_js.cn(INPUT, "resize-none text-[11px]"),
25213
25210
  value: selectedElement.altText ?? "",
25214
25211
  onChange: (e) => onUpdateElement({
25215
25212
  altText: e.target.value
@@ -25264,7 +25261,7 @@ function ImagePropertiesPanel({
25264
25261
  ),
25265
25262
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-1.5 text-[11px]", children: [
25266
25263
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center justify-between gap-2", children: [
25267
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "Grayscale" }),
25264
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: t("pptx.image.grayscale") }),
25268
25265
  /* @__PURE__ */ jsxRuntime.jsx(
25269
25266
  "input",
25270
25267
  {
@@ -26170,7 +26167,7 @@ function AccessibilityTextSection({
26170
26167
  rows: 2,
26171
26168
  disabled: !canEdit,
26172
26169
  placeholder: t("pptx.elementAccessibility.altTextPlaceholder"),
26173
- className: chunkNJ3WCYYG_js.cn(INPUT, "resize-none text-[11px]"),
26170
+ className: chunk7FBKS7OS_js.cn(INPUT, "resize-none text-[11px]"),
26174
26171
  value: fields.altText,
26175
26172
  onChange: (e) => onUpdateElement({ altText: e.target.value })
26176
26173
  }
@@ -26184,7 +26181,7 @@ function AccessibilityTextSection({
26184
26181
  type: "text",
26185
26182
  disabled: !canEdit,
26186
26183
  placeholder: t("pptx.elementAccessibility.titlePlaceholder"),
26187
- className: chunkNJ3WCYYG_js.cn(INPUT, "text-[11px]"),
26184
+ className: chunk7FBKS7OS_js.cn(INPUT, "text-[11px]"),
26188
26185
  value: fields.title,
26189
26186
  onChange: (e) => onUpdateElement({ title: e.target.value })
26190
26187
  }
@@ -27107,7 +27104,7 @@ function FillAdvancedControls({
27107
27104
  onClick: () => onUpdateGradientStops([
27108
27105
  ...gradientStops,
27109
27106
  {
27110
- color: chunk4SPZ5IZN_js.normalizeHexColor(style?.fillColor, chunkNJ3WCYYG_js.DEFAULT_FILL_COLOR),
27107
+ color: chunk4SPZ5IZN_js.normalizeHexColor(style?.fillColor, chunk7FBKS7OS_js.DEFAULT_FILL_COLOR),
27111
27108
  position: 50,
27112
27109
  opacity: 1
27113
27110
  }
@@ -27121,7 +27118,7 @@ function FillAdvancedControls({
27121
27118
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${COL2} flex flex-col gap-2`, children: [
27122
27119
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: LBL2, children: "Pattern" }),
27123
27120
  /* @__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_OPTIONS2.map((opt) => {
27124
- const fgColor = chunk4SPZ5IZN_js.normalizeHexColor(style?.fillColor, chunkNJ3WCYYG_js.DEFAULT_FILL_COLOR);
27121
+ const fgColor = chunk4SPZ5IZN_js.normalizeHexColor(style?.fillColor, chunk7FBKS7OS_js.DEFAULT_FILL_COLOR);
27125
27122
  const bgColor = chunk4SPZ5IZN_js.normalizeHexColor(style?.fillPatternBackgroundColor, "#ffffff");
27126
27123
  const svgPattern = chunk4SPZ5IZN_js.getPatternSvg(opt.value, fgColor, bgColor);
27127
27124
  const isSelected = (style.fillPatternPreset || "pct20") === opt.value;
@@ -27156,7 +27153,7 @@ function FillAdvancedControls({
27156
27153
  {
27157
27154
  label: t("pptx.fillAdvanced.foregroundColor"),
27158
27155
  prefix: "pattern-fg",
27159
- value: chunk4SPZ5IZN_js.normalizeHexColor(style?.fillColor, chunkNJ3WCYYG_js.DEFAULT_FILL_COLOR),
27156
+ value: chunk4SPZ5IZN_js.normalizeHexColor(style?.fillColor, chunk7FBKS7OS_js.DEFAULT_FILL_COLOR),
27160
27157
  disabled: isLine,
27161
27158
  onChange: (color) => onUpdateShapeStyle({ fillMode: "pattern", fillColor: color })
27162
27159
  }
@@ -27233,7 +27230,7 @@ function QuickStylesGallery({
27233
27230
  onUpdateShapeStyle
27234
27231
  }) {
27235
27232
  const { t } = reactI18next.useTranslation();
27236
- const { viewportWidth } = chunk3UGVURWU_js.useIsMobile();
27233
+ const { viewportWidth } = chunkE55VEC37_js.useIsMobile();
27237
27234
  const swatchMinHeight = chunk4SPZ5IZN_js.getDensePanelTouchTargetPx(viewportWidth);
27238
27235
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
27239
27236
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: LBL2, children: t("pptx.shape.quickStyles") }),
@@ -27264,7 +27261,7 @@ function StrokeEffectsSection({
27264
27261
  {
27265
27262
  label: t("pptx.inspector.stroke"),
27266
27263
  prefix: "stroke",
27267
- value: chunk4SPZ5IZN_js.normalizeHexColor(style?.strokeColor, chunkNJ3WCYYG_js.DEFAULT_STROKE_COLOR),
27264
+ value: chunk4SPZ5IZN_js.normalizeHexColor(style?.strokeColor, chunk7FBKS7OS_js.DEFAULT_STROKE_COLOR),
27268
27265
  selectedRef: style?.strokeColorRef,
27269
27266
  onChange: onSetStrokeColor
27270
27267
  }
@@ -27327,7 +27324,7 @@ function StrokeEffectsSection({
27327
27324
  strokeDash: e.target.value
27328
27325
  }),
27329
27326
  className: SEL2,
27330
- children: chunkNJ3WCYYG_js.STROKE_DASH_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.i18nKey) }, o.value))
27327
+ children: chunk7FBKS7OS_js.STROKE_DASH_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.i18nKey) }, o.value))
27331
27328
  }
27332
27329
  )
27333
27330
  ] }),
@@ -27421,7 +27418,7 @@ function FillStrokeProperties({
27421
27418
  const existing = chunk4SPZ5IZN_js.sanitizeGradientStops(style?.fillGradientStops);
27422
27419
  const stops = existing.length >= 2 ? existing : [
27423
27420
  {
27424
- color: chunk4SPZ5IZN_js.normalizeHexColor(style?.fillColor, chunkNJ3WCYYG_js.DEFAULT_FILL_COLOR),
27421
+ color: chunk4SPZ5IZN_js.normalizeHexColor(style?.fillColor, chunk7FBKS7OS_js.DEFAULT_FILL_COLOR),
27425
27422
  position: 0,
27426
27423
  opacity: 1
27427
27424
  },
@@ -27446,7 +27443,7 @@ function FillStrokeProperties({
27446
27443
  onUpdateShapeStyle({ fillMode: "solid" });
27447
27444
  };
27448
27445
  const gradientStops = selectedGradientStops.length > 0 ? selectedGradientStops : [
27449
- { color: chunkNJ3WCYYG_js.DEFAULT_FILL_COLOR, position: 0 },
27446
+ { color: chunk7FBKS7OS_js.DEFAULT_FILL_COLOR, position: 0 },
27450
27447
  { color: "#ffffff", position: 100 }
27451
27448
  ];
27452
27449
  const showGradient = style?.fillMode === "gradient" || selectedGradientStops.length > 0;
@@ -27473,7 +27470,7 @@ function FillStrokeProperties({
27473
27470
  {
27474
27471
  label: t("pptx.fill.fill"),
27475
27472
  prefix: "fill",
27476
- value: chunk4SPZ5IZN_js.normalizeHexColor(style?.fillColor, chunkNJ3WCYYG_js.DEFAULT_FILL_COLOR),
27473
+ value: chunk4SPZ5IZN_js.normalizeHexColor(style?.fillColor, chunk7FBKS7OS_js.DEFAULT_FILL_COLOR),
27477
27474
  selectedRef: style?.fillColorRef,
27478
27475
  disabled: line,
27479
27476
  onChange: onSetFillColor
@@ -28306,11 +28303,11 @@ function ShapeTextPanels({
28306
28303
  {
28307
28304
  value: selectedElement.shapeType || "rect",
28308
28305
  disabled: !canEdit,
28309
- className: chunkNJ3WCYYG_js.cn(INPUT, "w-full"),
28306
+ className: chunk7FBKS7OS_js.cn(INPUT, "w-full"),
28310
28307
  onChange: (e) => onUpdateElement({
28311
28308
  shapeType: e.target.value
28312
28309
  }),
28313
- children: chunkNJ3WCYYG_js.SHAPE_PRESETS.filter((p) => p.type !== "connector").map((p) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: p.type, children: t(p.i18nKey) }, p.type))
28310
+ children: chunk7FBKS7OS_js.SHAPE_PRESETS.filter((p) => p.type !== "connector").map((p) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: p.type, children: t(p.i18nKey) }, p.type))
28314
28311
  }
28315
28312
  )
28316
28313
  ] }),
@@ -28450,7 +28447,7 @@ function TextFormatToggle({
28450
28447
  {
28451
28448
  type: "button",
28452
28449
  disabled,
28453
- className: chunkNJ3WCYYG_js.cn(
28450
+ className: chunk7FBKS7OS_js.cn(
28454
28451
  "px-2 py-1 rounded text-[11px] transition-colors max-md:min-w-[44px]! max-md:min-h-[44px]!",
28455
28452
  italic && "italic",
28456
28453
  underline && "underline",
@@ -28644,7 +28641,7 @@ function SmartArtLayoutSwitcher({
28644
28641
  type: "button",
28645
28642
  "data-testid": `smartart-layout-${type}`,
28646
28643
  disabled: !canEdit,
28647
- className: chunkNJ3WCYYG_js.cn(
28644
+ className: chunk7FBKS7OS_js.cn(
28648
28645
  "flex flex-col items-center gap-0.5 rounded border p-1.5 transition-colors",
28649
28646
  "text-[9px] leading-tight",
28650
28647
  isActive ? "border-primary bg-primary/15 text-primary" : "border-border text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -28723,7 +28720,7 @@ function SmartArtNodeStyleControls({
28723
28720
  disabled: !canEdit,
28724
28721
  "aria-label": `Bold ${label}`,
28725
28722
  "aria-pressed": bold,
28726
- className: chunkNJ3WCYYG_js.cn(
28723
+ className: chunk7FBKS7OS_js.cn(
28727
28724
  EMPHASIS_BTN,
28728
28725
  "font-bold",
28729
28726
  bold ? "border-primary bg-primary/20 text-primary" : "border-border text-muted-foreground"
@@ -28739,7 +28736,7 @@ function SmartArtNodeStyleControls({
28739
28736
  disabled: !canEdit,
28740
28737
  "aria-label": `Italic ${label}`,
28741
28738
  "aria-pressed": italic,
28742
- className: chunkNJ3WCYYG_js.cn(
28739
+ className: chunk7FBKS7OS_js.cn(
28743
28740
  EMPHASIS_BTN,
28744
28741
  "italic",
28745
28742
  italic ? "border-primary bg-primary/20 text-primary" : "border-border text-muted-foreground"
@@ -28778,7 +28775,7 @@ function SmartArtNodeRow({
28778
28775
  "div",
28779
28776
  {
28780
28777
  role: "listitem",
28781
- className: chunkNJ3WCYYG_js.cn(
28778
+ className: chunk7FBKS7OS_js.cn(
28782
28779
  "rounded border bg-background/60 p-1.5",
28783
28780
  isChild ? "border-border/60 ml-4" : "border-border"
28784
28781
  ),
@@ -28793,7 +28790,7 @@ function SmartArtNodeRow({
28793
28790
  "data-testid": "smartart-node-text",
28794
28791
  disabled: !canEdit,
28795
28792
  "aria-label": label,
28796
- className: chunkNJ3WCYYG_js.cn(INPUT, "flex-1 text-[11px] py-0.5"),
28793
+ className: chunk7FBKS7OS_js.cn(INPUT, "flex-1 text-[11px] py-0.5"),
28797
28794
  value: text,
28798
28795
  onChange: (e) => onChangeText(nodeId, e.target.value),
28799
28796
  onKeyDown: (e) => onKeyDown(e, nodeId),
@@ -28842,7 +28839,7 @@ function SmartArtNodeRow({
28842
28839
  {
28843
28840
  type: "button",
28844
28841
  disabled: !canEdit || removeDisabled,
28845
- className: chunkNJ3WCYYG_js.cn(MINI_BTN, "hover:text-red-400"),
28842
+ className: chunk7FBKS7OS_js.cn(MINI_BTN, "hover:text-red-400"),
28846
28843
  onClick: () => onRemove(nodeId),
28847
28844
  "aria-label": `Remove ${label}`,
28848
28845
  title: removeDisabled ? t("pptx.smartArt.layoutMinimum") : t("pptx.smartArt.remove"),
@@ -28885,7 +28882,7 @@ function SmartArtStyleControls({
28885
28882
  disabled: !canEdit,
28886
28883
  "data-testid": "smartart-color-scheme",
28887
28884
  "aria-label": t("pptx.smartart.colorScheme"),
28888
- className: chunkNJ3WCYYG_js.cn(INPUT, "w-full"),
28885
+ className: chunk7FBKS7OS_js.cn(INPUT, "w-full"),
28889
28886
  value: colorScheme,
28890
28887
  onChange: (e) => onChangeColorScheme(e.target.value),
28891
28888
  children: colorSchemes.map((cs) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: cs, children: chunk4SPZ5IZN_js.schemaLabel(chunk4SPZ5IZN_js.SMARTART_COLOR_SCHEME_LABEL_KEYS, cs, translate) }, cs))
@@ -28900,7 +28897,7 @@ function SmartArtStyleControls({
28900
28897
  type: "button",
28901
28898
  disabled: !canEdit,
28902
28899
  "aria-pressed": style === s,
28903
- className: chunkNJ3WCYYG_js.cn(
28900
+ className: chunk7FBKS7OS_js.cn(
28904
28901
  "flex-1 px-2 py-1 text-[10px] rounded border transition-colors",
28905
28902
  style === s ? "border-primary bg-primary/20 text-primary" : "border-border text-muted-foreground hover:bg-muted"
28906
28903
  ),
@@ -29135,7 +29132,7 @@ function TableDataGrid({
29135
29132
  }) {
29136
29133
  const { t } = reactI18next.useTranslation();
29137
29134
  const grid = chunk4SPZ5IZN_js.buildTableDataGrid(tableElement);
29138
- const { viewportWidth } = chunk3UGVURWU_js.useIsMobile();
29135
+ const { viewportWidth } = chunkE55VEC37_js.useIsMobile();
29139
29136
  const gridPlan = chunk4SPZ5IZN_js.getDenseGridLayoutPlan(viewportWidth);
29140
29137
  const touchTargetPx = chunk4SPZ5IZN_js.getDensePanelTouchTargetPx(viewportWidth);
29141
29138
  const stickyGutterClass = gridPlan.stickyFirstColumn ? "sticky left-0 z-10" : "";
@@ -29663,7 +29660,7 @@ function TableCellFormattingPanel({
29663
29660
  {
29664
29661
  type: "button",
29665
29662
  disabled: !canEdit,
29666
- className: chunkNJ3WCYYG_js.cn(
29663
+ className: chunk7FBKS7OS_js.cn(
29667
29664
  "px-2 py-1 rounded text-[11px] transition-colors",
29668
29665
  cls,
29669
29666
  cs[key] ? "bg-primary text-white" : "bg-muted hover:bg-accent"
@@ -29682,7 +29679,7 @@ function TableCellFormattingPanel({
29682
29679
  {
29683
29680
  type: "button",
29684
29681
  disabled: !canEdit,
29685
- className: chunkNJ3WCYYG_js.cn(
29682
+ className: chunk7FBKS7OS_js.cn(
29686
29683
  "px-2 py-1 rounded text-[11px] transition-colors",
29687
29684
  cs.align === val ? "bg-primary text-white" : "bg-muted hover:bg-accent"
29688
29685
  ),
@@ -29700,7 +29697,7 @@ function TableCellFormattingPanel({
29700
29697
  {
29701
29698
  type: "button",
29702
29699
  disabled: !canEdit,
29703
- className: chunkNJ3WCYYG_js.cn(
29700
+ className: chunk7FBKS7OS_js.cn(
29704
29701
  "px-2 py-1 rounded text-[11px] transition-colors",
29705
29702
  cs.vAlign === val ? "bg-primary text-white" : "bg-muted hover:bg-accent"
29706
29703
  ),
@@ -29733,7 +29730,7 @@ function TableCellFormattingPanel({
29733
29730
  {
29734
29731
  type: "number",
29735
29732
  disabled: !canEdit,
29736
- className: chunkNJ3WCYYG_js.cn(INPUT, "w-14"),
29733
+ className: chunk7FBKS7OS_js.cn(INPUT, "w-14"),
29737
29734
  min: 0,
29738
29735
  max: 10,
29739
29736
  value: cs[widthKey] ?? 1,
@@ -29749,7 +29746,7 @@ function TableCellFormattingPanel({
29749
29746
  {
29750
29747
  type: "button",
29751
29748
  disabled: !canEdit,
29752
- className: chunkNJ3WCYYG_js.cn(BTN, "text-center"),
29749
+ className: chunk7FBKS7OS_js.cn(BTN, "text-center"),
29753
29750
  onClick: () => {
29754
29751
  const newRows = chunk4SPZ5IZN_js.computeMergeCellRight(td, rowIndex, columnIndex);
29755
29752
  if (newRows) {
@@ -29764,7 +29761,7 @@ function TableCellFormattingPanel({
29764
29761
  {
29765
29762
  type: "button",
29766
29763
  disabled: !canEdit,
29767
- className: chunkNJ3WCYYG_js.cn(BTN, "text-center"),
29764
+ className: chunk7FBKS7OS_js.cn(BTN, "text-center"),
29768
29765
  onClick: () => {
29769
29766
  const newRows = chunk4SPZ5IZN_js.computeMergeCellDown(td, rowIndex, columnIndex);
29770
29767
  if (newRows) {
@@ -29779,7 +29776,7 @@ function TableCellFormattingPanel({
29779
29776
  {
29780
29777
  type: "button",
29781
29778
  disabled: !canEdit,
29782
- className: chunkNJ3WCYYG_js.cn(BTN, "text-center"),
29779
+ className: chunk7FBKS7OS_js.cn(BTN, "text-center"),
29783
29780
  onClick: () => {
29784
29781
  const newRows = chunk4SPZ5IZN_js.computeSplitCell(td, rowIndex, columnIndex);
29785
29782
  if (newRows) {
@@ -30513,7 +30510,7 @@ function CommentMentionTextarea({
30513
30510
  "data-testid": "pptx-comment-mention-option",
30514
30511
  role: "option",
30515
30512
  "aria-selected": index === safeHighlighted,
30516
- className: chunkNJ3WCYYG_js.cn(
30513
+ className: chunk7FBKS7OS_js.cn(
30517
30514
  "block w-full px-2 py-1 text-left text-[11px] hover:bg-accent",
30518
30515
  index === safeHighlighted && "bg-accent"
30519
30516
  ),
@@ -30636,7 +30633,7 @@ function InspectorCommentRow({
30636
30633
  return /* @__PURE__ */ jsxRuntime.jsxs(
30637
30634
  "div",
30638
30635
  {
30639
- className: chunkNJ3WCYYG_js.cn(
30636
+ className: chunk7FBKS7OS_js.cn(
30640
30637
  "rounded border border-border bg-card p-2",
30641
30638
  depth > 0 && "ml-3 border-l-2 border-l-primary/40"
30642
30639
  ),
@@ -30731,7 +30728,7 @@ function InspectorCommentRow({
30731
30728
  "button",
30732
30729
  {
30733
30730
  type: "button",
30734
- className: chunkNJ3WCYYG_js.cn(
30731
+ className: chunk7FBKS7OS_js.cn(
30735
30732
  "inline-flex items-center justify-center p-1.5 border-l border-border transition-colors",
30736
30733
  comment.resolved ? "bg-green-900/40 text-green-300 hover:bg-green-900/60" : "hover:bg-accent text-foreground hover:text-foreground"
30737
30734
  ),
@@ -30898,7 +30895,7 @@ function InspectorCommentsSection({
30898
30895
  type: "button",
30899
30896
  onClick: onAddComment,
30900
30897
  disabled: !commentDraft.trim(),
30901
- className: chunkNJ3WCYYG_js.cn(
30898
+ className: chunk7FBKS7OS_js.cn(
30902
30899
  "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]!",
30903
30900
  commentDraft.trim() ? "bg-primary hover:bg-primary/80 text-white" : "bg-muted text-muted-foreground cursor-not-allowed"
30904
30901
  ),
@@ -30939,13 +30936,13 @@ function InspectorElementsTab({
30939
30936
  };
30940
30937
  if (!activeSlide) {
30941
30938
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
30942
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkNJ3WCYYG_js.cn(HEADING, "mb-2"), children: t("pptx.inspector.layerOrder") }),
30939
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunk7FBKS7OS_js.cn(HEADING, "mb-2"), children: t("pptx.inspector.layerOrder") }),
30943
30940
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-muted-foreground italic", children: t("pptx.inspector.noSlideSelected") })
30944
30941
  ] });
30945
30942
  }
30946
30943
  const elements = activeSlide.elements || [];
30947
30944
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", "data-pptx-elements-tab": true, children: [
30948
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkNJ3WCYYG_js.cn(HEADING, "mb-2"), children: t("pptx.inspector.layerOrder") }),
30945
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunk7FBKS7OS_js.cn(HEADING, "mb-2"), children: t("pptx.inspector.layerOrder") }),
30949
30946
  [...elements].reverse().map((el, reversedIndex) => {
30950
30947
  const index = elements.length - 1 - reversedIndex;
30951
30948
  const selected = selectedElementId === el.id || selectedElementIds.includes(el.id);
@@ -30953,7 +30950,7 @@ function InspectorElementsTab({
30953
30950
  "div",
30954
30951
  {
30955
30952
  title: `${el.type} - ${el.id}`,
30956
- className: chunkNJ3WCYYG_js.cn(
30953
+ className: chunk7FBKS7OS_js.cn(
30957
30954
  "flex items-center gap-2 px-2 py-1 rounded cursor-pointer transition-colors",
30958
30955
  selected ? "bg-primary/30 text-primary" : "hover:bg-muted text-foreground"
30959
30956
  ),
@@ -30990,24 +30987,24 @@ function InspectorPaneHeader({
30990
30987
  onClose
30991
30988
  }) {
30992
30989
  const { t } = reactI18next.useTranslation();
30993
- const { viewportWidth } = chunk3UGVURWU_js.useIsMobile();
30990
+ const { viewportWidth } = chunkE55VEC37_js.useIsMobile();
30994
30991
  const touchTargetPx = chunk4SPZ5IZN_js.getDensePanelTouchTargetPx(viewportWidth);
30995
30992
  const touchBtnStyle = { minWidth: touchTargetPx, minHeight: touchTargetPx };
30996
30993
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2 px-3 py-2 border-b border-border", children: [
30997
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1 rounded bg-muted p-0.5", children: INSPECTOR_TABS.map(({ key, label, icon: Icon }) => /* @__PURE__ */ jsxRuntime.jsxs(
30994
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1 rounded bg-muted p-0.5", children: INSPECTOR_TABS.map(({ key, labelKey, icon: Icon }) => /* @__PURE__ */ jsxRuntime.jsxs(
30998
30995
  "button",
30999
30996
  {
31000
30997
  type: "button",
31001
- title: label,
30998
+ title: t(labelKey),
31002
30999
  style: touchBtnStyle,
31003
- className: chunkNJ3WCYYG_js.cn(
31000
+ className: chunk7FBKS7OS_js.cn(
31004
31001
  "flex items-center justify-center gap-1 px-2 py-1 rounded text-[11px] transition-colors",
31005
31002
  activeTab === key ? "bg-primary text-white" : "text-muted-foreground hover:text-foreground hover:bg-accent"
31006
31003
  ),
31007
31004
  onClick: () => onSetActiveTab(key),
31008
31005
  children: [
31009
31006
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "w-3.5 h-3.5" }),
31010
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden sm:inline", children: label })
31007
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden sm:inline", children: t(labelKey) })
31011
31008
  ]
31012
31009
  },
31013
31010
  key
@@ -31110,7 +31107,7 @@ function CustomPropertiesBlock({
31110
31107
  "button",
31111
31108
  {
31112
31109
  type: "button",
31113
- className: chunkNJ3WCYYG_js.cn(BTN, "px-1.5 text-red-400 hover:text-red-300"),
31110
+ className: chunk7FBKS7OS_js.cn(BTN, "px-1.5 text-red-400 hover:text-red-300"),
31114
31111
  onClick: () => onUpdate(customProperties.filter((_, i) => i !== index)),
31115
31112
  children: "\xD7"
31116
31113
  }
@@ -31378,7 +31375,7 @@ function PresentationSettingsCard({
31378
31375
  {
31379
31376
  "aria-label": t("pptx.presentationSettings.showType"),
31380
31377
  disabled: !canEdit,
31381
- className: chunkNJ3WCYYG_js.cn(INPUT, "w-28"),
31378
+ className: chunk7FBKS7OS_js.cn(INPUT, "w-28"),
31382
31379
  value: presentationProperties.showType ?? "presented",
31383
31380
  onChange: (e) => onUpdate({
31384
31381
  showType: e.target.value
@@ -31438,7 +31435,7 @@ function PresentationSettingsCard({
31438
31435
  min: 1,
31439
31436
  max: 16,
31440
31437
  disabled: !canEdit,
31441
- className: chunkNJ3WCYYG_js.cn(INPUT, "w-20"),
31438
+ className: chunk7FBKS7OS_js.cn(INPUT, "w-20"),
31442
31439
  value: chunk4SPZ5IZN_js.printPropertiesSlidesPerPage(presentationProperties.printProperties),
31443
31440
  onChange: (e) => onUpdate({
31444
31441
  printProperties: chunk4SPZ5IZN_js.withSlidesPerPage(
@@ -31977,7 +31974,7 @@ function TagsSection({
31977
31974
  "button",
31978
31975
  {
31979
31976
  type: "button",
31980
- className: chunkNJ3WCYYG_js.cn(BTN, "px-1.5 text-red-400 hover:text-red-300"),
31977
+ className: chunk7FBKS7OS_js.cn(BTN, "px-1.5 text-red-400 hover:text-red-300"),
31981
31978
  title: t("pptx.tags.deleteTag"),
31982
31979
  onClick: () => deleteTag(tag.colIdx, tag.tagIdx),
31983
31980
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuTrash2, { className: "w-3 h-3" })
@@ -32106,7 +32103,7 @@ function PresentationPropertiesPanel({
32106
32103
  canEdit
32107
32104
  }
32108
32105
  ),
32109
- activeSlide && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkNJ3WCYYG_js.cn(CARD, "space-y-1"), children: [
32106
+ activeSlide && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk7FBKS7OS_js.cn(CARD, "space-y-1"), children: [
32110
32107
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING, children: "Slide" }),
32111
32108
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-[11px] text-muted-foreground", children: [
32112
32109
  activeSlide.elements?.length ?? 0,
@@ -32127,10 +32124,10 @@ function SlideBackgroundPanel({
32127
32124
  const { t } = reactI18next.useTranslation();
32128
32125
  const bgImageInputRef = React20.useRef(null);
32129
32126
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
32130
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkNJ3WCYYG_js.cn(CARD, "space-y-2"), children: [
32131
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING, children: "Background" }),
32127
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk7FBKS7OS_js.cn(CARD, "space-y-2"), children: [
32128
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING, children: t("pptx.viewer.background") }),
32132
32129
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 text-[11px]", children: [
32133
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground w-10 shrink-0", children: "Colour" }),
32130
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground w-10 shrink-0", children: t("pptx.slideBackground.colour") }),
32134
32131
  /* @__PURE__ */ jsxRuntime.jsx(
32135
32132
  DebouncedColorInput,
32136
32133
  {
@@ -32144,7 +32141,7 @@ function SlideBackgroundPanel({
32144
32141
  ] }),
32145
32142
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
32146
32143
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-[11px]", children: [
32147
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground w-10 shrink-0", children: "Image" }),
32144
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground w-10 shrink-0", children: t("pptx.slideBackground.image") }),
32148
32145
  /* @__PURE__ */ jsxRuntime.jsx(
32149
32146
  "input",
32150
32147
  {
@@ -32173,7 +32170,7 @@ function SlideBackgroundPanel({
32173
32170
  "button",
32174
32171
  {
32175
32172
  type: "button",
32176
- className: chunkNJ3WCYYG_js.cn(BTN, "flex-1 text-center"),
32173
+ className: chunk7FBKS7OS_js.cn(BTN, "flex-1 text-center"),
32177
32174
  disabled: !canEdit,
32178
32175
  onClick: () => bgImageInputRef.current?.click(),
32179
32176
  children: activeSlide.backgroundImage ? t("pptx.slideBackground.replaceImage") : t("pptx.slideBackground.chooseImage")
@@ -32206,7 +32203,7 @@ function SlideBackgroundPanel({
32206
32203
  "button",
32207
32204
  {
32208
32205
  type: "button",
32209
- className: chunkNJ3WCYYG_js.cn(BTN, "w-full text-center text-red-400 hover:text-red-300"),
32206
+ className: chunk7FBKS7OS_js.cn(BTN, "w-full text-center text-red-400 hover:text-red-300"),
32210
32207
  disabled: !canEdit,
32211
32208
  onClick: () => onUpdateSlide({
32212
32209
  backgroundColor: void 0,
@@ -32255,7 +32252,7 @@ function TemplateBackgroundCard({
32255
32252
  t("pptx.master.layout"),
32256
32253
  t("pptx.master.master")
32257
32254
  );
32258
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkNJ3WCYYG_js.cn(CARD, "space-y-2"), children: [
32255
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk7FBKS7OS_js.cn(CARD, "space-y-2"), children: [
32259
32256
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING, children: t("pptx.slideBackground.templateBackgroundsHeading") }),
32260
32257
  rows.layout && /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 text-[11px]", children: [
32261
32258
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground w-14 shrink-0 truncate", title: rows.layout.title, children: t("pptx.master.layout") }),
@@ -32386,7 +32383,7 @@ function InspectorPane(props) {
32386
32383
  } = props;
32387
32384
  const hasSelection = selectedElement !== null;
32388
32385
  const { t } = reactI18next.useTranslation();
32389
- const { dragY, handlers: dragHandlers } = chunk3UGVURWU_js.useSheetDismissDrag(onClose);
32386
+ const { dragY, handlers: dragHandlers } = chunkE55VEC37_js.useSheetDismissDrag(onClose);
32390
32387
  const {
32391
32388
  animationPanelHeight,
32392
32389
  effectiveThemeOptions,
@@ -32407,7 +32404,7 @@ function InspectorPane(props) {
32407
32404
  /* @__PURE__ */ jsxRuntime.jsxs(
32408
32405
  "div",
32409
32406
  {
32410
- className: chunkNJ3WCYYG_js.cn(
32407
+ className: chunk7FBKS7OS_js.cn(
32411
32408
  // Shared styles
32412
32409
  "bg-background flex flex-col text-xs text-foreground shadow-xl",
32413
32410
  // Mobile: absolute bottom sheet overlay sized via dvh so it
@@ -33056,7 +33053,7 @@ function PresentationTouchControls({
33056
33053
  hideNavigation = false
33057
33054
  }) {
33058
33055
  const { t } = reactI18next.useTranslation();
33059
- const { isTouchDevice } = chunk3UGVURWU_js.useIsMobile();
33056
+ const { isTouchDevice } = chunkE55VEC37_js.useIsMobile();
33060
33057
  if (!isTouchDevice) {
33061
33058
  return null;
33062
33059
  }
@@ -34044,12 +34041,12 @@ function PrintDialog({
34044
34041
  defaultFrameSlides
34045
34042
  }) {
34046
34043
  const { t } = reactI18next.useTranslation();
34047
- const { panelStyle, handlers: dragHandlers } = chunk3UGVURWU_js.useModalDismissDrag(onClose);
34048
- const { viewportWidth } = chunk3UGVURWU_js.useIsMobile();
34044
+ const { panelStyle, handlers: dragHandlers } = chunkE55VEC37_js.useModalDismissDrag(onClose);
34045
+ const { viewportWidth } = chunkE55VEC37_js.useIsMobile();
34049
34046
  const touchTargetPx = chunk4SPZ5IZN_js.getDensePanelTouchTargetPx(viewportWidth);
34050
34047
  const closeBtnStyle = { minWidth: touchTargetPx, minHeight: touchTargetPx };
34051
34048
  const footerBtnStyle = { minHeight: touchTargetPx };
34052
- const printOptionDefaults = chunk4SPZ5IZN_js.resolveDefaultPrintSettings(chunk3UGVURWU_js.useViewerOptionsContext());
34049
+ const printOptionDefaults = chunk4SPZ5IZN_js.resolveDefaultPrintSettings(chunkE55VEC37_js.useViewerOptionsContext());
34053
34050
  const [printWhat, setPrintWhat] = React20.useState(printOptionDefaults?.printWhat ?? "slides");
34054
34051
  const [orientation, setOrientation] = React20.useState("landscape");
34055
34052
  const [colorMode, setColorMode] = React20.useState(
@@ -34592,7 +34589,7 @@ function BroadcastDialog({
34592
34589
  const [serverUrl, setServerUrl] = React20.useState("");
34593
34590
  const [copied, setCopied] = React20.useState(false);
34594
34591
  const dialogRef = React20.useRef(null);
34595
- const { panelStyle, handlers: dragHandlers } = chunk3UGVURWU_js.useModalDismissDrag(onClose);
34592
+ const { panelStyle, handlers: dragHandlers } = chunkE55VEC37_js.useModalDismissDrag(onClose);
34596
34593
  useModalFocus(open, dialogRef, onClose);
34597
34594
  React20.useEffect(() => {
34598
34595
  if (open && !isBroadcasting) {
@@ -34901,7 +34898,7 @@ function ActiveSessionView({
34901
34898
  onCopyRoomId,
34902
34899
  onStopCollaboration
34903
34900
  }) {
34904
- const { t } = reactI18next.useTranslation(), viewerOptions = chunk3UGVURWU_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 = chunk4SPZ5IZN_js.buildActiveSessionUsers({
34901
+ const { t } = reactI18next.useTranslation(), viewerOptions = chunkE55VEC37_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 = chunk4SPZ5IZN_js.buildActiveSessionUsers({
34905
34902
  localUserName: activeCollaboration?.userName ?? collab.config.userName,
34906
34903
  localUserInitials: viewerOptions.general.userInitials,
34907
34904
  localUserColor: collab.config.userColor,
@@ -35000,7 +34997,7 @@ function StartSessionForm({
35000
34997
  onRetry
35001
34998
  }) {
35002
34999
  const { t } = reactI18next.useTranslation();
35003
- const { viewportWidth } = chunk3UGVURWU_js.useIsMobile();
35000
+ const { viewportWidth } = chunkE55VEC37_js.useIsMobile();
35004
35001
  const tabBtnStyle = { minHeight: chunk4SPZ5IZN_js.getDensePanelTouchTargetPx(viewportWidth) };
35005
35002
  const inputReadOnlyClass = preconfigured ? " opacity-70 cursor-not-allowed" : "";
35006
35003
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
@@ -35144,9 +35141,9 @@ function ShareDialog({
35144
35141
  const [invitation, setInvitation] = React20.useState("");
35145
35142
  const [copied, setCopied] = React20.useState(false);
35146
35143
  const dialogRef = React20.useRef(null);
35147
- const { panelStyle, handlers: dragHandlers } = chunk3UGVURWU_js.useModalDismissDrag(onClose);
35144
+ const { panelStyle, handlers: dragHandlers } = chunkE55VEC37_js.useModalDismissDrag(onClose);
35148
35145
  useModalFocus(open, dialogRef, onClose);
35149
- const { viewportWidth, viewportHeight } = chunk3UGVURWU_js.useIsMobile();
35146
+ const { viewportWidth, viewportHeight } = chunkE55VEC37_js.useIsMobile();
35150
35147
  const touchTargetPx = chunk4SPZ5IZN_js.getDensePanelTouchTargetPx(viewportWidth);
35151
35148
  const touchBtnStyle = { minWidth: touchTargetPx, minHeight: touchTargetPx };
35152
35149
  const stickyFooterClass = chunk4SPZ5IZN_js.shouldStickyActionRow(viewportWidth, viewportHeight) ? "sticky bottom-0 bg-popover" : "";
@@ -35432,12 +35429,12 @@ function HyperlinkEditDialog({
35432
35429
  onCancel
35433
35430
  }) {
35434
35431
  const { t } = reactI18next.useTranslation();
35435
- const { panelStyle, handlers: dragHandlers } = chunk3UGVURWU_js.useModalDismissDrag(onCancel);
35432
+ const { panelStyle, handlers: dragHandlers } = chunkE55VEC37_js.useModalDismissDrag(onCancel);
35436
35433
  const inputRef = React20.useRef(null);
35437
- const detectedType = chunk3UGVURWU_js.detectTargetType(initialUrl, initialAction);
35438
- const emailParts = chunk3UGVURWU_js.parseEmailUrl(initialUrl || "");
35439
- const detectedSlide = chunk3UGVURWU_js.parseSlideFromUrl(initialUrl, initialAction);
35440
- const detectedVerb = initialAction ? chunk3UGVURWU_js.ACTION_VERB_MAP[initialAction.toLowerCase()] || "nextSlide" : "nextSlide";
35434
+ const detectedType = chunkE55VEC37_js.detectTargetType(initialUrl, initialAction);
35435
+ const emailParts = chunkE55VEC37_js.parseEmailUrl(initialUrl || "");
35436
+ const detectedSlide = chunkE55VEC37_js.parseSlideFromUrl(initialUrl, initialAction);
35437
+ const detectedVerb = initialAction ? chunkE55VEC37_js.ACTION_VERB_MAP[initialAction.toLowerCase()] || "nextSlide" : "nextSlide";
35441
35438
  const [targetType, setTargetType] = React20.useState(detectedType);
35442
35439
  const [url, setUrl] = React20.useState(
35443
35440
  detectedType === "email" || detectedType === "slide" || detectedType === "action" ? "" : initialUrl || ""
@@ -35468,7 +35465,7 @@ function HyperlinkEditDialog({
35468
35465
  actionVerb
35469
35466
  });
35470
35467
  };
35471
- const tabCls = (active) => chunkNJ3WCYYG_js.cn(
35468
+ const tabCls = (active) => chunk7FBKS7OS_js.cn(
35472
35469
  "px-3 py-1.5 text-xs rounded-t border-b-2 transition-colors",
35473
35470
  active ? "border-primary text-primary font-medium" : "border-transparent text-muted-foreground hover:text-foreground hover:border-border"
35474
35471
  );
@@ -35714,7 +35711,7 @@ function ViewerBottomPanels({
35714
35711
  hiddenActions,
35715
35712
  notesStyle
35716
35713
  }) {
35717
- const { isHidden } = chunk3UGVURWU_js.useToolbarVisibility(hiddenActions);
35714
+ const { isHidden } = chunkE55VEC37_js.useToolbarVisibility(hiddenActions);
35718
35715
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
35719
35716
  onResizeBottom && !isSlideNotesCollapsed && /* @__PURE__ */ jsxRuntime.jsx(ResizeHandle, { direction: "vertical", onResize: onResizeBottom }),
35720
35717
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -35907,8 +35904,8 @@ function ViewerInspector({
35907
35904
  function TitleBar(p) {
35908
35905
  const { t } = reactI18next.useTranslation();
35909
35906
  const editing = (p.mode === "edit" || p.mode === "master") && p.canEdit;
35910
- const { isHidden } = chunk3UGVURWU_js.useToolbarVisibility(p.hiddenActions);
35911
- const quickAccess = chunk3UGVURWU_js.useViewerOptionsContext().quickAccess;
35907
+ const { isHidden } = chunkE55VEC37_js.useToolbarVisibility(p.hiddenActions);
35908
+ const quickAccess = chunkE55VEC37_js.useViewerOptionsContext().quickAccess;
35912
35909
  const [searchQuery, setSearchQuery] = React20.useState("");
35913
35910
  const [searchFocused, setSearchFocused] = React20.useState(false);
35914
35911
  const searchRef = React20.useRef(null);
@@ -35964,7 +35961,7 @@ function TitleBar(p) {
35964
35961
  role: "switch",
35965
35962
  "aria-checked": p.autosaveEnabled,
35966
35963
  onClick: p.onToggleAutosave,
35967
- className: chunkNJ3WCYYG_js.cn(
35964
+ className: chunk7FBKS7OS_js.cn(
35968
35965
  chunk4SPZ5IZN_js.TITLE_BAR_CLASSES.toggleTrack,
35969
35966
  p.autosaveEnabled ? chunk4SPZ5IZN_js.TITLE_BAR_CLASSES.toggleTrackOn : chunk4SPZ5IZN_js.TITLE_BAR_CLASSES.toggleTrackOff
35970
35967
  ),
@@ -35973,7 +35970,7 @@ function TitleBar(p) {
35973
35970
  children: /* @__PURE__ */ jsxRuntime.jsx(
35974
35971
  "span",
35975
35972
  {
35976
- className: chunkNJ3WCYYG_js.cn(
35973
+ className: chunk7FBKS7OS_js.cn(
35977
35974
  chunk4SPZ5IZN_js.TITLE_BAR_CLASSES.toggleKnob,
35978
35975
  p.autosaveEnabled ? chunk4SPZ5IZN_js.TITLE_BAR_CLASSES.toggleKnobOn : chunk4SPZ5IZN_js.TITLE_BAR_CLASSES.toggleKnobOff
35979
35976
  )
@@ -36029,7 +36026,7 @@ function TitleBar(p) {
36029
36026
  /* @__PURE__ */ jsxRuntime.jsx(
36030
36027
  "span",
36031
36028
  {
36032
- className: chunkNJ3WCYYG_js.cn(
36029
+ className: chunk7FBKS7OS_js.cn(
36033
36030
  chunk4SPZ5IZN_js.TITLE_BAR_CLASSES.statusText,
36034
36031
  p.autosaveStatus?.state === "error" && p.autosaveEnabled && chunk4SPZ5IZN_js.TITLE_BAR_CLASSES.statusError,
36035
36032
  p.autosaveStatus?.state === "saving" && p.autosaveEnabled && chunk4SPZ5IZN_js.TITLE_BAR_CLASSES.statusSaving
@@ -36043,7 +36040,7 @@ function TitleBar(p) {
36043
36040
  /* @__PURE__ */ jsxRuntime.jsxs(
36044
36041
  "div",
36045
36042
  {
36046
- className: chunkNJ3WCYYG_js.cn(
36043
+ className: chunk7FBKS7OS_js.cn(
36047
36044
  chunk4SPZ5IZN_js.TITLE_BAR_CLASSES.searchBox,
36048
36045
  (searchFocused || p.findReplaceOpen) && "text-foreground bg-background"
36049
36046
  ),
@@ -36208,7 +36205,7 @@ function ViewerToolbarSection(props) {
36208
36205
  [activeSlide, propertyHandlers]
36209
36206
  );
36210
36207
  const scopedLayoutOptions = React20__default.default.useMemo(
36211
- () => chunk3UGVURWU_js.scopeLayoutOptionsToActiveSlide(s.layoutOptions, activeSlide),
36208
+ () => chunkE55VEC37_js.scopeLayoutOptionsToActiveSlide(s.layoutOptions, activeSlide),
36212
36209
  [s.layoutOptions, activeSlide]
36213
36210
  );
36214
36211
  const handleResetSlide = React20.useCallback(() => {
@@ -36689,7 +36686,7 @@ function EquationEditorDialog({
36689
36686
  existingOmml
36690
36687
  }) {
36691
36688
  const { t } = reactI18next.useTranslation();
36692
- const { panelStyle, handlers: dragHandlers } = chunk3UGVURWU_js.useModalDismissDrag(onClose);
36689
+ const { panelStyle, handlers: dragHandlers } = chunkE55VEC37_js.useModalDismissDrag(onClose);
36693
36690
  const initialLatex = React20.useMemo(() => {
36694
36691
  if (!existingOmml) {
36695
36692
  return "";
@@ -36811,7 +36808,7 @@ function EquationEditorDialog({
36811
36808
  {
36812
36809
  type: "button",
36813
36810
  onClick: () => handleTemplateClick(tmpl.latex),
36814
- className: chunkNJ3WCYYG_js.cn(
36811
+ className: chunk7FBKS7OS_js.cn(
36815
36812
  "flex flex-col items-center gap-1 p-2 rounded-lg border transition-colors",
36816
36813
  latex === tmpl.latex ? "border-primary bg-primary/10" : "border-border bg-muted/40 hover:bg-accent/60 hover:border-border"
36817
36814
  ),
@@ -36895,7 +36892,7 @@ function InsertSmartArtDialog({
36895
36892
  onInsert
36896
36893
  }) {
36897
36894
  const { t } = reactI18next.useTranslation();
36898
- const { panelStyle, handlers: dragHandlers } = chunk3UGVURWU_js.useModalDismissDrag(onClose);
36895
+ const { panelStyle, handlers: dragHandlers } = chunkE55VEC37_js.useModalDismissDrag(onClose);
36899
36896
  const [activeCategory, setActiveCategory] = React20.useState("list");
36900
36897
  const [selectedLayout, setSelectedLayout] = React20.useState(null);
36901
36898
  const dialogRef = React20.useRef(null);
@@ -36976,7 +36973,7 @@ function InsertSmartArtDialog({
36976
36973
  setActiveCategory(cat.id);
36977
36974
  setSelectedLayout(null);
36978
36975
  },
36979
- className: chunkNJ3WCYYG_js.cn(
36976
+ className: chunk7FBKS7OS_js.cn(
36980
36977
  "w-full text-left px-3 py-1.5 text-xs transition-colors",
36981
36978
  activeCategory === cat.id ? "bg-primary text-white" : "text-foreground hover:bg-muted"
36982
36979
  ),
@@ -37004,7 +37001,7 @@ function InsertSmartArtDialog({
37004
37001
  onInsert(preset.layout, preset.defaultItems);
37005
37002
  onClose();
37006
37003
  },
37007
- className: chunkNJ3WCYYG_js.cn(
37004
+ className: chunk7FBKS7OS_js.cn(
37008
37005
  "flex flex-col items-center gap-1 p-2 rounded border transition-colors",
37009
37006
  selectedLayout === preset.layout ? "border-primary bg-primary/20" : "border-border hover:border-border hover:bg-muted/50"
37010
37007
  ),
@@ -37034,7 +37031,7 @@ function InsertSmartArtDialog({
37034
37031
  type: "button",
37035
37032
  onClick: handleInsert,
37036
37033
  disabled: !selectedLayout,
37037
- className: chunkNJ3WCYYG_js.cn(
37034
+ className: chunk7FBKS7OS_js.cn(
37038
37035
  "px-3 py-1.5 text-xs rounded transition-colors",
37039
37036
  selectedLayout ? "bg-primary hover:bg-primary/80 text-white" : "bg-muted text-muted-foreground cursor-not-allowed"
37040
37037
  ),
@@ -37607,8 +37604,8 @@ function ViewerCanvasArea(props) {
37607
37604
  aiCanvasActive = false
37608
37605
  } = props;
37609
37606
  const { t } = reactI18next.useTranslation();
37610
- const { isHidden } = chunk3UGVURWU_js.useToolbarVisibility(hiddenActions);
37611
- const viewerOptions = chunk3UGVURWU_js.useViewerOptionsContext();
37607
+ const { isHidden } = chunkE55VEC37_js.useToolbarVisibility(hiddenActions);
37608
+ const viewerOptions = chunkE55VEC37_js.useViewerOptionsContext();
37612
37609
  const effectiveSlide = mode === "master" ? masterPseudoSlide : activeSlide;
37613
37610
  const effectiveTemplateElements = mode === "master" ? [] : templateElements;
37614
37611
  const fieldContext = React20.useMemo(
@@ -37740,7 +37737,7 @@ ${url}`)) {
37740
37737
  s.setActiveSlideIndex((i) => Math.max(0, i - 1));
37741
37738
  }
37742
37739
  }, [mode, presentation, s]);
37743
- const swipe = chunk3UGVURWU_js.useSwipeNavigation({
37740
+ const swipe = chunkE55VEC37_js.useSwipeNavigation({
37744
37741
  enabled: swipeEnabled,
37745
37742
  onNext: handleSwipeNext,
37746
37743
  onPrev: handleSwipePrev
@@ -38068,7 +38065,7 @@ function useTableStyleMapHandlers(input) {
38068
38065
  var AiChatPanel = React20.lazy(async () => {
38069
38066
  const [{ useChat }, { default: Panel }] = await Promise.all([
38070
38067
  import('@ai-sdk/react'),
38071
- import('./AiChatPanel-VWVGQ5DD.js')
38068
+ import('./AiChatPanel-GYH43XWW.js')
38072
38069
  ]);
38073
38070
  function BoundAiChatPanel(props) {
38074
38071
  return /* @__PURE__ */ jsxRuntime.jsx(Panel, { ...props, useChat });
@@ -38538,7 +38535,7 @@ function MobileDismissSheet({
38538
38535
  className,
38539
38536
  children
38540
38537
  }) {
38541
- const { dragY, handlers } = chunk3UGVURWU_js.useSheetDismissDrag(onClose);
38538
+ const { dragY, handlers } = chunkE55VEC37_js.useSheetDismissDrag(onClose);
38542
38539
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
38543
38540
  /* @__PURE__ */ jsxRuntime.jsx(
38544
38541
  "button",
@@ -38807,7 +38804,7 @@ function ThemeThumbnail({
38807
38804
  {
38808
38805
  type: "button",
38809
38806
  onClick,
38810
- className: chunkNJ3WCYYG_js.cn(
38807
+ className: chunk7FBKS7OS_js.cn(
38811
38808
  "group relative flex flex-col rounded-lg border-2 transition-all overflow-hidden",
38812
38809
  selected ? "border-primary shadow-lg scale-[1.02]" : "border-border hover:border-primary/50 hover:shadow-md"
38813
38810
  ),
@@ -39725,7 +39722,7 @@ function MobileBottomBar({
39725
39722
  type: "button",
39726
39723
  onClick,
39727
39724
  disabled,
39728
- className: chunkNJ3WCYYG_js.cn(
39725
+ className: chunk7FBKS7OS_js.cn(
39729
39726
  "relative flex flex-col items-center justify-center gap-0.5 flex-1 min-h-[56px] py-1.5 text-[10px] font-medium transition-colors active:scale-95 disabled:opacity-40 disabled:pointer-events-none",
39730
39727
  active ? "text-primary" : "text-muted-foreground hover:text-foreground"
39731
39728
  ),
@@ -39776,7 +39773,7 @@ function MobileChromeOverlay(props) {
39776
39773
  slideSectionGroups,
39777
39774
  canEdit,
39778
39775
  commentCount
39779
- } = props, { keyboardInset, isKeyboardOpen } = chunk3UGVURWU_js.useKeyboardInsets(), activeSheet = s.isSlidesPaneOpen ? "slides" : s.isInspectorPaneOpen ? s.sidebarPanelMode === "comments" ? "comments" : "inspector" : !s.isSlideNotesCollapsed ? "notes" : null, closeAllSheets = () => {
39776
+ } = props, { keyboardInset, isKeyboardOpen } = chunkE55VEC37_js.useKeyboardInsets(), activeSheet = s.isSlidesPaneOpen ? "slides" : s.isInspectorPaneOpen ? s.sidebarPanelMode === "comments" ? "comments" : "inspector" : !s.isSlideNotesCollapsed ? "notes" : null, closeAllSheets = () => {
39780
39777
  s.setIsSlidesPaneOpen(false);
39781
39778
  s.setIsInspectorPaneOpen(false);
39782
39779
  s.setIsSlideNotesCollapsed(true);
@@ -40042,7 +40039,7 @@ function AddinTable({
40042
40039
  "tr",
40043
40040
  {
40044
40041
  onClick: () => onSelect(row.id),
40045
- className: chunkNJ3WCYYG_js.cn(
40042
+ className: chunk7FBKS7OS_js.cn(
40046
40043
  "cursor-pointer border-b border-border/40 transition-colors",
40047
40044
  selectedId === row.id ? "bg-primary/10" : "hover:bg-accent"
40048
40045
  ),
@@ -40108,15 +40105,15 @@ function ControlRow({
40108
40105
  onOptionChange
40109
40106
  }) {
40110
40107
  const { t } = reactI18next.useTranslation();
40111
- const { viewportWidth } = chunk3UGVURWU_js.useIsMobile();
40108
+ const { viewportWidth } = chunkE55VEC37_js.useIsMobile();
40112
40109
  const fieldMinHeight = chunk4SPZ5IZN_js.getDensePanelTouchTargetPx(viewportWidth);
40113
40110
  const value = readValue(options, control);
40114
40111
  const label = t(control.labelKey);
40115
40112
  const info = control.infoKey ? /* @__PURE__ */ jsxRuntime.jsx(InfoTip, { text: t(control.infoKey) }) : null;
40116
- const rowClass = chunkNJ3WCYYG_js.cn("flex items-center justify-between gap-3 py-1.5", control.indent && "pl-6");
40113
+ const rowClass = chunk7FBKS7OS_js.cn("flex items-center justify-between gap-3 py-1.5", control.indent && "pl-6");
40117
40114
  const rowStyle = { minHeight: fieldMinHeight };
40118
40115
  if (control.kind === "toggle") {
40119
- return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: chunkNJ3WCYYG_js.cn(rowClass, "cursor-pointer select-none"), style: rowStyle, children: [
40116
+ return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: chunk7FBKS7OS_js.cn(rowClass, "cursor-pointer select-none"), style: rowStyle, children: [
40120
40117
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm text-foreground", children: [
40121
40118
  label,
40122
40119
  info
@@ -40254,7 +40251,7 @@ function CommandList({
40254
40251
  role: "option",
40255
40252
  "aria-selected": selectedId === id,
40256
40253
  onClick: () => onSelect(id),
40257
- className: chunkNJ3WCYYG_js.cn(
40254
+ className: chunk7FBKS7OS_js.cn(
40258
40255
  "flex w-full items-center rounded px-2 py-1.5 text-left text-sm transition-colors",
40259
40256
  selectedId === id ? "bg-primary/15 text-primary" : "text-foreground hover:bg-accent"
40260
40257
  ),
@@ -40398,7 +40395,7 @@ function OptionsRibbonPane({
40398
40395
  return /* @__PURE__ */ jsxRuntime.jsxs(
40399
40396
  "label",
40400
40397
  {
40401
- className: chunkNJ3WCYYG_js.cn(
40398
+ className: chunk7FBKS7OS_js.cn(
40402
40399
  "flex items-center gap-2 rounded px-2 py-1.5",
40403
40400
  isFile ? "cursor-not-allowed opacity-60" : "cursor-pointer hover:bg-accent"
40404
40401
  ),
@@ -40434,7 +40431,7 @@ function OptionsRibbonPane({
40434
40431
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: chunk4SPZ5IZN_js.SHORTCUT_REFERENCE_ITEMS.map((shortcut, i) => /* @__PURE__ */ jsxRuntime.jsxs(
40435
40432
  "div",
40436
40433
  {
40437
- className: chunkNJ3WCYYG_js.cn(
40434
+ className: chunk7FBKS7OS_js.cn(
40438
40435
  "flex items-center justify-between gap-3 rounded px-3 py-2",
40439
40436
  i % 2 === 0 ? "bg-muted/60" : ""
40440
40437
  ),
@@ -40566,7 +40563,7 @@ function SettingsAppearanceTab({
40566
40563
  type: "button",
40567
40564
  onClick: () => onSelectTheme(entry.key),
40568
40565
  "aria-pressed": isActive,
40569
- className: chunkNJ3WCYYG_js.cn(
40566
+ className: chunk7FBKS7OS_js.cn(
40570
40567
  "flex items-center gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors",
40571
40568
  isActive ? "border-primary bg-primary/10" : "border-border hover:border-primary/50 hover:bg-accent"
40572
40569
  ),
@@ -40583,7 +40580,7 @@ function SettingsAppearanceTab({
40583
40580
  /* @__PURE__ */ jsxRuntime.jsx(
40584
40581
  "span",
40585
40582
  {
40586
- className: chunkNJ3WCYYG_js.cn("text-xs font-medium", isActive ? "text-primary" : "text-foreground"),
40583
+ className: chunk7FBKS7OS_js.cn("text-xs font-medium", isActive ? "text-primary" : "text-foreground"),
40587
40584
  children: t(entry.labelKey)
40588
40585
  }
40589
40586
  )
@@ -40663,7 +40660,7 @@ function SettingsLanguageTab({
40663
40660
  type: "button",
40664
40661
  onClick: () => onSelectLocale(locale.code),
40665
40662
  "aria-pressed": isActive,
40666
- className: chunkNJ3WCYYG_js.cn(
40663
+ className: chunk7FBKS7OS_js.cn(
40667
40664
  "flex w-full items-center justify-between rounded px-3 py-2.5 text-left transition-colors",
40668
40665
  isActive ? "bg-primary/10 text-primary" : "text-foreground hover:bg-accent"
40669
40666
  ),
@@ -40702,8 +40699,8 @@ function SettingsDialog({
40702
40699
  }) {
40703
40700
  const [activeTabId, setActiveTabId] = React20.useState("general");
40704
40701
  const { t } = reactI18next.useTranslation();
40705
- const { panelStyle, handlers: dragHandlers } = chunk3UGVURWU_js.useModalDismissDrag(onClose);
40706
- const { viewportWidth, viewportHeight } = chunk3UGVURWU_js.useIsMobile();
40702
+ const { panelStyle, handlers: dragHandlers } = chunkE55VEC37_js.useModalDismissDrag(onClose);
40703
+ const { viewportWidth, viewportHeight } = chunkE55VEC37_js.useIsMobile();
40707
40704
  const touchTargetPx = chunk4SPZ5IZN_js.getDensePanelTouchTargetPx(viewportWidth);
40708
40705
  const navBtnStyle = { minHeight: touchTargetPx, minWidth: touchTargetPx };
40709
40706
  const closeBtnStyle = { minWidth: touchTargetPx, minHeight: touchTargetPx };
@@ -40807,7 +40804,7 @@ function SettingsDialog({
40807
40804
  onClick: () => setActiveTabId(tab.id),
40808
40805
  "aria-current": activeTabId === tab.id,
40809
40806
  style: navBtnStyle,
40810
- className: chunkNJ3WCYYG_js.cn(
40807
+ className: chunk7FBKS7OS_js.cn(
40811
40808
  "flex w-full items-center whitespace-nowrap rounded px-3 py-2 text-left text-sm transition-colors max-md:w-auto",
40812
40809
  activeTabId === tab.id ? "bg-primary/10 font-medium text-primary" : "text-foreground hover:bg-accent"
40813
40810
  ),
@@ -40822,7 +40819,7 @@ function SettingsDialog({
40822
40819
  onClick: () => setActiveTabId(AI_TAB_ID),
40823
40820
  "aria-current": activeTabId === AI_TAB_ID,
40824
40821
  style: navBtnStyle,
40825
- className: chunkNJ3WCYYG_js.cn(
40822
+ className: chunk7FBKS7OS_js.cn(
40826
40823
  "flex w-full items-center whitespace-nowrap rounded px-3 py-2 text-left text-sm transition-colors max-md:w-auto",
40827
40824
  activeTabId === AI_TAB_ID ? "bg-primary/10 font-medium text-primary" : "text-foreground hover:bg-accent"
40828
40825
  ),
@@ -41248,7 +41245,7 @@ function useMasterViewCrud(input) {
41248
41245
  if (id === "renameLayout" || id === "renameMaster") {
41249
41246
  const master = slideMasters[target.masterIndex];
41250
41247
  const current = id === "renameLayout" ? master?.layouts?.[target.layoutIndex ?? -1]?.name ?? "" : master?.name ?? "";
41251
- const next = chunk3UGVURWU_js.safePrompt(t("pptx.masterView.renamePrompt"), current)?.trim();
41248
+ const next = chunkE55VEC37_js.safePrompt(t("pptx.masterView.renamePrompt"), current)?.trim();
41252
41249
  if (!next) {
41253
41250
  return;
41254
41251
  }
@@ -41421,7 +41418,7 @@ var PowerPointViewer = React20.forwardRef(
41421
41418
  }
41422
41419
  const registeredCodes = i18n.options.resources ? Object.keys(i18n.options.resources) : i18n.languages ?? ["en"];
41423
41420
  return registeredCodes.map(
41424
- (code) => chunk3AJ54EAB_js.LOCALE_CATALOG.find((entry) => entry.code === code) ?? {
41421
+ (code) => chunk64FUV37N_js.LOCALE_CATALOG.find((entry) => entry.code === code) ?? {
41425
41422
  code,
41426
41423
  label: code,
41427
41424
  nativeLabel: code
@@ -41468,7 +41465,7 @@ var PowerPointViewer = React20.forwardRef(
41468
41465
  }
41469
41466
  })();
41470
41467
  }, []);
41471
- const { optionsStore, options: viewerOptions } = chunk3UGVURWU_js.useViewerOptions();
41468
+ const { optionsStore, options: viewerOptions } = chunkE55VEC37_js.useViewerOptions();
41472
41469
  const [protectedViewOverridden, setProtectedViewOverridden] = React20.useState(false);
41473
41470
  React20.useEffect(() => {
41474
41471
  setProtectedViewOverridden(false);
@@ -41477,8 +41474,8 @@ var PowerPointViewer = React20.forwardRef(
41477
41474
  const handleEnableEditing = React20.useCallback(() => {
41478
41475
  setProtectedViewOverridden(true);
41479
41476
  }, []);
41480
- const readOnlyRec = chunk3UGVURWU_js.useReadOnlyRecommendationState(content);
41481
- const compatToastsState = chunk3UGVURWU_js.useCompatibilityToastsState();
41477
+ const readOnlyRec = chunkE55VEC37_js.useReadOnlyRecommendationState(content);
41478
+ const compatToastsState = chunkE55VEC37_js.useCompatibilityToastsState();
41482
41479
  const runProgramNoticesState = useRunProgramNoticesState();
41483
41480
  const canEdit = hostCanEdit && !isProtectedView && !readOnlyRec.locked;
41484
41481
  const [isSettingsOpen, setIsSettingsOpen] = React20.useState(false);
@@ -41491,8 +41488,8 @@ var PowerPointViewer = React20.forwardRef(
41491
41488
  filePath
41492
41489
  });
41493
41490
  const [isShareDialogOpen, setIsShareDialogOpen] = React20.useState(false);
41494
- const { reducedMotion, toggleReducedMotion } = chunk3UGVURWU_js.useReducedMotion();
41495
- const state = chunk3UGVURWU_js.useViewerState({ content, canEdit });
41491
+ const { reducedMotion, toggleReducedMotion } = chunkE55VEC37_js.useReducedMotion();
41492
+ const state = chunkE55VEC37_js.useViewerState({ content, canEdit });
41496
41493
  const {
41497
41494
  containerRef,
41498
41495
  mode,
@@ -41630,16 +41627,16 @@ var PowerPointViewer = React20.forwardRef(
41630
41627
  clearIfRequested();
41631
41628
  };
41632
41629
  }, [viewerOptions, handleClearOptionsCache]);
41633
- const mobile = chunk3UGVURWU_js.useIsMobile();
41630
+ const mobile = chunkE55VEC37_js.useIsMobile();
41634
41631
  const { isMobile, isTouchDevice, isVirtualKeyboardOpen } = mobile;
41635
- const resizablePanels = chunk3UGVURWU_js.useResizablePanels();
41632
+ const resizablePanels = chunkE55VEC37_js.useResizablePanels();
41636
41633
  const {
41637
41634
  gridSpacingPx,
41638
41635
  visibleSlideIndexes,
41639
41636
  slideSectionGroups,
41640
41637
  masterPseudoSlide,
41641
41638
  authoredRange
41642
- } = chunk3UGVURWU_js.useDerivedSlideState({
41639
+ } = chunkE55VEC37_js.useDerivedSlideState({
41643
41640
  slides,
41644
41641
  sections: state.sections,
41645
41642
  customShows: state.customShows,
@@ -41663,7 +41660,7 @@ var PowerPointViewer = React20.forwardRef(
41663
41660
  state.isDrawingRef
41664
41661
  ]
41665
41662
  );
41666
- const zoom = chunk3UGVURWU_js.useZoomViewport({
41663
+ const zoom = chunkE55VEC37_js.useZoomViewport({
41667
41664
  canvasSize,
41668
41665
  selectedElements: state.selectedElements,
41669
41666
  fitPadding: props.fitPadding,
@@ -41673,7 +41670,7 @@ var PowerPointViewer = React20.forwardRef(
41673
41670
  const markDocumentDirty = React20.useCallback(() => {
41674
41671
  setIsDirty(true);
41675
41672
  }, [setIsDirty]);
41676
- const history = chunk3UGVURWU_js.useEditorHistory({
41673
+ const history = chunkE55VEC37_js.useEditorHistory({
41677
41674
  slides,
41678
41675
  canvasSize,
41679
41676
  activeSlideIndex,
@@ -41699,7 +41696,7 @@ var PowerPointViewer = React20.forwardRef(
41699
41696
  setEditTemplateMode: state.setEditTemplateMode,
41700
41697
  setHeaderFooter: state.setHeaderFooter
41701
41698
  });
41702
- const { presentation, annotations, actionSoundHandlerRef, setExitModeHandler } = chunk3UGVURWU_js.usePresentationSetup({
41699
+ const { presentation, annotations, actionSoundHandlerRef, setExitModeHandler } = chunkE55VEC37_js.usePresentationSetup({
41703
41700
  mode,
41704
41701
  slides,
41705
41702
  visibleSlideIndexes,
@@ -41735,7 +41732,7 @@ var PowerPointViewer = React20.forwardRef(
41735
41732
  onSetActiveCustomShowId: state.setActiveCustomShowId,
41736
41733
  onAddRunProgramNotice: runProgramNoticesState.addNotice
41737
41734
  });
41738
- chunk3UGVURWU_js.useTouchGestures({
41735
+ chunkE55VEC37_js.useTouchGestures({
41739
41736
  targetRef: zoom.canvasViewportRef,
41740
41737
  currentScale: zoom.scale,
41741
41738
  callbacks: {
@@ -41757,7 +41754,7 @@ var PowerPointViewer = React20.forwardRef(
41757
41754
  },
41758
41755
  enabled: isTouchDevice
41759
41756
  });
41760
- const dialogs = chunk3UGVURWU_js.useViewerDialogs({
41757
+ const dialogs = chunkE55VEC37_js.useViewerDialogs({
41761
41758
  mode,
41762
41759
  slides,
41763
41760
  activeSlide,
@@ -41799,7 +41796,7 @@ var PowerPointViewer = React20.forwardRef(
41799
41796
  zoom.handleZoomToFit();
41800
41797
  zoom.canvasViewportRef.current?.scrollTo({ left: 0, top: 0 });
41801
41798
  }, [mode]);
41802
- const editorOps = chunk3UGVURWU_js.useEditorOperations({
41799
+ const editorOps = chunkE55VEC37_js.useEditorOperations({
41803
41800
  state,
41804
41801
  history,
41805
41802
  zoom,
@@ -41839,7 +41836,7 @@ var PowerPointViewer = React20.forwardRef(
41839
41836
  setIsEncryptedDialogOpen,
41840
41837
  handlerRef,
41841
41838
  loadVersion
41842
- } = chunk3UGVURWU_js.useViewerIntegration({
41839
+ } = chunkE55VEC37_js.useViewerIntegration({
41843
41840
  state,
41844
41841
  zoom,
41845
41842
  history,
@@ -41897,7 +41894,7 @@ var PowerPointViewer = React20.forwardRef(
41897
41894
  onSelectionChange,
41898
41895
  onSlideCountChange
41899
41896
  });
41900
- const viewPreferencesSync = chunk3UGVURWU_js.useViewPreferencesSync({
41897
+ const viewPreferencesSync = chunkE55VEC37_js.useViewPreferencesSync({
41901
41898
  loadVersion,
41902
41899
  viewProperties: state.viewProperties,
41903
41900
  setViewProperties: state.setViewProperties,
@@ -41934,7 +41931,7 @@ var PowerPointViewer = React20.forwardRef(
41934
41931
  },
41935
41932
  [state]
41936
41933
  );
41937
- const layoutSwitching = chunk3UGVURWU_js.useLayoutSwitching({
41934
+ const layoutSwitching = chunkE55VEC37_js.useLayoutSwitching({
41938
41935
  handler: handlerRef.current,
41939
41936
  slides,
41940
41937
  activeSlideIndex,
@@ -42028,7 +42025,7 @@ var PowerPointViewer = React20.forwardRef(
42028
42025
  style: themeStyle,
42029
42026
  "data-pptx-viewer": "",
42030
42027
  "aria-busy": loading,
42031
- className: chunkNJ3WCYYG_js.cn(
42028
+ className: chunk7FBKS7OS_js.cn(
42032
42029
  "h-full w-full bg-background text-foreground relative",
42033
42030
  ...chunk4SPZ5IZN_js.resolveOptionRootClasses(viewerOptions, "pptx")
42034
42031
  ),
@@ -42389,7 +42386,7 @@ var PowerPointViewer = React20.forwardRef(
42389
42386
  // Nothing previously provided it, so every one of those consumers was
42390
42387
  // silently reading `DEFAULT_VIEWER_OPTIONS` forever, no matter what
42391
42388
  // the user changed in the Options dialog.
42392
- /* @__PURE__ */ jsxRuntime.jsx(chunk3UGVURWU_js.ViewerOptionsContext.Provider, { value: viewerOptions, children: /* @__PURE__ */ jsxRuntime.jsx(AccountAuthContext.Provider, { value: accountAuth, children: /* @__PURE__ */ jsxRuntime.jsx(SmartArt3DContext.Provider, { value: effective3D.smartArt3D, children: /* @__PURE__ */ jsxRuntime.jsx(SurfaceChart3DContext.Provider, { value: effective3D.surfaceChart3D, children: /* @__PURE__ */ jsxRuntime.jsx(BarChart3DContext.Provider, { value: effective3D.barChart3D, children: /* @__PURE__ */ jsxRuntime.jsx(LineChart3DContext.Provider, { value: effective3D.lineChart3D, children: /* @__PURE__ */ jsxRuntime.jsx(AreaChart3DContext.Provider, { value: effective3D.areaChart3D, children: /* @__PURE__ */ jsxRuntime.jsx(PieChart3DContext.Provider, { value: effective3D.pieChart3D, children: /* @__PURE__ */ jsxRuntime.jsx(ViewerThemeProvider, { theme: effectiveTheme, children: /* @__PURE__ */ jsxRuntime.jsxs(
42389
+ /* @__PURE__ */ jsxRuntime.jsx(chunkE55VEC37_js.ViewerOptionsContext.Provider, { value: viewerOptions, children: /* @__PURE__ */ jsxRuntime.jsx(AccountAuthContext.Provider, { value: accountAuth, children: /* @__PURE__ */ jsxRuntime.jsx(SmartArt3DContext.Provider, { value: effective3D.smartArt3D, children: /* @__PURE__ */ jsxRuntime.jsx(SurfaceChart3DContext.Provider, { value: effective3D.surfaceChart3D, children: /* @__PURE__ */ jsxRuntime.jsx(BarChart3DContext.Provider, { value: effective3D.barChart3D, children: /* @__PURE__ */ jsxRuntime.jsx(LineChart3DContext.Provider, { value: effective3D.lineChart3D, children: /* @__PURE__ */ jsxRuntime.jsx(AreaChart3DContext.Provider, { value: effective3D.areaChart3D, children: /* @__PURE__ */ jsxRuntime.jsx(PieChart3DContext.Provider, { value: effective3D.pieChart3D, children: /* @__PURE__ */ jsxRuntime.jsx(ViewerThemeProvider, { theme: effectiveTheme, children: /* @__PURE__ */ jsxRuntime.jsxs(
42393
42390
  CollaborationProvider,
42394
42391
  {
42395
42392
  config: collaboration,
@@ -42485,7 +42482,7 @@ function CollaborationDocumentSync({
42485
42482
  const deckSaveStateRef = React20.useRef(deckSaveState);
42486
42483
  deckSaveStateRef.current = deckSaveState;
42487
42484
  const getSaveOptions = React20.useCallback(() => chunk4SPZ5IZN_js.buildDeckSaveOptions(deckSaveStateRef.current), []);
42488
- chunk3UGVURWU_js.useYjsDocumentSync({
42485
+ chunkE55VEC37_js.useYjsDocumentSync({
42489
42486
  doc: collab?.doc ?? null,
42490
42487
  slides,
42491
42488
  templateElementsBySlideId,
@@ -42498,7 +42495,7 @@ function CollaborationDocumentSync({
42498
42495
  loadVersion,
42499
42496
  loadOrigin
42500
42497
  });
42501
- chunk3UGVURWU_js.useCollaborationLivePatch({
42498
+ chunkE55VEC37_js.useCollaborationLivePatch({
42502
42499
  patcher: livePatcher,
42503
42500
  doc: collab?.doc ?? null,
42504
42501
  isConnected: collab?.status === "connected",
@@ -42512,13 +42509,13 @@ function CollaborationFollowLayer({
42512
42509
  slideCount
42513
42510
  }) {
42514
42511
  const collab = useCollaboration();
42515
- const { followedClientId, followUser } = chunk3UGVURWU_js.useFollowMode({
42512
+ const { followedClientId, followUser } = chunkE55VEC37_js.useFollowMode({
42516
42513
  collab,
42517
42514
  activeSlideIndex,
42518
42515
  setActiveSlideIndex,
42519
42516
  slideCount
42520
42517
  });
42521
- chunk3UGVURWU_js.useBroadcastFollower({
42518
+ chunkE55VEC37_js.useBroadcastFollower({
42522
42519
  collab,
42523
42520
  activeSlideIndex,
42524
42521
  setActiveSlideIndex,