@vite-plugin-opencode-assistant/components 1.0.36 → 1.0.38

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 (47) hide show
  1. package/es/index.d.ts +1 -1
  2. package/es/index.js +1 -1
  3. package/es/open-code-widget/composables/use-persist-state.d.ts +2 -0
  4. package/es/open-code-widget/composables/use-persist-state.js +24 -9
  5. package/es/open-code-widget/composables/use-split.d.ts +24 -0
  6. package/es/open-code-widget/composables/use-split.js +90 -0
  7. package/es/open-code-widget/src/components/ChatPanel-sfc.css +1 -0
  8. package/es/open-code-widget/src/components/ChatPanel.vue.d.ts +180 -0
  9. package/es/open-code-widget/src/components/ChatPanel.vue.js +288 -0
  10. package/es/open-code-widget/src/components/Header.vue.js +13 -8
  11. package/es/open-code-widget/src/components/ResizeHandle-sfc.css +1 -0
  12. package/es/open-code-widget/src/components/ResizeHandle.vue.d.ts +19 -0
  13. package/es/open-code-widget/src/components/ResizeHandle.vue.js +91 -0
  14. package/es/open-code-widget/src/components/SplitTrigger-sfc.css +1 -0
  15. package/es/open-code-widget/src/components/SplitTrigger.vue.d.ts +17 -0
  16. package/es/open-code-widget/src/components/SplitTrigger.vue.js +130 -0
  17. package/es/open-code-widget/src/context.d.ts +1 -0
  18. package/es/open-code-widget/src/index-sfc.css +1 -1
  19. package/es/open-code-widget/src/index.vue.d.ts +16 -53
  20. package/es/open-code-widget/src/index.vue.js +150 -140
  21. package/es/open-code-widget/src/types.d.ts +1 -1
  22. package/lib/@vite-plugin-opencode-assistant/components.cjs.js +806 -248
  23. package/lib/@vite-plugin-opencode-assistant/components.es.js +802 -244
  24. package/lib/components.css +5 -3
  25. package/lib/index.d.ts +1 -1
  26. package/lib/index.js +1 -1
  27. package/lib/open-code-widget/composables/use-persist-state.d.ts +2 -0
  28. package/lib/open-code-widget/composables/use-persist-state.js +24 -9
  29. package/lib/open-code-widget/composables/use-split.d.ts +24 -0
  30. package/lib/open-code-widget/composables/use-split.js +109 -0
  31. package/lib/open-code-widget/src/components/ChatPanel-sfc.css +1 -0
  32. package/lib/open-code-widget/src/components/ChatPanel.vue.d.ts +180 -0
  33. package/lib/open-code-widget/src/components/ChatPanel.vue.js +315 -0
  34. package/lib/open-code-widget/src/components/Header.vue.js +12 -7
  35. package/lib/open-code-widget/src/components/ResizeHandle-sfc.css +1 -0
  36. package/lib/open-code-widget/src/components/ResizeHandle.vue.d.ts +19 -0
  37. package/lib/open-code-widget/src/components/ResizeHandle.vue.js +108 -0
  38. package/lib/open-code-widget/src/components/SplitTrigger-sfc.css +1 -0
  39. package/lib/open-code-widget/src/components/SplitTrigger.vue.d.ts +17 -0
  40. package/lib/open-code-widget/src/components/SplitTrigger.vue.js +147 -0
  41. package/lib/open-code-widget/src/context.d.ts +1 -0
  42. package/lib/open-code-widget/src/index-sfc.css +1 -1
  43. package/lib/open-code-widget/src/index.vue.d.ts +16 -53
  44. package/lib/open-code-widget/src/index.vue.js +149 -139
  45. package/lib/open-code-widget/src/types.d.ts +1 -1
  46. package/lib/web-types.json +1 -1
  47. package/package.json +2 -2
