@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,27 @@
1
+ declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {}, __VLS_9: {}, __VLS_11: {}, __VLS_13: {}, __VLS_15: {};
2
+ type __VLS_Slots = {} & {
3
+ 'session-toggle-icon'?: (props: typeof __VLS_1) => any;
4
+ } & {
5
+ 'select-icon'?: (props: typeof __VLS_3) => any;
6
+ } & {
7
+ 'theme-icon'?: (props: typeof __VLS_5) => any;
8
+ } & {
9
+ 'display-mode-icon'?: (props: typeof __VLS_7) => any;
10
+ } & {
11
+ 'split-position-icon'?: (props: typeof __VLS_9) => any;
12
+ } & {
13
+ 'prompt-dock-icon'?: (props: typeof __VLS_11) => any;
14
+ } & {
15
+ 'minimize-icon'?: (props: typeof __VLS_13) => any;
16
+ } & {
17
+ 'close-icon'?: (props: typeof __VLS_15) => any;
18
+ };
19
+ 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>;
20
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
21
+ declare const _default: typeof __VLS_export;
22
+ export default _default;
23
+ type __VLS_WithSlots<T, S> = T & {
24
+ new (): {
25
+ $slots: S;
26
+ };
27
+ };
@@ -0,0 +1 @@
1
+ .aipanel-resize-handle{position:absolute;left:0;top:0;bottom:0;width:6px;cursor:col-resize;background:transparent;z-index:10;transition:background .2s ease}.aipanel-resize-handle.handle-left{left:auto;right:0}.aipanel-resize-handle:hover,.aipanel-resize-handle.resizing{background:var(--ap-primary-bg)}.aipanel-resize-handle:after{content:"";position:absolute;left:2px;top:50%;transform:translateY(-50%);width:2px;height:40px;background:var(--ap-border-secondary);border-radius:1px;opacity:0;transition:opacity .2s ease}.aipanel-resize-handle.handle-left:after{left:auto;right:2px}.aipanel-resize-handle:hover:after,.aipanel-resize-handle.resizing:after{opacity:1}
@@ -0,0 +1,98 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var ResizeHandle_vue_exports = {};
19
+ __export(ResizeHandle_vue_exports, {
20
+ default: () => ResizeHandle_vue_default
21
+ });
22
+ module.exports = __toCommonJS(ResizeHandle_vue_exports);
23
+ var import_ResizeHandle_sfc = require("./ResizeHandle-sfc.css");
24
+ var import_vue = require("vue");
25
+ var import_vue2 = require("vue");
26
+ var import_vue3 = require("vue");
27
+ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
28
+ ...{
29
+ name: "ResizeHandle"
30
+ },
31
+ __name: "ResizeHandle",
32
+ props: {
33
+ width: { type: Number, required: false, default: 500 },
34
+ minWidth: { type: Number, required: false, default: 400 },
35
+ maxWidth: { type: Number, required: false, default: 800 },
36
+ position: { type: String, required: false, default: "right" }
37
+ },
38
+ emits: ["resize", "resize-start", "resize-end"],
39
+ setup(__props, { expose: __expose, emit: __emit }) {
40
+ __expose();
41
+ const props = __props;
42
+ const emit = __emit;
43
+ const isResizing = (0, import_vue2.ref)(false);
44
+ const startX = (0, import_vue2.ref)(0);
45
+ const startWidth = (0, import_vue2.ref)(0);
46
+ const handleMouseDown = (e) => {
47
+ e.preventDefault();
48
+ isResizing.value = true;
49
+ startX.value = e.clientX;
50
+ startWidth.value = props.width;
51
+ emit("resize-start");
52
+ document.addEventListener("mousemove", handleMouseMove);
53
+ document.addEventListener("mouseup", handleMouseUp);
54
+ };
55
+ const handleMouseMove = (e) => {
56
+ if (!isResizing.value) return;
57
+ let deltaX;
58
+ if (props.position === "right") {
59
+ deltaX = startX.value - e.clientX;
60
+ } else {
61
+ deltaX = e.clientX - startX.value;
62
+ }
63
+ const newWidth = Math.max(props.minWidth, Math.min(props.maxWidth, startWidth.value + deltaX));
64
+ emit("resize", newWidth);
65
+ };
66
+ const handleMouseUp = () => {
67
+ isResizing.value = false;
68
+ emit("resize-end");
69
+ document.removeEventListener("mousemove", handleMouseMove);
70
+ document.removeEventListener("mouseup", handleMouseUp);
71
+ };
72
+ const handleDoubleClick = () => {
73
+ emit("resize", 500);
74
+ };
75
+ (0, import_vue2.onUnmounted)(() => {
76
+ document.removeEventListener("mousemove", handleMouseMove);
77
+ document.removeEventListener("mouseup", handleMouseUp);
78
+ });
79
+ const __returned__ = { props, emit, isResizing, startX, startWidth, handleMouseDown, handleMouseMove, handleMouseUp, handleDoubleClick };
80
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
81
+ return __returned__;
82
+ }
83
+ });
84
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
85
+ return (0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
86
+ "div",
87
+ {
88
+ class: (0, import_vue3.normalizeClass)(["aipanel-resize-handle", { resizing: $setup.isResizing, "handle-left": $props.position === "left" }]),
89
+ onMousedown: $setup.handleMouseDown,
90
+ onDblclick: $setup.handleDoubleClick
91
+ },
92
+ null,
93
+ 34
94
+ /* CLASS, NEED_HYDRATION */
95
+ );
96
+ }
97
+ __vue_sfc__.render = __vue_render__;
98
+ var ResizeHandle_vue_default = __vue_sfc__;
@@ -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 @@
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,59 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var SelectHint_vue_exports = {};
19
+ __export(SelectHint_vue_exports, {
20
+ default: () => SelectHint_vue_default
21
+ });
22
+ module.exports = __toCommonJS(SelectHint_vue_exports);
23
+ var import_SelectHint_sfc = require("./SelectHint-sfc.css");
24
+ var import_vue = require("vue");
25
+ var import_context = require("../context.cjs");
26
+ var import_vue2 = require("vue");
27
+ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
28
+ __name: "SelectHint",
29
+ setup(__props, { expose: __expose }) {
30
+ __expose();
31
+ const { selectMode: visible, selectShortcutLabel: shortcutLabel } = (0, import_context.useAIPanelWidgetContext)();
32
+ const __returned__ = { visible, shortcutLabel };
33
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
34
+ return __returned__;
35
+ }
36
+ });
37
+ const _hoisted_1 = { class: "aipanel-hint-shortcut" };
38
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
39
+ return (0, import_vue2.openBlock)(), (0, import_vue2.createElementBlock)(
40
+ "div",
41
+ {
42
+ class: (0, import_vue2.normalizeClass)(["aipanel-select-mode-hint", { visible: $setup.visible }])
43
+ },
44
+ [
45
+ _cache[0] || (_cache[0] = (0, import_vue2.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)),
46
+ (0, import_vue2.createElementVNode)(
47
+ "span",
48
+ _hoisted_1,
49
+ (0, import_vue2.toDisplayString)($setup.shortcutLabel),
50
+ 1
51
+ /* TEXT */
52
+ )
53
+ ],
54
+ 2
55
+ /* CLASS */
56
+ );
57
+ }
58
+ __vue_sfc__.render = __vue_render__;
59
+ var SelectHint_vue_default = __vue_sfc__;
@@ -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 @@
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,103 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var SelectedBubbles_vue_exports = {};
19
+ __export(SelectedBubbles_vue_exports, {
20
+ default: () => SelectedBubbles_vue_default
21
+ });
22
+ module.exports = __toCommonJS(SelectedBubbles_vue_exports);
23
+ var import_SelectedBubbles_sfc = require("./SelectedBubbles-sfc.css");
24
+ var import_vue = require("vue");
25
+ var import_context = require("../context.cjs");
26
+ var import_vue2 = require("vue");
27
+ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
28
+ __name: "SelectedBubbles",
29
+ setup(__props, { expose: __expose }) {
30
+ __expose();
31
+ const {
32
+ bubbleVisible: visible,
33
+ selectedElementItems: items,
34
+ handleClickSelectedNode,
35
+ handleRemoveSelectedNode
36
+ } = (0, import_context.useAIPanelWidgetContext)();
37
+ const __returned__ = { visible, items, handleClickSelectedNode, handleRemoveSelectedNode };
38
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
39
+ return __returned__;
40
+ }
41
+ });
42
+ const _hoisted_1 = {
43
+ key: 0,
44
+ class: "aipanel-bubble-empty"
45
+ };
46
+ const _hoisted_2 = ["onClick"];
47
+ const _hoisted_3 = { class: "aipanel-bubble-text" };
48
+ const _hoisted_4 = {
49
+ key: 0,
50
+ class: "aipanel-bubble-file"
51
+ };
52
+ const _hoisted_5 = ["aria-label", "onClick"];
53
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
54
+ return (0, import_vue2.openBlock)(), (0, import_vue2.createElementBlock)(
55
+ "div",
56
+ {
57
+ class: (0, import_vue2.normalizeClass)(["aipanel-selected-bubbles", { visible: $setup.visible }]),
58
+ role: "list",
59
+ "aria-label": "\u5DF2\u9009\u5143\u7D20\u5217\u8868"
60
+ },
61
+ [
62
+ $setup.items.length === 0 ? ((0, import_vue2.openBlock)(), (0, import_vue2.createElementBlock)("div", _hoisted_1, "\u6682\u65E0\u9009\u4E2D\u5143\u7D20")) : ((0, import_vue2.openBlock)(true), (0, import_vue2.createElementBlock)(
63
+ import_vue2.Fragment,
64
+ { key: 1 },
65
+ (0, import_vue2.renderList)($setup.items, (item, index) => {
66
+ return (0, import_vue2.openBlock)(), (0, import_vue2.createElementBlock)("div", {
67
+ key: item.key,
68
+ class: "aipanel-selected-bubble",
69
+ role: "listitem",
70
+ onClick: ($event) => $setup.handleClickSelectedNode(item)
71
+ }, [
72
+ (0, import_vue2.createElementVNode)(
73
+ "span",
74
+ _hoisted_3,
75
+ (0, import_vue2.toDisplayString)(item.description),
76
+ 1
77
+ /* TEXT */
78
+ ),
79
+ item.bubbleFileText ? ((0, import_vue2.openBlock)(), (0, import_vue2.createElementBlock)(
80
+ "span",
81
+ _hoisted_4,
82
+ (0, import_vue2.toDisplayString)(item.bubbleFileText),
83
+ 1
84
+ /* TEXT */
85
+ )) : (0, import_vue2.createCommentVNode)("v-if", true),
86
+ (0, import_vue2.createElementVNode)("button", {
87
+ class: "aipanel-bubble-remove",
88
+ type: "button",
89
+ "aria-label": `\u79FB\u9664\u5143\u7D20: ${item.description}`,
90
+ onClick: (0, import_vue2.withModifiers)(($event) => $setup.handleRemoveSelectedNode({ item, index, source: "bubble" }), ["stop"])
91
+ }, " \xD7 ", 8, _hoisted_5)
92
+ ], 8, _hoisted_2);
93
+ }),
94
+ 128
95
+ /* KEYED_FRAGMENT */
96
+ ))
97
+ ],
98
+ 2
99
+ /* CLASS */
100
+ );
101
+ }
102
+ __vue_sfc__.render = __vue_render__;
103
+ var SelectedBubbles_vue_default = __vue_sfc__;
@@ -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 @@
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,122 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var SelectedNodes_vue_exports = {};
19
+ __export(SelectedNodes_vue_exports, {
20
+ default: () => SelectedNodes_vue_default
21
+ });
22
+ module.exports = __toCommonJS(SelectedNodes_vue_exports);
23
+ var import_SelectedNodes_sfc = require("./SelectedNodes-sfc.css");
24
+ var import_vue = require("vue");
25
+ var import_context = require("../context.cjs");
26
+ var import_vue2 = require("vue");
27
+ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
28
+ __name: "SelectedNodes",
29
+ setup(__props, { expose: __expose }) {
30
+ __expose();
31
+ const {
32
+ selectedElementItems: items,
33
+ showClearAll,
34
+ handleClickSelectedNode,
35
+ handleRemoveSelectedNode,
36
+ handleClearSelectedNodes
37
+ } = (0, import_context.useAIPanelWidgetContext)();
38
+ const __returned__ = { items, showClearAll, handleClickSelectedNode, handleRemoveSelectedNode, handleClearSelectedNodes };
39
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
40
+ return __returned__;
41
+ }
42
+ });
43
+ const _hoisted_1 = {
44
+ class: "aipanel-selected-nodes",
45
+ role: "list",
46
+ "aria-label": "\u5DF2\u9009\u5143\u7D20\u5217\u8868"
47
+ };
48
+ const _hoisted_2 = ["onClick"];
49
+ const _hoisted_3 = { class: "aipanel-node-content" };
50
+ const _hoisted_4 = { class: "aipanel-node-text" };
51
+ const _hoisted_5 = { class: "aipanel-node-file" };
52
+ const _hoisted_6 = ["aria-label", "onClick"];
53
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
54
+ return (0, import_vue2.openBlock)(), (0, import_vue2.createElementBlock)(
55
+ "div",
56
+ {
57
+ class: (0, import_vue2.normalizeClass)(["aipanel-right-toolbar", { collapsed: $setup.items.length === 0 }])
58
+ },
59
+ [
60
+ _cache[1] || (_cache[1] = (0, import_vue2.createElementVNode)(
61
+ "div",
62
+ { class: "aipanel-selected-nodes-header" },
63
+ [
64
+ (0, import_vue2.createElementVNode)("div", { class: "aipanel-selected-nodes-title" }, "\u5DF2\u9009\u8282\u70B9"),
65
+ (0, import_vue2.createElementVNode)("div", { class: "aipanel-selected-nodes-desc" }, "\u9009\u4E2D\u7684\u8282\u70B9\u4F1A\u5728\u5BF9\u8BDD\u65F6\u4E00\u8D77\u53D1\u9001\u7ED9\u52A9\u624B")
66
+ ],
67
+ -1
68
+ /* CACHED */
69
+ )),
70
+ (0, import_vue2.createElementVNode)("div", _hoisted_1, [
71
+ ((0, import_vue2.openBlock)(true), (0, import_vue2.createElementBlock)(
72
+ import_vue2.Fragment,
73
+ null,
74
+ (0, import_vue2.renderList)($setup.items, (item, index) => {
75
+ return (0, import_vue2.openBlock)(), (0, import_vue2.createElementBlock)("div", {
76
+ key: item.key,
77
+ class: "aipanel-selected-node",
78
+ role: "listitem",
79
+ onClick: ($event) => $setup.handleClickSelectedNode(item)
80
+ }, [
81
+ (0, import_vue2.createElementVNode)("div", _hoisted_3, [
82
+ (0, import_vue2.createElementVNode)(
83
+ "span",
84
+ _hoisted_4,
85
+ (0, import_vue2.toDisplayString)(item.description),
86
+ 1
87
+ /* TEXT */
88
+ ),
89
+ (0, import_vue2.createElementVNode)(
90
+ "span",
91
+ _hoisted_5,
92
+ (0, import_vue2.toDisplayString)(item.panelFileText),
93
+ 1
94
+ /* TEXT */
95
+ )
96
+ ]),
97
+ (0, import_vue2.createElementVNode)("button", {
98
+ class: "aipanel-node-remove",
99
+ type: "button",
100
+ "aria-label": `\u79FB\u9664\u5143\u7D20: ${item.description}`,
101
+ onClick: (0, import_vue2.withModifiers)(($event) => $setup.handleRemoveSelectedNode({ item, index, source: "panel" }), ["stop"])
102
+ }, " \xD7 ", 8, _hoisted_6)
103
+ ], 8, _hoisted_2);
104
+ }),
105
+ 128
106
+ /* KEYED_FRAGMENT */
107
+ ))
108
+ ]),
109
+ $setup.showClearAll && $setup.items.length > 0 ? ((0, import_vue2.openBlock)(), (0, import_vue2.createElementBlock)("button", {
110
+ key: 0,
111
+ class: "aipanel-clear-all-btn",
112
+ type: "button",
113
+ "aria-label": "\u6E05\u7A7A\u6240\u6709\u5DF2\u9009\u8282\u70B9",
114
+ onClick: _cache[0] || (_cache[0] = (...args) => $setup.handleClearSelectedNodes && $setup.handleClearSelectedNodes(...args))
115
+ }, " \u4E00\u952E\u6E05\u7A7A ")) : (0, import_vue2.createCommentVNode)("v-if", true)
116
+ ],
117
+ 2
118
+ /* CLASS */
119
+ );
120
+ }
121
+ __vue_sfc__.render = __vue_render__;
122
+ var SelectedNodes_vue_default = __vue_sfc__;
@@ -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 @@
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}}