@vite-plugin-opencode-assistant/components 1.0.14 → 1.0.16
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 +1 -1
- package/es/index.js +1 -1
- package/es/open-code-widget/src/components/Frame.vue.d.ts +4 -1
- package/es/open-code-widget/src/components/Frame.vue.js +5 -23
- package/es/open-code-widget/src/components/Trigger-sfc.css +1 -1
- package/es/open-code-widget/src/components/Trigger.vue.js +9 -3
- package/es/open-code-widget/src/context.d.ts +1 -0
- package/es/open-code-widget/src/index-sfc.css +1 -1
- package/es/open-code-widget/src/index.vue.d.ts +12 -6
- package/es/open-code-widget/src/index.vue.js +15 -7
- package/lib/@vite-plugin-opencode-assistant/components.cjs.js +30 -31
- package/lib/@vite-plugin-opencode-assistant/components.es.js +30 -31
- package/lib/components.css +2 -2
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/open-code-widget/src/components/Frame.vue.d.ts +4 -1
- package/lib/open-code-widget/src/components/Frame.vue.js +4 -22
- package/lib/open-code-widget/src/components/Trigger-sfc.css +1 -1
- package/lib/open-code-widget/src/components/Trigger.vue.js +9 -3
- package/lib/open-code-widget/src/context.d.ts +1 -0
- package/lib/open-code-widget/src/index-sfc.css +1 -1
- package/lib/open-code-widget/src/index.vue.d.ts +12 -6
- package/lib/open-code-widget/src/index.vue.js +15 -7
- package/lib/web-types.json +1 -1
- package/package.json +4 -4
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.
|
|
3
|
+
declare const version = "1.0.16";
|
|
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,3 +1,4 @@
|
|
|
1
|
+
declare function sendMessageToIframe(type: string, data?: Record<string, unknown>): void;
|
|
1
2
|
declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {};
|
|
2
3
|
type __VLS_Slots = {} & {
|
|
3
4
|
'empty-state'?: (props: typeof __VLS_1) => any;
|
|
@@ -8,7 +9,9 @@ type __VLS_Slots = {} & {
|
|
|
8
9
|
} & {
|
|
9
10
|
content?: (props: typeof __VLS_7) => any;
|
|
10
11
|
};
|
|
11
|
-
declare const __VLS_component: import("vue").DefineComponent<{}, {
|
|
12
|
+
declare const __VLS_component: import("vue").DefineComponent<{}, {
|
|
13
|
+
sendMessageToIframe: typeof sendMessageToIframe;
|
|
14
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
12
15
|
declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
|
|
13
16
|
export default _default;
|
|
14
17
|
type __VLS_WithSlots<T, S> = T & {
|
|
@@ -16,12 +16,11 @@ var __spreadValues = (a, b) => {
|
|
|
16
16
|
};
|
|
17
17
|
import "./Frame-sfc.css";
|
|
18
18
|
import { defineComponent as _defineComponent } from "vue";
|
|
19
|
-
import { ref,
|
|
19
|
+
import { ref, onMounted } from "vue";
|
|
20
20
|
import { useOpenCodeWidgetContext } from "../context";
|
|
21
21
|
const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
|
|
22
22
|
__name: "Frame",
|
|
23
23
|
setup(__props, { expose: __expose }) {
|
|
24
|
-
__expose();
|
|
25
24
|
const iframeRef = ref(null);
|
|
26
25
|
const {
|
|
27
26
|
frameLoading,
|
|
@@ -31,41 +30,24 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
|
|
|
31
30
|
emptyStateText,
|
|
32
31
|
emptyStateActionText,
|
|
33
32
|
handleEmptyAction,
|
|
34
|
-
handleFrameLoaded
|
|
35
|
-
theme,
|
|
36
|
-
resolvedTheme
|
|
33
|
+
handleFrameLoaded
|
|
37
34
|
} = useOpenCodeWidgetContext();
|
|
38
|
-
const iframeReady = ref(false);
|
|
39
35
|
function sendMessageToIframe(type, data) {
|
|
40
36
|
var _a;
|
|
41
37
|
if (!((_a = iframeRef.value) == null ? void 0 : _a.contentWindow)) return;
|
|
42
38
|
iframeRef.value.contentWindow.postMessage(__spreadValues({ type }, data), "*");
|
|
43
39
|
}
|
|
44
|
-
function syncIframeTheme() {
|
|
45
|
-
sendMessageToIframe("OPENCODE_SET_THEME", { theme: resolvedTheme.value });
|
|
46
|
-
}
|
|
47
|
-
function handleIframeMessage(event) {
|
|
48
|
-
var _a;
|
|
49
|
-
if (((_a = event.data) == null ? void 0 : _a.type) === "OPENCODE_READY") {
|
|
50
|
-
syncIframeTheme();
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
watch([theme, resolvedTheme], () => {
|
|
54
|
-
syncIframeTheme();
|
|
55
|
-
});
|
|
56
40
|
onMounted(() => {
|
|
57
41
|
if (iframeRef.value) {
|
|
58
42
|
iframeRef.value.addEventListener("load", () => {
|
|
59
|
-
iframeReady.value = true;
|
|
60
43
|
handleFrameLoaded();
|
|
61
44
|
});
|
|
62
45
|
}
|
|
63
|
-
window.addEventListener("message", handleIframeMessage);
|
|
64
46
|
});
|
|
65
|
-
|
|
66
|
-
|
|
47
|
+
__expose({
|
|
48
|
+
sendMessageToIframe
|
|
67
49
|
});
|
|
68
|
-
const __returned__ = { iframeRef, frameLoading, showEmptyState, showError, iframeSrc, emptyStateText, emptyStateActionText, handleEmptyAction, handleFrameLoaded,
|
|
50
|
+
const __returned__ = { iframeRef, frameLoading, showEmptyState, showError, iframeSrc, emptyStateText, emptyStateActionText, handleEmptyAction, handleFrameLoaded, sendMessageToIframe };
|
|
69
51
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
70
52
|
return __returned__;
|
|
71
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.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}.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.
|
|
1
|
+
.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}}
|
|
@@ -5,8 +5,14 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
|
|
|
5
5
|
__name: "Trigger",
|
|
6
6
|
setup(__props, { expose: __expose }) {
|
|
7
7
|
__expose();
|
|
8
|
-
const {
|
|
9
|
-
|
|
8
|
+
const {
|
|
9
|
+
buttonActive: active,
|
|
10
|
+
open,
|
|
11
|
+
hotkeyLabel,
|
|
12
|
+
thinking,
|
|
13
|
+
handleToggle
|
|
14
|
+
} = useOpenCodeWidgetContext();
|
|
15
|
+
const __returned__ = { active, open, hotkeyLabel, thinking, handleToggle };
|
|
10
16
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
11
17
|
return __returned__;
|
|
12
18
|
}
|
|
@@ -15,7 +21,7 @@ import { renderSlot as _renderSlot, createElementVNode as _createElementVNode, n
|
|
|
15
21
|
const _hoisted_1 = ["aria-expanded", "title"];
|
|
16
22
|
function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
17
23
|
return _openBlock(), _createElementBlock("button", {
|
|
18
|
-
class: _normalizeClass(["opencode-button", { active: $setup.active }]),
|
|
24
|
+
class: _normalizeClass(["opencode-button", { active: $setup.active, thinking: $setup.thinking }]),
|
|
19
25
|
type: "button",
|
|
20
26
|
"aria-expanded": $setup.open,
|
|
21
27
|
"aria-label": "\u6253\u5F00 AI \u52A9\u624B",
|
|
@@ -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-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:
|
|
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,5 +1,5 @@
|
|
|
1
1
|
import type { OpenCodeWidgetProps } from "./types";
|
|
2
|
-
declare var __VLS_4: {}, __VLS_12: {}, __VLS_14: {}, __VLS_16: {}, __VLS_21: {},
|
|
2
|
+
declare var __VLS_4: {}, __VLS_12: {}, __VLS_14: {}, __VLS_16: {}, __VLS_21: {}, __VLS_28: {}, __VLS_30: {}, __VLS_32: {}, __VLS_34: {};
|
|
3
3
|
type __VLS_Slots = {} & {
|
|
4
4
|
'button-icon'?: (props: typeof __VLS_4) => any;
|
|
5
5
|
} & {
|
|
@@ -11,17 +11,18 @@ type __VLS_Slots = {} & {
|
|
|
11
11
|
} & {
|
|
12
12
|
'sessions-empty'?: (props: typeof __VLS_21) => any;
|
|
13
13
|
} & {
|
|
14
|
-
'empty-state'?: (props: typeof
|
|
14
|
+
'empty-state'?: (props: typeof __VLS_28) => any;
|
|
15
15
|
} & {
|
|
16
|
-
loading?: (props: typeof
|
|
16
|
+
loading?: (props: typeof __VLS_30) => any;
|
|
17
17
|
} & {
|
|
18
|
-
error?: (props: typeof
|
|
18
|
+
error?: (props: typeof __VLS_32) => any;
|
|
19
19
|
} & {
|
|
20
|
-
content?: (props: typeof
|
|
20
|
+
content?: (props: typeof __VLS_34) => any;
|
|
21
21
|
};
|
|
22
22
|
declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps, {
|
|
23
23
|
showNotification: (message: string, duration?: number) => void;
|
|
24
24
|
showConfirmDialog: (message: string) => Promise<boolean>;
|
|
25
|
+
sendMessageToIframe: (type: string, data?: Record<string, unknown>) => void;
|
|
25
26
|
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
26
27
|
close: () => any;
|
|
27
28
|
toggle: (value: boolean) => any;
|
|
@@ -33,6 +34,7 @@ declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps
|
|
|
33
34
|
"update:currentSessionId": (value: string | null) => any;
|
|
34
35
|
"update:selectedElements": (value: import("@vite-plugin-opencode-assistant/shared").OpenCodeSelectedElement[]) => any;
|
|
35
36
|
"update:theme": (value: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetTheme) => any;
|
|
37
|
+
"update:thinking": (value: boolean) => any;
|
|
36
38
|
"toggle-session-list": (value: boolean) => any;
|
|
37
39
|
"toggle-select-mode": (value: boolean) => any;
|
|
38
40
|
"toggle-theme": (value: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetTheme) => any;
|
|
@@ -42,6 +44,7 @@ declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps
|
|
|
42
44
|
"clear-selected-nodes": () => any;
|
|
43
45
|
"empty-action": () => any;
|
|
44
46
|
"frame-loaded": () => any;
|
|
47
|
+
"thinking-change": (value: boolean) => any;
|
|
45
48
|
}, string, import("vue").PublicProps, Readonly<OpenCodeWidgetProps> & Readonly<{
|
|
46
49
|
onClose?: (() => any) | undefined;
|
|
47
50
|
onToggle?: ((value: boolean) => any) | undefined;
|
|
@@ -53,6 +56,7 @@ declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps
|
|
|
53
56
|
"onUpdate:currentSessionId"?: ((value: string | null) => any) | undefined;
|
|
54
57
|
"onUpdate:selectedElements"?: ((value: import("@vite-plugin-opencode-assistant/shared").OpenCodeSelectedElement[]) => any) | undefined;
|
|
55
58
|
"onUpdate:theme"?: ((value: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetTheme) => any) | undefined;
|
|
59
|
+
"onUpdate:thinking"?: ((value: boolean) => any) | undefined;
|
|
56
60
|
"onToggle-session-list"?: ((value: boolean) => any) | undefined;
|
|
57
61
|
"onToggle-select-mode"?: ((value: boolean) => any) | undefined;
|
|
58
62
|
"onToggle-theme"?: ((value: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetTheme) => any) | undefined;
|
|
@@ -62,18 +66,19 @@ declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps
|
|
|
62
66
|
"onClear-selected-nodes"?: (() => any) | undefined;
|
|
63
67
|
"onEmpty-action"?: (() => any) | undefined;
|
|
64
68
|
"onFrame-loaded"?: (() => any) | undefined;
|
|
69
|
+
"onThinking-change"?: ((value: boolean) => any) | undefined;
|
|
65
70
|
}>, {
|
|
66
71
|
frameLoading: boolean;
|
|
67
72
|
showEmptyState: boolean;
|
|
68
73
|
showError: boolean;
|
|
69
74
|
emptyStateText: string;
|
|
70
75
|
emptyStateActionText: string;
|
|
71
|
-
theme: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetTheme;
|
|
72
76
|
iframeSrc: string;
|
|
73
77
|
title: string;
|
|
74
78
|
sessionListCollapsed: boolean;
|
|
75
79
|
selectMode: boolean;
|
|
76
80
|
selectEnabled: boolean;
|
|
81
|
+
theme: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetTheme;
|
|
77
82
|
selectShortcutLabel: string;
|
|
78
83
|
showClearAll: boolean;
|
|
79
84
|
showSessionListSkeleton: boolean;
|
|
@@ -81,6 +86,7 @@ declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps
|
|
|
81
86
|
sessions: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetSession[];
|
|
82
87
|
open: boolean;
|
|
83
88
|
hotkeyLabel: string;
|
|
89
|
+
thinking: boolean;
|
|
84
90
|
position: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetPosition;
|
|
85
91
|
currentSessionId: string | null;
|
|
86
92
|
selectedElements: import("@vite-plugin-opencode-assistant/shared").OpenCodeSelectedElement[];
|
|
@@ -58,9 +58,10 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
|
|
|
58
58
|
currentSessionId: { type: [String, null], required: false, default: null },
|
|
59
59
|
selectedElements: { type: Array, required: false, default: () => [] },
|
|
60
60
|
showClearAll: { type: Boolean, required: false, default: true },
|
|
61
|
-
selectEnabled: { type: Boolean, required: false, default: true }
|
|
61
|
+
selectEnabled: { type: Boolean, required: false, default: true },
|
|
62
|
+
thinking: { type: Boolean, required: false, default: false }
|
|
62
63
|
},
|
|
63
|
-
emits: ["update:open", "update:selectMode", "update:sessionListCollapsed", "update:currentSessionId", "update:selectedElements", "update:theme", "toggle", "close", "toggle-session-list", "toggle-select-mode", "toggle-theme", "create-session", "select-session", "delete-session", "click-selected-node", "remove-selected-node", "clear-selected-nodes", "empty-action", "frame-loaded"],
|
|
64
|
+
emits: ["update:open", "update:selectMode", "update:sessionListCollapsed", "update:currentSessionId", "update:selectedElements", "update:theme", "update:thinking", "toggle", "close", "toggle-session-list", "toggle-select-mode", "toggle-theme", "create-session", "select-session", "delete-session", "click-selected-node", "remove-selected-node", "clear-selected-nodes", "empty-action", "frame-loaded", "thinking-change"],
|
|
64
65
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
65
66
|
const props = __props;
|
|
66
67
|
const emit = __emit;
|
|
@@ -94,12 +95,18 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
|
|
|
94
95
|
dialogVisible.value = false;
|
|
95
96
|
if (dialogResolve) dialogResolve(false);
|
|
96
97
|
};
|
|
98
|
+
const frameRef = ref(null);
|
|
99
|
+
const sendMessageToIframe = (type, data) => {
|
|
100
|
+
var _a;
|
|
101
|
+
(_a = frameRef.value) == null ? void 0 : _a.sendMessageToIframe(type, data);
|
|
102
|
+
};
|
|
97
103
|
const handleFrameLoaded = () => {
|
|
98
104
|
emit("frame-loaded");
|
|
99
105
|
};
|
|
100
106
|
__expose({
|
|
101
107
|
showNotification,
|
|
102
|
-
showConfirmDialog
|
|
108
|
+
showConfirmDialog,
|
|
109
|
+
sendMessageToIframe
|
|
103
110
|
});
|
|
104
111
|
const localSessionListCollapsed = ref(props.sessionListCollapsed);
|
|
105
112
|
watch(
|
|
@@ -218,6 +225,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
|
|
|
218
225
|
emptyStateActionText: toRef(props, "emptyStateActionText"),
|
|
219
226
|
showClearAll: toRef(props, "showClearAll"),
|
|
220
227
|
open: toRef(props, "open"),
|
|
228
|
+
thinking: toRef(props, "thinking"),
|
|
221
229
|
iframeSource,
|
|
222
230
|
buttonActive,
|
|
223
231
|
sessionListTitle,
|
|
@@ -247,7 +255,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
|
|
|
247
255
|
return dialogResolve;
|
|
248
256
|
}, set dialogResolve(v) {
|
|
249
257
|
dialogResolve = v;
|
|
250
|
-
}, showConfirmDialog, handleDialogConfirm, handleDialogCancel, 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 };
|
|
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 };
|
|
251
259
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
252
260
|
return __returned__;
|
|
253
261
|
}
|
|
@@ -362,7 +370,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
362
370
|
}),
|
|
363
371
|
_createVNode(
|
|
364
372
|
$setup["Frame"],
|
|
365
|
-
|
|
373
|
+
{ ref: "frameRef" },
|
|
366
374
|
_createSlots({
|
|
367
375
|
_: 2
|
|
368
376
|
/* DYNAMIC */
|
|
@@ -396,8 +404,8 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
396
404
|
key: "3"
|
|
397
405
|
} : void 0
|
|
398
406
|
]),
|
|
399
|
-
|
|
400
|
-
/* DYNAMIC_SLOTS */
|
|
407
|
+
1536
|
|
408
|
+
/* NEED_PATCH, DYNAMIC_SLOTS */
|
|
401
409
|
),
|
|
402
410
|
_createVNode($setup["SelectedNodes"])
|
|
403
411
|
])
|
|
@@ -36,35 +36,19 @@ var __spreadValues$1 = (a, b) => {
|
|
|
36
36
|
var __vue_sfc__$7 = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
37
37
|
__name: "Frame",
|
|
38
38
|
setup(__props, { expose: __expose }) {
|
|
39
|
-
__expose();
|
|
40
39
|
const iframeRef = (0, vue.ref)(null);
|
|
41
|
-
const { frameLoading, showEmptyState, showError, iframeSource: iframeSrc, emptyStateText, emptyStateActionText, handleEmptyAction, handleFrameLoaded
|
|
42
|
-
const iframeReady = (0, vue.ref)(false);
|
|
40
|
+
const { frameLoading, showEmptyState, showError, iframeSource: iframeSrc, emptyStateText, emptyStateActionText, handleEmptyAction, handleFrameLoaded } = useOpenCodeWidgetContext();
|
|
43
41
|
function sendMessageToIframe(type, data) {
|
|
44
42
|
var _a;
|
|
45
43
|
if (!((_a = iframeRef.value) == null ? void 0 : _a.contentWindow)) return;
|
|
46
44
|
iframeRef.value.contentWindow.postMessage(__spreadValues$1({ type }, data), "*");
|
|
47
45
|
}
|
|
48
|
-
function syncIframeTheme() {
|
|
49
|
-
sendMessageToIframe("OPENCODE_SET_THEME", { theme: resolvedTheme.value });
|
|
50
|
-
}
|
|
51
|
-
function handleIframeMessage(event) {
|
|
52
|
-
var _a;
|
|
53
|
-
if (((_a = event.data) == null ? void 0 : _a.type) === "OPENCODE_READY") syncIframeTheme();
|
|
54
|
-
}
|
|
55
|
-
(0, vue.watch)([theme, resolvedTheme], () => {
|
|
56
|
-
syncIframeTheme();
|
|
57
|
-
});
|
|
58
46
|
(0, vue.onMounted)(() => {
|
|
59
47
|
if (iframeRef.value) iframeRef.value.addEventListener("load", () => {
|
|
60
|
-
iframeReady.value = true;
|
|
61
48
|
handleFrameLoaded();
|
|
62
49
|
});
|
|
63
|
-
window.addEventListener("message", handleIframeMessage);
|
|
64
|
-
});
|
|
65
|
-
(0, vue.onUnmounted)(() => {
|
|
66
|
-
window.removeEventListener("message", handleIframeMessage);
|
|
67
50
|
});
|
|
51
|
+
__expose({ sendMessageToIframe });
|
|
68
52
|
const __returned__ = {
|
|
69
53
|
iframeRef,
|
|
70
54
|
frameLoading,
|
|
@@ -75,12 +59,7 @@ var __vue_sfc__$7 = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
75
59
|
emptyStateActionText,
|
|
76
60
|
handleEmptyAction,
|
|
77
61
|
handleFrameLoaded,
|
|
78
|
-
|
|
79
|
-
resolvedTheme,
|
|
80
|
-
iframeReady,
|
|
81
|
-
sendMessageToIframe,
|
|
82
|
-
syncIframeTheme,
|
|
83
|
-
handleIframeMessage
|
|
62
|
+
sendMessageToIframe
|
|
84
63
|
};
|
|
85
64
|
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
86
65
|
enumerable: false,
|
|
@@ -533,11 +512,12 @@ var __vue_sfc__$1 = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
533
512
|
__name: "Trigger",
|
|
534
513
|
setup(__props, { expose: __expose }) {
|
|
535
514
|
__expose();
|
|
536
|
-
const { buttonActive: active, open, hotkeyLabel, handleToggle } = useOpenCodeWidgetContext();
|
|
515
|
+
const { buttonActive: active, open, hotkeyLabel, thinking, handleToggle } = useOpenCodeWidgetContext();
|
|
537
516
|
const __returned__ = {
|
|
538
517
|
active,
|
|
539
518
|
open,
|
|
540
519
|
hotkeyLabel,
|
|
520
|
+
thinking,
|
|
541
521
|
handleToggle
|
|
542
522
|
};
|
|
543
523
|
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
@@ -550,7 +530,10 @@ var __vue_sfc__$1 = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
550
530
|
var _hoisted_1$1 = ["aria-expanded", "title"];
|
|
551
531
|
function __vue_render__$1(_ctx, _cache, $props, $setup, $data, $options) {
|
|
552
532
|
return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
|
|
553
|
-
class: (0, vue.normalizeClass)(["opencode-button", {
|
|
533
|
+
class: (0, vue.normalizeClass)(["opencode-button", {
|
|
534
|
+
active: $setup.active,
|
|
535
|
+
thinking: $setup.thinking
|
|
536
|
+
}]),
|
|
554
537
|
type: "button",
|
|
555
538
|
"aria-expanded": $setup.open,
|
|
556
539
|
"aria-label": "打开 AI 助手",
|
|
@@ -1169,6 +1152,11 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
|
|
|
1169
1152
|
type: Boolean,
|
|
1170
1153
|
required: false,
|
|
1171
1154
|
default: true
|
|
1155
|
+
},
|
|
1156
|
+
thinking: {
|
|
1157
|
+
type: Boolean,
|
|
1158
|
+
required: false,
|
|
1159
|
+
default: false
|
|
1172
1160
|
}
|
|
1173
1161
|
},
|
|
1174
1162
|
emits: [
|
|
@@ -1178,6 +1166,7 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
|
|
|
1178
1166
|
"update:currentSessionId",
|
|
1179
1167
|
"update:selectedElements",
|
|
1180
1168
|
"update:theme",
|
|
1169
|
+
"update:thinking",
|
|
1181
1170
|
"toggle",
|
|
1182
1171
|
"close",
|
|
1183
1172
|
"toggle-session-list",
|
|
@@ -1190,7 +1179,8 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
|
|
|
1190
1179
|
"remove-selected-node",
|
|
1191
1180
|
"clear-selected-nodes",
|
|
1192
1181
|
"empty-action",
|
|
1193
|
-
"frame-loaded"
|
|
1182
|
+
"frame-loaded",
|
|
1183
|
+
"thinking-change"
|
|
1194
1184
|
],
|
|
1195
1185
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
1196
1186
|
const props = __props;
|
|
@@ -1225,12 +1215,18 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
|
|
|
1225
1215
|
dialogVisible.value = false;
|
|
1226
1216
|
if (dialogResolve) dialogResolve(false);
|
|
1227
1217
|
};
|
|
1218
|
+
const frameRef = (0, vue.ref)(null);
|
|
1219
|
+
const sendMessageToIframe = (type, data) => {
|
|
1220
|
+
var _a;
|
|
1221
|
+
(_a = frameRef.value) == null || _a.sendMessageToIframe(type, data);
|
|
1222
|
+
};
|
|
1228
1223
|
const handleFrameLoaded = () => {
|
|
1229
1224
|
emit("frame-loaded");
|
|
1230
1225
|
};
|
|
1231
1226
|
__expose({
|
|
1232
1227
|
showNotification,
|
|
1233
|
-
showConfirmDialog
|
|
1228
|
+
showConfirmDialog,
|
|
1229
|
+
sendMessageToIframe
|
|
1234
1230
|
});
|
|
1235
1231
|
const localSessionListCollapsed = (0, vue.ref)(props.sessionListCollapsed);
|
|
1236
1232
|
(0, vue.watch)(() => props.sessionListCollapsed, (val) => {
|
|
@@ -1327,6 +1323,7 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
|
|
|
1327
1323
|
emptyStateActionText: (0, vue.toRef)(props, "emptyStateActionText"),
|
|
1328
1324
|
showClearAll: (0, vue.toRef)(props, "showClearAll"),
|
|
1329
1325
|
open: (0, vue.toRef)(props, "open"),
|
|
1326
|
+
thinking: (0, vue.toRef)(props, "thinking"),
|
|
1330
1327
|
iframeSource,
|
|
1331
1328
|
buttonActive,
|
|
1332
1329
|
sessionListTitle,
|
|
@@ -1372,6 +1369,8 @@ var __vue_sfc__ = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps(__sprea
|
|
|
1372
1369
|
showConfirmDialog,
|
|
1373
1370
|
handleDialogConfirm,
|
|
1374
1371
|
handleDialogCancel,
|
|
1372
|
+
frameRef,
|
|
1373
|
+
sendMessageToIframe,
|
|
1375
1374
|
handleFrameLoaded,
|
|
1376
1375
|
localSessionListCollapsed,
|
|
1377
1376
|
buttonActive,
|
|
@@ -1467,7 +1466,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
1467
1466
|
empty: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "sessions-empty", {}, () => [_cache[0] || (_cache[0] = (0, vue.createElementVNode)("div", { class: "opencode-session-empty" }, "暂无会话", -1))])]),
|
|
1468
1467
|
_: 3
|
|
1469
1468
|
}),
|
|
1470
|
-
(0, vue.createVNode)($setup["Frame"],
|
|
1469
|
+
(0, vue.createVNode)($setup["Frame"], { ref: "frameRef" }, (0, vue.createSlots)({ _: 2 }, [
|
|
1471
1470
|
$setup.slots["empty-state"] ? {
|
|
1472
1471
|
name: "empty-state",
|
|
1473
1472
|
fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "empty-state")]),
|
|
@@ -1488,7 +1487,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
1488
1487
|
fn: (0, vue.withCtx)(() => [(0, vue.renderSlot)(_ctx.$slots, "content")]),
|
|
1489
1488
|
key: "3"
|
|
1490
1489
|
} : void 0
|
|
1491
|
-
]),
|
|
1490
|
+
]), 1536),
|
|
1492
1491
|
(0, vue.createVNode)($setup["SelectedNodes"])
|
|
1493
1492
|
])
|
|
1494
1493
|
], 2), [[vue.vShow, !$props.selectMode]]),
|
|
@@ -1519,7 +1518,7 @@ __vue_sfc__.render = __vue_render__;
|
|
|
1519
1518
|
var open_code_widget_default = __vue_sfc__;
|
|
1520
1519
|
//#endregion
|
|
1521
1520
|
//#region es/index.js
|
|
1522
|
-
var version = "1.0.
|
|
1521
|
+
var version = "1.0.16";
|
|
1523
1522
|
function install(app, options) {
|
|
1524
1523
|
[open_code_widget_default].forEach((item) => {
|
|
1525
1524
|
if (item.install) app.use(item, options);
|
|
@@ -32,35 +32,19 @@ var __spreadValues$1 = (a, b) => {
|
|
|
32
32
|
var __vue_sfc__$7 = /* @__PURE__ */ defineComponent({
|
|
33
33
|
__name: "Frame",
|
|
34
34
|
setup(__props, { expose: __expose }) {
|
|
35
|
-
__expose();
|
|
36
35
|
const iframeRef = ref(null);
|
|
37
|
-
const { frameLoading, showEmptyState, showError, iframeSource: iframeSrc, emptyStateText, emptyStateActionText, handleEmptyAction, handleFrameLoaded
|
|
38
|
-
const iframeReady = ref(false);
|
|
36
|
+
const { frameLoading, showEmptyState, showError, iframeSource: iframeSrc, emptyStateText, emptyStateActionText, handleEmptyAction, handleFrameLoaded } = useOpenCodeWidgetContext();
|
|
39
37
|
function sendMessageToIframe(type, data) {
|
|
40
38
|
var _a;
|
|
41
39
|
if (!((_a = iframeRef.value) == null ? void 0 : _a.contentWindow)) return;
|
|
42
40
|
iframeRef.value.contentWindow.postMessage(__spreadValues$1({ type }, data), "*");
|
|
43
41
|
}
|
|
44
|
-
function syncIframeTheme() {
|
|
45
|
-
sendMessageToIframe("OPENCODE_SET_THEME", { theme: resolvedTheme.value });
|
|
46
|
-
}
|
|
47
|
-
function handleIframeMessage(event) {
|
|
48
|
-
var _a;
|
|
49
|
-
if (((_a = event.data) == null ? void 0 : _a.type) === "OPENCODE_READY") syncIframeTheme();
|
|
50
|
-
}
|
|
51
|
-
watch([theme, resolvedTheme], () => {
|
|
52
|
-
syncIframeTheme();
|
|
53
|
-
});
|
|
54
42
|
onMounted(() => {
|
|
55
43
|
if (iframeRef.value) iframeRef.value.addEventListener("load", () => {
|
|
56
|
-
iframeReady.value = true;
|
|
57
44
|
handleFrameLoaded();
|
|
58
45
|
});
|
|
59
|
-
window.addEventListener("message", handleIframeMessage);
|
|
60
|
-
});
|
|
61
|
-
onUnmounted(() => {
|
|
62
|
-
window.removeEventListener("message", handleIframeMessage);
|
|
63
46
|
});
|
|
47
|
+
__expose({ sendMessageToIframe });
|
|
64
48
|
const __returned__ = {
|
|
65
49
|
iframeRef,
|
|
66
50
|
frameLoading,
|
|
@@ -71,12 +55,7 @@ var __vue_sfc__$7 = /* @__PURE__ */ defineComponent({
|
|
|
71
55
|
emptyStateActionText,
|
|
72
56
|
handleEmptyAction,
|
|
73
57
|
handleFrameLoaded,
|
|
74
|
-
|
|
75
|
-
resolvedTheme,
|
|
76
|
-
iframeReady,
|
|
77
|
-
sendMessageToIframe,
|
|
78
|
-
syncIframeTheme,
|
|
79
|
-
handleIframeMessage
|
|
58
|
+
sendMessageToIframe
|
|
80
59
|
};
|
|
81
60
|
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
82
61
|
enumerable: false,
|
|
@@ -529,11 +508,12 @@ var __vue_sfc__$1 = /* @__PURE__ */ defineComponent({
|
|
|
529
508
|
__name: "Trigger",
|
|
530
509
|
setup(__props, { expose: __expose }) {
|
|
531
510
|
__expose();
|
|
532
|
-
const { buttonActive: active, open, hotkeyLabel, handleToggle } = useOpenCodeWidgetContext();
|
|
511
|
+
const { buttonActive: active, open, hotkeyLabel, thinking, handleToggle } = useOpenCodeWidgetContext();
|
|
533
512
|
const __returned__ = {
|
|
534
513
|
active,
|
|
535
514
|
open,
|
|
536
515
|
hotkeyLabel,
|
|
516
|
+
thinking,
|
|
537
517
|
handleToggle
|
|
538
518
|
};
|
|
539
519
|
Object.defineProperty(__returned__, "__isScriptSetup", {
|
|
@@ -546,7 +526,10 @@ var __vue_sfc__$1 = /* @__PURE__ */ defineComponent({
|
|
|
546
526
|
var _hoisted_1$1 = ["aria-expanded", "title"];
|
|
547
527
|
function __vue_render__$1(_ctx, _cache, $props, $setup, $data, $options) {
|
|
548
528
|
return openBlock(), createElementBlock("button", {
|
|
549
|
-
class: normalizeClass(["opencode-button", {
|
|
529
|
+
class: normalizeClass(["opencode-button", {
|
|
530
|
+
active: $setup.active,
|
|
531
|
+
thinking: $setup.thinking
|
|
532
|
+
}]),
|
|
550
533
|
type: "button",
|
|
551
534
|
"aria-expanded": $setup.open,
|
|
552
535
|
"aria-label": "打开 AI 助手",
|
|
@@ -1165,6 +1148,11 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
|
|
|
1165
1148
|
type: Boolean,
|
|
1166
1149
|
required: false,
|
|
1167
1150
|
default: true
|
|
1151
|
+
},
|
|
1152
|
+
thinking: {
|
|
1153
|
+
type: Boolean,
|
|
1154
|
+
required: false,
|
|
1155
|
+
default: false
|
|
1168
1156
|
}
|
|
1169
1157
|
},
|
|
1170
1158
|
emits: [
|
|
@@ -1174,6 +1162,7 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
|
|
|
1174
1162
|
"update:currentSessionId",
|
|
1175
1163
|
"update:selectedElements",
|
|
1176
1164
|
"update:theme",
|
|
1165
|
+
"update:thinking",
|
|
1177
1166
|
"toggle",
|
|
1178
1167
|
"close",
|
|
1179
1168
|
"toggle-session-list",
|
|
@@ -1186,7 +1175,8 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
|
|
|
1186
1175
|
"remove-selected-node",
|
|
1187
1176
|
"clear-selected-nodes",
|
|
1188
1177
|
"empty-action",
|
|
1189
|
-
"frame-loaded"
|
|
1178
|
+
"frame-loaded",
|
|
1179
|
+
"thinking-change"
|
|
1190
1180
|
],
|
|
1191
1181
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
1192
1182
|
const props = __props;
|
|
@@ -1221,12 +1211,18 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
|
|
|
1221
1211
|
dialogVisible.value = false;
|
|
1222
1212
|
if (dialogResolve) dialogResolve(false);
|
|
1223
1213
|
};
|
|
1214
|
+
const frameRef = ref(null);
|
|
1215
|
+
const sendMessageToIframe = (type, data) => {
|
|
1216
|
+
var _a;
|
|
1217
|
+
(_a = frameRef.value) == null || _a.sendMessageToIframe(type, data);
|
|
1218
|
+
};
|
|
1224
1219
|
const handleFrameLoaded = () => {
|
|
1225
1220
|
emit("frame-loaded");
|
|
1226
1221
|
};
|
|
1227
1222
|
__expose({
|
|
1228
1223
|
showNotification,
|
|
1229
|
-
showConfirmDialog
|
|
1224
|
+
showConfirmDialog,
|
|
1225
|
+
sendMessageToIframe
|
|
1230
1226
|
});
|
|
1231
1227
|
const localSessionListCollapsed = ref(props.sessionListCollapsed);
|
|
1232
1228
|
watch(() => props.sessionListCollapsed, (val) => {
|
|
@@ -1323,6 +1319,7 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
|
|
|
1323
1319
|
emptyStateActionText: toRef(props, "emptyStateActionText"),
|
|
1324
1320
|
showClearAll: toRef(props, "showClearAll"),
|
|
1325
1321
|
open: toRef(props, "open"),
|
|
1322
|
+
thinking: toRef(props, "thinking"),
|
|
1326
1323
|
iframeSource,
|
|
1327
1324
|
buttonActive,
|
|
1328
1325
|
sessionListTitle,
|
|
@@ -1368,6 +1365,8 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
|
|
|
1368
1365
|
showConfirmDialog,
|
|
1369
1366
|
handleDialogConfirm,
|
|
1370
1367
|
handleDialogCancel,
|
|
1368
|
+
frameRef,
|
|
1369
|
+
sendMessageToIframe,
|
|
1371
1370
|
handleFrameLoaded,
|
|
1372
1371
|
localSessionListCollapsed,
|
|
1373
1372
|
buttonActive,
|
|
@@ -1463,7 +1462,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
1463
1462
|
empty: withCtx(() => [renderSlot(_ctx.$slots, "sessions-empty", {}, () => [_cache[0] || (_cache[0] = createElementVNode("div", { class: "opencode-session-empty" }, "暂无会话", -1))])]),
|
|
1464
1463
|
_: 3
|
|
1465
1464
|
}),
|
|
1466
|
-
createVNode($setup["Frame"],
|
|
1465
|
+
createVNode($setup["Frame"], { ref: "frameRef" }, createSlots({ _: 2 }, [
|
|
1467
1466
|
$setup.slots["empty-state"] ? {
|
|
1468
1467
|
name: "empty-state",
|
|
1469
1468
|
fn: withCtx(() => [renderSlot(_ctx.$slots, "empty-state")]),
|
|
@@ -1484,7 +1483,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
1484
1483
|
fn: withCtx(() => [renderSlot(_ctx.$slots, "content")]),
|
|
1485
1484
|
key: "3"
|
|
1486
1485
|
} : void 0
|
|
1487
|
-
]),
|
|
1486
|
+
]), 1536),
|
|
1488
1487
|
createVNode($setup["SelectedNodes"])
|
|
1489
1488
|
])
|
|
1490
1489
|
], 2), [[vShow, !$props.selectMode]]),
|
|
@@ -1515,7 +1514,7 @@ __vue_sfc__.render = __vue_render__;
|
|
|
1515
1514
|
var open_code_widget_default = __vue_sfc__;
|
|
1516
1515
|
//#endregion
|
|
1517
1516
|
//#region es/index.js
|
|
1518
|
-
var version = "1.0.
|
|
1517
|
+
var version = "1.0.16";
|
|
1519
1518
|
function install(app, options) {
|
|
1520
1519
|
[open_code_widget_default].forEach((item) => {
|
|
1521
1520
|
if (item.install) app.use(item, options);
|
package/lib/components.css
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
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-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:
|
|
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)}}
|
|
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
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
6
|
.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
7
|
.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
|
-
.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}.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.
|
|
8
|
+
.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}}
|
|
9
9
|
/*$vite$:1*/
|
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.
|
|
3
|
+
declare const version = "1.0.16";
|
|
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.
|
|
37
|
+
const version = "1.0.16";
|
|
38
38
|
function install(app, options) {
|
|
39
39
|
const components = [
|
|
40
40
|
import_open_code_widget.default
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
declare function sendMessageToIframe(type: string, data?: Record<string, unknown>): void;
|
|
1
2
|
declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {};
|
|
2
3
|
type __VLS_Slots = {} & {
|
|
3
4
|
'empty-state'?: (props: typeof __VLS_1) => any;
|
|
@@ -8,7 +9,9 @@ type __VLS_Slots = {} & {
|
|
|
8
9
|
} & {
|
|
9
10
|
content?: (props: typeof __VLS_7) => any;
|
|
10
11
|
};
|
|
11
|
-
declare const __VLS_component: import("vue").DefineComponent<{}, {
|
|
12
|
+
declare const __VLS_component: import("vue").DefineComponent<{}, {
|
|
13
|
+
sendMessageToIframe: typeof sendMessageToIframe;
|
|
14
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
12
15
|
declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
|
|
13
16
|
export default _default;
|
|
14
17
|
type __VLS_WithSlots<T, S> = T & {
|
|
@@ -42,7 +42,6 @@ var import_vue3 = require("vue");
|
|
|
42
42
|
const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
|
|
43
43
|
__name: "Frame",
|
|
44
44
|
setup(__props, { expose: __expose }) {
|
|
45
|
-
__expose();
|
|
46
45
|
const iframeRef = (0, import_vue2.ref)(null);
|
|
47
46
|
const {
|
|
48
47
|
frameLoading,
|
|
@@ -52,41 +51,24 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
|
|
|
52
51
|
emptyStateText,
|
|
53
52
|
emptyStateActionText,
|
|
54
53
|
handleEmptyAction,
|
|
55
|
-
handleFrameLoaded
|
|
56
|
-
theme,
|
|
57
|
-
resolvedTheme
|
|
54
|
+
handleFrameLoaded
|
|
58
55
|
} = (0, import_context.useOpenCodeWidgetContext)();
|
|
59
|
-
const iframeReady = (0, import_vue2.ref)(false);
|
|
60
56
|
function sendMessageToIframe(type, data) {
|
|
61
57
|
var _a;
|
|
62
58
|
if (!((_a = iframeRef.value) == null ? void 0 : _a.contentWindow)) return;
|
|
63
59
|
iframeRef.value.contentWindow.postMessage(__spreadValues({ type }, data), "*");
|
|
64
60
|
}
|
|
65
|
-
function syncIframeTheme() {
|
|
66
|
-
sendMessageToIframe("OPENCODE_SET_THEME", { theme: resolvedTheme.value });
|
|
67
|
-
}
|
|
68
|
-
function handleIframeMessage(event) {
|
|
69
|
-
var _a;
|
|
70
|
-
if (((_a = event.data) == null ? void 0 : _a.type) === "OPENCODE_READY") {
|
|
71
|
-
syncIframeTheme();
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
(0, import_vue2.watch)([theme, resolvedTheme], () => {
|
|
75
|
-
syncIframeTheme();
|
|
76
|
-
});
|
|
77
61
|
(0, import_vue2.onMounted)(() => {
|
|
78
62
|
if (iframeRef.value) {
|
|
79
63
|
iframeRef.value.addEventListener("load", () => {
|
|
80
|
-
iframeReady.value = true;
|
|
81
64
|
handleFrameLoaded();
|
|
82
65
|
});
|
|
83
66
|
}
|
|
84
|
-
window.addEventListener("message", handleIframeMessage);
|
|
85
67
|
});
|
|
86
|
-
(
|
|
87
|
-
|
|
68
|
+
__expose({
|
|
69
|
+
sendMessageToIframe
|
|
88
70
|
});
|
|
89
|
-
const __returned__ = { iframeRef, frameLoading, showEmptyState, showError, iframeSrc, emptyStateText, emptyStateActionText, handleEmptyAction, handleFrameLoaded,
|
|
71
|
+
const __returned__ = { iframeRef, frameLoading, showEmptyState, showError, iframeSrc, emptyStateText, emptyStateActionText, handleEmptyAction, handleFrameLoaded, sendMessageToIframe };
|
|
90
72
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
91
73
|
return __returned__;
|
|
92
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.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}.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.
|
|
1
|
+
.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}}
|
|
@@ -28,8 +28,14 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
|
|
|
28
28
|
__name: "Trigger",
|
|
29
29
|
setup(__props, { expose: __expose }) {
|
|
30
30
|
__expose();
|
|
31
|
-
const {
|
|
32
|
-
|
|
31
|
+
const {
|
|
32
|
+
buttonActive: active,
|
|
33
|
+
open,
|
|
34
|
+
hotkeyLabel,
|
|
35
|
+
thinking,
|
|
36
|
+
handleToggle
|
|
37
|
+
} = (0, import_context.useOpenCodeWidgetContext)();
|
|
38
|
+
const __returned__ = { active, open, hotkeyLabel, thinking, handleToggle };
|
|
33
39
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
34
40
|
return __returned__;
|
|
35
41
|
}
|
|
@@ -37,7 +43,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
|
|
|
37
43
|
const _hoisted_1 = ["aria-expanded", "title"];
|
|
38
44
|
function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
39
45
|
return (0, import_vue2.openBlock)(), (0, import_vue2.createElementBlock)("button", {
|
|
40
|
-
class: (0, import_vue2.normalizeClass)(["opencode-button", { active: $setup.active }]),
|
|
46
|
+
class: (0, import_vue2.normalizeClass)(["opencode-button", { active: $setup.active, thinking: $setup.thinking }]),
|
|
41
47
|
type: "button",
|
|
42
48
|
"aria-expanded": $setup.open,
|
|
43
49
|
"aria-label": "\u6253\u5F00 AI \u52A9\u624B",
|
|
@@ -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-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:
|
|
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,5 +1,5 @@
|
|
|
1
1
|
import type { OpenCodeWidgetProps } from "./types";
|
|
2
|
-
declare var __VLS_4: {}, __VLS_12: {}, __VLS_14: {}, __VLS_16: {}, __VLS_21: {},
|
|
2
|
+
declare var __VLS_4: {}, __VLS_12: {}, __VLS_14: {}, __VLS_16: {}, __VLS_21: {}, __VLS_28: {}, __VLS_30: {}, __VLS_32: {}, __VLS_34: {};
|
|
3
3
|
type __VLS_Slots = {} & {
|
|
4
4
|
'button-icon'?: (props: typeof __VLS_4) => any;
|
|
5
5
|
} & {
|
|
@@ -11,17 +11,18 @@ type __VLS_Slots = {} & {
|
|
|
11
11
|
} & {
|
|
12
12
|
'sessions-empty'?: (props: typeof __VLS_21) => any;
|
|
13
13
|
} & {
|
|
14
|
-
'empty-state'?: (props: typeof
|
|
14
|
+
'empty-state'?: (props: typeof __VLS_28) => any;
|
|
15
15
|
} & {
|
|
16
|
-
loading?: (props: typeof
|
|
16
|
+
loading?: (props: typeof __VLS_30) => any;
|
|
17
17
|
} & {
|
|
18
|
-
error?: (props: typeof
|
|
18
|
+
error?: (props: typeof __VLS_32) => any;
|
|
19
19
|
} & {
|
|
20
|
-
content?: (props: typeof
|
|
20
|
+
content?: (props: typeof __VLS_34) => any;
|
|
21
21
|
};
|
|
22
22
|
declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps, {
|
|
23
23
|
showNotification: (message: string, duration?: number) => void;
|
|
24
24
|
showConfirmDialog: (message: string) => Promise<boolean>;
|
|
25
|
+
sendMessageToIframe: (type: string, data?: Record<string, unknown>) => void;
|
|
25
26
|
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
26
27
|
close: () => any;
|
|
27
28
|
toggle: (value: boolean) => any;
|
|
@@ -33,6 +34,7 @@ declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps
|
|
|
33
34
|
"update:currentSessionId": (value: string | null) => any;
|
|
34
35
|
"update:selectedElements": (value: import("@vite-plugin-opencode-assistant/shared").OpenCodeSelectedElement[]) => any;
|
|
35
36
|
"update:theme": (value: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetTheme) => any;
|
|
37
|
+
"update:thinking": (value: boolean) => any;
|
|
36
38
|
"toggle-session-list": (value: boolean) => any;
|
|
37
39
|
"toggle-select-mode": (value: boolean) => any;
|
|
38
40
|
"toggle-theme": (value: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetTheme) => any;
|
|
@@ -42,6 +44,7 @@ declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps
|
|
|
42
44
|
"clear-selected-nodes": () => any;
|
|
43
45
|
"empty-action": () => any;
|
|
44
46
|
"frame-loaded": () => any;
|
|
47
|
+
"thinking-change": (value: boolean) => any;
|
|
45
48
|
}, string, import("vue").PublicProps, Readonly<OpenCodeWidgetProps> & Readonly<{
|
|
46
49
|
onClose?: (() => any) | undefined;
|
|
47
50
|
onToggle?: ((value: boolean) => any) | undefined;
|
|
@@ -53,6 +56,7 @@ declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps
|
|
|
53
56
|
"onUpdate:currentSessionId"?: ((value: string | null) => any) | undefined;
|
|
54
57
|
"onUpdate:selectedElements"?: ((value: import("@vite-plugin-opencode-assistant/shared").OpenCodeSelectedElement[]) => any) | undefined;
|
|
55
58
|
"onUpdate:theme"?: ((value: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetTheme) => any) | undefined;
|
|
59
|
+
"onUpdate:thinking"?: ((value: boolean) => any) | undefined;
|
|
56
60
|
"onToggle-session-list"?: ((value: boolean) => any) | undefined;
|
|
57
61
|
"onToggle-select-mode"?: ((value: boolean) => any) | undefined;
|
|
58
62
|
"onToggle-theme"?: ((value: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetTheme) => any) | undefined;
|
|
@@ -62,18 +66,19 @@ declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps
|
|
|
62
66
|
"onClear-selected-nodes"?: (() => any) | undefined;
|
|
63
67
|
"onEmpty-action"?: (() => any) | undefined;
|
|
64
68
|
"onFrame-loaded"?: (() => any) | undefined;
|
|
69
|
+
"onThinking-change"?: ((value: boolean) => any) | undefined;
|
|
65
70
|
}>, {
|
|
66
71
|
frameLoading: boolean;
|
|
67
72
|
showEmptyState: boolean;
|
|
68
73
|
showError: boolean;
|
|
69
74
|
emptyStateText: string;
|
|
70
75
|
emptyStateActionText: string;
|
|
71
|
-
theme: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetTheme;
|
|
72
76
|
iframeSrc: string;
|
|
73
77
|
title: string;
|
|
74
78
|
sessionListCollapsed: boolean;
|
|
75
79
|
selectMode: boolean;
|
|
76
80
|
selectEnabled: boolean;
|
|
81
|
+
theme: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetTheme;
|
|
77
82
|
selectShortcutLabel: string;
|
|
78
83
|
showClearAll: boolean;
|
|
79
84
|
showSessionListSkeleton: boolean;
|
|
@@ -81,6 +86,7 @@ declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps
|
|
|
81
86
|
sessions: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetSession[];
|
|
82
87
|
open: boolean;
|
|
83
88
|
hotkeyLabel: string;
|
|
89
|
+
thinking: boolean;
|
|
84
90
|
position: import("@vite-plugin-opencode-assistant/shared").OpenCodeWidgetPosition;
|
|
85
91
|
currentSessionId: string | null;
|
|
86
92
|
selectedElements: import("@vite-plugin-opencode-assistant/shared").OpenCodeSelectedElement[];
|
|
@@ -89,9 +89,10 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProp
|
|
|
89
89
|
currentSessionId: { type: [String, null], required: false, default: null },
|
|
90
90
|
selectedElements: { type: Array, required: false, default: () => [] },
|
|
91
91
|
showClearAll: { type: Boolean, required: false, default: true },
|
|
92
|
-
selectEnabled: { type: Boolean, required: false, default: true }
|
|
92
|
+
selectEnabled: { type: Boolean, required: false, default: true },
|
|
93
|
+
thinking: { type: Boolean, required: false, default: false }
|
|
93
94
|
},
|
|
94
|
-
emits: ["update:open", "update:selectMode", "update:sessionListCollapsed", "update:currentSessionId", "update:selectedElements", "update:theme", "toggle", "close", "toggle-session-list", "toggle-select-mode", "toggle-theme", "create-session", "select-session", "delete-session", "click-selected-node", "remove-selected-node", "clear-selected-nodes", "empty-action", "frame-loaded"],
|
|
95
|
+
emits: ["update:open", "update:selectMode", "update:sessionListCollapsed", "update:currentSessionId", "update:selectedElements", "update:theme", "update:thinking", "toggle", "close", "toggle-session-list", "toggle-select-mode", "toggle-theme", "create-session", "select-session", "delete-session", "click-selected-node", "remove-selected-node", "clear-selected-nodes", "empty-action", "frame-loaded", "thinking-change"],
|
|
95
96
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
96
97
|
const props = __props;
|
|
97
98
|
const emit = __emit;
|
|
@@ -125,12 +126,18 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProp
|
|
|
125
126
|
dialogVisible.value = false;
|
|
126
127
|
if (dialogResolve) dialogResolve(false);
|
|
127
128
|
};
|
|
129
|
+
const frameRef = (0, import_vue2.ref)(null);
|
|
130
|
+
const sendMessageToIframe = (type, data) => {
|
|
131
|
+
var _a;
|
|
132
|
+
(_a = frameRef.value) == null ? void 0 : _a.sendMessageToIframe(type, data);
|
|
133
|
+
};
|
|
128
134
|
const handleFrameLoaded = () => {
|
|
129
135
|
emit("frame-loaded");
|
|
130
136
|
};
|
|
131
137
|
__expose({
|
|
132
138
|
showNotification,
|
|
133
|
-
showConfirmDialog
|
|
139
|
+
showConfirmDialog,
|
|
140
|
+
sendMessageToIframe
|
|
134
141
|
});
|
|
135
142
|
const localSessionListCollapsed = (0, import_vue2.ref)(props.sessionListCollapsed);
|
|
136
143
|
(0, import_vue2.watch)(
|
|
@@ -249,6 +256,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProp
|
|
|
249
256
|
emptyStateActionText: (0, import_vue2.toRef)(props, "emptyStateActionText"),
|
|
250
257
|
showClearAll: (0, import_vue2.toRef)(props, "showClearAll"),
|
|
251
258
|
open: (0, import_vue2.toRef)(props, "open"),
|
|
259
|
+
thinking: (0, import_vue2.toRef)(props, "thinking"),
|
|
252
260
|
iframeSource,
|
|
253
261
|
buttonActive,
|
|
254
262
|
sessionListTitle,
|
|
@@ -278,7 +286,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProp
|
|
|
278
286
|
return dialogResolve;
|
|
279
287
|
}, set dialogResolve(v) {
|
|
280
288
|
dialogResolve = v;
|
|
281
|
-
}, showConfirmDialog, handleDialogConfirm, handleDialogCancel, 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 };
|
|
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 };
|
|
282
290
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
283
291
|
return __returned__;
|
|
284
292
|
}
|
|
@@ -392,7 +400,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
392
400
|
}),
|
|
393
401
|
(0, import_vue3.createVNode)(
|
|
394
402
|
$setup["Frame"],
|
|
395
|
-
|
|
403
|
+
{ ref: "frameRef" },
|
|
396
404
|
(0, import_vue3.createSlots)({
|
|
397
405
|
_: 2
|
|
398
406
|
/* DYNAMIC */
|
|
@@ -426,8 +434,8 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
426
434
|
key: "3"
|
|
427
435
|
} : void 0
|
|
428
436
|
]),
|
|
429
|
-
|
|
430
|
-
/* DYNAMIC_SLOTS */
|
|
437
|
+
1536
|
|
438
|
+
/* NEED_PATCH, DYNAMIC_SLOTS */
|
|
431
439
|
),
|
|
432
440
|
(0, import_vue3.createVNode)($setup["SelectedNodes"])
|
|
433
441
|
])
|
package/lib/web-types.json
CHANGED
|
@@ -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.
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vite-plugin-opencode-assistant/components",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.16",
|
|
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.
|
|
33
|
+
"@vite-plugin-opencode-assistant/shared": "1.0.16"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@vitejs/plugin-vue": "^6.0.5",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
},
|
|
43
43
|
"scripts": {
|
|
44
44
|
"build": "pagoda-cli build",
|
|
45
|
-
"
|
|
46
|
-
"
|
|
45
|
+
"dev:site": "pagoda-cli site",
|
|
46
|
+
"build:site": "pagoda-cli build-site",
|
|
47
47
|
"test": "vitest run"
|
|
48
48
|
}
|
|
49
49
|
}
|