@@ -0,0 +1,315 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
11
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
+ var __spreadValues = (a, b) => {
13
+ for (var prop in b || (b = {}))
14
+ if (__hasOwnProp.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ if (__getOwnPropSymbols)
17
+ for (var prop of __getOwnPropSymbols(b)) {
18
+ if (__propIsEnum.call(b, prop))
19
+ __defNormalProp(a, prop, b[prop]);
20
+ }
21
+ return a;
22
+ };
23
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
24
+ var __export = (target, all) => {
25
+ for (var name in all)
26
+ __defProp(target, name, { get: all[name], enumerable: true });
27
+ };
28
+ var __copyProps = (to, from, except, desc) => {
29
+ if (from && typeof from === "object" || typeof from === "function") {
30
+ for (let key of __getOwnPropNames(from))
31
+ if (!__hasOwnProp.call(to, key) && key !== except)
32
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
33
+ }
34
+ return to;
35
+ };
36
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
37
+ // If the importer is in node compatibility mode or this is not an ESM
38
+ // file that has been converted to a CommonJS file using a Babel-
39
+ // compatible transform (i.e. "__esModule" has not been set), then set
40
+ // "default" to the CommonJS "module.exports" for node compatibility.
41
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
42
+ mod
43
+ ));
44
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
45
+ var ChatPanel_vue_exports = {};
46
+ __export(ChatPanel_vue_exports, {
47
+ default: () => ChatPanel_vue_default
48
+ });
49
+ module.exports = __toCommonJS(ChatPanel_vue_exports);
50
+ var import_ChatPanel_sfc = require("./ChatPanel-sfc.css");
51
+ var import_vue = require("vue");
52
+ var import_vue2 = require("vue");
53
+ var import_Frame_vue = __toESM(require("./Frame.vue.js"));
54
+ var import_Header_vue = __toESM(require("./Header.vue.js"));
55
+ var import_SessionList_vue = __toESM(require("./SessionList.vue.js"));
56
+ var import_SelectedNodes_vue = __toESM(require("./SelectedNodes.vue.js"));
57
+ var import_ResizeHandle_vue = __toESM(require("./ResizeHandle.vue.js"));
58
+ var import_vue3 = require("vue");
59
+ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProps(__spreadValues({}, {
60
+ name: "ChatPanel"
61
+ }), {
62
+ __name: "ChatPanel",
63
+ props: {
64
+ mode: { type: String, required: false, default: "bubble" },
65
+ open: { type: Boolean, required: false, default: false },
66
+ minimized: { type: Boolean, required: false, default: false },
67
+ positionStyle: { type: Object, required: false, default: () => ({}) },
68
+ animationOrigin: { type: Object, required: false, default: () => ({ x: "20px", y: "20px" }) },
69
+ panelWidth: { type: Number, required: false, default: 500 },
70
+ resizable: { type: Boolean, required: false, default: true },
71
+ minWidth: { type: Number, required: false, default: 400 },
72
+ maxWidth: { type: Number, required: false, default: 800 },
73
+ noTransition: { type: Boolean, required: false, default: false },
74
+ dragging: { type: Boolean, required: false, default: false },
75
+ notificationVisible: { type: Boolean, required: false, default: false },
76
+ notificationMessage: { type: String, required: false, default: "" },
77
+ notificationMode: { type: String, required: false, default: "widget" },
78
+ thinking: { type: Boolean, required: false, default: false },
79
+ resolvedTheme: { type: String, required: false, default: "light" }
80
+ },
81
+ emits: ["resize", "resize-start", "resize-end", "toggle"],
82
+ setup(__props, { expose: __expose, emit: __emit }) {
83
+ (0, import_vue.useCssVars)((_ctx) => ({
84
+ "-animationOrigin.x": _ctx.animationOrigin.x,
85
+ "-animationOrigin.y": _ctx.animationOrigin.y
86
+ }));
87
+ const props = __props;
88
+ const emit = __emit;
89
+ const slots = (0, import_vue2.useSlots)();
90
+ const frameRef = (0, import_vue2.ref)(null);
91
+ const sendMessageToIframe = (type, data) => {
92
+ var _a;
93
+ (_a = frameRef.value) == null ? void 0 : _a.sendMessageToIframe(type, data);
94
+ };
95
+ __expose({
96
+ sendMessageToIframe,
97
+ frameRef
98
+ });
99
+ const handleResizeStart = () => {
100
+ emit("resize-start");
101
+ };
102
+ const handleResize = (width) => {
103
+ emit("resize", width);
104
+ };
105
+ const handleResizeEnd = () => {
106
+ emit("resize-end");
107
+ };
108
+ const handleToggle = () => {
109
+ emit("toggle");
110
+ };
111
+ const panelStyle = (0, import_vue2.computed)(() => {
112
+ if (props.mode === "split") {
113
+ return {
114
+ width: `${props.panelWidth}px`
115
+ };
116
+ }
117
+ return props.positionStyle;
118
+ });
119
+ const panelClasses = (0, import_vue2.computed)(() => [
120
+ "opencode-chat",
121
+ {
122
+ open: props.open,
123
+ minimized: props.minimized,
124
+ dragging: props.dragging,
125
+ "no-transition": props.noTransition,
126
+ "split-mode": props.mode === "split"
127
+ }
128
+ ]);
129
+ const __returned__ = { props, emit, slots, frameRef, sendMessageToIframe, handleResizeStart, handleResize, handleResizeEnd, handleToggle, panelStyle, panelClasses, Frame: import_Frame_vue.default, Header: import_Header_vue.default, SessionList: import_SessionList_vue.default, SelectedNodes: import_SelectedNodes_vue.default, ResizeHandle: import_ResizeHandle_vue.default };
130
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
131
+ return __returned__;
132
+ }
133
+ }));
134
+ const _hoisted_1 = ["aria-expanded"];
135
+ const _hoisted_2 = { class: "opencode-split-toggle-icon" };
136
+ const _hoisted_3 = {
137
+ key: 0,
138
+ viewBox: "0 0 24 24",
139
+ width: "16",
140
+ height: "16",
141
+ fill: "none",
142
+ stroke: "currentColor",
143
+ "stroke-width": "2"
144
+ };
145
+ const _hoisted_4 = {
146
+ key: 1,
147
+ viewBox: "0 0 24 24",
148
+ width: "16",
149
+ height: "16",
150
+ fill: "none",
151
+ stroke: "currentColor",
152
+ "stroke-width": "2"
153
+ };
154
+ const _hoisted_5 = {
155
+ key: 2,
156
+ class: "opencode-notification",
157
+ role: "alert"
158
+ };
159
+ const _hoisted_6 = { class: "opencode-chat-content" };
160
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
161
+ return (0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
162
+ "div",
163
+ {
164
+ class: (0, import_vue3.normalizeClass)($setup.panelClasses),
165
+ style: (0, import_vue3.normalizeStyle)($setup.panelStyle)
166
+ },
167
+ [
168
+ $props.mode === "split" && $props.resizable && $props.open ? ((0, import_vue3.openBlock)(), (0, import_vue3.createBlock)($setup["ResizeHandle"], {
169
+ key: 0,
170
+ width: $props.panelWidth,
171
+ "min-width": $props.minWidth,
172
+ "max-width": $props.maxWidth,
173
+ onResize: $setup.handleResize,
174
+ onResizeStart: $setup.handleResizeStart,
175
+ onResizeEnd: $setup.handleResizeEnd
176
+ }, null, 8, ["width", "min-width", "max-width"])) : (0, import_vue3.createCommentVNode)("v-if", true),
177
+ $props.mode === "split" ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("button", {
178
+ key: 1,
179
+ type: "button",
180
+ class: (0, import_vue3.normalizeClass)(["opencode-split-toggle-btn", { open: $setup.props.open, thinking: $setup.props.thinking, "opencode-theme-dark": $props.resolvedTheme === "dark" }]),
181
+ "aria-expanded": $props.open,
182
+ "aria-label": "\u5207\u6362\u9762\u677F",
183
+ onClick: $setup.handleToggle
184
+ }, [
185
+ (0, import_vue3.createElementVNode)("span", _hoisted_2, [
186
+ $props.open ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_3, [..._cache[0] || (_cache[0] = [
187
+ (0, import_vue3.createElementVNode)(
188
+ "path",
189
+ {
190
+ d: "M9 18l6-6-6-6",
191
+ "stroke-linecap": "round",
192
+ "stroke-linejoin": "round"
193
+ },
194
+ null,
195
+ -1
196
+ /* CACHED */
197
+ )
198
+ ])])) : ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_4, [..._cache[1] || (_cache[1] = [
199
+ (0, import_vue3.createElementVNode)(
200
+ "path",
201
+ {
202
+ d: "M15 18l-6-6 6-6",
203
+ "stroke-linecap": "round",
204
+ "stroke-linejoin": "round"
205
+ },
206
+ null,
207
+ -1
208
+ /* CACHED */
209
+ )
210
+ ])]))
211
+ ])
212
+ ], 10, _hoisted_1)) : (0, import_vue3.createCommentVNode)("v-if", true),
213
+ (0, import_vue3.createVNode)(
214
+ $setup["Header"],
215
+ null,
216
+ (0, import_vue3.createSlots)({
217
+ _: 2
218
+ /* DYNAMIC */
219
+ }, [
220
+ $setup.slots["session-toggle-icon"] ? {
221
+ name: "session-toggle-icon",
222
+ fn: (0, import_vue3.withCtx)(() => [
223
+ (0, import_vue3.renderSlot)(_ctx.$slots, "session-toggle-icon")
224
+ ]),
225
+ key: "0"
226
+ } : void 0,
227
+ $setup.slots["select-icon"] ? {
228
+ name: "select-icon",
229
+ fn: (0, import_vue3.withCtx)(() => [
230
+ (0, import_vue3.renderSlot)(_ctx.$slots, "select-icon")
231
+ ]),
232
+ key: "1"
233
+ } : void 0,
234
+ $setup.slots["close-icon"] ? {
235
+ name: "close-icon",
236
+ fn: (0, import_vue3.withCtx)(() => [
237
+ (0, import_vue3.renderSlot)(_ctx.$slots, "close-icon")
238
+ ]),
239
+ key: "2"
240
+ } : void 0
241
+ ]),
242
+ 1024
243
+ /* DYNAMIC_SLOTS */
244
+ ),
245
+ $props.notificationVisible && $props.notificationMode === "widget" ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
246
+ "div",
247
+ _hoisted_5,
248
+ (0, import_vue3.toDisplayString)($props.notificationMessage),
249
+ 1
250
+ /* TEXT */
251
+ )) : (0, import_vue3.createCommentVNode)("v-if", true),
252
+ (0, import_vue3.createElementVNode)("div", _hoisted_6, [
253
+ (0, import_vue3.createVNode)($setup["SessionList"], null, {
254
+ empty: (0, import_vue3.withCtx)(() => [
255
+ (0, import_vue3.renderSlot)(_ctx.$slots, "sessions-empty", {}, () => [
256
+ _cache[2] || (_cache[2] = (0, import_vue3.createElementVNode)(
257
+ "div",
258
+ { class: "opencode-session-empty" },
259
+ "\u6682\u65E0\u4F1A\u8BDD",
260
+ -1
261
+ /* CACHED */
262
+ ))
263
+ ])
264
+ ]),
265
+ _: 3
266
+ /* FORWARDED */
267
+ }),
268
+ (0, import_vue3.createVNode)(
269
+ $setup["Frame"],
270
+ { ref: "frameRef" },
271
+ (0, import_vue3.createSlots)({
272
+ _: 2
273
+ /* DYNAMIC */
274
+ }, [
275
+ $setup.slots["empty-state"] ? {
276
+ name: "empty-state",
277
+ fn: (0, import_vue3.withCtx)(() => [
278
+ (0, import_vue3.renderSlot)(_ctx.$slots, "empty-state")
279
+ ]),
280
+ key: "0"
281
+ } : void 0,
282
+ $setup.slots.loading ? {
283
+ name: "loading",
284
+ fn: (0, import_vue3.withCtx)(() => [
285
+ (0, import_vue3.renderSlot)(_ctx.$slots, "loading")
286
+ ]),
287
+ key: "1"
288
+ } : void 0,
289
+ $setup.slots.error ? {
290
+ name: "error",
291
+ fn: (0, import_vue3.withCtx)(() => [
292
+ (0, import_vue3.renderSlot)(_ctx.$slots, "error")
293
+ ]),
294
+ key: "2"
295
+ } : void 0,
296
+ $setup.slots.content ? {
297
+ name: "content",
298
+ fn: (0, import_vue3.withCtx)(() => [
299
+ (0, import_vue3.renderSlot)(_ctx.$slots, "content")
300
+ ]),
301
+ key: "3"
302
+ } : void 0
303
+ ]),
304
+ 1536
305
+ /* NEED_PATCH, DYNAMIC_SLOTS */
306
+ ),
307
+ (0, import_vue3.createVNode)($setup["SelectedNodes"])
308
+ ])
309
+ ],
310
+ 6
311
+ /* CLASS, STYLE */
312
+ );
313
+ }
314
+ __vue_sfc__.render = __vue_render__;
315
+ var ChatPanel_vue_default = __vue_sfc__;
@@ -39,6 +39,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
39
39
  resolvedTheme,
