pptx-vue-viewer 3.13.0 → 3.14.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 (119) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/{AiChatPanel-sVdtVb3S.js → AiChatPanel-C6yTGXJD.js} +64 -64
  3. package/dist/AiChatPanel-C6yTGXJD.js.br +0 -0
  4. package/dist/AiChatPanel-C6yTGXJD.js.gz +0 -0
  5. package/dist/{AiChatPanel-Dc2XmKf0.cjs → AiChatPanel-D7YJXVEJ.cjs} +85 -85
  6. package/dist/AiChatPanel-D7YJXVEJ.cjs.br +0 -0
  7. package/dist/AiChatPanel-D7YJXVEJ.cjs.gz +0 -0
  8. package/dist/{dist-D2_uVQ25.cjs → dist-DVKNpGQ1.cjs} +17521 -17317
  9. package/dist/dist-DVKNpGQ1.cjs.br +0 -0
  10. package/dist/dist-DVKNpGQ1.cjs.gz +0 -0
  11. package/dist/{dist-DUcjFVaq.js → dist-KJdg2pqk.js} +17330 -17126
  12. package/dist/dist-KJdg2pqk.js.br +0 -0
  13. package/dist/dist-KJdg2pqk.js.gz +0 -0
  14. package/dist/gif-encoder-CZEe4U9X.js +2 -0
  15. package/dist/gif-encoder-CZEe4U9X.js.br +0 -0
  16. package/dist/gif-encoder-CZEe4U9X.js.gz +0 -0
  17. package/dist/gif-encoder-De4PkagS.cjs +2 -0
  18. package/dist/gif-encoder-De4PkagS.cjs.br +0 -0
  19. package/dist/gif-encoder-De4PkagS.cjs.gz +0 -0
  20. package/dist/index.cjs +1 -1
  21. package/dist/index.cjs.br +0 -0
  22. package/dist/index.cjs.gz +0 -0
  23. package/dist/index.js +3 -3
  24. package/dist/index.js.br +0 -0
  25. package/dist/index.js.gz +0 -0
  26. package/dist/internals.cjs +1 -1
  27. package/dist/internals.cjs.br +0 -0
  28. package/dist/internals.cjs.gz +0 -0
  29. package/dist/internals.d.ts +1 -1
  30. package/dist/internals.d.ts.map +1 -1
  31. package/dist/internals.js +2 -2
  32. package/dist/internals.js.br +0 -0
  33. package/dist/internals.js.gz +0 -0
  34. package/dist/pptx-vue-viewer.css +51 -14
  35. package/dist/pptx-vue-viewer.css.br +0 -0
  36. package/dist/pptx-vue-viewer.css.gz +0 -0
  37. package/dist/useViewerSettingsDialog-D6iiGRNQ.js +64995 -0
  38. package/dist/useViewerSettingsDialog-D6iiGRNQ.js.br +0 -0
  39. package/dist/useViewerSettingsDialog-D6iiGRNQ.js.gz +0 -0
  40. package/dist/{useViewerSettingsDialog-Cep_86kN.cjs → useViewerSettingsDialog-MrgnuyOG.cjs} +49211 -36999
  41. package/dist/useViewerSettingsDialog-MrgnuyOG.cjs.br +0 -0
  42. package/dist/useViewerSettingsDialog-MrgnuyOG.cjs.gz +0 -0
  43. package/dist/viewer/components/CommentsPanel.vue.d.ts.map +1 -1
  44. package/dist/viewer/components/MobileSheet.vue.d.ts.map +1 -1
  45. package/dist/viewer/components/OleEditorDialog.vue.d.ts.map +1 -1
  46. package/dist/viewer/components/PrintDialog.vue.d.ts.map +1 -1
  47. package/dist/viewer/components/SettingsAppearanceTab.vue.d.ts.map +1 -1
  48. package/dist/viewer/components/SettingsDialog.vue.d.ts.map +1 -1
  49. package/dist/viewer/components/ShareDialog.vue.d.ts.map +1 -1
  50. package/dist/viewer/components/WordArtEnvelopeGlyph.vue.d.ts.map +1 -1
  51. package/dist/viewer/components/ai/AiChatPanel.vue.d.ts.map +1 -1
  52. package/dist/viewer/components/ai/AiConversation.vue.d.ts.map +1 -1
  53. package/dist/viewer/components/ai/AiFocusBar.vue.d.ts.map +1 -1
  54. package/dist/viewer/components/inspector/ActionSettingsPanel.vue.d.ts.map +1 -1
  55. package/dist/viewer/components/inspector/AnimationEditorControls.vue.d.ts +8 -0
  56. package/dist/viewer/components/inspector/AnimationEditorControls.vue.d.ts.map +1 -1
  57. package/dist/viewer/components/inspector/AnimationPanel.vue.d.ts.map +1 -1
  58. package/dist/viewer/components/inspector/ArrangePanel.vue.d.ts.map +1 -1
  59. package/dist/viewer/components/inspector/ChartDataGrid.vue.d.ts.map +1 -1
  60. package/dist/viewer/components/inspector/FillPanel.vue.d.ts.map +1 -1
  61. package/dist/viewer/components/inspector/InspectorPane.vue.d.ts.map +1 -1
  62. package/dist/viewer/components/inspector/InspectorSectionCard.vue.d.ts +27 -0
  63. package/dist/viewer/components/inspector/InspectorSectionCard.vue.d.ts.map +1 -0
  64. package/dist/viewer/components/inspector/InspectorTabs.vue.d.ts.map +1 -1
  65. package/dist/viewer/components/inspector/QuickStylesGallery.vue.d.ts.map +1 -1
  66. package/dist/viewer/components/inspector/StrokePanel.vue.d.ts.map +1 -1
  67. package/dist/viewer/components/inspector/TableCellAdvancedFill.vue.d.ts.map +1 -1
  68. package/dist/viewer/components/inspector/TableCellFormattingPanel.vue.d.ts.map +1 -1
  69. package/dist/viewer/components/inspector/TableDataGrid.vue.d.ts.map +1 -1
  70. package/dist/viewer/components/inspector/TableStyleEditorFields.vue.d.ts.map +1 -1
  71. package/dist/viewer/components/inspector/TextPanel.vue.d.ts.map +1 -1
  72. package/dist/viewer/components/settings/OptionsControlRow.vue.d.ts.map +1 -1
  73. package/dist/viewer/composables/useEmbeddedFonts.d.ts.map +1 -1
  74. package/dist/viewer/composables/useGifExport.d.ts +32 -0
  75. package/dist/viewer/composables/useGifExport.d.ts.map +1 -0
  76. package/dist/viewer/composables/useGoogleWebfonts.d.ts.map +1 -1
  77. package/dist/viewer/composables/useIsMobile.d.ts +11 -0
  78. package/dist/viewer/composables/useIsMobile.d.ts.map +1 -1
  79. package/dist/viewer/composables/useMediaExport.d.ts +3 -1
  80. package/dist/viewer/composables/useMediaExport.d.ts.map +1 -1
  81. package/dist/viewer/composables/useTextWarpEnvelope.d.ts.map +1 -1
  82. package/dist/viewer/index.cjs +1 -1
  83. package/dist/viewer/index.cjs.br +0 -0
  84. package/dist/viewer/index.cjs.gz +0 -0
  85. package/dist/viewer/index.js +3 -3
  86. package/dist/viewer/index.js.br +0 -0
  87. package/dist/viewer/index.js.gz +0 -0
  88. package/dist/viewer/utils/glyph-outline-cache.d.ts +8 -0
  89. package/dist/viewer/utils/glyph-outline-cache.d.ts.map +1 -0
  90. package/dist/{viewer-DR-qKweq.js → viewer-DGArk_38.js} +14204 -14024
  91. package/dist/viewer-DGArk_38.js.br +0 -0
  92. package/dist/viewer-DGArk_38.js.gz +0 -0
  93. package/dist/{viewer-BWi4tUWU.cjs → viewer-aSYYoxpL.cjs} +9208 -9028
  94. package/dist/viewer-aSYYoxpL.cjs.br +0 -0
  95. package/dist/viewer-aSYYoxpL.cjs.gz +0 -0
  96. package/package.json +3 -1
  97. package/dist/AiChatPanel-Dc2XmKf0.cjs.br +0 -0
  98. package/dist/AiChatPanel-Dc2XmKf0.cjs.gz +0 -0
  99. package/dist/AiChatPanel-sVdtVb3S.js.br +0 -0
  100. package/dist/AiChatPanel-sVdtVb3S.js.gz +0 -0
  101. package/dist/dist-D2_uVQ25.cjs.br +0 -0
  102. package/dist/dist-D2_uVQ25.cjs.gz +0 -0
  103. package/dist/dist-DUcjFVaq.js.br +0 -0
  104. package/dist/dist-DUcjFVaq.js.gz +0 -0
  105. package/dist/gif-encoder-B2AxxSF3.cjs +0 -2
  106. package/dist/gif-encoder-B2AxxSF3.cjs.br +0 -0
  107. package/dist/gif-encoder-B2AxxSF3.cjs.gz +0 -0
  108. package/dist/gif-encoder-BzY_aQhr.js +0 -2
  109. package/dist/gif-encoder-BzY_aQhr.js.br +0 -0
  110. package/dist/gif-encoder-BzY_aQhr.js.gz +0 -0
  111. package/dist/useViewerSettingsDialog-CBonloSi.js +0 -52822
  112. package/dist/useViewerSettingsDialog-CBonloSi.js.br +0 -0
  113. package/dist/useViewerSettingsDialog-CBonloSi.js.gz +0 -0
  114. package/dist/useViewerSettingsDialog-Cep_86kN.cjs.br +0 -0
  115. package/dist/useViewerSettingsDialog-Cep_86kN.cjs.gz +0 -0
  116. package/dist/viewer-BWi4tUWU.cjs.br +0 -0
  117. package/dist/viewer-BWi4tUWU.cjs.gz +0 -0
  118. package/dist/viewer-DR-qKweq.js.br +0 -0
  119. package/dist/viewer-DR-qKweq.js.gz +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,24 @@ A release listed with no entries carried no Conventional Commit in this package'
