@vite-plugin-opencode-assistant/components 1.0.48 → 1.0.49

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 (35) 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 +5 -1
  4. package/es/open-code-widget/composables/use-persist-state.js +10 -2
  5. package/es/open-code-widget/composables/use-split.d.ts +5 -0
  6. package/es/open-code-widget/composables/use-split.js +46 -12
  7. package/es/open-code-widget/src/components/ChatPanel-sfc.css +1 -1
  8. package/es/open-code-widget/src/components/ChatPanel.vue.d.ts +2 -0
  9. package/es/open-code-widget/src/components/ChatPanel.vue.js +58 -10
  10. package/es/open-code-widget/src/components/Header.vue.d.ts +8 -4
  11. package/es/open-code-widget/src/components/Header.vue.js +313 -27
  12. package/es/open-code-widget/src/context.d.ts +5 -1
  13. package/es/open-code-widget/src/index-sfc.css +1 -1
  14. package/es/open-code-widget/src/index.vue.d.ts +1 -1
  15. package/es/open-code-widget/src/index.vue.js +48 -12
  16. package/lib/@vite-plugin-opencode-assistant/components.cjs.js +357 -67
  17. package/lib/@vite-plugin-opencode-assistant/components.es.js +357 -67
  18. package/lib/components.css +2 -2
  19. package/lib/index.d.ts +1 -1
  20. package/lib/index.js +1 -1
  21. package/lib/open-code-widget/composables/use-persist-state.d.ts +5 -1
  22. package/lib/open-code-widget/composables/use-persist-state.js +10 -2
  23. package/lib/open-code-widget/composables/use-split.d.ts +5 -0
  24. package/lib/open-code-widget/composables/use-split.js +46 -12
  25. package/lib/open-code-widget/src/components/ChatPanel-sfc.css +1 -1
  26. package/lib/open-code-widget/src/components/ChatPanel.vue.d.ts +2 -0
  27. package/lib/open-code-widget/src/components/ChatPanel.vue.js +58 -10
  28. package/lib/open-code-widget/src/components/Header.vue.d.ts +8 -4
  29. package/lib/open-code-widget/src/components/Header.vue.js +313 -27
  30. package/lib/open-code-widget/src/context.d.ts +5 -1
  31. package/lib/open-code-widget/src/index-sfc.css +1 -1
  32. package/lib/open-code-widget/src/index.vue.d.ts +1 -1
  33. package/lib/open-code-widget/src/index.vue.js +48 -12
  34. package/lib/web-types.json +1 -1
  35. package/package.json +2 -2
@@ -40,9 +40,13 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
40
40
  minimized,
41
41
  promptDockVisible,
42
42
  mode,
43
+ displayMode,
44
+ splitPosition,
43
45
  handleToggleSessionList,
44
46
  handleToggleSelectMode,
45
47
  handleToggleTheme,
48
+ handleToggleDisplayMode,
49
+ handleToggleSplitPosition,
46
50
  handleClose,
47
51
  handleToggleMinimize,
48
52
  handleTogglePromptDock
@@ -64,7 +68,37 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
64
68
  };
65
69
  return `\u5207\u6362\u4E3B\u9898 - \u5F53\u524D: ${themeLabels[theme.value]}`;
66
70
  });
67
- const __returned__ = { title, sessionListTitle, sessionListCollapsed, selectMode, selectEnabled, theme, resolvedTheme, minimized, promptDockVisible, mode, handleToggleSessionList, handleToggleSelectMode, handleToggleTheme, handleClose, handleToggleMinimize, handleTogglePromptDock, isSplitMode, themeIconTitle, themeIconLabel };
71
+ const displayModeIconTitle = (0, import_vue2.computed)(() => {
72
+ const displayModeLabels = {
73
+ bubble: "\u6C14\u6CE1\u6A21\u5F0F",
74
+ split: "\u5206\u5C4F\u6A21\u5F0F",
75
+ auto: "\u81EA\u52A8\u6A21\u5F0F"
76
+ };
77
+ return `\u5C55\u793A\u6A21\u5F0F: ${displayModeLabels[displayMode.value]}`;
78
+ });
79
+ const displayModeIconLabel = (0, import_vue2.computed)(() => {
80
+ const displayModeLabels = {
81
+ bubble: "\u6C14\u6CE1\u6A21\u5F0F",
82
+ split: "\u5206\u5C4F\u6A21\u5F0F",
83
+ auto: "\u81EA\u52A8\u6A21\u5F0F"
84
+ };
85
+ const modes = ["bubble", "split", "auto"];
86
+ const currentIndex = modes.indexOf(displayMode.value);
87
+ const nextMode = modes[(currentIndex + 1) % modes.length];
88
+ return `\u5207\u6362\u5C55\u793A\u6A21\u5F0F - \u4E0B\u4E00\u4E2A: ${displayModeLabels[nextMode]}`;
89
+ });
90
+ const splitPositionIconTitle = (0, import_vue2.computed)(() => {
91
+ const positionLabels = {
92
+ left: "\u5DE6\u4FA7",
93
+ right: "\u53F3\u4FA7"
94
+ };
95
+ return `\u5206\u680F\u4F4D\u7F6E: ${positionLabels[splitPosition.value]}`;
96
+ });
97
+ const splitPositionIconLabel = (0, import_vue2.computed)(() => {
98
+ const nextPosition = splitPosition.value === "right" ? "\u5DE6\u4FA7" : "\u53F3\u4FA7";
99
+ return `\u5207\u6362\u5206\u680F\u4F4D\u7F6E - \u4E0B\u4E00\u4E2A: ${nextPosition}`;
100
+ });
101
+ const __returned__ = { title, sessionListTitle, sessionListCollapsed, selectMode, selectEnabled, theme, resolvedTheme, minimized, promptDockVisible, mode, displayMode, splitPosition, handleToggleSessionList, handleToggleSelectMode, handleToggleTheme, handleToggleDisplayMode, handleToggleSplitPosition, handleClose, handleToggleMinimize, handleTogglePromptDock, isSplitMode, themeIconTitle, themeIconLabel, displayModeIconTitle, displayModeIconLabel, splitPositionIconTitle, splitPositionIconLabel };
68
102
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
69
103
  return __returned__;