40
40
  minimized,
41
41
  promptDockVisible,
42
+ mode,
42
43
  handleToggleSessionList,
43
44
  handleToggleSelectMode,
44
45
  handleToggleTheme,
@@ -46,6 +47,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
46
47
  handleToggleMinimize,
47
48
  handleTogglePromptDock
48
49
  } = (0, import_context.useOpenCodeWidgetContext)();
50
+ const isSplitMode = (0, import_vue2.computed)(() => mode.value === "split");
49
51
  const themeIconTitle = (0, import_vue2.computed)(() => {
50
52
  const themeLabels = {
51
53
  auto: "\u81EA\u52A8",
@@ -62,7 +64,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
62
64
  };
63
65
  return `\u5207\u6362\u4E3B\u9898 - \u5F53\u524D: ${themeLabels[theme.value]}`;
64
66
  });
65
- const __returned__ = { title, sessionListTitle, sessionListCollapsed, selectMode, selectEnabled, theme, resolvedTheme, minimized, promptDockVisible, handleToggleSessionList, handleToggleSelectMode, handleToggleTheme, handleClose, handleToggleMinimize, handleTogglePromptDock, themeIconTitle, themeIconLabel };
67
+ const __returned__ = { title, sessionListTitle, sessionListCollapsed, selectMode, selectEnabled, theme, resolvedTheme, minimized, promptDockVisible, mode, handleToggleSessionList, handleToggleSelectMode, handleToggleTheme, handleClose, handleToggleMinimize, handleTogglePromptDock, isSplitMode, themeIconTitle, themeIconLabel };
66
68
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
67
69
  return __returned__;
