@vite-plugin-opencode-assistant/components 1.0.16 → 1.0.17

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.16";
3
+ declare const version = "1.0.17";
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.16";
2
+ const version = "1.0.17";
3
3
  function install(app, options) {
4
4
  const components = [
5
5
  OpenCodeWidget
@@ -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-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-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,26 +1,29 @@
1
1
  import type { OpenCodeWidgetProps } from "./types";
2
- declare var __VLS_4: {}, __VLS_12: {}, __VLS_14: {}, __VLS_16: {}, __VLS_21: {}, __VLS_28: {}, __VLS_30: {}, __VLS_32: {}, __VLS_34: {};
2
+ declare var __VLS_4: {}, __VLS_9: {}, __VLS_11: {}, __VLS_13: {}, __VLS_18: {}, __VLS_25: {}, __VLS_27: {}, __VLS_29: {}, __VLS_31: {};
3
3
  type __VLS_Slots = {} & {
4
4
  'button-icon'?: (props: typeof __VLS_4) => any;
5
5
  } & {
6
- 'session-toggle-icon'?: (props: typeof __VLS_12) => any;
6
+ 'session-toggle-icon'?: (props: typeof __VLS_9) => any;
7
7
  } & {
8
- 'select-icon'?: (props: typeof __VLS_14) => any;
8
+ 'select-icon'?: (props: typeof __VLS_11) => any;
9
9
  } & {
10
- 'close-icon'?: (props: typeof __VLS_16) => any;
10
+ 'close-icon'?: (props: typeof __VLS_13) => any;
11
11
  } & {
12
- 'sessions-empty'?: (props: typeof __VLS_21) => any;
12
+ 'sessions-empty'?: (props: typeof __VLS_18) => any;
13
13
  } & {
14
- 'empty-state'?: (props: typeof __VLS_28) => any;
14
+ 'empty-state'?: (props: typeof __VLS_25) => any;
15
15
  } & {
16
- loading?: (props: typeof __VLS_30) => any;
16
+ loading?: (props: typeof __VLS_27) => any;
17
17
  } & {
18
- error?: (props: typeof __VLS_32) => any;
18
+ error?: (props: typeof __VLS_29) => any;
19
19
  } & {
20
- content?: (props: typeof __VLS_34) => any;
20
+ content?: (props: typeof __VLS_31) => any;
21
21
  };
22
22
  declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps, {
23
- showNotification: (message: string, duration?: number) => void;
23
+ showNotification: (message: string, options?: {
24
+ duration?: number;
25
+ mode?: "widget" | "page";
26
+ }) => void;
24
27
  showConfirmDialog: (message: string) => Promise<boolean>;
25
28
  sendMessageToIframe: (type: string, data?: Record<string, unknown>) => void;
26
29
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
@@ -23,7 +23,6 @@ import { useSlots, toRef, ref, watch } from "vue";
23
23
  import Frame from "./components/Frame.vue.js";
24
24
  import Header from "./components/Header.vue.js";
25
25
  import SelectHint from "./components/SelectHint.vue.js";
26
- import SelectedBubbles from "./components/SelectedBubbles.vue.js";
27
26
  import SelectedNodes from "./components/SelectedNodes.vue.js";
28
27
  import SessionList from "./components/SessionList.vue.js";
29
28
  import Trigger from "./components/Trigger.vue.js";
@@ -68,10 +67,13 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
68
67
  const slots = useSlots();
69
68
  const notificationMessage = ref("");
70
69
  const notificationVisible = ref(false);
70
+ const notificationMode = ref("widget");
71
71
  let notificationTimer = null;
72
- const showNotification = (message, duration = 3e3) => {
72
+ const showNotification = (message, options) => {
73
+ const { duration = 3e3, mode = "widget" } = options || {};
73
74
  notificationMessage.value = message;
74
75
  notificationVisible.value = true;
76
+ notificationMode.value = mode;
75
77
  if (notificationTimer) clearTimeout(notificationTimer);
76
78
  notificationTimer = setTimeout(() => {
77
79
  notificationVisible.value = false;
@@ -247,7 +249,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
247
249
  handleClearSelectedNodes,
248
250
  handleFrameLoaded
249
251
  });
250
- const __returned__ = { props, emit, slots, notificationMessage, notificationVisible, get notificationTimer() {
252
+ const __returned__ = { props, emit, slots, notificationMessage, notificationVisible, notificationMode, get notificationTimer() {
251
253
  return notificationTimer;
252
254
  }, set notificationTimer(v) {
253
255
  notificationTimer = v;
@@ -255,12 +257,12 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
255
257
  return dialogResolve;
256
258
  }, set dialogResolve(v) {
257
259
  dialogResolve = v;
258
- }, 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, SelectedBubbles, SelectedNodes, SessionList, Trigger };
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 };
259
261
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
260
262
  return __returned__;
261
263
  }
262
264
  }));
263
- import { renderSlot as _renderSlot, withCtx as _withCtx, createSlots as _createSlots, createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, vShow as _vShow, normalizeClass as _normalizeClass, withDirectives as _withDirectives, normalizeStyle as _normalizeStyle } from "vue";
265
+ import { renderSlot as _renderSlot, withCtx as _withCtx, createSlots as _createSlots, createVNode as _createVNode, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, vShow as _vShow, normalizeClass as _normalizeClass, withDirectives as _withDirectives, normalizeStyle as _normalizeStyle, Teleport as _Teleport, createBlock as _createBlock } from "vue";
264
266
  const _hoisted_1 = {
265
267
  key: 0,
266
268
  class: "opencode-notification",
@@ -270,7 +272,7 @@ const _hoisted_2 = { class: "opencode-chat-content" };
270
272
  const _hoisted_3 = { class: "opencode-tooltip-tag" };
271
273
  const _hoisted_4 = { class: "opencode-tooltip-file" };
272
274
  const _hoisted_5 = {
273
- key: 1,
275
+ key: 0,
274
276
  class: "opencode-dialog-overlay"
275
277
  };
276
278
  const _hoisted_6 = {
@@ -280,6 +282,11 @@ const _hoisted_6 = {
280
282
  };
281
283
  const _hoisted_7 = { class: "opencode-dialog-content" };
282
284
  const _hoisted_8 = { class: "opencode-dialog-message" };
285
+ const _hoisted_9 = {
286
+ key: 0,
287
+ class: "opencode-page-notification",
288
+ role: "alert"
289
+ };
283
290
  function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
284
291
  return _openBlock(), _createElementBlock(
285
292
  "div",
@@ -305,7 +312,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
305
312
  1024
306
313
  /* DYNAMIC_SLOTS */
307
314
  ),
308
- $setup.bubbleVisible ? (_openBlock(), _createBlock($setup["SelectedBubbles"], { key: 0 })) : _createCommentVNode("v-if", true),
315
+ _createCommentVNode(' <SelectedBubbles v-if="bubbleVisible" /> '),
309
316
  _withDirectives(_createElementVNode(
310
317
  "div",
311
318
  {
@@ -345,7 +352,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
345
352
  /* DYNAMIC_SLOTS */
346
353
  ),
347
354
  _createCommentVNode(" Notification "),
348
- $setup.notificationVisible ? (_openBlock(), _createElementBlock(
355
+ $setup.notificationVisible && $setup.notificationMode === "widget" ? (_openBlock(), _createElementBlock(
349
356
  "div",
350
357
  _hoisted_1,
351
358
  _toDisplayString($setup.notificationMessage),
@@ -484,7 +491,17 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
484
491
  }, "\u786E\u8BA4")
485
492
  ])
486
493
  ])
487
- ])) : _createCommentVNode("v-if", true)
494
+ ])) : _createCommentVNode("v-if", true),
495
+ _createCommentVNode(" Page-level Notification "),
496
+ (_openBlock(), _createBlock(_Teleport, { to: "body" }, [
497
+ $setup.notificationVisible && $setup.notificationMode === "page" ? (_openBlock(), _createElementBlock(
498
+ "div",
499
+ _hoisted_9,
500
+ _toDisplayString($setup.notificationMessage),
501
+ 1
502
+ /* TEXT */
503
+ )) : _createCommentVNode("v-if", true)
504
+ ]))
488
505
  ],
489
506
  2
490
507
  /* CLASS */
@@ -33,7 +33,7 @@ var __spreadValues$1 = (a, b) => {
33
33
  }
34
34
  return a;
35
35
  };
