@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,22 @@
1
+ type __VLS_Props = {
2
+ width?: number;
3
+ minWidth?: number;
4
+ maxWidth?: number;
5
+ position?: "left" | "right";
6
+ };
7
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
8
+ resize: (width: number) => any;
9
+ "resize-start": () => any;
10
+ "resize-end": () => any;
11
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
12
+ onResize?: ((width: number) => any) | undefined;
13
+ "onResize-start"?: (() => any) | undefined;
14
+ "onResize-end"?: (() => any) | undefined;
15
+ }>, {
16
+ width: number;
17
+ minWidth: number;
18
+ maxWidth: number;
19
+ position: "left" | "right";
20
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
21
+ declare const _default: typeof __VLS_export;
22
+ export default _default;
@@ -0,0 +1,79 @@
1
+ import "./ResizeHandle-sfc.css";
2
+ import { defineComponent as _defineComponent } from "vue";
3
+ import { ref, onUnmounted } from "vue";
4
+ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
5
+ ...{
6
+ name: "ResizeHandle"
7
+ },
8
+ __name: "ResizeHandle",
9
+ props: {
10
+ width: { type: Number, required: false, default: 500 },
11
+ minWidth: { type: Number, required: false, default: 400 },
12
+ maxWidth: { type: Number, required: false, default: 800 },
13
+ position: { type: String, required: false, default: "right" }
14
+ },
15
+ emits: ["resize", "resize-start", "resize-end"],
16
+ setup(__props, { expose: __expose, emit: __emit }) {
17
+ __expose();
18
+ const props = __props;
19
+ const emit = __emit;
20
+ const isResizing = ref(false);
21
+ const startX = ref(0);
22
+ const startWidth = ref(0);
23
+ const handleMouseDown = (e) => {
24
+ e.preventDefault();
25
+ isResizing.value = true;
26
+ startX.value = e.clientX;
27
+ startWidth.value = props.width;
28
+ emit("resize-start");
29
+ document.addEventListener("mousemove", handleMouseMove);
30
+ document.addEventListener("mouseup", handleMouseUp);
31
+ };
32
+ const handleMouseMove = (e) => {
33
+ if (!isResizing.value) return;
34
+ let deltaX;
35
+ if (props.position === "right") {
36
+ deltaX = startX.value - e.clientX;
37
+ } else {
38
+ deltaX = e.clientX - startX.value;
39
+ }
40
+ const newWidth = Math.max(props.minWidth, Math.min(props.maxWidth, startWidth.value + deltaX));
41
+ emit("resize", newWidth);
42
+ };
43
+ const handleMouseUp = () => {
44
+ isResizing.value = false;
45
+ emit("resize-end");
46
+ document.removeEventListener("mousemove", handleMouseMove);
47
+ document.removeEventListener("mouseup", handleMouseUp);
48
+ };
49
+ const handleDoubleClick = () => {
50
+ emit("resize", 500);
51
+ };
52
+ onUnmounted(() => {
53
+ document.removeEventListener("mousemove", handleMouseMove);
54
+ document.removeEventListener("mouseup", handleMouseUp);
55
+ });
56
+ const __returned__ = { props, emit, isResizing, startX, startWidth, handleMouseDown, handleMouseMove, handleMouseUp, handleDoubleClick };
57
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
58
+ return __returned__;
59
+ }
60
+ });
61
+ import { normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock } from "vue";
62
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
63
+ return _openBlock(), _createElementBlock(
64
+ "div",
65
+ {
66
+ class: _normalizeClass(["aipanel-resize-handle", { resizing: $setup.isResizing, "handle-left": $props.position === "left" }]),
67
+ onMousedown: $setup.handleMouseDown,
68
+ onDblclick: $setup.handleDoubleClick
69
+ },
70
+ null,
71
+ 34
72
+ /* CLASS, NEED_HYDRATION */
73
+ );
74
+ }
75
+ __vue_sfc__.render = __vue_render__;
76
+ var ResizeHandle_vue_default = __vue_sfc__;
77
+ export {
78
+ ResizeHandle_vue_default as default
79
+ };
@@ -0,0 +1 @@
1
+ .aipanel-select-mode-hint{position:fixed;top:16px;left:50%;transform:translate(-50%) translateY(-16px);width:280px;padding:8px 14px;background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff;border-radius:18px;font-size:13px;font-weight:500;line-height:1.4;box-shadow:0 6px 20px #ef444480,0 0 0 3px #ef44444d;z-index:9999999;display:none;flex-direction:column;align-items:center;justify-content:center;gap:6px;border:1px solid rgba(255,255,255,.25);opacity:0;transition:opacity .2s ease,transform .25s cubic-bezier(.16,1,.3,1);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);box-sizing:border-box}.aipanel-select-mode-hint.visible{display:flex;opacity:1;transform:translate(-50%) translateY(0);animation:hintSlideIn .3s cubic-bezier(.16,1,.3,1),pulseHint 2s ease-in-out .3s infinite}.aipanel-hint-main{display:inline-flex;align-items:center;gap:8px;min-width:0}.aipanel-hint-icon{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:#fff3;color:#fff;flex-shrink:0}.aipanel-hint-icon svg{display:block}.aipanel-hint-text{font-size:13px;font-weight:500;letter-spacing:.2px;white-space:nowrap;text-shadow:0 1px 2px rgba(0,0,0,.15)}.aipanel-hint-shortcut{display:inline-flex;align-items:center;padding:4px 10px;background:#0000002e;border-radius:999px;font-size:12px;font-weight:600;letter-spacing:.3px;border:1px solid rgba(255,255,255,.2);white-space:nowrap;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace}@keyframes hintSlideIn{0%{opacity:0;transform:translate(-50%) translateY(-16px)}to{opacity:1;transform:translate(-50%) translateY(0)}}@keyframes pulseHint{0%,to{box-shadow:0 6px 20px #ef444480,0 0 0 3px #ef44444d}50%{box-shadow:0 6px 20px #ef444499,0 0 0 6px #ef444466}}
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -0,0 +1,40 @@
1
+ import "./SelectHint-sfc.css";
2
+ import { defineComponent as _defineComponent } from "vue";
3
+ import { useAIPanelWidgetContext } from "../context.mjs";
4
+ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
5
+ __name: "SelectHint",
6
+ setup(__props, { expose: __expose }) {
7
+ __expose();
8
+ const { selectMode: visible, selectShortcutLabel: shortcutLabel } = useAIPanelWidgetContext();
9
+ const __returned__ = { visible, shortcutLabel };
10
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
11
+ return __returned__;
12
+ }
13
+ });
14
+ import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from "vue";
15
+ const _hoisted_1 = { class: "aipanel-hint-shortcut" };
16
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
17
+ return _openBlock(), _createElementBlock(
18
+ "div",
19
+ {
20
+ class: _normalizeClass(["aipanel-select-mode-hint", { visible: $setup.visible }])
21
+ },
22
+ [
23
+ _cache[0] || (_cache[0] = _createStaticVNode('<span class="aipanel-hint-main"><span class="aipanel-hint-icon" aria-hidden="true"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8"></circle><circle cx="12" cy="12" r="2.5" fill="currentColor"></circle><line x1="12" y1="2" x2="12" y2="5"></line><line x1="12" y1="19" x2="12" y2="22"></line><line x1="2" y1="12" x2="5" y2="12"></line><line x1="19" y1="12" x2="22" y2="12"></line></svg></span><span class="aipanel-hint-text">\u9009\u62E9\u6A21\u5F0F\u5DF2\u5F00\u542F \xB7 \u70B9\u51FB\u5143\u7D20\u8FDB\u884C\u9009\u62E9</span></span>', 1)),
24
+ _createElementVNode(
25
+ "span",
26
+ _hoisted_1,
27
+ _toDisplayString($setup.shortcutLabel),
28
+ 1
29
+ /* TEXT */
30
+ )
31
+ ],
32
+ 2
33
+ /* CLASS */
34
+ );
35
+ }
36
+ __vue_sfc__.render = __vue_render__;
37
+ var SelectHint_vue_default = __vue_sfc__;
38
+ export {
39
+ SelectHint_vue_default as default
40
+ };
@@ -0,0 +1 @@
1
+ .aipanel-selected-bubbles{position:absolute;display:none;flex-direction:column;gap:6px;max-width:220px;max-height:300px;overflow-y:auto}.aipanel-selected-bubbles.visible{display:flex}.aipanel-selected-bubble{display:flex;flex-direction:column;gap:2px;padding:8px 24px 8px 10px;background:var(--ap-bg-main);border:1px solid var(--ap-border-primary);border-radius:8px;font-size:12px;box-shadow:var(--ap-shadow-sm);position:relative;cursor:pointer;transition:all .2s}.aipanel-selected-bubble:hover{border-color:var(--ap-primary);box-shadow:var(--ap-shadow-primary)}.aipanel-bubble-text{color:var(--ap-text-primary);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.aipanel-bubble-file{color:var(--ap-text-placeholder);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.aipanel-bubble-remove{position:absolute;top:8px;right:6px;width:16px;height:16px;border-radius:50%;border:none;background:transparent;color:var(--ap-text-placeholder);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px;transition:all .2s}.aipanel-bubble-remove:hover{background:var(--ap-danger);color:#fff}.aipanel-bubble-empty{padding:8px 12px;background:var(--ap-bg-main);border:1px dashed var(--ap-border-secondary);border-radius:8px;color:var(--ap-text-placeholder);font-size:12px;text-align:center}
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -0,0 +1,84 @@
1
+ import "./SelectedBubbles-sfc.css";
2
+ import { defineComponent as _defineComponent } from "vue";
3
+ import { useAIPanelWidgetContext } from "../context.mjs";
4
+ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
5
+ __name: "SelectedBubbles",
6
+ setup(__props, { expose: __expose }) {
7
+ __expose();
8
+ const {
9
+ bubbleVisible: visible,
10
+ selectedElementItems: items,
11
+ handleClickSelectedNode,
12
+ handleRemoveSelectedNode
13
+ } = useAIPanelWidgetContext();
14
+ const __returned__ = { visible, items, handleClickSelectedNode, handleRemoveSelectedNode };
15
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
16
+ return __returned__;
17
+ }
18
+ });
19
+ import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, withModifiers as _withModifiers, normalizeClass as _normalizeClass } from "vue";
20
+ const _hoisted_1 = {
21
+ key: 0,
22
+ class: "aipanel-bubble-empty"
23
+ };
24
+ const _hoisted_2 = ["onClick"];
25
+ const _hoisted_3 = { class: "aipanel-bubble-text" };
26
+ const _hoisted_4 = {
27
+ key: 0,
28
+ class: "aipanel-bubble-file"
29
+ };
30
+ const _hoisted_5 = ["aria-label", "onClick"];
31
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
32
+ return _openBlock(), _createElementBlock(
33
+ "div",
34
+ {
35
+ class: _normalizeClass(["aipanel-selected-bubbles", { visible: $setup.visible }]),
36
+ role: "list",
37
+ "aria-label": "\u5DF2\u9009\u5143\u7D20\u5217\u8868"
38
+ },
39
+ [
40
+ $setup.items.length === 0 ? (_openBlock(), _createElementBlock("div", _hoisted_1, "\u6682\u65E0\u9009\u4E2D\u5143\u7D20")) : (_openBlock(true), _createElementBlock(
41
+ _Fragment,
42
+ { key: 1 },
43
+ _renderList($setup.items, (item, index) => {
44
+ return _openBlock(), _createElementBlock("div", {
45
+ key: item.key,
46
+ class: "aipanel-selected-bubble",
47
+ role: "listitem",
48
+ onClick: ($event) => $setup.handleClickSelectedNode(item)
49
+ }, [
50
+ _createElementVNode(
51
+ "span",
52
+ _hoisted_3,
53
+ _toDisplayString(item.description),
54
+ 1
55
+ /* TEXT */
56
+ ),
57
+ item.bubbleFileText ? (_openBlock(), _createElementBlock(
58
+ "span",
59
+ _hoisted_4,
60
+ _toDisplayString(item.bubbleFileText),
61
+ 1
62
+ /* TEXT */
63
+ )) : _createCommentVNode("v-if", true),
64
+ _createElementVNode("button", {
65
+ class: "aipanel-bubble-remove",
66
+ type: "button",
67
+ "aria-label": `\u79FB\u9664\u5143\u7D20: ${item.description}`,
68
+ onClick: _withModifiers(($event) => $setup.handleRemoveSelectedNode({ item, index, source: "bubble" }), ["stop"])
69
+ }, " \xD7 ", 8, _hoisted_5)
70
+ ], 8, _hoisted_2);
71
+ }),
72
+ 128
73
+ /* KEYED_FRAGMENT */
74
+ ))
75
+ ],
76
+ 2
77
+ /* CLASS */
78
+ );
79
+ }
80
+ __vue_sfc__.render = __vue_render__;
81
+ var SelectedBubbles_vue_default = __vue_sfc__;
82
+ export {
83
+ SelectedBubbles_vue_default as default
84
+ };
@@ -0,0 +1 @@
1
+ .aipanel-right-toolbar{width:140px;background:var(--ap-bg-secondary);border-left:1px solid var(--ap-border-primary);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease;overflow:hidden}.aipanel-right-toolbar.collapsed{width:0;overflow:hidden}.aipanel-right-toolbar.collapsed .aipanel-selected-nodes-header,.aipanel-right-toolbar.collapsed .aipanel-selected-nodes,.aipanel-right-toolbar.collapsed .aipanel-clear-all-btn{display:none}.aipanel-selected-nodes-header{padding:12px 8px 8px;border-bottom:1px solid var(--ap-border-primary)}.aipanel-selected-nodes-title{font-size:14px;font-weight:600;color:var(--ap-text-primary);margin-bottom:4px}.aipanel-selected-nodes-desc{font-size:11px;color:var(--ap-text-placeholder);line-height:1.4}.aipanel-selected-nodes{flex:1;display:flex;flex-direction:column;padding:8px;gap:6px;overflow-y:auto;overflow-x:hidden}.aipanel-selected-nodes:empty:before{content:"\6682\65e0\9009\4e2d\5143\7d20";color:var(--ap-text-placeholder);font-size:12px;text-align:center;padding:20px 10px}.aipanel-selected-node{display:flex;align-items:center;gap:8px;padding:8px 10px;background:var(--ap-bg-main);border:1px solid var(--ap-border-primary);border-radius:6px;font-size:12px;transition:all .2s}.aipanel-selected-node:hover{border-color:var(--ap-primary);box-shadow:var(--ap-shadow-primary)}.aipanel-node-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.aipanel-node-text{color:var(--ap-text-primary);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.aipanel-node-file{color:var(--ap-text-placeholder);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.aipanel-node-remove{width:18px;height:18px;border-radius:4px;border:none;background:transparent;color:var(--ap-text-placeholder);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;transition:all .2s;flex-shrink:0}.aipanel-node-remove:hover{background:var(--ap-danger);color:#fff}.aipanel-clear-all-btn{width:calc(100% - 16px);margin:8px;padding:8px 12px;border-radius:6px;border:none;background:var(--ap-danger);color:#fff;font-size:12px;font-weight:500;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:4px;transition:all .2s}.aipanel-clear-all-btn:hover{background:var(--ap-danger-hover);transform:scale(1.02)}
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -0,0 +1,103 @@
1
+ import "./SelectedNodes-sfc.css";
2
+ import { defineComponent as _defineComponent } from "vue";
3
+ import { useAIPanelWidgetContext } from "../context.mjs";
4
+ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
5
+ __name: "SelectedNodes",
6
+ setup(__props, { expose: __expose }) {
7
+ __expose();
8
+ const {
9
+ selectedElementItems: items,
10
+ showClearAll,
11
+ handleClickSelectedNode,
12
+ handleRemoveSelectedNode,
13
+ handleClearSelectedNodes
14
+ } = useAIPanelWidgetContext();
15
+ const __returned__ = { items, showClearAll, handleClickSelectedNode, handleRemoveSelectedNode, handleClearSelectedNodes };
16
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
17
+ return __returned__;
18
+ }
19
+ });
20
+ import { createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, withModifiers as _withModifiers, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass } from "vue";
21
+ const _hoisted_1 = {
22
+ class: "aipanel-selected-nodes",
23
+ role: "list",
24
+ "aria-label": "\u5DF2\u9009\u5143\u7D20\u5217\u8868"
25
+ };
26
+ const _hoisted_2 = ["onClick"];
27
+ const _hoisted_3 = { class: "aipanel-node-content" };
28
+ const _hoisted_4 = { class: "aipanel-node-text" };
29
+ const _hoisted_5 = { class: "aipanel-node-file" };
30
+ const _hoisted_6 = ["aria-label", "onClick"];
31
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
32
+ return _openBlock(), _createElementBlock(
33
+ "div",
34
+ {
35
+ class: _normalizeClass(["aipanel-right-toolbar", { collapsed: $setup.items.length === 0 }])
36
+ },
37
+ [
38
+ _cache[1] || (_cache[1] = _createElementVNode(
39
+ "div",
40
+ { class: "aipanel-selected-nodes-header" },
41
+ [
42
+ _createElementVNode("div", { class: "aipanel-selected-nodes-title" }, "\u5DF2\u9009\u8282\u70B9"),
43
+ _createElementVNode("div", { class: "aipanel-selected-nodes-desc" }, "\u9009\u4E2D\u7684\u8282\u70B9\u4F1A\u5728\u5BF9\u8BDD\u65F6\u4E00\u8D77\u53D1\u9001\u7ED9\u52A9\u624B")
44
+ ],
45
+ -1
46
+ /* CACHED */
47
+ )),
48
+ _createElementVNode("div", _hoisted_1, [
49
+ (_openBlock(true), _createElementBlock(
50
+ _Fragment,
51
+ null,
52
+ _renderList($setup.items, (item, index) => {
53
+ return _openBlock(), _createElementBlock("div", {
54
+ key: item.key,
55
+ class: "aipanel-selected-node",
56
+ role: "listitem",
57
+ onClick: ($event) => $setup.handleClickSelectedNode(item)
58
+ }, [
59
+ _createElementVNode("div", _hoisted_3, [
60
+ _createElementVNode(
61
+ "span",
62
+ _hoisted_4,
63
+ _toDisplayString(item.description),
64
+ 1
65
+ /* TEXT */
66
+ ),
67
+ _createElementVNode(
68
+ "span",
69
+ _hoisted_5,
70
+ _toDisplayString(item.panelFileText),
71
+ 1
72
+ /* TEXT */
73
+ )
74
+ ]),
75
+ _createElementVNode("button", {
76
+ class: "aipanel-node-remove",
77
+ type: "button",
78
+ "aria-label": `\u79FB\u9664\u5143\u7D20: ${item.description}`,
79
+ onClick: _withModifiers(($event) => $setup.handleRemoveSelectedNode({ item, index, source: "panel" }), ["stop"])
80
+ }, " \xD7 ", 8, _hoisted_6)
81
+ ], 8, _hoisted_2);
82
+ }),
83
+ 128
84
+ /* KEYED_FRAGMENT */
85
+ ))
86
+ ]),
87
+ $setup.showClearAll && $setup.items.length > 0 ? (_openBlock(), _createElementBlock("button", {
88
+ key: 0,
89
+ class: "aipanel-clear-all-btn",
90
+ type: "button",
91
+ "aria-label": "\u6E05\u7A7A\u6240\u6709\u5DF2\u9009\u8282\u70B9",
92
+ onClick: _cache[0] || (_cache[0] = (...args) => $setup.handleClearSelectedNodes && $setup.handleClearSelectedNodes(...args))
93
+ }, " \u4E00\u952E\u6E05\u7A7A ")) : _createCommentVNode("v-if", true)
94
+ ],
95
+ 2
96
+ /* CLASS */
97
+ );
98
+ }
99
+ __vue_sfc__.render = __vue_render__;
100
+ var SelectedNodes_vue_default = __vue_sfc__;
101
+ export {
102
+ SelectedNodes_vue_default as default
103
+ };
@@ -0,0 +1 @@
1
+ .aipanel-session-list{width:240px;background:var(--ap-bg-secondary);border-right:1px solid var(--ap-border-primary);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease}.aipanel-session-list.collapsed{width:0;overflow:hidden}.aipanel-session-list.collapsed .aipanel-session-list-header,.aipanel-session-list.collapsed .aipanel-session-list-content{display:none}.aipanel-session-list-header{padding:16px;border-bottom:1px solid var(--ap-border-primary);display:flex;justify-content:space-between;align-items:center;font-weight:600;font-size:14px;color:var(--ap-text-primary)}.aipanel-new-session-btn{width:28px;height:28px;border-radius:6px;border:none;background:var(--ap-primary);color:#fff;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.aipanel-new-session-btn:hover{background:var(--ap-primary-hover);transform:scale(1.05)}.aipanel-session-list-content{flex:1;overflow-y:auto;padding:8px;position:relative}.aipanel-session-list-loading-overlay{position:absolute;inset:0;background:var(--ap-overlay-bg);display:flex;align-items:center;justify-content:center;z-index:10;border-radius:8px}.aipanel-loading-spinner.small{width:24px;height:24px;border-width:2px}.aipanel-session-item{padding:12px;border-radius:8px;cursor:pointer;transition:transform .2s;margin-bottom:4px;color:var(--ap-text-primary)}.aipanel-session-item:hover{background:var(--ap-bg-tertiary)}.aipanel-session-item.active{background:var(--ap-primary);color:#fff;transition:none}.aipanel-session-title{font-size:14px;font-weight:500;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.aipanel-session-meta{font-size:12px;opacity:.6}.aipanel-session-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.aipanel-session-delete-btn{width:20px;height:20px;border-radius:4px;border:none;background:transparent;color:var(--ap-text-placeholder);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s;opacity:0;flex-shrink:0}.aipanel-session-item:hover .aipanel-session-delete-btn{opacity:1}.aipanel-session-delete-btn:hover{background:var(--ap-danger);color:#fff}.aipanel-session-item.active .aipanel-session-delete-btn{color:#ffffffb3}.aipanel-session-item.active .aipanel-session-delete-btn:hover{background:#fff3;color:#fff}.aipanel-session-header-skeleton{padding:16px;border-bottom:1px solid var(--ap-border-primary);display:none;justify-content:space-between;align-items:center}.aipanel-session-header-skeleton.visible{display:flex}.aipanel-skeleton-header-title{height:18px;width:80px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px}.aipanel-skeleton-header-btn{width:28px;height:28px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px}.aipanel-session-skeleton{flex:1;overflow-y:auto;padding:8px;display:none}.aipanel-session-skeleton.visible{display:block}.aipanel-skeleton-item{padding:12px;border-radius:8px;margin-bottom:4px;background:var(--ap-skeleton-bg)}.aipanel-skeleton-title{height:16px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;margin-bottom:8px;width:70%}.aipanel-skeleton-meta{height:12px;background:var(--ap-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;width:50%}.aipanel-session-empty{padding:32px 16px;text-align:center;color:var(--ap-text-placeholder);font-size:13px}.aipanel-thinking-loading{display:inline-block;width:12px;height:12px;margin-right:6px;border:2px solid var(--ap-border-secondary);border-top-color:var(--ap-text-secondary);border-radius:50%;animation:thinking-spin .8s linear infinite;vertical-align:middle}.aipanel-session-item.active .aipanel-thinking-loading{border-color:#ffffff4d;border-top-color:#ffffffe6}@keyframes thinking-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}
@@ -0,0 +1,13 @@
1
+ declare var __VLS_1: {};
2
+ type __VLS_Slots = {} & {
3
+ empty?: (props: typeof __VLS_1) => any;
4
+ };
5
+ declare const __VLS_base: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
6
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
7
+ declare const _default: typeof __VLS_export;
8
+ export default _default;
9
+ type __VLS_WithSlots<T, S> = T & {
10
+ new (): {
11
+ $slots: S;
12
+ };
13
+ };
@@ -0,0 +1,222 @@
1
+ import "./SessionList-sfc.css";
2
+ import { defineComponent as _defineComponent } from "vue";
3
+ import { ref, watch, computed } from "vue";
4
+ import { useAIPanelWidgetContext } from "../context.mjs";
5
+ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
6
+ __name: "SessionList",
7
+ setup(__props, { expose: __expose }) {
8
+ __expose();
9
+ const {
10
+ sessionListCollapsed: collapsed,
11
+ sessionItems: sessions,
12
+ loadingSessionList,
13
+ showSessionListSkeleton,
14
+ handleCreateSession,
15
+ handleSelectSession,
16
+ handleDeleteSession,
17
+ sessionKey,
18
+ sessionStates
19
+ } = useAIPanelWidgetContext();
20
+ const isAnimating = ref(false);
21
+ let animTimer = null;
22
+ watch(collapsed, () => {
23
+ isAnimating.value = true;
24
+ if (animTimer) clearTimeout(animTimer);
25
+ animTimer = setTimeout(() => {
26
+ isAnimating.value = false;
27
+ }, 200);
28
+ });
29
+ const showSkeleton = computed(() => {
30
+ if (isAnimating.value) return true;
31
+ if (showSessionListSkeleton.value) return true;
32
+ return false;
33
+ });
34
+ function isSessionThinking(sessionId) {
35
+ if (!sessionStates?.value || !sessionId) return false;
36
+ return sessionStates.value[sessionId]?.thinking ?? false;
37
+ }
38
+ const __returned__ = { collapsed, sessions, loadingSessionList, showSessionListSkeleton, handleCreateSession, handleSelectSession, handleDeleteSession, sessionKey, sessionStates, isAnimating, get animTimer() {
39
+ return animTimer;
40
+ }, set animTimer(v) {
41
+ animTimer = v;
42
+ }, showSkeleton, isSessionThinking };
43
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
44
+ return __returned__;
45
+ }
46
+ });
47
+ import { createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, Fragment as _Fragment, renderList as _renderList, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withModifiers as _withModifiers, normalizeClass as _normalizeClass, renderSlot as _renderSlot } from "vue";
48
+ const _hoisted_1 = {
49
+ key: 0,
50
+ class: "aipanel-session-list-header"
51
+ };
52
+ const _hoisted_2 = {
53
+ key: 2,
54
+ class: "aipanel-session-skeleton visible"
55
+ };
56
+ const _hoisted_3 = {
57
+ class: "aipanel-session-list-content",
58
+ role: "listbox",
59
+ "aria-labelledby": "aipanel-session-list-title"
60
+ };
61
+ const _hoisted_4 = {
62
+ key: 0,
63
+ class: "aipanel-session-list-loading-overlay"
64
+ };
65
+ const _hoisted_5 = ["aria-selected", "onClick"];
66
+ const _hoisted_6 = { class: "aipanel-session-header" };
67
+ const _hoisted_7 = { class: "aipanel-session-title" };
68
+ const _hoisted_8 = {
69
+ key: 0,
70
+ class: "aipanel-thinking-loading"
71
+ };
72
+ const _hoisted_9 = ["aria-label", "onClick"];
73
+ const _hoisted_10 = { class: "aipanel-session-meta" };
74
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
75
+ return _openBlock(), _createElementBlock(
76
+ "div",
77
+ {
78
+ class: _normalizeClass(["aipanel-session-list", { collapsed: $setup.collapsed }])
79
+ },
80
+ [
81
+ _createCommentVNode(" Header "),
82
+ !$setup.showSkeleton ? (_openBlock(), _createElementBlock("div", _hoisted_1, [
83
+ _cache[1] || (_cache[1] = _createElementVNode(
84
+ "span",
85
+ { id: "aipanel-session-list-title" },
86
+ "\u4F1A\u8BDD\u5217\u8868",
87
+ -1
88
+ /* CACHED */
89
+ )),
90
+ _createElementVNode("button", {
91
+ class: "aipanel-new-session-btn",
92
+ type: "button",
93
+ title: "\u65B0\u5EFA\u4F1A\u8BDD",
94
+ "aria-label": "\u65B0\u5EFA\u4F1A\u8BDD",
95
+ onClick: _cache[0] || (_cache[0] = (...args) => $setup.handleCreateSession && $setup.handleCreateSession(...args))
96
+ }, " + ")
97
+ ])) : (_openBlock(), _createElementBlock(
98
+ _Fragment,
99
+ { key: 1 },
100
+ [
101
+ _createCommentVNode(" Header Skeleton "),
102
+ _cache[2] || (_cache[2] = _createElementVNode(
103
+ "div",
104
+ { class: "aipanel-session-header-skeleton visible" },
105
+ [
106
+ _createElementVNode("div", { class: "aipanel-skeleton-header-title" }),
107
+ _createElementVNode("div", { class: "aipanel-skeleton-header-btn" })
108
+ ],
109
+ -1
110
+ /* CACHED */
111
+ ))
112
+ ],
113
+ 2112
114
+ /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
115
+ )),
116
+ _createCommentVNode(" Content Skeleton "),
117
+ $setup.showSkeleton ? (_openBlock(), _createElementBlock("div", _hoisted_2, [
118
+ (_openBlock(), _createElementBlock(
119
+ _Fragment,
120
+ null,
121
+ _renderList(5, (i) => {
122
+ return _createElementVNode("div", {
123
+ key: `skeleton-${i}`,
124
+ class: "aipanel-skeleton-item"
125
+ }, [..._cache[3] || (_cache[3] = [
126
+ _createElementVNode(
127
+ "div",
128
+ { class: "aipanel-skeleton-title" },
129
+ null,
130
+ -1
131
+ /* CACHED */
132
+ ),
133
+ _createElementVNode(
134
+ "div",
135
+ { class: "aipanel-skeleton-meta" },
136
+ null,
137
+ -1
138
+ /* CACHED */
139
+ )
140
+ ])]);
141
+ }),
142
+ 64
143
+ /* STABLE_FRAGMENT */
144
+ ))
145
+ ])) : (_openBlock(), _createElementBlock(
146
+ _Fragment,
147
+ { key: 3 },
148
+ [
149
+ _createCommentVNode(" Content "),
150
+ _createElementVNode("div", _hoisted_3, [
151
+ $setup.loadingSessionList ? (_openBlock(), _createElementBlock("div", _hoisted_4, [..._cache[4] || (_cache[4] = [
152
+ _createElementVNode(
153
+ "div",
154
+ { class: "aipanel-loading-spinner small" },
155
+ null,
156
+ -1
157
+ /* CACHED */
158
+ )
159
+ ])])) : _createCommentVNode("v-if", true),
160
+ $setup.sessions.length > 0 ? (_openBlock(true), _createElementBlock(
161
+ _Fragment,
162
+ { key: 1 },
163
+ _renderList($setup.sessions, (item) => {
164
+ return _openBlock(), _createElementBlock("div", {
165
+ key: item[$setup.sessionKey],
166
+ class: _normalizeClass(["aipanel-session-item", { active: item.active, thinking: $setup.isSessionThinking(item.id) }]),
167
+ role: "option",
168
+ "aria-selected": item.active,
169
+ onClick: ($event) => $setup.handleSelectSession(item)
170
+ }, [
171
+ _createElementVNode("div", _hoisted_6, [
172
+ _createElementVNode("div", _hoisted_7, [
173
+ $setup.isSessionThinking(item.id) ? (_openBlock(), _createElementBlock("span", _hoisted_8)) : _createCommentVNode("v-if", true),
174
+ _createTextVNode(
175
+ " " + _toDisplayString(item.title),
176
+ 1
177
+ /* TEXT */
178
+ )
179
+ ]),
180
+ _createElementVNode("button", {
181
+ class: "aipanel-session-delete-btn",
182
+ type: "button",
183
+ "aria-label": `\u5220\u9664\u4F1A\u8BDD: ${item.title}`,
184
+ onClick: _withModifiers(($event) => $setup.handleDeleteSession(item), ["stop"])
185
+ }, " \xD7 ", 8, _hoisted_9)
186
+ ]),
187
+ _createElementVNode(
188
+ "div",
189
+ _hoisted_10,
190
+ _toDisplayString(item.meta),
191
+ 1
192
+ /* TEXT */
193
+ )
194
+ ], 10, _hoisted_5);
195
+ }),
196
+ 128
197
+ /* KEYED_FRAGMENT */
198
+ )) : (_openBlock(), _createElementBlock(
199
+ _Fragment,
200
+ { key: 2 },
201
+ [
202
+ _createCommentVNode(" Empty State "),
203
+ _renderSlot(_ctx.$slots, "empty")
204
+ ],
205
+ 64
206
+ /* STABLE_FRAGMENT */
207
+ ))
208
+ ])
209
+ ],
210
+ 2112
211
+ /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
212
+ ))
213
+ ],
214
+ 2
215
+ /* CLASS */
216
+ );
217
+ }
218
+ __vue_sfc__.render = __vue_render__;
219
+ var SessionList_vue_default = __vue_sfc__;
220
+ export {
221
+ SessionList_vue_default as default
222
+ };
@@ -0,0 +1 @@
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)}}
@@ -0,0 +1,18 @@
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;