7
7
  scope: scripts/release-plan.mjs re-releases a package whenever any of its files
8
8
  change, not only on conventional ones.
9
9
 
10
+ ## [3.13.0](https://github.com/ChristopherVR/pptx-viewer/releases/tag/pptx-vue-viewer@3.13.0) - 2026-09-10
11
+
12
+ ### Features
13
+
14
+ - **core:** SmartArt composite shape dispatch, per-role font fit and hang ratio (by @ChristopherVR) ([b2d985f](https://github.com/ChristopherVR/pptx-viewer/commit/b2d985f0d5c593c4cca231655d02fed828b548ce))
15
+ - **shared:** Route every raster export through the foreignObject tiled pipeline (by @ChristopherVR) ([1ad1993](https://github.com/ChristopherVR/pptx-viewer/commit/1ad19930714668dba87af52e38872d64e7ad4f9d))
16
+ - **shared:** Sample a bar3D picture fill's first pixel on the first paint (by @ChristopherVR) ([8bdb1bc](https://github.com/ChristopherVR/pptx-viewer/commit/8bdb1bc995e92390f6e622f146e9c5abd623d047))
17
+ - **core:** SmartArt repeated-template slots, table hierarchies and cascades (by @ChristopherVR) ([725033d](https://github.com/ChristopherVR/pptx-viewer/commit/725033db29d984d1d9078224a68cb0ccf590fbba))
18
+
19
+ ### Bug Fixes
20
+
21
+ - **core:** Preserve fractional table row heights ([#224](https://github.com/ChristopherVR/pptx-viewer/issues/224)) (by @Sudhansh6) ([aaa621f](https://github.com/ChristopherVR/pptx-viewer/commit/aaa621f9f3838a84a13b2422c1888454e592a18f))
22
+ - **angular,core:** Land the transition-split component and media-duration wiring (by @ChristopherVR) ([3d0c8c7](https://github.com/ChristopherVR/pptx-viewer/commit/3d0c8c7b6a68c94f6f9a1258342dd43b6f524503))
23
+
24
+ ### Testing
25
+
26
+ - **react,svelte,angular,shared:** Update assertions to the camera-matrix and webfont contracts (by @ChristopherVR) ([f2edef8](https://github.com/ChristopherVR/pptx-viewer/commit/f2edef846a5ffb607fb15985512a1142bb47e570))
27
+
10
28
  ## [3.12.0](https://github.com/ChristopherVR/pptx-viewer/releases/tag/pptx-vue-viewer@3.12.0) - 2026-09-10
11
29
 
12
30
  ### Features
@@ -1,6 +1,6 @@
1
- import { vn as e } from "./useViewerSettingsDialog-CBonloSi.js";
2
- import { S as t, T as a, _ as s, b as r, d as l, f as o, g as n, h as i, m as p, o as d, p as c, u, v as m, x, y as g } from "./viewer-DR-qKweq.js";
3
- import { Fragment as f, Suspense as b, computed as v, createBlock as h, createCommentVNode as y, createElementBlock as k, createElementVNode as w, createTextVNode as C, createVNode as P, defineComponent as S, nextTick as T, normalizeClass as I, normalizeStyle as _, onBeforeUnmount as A, onMounted as E, openBlock as j, ref as M, renderList as F, resolveDynamicComponent as B, shallowRef as D, toDisplayString as N, unref as L, vModelText as R, watch as H, withAsyncContext as W, withCtx as z, withDirectives as V } from "vue";
1
+ import { xn as e } from "./useViewerSettingsDialog-D6iiGRNQ.js";
2
+ import { S as t, T as a, _ as s, b as r, d as l, f as o, g as n, h as i, m as p, o as d, p as c, u, v as m, x, y as g } from "./viewer-DGArk_38.js";
3
+ import { Fragment as f, Suspense as b, computed as v, createBlock as h, createCommentVNode as y, createElementBlock as k, createElementVNode as w, createTextVNode as C, createVNode as P, defineComponent as S, nextTick as T, normalizeClass as I, normalizeStyle as j, onBeforeUnmount as _, onMounted as A, openBlock as E, ref as M, renderList as F, resolveDynamicComponent as B, shallowRef as D, toDisplayString as N, unref as L, vModelText as R, watch as H, withAsyncContext as W, withCtx as z, withDirectives as V } from "vue";
4
4
  import { Bot as K, ChartColumn as O, Check as U, Crosshair as $, Eye as q, Film as G, GitMerge as J, History as Q, LayoutTemplate as X, LoaderCircle as Y, MessageSquare as Z, MessageSquarePlus as ee, Move as te, Navigation as ae, Palette as se, Pin as re, PinOff as le, Plus as oe, Search as ne, Send as ie, Shapes as pe, Sparkles as de, Square as ce, StickyNote as ue, Table as me, Trash2 as xe, TriangleAlert as ge, Type as fe, User as be, Wrench as ve, X as he } from "lucide-vue-next";
5
5
  import { getToolOrDynamicToolName as ye, isDynamicToolUIPart as ke, isToolUIPart as we } from "ai";
6
6
  var Ce = /* @__PURE__ */ new Set([
@@ -74,11 +74,11 @@ function Pe(e, t, a, s = {}) {
74
74
  }
75
75
  };
76
76
  }
77
- var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end gap-1.5 rounded-md border border-input bg-background px-2 py-1.5 focus-within:border-ring" }, Ie = ["placeholder", "aria-label"], _e = ["title", "aria-label"], Ae = [
77
+ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end gap-1.5 rounded-md border border-input bg-background px-2 py-1.5 focus-within:border-ring" }, Ie = ["placeholder", "aria-label"], je = ["title", "aria-label"], _e = [
78
78
  "disabled",
79
79
  "title",
80
80
  "aria-label"
81
- ], Ee = S({
81
+ ], Ae = S({
82
82
  __name: "AiComposer",
83
83
  props: {
84
84
  isStreaming: { type: Boolean },
@@ -97,7 +97,7 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
97
97
  }
98
98
  return H(() => r.prefillNonce, (e) => {
99
99
  void 0 !== e && 0 !== e && (r.prefillText && (n.value = r.prefillText), T(() => i.value?.focus()));
100
- }), (e, t) => (j(), k("div", Se, [w("div", Te, [V(w("textarea", {
100
+ }), (e, t) => (E(), k("div", Se, [w("div", Te, [V(w("textarea", {
101
101
  ref_key: "textareaRef",
102
102
  ref: i,
103
103
  "onUpdate:modelValue": t[0] || (t[0] = (e) => n.value = e),
@@ -106,14 +106,14 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
106
106
  "aria-label": L(o)("pptx.ai.placeholder"),
107
107
  class: "max-h-32 min-h-[1.5rem] flex-1 resize-none bg-transparent text-[13px] text-foreground outline-none placeholder:text-muted-foreground",
108
108
  onKeydown: c
109
- }, null, 40, Ie), [[R, n.value]]), r.isStreaming ? (j(), k("button", {
109
+ }, null, 40, Ie), [[R, n.value]]), r.isStreaming ? (E(), k("button", {
110
110
  key: 0,
111
111
  type: "button",
112
112
  title: L(o)("pptx.ai.stop"),
113
113
  "aria-label": L(o)("pptx.ai.stop"),
114
114
  class: "shrink-0 rounded-sm p-1.5 text-muted-foreground transition-colors hover:bg-accent",
115
115
  onClick: t[1] || (t[1] = (e) => l("stop"))
116
- }, [P(L(ce), { class: "w-4 h-4" })], 8, _e)) : (j(), k("button", {
116
+ }, [P(L(ce), { class: "w-4 h-4" })], 8, je)) : (E(), k("button", {
117
117
  key: 1,
118
118
  type: "button",
119
119
  disabled: !p.value,
@@ -121,9 +121,9 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
121
121
  "aria-label": L(o)("pptx.ai.send"),
122
122
  class: I(L(a)("shrink-0 rounded-sm p-1.5 transition-colors", p.value ? "bg-primary text-primary-foreground hover:bg-primary/90" : "text-muted-foreground/50")),
123
123
  onClick: d
124
- }, [P(L(ie), { class: "w-4 h-4" })], 10, Ae))])]));
124
+ }, [P(L(ie), { class: "w-4 h-4" })], 10, _e))])]));
125
125
  }
126
- }), je = { class: "border-b border-border bg-secondary/30" }, Me = { class: "flex flex-wrap items-center gap-1 px-2.5 py-1.5" }, Fe = { class: "text-[10px] font-semibold uppercase tracking-wide text-muted-foreground" }, Be = ["title"], De = { class: "truncate" }, Ne = {
126
+ }), Ee = { class: "border-b border-border bg-secondary/30" }, Me = { class: "flex flex-wrap items-center gap-1 px-2.5 py-1.5" }, Fe = { class: "text-[10px] font-semibold uppercase tracking-wide text-muted-foreground" }, Be = ["title"], De = { class: "truncate" }, Ne = {
127
127
  key: 0,
128
128
  class: "rounded-full bg-primary/15 px-1.5 py-0.5 text-[10px] font-medium text-primary"
129
129
  }, Le = { class: "ml-auto flex items-center gap-0.5" }, Re = [
@@ -156,16 +156,16 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
156
156
  const e = d.value;
157
157
  e && o("send-directive", m(e.slideIndex, e.elementIdA, e.elementIdB));
158
158
  }
159
- return (e, s) => (j(), k("div", je, [w("div", Me, [
159
+ return (e, s) => (E(), k("div", Ee, [w("div", Me, [
160
160
  w("span", Fe, N(L(n)("pptx.ai.focusScope")), 1),
161
- (j(!0), k(f, null, F(i.value, (e) => (j(), k("span", {
161
+ (E(!0), k(f, null, F(i.value, (e) => (E(), k("span", {
162
162
  key: e.key,
163
163
  class: I(L(a)("inline-flex max-w-[10rem] items-center rounded-full px-2 py-0.5 text-[11px]", t.hasPicks || t.isPinned ? "bg-primary/15 text-primary" : "bg-muted text-muted-foreground")),
164
164
  title: e.title
165
165
  }, [w("span", De, N(e.label), 1)], 10, Be))), 128)),
166
- t.isPinned ? (j(), k("span", Ne, N(L(n)("pptx.ai.pinnedFocus")), 1)) : y("", !0),
166
+ t.isPinned ? (E(), k("span", Ne, N(L(n)("pptx.ai.pinnedFocus")), 1)) : y("", !0),
167
167
  w("div", Le, [
168
- d.value ? (j(), k("button", {
168
+ d.value ? (E(), k("button", {
169
169
  key: 0,
170
170
  type: "button",
171
171
  class: "inline-flex items-center gap-1 rounded-sm bg-primary/90 px-1.5 py-0.5 text-[11px] font-medium text-primary-foreground hover:bg-primary",
@@ -176,32 +176,32 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
176
176
  title: L(n)("pptx.ai.pickElement"),
177
177
  "aria-label": L(n)("pptx.ai.pickAria"),
178
178
  "aria-pressed": t.pickMode,
179
- class: I(L(a)("rounded-sm p-1", t.pickMode ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-accent")),
179
+ class: I(L(a)("rounded-sm p-1 flex items-center justify-center max-md:min-w-[44px]! max-md:min-h-[44px]!", t.pickMode ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-accent")),
180
180
  onClick: s[0] || (s[0] = (e) => t.pickMode ? o("stop-pick") : o("start-pick"))
181
181
  }, [P(L($), { class: "w-3.5 h-3.5" })], 10, Re),
182
- t.hasPicks ? (j(), k("button", {
182
+ t.hasPicks ? (E(), k("button", {
183
183
  key: 1,
184
184
  type: "button",
185
185
  title: L(n)("pptx.ai.pickClear"),
186
186
  "aria-label": L(n)("pptx.ai.pickClear"),
187
- class: "rounded-sm p-1 text-muted-foreground hover:bg-accent",
187
+ class: "rounded-sm p-1 text-muted-foreground hover:bg-accent flex items-center justify-center max-md:min-w-[44px]! max-md:min-h-[44px]!",
188
188
  onClick: s[1] || (s[1] = (e) => o("clear-picks"))
189
- }, [P(L(he), { class: "w-3.5 h-3.5" })], 8, He)) : (j(), k("button", {
189
+ }, [P(L(he), { class: "w-3.5 h-3.5" })], 8, He)) : (E(), k("button", {
190
190
  key: 2,
191
191
  type: "button",
192
192
  title: t.isPinned ? L(n)("pptx.ai.clearFocus") : L(n)("pptx.ai.pinFocus"),
193
193
  "aria-label": t.isPinned ? L(n)("pptx.ai.clearFocus") : L(n)("pptx.ai.pinFocus"),
194
- class: "rounded-sm p-1 text-muted-foreground hover:bg-accent",
194
+ class: "rounded-sm p-1 text-muted-foreground hover:bg-accent flex items-center justify-center max-md:min-w-[44px]! max-md:min-h-[44px]!",
195
195
  onClick: s[2] || (s[2] = (e) => t.isPinned ? o("clear-pin") : o("pin"))
196
- }, [t.isPinned ? (j(), h(L(le), {
196
+ }, [t.isPinned ? (E(), h(L(le), {
197
197
  key: 0,
198
198
  class: "w-3.5 h-3.5"
199
- })) : (j(), h(L(re), {
199
+ })) : (E(), h(L(re), {
200
200
  key: 1,
201
201
  class: "w-3.5 h-3.5"
202
202
  }))], 8, We))
203
203
  ])
204
- ]), t.pickMode ? (j(), k("div", ze, [
204
+ ]), t.pickMode ? (E(), k("div", ze, [
205
205
  P(L($), { class: "w-3.5 h-3.5 shrink-0 animate-pulse text-primary" }),
206
206
  w("span", Ve, N(L(n)("pptx.ai.pickElementHint")), 1),
207
207
  w("button", {
@@ -238,7 +238,7 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
238
238
  function n(e) {
239
239
  o.value && !o.value.contains(e.target) && r("close");
240
240
  }
241
- return E(() => document.addEventListener("mousedown", n)), A(() => document.removeEventListener("mousedown", n)), (e, t) => (j(), k("div", {
241
+ return A(() => document.addEventListener("mousedown", n)), _(() => document.removeEventListener("mousedown", n)), (e, t) => (E(), k("div", {
242
242
  ref_key: "root",
243
243
  ref: o,
244
244
  class: "absolute right-2 top-10 z-40 w-64 rounded-md border border-border bg-popover shadow-xl"
@@ -250,7 +250,7 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
250
250
  r("new-chat"), r("close");
251
251
  })
252
252
  }, [P(L(oe), { class: "w-3 h-3" }), C(" " + N(L(l)("pptx.ai.newChat")), 1)])]),
253
- 0 === s.chats.length ? (j(), k("p", $e, N(L(l)("pptx.ai.historyEmpty")), 1)) : (j(), k("ul", qe, [(j(!0), k(f, null, F(s.chats, (e) => (j(), k("li", {
253
+ 0 === s.chats.length ? (E(), k("p", $e, N(L(l)("pptx.ai.historyEmpty")), 1)) : (E(), k("ul", qe, [(E(!0), k(f, null, F(s.chats, (e) => (E(), k("li", {
254
254
  key: e.id,
255
255
  class: "group flex items-center gap-1 px-1"
256
256
  }, [w("button", {
@@ -295,23 +295,23 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
295
295
  notes: ue,
296
296
  tool: ve
297
297
  }, n = v(() => "output-error" === r.part.state), i = v(() => "output-available" === r.part.state), p = v(() => !n.value && !i.value), d = v(() => c(r.part.toolName, r.part.input, p.value ? "present" : "past")), u = v(() => o[d.value.icon] ?? ve), m = v(() => g(r.part.input)), x = v(() => n.value ? l("pptx.ai.toolFailed") : i.value ? l("pptx.ai.toolDone") : l("pptx.ai.toolRunning"));
298
- return (e, s) => (j(), k("div", tt, [
298
+ return (e, s) => (E(), k("div", tt, [
299
299
  w("div", at, [
300
- (j(), h(B(u.value), { class: I(L(a)("w-3.5 h-3.5 shrink-0", n.value ? "text-destructive" : "text-muted-foreground")) }, null, 8, ["class"])),
300
+ (E(), h(B(u.value), { class: I(L(a)("w-3.5 h-3.5 shrink-0", n.value ? "text-destructive" : "text-muted-foreground")) }, null, 8, ["class"])),
301
301
  w("span", { class: I(L(a)("truncate", n.value ? "text-destructive" : "text-foreground")) }, N(d.value.label), 3),
302
- w("span", { class: I(L(a)("ml-auto inline-flex items-center gap-1 rounded-sm px-1.5 py-0.5 text-[10px]", n.value ? "bg-destructive/15 text-destructive" : i.value ? "bg-primary/10 text-primary" : "bg-muted text-muted-foreground")) }, [p.value ? (j(), h(L(Y), {
302
+ w("span", { class: I(L(a)("ml-auto inline-flex items-center gap-1 rounded-sm px-1.5 py-0.5 text-[10px]", n.value ? "bg-destructive/15 text-destructive" : i.value ? "bg-primary/10 text-primary" : "bg-muted text-muted-foreground")) }, [p.value ? (E(), h(L(Y), {
303
303
  key: 0,
304
304
  class: "w-3 h-3 animate-spin"
305
- })) : i.value ? (j(), h(L(U), {
305
+ })) : i.value ? (E(), h(L(U), {
306
306
  key: 1,
307
307
  class: "w-3 h-3"
308
- })) : (j(), h(L(ge), {
308
+ })) : (E(), h(L(ge), {
309
309
  key: 2,
310
310
  class: "w-3 h-3"
311
311
  })), C(" " + N(x.value), 1)], 2)
312
312
  ]),
313
- n.value && r.part.errorText ? (j(), k("div", st, N(r.part.errorText), 1)) : y("", !0),
314
- m.value ? (j(), k("details", rt, [w("summary", lt, N(L(l)("pptx.ai.toolDetails")), 1), w("div", ot, N(L(t)(r.part.toolName)) + ": " + N(m.value), 1)])) : y("", !0)
313
+ n.value && r.part.errorText ? (E(), k("div", st, N(r.part.errorText), 1)) : y("", !0),
314
+ m.value ? (E(), k("details", rt, [w("summary", lt, N(L(l)("pptx.ai.toolDetails")), 1), w("div", ot, N(L(t)(r.part.toolName)) + ": " + N(m.value), 1)])) : y("", !0)
315
315
  ]));
316
316
  }
317
317
  }), it = {
@@ -339,25 +339,25 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
339
339
  const s = t, { t: l } = e(), o = M(null);
340
340
  return H(() => [s.messages, s.isStreaming], () => {
341
341
  T(() => o.value?.scrollIntoView({ block: "end" }));
342
- }, { deep: !0 }), (e, t) => 0 === s.messages.length ? (j(), k("div", it, [
342
+ }, { deep: !0 }), (e, t) => 0 === s.messages.length ? (E(), k("div", it, [
343
343
  P(L(de), { class: "w-7 h-7 text-primary/70" }),
344
344
  w("p", pt, N(L(l)("pptx.ai.emptyTitle")), 1),
345
345
  w("p", dt, N(L(l)("pptx.ai.emptyHint")), 1)
346
- ])) : (j(), k("div", ct, [
347
- (j(!0), k(f, null, F(s.messages, (e) => (j(), k(f, { key: e.id }, ["user" === e.role || L(r)(e).length > 0 ? (j(), k("div", ut, [w("div", {
346
+ ])) : (E(), k("div", ct, [
347
+ (E(!0), k(f, null, F(s.messages, (e) => (E(), k(f, { key: e.id }, ["user" === e.role || L(r)(e).length > 0 ? (E(), k("div", ut, [w("div", {
348
348
  class: I(L(a)("mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full", "user" === e.role ? "bg-secondary text-muted-foreground" : "bg-primary/15 text-primary")),
349
349
  "aria-label": "user" === e.role ? L(l)("pptx.ai.you") : L(l)("pptx.ai.assistant")
350
- }, ["user" === e.role ? (j(), h(L(be), {
350
+ }, ["user" === e.role ? (E(), h(L(be), {
351
351
  key: 0,
352
352
  class: "w-3.5 h-3.5"
353
- })) : (j(), h(L(K), {
353
+ })) : (E(), h(L(K), {
354
354
  key: 1,
355
355
  class: "w-3.5 h-3.5"
356
- }))], 10, mt), w("div", xt, [(j(!0), k(f, null, F(L(r)(e), (e, t) => (j(), k(f, { key: "tool" === e.kind && e.toolCallId || t }, ["text" === e.kind ? (j(), k("p", gt, N(e.text), 1)) : (j(), h(nt, {
356
+ }))], 10, mt), w("div", xt, [(E(!0), k(f, null, F(L(r)(e), (e, t) => (E(), k(f, { key: "tool" === e.kind && e.toolCallId || t }, ["text" === e.kind ? (E(), k("p", gt, N(e.text), 1)) : (E(), h(nt, {
357
357
  key: 1,
358
358
  part: e
359
359
  }, null, 8, ["part"]))], 64))), 128))])])) : y("", !0)], 64))), 128)),
360
- s.isStreaming ? (j(), k("div", ft, [t[0] || (t[0] = w("span", { class: "inline-flex gap-1" }, [
360
+ s.isStreaming ? (E(), k("div", ft, [t[0] || (t[0] = w("span", { class: "inline-flex gap-1" }, [
361
361
  w("span", { class: "h-1.5 w-1.5 animate-bounce rounded-full bg-muted-foreground [animation-delay:-0.2s]" }),
362
362
  w("span", { class: "h-1.5 w-1.5 animate-bounce rounded-full bg-muted-foreground [animation-delay:-0.1s]" }),
363
363
  w("span", { class: "h-1.5 w-1.5 animate-bounce rounded-full bg-muted-foreground" })
@@ -377,10 +377,10 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
377
377
  emits: ["accept", "reject"],
378
378
  setup(t, { emit: a }) {
379
379
  const s = t, r = a, { t: l } = e(), o = v(() => s.proposal.summary.map(i));
380
- return (e, t) => (j(), k("div", vt, [
380
+ return (e, t) => (E(), k("div", vt, [
381
381
  w("div", ht, N(L(l)("pptx.ai.proposedChange")), 1),
382
382
  w("div", yt, N(s.proposal.label), 1),
383
- o.value.length > 0 ? (j(), k("ul", kt, [(j(!0), k(f, null, F(o.value, (e, t) => (j(), k("li", {
383
+ o.value.length > 0 ? (E(), k("ul", kt, [(E(!0), k(f, null, F(o.value, (e, t) => (E(), k("li", {
384
384
  key: t,
385
385
  class: "break-words"
386
386
  }, N(e), 1))), 128))])) : y("", !0),
@@ -395,14 +395,14 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
395
395
  }, [P(L(he), { class: "w-3.5 h-3.5" }), C(" " + N(L(l)("pptx.ai.reject")), 1)])])
396
396
  ]));
397
397
  }
398
- }), Pt = { class: "relative flex min-h-0 flex-1 flex-col" }, St = { class: "flex items-center gap-1 border-b border-border px-2 py-1" }, Tt = { class: "ml-auto flex items-center gap-0.5" }, It = ["title", "aria-label"], _t = [
398
+ }), Pt = { class: "relative flex min-h-0 flex-1 flex-col" }, St = { class: "flex items-center gap-1 border-b border-border px-2 py-1" }, Tt = { class: "ml-auto flex items-center gap-0.5" }, It = ["title", "aria-label"], jt = [
399
399
  "title",
400
400
  "aria-label",
401
401
  "disabled"
402
- ], At = {
402
+ ], _t = {
403
403
  key: 1,
404
404
  class: "mx-3 mb-2 flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/5 px-2.5 py-1.5 text-[12px] text-destructive"
405
- }, Et = { class: "min-w-0 flex-1" }, jt = { class: "font-medium" }, Mt = { class: "max-h-24 overflow-y-auto break-words text-[11px] opacity-80" }, Ft = {
405
+ }, At = { class: "min-w-0 flex-1" }, Et = { class: "font-medium" }, Mt = { class: "max-h-24 overflow-y-auto break-words text-[11px] opacity-80" }, Ft = {
406
406
  key: 2,
407
407
  class: "max-h-[38%] space-y-2 overflow-y-auto border-t border-border bg-background px-3 py-2"
408
408
  }, Bt = { class: "flex items-center justify-between" }, Dt = { class: "text-[11px] font-semibold uppercase tracking-wide text-muted-foreground" }, Nt = S({
@@ -430,7 +430,7 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
430
430
  }), s = M(a.activeChatId()), r = () => {
431
431
  s.value = a.activeChatId();
432
432
  };
433
- return H(e.messages, () => a.notifyMessagesChanged(), { deep: !0 }), A(() => a.dispose()), {
433
+ return H(e.messages, () => a.notifyMessagesChanged(), { deep: !0 }), _(() => a.dispose()), {
434
434
  chats: t,
435
435
  activeChatId: s,
436
436
  refresh: () => a.refresh(),
@@ -452,10 +452,10 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
452
452
  i.value = e;
453
453
  },
454
454
  untitledLabel: l("pptx.ai.untitledChat")
455
- }), _ = M(!1), E = r.session.changeAnimator.subscribe((e) => {
455
+ }), j = M(!1), A = r.session.changeAnimator.subscribe((e) => {
456
456
  e && r.bridge.goToSlide(e.slideIndex), r.aiPanel.showChangeBatch(e);
457
457
  });
458
- A(() => E());
458
+ _(() => A());
459
459
  const B = v(() => r.aiPanel.pickTargets.value.length > 0), D = v(() => B.value ? r.aiPanel.pickTargets.value : r.aiPanel.pinnedFocus.value ?? r.aiPanel.liveFocusTargets.value), R = v(() => !B.value && null !== r.aiPanel.pinnedFocus.value);
460
460
  function z(e) {
461
461
  r.aiPanel.flashToolTarget(null), b(e);
@@ -463,26 +463,26 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
463
463
  function V() {
464
464
  r.aiPanel.flashToolTarget(null), T();
465
465
  }
466
- return (e, t) => (j(), k("div", Pt, [
466
+ return (e, t) => (E(), k("div", Pt, [
467
467
  w("div", St, [w("button", {
468
468
  type: "button",
469
- class: "inline-flex items-center gap-1 rounded-sm px-1.5 py-1 text-[12px] text-muted-foreground hover:bg-accent",
470
- onClick: t[0] || (t[0] = (e) => _.value = !_.value)
469
+ class: "inline-flex items-center gap-1 rounded-sm px-1.5 py-1 text-[12px] text-muted-foreground hover:bg-accent max-md:min-h-[44px]!",
470
+ onClick: t[0] || (t[0] = (e) => j.value = !j.value)
471
471
  }, [P(L(Q), { class: "w-3.5 h-3.5" }), C(" " + N(L(l)("pptx.ai.chats")), 1)]), w("div", Tt, [w("button", {
472
472
  type: "button",
473
473
  title: L(l)("pptx.ai.newChat"),
474
474
  "aria-label": L(l)("pptx.ai.newChat"),
475
- class: "rounded-sm p-1 text-muted-foreground hover:bg-accent",
475
+ class: "rounded-sm p-1 text-muted-foreground hover:bg-accent flex items-center justify-center max-md:min-w-[44px]! max-md:min-h-[44px]!",
476
476
  onClick: t[1] || (t[1] = (e) => L(I).newChat())
477
477
  }, [P(L(ee), { class: "w-3.5 h-3.5" })], 8, It), w("button", {
478
478
  type: "button",
479
479
  title: L(l)("pptx.ai.clearChat"),
480
480
  "aria-label": L(l)("pptx.ai.clearChat"),
481
481
  disabled: 0 === L(i).length,
482
- class: "rounded-sm p-1 text-muted-foreground hover:bg-accent disabled:opacity-40",
482
+ class: "rounded-sm p-1 text-muted-foreground hover:bg-accent disabled:opacity-40 flex items-center justify-center max-md:min-w-[44px]! max-md:min-h-[44px]!",
483
483
  onClick: t[2] || (t[2] = (e) => L(I).clearCurrent())
484
- }, [P(L(xe), { class: "w-3.5 h-3.5" })], 8, _t)])]),
485
- _.value ? (j(), h(et, {
484
+ }, [P(L(xe), { class: "w-3.5 h-3.5" })], 8, jt)])]),
485
+ j.value ? (E(), h(et, {
486
486
  key: 0,
487
487
  chats: L(I).chats.value,
488
488
  "active-chat-id": L(I).activeChatId.value,
@@ -493,7 +493,7 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
493
493
  L(I).deleteChat(e);
494
494
  }),
495
495
  onNewChat: t[5] || (t[5] = (e) => L(I).newChat()),
496
- onClose: t[6] || (t[6] = (e) => _.value = !1)
496
+ onClose: t[6] || (t[6] = (e) => j.value = !1)
497
497
  }, null, 8, ["chats", "active-chat-id"])) : y("", !0),
498
498
  P(Ke, {
499
499
  targets: D.value,
@@ -524,27 +524,27 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
524
524
  messages: L(i),
525
525
  "is-streaming": L(d)
526
526
  }, null, 8, ["messages", "is-streaming"]),
527
- L(p) ? (j(), k("div", At, [
527
+ L(p) ? (E(), k("div", _t, [
528
528
  P(L(ge), { class: "mt-0.5 w-3.5 h-3.5 shrink-0" }),
529
- w("div", Et, [w("div", jt, N(L(l)("pptx.ai.errorPrefix")), 1), w("div", Mt, N(L(p).message), 1)]),
529
+ w("div", At, [w("div", Et, N(L(l)("pptx.ai.errorPrefix")), 1), w("div", Mt, N(L(p).message), 1)]),
530
530
  w("button", {
531
531
  type: "button",
532
532
  class: "shrink-0 rounded-sm px-1.5 py-0.5 text-[11px] underline-offset-2 hover:underline",
533
533
  onClick: t[7] || (t[7] = (...e) => L(g) && L(g)(...e))
534
534
  }, N(L(l)("pptx.ai.retry")), 1)
535
535
  ])) : y("", !0),
536
- L(c).length > 0 ? (j(), k("div", Ft, [w("div", Bt, [w("span", Dt, N(L(l)("pptx.ai.pendingChanges", { count: L(c).length })), 1), L(c).length > 1 ? (j(), k("button", {
536
+ L(c).length > 0 ? (E(), k("div", Ft, [w("div", Bt, [w("span", Dt, N(L(l)("pptx.ai.pendingChanges", { count: L(c).length })), 1), L(c).length > 1 ? (E(), k("button", {
537
537
  key: 0,
538
538
  type: "button",
539
539
  class: "rounded-sm bg-primary/90 px-2 py-0.5 text-[11px] font-medium text-primary-foreground hover:bg-primary",
540
540
  onClick: V
541
- }, N(L(l)("pptx.ai.acceptAll")), 1)) : y("", !0)]), (j(!0), k(f, null, F(L(c), (e) => (j(), h(Ct, {
541
+ }, N(L(l)("pptx.ai.acceptAll")), 1)) : y("", !0)]), (E(!0), k(f, null, F(L(c), (e) => (E(), h(Ct, {
542
542
  key: e.id,
543
543
  proposal: e,
544
544
  onAccept: z,
545
545
  onReject: L(S)
546
546
  }, null, 8, ["proposal", "onReject"]))), 128))])) : y("", !0),
547
- P(Ee, {
547
+ P(Ae, {
548
548
  "is-streaming": L(d),
549
549
  "prefill-text": r.aiPanel.prefill.value.text,
550
550
  "prefill-nonce": r.aiPanel.prefill.value.nonce,
@@ -602,10 +602,10 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
602
602
  selectedElementIds: M([]),
603
603
  selectedElement: () => null
604
604
  }), x = v(() => s.aiPanel ?? m);
605
- return (e, t) => (j(), k("div", {
605
+ return (e, t) => (E(), k("div", {
606
606
  "data-pptx-ai-panel": "",
607
607
  class: "absolute right-0 top-0 z-30 flex h-full w-80 flex-col border-l border-border bg-card shadow-xl max-md:inset-x-0 max-md:top-auto max-md:bottom-0 max-md:h-[75dvh] max-md:w-full max-md:rounded-t-2xl max-md:border-l-0 max-md:border-t max-md:shadow-2xl",
608
- style: _(u.value)
608
+ style: j(u.value)
609
609
  }, [w("div", Lt, [
610
610
  P(L(de), { class: "w-4 h-4 text-primary" }),
611
611
  w("span", Rt, N(L(o)("pptx.ai.title")), 1),
@@ -613,14 +613,14 @@ var Se = { class: "border-t border-border p-2" }, Te = { class: "flex items-end
613
613
  type: "button",
614
614
  title: L(o)("pptx.ai.close"),
615
615
  "aria-label": L(o)("pptx.ai.close"),
616
- class: "ml-auto rounded-sm p-1 text-muted-foreground transition-colors hover:bg-accent",
616
+ class: "ml-auto flex items-center justify-center rounded-sm p-1 text-muted-foreground transition-colors hover:bg-accent max-md:min-w-[44px]! max-md:min-h-[44px]!",
617
617
  onClick: t[0] || (t[0] = (e) => r("close"))
618
618
  }, [P(L(he), { class: "w-4 h-4" })], 8, Ht)
619
- ]), "checking" === L(i) ? (j(), k("div", Wt, [P(L(Y), { class: "w-5 h-5 animate-spin" })])) : "unavailable" === L(i) || "error" === L(i) ? (j(), k("div", zt, [
619
+ ]), "checking" === L(i) ? (E(), k("div", Wt, [P(L(Y), { class: "w-5 h-5 animate-spin" })])) : "unavailable" === L(i) || "error" === L(i) ? (E(), k("div", zt, [
620
620
  P(L(ge), { class: "w-6 h-6 text-muted-foreground" }),
621
621
  w("p", Vt, N(L(o)("pptx.ai.unavailableTitle")), 1),
622
622
  w("p", Kt, N(L(c)?.message ?? L(o)("pptx.ai.unavailableHint")), 1)
623
- ])) : "ready" === L(i) && L(p) ? (j(), h(b, { key: 2 }, {
623
+ ])) : "ready" === L(i) && L(p) ? (E(), h(b, { key: 2 }, {
624
624
  fallback: z(() => [w("div", Ot, [P(L(Y), { class: "w-5 h-5 animate-spin" })])]),
625
625
  default: z(() => [P(Nt, {
626
626
  session: L(p),
Binary file
Binary file