70
104
  }
@@ -104,11 +138,63 @@ const _hoisted_8 = {
104
138
  "stroke-width": "2",
105
139
  "aria-hidden": "true"
106
140
  };
107
- const _hoisted_9 = { class: "opencode-chat-header-title" };
108
- const _hoisted_10 = { class: "opencode-chat-header-actions" };
109
- const _hoisted_11 = ["title", "aria-label", "aria-pressed"];
110
- const _hoisted_12 = ["title", "aria-label", "aria-pressed"];
111
- const _hoisted_13 = {
141
+ const _hoisted_9 = ["title", "aria-label"];
142
+ const _hoisted_10 = {
143
+ key: 0,
144
+ viewBox: "0 0 24 24",
145
+ width: "16",
146
+ height: "16",
147
+ fill: "none",
148
+ stroke: "currentColor",
149
+ "stroke-width": "2",
150
+ "aria-hidden": "true"
151
+ };
152
+ const _hoisted_11 = {
153
+ key: 1,
154
+ viewBox: "0 0 24 24",
155
+ width: "16",
156
+ height: "16",
157
+ fill: "none",
158
+ stroke: "currentColor",
159
+ "stroke-width": "2",
160
+ "aria-hidden": "true"
161
+ };
162
+ const _hoisted_12 = {
163
+ key: 2,
164
+ viewBox: "0 0 24 24",
165
+ width: "16",
166
+ height: "16",
167
+ fill: "none",
168
+ stroke: "currentColor",
169
+ "stroke-width": "2",
170
+ "aria-hidden": "true"
171
+ };
172
+ const _hoisted_13 = { class: "opencode-chat-header-title" };
173
+ const _hoisted_14 = { class: "opencode-chat-header-actions" };
174
+ const _hoisted_15 = ["title", "aria-label"];
175
+ const _hoisted_16 = {
176
+ key: 0,
177
+ viewBox: "0 0 24 24",
178
+ width: "16",
179
+ height: "16",
180
+ fill: "none",
181
+ stroke: "currentColor",
182
+ "stroke-width": "2",
183
+ "aria-hidden": "true"
184
+ };
185
+ const _hoisted_17 = {
186
+ key: 1,
187
+ viewBox: "0 0 24 24",
188
+ width: "16",
189
+ height: "16",
190
+ fill: "none",
191
+ stroke: "currentColor",
192
+ "stroke-width": "2",
193
+ "aria-hidden": "true"
194
+ };
195
+ const _hoisted_18 = ["title", "aria-label", "aria-pressed"];
196
+ const _hoisted_19 = ["title", "aria-label", "aria-pressed"];
197
+ const _hoisted_20 = {
112
198
  key: 0,
113
199
  viewBox: "0 0 24 24",
114
200
  width: "14",
@@ -118,7 +204,7 @@ const _hoisted_13 = {
118
204
  "stroke-width": "2",
119
205
  "aria-hidden": "true"
120
206
  };
121
- const _hoisted_14 = {
207
+ const _hoisted_21 = {
122
208
  key: 1,
123
209
  viewBox: "0 0 24 24",
124
210
  width: "14",
@@ -140,7 +226,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
140
226
  onClick: _cache[0] || (_cache[0] = (...args) => $setup.handleToggleSessionList && $setup.handleToggleSessionList(...args))
141
227
  }, [
142
228
  (0, import_vue3.renderSlot)(_ctx.$slots, "session-toggle-icon", {}, () => [
143
- _cache[6] || (_cache[6] = (0, import_vue3.createElementVNode)(
229
+ _cache[8] || (_cache[8] = (0, import_vue3.createElementVNode)(
144
230
  "svg",
145
231
  {
146
232
  viewBox: "0 0 24 24",
@@ -172,7 +258,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
172
258
  onClick: _cache[1] || (_cache[1] = (...args) => $setup.handleToggleSelectMode && $setup.handleToggleSelectMode(...args))
173
259
  }, [
174
260
  (0, import_vue3.renderSlot)(_ctx.$slots, "select-icon", {}, () => [
175
- _cache[7] || (_cache[7] = (0, import_vue3.createElementVNode)(
261
+ _cache[9] || (_cache[9] = (0, import_vue3.createElementVNode)(
176
262
  "svg",
177
263
  {
178
264
  viewBox: "0 0 1024 1024",
@@ -203,9 +289,9 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
203
289
  onClick: _cache[2] || (_cache[2] = (...args) => $setup.handleToggleTheme && $setup.handleToggleTheme(...args))
204
290
  }, [
205
291
  (0, import_vue3.renderSlot)(_ctx.$slots, "theme-icon", {}, () => [
206
- $setup.theme === "light" ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_6, [..._cache[8] || (_cache[8] = [
292
+ $setup.theme === "light" ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_6, [..._cache[10] || (_cache[10] = [
207
293
  (0, import_vue3.createStaticVNode)('<circle cx="12" cy="12" r="5"></circle><line x1="12" y1="1" x2="12" y2="3"></line><line x1="12" y1="21" x2="12" y2="23"></line><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line><line x1="1" y1="12" x2="3" y2="12"></line><line x1="21" y1="12" x2="23" y2="12"></line><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>', 9)
208
- ])])) : $setup.theme === "dark" ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_7, [..._cache[9] || (_cache[9] = [
294
+ ])])) : $setup.theme === "dark" ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_7, [..._cache[11] || (_cache[11] = [
209
295
  (0, import_vue3.createElementVNode)(
210
296
  "path",
211
297
  { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" },
@@ -213,31 +299,231 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
213
299
  -1
214
300
  /* CACHED */
215
301
  )
216
- ])])) : ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_8, [..._cache[10] || (_cache[10] = [
302
+ ])])) : ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_8, [..._cache[12] || (_cache[12] = [
217
303
  (0, import_vue3.createStaticVNode)('<rect x="2" y="3" width="20" height="14" rx="2" ry="2"></rect><line x1="8" y1="21" x2="16" y2="21"></line><line x1="12" y1="17" x2="12" y2="21"></line><circle cx="12" cy="10" r="3"></circle><path d="M7 7l2 2M17 7l-2 2M7 13l2-2M17 13l-2-2"></path>', 5)
218
304
  ])]))
219
305
  ])
220
- ], 8, _hoisted_5)
306
+ ], 8, _hoisted_5),
307
+ (0, import_vue3.createElementVNode)("button", {
308
+ class: "opencode-header-btn display-mode-btn",
309
+ type: "button",
310
+ title: $setup.displayModeIconTitle,
311
+ "aria-label": $setup.displayModeIconLabel,
312
+ onClick: _cache[3] || (_cache[3] = (...args) => $setup.handleToggleDisplayMode && $setup.handleToggleDisplayMode(...args))
313
+ }, [
314
+ (0, import_vue3.renderSlot)(_ctx.$slots, "display-mode-icon", {}, () => [
315
+ $setup.displayMode === "bubble" ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_10, [..._cache[13] || (_cache[13] = [
316
+ (0, import_vue3.createElementVNode)(
317
+ "circle",
318
+ {
319
+ cx: "12",
320
+ cy: "12",
321
+ r: "10"
322
+ },
323
+ null,
324
+ -1
325
+ /* CACHED */
326
+ ),
327
+ (0, import_vue3.createElementVNode)(
328
+ "path",
329
+ {
330
+ d: "M8 14s1.5 2 4 2 4-2 4-2",
331
+ "stroke-linecap": "round"
332
+ },
333
+ null,
334
+ -1
335
+ /* CACHED */
336
+ ),
337
+ (0, import_vue3.createElementVNode)(
338
+ "line",
339
+ {
340
+ x1: "9",
341
+ y1: "9",
342
+ x2: "9.01",
343
+ y2: "9",
344
+ "stroke-linecap": "round"
345
+ },
346
+ null,
347
+ -1
348
+ /* CACHED */
349
+ ),
350
+ (0, import_vue3.createElementVNode)(
351
+ "line",
352
+ {
353
+ x1: "15",
354
+ y1: "9",
355
+ x2: "15.01",
356
+ y2: "9",
357
+ "stroke-linecap": "round"
358
+ },
359
+ null,
360
+ -1
361
+ /* CACHED */
362
+ )
363
+ ])])) : $setup.displayMode === "split" ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_11, [..._cache[14] || (_cache[14] = [
364
+ (0, import_vue3.createElementVNode)(
365
+ "rect",
366
+ {
367
+ x: "3",
368
+ y: "3",
369
+ width: "18",
370
+ height: "18",
371
+ rx: "2"
372
+ },
373
+ null,
374
+ -1
375
+ /* CACHED */
376
+ ),
377
+ (0, import_vue3.createElementVNode)(
378
+ "line",
379
+ {
380
+ x1: "12",
381
+ y1: "3",
382
+ x2: "12",
383
+ y2: "21"
384
+ },
385
+ null,
386
+ -1
387
+ /* CACHED */
388
+ )
389
+ ])])) : ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_12, [..._cache[15] || (_cache[15] = [
390
+ (0, import_vue3.createElementVNode)(
391
+ "rect",
392
+ {
393
+ x: "3",
394
+ y: "3",
395
+ width: "8",
396
+ height: "8",
397
+ rx: "1"
398
+ },
399
+ null,
400
+ -1
401
+ /* CACHED */
402
+ ),
403
+ (0, import_vue3.createElementVNode)(
404
+ "rect",
405
+ {
406
+ x: "15",
407
+ y: "3",
408
+ width: "6",
409
+ height: "8",
410
+ rx: "1"
411
+ },
412
+ null,
413
+ -1
414
+ /* CACHED */
415
+ ),
416
+ (0, import_vue3.createElementVNode)(
417
+ "rect",
418
+ {
419
+ x: "3",
420
+ y: "15",
421
+ width: "8",
422
+ height: "6",
423
+ rx: "1"
424
+ },
425
+ null,
426
+ -1
427
+ /* CACHED */
428
+ ),
429
+ (0, import_vue3.createElementVNode)(
430
+ "circle",
431
+ {
432
+ cx: "18",
433
+ cy: "18",
434
+ r: "3"
435
+ },
436
+ null,
437
+ -1
438
+ /* CACHED */
439
+ )
440
+ ])]))
441
+ ])
442
+ ], 8, _hoisted_9)
221
443
  ]),
