@aixa-transformation/pptx-viewer 2.0.24 → 2.0.27

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.
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkZSZ2WR4A_js = require('./chunk-ZSZ2WR4A.js');
3
+ var chunk2GATFIDB_js = require('./chunk-2GATFIDB.js');
4
4
  var chunkDHNQHQ66_js = require('./chunk-DHNQHQ66.js');
5
5
  var chunkCUUYYYC5_js = require('./chunk-CUUYYYC5.js');
6
6
  var chunkHUD73YBT_js = require('./chunk-HUD73YBT.js');
@@ -8,10 +8,12 @@ var React18 = require('react');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
9
  var reactI18next = require('react-i18next');
10
10
  var lu = require('react-icons/lu');
11
+ var JSZip = require('jszip');
11
12
 
12
13
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
14
 
14
15
  var React18__default = /*#__PURE__*/_interopDefault(React18);
16
+ var JSZip__default = /*#__PURE__*/_interopDefault(JSZip);
15
17
 
16
18
  var ViewerThemeContext = React18.createContext(void 0);
17
19
  function ViewerThemeProvider({ theme, children }) {
@@ -42,7 +44,7 @@ function CollaborationProvider({
42
44
  canvasHeight,
43
45
  children
44
46
  }) {
45
- const value = chunkZSZ2WR4A_js.useCollaborativeState({
47
+ const value = chunk2GATFIDB_js.useCollaborativeState({
46
48
  config,
47
49
  canvasWidth,
48
50
  canvasHeight
@@ -474,7 +476,7 @@ function RibbonGroup({
474
476
  return /* @__PURE__ */ jsxRuntime.jsxs(
475
477
  "section",
476
478
  {
477
- className: chunkZSZ2WR4A_js.cn(
479
+ className: chunk2GATFIDB_js.cn(
478
480
  "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",
479
481
  className
480
482
  ),
@@ -502,7 +504,7 @@ function RibbonCommand({
502
504
  onClick,
503
505
  disabled,
504
506
  title: title ?? label,
505
- className: chunkZSZ2WR4A_js.cn(
507
+ className: chunk2GATFIDB_js.cn(
506
508
  "inline-flex rounded-sm text-foreground transition-colors hover:bg-accent disabled:cursor-not-allowed disabled:opacity-35",
507
509
  active && "bg-primary/15 text-primary ring-1 ring-primary/35",
508
510
  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]"
@@ -511,7 +513,7 @@ function RibbonCommand({
511
513
  /* @__PURE__ */ jsxRuntime.jsx(
512
514
  "span",
513
515
  {
514
- className: chunkZSZ2WR4A_js.cn(
516
+ className: chunk2GATFIDB_js.cn(
515
517
  "grid shrink-0 place-items-center text-primary",
516
518
  compact ? "h-4 w-4 [&>svg]:h-4 [&>svg]:w-4" : "h-7 w-7 [&>svg]:h-6 [&>svg]:w-6"
517
519
  ),
@@ -540,7 +542,7 @@ function RibbonToggle({
540
542
  "label",
541
543
  {
542
544
  title,
543
- className: chunkZSZ2WR4A_js.cn(
545
+ className: chunk2GATFIDB_js.cn(
544
546
  "flex h-[19px] items-center gap-1 whitespace-nowrap rounded-sm px-1 text-[10px] text-foreground",
545
547
  checked && "bg-primary/15 text-primary"
546
548
  ),
@@ -952,7 +954,7 @@ function ArrangeSection(p) {
952
954
  disabled: !p.canEdit || p.canActivateFormatPainter === false && !p.formatPainterActive,
953
955
  "data-testid": "format-painter-toggle",
954
956
  "data-active": p.formatPainterActive ? "true" : "false",
955
- className: chunkZSZ2WR4A_js.cn(
957
+ className: chunk2GATFIDB_js.cn(
956
958
  pill,
957
959
  p.formatPainterActive ? "bg-amber-600 hover:bg-amber-500 text-amber-50" : ""
958
960
  ),
@@ -1067,7 +1069,7 @@ function DesignSection(p) {
1067
1069
  {
1068
1070
  onClick: p.onToggleThemeGallery,
1069
1071
  disabled: !p.canEdit,
1070
- className: chunkZSZ2WR4A_js.cn(
1072
+ className: chunk2GATFIDB_js.cn(
1071
1073
  pill,
1072
1074
  p.isThemeGalleryOpen ? "bg-primary hover:bg-primary/80 text-white" : ""
1073
1075
  ),
@@ -1083,7 +1085,7 @@ function DesignSection(p) {
1083
1085
  {
1084
1086
  onClick: p.onToggleThemeEditor,
1085
1087
  disabled: !p.canEdit,
1086
- className: chunkZSZ2WR4A_js.cn(pill, p.isThemeEditorOpen ? "bg-primary hover:bg-primary/80 text-white" : ""),
1088
+ className: chunk2GATFIDB_js.cn(pill, p.isThemeEditorOpen ? "bg-primary hover:bg-primary/80 text-white" : ""),
1087
1089
  title: t("pptx.ribbon.editThemeTitle"),
1088
1090
  children: [
1089
1091
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuPencil, { className: ics }),
@@ -1108,7 +1110,7 @@ function DesignSection(p) {
1108
1110
  "button",
1109
1111
  {
1110
1112
  onClick: p.onToggleInspector,
1111
- className: chunkZSZ2WR4A_js.cn(
1113
+ className: chunk2GATFIDB_js.cn(
1112
1114
  pill,
1113
1115
  p.isInspectorPaneOpen ? "bg-primary hover:bg-primary/80 text-white" : ""
1114
1116
  ),
@@ -1150,7 +1152,7 @@ function TransitionsSection(p) {
1150
1152
  {
1151
1153
  type: "button",
1152
1154
  onClick: () => setSelected(preset.value),
1153
- className: chunkZSZ2WR4A_js.cn(
1155
+ className: chunk2GATFIDB_js.cn(
1154
1156
  "flex-shrink-0 px-2 py-1 max-md:min-h-[44px] rounded border text-[11px] leading-tight transition-colors",
1155
1157
  selected === preset.value ? "border-primary bg-primary/10 text-primary font-medium" : "border-border bg-muted hover:bg-accent text-foreground"
1156
1158
  ),
@@ -1235,7 +1237,7 @@ function TransitionsSection(p) {
1235
1237
  {
1236
1238
  type: "button",
1237
1239
  onClick: p.onToggleInspector,
1238
- className: chunkZSZ2WR4A_js.cn(
1240
+ className: chunk2GATFIDB_js.cn(
1239
1241
  pill,
1240
1242
  p.isInspectorPaneOpen ? "bg-primary hover:bg-primary/80 text-white" : ""
1241
1243
  ),
@@ -1256,7 +1258,7 @@ function DrawSection(p) {
1256
1258
  {
1257
1259
  type: "button",
1258
1260
  onClick: () => p.onSetActiveTool(tool.id),
1259
- className: chunkZSZ2WR4A_js.cn(
1261
+ className: chunk2GATFIDB_js.cn(
1260
1262
  i < a.length - 1 ? gB : gL,
1261
1263
  p.activeTool === tool.id ? tool.ac ?? "bg-accent text-foreground" : ""
1262
1264
  ),
@@ -1340,7 +1342,7 @@ function AccountPage() {
1340
1342
  return void 0;
1341
1343
  });
1342
1344
  };
1343
- const version = "2.0.24" ;
1345
+ const version = "2.0.27" ;
1344
1346
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-8 max-w-[700px] space-y-6", children: [
1345
1347
  /* @__PURE__ */ jsxRuntime.jsxs("section", { className: cardClass, children: [
1346
1348
  /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "flex items-center gap-2 text-sm font-semibold", children: [
@@ -1380,7 +1382,7 @@ function AccountPage() {
1380
1382
  "aria-label": color,
1381
1383
  "aria-pressed": profile.avatarColor === color,
1382
1384
  onClick: () => updateProfile({ avatarColor: color }),
1383
- className: chunkZSZ2WR4A_js.cn(
1385
+ className: chunk2GATFIDB_js.cn(
1384
1386
  "size-7 rounded-full border-2 transition-transform",
1385
1387
  profile.avatarColor === color ? "border-foreground scale-110" : "border-transparent hover:scale-105"
1386
1388
  ),
@@ -1530,7 +1532,7 @@ function FileSection(p) {
1530
1532
  const [page, setPage] = React18.useState("home");
1531
1533
  const [query, setQuery] = React18.useState("");
1532
1534
  const [recent, setRecent] = React18.useState([]);
1533
- const { isHidden } = chunkZSZ2WR4A_js.useToolbarVisibility(p.hiddenActions);
1535
+ const { isHidden } = chunk2GATFIDB_js.useToolbarVisibility(p.hiddenActions);
1534
1536
  const exportHidden = isHidden("export");
1535
1537
  React18.useEffect(() => {
1536
1538
  void chunkDHNQHQ66_js.listBackstageRecentFiles().then(setRecent);
@@ -1845,7 +1847,7 @@ function RibbonMenu({
1845
1847
  return /* @__PURE__ */ jsxRuntime.jsx(
1846
1848
  "div",
1847
1849
  {
1848
- className: chunkZSZ2WR4A_js.cn("fixed z-50", className),
1850
+ className: chunk2GATFIDB_js.cn("fixed z-50", className),
1849
1851
  style: pos ? { left: pos.left, top: pos.top } : { visibility: "hidden" },
1850
1852
  children
1851
1853
  }
@@ -1899,7 +1901,7 @@ function ChartElementView({
1899
1901
  const selectedPart = selection?.elementId === element.id ? selection.part : null;
1900
1902
  const canEdit = editable && Boolean(onUpdateElement);
1901
1903
  const viewModel = React18.useMemo(
1902
- () => canEdit ? chunkZSZ2WR4A_js.buildReactChartViewModel(element) : null,
1904
+ () => canEdit ? chunk2GATFIDB_js.buildReactChartViewModel(element) : null,
1903
1905
  [canEdit, element]
1904
1906
  );
1905
1907
  React18.useEffect(ensureInteractionStyles, []);
@@ -2048,7 +2050,7 @@ function ChartElementView({
2048
2050
  onPointerUp: handlePointerUp,
2049
2051
  onDoubleClick: handleDoubleClick,
2050
2052
  children: [
2051
- chunkZSZ2WR4A_js.renderChartElement(renderedElement),
2053
+ chunk2GATFIDB_js.renderChartElement(renderedElement),
2052
2054
  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: chunkDHNQHQ66_js.formatAxisValue(dragValue) }),
2053
2055
  titleDraft !== null && /* @__PURE__ */ jsxRuntime.jsx(
2054
2056
  "input",
@@ -2241,7 +2243,7 @@ function renderImg(el, style, filter, alt, opacity) {
2241
2243
  ...filter ? { filter } : {},
2242
2244
  ...opacity !== void 0 ? { opacity } : {}
2243
2245
  };
2244
- if (chunkZSZ2WR4A_js.isImageTiled(el)) {
2246
+ if (chunk2GATFIDB_js.isImageTiled(el)) {
2245
2247
  const tileSrc = imgSrc(el);
2246
2248
  if (!tileSrc) {
2247
2249
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-gray-500 bg-gray-100", children: "Image" });
@@ -2252,7 +2254,7 @@ function renderImg(el, style, filter, alt, opacity) {
2252
2254
  "div",
2253
2255
  {
2254
2256
  className: "pointer-events-none select-none w-full h-full",
2255
- style: { ...chunkZSZ2WR4A_js.getImageTilingStyle(el), ...effectStyles }
2257
+ style: { ...chunk2GATFIDB_js.getImageTilingStyle(el), ...effectStyles }
2256
2258
  }
2257
2259
  )
2258
2260
  ] });
@@ -2261,7 +2263,7 @@ function renderImg(el, style, filter, alt, opacity) {
2261
2263
  chunkHUD73YBT_js.isImageLikeElement(el) ? el.imageEffects?.colorWash : void 0
2262
2264
  );
2263
2265
  const clrChange = "imageEffects" in el ? el.imageEffects?.clrChange : void 0;
2264
- const duotoneColors = chunkZSZ2WR4A_js.getDuotoneColors(el);
2266
+ const duotoneColors = chunk2GATFIDB_js.getDuotoneColors(el);
2265
2267
  const useDuotoneCanvas = Boolean(duotoneColors && !clrChange);
2266
2268
  const filterForImg = useDuotoneCanvas ? chunkDHNQHQ66_js.getImageEffectsFilter(el, { excludeDuotone: true }) : filter;
2267
2269
  const canvasEffectStyles = {
@@ -2474,7 +2476,7 @@ function ResizeHandles({
2474
2476
  "button",
2475
2477
  {
2476
2478
  type: "button",
2477
- className: chunkZSZ2WR4A_js.cn("absolute z-10 group", posClass, cursor),
2479
+ className: chunk2GATFIDB_js.cn("absolute z-10 group", posClass, cursor),
2478
2480
  style: peStyle,
2479
2481
  onPointerDown: (e) => handleResizePointer(e, handle),
2480
2482
  onMouseDown: (e) => {
@@ -2492,7 +2494,7 @@ function ResizeHandles({
2492
2494
  "button",
2493
2495
  {
2494
2496
  type: "button",
2495
- className: chunkZSZ2WR4A_js.cn("absolute z-10", posClass, cursor),
2497
+ className: chunk2GATFIDB_js.cn("absolute z-10", posClass, cursor),
2496
2498
  style: peStyle,
2497
2499
  onPointerDown: (e) => handleResizePointer(e, handle),
2498
2500
  onMouseDown: (e) => {
@@ -2500,7 +2502,7 @@ function ResizeHandles({
2500
2502
  onResizePointerDown(elementId, e, handle);
2501
2503
  },
2502
2504
  children: [
2503
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkZSZ2WR4A_js.cn(sizeClass, "border border-white bg-primary shadow") }),
2505
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunk2GATFIDB_js.cn(sizeClass, "border border-white bg-primary shadow") }),
2504
2506
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -inset-2 max-md:-inset-1" })
2505
2507
  ]
2506
2508
  },
@@ -2581,7 +2583,7 @@ var ConnectorElementRenderer = React18__default.default.memo(
2581
2583
  const viewHeight = Math.max(el.height, 1);
2582
2584
  const ss = shapeEl?.shapeStyle;
2583
2585
  const strokeWidth = Math.max(0, ss?.strokeWidth ?? 2);
2584
- const strokeColor = chunkDHNQHQ66_js.normalizeHexColor(ss?.strokeColor, chunkZSZ2WR4A_js.DEFAULT_STROKE_COLOR);
2586
+ const strokeColor = chunkDHNQHQ66_js.normalizeHexColor(ss?.strokeColor, chunk2GATFIDB_js.DEFAULT_STROKE_COLOR);
2585
2587
  const strokePaint = chunkDHNQHQ66_js.colorWithOpacity(strokeColor, ss?.strokeOpacity);
2586
2588
  const dashType = chunkDHNQHQ66_js.normalizeStrokeDashType(ss?.strokeDash);
2587
2589
  const dashArray = chunkDHNQHQ66_js.getSvgStrokeDasharray(
@@ -2602,7 +2604,7 @@ var ConnectorElementRenderer = React18__default.default.memo(
2602
2604
  const connectorText = textEl?.text?.trim() ?? "";
2603
2605
  const connectorTextSegments = textEl?.textSegments;
2604
2606
  const connectorTextStyle = textEl?.textStyle;
2605
- const pathGeometry = shapeEl ? chunkZSZ2WR4A_js.getConnectorPathGeometry(shapeEl) : {
2607
+ const pathGeometry = shapeEl ? chunk2GATFIDB_js.getConnectorPathGeometry(shapeEl) : {
2606
2608
  pathData: `M 0 0 L ${viewWidth} ${viewHeight}`,
2607
2609
  startX: 0,
2608
2610
  startY: 0,
@@ -2611,8 +2613,8 @@ var ConnectorElementRenderer = React18__default.default.memo(
2611
2613
  };
2612
2614
  const hitTargetWidth = Math.max(strokeWidth * 3, 14);
2613
2615
  const selColor = selClr === "blue-400" ? "#60a5fa" : "#3b82f6";
2614
- const lineShadow = chunkZSZ2WR4A_js.buildLineShadowCss(el);
2615
- const lineGlow = chunkZSZ2WR4A_js.buildLineGlowFilter(el);
2616
+ const lineShadow = chunk2GATFIDB_js.buildLineShadowCss(el);
2617
+ const lineGlow = chunk2GATFIDB_js.buildLineGlowFilter(el);
2616
2618
  return /* @__PURE__ */ jsxRuntime.jsxs(
2617
2619
  "div",
2618
2620
  {
@@ -2622,8 +2624,8 @@ var ConnectorElementRenderer = React18__default.default.memo(
2622
2624
  style: {
2623
2625
  left: el.x,
2624
2626
  top: el.y,
2625
- width: Math.max(el.width, chunkZSZ2WR4A_js.MIN_ELEMENT_SIZE),
2626
- height: Math.max(el.height, chunkZSZ2WR4A_js.MIN_ELEMENT_SIZE),
2627
+ width: Math.max(el.width, chunk2GATFIDB_js.MIN_ELEMENT_SIZE),
2628
+ height: Math.max(el.height, chunk2GATFIDB_js.MIN_ELEMENT_SIZE),
2627
2629
  transform: chunkDHNQHQ66_js.getElementTransform(el),
2628
2630
  transformOrigin: "center",
2629
2631
  background: "transparent",
@@ -2645,14 +2647,14 @@ var ConnectorElementRenderer = React18__default.default.memo(
2645
2647
  style: { overflow: "visible", pointerEvents: "none" },
2646
2648
  children: [
2647
2649
  /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
2648
- chunkZSZ2WR4A_js.renderConnectorMarker(
2650
+ chunk2GATFIDB_js.renderConnectorMarker(
2649
2651
  startMarkerId,
2650
2652
  startArrow,
2651
2653
  strokePaint,
2652
2654
  ss?.connectorStartArrowWidth,
2653
2655
  ss?.connectorStartArrowLength
2654
2656
  ),
2655
- chunkZSZ2WR4A_js.renderConnectorMarker(
2657
+ chunk2GATFIDB_js.renderConnectorMarker(
2656
2658
  endMarkerId,
2657
2659
  endArrow,
2658
2660
  strokePaint,
@@ -2864,14 +2866,14 @@ function elementHasTextHyperlink(el) {
2864
2866
  return Boolean(el.textSegments?.some((segment) => Boolean(segment.style?.hyperlink)));
2865
2867
  }
2866
2868
  function renderDagDuotoneFilterForElement(el) {
2867
- if (!chunkZSZ2WR4A_js.hasDagDuotoneEffect(el)) {
2869
+ if (!chunk2GATFIDB_js.hasDagDuotoneEffect(el)) {
2868
2870
  return null;
2869
2871
  }
2870
2872
  const duotone = el.shapeStyle?.dagDuotone;
2871
2873
  if (!duotone) {
2872
2874
  return null;
2873
2875
  }
2874
- return chunkZSZ2WR4A_js.renderDagDuotoneSvgFilter(el.id, duotone.color1, duotone.color2);
2876
+ return chunk2GATFIDB_js.renderDagDuotoneSvgFilter(el.id, duotone.color1, duotone.color2);
2875
2877
  }
2876
2878
  function getContainerStyle({
2877
2879
  el,
@@ -2892,12 +2894,12 @@ function getContainerStyle({
2892
2894
  return {
2893
2895
  left: isFullscreenMedia ? 0 : el.x,
2894
2896
  top: isFullscreenMedia ? 0 : el.y,
2895
- width: isFullscreenMedia ? "100%" : Math.max(el.width, chunkZSZ2WR4A_js.MIN_ELEMENT_SIZE),
2896
- height: isFullscreenMedia ? "100%" : Math.max(el.height, chunkZSZ2WR4A_js.MIN_ELEMENT_SIZE),
2897
+ width: isFullscreenMedia ? "100%" : Math.max(el.width, chunk2GATFIDB_js.MIN_ELEMENT_SIZE),
2898
+ height: isFullscreenMedia ? "100%" : Math.max(el.height, chunk2GATFIDB_js.MIN_ELEMENT_SIZE),
2897
2899
  transform: isFullscreenMedia ? "none" : chunkDHNQHQ66_js.getElementTransform(el),
2898
2900
  transformOrigin: "center",
2899
2901
  overflow: overflowValue,
2900
- clipPath: isImg && !has3DExtrusion ? chunkZSZ2WR4A_js.getCropShapeClipPath(el) : void 0,
2902
+ clipPath: isImg && !has3DExtrusion ? chunk2GATFIDB_js.getCropShapeClipPath(el) : void 0,
2901
2903
  zIndex: isFullscreenMedia ? 20 : zIndex,
2902
2904
  opacity,
2903
2905
  visibility: animationState?.visible === false ? "hidden" : "visible",
@@ -2931,8 +2933,8 @@ function ActionIndicator({
2931
2933
  function shapeParams(element) {
2932
2934
  const style = chunkHUD73YBT_js.hasShapeProperties(element) ? element.shapeStyle : void 0;
2933
2935
  const strokeWidth = Math.max(0, style?.strokeWidth || 0);
2934
- const strokeColor = chunkDHNQHQ66_js.normalizeHexColor(style?.strokeColor, chunkZSZ2WR4A_js.DEFAULT_STROKE_COLOR);
2935
- const fillColor = chunkDHNQHQ66_js.normalizeHexColor(style?.fillColor, chunkZSZ2WR4A_js.DEFAULT_FILL_COLOR);
2936
+ const strokeColor = chunkDHNQHQ66_js.normalizeHexColor(style?.strokeColor, chunk2GATFIDB_js.DEFAULT_STROKE_COLOR);
2937
+ const fillColor = chunkDHNQHQ66_js.normalizeHexColor(style?.fillColor, chunk2GATFIDB_js.DEFAULT_FILL_COLOR);
2936
2938
  const hasFill = style?.fillColor !== void 0 && style.fillColor !== "transparent" || Boolean(chunkDHNQHQ66_js.buildCssGradientFromShapeStyle(style) || style?.fillGradient) || style?.fillMode === "pattern" && Boolean(style.fillPatternPreset);
2937
2939
  return { hf: hasFill, fc: fillColor, sw: strokeWidth, sc: strokeColor };
2938
2940
  }
@@ -3086,7 +3088,7 @@ var ElementRenderer = React18__default.default.memo(
3086
3088
  const elementLocks = el.locks;
3087
3089
  const isTxt = chunkDHNQHQ66_js.isEditableTextElement(el) && !elementLocks?.noTextEdit;
3088
3090
  const txtSE = chunkHUD73YBT_js.hasTextProperties(el) ? el.textStyle : void 0;
3089
- const ss = chunkZSZ2WR4A_js.getShapeVisualStyle(
3091
+ const ss = chunk2GATFIDB_js.getShapeVisualStyle(
3090
3092
  el,
3091
3093
  hf,
3092
3094
  fc,
@@ -3095,8 +3097,8 @@ var ElementRenderer = React18__default.default.memo(
3095
3097
  animationState?.animatesFill,
3096
3098
  animationState?.animatesStroke
3097
3099
  );
3098
- const ts = chunkZSZ2WR4A_js.getTextStyleForElement(el, chunkZSZ2WR4A_js.DEFAULT_TEXT_COLOR);
3099
- const vs = chunkZSZ2WR4A_js.renderVectorShape(
3100
+ const ts = chunk2GATFIDB_js.getTextStyleForElement(el, chunk2GATFIDB_js.DEFAULT_TEXT_COLOR);
3101
+ const vs = chunk2GATFIDB_js.renderVectorShape(
3100
3102
  el,
3101
3103
  hf,
3102
3104
  fc,
@@ -3107,10 +3109,10 @@ var ElementRenderer = React18__default.default.memo(
3107
3109
  );
3108
3110
  const isImg = el.type === "picture" || el.type === "image";
3109
3111
  const isModel3D = el.type === "model3d";
3110
- const isConn = chunkZSZ2WR4A_js.isConnectorOrLineElement(el);
3112
+ const isConn = chunk2GATFIDB_js.isConnectorOrLineElement(el);
3111
3113
  const shapeStyle3d = chunkHUD73YBT_js.hasShapeProperties(el) ? el.shapeStyle : void 0;
3112
3114
  const extrusionData = React18.useMemo(
3113
- () => chunkZSZ2WR4A_js.build3DExtrusionData(shapeStyle3d?.shape3d, shapeStyle3d?.scene3d, fc, el.width, el.height),
3115
+ () => chunk2GATFIDB_js.build3DExtrusionData(shapeStyle3d?.shape3d, shapeStyle3d?.scene3d, fc, el.width, el.height),
3114
3116
  [shapeStyle3d?.shape3d, shapeStyle3d?.scene3d, fc, el.width, el.height]
3115
3117
  );
3116
3118
  const [isMediaPlaying, setIsMediaPlaying] = React18.useState(false);
@@ -3174,7 +3176,7 @@ var ElementRenderer = React18__default.default.memo(
3174
3176
  "aria-roledescription": ariaRoleDescription,
3175
3177
  "aria-selected": isSelected ? true : void 0,
3176
3178
  tabIndex: isFocusable ? 0 : -1,
3177
- className: chunkZSZ2WR4A_js.cn(
3179
+ className: chunk2GATFIDB_js.cn(
3178
3180
  "absolute border",
3179
3181
  "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-500",
3180
3182
  cur,
@@ -3208,7 +3210,7 @@ var ElementRenderer = React18__default.default.memo(
3208
3210
  txtSE,
3209
3211
  txtS: ts,
3210
3212
  vecShape: vs,
3211
- imgStyle: chunkZSZ2WR4A_js.getImageRenderStyle(el),
3213
+ imgStyle: chunk2GATFIDB_js.getImageRenderStyle(el),
3212
3214
  imgFilter: chunkDHNQHQ66_js.getImageEffectsFilter(el),
3213
3215
  imgOpacity: chunkDHNQHQ66_js.getImageEffectsOpacity(el),
3214
3216
  imgAlt: imageAltText,
@@ -3353,7 +3355,7 @@ function renderInk(el, options) {
3353
3355
  function renderGroup(children, parentGroupFill) {
3354
3356
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative w-full h-full pointer-events-none", children: children.map((c, childIndex) => {
3355
3357
  const { hf, fc, sw, sc } = shapeParams(c);
3356
- const baseSs = chunkZSZ2WR4A_js.getShapeVisualStyle(c, hf, fc, sw, sc);
3358
+ const baseSs = chunk2GATFIDB_js.getShapeVisualStyle(c, hf, fc, sw, sc);
3357
3359
  const inheritedFill = chunkDHNQHQ66_js.resolveGroupChildFill(c, parentGroupFill);
3358
3360
  const ss = inheritedFill ? {
3359
3361
  ...baseSs,
@@ -3363,8 +3365,8 @@ function renderGroup(children, parentGroupFill) {
3363
3365
  backgroundSize: inheritedFill.backgroundSize,
3364
3366
  backgroundPosition: inheritedFill.backgroundPosition
3365
3367
  } : baseSs;
3366
- const vs = chunkZSZ2WR4A_js.renderVectorShape(c, hf, fc, sw, sc);
3367
- const ts = chunkZSZ2WR4A_js.getTextStyleForElement(c, chunkZSZ2WR4A_js.DEFAULT_TEXT_COLOR);
3368
+ const vs = chunk2GATFIDB_js.renderVectorShape(c, hf, fc, sw, sc);
3369
+ const ts = chunk2GATFIDB_js.getTextStyleForElement(c, chunk2GATFIDB_js.DEFAULT_TEXT_COLOR);
3368
3370
  const isTxt = chunkDHNQHQ66_js.isEditableTextElement(c);
3369
3371
  const isI = c.type === "picture" || c.type === "image";
3370
3372
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -3374,12 +3376,12 @@ function renderGroup(children, parentGroupFill) {
3374
3376
  style: {
3375
3377
  left: c.x,
3376
3378
  top: c.y,
3377
- width: Math.max(c.width, chunkZSZ2WR4A_js.MIN_ELEMENT_SIZE),
3378
- height: Math.max(c.height, chunkZSZ2WR4A_js.MIN_ELEMENT_SIZE),
3379
+ width: Math.max(c.width, chunk2GATFIDB_js.MIN_ELEMENT_SIZE),
3380
+ height: Math.max(c.height, chunk2GATFIDB_js.MIN_ELEMENT_SIZE),
3379
3381
  transform: chunkDHNQHQ66_js.getElementTransform(c),
3380
3382
  transformOrigin: "center",
3381
3383
  overflow: isI ? "hidden" : void 0,
3382
- clipPath: isI ? chunkZSZ2WR4A_js.getCropShapeClipPath(c) : void 0,
3384
+ clipPath: isI ? chunk2GATFIDB_js.getCropShapeClipPath(c) : void 0,
3383
3385
  ...ss,
3384
3386
  // Explicit z-index preserves document order stacking within the
3385
3387
  // group: later children in the array (= later in p:grpSp XML)
@@ -3389,11 +3391,11 @@ function renderGroup(children, parentGroupFill) {
3389
3391
  },
3390
3392
  children: [
3391
3393
  /* @__PURE__ */ jsxRuntime.jsx(ShapeEffectOverlay, { element: c }),
3392
- isI && ("svgData" in c && c.svgData || "imageData" in c && c.imageData) ? chunkZSZ2WR4A_js.isImageTiled(c) ? /* @__PURE__ */ jsxRuntime.jsx(
3394
+ isI && ("svgData" in c && c.svgData || "imageData" in c && c.imageData) ? chunk2GATFIDB_js.isImageTiled(c) ? /* @__PURE__ */ jsxRuntime.jsx(
3393
3395
  "div",
3394
3396
  {
3395
3397
  className: "pointer-events-none select-none w-full h-full",
3396
- style: chunkZSZ2WR4A_js.getImageTilingStyle(c)
3398
+ style: chunk2GATFIDB_js.getImageTilingStyle(c)
3397
3399
  }
3398
3400
  ) : /* @__PURE__ */ jsxRuntime.jsx(
3399
3401
  "img",
@@ -3401,7 +3403,7 @@ function renderGroup(children, parentGroupFill) {
3401
3403
  src: "svgData" in c && c.svgData ? c.svgData : c.imageData,
3402
3404
  alt: chunkCUUYYYC5_js.translationsEn["pptx.ink.groupChildAlt"],
3403
3405
  className: "pointer-events-none select-none",
3404
- style: chunkZSZ2WR4A_js.getImageRenderStyle(c),
3406
+ style: chunk2GATFIDB_js.getImageRenderStyle(c),
3405
3407
  draggable: false
3406
3408
  }
3407
3409
  ) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -3411,7 +3413,7 @@ function renderGroup(children, parentGroupFill) {
3411
3413
  {
3412
3414
  className: "relative z-10 w-full h-full pointer-events-none whitespace-pre-wrap break-words leading-[1.3]",
3413
3415
  style: ts,
3414
- children: chunkZSZ2WR4A_js.renderTextSegments(c, chunkZSZ2WR4A_js.DEFAULT_TEXT_COLOR)
3416
+ children: chunk2GATFIDB_js.renderTextSegments(c, chunk2GATFIDB_js.DEFAULT_TEXT_COLOR)
3415
3417
  }
3416
3418
  ) : null
3417
3419
  ] })
@@ -3761,7 +3763,7 @@ function InlineTextEditor({
3761
3763
  pending.endOffset
3762
3764
  );
3763
3765
  });
3764
- const warpStyle = chunkZSZ2WR4A_js.getTextWarpStyle(textStyleRaw);
3766
+ const warpStyle = chunk2GATFIDB_js.getTextWarpStyle(textStyleRaw);
3765
3767
  const compensationTransform = chunkDHNQHQ66_js.getTextCompensationTransform(element);
3766
3768
  const warpTransform = warpStyle?.transform;
3767
3769
  const mergedTransform = [compensationTransform, warpTransform].filter(Boolean).join(" ") || void 0;
@@ -3837,7 +3839,7 @@ function InlineTextEditor({
3837
3839
  const text = e.clipboardData.getData("text/plain");
3838
3840
  document.execCommand("insertText", false, text);
3839
3841
  },
3840
- children: seed.hasRichSegments ? chunkZSZ2WR4A_js.renderTextSegments(element, chunkZSZ2WR4A_js.DEFAULT_TEXT_COLOR) : seed.initialText
3842
+ children: seed.hasRichSegments ? chunk2GATFIDB_js.renderTextSegments(element, chunk2GATFIDB_js.DEFAULT_TEXT_COLOR) : seed.initialText
3841
3843
  }
3842
3844
  );
3843
3845
  }
@@ -4464,8 +4466,8 @@ function DrawingShapeRenderer({
4464
4466
  }
4465
4467
  const drawingW = maxX - minX || 1;
4466
4468
  const drawingH = maxY - minY || 1;
4467
- const shadow = chunkZSZ2WR4A_js.styleShadow(style);
4468
- const sw = chunkZSZ2WR4A_js.styleStroke(style);
4469
+ const shadow = chunk2GATFIDB_js.styleShadow(style);
4470
+ const sw = chunk2GATFIDB_js.styleStroke(style);
4469
4471
  return /* @__PURE__ */ jsxRuntime.jsx(
4470
4472
  "svg",
4471
4473
  {
@@ -4475,7 +4477,7 @@ function DrawingShapeRenderer({
4475
4477
  "data-testid": "smartart-drawing-shapes",
4476
4478
  children: shapes.map((shape, i) => {
4477
4479
  const gradient = drawingShapeGradientDef(`${elementId}-dspgrad-${shape.id}-${i}`, shape);
4478
- const fill = shape.fillNone ? "none" : gradient?.ref ?? shape.fillPatternForegroundColor ?? shape.fillColor ?? chunkZSZ2WR4A_js.colour(i, palette);
4480
+ const fill = shape.fillNone ? "none" : gradient?.ref ?? shape.fillPatternForegroundColor ?? shape.fillColor ?? chunk2GATFIDB_js.colour(i, palette);
4479
4481
  const relX = shape.x - minX;
4480
4482
  const relY = shape.y - minY;
4481
4483
  const rx = shape.shapeType === "roundRect" ? Math.min(shape.width, shape.height) * 0.1 : 0;
@@ -4494,11 +4496,11 @@ function DrawingShapeRenderer({
4494
4496
  const centerY = shape.y + shape.height / 2;
4495
4497
  return !candidate.fillNone && centerX >= candidate.x && centerX <= candidate.x + candidate.width && centerY >= candidate.y && centerY <= candidate.y + candidate.height;
4496
4498
  })?.fillColor : void 0;
4497
- const fontSize = shape.fontSize ?? chunkZSZ2WR4A_js.fitFontSize(shape.text ?? "", shape.width * 0.85, shape.height, 14);
4499
+ const fontSize = shape.fontSize ?? chunk2GATFIDB_js.fitFontSize(shape.text ?? "", shape.width * 0.85, shape.height, 14);
4498
4500
  const contrastFill = underlayFill ?? shape.fillColor ?? shape.fillPatternForegroundColor ?? shape.fillGradientStops?.[Math.floor(shape.fillGradientStops.length / 2)]?.color ?? fill;
4499
4501
  const nodeId = nodes ? chunkDHNQHQ66_js.resolveDrawingShapeNodeId(shape, i, shapes, nodes) : void 0;
4500
4502
  const nodeLabel = nodeId ? nodeLabels?.get(nodeId) : void 0;
4501
- const groupProps = nodeId ? chunkZSZ2WR4A_js.smartArtNodeGroupProps(nodeId, shadow, nodeLabel) : { style: { filter: shadow } };
4503
+ const groupProps = nodeId ? chunk2GATFIDB_js.smartArtNodeGroupProps(nodeId, shadow, nodeLabel) : { style: { filter: shadow } };
4502
4504
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { ...groupProps, children: [
4503
4505
  nodeLabel ? /* @__PURE__ */ jsxRuntime.jsx("title", { children: nodeLabel }) : null,
4504
4506
  gradient ? /* @__PURE__ */ jsxRuntime.jsx("defs", { children: gradient.def }) : null,
@@ -4534,7 +4536,7 @@ function DrawingShapeRenderer({
4534
4536
  shape.width,
4535
4537
  shape.height,
4536
4538
  calloutBannerRatio
4537
- ) : chunkZSZ2WR4A_js.chevronPoints(relX, relY, shape.width, shape.height),
4539
+ ) : chunk2GATFIDB_js.chevronPoints(relX, relY, shape.width, shape.height),
4538
4540
  fill,
4539
4541
  stroke: strokeCol,
4540
4542
  strokeWidth: strokeW,
@@ -4555,12 +4557,12 @@ function DrawingShapeRenderer({
4555
4557
  }
4556
4558
  ),
4557
4559
  shape.text ? /* @__PURE__ */ jsxRuntime.jsx(
4558
- chunkZSZ2WR4A_js.SmartArtNodeText,
4560
+ chunk2GATFIDB_js.SmartArtNodeText,
4559
4561
  {
4560
4562
  x: relX + shape.width / 2,
4561
4563
  y: isUpArrowCallout ? relY + shape.height * (calloutBannerRatio / 2) : relY + shape.height / 2,
4562
4564
  text: shape.text,
4563
- fill: shape.fontColor ?? chunkZSZ2WR4A_js.contrastingTextColor(contrastFill),
4565
+ fill: shape.fontColor ?? chunk2GATFIDB_js.contrastingTextColor(contrastFill),
4564
4566
  fontSize,
4565
4567
  maxWidth: shape.width * 0.82,
4566
4568
  className: "pointer-events-none"
@@ -4576,7 +4578,7 @@ function DrawingShapeRenderer({
4576
4578
  function resolveNodeStyle(node, index, palette) {
4577
4579
  const style = node.style;
4578
4580
  return {
4579
- fill: style?.fillColor ?? chunkZSZ2WR4A_js.colour(index, palette),
4581
+ fill: style?.fillColor ?? chunk2GATFIDB_js.colour(index, palette),
4580
4582
  fontColor: style?.fontColor ?? "white",
4581
4583
  fontWeight: style?.bold ? 700 : void 0,
4582
4584
  fontStyle: style?.italic ? "italic" : void 0,
@@ -4598,8 +4600,8 @@ function ListRenderer({
4598
4600
  const itemH = (usableH - gap * (nodes.length - 1)) / nodes.length;
4599
4601
  const itemW = w - pad * 2;
4600
4602
  const rx = Math.min(6, itemH * 0.15);
4601
- const shadow = chunkZSZ2WR4A_js.styleShadow(style);
4602
- const sw = chunkZSZ2WR4A_js.styleStroke(style);
4603
+ const shadow = chunk2GATFIDB_js.styleShadow(style);
4604
+ const sw = chunk2GATFIDB_js.styleStroke(style);
4603
4605
  return /* @__PURE__ */ jsxRuntime.jsx(
4604
4606
  "svg",
4605
4607
  {
@@ -4609,13 +4611,13 @@ function ListRenderer({
4609
4611
  "data-testid": "smartart-list",
4610
4612
  children: nodes.map((node, i) => {
4611
4613
  const y = pad + i * (itemH + gap);
4612
- const fontSize = chunkZSZ2WR4A_js.fitFontSize(node.text, itemW * 0.9, itemH, 12);
4614
+ const fontSize = chunk2GATFIDB_js.fitFontSize(node.text, itemW * 0.9, itemH, 12);
4613
4615
  const ns = resolveNodeStyle(node, i, palette);
4614
4616
  const label = nodeLabels?.get(node.id);
4615
4617
  return /* @__PURE__ */ jsxRuntime.jsxs(
4616
4618
  "g",
4617
4619
  {
4618
- ...chunkZSZ2WR4A_js.smartArtNodeGroupProps(node.id, shadow, label),
4620
+ ...chunk2GATFIDB_js.smartArtNodeGroupProps(node.id, shadow, label),
4619
4621
  children: [
4620
4622
  label ? /* @__PURE__ */ jsxRuntime.jsx("title", { children: label }) : null,
4621
4623
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -4627,17 +4629,17 @@ function ListRenderer({
4627
4629
  height: itemH,
4628
4630
  rx,
4629
4631
  fill: ns.fill,
4630
- opacity: chunkZSZ2WR4A_js.nodeOpacity(i, nodes.length, style),
4632
+ opacity: chunk2GATFIDB_js.nodeOpacity(i, nodes.length, style),
4631
4633
  stroke: ns.strokeColor ?? (sw > 0 ? "rgba(255,255,255,0.3)" : "none"),
4632
4634
  strokeWidth: sw
4633
4635
  }
4634
4636
  ),
4635
4637
  /* @__PURE__ */ jsxRuntime.jsx(
4636
- chunkZSZ2WR4A_js.SmartArtNodeText,
4638
+ chunk2GATFIDB_js.SmartArtNodeText,
4637
4639
  {
4638
4640
  x: pad + itemW / 2,
4639
4641
  y: y + itemH / 2,
4640
- text: chunkZSZ2WR4A_js.truncate(node.text, 40),
4642
+ text: chunk2GATFIDB_js.truncate(node.text, 40),
4641
4643
  fill: ns.fontColor,
4642
4644
  fontWeight: ns.fontWeight,
4643
4645
  fontStyle: ns.fontStyle,
@@ -4669,8 +4671,8 @@ function ProcessRenderer({
4669
4671
  const itemW = (usableW - gap * (nodes.length - 1)) / nodes.length;
4670
4672
  const itemH = Math.min(h - pad * 2, h * 0.6);
4671
4673
  const yMid = h / 2;
4672
- const shadow = chunkZSZ2WR4A_js.styleShadow(style);
4673
- const sw = chunkZSZ2WR4A_js.styleStroke(style);
4674
+ const shadow = chunk2GATFIDB_js.styleShadow(style);
4675
+ const sw = chunk2GATFIDB_js.styleStroke(style);
4674
4676
  return /* @__PURE__ */ jsxRuntime.jsx(
4675
4677
  "svg",
4676
4678
  {
@@ -4684,13 +4686,13 @@ function ProcessRenderer({
4684
4686
  const isFirst = i === 0;
4685
4687
  const isLast = i === nodes.length - 1;
4686
4688
  const points = isFirst ? `${x},${yMid - halfH} ${x + itemW - chevronDepth},${yMid - halfH} ${x + itemW},${yMid} ${x + itemW - chevronDepth},${yMid + halfH} ${x},${yMid + halfH}` : isLast ? `${x},${yMid - halfH} ${x + itemW},${yMid - halfH} ${x + itemW},${yMid + halfH} ${x},${yMid + halfH} ${x + chevronDepth},${yMid}` : `${x},${yMid - halfH} ${x + itemW - chevronDepth},${yMid - halfH} ${x + itemW},${yMid} ${x + itemW - chevronDepth},${yMid + halfH} ${x},${yMid + halfH} ${x + chevronDepth},${yMid}`;
4687
- const fontSize = chunkZSZ2WR4A_js.fitFontSize(node.text, itemW * 0.7, itemH, 12);
4689
+ const fontSize = chunk2GATFIDB_js.fitFontSize(node.text, itemW * 0.7, itemH, 12);
4688
4690
  const ns = resolveNodeStyle(node, i, palette);
4689
4691
  const label = nodeLabels?.get(node.id);
4690
4692
  return /* @__PURE__ */ jsxRuntime.jsxs(
4691
4693
  "g",
4692
4694
  {
4693
- ...chunkZSZ2WR4A_js.smartArtNodeGroupProps(node.id, shadow, label),
4695
+ ...chunk2GATFIDB_js.smartArtNodeGroupProps(node.id, shadow, label),
4694
4696
  children: [
4695
4697
  label ? /* @__PURE__ */ jsxRuntime.jsx("title", { children: label }) : null,
4696
4698
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -4698,17 +4700,17 @@ function ProcessRenderer({
4698
4700
  {
4699
4701
  points,
4700
4702
  fill: ns.fill,
4701
- opacity: chunkZSZ2WR4A_js.nodeOpacity(i, nodes.length, style),
4703
+ opacity: chunk2GATFIDB_js.nodeOpacity(i, nodes.length, style),
4702
4704
  stroke: ns.strokeColor ?? (sw > 0 ? "rgba(255,255,255,0.3)" : "none"),
4703
4705
  strokeWidth: sw
4704
4706
  }
4705
4707
  ),
4706
4708
  /* @__PURE__ */ jsxRuntime.jsx(
4707
- chunkZSZ2WR4A_js.SmartArtNodeText,
4709
+ chunk2GATFIDB_js.SmartArtNodeText,
4708
4710
  {
4709
4711
  x: x + itemW / 2,
4710
4712
  y: yMid,
4711
- text: chunkZSZ2WR4A_js.truncate(node.text, 25),
4713
+ text: chunk2GATFIDB_js.truncate(node.text, 25),
4712
4714
  fill: ns.fontColor,
4713
4715
  fontWeight: ns.fontWeight,
4714
4716
  fontStyle: ns.fontStyle,
@@ -4738,8 +4740,8 @@ function CycleRenderer({
4738
4740
  const cy = h / 2;
4739
4741
  const radius = size * 0.35;
4740
4742
  const nodeR = Math.max(size * 0.06, Math.min(size * 0.12, 200 / nodes.length));
4741
- const shadow = chunkZSZ2WR4A_js.styleShadow(style);
4742
- const sw = chunkZSZ2WR4A_js.styleStroke(style);
4743
+ const shadow = chunk2GATFIDB_js.styleShadow(style);
4744
+ const sw = chunk2GATFIDB_js.styleStroke(style);
4743
4745
  return /* @__PURE__ */ jsxRuntime.jsxs(
4744
4746
  "svg",
4745
4747
  {
@@ -4778,13 +4780,13 @@ function CycleRenderer({
4778
4780
  const angle = i / nodes.length * Math.PI * 2 - Math.PI / 2;
4779
4781
  const nx = cx + radius * Math.cos(angle);
4780
4782
  const ny = cy + radius * Math.sin(angle);
4781
- const fontSize = chunkZSZ2WR4A_js.fitFontSize(node.text, nodeR * 1.4, nodeR * 2, 11);
4783
+ const fontSize = chunk2GATFIDB_js.fitFontSize(node.text, nodeR * 1.4, nodeR * 2, 11);
4782
4784
  const ns = resolveNodeStyle(node, i, palette);
4783
4785
  const label = nodeLabels?.get(node.id);
4784
4786
  return /* @__PURE__ */ jsxRuntime.jsxs(
4785
4787
  "g",
4786
4788
  {
4787
- ...chunkZSZ2WR4A_js.smartArtNodeGroupProps(node.id, shadow, label),
4789
+ ...chunk2GATFIDB_js.smartArtNodeGroupProps(node.id, shadow, label),
4788
4790
  children: [
4789
4791
  label ? /* @__PURE__ */ jsxRuntime.jsx("title", { children: label }) : null,
4790
4792
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -4794,17 +4796,17 @@ function CycleRenderer({
4794
4796
  cy: ny,
4795
4797
  r: nodeR,
4796
4798
  fill: ns.fill,
4797
- opacity: chunkZSZ2WR4A_js.nodeOpacity(i, nodes.length, style),
4799
+ opacity: chunk2GATFIDB_js.nodeOpacity(i, nodes.length, style),
4798
4800
  stroke: ns.strokeColor ?? (sw > 0 ? "rgba(255,255,255,0.3)" : "none"),
4799
4801
  strokeWidth: sw
4800
4802
  }
4801
4803
  ),
4802
4804
  /* @__PURE__ */ jsxRuntime.jsx(
4803
- chunkZSZ2WR4A_js.SmartArtNodeText,
4805
+ chunk2GATFIDB_js.SmartArtNodeText,
4804
4806
  {
4805
4807
  x: nx,
4806
4808
  y: ny,
4807
- text: chunkZSZ2WR4A_js.truncate(node.text, 20),
4809
+ text: chunk2GATFIDB_js.truncate(node.text, 20),
4808
4810
  fill: ns.fontColor,
4809
4811
  fontWeight: ns.fontWeight,
4810
4812
  fontStyle: ns.fontStyle,
@@ -4839,8 +4841,8 @@ function MatrixRenderer({
4839
4841
  const cellW = (usableW - gap * (cols - 1)) / cols;
4840
4842
  const cellH = (usableH - gap * (rows - 1)) / rows;
4841
4843
  const rx = Math.min(6, Math.min(cellW, cellH) * 0.1);
4842
- const shadow = chunkZSZ2WR4A_js.styleShadow(style);
4843
- const sw = chunkZSZ2WR4A_js.styleStroke(style);
4844
+ const shadow = chunk2GATFIDB_js.styleShadow(style);
4845
+ const sw = chunk2GATFIDB_js.styleStroke(style);
4844
4846
  return /* @__PURE__ */ jsxRuntime.jsx(
4845
4847
  "svg",
4846
4848
  {
@@ -4853,13 +4855,13 @@ function MatrixRenderer({
4853
4855
  const row = Math.floor(i / cols);
4854
4856
  const x = pad + col * (cellW + gap);
4855
4857
  const y = pad + row * (cellH + gap);
4856
- const fontSize = chunkZSZ2WR4A_js.fitFontSize(node.text, cellW * 0.85, cellH, 12);
4858
+ const fontSize = chunk2GATFIDB_js.fitFontSize(node.text, cellW * 0.85, cellH, 12);
4857
4859
  const ns = resolveNodeStyle(node, i, palette);
4858
4860
  const label = nodeLabels?.get(node.id);
4859
4861
  return /* @__PURE__ */ jsxRuntime.jsxs(
4860
4862
  "g",
4861
4863
  {
4862
- ...chunkZSZ2WR4A_js.smartArtNodeGroupProps(node.id, shadow, label),
4864
+ ...chunk2GATFIDB_js.smartArtNodeGroupProps(node.id, shadow, label),
4863
4865
  children: [
4864
4866
  label ? /* @__PURE__ */ jsxRuntime.jsx("title", { children: label }) : null,
4865
4867
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -4871,17 +4873,17 @@ function MatrixRenderer({
4871
4873
  height: cellH,
4872
4874
  rx,
4873
4875
  fill: ns.fill,
4874
- opacity: chunkZSZ2WR4A_js.nodeOpacity(i, nodes.length, style),
4876
+ opacity: chunk2GATFIDB_js.nodeOpacity(i, nodes.length, style),
4875
4877
  stroke: ns.strokeColor ?? (sw > 0 ? "rgba(255,255,255,0.3)" : "none"),
4876
4878
  strokeWidth: sw
4877
4879
  }
4878
4880
  ),
4879
4881
  /* @__PURE__ */ jsxRuntime.jsx(
4880
- chunkZSZ2WR4A_js.SmartArtNodeText,
4882
+ chunk2GATFIDB_js.SmartArtNodeText,
4881
4883
  {
4882
4884
  x: x + cellW / 2,
4883
4885
  y: y + cellH / 2,
4884
- text: chunkZSZ2WR4A_js.truncate(node.text, 30),
4886
+ text: chunk2GATFIDB_js.truncate(node.text, 30),
4885
4887
  fill: ns.fontColor,
4886
4888
  fontWeight: ns.fontWeight ?? 500,
4887
4889
  fontStyle: ns.fontStyle,
@@ -4910,8 +4912,8 @@ function PyramidRenderer({
4910
4912
  const usableH = h - pad * 2;
4911
4913
  const bandH = (usableH - gap * (nodes.length - 1)) / nodes.length;
4912
4914
  const maxW = w - pad * 2;
4913
- const shadow = chunkZSZ2WR4A_js.styleShadow(style);
4914
- const sw = chunkZSZ2WR4A_js.styleStroke(style);
4915
+ const shadow = chunk2GATFIDB_js.styleShadow(style);
4916
+ const sw = chunk2GATFIDB_js.styleStroke(style);
4915
4917
  return /* @__PURE__ */ jsxRuntime.jsx(
4916
4918
  "svg",
4917
4919
  {
@@ -4935,28 +4937,28 @@ function PyramidRenderer({
4935
4937
  `${bottomRight},${y + bandH}`,
4936
4938
  `${bottomLeft},${y + bandH}`
4937
4939
  ].join(" ");
4938
- const fontSize = chunkZSZ2WR4A_js.fitFontSize(node.text, topW * 0.85, bandH, 12);
4940
+ const fontSize = chunk2GATFIDB_js.fitFontSize(node.text, topW * 0.85, bandH, 12);
4939
4941
  return /* @__PURE__ */ jsxRuntime.jsxs(
4940
4942
  "g",
4941
4943
  {
4942
- ...chunkZSZ2WR4A_js.smartArtNodeGroupProps(node.id, shadow),
4944
+ ...chunk2GATFIDB_js.smartArtNodeGroupProps(node.id, shadow),
4943
4945
  children: [
4944
4946
  /* @__PURE__ */ jsxRuntime.jsx(
4945
4947
  "polygon",
4946
4948
  {
4947
4949
  points,
4948
- fill: chunkZSZ2WR4A_js.colour(i, palette),
4949
- opacity: chunkZSZ2WR4A_js.nodeOpacity(i, nodes.length, style),
4950
+ fill: chunk2GATFIDB_js.colour(i, palette),
4951
+ opacity: chunk2GATFIDB_js.nodeOpacity(i, nodes.length, style),
4950
4952
  stroke: sw > 0 ? "rgba(255,255,255,0.3)" : "none",
4951
4953
  strokeWidth: sw
4952
4954
  }
4953
4955
  ),
4954
4956
  /* @__PURE__ */ jsxRuntime.jsx(
4955
- chunkZSZ2WR4A_js.SmartArtNodeText,
4957
+ chunk2GATFIDB_js.SmartArtNodeText,
4956
4958
  {
4957
4959
  x: w / 2,
4958
4960
  y: y + bandH / 2,
4959
- text: chunkZSZ2WR4A_js.truncate(node.text, 30),
4961
+ text: chunk2GATFIDB_js.truncate(node.text, 30),
4960
4962
  fill: "white",
4961
4963
  fontSize,
4962
4964
  className: "pointer-events-none"
@@ -4978,7 +4980,7 @@ function VennRenderer({
4978
4980
  }) {
4979
4981
  const w = element.width;
4980
4982
  const h = element.height;
4981
- const shadow = chunkZSZ2WR4A_js.styleShadow(style);
4983
+ const shadow = chunk2GATFIDB_js.styleShadow(style);
4982
4984
  if (nodes.length <= 4) {
4983
4985
  const cx = w / 2;
4984
4986
  const cy2 = h / 2;
@@ -4995,19 +4997,19 @@ function VennRenderer({
4995
4997
  const angle = i / nodes.length * Math.PI * 2 - Math.PI / 2;
4996
4998
  const nx = cx + spread * Math.cos(angle);
4997
4999
  const ny = cy2 + spread * Math.sin(angle);
4998
- const fontSize = chunkZSZ2WR4A_js.fitFontSize(node.text, r2 * 1.2, r2 * 2, 11);
5000
+ const fontSize = chunk2GATFIDB_js.fitFontSize(node.text, r2 * 1.2, r2 * 2, 11);
4999
5001
  return /* @__PURE__ */ jsxRuntime.jsxs(
5000
5002
  "g",
5001
5003
  {
5002
- ...chunkZSZ2WR4A_js.smartArtNodeGroupProps(node.id, shadow),
5004
+ ...chunk2GATFIDB_js.smartArtNodeGroupProps(node.id, shadow),
5003
5005
  children: [
5004
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: nx, cy: ny, r: r2, fill: chunkZSZ2WR4A_js.colour(i, palette), opacity: 0.35 }),
5006
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: nx, cy: ny, r: r2, fill: chunk2GATFIDB_js.colour(i, palette), opacity: 0.35 }),
5005
5007
  /* @__PURE__ */ jsxRuntime.jsx(
5006
- chunkZSZ2WR4A_js.SmartArtNodeText,
5008
+ chunk2GATFIDB_js.SmartArtNodeText,
5007
5009
  {
5008
5010
  x: nx,
5009
5011
  y: ny,
5010
- text: chunkZSZ2WR4A_js.truncate(node.text, 20),
5012
+ text: chunk2GATFIDB_js.truncate(node.text, 20),
5011
5013
  fill: "white",
5012
5014
  fontSize,
5013
5015
  fontWeight: "bold",
@@ -5036,19 +5038,19 @@ function VennRenderer({
5036
5038
  "data-testid": "smartart-venn",
5037
5039
  children: nodes.map((node, i) => {
5038
5040
  const nx = offsetX + i * (r * 2 - overlap);
5039
- const fontSize = chunkZSZ2WR4A_js.fitFontSize(node.text, r * 1.2, r * 2, 10);
5041
+ const fontSize = chunk2GATFIDB_js.fitFontSize(node.text, r * 1.2, r * 2, 10);
5040
5042
  return /* @__PURE__ */ jsxRuntime.jsxs(
5041
5043
  "g",
5042
5044
  {
5043
- ...chunkZSZ2WR4A_js.smartArtNodeGroupProps(node.id, shadow),
5045
+ ...chunk2GATFIDB_js.smartArtNodeGroupProps(node.id, shadow),
5044
5046
  children: [
5045
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: nx, cy, r, fill: chunkZSZ2WR4A_js.colour(i, palette), opacity: 0.35 }),
5047
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: nx, cy, r, fill: chunk2GATFIDB_js.colour(i, palette), opacity: 0.35 }),
5046
5048
  /* @__PURE__ */ jsxRuntime.jsx(
5047
- chunkZSZ2WR4A_js.SmartArtNodeText,
5049
+ chunk2GATFIDB_js.SmartArtNodeText,
5048
5050
  {
5049
5051
  x: nx,
5050
5052
  y: cy,
5051
- text: chunkZSZ2WR4A_js.truncate(node.text, 20),
5053
+ text: chunk2GATFIDB_js.truncate(node.text, 20),
5052
5054
  fill: "white",
5053
5055
  fontSize,
5054
5056
  fontWeight: "bold",
@@ -5074,7 +5076,7 @@ function FunnelRenderer({
5074
5076
  const pad = 8;
5075
5077
  const usableW = w - pad * 2;
5076
5078
  const stageH = (h - pad * 2) / nodes.length;
5077
- const shadow = chunkZSZ2WR4A_js.styleShadow(style);
5079
+ const shadow = chunk2GATFIDB_js.styleShadow(style);
5078
5080
  return /* @__PURE__ */ jsxRuntime.jsx(
5079
5081
  "svg",
5080
5082
  {
@@ -5096,26 +5098,26 @@ function FunnelRenderer({
5096
5098
  `${bottomRight},${y + stageH}`,
5097
5099
  `${bottomLeft},${y + stageH}`
5098
5100
  ].join(" ");
5099
- const fontSize = chunkZSZ2WR4A_js.fitFontSize(node.text, topWidth * 0.85, stageH, 11);
5101
+ const fontSize = chunk2GATFIDB_js.fitFontSize(node.text, topWidth * 0.85, stageH, 11);
5100
5102
  return /* @__PURE__ */ jsxRuntime.jsxs(
5101
5103
  "g",
5102
5104
  {
5103
- ...chunkZSZ2WR4A_js.smartArtNodeGroupProps(node.id, shadow),
5105
+ ...chunk2GATFIDB_js.smartArtNodeGroupProps(node.id, shadow),
5104
5106
  children: [
5105
5107
  /* @__PURE__ */ jsxRuntime.jsx(
5106
5108
  "polygon",
5107
5109
  {
5108
5110
  points,
5109
- fill: chunkZSZ2WR4A_js.colour(i, palette),
5110
- opacity: chunkZSZ2WR4A_js.nodeOpacity(i, nodes.length, style)
5111
+ fill: chunk2GATFIDB_js.colour(i, palette),
5112
+ opacity: chunk2GATFIDB_js.nodeOpacity(i, nodes.length, style)
5111
5113
  }
5112
5114
  ),
5113
5115
  /* @__PURE__ */ jsxRuntime.jsx(
5114
- chunkZSZ2WR4A_js.SmartArtNodeText,
5116
+ chunk2GATFIDB_js.SmartArtNodeText,
5115
5117
  {
5116
5118
  x: w / 2,
5117
5119
  y: y + stageH / 2,
5118
- text: chunkZSZ2WR4A_js.truncate(node.text, 30),
5120
+ text: chunk2GATFIDB_js.truncate(node.text, 30),
5119
5121
  fill: "white",
5120
5122
  fontSize,
5121
5123
  className: "pointer-events-none"
@@ -5142,7 +5144,7 @@ function TargetRenderer({
5142
5144
  const maxR = Math.min(cx - 8, cy - 8);
5143
5145
  const fontSize = Math.max(7, Math.min(10, maxR / (nodes.length + 1)));
5144
5146
  const labelX = cx + maxR + 8;
5145
- const shadow = chunkZSZ2WR4A_js.styleShadow(style);
5147
+ const shadow = chunk2GATFIDB_js.styleShadow(style);
5146
5148
  return /* @__PURE__ */ jsxRuntime.jsx(
5147
5149
  "svg",
5148
5150
  {
@@ -5155,7 +5157,7 @@ function TargetRenderer({
5155
5157
  return /* @__PURE__ */ jsxRuntime.jsxs(
5156
5158
  "g",
5157
5159
  {
5158
- ...chunkZSZ2WR4A_js.smartArtNodeGroupProps(node.id, shadow),
5160
+ ...chunk2GATFIDB_js.smartArtNodeGroupProps(node.id, shadow),
5159
5161
  children: [
5160
5162
  /* @__PURE__ */ jsxRuntime.jsx(
5161
5163
  "circle",
@@ -5163,8 +5165,8 @@ function TargetRenderer({
5163
5165
  cx,
5164
5166
  cy,
5165
5167
  r: Math.max(r, 4),
5166
- fill: chunkZSZ2WR4A_js.colour(i, palette),
5167
- opacity: chunkZSZ2WR4A_js.nodeOpacity(i, nodes.length, style)
5168
+ fill: chunk2GATFIDB_js.colour(i, palette),
5169
+ opacity: chunk2GATFIDB_js.nodeOpacity(i, nodes.length, style)
5168
5170
  }
5169
5171
  ),
5170
5172
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -5174,7 +5176,7 @@ function TargetRenderer({
5174
5176
  y1: cy,
5175
5177
  x2: labelX - 2,
5176
5178
  y2: 8 + i * (fontSize + 6),
5177
- stroke: chunkZSZ2WR4A_js.colour(i, palette),
5179
+ stroke: chunk2GATFIDB_js.colour(i, palette),
5178
5180
  strokeWidth: 1,
5179
5181
  opacity: 0.6
5180
5182
  }
@@ -5186,10 +5188,10 @@ function TargetRenderer({
5186
5188
  y: 8 + i * (fontSize + 6) + fontSize / 2,
5187
5189
  textAnchor: "start",
5188
5190
  dominantBaseline: "central",
5189
- fill: chunkZSZ2WR4A_js.colour(i, palette),
5191
+ fill: chunk2GATFIDB_js.colour(i, palette),
5190
5192
  fontSize,
5191
5193
  className: "pointer-events-none",
5192
- children: chunkZSZ2WR4A_js.truncate(node.text, 30)
5194
+ children: chunk2GATFIDB_js.truncate(node.text, 30)
5193
5195
  }
5194
5196
  )
5195
5197
  ]
@@ -5206,12 +5208,12 @@ function HierarchyRenderer({
5206
5208
  palette,
5207
5209
  style
5208
5210
  }) {
5209
- const roots = chunkZSZ2WR4A_js.buildTree(nodes);
5211
+ const roots = chunk2GATFIDB_js.buildTree(nodes);
5210
5212
  if (roots.length === 0) {
5211
5213
  return /* @__PURE__ */ jsxRuntime.jsx(ListRenderer, { element, nodes, palette, style });
5212
5214
  }
5213
- const totalLeaves = roots.reduce((s, r) => s + chunkZSZ2WR4A_js.treeWidth(r), 0);
5214
- const depth = Math.max(...roots.map(chunkZSZ2WR4A_js.treeDepth));
5215
+ const totalLeaves = roots.reduce((s, r) => s + chunk2GATFIDB_js.treeWidth(r), 0);
5216
+ const depth = Math.max(...roots.map(chunk2GATFIDB_js.treeDepth));
5215
5217
  const svgW = element.width;
5216
5218
  const svgH = element.height;
5217
5219
  const cellW = svgW / totalLeaves;
@@ -5219,24 +5221,24 @@ function HierarchyRenderer({
5219
5221
  const boxW = Math.min(cellW * 0.8, 140);
5220
5222
  const boxH = Math.min(cellH * 0.4, 36);
5221
5223
  const rx = Math.min(6, boxH * 0.15);
5222
- const shadow = chunkZSZ2WR4A_js.styleShadow(style);
5223
- const sw = chunkZSZ2WR4A_js.styleStroke(style);
5224
+ const shadow = chunk2GATFIDB_js.styleShadow(style);
5225
+ const sw = chunk2GATFIDB_js.styleStroke(style);
5224
5226
  const elements = [];
5225
5227
  let colourIdx = 0;
5226
5228
  function renderTreeNode(t, xOffset, level) {
5227
- const w = chunkZSZ2WR4A_js.treeWidth(t);
5229
+ const w = chunk2GATFIDB_js.treeWidth(t);
5228
5230
  const nodeCx = (xOffset + w / 2) * cellW;
5229
5231
  const nodeCy = level * cellH + cellH / 2;
5230
5232
  const ci = colourIdx++;
5231
- const fontSize = chunkZSZ2WR4A_js.fitFontSize(t.node.text, boxW * 0.9, boxH, 11);
5233
+ const fontSize = chunk2GATFIDB_js.fitFontSize(t.node.text, boxW * 0.9, boxH, 11);
5232
5234
  for (const child of t.children) {
5233
- const childW = chunkZSZ2WR4A_js.treeWidth(child);
5235
+ const childW = chunk2GATFIDB_js.treeWidth(child);
5234
5236
  let childOffset2 = xOffset;
5235
5237
  for (const c of t.children) {
5236
5238
  if (c === child) {
5237
5239
  break;
5238
5240
  }
5239
- childOffset2 += chunkZSZ2WR4A_js.treeWidth(c);
5241
+ childOffset2 += chunk2GATFIDB_js.treeWidth(c);
5240
5242
  }
5241
5243
  const childCx = (childOffset2 + childW / 2) * cellW;
5242
5244
  const childCy = (level + 1) * cellH + cellH / 2;
@@ -5259,7 +5261,7 @@ function HierarchyRenderer({
5259
5261
  /* @__PURE__ */ jsxRuntime.jsxs(
5260
5262
  "g",
5261
5263
  {
5262
- ...chunkZSZ2WR4A_js.smartArtNodeGroupProps(t.node.id, shadow),
5264
+ ...chunk2GATFIDB_js.smartArtNodeGroupProps(t.node.id, shadow),
5263
5265
  children: [
5264
5266
  /* @__PURE__ */ jsxRuntime.jsx(
5265
5267
  "rect",
@@ -5269,18 +5271,18 @@ function HierarchyRenderer({
5269
5271
  width: boxW,
5270
5272
  height: boxH,
5271
5273
  rx,
5272
- fill: chunkZSZ2WR4A_js.colour(ci, palette),
5273
- opacity: chunkZSZ2WR4A_js.nodeOpacity(ci, nodes.length, style),
5274
+ fill: chunk2GATFIDB_js.colour(ci, palette),
5275
+ opacity: chunk2GATFIDB_js.nodeOpacity(ci, nodes.length, style),
5274
5276
  stroke: sw > 0 ? "rgba(255,255,255,0.3)" : "none",
5275
5277
  strokeWidth: sw
5276
5278
  }
5277
5279
  ),
5278
5280
  /* @__PURE__ */ jsxRuntime.jsx(
5279
- chunkZSZ2WR4A_js.SmartArtNodeText,
5281
+ chunk2GATFIDB_js.SmartArtNodeText,
5280
5282
  {
5281
5283
  x: nodeCx,
5282
5284
  y: nodeCy,
5283
- text: chunkZSZ2WR4A_js.truncate(t.node.text, 40),
5285
+ text: chunk2GATFIDB_js.truncate(t.node.text, 40),
5284
5286
  fill: "white",
5285
5287
  fontSize,
5286
5288
  className: "pointer-events-none"
@@ -5294,7 +5296,7 @@ function HierarchyRenderer({
5294
5296
  let childOffset = xOffset;
5295
5297
  for (const child of t.children) {
5296
5298
  renderTreeNode(child, childOffset, level + 1);
5297
- childOffset += chunkZSZ2WR4A_js.treeWidth(child);
5299
+ childOffset += chunk2GATFIDB_js.treeWidth(child);
5298
5300
  }
5299
5301
  return w;
5300
5302
  }
@@ -5329,7 +5331,7 @@ function GearRenderer({
5329
5331
  const gearR = Math.min(spacing * 0.4, h * 0.35);
5330
5332
  const innerR = gearR * 0.7;
5331
5333
  const teethCount = 8;
5332
- const shadow = chunkZSZ2WR4A_js.styleShadow(style);
5334
+ const shadow = chunk2GATFIDB_js.styleShadow(style);
5333
5335
  return /* @__PURE__ */ jsxRuntime.jsxs(
5334
5336
  "svg",
5335
5337
  {
@@ -5341,27 +5343,27 @@ function GearRenderer({
5341
5343
  gearNodes.map((node, i) => {
5342
5344
  const gx = spacing * (i + 1);
5343
5345
  const gy = h / 2 + (i % 2 === 0 ? 0 : gearR * 0.35);
5344
- const fontSize = chunkZSZ2WR4A_js.fitFontSize(node.text, innerR * 1.2, innerR * 2, 11);
5346
+ const fontSize = chunk2GATFIDB_js.fitFontSize(node.text, innerR * 1.2, innerR * 2, 11);
5345
5347
  return /* @__PURE__ */ jsxRuntime.jsxs(
5346
5348
  "g",
5347
5349
  {
5348
- ...chunkZSZ2WR4A_js.smartArtNodeGroupProps(node.id, shadow),
5350
+ ...chunk2GATFIDB_js.smartArtNodeGroupProps(node.id, shadow),
5349
5351
  children: [
5350
5352
  /* @__PURE__ */ jsxRuntime.jsx(
5351
5353
  "path",
5352
5354
  {
5353
- d: chunkZSZ2WR4A_js.gearPath(gx, gy, gearR, innerR, teethCount),
5354
- fill: chunkZSZ2WR4A_js.colour(i, palette),
5355
- opacity: chunkZSZ2WR4A_js.nodeOpacity(i, nodes.length, style)
5355
+ d: chunk2GATFIDB_js.gearPath(gx, gy, gearR, innerR, teethCount),
5356
+ fill: chunk2GATFIDB_js.colour(i, palette),
5357
+ opacity: chunk2GATFIDB_js.nodeOpacity(i, nodes.length, style)
5356
5358
  }
5357
5359
  ),
5358
5360
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: gx, cy: gy, r: innerR * 0.5, fill: "white", opacity: 0.25 }),
5359
5361
  /* @__PURE__ */ jsxRuntime.jsx(
5360
- chunkZSZ2WR4A_js.SmartArtNodeText,
5362
+ chunk2GATFIDB_js.SmartArtNodeText,
5361
5363
  {
5362
5364
  x: gx,
5363
5365
  y: gy,
5364
- text: chunkZSZ2WR4A_js.truncate(node.text, 20),
5366
+ text: chunk2GATFIDB_js.truncate(node.text, 20),
5365
5367
  fill: "white",
5366
5368
  fontSize,
5367
5369
  fontWeight: "bold",
@@ -5383,8 +5385,8 @@ function GearRenderer({
5383
5385
  cx: lx,
5384
5386
  cy: ly,
5385
5387
  r: 3,
5386
- fill: chunkZSZ2WR4A_js.colour(gearCount + i, palette),
5387
- opacity: chunkZSZ2WR4A_js.nodeOpacity(gearCount + i, nodes.length, style)
5388
+ fill: chunk2GATFIDB_js.colour(gearCount + i, palette),
5389
+ opacity: chunk2GATFIDB_js.nodeOpacity(gearCount + i, nodes.length, style)
5388
5390
  }
5389
5391
  ),
5390
5392
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -5394,10 +5396,10 @@ function GearRenderer({
5394
5396
  y: ly,
5395
5397
  textAnchor: "start",
5396
5398
  dominantBaseline: "central",
5397
- fill: chunkZSZ2WR4A_js.colour(gearCount + i, palette),
5399
+ fill: chunk2GATFIDB_js.colour(gearCount + i, palette),
5398
5400
  fontSize: 10,
5399
5401
  className: "pointer-events-none",
5400
- children: chunkZSZ2WR4A_js.truncate(node.text, 30)
5402
+ children: chunk2GATFIDB_js.truncate(node.text, 30)
5401
5403
  }
5402
5404
  )
5403
5405
  ] }, `${element.id}-gear-extra-${node.id}-${i}`);
@@ -5421,7 +5423,7 @@ function TimelineRenderer({
5421
5423
  const lineLen = lineEndX - lineStartX;
5422
5424
  const dotR = Math.max(4, Math.min(8, lineLen / (nodes.length * 4)));
5423
5425
  const labelOffset = Math.min(h * 0.28, 40);
5424
- const shadow = chunkZSZ2WR4A_js.styleShadow(style);
5426
+ const shadow = chunk2GATFIDB_js.styleShadow(style);
5425
5427
  return /* @__PURE__ */ jsxRuntime.jsxs(
5426
5428
  "svg",
5427
5429
  {
@@ -5443,11 +5445,11 @@ function TimelineRenderer({
5443
5445
  const above = i % 2 === 0;
5444
5446
  const textY = above ? lineY - labelOffset : lineY + labelOffset;
5445
5447
  const stemEndY = above ? lineY - dotR - 2 : lineY + dotR + 2;
5446
- const fontSize = chunkZSZ2WR4A_js.fitFontSize(node.text, lineLen / nodes.length * 0.9, labelOffset, 10);
5448
+ const fontSize = chunk2GATFIDB_js.fitFontSize(node.text, lineLen / nodes.length * 0.9, labelOffset, 10);
5447
5449
  return /* @__PURE__ */ jsxRuntime.jsxs(
5448
5450
  "g",
5449
5451
  {
5450
- ...chunkZSZ2WR4A_js.smartArtNodeGroupProps(node.id, shadow),
5452
+ ...chunk2GATFIDB_js.smartArtNodeGroupProps(node.id, shadow),
5451
5453
  children: [
5452
5454
  /* @__PURE__ */ jsxRuntime.jsx(
5453
5455
  "line",
@@ -5456,7 +5458,7 @@ function TimelineRenderer({
5456
5458
  y1: stemEndY,
5457
5459
  x2: x,
5458
5460
  y2: textY + (above ? fontSize : -fontSize),
5459
- stroke: chunkZSZ2WR4A_js.colour(i, palette),
5461
+ stroke: chunk2GATFIDB_js.colour(i, palette),
5460
5462
  strokeWidth: 1,
5461
5463
  opacity: 0.5
5462
5464
  }
@@ -5467,17 +5469,17 @@ function TimelineRenderer({
5467
5469
  cx: x,
5468
5470
  cy: lineY,
5469
5471
  r: dotR,
5470
- fill: chunkZSZ2WR4A_js.colour(i, palette),
5471
- opacity: chunkZSZ2WR4A_js.nodeOpacity(i, nodes.length, style)
5472
+ fill: chunk2GATFIDB_js.colour(i, palette),
5473
+ opacity: chunk2GATFIDB_js.nodeOpacity(i, nodes.length, style)
5472
5474
  }
5473
5475
  ),
5474
5476
  /* @__PURE__ */ jsxRuntime.jsx(
5475
- chunkZSZ2WR4A_js.SmartArtNodeText,
5477
+ chunk2GATFIDB_js.SmartArtNodeText,
5476
5478
  {
5477
- text: chunkZSZ2WR4A_js.truncate(node.text, 20) ?? "",
5479
+ text: chunk2GATFIDB_js.truncate(node.text, 20) ?? "",
5478
5480
  x,
5479
5481
  y: textY,
5480
- fill: chunkZSZ2WR4A_js.colour(i, palette),
5482
+ fill: chunk2GATFIDB_js.colour(i, palette),
5481
5483
  fontSize,
5482
5484
  anchor: above ? "bottom" : "top",
5483
5485
  className: "pointer-events-none"
@@ -5510,8 +5512,8 @@ function BendingProcessRenderer({
5510
5512
  const boxH = Math.min(cellH * 0.6, 32);
5511
5513
  const rx = Math.min(5, boxH * 0.15);
5512
5514
  const arrowSize = 6;
5513
- const shadow = chunkZSZ2WR4A_js.styleShadow(style);
5514
- const sw = chunkZSZ2WR4A_js.styleStroke(style);
5515
+ const shadow = chunk2GATFIDB_js.styleShadow(style);
5516
+ const sw = chunk2GATFIDB_js.styleStroke(style);
5515
5517
  return /* @__PURE__ */ jsxRuntime.jsx(
5516
5518
  "svg",
5517
5519
  {
@@ -5525,7 +5527,7 @@ function BendingProcessRenderer({
5525
5527
  const col = row % 2 === 0 ? colInRow : COLS - 1 - colInRow;
5526
5528
  const nodeCx = padX + col * cellW + cellW / 2;
5527
5529
  const nodeCy = padY + row * cellH + cellH / 2;
5528
- const fontSize = chunkZSZ2WR4A_js.fitFontSize(node.text, boxW * 0.85, boxH, 10);
5530
+ const fontSize = chunk2GATFIDB_js.fitFontSize(node.text, boxW * 0.85, boxH, 10);
5529
5531
  let arrow = null;
5530
5532
  if (i < nodes.length - 1) {
5531
5533
  const nextRow = Math.floor((i + 1) / COLS);
@@ -5585,7 +5587,7 @@ function BendingProcessRenderer({
5585
5587
  return /* @__PURE__ */ jsxRuntime.jsxs(
5586
5588
  "g",
5587
5589
  {
5588
- ...chunkZSZ2WR4A_js.smartArtNodeGroupProps(node.id, shadow),
5590
+ ...chunk2GATFIDB_js.smartArtNodeGroupProps(node.id, shadow),
5589
5591
  children: [
5590
5592
  arrow,
5591
5593
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -5596,18 +5598,18 @@ function BendingProcessRenderer({
5596
5598
  width: boxW,
5597
5599
  height: boxH,
5598
5600
  rx,
5599
- fill: chunkZSZ2WR4A_js.colour(i, palette),
5600
- opacity: chunkZSZ2WR4A_js.nodeOpacity(i, nodes.length, style),
5601
+ fill: chunk2GATFIDB_js.colour(i, palette),
5602
+ opacity: chunk2GATFIDB_js.nodeOpacity(i, nodes.length, style),
5601
5603
  stroke: sw > 0 ? "rgba(255,255,255,0.3)" : "none",
5602
5604
  strokeWidth: sw
5603
5605
  }
5604
5606
  ),
5605
5607
  /* @__PURE__ */ jsxRuntime.jsx(
5606
- chunkZSZ2WR4A_js.SmartArtNodeText,
5608
+ chunk2GATFIDB_js.SmartArtNodeText,
5607
5609
  {
5608
5610
  x: nodeCx,
5609
5611
  y: nodeCy,
5610
- text: chunkZSZ2WR4A_js.truncate(node.text, 20),
5612
+ text: chunk2GATFIDB_js.truncate(node.text, 20),
5611
5613
  fill: "white",
5612
5614
  fontSize,
5613
5615
  className: "pointer-events-none"
@@ -5657,8 +5659,8 @@ function SmartArtRendererImpl({
5657
5659
  }
5658
5660
  );
5659
5661
  }
5660
- const palette = chunkZSZ2WR4A_js.resolvePalette(element);
5661
- const style = chunkZSZ2WR4A_js.resolveStyle(element);
5662
+ const palette = chunk2GATFIDB_js.resolvePalette(element);
5663
+ const style = chunk2GATFIDB_js.resolveStyle(element);
5662
5664
  const a11y = chunkDHNQHQ66_js.buildSmartArtA11y(smartArtData);
5663
5665
  const nodeLabels = new Map(a11y.nodes.map((n) => [n.id, n.label]));
5664
5666
  const editable = canEdit && Boolean(onUpdateElement);
@@ -5671,7 +5673,7 @@ function SmartArtRendererImpl({
5671
5673
  const reflowed = chunkDHNQHQ66_js.rebuildDrawingShapesIfCleared(
5672
5674
  updated,
5673
5675
  smartArtData.layout,
5674
- chunkZSZ2WR4A_js.resolveSmartArtDataPalette(updated),
5676
+ chunk2GATFIDB_js.resolveSmartArtDataPalette(updated),
5675
5677
  style,
5676
5678
  element.id,
5677
5679
  box
@@ -5688,7 +5690,7 @@ function SmartArtRendererImpl({
5688
5690
  const reflowed = chunkDHNQHQ66_js.rebuildDrawingShapesIfCleared(
5689
5691
  next,
5690
5692
  smartArtData.layout,
5691
- chunkZSZ2WR4A_js.resolveSmartArtDataPalette(next),
5693
+ chunk2GATFIDB_js.resolveSmartArtDataPalette(next),
5692
5694
  style,
5693
5695
  element.id,
5694
5696
  box
@@ -5711,7 +5713,7 @@ function SmartArtRendererImpl({
5711
5713
  );
5712
5714
  } else {
5713
5715
  const namedLayout = smartArtData.layout;
5714
- const layoutType = namedLayout ? chunkZSZ2WR4A_js.layoutToCategory(namedLayout) : (smartArtData.resolvedLayoutType ?? smartArtData.layoutType ?? "list").toLowerCase();
5716
+ const layoutType = namedLayout ? chunk2GATFIDB_js.layoutToCategory(namedLayout) : (smartArtData.resolvedLayoutType ?? smartArtData.layoutType ?? "list").toLowerCase();
5715
5717
  content = renderLayout(layoutType, element, revealedNodes, palette, style, nodeLabels);
5716
5718
  }
5717
5719
  const body = editable ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -5725,7 +5727,7 @@ function SmartArtRendererImpl({
5725
5727
  children: content
5726
5728
  }
5727
5729
  ) : content;
5728
- return chunkZSZ2WR4A_js.wrapChrome(chrome, body, className, { role: a11y.role, label: a11y.label });
5730
+ return chunk2GATFIDB_js.wrapChrome(chrome, body, className, { role: a11y.role, label: a11y.label });
5729
5731
  }
5730
5732
  function renderLayout(layoutType, element, nodes, palette, style, nodeLabels) {
5731
5733
  if (layoutType.includes("hierarchy") || layoutType.includes("org")) {
@@ -5789,34 +5791,34 @@ function renderLayout(layoutType, element, nodes, palette, style, nodeLabels) {
5789
5791
  return /* @__PURE__ */ jsxRuntime.jsx(BendingProcessRenderer, { element, nodes, palette, style });
5790
5792
  }
5791
5793
  if (layoutType.includes("stepdown")) {
5792
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkZSZ2WR4A_js.renderStepDownProcess(element, nodes, palette, style) });
5794
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk2GATFIDB_js.renderStepDownProcess(element, nodes, palette, style) });
5793
5795
  }
5794
5796
  if (layoutType.includes("alternatingflow") || layoutType.includes("alternating")) {
5795
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkZSZ2WR4A_js.renderAlternatingFlow(element, nodes, palette, style) });
5797
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk2GATFIDB_js.renderAlternatingFlow(element, nodes, palette, style) });
5796
5798
  }
5797
5799
  if (layoutType.includes("descending")) {
5798
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkZSZ2WR4A_js.renderDescendingProcess(element, nodes, palette, style) });
5800
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk2GATFIDB_js.renderDescendingProcess(element, nodes, palette, style) });
5799
5801
  }
5800
5802
  if (layoutType.includes("pictureaccent")) {
5801
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkZSZ2WR4A_js.renderPictureAccentList(element, nodes, palette, style) });
5803
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk2GATFIDB_js.renderPictureAccentList(element, nodes, palette, style) });
5802
5804
  }
5803
5805
  if (layoutType.includes("verticalblock")) {
5804
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkZSZ2WR4A_js.renderVerticalBlockList(element, nodes, palette, style) });
5806
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk2GATFIDB_js.renderVerticalBlockList(element, nodes, palette, style) });
5805
5807
  }
5806
5808
  if (layoutType.includes("grouped")) {
5807
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkZSZ2WR4A_js.renderGroupedList(element, nodes, palette, style) });
5809
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk2GATFIDB_js.renderGroupedList(element, nodes, palette, style) });
5808
5810
  }
5809
5811
  if (layoutType.includes("pyramidlist")) {
5810
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkZSZ2WR4A_js.renderPyramidList(element, nodes, palette, style) });
5812
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk2GATFIDB_js.renderPyramidList(element, nodes, palette, style) });
5811
5813
  }
5812
5814
  if (layoutType.includes("horizontalpicture")) {
5813
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkZSZ2WR4A_js.renderHorizontalPictureList(element, nodes, palette, style) });
5815
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk2GATFIDB_js.renderHorizontalPictureList(element, nodes, palette, style) });
5814
5816
  }
5815
5817
  if (layoutType.includes("accentprocess")) {
5816
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkZSZ2WR4A_js.renderAccentProcess(element, nodes, palette, style) });
5818
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk2GATFIDB_js.renderAccentProcess(element, nodes, palette, style) });
5817
5819
  }
5818
5820
  if (layoutType.includes("verticalchevron")) {
5819
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunkZSZ2WR4A_js.renderVerticalChevronList(element, nodes, palette, style) });
5821
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: chunk2GATFIDB_js.renderVerticalChevronList(element, nodes, palette, style) });
5820
5822
  }
5821
5823
  return /* @__PURE__ */ jsxRuntime.jsx(
5822
5824
  ListRenderer,
@@ -5920,8 +5922,8 @@ function SmartArt3DRenderer({
5920
5922
  if (nodes.length === 0) {
5921
5923
  return null;
5922
5924
  }
5923
- const palette = chunkZSZ2WR4A_js.resolvePalette(element);
5924
- const style = chunkZSZ2WR4A_js.resolveStyle(element);
5925
+ const palette = chunk2GATFIDB_js.resolvePalette(element);
5926
+ const style = chunk2GATFIDB_js.resolveStyle(element);
5925
5927
  const layoutResult = chunkDHNQHQ66_js.computeSmartArtLayout(
5926
5928
  nodes,
5927
5929
  { width: element.width, height: element.height },
@@ -6043,13 +6045,13 @@ function getSegmentTspanProps(segment, element, fallbackColor) {
6043
6045
  if (s.strikethrough) {
6044
6046
  decos.push("line-through");
6045
6047
  }
6046
- const fill = s.hyperlink ? chunkDHNQHQ66_js.normalizeHexColor(s.color || element.textStyle?.color, chunkZSZ2WR4A_js.HYPERLINK_COLOR) : chunkDHNQHQ66_js.normalizeHexColor(s.color || element.textStyle?.color, fallbackColor);
6048
+ const fill = s.hyperlink ? chunkDHNQHQ66_js.normalizeHexColor(s.color || element.textStyle?.color, chunk2GATFIDB_js.HYPERLINK_COLOR) : chunkDHNQHQ66_js.normalizeHexColor(s.color || element.textStyle?.color, fallbackColor);
6047
6049
  return {
6048
6050
  fill,
6049
- fontSize: s.fontSize ?? element.textStyle?.fontSize ?? chunkZSZ2WR4A_js.DEFAULT_TEXT_FONT_SIZE,
6051
+ fontSize: s.fontSize ?? element.textStyle?.fontSize ?? chunk2GATFIDB_js.DEFAULT_TEXT_FONT_SIZE,
6050
6052
  fontWeight: s.bold ? 700 : 400,
6051
6053
  fontStyle: s.italic ? "italic" : void 0,
6052
- fontFamily: s.fontFamily || element.textStyle?.fontFamily ? chunkHUD73YBT_js.getSubstituteFontFamily(s.fontFamily || element.textStyle?.fontFamily || "") : chunkZSZ2WR4A_js.DEFAULT_FONT_FAMILY,
6054
+ fontFamily: s.fontFamily || element.textStyle?.fontFamily ? chunkHUD73YBT_js.getSubstituteFontFamily(s.fontFamily || element.textStyle?.fontFamily || "") : chunk2GATFIDB_js.DEFAULT_FONT_FAMILY,
6053
6055
  textDecoration: decos.length > 0 ? decos.join(" ") : void 0
6054
6056
  };
6055
6057
  }
@@ -6078,8 +6080,8 @@ function WarpedText({
6078
6080
  const warpAdj2 = textEl.textStyle?.textWarpAdj2;
6079
6081
  const align = textEl.textStyle?.align ?? "center";
6080
6082
  const { startOffset, textAnchor } = getAlignmentProps(align);
6081
- const baseFontSize = textEl.textStyle?.fontSize ?? chunkZSZ2WR4A_js.DEFAULT_TEXT_FONT_SIZE;
6082
- const baseFontFamily = textEl.textStyle?.fontFamily ? chunkHUD73YBT_js.getSubstituteFontFamily(textEl.textStyle.fontFamily) : chunkZSZ2WR4A_js.DEFAULT_FONT_FAMILY;
6083
+ const baseFontSize = textEl.textStyle?.fontSize ?? chunk2GATFIDB_js.DEFAULT_TEXT_FONT_SIZE;
6084
+ const baseFontFamily = textEl.textStyle?.fontFamily ? chunkHUD73YBT_js.getSubstituteFontFamily(textEl.textStyle.fontFamily) : chunk2GATFIDB_js.DEFAULT_FONT_FAMILY;
6083
6085
  const baseFill = chunkDHNQHQ66_js.normalizeHexColor(textEl.textStyle?.color, fallbackColor);
6084
6086
  return /* @__PURE__ */ jsxRuntime.jsxs(
6085
6087
  "svg",
@@ -6208,7 +6210,7 @@ function renderTextElementBody(options) {
6208
6210
  const useSvgWarp = chunkDHNQHQ66_js.shouldUseSvgWarp(
6209
6211
  chunkHUD73YBT_js.hasTextProperties(el) ? el.textStyle?.textWarpPreset : void 0
6210
6212
  );
6211
- const scene3dStyle = chunkHUD73YBT_js.hasTextProperties(el) ? chunkZSZ2WR4A_js.buildTextBody3DSceneStyle(el.textStyle) : void 0;
6213
+ const scene3dStyle = chunkHUD73YBT_js.hasTextProperties(el) ? chunk2GATFIDB_js.buildTextBody3DSceneStyle(el.textStyle) : void 0;
6212
6214
  const bodyRotation = chunkHUD73YBT_js.hasTextProperties(el) ? el.textStyle?.textBodyRotation : void 0;
6213
6215
  const rotationTransform = typeof bodyRotation === "number" && Number.isFinite(bodyRotation) && bodyRotation !== 0 ? `rotate(${bodyRotation}deg)` : void 0;
6214
6216
  const composedTransform = [rotationTransform, chunkDHNQHQ66_js.getTextCompensationTransform(el), scene3dStyle?.transform].filter(Boolean).join(" ") || void 0;
@@ -6227,18 +6229,18 @@ function renderTextElementBody(options) {
6227
6229
  shouldRenderText && (useSvgWarp ? /* @__PURE__ */ jsxRuntime.jsx(
6228
6230
  "div",
6229
6231
  {
6230
- className: chunkZSZ2WR4A_js.cn(
6232
+ className: chunk2GATFIDB_js.cn(
6231
6233
  "relative z-10 w-full h-full",
6232
6234
  onHyperlinkClick ? "" : "pointer-events-none"
6233
6235
  ),
6234
- style: { ...chunkZSZ2WR4A_js.getTextLayoutStyle(el), ...transformStyle },
6236
+ style: { ...chunk2GATFIDB_js.getTextLayoutStyle(el), ...transformStyle },
6235
6237
  children: /* @__PURE__ */ jsxRuntime.jsx(
6236
6238
  WarpedText,
6237
6239
  {
6238
6240
  element: el,
6239
6241
  width: el.width,
6240
6242
  height: el.height,
6241
- fallbackColor: chunkZSZ2WR4A_js.DEFAULT_TEXT_COLOR,
6243
+ fallbackColor: chunk2GATFIDB_js.DEFAULT_TEXT_COLOR,
6242
6244
  findHighlights: findHl,
6243
6245
  fieldContext
6244
6246
  }
@@ -6247,19 +6249,19 @@ function renderTextElementBody(options) {
6247
6249
  ) : /* @__PURE__ */ jsxRuntime.jsx(
6248
6250
  "div",
6249
6251
  {
6250
- className: chunkZSZ2WR4A_js.cn(
6252
+ className: chunk2GATFIDB_js.cn(
6251
6253
  "relative z-10 w-full h-full whitespace-pre-wrap break-words leading-[1.3]",
6252
6254
  onHyperlinkClick ? "" : "pointer-events-none"
6253
6255
  ),
6254
6256
  style: {
6255
- ...chunkZSZ2WR4A_js.getTextLayoutStyle(el),
6257
+ ...chunk2GATFIDB_js.getTextLayoutStyle(el),
6256
6258
  ...txtS,
6257
- ...chunkZSZ2WR4A_js.getTextWarpStyle(txtSE),
6259
+ ...chunk2GATFIDB_js.getTextWarpStyle(txtSE),
6258
6260
  ...transformStyle
6259
6261
  },
6260
- children: chunkZSZ2WR4A_js.renderTextSegments(
6262
+ children: chunk2GATFIDB_js.renderTextSegments(
6261
6263
  el,
6262
- chunkZSZ2WR4A_js.DEFAULT_TEXT_COLOR,
6264
+ chunk2GATFIDB_js.DEFAULT_TEXT_COLOR,
6263
6265
  void 0,
6264
6266
  findHl,
6265
6267
  onHyperlinkClick,
@@ -6561,7 +6563,7 @@ function renderBody(options) {
6561
6563
  textDirection: txtSE?.textDirection,
6562
6564
  textStyle: txtS,
6563
6565
  textStyleRaw: txtSE,
6564
- layoutStyle: chunkZSZ2WR4A_js.getTextLayoutStyle(el),
6566
+ layoutStyle: chunk2GATFIDB_js.getTextLayoutStyle(el),
6565
6567
  element: el,
6566
6568
  onCommit,
6567
6569
  onCancel,
@@ -6572,7 +6574,7 @@ function renderBody(options) {
6572
6574
  ] });
6573
6575
  }
6574
6576
  if (el.type === "table") {
6575
- return chunkZSZ2WR4A_js.renderTableElement(el, txtS, {
6577
+ return chunk2GATFIDB_js.renderTableElement(el, txtS, {
6576
6578
  editable: isSel,
6577
6579
  selectedCell: isSel ? tableSt : null,
6578
6580
  onSelectCell: onCellSel,
@@ -6605,7 +6607,7 @@ function renderBody(options) {
6605
6607
  );
6606
6608
  }
6607
6609
  if (el.type === "media") {
6608
- return chunkZSZ2WR4A_js.renderMediaElement(el, media, {
6610
+ return chunk2GATFIDB_js.renderMediaElement(el, media, {
6609
6611
  autoPlay: isPresentationPassive,
6610
6612
  fullScreen: isPresentationPassive && Boolean(el.fullScreen),
6611
6613
  isPresentationMode: isPresentationPassive,
@@ -6630,7 +6632,7 @@ function renderBody(options) {
6630
6632
  }
6631
6633
  return renderGroup(el.children, el.groupFill);
6632
6634
  }
6633
- if (chunkZSZ2WR4A_js.shouldRenderFallbackLabel(el, isTxtEl)) {
6635
+ if (chunk2GATFIDB_js.shouldRenderFallbackLabel(el, isTxtEl)) {
6634
6636
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[11px] text-white/80 pointer-events-none", children: chunkDHNQHQ66_js.getElementLabel(el) });
6635
6637
  }
6636
6638
  return renderTextElementBody(options);
@@ -6652,10 +6654,10 @@ function StaticElementRendererImpl({
6652
6654
  }) {
6653
6655
  const style = chunkHUD73YBT_js.hasShapeProperties(element) ? element.shapeStyle : void 0;
6654
6656
  const hasFill = style?.fillColor !== void 0 && style.fillColor !== "transparent" || Boolean(chunkDHNQHQ66_js.buildCssGradientFromShapeStyle(style) || style?.fillGradient) || style?.fillMode === "pattern" && Boolean(style.fillPatternPreset);
6655
- const fill = chunkDHNQHQ66_js.normalizeHexColor(style?.fillColor, chunkZSZ2WR4A_js.DEFAULT_FILL_COLOR);
6657
+ const fill = chunkDHNQHQ66_js.normalizeHexColor(style?.fillColor, chunk2GATFIDB_js.DEFAULT_FILL_COLOR);
6656
6658
  const strokeWidth = Math.max(0, style?.strokeWidth || 0);
6657
- const stroke = chunkDHNQHQ66_js.normalizeHexColor(style?.strokeColor, chunkZSZ2WR4A_js.DEFAULT_STROKE_COLOR);
6658
- const baseVisualStyle = chunkZSZ2WR4A_js.getShapeVisualStyle(element, hasFill, fill, strokeWidth, stroke);
6659
+ const stroke = chunkDHNQHQ66_js.normalizeHexColor(style?.strokeColor, chunk2GATFIDB_js.DEFAULT_STROKE_COLOR);
6660
+ const baseVisualStyle = chunk2GATFIDB_js.getShapeVisualStyle(element, hasFill, fill, strokeWidth, stroke);
6659
6661
  const inheritedFill = chunkDHNQHQ66_js.resolveGroupChildFill(element, parentGroupFill);
6660
6662
  const visualStyle = inheritedFill ? {
6661
6663
  ...baseVisualStyle,
@@ -6665,9 +6667,9 @@ function StaticElementRendererImpl({
6665
6667
  backgroundSize: inheritedFill.backgroundSize,
6666
6668
  backgroundPosition: inheritedFill.backgroundPosition
6667
6669
  } : baseVisualStyle;
6668
- const textStyle = chunkZSZ2WR4A_js.getTextStyleForElement(
6670
+ const textStyle = chunk2GATFIDB_js.getTextStyleForElement(
6669
6671
  element,
6670
- element.type === "shape" && hasFill ? "#ffffff" : chunkZSZ2WR4A_js.DEFAULT_TEXT_COLOR
6672
+ element.type === "shape" && hasFill ? "#ffffff" : chunk2GATFIDB_js.DEFAULT_TEXT_COLOR
6671
6673
  );
6672
6674
  const isImage = element.type === "picture" || element.type === "image";
6673
6675
  const allowsTextOverflow = chunkHUD73YBT_js.hasTextProperties(element) && element.textStyle?.vertOverflow !== "clip";
@@ -6710,8 +6712,8 @@ function StaticElementRendererImpl({
6710
6712
  spellCheck: false,
6711
6713
  txtSE: chunkHUD73YBT_js.hasTextProperties(element) ? element.textStyle : void 0,
6712
6714
  txtS: textStyle,
6713
- vecShape: chunkZSZ2WR4A_js.renderVectorShape(element, hasFill, fill, strokeWidth, stroke),
6714
- imgStyle: chunkZSZ2WR4A_js.getImageRenderStyle(element),
6715
+ vecShape: chunk2GATFIDB_js.renderVectorShape(element, hasFill, fill, strokeWidth, stroke),
6716
+ imgStyle: chunk2GATFIDB_js.getImageRenderStyle(element),
6715
6717
  imgFilter: chunkDHNQHQ66_js.getImageEffectsFilter(element),
6716
6718
  imgOpacity: chunkDHNQHQ66_js.getImageEffectsOpacity(element),
6717
6719
  imgAlt: "",
@@ -6851,7 +6853,7 @@ function SlidesGroup(p) {
6851
6853
  type: "button",
6852
6854
  onClick: handleNewSlide,
6853
6855
  disabled: !p.canEdit || p.layoutOptions.length === 0,
6854
- className: chunkZSZ2WR4A_js.cn(
6856
+ className: chunk2GATFIDB_js.cn(
6855
6857
  pill,
6856
6858
  "whitespace-nowrap",
6857
6859
  p.layoutOptions.length > 0 ? "rounded-r-none" : ""
@@ -6913,7 +6915,7 @@ function SlidesGroup(p) {
6913
6915
  {
6914
6916
  type: "button",
6915
6917
  "aria-current": isActive ? "true" : void 0,
6916
- className: chunkZSZ2WR4A_js.cn(
6918
+ className: chunk2GATFIDB_js.cn(
6917
6919
  "relative flex min-w-0 flex-col items-center gap-1 rounded border-[3px] p-1 text-xs text-foreground transition-colors hover:bg-muted",
6918
6920
  isActive ? "border-blue-600 bg-blue-50 shadow-[0_0_0_2px_rgba(37,99,235,0.25)] dark:bg-blue-950/40" : "border-transparent"
6919
6921
  ),
@@ -7035,6 +7037,13 @@ var COMMON_FONTS = [
7035
7037
  "Verdana"
7036
7038
  ];
7037
7039
  var COMMON_SIZES = [8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40, 44, 48, 54, 60, 72, 96];
7040
+ var CUSTOM_FONT_FILE_EXTENSION = /\.(?:ttf|otf|woff2?)$/iu;
7041
+ var getZipEntryBaseName = (path) => path.replace(/\\/gu, "/").split("/").filter(Boolean).pop() ?? path;
7042
+ var isUsableZipFontEntry = (path) => {
7043
+ const normalized = path.replace(/\\/gu, "/").toLowerCase();
7044
+ if (normalized.includes("__macosx/") || normalized.endsWith("/.ds_store")) return false;
7045
+ return CUSTOM_FONT_FILE_EXTENSION.test(normalized);
7046
+ };
7038
7047
  function HomeSection(p) {
7039
7048
  const { t } = reactI18next.useTranslation();
7040
7049
  const [fontMenuOpen, setFontMenuOpen] = React18.useState(false);
@@ -7067,33 +7076,89 @@ function HomeSection(p) {
7067
7076
  p.onUpdateTextStyle?.({ fontFamily: family });
7068
7077
  setFontMenuOpen(false);
7069
7078
  };
7070
- const registerLocalFont = async (file) => {
7071
- const stem = file.name.replace(/\.(?:ttf|otf|woff2?)$/iu, "");
7079
+ const fontSourceFromFile = async (file) => {
7080
+ const baseName = getZipEntryBaseName(file.name);
7081
+ const stem = baseName.replace(CUSTOM_FONT_FILE_EXTENSION, "");
7072
7082
  const bold = /(?:^|[-_\s])(?:bold|semibold|demibold|black)(?:$|[-_\s])/iu.test(stem);
7073
7083
  const italic = /(?:^|[-_\s])(?:italic|oblique)(?:$|[-_\s])/iu.test(stem);
7074
7084
  const family = stem.replace(/(?:[-_\s])(?:regular|normal|book|medium|bold|semibold|demibold|black|italic|oblique)+$/iu, "").replace(/[-_]+/gu, " ").trim();
7075
- if (!family || typeof FontFace === "undefined") {
7076
- return;
7085
+ if (!family) return null;
7086
+ const normalizedName = baseName.toLowerCase();
7087
+ const format = normalizedName.endsWith(".woff2") ? "woff2" : normalizedName.endsWith(".woff") ? "woff" : normalizedName.endsWith(".otf") ? "opentype" : "truetype";
7088
+ return {
7089
+ family,
7090
+ src: URL.createObjectURL(file),
7091
+ format,
7092
+ weight: bold ? 700 : 400,
7093
+ style: italic ? "italic" : "normal",
7094
+ data: await file.arrayBuffer()
7095
+ };
7096
+ };
7097
+ const registerFontSources = async (sources) => {
7098
+ if (typeof FontFace === "undefined") return;
7099
+ const loadedSources = [];
7100
+ for (const source of sources) {
7101
+ try {
7102
+ const face = new FontFace(source.family, source.data, {
7103
+ weight: String(source.weight ?? 400),
7104
+ style: source.style ?? "normal"
7105
+ });
7106
+ await face.load();
7107
+ document.fonts.add(face);
7108
+ loadedSources.push(source);
7109
+ } catch (error) {
7110
+ console.warn(`[PowerPointViewer] Could not load custom font ${source.family}.`, error);
7111
+ }
7077
7112
  }
7078
- const face = new FontFace(family, await file.arrayBuffer(), {
7079
- weight: bold ? "700" : "400",
7080
- style: italic ? "italic" : "normal"
7081
- });
7082
- await face.load();
7083
- document.fonts.add(face);
7084
- const next = Array.from(/* @__PURE__ */ new Set([...customFontFamilies, family]));
7113
+ if (loadedSources.length === 0) {
7114
+ throw new Error("None of the selected font files could be loaded by this browser.");
7115
+ }
7116
+ const next = Array.from(/* @__PURE__ */ new Set([...customFontFamilies, ...loadedSources.map((source) => source.family)]));
7085
7117
  setCustomFontFamilies(next);
7086
7118
  const fontWindow = window;
7087
7119
  fontWindow.__AIXA_PPTX_CUSTOM_FONT_FAMILIES__ = next;
7088
7120
  window.dispatchEvent(new CustomEvent("aixa:pptx-custom-fonts", { detail: next }));
7089
- applyFont(family);
7121
+ if (loadedSources[0]) applyFont(loadedSources[0].family);
7122
+ };
7123
+ const registerLocalFontPackage = async (file) => {
7124
+ let sources = [];
7125
+ if (/\.zip$/iu.test(file.name)) {
7126
+ const zip = await JSZip__default.default.loadAsync(file);
7127
+ const entries = Object.values(zip.files).filter(
7128
+ (entry) => !entry.dir && isUsableZipFontEntry(entry.name)
7129
+ );
7130
+ sources = (await Promise.all(entries.map(async (entry) => {
7131
+ const blob = await entry.async("blob");
7132
+ return fontSourceFromFile(
7133
+ new File([blob], getZipEntryBaseName(entry.name), { type: blob.type })
7134
+ );
7135
+ }))).filter((source) => Boolean(source));
7136
+ } else {
7137
+ const source = await fontSourceFromFile(file);
7138
+ if (source) sources = [source];
7139
+ }
7140
+ if (sources.length === 0) throw new Error("No browser-compatible font files were found.");
7141
+ await p.onUploadCustomFontPackage?.(
7142
+ file,
7143
+ sources.map(({ data: _data, ...source }) => source)
7144
+ );
7145
+ await registerFontSources(sources);
7146
+ p.onEmbedCustomFonts?.(
7147
+ sources.map((source) => ({
7148
+ name: source.family,
7149
+ dataUrl: "",
7150
+ bold: Number(source.weight ?? 400) >= 600,
7151
+ italic: source.style === "italic" || source.style === "oblique",
7152
+ format: source.format,
7153
+ rawFontData: new Uint8Array(source.data.slice(0))
7154
+ }))
7155
+ );
7090
7156
  };
7091
7157
  React18.useEffect(() => {
7092
7158
  const handleCustomFonts = (event) => {
7093
7159
  const families = event.detail;
7094
- setCustomFontFamilies(
7095
- Array.isArray(families) ? families.filter((family) => typeof family === "string" && family.trim().length > 0) : []
7096
- );
7160
+ const incoming = Array.isArray(families) ? families.filter((family) => typeof family === "string" && family.trim().length > 0) : [];
7161
+ setCustomFontFamilies((current) => Array.from(/* @__PURE__ */ new Set([...current, ...incoming])));
7097
7162
  };
7098
7163
  window.addEventListener("aixa:pptx-custom-fonts", handleCustomFonts);
7099
7164
  return () => window.removeEventListener("aixa:pptx-custom-fonts", handleCustomFonts);
@@ -7146,7 +7211,7 @@ function HomeSection(p) {
7146
7211
  setTimeout(() => setCutFeedback(false), 600);
7147
7212
  },
7148
7213
  disabled: !p.canEdit,
7149
- className: chunkZSZ2WR4A_js.cn(gB, cutFeedback && "bg-green-600/20 text-green-400"),
7214
+ className: chunk2GATFIDB_js.cn(gB, cutFeedback && "bg-green-600/20 text-green-400"),
7150
7215
  title: t("pptx.arrange.cut"),
7151
7216
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuScissors, { className: ic })
7152
7217
  }
@@ -7160,7 +7225,7 @@ function HomeSection(p) {
7160
7225
  setCopiedFeedback(true);
7161
7226
  setTimeout(() => setCopiedFeedback(false), 600);
7162
7227
  },
7163
- className: chunkZSZ2WR4A_js.cn(gB, copiedFeedback && "bg-green-600/20 text-green-400"),
7228
+ className: chunk2GATFIDB_js.cn(gB, copiedFeedback && "bg-green-600/20 text-green-400"),
7164
7229
  title: t("pptx.arrange.copy"),
7165
7230
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuCopy, { className: ic })
7166
7231
  }
@@ -7173,7 +7238,7 @@ function HomeSection(p) {
7173
7238
  disabled: !p.canEdit || p.canActivateFormatPainter === false && !p.formatPainterActive,
7174
7239
  "data-testid": "format-painter-toggle",
7175
7240
  "data-active": p.formatPainterActive ? "true" : "false",
7176
- className: chunkZSZ2WR4A_js.cn(
7241
+ className: chunk2GATFIDB_js.cn(
7177
7242
  gL,
7178
7243
  p.formatPainterActive ? "bg-amber-600 hover:bg-amber-500 text-amber-50" : ""
7179
7244
  ),
@@ -7284,7 +7349,7 @@ function HomeSection(p) {
7284
7349
  onClick: () => fontFileInputRef.current?.click(),
7285
7350
  children: [
7286
7351
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuUpload, { className: "h-4 w-4" }),
7287
- "Add custom font file"
7352
+ "Add custom font package"
7288
7353
  ]
7289
7354
  }
7290
7355
  ),
@@ -7293,11 +7358,11 @@ function HomeSection(p) {
7293
7358
  {
7294
7359
  ref: fontFileInputRef,
7295
7360
  type: "file",
7296
- accept: ".ttf,.otf,.woff,.woff2,font/ttf,font/otf,font/woff,font/woff2",
7361
+ accept: ".zip,.ttf,.otf,.woff,.woff2,application/zip,font/ttf,font/otf,font/woff,font/woff2",
7297
7362
  className: "hidden",
7298
7363
  onChange: (event) => {
7299
7364
  const file = event.currentTarget.files?.[0];
7300
- if (file) void registerLocalFont(file);
7365
+ if (file) void registerLocalFontPackage(file);
7301
7366
  event.currentTarget.value = "";
7302
7367
  }
7303
7368
  }
@@ -7428,7 +7493,7 @@ function InsertSection(p) {
7428
7493
  onChange: (e) => p.onSetNewShapeType(e.target.value),
7429
7494
  className: "bg-transparent py-1.5 pl-2 pr-1 outline-none text-xs",
7430
7495
  title: t("pptx.insert.shapeType"),
7431
- children: chunkZSZ2WR4A_js.SHAPE_PRESETS.map((sp) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: sp.type, className: "bg-background", children: t(sp.i18nKey) }, sp.type))
7496
+ children: chunk2GATFIDB_js.SHAPE_PRESETS.map((sp) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: sp.type, className: "bg-background", children: t(sp.i18nKey) }, sp.type))
7432
7497
  }
7433
7498
  ),
7434
7499
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -7439,7 +7504,7 @@ function InsertSection(p) {
7439
7504
  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",
7440
7505
  title: t("pptx.insert.addShape"),
7441
7506
  children: [
7442
- chunkZSZ2WR4A_js.SHAPE_PRESETS.find((sp) => sp.type === p.newShapeType)?.icon || /* @__PURE__ */ jsxRuntime.jsx(lu.LuSquare, { className: ic }),
7507
+ chunk2GATFIDB_js.SHAPE_PRESETS.find((sp) => sp.type === p.newShapeType)?.icon || /* @__PURE__ */ jsxRuntime.jsx(lu.LuSquare, { className: ic }),
7443
7508
  t("pptx.insert.shape")
7444
7509
  ]
7445
7510
  }
@@ -7713,7 +7778,7 @@ function InsertSection(p) {
7713
7778
  {
7714
7779
  type: "button",
7715
7780
  disabled: !canEdit,
7716
- className: chunkZSZ2WR4A_js.cn(pill, "whitespace-nowrap"),
7781
+ className: chunk2GATFIDB_js.cn(pill, "whitespace-nowrap"),
7717
7782
  onClick: p.onOpenHeaderFooter,
7718
7783
  children: t("pptx.headerFooter.title")
7719
7784
  }
@@ -7945,7 +8010,7 @@ function ReviewSection(p) {
7945
8010
  }
7946
8011
  function SlideShowSection(p) {
7947
8012
  const { t } = reactI18next.useTranslation();
7948
- const { isHidden } = chunkZSZ2WR4A_js.useToolbarVisibility(p.hiddenActions);
8013
+ const { isHidden } = chunk2GATFIDB_js.useToolbarVisibility(p.hiddenActions);
7949
8014
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7950
8015
  /* @__PURE__ */ jsxRuntime.jsxs(RibbonGroup, { label: t("pptx.slideShow.start", { defaultValue: "Start Slide Show" }), children: [
7951
8016
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -9063,7 +9128,7 @@ function MobileSheet({
9063
9128
  headerRight
9064
9129
  }) {
9065
9130
  const sheetRef = React18.useRef(null);
9066
- const { dragY, dragging, handlers } = chunkZSZ2WR4A_js.useSheetDismissDrag(onClose);
9131
+ const { dragY, dragging, handlers } = chunk2GATFIDB_js.useSheetDismissDrag(onClose);
9067
9132
  useModalFocus(open, sheetRef, onClose);
9068
9133
  if (!open) {
9069
9134
  return null;
@@ -9087,7 +9152,7 @@ function MobileSheet({
9087
9152
  "aria-modal": "true",
9088
9153
  "aria-label": typeof title === "string" ? title : "Mobile panel",
9089
9154
  tabIndex: -1,
9090
- className: chunkZSZ2WR4A_js.cn(
9155
+ className: chunk2GATFIDB_js.cn(
9091
9156
  "relative bg-background border-t border-border rounded-t-2xl shadow-2xl flex flex-col overflow-hidden",
9092
9157
  "animate-in slide-in-from-bottom duration-200",
9093
9158
  className
@@ -9150,14 +9215,14 @@ function MobileMenuSheet(props) {
9150
9215
  const { t } = reactI18next.useTranslation();
9151
9216
  const { open, onClose } = props;
9152
9217
  const [active, setActive] = React18.useState("home");
9153
- const { isTabVisible } = chunkZSZ2WR4A_js.useToolbarVisibility(props.hiddenActions);
9218
+ const { isTabVisible } = chunk2GATFIDB_js.useToolbarVisibility(props.hiddenActions);
9154
9219
  return /* @__PURE__ */ jsxRuntime.jsx(MobileSheet, { open, onClose, autoHeight: true, title: t("pptx.mobileToolbar.menu"), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
9155
9220
  /* @__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(
9156
9221
  "button",
9157
9222
  {
9158
9223
  type: "button",
9159
9224
  onClick: () => setActive(active === key ? null : key),
9160
- className: chunkZSZ2WR4A_js.cn(
9225
+ className: chunk2GATFIDB_js.cn(
9161
9226
  "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]",
9162
9227
  active === key ? "bg-primary text-white border-primary" : "border-border text-muted-foreground hover:text-foreground hover:bg-accent/40"
9163
9228
  ),
@@ -9393,7 +9458,7 @@ function MobileToolbar(props) {
9393
9458
  const { t } = reactI18next.useTranslation();
9394
9459
  const { mode, canUndo, canRedo, onUndo, onRedo, onSetMode, onSaveAsPptx } = props;
9395
9460
  const [menuOpen, setMenuOpen] = React18.useState(false);
9396
- const { isHidden } = chunkZSZ2WR4A_js.useToolbarVisibility(props.hiddenActions);
9461
+ const { isHidden } = chunk2GATFIDB_js.useToolbarVisibility(props.hiddenActions);
9397
9462
  const showEdit = mode === "edit" || mode === "master";
9398
9463
  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";
9399
9464
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -9444,7 +9509,7 @@ function MobileToolbar(props) {
9444
9509
  {
9445
9510
  type: "button",
9446
9511
  onClick: props.onToggleAiPanel,
9447
- className: chunkZSZ2WR4A_js.cn(btn, props.isAiPanelOpen ? "text-primary" : void 0),
9512
+ className: chunk2GATFIDB_js.cn(btn, props.isAiPanelOpen ? "text-primary" : void 0),
9448
9513
  title: t("pptx.toolbar.toggleAiAssistant"),
9449
9514
  "aria-label": t("pptx.toolbar.toggleAiAssistant"),
9450
9515
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuSparkles, { className: "w-5 h-5" })
@@ -9466,7 +9531,7 @@ function MobileToolbar(props) {
9466
9531
  {
9467
9532
  type: "button",
9468
9533
  onClick: () => onSetMode("present"),
9469
- className: chunkZSZ2WR4A_js.cn(btn, "text-primary"),
9534
+ className: chunk2GATFIDB_js.cn(btn, "text-primary"),
9470
9535
  title: t("pptx.toolbar.present"),
9471
9536
  "aria-label": t("pptx.toolbar.present"),
9472
9537
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuPresentation, { className: "w-5 h-5" })
@@ -9477,7 +9542,7 @@ function MobileToolbar(props) {
9477
9542
  {
9478
9543
  type: "button",
9479
9544
  onClick: props.onOpenShareDialog ?? props.onPackageForSharing,
9480
- className: chunkZSZ2WR4A_js.cn(btn, "bg-primary text-white hover:bg-primary/90 px-3"),
9545
+ className: chunk2GATFIDB_js.cn(btn, "bg-primary text-white hover:bg-primary/90 px-3"),
9481
9546
  title: t("pptx.toolbar.share"),
9482
9547
  "aria-label": t("pptx.toolbar.share"),
9483
9548
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuShare2, { className: "w-4 h-4" })
@@ -9502,7 +9567,7 @@ var FILL_COLORS = [
9502
9567
  "#008888",
9503
9568
  "#888888"
9504
9569
  ];
9505
- var TOP_SHAPES = chunkZSZ2WR4A_js.SHAPE_PRESETS.slice(0, 12);
9570
+ var TOP_SHAPES = chunk2GATFIDB_js.SHAPE_PRESETS.slice(0, 12);
9506
9571
  function DrawingGroup(p) {
9507
9572
  const { t } = reactI18next.useTranslation();
9508
9573
  const [shapesOpen, setShapesOpen] = React18.useState(false);
@@ -9583,7 +9648,7 @@ function DrawingGroup(p) {
9583
9648
  "button",
9584
9649
  {
9585
9650
  type: "button",
9586
- className: chunkZSZ2WR4A_js.cn(
9651
+ className: chunk2GATFIDB_js.cn(
9587
9652
  "flex items-center gap-2 w-full px-3 py-1.5 text-xs text-foreground hover:bg-muted transition-colors",
9588
9653
  p.newShapeType === s.type && "bg-accent"
9589
9654
  ),
@@ -9836,7 +9901,7 @@ function TabRowActions(p) {
9836
9901
  const { t } = reactI18next.useTranslation();
9837
9902
  const collab = useCollaboration();
9838
9903
  const isCollaborating = collab && collab.status === "connected";
9839
- const { isHidden } = chunkZSZ2WR4A_js.useToolbarVisibility(p.hiddenActions);
9904
+ const { isHidden } = chunk2GATFIDB_js.useToolbarVisibility(p.hiddenActions);
9840
9905
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1 pr-1", children: [
9841
9906
  p.onEnterRehearsalMode && !isHidden("record") && /* @__PURE__ */ jsxRuntime.jsxs(
9842
9907
  "button",
@@ -9857,7 +9922,7 @@ function TabRowActions(p) {
9857
9922
  {
9858
9923
  type: "button",
9859
9924
  onClick: p.onOpenShareDialog ?? p.onPackageForSharing,
9860
- className: chunkZSZ2WR4A_js.cn(
9925
+ className: chunk2GATFIDB_js.cn(
9861
9926
  "relative inline-flex items-center gap-1 px-2.5 py-1 rounded-sm text-[11px] font-medium transition-colors whitespace-nowrap",
9862
9927
  isCollaborating ? "bg-green-600 hover:bg-green-500 text-white" : "bg-primary hover:bg-primary/90 text-white"
9863
9928
  ),
@@ -9937,7 +10002,7 @@ function CustomShowsControls({
9937
10002
  {
9938
10003
  type: "button",
9939
10004
  onClick: onToggleCurrentSlideInActiveShow,
9940
- className: chunkZSZ2WR4A_js.cn(
10005
+ className: chunk2GATFIDB_js.cn(
9941
10006
  "px-2 py-1 rounded text-[11px] transition-colors",
9942
10007
  isCurrentSlideInActiveShow ? "bg-primary text-white" : "bg-muted hover:bg-accent"
9943
10008
  ),
@@ -9985,7 +10050,7 @@ function PresentDropdown({
9985
10050
  {
9986
10051
  type: "button",
9987
10052
  onClick: onPresent,
9988
- className: chunkZSZ2WR4A_js.cn(
10053
+ className: chunk2GATFIDB_js.cn(
9989
10054
  "px-2 py-1 transition-colors",
9990
10055
  isActive ? "bg-primary text-white" : "hover:bg-accent text-foreground"
9991
10056
  ),
@@ -9998,7 +10063,7 @@ function PresentDropdown({
9998
10063
  {
9999
10064
  type: "button",
10000
10065
  onClick: () => setOpen((prev) => !prev),
10001
- className: chunkZSZ2WR4A_js.cn(
10066
+ className: chunk2GATFIDB_js.cn(
10002
10067
  "inline-flex items-center px-1 transition-colors border-l border-border",
10003
10068
  open ? "bg-primary text-white" : "hover:bg-accent text-foreground"
10004
10069
  ),
@@ -10186,7 +10251,7 @@ function OverflowMenu(p) {
10186
10251
  {
10187
10252
  type: "button",
10188
10253
  onClick: () => p.onSetOverflowMenuOpen(!p.isOverflowMenuOpen),
10189
- className: chunkZSZ2WR4A_js.cn(
10254
+ className: chunk2GATFIDB_js.cn(
10190
10255
  "p-1.5 rounded transition-colors",
10191
10256
  p.isOverflowMenuOpen ? "bg-primary/80 text-white" : "bg-muted hover:bg-accent"
10192
10257
  ),
@@ -10241,7 +10306,7 @@ function ToolbarPrimaryRow(p) {
10241
10306
  {
10242
10307
  type: "button",
10243
10308
  onClick: onToggleSidebar,
10244
- className: chunkZSZ2WR4A_js.cn(qab, !isSidebarCollapsed ? "text-foreground" : "text-muted-foreground"),
10309
+ className: chunk2GATFIDB_js.cn(qab, !isSidebarCollapsed ? "text-foreground" : "text-muted-foreground"),
10245
10310
  title: t("pptx.toolbar.toggleSlidesPanel"),
10246
10311
  "aria-label": t("pptx.toolbar.toggleSlidesPanel"),
10247
10312
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuPanelLeft, { className: ic })
@@ -10253,7 +10318,7 @@ function ToolbarPrimaryRow(p) {
10253
10318
  {
10254
10319
  type: "button",
10255
10320
  onClick: p.onToggleComments,
10256
- className: chunkZSZ2WR4A_js.cn(
10321
+ className: chunk2GATFIDB_js.cn(
10257
10322
  qab,
10258
10323
  "relative max-md:hidden",
10259
10324
  p.isCommentsPanelOpen ? "text-foreground" : "text-muted-foreground"
@@ -10320,7 +10385,7 @@ function ToolbarPrimaryRow(p) {
10320
10385
  {
10321
10386
  type: "button",
10322
10387
  onClick: onToggleInspector,
10323
- className: chunkZSZ2WR4A_js.cn(qab, isInspectorPaneOpen ? "text-foreground" : "text-muted-foreground"),
10388
+ className: chunk2GATFIDB_js.cn(qab, isInspectorPaneOpen ? "text-foreground" : "text-muted-foreground"),
10324
10389
  title: t("pptx.toolbar.toggleInspector"),
10325
10390
  "aria-label": t("pptx.toolbar.toggleInspector"),
10326
10391
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuPanelRight, { className: ic })
@@ -10331,7 +10396,7 @@ function ToolbarPrimaryRow(p) {
10331
10396
  {
10332
10397
  type: "button",
10333
10398
  onClick: p.onToggleAiPanel,
10334
- className: chunkZSZ2WR4A_js.cn(qab, p.isAiPanelOpen ? "text-primary" : "text-muted-foreground"),
10399
+ className: chunk2GATFIDB_js.cn(qab, p.isAiPanelOpen ? "text-primary" : "text-muted-foreground"),
10335
10400
  title: t("pptx.toolbar.toggleAiAssistant"),
10336
10401
  "aria-label": t("pptx.toolbar.toggleAiAssistant"),
10337
10402
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuSparkles, { className: ic })
@@ -10342,7 +10407,7 @@ function ToolbarPrimaryRow(p) {
10342
10407
  {
10343
10408
  type: "button",
10344
10409
  onClick: p.onOpenSettings ?? p.onToggleShortcuts,
10345
- className: chunkZSZ2WR4A_js.cn(qab, "text-muted-foreground"),
10410
+ className: chunk2GATFIDB_js.cn(qab, "text-muted-foreground"),
10346
10411
  title: t("pptx.toolbar.settingsShortcuts"),
10347
10412
  "aria-label": t("pptx.toolbar.settings"),
10348
10413
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuSettings, { className: ics })
@@ -10355,7 +10420,7 @@ function ToolbarPrimaryRow(p) {
10355
10420
  function Toolbar(p) {
10356
10421
  const { mode, isNarrowViewport, isCompactToolbarOpen, toolbarSection, onSetToolbarSection } = p;
10357
10422
  const { t } = reactI18next.useTranslation();
10358
- const { isTabVisible } = chunkZSZ2WR4A_js.useToolbarVisibility(p.hiddenActions);
10423
+ const { isTabVisible } = chunk2GATFIDB_js.useToolbarVisibility(p.hiddenActions);
10359
10424
  if (isNarrowViewport && mode !== "present") {
10360
10425
  return /* @__PURE__ */ jsxRuntime.jsx(MobileToolbar, { ...p });
10361
10426
  }
@@ -10388,14 +10453,14 @@ function Toolbar(p) {
10388
10453
  role: "tablist",
10389
10454
  className: "flex items-center border-b border-border/60 px-1 max-md:overflow-x-auto max-md:scrollbar-none",
10390
10455
  children: [
10391
- chunkZSZ2WR4A_js.TOOLBAR_SECTIONS.filter((s) => isTabVisible(s.id)).map((s) => /* @__PURE__ */ jsxRuntime.jsx(
10456
+ chunk2GATFIDB_js.TOOLBAR_SECTIONS.filter((s) => isTabVisible(s.id)).map((s) => /* @__PURE__ */ jsxRuntime.jsx(
10392
10457
  "button",
10393
10458
  {
10394
10459
  type: "button",
10395
10460
  role: "tab",
10396
10461
  "aria-selected": toolbarSection === s.id,
10397
10462
  onClick: () => onSetToolbarSection(s.id),
10398
- className: chunkZSZ2WR4A_js.cn(
10463
+ className: chunk2GATFIDB_js.cn(
10399
10464
  "relative px-3.5 py-2 text-[12px] font-medium whitespace-nowrap transition-colors max-md:min-h-[36px] max-md:px-3",
10400
10465
  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"
10401
10466
  ),
@@ -10418,7 +10483,7 @@ function Toolbar(p) {
10418
10483
  {
10419
10484
  type: "button",
10420
10485
  onClick: p.onToggleCompactToolbar,
10421
- className: chunkZSZ2WR4A_js.cn(
10486
+ className: chunk2GATFIDB_js.cn(
10422
10487
  "px-2 py-1 rounded text-[11px] transition-colors mr-1",
10423
10488
  isCompactToolbarOpen ? "bg-primary/80 text-white" : "text-muted-foreground hover:text-foreground"
10424
10489
  ),
@@ -10434,7 +10499,7 @@ function Toolbar(p) {
10434
10499
  showRibbon && /* @__PURE__ */ jsxRuntime.jsxs(
10435
10500
  "div",
10436
10501
  {
10437
- className: chunkZSZ2WR4A_js.cn(
10502
+ className: chunk2GATFIDB_js.cn(
10438
10503
  "flex min-h-[82px] items-stretch gap-0 overflow-x-auto px-1 py-0.5 max-md:min-h-0 max-md:px-1 max-md:py-0.5 flex-nowrap [&>*]:shrink-0",
10439
10504
  isNarrowViewport && !isCompactToolbarOpen && "hidden"
10440
10505
  ),
@@ -10485,7 +10550,9 @@ function Toolbar(p) {
10485
10550
  selectedElement: p.selectedElement,
10486
10551
  onUpdateTextStyle: p.onUpdateTextStyle,
10487
10552
  themeFonts: p.themeFonts,
10488
- embeddedFontFamilies: p.embeddedFontFamilies
10553
+ embeddedFontFamilies: p.embeddedFontFamilies,
10554
+ onEmbedCustomFonts: p.onEmbedCustomFonts,
10555
+ onUploadCustomFontPackage: p.onUploadCustomFontPackage
10489
10556
  }
10490
10557
  ),
10491
10558
  sIns && /* @__PURE__ */ jsxRuntime.jsx(
@@ -10956,7 +11023,7 @@ function DrawingOverlaySvg({
10956
11023
  }
10957
11024
  );
10958
11025
  }
10959
- function GridOverlay({ canvasSize, gridSpacingPx = chunkZSZ2WR4A_js.GRID_SIZE, visible }) {
11026
+ function GridOverlay({ canvasSize, gridSpacingPx = chunk2GATFIDB_js.GRID_SIZE, visible }) {
10960
11027
  const spacing = Math.max(gridSpacingPx, 2);
10961
11028
  const patternId = React18.useMemo(() => `grid-dot-pattern-${Math.random().toString(36).slice(2, 8)}`, []);
10962
11029
  if (!visible) {
@@ -12237,7 +12304,7 @@ function LoadingState({ className }) {
12237
12304
  role: "status",
12238
12305
  "aria-live": "polite",
12239
12306
  "aria-atomic": "true",
12240
- className: chunkZSZ2WR4A_js.cn(
12307
+ className: chunk2GATFIDB_js.cn(
12241
12308
  "h-full w-full flex items-center justify-center text-muted-foreground",
12242
12309
  className
12243
12310
  ),
@@ -12260,7 +12327,7 @@ function ErrorState({ className, error }) {
12260
12327
  {
12261
12328
  role: "alert",
12262
12329
  "aria-live": "assertive",
12263
- className: chunkZSZ2WR4A_js.cn(
12330
+ className: chunk2GATFIDB_js.cn(
12264
12331
  "h-full w-full flex items-center justify-center p-6 text-center text-red-400",
12265
12332
  className
12266
12333
  ),
@@ -12291,7 +12358,7 @@ function ShortcutPanel({ isOpen, onClose }) {
12291
12358
  }
12292
12359
  )
12293
12360
  ] }),
12294
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-64 overflow-y-auto p-2 space-y-1", children: chunkZSZ2WR4A_js.SHORTCUT_REFERENCE_ITEMS.map((shortcut) => /* @__PURE__ */ jsxRuntime.jsxs(
12361
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-64 overflow-y-auto p-2 space-y-1", children: chunk2GATFIDB_js.SHORTCUT_REFERENCE_ITEMS.map((shortcut) => /* @__PURE__ */ jsxRuntime.jsxs(
12295
12362
  "div",
12296
12363
  {
12297
12364
  className: "flex items-center justify-between gap-3 rounded bg-muted/80 px-2 py-1.5",
@@ -12351,14 +12418,14 @@ function AccessibilityPanel({
12351
12418
  "aria-label": t("pptx.accessibility.reduceMotion"),
12352
12419
  "aria-checked": reducedMotion ?? false,
12353
12420
  onClick: onToggleReducedMotion,
12354
- className: chunkZSZ2WR4A_js.cn(
12421
+ className: chunk2GATFIDB_js.cn(
12355
12422
  "relative inline-flex h-5 w-9 items-center rounded-full transition-colors",
12356
12423
  reducedMotion ? "bg-primary" : "bg-muted-foreground/30"
12357
12424
  ),
12358
12425
  children: /* @__PURE__ */ jsxRuntime.jsx(
12359
12426
  "span",
12360
12427
  {
12361
- className: chunkZSZ2WR4A_js.cn(
12428
+ className: chunk2GATFIDB_js.cn(
12362
12429
  "inline-block h-3.5 w-3.5 rounded-full bg-white transition-transform",
12363
12430
  reducedMotion ? "translate-x-4" : "translate-x-0.5"
12364
12431
  )
@@ -12377,7 +12444,7 @@ function AccessibilityPanel({
12377
12444
  "div",
12378
12445
  {
12379
12446
  role: "listitem",
12380
- className: chunkZSZ2WR4A_js.cn(
12447
+ className: chunk2GATFIDB_js.cn(
12381
12448
  "flex items-start gap-2 rounded px-2 py-1.5 text-xs",
12382
12449
  /* Severity-based background and text colouring */
12383
12450
  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"
@@ -12501,7 +12568,7 @@ function StatusBar({
12501
12568
  /* @__PURE__ */ jsxRuntime.jsx(
12502
12569
  "span",
12503
12570
  {
12504
- className: chunkZSZ2WR4A_js.cn(
12571
+ className: chunk2GATFIDB_js.cn(
12505
12572
  "shrink-0 max-md:hidden",
12506
12573
  autosaveStatus?.state === "error" ? "text-red-400" : autosaveStatus?.state === "saving" ? "text-yellow-400" : ""
12507
12574
  ),
@@ -12514,7 +12581,7 @@ function StatusBar({
12514
12581
  {
12515
12582
  type: "button",
12516
12583
  onClick: onToggleNotes,
12517
- className: chunkZSZ2WR4A_js.cn(
12584
+ className: chunk2GATFIDB_js.cn(
12518
12585
  vb,
12519
12586
  "flex items-center gap-1 text-[10px]",
12520
12587
  isNotesExpanded && "text-primary"
@@ -12534,7 +12601,7 @@ function StatusBar({
12534
12601
  {
12535
12602
  type: "button",
12536
12603
  onClick: () => onSetMode("edit"),
12537
- className: chunkZSZ2WR4A_js.cn(vb, mode === "edit" && "text-primary"),
12604
+ className: chunk2GATFIDB_js.cn(vb, mode === "edit" && "text-primary"),
12538
12605
  title: t("pptx.statusBar.normalView"),
12539
12606
  "aria-label": t("pptx.statusBar.normalView"),
12540
12607
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuMonitor, { className: "w-3.5 h-3.5" })
@@ -12556,7 +12623,7 @@ function StatusBar({
12556
12623
  {
12557
12624
  type: "button",
12558
12625
  onClick: () => onSetMode("present"),
12559
- className: chunkZSZ2WR4A_js.cn(vb, mode === "present" && "text-primary"),
12626
+ className: chunk2GATFIDB_js.cn(vb, mode === "present" && "text-primary"),
12560
12627
  title: t("pptx.statusBar.slideShow"),
12561
12628
  "aria-label": t("pptx.statusBar.slideShow"),
12562
12629
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuPresentation, { className: "w-3.5 h-3.5" })
@@ -12646,7 +12713,7 @@ function ResizeHandle({
12646
12713
  {
12647
12714
  role: "separator",
12648
12715
  "aria-orientation": direction,
12649
- className: chunkZSZ2WR4A_js.cn(
12716
+ className: chunk2GATFIDB_js.cn(
12650
12717
  // Outer container: generous hit area for easy clicking.
12651
12718
  // The visible indicator is rendered via the inner pseudo-element (::after).
12652
12719
  "relative flex-shrink-0 z-20 group",
@@ -12657,7 +12724,7 @@ function ResizeHandle({
12657
12724
  children: /* @__PURE__ */ jsxRuntime.jsx(
12658
12725
  "div",
12659
12726
  {
12660
- className: chunkZSZ2WR4A_js.cn(
12727
+ className: chunk2GATFIDB_js.cn(
12661
12728
  "absolute transition-colors",
12662
12729
  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"
12663
12730
  )
@@ -12699,13 +12766,13 @@ function SlideThumbnailImpl({
12699
12766
  }) {
12700
12767
  const safeCanvasWidth = Math.max(canvasSize.width, 1);
12701
12768
  const safeCanvasHeight = Math.max(canvasSize.height, 1);
12702
- const scale = chunkZSZ2WR4A_js.SLIDE_NAV_THUMBNAIL_WIDTH / safeCanvasWidth;
12769
+ const scale = chunk2GATFIDB_js.SLIDE_NAV_THUMBNAIL_WIDTH / safeCanvasWidth;
12703
12770
  const previewHeight = Math.max(56, Math.round(safeCanvasHeight * scale));
12704
12771
  const previewElements = chunkDHNQHQ66_js.buildPreviewElements(slide, templateElements);
12705
12772
  const slideFieldContext = deriveSlideFieldContext(fieldContext, slide);
12706
12773
  const { t } = reactI18next.useTranslation();
12707
12774
  const transitionLabel = slide.transition ? (() => {
12708
- const opt = chunkZSZ2WR4A_js.SLIDE_TRANSITION_OPTIONS.find((o) => o.value === slide.transition?.type);
12775
+ const opt = chunk2GATFIDB_js.SLIDE_TRANSITION_OPTIONS.find((o) => o.value === slide.transition?.type);
12709
12776
  return opt ? t(opt.i18nKey) : slide.transition.type;
12710
12777
  })() : void 0;
12711
12778
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -13429,7 +13496,7 @@ function SectionHeader({
13429
13496
  /* @__PURE__ */ jsxRuntime.jsx(
13430
13497
  lu.LuChevronDown,
13431
13498
  {
13432
- className: chunkZSZ2WR4A_js.cn(
13499
+ className: chunk2GATFIDB_js.cn(
13433
13500
  "h-3 w-3 flex-shrink-0 transition-transform",
13434
13501
  isCollapsed ? "-rotate-90" : "rotate-0"
13435
13502
  )
@@ -13542,7 +13609,7 @@ function LazyThumbnailInner({
13542
13609
  className: "relative w-full overflow-hidden rounded border border-border bg-muted/30 animate-pulse",
13543
13610
  style: {
13544
13611
  height: previewHeight,
13545
- minWidth: chunkZSZ2WR4A_js.SLIDE_NAV_THUMBNAIL_WIDTH
13612
+ minWidth: chunk2GATFIDB_js.SLIDE_NAV_THUMBNAIL_WIDTH
13546
13613
  }
13547
13614
  }
13548
13615
  ) });
@@ -13579,7 +13646,7 @@ function buildFlatPaneItems(sectionGroups, showSectionHeaders, collapsedSections
13579
13646
  function estimateSlideItemHeight(canvasWidth, canvasHeight) {
13580
13647
  const safeW = Math.max(canvasWidth, 1);
13581
13648
  const safeH = Math.max(canvasHeight, 1);
13582
- const scale = chunkZSZ2WR4A_js.SLIDE_NAV_THUMBNAIL_WIDTH / safeW;
13649
+ const scale = chunk2GATFIDB_js.SLIDE_NAV_THUMBNAIL_WIDTH / safeW;
13583
13650
  const previewHeight = Math.max(56, Math.round(safeH * scale));
13584
13651
  return previewHeight + 30;
13585
13652
  }
@@ -13618,7 +13685,7 @@ function SlideItemInner({
13618
13685
  );
13619
13686
  const safeCanvasWidth = Math.max(canvasSize.width, 1);
13620
13687
  const safeCanvasHeight = Math.max(canvasSize.height, 1);
13621
- const scale = chunkZSZ2WR4A_js.SLIDE_NAV_THUMBNAIL_WIDTH / safeCanvasWidth;
13688
+ const scale = chunk2GATFIDB_js.SLIDE_NAV_THUMBNAIL_WIDTH / safeCanvasWidth;
13622
13689
  const previewHeight = Math.max(56, Math.round(safeCanvasHeight * scale));
13623
13690
  return /* @__PURE__ */ jsxRuntime.jsxs(
13624
13691
  "button",
@@ -13627,7 +13694,7 @@ function SlideItemInner({
13627
13694
  ref: slideRef,
13628
13695
  "aria-label": `Go to slide ${slideIndex + 1}`,
13629
13696
  "aria-current": isActive ? "true" : void 0,
13630
- className: chunkZSZ2WR4A_js.cn(
13697
+ className: chunk2GATFIDB_js.cn(
13631
13698
  "group relative flex w-full items-center gap-1 cursor-pointer border-0 bg-transparent py-0.5 px-1 text-left transition-all",
13632
13699
  isActive && "bg-accent/40 before:absolute before:left-0 before:top-1 before:bottom-1 before:w-[3px] before:bg-primary before:rounded-r",
13633
13700
  isHidden && "opacity-50"
@@ -13643,7 +13710,7 @@ function SlideItemInner({
13643
13710
  /* @__PURE__ */ jsxRuntime.jsx(
13644
13711
  "span",
13645
13712
  {
13646
- className: chunkZSZ2WR4A_js.cn(
13713
+ className: chunk2GATFIDB_js.cn(
13647
13714
  "text-[10px] tabular-nums text-right select-none w-full",
13648
13715
  isActive ? "text-primary font-medium" : "text-muted-foreground"
13649
13716
  ),
@@ -13663,7 +13730,7 @@ function SlideItemInner({
13663
13730
  /* @__PURE__ */ jsxRuntime.jsxs(
13664
13731
  "div",
13665
13732
  {
13666
- className: chunkZSZ2WR4A_js.cn(
13733
+ className: chunk2GATFIDB_js.cn(
13667
13734
  "relative flex-1 overflow-hidden border transition-colors bg-white",
13668
13735
  isActive ? "border-primary/60" : "border-transparent group-hover:border-border/40"
13669
13736
  ),
@@ -13872,7 +13939,7 @@ function SlidesPaneSidebar({
13872
13939
  [sectionGroups, showSectionHeaders, collapsedSections]
13873
13940
  );
13874
13941
  const shouldVirtualize = slides.length >= VIRTUALIZATION_THRESHOLD;
13875
- const { startIndex, endIndex, totalHeight, offsetY, scrollContainerRef, scrollToIndex } = chunkZSZ2WR4A_js.useVirtualizedSlides({
13942
+ const { startIndex, endIndex, totalHeight, offsetY, scrollContainerRef, scrollToIndex } = chunk2GATFIDB_js.useVirtualizedSlides({
13876
13943
  totalItems: shouldVirtualize ? flatItems.length : 0,
13877
13944
  itemHeight: estimatedItemHeight
13878
13945
  });
@@ -14106,7 +14173,7 @@ function HandoutMasterPanel({
14106
14173
  {
14107
14174
  type: "button",
14108
14175
  "aria-pressed": slidesPerPage === count,
14109
- className: chunkZSZ2WR4A_js.cn(
14176
+ className: chunk2GATFIDB_js.cn(
14110
14177
  "px-2 py-1.5 rounded text-[11px] font-medium transition-colors",
14111
14178
  slidesPerPage === count ? "bg-primary text-white" : "bg-accent/50 text-muted-foreground hover:bg-accent/70 hover:text-foreground"
14112
14179
  ),
@@ -14234,7 +14301,7 @@ function SlideMastersList({
14234
14301
  "div",
14235
14302
  {
14236
14303
  ref: isMasterActive ? activeRef : void 0,
14237
- className: chunkZSZ2WR4A_js.cn(
14304
+ className: chunk2GATFIDB_js.cn(
14238
14305
  "group relative cursor-pointer rounded-lg border-2 p-1 transition-all",
14239
14306
  isMasterActive ? "border-amber-500 bg-amber-500/10" : "border-border bg-background/40 hover:border-border"
14240
14307
  ),
@@ -14251,7 +14318,7 @@ function SlideMastersList({
14251
14318
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 px-1", children: /* @__PURE__ */ jsxRuntime.jsx(
14252
14319
  "span",
14253
14320
  {
14254
- className: chunkZSZ2WR4A_js.cn(
14321
+ className: chunk2GATFIDB_js.cn(
14255
14322
  "text-[10px] font-medium",
14256
14323
  isMasterActive ? "text-amber-400" : "text-muted-foreground"
14257
14324
  ),
@@ -14267,7 +14334,7 @@ function SlideMastersList({
14267
14334
  "div",
14268
14335
  {
14269
14336
  ref: isLayoutActive ? activeRef : void 0,
14270
- className: chunkZSZ2WR4A_js.cn(
14337
+ className: chunk2GATFIDB_js.cn(
14271
14338
  "group relative cursor-pointer rounded-md border-2 p-0.5 transition-all",
14272
14339
  isLayoutActive ? "border-primary bg-primary/10" : "border-border bg-background/40 hover:border-border"
14273
14340
  ),
@@ -14284,7 +14351,7 @@ function SlideMastersList({
14284
14351
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 px-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(
14285
14352
  "span",
14286
14353
  {
14287
- className: chunkZSZ2WR4A_js.cn(
14354
+ className: chunk2GATFIDB_js.cn(
14288
14355
  "text-[9px]",
14289
14356
  isLayoutActive ? "text-primary" : "text-muted-foreground"
14290
14357
  ),
@@ -14368,7 +14435,7 @@ function MasterViewSidebar({
14368
14435
  type: "button",
14369
14436
  role: "tab",
14370
14437
  "aria-selected": masterViewTab === tab.key,
14371
- className: chunkZSZ2WR4A_js.cn(
14438
+ className: chunk2GATFIDB_js.cn(
14372
14439
  "flex-1 px-1 py-1.5 text-[10px] font-medium transition-colors border-b-2",
14373
14440
  masterViewTab === tab.key ? "border-amber-500 text-amber-400" : "border-transparent text-muted-foreground hover:text-foreground"
14374
14441
  ),
@@ -14840,7 +14907,7 @@ function SectionBlock({
14840
14907
  /* @__PURE__ */ jsxRuntime.jsx(
14841
14908
  lu.LuChevronDown,
14842
14909
  {
14843
- className: chunkZSZ2WR4A_js.cn("h-3 w-3 transition-transform", collapsed ? "-rotate-90" : "rotate-0")
14910
+ className: chunk2GATFIDB_js.cn("h-3 w-3 transition-transform", collapsed ? "-rotate-90" : "rotate-0")
14844
14911
  }
14845
14912
  ),
14846
14913
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-left", children: section.label }),
@@ -14887,7 +14954,7 @@ function SlideCardImpl({
14887
14954
  return /* @__PURE__ */ jsxRuntime.jsxs(
14888
14955
  "div",
14889
14956
  {
14890
- className: chunkZSZ2WR4A_js.cn(
14957
+ className: chunk2GATFIDB_js.cn(
14891
14958
  "group relative cursor-pointer rounded-lg border-2 p-1 transition-all",
14892
14959
  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",
14893
14960
  slide.hidden && "opacity-40"
@@ -14906,7 +14973,7 @@ function SlideCardImpl({
14906
14973
  /* @__PURE__ */ jsxRuntime.jsx(
14907
14974
  "span",
14908
14975
  {
14909
- className: chunkZSZ2WR4A_js.cn(
14976
+ className: chunk2GATFIDB_js.cn(
14910
14977
  "text-[11px] font-medium",
14911
14978
  isSelected ? "text-primary" : isActive ? "text-primary/70" : "text-muted-foreground"
14912
14979
  ),
@@ -16641,7 +16708,7 @@ var SlideNotesPanel = ({
16641
16708
  });
16642
16709
  const hasNotes = draft.trim().length > 0;
16643
16710
  const slideLabel = activeSlide ? t("pptx.notes.slideN", { n: activeSlide.slideNumber }) : t("pptx.notes.noSlide");
16644
- const { dragY, handlers: dragHandlers } = chunkZSZ2WR4A_js.useSheetDismissDrag(onToggle);
16711
+ const { dragY, handlers: dragHandlers } = chunk2GATFIDB_js.useSheetDismissDrag(onToggle);
16645
16712
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
16646
16713
  isExpanded && /* @__PURE__ */ jsxRuntime.jsx(
16647
16714
  "button",
@@ -16655,7 +16722,7 @@ var SlideNotesPanel = ({
16655
16722
  /* @__PURE__ */ jsxRuntime.jsxs(
16656
16723
  "div",
16657
16724
  {
16658
- className: chunkZSZ2WR4A_js.cn(
16725
+ className: chunk2GATFIDB_js.cn(
16659
16726
  "flex flex-col border-t border-border/60 bg-background select-none",
16660
16727
  // On mobile, hide the entire notes strip when collapsed: the
16661
16728
  // MobileBottomBar's Notes button is the entry point instead.
@@ -17006,7 +17073,7 @@ function SlideDiffRow({
17006
17073
  return /* @__PURE__ */ jsxRuntime.jsxs(
17007
17074
  "div",
17008
17075
  {
17009
- className: chunkZSZ2WR4A_js.cn(
17076
+ className: chunk2GATFIDB_js.cn(
17010
17077
  "rounded-lg border transition-colors",
17011
17078
  isResolved ? "border-border/60 bg-card/40 opacity-60" : "border-border bg-background/70"
17012
17079
  ),
@@ -17020,7 +17087,7 @@ function SlideDiffRow({
17020
17087
  children: [
17021
17088
  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" }),
17022
17089
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-foreground", children: t("pptx.compare.slideNumber", { number: slideNumber }) }),
17023
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkZSZ2WR4A_js.cn("rounded-full px-2 py-0.5 text-[10px] font-medium", statusColor), children: statusLabel }),
17090
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunk2GATFIDB_js.cn("rounded-full px-2 py-0.5 text-[10px] font-medium", statusColor), children: statusLabel }),
17024
17091
  diff.changes.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[10px] text-muted-foreground", children: [
17025
17092
  diff.changes.length,
17026
17093
  " ",
@@ -17030,7 +17097,7 @@ function SlideDiffRow({
17030
17097
  isResolved && /* @__PURE__ */ jsxRuntime.jsx(
17031
17098
  "span",
17032
17099
  {
17033
- className: chunkZSZ2WR4A_js.cn(
17100
+ className: chunk2GATFIDB_js.cn(
17034
17101
  "text-[10px] font-medium",
17035
17102
  accepted ? "text-green-400" : "text-muted-foreground"
17036
17103
  ),
@@ -17058,7 +17125,7 @@ function SlideDiffRow({
17058
17125
  /* @__PURE__ */ jsxRuntime.jsx(
17059
17126
  "div",
17060
17127
  {
17061
- className: chunkZSZ2WR4A_js.cn(
17128
+ className: chunk2GATFIDB_js.cn(
17062
17129
  "rounded border overflow-hidden",
17063
17130
  diff.status === "added" ? "border-green-700/60" : diff.status === "changed" ? "border-amber-700/60" : "border-border"
17064
17131
  ),
@@ -17770,7 +17837,7 @@ function DocumentPropertiesDialog({
17770
17837
  const handleClose = React18.useCallback(() => {
17771
17838
  onClose();
17772
17839
  }, [onClose]);
17773
- const { panelStyle, handlers: dragHandlers } = chunkZSZ2WR4A_js.useModalDismissDrag(handleClose);
17840
+ const { panelStyle, handlers: dragHandlers } = chunk2GATFIDB_js.useModalDismissDrag(handleClose);
17774
17841
  if (!isOpen) {
17775
17842
  return null;
17776
17843
  }
@@ -19389,7 +19456,7 @@ function SelectionPane({
19389
19456
  setDragIndex(null);
19390
19457
  setDragOverIndex(null);
19391
19458
  },
19392
- className: chunkZSZ2WR4A_js.cn(
19459
+ className: chunk2GATFIDB_js.cn(
19393
19460
  "flex items-center gap-1.5 px-2 py-1 text-xs cursor-pointer transition-colors",
19394
19461
  isSelected ? "bg-primary/30 text-primary" : "hover:bg-muted text-foreground",
19395
19462
  dragOverIndex === realIndex ? "border-t-2 border-primary" : ""
@@ -19440,13 +19507,13 @@ function SelectionPane({
19440
19507
  }
19441
19508
  var INPUT_CLS = "bg-muted border border-border rounded px-2 py-1 w-full text-[11px]";
19442
19509
  var SELECT_CLS = "bg-muted border border-border rounded px-2 py-1 w-full text-[11px]";
19443
- var ENTRANCE_PRESETS = chunkZSZ2WR4A_js.ANIMATION_PRESET_OPTIONS.filter(
19510
+ var ENTRANCE_PRESETS = chunk2GATFIDB_js.ANIMATION_PRESET_OPTIONS.filter(
19444
19511
  (o) => o.value === "fadeIn" || o.value === "flyIn" || o.value === "zoomIn"
19445
19512
  );
19446
- var EXIT_PRESETS = chunkZSZ2WR4A_js.ANIMATION_PRESET_OPTIONS.filter(
19513
+ var EXIT_PRESETS = chunk2GATFIDB_js.ANIMATION_PRESET_OPTIONS.filter(
19447
19514
  (o) => o.value === "fadeOut" || o.value === "flyOut" || o.value === "zoomOut"
19448
19515
  );
19449
- var EMPHASIS_PRESETS = chunkZSZ2WR4A_js.ANIMATION_PRESET_OPTIONS.filter(
19516
+ var EMPHASIS_PRESETS = chunk2GATFIDB_js.ANIMATION_PRESET_OPTIONS.filter(
19450
19517
  (o) => o.value === "spin" || o.value === "pulse" || o.value === "colorWave" || o.value === "bounce" || o.value === "flash" || o.value === "growShrink" || o.value === "teeter"
19451
19518
  );
19452
19519
  var TRIGGER_OPTIONS = [
@@ -19548,7 +19615,7 @@ function AnimationTimelineSection({
19548
19615
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative h-6 rounded bg-muted/50 border border-border overflow-hidden", children: timelineBarData.map((bar) => /* @__PURE__ */ jsxRuntime.jsx(
19549
19616
  "div",
19550
19617
  {
19551
- className: chunkZSZ2WR4A_js.cn(
19618
+ className: chunk2GATFIDB_js.cn(
19552
19619
  "absolute top-0.5 bottom-0.5 rounded-sm transition-colors",
19553
19620
  animationTypeColor(bar.anim),
19554
19621
  bar.anim.elementId === selectedElementId && "ring-1 ring-primary"
@@ -19582,7 +19649,7 @@ function AnimationTimelineSection({
19582
19649
  onDragEnd: handleDragEnd,
19583
19650
  onMouseEnter: () => handleAnimationHover(anim),
19584
19651
  onMouseLeave: handleAnimationHoverEnd,
19585
- className: chunkZSZ2WR4A_js.cn(
19652
+ className: chunk2GATFIDB_js.cn(
19586
19653
  "flex items-center gap-1 px-1 py-0.5 rounded text-[10px] cursor-grab transition-colors",
19587
19654
  isSelected ? "bg-primary/30 text-primary" : "bg-muted/50 text-muted-foreground",
19588
19655
  isDragging && "opacity-40",
@@ -19746,13 +19813,13 @@ function useAnimationPreview({
19746
19813
  if (!preset || preset === "none") {
19747
19814
  return;
19748
19815
  }
19749
- chunkZSZ2WR4A_js.startPreviewAnimation(anim.elementId, preset, {
19816
+ chunk2GATFIDB_js.startPreviewAnimation(anim.elementId, preset, {
19750
19817
  direction: anim.direction,
19751
19818
  durationMs: anim.durationMs ?? 500,
19752
19819
  timingCurve: anim.timingCurve
19753
19820
  });
19754
19821
  }, []);
19755
- const handleAnimationHoverEnd = React18.useCallback(() => chunkZSZ2WR4A_js.stopPreviewAnimation(), []);
19822
+ const handleAnimationHoverEnd = React18.useCallback(() => chunk2GATFIDB_js.stopPreviewAnimation(), []);
19756
19823
  const handlePreviewClick = React18.useCallback(() => {
19757
19824
  if (!selectedElementAnimation) {
19758
19825
  return;
@@ -19761,7 +19828,7 @@ function useAnimationPreview({
19761
19828
  if (!preset || preset === "none") {
19762
19829
  return;
19763
19830
  }
19764
- chunkZSZ2WR4A_js.startPreviewAnimation(selectedElementId, preset, {
19831
+ chunk2GATFIDB_js.startPreviewAnimation(selectedElementId, preset, {
19765
19832
  direction: selectedElementAnimation.direction,
19766
19833
  durationMs: selectedElementAnimation.durationMs ?? 500,
19767
19834
  timingCurve: selectedElementAnimation.timingCurve
@@ -20093,7 +20160,7 @@ function AnimationPanel({
20093
20160
  {
20094
20161
  type: "button",
20095
20162
  disabled: !canEdit,
20096
- className: chunkZSZ2WR4A_js.cn(
20163
+ className: chunk2GATFIDB_js.cn(
20097
20164
  "flex items-center justify-center w-7 h-7 rounded border transition-colors",
20098
20165
  isActive ? "border-primary bg-primary/20 text-primary" : "border-border bg-muted text-muted-foreground hover:bg-accent"
20099
20166
  ),
@@ -20335,7 +20402,7 @@ function ActionTriggerSection({
20335
20402
  "select",
20336
20403
  {
20337
20404
  disabled: !canEdit,
20338
- className: chunkZSZ2WR4A_js.cn(INPUT, "w-full"),
20405
+ className: chunk2GATFIDB_js.cn(INPUT, "w-full"),
20339
20406
  value: activeType,
20340
20407
  onChange: (e) => onChangeType(e.target.value),
20341
20408
  children: ACTION_TYPE_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: t(o.label) }, o.value))
@@ -20346,7 +20413,7 @@ function ActionTriggerSection({
20346
20413
  {
20347
20414
  type: "text",
20348
20415
  disabled: !canEdit,
20349
- className: chunkZSZ2WR4A_js.cn(INPUT, "w-full"),
20416
+ className: chunk2GATFIDB_js.cn(INPUT, "w-full"),
20350
20417
  placeholder: "https://...",
20351
20418
  value: action?.url ?? fallbackUrl ?? "",
20352
20419
  onChange: (e) => onChangeUrl(e.target.value)
@@ -20357,7 +20424,7 @@ function ActionTriggerSection({
20357
20424
  {
20358
20425
  type: "number",
20359
20426
  disabled: !canEdit,
20360
- className: chunkZSZ2WR4A_js.cn(INPUT, "w-full"),
20427
+ className: chunk2GATFIDB_js.cn(INPUT, "w-full"),
20361
20428
  placeholder: t("pptx.action.slideNumberPlaceholder"),
20362
20429
  min: 1,
20363
20430
  max: slideCount,
@@ -22012,7 +22079,7 @@ function ConnectorPanel({
22012
22079
  "select",
22013
22080
  {
22014
22081
  disabled: !canEdit,
22015
- className: chunkZSZ2WR4A_js.cn(INPUT, "w-full"),
22082
+ className: chunk2GATFIDB_js.cn(INPUT, "w-full"),
22016
22083
  value: selectedElement.shapeStyle?.[key] ?? "none",
22017
22084
  onChange: (e) => onUpdateElementStyle({ [key]: e.target.value }),
22018
22085
  children: [
@@ -22064,7 +22131,7 @@ function OlePropertiesPanel({
22064
22131
  /* @__PURE__ */ jsxRuntime.jsx(
22065
22132
  "span",
22066
22133
  {
22067
- className: chunkZSZ2WR4A_js.cn(
22134
+ className: chunk2GATFIDB_js.cn(
22068
22135
  "inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium",
22069
22136
  ole.isLinked ? "bg-blue-500/20 text-blue-400" : "bg-green-500/20 text-green-400"
22070
22137
  ),
@@ -22123,7 +22190,7 @@ function LayerOrderButtons({
22123
22190
  "button",
22124
22191
  {
22125
22192
  type: "button",
22126
- className: chunkZSZ2WR4A_js.cn("flex-1", BTN),
22193
+ className: chunk2GATFIDB_js.cn("flex-1", BTN),
22127
22194
  disabled: !canEdit,
22128
22195
  onClick: () => onMoveLayer("forward"),
22129
22196
  children: "\u2191 Forward"
@@ -22133,7 +22200,7 @@ function LayerOrderButtons({
22133
22200
  "button",
22134
22201
  {
22135
22202
  type: "button",
22136
- className: chunkZSZ2WR4A_js.cn("flex-1", BTN),
22203
+ className: chunk2GATFIDB_js.cn("flex-1", BTN),
22137
22204
  disabled: !canEdit,
22138
22205
  onClick: () => onMoveLayer("backward"),
22139
22206
  children: "\u2193 Backward"
@@ -22157,7 +22224,7 @@ function ArtisticEffectsGallery({
22157
22224
  {
22158
22225
  type: "button",
22159
22226
  disabled: !canEdit,
22160
- className: chunkZSZ2WR4A_js.cn(
22227
+ className: chunk2GATFIDB_js.cn(
22161
22228
  "flex flex-col items-center gap-0.5 rounded border p-0.5 hover:bg-accent/50",
22162
22229
  isActive ? "border-primary bg-primary/10" : "border-border"
22163
22230
  ),
@@ -22606,7 +22673,7 @@ function ImagePropertiesPanel({
22606
22673
  {
22607
22674
  rows: 2,
22608
22675
  disabled: !canEdit,
22609
- className: chunkZSZ2WR4A_js.cn(INPUT, "resize-none text-[11px]"),
22676
+ className: chunk2GATFIDB_js.cn(INPUT, "resize-none text-[11px]"),
22610
22677
  value: selectedElement.altText ?? "",
22611
22678
  onChange: (e) => onUpdateElement({
22612
22679
  altText: e.target.value
@@ -23565,11 +23632,11 @@ function ShapeTextPanels({
23565
23632
  {
23566
23633
  value: selectedElement.shapeType || "rect",
23567
23634
  disabled: !canEdit,
23568
- className: chunkZSZ2WR4A_js.cn(INPUT, "w-full"),
23635
+ className: chunk2GATFIDB_js.cn(INPUT, "w-full"),
23569
23636
  onChange: (e) => onUpdateElement({
23570
23637
  shapeType: e.target.value
23571
23638
  }),
23572
- children: chunkZSZ2WR4A_js.SHAPE_PRESETS.filter((p) => p.type !== "connector").map((p) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: p.type, children: t(p.i18nKey) }, p.type))
23639
+ children: chunk2GATFIDB_js.SHAPE_PRESETS.filter((p) => p.type !== "connector").map((p) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: p.type, children: t(p.i18nKey) }, p.type))
23573
23640
  }
23574
23641
  )
23575
23642
  ] }),
@@ -23699,7 +23766,7 @@ function TextFormatToggle({
23699
23766
  {
23700
23767
  type: "button",
23701
23768
  disabled,
23702
- className: chunkZSZ2WR4A_js.cn(
23769
+ className: chunk2GATFIDB_js.cn(
23703
23770
  "px-2 py-1 rounded text-[11px] transition-colors",
23704
23771
  italic && "italic",
23705
23772
  underline && "underline",
@@ -23991,7 +24058,7 @@ function SmartArtLayoutSwitcher({
23991
24058
  type: "button",
23992
24059
  "data-testid": `smartart-layout-${type}`,
23993
24060
  disabled: !canEdit,
23994
- className: chunkZSZ2WR4A_js.cn(
24061
+ className: chunk2GATFIDB_js.cn(
23995
24062
  "flex flex-col items-center gap-0.5 rounded border p-1.5 transition-colors",
23996
24063
  "text-[9px] leading-tight",
23997
24064
  isActive ? "border-primary bg-primary/15 text-primary" : "border-border text-muted-foreground hover:bg-muted hover:text-foreground",
@@ -24063,7 +24130,7 @@ function SmartArtNodeStyleControls({
24063
24130
  disabled: !canEdit,
24064
24131
  "aria-label": `Bold ${label}`,
24065
24132
  "aria-pressed": bold,
24066
- className: chunkZSZ2WR4A_js.cn(
24133
+ className: chunk2GATFIDB_js.cn(
24067
24134
  EMPHASIS_BTN,
24068
24135
  "font-bold",
24069
24136
  bold ? "border-primary bg-primary/20 text-primary" : "border-border text-muted-foreground"
@@ -24079,7 +24146,7 @@ function SmartArtNodeStyleControls({
24079
24146
  disabled: !canEdit,
24080
24147
  "aria-label": `Italic ${label}`,
24081
24148
  "aria-pressed": italic,
24082
- className: chunkZSZ2WR4A_js.cn(
24149
+ className: chunk2GATFIDB_js.cn(
24083
24150
  EMPHASIS_BTN,
24084
24151
  "italic",
24085
24152
  italic ? "border-primary bg-primary/20 text-primary" : "border-border text-muted-foreground"
@@ -24118,7 +24185,7 @@ function SmartArtNodeRow({
24118
24185
  "div",
24119
24186
  {
24120
24187
  role: "listitem",
24121
- className: chunkZSZ2WR4A_js.cn(
24188
+ className: chunk2GATFIDB_js.cn(
24122
24189
  "rounded border bg-background/60 p-1.5",
24123
24190
  isChild ? "border-border/60 ml-4" : "border-border"
24124
24191
  ),
@@ -24133,7 +24200,7 @@ function SmartArtNodeRow({
24133
24200
  "data-testid": "smartart-node-text",
24134
24201
  disabled: !canEdit,
24135
24202
  "aria-label": label,
24136
- className: chunkZSZ2WR4A_js.cn(INPUT, "flex-1 text-[11px] py-0.5"),
24203
+ className: chunk2GATFIDB_js.cn(INPUT, "flex-1 text-[11px] py-0.5"),
24137
24204
  value: text,
24138
24205
  onChange: (e) => onChangeText(nodeId, e.target.value),
24139
24206
  onKeyDown: (e) => onKeyDown(e, nodeId),
@@ -24182,7 +24249,7 @@ function SmartArtNodeRow({
24182
24249
  {
24183
24250
  type: "button",
24184
24251
  disabled: !canEdit || removeDisabled,
24185
- className: chunkZSZ2WR4A_js.cn(MINI_BTN, "hover:text-red-400"),
24252
+ className: chunk2GATFIDB_js.cn(MINI_BTN, "hover:text-red-400"),
24186
24253
  onClick: () => onRemove(nodeId),
24187
24254
  "aria-label": `Remove ${label}`,
24188
24255
  title: removeDisabled ? t("pptx.smartArt.layoutMinimum") : t("pptx.smartArt.remove"),
@@ -24240,7 +24307,7 @@ function SmartArtPropertiesPanel({
24240
24307
  const reflowed = box ? chunkDHNQHQ66_js.rebuildDrawingShapesIfCleared(
24241
24308
  newData,
24242
24309
  newData.layout,
24243
- chunkZSZ2WR4A_js.resolveSmartArtDataPalette(newData),
24310
+ chunk2GATFIDB_js.resolveSmartArtDataPalette(newData),
24244
24311
  newData.style ?? "flat",
24245
24312
  "inspector",
24246
24313
  box
@@ -24349,7 +24416,7 @@ function SmartArtPropertiesPanel({
24349
24416
  disabled: !canEdit,
24350
24417
  "data-testid": "smartart-color-scheme",
24351
24418
  "aria-label": t("pptx.smartart.colorScheme"),
24352
- className: chunkZSZ2WR4A_js.cn(INPUT, "w-full"),
24419
+ className: chunk2GATFIDB_js.cn(INPUT, "w-full"),
24353
24420
  value: smartArtData.colorScheme ?? "colorful1",
24354
24421
  onChange: (e) => updateSmartArt({ colorScheme: e.target.value }),
24355
24422
  children: COLOR_SCHEMES.map((cs) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: cs, children: cs }, cs))
@@ -24364,7 +24431,7 @@ function SmartArtPropertiesPanel({
24364
24431
  type: "button",
24365
24432
  disabled: !canEdit,
24366
24433
  "aria-pressed": (smartArtData.style ?? "flat") === s,
24367
- className: chunkZSZ2WR4A_js.cn(
24434
+ className: chunk2GATFIDB_js.cn(
24368
24435
  "flex-1 px-2 py-1 text-[10px] rounded border transition-colors",
24369
24436
  (smartArtData.style ?? "flat") === s ? "border-primary bg-primary/20 text-primary" : "border-border text-muted-foreground hover:bg-muted"
24370
24437
  ),
@@ -24768,7 +24835,7 @@ function TableCellFormattingPanel({
24768
24835
  {
24769
24836
  type: "button",
24770
24837
  disabled: !canEdit,
24771
- className: chunkZSZ2WR4A_js.cn(
24838
+ className: chunk2GATFIDB_js.cn(
24772
24839
  "px-2 py-1 rounded text-[11px] transition-colors",
24773
24840
  cls,
24774
24841
  cs[key] ? "bg-primary text-white" : "bg-muted hover:bg-accent"
@@ -24787,7 +24854,7 @@ function TableCellFormattingPanel({
24787
24854
  {
24788
24855
  type: "button",
24789
24856
  disabled: !canEdit,
24790
- className: chunkZSZ2WR4A_js.cn(
24857
+ className: chunk2GATFIDB_js.cn(
24791
24858
  "px-2 py-1 rounded text-[11px] transition-colors",
24792
24859
  cs.align === val ? "bg-primary text-white" : "bg-muted hover:bg-accent"
24793
24860
  ),
@@ -24805,7 +24872,7 @@ function TableCellFormattingPanel({
24805
24872
  {
24806
24873
  type: "button",
24807
24874
  disabled: !canEdit,
24808
- className: chunkZSZ2WR4A_js.cn(
24875
+ className: chunk2GATFIDB_js.cn(
24809
24876
  "px-2 py-1 rounded text-[11px] transition-colors",
24810
24877
  cs.vAlign === val ? "bg-primary text-white" : "bg-muted hover:bg-accent"
24811
24878
  ),
@@ -24838,7 +24905,7 @@ function TableCellFormattingPanel({
24838
24905
  {
24839
24906
  type: "number",
24840
24907
  disabled: !canEdit,
24841
- className: chunkZSZ2WR4A_js.cn(INPUT, "w-14"),
24908
+ className: chunk2GATFIDB_js.cn(INPUT, "w-14"),
24842
24909
  min: 0,
24843
24910
  max: 10,
24844
24911
  value: cs[widthKey] ?? 1,
@@ -24854,7 +24921,7 @@ function TableCellFormattingPanel({
24854
24921
  {
24855
24922
  type: "button",
24856
24923
  disabled: !canEdit,
24857
- className: chunkZSZ2WR4A_js.cn(BTN, "text-center"),
24924
+ className: chunk2GATFIDB_js.cn(BTN, "text-center"),
24858
24925
  onClick: () => {
24859
24926
  const newRows = chunkDHNQHQ66_js.computeMergeCellRight(td, rowIndex, columnIndex);
24860
24927
  if (newRows) {
@@ -24869,7 +24936,7 @@ function TableCellFormattingPanel({
24869
24936
  {
24870
24937
  type: "button",
24871
24938
  disabled: !canEdit,
24872
- className: chunkZSZ2WR4A_js.cn(BTN, "text-center"),
24939
+ className: chunk2GATFIDB_js.cn(BTN, "text-center"),
24873
24940
  onClick: () => {
24874
24941
  const newRows = chunkDHNQHQ66_js.computeMergeCellDown(td, rowIndex, columnIndex);
24875
24942
  if (newRows) {
@@ -24884,7 +24951,7 @@ function TableCellFormattingPanel({
24884
24951
  {
24885
24952
  type: "button",
24886
24953
  disabled: !canEdit,
24887
- className: chunkZSZ2WR4A_js.cn(BTN, "text-center"),
24954
+ className: chunk2GATFIDB_js.cn(BTN, "text-center"),
24888
24955
  onClick: () => {
24889
24956
  const newRows = chunkDHNQHQ66_js.computeSplitCell(td, rowIndex, columnIndex);
24890
24957
  if (newRows) {
@@ -25292,7 +25359,7 @@ function InspectorCommentRow({
25292
25359
  return /* @__PURE__ */ jsxRuntime.jsxs(
25293
25360
  "div",
25294
25361
  {
25295
- className: chunkZSZ2WR4A_js.cn(
25362
+ className: chunk2GATFIDB_js.cn(
25296
25363
  "rounded border border-border bg-card p-2",
25297
25364
  depth > 0 && "ml-3 border-l-2 border-l-primary/40"
25298
25365
  ),
@@ -25380,7 +25447,7 @@ function InspectorCommentRow({
25380
25447
  "button",
25381
25448
  {
25382
25449
  type: "button",
25383
- className: chunkZSZ2WR4A_js.cn(
25450
+ className: chunk2GATFIDB_js.cn(
25384
25451
  "inline-flex items-center justify-center p-1.5 border-l border-border transition-colors",
25385
25452
  comment.resolved ? "bg-green-900/40 text-green-300 hover:bg-green-900/60" : "hover:bg-accent text-foreground hover:text-foreground"
25386
25453
  ),
@@ -25574,7 +25641,7 @@ function InspectorCommentsSection({
25574
25641
  type: "button",
25575
25642
  onClick: onAddComment,
25576
25643
  disabled: !commentDraft.trim(),
25577
- className: chunkZSZ2WR4A_js.cn(
25644
+ className: chunk2GATFIDB_js.cn(
25578
25645
  "w-full inline-flex items-center justify-center gap-1 rounded px-2 py-1 text-[11px] font-medium transition-colors",
25579
25646
  commentDraft.trim() ? "bg-primary hover:bg-primary/80 text-white" : "bg-muted text-muted-foreground cursor-not-allowed"
25580
25647
  ),
@@ -25599,7 +25666,7 @@ function InspectorPaneHeader({
25599
25666
  {
25600
25667
  type: "button",
25601
25668
  title: label,
25602
- className: chunkZSZ2WR4A_js.cn(
25669
+ className: chunk2GATFIDB_js.cn(
25603
25670
  "flex items-center gap-1 px-2 py-1 rounded text-[11px] transition-colors",
25604
25671
  activeTab === key ? "bg-primary text-white" : "text-muted-foreground hover:text-foreground hover:bg-accent"
25605
25672
  ),
@@ -25708,7 +25775,7 @@ function CustomPropertiesBlock({
25708
25775
  "button",
25709
25776
  {
25710
25777
  type: "button",
25711
- className: chunkZSZ2WR4A_js.cn(BTN, "px-1.5 text-red-400 hover:text-red-300"),
25778
+ className: chunk2GATFIDB_js.cn(BTN, "px-1.5 text-red-400 hover:text-red-300"),
25712
25779
  onClick: () => onUpdate(customProperties.filter((_, i) => i !== index)),
25713
25780
  children: "\xD7"
25714
25781
  }
@@ -25843,7 +25910,7 @@ function PresentationSettingsCard({
25843
25910
  "select",
25844
25911
  {
25845
25912
  disabled: !canEdit,
25846
- className: chunkZSZ2WR4A_js.cn(INPUT, "w-28"),
25913
+ className: chunk2GATFIDB_js.cn(INPUT, "w-28"),
25847
25914
  value: presentationProperties.showType ?? "presented",
25848
25915
  onChange: (e) => onUpdate({
25849
25916
  showType: e.target.value
@@ -25903,7 +25970,7 @@ function PresentationSettingsCard({
25903
25970
  min: 1,
25904
25971
  max: 16,
25905
25972
  disabled: !canEdit,
25906
- className: chunkZSZ2WR4A_js.cn(INPUT, "w-20"),
25973
+ className: chunk2GATFIDB_js.cn(INPUT, "w-20"),
25907
25974
  value: chunkDHNQHQ66_js.printPropertiesSlidesPerPage(presentationProperties.printProperties),
25908
25975
  onChange: (e) => onUpdate({
25909
25976
  printProperties: chunkDHNQHQ66_js.withSlidesPerPage(
@@ -26205,7 +26272,7 @@ function TagsSection({
26205
26272
  "button",
26206
26273
  {
26207
26274
  type: "button",
26208
- className: chunkZSZ2WR4A_js.cn(BTN, "px-1.5 text-red-400 hover:text-red-300"),
26275
+ className: chunk2GATFIDB_js.cn(BTN, "px-1.5 text-red-400 hover:text-red-300"),
26209
26276
  title: t("pptx.tags.deleteTag"),
26210
26277
  onClick: () => deleteTag(tag.colIdx, tag.tagIdx),
26211
26278
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuTrash2, { className: "w-3 h-3" })
@@ -26305,7 +26372,7 @@ function PresentationPropertiesPanel({
26305
26372
  canEdit
26306
26373
  }
26307
26374
  ),
26308
- activeSlide && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkZSZ2WR4A_js.cn(CARD, "space-y-1"), children: [
26375
+ activeSlide && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk2GATFIDB_js.cn(CARD, "space-y-1"), children: [
26309
26376
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING, children: "Slide" }),
26310
26377
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-[11px] text-muted-foreground", children: [
26311
26378
  activeSlide.elements?.length ?? 0,
@@ -26326,7 +26393,7 @@ function SlideBackgroundPanel({
26326
26393
  const { t } = reactI18next.useTranslation();
26327
26394
  const bgImageInputRef = React18.useRef(null);
26328
26395
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
26329
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkZSZ2WR4A_js.cn(CARD, "space-y-2"), children: [
26396
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk2GATFIDB_js.cn(CARD, "space-y-2"), children: [
26330
26397
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING, children: "Background" }),
26331
26398
  /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 text-[11px]", children: [
26332
26399
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground w-10 shrink-0", children: "Colour" }),
@@ -26372,7 +26439,7 @@ function SlideBackgroundPanel({
26372
26439
  "button",
26373
26440
  {
26374
26441
  type: "button",
26375
- className: chunkZSZ2WR4A_js.cn(BTN, "flex-1 text-center"),
26442
+ className: chunk2GATFIDB_js.cn(BTN, "flex-1 text-center"),
26376
26443
  disabled: !canEdit,
26377
26444
  onClick: () => bgImageInputRef.current?.click(),
26378
26445
  children: activeSlide.backgroundImage ? t("pptx.slideBackground.replaceImage") : t("pptx.slideBackground.chooseImage")
@@ -26405,7 +26472,7 @@ function SlideBackgroundPanel({
26405
26472
  "button",
26406
26473
  {
26407
26474
  type: "button",
26408
- className: chunkZSZ2WR4A_js.cn(BTN, "w-full text-center text-red-400 hover:text-red-300"),
26475
+ className: chunk2GATFIDB_js.cn(BTN, "w-full text-center text-red-400 hover:text-red-300"),
26409
26476
  disabled: !canEdit,
26410
26477
  onClick: () => onUpdateSlide({
26411
26478
  backgroundColor: void 0,
@@ -26436,7 +26503,7 @@ function TemplateBackgroundCard({
26436
26503
  onGetTemplateBackgroundColor
26437
26504
  }) {
26438
26505
  const { t } = reactI18next.useTranslation();
26439
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkZSZ2WR4A_js.cn(CARD, "space-y-2"), children: [
26506
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk2GATFIDB_js.cn(CARD, "space-y-2"), children: [
26440
26507
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: HEADING, children: t("pptx.slideBackground.templateBackgroundsHeading") }),
26441
26508
  activeSlide.layoutPath && /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 text-[11px]", children: [
26442
26509
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -26583,7 +26650,7 @@ function InspectorPane(props) {
26583
26650
  } = props;
26584
26651
  const hasSelection = selectedElement !== null;
26585
26652
  const { t } = reactI18next.useTranslation();
26586
- const { dragY, handlers: dragHandlers } = chunkZSZ2WR4A_js.useSheetDismissDrag(onClose);
26653
+ const { dragY, handlers: dragHandlers } = chunk2GATFIDB_js.useSheetDismissDrag(onClose);
26587
26654
  const {
26588
26655
  animationPanelHeight,
26589
26656
  effectiveThemeOptions,
@@ -26604,7 +26671,7 @@ function InspectorPane(props) {
26604
26671
  /* @__PURE__ */ jsxRuntime.jsxs(
26605
26672
  "div",
26606
26673
  {
26607
- className: chunkZSZ2WR4A_js.cn(
26674
+ className: chunk2GATFIDB_js.cn(
26608
26675
  // Shared styles
26609
26676
  "bg-background flex flex-col text-xs text-foreground shadow-xl",
26610
26677
  // Mobile: absolute bottom sheet overlay sized via dvh so it
@@ -26642,7 +26709,7 @@ function InspectorPane(props) {
26642
26709
  ),
26643
26710
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 overflow-y-auto p-3 space-y-3", children: [
26644
26711
  activeTab === "elements" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
26645
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkZSZ2WR4A_js.cn(HEADING, "mb-2"), children: t("pptx.inspector.layerOrder") }),
26712
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunk2GATFIDB_js.cn(HEADING, "mb-2"), children: t("pptx.inspector.layerOrder") }),
26646
26713
  activeSlide ? [...activeSlide.elements || []].reverse().map((el, ri) => {
26647
26714
  const idx = (activeSlide.elements || []).length - 1 - ri;
26648
26715
  const sel = selectedElement?.id === el.id || selectedElementIds.includes(el.id);
@@ -26651,7 +26718,7 @@ function InspectorPane(props) {
26651
26718
  "div",
26652
26719
  {
26653
26720
  title: `${el.type} \u2014 ${el.id}`,
26654
- className: chunkZSZ2WR4A_js.cn(
26721
+ className: chunk2GATFIDB_js.cn(
26655
26722
  "flex items-center gap-2 px-2 py-1 rounded cursor-pointer transition-colors",
26656
26723
  sel ? "bg-primary/30 text-primary" : "hover:bg-muted text-foreground"
26657
26724
  ),
@@ -27255,7 +27322,7 @@ function PresentationTouchControls({
27255
27322
  hideNavigation = false
27256
27323
  }) {
27257
27324
  const { t } = reactI18next.useTranslation();
27258
- const { isTouchDevice } = chunkZSZ2WR4A_js.useIsMobile();
27325
+ const { isTouchDevice } = chunk2GATFIDB_js.useIsMobile();
27259
27326
  if (!isTouchDevice) {
27260
27327
  return null;
27261
27328
  }
@@ -27956,7 +28023,7 @@ function PrintDialog({
27956
28023
  defaultFrameSlides
27957
28024
  }) {
27958
28025
  const { t } = reactI18next.useTranslation();
27959
- const { panelStyle, handlers: dragHandlers } = chunkZSZ2WR4A_js.useModalDismissDrag(onClose);
28026
+ const { panelStyle, handlers: dragHandlers } = chunk2GATFIDB_js.useModalDismissDrag(onClose);
27960
28027
  const [printWhat, setPrintWhat] = React18.useState("slides");
27961
28028
  const [orientation, setOrientation] = React18.useState("landscape");
27962
28029
  const [colorMode, setColorMode] = React18.useState("color");
@@ -28485,7 +28552,7 @@ function BroadcastDialog({
28485
28552
  const [serverUrl, setServerUrl] = React18.useState("");
28486
28553
  const [copied, setCopied] = React18.useState(false);
28487
28554
  const dialogRef = React18.useRef(null);
28488
- const { panelStyle, handlers: dragHandlers } = chunkZSZ2WR4A_js.useModalDismissDrag(onClose);
28555
+ const { panelStyle, handlers: dragHandlers } = chunk2GATFIDB_js.useModalDismissDrag(onClose);
28489
28556
  useModalFocus(open, dialogRef, onClose);
28490
28557
  React18.useEffect(() => {
28491
28558
  if (open && !isBroadcasting) {
@@ -29048,7 +29115,7 @@ function ShareDialog({
29048
29115
  const [invitation, setInvitation] = React18.useState("");
29049
29116
  const [copied, setCopied] = React18.useState(false);
29050
29117
  const dialogRef = React18.useRef(null);
29051
- const { panelStyle, handlers: dragHandlers } = chunkZSZ2WR4A_js.useModalDismissDrag(onClose);
29118
+ const { panelStyle, handlers: dragHandlers } = chunk2GATFIDB_js.useModalDismissDrag(onClose);
29052
29119
  useModalFocus(open, dialogRef, onClose);
29053
29120
  React18.useEffect(() => {
29054
29121
  if (activeCollaboration) {
@@ -29323,12 +29390,12 @@ function HyperlinkEditDialog({
29323
29390
  onCancel
29324
29391
  }) {
29325
29392
  const { t } = reactI18next.useTranslation();
29326
- const { panelStyle, handlers: dragHandlers } = chunkZSZ2WR4A_js.useModalDismissDrag(onCancel);
29393
+ const { panelStyle, handlers: dragHandlers } = chunk2GATFIDB_js.useModalDismissDrag(onCancel);
29327
29394
  const inputRef = React18.useRef(null);
29328
- const detectedType = chunkZSZ2WR4A_js.detectTargetType(initialUrl, initialAction);
29329
- const emailParts = chunkZSZ2WR4A_js.parseEmailUrl(initialUrl || "");
29330
- const detectedSlide = chunkZSZ2WR4A_js.parseSlideFromUrl(initialUrl, initialAction);
29331
- const detectedVerb = initialAction ? chunkZSZ2WR4A_js.ACTION_VERB_MAP[initialAction.toLowerCase()] || "nextSlide" : "nextSlide";
29395
+ const detectedType = chunk2GATFIDB_js.detectTargetType(initialUrl, initialAction);
29396
+ const emailParts = chunk2GATFIDB_js.parseEmailUrl(initialUrl || "");
29397
+ const detectedSlide = chunk2GATFIDB_js.parseSlideFromUrl(initialUrl, initialAction);
29398
+ const detectedVerb = initialAction ? chunk2GATFIDB_js.ACTION_VERB_MAP[initialAction.toLowerCase()] || "nextSlide" : "nextSlide";
29332
29399
  const [targetType, setTargetType] = React18.useState(detectedType);
29333
29400
  const [url, setUrl] = React18.useState(
29334
29401
  detectedType === "email" || detectedType === "slide" || detectedType === "action" ? "" : initialUrl || ""
@@ -29359,7 +29426,7 @@ function HyperlinkEditDialog({
29359
29426
  actionVerb
29360
29427
  });
29361
29428
  };
29362
- const tabCls = (active) => chunkZSZ2WR4A_js.cn(
29429
+ const tabCls = (active) => chunk2GATFIDB_js.cn(
29363
29430
  "px-3 py-1.5 text-xs rounded-t border-b-2 transition-colors",
29364
29431
  active ? "border-primary text-primary font-medium" : "border-transparent text-muted-foreground hover:text-foreground hover:border-border"
29365
29432
  );
@@ -29574,7 +29641,7 @@ function ViewerBottomPanels({
29574
29641
  hideStatusBar = false,
29575
29642
  hiddenActions
29576
29643
  }) {
29577
- const { isHidden } = chunkZSZ2WR4A_js.useToolbarVisibility(hiddenActions);
29644
+ const { isHidden } = chunk2GATFIDB_js.useToolbarVisibility(hiddenActions);
29578
29645
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
29579
29646
  onResizeBottom && !isSlideNotesCollapsed && /* @__PURE__ */ jsxRuntime.jsx(ResizeHandle, { direction: "vertical", onResize: onResizeBottom }),
29580
29647
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -29754,7 +29821,7 @@ function ViewerInspector({
29754
29821
  function TitleBar(p) {
29755
29822
  const { t } = reactI18next.useTranslation();
29756
29823
  const editing = (p.mode === "edit" || p.mode === "master") && p.canEdit;
29757
- const { isHidden } = chunkZSZ2WR4A_js.useToolbarVisibility(p.hiddenActions);
29824
+ const { isHidden } = chunk2GATFIDB_js.useToolbarVisibility(p.hiddenActions);
29758
29825
  const [searchQuery, setSearchQuery] = React18.useState("");
29759
29826
  const [searchFocused, setSearchFocused] = React18.useState(false);
29760
29827
  const searchRef = React18.useRef(null);
@@ -29810,7 +29877,7 @@ function TitleBar(p) {
29810
29877
  role: "switch",
29811
29878
  "aria-checked": p.autosaveEnabled,
29812
29879
  onClick: p.onToggleAutosave,
29813
- className: chunkZSZ2WR4A_js.cn(
29880
+ className: chunk2GATFIDB_js.cn(
29814
29881
  chunkDHNQHQ66_js.TITLE_BAR_CLASSES.toggleTrack,
29815
29882
  p.autosaveEnabled ? chunkDHNQHQ66_js.TITLE_BAR_CLASSES.toggleTrackOn : chunkDHNQHQ66_js.TITLE_BAR_CLASSES.toggleTrackOff
29816
29883
  ),
@@ -29819,7 +29886,7 @@ function TitleBar(p) {
29819
29886
  children: /* @__PURE__ */ jsxRuntime.jsx(
29820
29887
  "span",
29821
29888
  {
29822
- className: chunkZSZ2WR4A_js.cn(
29889
+ className: chunk2GATFIDB_js.cn(
29823
29890
  chunkDHNQHQ66_js.TITLE_BAR_CLASSES.toggleKnob,
29824
29891
  p.autosaveEnabled ? chunkDHNQHQ66_js.TITLE_BAR_CLASSES.toggleKnobOn : chunkDHNQHQ66_js.TITLE_BAR_CLASSES.toggleKnobOff
29825
29892
  )
@@ -29874,7 +29941,7 @@ function TitleBar(p) {
29874
29941
  /* @__PURE__ */ jsxRuntime.jsx(
29875
29942
  "span",
29876
29943
  {
29877
- className: chunkZSZ2WR4A_js.cn(
29944
+ className: chunk2GATFIDB_js.cn(
29878
29945
  chunkDHNQHQ66_js.TITLE_BAR_CLASSES.statusText,
29879
29946
  p.autosaveStatus?.state === "error" && p.autosaveEnabled && chunkDHNQHQ66_js.TITLE_BAR_CLASSES.statusError,
29880
29947
  p.autosaveStatus?.state === "saving" && p.autosaveEnabled && chunkDHNQHQ66_js.TITLE_BAR_CLASSES.statusSaving
@@ -29888,7 +29955,7 @@ function TitleBar(p) {
29888
29955
  /* @__PURE__ */ jsxRuntime.jsxs(
29889
29956
  "div",
29890
29957
  {
29891
- className: chunkZSZ2WR4A_js.cn(
29958
+ className: chunk2GATFIDB_js.cn(
29892
29959
  chunkDHNQHQ66_js.TITLE_BAR_CLASSES.searchBox,
29893
29960
  (searchFocused || p.findReplaceOpen) && "text-foreground bg-background"
29894
29961
  ),
@@ -29980,6 +30047,8 @@ function ViewerToolbarSection(props) {
29980
30047
  onOpenHeaderFooter,
29981
30048
  onOpenShareDialog,
29982
30049
  onOpenFile,
30050
+ onUploadCustomFontPackage,
30051
+ onEmbedCustomFonts,
29983
30052
  onOpenRecentFile,
29984
30053
  onToggleFormatPainter: onToggleFormatPainterProp,
29985
30054
  fileName,
@@ -30036,7 +30105,7 @@ function ViewerToolbarSection(props) {
30036
30105
  [activeSlide, propertyHandlers]
30037
30106
  );
30038
30107
  const scopedLayoutOptions = React18__default.default.useMemo(
30039
- () => chunkZSZ2WR4A_js.scopeLayoutOptionsToActiveSlide(s.layoutOptions, activeSlide),
30108
+ () => chunk2GATFIDB_js.scopeLayoutOptionsToActiveSlide(s.layoutOptions, activeSlide),
30040
30109
  [s.layoutOptions, activeSlide]
30041
30110
  );
30042
30111
  const handleApplyTransitionToAll = React18.useCallback(() => {
@@ -30314,6 +30383,8 @@ function ViewerToolbarSection(props) {
30314
30383
  body: s.theme?.fontScheme?.minorFont?.latin
30315
30384
  },
30316
30385
  embeddedFontFamilies: Array.from(new Set(s.embeddedFonts.map((font) => font.name))),
30386
+ onUploadCustomFontPackage,
30387
+ onEmbedCustomFonts,
30317
30388
  onInsertSlideFromLayout: slideOps.handleInsertSlideFromLayout,
30318
30389
  onApplyLayout: (path) => void onApplyLayout(path),
30319
30390
  customShows: s.customShows,
@@ -30435,7 +30506,7 @@ function EquationEditorDialog({
30435
30506
  existingOmml
30436
30507
  }) {
30437
30508
  const { t } = reactI18next.useTranslation();
30438
- const { panelStyle, handlers: dragHandlers } = chunkZSZ2WR4A_js.useModalDismissDrag(onClose);
30509
+ const { panelStyle, handlers: dragHandlers } = chunk2GATFIDB_js.useModalDismissDrag(onClose);
30439
30510
  const initialLatex = React18.useMemo(() => {
30440
30511
  if (!existingOmml) {
30441
30512
  return "";
@@ -30568,7 +30639,7 @@ function EquationEditorDialog({
30568
30639
  {
30569
30640
  type: "button",
30570
30641
  onClick: () => handleTemplateClick(tmpl.latex),
30571
- className: chunkZSZ2WR4A_js.cn(
30642
+ className: chunk2GATFIDB_js.cn(
30572
30643
  "flex flex-col items-center gap-1 p-2 rounded-lg border transition-colors",
30573
30644
  latex === tmpl.latex ? "border-primary bg-primary/10" : "border-border bg-muted/40 hover:bg-accent/60 hover:border-border"
30574
30645
  ),
@@ -30667,7 +30738,7 @@ function InsertSmartArtDialog({
30667
30738
  onInsert
30668
30739
  }) {
30669
30740
  const { t } = reactI18next.useTranslation();
30670
- const { panelStyle, handlers: dragHandlers } = chunkZSZ2WR4A_js.useModalDismissDrag(onClose);
30741
+ const { panelStyle, handlers: dragHandlers } = chunk2GATFIDB_js.useModalDismissDrag(onClose);
30671
30742
  const [activeCategory, setActiveCategory] = React18.useState("list");
30672
30743
  const [selectedLayout, setSelectedLayout] = React18.useState(null);
30673
30744
  const dialogRef = React18.useRef(null);
@@ -30748,7 +30819,7 @@ function InsertSmartArtDialog({
30748
30819
  setActiveCategory(cat.id);
30749
30820
  setSelectedLayout(null);
30750
30821
  },
30751
- className: chunkZSZ2WR4A_js.cn(
30822
+ className: chunk2GATFIDB_js.cn(
30752
30823
  "w-full text-left px-3 py-1.5 text-xs transition-colors",
30753
30824
  activeCategory === cat.id ? "bg-primary text-white" : "text-foreground hover:bg-muted"
30754
30825
  ),
@@ -30776,7 +30847,7 @@ function InsertSmartArtDialog({
30776
30847
  onInsert(preset.layout, preset.defaultItems);
30777
30848
  onClose();
30778
30849
  },
30779
- className: chunkZSZ2WR4A_js.cn(
30850
+ className: chunk2GATFIDB_js.cn(
30780
30851
  "flex flex-col items-center gap-1 p-2 rounded border transition-colors",
30781
30852
  selectedLayout === preset.layout ? "border-primary bg-primary/20" : "border-border hover:border-border hover:bg-muted/50"
30782
30853
  ),
@@ -30806,7 +30877,7 @@ function InsertSmartArtDialog({
30806
30877
  type: "button",
30807
30878
  onClick: handleInsert,
30808
30879
  disabled: !selectedLayout,
30809
- className: chunkZSZ2WR4A_js.cn(
30880
+ className: chunk2GATFIDB_js.cn(
30810
30881
  "px-3 py-1.5 text-xs rounded transition-colors",
30811
30882
  selectedLayout ? "bg-primary hover:bg-primary/80 text-white" : "bg-muted text-muted-foreground cursor-not-allowed"
30812
30883
  ),
@@ -31185,7 +31256,7 @@ function ViewerCanvasArea(props) {
31185
31256
  aiCanvasActive = false
31186
31257
  } = props;
31187
31258
  const { t } = reactI18next.useTranslation();
31188
- const { isHidden } = chunkZSZ2WR4A_js.useToolbarVisibility(hiddenActions);
31259
+ const { isHidden } = chunk2GATFIDB_js.useToolbarVisibility(hiddenActions);
31189
31260
  const viewerOptions = useViewerOptionsContext();
31190
31261
  const effectiveSlide = mode === "master" ? masterPseudoSlide : activeSlide;
31191
31262
  const effectiveTemplateElements = mode === "master" ? s.activeLayout ? s.activeMaster?.elements ?? [] : [] : templateElements;
@@ -31302,7 +31373,7 @@ ${url}`)) {
31302
31373
  s.setActiveSlideIndex((i) => Math.max(0, i - 1));
31303
31374
  }
31304
31375
  }, [mode, presentation, s]);
31305
- const swipe = chunkZSZ2WR4A_js.useSwipeNavigation({
31376
+ const swipe = chunk2GATFIDB_js.useSwipeNavigation({
31306
31377
  enabled: swipeEnabled,
31307
31378
  onNext: handleSwipeNext,
31308
31379
  onPrev: handleSwipePrev
@@ -32188,7 +32259,7 @@ function MobileDismissSheet({
32188
32259
  className,
32189
32260
  children
32190
32261
  }) {
32191
- const { dragY, handlers } = chunkZSZ2WR4A_js.useSheetDismissDrag(onClose);
32262
+ const { dragY, handlers } = chunk2GATFIDB_js.useSheetDismissDrag(onClose);
32192
32263
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
32193
32264
  /* @__PURE__ */ jsxRuntime.jsx(
32194
32265
  "button",
@@ -32457,7 +32528,7 @@ function ThemeThumbnail({
32457
32528
  {
32458
32529
  type: "button",
32459
32530
  onClick,
32460
- className: chunkZSZ2WR4A_js.cn(
32531
+ className: chunk2GATFIDB_js.cn(
32461
32532
  "group relative flex flex-col rounded-lg border-2 transition-all overflow-hidden",
32462
32533
  selected ? "border-primary shadow-lg scale-[1.02]" : "border-border hover:border-primary/50 hover:shadow-md"
32463
32534
  ),
@@ -33150,7 +33221,7 @@ function MobileBottomBar({
33150
33221
  {
33151
33222
  type: "button",
33152
33223
  onClick,
33153
- className: chunkZSZ2WR4A_js.cn(
33224
+ className: chunk2GATFIDB_js.cn(
33154
33225
  "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",
33155
33226
  active ? "text-primary" : "text-muted-foreground hover:text-foreground"
33156
33227
  ),
@@ -33198,7 +33269,7 @@ function MobileChromeOverlay(props) {
33198
33269
  canEdit,
33199
33270
  commentCount
33200
33271
  } = props;
33201
- const { keyboardInset, isKeyboardOpen } = chunkZSZ2WR4A_js.useKeyboardInsets();
33272
+ const { keyboardInset, isKeyboardOpen } = chunk2GATFIDB_js.useKeyboardInsets();
33202
33273
  const activeSheet = s.isSlidesPaneOpen ? "slides" : s.isInspectorPaneOpen ? s.sidebarPanelMode === "comments" ? "comments" : "inspector" : !s.isSlideNotesCollapsed ? "notes" : null;
33203
33274
  const closeAllSheets = () => {
33204
33275
  s.setIsSlidesPaneOpen(false);
@@ -33295,7 +33366,7 @@ function AddinTable({
33295
33366
  "tr",
33296
33367
  {
33297
33368
  onClick: () => onSelect(row.id),
33298
- className: chunkZSZ2WR4A_js.cn(
33369
+ className: chunk2GATFIDB_js.cn(
33299
33370
  "cursor-pointer border-b border-border/40 transition-colors",
33300
33371
  selectedId === row.id ? "bg-primary/10" : "hover:bg-accent"
33301
33372
  ),
@@ -33364,9 +33435,9 @@ function ControlRow({
33364
33435
  const value = readValue(options, control);
33365
33436
  const label = t(control.labelKey);
33366
33437
  const info = control.infoKey ? /* @__PURE__ */ jsxRuntime.jsx(InfoTip, { text: t(control.infoKey) }) : null;
33367
- const rowClass = chunkZSZ2WR4A_js.cn("flex items-center justify-between gap-3 py-1.5", control.indent && "pl-6");
33438
+ const rowClass = chunk2GATFIDB_js.cn("flex items-center justify-between gap-3 py-1.5", control.indent && "pl-6");
33368
33439
  if (control.kind === "toggle") {
33369
- return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: chunkZSZ2WR4A_js.cn(rowClass, "cursor-pointer select-none"), children: [
33440
+ return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: chunk2GATFIDB_js.cn(rowClass, "cursor-pointer select-none"), children: [
33370
33441
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm text-foreground", children: [
33371
33442
  label,
33372
33443
  info
@@ -33505,7 +33576,7 @@ function CommandList({
33505
33576
  role: "option",
33506
33577
  "aria-selected": selectedId === id,
33507
33578
  onClick: () => onSelect(id),
33508
- className: chunkZSZ2WR4A_js.cn(
33579
+ className: chunk2GATFIDB_js.cn(
33509
33580
  "flex w-full items-center rounded px-2 py-1.5 text-left text-sm transition-colors",
33510
33581
  selectedId === id ? "bg-primary/15 text-primary" : "text-foreground hover:bg-accent"
33511
33582
  ),
@@ -33649,7 +33720,7 @@ function OptionsRibbonPane({
33649
33720
  return /* @__PURE__ */ jsxRuntime.jsxs(
33650
33721
  "label",
33651
33722
  {
33652
- className: chunkZSZ2WR4A_js.cn(
33723
+ className: chunk2GATFIDB_js.cn(
33653
33724
  "flex items-center gap-2 rounded px-2 py-1.5",
33654
33725
  isFile ? "cursor-not-allowed opacity-60" : "cursor-pointer hover:bg-accent"
33655
33726
  ),
@@ -33685,7 +33756,7 @@ function OptionsRibbonPane({
33685
33756
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: chunkDHNQHQ66_js.SHORTCUT_REFERENCE_ITEMS.map((shortcut, i) => /* @__PURE__ */ jsxRuntime.jsxs(
33686
33757
  "div",
33687
33758
  {
33688
- className: chunkZSZ2WR4A_js.cn(
33759
+ className: chunk2GATFIDB_js.cn(
33689
33760
  "flex items-center justify-between gap-3 rounded px-3 py-2",
33690
33761
  i % 2 === 0 ? "bg-muted/60" : ""
33691
33762
  ),
@@ -33720,7 +33791,7 @@ function SettingsAppearanceTab({
33720
33791
  type: "button",
33721
33792
  onClick: () => onSelectTheme(entry.key),
33722
33793
  "aria-pressed": isActive,
33723
- className: chunkZSZ2WR4A_js.cn(
33794
+ className: chunk2GATFIDB_js.cn(
33724
33795
  "flex items-center gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors",
33725
33796
  isActive ? "border-primary bg-primary/10" : "border-border hover:border-primary/50 hover:bg-accent"
33726
33797
  ),
@@ -33737,7 +33808,7 @@ function SettingsAppearanceTab({
33737
33808
  /* @__PURE__ */ jsxRuntime.jsx(
33738
33809
  "span",
33739
33810
  {
33740
- className: chunkZSZ2WR4A_js.cn("text-xs font-medium", isActive ? "text-primary" : "text-foreground"),
33811
+ className: chunk2GATFIDB_js.cn("text-xs font-medium", isActive ? "text-primary" : "text-foreground"),
33741
33812
  children: t(entry.labelKey)
33742
33813
  }
33743
33814
  )
@@ -33760,7 +33831,7 @@ function SettingsLanguageTab({
33760
33831
  type: "button",
33761
33832
  onClick: () => onSelectLocale(locale.code),
33762
33833
  "aria-pressed": isActive,
33763
- className: chunkZSZ2WR4A_js.cn(
33834
+ className: chunk2GATFIDB_js.cn(
33764
33835
  "flex w-full items-center justify-between rounded px-3 py-2.5 text-left transition-colors",
33765
33836
  isActive ? "bg-primary/10 text-primary" : "text-foreground hover:bg-accent"
33766
33837
  ),
@@ -33796,7 +33867,7 @@ function SettingsDialog({
33796
33867
  }) {
33797
33868
  const [activeTabId, setActiveTabId] = React18.useState("general");
33798
33869
  const { t } = reactI18next.useTranslation();
33799
- const { panelStyle, handlers: dragHandlers } = chunkZSZ2WR4A_js.useModalDismissDrag(onClose);
33870
+ const { panelStyle, handlers: dragHandlers } = chunk2GATFIDB_js.useModalDismissDrag(onClose);
33800
33871
  const snapshotRef = React18.useRef(null);
33801
33872
  const wasOpenRef = React18.useRef(false);
33802
33873
  React18.useEffect(() => {
@@ -33893,7 +33964,7 @@ function SettingsDialog({
33893
33964
  type: "button",
33894
33965
  onClick: () => setActiveTabId(tab.id),
33895
33966
  "aria-current": activeTabId === tab.id,
33896
- className: chunkZSZ2WR4A_js.cn(
33967
+ className: chunk2GATFIDB_js.cn(
33897
33968
  "block w-full whitespace-nowrap rounded px-3 py-2 text-left text-sm transition-colors max-md:w-auto",
33898
33969
  activeTabId === tab.id ? "bg-primary/10 font-medium text-primary" : "text-foreground hover:bg-accent"
33899
33970
  ),
@@ -33907,7 +33978,7 @@ function SettingsDialog({
33907
33978
  type: "button",
33908
33979
  onClick: () => setActiveTabId(AI_TAB_ID),
33909
33980
  "aria-current": activeTabId === AI_TAB_ID,
33910
- className: chunkZSZ2WR4A_js.cn(
33981
+ className: chunk2GATFIDB_js.cn(
33911
33982
  "block w-full whitespace-nowrap rounded px-3 py-2 text-left text-sm transition-colors max-md:w-auto",
33912
33983
  activeTabId === AI_TAB_ID ? "bg-primary/10 font-medium text-primary" : "text-foreground hover:bg-accent"
33913
33984
  ),
@@ -34039,6 +34110,7 @@ var PowerPointViewer = React18.forwardRef(
34039
34110
  content: incomingContent,
34040
34111
  singleSlideOnly = false,
34041
34112
  fonts = [],
34113
+ onUploadCustomFontPackage,
34042
34114
  filePath,
34043
34115
  fileName,
34044
34116
  canEdit = false,
@@ -34168,8 +34240,8 @@ var PowerPointViewer = React18.forwardRef(
34168
34240
  const [isHeaderFooterOpen, setIsHeaderFooterOpen] = React18.useState(false);
34169
34241
  const [autosaveEnabled, setAutosaveEnabled] = React18.useState(true);
34170
34242
  const [isShareDialogOpen, setIsShareDialogOpen] = React18.useState(false);
34171
- const { reducedMotion, toggleReducedMotion } = chunkZSZ2WR4A_js.useReducedMotion();
34172
- const state = chunkZSZ2WR4A_js.useViewerState({ content, canEdit });
34243
+ const { reducedMotion, toggleReducedMotion } = chunk2GATFIDB_js.useReducedMotion();
34244
+ const state = chunk2GATFIDB_js.useViewerState({ content, canEdit });
34173
34245
  const {
34174
34246
  containerRef,
34175
34247
  mode,
@@ -34229,7 +34301,7 @@ var PowerPointViewer = React18.forwardRef(
34229
34301
  },
34230
34302
  [state, reducedMotion, toggleReducedMotion]
34231
34303
  );
34232
- const { optionsStore, options: viewerOptions } = chunkZSZ2WR4A_js.useViewerOptions();
34304
+ const { optionsStore, options: viewerOptions } = chunk2GATFIDB_js.useViewerOptions();
34233
34305
  const settingsRef = React18.useRef(settings);
34234
34306
  settingsRef.current = settings;
34235
34307
  const syncingFromOptionsRef = React18.useRef(false);
@@ -34272,10 +34344,10 @@ var PowerPointViewer = React18.forwardRef(
34272
34344
  await Promise.all(snapshots.map((entry) => chunkDHNQHQ66_js.deleteAutosaveSnapshot(entry.key)));
34273
34345
  })();
34274
34346
  }, []);
34275
- const mobile = chunkZSZ2WR4A_js.useIsMobile({ containerRef });
34347
+ const mobile = chunk2GATFIDB_js.useIsMobile({ containerRef });
34276
34348
  const { isMobile, isTouchDevice, isVirtualKeyboardOpen } = mobile;
34277
- const resizablePanels = chunkZSZ2WR4A_js.useResizablePanels();
34278
- const { gridSpacingPx, visibleSlideIndexes, slideSectionGroups, masterPseudoSlide } = chunkZSZ2WR4A_js.useDerivedSlideState({
34349
+ const resizablePanels = chunk2GATFIDB_js.useResizablePanels();
34350
+ const { gridSpacingPx, visibleSlideIndexes, slideSectionGroups, masterPseudoSlide } = chunk2GATFIDB_js.useDerivedSlideState({
34279
34351
  slides,
34280
34352
  sections: state.sections,
34281
34353
  customShows: state.customShows,
@@ -34297,11 +34369,11 @@ var PowerPointViewer = React18.forwardRef(
34297
34369
  state.isDrawingRef
34298
34370
  ]
34299
34371
  );
34300
- const zoom = chunkZSZ2WR4A_js.useZoomViewport({
34372
+ const zoom = chunk2GATFIDB_js.useZoomViewport({
34301
34373
  canvasSize,
34302
34374
  selectedElements: state.selectedElements
34303
34375
  });
34304
- const history = chunkZSZ2WR4A_js.useEditorHistory({
34376
+ const history = chunk2GATFIDB_js.useEditorHistory({
34305
34377
  slides,
34306
34378
  canvasSize,
34307
34379
  activeSlideIndex,
@@ -34323,7 +34395,7 @@ var PowerPointViewer = React18.forwardRef(
34323
34395
  setEditTemplateMode: state.setEditTemplateMode,
34324
34396
  setHeaderFooter: state.setHeaderFooter
34325
34397
  });
34326
- const { presentation, annotations, actionSoundHandlerRef } = chunkZSZ2WR4A_js.usePresentationSetup({
34398
+ const { presentation, annotations, actionSoundHandlerRef } = chunk2GATFIDB_js.usePresentationSetup({
34327
34399
  mode,
34328
34400
  slides,
34329
34401
  visibleSlideIndexes,
@@ -34337,7 +34409,7 @@ var PowerPointViewer = React18.forwardRef(
34337
34409
  setSlides: state.setSlides,
34338
34410
  history
34339
34411
  });
34340
- chunkZSZ2WR4A_js.useTouchGestures({
34412
+ chunk2GATFIDB_js.useTouchGestures({
34341
34413
  targetRef: zoom.canvasViewportRef,
34342
34414
  currentScale: zoom.scale,
34343
34415
  callbacks: {
@@ -34359,7 +34431,7 @@ var PowerPointViewer = React18.forwardRef(
34359
34431
  },
34360
34432
  enabled: isTouchDevice
34361
34433
  });
34362
- const dialogs = chunkZSZ2WR4A_js.useViewerDialogs({
34434
+ const dialogs = chunk2GATFIDB_js.useViewerDialogs({
34363
34435
  mode,
34364
34436
  slides,
34365
34437
  activeSlide,
@@ -34400,7 +34472,7 @@ var PowerPointViewer = React18.forwardRef(
34400
34472
  zoom.handleZoomToFit();
34401
34473
  zoom.canvasViewportRef.current?.scrollTo({ left: 0, top: 0 });
34402
34474
  }, [mode]);
34403
- const editorOps = chunkZSZ2WR4A_js.useEditorOperations({
34475
+ const editorOps = chunk2GATFIDB_js.useEditorOperations({
34404
34476
  state,
34405
34477
  history,
34406
34478
  zoom,
@@ -34434,7 +34506,7 @@ var PowerPointViewer = React18.forwardRef(
34434
34506
  setIsEncryptedDialogOpen,
34435
34507
  handlerRef,
34436
34508
  loadVersion
34437
- } = chunkZSZ2WR4A_js.useViewerIntegration({
34509
+ } = chunk2GATFIDB_js.useViewerIntegration({
34438
34510
  state,
34439
34511
  zoom,
34440
34512
  history,
@@ -34465,7 +34537,7 @@ var PowerPointViewer = React18.forwardRef(
34465
34537
  onSelectionChange,
34466
34538
  onSlideCountChange
34467
34539
  });
34468
- const layoutSwitching = chunkZSZ2WR4A_js.useLayoutSwitching({
34540
+ const layoutSwitching = chunk2GATFIDB_js.useLayoutSwitching({
34469
34541
  handler: handlerRef.current,
34470
34542
  slides,
34471
34543
  activeSlideIndex,
@@ -34572,7 +34644,22 @@ var PowerPointViewer = React18.forwardRef(
34572
34644
  hiddenActions,
34573
34645
  aiEnabled: Boolean(ai),
34574
34646
  isAiPanelOpen: aiPanel.isOpen,
34575
- onToggleAiPanel: aiPanel.toggle
34647
+ onToggleAiPanel: aiPanel.toggle,
34648
+ onUploadCustomFontPackage,
34649
+ onEmbedCustomFonts: (fonts2) => {
34650
+ state.setEmbeddedFonts((current) => {
34651
+ const merged = [...current];
34652
+ for (const font of fonts2) {
34653
+ const index = merged.findIndex(
34654
+ (existing) => existing.name === font.name && Boolean(existing.bold) === Boolean(font.bold) && Boolean(existing.italic) === Boolean(font.italic)
34655
+ );
34656
+ if (index >= 0) merged[index] = font;
34657
+ else merged.push(font);
34658
+ }
34659
+ return merged;
34660
+ });
34661
+ state.setIsDirty(true);
34662
+ }
34576
34663
  }
34577
34664
  ),
34578
34665
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -34865,7 +34952,7 @@ function CollaborationDocumentSync({
34865
34952
  }
34866
34953
  return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
34867
34954
  }, []);
34868
- chunkZSZ2WR4A_js.useYjsDocumentSync({
34955
+ chunk2GATFIDB_js.useYjsDocumentSync({
34869
34956
  doc: collab?.doc ?? null,
34870
34957
  slides,
34871
34958
  templateElementsBySlideId,
@@ -34884,13 +34971,13 @@ function CollaborationFollowLayer({
34884
34971
  slideCount
34885
34972
  }) {
34886
34973
  const collab = useCollaboration();
34887
- const { followedClientId, followUser } = chunkZSZ2WR4A_js.useFollowMode({
34974
+ const { followedClientId, followUser } = chunk2GATFIDB_js.useFollowMode({
34888
34975
  collab,
34889
34976
  activeSlideIndex,
34890
34977
  setActiveSlideIndex,
34891
34978
  slideCount
34892
34979
  });
34893
- chunkZSZ2WR4A_js.useBroadcastFollower({
34980
+ chunk2GATFIDB_js.useBroadcastFollower({
34894
34981
  collab,
34895
34982
  activeSlideIndex,
34896
34983
  setActiveSlideIndex,