36
- var __vue_sfc__$7 = /* @__PURE__ */ (0, vue.defineComponent)({
36
+ var __vue_sfc__$6 = /* @__PURE__ */ (0, vue.defineComponent)({
37
37
  __name: "Frame",
38
38
  setup(__props, { expose: __expose }) {
39
39
  const iframeRef = (0, vue.ref)(null);
@@ -68,11 +68,11 @@ var __vue_sfc__$7 = /* @__PURE__ */ (0, vue.defineComponent)({
68
68
  return __returned__;
69
69
  }
70
70
  });
71
- var _hoisted_1$7 = { class: "opencode-iframe-container" };
72
- var _hoisted_2$5 = { class: "opencode-empty-state-text" };
73
- var _hoisted_3$5 = ["src"];
74
- function __vue_render__$7(_ctx, _cache, $props, $setup, $data, $options) {
75
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$7, [
71
+ var _hoisted_1$6 = { class: "opencode-iframe-container" };
72
+ var _hoisted_2$4 = { class: "opencode-empty-state-text" };
73
+ var _hoisted_3$4 = ["src"];
74
+ function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
75
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$6, [
76
76
  (0, vue.createElementVNode)("div", { class: (0, vue.normalizeClass)(["opencode-empty-state-overlay", { visible: $setup.showEmptyState }]) }, [(0, vue.renderSlot)(_ctx.$slots, "empty-state", {}, () => [
77
77
  _cache[1] || (_cache[1] = (0, vue.createElementVNode)("div", { class: "opencode-empty-state-icon" }, [(0, vue.createElementVNode)("svg", {
78
78
  viewBox: "0 0 24 24",
@@ -87,7 +87,7 @@ function __vue_render__$7(_ctx, _cache, $props, $setup, $data, $options) {
87
87
  "stroke-linejoin": "round",
88
88
  d: "M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 0 1-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"
89
89
  })])], -1)),
90
- (0, vue.createElementVNode)("div", _hoisted_2$5, (0, vue.toDisplayString)($setup.emptyStateText), 1),
90
+ (0, vue.createElementVNode)("div", _hoisted_2$4, (0, vue.toDisplayString)($setup.emptyStateText), 1),
91
91
  (0, vue.createElementVNode)("button", {
92
92
  class: "opencode-empty-state-btn",
93
93
  type: "button",
@@ -102,14 +102,14 @@ function __vue_render__$7(_ctx, _cache, $props, $setup, $data, $options) {
102
102
  src: $setup.iframeSrc,
103
103
  allow: "clipboard-write; clipboard-read",
104
104
  referrerpolicy: "origin"
105
- }, null, 8, _hoisted_3$5)])
105
+ }, null, 8, _hoisted_3$4)])
106
106
  ]);
107
107
  }
108
- __vue_sfc__$7.render = __vue_render__$7;
109
- var Frame_vue_default = __vue_sfc__$7;
108
+ __vue_sfc__$6.render = __vue_render__$6;
109
+ var Frame_vue_default = __vue_sfc__$6;
110
110
  //#endregion
111
111
  //#region es/open-code-widget/src/components/Header.vue.js
112
- var __vue_sfc__$6 = /* @__PURE__ */ (0, vue.defineComponent)({
112
+ var __vue_sfc__$5 = /* @__PURE__ */ (0, vue.defineComponent)({
113
113
  __name: "Header",
114
114
  setup(__props, { expose: __expose }) {
115
115
  __expose();
@@ -148,15 +148,15 @@ var __vue_sfc__$6 = /* @__PURE__ */ (0, vue.defineComponent)({
148
148
  return __returned__;
149
149
  }
150
150
  });
151
- var _hoisted_1$6 = { class: "opencode-chat-header" };
152
- var _hoisted_2$4 = { class: "opencode-chat-header-left" };
153
- var _hoisted_3$4 = [
151
+ var _hoisted_1$5 = { class: "opencode-chat-header" };
152
+ var _hoisted_2$3 = { class: "opencode-chat-header-left" };
153
+ var _hoisted_3$3 = [
154
154
  "title",
155
155
  "aria-label",
156
156
  "aria-expanded"
157
157
  ];
158
- var _hoisted_4$4 = ["aria-pressed", "disabled"];
159
- var _hoisted_5$4 = ["title", "aria-label"];
158
+ var _hoisted_4$3 = ["aria-pressed", "disabled"];
159
+ var _hoisted_5$3 = ["title", "aria-label"];
160
160
  var _hoisted_6$3 = {
161
161
  key: 0,
162
162
  viewBox: "0 0 24 24",
@@ -187,11 +187,11 @@ var _hoisted_8$2 = {
187
187
  "stroke-width": "2",
188
188
  "aria-hidden": "true"
189
189
  };
190
- var _hoisted_9$1 = { class: "opencode-chat-header-title" };
190
+ var _hoisted_9$2 = { class: "opencode-chat-header-title" };
191
191
  var _hoisted_10 = { class: "opencode-chat-header-actions" };
192
- function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
193
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$6, [
194
- (0, vue.createElementVNode)("div", _hoisted_2$4, [
192
+ function __vue_render__$5(_ctx, _cache, $props, $setup, $data, $options) {
193
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$5, [
194
+ (0, vue.createElementVNode)("div", _hoisted_2$3, [
195
195
  (0, vue.createElementVNode)("button", {
196
196
  class: (0, vue.normalizeClass)(["opencode-header-btn session-toggle", { active: !$setup.sessionListCollapsed }]),
197
197
  type: "button",
@@ -210,7 +210,7 @@ function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
210
210
  }, [(0, vue.createElementVNode)("path", {
211
211
  d: "M4 6h16M4 12h16M4 18h16",
212
212
  "stroke-linecap": "round"
213
- })], -1))])], 10, _hoisted_3$4),
213
+ })], -1))])], 10, _hoisted_3$3),
214
214
  (0, vue.createElementVNode)("button", {
215
215
  class: (0, vue.normalizeClass)(["opencode-header-btn select-btn", { active: $setup.selectMode }]),
216
216
  type: "button",
@@ -230,16 +230,16 @@ function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
230
230
  }), (0, vue.createElementVNode)("path", {
231
231
  fill: "currentColor",
232
232
  d: "M512 96a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V128a32 32 0 0 1 32-32m0 576a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V704a32 32 0 0 1 32-32M96 512a32 32 0 0 1 32-32h192a32 32 0 0 1 0 64H128a32 32 0 0 1-32-32m576 0a32 32 0 0 1 32-32h192a32 32 0 1 1 0 64H704a32 32 0 0 1-32-32"
233
- })], -1))])], 10, _hoisted_4$4),
233
+ })], -1))])], 10, _hoisted_4$3),
234
234
  (0, vue.createElementVNode)("button", {
235
235
  class: "opencode-header-btn theme-btn",
236
236
  type: "button",
237
237
  title: $setup.themeIconTitle,
238
238
  "aria-label": $setup.themeIconLabel,
239
239
  onClick: _cache[2] || (_cache[2] = (...args) => $setup.handleToggleTheme && $setup.handleToggleTheme(...args))
240
- }, [(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$4)
240
+ }, [(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)
241
241
  ]),
242
- (0, vue.createElementVNode)("span", _hoisted_9$1, (0, vue.toDisplayString)($setup.title), 1),
242
+ (0, vue.createElementVNode)("span", _hoisted_9$2, (0, vue.toDisplayString)($setup.title), 1),
243
243
  (0, vue.createElementVNode)("div", _hoisted_10, [(0, vue.createElementVNode)("button", {
244
244
  class: "opencode-header-btn close",
245
245
  type: "button",
@@ -257,11 +257,11 @@ function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
257
257
  }, [(0, vue.createElementVNode)("path", { d: "M18 6L6 18M6 6l12 12" })], -1))])])])
258
258
  ]);
259
259
  }
260
- __vue_sfc__$6.render = __vue_render__$6;
261
- var Header_vue_default = __vue_sfc__$6;
260
+ __vue_sfc__$5.render = __vue_render__$5;
261
+ var Header_vue_default = __vue_sfc__$5;
262
262
  //#endregion
263
263
  //#region es/open-code-widget/src/components/SelectHint.vue.js
264
- var __vue_sfc__$5 = /* @__PURE__ */ (0, vue.defineComponent)({
264
+ var __vue_sfc__$4 = /* @__PURE__ */ (0, vue.defineComponent)({
265
265
  __name: "SelectHint",
266
266
  setup(__props, { expose: __expose }) {
267
267
  __expose();
@@ -277,72 +277,12 @@ var __vue_sfc__$5 = /* @__PURE__ */ (0, vue.defineComponent)({
277
277
  return __returned__;
278
278
  }
279
279
  });
280
- var _hoisted_1$5 = { class: "opencode-hint-shortcut" };
281
- function __vue_render__$5(_ctx, _cache, $props, $setup, $data, $options) {
282
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", { class: (0, vue.normalizeClass)(["opencode-select-mode-hint", { visible: $setup.visible }]) }, [_cache[0] || (_cache[0] = (0, vue.createElementVNode)("span", null, "🎯 选择模式已开启 - 点击元素进行选择", -1)), (0, vue.createElementVNode)("span", _hoisted_1$5, (0, vue.toDisplayString)($setup.shortcutLabel), 1)], 2);
283
- }
284
- __vue_sfc__$5.render = __vue_render__$5;
285
- var SelectHint_vue_default = __vue_sfc__$5;
286
- //#endregion
287
- //#region es/open-code-widget/src/components/SelectedBubbles.vue.js
288
- var __vue_sfc__$4 = /* @__PURE__ */ (0, vue.defineComponent)({
289
- __name: "SelectedBubbles",
290
- setup(__props, { expose: __expose }) {
291
- __expose();
292
- const { bubbleVisible: visible, selectedElementItems: items, handleClickSelectedNode, handleRemoveSelectedNode } = useOpenCodeWidgetContext();
293
- const __returned__ = {
294
- visible,
295
- items,
296
- handleClickSelectedNode,
297
- handleRemoveSelectedNode
298
- };
299
- Object.defineProperty(__returned__, "__isScriptSetup", {
300
- enumerable: false,
301
- value: true
302
- });
303
- return __returned__;
304
- }
305
- });
306
- var _hoisted_1$4 = {
307
- key: 0,
308
- class: "opencode-bubble-empty"
309
- };
310
- var _hoisted_2$3 = ["onClick"];
311
- var _hoisted_3$3 = { class: "opencode-bubble-text" };
312
- var _hoisted_4$3 = {
313
- key: 0,
314
- class: "opencode-bubble-file"
315
- };
316
- var _hoisted_5$3 = ["aria-label", "onClick"];
280
+ var _hoisted_1$4 = { class: "opencode-hint-shortcut" };
317
281
  function __vue_render__$4(_ctx, _cache, $props, $setup, $data, $options) {
318
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
319
- class: (0, vue.normalizeClass)(["opencode-selected-bubbles", { visible: $setup.visible }]),
320
- role: "list",
321
- "aria-label": "已选元素列表"
322
- }, [$setup.items.length === 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$4, "暂无选中元素")) : ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, (0, vue.renderList)($setup.items, (item, index) => {
323
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
324
- key: item.key,
325
- class: "opencode-selected-bubble",
326
- role: "listitem",
327
- onClick: ($event) => $setup.handleClickSelectedNode(item)
328
- }, [
329
- (0, vue.createElementVNode)("span", _hoisted_3$3, (0, vue.toDisplayString)(item.description), 1),
330
- item.bubbleFileText ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_4$3, (0, vue.toDisplayString)(item.bubbleFileText), 1)) : (0, vue.createCommentVNode)("v-if", true),
331
- (0, vue.createElementVNode)("button", {
332
- class: "opencode-bubble-remove",
333
- type: "button",
334
- "aria-label": `\u79FB\u9664\u5143\u7D20: ${item.description}`,
335
- onClick: (0, vue.withModifiers)(($event) => $setup.handleRemoveSelectedNode({
336
- item,
337
- index,
338
- source: "bubble"
339
- }), ["stop"])
340
- }, " × ", 8, _hoisted_5$3)
341
- ], 8, _hoisted_2$3);
342
- }), 128))], 2);
282
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", { class: (0, vue.normalizeClass)(["opencode-select-mode-hint", { visible: $setup.visible }]) }, [_cache[0] || (_cache[0] = (0, vue.createElementVNode)("span", null, "🎯 选择模式已开启 - 点击元素进行选择", -1)), (0, vue.createElementVNode)("span", _hoisted_1$4, (0, vue.toDisplayString)($setup.shortcutLabel), 1)], 2);
343
283
  }