222
444
  (0, import_vue3.createElementVNode)(
223
445
  "span",
224
- _hoisted_9,
446
+ _hoisted_13,
225
447
  (0, import_vue3.toDisplayString)($setup.title),
226
448
  1
227
449
  /* TEXT */
228
450
  ),
229
- (0, import_vue3.createElementVNode)("div", _hoisted_10, [
230
- !$setup.isSplitMode ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("button", {
451
+ (0, import_vue3.createElementVNode)("div", _hoisted_14, [
452
+ $setup.isSplitMode ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("button", {
231
453
  key: 0,
454
+ class: "opencode-header-btn split-position-btn",
455
+ type: "button",
456
+ title: $setup.splitPositionIconTitle,
457
+ "aria-label": $setup.splitPositionIconLabel,
458
+ onClick: _cache[4] || (_cache[4] = (...args) => $setup.handleToggleSplitPosition && $setup.handleToggleSplitPosition(...args))
459
+ }, [
460
+ (0, import_vue3.renderSlot)(_ctx.$slots, "split-position-icon", {}, () => [
461
+ $setup.splitPosition === "right" ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_16, [..._cache[16] || (_cache[16] = [
462
+ (0, import_vue3.createElementVNode)(
463
+ "rect",
464
+ {
465
+ x: "3",
466
+ y: "3",
467
+ width: "18",
468
+ height: "18",
469
+ rx: "2"
470
+ },
471
+ null,
472
+ -1
473
+ /* CACHED */
474
+ ),
475
+ (0, import_vue3.createElementVNode)(
476
+ "line",
477
+ {
478
+ x1: "15",
479
+ y1: "3",
480
+ x2: "15",
481
+ y2: "21"
482
+ },
483
+ null,
484
+ -1
485
+ /* CACHED */
486
+ )
487
+ ])])) : ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_17, [..._cache[17] || (_cache[17] = [
488
+ (0, import_vue3.createElementVNode)(
489
+ "rect",
490
+ {
491
+ x: "3",
492
+ y: "3",
493
+ width: "18",
494
+ height: "18",
495
+ rx: "2"
496
+ },
497
+ null,
498
+ -1
499
+ /* CACHED */
500
+ ),
501
+ (0, import_vue3.createElementVNode)(
502
+ "line",
503
+ {
504
+ x1: "9",
505
+ y1: "3",
506
+ x2: "9",
507
+ y2: "21"
508
+ },
509
+ null,
510
+ -1
511
+ /* CACHED */
512
+ )
513
+ ])]))
514
+ ])
515
+ ], 8, _hoisted_15)) : (0, import_vue3.createCommentVNode)("v-if", true),
516
+ !$setup.isSplitMode ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("button", {
517
+ key: 1,
232
518
  class: "opencode-header-btn prompt-dock",
233
519
  type: "button",
234
520
  title: $setup.promptDockVisible ? "\u9690\u85CF\u5BF9\u8BDD\u6846" : "\u663E\u793A\u5BF9\u8BDD\u6846",
235
521
  "aria-label": $setup.promptDockVisible ? "\u9690\u85CF\u5BF9\u8BDD\u6846" : "\u663E\u793A\u5BF9\u8BDD\u6846",
236
522
  "aria-pressed": $setup.promptDockVisible,
237
- onClick: _cache[3] || (_cache[3] = (...args) => $setup.handleTogglePromptDock && $setup.handleTogglePromptDock(...args))
523
+ onClick: _cache[5] || (_cache[5] = (...args) => $setup.handleTogglePromptDock && $setup.handleTogglePromptDock(...args))
238
524
  }, [
239
525
  (0, import_vue3.renderSlot)(_ctx.$slots, "prompt-dock-icon", {}, () => [
240
- _cache[11] || (_cache[11] = (0, import_vue3.createElementVNode)(
526
+ _cache[18] || (_cache[18] = (0, import_vue3.createElementVNode)(
241
527
  "svg",
242
528
  {
243
529
  viewBox: "0 0 24 24",
@@ -255,18 +541,18 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
255
541
  /* CACHED */
256
542
  ))
257
543
  ])
258
- ], 8, _hoisted_11)) : (0, import_vue3.createCommentVNode)("v-if", true),
544
+ ], 8, _hoisted_18)) : (0, import_vue3.createCommentVNode)("v-if", true),
259
545
  !$setup.isSplitMode ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("button", {
260
- key: 1,
546
+ key: 2,
261
547
  class: "opencode-header-btn minimize",
262
548
  type: "button",
263
549
  title: $setup.minimized ? "\u5C55\u5F00" : "\u6700\u5C0F\u5316",
264
550
  "aria-label": $setup.minimized ? "\u5C55\u5F00\u9762\u677F" : "\u6700\u5C0F\u5316\u9762\u677F",
265
551
  "aria-pressed": $setup.minimized,
266
- onClick: _cache[4] || (_cache[4] = (...args) => $setup.handleToggleMinimize && $setup.handleToggleMinimize(...args))
552
+ onClick: _cache[6] || (_cache[6] = (...args) => $setup.handleToggleMinimize && $setup.handleToggleMinimize(...args))
267
553
  }, [
268
554
  (0, import_vue3.renderSlot)(_ctx.$slots, "minimize-icon", {}, () => [
269
- $setup.minimized ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_13, [..._cache[12] || (_cache[12] = [
555
+ $setup.minimized ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_20, [..._cache[19] || (_cache[19] = [
270
556
  (0, import_vue3.createElementVNode)(
271
557
  "path",
272
558
  { d: "M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3" },
@@ -274,7 +560,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
274
560
  -1
275
561
  /* CACHED */
276
562
  )
277
- ])])) : ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_14, [..._cache[13] || (_cache[13] = [
563
+ ])])) : ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("svg", _hoisted_21, [..._cache[20] || (_cache[20] = [
278
564
  (0, import_vue3.createElementVNode)(
279
565
  "path",
280
566
  { d: "M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3" },
@@ -284,17 +570,17 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
284
570
  )
285
571
  ])]))
286
572
  ])