68
70
  }
@@ -225,7 +227,8 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
225
227
  /* TEXT */
226
228
  ),
227
229
  (0, import_vue3.createElementVNode)("div", _hoisted_10, [
228
- (0, import_vue3.createElementVNode)("button", {
230
+ !$setup.isSplitMode ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("button", {
231
+ key: 0,
229
232
  class: "opencode-header-btn prompt-dock",
230
233
  type: "button",
231
234
  title: $setup.promptDockVisible ? "\u9690\u85CF\u5BF9\u8BDD\u6846" : "\u663E\u793A\u5BF9\u8BDD\u6846",
@@ -252,8 +255,9 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
252
255
  /* CACHED */
253
256
  ))
254
257
  ])
255
- ], 8, _hoisted_11),
256
- (0, import_vue3.createElementVNode)("button", {
258
+ ], 8, _hoisted_11)) : (0, import_vue3.createCommentVNode)("v-if", true),
259
+ !$setup.isSplitMode ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("button", {
260
+ key: 1,
257
261
  class: "opencode-header-btn minimize",
258
262
  type: "button",
259
263
  title: $setup.minimized ? "\u5C55\u5F00" : "\u6700\u5C0F\u5316",
@@ -280,8 +284,9 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
280
284
  )
281
285
  ])]))
