@vite-plugin-opencode-assistant/components 1.0.19 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/es/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import OpenCodeWidget from './open-code-widget';
2
2
  import type { App } from 'vue';
3
- declare const version = "1.0.19";
3
+ declare const version = "1.0.21";
4
4
  declare function install(app: App<any>, options?: any): void;
5
5
  export { install, version, OpenCodeWidget };
6
6
  export default install;
package/es/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import OpenCodeWidget from "./open-code-widget";
2
- const version = "1.0.19";
2
+ const version = "1.0.21";
3
3
  function install(app, options) {
4
4
  const components = [
5
5
  OpenCodeWidget
@@ -72,7 +72,7 @@ function filterStateClasses(classes) {
72
72
  function getElementDescription(element) {
73
73
  try {
74
74
  const selector = getCssSelector(element, {
75
- selectors: ["id", "class", "tag", "attribute", "nthchild"],
75
+ selectors: ["id", "class", "tag", "nthchild"],
76
76
  combineWithinSelector: true,
77
77
  combineBetweenSelectors: true,
78
78
  maxCombinations: 100,
@@ -1,4 +1,4 @@
1
- declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {};
1
+ declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {}, __VLS_9: {}, __VLS_11: {};
2
2
  type __VLS_Slots = {} & {
3
3
  'session-toggle-icon'?: (props: typeof __VLS_1) => any;
4
4
  } & {
@@ -6,7 +6,11 @@ type __VLS_Slots = {} & {
6
6
  } & {
7
7
  'theme-icon'?: (props: typeof __VLS_5) => any;
8
8
  } & {
9
- 'close-icon'?: (props: typeof __VLS_7) => any;
9
+ 'prompt-dock-icon'?: (props: typeof __VLS_7) => any;
10
+ } & {
11
+ 'minimize-icon'?: (props: typeof __VLS_9) => any;
12
+ } & {
13
+ 'close-icon'?: (props: typeof __VLS_11) => any;
10
14
  };
11
15
  declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
12
16
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
@@ -14,10 +14,14 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
14
14
  selectEnabled,
15
15
  theme,
16
16
  resolvedTheme,
17
+ minimized,
18
+ promptDockVisible,
17
19
  handleToggleSessionList,
18
20
  handleToggleSelectMode,
19
21
  handleToggleTheme,
20
- handleClose
22
+ handleClose,
23
+ handleToggleMinimize,
24
+ handleTogglePromptDock
21
25
  } = useOpenCodeWidgetContext();
22
26
  const themeIconTitle = computed(() => {
23
27
  const themeLabels = {
@@ -35,7 +39,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
35
39
  };
36
40
  return `\u5207\u6362\u4E3B\u9898 - \u5F53\u524D: ${themeLabels[theme.value]}`;
37
41
  });
38
- const __returned__ = { title, sessionListTitle, sessionListCollapsed, selectMode, selectEnabled, theme, resolvedTheme, handleToggleSessionList, handleToggleSelectMode, handleToggleTheme, handleClose, themeIconTitle, themeIconLabel };
42
+ const __returned__ = { title, sessionListTitle, sessionListCollapsed, selectMode, selectEnabled, theme, resolvedTheme, minimized, promptDockVisible, handleToggleSessionList, handleToggleSelectMode, handleToggleTheme, handleClose, handleToggleMinimize, handleTogglePromptDock, themeIconTitle, themeIconLabel };
39
43
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
40
44
  return __returned__;
41
45
  }
@@ -78,6 +82,28 @@ const _hoisted_8 = {
78
82
  };
79
83
  const _hoisted_9 = { class: "opencode-chat-header-title" };
80
84
  const _hoisted_10 = { class: "opencode-chat-header-actions" };
85
+ const _hoisted_11 = ["title", "aria-label", "aria-pressed"];
86
+ const _hoisted_12 = ["title", "aria-label", "aria-pressed"];
87
+ const _hoisted_13 = {
88
+ key: 0,
89
+ viewBox: "0 0 24 24",
90
+ width: "14",
91
+ height: "14",
92
+ fill: "none",
93
+ stroke: "currentColor",
94
+ "stroke-width": "2",
95
+ "aria-hidden": "true"
96
+ };
97
+ const _hoisted_14 = {
98
+ key: 1,
99
+ viewBox: "0 0 24 24",
100
+ width: "14",
101
+ height: "14",
102
+ fill: "none",
103
+ stroke: "currentColor",
104
+ "stroke-width": "2",
105
+ "aria-hidden": "true"
106
+ };
81
107
  function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
82
108
  return _openBlock(), _createElementBlock("div", _hoisted_1, [
83
109
  _createElementVNode("div", _hoisted_2, [
@@ -90,7 +116,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
90
116
  onClick: _cache[0] || (_cache[0] = (...args) => $setup.handleToggleSessionList && $setup.handleToggleSessionList(...args))
91
117
  }, [
92
118
  _renderSlot(_ctx.$slots, "session-toggle-icon", {}, () => [
93
- _cache[4] || (_cache[4] = _createElementVNode(
119
+ _cache[6] || (_cache[6] = _createElementVNode(
94
120
  "svg",
95
121
  {
96
122
  viewBox: "0 0 24 24",
@@ -122,7 +148,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
122
148
  onClick: _cache[1] || (_cache[1] = (...args) => $setup.handleToggleSelectMode && $setup.handleToggleSelectMode(...args))
123
149
  }, [
124
150
  _renderSlot(_ctx.$slots, "select-icon", {}, () => [
125
- _cache[5] || (_cache[5] = _createElementVNode(
151
+ _cache[7] || (_cache[7] = _createElementVNode(
126
152
  "svg",
127
153
  {
128
154
  viewBox: "0 0 1024 1024",
@@ -153,9 +179,9 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
153
179
  onClick: _cache[2] || (_cache[2] = (...args) => $setup.handleToggleTheme && $setup.handleToggleTheme(...args))
154
180
  }, [
155
181
  _renderSlot(_ctx.$slots, "theme-icon", {}, () => [
156
- $setup.theme === "light" ? (_openBlock(), _createElementBlock("svg", _hoisted_6, [..._cache[6] || (_cache[6] = [
182
+ $setup.theme === "light" ? (_openBlock(), _createElementBlock("svg", _hoisted_6, [..._cache[8] || (_cache[8] = [
157
183
  _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)
158
- ])])) : $setup.theme === "dark" ? (_openBlock(), _createElementBlock("svg", _hoisted_7, [..._cache[7] || (_cache[7] = [
184
+ ])])) : $setup.theme === "dark" ? (_openBlock(), _createElementBlock("svg", _hoisted_7, [..._cache[9] || (_cache[9] = [
159
185
  _createElementVNode(
160
186
  "path",
161
187
  { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" },
@@ -163,7 +189,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
163
189
  -1
164
190
  /* CACHED */
165
191
  )
166
- ])])) : (_openBlock(), _createElementBlock("svg", _hoisted_8, [..._cache[8] || (_cache[8] = [
192
+ ])])) : (_openBlock(), _createElementBlock("svg", _hoisted_8, [..._cache[10] || (_cache[10] = [
167
193
  _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)
168
194
  ])]))
169
195
  ])
@@ -177,15 +203,71 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
177
203
  /* TEXT */
178
204
  ),
179
205
  _createElementVNode("div", _hoisted_10, [
206
+ _createElementVNode("button", {
207
+ class: "opencode-header-btn prompt-dock",
208
+ type: "button",
209
+ title: $setup.promptDockVisible ? "\u9690\u85CF\u5BF9\u8BDD\u6846" : "\u663E\u793A\u5BF9\u8BDD\u6846",
210
+ "aria-label": $setup.promptDockVisible ? "\u9690\u85CF\u5BF9\u8BDD\u6846" : "\u663E\u793A\u5BF9\u8BDD\u6846",
211
+ "aria-pressed": $setup.promptDockVisible,
212
+ onClick: _cache[3] || (_cache[3] = (...args) => $setup.handleTogglePromptDock && $setup.handleTogglePromptDock(...args))
213
+ }, [
214
+ _renderSlot(_ctx.$slots, "prompt-dock-icon", {}, () => [
215
+ _cache[11] || (_cache[11] = _createElementVNode(
216
+ "svg",
217
+ {
218
+ viewBox: "0 0 24 24",
219
+ width: "14",
220
+ height: "14",
221
+ fill: "none",
222
+ stroke: "currentColor",
223
+ "stroke-width": "2",
224
+ "aria-hidden": "true"
225
+ },
226
+ [
227
+ _createElementVNode("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" })
228
+ ],
229
+ -1
230
+ /* CACHED */
231
+ ))
232
+ ])
233
+ ], 8, _hoisted_11),
234
+ _createElementVNode("button", {
235
+ class: "opencode-header-btn minimize",
236
+ type: "button",
237
+ title: $setup.minimized ? "\u5C55\u5F00" : "\u6700\u5C0F\u5316",
238
+ "aria-label": $setup.minimized ? "\u5C55\u5F00\u9762\u677F" : "\u6700\u5C0F\u5316\u9762\u677F",
239
+ "aria-pressed": $setup.minimized,
240
+ onClick: _cache[4] || (_cache[4] = (...args) => $setup.handleToggleMinimize && $setup.handleToggleMinimize(...args))
241
+ }, [
242
+ _renderSlot(_ctx.$slots, "minimize-icon", {}, () => [
243
+ $setup.minimized ? (_openBlock(), _createElementBlock("svg", _hoisted_13, [..._cache[12] || (_cache[12] = [
244
+ _createElementVNode(
245
+ "path",
246
+ { 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" },
247
+ null,
248
+ -1
249
+ /* CACHED */
250
+ )
251
+ ])])) : (_openBlock(), _createElementBlock("svg", _hoisted_14, [..._cache[13] || (_cache[13] = [
252
+ _createElementVNode(
253
+ "path",
254
+ { 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" },
255
+ null,
256
+ -1
257
+ /* CACHED */
258
+ )
259
+ ])]))
260
+ ])
261
+ ], 8, _hoisted_12),
180
262
  _createElementVNode("button", {
181
263
  class: "opencode-header-btn close",
182
264
  type: "button",
183
265
  title: "\u5173\u95ED",
184
266
  "aria-label": "\u5173\u95ED\u9762\u677F",
185
- onClick: _cache[3] || (_cache[3] = (...args) => $setup.handleClose && $setup.handleClose(...args))
267
+ onClick: _cache[5] || (_cache[5] = (...args) => $setup.handleClose && $setup.handleClose(...args))
186
268
  }, [
187
269
  _renderSlot(_ctx.$slots, "close-icon", {}, () => [
188
- _cache[9] || (_cache[9] = _createElementVNode(
270
+ _cache[14] || (_cache[14] = _createElementVNode(
189
271
  "svg",
190
272
  {
191
273
  viewBox: "0 0 24 24",
@@ -20,6 +20,8 @@ export interface OpenCodeWidgetContext {
20
20
  showClearAll: Ref<boolean>;
21
21
  open: Ref<boolean>;
22
22
  thinking: Ref<boolean>;
23
+ minimized: Ref<boolean>;
24
+ promptDockVisible: Ref<boolean>;
23
25
  iframeSource: Ref<string>;
24
26
  buttonActive: Ref<boolean>;
25
27
  sessionListTitle: Ref<string>;
@@ -29,6 +31,8 @@ export interface OpenCodeWidgetContext {
29
31
  selectedElementItems: Ref<OpenCodeSelectedElementItem[]>;
30
32
  handleToggle: () => void;
31
33
  handleClose: () => void;
34
+ handleToggleMinimize: () => void;
35
+ handleTogglePromptDock: () => void;
32
36
  handleToggleSessionList: () => void;
33
37
  handleToggleTheme: () => void;
34
38
  handleEmptyAction: () => 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-widget.bottom-right{bottom:20px;right:20px}.opencode-widget.bottom-left{bottom:20px;left:20px}.opencode-widget.top-right{top:20px;right:20px}.opencode-widget.top-left{top:20px;left:20px}.opencode-chat{position:absolute;width:700px;height:86vh;background:var(--oc-bg-main);border-radius:16px;box-shadow:var(--oc-shadow-lg);overflow:hidden;opacity:0;visibility:hidden;transform:translateY(20px) scale(.95);transition:all .3s ease;display:flex;flex-direction:column}.opencode-chat-content{display:flex;flex:1;overflow:hidden}.opencode-widget.bottom-right .opencode-chat{bottom:56px;right:0}.opencode-widget.bottom-left .opencode-chat{bottom:56px;left:0}.opencode-widget.top-right .opencode-chat{top:56px;right:0}.opencode-widget.top-left .opencode-chat{top:56px;left:0}.opencode-widget.bottom-right .opencode-selected-bubbles{bottom:56px;right:0}.opencode-widget.bottom-left .opencode-selected-bubbles{bottom:56px;left:0}.opencode-widget.top-right .opencode-selected-bubbles{top:56px;bottom:auto;right:0}.opencode-widget.top-left .opencode-selected-bubbles{top:56px;bottom:auto;left:0}.opencode-chat.open{opacity:1;visibility:visible;transform:translateY(0) scale(1)}.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;display:none;transition:all .1s ease;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;display:none;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)}}
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-widget.bottom-right{bottom:20px;right:20px}.opencode-widget.bottom-left{bottom:20px;left:20px}.opencode-widget.top-right{top:20px;right:20px}.opencode-widget.top-left{top:20px;left:20px}.opencode-chat{position:absolute;width:700px;height:86vh;background:var(--oc-bg-main);border-radius:16px;box-shadow:var(--oc-shadow-lg);overflow:hidden;opacity:0;visibility:hidden;transform:translateY(20px) scale(.95);transition:all .3s ease;display:flex;flex-direction:column}.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-widget.bottom-right .opencode-chat{bottom:56px;right:0}.opencode-widget.bottom-left .opencode-chat{bottom:56px;left:0}.opencode-widget.top-right .opencode-chat{top:56px;right:0}.opencode-widget.top-left .opencode-chat{top:56px;left:0}.opencode-widget.bottom-right .opencode-selected-bubbles{bottom:56px;right:0}.opencode-widget.bottom-left .opencode-selected-bubbles{bottom:56px;left:0}.opencode-widget.top-right .opencode-selected-bubbles{top:56px;bottom:auto;right:0}.opencode-widget.top-left .opencode-selected-bubbles{top:56px;bottom:auto;left:0}.opencode-chat.open{opacity:1;visibility:visible;transform:translateY(0) scale(1)}.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;display:none;transition:all .1s ease;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;display:none;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)}}
@@ -111,6 +111,8 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
111
111
  sendMessageToIframe
112
112
  });
113
113
  const localSessionListCollapsed = ref(props.sessionListCollapsed);
114
+ const minimized = ref(false);
115
+ const promptDockVisible = ref(true);
114
116
  watch(
115
117
  () => props.sessionListCollapsed,
116
118
  (val) => {
@@ -208,6 +210,16 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
208
210
  emit("toggle-select-mode", false);
209
211
  }
210
212
  });
213
+ const handleToggleMinimize = () => {
214
+ minimized.value = !minimized.value;
215
+ promptDockVisible.value = !minimized.value;
216
+ sendMessageToIframe("prompt-dock-visibility-change", { visible: promptDockVisible.value });
217
+ sendMessageToIframe("minimize-state-change", { minimized: minimized.value });
218
+ };
219
+ const handleTogglePromptDock = () => {
220
+ promptDockVisible.value = !promptDockVisible.value;
221
+ sendMessageToIframe("prompt-dock-visibility-change", { visible: promptDockVisible.value });
222
+ };
211
223
  provideOpenCodeWidgetContext({
212
224
  theme: toRef(props, "theme"),
213
225
  resolvedTheme,
@@ -228,6 +240,8 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
228
240
  showClearAll: toRef(props, "showClearAll"),
229
241
  open: toRef(props, "open"),
230
242
  thinking: toRef(props, "thinking"),
243
+ minimized,
244
+ promptDockVisible,
231
245
  iframeSource,
232
246
  buttonActive,
233
247
  sessionListTitle,
@@ -237,6 +251,8 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
237
251
  selectedElementItems,
238
252
  handleToggle,
239
253
  handleClose,
254
+ handleToggleMinimize,
255
+ handleTogglePromptDock,
240
256
  handleToggleSessionList,
241
257
  handleToggleTheme,
242
258
  handleEmptyAction,
@@ -257,7 +273,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
257
273
  return dialogResolve;
258
274
  }, set dialogResolve(v) {
259
275
  dialogResolve = v;
260
- }, showConfirmDialog, handleDialogConfirm, handleDialogCancel, frameRef, sendMessageToIframe, handleFrameLoaded, localSessionListCollapsed, buttonActive, containerClasses, iframeSource, sessionListTitle, resolvedTheme, handleClose, handleEmptyAction, handleToggle, handleToggleSessionList, handleToggleTheme, sessionItems, handleCreateSession, handleDeleteSession, handleSelectSession, bubbleVisible, hasSelectedElements, selectedElementItems, handleClearSelectedNodes, handleClickSelectedNode, handleRemoveSelectedNode, handleToggleSelectMode, highlightVisible, highlightStyle, tooltipVisible, tooltipStyle, tooltipContent, Frame, Header, SelectHint, SelectedNodes, SessionList, Trigger };
276
+ }, showConfirmDialog, handleDialogConfirm, handleDialogCancel, frameRef, sendMessageToIframe, handleFrameLoaded, localSessionListCollapsed, minimized, promptDockVisible, buttonActive, containerClasses, iframeSource, sessionListTitle, resolvedTheme, handleClose, handleEmptyAction, handleToggle, handleToggleSessionList, handleToggleTheme, sessionItems, handleCreateSession, handleDeleteSession, handleSelectSession, bubbleVisible, hasSelectedElements, selectedElementItems, handleClearSelectedNodes, handleClickSelectedNode, handleRemoveSelectedNode, handleToggleSelectMode, highlightVisible, highlightStyle, tooltipVisible, tooltipStyle, tooltipContent, handleToggleMinimize, handleTogglePromptDock, Frame, Header, SelectHint, SelectedNodes, SessionList, Trigger };
261
277
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
262
278
  return __returned__;
263
279
  }
@@ -316,7 +332,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
316
332
  _withDirectives(_createElementVNode(
317
333
  "div",
318
334
  {
319
- class: _normalizeClass(["opencode-chat", { open: $props.open }])
335
+ class: _normalizeClass(["opencode-chat", { open: $props.open, minimized: $setup.minimized }])
320
336
  },
321
337
  [
322
338
  _createVNode(
@@ -137,7 +137,7 @@ var __vue_sfc__$5 = /* @__PURE__ */ (0, vue.defineComponent)({
137
137
  __name: "Header",
138
138
  setup(__props, { expose: __expose }) {
139
139
  __expose();
140
- const { title, sessionListTitle, sessionListCollapsed, selectMode, selectEnabled, theme, resolvedTheme, handleToggleSessionList, handleToggleSelectMode, handleToggleTheme, handleClose } = useOpenCodeWidgetContext();
140
+ const { title, sessionListTitle, sessionListCollapsed, selectMode, selectEnabled, theme, resolvedTheme, minimized, promptDockVisible, handleToggleSessionList, handleToggleSelectMode, handleToggleTheme, handleClose, handleToggleMinimize, handleTogglePromptDock } = useOpenCodeWidgetContext();
141
141
  const __returned__ = {
142
142
  title,
143
143
  sessionListTitle,
@@ -146,10 +146,14 @@ var __vue_sfc__$5 = /* @__PURE__ */ (0, vue.defineComponent)({
146
146
  selectEnabled,
147
147
  theme,
148
148
  resolvedTheme,
149
+ minimized,
150
+ promptDockVisible,
149
151
  handleToggleSessionList,
150
152
  handleToggleSelectMode,
151
153
  handleToggleTheme,
152
154
  handleClose,
155
+ handleToggleMinimize,
156
+ handleTogglePromptDock,
153
157
  themeIconTitle: (0, vue.computed)(() => {
154
158
  return `\u4E3B\u9898: ${{
155
159
  auto: "自动",
@@ -213,6 +217,36 @@ var _hoisted_8$2 = {
213
217
  };
214
218
  var _hoisted_9$2 = { class: "opencode-chat-header-title" };
215
219
  var _hoisted_10 = { class: "opencode-chat-header-actions" };
220
+ var _hoisted_11 = [
221
+ "title",
222
+ "aria-label",
223
+ "aria-pressed"
224
+ ];
225
+ var _hoisted_12 = [
226
+ "title",
227
+ "aria-label",
228
+ "aria-pressed"
229
+ ];
230
+ var _hoisted_13 = {
231
+ key: 0,
232
+ viewBox: "0 0 24 24",
233
+ width: "14",
234
+ height: "14",
235
+ fill: "none",
236
+ stroke: "currentColor",
237
+ "stroke-width": "2",
238
+ "aria-hidden": "true"
239
+ };
240
+ var _hoisted_14 = {
241
+ key: 1,
242
+ viewBox: "0 0 24 24",
243
+ width: "14",
244
+ height: "14",
245
+ fill: "none",
246
+ stroke: "currentColor",
247
+ "stroke-width": "2",
248
+ "aria-hidden": "true"
249
+ };
216
250
  function __vue_render__$5(_ctx, _cache, $props, $setup, $data, $options) {
217
251
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$5, [
218
252
  (0, vue.createElementVNode)("div", _hoisted_2$3, [
@@ -223,7 +257,7 @@ function __vue_render__$5(_ctx, _cache, $props, $setup, $data, $options) {
223
257
  "aria-label": $setup.sessionListTitle,
224
258
  "aria-expanded": !$setup.sessionListCollapsed,
225
259
  onClick: _cache[0] || (_cache[0] = (...args) => $setup.handleToggleSessionList && $setup.handleToggleSessionList(...args))
226
- }, [(0, vue.renderSlot)(_ctx.$slots, "session-toggle-icon", {}, () => [_cache[4] || (_cache[4] = (0, vue.createElementVNode)("svg", {
260
+ }, [(0, vue.renderSlot)(_ctx.$slots, "session-toggle-icon", {}, () => [_cache[6] || (_cache[6] = (0, vue.createElementVNode)("svg", {
227
261
  viewBox: "0 0 24 24",
228
262
  width: "16",
229
263
  height: "16",
@@ -243,7 +277,7 @@ function __vue_render__$5(_ctx, _cache, $props, $setup, $data, $options) {
243
277
  "aria-pressed": $setup.selectMode,
244
278
  disabled: !$setup.selectEnabled,
245
279
  onClick: _cache[1] || (_cache[1] = (...args) => $setup.handleToggleSelectMode && $setup.handleToggleSelectMode(...args))
246
- }, [(0, vue.renderSlot)(_ctx.$slots, "select-icon", {}, () => [_cache[5] || (_cache[5] = (0, vue.createElementVNode)("svg", {
280
+ }, [(0, vue.renderSlot)(_ctx.$slots, "select-icon", {}, () => [_cache[7] || (_cache[7] = (0, vue.createElementVNode)("svg", {
247
281
  viewBox: "0 0 1024 1024",
248
282
  width: "16",
249
283
  height: "16",
@@ -261,24 +295,50 @@ function __vue_render__$5(_ctx, _cache, $props, $setup, $data, $options) {
261
295
  title: $setup.themeIconTitle,
262
296
  "aria-label": $setup.themeIconLabel,
263
297
  onClick: _cache[2] || (_cache[2] = (...args) => $setup.handleToggleTheme && $setup.handleToggleTheme(...args))
264
- }, [(0, vue.renderSlot)(_ctx.$slots, "theme-icon", {}, () => [$setup.theme === "light" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_6$3, [..._cache[6] || (_cache[6] = [(0, vue.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)])])) : $setup.theme === "dark" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_7$2, [..._cache[7] || (_cache[7] = [(0, vue.createElementVNode)("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }, null, -1)])])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_8$2, [..._cache[8] || (_cache[8] = [(0, vue.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)])]))])], 8, _hoisted_5$3)
298
+ }, [(0, vue.renderSlot)(_ctx.$slots, "theme-icon", {}, () => [$setup.theme === "light" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_6$3, [..._cache[8] || (_cache[8] = [(0, vue.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)])])) : $setup.theme === "dark" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_7$2, [..._cache[9] || (_cache[9] = [(0, vue.createElementVNode)("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }, null, -1)])])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_8$2, [..._cache[10] || (_cache[10] = [(0, vue.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)])]))])], 8, _hoisted_5$3)
265
299
  ]),
266
300
  (0, vue.createElementVNode)("span", _hoisted_9$2, (0, vue.toDisplayString)($setup.title), 1),
267
- (0, vue.createElementVNode)("div", _hoisted_10, [(0, vue.createElementVNode)("button", {
268
- class: "opencode-header-btn close",
269
- type: "button",
270
- title: "关闭",
271
- "aria-label": "关闭面板",
272
- onClick: _cache[3] || (_cache[3] = (...args) => $setup.handleClose && $setup.handleClose(...args))
273
- }, [(0, vue.renderSlot)(_ctx.$slots, "close-icon", {}, () => [_cache[9] || (_cache[9] = (0, vue.createElementVNode)("svg", {
274
- viewBox: "0 0 24 24",
275
- width: "14",
276
- height: "14",
277
- fill: "none",
278
- stroke: "currentColor",
279
- "stroke-width": "2",
280
- "aria-hidden": "true"
281
- }, [(0, vue.createElementVNode)("path", { d: "M18 6L6 18M6 6l12 12" })], -1))])])])
301
+ (0, vue.createElementVNode)("div", _hoisted_10, [
302
+ (0, vue.createElementVNode)("button", {
303
+ class: "opencode-header-btn prompt-dock",
304
+ type: "button",
305
+ title: $setup.promptDockVisible ? "隐藏对话框" : "显示对话框",
306
+ "aria-label": $setup.promptDockVisible ? "隐藏对话框" : "显示对话框",
307
+ "aria-pressed": $setup.promptDockVisible,
308
+ onClick: _cache[3] || (_cache[3] = (...args) => $setup.handleTogglePromptDock && $setup.handleTogglePromptDock(...args))
309
+ }, [(0, vue.renderSlot)(_ctx.$slots, "prompt-dock-icon", {}, () => [_cache[11] || (_cache[11] = (0, vue.createElementVNode)("svg", {
310
+ viewBox: "0 0 24 24",
311
+ width: "14",
312
+ height: "14",
313
+ fill: "none",
314
+ stroke: "currentColor",
315
+ "stroke-width": "2",
316
+ "aria-hidden": "true"
317
+ }, [(0, vue.createElementVNode)("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" })], -1))])], 8, _hoisted_11),
318
+ (0, vue.createElementVNode)("button", {
319
+ class: "opencode-header-btn minimize",
320
+ type: "button",
321
+ title: $setup.minimized ? "展开" : "最小化",
322
+ "aria-label": $setup.minimized ? "展开面板" : "最小化面板",
323
+ "aria-pressed": $setup.minimized,
324
+ onClick: _cache[4] || (_cache[4] = (...args) => $setup.handleToggleMinimize && $setup.handleToggleMinimize(...args))
325
+ }, [(0, vue.renderSlot)(_ctx.$slots, "minimize-icon", {}, () => [$setup.minimized ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_13, [..._cache[12] || (_cache[12] = [(0, vue.createElementVNode)("path", { 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" }, null, -1)])])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_14, [..._cache[13] || (_cache[13] = [(0, vue.createElementVNode)("path", { 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" }, null, -1)])]))])], 8, _hoisted_12),
326
+ (0, vue.createElementVNode)("button", {
327
+ class: "opencode-header-btn close",
328
+ type: "button",
329
+ title: "关闭",
330
+ "aria-label": "关闭面板",
331
+ onClick: _cache[5] || (_cache[5] = (...args) => $setup.handleClose && $setup.handleClose(...args))
332
+ }, [(0, vue.renderSlot)(_ctx.$slots, "close-icon", {}, () => [_cache[14] || (_cache[14] = (0, vue.createElementVNode)("svg", {
333
+ viewBox: "0 0 24 24",
334
+ width: "14",
335
+ height: "14",
336
+ fill: "none",
337
+ stroke: "currentColor",
338
+ "stroke-width": "2",
339
+ "aria-hidden": "true"
340
+ }, [(0, vue.createElementVNode)("path", { d: "M18 6L6 18M6 6l12 12" })], -1))])])
341
+ ])
282
342
  ]);
283
343
  }
284
344
  __vue_sfc__$5.render = __vue_render__$5;
@@ -844,7 +904,6 @@ function getElementDescription(element) {
844
904
  "id",
845
905
  "class",
846
906
  "tag",
847
- "attribute",
848
907
  "nthchild"
849
908
  ],
850
909
  combineWithinSelector: true,
@@ -1384,6 +1443,8 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1384
1443
  sendMessageToIframe
1385
1444
  });
1386
1445
  const localSessionListCollapsed = (0, vue.ref)(props.sessionListCollapsed);
1446
+ const minimized = (0, vue.ref)(false);
1447
+ const promptDockVisible = (0, vue.ref)(true);
1387
1448
  (0, vue.watch)(() => props.sessionListCollapsed, (val) => {
1388
1449
  localSessionListCollapsed.value = val;
1389
1450
  });
@@ -1459,6 +1520,16 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1459
1520
  emit("toggle-select-mode", false);
1460
1521
  }
1461
1522
  });
1523
+ const handleToggleMinimize = () => {
1524
+ minimized.value = !minimized.value;
1525
+ promptDockVisible.value = !minimized.value;
1526
+ sendMessageToIframe("prompt-dock-visibility-change", { visible: promptDockVisible.value });
1527
+ sendMessageToIframe("minimize-state-change", { minimized: minimized.value });
1528
+ };
1529
+ const handleTogglePromptDock = () => {
1530
+ promptDockVisible.value = !promptDockVisible.value;
1531
+ sendMessageToIframe("prompt-dock-visibility-change", { visible: promptDockVisible.value });
1532
+ };
1462
1533
  provideOpenCodeWidgetContext({
1463
1534
  theme: (0, vue.toRef)(props, "theme"),
1464
1535
  resolvedTheme,
@@ -1479,6 +1550,8 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1479
1550
  showClearAll: (0, vue.toRef)(props, "showClearAll"),
1480
1551
  open: (0, vue.toRef)(props, "open"),
1481
1552
  thinking: (0, vue.toRef)(props, "thinking"),
1553
+ minimized,
1554
+ promptDockVisible,
1482
1555
  iframeSource,
1483
1556
  buttonActive,
1484
1557
  sessionListTitle,
@@ -1488,6 +1561,8 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1488
1561
  selectedElementItems,
1489
1562
  handleToggle,
1490
1563
  handleClose,
1564
+ handleToggleMinimize,
1565
+ handleTogglePromptDock,
1491
1566
  handleToggleSessionList,
1492
1567
  handleToggleTheme,
1493
1568
  handleEmptyAction,
@@ -1529,6 +1604,8 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1529
1604
  sendMessageToIframe,
1530
1605
  handleFrameLoaded,
1531
1606
  localSessionListCollapsed,
1607
+ minimized,
1608
+ promptDockVisible,
1532
1609
  buttonActive,
1533
1610
  containerClasses,
1534
1611
  iframeSource,
@@ -1555,6 +1632,8 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1555
1632
  tooltipVisible,
1556
1633
  tooltipStyle,
1557
1634
  tooltipContent,
1635
+ handleToggleMinimize,
1636
+ handleTogglePromptDock,
1558
1637
  Frame: Frame_vue_default,
1559
1638
  Header: Header_vue_default,
1560
1639
  SelectHint: SelectHint_vue_default,
@@ -1601,7 +1680,10 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
1601
1680
  key: "0"
1602
1681
  } : void 0]), 1024),
1603
1682
  (0, vue.createCommentVNode)(" <SelectedBubbles v-if=\"bubbleVisible\" /> "),
1604
- (0, vue.withDirectives)((0, vue.createElementVNode)("div", { class: (0, vue.normalizeClass)(["opencode-chat", { open: $props.open }]) }, [
1683
+ (0, vue.withDirectives)((0, vue.createElementVNode)("div", { class: (0, vue.normalizeClass)(["opencode-chat", {
1684
+ open: $props.open,
1685
+ minimized: $setup.minimized
1686
+ }]) }, [
1605
1687
  (0, vue.createVNode)($setup["Header"], null, (0, vue.createSlots)({ _: 2 }, [
1606
1688
  $setup.slots["session-toggle-icon"] ? {
1607
1689
  name: "session-toggle-icon",
@@ -1680,7 +1762,7 @@ __vue_sfc__.render = __vue_render__;
1680
1762
  var open_code_widget_default = __vue_sfc__;
1681
1763
  //#endregion
1682
1764
  //#region es/index.js
1683
- var version = "1.0.19";
1765
+ var version = "1.0.21";
1684
1766
  function install(app, options) {
1685
1767
  [open_code_widget_default].forEach((item) => {
1686
1768
  if (item.install) app.use(item, options);