pptx-vue-viewer 2.13.2 → 2.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 (183) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/AiChatPanel-B8QSMoWW.cjs +637 -0
  3. package/dist/AiChatPanel-B8QSMoWW.cjs.br +0 -0
  4. package/dist/AiChatPanel-B8QSMoWW.cjs.gz +0 -0
  5. package/dist/AiChatPanel-C9tDF9w2.js +640 -0
  6. package/dist/AiChatPanel-C9tDF9w2.js.br +0 -0
  7. package/dist/AiChatPanel-C9tDF9w2.js.gz +0 -0
  8. package/dist/{dist-CrzKtRxp.js → dist-BRLnKo1Y.js} +9103 -7402
  9. package/dist/dist-BRLnKo1Y.js.br +0 -0
  10. package/dist/dist-BRLnKo1Y.js.gz +0 -0
  11. package/dist/{dist-CNLUj2f9.cjs → dist-DXA9RFq7.cjs} +9033 -7297
  12. package/dist/dist-DXA9RFq7.cjs.br +0 -0
  13. package/dist/dist-DXA9RFq7.cjs.gz +0 -0
  14. package/dist/gif-encoder-DQpum4Kn.js +2 -0
  15. package/dist/gif-encoder-DQpum4Kn.js.br +0 -0
  16. package/dist/gif-encoder-DQpum4Kn.js.gz +0 -0
  17. package/dist/gif-encoder-FBevv6TW.cjs +2 -0
  18. package/dist/gif-encoder-FBevv6TW.cjs.br +0 -0
  19. package/dist/gif-encoder-FBevv6TW.cjs.gz +0 -0
  20. package/dist/{i18n-CX6HlMNo.cjs → i18n-Bm1FdvTe.cjs} +73 -2
  21. package/dist/i18n-Bm1FdvTe.cjs.br +0 -0
  22. package/dist/i18n-Bm1FdvTe.cjs.gz +0 -0
  23. package/dist/{i18n-BPiHp_k5.js → i18n-vGMsvpN1.js} +73 -2
  24. package/dist/i18n-vGMsvpN1.js.br +0 -0
  25. package/dist/i18n-vGMsvpN1.js.gz +0 -0
  26. package/dist/i18n.cjs +1 -1
  27. package/dist/i18n.cjs.br +0 -0
  28. package/dist/i18n.cjs.gz +0 -0
  29. package/dist/i18n.js +1 -1
  30. package/dist/i18n.js.br +0 -0
  31. package/dist/i18n.js.gz +0 -0
  32. package/dist/index.cjs +1 -1
  33. package/dist/index.cjs.br +0 -0
  34. package/dist/index.cjs.gz +0 -0
  35. package/dist/index.js +3 -3
  36. package/dist/index.js.br +0 -0
  37. package/dist/index.js.gz +0 -0
  38. package/dist/internals.cjs +2 -2
  39. package/dist/internals.cjs.br +0 -0
  40. package/dist/internals.cjs.gz +0 -0
  41. package/dist/internals.d.ts +1 -0
  42. package/dist/internals.d.ts.map +1 -1
  43. package/dist/internals.js +2 -2
  44. package/dist/internals.js.br +0 -0
  45. package/dist/internals.js.gz +0 -0
  46. package/dist/pptx-vue-viewer.css +1 -1
  47. package/dist/pptx-vue-viewer.css.br +0 -0
  48. package/dist/pptx-vue-viewer.css.gz +0 -0
  49. package/dist/{useViewerSettingsDialog-BSsouEGv.cjs → useViewerSettingsDialog-CMHLo-CP.cjs} +10922 -6219
  50. package/dist/useViewerSettingsDialog-CMHLo-CP.cjs.br +0 -0
  51. package/dist/useViewerSettingsDialog-CMHLo-CP.cjs.gz +0 -0
  52. package/dist/useViewerSettingsDialog-CfaQyiWy.js +33412 -0
  53. package/dist/useViewerSettingsDialog-CfaQyiWy.js.br +0 -0
  54. package/dist/useViewerSettingsDialog-CfaQyiWy.js.gz +0 -0
  55. package/dist/viewer/PowerPointViewer.vue.d.ts.map +1 -1
  56. package/dist/viewer/components/AccessibilityPanel.vue.d.ts.map +1 -1
  57. package/dist/viewer/components/ChartRenderer.vue.d.ts +2 -0
  58. package/dist/viewer/components/ChartRenderer.vue.d.ts.map +1 -1
  59. package/dist/viewer/components/CommentMarkersOverlay.vue.d.ts +4 -3
  60. package/dist/viewer/components/CommentMarkersOverlay.vue.d.ts.map +1 -1
  61. package/dist/viewer/components/ElementImageBox.vue.d.ts +2 -0
  62. package/dist/viewer/components/ElementImageBox.vue.d.ts.map +1 -1
  63. package/dist/viewer/components/ElementMediaBox.vue.d.ts +2 -0
  64. package/dist/viewer/components/ElementMediaBox.vue.d.ts.map +1 -1
  65. package/dist/viewer/components/ElementRenderer.vue.d.ts +8 -0
  66. package/dist/viewer/components/ElementRenderer.vue.d.ts.map +1 -1
  67. package/dist/viewer/components/InlineTextEditor.vue.d.ts.map +1 -1
  68. package/dist/viewer/components/MobileMenuSheet.vue.d.ts.map +1 -1
  69. package/dist/viewer/components/PresentationAnnotationOverlay.vue.d.ts +10 -1
  70. package/dist/viewer/components/PresentationAnnotationOverlay.vue.d.ts.map +1 -1
  71. package/dist/viewer/components/PresentationAudienceOverlays.vue.d.ts.map +1 -1
  72. package/dist/viewer/components/PresentationMode.vue.d.ts.map +1 -1
  73. package/dist/viewer/components/PresentationToolbar.vue.d.ts +6 -0
  74. package/dist/viewer/components/PresentationToolbar.vue.d.ts.map +1 -1
  75. package/dist/viewer/components/SelectionOverlay.vue.d.ts +9 -20
  76. package/dist/viewer/components/SelectionOverlay.vue.d.ts.map +1 -1
  77. package/dist/viewer/components/SelectionPane.vue.d.ts +13 -4
  78. package/dist/viewer/components/SelectionPane.vue.d.ts.map +1 -1
  79. package/dist/viewer/components/ShapeEffectOverlay.vue.d.ts.map +1 -1
  80. package/dist/viewer/components/SlideStage.vue.d.ts.map +1 -1
  81. package/dist/viewer/components/SlideTemplateGalleryDialog.vue.d.ts +27 -0
  82. package/dist/viewer/components/SlideTemplateGalleryDialog.vue.d.ts.map +1 -0
  83. package/dist/viewer/components/SlideTemplatePreview.vue.d.ts +20 -0
  84. package/dist/viewer/components/SlideTemplatePreview.vue.d.ts.map +1 -0
  85. package/dist/viewer/components/SmartArtRenderer.vue.d.ts +2 -0
  86. package/dist/viewer/components/SmartArtRenderer.vue.d.ts.map +1 -1
  87. package/dist/viewer/components/TableRenderer.vue.d.ts +2 -0
  88. package/dist/viewer/components/TableRenderer.vue.d.ts.map +1 -1
  89. package/dist/viewer/components/ViewerSidePanels.vue.d.ts.map +1 -1
  90. package/dist/viewer/components/ZoomRenderer.vue.d.ts.map +1 -1
  91. package/dist/viewer/components/ai/AiConversation.vue.d.ts.map +1 -1
  92. package/dist/viewer/components/ai/AiHistoryMenu.vue.d.ts +19 -0
  93. package/dist/viewer/components/ai/AiHistoryMenu.vue.d.ts.map +1 -0
  94. package/dist/viewer/components/ribbon/HomeSection.vue.d.ts +4 -0
  95. package/dist/viewer/components/ribbon/HomeSection.vue.d.ts.map +1 -1
  96. package/dist/viewer/components/ribbon/InsertSection.vue.d.ts +2 -2
  97. package/dist/viewer/components/ribbon/InsertSection.vue.d.ts.map +1 -1
  98. package/dist/viewer/components/ribbon/RibbonToolbar.vue.d.ts.map +1 -1
  99. package/dist/viewer/components/ribbon/SlidesGroup.vue.d.ts +4 -0
  100. package/dist/viewer/components/ribbon/SlidesGroup.vue.d.ts.map +1 -1
  101. package/dist/viewer/components/ribbon/file-section-actions.d.ts +2 -1
  102. package/dist/viewer/components/ribbon/file-section-actions.d.ts.map +1 -1
  103. package/dist/viewer/components/ribbon/file-section-types.d.ts +2 -0
  104. package/dist/viewer/components/ribbon/file-section-types.d.ts.map +1 -1
  105. package/dist/viewer/components/ribbon/ribbon-props-fixture.d.ts.map +1 -1
  106. package/dist/viewer/components/ribbon/ribbon-types.d.ts +9 -3
  107. package/dist/viewer/components/ribbon/ribbon-types.d.ts.map +1 -1
  108. package/dist/viewer/components/selection-overlay-geometry.d.ts +73 -0
  109. package/dist/viewer/components/selection-overlay-geometry.d.ts.map +1 -0
  110. package/dist/viewer/composables/ai/useAiChatHistory.d.ts +24 -0
  111. package/dist/viewer/composables/ai/useAiChatHistory.d.ts.map +1 -0
  112. package/dist/viewer/composables/collaboration-presence-view.d.ts +19 -3
  113. package/dist/viewer/composables/collaboration-presence-view.d.ts.map +1 -1
  114. package/dist/viewer/composables/deck-data.d.ts +7 -0
  115. package/dist/viewer/composables/deck-data.d.ts.map +1 -0
  116. package/dist/viewer/composables/element-style.d.ts.map +1 -1
  117. package/dist/viewer/composables/ribbon-props-actions.d.ts +3 -1
  118. package/dist/viewer/composables/ribbon-props-actions.d.ts.map +1 -1
  119. package/dist/viewer/composables/ribbon-props-state.d.ts +1 -0
  120. package/dist/viewer/composables/ribbon-props-state.d.ts.map +1 -1
  121. package/dist/viewer/composables/ribbon-props-types.d.ts +8 -4
  122. package/dist/viewer/composables/ribbon-props-types.d.ts.map +1 -1
  123. package/dist/viewer/composables/selection-gesture.d.ts +38 -0
  124. package/dist/viewer/composables/selection-gesture.d.ts.map +1 -0
  125. package/dist/viewer/composables/useCollaboration.d.ts.map +1 -1
  126. package/dist/viewer/composables/useCommandDispatch.d.ts +3 -2
  127. package/dist/viewer/composables/useCommandDispatch.d.ts.map +1 -1
  128. package/dist/viewer/composables/useElementInsertion.d.ts +3 -2
  129. package/dist/viewer/composables/useElementInsertion.d.ts.map +1 -1
  130. package/dist/viewer/composables/useExportWiring.d.ts +4 -1
  131. package/dist/viewer/composables/useExportWiring.d.ts.map +1 -1
  132. package/dist/viewer/composables/useSelectionPaneWiring.d.ts +6 -2
  133. package/dist/viewer/composables/useSelectionPaneWiring.d.ts.map +1 -1
  134. package/dist/viewer/composables/useSlideTemplateInsertion.d.ts +30 -0
  135. package/dist/viewer/composables/useSlideTemplateInsertion.d.ts.map +1 -0
  136. package/dist/viewer/composables/useViewerRibbonProps.d.ts +5 -1
  137. package/dist/viewer/composables/useViewerRibbonProps.d.ts.map +1 -1
  138. package/dist/viewer/composables/useViewerStore.d.ts +5 -0
  139. package/dist/viewer/composables/useViewerStore.d.ts.map +1 -0
  140. package/dist/viewer/composables/useViewerZoom.d.ts +3 -0
  141. package/dist/viewer/composables/useViewerZoom.d.ts.map +1 -1
  142. package/dist/viewer/index.cjs +1 -1
  143. package/dist/viewer/index.cjs.br +0 -0
  144. package/dist/viewer/index.cjs.gz +0 -0
  145. package/dist/viewer/index.js +3 -3
  146. package/dist/viewer/index.js.br +0 -0
  147. package/dist/viewer/index.js.gz +0 -0
  148. package/dist/{viewer-CKGNkLtj.cjs → viewer-4-O3wMK_.cjs} +5925 -5522
  149. package/dist/viewer-4-O3wMK_.cjs.br +0 -0
  150. package/dist/viewer-4-O3wMK_.cjs.gz +0 -0
  151. package/dist/{viewer-BVGVczOF.js → viewer-smczRer1.js} +10499 -10105
  152. package/dist/viewer-smczRer1.js.br +0 -0
  153. package/dist/viewer-smczRer1.js.gz +0 -0
  154. package/package.json +1 -1
  155. package/dist/AiChatPanel-CtoBtOtB.cjs +0 -509
  156. package/dist/AiChatPanel-CtoBtOtB.cjs.br +0 -0
  157. package/dist/AiChatPanel-CtoBtOtB.cjs.gz +0 -0
  158. package/dist/AiChatPanel-xSeCJVHJ.js +0 -512
  159. package/dist/AiChatPanel-xSeCJVHJ.js.br +0 -0
  160. package/dist/AiChatPanel-xSeCJVHJ.js.gz +0 -0
  161. package/dist/dist-CNLUj2f9.cjs.br +0 -0
  162. package/dist/dist-CNLUj2f9.cjs.gz +0 -0
  163. package/dist/dist-CrzKtRxp.js.br +0 -0
  164. package/dist/dist-CrzKtRxp.js.gz +0 -0
  165. package/dist/gif-encoder-N24YqPHj.js +0 -2
  166. package/dist/gif-encoder-N24YqPHj.js.br +0 -0
  167. package/dist/gif-encoder-N24YqPHj.js.gz +0 -0
  168. package/dist/gif-encoder-xPQiQFxW.cjs +0 -2
  169. package/dist/gif-encoder-xPQiQFxW.cjs.br +0 -0
  170. package/dist/gif-encoder-xPQiQFxW.cjs.gz +0 -0
  171. package/dist/i18n-BPiHp_k5.js.br +0 -0
  172. package/dist/i18n-BPiHp_k5.js.gz +0 -0
  173. package/dist/i18n-CX6HlMNo.cjs.br +0 -0
  174. package/dist/i18n-CX6HlMNo.cjs.gz +0 -0
  175. package/dist/useViewerSettingsDialog-BSsouEGv.cjs.br +0 -0
  176. package/dist/useViewerSettingsDialog-BSsouEGv.cjs.gz +0 -0
  177. package/dist/useViewerSettingsDialog-CiRnHsjC.js +0 -28789
  178. package/dist/useViewerSettingsDialog-CiRnHsjC.js.br +0 -0
  179. package/dist/useViewerSettingsDialog-CiRnHsjC.js.gz +0 -0
  180. package/dist/viewer-BVGVczOF.js.br +0 -0
  181. package/dist/viewer-BVGVczOF.js.gz +0 -0
  182. package/dist/viewer-CKGNkLtj.cjs.br +0 -0
  183. package/dist/viewer-CKGNkLtj.cjs.gz +0 -0