282
286
  ])
283
- ], 8, _hoisted_12),
284
- (0, import_vue3.createElementVNode)("button", {
287
+ ], 8, _hoisted_12)) : (0, import_vue3.createCommentVNode)("v-if", true),
288
+ !$setup.isSplitMode ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("button", {
289
+ key: 2,
285
290
  class: "opencode-header-btn close",
286
291
  type: "button",
287
292
  title: "\u5173\u95ED",
@@ -307,7 +312,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
307
312
  /* CACHED */
308
313
  ))
309
314
  ])
310
- ])
315
+ ])) : (0, import_vue3.createCommentVNode)("v-if", true)
311
316
  ])
312
317
  ]);
313
318
  }
@@ -0,0 +1 @@
1
+ .opencode-resize-handle{position:absolute;left:0;top:0;bottom:0;width:6px;cursor:col-resize;background:transparent;z-index:10;transition:background .2s ease}.opencode-resize-handle:hover,.opencode-resize-handle.resizing{background:var(--oc-primary-bg)}.opencode-resize-handle:after{content:"";position:absolute;left:2px;top:50%;transform:translateY(-50%);width:2px;height:40px;background:var(--oc-border-secondary);border-radius:1px;opacity:0;transition:opacity .2s ease}.opencode-resize-handle:hover:after,.opencode-resize-handle.resizing:after{opacity:1}
@@ -0,0 +1,19 @@
1
+ type __VLS_Props = {
2
+ width: number;
3
+ minWidth?: number;
4
+ maxWidth?: number;
5
+ };
6
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
7
+ resize: (width: number) => any;
8
+ "resize-start": () => any;
9
+ "resize-end": () => any;
10
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
11
+ onResize?: ((width: number) => any) | undefined;
12
+ "onResize-start"?: (() => any) | undefined;
13
+ "onResize-end"?: (() => any) | undefined;
14
+ }>, {
15
+ width: number;
16
+ minWidth: number;
17
+ maxWidth: number;
18
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
19
+ export default _default;
@@ -0,0 +1,108 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __spreadValues = (a, b) => {
11
+ for (var prop in b || (b = {}))
12
+ if (__hasOwnProp.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ if (__getOwnPropSymbols)
15
+ for (var prop of __getOwnPropSymbols(b)) {
16
+ if (__propIsEnum.call(b, prop))
17
+ __defNormalProp(a, prop, b[prop]);
18
+ }
19
+ return a;
20
+ };
21
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
22
+ var __export = (target, all) => {
23
+ for (var name in all)
24
+ __defProp(target, name, { get: all[name], enumerable: true });
25
+ };
26
+ var __copyProps = (to, from, except, desc) => {
27
+ if (from && typeof from === "object" || typeof from === "function") {
28
+ for (let key of __getOwnPropNames(from))
29
+ if (!__hasOwnProp.call(to, key) && key !== except)
30
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
31
+ }
32
+ return to;
33
+ };
34
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
+ var ResizeHandle_vue_exports = {};
36
+ __export(ResizeHandle_vue_exports, {
37
+ default: () => ResizeHandle_vue_default
38
+ });
39
+ module.exports = __toCommonJS(ResizeHandle_vue_exports);
40
+ var import_ResizeHandle_sfc = require("./ResizeHandle-sfc.css");
41
+ var import_vue = require("vue");
42
+ var import_vue2 = require("vue");
43
+ var import_vue3 = require("vue");
44
+ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProps(__spreadValues({}, {
45
+ name: "ResizeHandle"
46
+ }), {
47
+ __name: "ResizeHandle",
48
+ props: {
49
+ width: { type: Number, required: true, default: 500 },
50
+ minWidth: { type: Number, required: false, default: 400 },
51
+ maxWidth: { type: Number, required: false, default: 800 }
52
+ },
53
+ emits: ["resize", "resize-start", "resize-end"],
54
+ setup(__props, { expose: __expose, emit: __emit }) {
55
+ __expose();
56
+ const props = __props;
57
+ const emit = __emit;
58
+ const isResizing = (0, import_vue2.ref)(false);
59
+ const startX = (0, import_vue2.ref)(0);
60
+ const startWidth = (0, import_vue2.ref)(0);
61
+ const handleMouseDown = (e) => {
62
+ e.preventDefault();
63
+ isResizing.value = true;
64
+ startX.value = e.clientX;
65
+ startWidth.value = props.width;
66
+ emit("resize-start");
67
+ document.addEventListener("mousemove", handleMouseMove);
68
+ document.addEventListener("mouseup", handleMouseUp);
69
+ };
70
+ const handleMouseMove = (e) => {
71
+ if (!isResizing.value) return;
72
+ const deltaX = startX.value - e.clientX;
73
+ const newWidth = Math.max(props.minWidth, Math.min(props.maxWidth, startWidth.value + deltaX));
74
+ emit("resize", newWidth);
75
+ };
76
+ const handleMouseUp = () => {
77
+ isResizing.value = false;
78
+ emit("resize-end");
79
+ document.removeEventListener("mousemove", handleMouseMove);
80
+ document.removeEventListener("mouseup", handleMouseUp);
81
+ };
82
+ const handleDoubleClick = () => {
83
+ emit("resize", 500);
84
+ };
85
+ (0, import_vue2.onUnmounted)(() => {
86
+ document.removeEventListener("mousemove", handleMouseMove);
87
+ document.removeEventListener("mouseup", handleMouseUp);
88
+ });
89
+ const __returned__ = { props, emit, isResizing, startX, startWidth, handleMouseDown, handleMouseMove, handleMouseUp, handleDoubleClick };
90
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
91
+ return __returned__;
92
+ }
93
+ }));
94
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
95
+ return (0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
96
+ "div",
97
+ {
98
+ class: (0, import_vue3.normalizeClass)(["opencode-resize-handle", { resizing: $setup.isResizing }]),
99
+ onMousedown: $setup.handleMouseDown,
100
+ onDblclick: $setup.handleDoubleClick
101
+ },
102
+ null,
103
+ 34
104
+ /* CLASS, NEED_HYDRATION */
105
+ );
106
+ }
107
+ __vue_sfc__.render = __vue_render__;
108
+ var ResizeHandle_vue_default = __vue_sfc__;
@@ -0,0 +1 @@
1
+ .opencode-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 rgba(59,130,246,.25);transition:right .3s ease,width .25s cubic-bezier(.4,0,.2,1),background .25s ease,box-shadow .25s ease;z-index:99998}.opencode-split-trigger:hover{width:24px;background:linear-gradient(135deg,#2563eb,#1d4ed8);box-shadow:-3px 0 12px rgba(59,130,246,.35)}.opencode-split-trigger.open{width:20px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:8px 0 0 8px;box-shadow:-2px 0 8px rgba(59,130,246,.25)}.opencode-split-trigger.open:hover{width:24px;background:linear-gradient(135deg,#2563eb,#1d4ed8);box-shadow:-3px 0 12px rgba(59,130,246,.35)}.opencode-split-trigger-icon{display:flex;align-items:center;justify-content:center;transition:transform .25s ease}.opencode-split-trigger:hover .opencode-split-trigger-icon{transform:scale(1.1)}.opencode-split-thinking-indicator{position:absolute;top:6px;right:6px;width:5px;height:5px;background:var(--oc-success);border-radius:50%;animation:opencode-thinking-pulse 1.5s ease-in-out infinite;box-shadow:0 0 4px rgba(16,185,129,.5)}@keyframes opencode-thinking-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(1.3)}}
@@ -0,0 +1,17 @@
1
+ type __VLS_Props = {
2
+ open?: boolean;
3
+ thinking?: boolean;
4
+ resolvedTheme?: "light" | "dark";
5
+ panelWidth?: number;
6
+ };
7
+ declare const _default: 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
+ export default _default;
@@ -0,0 +1,147 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __spreadValues = (a, b) => {
11
+ for (var prop in b || (b = {}))
12
+ if (__hasOwnProp.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ if (__getOwnPropSymbols)
15
+ for (var prop of __getOwnPropSymbols(b)) {
16
+ if (__propIsEnum.call(b, prop))
17
+ __defNormalProp(a, prop, b[prop]);
18
+ }
19
+ return a;
20
+ };
21
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
22
+ var __export = (target, all) => {
23
+ for (var name in all)
24
+ __defProp(target, name, { get: all[name], enumerable: true });
25
+ };
26
+ var __copyProps = (to, from, except, desc) => {
27
+ if (from && typeof from === "object" || typeof from === "function") {
28
+ for (let key of __getOwnPropNames(from))
29
+ if (!__hasOwnProp.call(to, key) && key !== except)
30
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
31
+ }
32
+ return to;
33
+ };
34
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
+ var SplitTrigger_vue_exports = {};
36
+ __export(SplitTrigger_vue_exports, {
37
+ default: () => SplitTrigger_vue_default
38
+ });
39
+ module.exports = __toCommonJS(SplitTrigger_vue_exports);
40
+ var import_SplitTrigger_sfc = require("./SplitTrigger-sfc.css");
41
+ var import_vue = require("vue");
42
+ var import_vue2 = require("vue");
43
+ var import_vue3 = require("vue");
44
+ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProps(__spreadValues({}, {
45
+ name: "SplitTrigger"
46
+ }), {
47
+ __name: "SplitTrigger",
48
+ props: {
49
+ open: { type: Boolean, required: false, default: false },
50
+ thinking: { type: Boolean, required: false, default: false },
51
+ resolvedTheme: { type: String, required: false, default: "light" },
52
+ panelWidth: { type: Number, required: false, default: 500 }
53
+ },
54
+ emits: ["toggle"],
55
+ setup(__props, { expose: __expose, emit: __emit }) {
56
+ __expose();
57
+ const props = __props;
58
+ const emit = __emit;
59
+ const buttonClasses = (0, import_vue2.computed)(() => [
60
+ "opencode-split-trigger",
61
+ {
62
+ open: props.open,
63
+ thinking: props.thinking,
64
+ "opencode-theme-dark": props.resolvedTheme === "dark"
65
+ }
66
+ ]);
67
+ const buttonStyle = (0, import_vue2.computed)(() => {
68
+ if (props.open) {
69
+ return {
70
+ right: `${props.panelWidth}px`
71
+ };
72
+ }
73
+ return {};
74
+ });
75
+ const handleClick = () => {
76
+ emit("toggle");
77
+ };
78
+ const __returned__ = { props, emit, buttonClasses, buttonStyle, handleClick };
79
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
80
+ return __returned__;
81
+ }
82
+ }));
83
+ const _hoisted_1 = ["aria-expanded"];
84
+ const _hoisted_2 = { class: "opencode-split-trigger-icon" };
85
+ const _hoisted_3 = {
86
+ key: 0,
87
+ viewBox: "0 0 24 24",
88
+ width: "16",
89
+ height: "16",
90
+ fill: "none",
91
+ stroke: "currentColor",
92
+ "stroke-width": "2"
93
+ };
94
+ const _hoisted_4 = {
95
+ key: 1,
96
+ viewBox: "0 0 24 24",
97
+ width: "16",
98
+ height: "16",
99
+ fill: "none",
100
+ stroke: "currentColor",
101
+ "stroke-width": "2"
102
+ };
103
+ const _hoisted_5 = {
104
+ key: 0,
105
+ class: "opencode-split-thinking-indicator"
106
+ };
107
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
108
+ return (0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("button", {
109
+ class: (0, import_vue3.normalizeClass)($setup.buttonClasses),
110
+ style: (0, import_vue3.normalizeStyle)($setup.buttonStyle),
111
+ type: "button",
112
+ "aria-expanded": $props.open,
113
+ "aria-label": "\u6253\u5F00 AI \u52A9\u624B",
114
+ onClick: $setup.handleClick
115
+ }, [
116
+ (0, import_vue3.createElementVNode)("span", _hoisted_2, [
117
+ $props.open ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_3, [..._cache[0] || (_cache[0] = [
118
+ (0, import_vue3.createElementVNode)(
119
+ "path",
120
+ {
121
+ d: "M9 18l6-6-6-6",
122
+ "stroke-linecap": "round",
123
+ "stroke-linejoin": "round"
124
+ },
125
+ null,
126
+ -1
127
+ /* CACHED */
128
+ )
129
+ ])])) : ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_4, [..._cache[1] || (_cache[1] = [
130
+ (0, import_vue3.createElementVNode)(
131
+ "path",
132
+ {
133
+ d: "M15 18l-6-6 6-6",
134
+ "stroke-linecap": "round",
135
+ "stroke-linejoin": "round"
136
+ },
137
+ null,
138
+ -1
139
+ /* CACHED */
140
+ )
141
+ ])]))
142
+ ]),
143
+ $props.thinking ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("span", _hoisted_5)) : (0, import_vue3.createCommentVNode)("v-if", true)
144
+ ], 14, _hoisted_1);
145
+ }
146
+ __vue_sfc__.render = __vue_render__;
147
+ var SplitTrigger_vue_default = __vue_sfc__;