344
284
  __vue_sfc__$4.render = __vue_render__$4;
345
- var SelectedBubbles_vue_default = __vue_sfc__$4;
285
+ var SelectHint_vue_default = __vue_sfc__$4;
346
286
  //#endregion
347
287
  //#region es/open-code-widget/src/components/SelectedNodes.vue.js
348
288
  var __vue_sfc__$3 = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -471,7 +411,7 @@ var _hoisted_5$1 = ["aria-selected", "onClick"];
471
411
  var _hoisted_6$1 = { class: "opencode-session-header" };
472
412
  var _hoisted_7$1 = { class: "opencode-session-title" };
473
413
  var _hoisted_8$1 = ["aria-label", "onClick"];
474
- var _hoisted_9 = { class: "opencode-session-meta" };
414
+ var _hoisted_9$1 = { class: "opencode-session-meta" };
475
415
  function __vue_render__$2(_ctx, _cache, $props, $setup, $data, $options) {
476
416
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", { class: (0, vue.normalizeClass)(["opencode-session-list", { collapsed: $setup.collapsed }]) }, [
477
417
  (0, vue.createCommentVNode)(" Header "),
@@ -500,7 +440,7 @@ function __vue_render__$2(_ctx, _cache, $props, $setup, $data, $options) {
500
440
  type: "button",
501
441
  "aria-label": `\u5220\u9664\u4F1A\u8BDD: ${item.title}`,
502
442
  onClick: (0, vue.withModifiers)(($event) => $setup.handleDeleteSession(item), ["stop"])
503
- }, " × ", 8, _hoisted_8$1)]), (0, vue.createElementVNode)("div", _hoisted_9, (0, vue.toDisplayString)(item.meta), 1)], 10, _hoisted_5$1);
443
+ }, " × ", 8, _hoisted_8$1)]), (0, vue.createElementVNode)("div", _hoisted_9$1, (0, vue.toDisplayString)(item.meta), 1)], 10, _hoisted_5$1);
504
444
  }), 128)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 2 }, [(0, vue.createCommentVNode)(" Empty State "), (0, vue.renderSlot)(_ctx.$slots, "empty")], 64))])], 2112))
505
445
  ], 2);
506
446
  }
@@ -1188,10 +1128,13 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1188
1128
  const slots = (0, vue.useSlots)();
1189
1129
  const notificationMessage = (0, vue.ref)("");
1190
1130
  const notificationVisible = (0, vue.ref)(false);
1131
+ const notificationMode = (0, vue.ref)("widget");
1191
1132
  let notificationTimer = null;
1192
- const showNotification = (message, duration = 3e3) => {
1133
+ const showNotification = (message, options) => {
1134
+ const { duration = 3e3, mode = "widget" } = options || {};
1193
1135
  notificationMessage.value = message;
1194
1136
  notificationVisible.value = true;
1137
+ notificationMode.value = mode;
1195
1138
  if (notificationTimer) clearTimeout(notificationTimer);
1196
1139
  notificationTimer = setTimeout(() => {
1197
1140
  notificationVisible.value = false;
@@ -1351,6 +1294,7 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1351
1294
  slots,
1352
1295
  notificationMessage,
1353
1296
  notificationVisible,
1297
+ notificationMode,
1354
1298
  get notificationTimer() {
1355
1299
  return notificationTimer;
1356
1300
  },
@@ -1402,7 +1346,6 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
1402
1346
  Frame: Frame_vue_default,
1403
1347
  Header: Header_vue_default,
1404
1348
  SelectHint: SelectHint_vue_default,
1405
- SelectedBubbles: SelectedBubbles_vue_default,
1406
1349
  SelectedNodes: SelectedNodes_vue_default,
1407
1350
  SessionList: SessionList_vue_default,
1408
1351
  Trigger: Trigger_vue_default
@@ -1423,7 +1366,7 @@ var _hoisted_2 = { class: "opencode-chat-content" };
1423
1366
  var _hoisted_3 = { class: "opencode-tooltip-tag" };
1424
1367
  var _hoisted_4 = { class: "opencode-tooltip-file" };
1425
1368
  var _hoisted_5 = {
1426
- key: 1,
1369
+ key: 0,
1427
1370
  class: "opencode-dialog-overlay"
1428
1371
  };
1429
1372
  var _hoisted_6 = {
@@ -1433,6 +1376,11 @@ var _hoisted_6 = {
1433
1376
  };
1434
1377
  var _hoisted_7 = { class: "opencode-dialog-content" };
1435
1378
  var _hoisted_8 = { class: "opencode-dialog-message" };
1379
+ var _hoisted_9 = {
1380
+ key: 0,
1381
+ class: "opencode-page-notification",
1382
+ role: "alert"
1383
+ };
1436
1384
  function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
1437
1385
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", { class: (0, vue.normalizeClass)($setup.containerClasses) }, [
1438
1386
  (0, vue.createVNode)($setup["Trigger"], null, (0, vue.createSlots)({ _: 2 }, [$setup.slots["button-icon"] ? {
@@ -1440,7 +1388,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
1440
1388
  fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "button-icon")]),
1441
1389
  key: "0"
1442
1390
  } : void 0]), 1024),
1443
- $setup.bubbleVisible ? ((0, vue.openBlock)(), (0, vue.createBlock)($setup["SelectedBubbles"], { key: 0 })) : (0, vue.createCommentVNode)("v-if", true),
1391
+ (0, vue.createCommentVNode)(" <SelectedBubbles v-if=\"bubbleVisible\" /> "),
1444
1392
  (0, vue.withDirectives)((0, vue.createElementVNode)("div", { class: (0, vue.normalizeClass)(["opencode-chat", { open: $props.open }]) }, [
1445
1393
  (0, vue.createVNode)($setup["Header"], null, (0, vue.createSlots)({ _: 2 }, [
1446
1394
  $setup.slots["session-toggle-icon"] ? {
@@ -1460,7 +1408,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
1460
1408
  } : void 0
1461
1409
  ]), 1024),
1462
1410
  (0, vue.createCommentVNode)(" Notification "),
1463
- $setup.notificationVisible ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1, (0, vue.toDisplayString)($setup.notificationMessage), 1)) : (0, vue.createCommentVNode)("v-if", true),
1411
+ $setup.notificationVisible && $setup.notificationMode === "widget" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1, (0, vue.toDisplayString)($setup.notificationMessage), 1)) : (0, vue.createCommentVNode)("v-if", true),
1464
1412
  (0, vue.createElementVNode)("div", _hoisted_2, [
1465
1413
  (0, vue.createVNode)($setup["SessionList"], null, {
1466
1414
  empty: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "sessions-empty", {}, () => [_cache[0] || (_cache[0] = (0, vue.createElementVNode)("div", { class: "opencode-session-empty" }, "暂无会话", -1))])]),
@@ -1509,7 +1457,9 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
1509
1457
  }, "取消"), (0, vue.createElementVNode)("button", {
1510
1458
  class: "opencode-dialog-btn confirm",
1511
1459
  onClick: $setup.handleDialogConfirm
1512
- }, "确认")])])])) : (0, vue.createCommentVNode)("v-if", true)
1460
+ }, "确认")])])])) : (0, vue.createCommentVNode)("v-if", true),
1461
+ (0, vue.createCommentVNode)(" Page-level Notification "),
1462
+ ((0, vue.openBlock)(), (0, vue.createBlock)(vue.Teleport, { to: "body" }, [$setup.notificationVisible && $setup.notificationMode === "page" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_9, (0, vue.toDisplayString)($setup.notificationMessage), 1)) : (0, vue.createCommentVNode)("v-if", true)]))
1513
1463
  ], 2);
1514
1464
  }
1515
1465
  __vue_sfc__.render = __vue_render__;
@@ -1518,7 +1468,7 @@ __vue_sfc__.render = __vue_render__;
1518
1468
  var open_code_widget_default = __vue_sfc__;
1519
1469
  //#endregion
1520
1470
  //#region es/index.js