287
- ], 8, _hoisted_12)) : (0, import_vue3.createCommentVNode)("v-if", true),
573
+ ], 8, _hoisted_19)) : (0, import_vue3.createCommentVNode)("v-if", true),
288
574
  !$setup.isSplitMode ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)("button", {
289
- key: 2,
575
+ key: 3,
290
576
  class: "opencode-header-btn close",
291
577
  type: "button",
292
578
  title: "\u5173\u95ED",
293
579
  "aria-label": "\u5173\u95ED\u9762\u677F",
294
- onClick: _cache[5] || (_cache[5] = (...args) => $setup.handleClose && $setup.handleClose(...args))
580
+ onClick: _cache[7] || (_cache[7] = (...args) => $setup.handleClose && $setup.handleClose(...args))
295
581
  }, [
296
582
  (0, import_vue3.renderSlot)(_ctx.$slots, "close-icon", {}, () => [
297
- _cache[14] || (_cache[14] = (0, import_vue3.createElementVNode)(
583
+ _cache[21] || (_cache[21] = (0, import_vue3.createElementVNode)(
298
584
  "svg",
299
585
  {
300
586
  viewBox: "0 0 24 24",
@@ -1,5 +1,5 @@
1
1
  import { type Ref } from "vue";
2
- import type { OpenCodeWidgetSessionItem, OpenCodeSelectedElementItem, OpenCodeRemoveSelectedPayload, OpencodeSessionThinkingState } from "./types";
2
+ import type { OpenCodeWidgetSessionItem, OpenCodeSelectedElementItem, OpenCodeRemoveSelectedPayload, OpencodeSessionThinkingState, DisplayMode } from "./types";
3
3
  import type { FloatingBubbleOffset } from "./components/FloatingBubble/types";
4
4
  export interface OpenCodeWidgetContext {
5
5
  theme: Ref<string>;
@@ -25,6 +25,8 @@ export interface OpenCodeWidgetContext {
25
25
  promptDockVisible: Ref<boolean>;
26
26
  bubbleOffset: Ref<FloatingBubbleOffset | undefined>;
27
27
  mode: Ref<"bubble" | "split">;
28
+ displayMode: Ref<DisplayMode>;
29
+ splitPosition: Ref<"left" | "right">;
28
30
  sessionStates: Ref<Record<string, OpencodeSessionThinkingState>>;
29
31
  iframeSource: Ref<string>;
30
32
  buttonActive: Ref<boolean>;
@@ -39,6 +41,8 @@ export interface OpenCodeWidgetContext {
39
41
  handleTogglePromptDock: () => void;
40
42
  handleToggleSessionList: () => void;
41
43
  handleToggleTheme: () => void;
44
+ handleToggleDisplayMode: () => void;
45
+ handleToggleSplitPosition: () => void;
42
46
  handleEmptyAction: () => void;
43
47
  handleCreateSession: () => void;
44
48
  handleSelectSession: (item: OpenCodeWidgetSessionItem) => void;
@@ -1 +1 @@
1
- .opencode-widget{--oc-bg-main: #ffffff;--oc-bg-secondary: #f8f9fa;--oc-bg-tertiary: #f3f4f6;--oc-overlay-bg: rgba(255, 255, 255, .9);--oc-bg-inverse: #1e1e1e;--oc-text-primary: #282828;--oc-text-secondary: #4b5563;--oc-text-tertiary: #6b7280;--oc-text-placeholder: #9ca3af;--oc-text-inverse: #ffffff;--oc-border-primary: #e5e7eb;--oc-border-secondary: #d1d5db;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .1);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(0, 0, 0, .5);--oc-tooltip-bg: #1e1e1e;--oc-dialog-overlay: rgba(0, 0, 0, .5);--oc-thinking-gradient-1: #10b981;--oc-thinking-gradient-2: #059669;--oc-thinking-glow: rgba(16, 185, 129, .3);--oc-thinking-glow-strong: rgba(16, 185, 129, .6);--oc-skeleton-bg: #e5e7eb;--oc-skeleton-gradient: linear-gradient(90deg, #e5e7eb 25%, #f3f4f6 50%, #e5e7eb 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .1);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .15);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .12);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .3);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .2);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .3);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .3);--oc-trigger-bg: #3b82f6;--oc-trigger-bg-hover: #2563eb;--oc-trigger-bg-active: #1d4ed8;--oc-trigger-shadow: 0 2px 8px rgba(59, 130, 246, .3);--oc-trigger-shadow-hover: 0 4px 12px rgba(59, 130, 246, .4);--oc-trigger-shadow-active: 0 4px 12px rgba(59, 130, 246, .5);position:fixed;z-index:999999;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-widget.opencode-theme-dark{--oc-bg-main: #1a1a1a;--oc-bg-secondary: #1e1e1e;--oc-bg-tertiary: #282828;--oc-overlay-bg: rgba(26, 26, 26, .9);--oc-bg-inverse: #ffffff;--oc-text-primary: #f3f4f6;--oc-text-secondary: #d1d5db;--oc-text-tertiary: #9ca3af;--oc-text-placeholder: #6b7280;--oc-text-inverse: #282828;--oc-border-primary: #282828;--oc-border-secondary: #4b5563;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .15);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(26, 26, 26, .9);--oc-tooltip-bg: #282828;--oc-dialog-overlay: rgba(0, 0, 0, .7);--oc-thinking-gradient-1: #34d399;--oc-thinking-gradient-2: #10b981;--oc-thinking-glow: rgba(52, 211, 153, .3);--oc-thinking-glow-strong: rgba(52, 211, 153, .6);--oc-skeleton-bg: #151515;--oc-skeleton-gradient: linear-gradient(90deg, #282828 25%, #4b5563 50%, #282828 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .3);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .4);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .4);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .6);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .3);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .4);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .4);--oc-trigger-bg: #60a5fa;--oc-trigger-bg-hover: #3b82f6;--oc-trigger-bg-active: #2563eb;--oc-trigger-shadow: 0 2px 8px rgba(96, 165, 250, .4);--oc-trigger-shadow-hover: 0 4px 12px rgba(96, 165, 250, .5);--oc-trigger-shadow-active: 0 4px 12px rgba(96, 165, 250, .6)}.opencode-chat{position:fixed;bottom:20px;width:700px;height:86vh;max-height:calc(100vh - 40px);background:var(--oc-bg-main);border-radius:16px;box-shadow:var(--oc-shadow-lg);overflow:hidden;opacity:0;visibility:hidden;transform:translate3d(var(---chatAnimationOrigin\.x),var(---chatAnimationOrigin\.y),0) scale(.95);transition:all .3s ease;display:flex;flex-direction:column;z-index:99999}.opencode-chat.open{opacity:1;visibility:visible;transform:translateZ(0) scale(1)}.opencode-chat.no-transition,.opencode-chat.no-transition.open{transition:none!important}.opencode-chat.minimized{width:300px;height:300px}.opencode-chat.minimized .opencode-iframe-container{margin-top:-146px}.opencode-chat-content{display:flex;flex:1;overflow:hidden}.opencode-notification{position:absolute;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px rgba(59,130,246,.4),0 0 0 2px rgba(59,130,246,.2);animation:slideDown .3s ease;z-index:10000000;display:flex;align-items:center;gap:10px}.opencode-notification:before{content:"\1f4a1";font-size:16px}.opencode-dialog-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--oc-dialog-overlay);display:flex;align-items:center;justify-content:center;z-index:9999999;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.opencode-dialog{background:var(--oc-bg-main);border-radius:12px;padding:24px;min-width:320px;max-width:400px;box-shadow:var(--oc-shadow-xl);animation:scaleIn .2s ease}@keyframes scaleIn{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}.opencode-dialog-content{margin-bottom:20px}.opencode-dialog-message{font-size:15px;color:var(--oc-text-primary);line-height:1.5}.opencode-dialog-actions{display:flex;gap:12px;justify-content:flex-end}.opencode-dialog-btn{padding:10px 20px;border-radius:8px;border:none;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s}.opencode-dialog-btn.cancel{background:var(--oc-bg-tertiary);color:var(--oc-text-primary)}.opencode-dialog-btn.cancel:hover{background:var(--oc-text-primary);color:var(--oc-bg-main)}.opencode-dialog-btn.confirm{background:var(--oc-danger);color:#fff}.opencode-dialog-btn.confirm:hover{background:var(--oc-danger-hover)}@keyframes slideDown{0%{transform:translate(-50%) translateY(-100%);opacity:0}to{transform:translate(-50%) translateY(0);opacity:1}}.opencode-page-notification{position:fixed;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px rgba(59,130,246,.4),0 0 0 2px rgba(59,130,246,.2);animation:slideDown .3s ease;z-index:2147483647;display:flex;align-items:center;gap:10px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-page-notification:before{content:"\1f4a1";font-size:16px}.opencode-element-highlight{position:fixed;pointer-events:none;z-index:999998;border-radius:4px}#vue-inspector-container{display:none!important}.opencode-element-tooltip{position:fixed;background:var(--oc-tooltip-bg);color:#fff;padding:8px 12px;border-radius:6px;font-size:12px;z-index:9999998;box-shadow:var(--oc-shadow-md);max-width:300px;pointer-events:none}.opencode-tooltip-tag{font-weight:500;margin-bottom:4px;word-break:break-all}.opencode-tooltip-file{font-size:11px;color:var(--oc-text-placeholder);word-break:break-all}.opencode-element-highlight-temp{position:absolute;pointer-events:none;z-index:999998;border-radius:4px;animation:highlight-pulse 2s ease-out forwards}@keyframes highlight-pulse{0%{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.02)}to{opacity:0;transform:scale(1)}}@media(max-width:768px){.opencode-chat{width:calc(100vw - 40px);height:calc(100vh - 100px)}}body.has-opencode-split{padding-right:var(--opencode-split-width, 500px);transition:padding-right .3s ease;min-width:auto}
1
+ .opencode-widget{--oc-bg-main: #ffffff;--oc-bg-secondary: #f8f9fa;--oc-bg-tertiary: #f3f4f6;--oc-overlay-bg: rgba(255, 255, 255, .9);--oc-bg-inverse: #1e1e1e;--oc-text-primary: #282828;--oc-text-secondary: #4b5563;--oc-text-tertiary: #6b7280;--oc-text-placeholder: #9ca3af;--oc-text-inverse: #ffffff;--oc-border-primary: #e5e7eb;--oc-border-secondary: #d1d5db;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .1);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(0, 0, 0, .5);--oc-tooltip-bg: #1e1e1e;--oc-dialog-overlay: rgba(0, 0, 0, .5);--oc-thinking-gradient-1: #10b981;--oc-thinking-gradient-2: #059669;--oc-thinking-glow: rgba(16, 185, 129, .3);--oc-thinking-glow-strong: rgba(16, 185, 129, .6);--oc-skeleton-bg: #e5e7eb;--oc-skeleton-gradient: linear-gradient(90deg, #e5e7eb 25%, #f3f4f6 50%, #e5e7eb 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .1);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .15);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .12);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .3);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .2);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .3);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .3);--oc-trigger-bg: #3b82f6;--oc-trigger-bg-hover: #2563eb;--oc-trigger-bg-active: #1d4ed8;--oc-trigger-shadow: 0 2px 8px rgba(59, 130, 246, .3);--oc-trigger-shadow-hover: 0 4px 12px rgba(59, 130, 246, .4);--oc-trigger-shadow-active: 0 4px 12px rgba(59, 130, 246, .5);position:fixed;z-index:999999;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-widget.opencode-theme-dark{--oc-bg-main: #1a1a1a;--oc-bg-secondary: #1e1e1e;--oc-bg-tertiary: #282828;--oc-overlay-bg: rgba(26, 26, 26, .9);--oc-bg-inverse: #ffffff;--oc-text-primary: #f3f4f6;--oc-text-secondary: #d1d5db;--oc-text-tertiary: #9ca3af;--oc-text-placeholder: #6b7280;--oc-text-inverse: #282828;--oc-border-primary: #282828;--oc-border-secondary: #4b5563;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .15);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(26, 26, 26, .9);--oc-tooltip-bg: #282828;--oc-dialog-overlay: rgba(0, 0, 0, .7);--oc-thinking-gradient-1: #34d399;--oc-thinking-gradient-2: #10b981;--oc-thinking-glow: rgba(52, 211, 153, .3);--oc-thinking-glow-strong: rgba(52, 211, 153, .6);--oc-skeleton-bg: #151515;--oc-skeleton-gradient: linear-gradient(90deg, #282828 25%, #4b5563 50%, #282828 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .3);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .4);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .4);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .6);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .3);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .4);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .4);--oc-trigger-bg: #60a5fa;--oc-trigger-bg-hover: #3b82f6;--oc-trigger-bg-active: #2563eb;--oc-trigger-shadow: 0 2px 8px rgba(96, 165, 250, .4);--oc-trigger-shadow-hover: 0 4px 12px rgba(96, 165, 250, .5);--oc-trigger-shadow-active: 0 4px 12px rgba(96, 165, 250, .6)}.opencode-chat{position:fixed;bottom:20px;width:700px;height:86vh;max-height:calc(100vh - 40px);background:var(--oc-bg-main);border-radius:16px;box-shadow:var(--oc-shadow-lg);overflow:hidden;opacity:0;visibility:hidden;transform:translate3d(var(---chatAnimationOrigin\.x),var(---chatAnimationOrigin\.y),0) scale(.95);transition:all .3s ease;display:flex;flex-direction:column;z-index:99999}.opencode-chat.open{opacity:1;visibility:visible;transform:translateZ(0) scale(1)}.opencode-chat.no-transition,.opencode-chat.no-transition.open{transition:none!important}.opencode-chat.minimized{width:320px;height:320px}.opencode-chat.minimized .opencode-iframe-container{margin-top:-146px}.opencode-chat-content{display:flex;flex:1;overflow:hidden}.opencode-notification{position:absolute;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px rgba(59,130,246,.4),0 0 0 2px rgba(59,130,246,.2);animation:slideDown .3s ease;z-index:10000000;display:flex;align-items:center;gap:10px}.opencode-notification:before{content:"\1f4a1";font-size:16px}.opencode-dialog-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--oc-dialog-overlay);display:flex;align-items:center;justify-content:center;z-index:9999999;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.opencode-dialog{background:var(--oc-bg-main);border-radius:12px;padding:24px;min-width:320px;max-width:400px;box-shadow:var(--oc-shadow-xl);animation:scaleIn .2s ease}@keyframes scaleIn{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}.opencode-dialog-content{margin-bottom:20px}.opencode-dialog-message{font-size:15px;color:var(--oc-text-primary);line-height:1.5}.opencode-dialog-actions{display:flex;gap:12px;justify-content:flex-end}.opencode-dialog-btn{padding:10px 20px;border-radius:8px;border:none;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s}.opencode-dialog-btn.cancel{background:var(--oc-bg-tertiary);color:var(--oc-text-primary)}.opencode-dialog-btn.cancel:hover{background:var(--oc-text-primary);color:var(--oc-bg-main)}.opencode-dialog-btn.confirm{background:var(--oc-danger);color:#fff}.opencode-dialog-btn.confirm:hover{background:var(--oc-danger-hover)}@keyframes slideDown{0%{transform:translate(-50%) translateY(-100%);opacity:0}to{transform:translate(-50%) translateY(0);opacity:1}}.opencode-page-notification{position:fixed;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px rgba(59,130,246,.4),0 0 0 2px rgba(59,130,246,.2);animation:slideDown .3s ease;z-index:2147483647;display:flex;align-items:center;gap:10px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-page-notification:before{content:"\1f4a1";font-size:16px}.opencode-element-highlight{position:fixed;pointer-events:none;z-index:999998;border-radius:4px}#vue-inspector-container{display:none!important}.opencode-element-tooltip{position:fixed;background:var(--oc-tooltip-bg);color:#fff;padding:8px 12px;border-radius:6px;font-size:12px;z-index:9999998;box-shadow:var(--oc-shadow-md);max-width:300px;pointer-events:none}.opencode-tooltip-tag{font-weight:500;margin-bottom:4px;word-break:break-all}.opencode-tooltip-file{font-size:11px;color:var(--oc-text-placeholder);word-break:break-all}.opencode-element-highlight-temp{position:absolute;pointer-events:none;z-index:999998;border-radius:4px;animation:highlight-pulse 2s ease-out forwards}@keyframes highlight-pulse{0%{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.02)}to{opacity:0;transform:scale(1)}}@media(max-width:768px){.opencode-chat{width:calc(100vw - 40px);height:calc(100vh - 100px)}}body.has-opencode-split{transition:padding .3s ease;min-width:auto}body.has-opencode-split-right{padding-right:var(--opencode-split-width, 500px)}body.has-opencode-split-left{padding-left:var(--opencode-split-width, 500px)}
@@ -43,6 +43,7 @@ declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps
43
43
  selectMode: boolean;
44
44
  selectEnabled: boolean;
45
45
  theme: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetTheme;
46
+ displayMode: import("@vite-plugin-opencode-assistant/shared").DisplayMode;
46
47
  showSessionListSkeleton: boolean;
47
48
  sessionKey: string;
48
49
  sessions: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetSession[];
@@ -54,7 +55,6 @@ declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps
54
55
  splitPanelWidth: number;
55
56
  currentSessionId: string | null;
56
57
  selectedElements: import("@vite-plugin-opencode-assistant/shared").OpenCodeSelectedElement[];
57
- displayMode: import("@vite-plugin-opencode-assistant/shared").DisplayMode;
58
58
  splitMode: import("@vite-plugin-opencode-assistant/shared").SplitModeOptions;
59
59
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
60
60
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;