@@ -0,0 +1,640 @@
1
+ import { gn as e } from "./useViewerSettingsDialog-CfaQyiWy.js";
2
+ import { _ as t, b as a, c as s, f as r, g as l, h as o, m as n, o as i, p, s as d, v as c, w as u, x as m, y as x } from "./viewer-smczRer1.js";
3
+ import { Fragment as g, Suspense as f, computed as b, createBlock as v, createCommentVNode as h, createElementBlock as y, createElementVNode as k, createTextVNode as w, createVNode as C, defineComponent as P, nextTick as S, normalizeClass as T, normalizeStyle as I, onBeforeUnmount as _, onMounted as A, openBlock as E, ref as j, renderList as M, resolveDynamicComponent as F, shallowRef as B, toDisplayString as D, unref as N, vModelText as L, watch as R, withAsyncContext as H, withCtx as W, withDirectives as $ } from "vue";
4
+ import { Bot as z, ChartColumn as V, Check as K, Crosshair as O, Eye as U, Film as q, GitMerge as G, History as J, LayoutTemplate as Q, LoaderCircle as X, MessageSquare as Y, MessageSquarePlus as Z, Move as ee, Navigation as te, Palette as ae, Pin as se, PinOff as re, Plus as le, Search as oe, Send as ne, Shapes as ie, Sparkles as pe, Square as de, StickyNote as ce, Table as ue, Trash2 as me, TriangleAlert as xe, Type as ge, User as fe, Wrench as be, X as ve } from "lucide-vue-next";
5
+ import { getToolOrDynamicToolName as he, isDynamicToolUIPart as ye, isToolUIPart as ke } from "ai";
6
+ var we = /* @__PURE__ */ new Set([
7
+ "input-available",
8
+ "output-available",
9
+ "output-error"
10
+ ]);
11
+ function Ce(e, t, s, r = {}) {
12
+ const l = j(t.proposals.list()), o = () => {
13
+ l.value = t.proposals.list();
14
+ }, n = e({
15
+ transport: t.transport,
16
+ sendAutomaticallyWhen: t.sendAutomaticallyWhen,
17
+ onError: (e) => s.onError?.(e),
18
+ onToolCall: async ({ toolCall: e }) => {
19
+ const { toolName: a, toolCallId: s, input: r } = e, l = n.addToolOutput;
20
+ try {
21
+ l({
22
+ tool: a,
23
+ toolCallId: s,
24
+ output: await t.executeToolCall(a, r)
25
+ });
26
+ } catch (e) {
27
+ l({
28
+ tool: a,
29
+ toolCallId: s,
30
+ state: "output-error",
31
+ errorText: e instanceof Error ? e.message : String(e)
32
+ });
33
+ }
34
+ o();
35
+ }
36
+ }), i = b(() => "submitted" === n.status.value || "streaming" === n.status.value), p = /* @__PURE__ */ new Set();
37
+ R(n.messages, (e) => {
38
+ for (const t of function(e) {
39
+ const t = [];
40
+ for (const a of e) for (const e of a.parts) {
41
+ if (!ke(e) && !ye(e)) continue;
42
+ const a = e, s = a.toolCallId ?? "";
43
+ 0 !== s.length && void 0 !== a.input && we.has(a.state ?? "") && t.push({
44
+ toolName: he(e),
45
+ toolCallId: s,
46
+ input: a.input
47
+ });
48
+ }
49
+ return t;
50
+ }(e)) p.has(t.toolCallId) || (p.add(t.toolCallId), r.onToolTarget?.(a(t.toolName, t.input)));
51
+ }, { deep: !0 });
52
+ return {
53
+ messages: n.messages,
54
+ status: n.status,
55
+ error: n.error,
56
+ isStreaming: i,
57
+ proposals: l,
58
+ send: (e) => {
59
+ const t = e.trim();
60
+ 0 !== t.length && n.sendMessage({ text: t });
61
+ },
62
+ stop: () => {
63
+ n.stop();
64
+ },
65
+ clearError: () => n.clearError(),
66
+ applyProposal: (e) => {
67
+ t.proposals.apply(e), o();
68
+ },
69
+ rejectProposal: (e) => {
70
+ t.proposals.revert(e), o();
71
+ },
72
+ acceptAllProposals: () => {
73
+ t.proposals.acceptAll(), o();
74
+ }
75
+ };
76
+ }
77
+ var Pe = { class: "border-t border-border p-2" }, Se = { class: "flex items-end gap-1.5 rounded-md border border-input bg-background px-2 py-1.5 focus-within:border-ring" }, Te = ["placeholder", "aria-label"], Ie = ["title", "aria-label"], _e = [
78
+ "disabled",
79
+ "title",
80
+ "aria-label"
81
+ ], Ae = P({
82
+ __name: "AiComposer",
83
+ props: {
84
+ isStreaming: { type: Boolean },
85
+ prefillText: {},
86
+ prefillNonce: {}
87
+ },
88
+ emits: ["send", "stop"],
89
+ setup(t, { emit: a }) {
90
+ const s = t, r = a, { t: l } = e(), o = j(""), n = j(null), i = b(() => o.value.trim().length > 0);
91
+ function p() {
92
+ const e = o.value.trim();
93
+ 0 === e.length || s.isStreaming || (r("send", e), o.value = "");
94
+ }
95
+ function d(e) {
96
+ "Enter" !== e.key || e.shiftKey || (e.preventDefault(), p());
97
+ }
98
+ return R(() => s.prefillNonce, (e) => {
99
+ void 0 !== e && 0 !== e && (s.prefillText && (o.value = s.prefillText), S(() => n.value?.focus()));
100
+ }), (e, t) => (E(), y("div", Pe, [k("div", Se, [$(k("textarea", {
101
+ ref_key: "textareaRef",
102
+ ref: n,
103
+ "onUpdate:modelValue": t[0] || (t[0] = (e) => o.value = e),
104
+ rows: 1,
105
+ placeholder: N(l)("pptx.ai.placeholder"),
106
+ "aria-label": N(l)("pptx.ai.placeholder"),
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
+ onKeydown: d
109
+ }, null, 40, Te), [[L, o.value]]), s.isStreaming ? (E(), y("button", {
110
+ key: 0,
111
+ type: "button",
112
+ title: N(l)("pptx.ai.stop"),
113
+ "aria-label": N(l)("pptx.ai.stop"),
114
+ class: "shrink-0 rounded-sm p-1.5 text-muted-foreground transition-colors hover:bg-accent",
115
+ onClick: t[1] || (t[1] = (e) => r("stop"))
116
+ }, [C(N(de), { class: "w-4 h-4" })], 8, Ie)) : (E(), y("button", {
117
+ key: 1,
118
+ type: "button",
119
+ disabled: !i.value,
120
+ title: N(l)("pptx.ai.send"),
121
+ "aria-label": N(l)("pptx.ai.send"),
122
+ class: T(N(u)("shrink-0 rounded-sm p-1.5 transition-colors", i.value ? "bg-primary text-primary-foreground hover:bg-primary/90" : "text-muted-foreground/50")),
123
+ onClick: p
124
+ }, [C(N(ne), { class: "w-4 h-4" })], 10, _e))])]));
125
+ }
126
+ }), Ee = { class: "border-b border-border bg-secondary/30" }, je = { class: "flex flex-wrap items-center gap-1 px-2.5 py-1.5" }, Me = { class: "text-[10px] font-semibold uppercase tracking-wide text-muted-foreground" }, Fe = ["title"], Be = { class: "truncate" }, De = {
127
+ key: 0,
128
+ class: "rounded-full bg-primary/15 px-1.5 py-0.5 text-[10px] font-medium text-primary"
129
+ }, Ne = { class: "ml-auto flex items-center gap-0.5" }, Le = [
130
+ "title",
131
+ "aria-label",
132
+ "aria-pressed"
133
+ ], Re = ["title", "aria-label"], He = ["title", "aria-label"], We = {
134
+ key: 0,
135
+ class: "flex items-center gap-2 border-t border-primary/20 bg-primary/5 px-2.5 py-1"
136
+ }, $e = { class: "text-[11px] font-medium text-primary" }, ze = P({
137
+ __name: "AiFocusBar",
138
+ props: {
139
+ targets: {},
140
+ slides: {},
141
+ isPinned: { type: Boolean },
142
+ pickMode: { type: Boolean },
143
+ hasPicks: { type: Boolean }
144
+ },
145
+ emits: [
146
+ "pin",
147
+ "clear-pin",
148
+ "start-pick",
149
+ "stop-pick",
150
+ "clear-picks",
151
+ "send-directive"
152
+ ],
153
+ setup(t, { emit: a }) {
154
+ const r = t, l = a, { t: o } = e(), n = b(() => d(r.targets, r.slides)), i = b(() => s(r.targets, r.slides));
155
+ function p() {
156
+ const e = i.value;
157
+ e && l("send-directive", `Merge the two selected tables (elementIdA=${e.elementIdA}, elementIdB=${e.elementIdB}) on slide ${e.slideIndex + 1} using merge_tables; stage it now, do not ask me to confirm.`);
158
+ }
159
+ return (e, a) => (E(), y("div", Ee, [k("div", je, [
160
+ k("span", Me, D(N(o)("pptx.ai.focusScope")), 1),
161
+ (E(!0), y(g, null, M(n.value, (e) => (E(), y("span", {
162
+ key: e.key,
163
+ class: T(N(u)("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
+ title: e.title
165
+ }, [k("span", Be, D(e.label), 1)], 10, Fe))), 128)),
166
+ t.isPinned ? (E(), y("span", De, D(N(o)("pptx.ai.pinnedFocus")), 1)) : h("", !0),
167
+ k("div", Ne, [
168
+ i.value ? (E(), y("button", {
169
+ key: 0,
170
+ type: "button",
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",
172
+ onClick: p
173
+ }, [C(N(G), { class: "w-3 h-3" }), w(" " + D(N(o)("pptx.ai.mergeSelectedTables")), 1)])) : h("", !0),
174
+ k("button", {
175
+ type: "button",
176
+ title: N(o)("pptx.ai.pickElement"),
177
+ "aria-label": N(o)("pptx.ai.pickAria"),
178
+ "aria-pressed": t.pickMode,
179
+ class: T(N(u)("rounded-sm p-1", t.pickMode ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-accent")),
180
+ onClick: a[0] || (a[0] = (e) => t.pickMode ? l("stop-pick") : l("start-pick"))
181
+ }, [C(N(O), { class: "w-3.5 h-3.5" })], 10, Le),
182
+ t.hasPicks ? (E(), y("button", {
183
+ key: 1,
184
+ type: "button",
185
+ title: N(o)("pptx.ai.pickClear"),
186
+ "aria-label": N(o)("pptx.ai.pickClear"),
187
+ class: "rounded-sm p-1 text-muted-foreground hover:bg-accent",
188
+ onClick: a[1] || (a[1] = (e) => l("clear-picks"))
189
+ }, [C(N(ve), { class: "w-3.5 h-3.5" })], 8, Re)) : (E(), y("button", {
190
+ key: 2,
191
+ type: "button",
192
+ title: t.isPinned ? N(o)("pptx.ai.clearFocus") : N(o)("pptx.ai.pinFocus"),
193
+ "aria-label": t.isPinned ? N(o)("pptx.ai.clearFocus") : N(o)("pptx.ai.pinFocus"),
194
+ class: "rounded-sm p-1 text-muted-foreground hover:bg-accent",
195
+ onClick: a[2] || (a[2] = (e) => t.isPinned ? l("clear-pin") : l("pin"))
196
+ }, [t.isPinned ? (E(), v(N(re), {
197
+ key: 0,
198
+ class: "w-3.5 h-3.5"
199
+ })) : (E(), v(N(se), {
200
+ key: 1,
201
+ class: "w-3.5 h-3.5"
202
+ }))], 8, He))
203
+ ])
204
+ ]), t.pickMode ? (E(), y("div", We, [
205
+ C(N(O), { class: "w-3.5 h-3.5 shrink-0 animate-pulse text-primary" }),
206
+ k("span", $e, D(N(o)("pptx.ai.pickElementHint")), 1),
207
+ k("button", {
208
+ type: "button",
209
+ class: "ml-auto rounded-sm bg-primary px-2 py-0.5 text-[11px] font-medium text-primary-foreground hover:bg-primary/90",
210
+ onClick: a[3] || (a[3] = (e) => l("stop-pick"))
211
+ }, D(N(o)("pptx.ai.pickDone")), 1)
212
+ ])) : h("", !0)]));
213
+ }
214
+ }), Ve = { class: "flex items-center justify-between border-b border-border px-2.5 py-1.5" }, Ke = { class: "text-[11px] font-semibold uppercase tracking-wide text-muted-foreground" }, Oe = {
215
+ key: 0,
216
+ class: "px-3 py-4 text-center text-[12px] text-muted-foreground"
217
+ }, Ue = {
218
+ key: 1,
219
+ class: "max-h-64 overflow-y-auto py-1"
220
+ }, qe = ["onClick"], Ge = { class: "min-w-0 flex-1" }, Je = { class: "block truncate text-[12px] font-medium text-foreground" }, Qe = { class: "block text-[10px] text-muted-foreground" }, Xe = [
221
+ "title",
222
+ "aria-label",
223
+ "onClick"
224
+ ], Ye = { class: "border-t border-border px-2.5 py-1.5 text-[10px] text-muted-foreground" }, Ze = P({
225
+ __name: "AiHistoryMenu",
226
+ props: {
227
+ chats: {},
228
+ activeChatId: {}
229
+ },
230
+ emits: [
231
+ "resume",
232
+ "delete",
233
+ "new-chat",
234
+ "close"
235
+ ],
236
+ setup(t, { emit: a }) {
237
+ const s = t, r = a, { t: l } = e(), o = j(null);
238
+ function n(e) {
239
+ o.value && !o.value.contains(e.target) && r("close");
240
+ }
241
+ return A(() => document.addEventListener("mousedown", n)), _(() => document.removeEventListener("mousedown", n)), (e, t) => (E(), y("div", {
242
+ ref_key: "root",
243
+ ref: o,
244
+ class: "absolute right-2 top-10 z-40 w-64 rounded-md border border-border bg-popover shadow-xl"
245
+ }, [
246
+ k("div", Ve, [k("span", Ke, D(N(l)("pptx.ai.historyTitle")), 1), k("button", {
247
+ type: "button",
248
+ 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",
249
+ onClick: t[0] || (t[0] = (e) => {
250
+ r("new-chat"), r("close");
251
+ })
252
+ }, [C(N(le), { class: "w-3 h-3" }), w(" " + D(N(l)("pptx.ai.newChat")), 1)])]),
253
+ 0 === s.chats.length ? (E(), y("p", Oe, D(N(l)("pptx.ai.historyEmpty")), 1)) : (E(), y("ul", Ue, [(E(!0), y(g, null, M(s.chats, (e) => (E(), y("li", {
254
+ key: e.id,
255
+ class: "group flex items-center gap-1 px-1"
256
+ }, [k("button", {
257
+ type: "button",
258
+ class: T(["flex min-w-0 flex-1 items-start gap-2 rounded-sm px-2 py-1.5 text-left hover:bg-accent", e.id === s.activeChatId ? "bg-accent/60" : ""]),
259
+ onClick: (t) => {
260
+ r("resume", e.id), r("close");
261
+ }
262
+ }, [C(N(Y), { class: "mt-0.5 w-3.5 h-3.5 shrink-0 text-muted-foreground" }), k("span", Ge, [k("span", Je, D(e.title || N(l)("pptx.ai.untitledChat")), 1), k("span", Qe, D(N(l)("pptx.ai.messageCount", { count: e.messageCount })), 1)])], 10, qe), k("button", {
263
+ type: "button",
264
+ title: N(l)("pptx.ai.deleteChat"),
265
+ "aria-label": N(l)("pptx.ai.deleteChat"),
266
+ class: "shrink-0 rounded-sm p-1 text-muted-foreground hover:bg-destructive/10 hover:text-destructive",
267
+ onClick: (t) => r("delete", e.id)
268
+ }, [C(N(me), { class: "w-3.5 h-3.5" })], 8, Xe)]))), 128))])),
269
+ k("p", Ye, D(N(l)("pptx.ai.historyHint")), 1)
270
+ ], 512));
271
+ }
272
+ }), et = { class: "text-[12px]" }, tt = { class: "flex items-center gap-1.5" }, at = {
273
+ key: 0,
274
+ class: "mt-1 pl-5 text-[11px] text-destructive"
275
+ }, st = {
276
+ key: 1,
277
+ class: "group mt-0.5 pl-5"
278
+ }, rt = { class: "cursor-pointer list-none text-[10px] text-muted-foreground/70 hover:text-muted-foreground" }, lt = { class: "mt-0.5 break-words font-mono text-[10px] text-muted-foreground/80" }, ot = P({
279
+ __name: "AiToolCallCard",
280
+ props: { part: {} },
281
+ setup(t) {
282
+ const a = t, { t: s } = e(), r = {
283
+ view: U,
284
+ text: ge,
285
+ shape: ie,
286
+ theme: ae,
287
+ table: ue,
288
+ slide: Q,
289
+ chart: V,
290
+ move: ee,
291
+ delete: me,
292
+ search: oe,
293
+ nav: te,
294
+ animation: q,
295
+ notes: ce,
296
+ tool: be
297
+ }, l = b(() => "output-error" === a.part.state), n = b(() => "output-available" === a.part.state), i = b(() => !l.value && !n.value), p = b(() => o(a.part.toolName, a.part.input, i.value ? "present" : "past")), d = b(() => r[p.value.icon] ?? be), x = b(() => c(a.part.input)), g = b(() => l.value ? s("pptx.ai.toolFailed") : n.value ? s("pptx.ai.toolDone") : s("pptx.ai.toolRunning"));
298
+ return (e, t) => (E(), y("div", et, [
299
+ k("div", tt, [
300
+ (E(), v(F(d.value), { class: T(N(u)("w-3.5 h-3.5 shrink-0", l.value ? "text-destructive" : "text-muted-foreground")) }, null, 8, ["class"])),
301
+ k("span", { class: T(N(u)("truncate", l.value ? "text-destructive" : "text-foreground")) }, D(p.value.label), 3),
302
+ k("span", { class: T(N(u)("ml-auto inline-flex items-center gap-1 rounded-sm px-1.5 py-0.5 text-[10px]", l.value ? "bg-destructive/15 text-destructive" : n.value ? "bg-primary/10 text-primary" : "bg-muted text-muted-foreground")) }, [i.value ? (E(), v(N(X), {
303
+ key: 0,
304
+ class: "w-3 h-3 animate-spin"
305
+ })) : n.value ? (E(), v(N(K), {
306
+ key: 1,
307
+ class: "w-3 h-3"
308
+ })) : (E(), v(N(xe), {
309
+ key: 2,
310
+ class: "w-3 h-3"
311
+ })), w(" " + D(g.value), 1)], 2)
312
+ ]),
313
+ l.value && a.part.errorText ? (E(), y("div", at, D(a.part.errorText), 1)) : h("", !0),
314
+ x.value ? (E(), y("details", st, [k("summary", rt, D(N(s)("pptx.ai.toolDetails")), 1), k("div", lt, D(N(m)(a.part.toolName)) + ": " + D(x.value), 1)])) : h("", !0)
315
+ ]));
316
+ }
317
+ }), nt = {
318
+ key: 0,
319
+ class: "flex flex-1 flex-col items-center justify-center gap-2 px-6 text-center"
320
+ }, it = { class: "text-sm font-medium text-foreground" }, pt = { class: "text-[12px] text-muted-foreground" }, dt = {
321
+ key: 1,
322
+ class: "flex-1 space-y-3 overflow-y-auto px-3 py-3"
323
+ }, ct = {
324
+ key: 0,
325
+ class: "flex gap-2"
326
+ }, ut = ["aria-label"], mt = { class: "min-w-0 flex-1 space-y-1.5" }, xt = {
327
+ key: 0,
328
+ class: "whitespace-pre-wrap break-words text-[13px] leading-relaxed text-foreground"
329
+ }, gt = {
330
+ key: 0,
331
+ class: "flex items-center gap-2 pl-8 text-[12px] text-muted-foreground"
332
+ }, ft = P({
333
+ __name: "AiMessageList",
334
+ props: {
335
+ messages: {},
336
+ isStreaming: { type: Boolean }
337
+ },
338
+ setup(t) {
339
+ const a = t, { t: s } = e(), r = j(null);
340
+ return R(() => [a.messages, a.isStreaming], () => {
341
+ S(() => r.value?.scrollIntoView({ block: "end" }));
342
+ }, { deep: !0 }), (e, t) => 0 === a.messages.length ? (E(), y("div", nt, [
343
+ C(N(pe), { class: "w-7 h-7 text-primary/70" }),
344
+ k("p", it, D(N(s)("pptx.ai.emptyTitle")), 1),
345
+ k("p", pt, D(N(s)("pptx.ai.emptyHint")), 1)
346
+ ])) : (E(), y("div", dt, [
347
+ (E(!0), y(g, null, M(a.messages, (e) => (E(), y(g, { key: e.id }, ["user" === e.role || N(x)(e).length > 0 ? (E(), y("div", ct, [k("div", {
348
+ class: T(N(u)("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
+ "aria-label": "user" === e.role ? N(s)("pptx.ai.you") : N(s)("pptx.ai.assistant")
350
+ }, ["user" === e.role ? (E(), v(N(fe), {
351
+ key: 0,
352
+ class: "w-3.5 h-3.5"
353
+ })) : (E(), v(N(z), {
354
+ key: 1,
355
+ class: "w-3.5 h-3.5"
356
+ }))], 10, ut), k("div", mt, [(E(!0), y(g, null, M(N(x)(e), (e, t) => (E(), y(g, { key: "tool" === e.kind && e.toolCallId || t }, ["text" === e.kind ? (E(), y("p", xt, D(e.text), 1)) : (E(), v(ot, {
357
+ key: 1,
358
+ part: e
359
+ }, null, 8, ["part"]))], 64))), 128))])])) : h("", !0)], 64))), 128)),
360
+ a.isStreaming ? (E(), y("div", gt, [t[0] || (t[0] = k("span", { class: "inline-flex gap-1" }, [
361
+ k("span", { class: "h-1.5 w-1.5 animate-bounce rounded-full bg-muted-foreground [animation-delay:-0.2s]" }),
362
+ k("span", { class: "h-1.5 w-1.5 animate-bounce rounded-full bg-muted-foreground [animation-delay:-0.1s]" }),
363
+ k("span", { class: "h-1.5 w-1.5 animate-bounce rounded-full bg-muted-foreground" })
364
+ ], -1)), w(" " + D(N(s)("pptx.ai.thinking")), 1)])) : h("", !0),
365
+ k("div", {
366
+ ref_key: "endRef",
367
+ ref: r
368
+ }, null, 512)
369
+ ]));
370
+ }
371
+ }), bt = { class: "rounded-md border border-primary/40 bg-primary/5 p-2.5" }, vt = { class: "mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-primary" }, ht = { class: "text-[12px] font-medium text-foreground" }, yt = {
372
+ key: 0,
373
+ class: "mt-1 max-h-40 space-y-0.5 overflow-y-auto text-[11px] text-muted-foreground"
374
+ }, kt = { class: "mt-2 flex items-center gap-2" }, wt = P({
375
+ __name: "AiProposalCard",
376
+ props: { proposal: {} },
377
+ emits: ["accept", "reject"],
378
+ setup(t, { emit: a }) {
379
+ const s = t, r = a, { t: o } = e(), n = b(() => s.proposal.summary.map(l));
380
+ return (e, t) => (E(), y("div", bt, [
381
+ k("div", vt, D(N(o)("pptx.ai.proposedChange")), 1),
382
+ k("div", ht, D(s.proposal.label), 1),
383
+ n.value.length > 0 ? (E(), y("ul", yt, [(E(!0), y(g, null, M(n.value, (e, t) => (E(), y("li", {
384
+ key: t,
385
+ class: "break-words"
386
+ }, D(e), 1))), 128))])) : h("", !0),
387
+ k("div", kt, [k("button", {
388
+ type: "button",
389
+ class: "inline-flex items-center gap-1 rounded-sm bg-primary px-2 py-1 text-[11px] font-medium text-primary-foreground transition-colors hover:bg-primary/90",
390
+ onClick: t[0] || (t[0] = (e) => r("accept", s.proposal.id))
391
+ }, [C(N(K), { class: "w-3.5 h-3.5" }), w(" " + D(N(o)("pptx.ai.accept")), 1)]), k("button", {
392
+ type: "button",
393
+ class: "inline-flex items-center gap-1 rounded-sm border border-border px-2 py-1 text-[11px] text-muted-foreground transition-colors hover:bg-accent",
394
+ onClick: t[1] || (t[1] = (e) => r("reject", s.proposal.id))
395
+ }, [C(N(ve), { class: "w-3.5 h-3.5" }), w(" " + D(N(o)("pptx.ai.reject")), 1)])])
396
+ ]));
397
+ }
398
+ }), Ct = { class: "relative flex min-h-0 flex-1 flex-col" }, Pt = { class: "flex items-center gap-1 border-b border-border px-2 py-1" }, St = { class: "ml-auto flex items-center gap-0.5" }, Tt = ["title", "aria-label"], It = [
399
+ "title",
400
+ "aria-label",
401
+ "disabled"
402
+ ], _t = {
403
+ key: 1,
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
+ }, At = { class: "min-w-0 flex-1" }, Et = { class: "font-medium" }, jt = { class: "max-h-24 overflow-y-auto break-words text-[11px] opacity-80" }, Mt = {
406
+ key: 2,
407
+ class: "max-h-[38%] space-y-2 overflow-y-auto border-t border-border bg-background px-3 py-2"
408
+ }, Ft = { class: "flex items-center justify-between" }, Bt = { class: "text-[11px] font-semibold uppercase tracking-wide text-muted-foreground" }, Dt = P({
409
+ __name: "AiConversation",
410
+ props: {
411
+ session: {},
412
+ config: {},
413
+ bridge: {},
414
+ aiPanel: {}
415
+ },
416
+ async setup(t) {
417
+ let a, s;
418
+ const l = t, { t: o } = e(), { useChat: i } = ([a, s] = H(() => import("@ai-sdk/vue")), a = await a, s(), a), { messages: p, error: d, isStreaming: c, proposals: u, send: m, stop: x, clearError: f, applyProposal: P, rejectProposal: S, acceptAllProposals: T } = Ce(i, l.session, l.config, { onToolTarget: (e) => {
419
+ e && void 0 !== e.slideIndex && l.bridge.goToSlide(e.slideIndex), l.aiPanel.flashToolTarget(e);
420
+ } }), I = function(e) {
421
+ const t = j([]), a = r({
422
+ deckId: e.deckId,
423
+ store: e.store,
424
+ getMessages: () => e.messages.value,
425
+ setMessages: e.setMessages,
426
+ untitledLabel: e.untitledLabel,
427
+ onChatsChanged: (e) => {
428
+ t.value = e;
429
+ }
430
+ }), s = j(a.activeChatId()), l = () => {
431
+ s.value = a.activeChatId();
432
+ };
433
+ return R(e.messages, () => a.notifyMessagesChanged(), { deep: !0 }), _(() => a.dispose()), {
434
+ chats: t,
435
+ activeChatId: s,
436
+ refresh: () => a.refresh(),
437
+ newChat: () => {
438
+ a.newChat(), l();
439
+ },
440
+ resumeChat: async (e) => {
441
+ await a.resumeChat(e), l();
442
+ },
443
+ deleteChat: async (e) => {
444
+ await a.deleteChat(e), l();
445
+ },
446
+ clearCurrent: () => a.clearCurrent()
447
+ };
448
+ }({
449
+ deckId: n(l.bridge),
450
+ messages: p,
451
+ setMessages: (e) => {
452
+ p.value = e;
453
+ },
454
+ untitledLabel: o("pptx.ai.untitledChat")
455
+ }), A = j(!1), F = l.session.changeAnimator.subscribe((e) => {
456
+ e && l.bridge.goToSlide(e.slideIndex), l.aiPanel.showChangeBatch(e);
457
+ });
458
+ _(() => F());
459
+ const B = b(() => l.aiPanel.pickTargets.value.length > 0), L = b(() => B.value ? l.aiPanel.pickTargets.value : l.aiPanel.pinnedFocus.value ?? l.aiPanel.liveFocusTargets.value), W = b(() => !B.value && null !== l.aiPanel.pinnedFocus.value);
460
+ function $(e) {
461
+ l.aiPanel.flashToolTarget(null), P(e);
462
+ }
463
+ function z() {
464
+ l.aiPanel.flashToolTarget(null), T();
465
+ }
466
+ return (e, t) => (E(), y("div", Ct, [
467
+ k("div", Pt, [k("button", {
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) => A.value = !A.value)
471
+ }, [C(N(J), { class: "w-3.5 h-3.5" }), w(" " + D(N(o)("pptx.ai.chats")), 1)]), k("div", St, [k("button", {
472
+ type: "button",
473
+ title: N(o)("pptx.ai.newChat"),
474
+ "aria-label": N(o)("pptx.ai.newChat"),
475
+ class: "rounded-sm p-1 text-muted-foreground hover:bg-accent",
476
+ onClick: t[1] || (t[1] = (e) => N(I).newChat())
477
+ }, [C(N(Z), { class: "w-3.5 h-3.5" })], 8, Tt), k("button", {
478
+ type: "button",
479
+ title: N(o)("pptx.ai.clearChat"),
480
+ "aria-label": N(o)("pptx.ai.clearChat"),
481
+ disabled: 0 === N(p).length,
482
+ class: "rounded-sm p-1 text-muted-foreground hover:bg-accent disabled:opacity-40",
483
+ onClick: t[2] || (t[2] = (e) => N(I).clearCurrent())
484
+ }, [C(N(me), { class: "w-3.5 h-3.5" })], 8, It)])]),
485
+ A.value ? (E(), v(Ze, {
486
+ key: 0,
487
+ chats: N(I).chats.value,
488
+ "active-chat-id": N(I).activeChatId.value,
489
+ onResume: t[3] || (t[3] = (e) => {
490
+ N(I).resumeChat(e);
491
+ }),
492
+ onDelete: t[4] || (t[4] = (e) => {
493
+ N(I).deleteChat(e);
494
+ }),
495
+ onNewChat: t[5] || (t[5] = (e) => N(I).newChat()),
496
+ onClose: t[6] || (t[6] = (e) => A.value = !1)
497
+ }, null, 8, ["chats", "active-chat-id"])) : h("", !0),
498
+ C(ze, {
499
+ targets: L.value,
500
+ slides: l.bridge.getSlides(),
501
+ "is-pinned": W.value,
502
+ "pick-mode": l.aiPanel.pickMode.value,
503
+ "has-picks": B.value,
504
+ onPin: l.aiPanel.pinFocus,
505
+ onClearPin: l.aiPanel.clearPinnedFocus,
506
+ onStartPick: l.aiPanel.startPicking,
507
+ onStopPick: l.aiPanel.stopPicking,
508
+ onClearPicks: l.aiPanel.clearPicks,
509
+ onSendDirective: N(m)
510
+ }, null, 8, [
511
+ "targets",
512
+ "slides",
513
+ "is-pinned",
514
+ "pick-mode",
515
+ "has-picks",
516
+ "onPin",
517
+ "onClearPin",
518
+ "onStartPick",
519
+ "onStopPick",
520
+ "onClearPicks",
521
+ "onSendDirective"
522
+ ]),
523
+ C(ft, {
524
+ messages: N(p),
525
+ "is-streaming": N(c)
526
+ }, null, 8, ["messages", "is-streaming"]),
527
+ N(d) ? (E(), y("div", _t, [
528
+ C(N(xe), { class: "mt-0.5 w-3.5 h-3.5 shrink-0" }),
529
+ k("div", At, [k("div", Et, D(N(o)("pptx.ai.errorPrefix")), 1), k("div", jt, D(N(d).message), 1)]),
530
+ k("button", {
531
+ type: "button",
532
+ class: "shrink-0 rounded-sm px-1.5 py-0.5 text-[11px] underline-offset-2 hover:underline",
533
+ onClick: t[7] || (t[7] = (...e) => N(f) && N(f)(...e))
534
+ }, D(N(o)("pptx.ai.retry")), 1)
535
+ ])) : h("", !0),
536
+ N(u).length > 0 ? (E(), y("div", Mt, [k("div", Ft, [k("span", Bt, D(N(o)("pptx.ai.pendingChanges", { count: N(u).length })), 1), N(u).length > 1 ? (E(), y("button", {
537
+ key: 0,
538
+ type: "button",
539
+ class: "rounded-sm bg-primary/90 px-2 py-0.5 text-[11px] font-medium text-primary-foreground hover:bg-primary",
540
+ onClick: z
541
+ }, D(N(o)("pptx.ai.acceptAll")), 1)) : h("", !0)]), (E(!0), y(g, null, M(N(u), (e) => (E(), v(wt, {
542
+ key: e.id,
543
+ proposal: e,
544
+ onAccept: $,
545
+ onReject: N(S)
546
+ }, null, 8, ["proposal", "onReject"]))), 128))])) : h("", !0),
547
+ C(Ae, {
548
+ "is-streaming": N(c),
549
+ "prefill-text": l.aiPanel.prefill.value.text,
550
+ "prefill-nonce": l.aiPanel.prefill.value.nonce,
551
+ onSend: N(m),
552
+ onStop: N(x)
553
+ }, null, 8, [
554
+ "is-streaming",
555
+ "prefill-text",
556
+ "prefill-nonce",
557
+ "onSend",
558
+ "onStop"
559
+ ])
560
+ ]));
561
+ }
562
+ }), Nt = { class: "flex items-center gap-2 border-b border-border px-3 py-2" }, Lt = { class: "text-sm font-semibold text-foreground" }, Rt = ["title", "aria-label"], Ht = {
563
+ key: 0,
564
+ class: "flex flex-1 flex-col items-center justify-center gap-2 text-muted-foreground"
565
+ }, Wt = {
566
+ key: 1,
567
+ class: "flex flex-1 flex-col items-center justify-center gap-2 px-6 text-center"
568
+ }, $t = { class: "text-sm font-medium text-foreground" }, zt = { class: "text-[12px] text-muted-foreground" }, Vt = { class: "flex flex-1 flex-col items-center justify-center gap-2 text-muted-foreground" }, Kt = P({
569
+ __name: "AiChatPanel",
570
+ props: {
571
+ bridge: {},
572
+ config: {},
573
+ panelWidth: {},
574
+ aiPanel: {}
575
+ },
576
+ emits: ["close"],
577
+ setup(a, { emit: s }) {
578
+ const r = a, l = s, { t: o } = e(), { state: n, session: d, initError: c } = function(e, a) {
579
+ const s = j("checking"), r = B(null), l = B(void 0);
580
+ let o = 0;
581
+ return (async () => {
582
+ const n = ++o;
583
+ s.value = "checking", r.value = null, l.value = void 0;
584
+ try {
585
+ const l = await t();
586
+ if (n !== o) return;
587
+ if (!l) return void (s.value = "unavailable");
588
+ const i = await p(e, a);
589
+ if (n !== o) return;
590
+ r.value = i, s.value = "ready";
591
+ } catch (e) {
592
+ if (n !== o) return;
593
+ l.value = e instanceof Error ? e : new Error(String(e)), s.value = "error";
594
+ }
595
+ })(), {
596
+ state: s,
597
+ session: r,
598
+ initError: l
599
+ };
600
+ }(r.bridge, r.config), u = b(() => r.panelWidth ? { width: `${r.panelWidth}px` } : void 0), m = i({
601
+ activeSlideIndex: j(0),
602
+ selectedElementIds: j([]),
603
+ selectedElement: () => null
604
+ }), x = b(() => r.aiPanel ?? m);
605
+ return (e, t) => (E(), y("div", {
606
+ "data-pptx-ai-panel": "",
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: I(u.value)
609
+ }, [k("div", Nt, [
610
+ C(N(pe), { class: "w-4 h-4 text-primary" }),
611
+ k("span", Lt, D(N(o)("pptx.ai.title")), 1),
612
+ k("button", {
613
+ type: "button",
614
+ title: N(o)("pptx.ai.close"),
615
+ "aria-label": N(o)("pptx.ai.close"),
616
+ class: "ml-auto rounded-sm p-1 text-muted-foreground transition-colors hover:bg-accent",
617
+ onClick: t[0] || (t[0] = (e) => l("close"))
618
+ }, [C(N(ve), { class: "w-4 h-4" })], 8, Rt)
619
+ ]), "checking" === N(n) ? (E(), y("div", Ht, [C(N(X), { class: "w-5 h-5 animate-spin" })])) : "unavailable" === N(n) || "error" === N(n) ? (E(), y("div", Wt, [
620
+ C(N(xe), { class: "w-6 h-6 text-muted-foreground" }),
621
+ k("p", $t, D(N(o)("pptx.ai.unavailableTitle")), 1),
622
+ k("p", zt, D(N(c)?.message ?? N(o)("pptx.ai.unavailableHint")), 1)
623
+ ])) : "ready" === N(n) && N(d) ? (E(), v(f, { key: 2 }, {
624
+ fallback: W(() => [k("div", Vt, [C(N(X), { class: "w-5 h-5 animate-spin" })])]),
625
+ default: W(() => [C(Dt, {
626
+ session: N(d),
627
+ config: r.config,
628
+ bridge: r.bridge,
629
+ "ai-panel": x.value
630
+ }, null, 8, [
631
+ "session",
632
+ "config",
633
+ "bridge",
634
+ "ai-panel"
635
+ ])]),
636
+ _: 1
637
+ })) : h("", !0)], 4));
638
+ }
639
+ });
640
+ export { Kt as default };
Binary file
Binary file