1521
- var version = "1.0.16";
1471
+ var version = "1.0.17";
1522
1472
  function install(app, options) {
1523
1473
  [open_code_widget_default].forEach((item) => {
1524
1474
  if (item.install) app.use(item, options);
@@ -1,4 +1,4 @@
1
- import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createStaticVNode, createVNode, defineComponent, inject, normalizeClass, normalizeStyle, onMounted, onUnmounted, openBlock, provide, ref, renderList, renderSlot, toDisplayString, toRef, useSlots, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
1
+ import { Fragment, Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createStaticVNode, createVNode, defineComponent, inject, normalizeClass, normalizeStyle, onMounted, onUnmounted, openBlock, provide, ref, renderList, renderSlot, toDisplayString, toRef, useSlots, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
2
2
  import { truncate } from "@vite-plugin-opencode-assistant/shared";
3
3
  //#region es/open-code-widget/src/context.js
4
4
  var CONTEXT_KEY = /* @__PURE__ */ Symbol("OpenCodeWidgetContext");
@@ -29,7 +29,7 @@ var __spreadValues$1 = (a, b) => {
29
29
  }
30
30
  return a;
31
31
  };
32
- var __vue_sfc__$7 = /* @__PURE__ */ defineComponent({
32
+ var __vue_sfc__$6 = /* @__PURE__ */ defineComponent({
33
33
  __name: "Frame",
34
34
  setup(__props, { expose: __expose }) {
35
35
  const iframeRef = ref(null);
@@ -64,11 +64,11 @@ var __vue_sfc__$7 = /* @__PURE__ */ defineComponent({
64
64
  return __returned__;
65
65
  }
66
66
  });
67
- var _hoisted_1$7 = { class: "opencode-iframe-container" };
68
- var _hoisted_2$5 = { class: "opencode-empty-state-text" };
69
- var _hoisted_3$5 = ["src"];
70
- function __vue_render__$7(_ctx, _cache, $props, $setup, $data, $options) {
71
- return openBlock(), createElementBlock("div", _hoisted_1$7, [
67
+ var _hoisted_1$6 = { class: "opencode-iframe-container" };
68
+ var _hoisted_2$4 = { class: "opencode-empty-state-text" };
69
+ var _hoisted_3$4 = ["src"];
70
+ function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
71
+ return openBlock(), createElementBlock("div", _hoisted_1$6, [
72
72
  createElementVNode("div", { class: normalizeClass(["opencode-empty-state-overlay", { visible: $setup.showEmptyState }]) }, [renderSlot(_ctx.$slots, "empty-state", {}, () => [
73
73
  _cache[1] || (_cache[1] = createElementVNode("div", { class: "opencode-empty-state-icon" }, [createElementVNode("svg", {
74
74
  viewBox: "0 0 24 24",
@@ -83,7 +83,7 @@ function __vue_render__$7(_ctx, _cache, $props, $setup, $data, $options) {
83
83
  "stroke-linejoin": "round",
84
84
  d: "M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 0 1-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"
85
85
  })])], -1)),
86
- createElementVNode("div", _hoisted_2$5, toDisplayString($setup.emptyStateText), 1),
86
+ createElementVNode("div", _hoisted_2$4, toDisplayString($setup.emptyStateText), 1),
87
87
  createElementVNode("button", {
88
88
  class: "opencode-empty-state-btn",
89
89
  type: "button",
@@ -98,14 +98,14 @@ function __vue_render__$7(_ctx, _cache, $props, $setup, $data, $options) {
98
98
  src: $setup.iframeSrc,
99
99
  allow: "clipboard-write; clipboard-read",
100
100
  referrerpolicy: "origin"
101
- }, null, 8, _hoisted_3$5)])
101
+ }, null, 8, _hoisted_3$4)])
102
102
  ]);
103
103
  }
104
- __vue_sfc__$7.render = __vue_render__$7;
105
- var Frame_vue_default = __vue_sfc__$7;
104
+ __vue_sfc__$6.render = __vue_render__$6;
105
+ var Frame_vue_default = __vue_sfc__$6;
106
106
  //#endregion
107
107
  //#region es/open-code-widget/src/components/Header.vue.js
108
- var __vue_sfc__$6 = /* @__PURE__ */ defineComponent({
108
+ var __vue_sfc__$5 = /* @__PURE__ */ defineComponent({
109
109
  __name: "Header",
110
110
  setup(__props, { expose: __expose }) {
111
111
  __expose();
@@ -144,15 +144,15 @@ var __vue_sfc__$6 = /* @__PURE__ */ defineComponent({
144
144
  return __returned__;
145
145
  }
146
146
  });
147
- var _hoisted_1$6 = { class: "opencode-chat-header" };
148
- var _hoisted_2$4 = { class: "opencode-chat-header-left" };
149
- var _hoisted_3$4 = [
147
+ var _hoisted_1$5 = { class: "opencode-chat-header" };
148
+ var _hoisted_2$3 = { class: "opencode-chat-header-left" };
149
+ var _hoisted_3$3 = [
150
150
  "title",
151
151
  "aria-label",
152
152
  "aria-expanded"
153
153
  ];
154
- var _hoisted_4$4 = ["aria-pressed", "disabled"];
155
- var _hoisted_5$4 = ["title", "aria-label"];
154
+ var _hoisted_4$3 = ["aria-pressed", "disabled"];
155
+ var _hoisted_5$3 = ["title", "aria-label"];
156
156
  var _hoisted_6$3 = {
157
157
  key: 0,
158
158
  viewBox: "0 0 24 24",
@@ -183,11 +183,11 @@ var _hoisted_8$2 = {
183
183
  "stroke-width": "2",
184
184
  "aria-hidden": "true"
185
185
  };
186
- var _hoisted_9$1 = { class: "opencode-chat-header-title" };
186
+ var _hoisted_9$2 = { class: "opencode-chat-header-title" };
187
187
  var _hoisted_10 = { class: "opencode-chat-header-actions" };
188
- function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
189
- return openBlock(), createElementBlock("div", _hoisted_1$6, [
190
- createElementVNode("div", _hoisted_2$4, [
188
+ function __vue_render__$5(_ctx, _cache, $props, $setup, $data, $options) {
189
+ return openBlock(), createElementBlock("div", _hoisted_1$5, [
190
+ createElementVNode("div", _hoisted_2$3, [
191
191
  createElementVNode("button", {
192
192
  class: normalizeClass(["opencode-header-btn session-toggle", { active: !$setup.sessionListCollapsed }]),
193
193
  type: "button",
@@ -206,7 +206,7 @@ function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
206
206
  }, [createElementVNode("path", {
207
207
  d: "M4 6h16M4 12h16M4 18h16",
208
208
  "stroke-linecap": "round"
209
- })], -1))])], 10, _hoisted_3$4),
209
+ })], -1))])], 10, _hoisted_3$3),
210
210
  createElementVNode("button", {
211
211
  class: normalizeClass(["opencode-header-btn select-btn", { active: $setup.selectMode }]),
212
212
  type: "button",
@@ -226,16 +226,16 @@ function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
226
226
  }), createElementVNode("path", {
227
227
  fill: "currentColor",
228
228
  d: "M512 96a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V128a32 32 0 0 1 32-32m0 576a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V704a32 32 0 0 1 32-32M96 512a32 32 0 0 1 32-32h192a32 32 0 0 1 0 64H128a32 32 0 0 1-32-32m576 0a32 32 0 0 1 32-32h192a32 32 0 1 1 0 64H704a32 32 0 0 1-32-32"
229
- })], -1))])], 10, _hoisted_4$4),
229
+ })], -1))])], 10, _hoisted_4$3),
230
230
  createElementVNode("button", {
231
231
  class: "opencode-header-btn theme-btn",
232
232
  type: "button",
233
233
  title: $setup.themeIconTitle,
234
234
  "aria-label": $setup.themeIconLabel,
235
235
  onClick: _cache[2] || (_cache[2] = (...args) => $setup.handleToggleTheme && $setup.handleToggleTheme(...args))
236
- }, [renderSlot(_ctx.$slots, "theme-icon", {}, () => [$setup.theme === "light" ? (openBlock(), createElementBlock("svg", _hoisted_6$3, [..._cache[6] || (_cache[6] = [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" ? (openBlock(), createElementBlock("svg", _hoisted_7$2, [..._cache[7] || (_cache[7] = [createElementVNode("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }, null, -1)])])) : (openBlock(), createElementBlock("svg", _hoisted_8$2, [..._cache[8] || (_cache[8] = [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$4)
236
+ }, [renderSlot(_ctx.$slots, "theme-icon", {}, () => [$setup.theme === "light" ? (openBlock(), createElementBlock("svg", _hoisted_6$3, [..._cache[6] || (_cache[6] = [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" ? (openBlock(), createElementBlock("svg", _hoisted_7$2, [..._cache[7] || (_cache[7] = [createElementVNode("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }, null, -1)])])) : (openBlock(), createElementBlock("svg", _hoisted_8$2, [..._cache[8] || (_cache[8] = [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)
237
237
  ]),
238
- createElementVNode("span", _hoisted_9$1, toDisplayString($setup.title), 1),
238
+ createElementVNode("span", _hoisted_9$2, toDisplayString($setup.title), 1),
239
239
  createElementVNode("div", _hoisted_10, [createElementVNode("button", {
240
240
  class: "opencode-header-btn close",
241
241
  type: "button",
@@ -253,11 +253,11 @@ function __vue_render__$6(_ctx, _cache, $props, $setup, $data, $options) {
253
253
  }, [createElementVNode("path", { d: "M18 6L6 18M6 6l12 12" })], -1))])])])
254
254
  ]);
255
255
  }
256
- __vue_sfc__$6.render = __vue_render__$6;
257
- var Header_vue_default = __vue_sfc__$6;
256
+ __vue_sfc__$5.render = __vue_render__$5;
257
+ var Header_vue_default = __vue_sfc__$5;
258
258
  //#endregion
259
259
  //#region es/open-code-widget/src/components/SelectHint.vue.js
260
- var __vue_sfc__$5 = /* @__PURE__ */ defineComponent({
260
+ var __vue_sfc__$4 = /* @__PURE__ */ defineComponent({
261
261
  __name: "SelectHint",
262
262
  setup(__props, { expose: __expose }) {
263
263
  __expose();
@@ -273,72 +273,12 @@ var __vue_sfc__$5 = /* @__PURE__ */ defineComponent({
273
273
  return __returned__;
274
274
  }
275
275
  });
276
- var _hoisted_1$5 = { class: "opencode-hint-shortcut" };
277
- function __vue_render__$5(_ctx, _cache, $props, $setup, $data, $options) {
278
- return openBlock(), createElementBlock("div", { class: normalizeClass(["opencode-select-mode-hint", { visible: $setup.visible }]) }, [_cache[0] || (_cache[0] = createElementVNode("span", null, "🎯 选择模式已开启 - 点击元素进行选择", -1)), createElementVNode("span", _hoisted_1$5, toDisplayString($setup.shortcutLabel), 1)], 2);
279
- }
280
- __vue_sfc__$5.render = __vue_render__$5;
281
- var SelectHint_vue_default = __vue_sfc__$5;
282
- //#endregion
283
- //#region es/open-code-widget/src/components/SelectedBubbles.vue.js
284
- var __vue_sfc__$4 = /* @__PURE__ */ defineComponent({
285
- __name: "SelectedBubbles",
286
- setup(__props, { expose: __expose }) {
287
- __expose();
288
- const { bubbleVisible: visible, selectedElementItems: items, handleClickSelectedNode, handleRemoveSelectedNode } = useOpenCodeWidgetContext();
289
- const __returned__ = {
290
- visible,
291
- items,
292
- handleClickSelectedNode,
293
- handleRemoveSelectedNode
294
- };
295
- Object.defineProperty(__returned__, "__isScriptSetup", {
296
- enumerable: false,
297
- value: true
298
- });
299
- return __returned__;
300
- }
301
- });
302
- var _hoisted_1$4 = {
303
- key: 0,
304
- class: "opencode-bubble-empty"
305
- };
306
- var _hoisted_2$3 = ["onClick"];
307
- var _hoisted_3$3 = { class: "opencode-bubble-text" };
308
- var _hoisted_4$3 = {
309
- key: 0,
310
- class: "opencode-bubble-file"
311
- };
312
- var _hoisted_5$3 = ["aria-label", "onClick"];
276
+ var _hoisted_1$4 = { class: "opencode-hint-shortcut" };
313
277
  function __vue_render__$4(_ctx, _cache, $props, $setup, $data, $options) {
314
- return openBlock(), createElementBlock("div", {
315
- class: normalizeClass(["opencode-selected-bubbles", { visible: $setup.visible }]),
316
- role: "list",
317
- "aria-label": "已选元素列表"
318
- }, [$setup.items.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_1$4, "暂无选中元素")) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList($setup.items, (item, index) => {
319
- return openBlock(), createElementBlock("div", {
320
- key: item.key,
321
- class: "opencode-selected-bubble",
322
- role: "listitem",
323
- onClick: ($event) => $setup.handleClickSelectedNode(item)
324
- }, [
325
- createElementVNode("span", _hoisted_3$3, toDisplayString(item.description), 1),
326
- item.bubbleFileText ? (openBlock(), createElementBlock("span", _hoisted_4$3, toDisplayString(item.bubbleFileText), 1)) : createCommentVNode("v-if", true),
327
- createElementVNode("button", {
328
- class: "opencode-bubble-remove",
329
- type: "button",
330
- "aria-label": `\u79FB\u9664\u5143\u7D20: ${item.description}`,
331
- onClick: withModifiers(($event) => $setup.handleRemoveSelectedNode({
332
- item,
333
- index,
334
- source: "bubble"
335
- }), ["stop"])
336
- }, " × ", 8, _hoisted_5$3)
337
- ], 8, _hoisted_2$3);
338
- }), 128))], 2);
278
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["opencode-select-mode-hint", { visible: $setup.visible }]) }, [_cache[0] || (_cache[0] = createElementVNode("span", null, "🎯 选择模式已开启 - 点击元素进行选择", -1)), createElementVNode("span", _hoisted_1$4, toDisplayString($setup.shortcutLabel), 1)], 2);
339
279
  }
