@aipanel/ui 1.2.10 → 1.2.12
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.
- package/es/AI-panel-widget/composables/use-inspector.mjs +4 -4
- package/es/AI-panel-widget/composables/use-selection.mjs +4 -4
- package/es/AI-panel-widget/composables/use-session.mjs +16 -5
- package/es/AI-panel-widget/src/components/ChatPanel-sfc.css +1 -1
- package/es/AI-panel-widget/src/components/ChatPanel.vue.d.ts +3 -0
- package/es/AI-panel-widget/src/components/ChatPanel.vue.mjs +13 -4
- package/es/AI-panel-widget/src/components/Frame-sfc.css +1 -1
- package/es/AI-panel-widget/src/components/Header-sfc.css +1 -1
- package/es/AI-panel-widget/src/components/Header.vue.mjs +14 -5
- package/es/AI-panel-widget/src/components/ResizeHandle-sfc.css +1 -1
- package/es/AI-panel-widget/src/components/SelectedBubbles-sfc.css +1 -1
- package/es/AI-panel-widget/src/components/SelectedBubbles.vue.mjs +1 -1
- package/es/AI-panel-widget/src/components/SelectedNodes-sfc.css +1 -1
- package/es/AI-panel-widget/src/components/SessionList-sfc.css +1 -1
- package/es/AI-panel-widget/src/components/SessionList.vue.mjs +135 -37
- package/es/AI-panel-widget/src/context.d.ts +5 -1
- package/es/AI-panel-widget/src/index-sfc.css +1 -1
- package/es/AI-panel-widget/src/index.vue.d.ts +3 -1
- package/es/AI-panel-widget/src/index.vue.mjs +43 -9
- package/es/AI-panel-widget/src/types.d.ts +1 -1
- package/es/index.d.ts +1 -1
- package/es/index.mjs +1 -1
- package/lib/AI-panel-widget/composables/use-inspector.cjs +4 -4
- package/lib/AI-panel-widget/composables/use-selection.cjs +4 -4
- package/lib/AI-panel-widget/composables/use-session.cjs +16 -5
- package/lib/AI-panel-widget/src/components/ChatPanel-sfc.css +1 -1
- package/lib/AI-panel-widget/src/components/ChatPanel.vue.cjs +13 -4
- package/lib/AI-panel-widget/src/components/ChatPanel.vue.d.ts +3 -0
- package/lib/AI-panel-widget/src/components/Frame-sfc.css +1 -1
- package/lib/AI-panel-widget/src/components/Header-sfc.css +1 -1
- package/lib/AI-panel-widget/src/components/Header.vue.cjs +14 -5
- package/lib/AI-panel-widget/src/components/ResizeHandle-sfc.css +1 -1
- package/lib/AI-panel-widget/src/components/SelectedBubbles-sfc.css +1 -1
- package/lib/AI-panel-widget/src/components/SelectedBubbles.vue.cjs +1 -1
- package/lib/AI-panel-widget/src/components/SelectedNodes-sfc.css +1 -1
- package/lib/AI-panel-widget/src/components/SessionList-sfc.css +1 -1
- package/lib/AI-panel-widget/src/components/SessionList.vue.cjs +134 -36
- package/lib/AI-panel-widget/src/context.d.ts +5 -1
- package/lib/AI-panel-widget/src/index-sfc.css +1 -1
- package/lib/AI-panel-widget/src/index.vue.cjs +43 -9
- package/lib/AI-panel-widget/src/index.vue.d.ts +3 -1
- package/lib/AI-panel-widget/src/types.d.ts +1 -1
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/package.json +2 -2
- package/es/AI-panel-widget/src/components/SplitTrigger-sfc.css +0 -1
- package/es/AI-panel-widget/src/components/SplitTrigger.vue.d.ts +0 -18
- package/es/AI-panel-widget/src/components/SplitTrigger.vue.mjs +0 -112
- package/lib/AI-panel-widget/src/components/SplitTrigger-sfc.css +0 -1
- package/lib/AI-panel-widget/src/components/SplitTrigger.vue.cjs +0 -131
- package/lib/AI-panel-widget/src/components/SplitTrigger.vue.d.ts +0 -18
|
@@ -54,15 +54,56 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
|
|
|
54
54
|
if (showSessionListSkeleton.value) return true;
|
|
55
55
|
return false;
|
|
56
56
|
});
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
const ONGOING_CELLS = [
|
|
58
|
+
{ x: 0, y: 0, delay: "-1000ms" },
|
|
59
|
+
{ x: 4, y: 0, delay: "-875ms" },
|
|
60
|
+
{ x: 8, y: 0, delay: "-750ms" },
|
|
61
|
+
{ x: 8, y: 4, delay: "-625ms" },
|
|
62
|
+
{ x: 8, y: 8, delay: "-500ms" },
|
|
63
|
+
{ x: 4, y: 8, delay: "-375ms" },
|
|
64
|
+
{ x: 0, y: 8, delay: "-250ms" },
|
|
65
|
+
{ x: 0, y: 4, delay: "-125ms" }
|
|
66
|
+
];
|
|
67
|
+
const PENDING_LABELS = {
|
|
68
|
+
approval: "\u7B49\u5F85\u5BA1\u6279",
|
|
69
|
+
"plan-review": "\u7B49\u5F85\u8BA1\u5212\u786E\u8BA4",
|
|
70
|
+
question: "\u7B49\u5F85\u56DE\u590D"
|
|
71
|
+
};
|
|
72
|
+
function runningLabel(sessionId) {
|
|
73
|
+
const n = sessionStates?.value?.[sessionId]?.subagentsRunning ?? 0;
|
|
74
|
+
return n > 0 ? "\u5B50\u4EE3\u7406\u8FD0\u884C\u4E2D (" + n + ")" : "\u8FD0\u884C\u4E2D";
|
|
75
|
+
}
|
|
76
|
+
function sessionRowStatus(sessionId) {
|
|
77
|
+
const state = sessionStates?.value?.[sessionId];
|
|
78
|
+
if (!state) return "idle";
|
|
79
|
+
if (state.hasPending) return "pending";
|
|
80
|
+
const subagentsRunning = (state.subagentsRunning ?? 0) > 0;
|
|
81
|
+
if (subagentsRunning) return "running";
|
|
82
|
+
if (state.thinking) return "thinking";
|
|
83
|
+
const running = state.statusType === "running" || state.statusType === "streaming";
|
|
84
|
+
if (running) return "running";
|
|
85
|
+
if (state.completed) return "completed";
|
|
86
|
+
return "idle";
|
|
87
|
+
}
|
|
88
|
+
function pendingLabel(sessionId) {
|
|
89
|
+
const kind = sessionStates?.value?.[sessionId]?.pendingKind;
|
|
90
|
+
return kind && PENDING_LABELS[kind] || "\u7B49\u5F85\u7528\u6237";
|
|
91
|
+
}
|
|
92
|
+
function isSessionActive(sessionId) {
|
|
93
|
+
const status = sessionRowStatus(sessionId);
|
|
94
|
+
return status === "thinking" || status === "running";
|
|
95
|
+
}
|
|
96
|
+
function isSessionPending(sessionId) {
|
|
97
|
+
return sessionRowStatus(sessionId) === "pending";
|
|
98
|
+
}
|
|
99
|
+
function isSessionCompleted(sessionId) {
|
|
100
|
+
return sessionRowStatus(sessionId) === "completed";
|
|
60
101
|
}
|
|
61
102
|
const __returned__ = { collapsed, sessions, loadingSessionList, showSessionListSkeleton, handleCreateSession, handleSelectSession, handleDeleteSession, sessionKey, sessionStates, isAnimating, get animTimer() {
|
|
62
103
|
return animTimer;
|
|
63
104
|
}, set animTimer(v) {
|
|
64
105
|
animTimer = v;
|
|
65
|
-
}, showSkeleton,
|
|
106
|
+
}, showSkeleton, ONGOING_CELLS, PENDING_LABELS, runningLabel, sessionRowStatus, pendingLabel, isSessionActive, isSessionPending, isSessionCompleted };
|
|
66
107
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
67
108
|
return __returned__;
|
|
68
109
|
}
|
|
@@ -85,14 +126,20 @@ const _hoisted_4 = {
|
|
|
85
126
|
class: "aipanel-session-list-loading-overlay"
|
|
86
127
|
};
|
|
87
128
|
const _hoisted_5 = ["aria-selected", "onClick"];
|
|
88
|
-
const _hoisted_6 =
|
|
89
|
-
const _hoisted_7 =
|
|
90
|
-
const _hoisted_8 =
|
|
91
|
-
|
|
92
|
-
|
|
129
|
+
const _hoisted_6 = ["title"];
|
|
130
|
+
const _hoisted_7 = ["title"];
|
|
131
|
+
const _hoisted_8 = ["x", "y"];
|
|
132
|
+
const _hoisted_9 = {
|
|
133
|
+
key: 2,
|
|
134
|
+
class: "aipanel-session-state aipanel-session-state-completed",
|
|
135
|
+
title: "\u5DF2\u5B8C\u6210"
|
|
93
136
|
};
|
|
94
|
-
const
|
|
95
|
-
const
|
|
137
|
+
const _hoisted_10 = { class: "aipanel-session-title-text" };
|
|
138
|
+
const _hoisted_11 = {
|
|
139
|
+
key: 3,
|
|
140
|
+
class: "aipanel-session-meta"
|
|
141
|
+
};
|
|
142
|
+
const _hoisted_12 = ["aria-label", "onClick"];
|
|
96
143
|
function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
97
144
|
return (0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
|
|
98
145
|
"div",
|
|
@@ -102,9 +149,12 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
102
149
|
[
|
|
103
150
|
(0, import_vue3.createCommentVNode)(" Header "),
|
|
104
151
|
!$setup.showSkeleton ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("div", _hoisted_1, [
|
|
105
|
-
_cache[
|
|
152
|
+
_cache[2] || (_cache[2] = (0, import_vue3.createElementVNode)(
|
|
106
153
|
"span",
|
|
107
|
-
{
|
|
154
|
+
{
|
|
155
|
+
id: "aipanel-session-list-title",
|
|
156
|
+
class: "aipanel-session-list-title"
|
|
157
|
+
},
|
|
108
158
|
"\u4F1A\u8BDD\u5217\u8868",
|
|
109
159
|
-1
|
|
110
160
|
/* CACHED */
|
|
@@ -115,13 +165,32 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
115
165
|
title: "\u65B0\u5EFA\u4F1A\u8BDD",
|
|
116
166
|
"aria-label": "\u65B0\u5EFA\u4F1A\u8BDD",
|
|
117
167
|
onClick: _cache[0] || (_cache[0] = (...args) => $setup.handleCreateSession && $setup.handleCreateSession(...args))
|
|
118
|
-
},
|
|
168
|
+
}, [..._cache[1] || (_cache[1] = [
|
|
169
|
+
(0, import_vue3.createElementVNode)(
|
|
170
|
+
"svg",
|
|
171
|
+
{
|
|
172
|
+
viewBox: "0 0 16 16",
|
|
173
|
+
width: "12",
|
|
174
|
+
height: "12",
|
|
175
|
+
fill: "none",
|
|
176
|
+
stroke: "currentColor",
|
|
177
|
+
"stroke-width": "1.6",
|
|
178
|
+
"stroke-linecap": "round",
|
|
179
|
+
"aria-hidden": "true"
|
|
180
|
+
},
|
|
181
|
+
[
|
|
182
|
+
(0, import_vue3.createElementVNode)("path", { d: "M8 3v10M3 8h10" })
|
|
183
|
+
],
|
|
184
|
+
-1
|
|
185
|
+
/* CACHED */
|
|
186
|
+
)
|
|
187
|
+
])])
|
|
119
188
|
])) : ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
|
|
120
189
|
import_vue3.Fragment,
|
|
121
190
|
{ key: 1 },
|
|
122
191
|
[
|
|
123
192
|
(0, import_vue3.createCommentVNode)(" Header Skeleton "),
|
|
124
|
-
_cache[
|
|
193
|
+
_cache[3] || (_cache[3] = (0, import_vue3.createElementVNode)(
|
|
125
194
|
"div",
|
|
126
195
|
{ class: "aipanel-session-header-skeleton visible" },
|
|
127
196
|
[
|
|
@@ -144,7 +213,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
144
213
|
return (0, import_vue3.createElementVNode)("div", {
|
|
145
214
|
key: `skeleton-${i}`,
|
|
146
215
|
class: "aipanel-skeleton-item"
|
|
147
|
-
}, [..._cache[
|
|
216
|
+
}, [..._cache[4] || (_cache[4] = [
|
|
148
217
|
(0, import_vue3.createElementVNode)(
|
|
149
218
|
"div",
|
|
150
219
|
{ class: "aipanel-skeleton-title" },
|
|
@@ -170,7 +239,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
170
239
|
[
|
|
171
240
|
(0, import_vue3.createCommentVNode)(" Content "),
|
|
172
241
|
(0, import_vue3.createElementVNode)("div", _hoisted_3, [
|
|
173
|
-
$setup.loadingSessionList ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("div", _hoisted_4, [..._cache[
|
|
242
|
+
$setup.loadingSessionList ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("div", _hoisted_4, [..._cache[5] || (_cache[5] = [
|
|
174
243
|
(0, import_vue3.createElementVNode)(
|
|
175
244
|
"div",
|
|
176
245
|
{ class: "aipanel-loading-spinner small" },
|
|
@@ -185,34 +254,63 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
185
254
|
(0, import_vue3.renderList)($setup.sessions, (item) => {
|
|
186
255
|
return (0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("div", {
|
|
187
256
|
key: item[$setup.sessionKey],
|
|
188
|
-
class: (0, import_vue3.normalizeClass)(["aipanel-session-item", { active: item.active, thinking: $setup.
|
|
257
|
+
class: (0, import_vue3.normalizeClass)(["aipanel-session-item", { active: item.active, thinking: $setup.isSessionActive(item.id) }]),
|
|
189
258
|
role: "option",
|
|
190
259
|
"aria-selected": item.active,
|
|
191
260
|
onClick: ($event) => $setup.handleSelectSession(item)
|
|
192
261
|
}, [
|
|
193
|
-
(0, import_vue3.
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
262
|
+
(0, import_vue3.createCommentVNode)(" \u72B6\u6001\u6307\u793A\uFF1Apending=\u7425\u73C0\u70B9 > \u6D3B\u8DC3(thinking/running/\u5B50\u4EE3\u7406)=\u8F6C\u5708 > completed=\u7EFF\u70B9 > idle "),
|
|
263
|
+
$setup.isSessionPending(item.id) ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("span", {
|
|
264
|
+
key: 0,
|
|
265
|
+
class: "aipanel-session-state aipanel-session-state-pending",
|
|
266
|
+
title: $setup.pendingLabel(item.id)
|
|
267
|
+
}, null, 8, _hoisted_6)) : $setup.isSessionActive(item.id) ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", {
|
|
268
|
+
key: 1,
|
|
269
|
+
class: "aipanel-session-state aipanel-session-state-ongoing",
|
|
270
|
+
title: $setup.runningLabel(item.id),
|
|
271
|
+
viewBox: "0 0 10 10",
|
|
272
|
+
width: "10",
|
|
273
|
+
height: "10",
|
|
274
|
+
"aria-hidden": "true"
|
|
275
|
+
}, [
|
|
276
|
+
((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
|
|
277
|
+
import_vue3.Fragment,
|
|
278
|
+
null,
|
|
279
|
+
(0, import_vue3.renderList)($setup.ONGOING_CELLS, (c) => {
|
|
280
|
+
return (0, import_vue3.createElementVNode)("rect", {
|
|
281
|
+
key: c.x + "-" + c.y,
|
|
282
|
+
x: c.x,
|
|
283
|
+
y: c.y,
|
|
284
|
+
width: "2",
|
|
285
|
+
height: "2",
|
|
286
|
+
style: (0, import_vue3.normalizeStyle)({ animationDelay: c.delay }),
|
|
287
|
+
class: "aipanel-session-ongoing-cell"
|
|
288
|
+
}, null, 12, _hoisted_8);
|
|
289
|
+
}),
|
|
290
|
+
64
|
|
291
|
+
/* STABLE_FRAGMENT */
|
|
292
|
+
))
|
|
293
|
+
], 8, _hoisted_7)) : $setup.isSessionCompleted(item.id) ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("span", _hoisted_9)) : (0, import_vue3.createCommentVNode)("v-if", true),
|
|
209
294
|
(0, import_vue3.createElementVNode)(
|
|
210
|
-
"
|
|
295
|
+
"span",
|
|
211
296
|
_hoisted_10,
|
|
297
|
+
(0, import_vue3.toDisplayString)(item.title),
|
|
298
|
+
1
|
|
299
|
+
/* TEXT */
|
|
300
|
+
),
|
|
301
|
+
item.meta ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
|
|
302
|
+
"span",
|
|
303
|
+
_hoisted_11,
|
|
212
304
|
(0, import_vue3.toDisplayString)(item.meta),
|
|
213
305
|
1
|
|
214
306
|
/* TEXT */
|
|
215
|
-
)
|
|
307
|
+
)) : (0, import_vue3.createCommentVNode)("v-if", true),
|
|
308
|
+
(0, import_vue3.createElementVNode)("button", {
|
|
309
|
+
class: "aipanel-session-delete-btn",
|
|
310
|
+
type: "button",
|
|
311
|
+
"aria-label": `\u5220\u9664\u4F1A\u8BDD: ${item.title}`,
|
|
312
|
+
onClick: (0, import_vue3.withModifiers)(($event) => $setup.handleDeleteSession(item), ["stop"])
|
|
313
|
+
}, " \xD7 ", 8, _hoisted_12)
|
|
216
314
|
], 10, _hoisted_5);
|
|
217
315
|
}),
|
|
218
316
|
128
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Ref } from "vue";
|
|
2
|
-
import type { AIPanelWidgetSessionItem, AIPanelSelectedElementItem, AIPanelRemoveSelectedPayload, AIPanelSessionThinkingState, DisplayMode } from "./types";
|
|
2
|
+
import type { AIPanelWidgetSessionItem, AIPanelSelectedElementItem, AIPanelRemoveSelectedPayload, AIPanelSessionThinkingState, DisplayMode, ProviderSidebarCollapseControl } from "./types";
|
|
3
3
|
import type { FloatingBubbleOffset } from "./components/FloatingBubble/types";
|
|
4
4
|
export interface AIPanelWidgetContext {
|
|
5
5
|
theme: Ref<string>;
|
|
@@ -26,6 +26,10 @@ export interface AIPanelWidgetContext {
|
|
|
26
26
|
reviewPanelVisible: Ref<boolean>;
|
|
27
27
|
/** 是否支持代码审查面板(右上角 </> 按钮);由 Provider capabilities.reviewPanel 决定 */
|
|
28
28
|
reviewPanelEnabled: Ref<boolean>;
|
|
29
|
+
/** Provider 接管会话侧栏(隐藏原生会话列表,Provider 自家侧栏渲染);由 capabilities.sidebar.takeover 决定 */
|
|
30
|
+
providerSidebar: Ref<boolean>;
|
|
31
|
+
/** 侧栏折叠开关归属(host=宿主左上角按钮驱动 / provider=Provider 自带开关);由 capabilities.sidebar.collapseControl 决定 */
|
|
32
|
+
sidebarCollapseControl: Ref<ProviderSidebarCollapseControl>;
|
|
29
33
|
bubbleOffset: Ref<FloatingBubbleOffset | undefined>;
|
|
30
34
|
mode: Ref<"bubble" | "split">;
|
|
31
35
|
displayMode: Ref<DisplayMode>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.aipanel-widget{--ap-bg-main: #ffffff;--ap-bg-secondary: #
|
|
1
|
+
.aipanel-widget{--ap-bg-main: #ffffff;--ap-bg-secondary: #f9fafb;--ap-bg-tertiary: #ebeef2;--ap-overlay-bg: rgba(249, 250, 251, .92);--ap-text-primary: #0f1115;--ap-text-secondary: #61666b;--ap-text-tertiary: #81858c;--ap-text-placeholder: #adb2b8;--ap-border-faint: rgba(15, 17, 21, .04);--ap-border-primary: rgba(15, 17, 21, .1);--ap-border-secondary: rgba(15, 17, 21, .12);--ap-hover-bg: rgba(38, 49, 72, .06);--ap-elevated-fill: #ffffff;--ap-elevated-hover: #f1f3f5;--ap-press-bg: rgba(38, 49, 72, .1);--ap-primary: #0f1115;--ap-primary-hover: #43454a;--ap-on-primary: #ffffff;--ap-accent: #4176e6;--ap-accent-hover: #5686fe;--ap-accent-bg: rgba(65, 118, 230, .1);--ap-danger: #ec1313;--ap-danger-hover: #c40f0f;--ap-state-pending: #f59e0b;--ap-state-completed: #22c55e;--ap-state-ongoing: #5686fe;--ap-tooltip-bg: #1e1e1e;--ap-dialog-overlay: rgba(0, 0, 0, .24);--ap-dialog-bg: #ffffff;--ap-scrollbar-thumb: #e5e5e5;--ap-scrollbar-thumb-hover: #d4d4d4;--ap-thinking-glow: rgba(86, 134, 254, .3);--ap-thinking-glow-strong: rgba(86, 134, 254, .55);--ap-skeleton-bg: rgba(15, 17, 21, .06);--ap-skeleton-gradient: linear-gradient( 90deg, rgba(15, 17, 21, .04) 25%, rgba(15, 17, 21, .1) 50%, rgba(15, 17, 21, .04) 75% );--ap-shadow-sm: 0 1px 2px rgba(15, 17, 21, .04), 0 1px 3px rgba(15, 17, 21, .06);--ap-shadow-md: 0 2px 8px rgba(15, 17, 21, .06), 0 4px 16px rgba(15, 17, 21, .06);--ap-shadow-lg: 0 0 0 .5px rgba(15, 17, 21, .06), 0 4px 16px rgba(15, 17, 21, .08), 0 16px 48px rgba(15, 17, 21, .1);--ap-shadow-xl: 0 0 0 .5px rgba(15, 17, 21, .08), 0 8px 32px rgba(15, 17, 21, .12), 0 24px 72px rgba(15, 17, 21, .14);--ap-shadow-accent: 0 1px 2px rgba(65, 118, 230, .14), 0 0 0 1px rgba(65, 118, 230, .18);position:fixed;z-index:999999;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}.aipanel-widget.aipanel-theme-dark{--ap-bg-main: #151517;--ap-bg-secondary: #1b1b1c;--ap-bg-tertiary: #2c2c2e;--ap-overlay-bg: rgba(21, 21, 23, .92);--ap-text-primary: #f9fafb;--ap-text-secondary: #cfd3d6;--ap-text-tertiary: #adb2b8;--ap-text-placeholder: #81858c;--ap-border-faint: rgba(255, 255, 255, .06);--ap-border-primary: rgba(255, 255, 255, .12);--ap-border-secondary: rgba(255, 255, 255, .16);--ap-hover-bg: rgba(255, 255, 255, .08);--ap-elevated-fill: #43454a;--ap-elevated-hover: #353638;--ap-press-bg: rgba(255, 255, 255, .14);--ap-primary: #f9fafb;--ap-primary-hover: #ebeef2;--ap-on-primary: #0f1115;--ap-accent: #679efe;--ap-accent-hover: #5686fe;--ap-accent-bg: rgba(103, 158, 254, .16);--ap-danger: #f25a5a;--ap-danger-hover: #ff8383;--ap-state-pending: #f59e0b;--ap-state-completed: #22c55e;--ap-state-ongoing: #5686fe;--ap-tooltip-bg: #282828;--ap-dialog-overlay: rgba(0, 0, 0, .5);--ap-dialog-bg: #2c2c2e;--ap-scrollbar-thumb: #3c3c3d;--ap-scrollbar-thumb-hover: #545557;--ap-thinking-glow: rgba(103, 158, 254, .35);--ap-thinking-glow-strong: rgba(103, 158, 254, .6);--ap-skeleton-bg: rgba(255, 255, 255, .07);--ap-skeleton-gradient: linear-gradient( 90deg, rgba(255, 255, 255, .05) 25%, rgba(255, 255, 255, .12) 50%, rgba(255, 255, 255, .05) 75% );--ap-shadow-sm: 0 1px 2px rgba(0, 0, 0, .3), 0 1px 3px rgba(0, 0, 0, .24);--ap-shadow-md: 0 2px 8px rgba(0, 0, 0, .3), 0 4px 16px rgba(0, 0, 0, .2);--ap-shadow-lg: 0 0 0 .5px rgba(255, 255, 255, .06), 0 4px 16px rgba(0, 0, 0, .3), 0 16px 48px rgba(0, 0, 0, .25);--ap-shadow-xl: 0 0 0 .5px rgba(255, 255, 255, .08), 0 8px 32px rgba(0, 0, 0, .36), 0 24px 72px rgba(0, 0, 0, .3);--ap-shadow-accent: 0 1px 2px rgba(103, 158, 254, .2), 0 0 0 1px rgba(103, 158, 254, .25)}@supports not selector(::-webkit-scrollbar){.aipanel-widget,.aipanel-widget *{scrollbar-width:thin;scrollbar-color:var(--ap-scrollbar-thumb) transparent}}.aipanel-widget ::-webkit-scrollbar,.aipanel-widget *::-webkit-scrollbar{width:8px;height:8px}.aipanel-widget ::-webkit-scrollbar-track,.aipanel-widget *::-webkit-scrollbar-track{background:transparent}.aipanel-widget ::-webkit-scrollbar-thumb,.aipanel-widget *::-webkit-scrollbar-thumb{border-radius:4px;background:var(--ap-scrollbar-thumb)}.aipanel-widget ::-webkit-scrollbar-thumb:hover,.aipanel-widget *::-webkit-scrollbar-thumb:hover{background:var(--ap-scrollbar-thumb-hover)}.aipanel-widget ::-webkit-scrollbar-corner,.aipanel-widget *::-webkit-scrollbar-corner{background:transparent}.aipanel-chat{position:fixed;bottom:20px;width:700px;height:86vh;max-height:calc(100vh - 40px);background:var(--ap-bg-main);border-radius:16px;box-shadow:var(--ap-shadow-lg);overflow:hidden;opacity:0;visibility:hidden;transform:translate3d(var(---chatAnimationOrigin\.x),var(---chatAnimationOrigin\.y),0) scale(.95);transition:all .3s ease;display:flex;flex-direction:column;z-index:99999}.aipanel-chat.open{opacity:1;visibility:visible;transform:translateZ(0) scale(1)}.aipanel-chat.no-transition,.aipanel-chat.no-transition.open{transition:none!important}.aipanel-chat.minimized{width:320px;height:320px}.aipanel-chat.minimized .aipanel-iframe-container{margin-top:-146px}.aipanel-chat-content{display:flex;flex:1;overflow:hidden}.aipanel-notification{position:absolute;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px #3b82f666,0 0 0 2px #3b82f633;animation:slideDown .3s ease;z-index:10000000;display:flex;align-items:center;gap:10px}.aipanel-notification:before{content:"\1f4a1";font-size:16px}.aipanel-dialog-overlay{position:fixed;inset:0;background:var(--ap-dialog-overlay);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);display:flex;align-items:center;justify-content:center;z-index:9999999;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.aipanel-dialog{width:min(380px,100%);background:var(--ap-dialog-bg);border-radius:24px;padding:24px 24px 20px;box-shadow:var(--ap-shadow-xl);animation:scaleIn .2s ease}@keyframes scaleIn{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}.aipanel-dialog-content{margin-bottom:20px}.aipanel-dialog-message{font-size:14px;line-height:22px;font-weight:400;color:var(--ap-text-primary)}.aipanel-dialog-actions{display:flex;gap:8px;justify-content:flex-end}.aipanel-dialog-btn{height:36px;padding:0 20px;border-radius:999px;border:1px solid transparent;font-size:14px;line-height:22px;font-weight:500;cursor:pointer;transition:all .2s}.aipanel-dialog-btn.cancel{background:transparent;border-color:var(--ap-border-primary);color:var(--ap-text-secondary)}.aipanel-dialog-btn.cancel:hover{background:var(--ap-hover-bg);color:var(--ap-text-primary)}.aipanel-dialog-btn.confirm{background:var(--ap-danger);color:#fff}.aipanel-dialog-btn.confirm:hover{background:var(--ap-danger-hover)}@keyframes slideDown{0%{transform:translate(-50%) translateY(-100%);opacity:0}to{transform:translate(-50%) translateY(0);opacity:1}}.aipanel-page-notification{position:fixed;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px #3b82f666,0 0 0 2px #3b82f633;animation:slideDown .3s ease;z-index:2147483647;display:flex;align-items:center;gap:10px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.aipanel-page-notification:before{content:"\1f4a1";font-size:16px}.aipanel-element-highlight{position:fixed;pointer-events:none;z-index:999998;border-radius:4px}#vue-inspector-container{display:none!important}.aipanel-element-tooltip{position:fixed;background:var(--ap-tooltip-bg);color:#fff;padding:8px 12px;border-radius:6px;font-size:12px;z-index:9999998;box-shadow:var(--ap-shadow-md);max-width:300px;pointer-events:none;line-height:1}.aipanel-tooltip-tag{font-weight:500;margin-bottom:4px;word-break:break-all}.aipanel-tooltip-file{font-size:11px;color:var(--ap-text-placeholder);word-break:break-all}.aipanel-element-highlight-temp{position:absolute;pointer-events:none;z-index:999998;border-radius:4px;animation:highlight-pulse 2s ease-out forwards}@keyframes highlight-pulse{0%{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.02)}to{opacity:0;transform:scale(1)}}@media(max-width:768px){.aipanel-chat{width:calc(100vw - 40px);height:calc(100vh - 100px)}}body.has-aipanel-split{transition:padding .3s ease;min-width:auto}body.has-aipanel-split-right{padding-right:var(--aipanel-split-width, 500px)}body.has-aipanel-split-left{padding-left:var(--aipanel-split-width, 500px)}.aipanel-widget.extension-mode{position:relative;width:100%;height:100%;display:flex}.aipanel-widget.extension-mode .aipanel-select-mode-hint,.aipanel-widget.extension-mode .aipanel-dialog-overlay{position:absolute}
|
|
@@ -78,7 +78,9 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
|
|
|
78
78
|
splitMode: { type: Object, required: false, default: void 0 },
|
|
79
79
|
splitPanelWidth: { type: Number, required: false, default: 500 },
|
|
80
80
|
hideBubble: { type: Boolean, required: false, default: false },
|
|
81
|
-
reviewPanelEnabled: { type: Boolean, required: false, default: false }
|
|
81
|
+
reviewPanelEnabled: { type: Boolean, required: false, default: false },
|
|
82
|
+
providerSidebar: { type: Boolean, required: false, default: false },
|
|
83
|
+
sidebarCollapseControl: { type: String, required: false, default: "host" }
|
|
82
84
|
},
|
|
83
85
|
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
86
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
@@ -128,9 +130,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
|
|
|
128
130
|
};
|
|
129
131
|
const localSessionListCollapsed = (0, import_vue2.ref)(props.sessionListCollapsed);
|
|
130
132
|
const localDisplayMode = (0, import_vue2.ref)(props.displayMode);
|
|
131
|
-
const localSplitPosition = (0, import_vue2.ref)(
|
|
132
|
-
props.splitMode?.position ?? "right"
|
|
133
|
-
);
|
|
133
|
+
const localSplitPosition = (0, import_vue2.ref)(props.splitMode?.position ?? "right");
|
|
134
134
|
const minimized = (0, import_vue2.ref)(false);
|
|
135
135
|
const promptDockVisible = (0, import_vue2.ref)(true);
|
|
136
136
|
const reviewPanelVisible = (0, import_vue2.ref)(false);
|
|
@@ -142,6 +142,14 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
|
|
|
142
142
|
if (!iframeLoaded.value || !iframeReady.value) return;
|
|
143
143
|
sendMessageToIframe(import_core.WIDGET_MSG.PROMPT_DOCK_VISIBILITY, { visible: promptDockVisible.value });
|
|
144
144
|
sendMessageToIframe(import_core.WIDGET_MSG.MINIMIZE_STATE, { minimized: minimized.value });
|
|
145
|
+
sendMessageToIframe(import_core.WIDGET_MSG.SIDEBAR_MODE, {
|
|
146
|
+
mode: props.providerSidebar ? "provider" : "host"
|
|
147
|
+
});
|
|
148
|
+
if (props.providerSidebar && props.sidebarCollapseControl === "host") {
|
|
149
|
+
sendMessageToIframe(import_core.WIDGET_MSG.SIDEBAR_COLLAPSE, {
|
|
150
|
+
collapsed: localSessionListCollapsed.value
|
|
151
|
+
});
|
|
152
|
+
}
|
|
145
153
|
if (props.reviewPanelEnabled) {
|
|
146
154
|
sendMessageToIframe(import_core.WIDGET_MSG.REVIEW_PANEL_TOGGLE, { visible: reviewPanelVisible.value });
|
|
147
155
|
}
|
|
@@ -168,8 +176,15 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
|
|
|
168
176
|
localDisplayMode.value = val;
|
|
169
177
|
}
|
|
170
178
|
);
|
|
179
|
+
(0, import_vue2.watch)(
|
|
180
|
+
() => [props.providerSidebar, props.sidebarCollapseControl],
|
|
181
|
+
() => {
|
|
182
|
+
syncStateToIframe();
|
|
183
|
+
}
|
|
184
|
+
);
|
|
171
185
|
const handleToggleDisplayMode = () => {
|
|
172
|
-
if (localDisplayMode.value === "extension" || localDisplayMode.value === "extension-selector")
|
|
186
|
+
if (localDisplayMode.value === "extension" || localDisplayMode.value === "extension-selector")
|
|
187
|
+
return;
|
|
173
188
|
const modes = ["bubble", "split", "auto"];
|
|
174
189
|
const currentIndex = modes.indexOf(localDisplayMode.value);
|
|
175
190
|
const nextIndex = (currentIndex + 1) % modes.length;
|
|
@@ -208,6 +223,9 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
|
|
|
208
223
|
localSessionListCollapsed.value = collapsed;
|
|
209
224
|
emit("update:sessionListCollapsed", collapsed);
|
|
210
225
|
emit("toggle-session-list", collapsed);
|
|
226
|
+
if (props.providerSidebar && props.sidebarCollapseControl === "host") {
|
|
227
|
+
sendMessageToIframe(import_core.WIDGET_MSG.SIDEBAR_COLLAPSE, { collapsed });
|
|
228
|
+
}
|
|
211
229
|
},
|
|
212
230
|
onEmptyAction: () => {
|
|
213
231
|
emit("empty-action");
|
|
@@ -388,6 +406,16 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
|
|
|
388
406
|
iframeReady.value = true;
|
|
389
407
|
syncStateToIframe();
|
|
390
408
|
}
|
|
409
|
+
if (event.data?.type === import_core.WIDGET_MSG.SIDEBAR_STATE) {
|
|
410
|
+
if (props.providerSidebar && props.sidebarCollapseControl === "host") {
|
|
411
|
+
const collapsed = event.data.collapsed === true;
|
|
412
|
+
if (collapsed !== localSessionListCollapsed.value) {
|
|
413
|
+
localSessionListCollapsed.value = collapsed;
|
|
414
|
+
emit("update:sessionListCollapsed", collapsed);
|
|
415
|
+
emit("toggle-session-list", collapsed);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
391
419
|
};
|
|
392
420
|
(0, import_vue2.onMounted)(() => {
|
|
393
421
|
if (typeof window !== "undefined") {
|
|
@@ -430,7 +458,10 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
|
|
|
430
458
|
const gap = 24;
|
|
431
459
|
const bubbleSize = 44;
|
|
432
460
|
const screenMargin = 20;
|
|
433
|
-
const effectiveOffset = triggerRef.value?.offset ?? bubbleOffset.value ?? {
|
|
461
|
+
const effectiveOffset = triggerRef.value?.offset ?? bubbleOffset.value ?? {
|
|
462
|
+
x: windowWidth.value - bubbleSize - gap,
|
|
463
|
+
y: windowHeight.value - bubbleSize - gap
|
|
464
|
+
};
|
|
434
465
|
const style = {};
|
|
435
466
|
if (isBubbleOnRightSide.value) {
|
|
436
467
|
let rightPos = windowWidth.value - effectiveOffset.x + gap;
|
|
@@ -530,6 +561,8 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
|
|
|
530
561
|
promptDockVisible,
|
|
531
562
|
reviewPanelVisible,
|
|
532
563
|
reviewPanelEnabled: (0, import_vue2.toRef)(props, "reviewPanelEnabled"),
|
|
564
|
+
providerSidebar: (0, import_vue2.toRef)(props, "providerSidebar"),
|
|
565
|
+
sidebarCollapseControl: (0, import_vue2.toRef)(props, "sidebarCollapseControl"),
|
|
533
566
|
bubbleOffset,
|
|
534
567
|
mode: effectiveMode,
|
|
535
568
|
displayMode: localDisplayMode,
|
|
@@ -650,6 +683,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
650
683
|
"resolved-theme": $setup.resolvedTheme,
|
|
651
684
|
"split-position": $setup.splitPosition,
|
|
652
685
|
extension: $setup.isExtensionMode,
|
|
686
|
+
"provider-sidebar": $setup.props.providerSidebar,
|
|
653
687
|
onResize: $setup.handleResize,
|
|
654
688
|
onResizeStart: $setup.handleResizeStart,
|
|
655
689
|
onResizeEnd: $setup.handleResizeEnd,
|
|
@@ -718,7 +752,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
718
752
|
]),
|
|
719
753
|
key: "6"
|
|
720
754
|
} : 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"]),
|
|
755
|
+
]), 1032, ["mode", "open", "minimized", "position-style", "animation-origin", "panel-width", "resizable", "min-width", "max-width", "no-transition", "dragging", "thinking", "resolved-theme", "split-position", "extension", "provider-sidebar", "onResize", "onToggle"]),
|
|
722
756
|
(0, import_vue3.createVNode)($setup["SelectHint"])
|
|
723
757
|
],
|
|
724
758
|
64
|
|
@@ -778,11 +812,11 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
778
812
|
(0, import_vue3.createElementVNode)("button", {
|
|
779
813
|
class: "aipanel-dialog-btn cancel",
|
|
780
814
|
onClick: $setup.handleDialogCancel
|
|
781
|
-
}, "\u53D6\u6D88"),
|
|
815
|
+
}, " \u53D6\u6D88 "),
|
|
782
816
|
(0, import_vue3.createElementVNode)("button", {
|
|
783
817
|
class: "aipanel-dialog-btn confirm",
|
|
784
818
|
onClick: $setup.handleDialogConfirm
|
|
785
|
-
}, "\u786E\u8BA4")
|
|
819
|
+
}, " \u786E\u8BA4 ")
|
|
786
820
|
])
|
|
787
821
|
])
|
|
788
822
|
])) : (0, import_vue3.createCommentVNode)("v-if", true),
|
|
@@ -44,11 +44,13 @@ declare const __VLS_base: import("vue").DefineComponent<AIPanelWidgetProps, {
|
|
|
44
44
|
selectEnabled: boolean;
|
|
45
45
|
theme: import("@aipanel/core").AIPanelWidgetTheme;
|
|
46
46
|
reviewPanelEnabled: boolean;
|
|
47
|
+
providerSidebar: boolean;
|
|
48
|
+
sidebarCollapseControl: import("@aipanel/core").ProviderSidebarCollapseControl;
|
|
47
49
|
displayMode: import("@aipanel/core").DisplayMode;
|
|
48
50
|
showSessionListSkeleton: boolean;
|
|
49
51
|
sessionKey: string;
|
|
50
|
-
sessions: import("@aipanel/core").AIPanelWidgetSession[];
|
|
51
52
|
thinking: boolean;
|
|
53
|
+
sessions: import("@aipanel/core").AIPanelWidgetSession[];
|
|
52
54
|
showClearAll: boolean;
|
|
53
55
|
open: boolean;
|
|
54
56
|
selectShortcutLabel: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export type { AIPanelWidgetTheme, AIPanelWidgetSession, AIPanelSelectedElement, AIPanelRemoveSelectedPayload, AIPanelWidgetSessionItem, AIPanelSelectedElementItem, AIPanelWidgetProps, AIPanelWidgetEmits, AIPanelSessionThinkingState, DisplayMode, SplitModeOptions, } from "@aipanel/core";
|
|
1
|
+
export type { AIPanelWidgetTheme, AIPanelWidgetSession, AIPanelSelectedElement, AIPanelRemoveSelectedPayload, AIPanelWidgetSessionItem, AIPanelSelectedElementItem, AIPanelWidgetProps, AIPanelWidgetEmits, AIPanelSessionThinkingState, DisplayMode, SplitModeOptions, ProviderSidebarCollapseControl, } from "@aipanel/core";
|
package/lib/index.cjs
CHANGED
|
@@ -26,7 +26,7 @@ module.exports = __toCommonJS(lib_exports);
|
|
|
26
26
|
var import_AI_panel_widget = require("./AI-panel-widget/index.cjs");
|
|
27
27
|
__reExport(lib_exports, require("./AI-panel-widget/index.cjs"), module.exports);
|
|
28
28
|
__reExport(lib_exports, require("./setup.cjs"), module.exports);
|
|
29
|
-
const version = "1.2.
|
|
29
|
+
const version = "1.2.12";
|
|
30
30
|
function install(app, options) {
|
|
31
31
|
const components = [
|
|
32
32
|
import_AI_panel_widget.AIPanelWidget
|
package/lib/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aipanel/ui",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.12",
|
|
4
4
|
"description": "Reusable AIPanel widget components built with Pagoda CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.cjs",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"css-selector-generator": "^3.9.2",
|
|
34
|
-
"@aipanel/core": "1.2.
|
|
34
|
+
"@aipanel/core": "1.2.12"
|
|
35
35
|
},
|
|
36
36
|
"scripts": {
|
|
37
37
|
"build": "pagoda-cli build",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.aipanel-split-trigger{position:fixed;right:0;top:50%;transform:translateY(-50%);width:20px;height:48px;background:linear-gradient(135deg,#3b82f6,#2563eb);border:none;border-radius:8px 0 0 8px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#fff;box-shadow:-2px 0 8px #3b82f640;transition:right .3s ease,width .25s cubic-bezier(.4,0,.2,1),background .25s ease,box-shadow .25s ease;z-index:99998}.aipanel-split-trigger:hover{width:24px;background:linear-gradient(135deg,#2563eb,#1d4ed8);box-shadow:-3px 0 12px #3b82f659}.aipanel-split-trigger.open{width:20px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:8px 0 0 8px;box-shadow:-2px 0 8px #3b82f640}.aipanel-split-trigger.open:hover{width:24px;background:linear-gradient(135deg,#2563eb,#1d4ed8);box-shadow:-3px 0 12px #3b82f659}.aipanel-split-trigger-icon{display:flex;align-items:center;justify-content:center;transition:transform .25s ease}.aipanel-split-trigger:hover .aipanel-split-trigger-icon{transform:scale(1.1)}.aipanel-split-thinking-indicator{position:absolute;top:6px;right:6px;width:5px;height:5px;background:var(--ap-success);border-radius:50%;animation:aipanel-thinking-pulse 1.5s ease-in-out infinite;box-shadow:0 0 4px #10b98180}@keyframes aipanel-thinking-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(1.3)}}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
type __VLS_Props = {
|
|
2
|
-
open?: boolean;
|
|
3
|
-
thinking?: boolean;
|
|
4
|
-
resolvedTheme?: "light" | "dark";
|
|
5
|
-
panelWidth?: number;
|
|
6
|
-
};
|
|
7
|
-
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
8
|
-
toggle: () => any;
|
|
9
|
-
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
10
|
-
onToggle?: (() => any) | undefined;
|
|
11
|
-
}>, {
|
|
12
|
-
resolvedTheme: "light" | "dark";
|
|
13
|
-
thinking: boolean;
|
|
14
|
-
open: boolean;
|
|
15
|
-
panelWidth: number;
|
|
16
|
-
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
17
|
-
declare const _default: typeof __VLS_export;
|
|
18
|
-
export default _default;
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import "./SplitTrigger-sfc.css";
|
|
2
|
-
import { defineComponent as _defineComponent } from "vue";
|
|
3
|
-
import { computed } from "vue";
|
|
4
|
-
const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
|
|
5
|
-
...{
|
|
6
|
-
name: "SplitTrigger"
|
|
7
|
-
},
|
|
8
|
-
__name: "SplitTrigger",
|
|
9
|
-
props: {
|
|
10
|
-
open: { type: Boolean, required: false, default: false },
|
|
11
|
-
thinking: { type: Boolean, required: false, default: false },
|
|
12
|
-
resolvedTheme: { type: String, required: false, default: "light" },
|
|
13
|
-
panelWidth: { type: Number, required: false, default: 500 }
|
|
14
|
-
},
|
|
15
|
-
emits: ["toggle"],
|
|
16
|
-
setup(__props, { expose: __expose, emit: __emit }) {
|
|
17
|
-
__expose();
|
|
18
|
-
const props = __props;
|
|
19
|
-
const emit = __emit;
|
|
20
|
-
const buttonClasses = computed(() => [
|
|
21
|
-
"aipanel-split-trigger",
|
|
22
|
-
{
|
|
23
|
-
open: props.open,
|
|
24
|
-
thinking: props.thinking,
|
|
25
|
-
"aipanel-theme-dark": props.resolvedTheme === "dark"
|
|
26
|
-
}
|
|
27
|
-
]);
|
|
28
|
-
const buttonStyle = computed(() => {
|
|
29
|
-
if (props.open) {
|
|
30
|
-
return {
|
|
31
|
-
right: `${props.panelWidth}px`
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
return {};
|
|
35
|
-
});
|
|
36
|
-
const handleClick = () => {
|
|
37
|
-
emit("toggle");
|
|
38
|
-
};
|
|
39
|
-
const __returned__ = { props, emit, buttonClasses, buttonStyle, handleClick };
|
|
40
|
-
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
41
|
-
return __returned__;
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from "vue";
|
|
45
|
-
const _hoisted_1 = ["aria-expanded"];
|
|
46
|
-
const _hoisted_2 = { class: "aipanel-split-trigger-icon" };
|
|
47
|
-
const _hoisted_3 = {
|
|
48
|
-
key: 0,
|
|
49
|
-
viewBox: "0 0 24 24",
|
|
50
|
-
width: "16",
|
|
51
|
-
height: "16",
|
|
52
|
-
fill: "none",
|
|
53
|
-
stroke: "currentColor",
|
|
54
|
-
"stroke-width": "2"
|
|
55
|
-
};
|
|
56
|
-
const _hoisted_4 = {
|
|
57
|
-
key: 1,
|
|
58
|
-
viewBox: "0 0 24 24",
|
|
59
|
-
width: "16",
|
|
60
|
-
height: "16",
|
|
61
|
-
fill: "none",
|
|
62
|
-
stroke: "currentColor",
|
|
63
|
-
"stroke-width": "2"
|
|
64
|
-
};
|
|
65
|
-
const _hoisted_5 = {
|
|
66
|
-
key: 0,
|
|
67
|
-
class: "aipanel-split-thinking-indicator"
|
|
68
|
-
};
|
|
69
|
-
function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
70
|
-
return _openBlock(), _createElementBlock("button", {
|
|
71
|
-
class: _normalizeClass($setup.buttonClasses),
|
|
72
|
-
style: _normalizeStyle($setup.buttonStyle),
|
|
73
|
-
type: "button",
|
|
74
|
-
"aria-expanded": $props.open,
|
|
75
|
-
"aria-label": "\u6253\u5F00 AI \u52A9\u624B",
|
|
76
|
-
onClick: $setup.handleClick
|
|
77
|
-
}, [
|
|
78
|
-
_createElementVNode("span", _hoisted_2, [
|
|
79
|
-
$props.open ? (_openBlock(), _createElementBlock("svg", _hoisted_3, [..._cache[0] || (_cache[0] = [
|
|
80
|
-
_createElementVNode(
|
|
81
|
-
"path",
|
|
82
|
-
{
|
|
83
|
-
d: "M9 18l6-6-6-6",
|
|
84
|
-
"stroke-linecap": "round",
|
|
85
|
-
"stroke-linejoin": "round"
|
|
86
|
-
},
|
|
87
|
-
null,
|
|
88
|
-
-1
|
|
89
|
-
/* CACHED */
|
|
90
|
-
)
|
|
91
|
-
])])) : (_openBlock(), _createElementBlock("svg", _hoisted_4, [..._cache[1] || (_cache[1] = [
|
|
92
|
-
_createElementVNode(
|
|
93
|
-
"path",
|
|
94
|
-
{
|
|
95
|
-
d: "M15 18l-6-6 6-6",
|
|
96
|
-
"stroke-linecap": "round",
|
|
97
|
-
"stroke-linejoin": "round"
|
|
98
|
-
},
|
|
99
|
-
null,
|
|
100
|
-
-1
|
|
101
|
-
/* CACHED */
|
|
102
|
-
)
|
|
103
|
-
])]))
|
|
104
|
-
]),
|
|
105
|
-
$props.thinking ? (_openBlock(), _createElementBlock("span", _hoisted_5)) : _createCommentVNode("v-if", true)
|
|
106
|
-
], 14, _hoisted_1);
|
|
107
|
-
}
|
|
108
|
-
__vue_sfc__.render = __vue_render__;
|
|
109
|
-
var SplitTrigger_vue_default = __vue_sfc__;
|
|
110
|
-
export {
|
|
111
|
-
SplitTrigger_vue_default as default
|
|
112
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.aipanel-split-trigger{position:fixed;right:0;top:50%;transform:translateY(-50%);width:20px;height:48px;background:linear-gradient(135deg,#3b82f6,#2563eb);border:none;border-radius:8px 0 0 8px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#fff;box-shadow:-2px 0 8px #3b82f640;transition:right .3s ease,width .25s cubic-bezier(.4,0,.2,1),background .25s ease,box-shadow .25s ease;z-index:99998}.aipanel-split-trigger:hover{width:24px;background:linear-gradient(135deg,#2563eb,#1d4ed8);box-shadow:-3px 0 12px #3b82f659}.aipanel-split-trigger.open{width:20px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:8px 0 0 8px;box-shadow:-2px 0 8px #3b82f640}.aipanel-split-trigger.open:hover{width:24px;background:linear-gradient(135deg,#2563eb,#1d4ed8);box-shadow:-3px 0 12px #3b82f659}.aipanel-split-trigger-icon{display:flex;align-items:center;justify-content:center;transition:transform .25s ease}.aipanel-split-trigger:hover .aipanel-split-trigger-icon{transform:scale(1.1)}.aipanel-split-thinking-indicator{position:absolute;top:6px;right:6px;width:5px;height:5px;background:var(--ap-success);border-radius:50%;animation:aipanel-thinking-pulse 1.5s ease-in-out infinite;box-shadow:0 0 4px #10b98180}@keyframes aipanel-thinking-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(1.3)}}
|