@vite-plugin-opencode-assistant/components 1.0.74 → 1.0.76

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 (31) hide show
  1. package/es/index.d.ts +1 -1
  2. package/es/index.mjs +1 -1
  3. package/es/open-code-widget/composables/use-split.d.ts +1 -0
  4. package/es/open-code-widget/composables/use-split.mjs +15 -8
  5. package/es/open-code-widget/src/components/ChatPanel-sfc.css +1 -1
  6. package/es/open-code-widget/src/components/ChatPanel.vue.d.ts +2 -0
  7. package/es/open-code-widget/src/components/ChatPanel.vue.mjs +9 -4
  8. package/es/open-code-widget/src/components/Frame-sfc.css +1 -1
  9. package/es/open-code-widget/src/components/Header.vue.mjs +61 -28
  10. package/es/open-code-widget/src/context.d.ts +1 -0
  11. package/es/open-code-widget/src/index-sfc.css +1 -1
  12. package/es/open-code-widget/src/index.vue.d.ts +1 -0
  13. package/es/open-code-widget/src/index.vue.mjs +137 -120
  14. package/lib/@vite-plugin-opencode-assistant/components.cjs.js +189 -137
  15. package/lib/@vite-plugin-opencode-assistant/components.es.js +190 -138
  16. package/lib/components.css +3 -3
  17. package/lib/index.cjs +1 -1
  18. package/lib/index.d.ts +1 -1
  19. package/lib/open-code-widget/composables/use-split.cjs +15 -8
  20. package/lib/open-code-widget/composables/use-split.d.ts +1 -0
  21. package/lib/open-code-widget/src/components/ChatPanel-sfc.css +1 -1
  22. package/lib/open-code-widget/src/components/ChatPanel.vue.cjs +9 -4
  23. package/lib/open-code-widget/src/components/ChatPanel.vue.d.ts +2 -0
  24. package/lib/open-code-widget/src/components/Frame-sfc.css +1 -1
  25. package/lib/open-code-widget/src/components/Header.vue.cjs +61 -28
  26. package/lib/open-code-widget/src/context.d.ts +1 -0
  27. package/lib/open-code-widget/src/index-sfc.css +1 -1
  28. package/lib/open-code-widget/src/index.vue.cjs +136 -119
  29. package/lib/open-code-widget/src/index.vue.d.ts +1 -0
  30. package/lib/web-types.json +1 -1
  31. package/package.json +2 -2
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.74";
3
+ declare const version = "1.0.76";
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.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import OpenCodeWidget from "./open-code-widget/index.mjs";
2
- const version = "1.0.74";
2
+ const version = "1.0.76";
3
3
  function install(app, options) {
4
4
  const components = [
5
5
  OpenCodeWidget
@@ -12,6 +12,7 @@ export interface UseSplitModeOptions {
12
12
  export declare function useSplitMode(options: UseSplitModeOptions): {
13
13
  effectiveMode: import("vue").ComputedRef<"bubble" | "split">;
14
14
  isSplitMode: import("vue").ComputedRef<boolean>;
15
+ isExtensionMode: import("vue").ComputedRef<boolean>;
15
16
  panelWidth: Ref<number, number>;
16
17
  splitConfig: import("vue").ComputedRef<{
17
18
  width: number;
@@ -4,21 +4,24 @@ function useSplitMode(options) {
4
4
  var _a, _b;
5
5
  const windowWidth = ref(typeof window !== "undefined" ? window.innerWidth : 0);
6
6
  const localSplitPosition = ref((_b = (_a = options.splitPosition) == null ? void 0 : _a.value) != null ? _b : "right");
7
+ const isExtensionMode = computed(() => options.displayMode.value === "extension");
7
8
  const splitConfig = computed(() => {
8
9
  var _a2, _b2, _c, _d, _e, _f, _g;
9
10
  const config = options.splitMode.value || {};
11
+ const isExt = isExtensionMode.value;
10
12
  return {
11
13
  width: (_a2 = config.width) != null ? _a2 : 500,
12
14
  minWidth: (_b2 = config.minWidth) != null ? _b2 : 400,
13
15
  maxWidth: (_c = config.maxWidth) != null ? _c : 800,
14
- resizable: (_d = config.resizable) != null ? _d : true,
15
- shrinkPage: (_e = config.shrinkPage) != null ? _e : true,
16
- defaultOpen: (_f = config.defaultOpen) != null ? _f : true,
16
+ resizable: isExt ? false : (_d = config.resizable) != null ? _d : true,
17
+ shrinkPage: isExt ? false : (_e = config.shrinkPage) != null ? _e : true,
18
+ defaultOpen: isExt ? true : (_f = config.defaultOpen) != null ? _f : true,
17
19
  position: (_g = config.position) != null ? _g : localSplitPosition.value
18
20
  };
19
21
  });
20
22
  const panelWidth = ref(splitConfig.value.width);
21
23
  const effectiveMode = computed(() => {
24
+ if (isExtensionMode.value) return "split";
22
25
  if (options.displayMode.value === "bubble") {
23
26
  return "bubble";
24
27
  }
@@ -52,6 +55,7 @@ function useSplitMode(options) {
52
55
  };
53
56
  const updateBodyClass = () => {
54
57
  if (typeof document === "undefined") return;
58
+ if (isExtensionMode.value) return;
55
59
  const shouldShrink = isSplitMode.value && options.open.value && splitConfig.value.shrinkPage;
56
60
  if (shouldShrink) {
57
61
  document.body.classList.add("has-opencode-split");
@@ -94,7 +98,7 @@ function useSplitMode(options) {
94
98
  var _a2;
95
99
  if (typeof window !== "undefined") {
96
100
  window.addEventListener("resize", handleWindowResize);
97
- if (isSplitMode.value && splitConfig.value.defaultOpen && !options.open.value) {
101
+ if (!isExtensionMode.value && isSplitMode.value && splitConfig.value.defaultOpen && !options.open.value) {
98
102
  (_a2 = options.onOpenChange) == null ? void 0 : _a2.call(options, true);
99
103
  }
100
104
  }
@@ -102,15 +106,18 @@ function useSplitMode(options) {
102
106
  onUnmounted(() => {
103
107
  if (typeof window !== "undefined") {
104
108
  window.removeEventListener("resize", handleWindowResize);
105
- document.body.classList.remove("has-opencode-split");
106
- document.body.classList.remove("has-opencode-split-left");
107
- document.body.classList.remove("has-opencode-split-right");
108
- document.body.style.removeProperty("--opencode-split-width");
109
+ if (!isExtensionMode.value) {
110
+ document.body.classList.remove("has-opencode-split");
111
+ document.body.classList.remove("has-opencode-split-left");
112
+ document.body.classList.remove("has-opencode-split-right");
113
+ document.body.style.removeProperty("--opencode-split-width");
114
+ }
109
115
  }
110
116
  });
111
117
  return {
112
118
  effectiveMode,
113
119
  isSplitMode,
120
+ isExtensionMode,
114
121
  panelWidth,
115
122
  splitConfig,
116
123
  splitPosition,
@@ -1 +1 @@
1
- .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;display:flex;flex-direction:column;z-index:99999}.opencode-chat:not(.split-mode){opacity:0;visibility:hidden;transition:all .3s ease;transform:translate3d(var(---animationOrigin\.x),var(---animationOrigin\.y),0) scale(.95)}.opencode-chat.split-mode{position:fixed;top:0;bottom:0;height:100vh;max-height:100vh;border-radius:0;box-shadow:var(--oc-shadow-lg);overflow:visible;opacity:1;visibility:visible;transition:transform .3s ease}.opencode-chat.split-mode.split-right{right:0;border-left:1px solid var(--oc-border-primary);transform:translate(100%)}.opencode-chat.split-mode.split-left{left:0;border-right:1px solid var(--oc-border-primary);transform:translate(-100%)}.opencode-chat.split-mode .opencode-chat-content{overflow:hidden;flex:1}.opencode-chat.split-mode.open{transform:translate(0)}.opencode-chat.split-mode.dragging{transition:none}.opencode-chat.dragging .opencode-iframe{pointer-events:none}.opencode-chat:not(.split-mode){opacity:0;visibility:hidden;transition:all .3s ease}.opencode-chat:not(.split-mode).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:not(.split-mode){width:320px;height:320px}.opencode-chat.minimized:not(.split-mode) .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;z-index:100;animation:opencode-notification-fade-in .3s ease}@keyframes opencode-notification-fade-in{0%{opacity:0;transform:translate(-50%) translateY(-10px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.opencode-session-empty{padding:24px;text-align:center;color:var(--oc-text-placeholder);font-size:14px}.opencode-split-toggle-btn{position:absolute;left:-21px;top:50%;transform:translateY(-50%);width:20px;height:48px;background:#fff;border:none;border-radius:8px 0 0 8px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#667eea;box-shadow:0 4px 12px #667eea66;transition:all .3s ease;z-index:5;transform-origin:right center}.opencode-split-toggle-btn.split-left{left:auto;right:-21px;border-radius:0 8px 8px 0;transform-origin:left center}.opencode-split-toggle-btn:hover{transform:translateY(-50%) scale(1.1);box-shadow:0 6px 16px #667eea80}.opencode-split-toggle-btn.split-left:hover{transform:translateY(-50%) scale(1.1)}.opencode-split-toggle-btn.opencode-theme-dark{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;box-shadow:0 4px 12px #667eea4d}.opencode-split-toggle-btn.opencode-theme-dark:before{content:"";position:absolute;inset:-2px 0 -2px -2px;border-radius:8px 0 0 8px;background:linear-gradient(135deg,#8b9cf5,#9d6bc7);z-index:-1}.opencode-split-toggle-btn.opencode-theme-dark.split-left:before{left:0;right:-2px;border-radius:0 8px 8px 0}.opencode-split-toggle-btn.opencode-theme-dark:hover{box-shadow:0 6px 16px #667eea66}.opencode-split-toggle-btn.thinking{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;animation:split-thinking-glow 2s ease-in-out infinite,split-thinking-pulse 2s ease-in-out infinite;box-shadow:0 0 20px #667eea99,0 0 40px #764ba266,0 0 60px #667eea33}.opencode-split-toggle-btn.thinking:before{content:"";position:absolute;inset:-2px 0 -2px -2px;border-radius:8px 0 0 8px;background:linear-gradient(135deg,#8b9cf5,#9d6bc7);z-index:-1}.opencode-split-toggle-btn.thinking.split-left:before{left:0;right:-2px;border-radius:0 8px 8px 0}.opencode-split-toggle-btn.thinking:after{content:"";position:absolute;inset:-3px -1px -3px -3px;border-radius:8px 0 0 8px;background:conic-gradient(from 180deg,transparent,rgba(102,126,234,.3),transparent,rgba(118,75,162,.3),transparent);z-index:-2;animation:split-thinking-rotate 2s linear infinite reverse;filter:blur(8px)}.opencode-split-toggle-btn.thinking.split-left:after{left:-1px;right:-3px;border-radius:0 8px 8px 0}@keyframes split-thinking-glow{0%,to{box-shadow:0 0 20px #667eea99,0 0 40px #764ba266,0 0 60px #667eea33}50%{box-shadow:0 0 30px #667eeacc,0 0 60px #764ba299,0 0 90px #667eea4d}}@keyframes split-thinking-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes split-thinking-pulse{0%,to{transform:translateY(-50%) scale(1)}50%{transform:translateY(-50%) scale(.92)}}.opencode-split-toggle-icon{display:flex;align-items:center;justify-content:center;transition:transform .25s ease}.opencode-split-toggle-btn:hover .opencode-split-toggle-icon{transform:scale(1.1)}
1
+ .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;display:flex;flex-direction:column;z-index:99999}.opencode-chat:not(.split-mode){opacity:0;visibility:hidden;transition:all .3s ease;transform:translate3d(var(---animationOrigin\.x),var(---animationOrigin\.y),0) scale(.95)}.opencode-chat.split-mode{position:fixed;top:0;bottom:0;height:100vh;max-height:100vh;border-radius:0;box-shadow:var(--oc-shadow-lg);overflow:visible;opacity:1;visibility:visible;transition:transform .3s ease}.opencode-chat.split-mode.split-right{right:0;border-left:1px solid var(--oc-border-primary);transform:translate(100%)}.opencode-chat.split-mode.split-left{left:0;border-right:1px solid var(--oc-border-primary);transform:translate(-100%)}.opencode-chat.split-mode .opencode-chat-content{overflow:hidden;flex:1}.opencode-chat.split-mode.open{transform:translate(0)}.opencode-chat.split-mode.dragging{transition:none}.opencode-chat.dragging .opencode-iframe{pointer-events:none}.opencode-chat.extension-mode{position:static;width:100%;height:100%;bottom:auto;left:auto;right:auto;border-radius:0;border-left:none;border-right:none;max-height:none;box-shadow:none;transform:none;opacity:1;visibility:visible}.opencode-chat:not(.split-mode){opacity:0;visibility:hidden;transition:all .3s ease}.opencode-chat:not(.split-mode).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:not(.split-mode){width:320px;height:320px}.opencode-chat.minimized:not(.split-mode) .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;z-index:100;animation:opencode-notification-fade-in .3s ease}@keyframes opencode-notification-fade-in{0%{opacity:0;transform:translate(-50%) translateY(-10px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.opencode-session-empty{padding:24px;text-align:center;color:var(--oc-text-placeholder);font-size:14px}.opencode-split-toggle-btn{position:absolute;left:-21px;top:50%;transform:translateY(-50%);width:20px;height:48px;background:#fff;border:none;border-radius:8px 0 0 8px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#667eea;box-shadow:0 4px 12px #667eea66;transition:all .3s ease;z-index:5;transform-origin:right center}.opencode-split-toggle-btn.split-left{left:auto;right:-21px;border-radius:0 8px 8px 0;transform-origin:left center}.opencode-split-toggle-btn:hover{transform:translateY(-50%) scale(1.1);box-shadow:0 6px 16px #667eea80}.opencode-split-toggle-btn.split-left:hover{transform:translateY(-50%) scale(1.1)}.opencode-split-toggle-btn.opencode-theme-dark{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;box-shadow:0 4px 12px #667eea4d}.opencode-split-toggle-btn.opencode-theme-dark:before{content:"";position:absolute;inset:-2px 0 -2px -2px;border-radius:8px 0 0 8px;background:linear-gradient(135deg,#8b9cf5,#9d6bc7);z-index:-1}.opencode-split-toggle-btn.opencode-theme-dark.split-left:before{left:0;right:-2px;border-radius:0 8px 8px 0}.opencode-split-toggle-btn.opencode-theme-dark:hover{box-shadow:0 6px 16px #667eea66}.opencode-split-toggle-btn.thinking{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;animation:split-thinking-glow 2s ease-in-out infinite,split-thinking-pulse 2s ease-in-out infinite;box-shadow:0 0 20px #667eea99,0 0 40px #764ba266,0 0 60px #667eea33}.opencode-split-toggle-btn.thinking:before{content:"";position:absolute;inset:-2px 0 -2px -2px;border-radius:8px 0 0 8px;background:linear-gradient(135deg,#8b9cf5,#9d6bc7);z-index:-1}.opencode-split-toggle-btn.thinking.split-left:before{left:0;right:-2px;border-radius:0 8px 8px 0}.opencode-split-toggle-btn.thinking:after{content:"";position:absolute;inset:-3px -1px -3px -3px;border-radius:8px 0 0 8px;background:conic-gradient(from 180deg,transparent,rgba(102,126,234,.3),transparent,rgba(118,75,162,.3),transparent);z-index:-2;animation:split-thinking-rotate 2s linear infinite reverse;filter:blur(8px)}.opencode-split-toggle-btn.thinking.split-left:after{left:-1px;right:-3px;border-radius:0 8px 8px 0}@keyframes split-thinking-glow{0%,to{box-shadow:0 0 20px #667eea99,0 0 40px #764ba266,0 0 60px #667eea33}50%{box-shadow:0 0 30px #667eeacc,0 0 60px #764ba299,0 0 90px #667eea4d}}@keyframes split-thinking-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes split-thinking-pulse{0%,to{transform:translateY(-50%) scale(1)}50%{transform:translateY(-50%) scale(.92)}}.opencode-split-toggle-icon{display:flex;align-items:center;justify-content:center;transition:transform .25s ease}.opencode-split-toggle-btn:hover .opencode-split-toggle-icon{transform:scale(1.1)}
@@ -19,6 +19,7 @@ type __VLS_Props = {
19
19
  thinking?: boolean;
20
20
  resolvedTheme?: "light" | "dark";
21
21
  splitPosition?: "left" | "right";
22
+ extension?: boolean;
22
23
  };
23
24
  declare var __VLS_13: {}, __VLS_15: {}, __VLS_17: {}, __VLS_22: {}, __VLS_29: {}, __VLS_31: {}, __VLS_33: {}, __VLS_35: {};
24
25
  type __VLS_Slots = {} & {
@@ -152,6 +153,7 @@ declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {
152
153
  "onResize-start"?: (() => any) | undefined;
153
154
  "onResize-end"?: (() => any) | undefined;
154
155
  }>, {
156
+ extension: boolean;
155
157
  resolvedTheme: "light" | "dark";
156
158
  minimized: boolean;
157
159
  mode: "bubble" | "split";
@@ -46,7 +46,8 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
46
46
  notificationMode: { type: String, required: false, default: "widget" },
47
47
  thinking: { type: Boolean, required: false, default: false },
48
48
  resolvedTheme: { type: String, required: false, default: "light" },
49
- splitPosition: { type: String, required: false, default: "right" }
49
+ splitPosition: { type: String, required: false, default: "right" },
50
+ extension: { type: Boolean, required: false, default: false }
50
51
  },
51
52
  emits: ["resize", "resize-start", "resize-end", "toggle"],
52
53
  setup(__props, { expose: __expose, emit: __emit }) {
@@ -79,6 +80,9 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
79
80
  emit("toggle");
80
81
  };
81
82
  const panelStyle = computed(() => {
83
+ if (props.extension) {
84
+ return {};
85
+ }
82
86
  if (props.mode === "split") {
83
87
  return {
84
88
  width: `${props.panelWidth}px`
@@ -94,8 +98,9 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
94
98
  dragging: props.dragging,
95
99
  "no-transition": props.noTransition,
96
100
  "split-mode": props.mode === "split",
97
- "split-left": props.mode === "split" && props.splitPosition === "left",
98
- "split-right": props.mode === "split" && props.splitPosition === "right"
101
+ "split-left": props.mode === "split" && props.splitPosition === "left" && !props.extension,
102
+ "split-right": props.mode === "split" && props.splitPosition === "right" && !props.extension,
103
+ "extension-mode": props.extension
99
104
  }
100
105
  ]);
101
106
  const __returned__ = { props, emit, slots, frameRef, sendMessageToIframe, handleResizeStart, handleResize, handleResizeEnd, handleToggle, panelStyle, panelClasses, Frame, Header, SessionList, SelectedNodes, ResizeHandle };
@@ -166,7 +171,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
166
171
  onResizeStart: $setup.handleResizeStart,
167
172
  onResizeEnd: $setup.handleResizeEnd
168
173
  }, null, 8, ["width", "min-width", "max-width", "position"])) : _createCommentVNode("v-if", true),
169
- $props.mode === "split" ? (_openBlock(), _createElementBlock("button", {
174
+ $props.mode === "split" && $props.resizable ? (_openBlock(), _createElementBlock("button", {
170
175
  key: 1,
171
176
  type: "button",
172
177
  class: _normalizeClass(["opencode-split-toggle-btn", { open: $setup.props.open, thinking: $setup.props.thinking, "opencode-theme-dark": $props.resolvedTheme === "dark", "split-left": $props.splitPosition === "left" }]),
@@ -1 +1 @@
1
- .opencode-iframe-container{flex:1;position:relative;overflow:hidden;display:flex;flex-direction:column;margin-top:-42px}.opencode-loading-overlay{position:absolute;inset:0;background:var(--oc-overlay-bg);display:none;flex-direction:column;align-items:center;justify-content:center;z-index:10;transition:opacity .3s ease}.opencode-loading-overlay.visible{display:flex}.opencode-loading-spinner{width:40px;height:40px;border:3px solid var(--oc-border-primary);border-top-color:var(--oc-primary);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.opencode-loading-text{margin-top:12px;font-size:14px;color:var(--oc-text-placeholder)}.opencode-error-overlay{position:absolute;inset:0;z-index:15;margin-top:42px;display:none}.opencode-error-overlay.visible{display:flex}.opencode-empty-state-overlay{position:absolute;inset:0;background:var(--oc-bg-secondary);display:none;flex-direction:column;align-items:center;justify-content:center;z-index:5;transition:opacity .3s ease;margin-top:42px}.opencode-empty-state-overlay.visible{display:flex}.opencode-empty-state-icon{color:var(--oc-text-placeholder);margin-bottom:16px}.opencode-empty-state-text{color:var(--oc-text-primary);font-size:16px;font-weight:500;margin-bottom:24px}.opencode-empty-state-btn{padding:10px 24px;border-radius:8px;border:none;background:var(--oc-primary);color:#fff;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s;box-shadow:var(--oc-shadow-primary)}.opencode-empty-state-btn:hover{background:var(--oc-primary-hover);transform:translateY(-1px);box-shadow:var(--oc-shadow-primary-hover)}.opencode-empty-state-btn:active{transform:translateY(0)}.opencode-iframe{width:100%;height:100%;border:none}
1
+ .opencode-iframe-container{flex:1;position:relative;overflow:hidden;display:flex;flex-direction:column}.opencode-loading-overlay{position:absolute;inset:0;background:var(--oc-overlay-bg);display:none;flex-direction:column;align-items:center;justify-content:center;z-index:10;transition:opacity .3s ease}.opencode-loading-overlay.visible{display:flex}.opencode-loading-spinner{width:40px;height:40px;border:3px solid var(--oc-border-primary);border-top-color:var(--oc-primary);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.opencode-loading-text{margin-top:12px;font-size:14px;color:var(--oc-text-placeholder)}.opencode-error-overlay{position:absolute;inset:0;z-index:15;display:none}.opencode-error-overlay.visible{display:flex}.opencode-empty-state-overlay{position:absolute;inset:0;background:var(--oc-bg-secondary);display:none;flex-direction:column;align-items:center;justify-content:center;z-index:5;transition:opacity .3s ease}.opencode-empty-state-overlay.visible{display:flex}.opencode-empty-state-icon{color:var(--oc-text-placeholder);margin-bottom:16px}.opencode-empty-state-text{color:var(--oc-text-primary);font-size:16px;font-weight:500;margin-bottom:24px}.opencode-empty-state-btn{padding:10px 24px;border-radius:8px;border:none;background:var(--oc-primary);color:#fff;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s;box-shadow:var(--oc-shadow-primary)}.opencode-empty-state-btn:hover{background:var(--oc-primary-hover);transform:translateY(-1px);box-shadow:var(--oc-shadow-primary-hover)}.opencode-empty-state-btn:active{transform:translateY(0)}.opencode-iframe{width:100%;height:100%;border:none}
@@ -26,7 +26,8 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
26
26
  handleToggleSplitPosition,
27
27
  handleClose,
28
28
  handleToggleMinimize,
29
- handleTogglePromptDock
29
+ handleTogglePromptDock,
30
+ handleRefresh
30
31
  } = useOpenCodeWidgetContext();
31
32
  const isSplitMode = computed(() => mode.value === "split");
32
33
  const themeIconTitle = computed(() => {
@@ -49,7 +50,9 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
49
50
  const displayModeLabels = {
50
51
  bubble: "\u6C14\u6CE1\u6A21\u5F0F",
51
52
  split: "\u5206\u5C4F\u6A21\u5F0F",
52
- auto: "\u81EA\u52A8\u6A21\u5F0F"
53
+ auto: "\u81EA\u52A8\u6A21\u5F0F",
54
+ extension: "\u6269\u5C55\u6A21\u5F0F",
55
+ "extension-selector": "\u6269\u5C55\u9009\u62E9\u5668\u6A21\u5F0F"
53
56
  };
54
57
  return `\u5C55\u793A\u6A21\u5F0F: ${displayModeLabels[displayMode.value]}`;
55
58
  });
@@ -57,7 +60,9 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
57
60
  const displayModeLabels = {
58
61
  bubble: "\u6C14\u6CE1\u6A21\u5F0F",
59
62
  split: "\u5206\u5C4F\u6A21\u5F0F",
60
- auto: "\u81EA\u52A8\u6A21\u5F0F"
63
+ auto: "\u81EA\u52A8\u6A21\u5F0F",
64
+ extension: "\u6269\u5C55\u6A21\u5F0F",
65
+ "extension-selector": "\u6269\u5C55\u9009\u62E9\u5668\u6A21\u5F0F"
61
66
  };
62
67
  const modes = ["bubble", "split", "auto"];
63
68
  const currentIndex = modes.indexOf(displayMode.value);
@@ -75,7 +80,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
75
80
  const nextPosition = splitPosition.value === "right" ? "\u5DE6\u4FA7" : "\u53F3\u4FA7";
76
81
  return `\u5207\u6362\u5206\u680F\u4F4D\u7F6E - \u4E0B\u4E00\u4E2A: ${nextPosition}`;
77
82
  });
78
- 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 };
83
+ const __returned__ = { title, sessionListTitle, sessionListCollapsed, selectMode, selectEnabled, theme, resolvedTheme, minimized, promptDockVisible, mode, displayMode, splitPosition, handleToggleSessionList, handleToggleSelectMode, handleToggleTheme, handleToggleDisplayMode, handleToggleSplitPosition, handleClose, handleToggleMinimize, handleTogglePromptDock, handleRefresh, isSplitMode, themeIconTitle, themeIconLabel, displayModeIconTitle, displayModeIconLabel, splitPositionIconTitle, splitPositionIconLabel };
79
84
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
80
85
  return __returned__;
81
86
  }
@@ -204,7 +209,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
204
209
  onClick: _cache[0] || (_cache[0] = (...args) => $setup.handleToggleSessionList && $setup.handleToggleSessionList(...args))
205
210
  }, [
206
211
  _renderSlot(_ctx.$slots, "session-toggle-icon", {}, () => [
207
- _cache[8] || (_cache[8] = _createElementVNode(
212
+ _cache[9] || (_cache[9] = _createElementVNode(
208
213
  "svg",
209
214
  {
210
215
  viewBox: "0 0 24 24",
@@ -236,7 +241,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
236
241
  onClick: _cache[1] || (_cache[1] = (...args) => $setup.handleToggleSelectMode && $setup.handleToggleSelectMode(...args))
237
242
  }, [
238
243
  _renderSlot(_ctx.$slots, "select-icon", {}, () => [
239
- _cache[9] || (_cache[9] = _createElementVNode(
244
+ _cache[10] || (_cache[10] = _createElementVNode(
240
245
  "svg",
241
246
  {
242
247
  viewBox: "0 0 1024 1024",
@@ -267,9 +272,9 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
267
272
  onClick: _cache[2] || (_cache[2] = (...args) => $setup.handleToggleTheme && $setup.handleToggleTheme(...args))
268
273
  }, [
269
274
  _renderSlot(_ctx.$slots, "theme-icon", {}, () => [
270
- $setup.theme === "light" ? (_openBlock(), _createElementBlock("svg", _hoisted_6, [..._cache[10] || (_cache[10] = [
275
+ $setup.theme === "light" ? (_openBlock(), _createElementBlock("svg", _hoisted_6, [..._cache[11] || (_cache[11] = [
271
276
  _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)
272
- ])])) : $setup.theme === "dark" ? (_openBlock(), _createElementBlock("svg", _hoisted_7, [..._cache[11] || (_cache[11] = [
277
+ ])])) : $setup.theme === "dark" ? (_openBlock(), _createElementBlock("svg", _hoisted_7, [..._cache[12] || (_cache[12] = [
273
278
  _createElementVNode(
274
279
  "path",
275
280
  { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" },
@@ -277,12 +282,13 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
277
282
  -1
278
283
  /* CACHED */
279
284
  )
280
- ])])) : (_openBlock(), _createElementBlock("svg", _hoisted_8, [..._cache[12] || (_cache[12] = [
285
+ ])])) : (_openBlock(), _createElementBlock("svg", _hoisted_8, [..._cache[13] || (_cache[13] = [
281
286
  _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)
282
287
  ])]))
283
288
  ])
284
289
  ], 8, _hoisted_5),
285
- _createElementVNode("button", {
290
+ $setup.displayMode !== "extension" ? (_openBlock(), _createElementBlock("button", {
291
+ key: 0,
286
292
  class: "opencode-header-btn display-mode-btn",
287
293
  type: "button",
288
294
  title: $setup.displayModeIconTitle,
@@ -290,7 +296,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
290
296
  onClick: _cache[3] || (_cache[3] = (...args) => $setup.handleToggleDisplayMode && $setup.handleToggleDisplayMode(...args))
291
297
  }, [
292
298
  _renderSlot(_ctx.$slots, "display-mode-icon", {}, () => [
293
- $setup.displayMode === "bubble" ? (_openBlock(), _createElementBlock("svg", _hoisted_10, [..._cache[13] || (_cache[13] = [
299
+ $setup.displayMode === "bubble" ? (_openBlock(), _createElementBlock("svg", _hoisted_10, [..._cache[14] || (_cache[14] = [
294
300
  _createElementVNode(
295
301
  "circle",
296
302
  {
@@ -338,7 +344,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
338
344
  -1
339
345
  /* CACHED */
340
346
  )
341
- ])])) : $setup.displayMode === "split" ? (_openBlock(), _createElementBlock("svg", _hoisted_11, [..._cache[14] || (_cache[14] = [
347
+ ])])) : $setup.displayMode === "split" ? (_openBlock(), _createElementBlock("svg", _hoisted_11, [..._cache[15] || (_cache[15] = [
342
348
  _createElementVNode(
343
349
  "rect",
344
350
  {
@@ -364,7 +370,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
364
370
  -1
365
371
  /* CACHED */
366
372
  )
367
- ])])) : (_openBlock(), _createElementBlock("svg", _hoisted_12, [..._cache[15] || (_cache[15] = [
373
+ ])])) : (_openBlock(), _createElementBlock("svg", _hoisted_12, [..._cache[16] || (_cache[16] = [
368
374
  _createElementVNode(
369
375
  "rect",
370
376
  {
@@ -417,7 +423,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
417
423
  )
418
424
  ])]))
419
425
  ])
420
- ], 8, _hoisted_9)
426
+ ], 8, _hoisted_9)) : _createCommentVNode("v-if", true)
421
427
  ]),
422
428
  _createElementVNode(
423
429
  "span",
@@ -427,16 +433,43 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
427
433
  /* TEXT */
428
434
  ),
429
435
  _createElementVNode("div", _hoisted_14, [
430
- $setup.isSplitMode ? (_openBlock(), _createElementBlock("button", {
436
+ $setup.displayMode === "extension" ? (_openBlock(), _createElementBlock("button", {
431
437
  key: 0,
438
+ class: "opencode-header-btn refresh-btn",
439
+ type: "button",
440
+ title: "\u5237\u65B0\u9762\u677F",
441
+ "aria-label": "\u5237\u65B0\u9762\u677F",
442
+ onClick: _cache[4] || (_cache[4] = (...args) => $setup.handleRefresh && $setup.handleRefresh(...args))
443
+ }, [..._cache[17] || (_cache[17] = [
444
+ _createElementVNode(
445
+ "svg",
446
+ {
447
+ viewBox: "0 0 24 24",
448
+ width: "16",
449
+ height: "16",
450
+ fill: "none",
451
+ stroke: "currentColor",
452
+ "stroke-width": "2",
453
+ "aria-hidden": "true"
454
+ },
455
+ [
456
+ _createElementVNode("polyline", { points: "23,4 23,10 17,10" }),
457
+ _createElementVNode("path", { d: "M20.49 15a9 9 0 1 1-2.12-9.36L23 10" })
458
+ ],
459
+ -1
460
+ /* CACHED */
461
+ )
462
+ ])])) : _createCommentVNode("v-if", true),
463
+ $setup.isSplitMode && $setup.displayMode !== "extension" ? (_openBlock(), _createElementBlock("button", {
464
+ key: 1,
432
465
  class: "opencode-header-btn split-position-btn",
433
466
  type: "button",
434
467
  title: $setup.splitPositionIconTitle,
435
468
  "aria-label": $setup.splitPositionIconLabel,
436
- onClick: _cache[4] || (_cache[4] = (...args) => $setup.handleToggleSplitPosition && $setup.handleToggleSplitPosition(...args))
469
+ onClick: _cache[5] || (_cache[5] = (...args) => $setup.handleToggleSplitPosition && $setup.handleToggleSplitPosition(...args))
437
470
  }, [
438
471
  _renderSlot(_ctx.$slots, "split-position-icon", {}, () => [
439
- $setup.splitPosition === "right" ? (_openBlock(), _createElementBlock("svg", _hoisted_16, [..._cache[16] || (_cache[16] = [
472
+ $setup.splitPosition === "right" ? (_openBlock(), _createElementBlock("svg", _hoisted_16, [..._cache[18] || (_cache[18] = [
440
473
  _createElementVNode(
441
474
  "rect",
442
475
  {
@@ -462,7 +495,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
462
495
  -1
463
496
  /* CACHED */
464
497
  )
465
- ])])) : (_openBlock(), _createElementBlock("svg", _hoisted_17, [..._cache[17] || (_cache[17] = [
498
+ ])])) : (_openBlock(), _createElementBlock("svg", _hoisted_17, [..._cache[19] || (_cache[19] = [
466
499
  _createElementVNode(
467
500
  "rect",
468
501
  {
@@ -492,16 +525,16 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
492
525
  ])
493
526
  ], 8, _hoisted_15)) : _createCommentVNode("v-if", true),
494
527
  !$setup.isSplitMode ? (_openBlock(), _createElementBlock("button", {
495
- key: 1,
528
+ key: 2,
496
529
  class: "opencode-header-btn prompt-dock",
497
530
  type: "button",
498
531
  title: $setup.promptDockVisible ? "\u9690\u85CF\u5BF9\u8BDD\u6846" : "\u663E\u793A\u5BF9\u8BDD\u6846",
499
532
  "aria-label": $setup.promptDockVisible ? "\u9690\u85CF\u5BF9\u8BDD\u6846" : "\u663E\u793A\u5BF9\u8BDD\u6846",
500
533
  "aria-pressed": $setup.promptDockVisible,
501
- onClick: _cache[5] || (_cache[5] = (...args) => $setup.handleTogglePromptDock && $setup.handleTogglePromptDock(...args))
534
+ onClick: _cache[6] || (_cache[6] = (...args) => $setup.handleTogglePromptDock && $setup.handleTogglePromptDock(...args))
502
535
  }, [
503
536
  _renderSlot(_ctx.$slots, "prompt-dock-icon", {}, () => [
504
- _cache[18] || (_cache[18] = _createElementVNode(
537
+ _cache[20] || (_cache[20] = _createElementVNode(
505
538
  "svg",
506
539
  {
507
540
  viewBox: "0 0 24 24",
@@ -521,16 +554,16 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
521
554
  ])
522
555
  ], 8, _hoisted_18)) : _createCommentVNode("v-if", true),
523
556
  !$setup.isSplitMode ? (_openBlock(), _createElementBlock("button", {
524
- key: 2,
557
+ key: 3,
525
558
  class: "opencode-header-btn minimize",
526
559
  type: "button",
527
560
  title: $setup.minimized ? "\u5C55\u5F00" : "\u6700\u5C0F\u5316",
528
561
  "aria-label": $setup.minimized ? "\u5C55\u5F00\u9762\u677F" : "\u6700\u5C0F\u5316\u9762\u677F",
529
562
  "aria-pressed": $setup.minimized,
530
- onClick: _cache[6] || (_cache[6] = (...args) => $setup.handleToggleMinimize && $setup.handleToggleMinimize(...args))
563
+ onClick: _cache[7] || (_cache[7] = (...args) => $setup.handleToggleMinimize && $setup.handleToggleMinimize(...args))
531
564
  }, [
532
565
  _renderSlot(_ctx.$slots, "minimize-icon", {}, () => [
533
- $setup.minimized ? (_openBlock(), _createElementBlock("svg", _hoisted_20, [..._cache[19] || (_cache[19] = [
566
+ $setup.minimized ? (_openBlock(), _createElementBlock("svg", _hoisted_20, [..._cache[21] || (_cache[21] = [
534
567
  _createElementVNode(
535
568
  "path",
536
569
  { 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" },
@@ -538,7 +571,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
538
571
  -1
539
572
  /* CACHED */
540
573
  )
541
- ])])) : (_openBlock(), _createElementBlock("svg", _hoisted_21, [..._cache[20] || (_cache[20] = [
574
+ ])])) : (_openBlock(), _createElementBlock("svg", _hoisted_21, [..._cache[22] || (_cache[22] = [
542
575
  _createElementVNode(
543
576
  "path",
544
577
  { 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" },
@@ -550,15 +583,15 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
550
583
  ])
551
584
  ], 8, _hoisted_19)) : _createCommentVNode("v-if", true),
552
585
  !$setup.isSplitMode ? (_openBlock(), _createElementBlock("button", {
553
- key: 3,
586
+ key: 4,
554
587
  class: "opencode-header-btn close",
555
588
  type: "button",
556
589
  title: "\u5173\u95ED",
557
590
  "aria-label": "\u5173\u95ED\u9762\u677F",
558
- onClick: _cache[7] || (_cache[7] = (...args) => $setup.handleClose && $setup.handleClose(...args))
591
+ onClick: _cache[8] || (_cache[8] = (...args) => $setup.handleClose && $setup.handleClose(...args))
559
592
  }, [
560
593
  _renderSlot(_ctx.$slots, "close-icon", {}, () => [
561
- _cache[21] || (_cache[21] = _createElementVNode(
594
+ _cache[23] || (_cache[23] = _createElementVNode(
562
595
  "svg",
563
596
  {
564
597
  viewBox: "0 0 24 24",
@@ -57,6 +57,7 @@ export interface OpenCodeWidgetContext {
57
57
  handleClearSelectedNodes: () => void;
58
58
  handleFrameLoaded: () => void;
59
59
  handleBubbleOffsetChange: (offset: FloatingBubbleOffset | undefined) => void;
60
+ handleRefresh: () => void;
60
61
  }
61
62
  export declare function provideOpenCodeWidgetContext(context: OpenCodeWidgetContext): void;
62
63
  export declare function useOpenCodeWidgetContext(): OpenCodeWidgetContext;
@@ -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: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 #3b82f666,0 0 0 2px #3b82f633;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;inset: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 #3b82f666,0 0 0 2px #3b82f633;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)}
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 #3b82f666,0 0 0 2px #3b82f633;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;inset: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 #3b82f666,0 0 0 2px #3b82f633;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)}.opencode-widget.extension-mode{position:static;width:100%;height:100%;display:flex}
@@ -56,6 +56,7 @@ declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps
56
56
  currentSessionId: string | null;
57
57
  selectedElements: import("@vite-plugin-opencode-assistant/shared").OpenCodeSelectedElement[];
58
58
  splitMode: import("@vite-plugin-opencode-assistant/shared").SplitModeOptions;
59
+ hideBubble: boolean;
59
60
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
60
61
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
61
62
  export default _default;