340
280
  __vue_sfc__$4.render = __vue_render__$4;
341
- var SelectedBubbles_vue_default = __vue_sfc__$4;
281
+ var SelectHint_vue_default = __vue_sfc__$4;
342
282
  //#endregion
343
283
  //#region es/open-code-widget/src/components/SelectedNodes.vue.js
344
284
  var __vue_sfc__$3 = /* @__PURE__ */ defineComponent({
@@ -467,7 +407,7 @@ var _hoisted_5$1 = ["aria-selected", "onClick"];
467
407
  var _hoisted_6$1 = { class: "opencode-session-header" };
468
408
  var _hoisted_7$1 = { class: "opencode-session-title" };
469
409
  var _hoisted_8$1 = ["aria-label", "onClick"];
470
- var _hoisted_9 = { class: "opencode-session-meta" };
410
+ var _hoisted_9$1 = { class: "opencode-session-meta" };
471
411
  function __vue_render__$2(_ctx, _cache, $props, $setup, $data, $options) {
472
412
  return openBlock(), createElementBlock("div", { class: normalizeClass(["opencode-session-list", { collapsed: $setup.collapsed }]) }, [
473
413
  createCommentVNode(" Header "),
@@ -496,7 +436,7 @@ function __vue_render__$2(_ctx, _cache, $props, $setup, $data, $options) {
496
436
  type: "button",
497
437
  "aria-label": `\u5220\u9664\u4F1A\u8BDD: ${item.title}`,
498
438
  onClick: withModifiers(($event) => $setup.handleDeleteSession(item), ["stop"])
499
- }, " × ", 8, _hoisted_8$1)]), createElementVNode("div", _hoisted_9, toDisplayString(item.meta), 1)], 10, _hoisted_5$1);
439
+ }, " × ", 8, _hoisted_8$1)]), createElementVNode("div", _hoisted_9$1, toDisplayString(item.meta), 1)], 10, _hoisted_5$1);
500
440
  }), 128)) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [createCommentVNode(" Empty State "), renderSlot(_ctx.$slots, "empty")], 64))])], 2112))
501
441
  ], 2);
502
442
  }
@@ -1184,10 +1124,13 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
1184
1124
  const slots = useSlots();
1185
1125
  const notificationMessage = ref("");
1186
1126
  const notificationVisible = ref(false);
1127
+ const notificationMode = ref("widget");
1187
1128
  let notificationTimer = null;
1188
- const showNotification = (message, duration = 3e3) => {
1129
+ const showNotification = (message, options) => {
1130
+ const { duration = 3e3, mode = "widget" } = options || {};
1189
1131
  notificationMessage.value = message;
1190
1132
  notificationVisible.value = true;
1133
+ notificationMode.value = mode;
1191
1134
  if (notificationTimer) clearTimeout(notificationTimer);
1192
1135
  notificationTimer = setTimeout(() => {
1193
1136
  notificationVisible.value = false;
@@ -1347,6 +1290,7 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
1347
1290
  slots,
1348
1291
  notificationMessage,
1349
1292
  notificationVisible,
1293
+ notificationMode,
1350
1294
  get notificationTimer() {
1351
1295
  return notificationTimer;
1352
1296
  },
@@ -1398,7 +1342,6 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
1398
1342
  Frame: Frame_vue_default,
1399
1343
  Header: Header_vue_default,
1400
1344
  SelectHint: SelectHint_vue_default,
1401
- SelectedBubbles: SelectedBubbles_vue_default,
1402
1345
  SelectedNodes: SelectedNodes_vue_default,
1403
1346
  SessionList: SessionList_vue_default,
1404
1347
  Trigger: Trigger_vue_default
@@ -1419,7 +1362,7 @@ var _hoisted_2 = { class: "opencode-chat-content" };
1419
1362
  var _hoisted_3 = { class: "opencode-tooltip-tag" };
1420
1363
  var _hoisted_4 = { class: "opencode-tooltip-file" };
1421
1364
  var _hoisted_5 = {
1422
- key: 1,
1365
+ key: 0,
1423
1366
  class: "opencode-dialog-overlay"
1424
1367
  };
1425
1368
  var _hoisted_6 = {
@@ -1429,6 +1372,11 @@ var _hoisted_6 = {
1429
1372
  };
1430
1373
  var _hoisted_7 = { class: "opencode-dialog-content" };
1431
1374
  var _hoisted_8 = { class: "opencode-dialog-message" };
1375
+ var _hoisted_9 = {
1376
+ key: 0,
1377
+ class: "opencode-page-notification",
1378
+ role: "alert"
1379
+ };
1432
1380
  function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
1433
1381
  return openBlock(), createElementBlock("div", { class: normalizeClass($setup.containerClasses) }, [
1434
1382
  createVNode($setup["Trigger"], null, createSlots({ _: 2 }, [$setup.slots["button-icon"] ? {
@@ -1436,7 +1384,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
1436
1384
  fn: withCtx(() => [renderSlot(_ctx.$slots, "button-icon")]),
1437
1385
  key: "0"
1438
1386
  } : void 0]), 1024),
1439
- $setup.bubbleVisible ? (openBlock(), createBlock($setup["SelectedBubbles"], { key: 0 })) : createCommentVNode("v-if", true),
1387
+ createCommentVNode(" <SelectedBubbles v-if=\"bubbleVisible\" /> "),
1440
1388
  withDirectives(createElementVNode("div", { class: normalizeClass(["opencode-chat", { open: $props.open }]) }, [
1441
1389
  createVNode($setup["Header"], null, createSlots({ _: 2 }, [
1442
1390
  $setup.slots["session-toggle-icon"] ? {
@@ -1456,7 +1404,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
1456
1404
  } : void 0
1457
1405
  ]), 1024),
1458
1406
  createCommentVNode(" Notification "),
1459
- $setup.notificationVisible ? (openBlock(), createElementBlock("div", _hoisted_1, toDisplayString($setup.notificationMessage), 1)) : createCommentVNode("v-if", true),
1407
+ $setup.notificationVisible && $setup.notificationMode === "widget" ? (openBlock(), createElementBlock("div", _hoisted_1, toDisplayString($setup.notificationMessage), 1)) : createCommentVNode("v-if", true),
1460
1408
  createElementVNode("div", _hoisted_2, [
1461
1409
  createVNode($setup["SessionList"], null, {
1462
1410
  empty: withCtx(() => [renderSlot(_ctx.$slots, "sessions-empty", {}, () => [_cache[0] || (_cache[0] = createElementVNode("div", { class: "opencode-session-empty" }, "暂无会话", -1))])]),
@@ -1505,7 +1453,9 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
1505
1453
  }, "取消"), createElementVNode("button", {
1506
1454
  class: "opencode-dialog-btn confirm",
1507
1455
  onClick: $setup.handleDialogConfirm
1508
- }, "确认")])])])) : createCommentVNode("v-if", true)
1456
+ }, "确认")])])])) : createCommentVNode("v-if", true),
1457
+ createCommentVNode(" Page-level Notification "),
1458
+ (openBlock(), createBlock(Teleport, { to: "body" }, [$setup.notificationVisible && $setup.notificationMode === "page" ? (openBlock(), createElementBlock("div", _hoisted_9, toDisplayString($setup.notificationMessage), 1)) : createCommentVNode("v-if", true)]))
1509
1459
  ], 2);
1510
1460
  }
1511
1461
  __vue_sfc__.render = __vue_render__;
@@ -1514,7 +1464,7 @@ __vue_sfc__.render = __vue_render__;
1514
1464
  var open_code_widget_default = __vue_sfc__;
1515
1465
  //#endregion
1516
1466
  //#region es/index.js
1517
- var version = "1.0.16";
1467
+ var version = "1.0.17";
1518
1468
  function install(app, options) {
1519
1469
  [open_code_widget_default].forEach((item) => {
1520
1470
  if (item.install) app.use(item, options);
@@ -1,8 +1,7 @@
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-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-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)}}
2
2
  .opencode-iframe-container{flex:1;position:relative;overflow:hidden;display:flex;flex-direction:column;margin-top:-42px}.opencode-loading-overlay{position:absolute;top:0;left:0;right:0;bottom: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;top:0;left:0;right:0;bottom:0;z-index:15;margin-top:42px;display:none}.opencode-error-overlay.visible{display:flex}.opencode-empty-state-overlay{position:absolute;top:0;left:0;right:0;bottom: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}
