@aipanel/ui 1.2.0-beta.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 (153) hide show
  1. package/es/AI-panel-widget/composables/use-inspector.d.ts +52 -0
  2. package/es/AI-panel-widget/composables/use-inspector.mjs +437 -0
  3. package/es/AI-panel-widget/composables/use-persist-state.d.ts +32 -0
  4. package/es/AI-panel-widget/composables/use-persist-state.mjs +83 -0
  5. package/es/AI-panel-widget/composables/use-selection.d.ts +19 -0
  6. package/es/AI-panel-widget/composables/use-selection.mjs +112 -0
  7. package/es/AI-panel-widget/composables/use-session.d.ts +16 -0
  8. package/es/AI-panel-widget/composables/use-session.mjs +47 -0
  9. package/es/AI-panel-widget/composables/use-split.d.ts +30 -0
  10. package/es/AI-panel-widget/composables/use-split.mjs +133 -0
  11. package/es/AI-panel-widget/composables/use-widget.d.ts +27 -0
  12. package/es/AI-panel-widget/composables/use-widget.mjs +78 -0
  13. package/es/AI-panel-widget/index.d.ts +5 -0
  14. package/es/AI-panel-widget/index.mjs +9 -0
  15. package/es/AI-panel-widget/src/assets/logo.svg +13 -0
  16. package/es/AI-panel-widget/src/components/AIPanelLogo-sfc.css +1 -0
  17. package/es/AI-panel-widget/src/components/AIPanelLogo.vue.d.ts +8 -0
  18. package/es/AI-panel-widget/src/components/AIPanelLogo.vue.mjs +40 -0
  19. package/es/AI-panel-widget/src/components/ChatPanel-sfc.css +1 -0
  20. package/es/AI-panel-widget/src/components/ChatPanel.vue.d.ts +179 -0
  21. package/es/AI-panel-widget/src/components/ChatPanel.vue.mjs +308 -0
  22. package/es/AI-panel-widget/src/components/FloatingBubble/FloatingBubble-sfc.css +1 -0
  23. package/es/AI-panel-widget/src/components/FloatingBubble/FloatingBubble.vue.d.ts +44 -0
  24. package/es/AI-panel-widget/src/components/FloatingBubble/FloatingBubble.vue.mjs +311 -0
  25. package/es/AI-panel-widget/src/components/FloatingBubble/index.d.ts +3 -0
  26. package/es/AI-panel-widget/src/components/FloatingBubble/index.mjs +5 -0
  27. package/es/AI-panel-widget/src/components/FloatingBubble/types.d.ts +24 -0
  28. package/es/AI-panel-widget/src/components/FloatingBubble/types.mjs +0 -0
  29. package/es/AI-panel-widget/src/components/Frame-sfc.css +1 -0
  30. package/es/AI-panel-widget/src/components/Frame.vue.d.ts +22 -0
  31. package/es/AI-panel-widget/src/components/Frame.vue.mjs +143 -0
  32. package/es/AI-panel-widget/src/components/Header-sfc.css +1 -0
  33. package/es/AI-panel-widget/src/components/Header.vue.d.ts +27 -0
  34. package/es/AI-panel-widget/src/components/Header.vue.mjs +683 -0
  35. package/es/AI-panel-widget/src/components/ResizeHandle-sfc.css +1 -0
  36. package/es/AI-panel-widget/src/components/ResizeHandle.vue.d.ts +22 -0
  37. package/es/AI-panel-widget/src/components/ResizeHandle.vue.mjs +79 -0
  38. package/es/AI-panel-widget/src/components/SelectHint-sfc.css +1 -0
  39. package/es/AI-panel-widget/src/components/SelectHint.vue.d.ts +3 -0
  40. package/es/AI-panel-widget/src/components/SelectHint.vue.mjs +40 -0
  41. package/es/AI-panel-widget/src/components/SelectedBubbles-sfc.css +1 -0
  42. package/es/AI-panel-widget/src/components/SelectedBubbles.vue.d.ts +3 -0
  43. package/es/AI-panel-widget/src/components/SelectedBubbles.vue.mjs +84 -0
  44. package/es/AI-panel-widget/src/components/SelectedNodes-sfc.css +1 -0
  45. package/es/AI-panel-widget/src/components/SelectedNodes.vue.d.ts +3 -0
  46. package/es/AI-panel-widget/src/components/SelectedNodes.vue.mjs +103 -0
  47. package/es/AI-panel-widget/src/components/SessionList-sfc.css +1 -0
  48. package/es/AI-panel-widget/src/components/SessionList.vue.d.ts +13 -0
  49. package/es/AI-panel-widget/src/components/SessionList.vue.mjs +222 -0
  50. package/es/AI-panel-widget/src/components/SplitTrigger-sfc.css +1 -0
  51. package/es/AI-panel-widget/src/components/SplitTrigger.vue.d.ts +18 -0
  52. package/es/AI-panel-widget/src/components/SplitTrigger.vue.mjs +112 -0
  53. package/es/AI-panel-widget/src/components/Trigger-sfc.css +1 -0
  54. package/es/AI-panel-widget/src/components/Trigger.vue.d.ts +28 -0
  55. package/es/AI-panel-widget/src/components/Trigger.vue.mjs +74 -0
  56. package/es/AI-panel-widget/src/context.d.ts +67 -0
  57. package/es/AI-panel-widget/src/context.mjs +16 -0
  58. package/es/AI-panel-widget/src/index-sfc.css +1 -0
  59. package/es/AI-panel-widget/src/index.vue.d.ts +69 -0
  60. package/es/AI-panel-widget/src/index.vue.mjs +782 -0
  61. package/es/AI-panel-widget/src/types.d.ts +2 -0
  62. package/es/AI-panel-widget/src/types.mjs +0 -0
  63. package/es/AI-panel-widget/style/index-pure.d.ts +0 -0
  64. package/es/AI-panel-widget/style/index-pure.mjs +0 -0
  65. package/es/AI-panel-widget/style/index.d.ts +0 -0
  66. package/es/AI-panel-widget/style/index.mjs +0 -0
  67. package/es/AI-panel-widget/style/less-pure.d.ts +0 -0
  68. package/es/AI-panel-widget/style/less-pure.mjs +0 -0
  69. package/es/AI-panel-widget/style/less.d.ts +0 -0
  70. package/es/AI-panel-widget/style/less.mjs +0 -0
  71. package/es/env.d.ts +15 -0
  72. package/es/index.d.ts +7 -0
  73. package/es/index.mjs +22 -0
  74. package/es/setup.d.ts +1 -0
  75. package/es/setup.mjs +4 -0
  76. package/lib/AI-panel-widget/composables/use-inspector.cjs +466 -0
  77. package/lib/AI-panel-widget/composables/use-inspector.d.ts +52 -0
  78. package/lib/AI-panel-widget/composables/use-persist-state.cjs +102 -0
  79. package/lib/AI-panel-widget/composables/use-persist-state.d.ts +32 -0
  80. package/lib/AI-panel-widget/composables/use-selection.cjs +131 -0
  81. package/lib/AI-panel-widget/composables/use-selection.d.ts +19 -0
  82. package/lib/AI-panel-widget/composables/use-session.cjs +66 -0
  83. package/lib/AI-panel-widget/composables/use-session.d.ts +16 -0
  84. package/lib/AI-panel-widget/composables/use-split.cjs +152 -0
  85. package/lib/AI-panel-widget/composables/use-split.d.ts +30 -0
  86. package/lib/AI-panel-widget/composables/use-widget.cjs +97 -0
  87. package/lib/AI-panel-widget/composables/use-widget.d.ts +27 -0
  88. package/lib/AI-panel-widget/index.cjs +39 -0
  89. package/lib/AI-panel-widget/index.d.ts +5 -0
  90. package/lib/AI-panel-widget/src/assets/logo.svg +13 -0
  91. package/lib/AI-panel-widget/src/components/AIPanelLogo-sfc.css +1 -0
  92. package/lib/AI-panel-widget/src/components/AIPanelLogo.vue.cjs +69 -0
  93. package/lib/AI-panel-widget/src/components/AIPanelLogo.vue.d.ts +8 -0
  94. package/lib/AI-panel-widget/src/components/ChatPanel-sfc.css +1 -0
  95. package/lib/AI-panel-widget/src/components/ChatPanel.vue.cjs +337 -0
  96. package/lib/AI-panel-widget/src/components/ChatPanel.vue.d.ts +179 -0
  97. package/lib/AI-panel-widget/src/components/FloatingBubble/FloatingBubble-sfc.css +1 -0
  98. package/lib/AI-panel-widget/src/components/FloatingBubble/FloatingBubble.vue.cjs +330 -0
  99. package/lib/AI-panel-widget/src/components/FloatingBubble/FloatingBubble.vue.d.ts +44 -0
  100. package/lib/AI-panel-widget/src/components/FloatingBubble/index.cjs +35 -0
  101. package/lib/AI-panel-widget/src/components/FloatingBubble/index.d.ts +3 -0
  102. package/lib/AI-panel-widget/src/components/FloatingBubble/types.cjs +15 -0
  103. package/lib/AI-panel-widget/src/components/FloatingBubble/types.d.ts +24 -0
  104. package/lib/AI-panel-widget/src/components/Frame-sfc.css +1 -0
  105. package/lib/AI-panel-widget/src/components/Frame.vue.cjs +162 -0
  106. package/lib/AI-panel-widget/src/components/Frame.vue.d.ts +22 -0
  107. package/lib/AI-panel-widget/src/components/Header-sfc.css +1 -0
  108. package/lib/AI-panel-widget/src/components/Header.vue.cjs +702 -0
  109. package/lib/AI-panel-widget/src/components/Header.vue.d.ts +27 -0
  110. package/lib/AI-panel-widget/src/components/ResizeHandle-sfc.css +1 -0
  111. package/lib/AI-panel-widget/src/components/ResizeHandle.vue.cjs +98 -0
  112. package/lib/AI-panel-widget/src/components/ResizeHandle.vue.d.ts +22 -0
  113. package/lib/AI-panel-widget/src/components/SelectHint-sfc.css +1 -0
  114. package/lib/AI-panel-widget/src/components/SelectHint.vue.cjs +59 -0
  115. package/lib/AI-panel-widget/src/components/SelectHint.vue.d.ts +3 -0
  116. package/lib/AI-panel-widget/src/components/SelectedBubbles-sfc.css +1 -0
  117. package/lib/AI-panel-widget/src/components/SelectedBubbles.vue.cjs +103 -0
  118. package/lib/AI-panel-widget/src/components/SelectedBubbles.vue.d.ts +3 -0
  119. package/lib/AI-panel-widget/src/components/SelectedNodes-sfc.css +1 -0
  120. package/lib/AI-panel-widget/src/components/SelectedNodes.vue.cjs +122 -0
  121. package/lib/AI-panel-widget/src/components/SelectedNodes.vue.d.ts +3 -0
  122. package/lib/AI-panel-widget/src/components/SessionList-sfc.css +1 -0
  123. package/lib/AI-panel-widget/src/components/SessionList.vue.cjs +241 -0
  124. package/lib/AI-panel-widget/src/components/SessionList.vue.d.ts +13 -0
  125. package/lib/AI-panel-widget/src/components/SplitTrigger-sfc.css +1 -0
  126. package/lib/AI-panel-widget/src/components/SplitTrigger.vue.cjs +131 -0
  127. package/lib/AI-panel-widget/src/components/SplitTrigger.vue.d.ts +18 -0
  128. package/lib/AI-panel-widget/src/components/Trigger-sfc.css +1 -0
  129. package/lib/AI-panel-widget/src/components/Trigger.vue.cjs +103 -0
  130. package/lib/AI-panel-widget/src/components/Trigger.vue.d.ts +28 -0
  131. package/lib/AI-panel-widget/src/context.cjs +35 -0
  132. package/lib/AI-panel-widget/src/context.d.ts +67 -0
  133. package/lib/AI-panel-widget/src/index-sfc.css +1 -0
  134. package/lib/AI-panel-widget/src/index.vue.cjs +811 -0
  135. package/lib/AI-panel-widget/src/index.vue.d.ts +69 -0
  136. package/lib/AI-panel-widget/src/types.cjs +15 -0
  137. package/lib/AI-panel-widget/src/types.d.ts +2 -0
  138. package/lib/AI-panel-widget/style/index-pure.cjs +0 -0
  139. package/lib/AI-panel-widget/style/index-pure.d.ts +0 -0
  140. package/lib/AI-panel-widget/style/index.cjs +0 -0
  141. package/lib/AI-panel-widget/style/index.d.ts +0 -0
  142. package/lib/AI-panel-widget/style/less-pure.cjs +0 -0
  143. package/lib/AI-panel-widget/style/less-pure.d.ts +0 -0
  144. package/lib/AI-panel-widget/style/less.cjs +0 -0
  145. package/lib/AI-panel-widget/style/less.d.ts +0 -0
  146. package/lib/env.d.ts +15 -0
  147. package/lib/index.cjs +42 -0
  148. package/lib/index.css +0 -0
  149. package/lib/index.d.ts +7 -0
  150. package/lib/index.less +0 -0
  151. package/lib/setup.cjs +23 -0
  152. package/lib/setup.d.ts +1 -0
  153. package/package.json +42 -0
