pptx-react-viewer 2.6.5 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/{AiChatPanel-GMP3TU7S.js → AiChatPanel-G6DKXSM3.js} +22 -22
  3. package/dist/AiChatPanel-G6DKXSM3.js.br +0 -0
  4. package/dist/AiChatPanel-G6DKXSM3.js.gz +0 -0
  5. package/dist/{AiChatPanel-5JEL2M7L.mjs → AiChatPanel-J5IGSCYA.mjs} +3 -3
  6. package/dist/AiChatPanel-J5IGSCYA.mjs.br +0 -0
  7. package/dist/AiChatPanel-J5IGSCYA.mjs.gz +0 -0
  8. package/dist/{Model3DScene-LPA4HGFY.mjs → Model3DScene-ID6CQKEJ.mjs} +1 -1
  9. package/dist/Model3DScene-ID6CQKEJ.mjs.br +0 -0
  10. package/dist/Model3DScene-ID6CQKEJ.mjs.gz +0 -0
  11. package/dist/{Model3DScene-E4WWASL7.js → Model3DScene-S7LKZ6IA.js} +2 -2
  12. package/dist/Model3DScene-S7LKZ6IA.js.br +0 -0
  13. package/dist/Model3DScene-S7LKZ6IA.js.gz +0 -0
  14. package/dist/{SurfaceChart3DScene-JT64KYVP.mjs → SurfaceChart3DScene-V5H6MXYW.mjs} +1 -1
  15. package/dist/{SurfaceChart3DScene-JT64KYVP.mjs.br → SurfaceChart3DScene-V5H6MXYW.mjs.br} +0 -0
  16. package/dist/SurfaceChart3DScene-V5H6MXYW.mjs.gz +0 -0
  17. package/dist/{SurfaceChart3DScene-EOJ6FO7H.js → SurfaceChart3DScene-XSJXJM6H.js} +2 -2
  18. package/dist/SurfaceChart3DScene-XSJXJM6H.js.br +0 -0
  19. package/dist/SurfaceChart3DScene-XSJXJM6H.js.gz +0 -0
  20. package/dist/{chunk-Z2ZC5QTJ.js → chunk-2LOBDOTK.js} +165 -22
  21. package/dist/chunk-2LOBDOTK.js.br +0 -0
  22. package/dist/chunk-2LOBDOTK.js.gz +0 -0
  23. package/dist/{chunk-CZPAFVPN.js → chunk-4KMTZLNS.js} +315 -315
  24. package/dist/chunk-4KMTZLNS.js.br +0 -0
  25. package/dist/chunk-4KMTZLNS.js.gz +0 -0
  26. package/dist/{chunk-D754TQ4S.js → chunk-6C4UY7GX.js} +3 -3
  27. package/dist/chunk-6C4UY7GX.js.br +0 -0
  28. package/dist/chunk-6C4UY7GX.js.gz +0 -0
  29. package/dist/{chunk-NZYSI3BL.js → chunk-B4XJTZR4.js} +253 -243
  30. package/dist/chunk-B4XJTZR4.js.br +0 -0
  31. package/dist/chunk-B4XJTZR4.js.gz +0 -0
  32. package/dist/{chunk-FBVQ453Z.js → chunk-GLQFRVAN.js} +851 -845
  33. package/dist/chunk-GLQFRVAN.js.br +0 -0
  34. package/dist/chunk-GLQFRVAN.js.gz +0 -0
  35. package/dist/{chunk-A3WQ6JDW.mjs → chunk-IGKLB7NQ.mjs} +20 -10
  36. package/dist/chunk-IGKLB7NQ.mjs.br +0 -0
  37. package/dist/chunk-IGKLB7NQ.mjs.gz +0 -0
  38. package/dist/{chunk-HHUBO5OD.mjs → chunk-SOLHDKNK.mjs} +1 -1
  39. package/dist/chunk-SOLHDKNK.mjs.br +0 -0
  40. package/dist/chunk-SOLHDKNK.mjs.gz +0 -0
  41. package/dist/{chunk-GMW7VRFD.mjs → chunk-WH46JCNF.mjs} +165 -22
  42. package/dist/chunk-WH46JCNF.mjs.br +0 -0
  43. package/dist/chunk-WH46JCNF.mjs.gz +0 -0
  44. package/dist/{chunk-2QSHMCJH.mjs → chunk-Y4EB65WB.mjs} +15 -9
  45. package/dist/chunk-Y4EB65WB.mjs.br +0 -0
  46. package/dist/chunk-Y4EB65WB.mjs.gz +0 -0
  47. package/dist/{chunk-MVXW7BHH.mjs → chunk-YUHEJWUN.mjs} +2 -2
  48. package/dist/chunk-YUHEJWUN.mjs.br +0 -0
  49. package/dist/chunk-YUHEJWUN.mjs.gz +0 -0
  50. package/dist/index.js +34 -34
  51. package/dist/index.js.br +0 -0
  52. package/dist/index.js.gz +0 -0
  53. package/dist/index.mjs +5 -5
  54. package/dist/index.mjs.br +0 -0
  55. package/dist/index.mjs.gz +0 -0
  56. package/dist/internals.js +78 -78
  57. package/dist/internals.js.br +0 -0
  58. package/dist/internals.js.gz +0 -0
  59. package/dist/internals.mjs +3 -3
  60. package/dist/internals.mjs.br +0 -0
  61. package/dist/internals.mjs.gz +0 -0
  62. package/dist/viewer/index.js +21 -21
  63. package/dist/viewer/index.js.br +0 -0
  64. package/dist/viewer/index.js.gz +0 -0
  65. package/dist/viewer/index.mjs +5 -5
  66. package/dist/viewer/index.mjs.br +0 -0
  67. package/dist/viewer/index.mjs.gz +0 -0
  68. package/package.json +1 -1
  69. package/dist/AiChatPanel-5JEL2M7L.mjs.br +0 -0
  70. package/dist/AiChatPanel-5JEL2M7L.mjs.gz +0 -0
  71. package/dist/AiChatPanel-GMP3TU7S.js.br +0 -0
  72. package/dist/AiChatPanel-GMP3TU7S.js.gz +0 -0
  73. package/dist/Model3DScene-E4WWASL7.js.br +0 -0
  74. package/dist/Model3DScene-E4WWASL7.js.gz +0 -0
  75. package/dist/Model3DScene-LPA4HGFY.mjs.br +0 -0
  76. package/dist/Model3DScene-LPA4HGFY.mjs.gz +0 -0
  77. package/dist/SurfaceChart3DScene-EOJ6FO7H.js.br +0 -0
  78. package/dist/SurfaceChart3DScene-EOJ6FO7H.js.gz +0 -0
  79. package/dist/SurfaceChart3DScene-JT64KYVP.mjs.gz +0 -0
  80. package/dist/chunk-2QSHMCJH.mjs.br +0 -0
  81. package/dist/chunk-2QSHMCJH.mjs.gz +0 -0
  82. package/dist/chunk-A3WQ6JDW.mjs.br +0 -0
  83. package/dist/chunk-A3WQ6JDW.mjs.gz +0 -0
  84. package/dist/chunk-CZPAFVPN.js.br +0 -0
  85. package/dist/chunk-CZPAFVPN.js.gz +0 -0
  86. package/dist/chunk-D754TQ4S.js.br +0 -0
  87. package/dist/chunk-D754TQ4S.js.gz +0 -0
  88. package/dist/chunk-FBVQ453Z.js.br +0 -0
  89. package/dist/chunk-FBVQ453Z.js.gz +0 -0
  90. package/dist/chunk-GMW7VRFD.mjs.br +0 -0
  91. package/dist/chunk-GMW7VRFD.mjs.gz +0 -0
  92. package/dist/chunk-HHUBO5OD.mjs.br +0 -0
  93. package/dist/chunk-HHUBO5OD.mjs.gz +0 -0
  94. package/dist/chunk-MVXW7BHH.mjs.br +0 -0
  95. package/dist/chunk-MVXW7BHH.mjs.gz +0 -0
  96. package/dist/chunk-NZYSI3BL.js.br +0 -0
  97. package/dist/chunk-NZYSI3BL.js.gz +0 -0
  98. package/dist/chunk-Z2ZC5QTJ.js.br +0 -0
  99. package/dist/chunk-Z2ZC5QTJ.js.gz +0 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,12 @@ All notable changes to this project are documented here.