3
3
  .opencode-chat-header{position:relative;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;background:var(--oc-bg-secondary);border-bottom:1px solid var(--oc-border-primary);z-index:5}.opencode-chat-header-left{display:flex;align-items:center;gap:4px}.opencode-chat-header-title{font-size:14px;font-weight:600;color:var(--oc-text-primary);position:absolute;left:50%;transform:translate(-50%)}.opencode-chat-header-actions{display:flex;gap:4px}.opencode-header-btn{width:28px;height:28px;border-radius:6px;border:none;background:transparent;color:var(--oc-text-placeholder);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.opencode-header-btn:hover{background:var(--oc-bg-tertiary);color:var(--oc-text-primary)}.opencode-header-btn.close:hover{background:var(--oc-danger);color:#fff}.opencode-header-btn.select-btn.active,.opencode-header-btn.session-toggle.active{background:var(--oc-primary);color:#fff}
4
4
  .opencode-select-mode-hint{position:fixed;top:20px;left:50%;transform:translate(-50%);padding:10px;background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff;border-radius:12px;font-size:14px;font-weight:500;box-shadow:0 6px 20px rgba(239,68,68,.5),0 0 0 3px rgba(239,68,68,.3);z-index:9999999;display:none;align-items:center;gap:12px;border:1px solid rgba(255,255,255,.3)}.opencode-select-mode-hint.visible{display:flex;animation:slideDown .3s ease,pulseHint 2s ease-in-out infinite}.opencode-hint-shortcut{padding:4px 10px;background:rgba(255,255,255,.25);border-radius:6px;font-size:13px;font-weight:600;border:1px solid rgba(255,255,255,.4)}@keyframes pulseHint{0%,to{box-shadow:0 6px 20px rgba(239,68,68,.5),0 0 0 3px rgba(239,68,68,.3)}50%{box-shadow:0 6px 20px rgba(239,68,68,.6),0 0 0 6px rgba(239,68,68,.4)}}
5
- .opencode-selected-bubbles{position:absolute;display:none;flex-direction:column;gap:6px;max-width:220px;max-height:300px;overflow-y:auto}.opencode-selected-bubbles.visible{display:flex}.opencode-selected-bubble{display:flex;flex-direction:column;gap:2px;padding:8px 24px 8px 10px;background:var(--oc-bg-main);border:1px solid var(--oc-border-primary);border-radius:8px;font-size:12px;box-shadow:var(--oc-shadow-sm);position:relative;cursor:pointer;transition:all .2s}.opencode-selected-bubble:hover{border-color:var(--oc-primary);box-shadow:var(--oc-shadow-primary)}.opencode-bubble-text{color:var(--oc-text-primary);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opencode-bubble-file{color:var(--oc-text-placeholder);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opencode-bubble-remove{position:absolute;top:8px;right:6px;width:16px;height:16px;border-radius:50%;border:none;background:transparent;color:var(--oc-text-placeholder);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px;transition:all .2s}.opencode-bubble-remove:hover{background:var(--oc-danger);color:#fff}.opencode-bubble-empty{padding:8px 12px;background:var(--oc-bg-main);border:1px dashed var(--oc-border-secondary);border-radius:8px;color:var(--oc-text-placeholder);font-size:12px;text-align:center}
6
5
  .opencode-right-toolbar{width:140px;background:var(--oc-bg-secondary);border-left:1px solid var(--oc-border-primary);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease;overflow:hidden}.opencode-right-toolbar.collapsed{width:0;overflow:hidden}.opencode-right-toolbar.collapsed .opencode-selected-nodes-header,.opencode-right-toolbar.collapsed .opencode-selected-nodes,.opencode-right-toolbar.collapsed .opencode-clear-all-btn{display:none}.opencode-selected-nodes-header{padding:12px 8px 8px;border-bottom:1px solid var(--oc-border-primary)}.opencode-selected-nodes-title{font-size:14px;font-weight:600;color:var(--oc-text-primary);margin-bottom:4px}.opencode-selected-nodes-desc{font-size:11px;color:var(--oc-text-placeholder);line-height:1.4}.opencode-selected-nodes{flex:1;display:flex;flex-direction:column;padding:8px;gap:6px;overflow-y:auto;overflow-x:hidden}.opencode-selected-nodes:empty:before{content:"\6682\65e0\9009\4e2d\5143\7d20";color:var(--oc-text-placeholder);font-size:12px;text-align:center;padding:20px 10px}.opencode-selected-node{display:flex;align-items:center;gap:8px;padding:8px 10px;background:var(--oc-bg-main);border:1px solid var(--oc-border-primary);border-radius:6px;font-size:12px;transition:all .2s}.opencode-selected-node:hover{border-color:var(--oc-primary);box-shadow:var(--oc-shadow-primary)}.opencode-node-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.opencode-node-text{color:var(--oc-text-primary);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opencode-node-file{color:var(--oc-text-placeholder);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opencode-node-remove{width:18px;height:18px;border-radius:4px;border:none;background:transparent;color:var(--oc-text-placeholder);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;transition:all .2s;flex-shrink:0}.opencode-node-remove:hover{background:var(--oc-danger);color:#fff}.opencode-clear-all-btn{width:calc(100% - 16px);margin:8px;padding:8px 12px;border-radius:6px;border:none;background:var(--oc-danger);color:#fff;font-size:12px;font-weight:500;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:4px;transition:all .2s}.opencode-clear-all-btn:hover{background:var(--oc-danger-hover);transform:scale(1.02)}
7
6
  .opencode-session-list{width:240px;background:var(--oc-bg-secondary);border-right:1px solid var(--oc-border-primary);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease}.opencode-session-list.collapsed{width:0;overflow:hidden}.opencode-session-list.collapsed .opencode-session-list-header,.opencode-session-list.collapsed .opencode-session-list-content{display:none}.opencode-session-list-header{padding:16px;border-bottom:1px solid var(--oc-border-primary);display:flex;justify-content:space-between;align-items:center;font-weight:600;font-size:14px;color:var(--oc-text-primary)}.opencode-new-session-btn{width:28px;height:28px;border-radius:6px;border:none;background:var(--oc-primary);color:#fff;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.opencode-new-session-btn:hover{background:var(--oc-primary-hover);transform:scale(1.05)}.opencode-session-list-content{flex:1;overflow-y:auto;padding:8px;position:relative}.opencode-session-list-loading-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:var(--oc-overlay-bg);display:flex;align-items:center;justify-content:center;z-index:10;border-radius:8px}.opencode-loading-spinner.small{width:24px;height:24px;border-width:2px}.opencode-session-item{padding:12px;border-radius:8px;cursor:pointer;transition:transform .2s;margin-bottom:4px;color:var(--oc-text-primary)}.opencode-session-item:hover{background:var(--oc-bg-tertiary)}.opencode-session-item.active{background:var(--oc-primary);color:#fff;transition:none}.opencode-session-title{font-size:14px;font-weight:500;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opencode-session-meta{font-size:12px;opacity:.6}.opencode-session-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.opencode-session-delete-btn{width:20px;height:20px;border-radius:4px;border:none;background:transparent;color:var(--oc-text-placeholder);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s;opacity:0;flex-shrink:0}.opencode-session-item:hover .opencode-session-delete-btn{opacity:1}.opencode-session-delete-btn:hover{background:var(--oc-danger);color:#fff}.opencode-session-item.active .opencode-session-delete-btn{color:rgba(255,255,255,.7)}.opencode-session-item.active .opencode-session-delete-btn:hover{background:rgba(255,255,255,.2);color:#fff}.opencode-session-header-skeleton{padding:16px;border-bottom:1px solid var(--oc-border-primary);display:none;justify-content:space-between;align-items:center}.opencode-session-header-skeleton.visible{display:flex}.opencode-skeleton-header-title{height:18px;width:80px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px}.opencode-skeleton-header-btn{width:28px;height:28px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px}.opencode-session-skeleton{flex:1;overflow-y:auto;padding:8px;display:none}.opencode-session-skeleton.visible{display:block}.opencode-skeleton-item{padding:12px;border-radius:8px;margin-bottom:4px;background:var(--oc-skeleton-bg)}.opencode-skeleton-title{height:16px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;margin-bottom:8px;width:70%}.opencode-skeleton-meta{height:12px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;width:50%}.opencode-session-empty{padding:32px 16px;text-align:center;color:var(--oc-text-placeholder);font-size:13px}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}
8
7
  .opencode-button{width:44px;height:44px;border-radius:50%;background:var(--oc-trigger-bg);border:none;cursor:pointer;box-shadow:var(--oc-trigger-shadow);transition:all .3s ease;display:flex;align-items:center;justify-content:center;color:#fff;padding:0;position:relative;overflow:visible}.opencode-button svg{transform:rotate(180deg);transition:transform .3s ease}.opencode-button:before{content:"";position:absolute;top:-8px;left:-8px;right:-8px;bottom:-8px;border-radius:50%}.opencode-button:hover{transform:scale(1.1);box-shadow:var(--oc-trigger-shadow-hover);background:var(--oc-trigger-bg-hover)}.opencode-button.thinking{background:linear-gradient(135deg,#667eea,#764ba2,#667eea);background-size:200% 200%;animation:thinking-gradient 2s ease infinite,thinking-pulse 2s ease-in-out infinite;box-shadow:0 0 20px rgba(102,126,234,.5),0 0 40px rgba(118,75,162,.3)}.opencode-button.thinking svg{animation:none}.opencode-button.thinking:before{content:"";position:absolute;top:50%;left:50%;width:100%;height:100%;border-radius:50%;background:radial-gradient(circle,rgba(102,126,234,.7) 0%,rgba(118,75,162,.5) 50%,transparent 70%);transform:translate(-50%,-50%);animation:ripple-wave 2s ease-out infinite;pointer-events:none}.opencode-button.thinking:after{content:"";position:absolute;top:50%;left:50%;width:100%;height:100%;border-radius:50%;background:radial-gradient(circle,rgba(118,75,162,.6) 0%,rgba(102,126,234,.4) 50%,transparent 70%);transform:translate(-50%,-50%);animation:ripple-wave 2s ease-out infinite;animation-delay:1s;pointer-events:none}@keyframes thinking-gradient{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes ripple-wave{0%{transform:translate(-50%,-50%) scale(1);opacity:.8}to{transform:translate(-50%,-50%) scale(2.5);opacity:0}}@keyframes thinking-pulse{0%,to{transform:scale(1)}50%{transform:scale(.9)}}.opencode-button.loading{animation:pulse 1s infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}
package/lib/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.16";
3
+ declare const version = "1.0.17";
4
4
  declare function install(app: App<any>, options?: any): void;
5
5
  export { install, version, OpenCodeWidget };
6
6
  export default install;
package/lib/index.js CHANGED
@@ -34,7 +34,7 @@ __export(lib_exports, {
34
34
  });
35
35
  module.exports = __toCommonJS(lib_exports);
36
36
  var import_open_code_widget = __toESM(require("./open-code-widget"));
37
- const version = "1.0.16";
37
+ const version = "1.0.17";
38
38
  function install(app, options) {
39
39
  const components = [
40
40
  import_open_code_widget.default
@@ -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-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-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,26 +1,29 @@
1
1
  import type { OpenCodeWidgetProps } from "./types";
2
- declare var __VLS_4: {}, __VLS_12: {}, __VLS_14: {}, __VLS_16: {}, __VLS_21: {}, __VLS_28: {}, __VLS_30: {}, __VLS_32: {}, __VLS_34: {};
2
+ declare var __VLS_4: {}, __VLS_9: {}, __VLS_11: {}, __VLS_13: {}, __VLS_18: {}, __VLS_25: {}, __VLS_27: {}, __VLS_29: {}, __VLS_31: {};
3
3
  type __VLS_Slots = {} & {
4
4
  'button-icon'?: (props: typeof __VLS_4) => any;
5
5
  } & {
6
- 'session-toggle-icon'?: (props: typeof __VLS_12) => any;
6
+ 'session-toggle-icon'?: (props: typeof __VLS_9) => any;
7
7
  } & {
8
- 'select-icon'?: (props: typeof __VLS_14) => any;
8
+ 'select-icon'?: (props: typeof __VLS_11) => any;
9
9
  } & {
10
- 'close-icon'?: (props: typeof __VLS_16) => any;
10
+ 'close-icon'?: (props: typeof __VLS_13) => any;
11
11
  } & {
12
- 'sessions-empty'?: (props: typeof __VLS_21) => any;
12
+ 'sessions-empty'?: (props: typeof __VLS_18) => any;
13
13
  } & {
14
- 'empty-state'?: (props: typeof __VLS_28) => any;
14
+ 'empty-state'?: (props: typeof __VLS_25) => any;
15
15
  } & {
16
- loading?: (props: typeof __VLS_30) => any;
16
+ loading?: (props: typeof __VLS_27) => any;
17
17
  } & {
18
- error?: (props: typeof __VLS_32) => any;
18
+ error?: (props: typeof __VLS_29) => any;
19
19
  } & {
20
- content?: (props: typeof __VLS_34) => any;
20
+ content?: (props: typeof __VLS_31) => any;
21
21
  };
22
22
  declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps, {
23
- showNotification: (message: string, duration?: number) => void;
23
+ showNotification: (message: string, options?: {
24
+ duration?: number;
25
+ mode?: "widget" | "page";
26
+ }) => void;
24
27
  showConfirmDialog: (message: string) => Promise<boolean>;
25
28
  sendMessageToIframe: (type: string, data?: Record<string, unknown>) => void;
26
29
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
@@ -53,7 +53,6 @@ var import_vue2 = require("vue");
53
53
  var import_Frame_vue = __toESM(require("./components/Frame.vue.js"));
54
54
  var import_Header_vue = __toESM(require("./components/Header.vue.js"));
55
55
  var import_SelectHint_vue = __toESM(require("./components/SelectHint.vue.js"));
56
- var import_SelectedBubbles_vue = __toESM(require("./components/SelectedBubbles.vue.js"));
57
56
  var import_SelectedNodes_vue = __toESM(require("./components/SelectedNodes.vue.js"));
58
57
  var import_SessionList_vue = __toESM(require("./components/SessionList.vue.js"));
59
58
  var import_Trigger_vue = __toESM(require("./components/Trigger.vue.js"));
@@ -99,10 +98,13 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProp
99
98
  const slots = (0, import_vue2.useSlots)();
100
99
  const notificationMessage = (0, import_vue2.ref)("");
101
100
  const notificationVisible = (0, import_vue2.ref)(false);
101
+ const notificationMode = (0, import_vue2.ref)("widget");
102
102
  let notificationTimer = null;
103
- const showNotification = (message, duration = 3e3) => {
103
+ const showNotification = (message, options) => {
104
+ const { duration = 3e3, mode = "widget" } = options || {};
104
105
  notificationMessage.value = message;
105
106
  notificationVisible.value = true;
107
+ notificationMode.value = mode;
106
108
  if (notificationTimer) clearTimeout(notificationTimer);
107
109
  notificationTimer = setTimeout(() => {
108
110
  notificationVisible.value = false;
@@ -278,7 +280,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProp
278
280
  handleClearSelectedNodes,
279
281
  handleFrameLoaded
280
282
  });
281
- const __returned__ = { props, emit, slots, notificationMessage, notificationVisible, get notificationTimer() {
283
+ const __returned__ = { props, emit, slots, notificationMessage, notificationVisible, notificationMode, get notificationTimer() {
282
284
  return notificationTimer;
283
285
  }, set notificationTimer(v) {
284
286
  notificationTimer = v;
@@ -286,7 +288,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProp
286
288
  return dialogResolve;
287
289
  }, set dialogResolve(v) {
288
290
  dialogResolve = v;
289
- }, 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: import_Frame_vue.default, Header: import_Header_vue.default, SelectHint: import_SelectHint_vue.default, SelectedBubbles: import_SelectedBubbles_vue.default, SelectedNodes: import_SelectedNodes_vue.default, SessionList: import_SessionList_vue.default, Trigger: import_Trigger_vue.default };
291
+ }, 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: import_Frame_vue.default, Header: import_Header_vue.default, SelectHint: import_SelectHint_vue.default, SelectedNodes: import_SelectedNodes_vue.default, SessionList: import_SessionList_vue.default, Trigger: import_Trigger_vue.default };
290
292
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
291
293
  return __returned__;
292
294
  }
@@ -300,7 +302,7 @@ const _hoisted_2 = { class: "opencode-chat-content" };
300
302
  const _hoisted_3 = { class: "opencode-tooltip-tag" };
301
303
  const _hoisted_4 = { class: "opencode-tooltip-file" };
302
304
  const _hoisted_5 = {
303
- key: 1,
305
+ key: 0,
304
306
  class: "opencode-dialog-overlay"
305
307
  };
306
308
  const _hoisted_6 = {
@@ -310,6 +312,11 @@ const _hoisted_6 = {
310
312
  };
311
313
  const _hoisted_7 = { class: "opencode-dialog-content" };
312
314
  const _hoisted_8 = { class: "opencode-dialog-message" };
315
+ const _hoisted_9 = {
316
+ key: 0,
317
+ class: "opencode-page-notification",
318
+ role: "alert"
319
+ };
313
320
  function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
314
321
  return (0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
315
322
  "div",
@@ -335,7 +342,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
335
342
  1024
336
343
  /* DYNAMIC_SLOTS */
337
344
  ),
338
- $setup.bubbleVisible ? ((0, import_vue3.openBlock)(), (0, import_vue3.createBlock)($setup["SelectedBubbles"], { key: 0 })) : (0, import_vue3.createCommentVNode)("v-if", true),
345
+ (0, import_vue3.createCommentVNode)(' <SelectedBubbles v-if="bubbleVisible" /> '),
339
346
  (0, import_vue3.withDirectives)((0, import_vue3.createElementVNode)(
340
347
  "div",
341
348
  {
@@ -375,7 +382,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
375
382
  /* DYNAMIC_SLOTS */
376
383
  ),
377
384
  (0, import_vue3.createCommentVNode)(" Notification "),
378
- $setup.notificationVisible ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
385
+ $setup.notificationVisible && $setup.notificationMode === "widget" ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
379
386
  "div",
380
387
  _hoisted_1,
381
388
  (0, import_vue3.toDisplayString)($setup.notificationMessage),
@@ -514,7 +521,17 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
514
521
  }, "\u786E\u8BA4")
515
522
  ])
516
523
  ])
517
- ])) : (0, import_vue3.createCommentVNode)("v-if", true)
524
+ ])) : (0, import_vue3.createCommentVNode)("v-if", true),
525
+ (0, import_vue3.createCommentVNode)(" Page-level Notification "),
526
+ ((0, import_vue3.openBlock)(), (0, import_vue3.createBlock)(import_vue3.Teleport, { to: "body" }, [
527
+ $setup.notificationVisible && $setup.notificationMode === "page" ? ((0, import_vue3.openBlock)(), (0, import_vue3.createElementBlock)(
528
+ "div",
529
+ _hoisted_9,
530
+ (0, import_vue3.toDisplayString)($setup.notificationMessage),
531
+ 1
532
+ /* TEXT */
533
+ )) : (0, import_vue3.createCommentVNode)("v-if", true)
534
+ ]))
518
535
  ],
519
536
  2
520
537
  /* CLASS */
@@ -1 +1 @@
1
- {"$schema":"https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json","framework":"vue","name":"@vite-plugin-opencode-assistant/components","version":"1.0.16","contributions":{"html":{"tags":[{"name":"open-code","attributes":[{"name":"","default":"`'bottom-right'`","description":"挂件显示的位置","value":{"type":"`'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'`","kind":"expression"}},{"name":"","default":"`false`","description":"挂件是否打开","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`'auto'`","description":"主题模式","value":{"type":"`'light' | 'dark' | 'auto'`","kind":"expression"}},{"name":"","default":"`'AI 助手'`","description":"助手头部显示的标题","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`'Ctrl+K'`","description":"快捷键提示文本","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`'按 ESC 或 Ctrl+P 退出'`","description":"选择模式快捷键提示文本","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`false`","description":"是否进入选择页面元素模式","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`true`","description":"会话列表是否折叠","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`'id'`","description":"会话列表项的唯一键字段","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`false`","description":"iframe 是否显示加载状态","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`undefined`","description":"会话列表是否加载中","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`false`","description":"是否显示会话列表骨架屏","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`false`","description":"是否显示空状态","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`false`","description":"是否显示错误状态","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`'当前项目暂无会话'`","description":"空状态显示的文本","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`'立即创建'`","description":"空状态操作按钮文本","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`''`","description":"Web UI 的 URL 来源","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`[]`","description":"会话列表数据","value":{"type":"`OpenCodeWidgetSession[]`","kind":"expression"}},{"name":"","default":"`null`","description":"当前选中的会话 ID","value":{"type":"`string | null`","kind":"expression"}},{"name":"","default":"`[]`","description":"已选中的元素列表","value":{"type":"`OpenCodeSelectedElement[]`","kind":"expression"}},{"name":"","default":"`true`","description":"是否显示\"一键清空\"按钮","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`true`","description":"是否启用选择模式","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`false`","description":"是否显示思考状态(加载中)","value":{"type":"`boolean`","kind":"expression"}}],"events":[{"name":"`update:open`","description":"当挂件打开或关闭时触发","arguments":[{"name":"open","type":"en"},{"name":"boolean"}]},{"name":"`update:selectMode`","description":"当选择模式切换时触发","arguments":[{"name":"mode","type":"de"},{"name":"boolean"}]},{"name":"`update:sessionListCollapsed`","description":"当会话列表折叠状态改变时触发","arguments":[{"name":"collapsed","type":"ed"},{"name":"boolean"}]},{"name":"`update:currentSessionId`","description":"当选中的会话 ID 改变时触发","arguments":[{"name":"sessionId","type":"Id"},{"name":"string | null"}]},{"name":"`update:selectedElements`","description":"当已选中的元素列表改变时触发","arguments":[{"name":"elements","type":"ts"},{"name":"OpenCodeSelectedElement[]"}]},{"name":"`update:theme`","description":"当主题模式改变时触发","arguments":[{"name":"theme","type":"me"},{"name":"'light' | 'dark' | 'auto'"}]},{"name":"`update:thinking`","description":"当思考状态改变时触发","arguments":[{"name":"thinking","type":"ng"},{"name":"boolean"}]},{"name":"","description":"点击触发挂件开关","arguments":[{"name":"open","type":"en"},{"name":"boolean"}]},{"name":"","description":"点击关闭按钮时触发","arguments":[]},{"name":"`toggle-session-list`","description":"点击会话列表切换按钮时触发","arguments":[{"name":"collapsed","type":"ed"},{"name":"boolean"}]},{"name":"`toggle-select-mode`","description":"点击选择模式切换按钮时触发","arguments":[{"name":"mode","type":"de"},{"name":"boolean"}]},{"name":"`toggle-theme`","description":"点击主题切换按钮时触发","arguments":[{"name":"theme","type":"me"},{"name":"'light' | 'dark' | 'auto'"}]},{"name":"`create-session`","description":"点击创建新会话时触发","arguments":[]},{"name":"`select-session`","description":"选中某个历史会话时触发","arguments":[{"name":"session","type":"on"},{"name":"OpenCodeWidgetSession"}]},{"name":"`delete-session`","description":"删除某个历史会话时触发","arguments":[{"name":"session","type":"on"},{"name":"OpenCodeWidgetSession"}]},{"name":"`click-selected-node`","description":"点击已选中的气泡或节点卡片时触发","arguments":[{"name":"element","type":"nt"},{"name":"OpenCodeSelectedElement"}]},{"name":"`remove-selected-node`","description":"删除已选中的元素时触发","arguments":[{"name":"payload","type":"ad"},{"name":"OpenCodeRemoveSelectedPayload"}]},{"name":"`clear-selected-nodes`","description":"清空所有选中元素时触发","arguments":[]},{"name":"`empty-action`","description":"点击空状态操作按钮时触发","arguments":[]},{"name":"`frame-loaded`","description":"iframe 加载完成时触发","arguments":[]},{"name":"`thinking-change`","description":"思考状态改变时触发(用于显示加载动画)","arguments":[{"name":"thinking","type":"ng"},{"name":"boolean"}]}],"slots":[{"name":"`button-icon`","description":"自定义触发按钮图标"},{"name":"`session-toggle-icon`","description":"自定义会话列表切换图标"},{"name":"`select-icon`","description":"自定义选择模式切换图标"},{"name":"`close-icon`","description":"自定义关闭按钮图标"},{"name":"`theme-icon`","description":"自定义主题切换图标"},{"name":"`sessions-empty`","description":"自定义会话列表空状态"},{"name":"`empty-state`","description":"自定义 iframe 空状态"},{"name":"","description":"自定义 iframe 加载状态"},{"name":"","description":"自定义错误状态"},{"name":"","description":"自定义 iframe 内容"}]}],"attributes":[]}},"js-types-syntax":"typescript"}
1
+ {"$schema":"https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json","framework":"vue","name":"@vite-plugin-opencode-assistant/components","version":"1.0.17","contributions":{"html":{"tags":[{"name":"open-code","attributes":[{"name":"","default":"`'bottom-right'`","description":"挂件显示的位置","value":{"type":"`'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'`","kind":"expression"}},{"name":"","default":"`false`","description":"挂件是否打开","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`'auto'`","description":"主题模式","value":{"type":"`'light' | 'dark' | 'auto'`","kind":"expression"}},{"name":"","default":"`'AI 助手'`","description":"助手头部显示的标题","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`'Ctrl+K'`","description":"快捷键提示文本","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`'按 ESC 或 Ctrl+P 退出'`","description":"选择模式快捷键提示文本","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`false`","description":"是否进入选择页面元素模式","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`true`","description":"会话列表是否折叠","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`'id'`","description":"会话列表项的唯一键字段","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`false`","description":"iframe 是否显示加载状态","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`undefined`","description":"会话列表是否加载中","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`false`","description":"是否显示会话列表骨架屏","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`false`","description":"是否显示空状态","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`false`","description":"是否显示错误状态","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`'当前项目暂无会话'`","description":"空状态显示的文本","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`'立即创建'`","description":"空状态操作按钮文本","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`''`","description":"Web UI 的 URL 来源","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`[]`","description":"会话列表数据","value":{"type":"`OpenCodeWidgetSession[]`","kind":"expression"}},{"name":"","default":"`null`","description":"当前选中的会话 ID","value":{"type":"`string | null`","kind":"expression"}},{"name":"","default":"`[]`","description":"已选中的元素列表","value":{"type":"`OpenCodeSelectedElement[]`","kind":"expression"}},{"name":"","default":"`true`","description":"是否显示\"一键清空\"按钮","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`true`","description":"是否启用选择模式","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`false`","description":"是否显示思考状态(加载中)","value":{"type":"`boolean`","kind":"expression"}}],"events":[{"name":"`update:open`","description":"当挂件打开或关闭时触发","arguments":[{"name":"open","type":"en"},{"name":"boolean"}]},{"name":"`update:selectMode`","description":"当选择模式切换时触发","arguments":[{"name":"mode","type":"de"},{"name":"boolean"}]},{"name":"`update:sessionListCollapsed`","description":"当会话列表折叠状态改变时触发","arguments":[{"name":"collapsed","type":"ed"},{"name":"boolean"}]},{"name":"`update:currentSessionId`","description":"当选中的会话 ID 改变时触发","arguments":[{"name":"sessionId","type":"Id"},{"name":"string | null"}]},{"name":"`update:selectedElements`","description":"当已选中的元素列表改变时触发","arguments":[{"name":"elements","type":"ts"},{"name":"OpenCodeSelectedElement[]"}]},{"name":"`update:theme`","description":"当主题模式改变时触发","arguments":[{"name":"theme","type":"me"},{"name":"'light' | 'dark' | 'auto'"}]},{"name":"`update:thinking`","description":"当思考状态改变时触发","arguments":[{"name":"thinking","type":"ng"},{"name":"boolean"}]},{"name":"","description":"点击触发挂件开关","arguments":[{"name":"open","type":"en"},{"name":"boolean"}]},{"name":"","description":"点击关闭按钮时触发","arguments":[]},{"name":"`toggle-session-list`","description":"点击会话列表切换按钮时触发","arguments":[{"name":"collapsed","type":"ed"},{"name":"boolean"}]},{"name":"`toggle-select-mode`","description":"点击选择模式切换按钮时触发","arguments":[{"name":"mode","type":"de"},{"name":"boolean"}]},{"name":"`toggle-theme`","description":"点击主题切换按钮时触发","arguments":[{"name":"theme","type":"me"},{"name":"'light' | 'dark' | 'auto'"}]},{"name":"`create-session`","description":"点击创建新会话时触发","arguments":[]},{"name":"`select-session`","description":"选中某个历史会话时触发","arguments":[{"name":"session","type":"on"},{"name":"OpenCodeWidgetSession"}]},{"name":"`delete-session`","description":"删除某个历史会话时触发","arguments":[{"name":"session","type":"on"},{"name":"OpenCodeWidgetSession"}]},{"name":"`click-selected-node`","description":"点击已选中的气泡或节点卡片时触发","arguments":[{"name":"element","type":"nt"},{"name":"OpenCodeSelectedElement"}]},{"name":"`remove-selected-node`","description":"删除已选中的元素时触发","arguments":[{"name":"payload","type":"ad"},{"name":"OpenCodeRemoveSelectedPayload"}]},{"name":"`clear-selected-nodes`","description":"清空所有选中元素时触发","arguments":[]},{"name":"`empty-action`","description":"点击空状态操作按钮时触发","arguments":[]},{"name":"`frame-loaded`","description":"iframe 加载完成时触发","arguments":[]},{"name":"`thinking-change`","description":"思考状态改变时触发(用于显示加载动画)","arguments":[{"name":"thinking","type":"ng"},{"name":"boolean"}]}],"slots":[{"name":"`button-icon`","description":"自定义触发按钮图标"},{"name":"`session-toggle-icon`","description":"自定义会话列表切换图标"},{"name":"`select-icon`","description":"自定义选择模式切换图标"},{"name":"`close-icon`","description":"自定义关闭按钮图标"},{"name":"`theme-icon`","description":"自定义主题切换图标"},{"name":"`sessions-empty`","description":"自定义会话列表空状态"},{"name":"`empty-state`","description":"自定义 iframe 空状态"},{"name":"","description":"自定义 iframe 加载状态"},{"name":"","description":"自定义错误状态"},{"name":"","description":"自定义 iframe 内容"}]}],"attributes":[]}},"js-types-syntax":"typescript"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vite-plugin-opencode-assistant/components",
3
- "version": "1.0.16",
3
+ "version": "1.0.17",
4
4
  "description": "Reusable OpenCode widget components built with Pagoda CLI",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -30,7 +30,7 @@
30
30
  "vue": "^3.5.0"
31
31
  },
32
32
  "dependencies": {
33
- "@vite-plugin-opencode-assistant/shared": "1.0.16"
33
+ "@vite-plugin-opencode-assistant/shared": "1.0.17"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@vitejs/plugin-vue": "^6.0.5",