@@ -0,0 +1,811 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var index_vue_exports = {};
29
+ __export(index_vue_exports, {
30
+ default: () => index_vue_default
31
+ });
32
+ module.exports = __toCommonJS(index_vue_exports);
33
+ var import_index_sfc = require("./index-sfc.css");
34
+ var import_vue = require("vue");
35
+ var import_vue2 = require("vue");
36
+ var import_ChatPanel_vue = __toESM(require("./components/ChatPanel.vue.cjs"));
37
+ var import_SelectHint_vue = __toESM(require("./components/SelectHint.vue.cjs"));
38
+ var import_Trigger_vue = __toESM(require("./components/Trigger.vue.cjs"));
39
+ var import_use_selection = require("../composables/use-selection.cjs");
40
+ var import_use_session = require("../composables/use-session.cjs");
41
+ var import_use_widget = require("../composables/use-widget.cjs");
42
+ var import_use_inspector = require("../composables/use-inspector.cjs");
43
+ var import_use_persist_state = require("../composables/use-persist-state.cjs");
44
+ var import_use_split = require("../composables/use-split.cjs");
45
+ var import_context = require("./context.cjs");
46
+ var import_core = require("@aipanel/core");
47
+ var import_vue3 = require("vue");
48
+ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
49
+ ...{
50
+ name: "AIPanelWidget"
51
+ },
52
+ __name: "index",
53
+ props: {
54
+ open: { type: Boolean, required: false, default: false },
55
+ theme: { type: String, required: false, default: "auto" },
56
+ title: { type: String, required: false, default: "AI \u52A9\u624B" },
57
+ hotkeyLabel: { type: String, required: false, default: "Ctrl+K" },
58
+ selectShortcutLabel: { type: String, required: false, default: "\u6309 ESC \u6216 Ctrl+P \u9000\u51FA" },
59
+ selectMode: { type: Boolean, required: false, default: false },
60
+ sessionListCollapsed: { type: Boolean, required: false, default: true },
61
+ sessionKey: { type: String, required: false, default: "id" },
62
+ frameLoading: { type: Boolean, required: false, default: false },
63
+ loadingSessionList: { type: Boolean, required: false },
64
+ showSessionListSkeleton: { type: Boolean, required: false, default: false },
65
+ showEmptyState: { type: Boolean, required: false, default: false },
66
+ showError: { type: Boolean, required: false, default: false },
67
+ emptyStateText: { type: String, required: false, default: "\u5F53\u524D\u9879\u76EE\u6682\u65E0\u4F1A\u8BDD" },
68
+ emptyStateActionText: { type: String, required: false, default: "\u7ACB\u5373\u521B\u5EFA" },
69
+ iframeSrc: { type: String, required: false, default: "" },
70
+ sessions: { type: Array, required: false, default: () => [] },
71
+ currentSessionId: { type: [String, null], required: false, default: null },
72
+ selectedElements: { type: Array, required: false, default: () => [] },
73
+ showClearAll: { type: Boolean, required: false, default: true },
74
+ selectEnabled: { type: Boolean, required: false, default: true },
75
+ thinking: { type: Boolean, required: false, default: false },
76
+ sessionStates: { type: Object, required: false },
77
+ displayMode: { type: String, required: false, default: "bubble" },
78
+ splitMode: { type: Object, required: false, default: void 0 },
79
+ splitPanelWidth: { type: Number, required: false, default: 500 },
80
+ hideBubble: { type: Boolean, required: false, default: false },
81
+ reviewPanelEnabled: { type: Boolean, required: false, default: false }
82
+ },
83
+ emits: ["update:open", "update:selectMode", "update:sessionListCollapsed", "update:currentSessionId", "update:selectedElements", "update:theme", "update:thinking", "update:splitPanelWidth", "toggle", "close", "toggle-session-list", "toggle-select-mode", "toggle-theme", "create-session", "select-session", "delete-session", "click-selected-node", "remove-selected-node", "clear-selected-nodes", "empty-action", "frame-loaded", "thinking-change", "split-panel-width-change"],
84
+ setup(__props, { expose: __expose, emit: __emit }) {
85
+ (0, import_vue.useCssVars)((_ctx) => ({
86
+ "-chatAnimationOrigin.x": chatAnimationOrigin.value.x,
87
+ "-chatAnimationOrigin.y": chatAnimationOrigin.value.y
88
+ }));
89
+ const props = __props;
90
+ const emit = __emit;
91
+ const slots = (0, import_vue2.useSlots)();
92
+ const notificationMessage = (0, import_vue2.ref)("");
93
+ const notificationVisible = (0, import_vue2.ref)(false);
94
+ const notificationMode = (0, import_vue2.ref)("widget");
95
+ let notificationTimer = null;
96
+ const showNotification = (message, options) => {
97
+ const { duration = 3e3, mode = "widget" } = options || {};
98
+ notificationMessage.value = message;
99
+ notificationVisible.value = true;
100
+ notificationMode.value = mode;
101
+ if (notificationTimer) clearTimeout(notificationTimer);
102
+ notificationTimer = setTimeout(() => {
103
+ notificationVisible.value = false;
104
+ }, duration);
105
+ };
106
+ const dialogVisible = (0, import_vue2.ref)(false);
107
+ const dialogMessage = (0, import_vue2.ref)("");
108
+ let dialogResolve = null;
109
+ const showConfirmDialog = (message) => {
110
+ dialogMessage.value = message;
111
+ dialogVisible.value = true;
112
+ return new Promise((resolve) => {
113
+ dialogResolve = resolve;
114
+ });
115
+ };
116
+ const handleDialogConfirm = () => {
117
+ dialogVisible.value = false;
118
+ if (dialogResolve) dialogResolve(true);
119
+ };
120
+ const handleDialogCancel = () => {
121
+ dialogVisible.value = false;
122
+ if (dialogResolve) dialogResolve(false);
123
+ };
124
+ const frameRef = (0, import_vue2.ref)(null);
125
+ const triggerRef = (0, import_vue2.ref)(null);
126
+ const sendMessageToIframe = (type, data) => {
127
+ frameRef.value?.sendMessageToIframe(type, data);
128
+ };
129
+ const localSessionListCollapsed = (0, import_vue2.ref)(props.sessionListCollapsed);
130
+ const localDisplayMode = (0, import_vue2.ref)(props.displayMode);
131
+ const localSplitPosition = (0, import_vue2.ref)(
132
+ props.splitMode?.position ?? "right"
133
+ );
134
+ const minimized = (0, import_vue2.ref)(false);
135
+ const promptDockVisible = (0, import_vue2.ref)(true);
136
+ const reviewPanelVisible = (0, import_vue2.ref)(false);
137
+ const isRestoring = (0, import_vue2.ref)(true);
138
+ const iframeLoaded = (0, import_vue2.ref)(false);
139
+ const iframeReady = (0, import_vue2.ref)(false);
140
+ const splitPanelWidth = (0, import_vue2.ref)(props.splitPanelWidth);
141
+ const syncStateToIframe = () => {
142
+ if (!iframeLoaded.value || !iframeReady.value) return;
143
+ sendMessageToIframe(import_core.WIDGET_MSG.PROMPT_DOCK_VISIBILITY, { visible: promptDockVisible.value });
144
+ sendMessageToIframe(import_core.WIDGET_MSG.MINIMIZE_STATE, { minimized: minimized.value });
145
+ if (props.reviewPanelEnabled) {
146
+ sendMessageToIframe(import_core.WIDGET_MSG.REVIEW_PANEL_TOGGLE, { visible: reviewPanelVisible.value });
147
+ }
148
+ };
149
+ const handleFrameLoaded = () => {
150
+ emit("frame-loaded");
151
+ iframeLoaded.value = true;
152
+ };
153
+ (0, import_vue2.watch)(
154
+ () => props.sessionListCollapsed,
155
+ (val) => {
156
+ localSessionListCollapsed.value = val;
157
+ }
158
+ );
159
+ (0, import_vue2.watch)(
160
+ () => props.splitPanelWidth,
161
+ (val) => {
162
+ splitPanelWidth.value = val;
163
+ }
164
+ );
165
+ (0, import_vue2.watch)(
166
+ () => props.displayMode,
167
+ (val) => {
168
+ localDisplayMode.value = val;
169
+ }
170
+ );
171
+ const handleToggleDisplayMode = () => {
172
+ if (localDisplayMode.value === "extension" || localDisplayMode.value === "extension-selector") return;
173
+ const modes = ["bubble", "split", "auto"];
174
+ const currentIndex = modes.indexOf(localDisplayMode.value);
175
+ const nextIndex = (currentIndex + 1) % modes.length;
176
+ localDisplayMode.value = modes[nextIndex];
177
+ };
178
+ const {
179
+ buttonActive,
180
+ containerClasses,
181
+ iframeSource,
182
+ sessionListTitle,
183
+ resolvedTheme,
184
+ handleClose,
185
+ handleEmptyAction,
186
+ handleToggle,
187
+ handleToggleSessionList,
188
+ handleToggleTheme
189
+ } = (0, import_use_widget.useWidget)({
190
+ theme: (0, import_vue2.toRef)(props, "theme"),
191
+ open: (0, import_vue2.toRef)(props, "open"),
192
+ selectMode: (0, import_vue2.toRef)(props, "selectMode"),
193
+ iframeSrc: (0, import_vue2.toRef)(props, "iframeSrc"),
194
+ sessionListCollapsed: localSessionListCollapsed,
195
+ onToggle: (nextOpen) => {
196
+ emit("update:open", nextOpen);
197
+ emit("toggle", nextOpen);
198
+ },
199
+ onToggleSelectMode: (mode) => {
200
+ emit("update:selectMode", mode);
201
+ emit("toggle-select-mode", mode);
202
+ },
203
+ onClose: () => {
204
+ emit("update:open", false);
205
+ emit("close");
206
+ },
207
+ onToggleSessionList: (collapsed) => {
208
+ localSessionListCollapsed.value = collapsed;
209
+ emit("update:sessionListCollapsed", collapsed);
210
+ emit("toggle-session-list", collapsed);
211
+ },
212
+ onEmptyAction: () => {
213
+ emit("empty-action");
214
+ },
215
+ onToggleTheme: (newTheme) => {
216
+ emit("update:theme", newTheme);
217
+ emit("toggle-theme", newTheme);
218
+ }
219
+ });
220
+ const { sessionItems, handleCreateSession, handleDeleteSession, handleSelectSession } = (0, import_use_session.useSession)({
221
+ sessions: (0, import_vue2.toRef)(props, "sessions"),
222
+ currentSessionId: (0, import_vue2.toRef)(props, "currentSessionId"),
223
+ onCreateSession: () => emit("create-session"),
224
+ onSelectSession: (session) => {
225
+ emit("update:currentSessionId", session.id);
226
+ emit("select-session", session);
227
+ },
228
+ onDeleteSession: (session) => emit("delete-session", session),
229
+ showConfirmDialog
230
+ });
231
+ const {
232
+ bubbleVisible,
233
+ hasSelectedElements,
234
+ selectedElementItems,
235
+ handleClearSelectedNodes,
236
+ handleClickSelectedNode,
237
+ handleRemoveSelectedNode,
238
+ handleToggleSelectMode
239
+ } = (0, import_use_selection.useSelection)({
240
+ selectMode: (0, import_vue2.toRef)(props, "selectMode"),
241
+ selectedElements: (0, import_vue2.toRef)(props, "selectedElements"),
242
+ onToggleSelectMode: (mode) => {
243
+ emit("update:selectMode", mode);
244
+ emit("toggle-select-mode", mode);
245
+ },
246
+ onRemoveSelectedNode: (payload) => {
247
+ emit("remove-selected-node", payload);
248
+ const newElements = [...props.selectedElements];
249
+ newElements.splice(payload.index, 1);
250
+ emit("update:selectedElements", newElements);
251
+ },
252
+ onClearSelectedNodes: () => {
253
+ emit("clear-selected-nodes");
254
+ emit("update:selectedElements", []);
255
+ },
256
+ showConfirmDialog
257
+ });
258
+ const { highlightVisible, highlightStyle, tooltipVisible, tooltipStyle, tooltipContent } = (0, import_use_inspector.useInspector)({
259
+ selectMode: (0, import_vue2.toRef)(props, "selectMode"),
260
+ onAddSelectedNode: (element) => {
261
+ emit("click-selected-node", element);
262
+ },
263
+ onExitSelectMode: () => {
264
+ emit("update:selectMode", false);
265
+ emit("toggle-select-mode", false);
266
+ }
267
+ });
268
+ const bubbleOffset = (0, import_vue2.ref)(void 0);
269
+ const {
270
+ effectiveMode,
271
+ isSplitMode,
272
+ isExtensionMode,
273
+ panelWidth,
274
+ splitConfig,
275
+ splitPosition,
276
+ handleResize,
277
+ handleToggle: handleSplitToggle,
278
+ handleTogglePosition
279
+ } = (0, import_use_split.useSplitMode)({
280
+ displayMode: localDisplayMode,
281
+ splitMode: (0, import_vue2.toRef)(props, "splitMode"),
282
+ open: (0, import_vue2.toRef)(props, "open"),
283
+ splitPosition: localSplitPosition,
284
+ onOpenChange: (nextOpen) => {
285
+ emit("update:open", nextOpen);
286
+ emit("toggle", nextOpen);
287
+ },
288
+ onWidthChange: (width) => {
289
+ splitPanelWidth.value = width;
290
+ emit("update:splitPanelWidth", width);
291
+ emit("split-panel-width-change", width);
292
+ },
293
+ onPositionChange: (position) => {
294
+ localSplitPosition.value = position;
295
+ }
296
+ });
297
+ (0, import_use_persist_state.usePersistState)({
298
+ open: (0, import_vue2.toRef)(props, "open"),
299
+ minimized,
300
+ promptDockVisible,
301
+ reviewPanelVisible,
302
+ bubbleOffset,
303
+ theme: (0, import_vue2.toRef)(props, "theme"),
304
+ sessionListCollapsed: localSessionListCollapsed,
305
+ splitPanelWidth,
306
+ displayMode: localDisplayMode,
307
+ splitPosition: localSplitPosition,
308
+ onRestore: (state) => {
309
+ if (state.open !== void 0 && state.open !== props.open) {
310
+ emit("update:open", state.open);
311
+ emit("toggle", state.open);
312
+ }
313
+ if (state.minimized !== void 0) {
314
+ minimized.value = state.minimized;
315
+ }
316
+ if (state.bubbleOffset !== void 0) {
317
+ const bubbleSize = 44;
318
+ const margin = 10;
319
+ const maxX = window.innerWidth - bubbleSize - margin;
320
+ const maxY = window.innerHeight - bubbleSize - margin;
321
+ bubbleOffset.value = {
322
+ x: Math.max(margin, Math.min(state.bubbleOffset.x, maxX)),
323
+ y: Math.max(margin, Math.min(state.bubbleOffset.y, maxY))
324
+ };
325
+ }
326
+ if (state.theme !== void 0 && state.theme !== props.theme) {
327
+ emit("update:theme", state.theme);
328
+ emit("toggle-theme", state.theme);
329
+ }
330
+ if (state.sessionListCollapsed !== void 0 && state.sessionListCollapsed !== props.sessionListCollapsed) {
331
+ localSessionListCollapsed.value = state.sessionListCollapsed;
332
+ emit("update:sessionListCollapsed", state.sessionListCollapsed);
333
+ }
334
+ if (state.promptDockVisible !== void 0) {
335
+ promptDockVisible.value = state.promptDockVisible;
336
+ } else if (minimized.value) {
337
+ promptDockVisible.value = false;
338
+ }
339
+ if (state.reviewPanelVisible !== void 0) {
340
+ reviewPanelVisible.value = state.reviewPanelVisible;
341
+ }
342
+ if (state.splitPanelWidth !== void 0 && state.splitPanelWidth !== props.splitPanelWidth) {
343
+ handleResize(state.splitPanelWidth);
344
+ }
345
+ if (state.displayMode !== void 0 && state.displayMode !== props.displayMode) {
346
+ if (props.displayMode !== "extension" && props.displayMode !== "extension-selector") {
347
+ localDisplayMode.value = state.displayMode;
348
+ }
349
+ }
350
+ if (state.splitPosition !== void 0) {
351
+ localSplitPosition.value = state.splitPosition;
352
+ }
353
+ (0, import_vue2.nextTick)(() => {
354
+ syncStateToIframe();
355
+ setTimeout(() => {
356
+ isRestoring.value = false;
357
+ }, 50);
358
+ });
359
+ }
360
+ });
361
+ const handleToggleMinimize = () => {
362
+ minimized.value = !minimized.value;
363
+ promptDockVisible.value = !minimized.value;
364
+ sendMessageToIframe(import_core.WIDGET_MSG.PROMPT_DOCK_VISIBILITY, { visible: promptDockVisible.value });
365
+ sendMessageToIframe(import_core.WIDGET_MSG.MINIMIZE_STATE, { minimized: minimized.value });
366
+ };
367
+ const handleTogglePromptDock = () => {
368
+ promptDockVisible.value = !promptDockVisible.value;
369
+ sendMessageToIframe(import_core.WIDGET_MSG.PROMPT_DOCK_VISIBILITY, { visible: promptDockVisible.value });
370
+ };
371
+ const handleToggleReviewPanel = () => {
372
+ reviewPanelVisible.value = !reviewPanelVisible.value;
373
+ sendMessageToIframe(import_core.WIDGET_MSG.REVIEW_PANEL_TOGGLE, { visible: reviewPanelVisible.value });
374
+ };
375
+ const handleRefresh = () => {
376
+ window.location.reload();
377
+ };
378
+ const windowWidth = (0, import_vue2.ref)(typeof window !== "undefined" ? window.innerWidth : 0);
379
+ const windowHeight = (0, import_vue2.ref)(typeof window !== "undefined" ? window.innerHeight : 0);
380
+ const handleWindowResize = () => {
381
+ if (typeof window !== "undefined") {
382
+ windowWidth.value = window.innerWidth;
383
+ windowHeight.value = window.innerHeight;
384
+ }
385
+ };
386
+ const handleIframeMessage = (event) => {
387
+ if (event.data?.type === import_core.WIDGET_MSG.READY) {
388
+ iframeReady.value = true;
389
+ syncStateToIframe();
390
+ }
391
+ };
392
+ (0, import_vue2.onMounted)(() => {
393
+ if (typeof window !== "undefined") {
394
+ window.addEventListener("resize", handleWindowResize);
395
+ window.addEventListener("message", handleIframeMessage);
396
+ }
397
+ });
398
+ (0, import_vue2.onUnmounted)(() => {
399
+ if (typeof window !== "undefined") {
400
+ window.removeEventListener("resize", handleWindowResize);
401
+ window.removeEventListener("message", handleIframeMessage);
402
+ }
403
+ });
404
+ const bubbleQuadrant = (0, import_vue2.computed)(() => {
405
+ if (typeof window === "undefined") return "bottom-right";
406
+ const centerX = windowWidth.value / 2;
407
+ const centerY = windowHeight.value / 2;
408
+ const bubbleSize = 44;
409
+ const currentOffset = triggerRef.value?.offset ?? bubbleOffset.value;
410
+ const effectiveX = (currentOffset?.x ?? windowWidth.value - bubbleSize - 24) + bubbleSize / 2;
411
+ const effectiveY = (currentOffset?.y ?? windowHeight.value - bubbleSize - 24) + bubbleSize / 2;
412
+ if (effectiveX >= centerX && effectiveY >= centerY) {
413
+ return "bottom-right";
414
+ } else if (effectiveX < centerX && effectiveY >= centerY) {
415
+ return "bottom-left";
416
+ } else if (effectiveX >= centerX && effectiveY < centerY) {
417
+ return "top-right";
418
+ } else {
419
+ return "top-left";
420
+ }
421
+ });
422
+ const isBubbleOnRightSide = (0, import_vue2.computed)(() => {
423
+ const quadrant = bubbleQuadrant.value;
424
+ return quadrant === "top-right" || quadrant === "bottom-right";
425
+ });
426
+ const chatPositionStyle = (0, import_vue2.computed)(() => {
427
+ if (typeof window === "undefined") return {};
428
+ const chatWidth = minimized.value ? 300 : 700;
429
+ const chatHeight = minimized.value ? 300 : Math.min(windowHeight.value * 0.86, windowHeight.value - 40);
430
+ const gap = 24;
431
+ const bubbleSize = 44;
432
+ const screenMargin = 20;
433
+ const effectiveOffset = triggerRef.value?.offset ?? bubbleOffset.value ?? { x: windowWidth.value - bubbleSize - gap, y: windowHeight.value - bubbleSize - gap };
434
+ const style = {};
435
+ if (isBubbleOnRightSide.value) {
436
+ let rightPos = windowWidth.value - effectiveOffset.x + gap;
437
+ const minRight = screenMargin;
438
+ const maxRight = windowWidth.value - chatWidth - screenMargin;
439
+ if (rightPos > maxRight) {
440
+ rightPos = maxRight;
441
+ }
442
+ if (rightPos < minRight) {
443
+ rightPos = minRight;
444
+ }
445
+ style.right = `${rightPos}px`;
446
+ style.left = "auto";
447
+ } else {
448
+ let leftPos = effectiveOffset.x + bubbleSize + gap;
449
+ const minLeft = screenMargin;
450
+ const maxLeft = windowWidth.value - chatWidth - screenMargin;
451
+ if (leftPos > maxLeft) {
452
+ leftPos = maxLeft;
453
+ }
454
+ if (leftPos < minLeft) {
455
+ leftPos = minLeft;
456
+ }
457
+ style.left = `${leftPos}px`;
458
+ style.right = "auto";
459
+ }
460
+ let bottomPos = windowHeight.value - effectiveOffset.y - bubbleSize;
461
+ const maxBottom = windowHeight.value - chatHeight - screenMargin;
462
+ if (bottomPos > maxBottom) {
463
+ bottomPos = maxBottom;
464
+ }
465
+ if (bottomPos < screenMargin) {
466
+ bottomPos = screenMargin;
467
+ }
468
+ style.bottom = `${bottomPos}px`;
469
+ return style;
470
+ });
471
+ const handleBubbleOffsetChange = (offset) => {
472
+ bubbleOffset.value = offset;
473
+ };
474
+ const handleResizeStart = () => {
475
+ isDragging.value = true;
476
+ };
477
+ const handleResizeEnd = () => {
478
+ isDragging.value = false;
479
+ };
480
+ const chatAnimationOrigin = (0, import_vue2.computed)(() => {
481
+ const quadrant = bubbleQuadrant.value;
482
+ switch (quadrant) {
483
+ case "top-left":
484
+ return { x: "-20px", y: "-20px" };
485
+ case "top-right":
486
+ return { x: "20px", y: "-20px" };
487
+ case "bottom-left":
488
+ return { x: "-20px", y: "20px" };
489
+ case "bottom-right":
490
+ default:
491
+ return { x: "20px", y: "20px" };
492
+ }
493
+ });
494
+ const isDragging = (0, import_vue2.ref)(false);
495
+ let wasOpenBeforeDrag = false;
496
+ const handleDragStart = () => {
497
+ isDragging.value = true;
498
+ wasOpenBeforeDrag = props.open;
499
+ if (props.open) {
500
+ emit("update:open", false);
501
+ }
502
+ };
503
+ const handleDragEnd = () => {
504
+ isDragging.value = false;
505
+ if (wasOpenBeforeDrag) {
506
+ emit("update:open", true);
507
+ }
508
+ };
509
+ (0, import_context.provideAIPanelWidgetContext)({
510
+ theme: (0, import_vue2.toRef)(props, "theme"),
511
+ resolvedTheme,
512
+ title: (0, import_vue2.toRef)(props, "title"),
513
+ hotkeyLabel: (0, import_vue2.toRef)(props, "hotkeyLabel"),
514
+ selectShortcutLabel: (0, import_vue2.toRef)(props, "selectShortcutLabel"),
515
+ selectMode: (0, import_vue2.toRef)(props, "selectMode"),
516
+ selectEnabled: (0, import_vue2.toRef)(props, "selectEnabled"),
517
+ sessionListCollapsed: localSessionListCollapsed,
518
+ sessionKey: (0, import_vue2.toRef)(props, "sessionKey"),
519
+ frameLoading: (0, import_vue2.toRef)(props, "frameLoading"),
520
+ loadingSessionList: (0, import_vue2.toRef)(props, "loadingSessionList"),
521
+ showSessionListSkeleton: (0, import_vue2.toRef)(props, "showSessionListSkeleton"),
522
+ showEmptyState: (0, import_vue2.toRef)(props, "showEmptyState"),
523
+ showError: (0, import_vue2.toRef)(props, "showError"),
524
+ emptyStateText: (0, import_vue2.toRef)(props, "emptyStateText"),
525
+ emptyStateActionText: (0, import_vue2.toRef)(props, "emptyStateActionText"),
526
+ showClearAll: (0, import_vue2.toRef)(props, "showClearAll"),
527
+ open: (0, import_vue2.toRef)(props, "open"),
528
+ thinking: (0, import_vue2.toRef)(props, "thinking"),
529
+ minimized,
530
+ promptDockVisible,
531
+ reviewPanelVisible,
532
+ reviewPanelEnabled: (0, import_vue2.toRef)(props, "reviewPanelEnabled"),
533
+ bubbleOffset,
534
+ mode: effectiveMode,
535
+ displayMode: localDisplayMode,
536
+ splitPosition,
537
+ sessionStates: (0, import_vue2.computed)(() => props.sessionStates ?? {}),
538
+ iframeSource,
539
+ buttonActive,
540
+ sessionListTitle,
541
+ bubbleVisible,
542
+ hasSelectedElements,
543
+ sessionItems,
544
+ selectedElementItems,
545
+ handleToggle,
546
+ handleClose,
547
+ handleToggleMinimize,
548
+ handleTogglePromptDock,
549
+ handleToggleReviewPanel,
550
+ handleToggleSessionList,
551
+ handleToggleTheme,
552
+ handleToggleDisplayMode,
553
+ handleToggleSplitPosition: handleTogglePosition,
554
+ handleEmptyAction,
555
+ handleCreateSession,
556
+ handleSelectSession,
557
+ handleDeleteSession,
558
+ handleToggleSelectMode,
559
+ handleClickSelectedNode,
560
+ handleRemoveSelectedNode: (payload) => handleRemoveSelectedNode(payload.item, payload.index, payload.source),
561
+ handleClearSelectedNodes,
562
+ handleFrameLoaded,
563
+ handleBubbleOffsetChange,
564
+ handleRefresh
565
+ });
566
+ __expose({
567
+ showNotification,
568
+ showConfirmDialog,
569
+ sendMessageToIframe,
570
+ isSplitMode
571
+ });
572
+ const __returned__ = { props, emit, slots, notificationMessage, notificationVisible, notificationMode, get notificationTimer() {
573
+ return notificationTimer;
574
+ }, set notificationTimer(v) {
575
+ notificationTimer = v;
576
+ }, showNotification, dialogVisible, dialogMessage, get dialogResolve() {
577
+ return dialogResolve;
578
+ }, set dialogResolve(v) {
579
+ dialogResolve = v;
580
+ }, showConfirmDialog, handleDialogConfirm, handleDialogCancel, frameRef, triggerRef, sendMessageToIframe, localSessionListCollapsed, localDisplayMode, localSplitPosition, minimized, promptDockVisible, reviewPanelVisible, isRestoring, iframeLoaded, iframeReady, splitPanelWidth, syncStateToIframe, handleFrameLoaded, handleToggleDisplayMode, buttonActive, containerClasses, iframeSource, sessionListTitle, resolvedTheme, handleClose, handleEmptyAction, handleToggle, handleToggleSessionList, handleToggleTheme, sessionItems, handleCreateSession, handleDeleteSession, handleSelectSession, bubbleVisible, hasSelectedElements, selectedElementItems, handleClearSelectedNodes, handleClickSelectedNode, handleRemoveSelectedNode, handleToggleSelectMode, highlightVisible, highlightStyle, tooltipVisible, tooltipStyle, tooltipContent, bubbleOffset, effectiveMode, isSplitMode, isExtensionMode, panelWidth, splitConfig, splitPosition, handleResize, handleSplitToggle, handleTogglePosition, handleToggleMinimize, handleTogglePromptDock, handleToggleReviewPanel, handleRefresh, windowWidth, windowHeight, handleWindowResize, handleIframeMessage, bubbleQuadrant, isBubbleOnRightSide, chatPositionStyle, handleBubbleOffsetChange, handleResizeStart, handleResizeEnd, chatAnimationOrigin, isDragging, get wasOpenBeforeDrag() {
581
+ return wasOpenBeforeDrag;
582
+ }, set wasOpenBeforeDrag(v) {
583
+ wasOpenBeforeDrag = v;
584
+ }, handleDragStart, handleDragEnd, ChatPanel: import_ChatPanel_vue.default, SelectHint: import_SelectHint_vue.default, Trigger: import_Trigger_vue.default };
585
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
586
+ return __returned__;
587
+ }
588
+ });
589
+ const _hoisted_1 = { class: "aipanel-tooltip-tag" };
590
+ const _hoisted_2 = { class: "aipanel-tooltip-file" };
591
+ const _hoisted_3 = {
592
+ key: 1,
593
+ class: "aipanel-dialog-overlay"
594
+ };
595
+ const _hoisted_4 = {
596
+ class: "aipanel-dialog",
597
+ role: "alertdialog",
598
+ "aria-modal": "true"
599
+ };
600
+ const _hoisted_5 = { class: "aipanel-dialog-content" };
601
+ const _hoisted_6 = { class: "aipanel-dialog-message" };
602
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
603
+ return (0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
604
+ "div",
605
+ {
606
+ class: (0, import_vue3.normalizeClass)([...$setup.containerClasses, { "extension-mode": $setup.isExtensionMode }])
607
+ },
608
+ [
609
+ $props.displayMode !== "extension-selector" ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
610
+ import_vue3.Fragment,
611
+ { key: 0 },
612
+ [
613
+ !$setup.isSplitMode && !$setup.props.hideBubble ? ((0, import_vue3.openBlock)(), (0, import_vue3.createBlock)(
614
+ $setup["Trigger"],
615
+ {
616
+ key: 0,
617
+ ref: "triggerRef",
618
+ onDragStart: $setup.handleDragStart,
619
+ onDragEnd: $setup.handleDragEnd
620
+ },
621
+ (0, import_vue3.createSlots)({
622
+ _: 2
623
+ /* DYNAMIC */
624
+ }, [
625
+ $setup.slots["button-icon"] ? {
626
+ name: "default",
627
+ fn: (0, import_vue3.withCtx)(() => [
628
+ (0, import_vue3.renderSlot)(_ctx.$slots, "button-icon")
629
+ ]),
630
+ key: "0"
631
+ } : void 0
632
+ ]),
633
+ 1536
634
+ /* NEED_PATCH, DYNAMIC_SLOTS */
635
+ )) : (0, import_vue3.createCommentVNode)("v-if", true),
636
+ (0, import_vue3.createVNode)($setup["ChatPanel"], {
637
+ ref: "frameRef",
638
+ mode: $setup.effectiveMode,
639
+ open: $props.open,
640
+ minimized: $setup.minimized,
641
+ "position-style": $setup.chatPositionStyle,
642
+ "animation-origin": $setup.chatAnimationOrigin,
643
+ "panel-width": $setup.panelWidth,
644
+ resizable: $setup.splitConfig.resizable,
645
+ "min-width": $setup.splitConfig.minWidth,
646
+ "max-width": $setup.splitConfig.maxWidth,
647
+ "no-transition": $setup.isRestoring,
648
+ dragging: $setup.isDragging,
649
+ thinking: $props.thinking,
650
+ "resolved-theme": $setup.resolvedTheme,
651
+ "split-position": $setup.splitPosition,
652
+ extension: $setup.isExtensionMode,
653
+ onResize: $setup.handleResize,
654
+ onResizeStart: $setup.handleResizeStart,
655
+ onResizeEnd: $setup.handleResizeEnd,
656
+ onToggle: $setup.handleSplitToggle
657
+ }, (0, import_vue3.createSlots)({
658
+ "sessions-empty": (0, import_vue3.withCtx)(() => [
659
+ (0, import_vue3.renderSlot)(_ctx.$slots, "sessions-empty", {}, () => [
660
+ _cache[0] || (_cache[0] = (0, import_vue3.createElementVNode)(
661
+ "div",
662
+ { class: "aipanel-session-empty" },
663
+ "\u6682\u65E0\u4F1A\u8BDD",
664
+ -1
665
+ /* CACHED */
666
+ ))
667
+ ])
668
+ ]),
669
+ _: 2
670
+ /* DYNAMIC */
671
+ }, [
672
+ $setup.slots["session-toggle-icon"] ? {
673
+ name: "session-toggle-icon",
674
+ fn: (0, import_vue3.withCtx)(() => [
675
+ (0, import_vue3.renderSlot)(_ctx.$slots, "session-toggle-icon")
676
+ ]),
677
+ key: "0"
678
+ } : void 0,
679
+ $setup.slots["select-icon"] ? {
680
+ name: "select-icon",
681
+ fn: (0, import_vue3.withCtx)(() => [
682
+ (0, import_vue3.renderSlot)(_ctx.$slots, "select-icon")
683
+ ]),
684
+ key: "1"
685
+ } : void 0,
686
+ $setup.slots["close-icon"] ? {
687
+ name: "close-icon",
688
+ fn: (0, import_vue3.withCtx)(() => [
689
+ (0, import_vue3.renderSlot)(_ctx.$slots, "close-icon")
690
+ ]),
691
+ key: "2"
692
+ } : void 0,
693
+ $setup.slots["empty-state"] ? {
694
+ name: "empty-state",
695
+ fn: (0, import_vue3.withCtx)(() => [
696
+ (0, import_vue3.renderSlot)(_ctx.$slots, "empty-state")
697
+ ]),
698
+ key: "3"
699
+ } : void 0,
700
+ $setup.slots.loading ? {
701
+ name: "loading",
702
+ fn: (0, import_vue3.withCtx)(() => [
703
+ (0, import_vue3.renderSlot)(_ctx.$slots, "loading")
704
+ ]),
705
+ key: "4"
706
+ } : void 0,
707
+ $setup.slots.error ? {
708
+ name: "error",
709
+ fn: (0, import_vue3.withCtx)(() => [
710
+ (0, import_vue3.renderSlot)(_ctx.$slots, "error")
711
+ ]),
712
+ key: "5"
713
+ } : void 0,
714
+ $setup.slots.content ? {
715
+ name: "content",
716
+ fn: (0, import_vue3.withCtx)(() => [
717
+ (0, import_vue3.renderSlot)(_ctx.$slots, "content")
718
+ ]),
719
+ key: "6"
720
+ } : void 0
721
+ ]), 1032, ["mode", "open", "minimized", "position-style", "animation-origin", "panel-width", "resizable", "min-width", "max-width", "no-transition", "dragging", "thinking", "resolved-theme", "split-position", "extension", "onResize", "onToggle"]),
722
+ (0, import_vue3.createVNode)($setup["SelectHint"])
723
+ ],
724
+ 64
725
+ /* STABLE_FRAGMENT */
726
+ )) : (0, import_vue3.createCommentVNode)("v-if", true),
727
+ (0, import_vue3.withDirectives)((0, import_vue3.createElementVNode)(
728
+ "div",
729
+ {
730
+ class: "aipanel-element-highlight",
731
+ style: (0, import_vue3.normalizeStyle)($setup.highlightStyle)
732
+ },
733
+ null,
734
+ 4
735
+ /* STYLE */
736
+ ), [
737
+ [import_vue3.vShow, $setup.highlightVisible]
738
+ ]),
739
+ (0, import_vue3.withDirectives)((0, import_vue3.createElementVNode)(
740
+ "div",
741
+ {
742
+ class: "aipanel-element-tooltip",
743
+ style: (0, import_vue3.normalizeStyle)($setup.tooltipStyle)
744
+ },
745
+ [
746
+ (0, import_vue3.createElementVNode)(
747
+ "div",
748
+ _hoisted_1,
749
+ (0, import_vue3.toDisplayString)($setup.tooltipContent.description),
750
+ 1
751
+ /* TEXT */
752
+ ),
753
+ (0, import_vue3.createElementVNode)(
754
+ "div",
755
+ _hoisted_2,
756
+ (0, import_vue3.toDisplayString)($setup.tooltipContent.fileInfo),
757
+ 1
758
+ /* TEXT */
759
+ )
760
+ ],
761
+ 4
762
+ /* STYLE */
763
+ ), [
764
+ [import_vue3.vShow, $setup.tooltipVisible]
765
+ ]),
766
+ $setup.dialogVisible ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("div", _hoisted_3, [
767
+ (0, import_vue3.createElementVNode)("div", _hoisted_4, [
768
+ (0, import_vue3.createElementVNode)("div", _hoisted_5, [
769
+ (0, import_vue3.createElementVNode)(
770
+ "div",
771
+ _hoisted_6,
772
+ (0, import_vue3.toDisplayString)($setup.dialogMessage),
773
+ 1
774
+ /* TEXT */
775
+ )
776
+ ]),
777
+ (0, import_vue3.createElementVNode)("div", { class: "aipanel-dialog-actions" }, [
778
+ (0, import_vue3.createElementVNode)("button", {
779
+ class: "aipanel-dialog-btn cancel",
780
+ onClick: $setup.handleDialogCancel
781
+ }, "\u53D6\u6D88"),
782
+ (0, import_vue3.createElementVNode)("button", {
783
+ class: "aipanel-dialog-btn confirm",
784
+ onClick: $setup.handleDialogConfirm
785
+ }, "\u786E\u8BA4")
786
+ ])
787
+ ])
788
+ ])) : (0, import_vue3.createCommentVNode)("v-if", true),
789
+ ((0, import_vue3.openBlock)(), (0, import_vue3.createBlock)(import_vue3.Teleport, {
790
+ to: "body",
791
+ disabled: $setup.notificationMode === "widget"
792
+ }, [
793
+ $setup.notificationVisible ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
794
+ "div",
795
+ {
796
+ key: 0,
797
+ class: (0, import_vue3.normalizeClass)($setup.notificationMode === "page" ? "aipanel-page-notification" : "aipanel-notification"),
798
+ role: "alert"
799
+ },
800
+ (0, import_vue3.toDisplayString)($setup.notificationMessage),
801
+ 3
802
+ /* TEXT, CLASS */
803
+ )) : (0, import_vue3.createCommentVNode)("v-if", true)
804
+ ], 8, ["disabled"]))
805
+ ],
806
+ 2
807
+ /* CLASS */
808
+ );
809
+ }
810
+ __vue_sfc__.render = __vue_render__;
811
+ var index_vue_default = __vue_sfc__;