4
4
  This file is generated from [Conventional Commits](https://www.conventionalcommits.org)
5
5
  by [git-cliff](https://git-cliff.org); do not edit it by hand.
6
6
 
7
+ ## [2.6.7](https://github.com/ChristopherVR/pptx-viewer/releases/tag/pptx-react-viewer@2.6.7) - 2026-07-30
8
+
9
+ ## [2.6.6](https://github.com/ChristopherVR/pptx-viewer/releases/tag/pptx-react-viewer@2.6.6) - 2026-07-30
10
+
11
+ ## [2.6.5](https://github.com/ChristopherVR/pptx-viewer/releases/tag/pptx-react-viewer@2.6.5) - 2026-07-30
12
+
7
13
  ## [2.6.4](https://github.com/ChristopherVR/pptx-viewer/releases/tag/pptx-react-viewer@2.6.4) - 2026-07-30
8
14
 
9
15
  ## [2.6.3](https://github.com/ChristopherVR/pptx-viewer/releases/tag/pptx-react-viewer@2.6.3) - 2026-07-30
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var chunkD754TQ4S_js = require('./chunk-D754TQ4S.js');
4
- var chunkNZYSI3BL_js = require('./chunk-NZYSI3BL.js');
3
+ var chunk6C4UY7GX_js = require('./chunk-6C4UY7GX.js');
4
+ var chunkB4XJTZR4_js = require('./chunk-B4XJTZR4.js');
5
5
  require('./chunk-25VSL2BB.js');
6
- require('./chunk-Z2ZC5QTJ.js');
6
+ require('./chunk-2LOBDOTK.js');
7
7
  require('./chunk-4VNS5WPM.js');
8
8
  var react = require('react');
9
9
  var reactI18next = require('react-i18next');
@@ -30,7 +30,7 @@ function useAiChat(bridge, config) {
30
30
  setInitError(void 0);
31
31
  void (async () => {
32
32
  try {
33
- const available = await chunkD754TQ4S_js.isAiAvailable();
33
+ const available = await chunk6C4UY7GX_js.isAiAvailable();
34
34
  if (cancelled) {
35
35
  return;
36
36
  }
@@ -38,7 +38,7 @@ function useAiChat(bridge, config) {
38
38
  setState("unavailable");
39
39
  return;
40
40
  }
41
- const built = await chunkD754TQ4S_js.createAiChatSession(bridge, configRef.current);
41
+ const built = await chunk6C4UY7GX_js.createAiChatSession(bridge, configRef.current);
42
42
  if (cancelled) {
43
43
  return;
44
44
  }
@@ -144,7 +144,7 @@ function withDeckContext(inner, bridge, strategy) {
144
144
  }
145
145
  let context = "";
146
146
  try {
147
- context = await chunkD754TQ4S_js.buildDeckContext(bridge, { strategy, focus: {} });
147
+ context = await chunk6C4UY7GX_js.buildDeckContext(bridge, { strategy, focus: {} });
148
148
  } catch {
149
149
  context = "";
150
150
  }
@@ -207,7 +207,7 @@ function useAiConversation(session, config, bridge, options = {}) {
207
207
  continue;
208
208
  }
209
209
  seen.add(call.toolCallId);
210
- onToolTargetRef.current?.(chunkD754TQ4S_js.toolCanvasTarget(call.toolName, call.input));
210
+ onToolTargetRef.current?.(chunk6C4UY7GX_js.toolCanvasTarget(call.toolName, call.input));
211
211
  }
212
212
  }, [chat.messages]);
213
213
  const send = react.useCallback(
@@ -283,7 +283,7 @@ function deriveTitle(messages) {
283
283
  }
284
284
  function useAiHistory(input) {
285
285
  const { deckId, messages, setMessages } = input;
286
- const store = react.useMemo(() => input.store ?? chunkD754TQ4S_js.createChatHistoryStore(), [input.store]);
286
+ const store = react.useMemo(() => input.store ?? chunk6C4UY7GX_js.createChatHistoryStore(), [input.store]);
287
287
  const [activeChatId, setActiveChatId] = react.useState(newChatId);
288
288
  const [chats, setChats] = react.useState([]);
289
289
  const createdAtRef = react.useRef(Date.now());
@@ -426,7 +426,7 @@ function AiComposer({
426
426
  disabled: value.trim().length === 0,
427
427
  title: t("pptx.ai.send"),
428
428
  "aria-label": t("pptx.ai.send"),
429
- className: chunkNZYSI3BL_js.cn(
429
+ className: chunkB4XJTZR4_js.cn(
430
430
  "shrink-0 rounded-sm p-1.5 transition-colors",
431
431
  value.trim().length === 0 ? "text-muted-foreground/50" : "bg-primary text-primary-foreground hover:bg-primary/90"
432
432
  ),
@@ -452,15 +452,15 @@ function AiFocusBar({
452
452
  onClearPicks
453
453
  }) {
454
454
  const { t } = reactI18next.useTranslation();
455
- const chips = chunkD754TQ4S_js.focusTargetChips(targets, slides);
456
- const twoTables = chunkD754TQ4S_js.isTwoTableFocus(targets, slides);
455
+ const chips = chunk6C4UY7GX_js.focusTargetChips(targets, slides);
456
+ const twoTables = chunk6C4UY7GX_js.isTwoTableFocus(targets, slides);
457
457
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-border bg-secondary/30", children: [
458
458
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1 px-2.5 py-1.5", children: [
459
459
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] font-semibold uppercase tracking-wide text-muted-foreground", children: t("pptx.ai.focusScope") }),
460
460
  chips.map((chip) => /* @__PURE__ */ jsxRuntime.jsx(
461
461
  "span",
462
462
  {
463
- className: chunkNZYSI3BL_js.cn(
463
+ className: chunkB4XJTZR4_js.cn(
464
464
  "inline-flex max-w-[10rem] items-center rounded-full px-2 py-0.5 text-[11px]",
465
465
  hasPicks || isPinned ? "bg-primary/15 text-primary" : "bg-muted text-muted-foreground"
466
466
  ),
@@ -493,7 +493,7 @@ function AiFocusBar({
493
493
  title: t("pptx.ai.pickElement"),
494
494
  "aria-label": t("pptx.ai.pickAria"),
495
495
  "aria-pressed": pickMode,
496
- className: chunkNZYSI3BL_js.cn(
496
+ className: chunkB4XJTZR4_js.cn(
497
497
  "rounded-sm p-1",
498
498
  pickMode ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-accent"
499
499
  ),
@@ -572,7 +572,7 @@ function AiHistoryList({ chats, activeChatId, onResume, onDelete }) {
572
572
  {
573
573
  type: "button",
574
574
  onClick: () => onResume(chat.id),
575
- className: chunkNZYSI3BL_js.cn(
575
+ className: chunkB4XJTZR4_js.cn(
576
576
  "flex min-w-0 flex-1 items-start gap-2 rounded-sm px-2 py-1.5 text-left hover:bg-accent",
577
577
  chat.id === activeChatId && "bg-accent/60"
578
578
  ),
@@ -727,26 +727,26 @@ function AiToolCallCard({ part }) {
727
727
  const failed = part.state === "output-error";
728
728
  const done = part.state === "output-available";
729
729
  const running = !failed && !done;
730
- const activity = chunkD754TQ4S_js.describeToolActivity(part.toolName, part.input, running ? "present" : "past");
730
+ const activity = chunk6C4UY7GX_js.describeToolActivity(part.toolName, part.input, running ? "present" : "past");
731
731
  const Icon = ICONS[activity.icon] ?? lu.LuWrench;
732
- const rawSummary = chunkD754TQ4S_js.summarizeToolArgs(part.input);
732
+ const rawSummary = chunk6C4UY7GX_js.summarizeToolArgs(part.input);
733
733
  const statusLabel = failed ? t("pptx.ai.toolFailed") : done ? t("pptx.ai.toolDone") : t("pptx.ai.toolRunning");
734
734
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-[12px]", children: [
735
735
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
736
736
  /* @__PURE__ */ jsxRuntime.jsx(
737
737
  Icon,
738
738
  {
739
- className: chunkNZYSI3BL_js.cn(
739
+ className: chunkB4XJTZR4_js.cn(
740
740
  "w-3.5 h-3.5 shrink-0",
741
741
  failed ? "text-destructive" : "text-muted-foreground"
742
742
  )
743
743
  }
744
744
  ),
745
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkNZYSI3BL_js.cn("truncate", failed ? "text-destructive" : "text-foreground"), children: activity.label }),
745
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkB4XJTZR4_js.cn("truncate", failed ? "text-destructive" : "text-foreground"), children: activity.label }),
746
746
  /* @__PURE__ */ jsxRuntime.jsxs(
747
747
  "span",
748
748
  {
749
- className: chunkNZYSI3BL_js.cn(
749
+ className: chunkB4XJTZR4_js.cn(
750
750
  "ml-auto inline-flex items-center gap-1 rounded-sm px-1.5 py-0.5 text-[10px]",
751
751
  failed ? "bg-destructive/15 text-destructive" : done ? "bg-primary/10 text-primary" : "bg-muted text-muted-foreground"
752
752
  ),
@@ -763,7 +763,7 @@ function AiToolCallCard({ part }) {
763
763
  rawSummary && /* @__PURE__ */ jsxRuntime.jsxs("details", { className: "group mt-0.5 pl-5", children: [
764
764
  /* @__PURE__ */ jsxRuntime.jsx("summary", { className: "cursor-pointer list-none text-[10px] text-muted-foreground/70 hover:text-muted-foreground", children: t("pptx.ai.toolDetails") }),
765
765
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-0.5 break-words font-mono text-[10px] text-muted-foreground/80", children: [
766
- chunkD754TQ4S_js.toolLabel(part.toolName),
766
+ chunk6C4UY7GX_js.toolLabel(part.toolName),
767
767
  ": ",
768
768
  rawSummary
769
769
  ] })
@@ -794,7 +794,7 @@ function AiMessageList({ messages, isStreaming, bridge }) {
794
794
  /* @__PURE__ */ jsxRuntime.jsx(
795
795
  "div",
796
796
  {
797
- className: chunkNZYSI3BL_js.cn(
797
+ className: chunkB4XJTZR4_js.cn(
798
798
  "mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full",
799
799
  isUser ? "bg-secondary text-muted-foreground" : "bg-primary/15 text-primary"
800
800
  ),
@@ -841,7 +841,7 @@ function AiMessageList({ messages, isStreaming, bridge }) {
841
841
  }
842
842
  function AiProposalCard({ proposal, onAccept, onReject }) {
843
843
  const { t } = reactI18next.useTranslation();
844
- const lines = proposal.summary.map(chunkD754TQ4S_js.humanizeDiffLine);
844
+ const lines = proposal.summary.map(chunk6C4UY7GX_js.humanizeDiffLine);
845
845
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-md border border-primary/40 bg-primary/5 p-2.5", children: [
846
846
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-primary", children: t("pptx.ai.proposedChange") }),
847
847
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[12px] font-medium text-foreground", children: proposal.label }),
Binary file
Binary file
@@ -1,7 +1,7 @@
1
- import { isAiAvailable, createAiChatSession, toolCanvasTarget, createChatHistoryStore, focusTargetChips, isTwoTableFocus, humanizeDiffLine, buildDeckContext, describeToolActivity, summarizeToolArgs, toolLabel } from './chunk-HHUBO5OD.mjs';
2
- import { cn } from './chunk-A3WQ6JDW.mjs';
1
+ import { isAiAvailable, createAiChatSession, toolCanvasTarget, createChatHistoryStore, focusTargetChips, isTwoTableFocus, humanizeDiffLine, buildDeckContext, describeToolActivity, summarizeToolArgs, toolLabel } from './chunk-SOLHDKNK.mjs';
2
+ import { cn } from './chunk-IGKLB7NQ.mjs';
3
3
  import './chunk-Z6HIZWIQ.mjs';
4
- import './chunk-GMW7VRFD.mjs';
4
+ import './chunk-WH46JCNF.mjs';
5
5
  import './chunk-XGB3TDIC.mjs';
6
6
  import { useMemo, useRef, useState, useEffect, useReducer, useCallback } from 'react';
7
7
  import { useTranslation } from 'react-i18next';
Binary file
Binary file
@@ -1,4 +1,4 @@
1
- import { mountModel3D } from './chunk-GMW7VRFD.mjs';
1
+ import { mountModel3D } from './chunk-WH46JCNF.mjs';
2
2
  import './chunk-XGB3TDIC.mjs';
3
3
  import { useRef, useEffect } from 'react';
4
4
  import { jsx } from 'react/jsx-runtime';
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkZ2ZC5QTJ_js = require('./chunk-Z2ZC5QTJ.js');
3
+ var chunk2LOBDOTK_js = require('./chunk-2LOBDOTK.js');
4
4
  require('./chunk-4VNS5WPM.js');
5
5
  var react = require('react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
@@ -14,7 +14,7 @@ function Model3DScene({ modelUrl, interactive, width, height }) {
14
14
  return;
15
15
  }
16
16
  let disposed = false;
17
- void chunkZ2ZC5QTJ_js.mountModel3D(container, modelUrl, { width, height, interactive }).then((handle) => {
17
+ void chunk2LOBDOTK_js.mountModel3D(container, modelUrl, { width, height, interactive }).then((handle) => {
18
18
  if (disposed) {
19
19
  handle.dispose();
20
20
  } else {
Binary file
Binary file
@@ -1,4 +1,4 @@
1
- import { mountSurfaceChart3D } from './chunk-GMW7VRFD.mjs';
1
+ import { mountSurfaceChart3D } from './chunk-WH46JCNF.mjs';
2
2
  import './chunk-XGB3TDIC.mjs';
3
3
  import { useRef, useEffect } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkZ2ZC5QTJ_js = require('./chunk-Z2ZC5QTJ.js');
3
+ var chunk2LOBDOTK_js = require('./chunk-2LOBDOTK.js');
4
4
  require('./chunk-4VNS5WPM.js');
5
5
  var react = require('react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
@@ -25,7 +25,7 @@ function SurfaceChart3DScene({
25
25
  return;
26
26
  }
27
27
  let disposed = false;
28
- void chunkZ2ZC5QTJ_js.mountSurfaceChart3D(container, {
28
+ void chunk2LOBDOTK_js.mountSurfaceChart3D(container, {
29
29
  cols,
30
30
  rows,
31
31
  heightMap,
@@ -44638,7 +44638,7 @@ function applySeriesDataLabelsToXml(seriesNode, dataLabels, getLocalName2) {
44638
44638
  const dLblsKey = findKey13(seriesNode, "dLbls", getLocalName2);
44639
44639
  const labels = dataLabels ?? [];
44640
44640
  const existingByIdx = /* @__PURE__ */ new Map();
44641
- let groupChildren = [];
44641
+ let groupChildren2 = [];
44642
44642
  if (dLblsKey) {
44643
44643
  const dLbls = seriesNode[dLblsKey];
44644
44644
  const dLblKey = findKey13(dLbls, "dLbl", getLocalName2);
@@ -44653,9 +44653,9 @@ function applySeriesDataLabelsToXml(seriesNode, dataLabels, getLocalName2) {
44653
44653
  }
44654
44654
  }
44655
44655
  }
44656
- groupChildren = Object.keys(dLbls).filter((k) => getLocalName2(k) !== "dLbl").map((k) => [k, dLbls[k]]);
44656
+ groupChildren2 = Object.keys(dLbls).filter((k) => getLocalName2(k) !== "dLbl").map((k) => [k, dLbls[k]]);
44657
44657
  }
44658
- if (labels.length === 0 && groupChildren.length === 0) {
44658
+ if (labels.length === 0 && groupChildren2.length === 0) {
44659
44659
  if (dLblsKey) {
44660
44660
  delete seriesNode[dLblsKey];
44661
44661
  }
@@ -44666,7 +44666,7 @@ function applySeriesDataLabelsToXml(seriesNode, dataLabels, getLocalName2) {
44666
44666
  if (built.length > 0) {
44667
44667
  newDLbls["c:dLbl"] = built.length === 1 ? built[0] : built;
44668
44668
  }
44669
- const ordered32 = [...groupChildren].sort((a, b) => {
44669
+ const ordered32 = [...groupChildren2].sort((a, b) => {
44670
44670
  const ai = DLBLS_GROUP_ORDER.indexOf(getLocalName2(a[0]));
44671
44671
  const bi = DLBLS_GROUP_ORDER.indexOf(getLocalName2(b[0]));
44672
44672
  return (ai === -1 ? DLBLS_GROUP_ORDER.length : ai) - (bi === -1 ? DLBLS_GROUP_ORDER.length : bi);
@@ -63204,8 +63204,16 @@ var PptxHandlerRuntime63 = class extends PptxHandlerRuntime62 {
63204
63204
  }
63205
63205
  }
63206
63206
  if (pIdx < paraCount - 1) {
63207
+ const separatorStyle = { ...mergedDefaultRunStyle };
63208
+ if (segments.length === 0) {
63209
+ const endParaSz = p["a:endParaRPr"]?.["@_sz"];
63210
+ const endParaPoints = endParaSz !== void 0 ? parseInt(String(endParaSz)) / 100 : NaN;
63211
+ if (Number.isFinite(endParaPoints) && endParaPoints > 0) {
63212
+ separatorStyle.fontSize = endParaPoints * (96 / 72);
63213
+ }
63214
+ }
63207
63215
  parts.push("\n");
63208
- segments.push({ text: "\n", style: { ...mergedDefaultRunStyle } });
63216
+ segments.push({ text: "\n", style: separatorStyle });
63209
63217
  }
63210
63218
  const firstSegmentIndex = segments.length === 0 ? -1 : 0;
63211
63219
  if (firstSegmentIndex >= 0) {
@@ -97286,11 +97294,12 @@ function detectOrientation() {
97286
97294
  }
97287
97295
  return window.innerHeight > window.innerWidth ? "portrait" : "landscape";
97288
97296
  }
97297
+ var DEFAULT_LINE_HEIGHT = 1.2;
97289
97298
  function resolveLineHeight(textStyle, hasItalicRuns) {
97290
97299
  if (typeof textStyle?.lineSpacingExactPt === "number" && textStyle.lineSpacingExactPt > 0) {
97291
97300
  return `${textStyle.lineSpacingExactPt}pt`;
97292
97301
  }
97293
- return textStyle?.lineSpacing || (hasItalicRuns ? 1.35 : 1.25);
97302
+ return textStyle?.lineSpacing || DEFAULT_LINE_HEIGHT;
97294
97303
  }
97295
97304
  function toCssWritingMode(textDirection) {
97296
97305
  switch (textDirection) {
@@ -97327,7 +97336,7 @@ function toCssVerticalDirection(textDirection) {
97327
97336
  return void 0;
97328
97337
  }
97329
97338
  function computeAutoFitTextStyle(input) {
97330
- const { textStyle: ts, text: text2, width, height, bodyInsetVertical, hasItalicRuns } = input;
97339
+ const { textStyle: ts, text: text2, width, height, bodyInsetVertical } = input;
97331
97340
  if (!ts?.autoFit) {
97332
97341
  return {};
97333
97342
  }
@@ -97337,7 +97346,7 @@ function computeAutoFitTextStyle(input) {
97337
97346
  result.fontSize = Math.max(6, Math.round(baseFontSize * ts.autoFitFontScale));
97338
97347
  } else if (ts.autoFitMode !== "normal") {
97339
97348
  const textLength = text2.length;
97340
- const lineHeight = ts.lineSpacingExactPt ? ts.lineSpacingExactPt / baseFontSize : ts.lineSpacing || (hasItalicRuns ? 1.35 : 1.25);
97349
+ const lineHeight = ts.lineSpacingExactPt ? ts.lineSpacingExactPt / baseFontSize : ts.lineSpacing || DEFAULT_LINE_HEIGHT;
97341
97350
  const approxCharsPerLine = Math.max(1, Math.floor(width / (baseFontSize * 0.6)));
97342
97351
  const estimatedLines = Math.max(1, Math.ceil(textLength / approxCharsPerLine));
97343
97352
  const requiredHeight = estimatedLines * baseFontSize * lineHeight;
@@ -97348,7 +97357,7 @@ function computeAutoFitTextStyle(input) {
97348
97357
  }
97349
97358
  }
97350
97359
  if (ts.autoFitLineSpacingReduction !== void 0 && ts.autoFitLineSpacingReduction > 0) {
97351
- const baseLineHeight = typeof ts.lineSpacing === "number" ? ts.lineSpacing : hasItalicRuns ? 1.35 : 1.25;
97360
+ const baseLineHeight = typeof ts.lineSpacing === "number" ? ts.lineSpacing : DEFAULT_LINE_HEIGHT;
97352
97361
  result.lineHeight = baseLineHeight * (1 - ts.autoFitLineSpacingReduction);
97353
97362
  }
97354
97363
  return result;
@@ -98325,6 +98334,44 @@ ${body}
98325
98334
  keyframes
98326
98335
  };
98327
98336
  }
98337
+ function groupChildren(element) {
98338
+ if (element.type !== "group") {
98339
+ return void 0;
98340
+ }
98341
+ const children8 = element.children;
98342
+ return Array.isArray(children8) && children8.length > 0 ? children8 : void 0;
98343
+ }
98344
+ function containsMorphNamedDescendant(element) {
98345
+ const children8 = groupChildren(element);
98346
+ if (!children8) {
98347
+ return false;
98348
+ }
98349
+ for (const child22 of children8) {
98350
+ if (getElementMorphName(child22) !== void 0 || containsMorphNamedDescendant(child22)) {
98351
+ return true;
98352
+ }
98353
+ }
98354
+ return false;
98355
+ }
98356
+ function toAbsolute(child22, offsetX, offsetY) {
98357
+ if (offsetX === 0 && offsetY === 0) {
98358
+ return child22;
98359
+ }
98360
+ return { ...child22, x: child22.x + offsetX, y: child22.y + offsetY };
98361
+ }
98362
+ function flattenMorphElements(elements, offsetX = 0, offsetY = 0) {
98363
+ const out = [];
98364
+ for (const element of elements) {
98365
+ const children8 = groupChildren(element);
98366
+ if (children8 && containsMorphNamedDescendant(element)) {
98367
+ out.push(...flattenMorphElements(children8, offsetX + element.x, offsetY + element.y));
98368
+ continue;
98369
+ }
98370
+ out.push(toAbsolute(element, offsetX, offsetY));
98371
+ }
98372
+ return out;
98373
+ }
98374
+ var SAME_BOX_TOLERANCE_PX = 0.5;
98328
98375
  function getElementMorphName(element) {
98329
98376
  if (element.name) {
98330
98377
  const name = element.name.trim();
@@ -98340,16 +98387,49 @@ function getElementMorphName(element) {
98340
98387
  }
98341
98388
  return void 0;
98342
98389
  }
98390
+ var NV_PR_KEYS = [
98391
+ "p:nvSpPr",
98392
+ "p:nvPicPr",
98393
+ "p:nvGrpSpPr",
98394
+ "p:nvCxnSpPr",
98395
+ "p:nvGraphicFramePr"
98396
+ ];
98397
+ function getElementCreationId(element) {
98398
+ const raw = element.rawXml;
98399
+ if (!raw) {
98400
+ return void 0;
98401
+ }
98402
+ for (const nvKey of NV_PR_KEYS) {
98403
+ const nvPr = raw[nvKey];
98404
+ const cNvPr = nvPr?.["p:cNvPr"];
98405
+ const extLst = cNvPr?.["a:extLst"];
98406
+ const extRaw = extLst?.["a:ext"];
98407
+ if (!extRaw) {
98408
+ continue;
98409
+ }
98410
+ const exts = Array.isArray(extRaw) ? extRaw : [extRaw];
98411
+ for (const ext of exts) {
98412
+ const creation = ext?.["a16:creationId"];
98413
+ const guid = creation?.["@_id"];
98414
+ if (typeof guid === "string" && guid.length > 0) {
98415
+ return guid;
98416
+ }
98417
+ }
98418
+ }
98419
+ return void 0;
98420
+ }
98343
98421
  function matchMorphElementsFull(fromSlide, toSlide) {
98344
98422
  const pairs2 = [];
98345
98423
  const usedFrom = /* @__PURE__ */ new Set();
98346
98424
  const usedTo = /* @__PURE__ */ new Set();
98347
- for (const fromEl of fromSlide.elements) {
98425
+ const fromElements = flattenMorphElements(fromSlide.elements);
98426
+ const toElements = flattenMorphElements(toSlide.elements);
98427
+ for (const fromEl of fromElements) {
98348
98428
  const fromName = getElementMorphName(fromEl);
98349
98429
  if (!fromName) {
98350
98430
  continue;
98351
98431
  }
98352
- for (const toEl of toSlide.elements) {
98432
+ for (const toEl of toElements) {
98353
98433
  if (usedTo.has(toEl.id)) {
98354
98434
  continue;
98355
98435
  }
@@ -98362,15 +98442,45 @@ function matchMorphElementsFull(fromSlide, toSlide) {
98362
98442
  }
98363
98443
  }
98364
98444
  }
98365
- for (const fromEl of fromSlide.elements) {
98445
+ const creationIds = /* @__PURE__ */ new Map();
98446
+ const creationIdOf = (el) => {
98447
+ if (!creationIds.has(el.id)) {
98448
+ creationIds.set(el.id, getElementCreationId(el));
98449
+ }
98450
+ return creationIds.get(el.id);
98451
+ };
98452
+ for (const fromEl of fromElements) {
98453
+ if (usedFrom.has(fromEl.id)) {
98454
+ continue;
98455
+ }
98456
+ const fromGuid = creationIdOf(fromEl);
98457
+ if (!fromGuid) {
98458
+ continue;
98459
+ }
98460
+ for (const toEl of toElements) {
98461
+ if (usedTo.has(toEl.id) || fromEl.type !== toEl.type) {
98462
+ continue;
98463
+ }
98464
+ if (creationIdOf(toEl) === fromGuid) {
98465
+ pairs2.push({ fromElement: fromEl, toElement: toEl });
98466
+ usedFrom.add(fromEl.id);
98467
+ usedTo.add(toEl.id);
98468
+ break;
98469
+ }
98470
+ }
98471
+ }
98472
+ for (const fromEl of fromElements) {
98366
98473
  if (usedFrom.has(fromEl.id) || !fromEl.shapeId) {
98367
98474
  continue;
98368
98475
  }
98369
- for (const toEl of toSlide.elements) {
98476
+ for (const toEl of toElements) {
98370
98477
  if (usedTo.has(toEl.id)) {
98371
98478
  continue;
98372
98479
  }
98373
98480
  if (toEl.shapeId && fromEl.shapeId === toEl.shapeId && fromEl.type === toEl.type) {
98481
+ if (creationIdOf(fromEl) && creationIdOf(toEl)) {
98482
+ continue;
98483
+ }
98374
98484
  pairs2.push({ fromElement: fromEl, toElement: toEl });
98375
98485
  usedFrom.add(fromEl.id);
98376
98486
  usedTo.add(toEl.id);
@@ -98378,13 +98488,13 @@ function matchMorphElementsFull(fromSlide, toSlide) {
98378
98488
  }
98379
98489
  }
98380
98490
  }
98381
- for (const fromEl of fromSlide.elements) {
98491
+ for (const fromEl of fromElements) {
98382
98492
  if (usedFrom.has(fromEl.id)) {
98383
98493
  continue;
98384
98494
  }
98385
98495
  let bestMatch = null;
98386
98496
  let bestDist = Infinity;
98387
- for (const toEl of toSlide.elements) {
98497
+ for (const toEl of toElements) {
98388
98498
  if (usedTo.has(toEl.id)) {
98389
98499
  continue;
98390
98500
  }
@@ -98410,8 +98520,24 @@ function matchMorphElementsFull(fromSlide, toSlide) {
98410
98520
  usedTo.add(bestMatch.id);
98411
98521
  }
98412
98522
  }
98413
- const unmatchedFrom = fromSlide.elements.filter((el) => !usedFrom.has(el.id));
98414
- const unmatchedTo = toSlide.elements.filter((el) => !usedTo.has(el.id));
98523
+ for (const fromEl of fromElements) {
98524
+ if (usedFrom.has(fromEl.id)) {
98525
+ continue;
98526
+ }
98527
+ for (const toEl of toElements) {
98528
+ if (usedTo.has(toEl.id)) {
98529
+ continue;
98530
+ }
98531
+ if (Math.abs(fromEl.x - toEl.x) <= SAME_BOX_TOLERANCE_PX && Math.abs(fromEl.y - toEl.y) <= SAME_BOX_TOLERANCE_PX && Math.abs(fromEl.width - toEl.width) <= SAME_BOX_TOLERANCE_PX && Math.abs(fromEl.height - toEl.height) <= SAME_BOX_TOLERANCE_PX) {
98532
+ pairs2.push({ fromElement: fromEl, toElement: toEl });
98533
+ usedFrom.add(fromEl.id);
98534
+ usedTo.add(toEl.id);
98535
+ break;
98536
+ }
98537
+ }
98538
+ }
98539
+ const unmatchedFrom = fromElements.filter((el) => !usedFrom.has(el.id));
98540
+ const unmatchedTo = toElements.filter((el) => !usedTo.has(el.id));
98415
98541
  return { pairs: pairs2, unmatchedFrom, unmatchedTo };
98416
98542
  }
98417
98543
  function tokenizeText(element, mode) {
@@ -98658,13 +98784,12 @@ function generateMorphAnimations(pairs2, durationMs, _mode = "object") {
98658
98784
  const sy = Math.max(fromElement.height, 1) / Math.max(toElement.height, 1);
98659
98785
  const fromOpacity = fromElement.opacity ?? 1;
98660
98786
  const toOpacity = toElement.opacity ?? 1;
98661
- const fromRot = fromElement.rotation ?? 0;
98662
98787
  const toRot = toElement.rotation ?? 0;
98788
+ const fromRot = shortestRotationTarget(toRot, fromElement.rotation ?? 0);
98663
98789
  const flips = `${toElement.flipHorizontal ? " scaleX(-1)" : ""}${toElement.flipVertical ? " scaleY(-1)" : ""}`;
98664
- const crossfades = morphPairNeedsCrossfade(fromElement, toElement);
98665
98790
  const fromProps = [
98666
98791
  ` transform: translate(${dx}px, ${dy}px) scale(${sx}, ${sy}) rotate(${fromRot}deg)${flips};`,
98667
- ` opacity: ${crossfades ? 0 : fromOpacity};`
98792
+ ` opacity: ${fromOpacity};`
98668
98793
  ];
98669
98794
  const toProps = [
98670
98795
  ` transform: translate(0, 0) scale(1, 1) rotate(${toRot}deg)${flips};`,
@@ -98708,7 +98833,7 @@ function generateMorphGhostAnimations(pairs2, durationMs, startIndex) {
98708
98833
  const sx = Math.max(toElement.width, 1) / Math.max(fromElement.width, 1);
98709
98834
  const sy = Math.max(toElement.height, 1) / Math.max(fromElement.height, 1);
98710
98835
  const fromRot = fromElement.rotation ?? 0;
98711
- const toRot = toElement.rotation ?? 0;
98836
+ const toRot = shortestRotationTarget(fromRot, toElement.rotation ?? 0);
98712
98837
  const flips = `${fromElement.flipHorizontal ? " scaleX(-1)" : ""}${fromElement.flipVertical ? " scaleY(-1)" : ""}`;
98713
98838
  const keyframes = `
98714
98839
  @keyframes ${safeName} {
@@ -98731,6 +98856,15 @@ function generateMorphGhostAnimations(pairs2, durationMs, startIndex) {
98731
98856
  }
98732
98857
  return animations;
98733
98858
  }
98859
+ function shortestRotationTarget(fromDeg, toDeg) {
98860
+ let delta = (toDeg - fromDeg) % 360;
98861
+ if (delta > 180) {
98862
+ delta -= 360;
98863
+ } else if (delta <= -180) {
98864
+ delta += 360;
98865
+ }
98866
+ return fromDeg + delta;
98867
+ }
98734
98868
  function staticTransformSuffix(el) {
98735
98869
  const rot = el.rotation ?? 0;
98736
98870
  return ` rotate(${rot}deg)${el.flipHorizontal ? " scaleX(-1)" : ""}${el.flipVertical ? " scaleY(-1)" : ""}`;
@@ -98846,7 +98980,7 @@ function buildMorphTransitionPlan(fromSlide, toSlide, durationMs, mode = "object
98846
98980
  return void 0;
98847
98981
  }
98848
98982
  const animations = generateFullMorphTransition(fromSlide, toSlide, durationMs, mode);
98849
- const outgoingElements = [...fromSlide.elements];
98983
+ const outgoingElements = flattenMorphElements(fromSlide.elements);
98850
98984
  const outgoingIds = new Set(outgoingElements.map((element) => element.id));
98851
98985
  const incomingAnimations = /* @__PURE__ */ new Map();
98852
98986
  const outgoingAnimations = /* @__PURE__ */ new Map();
@@ -101224,6 +101358,11 @@ var INSTANT = {
101224
101358
  };
101225
101359
  var DEFAULT_TRANSITION_DURATION_MS = 1e3;
101226
101360
  var DEFAULT_MORPH_DURATION_MS = 2e3;
101361
+ var TRANSITION_SPEED_DURATION_MS = {
101362
+ fast: 500,
101363
+ med: 750,
101364
+ slow: 1e3
101365
+ };
101227
101366
  var EASE = "ease-in-out";
101228
101367
  var P14_TRANSITION_KEYFRAMES = `
101229
101368
  /* \u2500\u2500 Conveyor (translate X with staggered timing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
@@ -102434,6 +102573,10 @@ function resolveTransitionDurationMs(transition) {
102434
102573
  if (typeof transition.durationMs === "number" && transition.durationMs > 0) {
102435
102574
  return transition.durationMs;
102436
102575
  }
102576
+ const speedMs = transition.speed ? TRANSITION_SPEED_DURATION_MS[transition.speed] : void 0;
102577
+ if (typeof speedMs === "number") {
102578
+ return speedMs;
102579
+ }
102437
102580
  if (transition.type === "morph") {
102438
102581
  return DEFAULT_MORPH_DURATION_MS;
102439
102582
  }
Binary file
Binary file