@vite-plugin-opencode-assistant/components 1.0.24 → 1.0.25
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/FloatingBubble/FloatingBubble-sfc.css +1 -1
- package/es/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.js +32 -13
- package/lib/@vite-plugin-opencode-assistant/components.cjs.js +31 -12
- package/lib/@vite-plugin-opencode-assistant/components.es.js +32 -13
- package/lib/components.css +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/open-code-widget/src/components/FloatingBubble/FloatingBubble-sfc.css +1 -1
- package/lib/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.js +31 -12
- package/lib/web-types.json +1 -1
- package/package.json +2 -2
package/es/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import OpenCodeWidget from './open-code-widget';
|
|
2
2
|
import type { App } from 'vue';
|
|
3
|
-
declare const version = "1.0.
|
|
3
|
+
declare const version = "1.0.25";
|
|
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 +1 @@
|
|
|
1
|
-
.floating-bubble{position:fixed;top:0;left:0;z-index:999999;cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none;touch-action:none;
|
|
1
|
+
.floating-bubble{position:fixed;top:0;left:0;z-index:999999;cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none;touch-action:none;will-change:transform}.floating-bubble:active{cursor:grabbing}
|
|
@@ -19,7 +19,7 @@ var __spreadValues = (a, b) => {
|
|
|
19
19
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
20
|
import "./FloatingBubble-sfc.css";
|
|
21
21
|
import { defineComponent as _defineComponent } from "vue";
|
|
22
|
-
import { ref, computed, watch, onMounted, onUnmounted
|
|
22
|
+
import { ref, computed, watch, onMounted, onUnmounted } from "vue";
|
|
23
23
|
const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValues({}, {
|
|
24
24
|
name: "FloatingBubble"
|
|
25
25
|
}), {
|
|
@@ -36,12 +36,26 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
|
|
|
36
36
|
const props = __props;
|
|
37
37
|
const emit = __emit;
|
|
38
38
|
const rootRef = ref(null);
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
const getInitialState = () => {
|
|
40
|
+
if (props.offset) {
|
|
41
|
+
return {
|
|
42
|
+
x: props.offset.x,
|
|
43
|
+
y: props.offset.y,
|
|
44
|
+
width: 0,
|
|
45
|
+
height: 0
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (typeof window !== "undefined") {
|
|
49
|
+
return {
|
|
50
|
+
x: window.innerWidth - 42 - 24,
|
|
51
|
+
y: window.innerHeight - 42 - 24,
|
|
52
|
+
width: 0,
|
|
53
|
+
height: 0
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return { x: 0, y: 0, width: 0, height: 0 };
|
|
57
|
+
};
|
|
58
|
+
const state = ref(getInitialState());
|
|
45
59
|
const isObject = (val) => val !== null && typeof val === "object";
|
|
46
60
|
const gapX = computed(
|
|
47
61
|
() => isObject(props.gap) ? props.gap.x : props.gap
|
|
@@ -64,7 +78,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
|
|
|
64
78
|
const x = `${state.value.x}px`;
|
|
65
79
|
const y = `${state.value.y}px`;
|
|
66
80
|
style.transform = `translate3d(${x}, ${y}, 0)`;
|
|
67
|
-
if (dragging.value
|
|
81
|
+
if (dragging.value) {
|
|
68
82
|
style.transition = "none";
|
|
69
83
|
} else {
|
|
70
84
|
style.transition = "transform 0.3s ease";
|
|
@@ -75,6 +89,9 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
|
|
|
75
89
|
const updateState = () => {
|
|
76
90
|
if (!show.value || !rootRef.value || typeof window === "undefined") return;
|
|
77
91
|
const rect = rootRef.value.getBoundingClientRect();
|
|
92
|
+
if (rect.width === 0 || rect.height === 0) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
78
95
|
const { offset } = props;
|
|
79
96
|
let x = offset ? offset.x : windowWidth.value - rect.width - gapX.value;
|
|
80
97
|
let y = offset ? offset.y : windowHeight.value - rect.height - gapY.value;
|
|
@@ -210,9 +227,11 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
|
|
|
210
227
|
}
|
|
211
228
|
};
|
|
212
229
|
onMounted(() => {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
230
|
+
requestAnimationFrame(() => {
|
|
231
|
+
updateState();
|
|
232
|
+
requestAnimationFrame(() => {
|
|
233
|
+
initialized.value = true;
|
|
234
|
+
});
|
|
216
235
|
});
|
|
217
236
|
if (typeof window !== "undefined") {
|
|
218
237
|
window.addEventListener("resize", handleResize);
|
|
@@ -245,7 +264,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
|
|
|
245
264
|
isOnRightSide,
|
|
246
265
|
offset: computed(() => ({ x: state.value.x, y: state.value.y }))
|
|
247
266
|
});
|
|
248
|
-
const __returned__ = { props, emit, rootRef, state, isObject, gapX, gapY, windowWidth, windowHeight, boundary, dragging, initialized, rootStyle, show, updateState, touch, get prevX() {
|
|
267
|
+
const __returned__ = { props, emit, rootRef, getInitialState, state, isObject, gapX, gapY, windowWidth, windowHeight, boundary, dragging, initialized, rootStyle, show, updateState, touch, get prevX() {
|
|
249
268
|
return prevX;
|
|
250
269
|
}, set prevX(v) {
|
|
251
270
|
prevX = v;
|
|
@@ -279,7 +298,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
279
298
|
36
|
|
280
299
|
/* STYLE, NEED_HYDRATION */
|
|
281
300
|
), [
|
|
282
|
-
[_vShow, $setup.show]
|
|
301
|
+
[_vShow, $setup.show && $setup.initialized]
|
|
283
302
|
])
|
|
284
303
|
], 8, ["to"]);
|
|
285
304
|
}
|
|
@@ -592,12 +592,27 @@ var __vue_sfc__$2 = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps$1(__s
|
|
|
592
592
|
const props = __props;
|
|
593
593
|
const emit = __emit;
|
|
594
594
|
const rootRef = (0, vue.ref)(null);
|
|
595
|
-
const
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
595
|
+
const getInitialState = () => {
|
|
596
|
+
if (props.offset) return {
|
|
597
|
+
x: props.offset.x,
|
|
598
|
+
y: props.offset.y,
|
|
599
|
+
width: 0,
|
|
600
|
+
height: 0
|
|
601
|
+
};
|
|
602
|
+
if (typeof window !== "undefined") return {
|
|
603
|
+
x: window.innerWidth - 42 - 24,
|
|
604
|
+
y: window.innerHeight - 42 - 24,
|
|
605
|
+
width: 0,
|
|
606
|
+
height: 0
|
|
607
|
+
};
|
|
608
|
+
return {
|
|
609
|
+
x: 0,
|
|
610
|
+
y: 0,
|
|
611
|
+
width: 0,
|
|
612
|
+
height: 0
|
|
613
|
+
};
|
|
614
|
+
};
|
|
615
|
+
const state = (0, vue.ref)(getInitialState());
|
|
601
616
|
const isObject = (val) => val !== null && typeof val === "object";
|
|
602
617
|
const gapX = (0, vue.computed)(() => isObject(props.gap) ? props.gap.x : props.gap);
|
|
603
618
|
const gapY = (0, vue.computed)(() => isObject(props.gap) ? props.gap.y : props.gap);
|
|
@@ -614,7 +629,7 @@ var __vue_sfc__$2 = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps$1(__s
|
|
|
614
629
|
const rootStyle = (0, vue.computed)(() => {
|
|
615
630
|
const style = {};
|
|
616
631
|
style.transform = `translate3d(${`${state.value.x}px`}, ${`${state.value.y}px`}, 0)`;
|
|
617
|
-
if (dragging.value
|
|
632
|
+
if (dragging.value) style.transition = "none";
|
|
618
633
|
else style.transition = "transform 0.3s ease";
|
|
619
634
|
return style;
|
|
620
635
|
});
|
|
@@ -622,6 +637,7 @@ var __vue_sfc__$2 = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps$1(__s
|
|
|
622
637
|
const updateState = () => {
|
|
623
638
|
if (!show.value || !rootRef.value || typeof window === "undefined") return;
|
|
624
639
|
const rect = rootRef.value.getBoundingClientRect();
|
|
640
|
+
if (rect.width === 0 || rect.height === 0) return;
|
|
625
641
|
const { offset } = props;
|
|
626
642
|
let x = offset ? offset.x : windowWidth.value - rect.width - gapX.value;
|
|
627
643
|
let y = offset ? offset.y : windowHeight.value - rect.height - gapY.value;
|
|
@@ -743,9 +759,11 @@ var __vue_sfc__$2 = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps$1(__s
|
|
|
743
759
|
}
|
|
744
760
|
};
|
|
745
761
|
(0, vue.onMounted)(() => {
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
762
|
+
requestAnimationFrame(() => {
|
|
763
|
+
updateState();
|
|
764
|
+
requestAnimationFrame(() => {
|
|
765
|
+
initialized.value = true;
|
|
766
|
+
});
|
|
749
767
|
});
|
|
750
768
|
if (typeof window !== "undefined") window.addEventListener("resize", handleResize);
|
|
751
769
|
if (rootRef.value) rootRef.value.addEventListener("touchmove", onTouchMove, { passive: false });
|
|
@@ -779,6 +797,7 @@ var __vue_sfc__$2 = /* @__PURE__ */ (0, vue.defineComponent)(__spreadProps$1(__s
|
|
|
779
797
|
props,
|
|
780
798
|
emit,
|
|
781
799
|
rootRef,
|
|
800
|
+
getInitialState,
|
|
782
801
|
state,
|
|
783
802
|
isObject,
|
|
784
803
|
gapX,
|
|
@@ -829,7 +848,7 @@ function __vue_render__$2(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
829
848
|
onTouchcancel: $setup.onTouchEnd,
|
|
830
849
|
onMousedown: $setup.onTouchStart,
|
|
831
850
|
onClickCapture: $setup.onClick
|
|
832
|
-
}, [(0, vue.renderSlot)(_ctx.$slots, "default")], 36), [[vue.vShow, $setup.show]])], 8, ["to"]);
|
|
851
|
+
}, [(0, vue.renderSlot)(_ctx.$slots, "default")], 36), [[vue.vShow, $setup.show && $setup.initialized]])], 8, ["to"]);
|
|
833
852
|
}
|
|
834
853
|
__vue_sfc__$2.render = __vue_render__$2;
|
|
835
854
|
var FloatingBubble_vue_default = __vue_sfc__$2;
|
|
@@ -2206,7 +2225,7 @@ __vue_sfc__.render = __vue_render__;
|
|
|
2206
2225
|
var open_code_widget_default = __vue_sfc__;
|
|
2207
2226
|
//#endregion
|
|
2208
2227
|
//#region es/index.js
|
|
2209
|
-
var version = "1.0.
|
|
2228
|
+
var version = "1.0.25";
|
|
2210
2229
|
function install(app, options) {
|
|
2211
2230
|
[open_code_widget_default].forEach((item) => {
|
|
2212
2231
|
if (item.install) app.use(item, options);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Fragment, Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createStaticVNode, createVNode, defineComponent, inject,
|
|
1
|
+
import { Fragment, Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createStaticVNode, createVNode, defineComponent, inject, normalizeClass, normalizeStyle, onMounted, onUnmounted, openBlock, provide, ref, renderList, renderSlot, toDisplayString, toRef, useSlots, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
|
|
2
2
|
import { truncate } from "@vite-plugin-opencode-assistant/shared";
|
|
3
3
|
import getCssSelector from "css-selector-generator";
|
|
4
4
|
//#region es/open-code-widget/src/context.js
|
|
@@ -565,12 +565,27 @@ var __vue_sfc__$2 = /* @__PURE__ */ defineComponent(__spreadProps$1(__spreadValu
|
|
|
565
565
|
const props = __props;
|
|
566
566
|
const emit = __emit;
|
|
567
567
|
const rootRef = ref(null);
|
|
568
|
-
const
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
568
|
+
const getInitialState = () => {
|
|
569
|
+
if (props.offset) return {
|
|
570
|
+
x: props.offset.x,
|
|
571
|
+
y: props.offset.y,
|
|
572
|
+
width: 0,
|
|
573
|
+
height: 0
|
|
574
|
+
};
|
|
575
|
+
if (typeof window !== "undefined") return {
|
|
576
|
+
x: window.innerWidth - 42 - 24,
|
|
577
|
+
y: window.innerHeight - 42 - 24,
|
|
578
|
+
width: 0,
|
|
579
|
+
height: 0
|
|
580
|
+
};
|
|
581
|
+
return {
|
|
582
|
+
x: 0,
|
|
583
|
+
y: 0,
|
|
584
|
+
width: 0,
|
|
585
|
+
height: 0
|
|
586
|
+
};
|
|
587
|
+
};
|
|
588
|
+
const state = ref(getInitialState());
|
|
574
589
|
const isObject = (val) => val !== null && typeof val === "object";
|
|
575
590
|
const gapX = computed(() => isObject(props.gap) ? props.gap.x : props.gap);
|
|
576
591
|
const gapY = computed(() => isObject(props.gap) ? props.gap.y : props.gap);
|
|
@@ -587,7 +602,7 @@ var __vue_sfc__$2 = /* @__PURE__ */ defineComponent(__spreadProps$1(__spreadValu
|
|
|
587
602
|
const rootStyle = computed(() => {
|
|
588
603
|
const style = {};
|
|
589
604
|
style.transform = `translate3d(${`${state.value.x}px`}, ${`${state.value.y}px`}, 0)`;
|
|
590
|
-
if (dragging.value
|
|
605
|
+
if (dragging.value) style.transition = "none";
|
|
591
606
|
else style.transition = "transform 0.3s ease";
|
|
592
607
|
return style;
|
|
593
608
|
});
|
|
@@ -595,6 +610,7 @@ var __vue_sfc__$2 = /* @__PURE__ */ defineComponent(__spreadProps$1(__spreadValu
|
|
|
595
610
|
const updateState = () => {
|
|
596
611
|
if (!show.value || !rootRef.value || typeof window === "undefined") return;
|
|
597
612
|
const rect = rootRef.value.getBoundingClientRect();
|
|
613
|
+
if (rect.width === 0 || rect.height === 0) return;
|
|
598
614
|
const { offset } = props;
|
|
599
615
|
let x = offset ? offset.x : windowWidth.value - rect.width - gapX.value;
|
|
600
616
|
let y = offset ? offset.y : windowHeight.value - rect.height - gapY.value;
|
|
@@ -716,9 +732,11 @@ var __vue_sfc__$2 = /* @__PURE__ */ defineComponent(__spreadProps$1(__spreadValu
|
|
|
716
732
|
}
|
|
717
733
|
};
|
|
718
734
|
onMounted(() => {
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
735
|
+
requestAnimationFrame(() => {
|
|
736
|
+
updateState();
|
|
737
|
+
requestAnimationFrame(() => {
|
|
738
|
+
initialized.value = true;
|
|
739
|
+
});
|
|
722
740
|
});
|
|
723
741
|
if (typeof window !== "undefined") window.addEventListener("resize", handleResize);
|
|
724
742
|
if (rootRef.value) rootRef.value.addEventListener("touchmove", onTouchMove, { passive: false });
|
|
@@ -752,6 +770,7 @@ var __vue_sfc__$2 = /* @__PURE__ */ defineComponent(__spreadProps$1(__spreadValu
|
|
|
752
770
|
props,
|
|
753
771
|
emit,
|
|
754
772
|
rootRef,
|
|
773
|
+
getInitialState,
|
|
755
774
|
state,
|
|
756
775
|
isObject,
|
|
757
776
|
gapX,
|
|
@@ -802,7 +821,7 @@ function __vue_render__$2(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
802
821
|
onTouchcancel: $setup.onTouchEnd,
|
|
803
822
|
onMousedown: $setup.onTouchStart,
|
|
804
823
|
onClickCapture: $setup.onClick
|
|
805
|
-
}, [renderSlot(_ctx.$slots, "default")], 36), [[vShow, $setup.show]])], 8, ["to"]);
|
|
824
|
+
}, [renderSlot(_ctx.$slots, "default")], 36), [[vShow, $setup.show && $setup.initialized]])], 8, ["to"]);
|
|
806
825
|
}
|
|
807
826
|
__vue_sfc__$2.render = __vue_render__$2;
|
|
808
827
|
var FloatingBubble_vue_default = __vue_sfc__$2;
|
|
@@ -2179,7 +2198,7 @@ __vue_sfc__.render = __vue_render__;
|
|
|
2179
2198
|
var open_code_widget_default = __vue_sfc__;
|
|
2180
2199
|
//#endregion
|
|
2181
2200
|
//#region es/index.js
|
|
2182
|
-
var version = "1.0.
|
|
2201
|
+
var version = "1.0.25";
|
|
2183
2202
|
function install(app, options) {
|
|
2184
2203
|
[open_code_widget_default].forEach((item) => {
|
|
2185
2204
|
if (item.install) app.use(item, options);
|
package/lib/components.css
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
.opencode-right-toolbar{width:140px;background:var(--oc-bg-secondary);border-left:1px solid var(--oc-border-primary);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease;overflow:hidden}.opencode-right-toolbar.collapsed{width:0;overflow:hidden}.opencode-right-toolbar.collapsed .opencode-selected-nodes-header,.opencode-right-toolbar.collapsed .opencode-selected-nodes,.opencode-right-toolbar.collapsed .opencode-clear-all-btn{display:none}.opencode-selected-nodes-header{padding:12px 8px 8px;border-bottom:1px solid var(--oc-border-primary)}.opencode-selected-nodes-title{font-size:14px;font-weight:600;color:var(--oc-text-primary);margin-bottom:4px}.opencode-selected-nodes-desc{font-size:11px;color:var(--oc-text-placeholder);line-height:1.4}.opencode-selected-nodes{flex:1;display:flex;flex-direction:column;padding:8px;gap:6px;overflow-y:auto;overflow-x:hidden}.opencode-selected-nodes:empty:before{content:"\6682\65e0\9009\4e2d\5143\7d20";color:var(--oc-text-placeholder);font-size:12px;text-align:center;padding:20px 10px}.opencode-selected-node{display:flex;align-items:center;gap:8px;padding:8px 10px;background:var(--oc-bg-main);border:1px solid var(--oc-border-primary);border-radius:6px;font-size:12px;transition:all .2s}.opencode-selected-node:hover{border-color:var(--oc-primary);box-shadow:var(--oc-shadow-primary)}.opencode-node-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.opencode-node-text{color:var(--oc-text-primary);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opencode-node-file{color:var(--oc-text-placeholder);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opencode-node-remove{width:18px;height:18px;border-radius:4px;border:none;background:transparent;color:var(--oc-text-placeholder);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;transition:all .2s;flex-shrink:0}.opencode-node-remove:hover{background:var(--oc-danger);color:#fff}.opencode-clear-all-btn{width:calc(100% - 16px);margin:8px;padding:8px 12px;border-radius:6px;border:none;background:var(--oc-danger);color:#fff;font-size:12px;font-weight:500;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:4px;transition:all .2s}.opencode-clear-all-btn:hover{background:var(--oc-danger-hover);transform:scale(1.02)}
|
|
6
6
|
.opencode-session-list{width:240px;background:var(--oc-bg-secondary);border-right:1px solid var(--oc-border-primary);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease}.opencode-session-list.collapsed{width:0;overflow:hidden}.opencode-session-list.collapsed .opencode-session-list-header,.opencode-session-list.collapsed .opencode-session-list-content{display:none}.opencode-session-list-header{padding:16px;border-bottom:1px solid var(--oc-border-primary);display:flex;justify-content:space-between;align-items:center;font-weight:600;font-size:14px;color:var(--oc-text-primary)}.opencode-new-session-btn{width:28px;height:28px;border-radius:6px;border:none;background:var(--oc-primary);color:#fff;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.opencode-new-session-btn:hover{background:var(--oc-primary-hover);transform:scale(1.05)}.opencode-session-list-content{flex:1;overflow-y:auto;padding:8px;position:relative}.opencode-session-list-loading-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:var(--oc-overlay-bg);display:flex;align-items:center;justify-content:center;z-index:10;border-radius:8px}.opencode-loading-spinner.small{width:24px;height:24px;border-width:2px}.opencode-session-item{padding:12px;border-radius:8px;cursor:pointer;transition:transform .2s;margin-bottom:4px;color:var(--oc-text-primary)}.opencode-session-item:hover{background:var(--oc-bg-tertiary)}.opencode-session-item.active{background:var(--oc-primary);color:#fff;transition:none}.opencode-session-title{font-size:14px;font-weight:500;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opencode-session-meta{font-size:12px;opacity:.6}.opencode-session-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.opencode-session-delete-btn{width:20px;height:20px;border-radius:4px;border:none;background:transparent;color:var(--oc-text-placeholder);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s;opacity:0;flex-shrink:0}.opencode-session-item:hover .opencode-session-delete-btn{opacity:1}.opencode-session-delete-btn:hover{background:var(--oc-danger);color:#fff}.opencode-session-item.active .opencode-session-delete-btn{color:rgba(255,255,255,.7)}.opencode-session-item.active .opencode-session-delete-btn:hover{background:rgba(255,255,255,.2);color:#fff}.opencode-session-header-skeleton{padding:16px;border-bottom:1px solid var(--oc-border-primary);display:none;justify-content:space-between;align-items:center}.opencode-session-header-skeleton.visible{display:flex}.opencode-skeleton-header-title{height:18px;width:80px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px}.opencode-skeleton-header-btn{width:28px;height:28px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px}.opencode-session-skeleton{flex:1;overflow-y:auto;padding:8px;display:none}.opencode-session-skeleton.visible{display:block}.opencode-skeleton-item{padding:12px;border-radius:8px;margin-bottom:4px;background:var(--oc-skeleton-bg)}.opencode-skeleton-title{height:16px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;margin-bottom:8px;width:70%}.opencode-skeleton-meta{height:12px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;width:50%}.opencode-session-empty{padding:32px 16px;text-align:center;color:var(--oc-text-placeholder);font-size:13px}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}
|
|
7
7
|
.opencode-button{width:42px;height:42px;border-radius:50%;background:#fff;border:none;cursor:pointer;box-shadow:0 4px 12px rgba(102,126,234,.4);transition:all .3s ease;display:flex;align-items:center;justify-content:center;padding:0;position:relative}.opencode-button svg{transform:rotate(180deg) scale(1.1);transition:transform .3s ease;width:100%;height:100%;display:block}.opencode-button:hover svg{transform:rotate(180deg) scale(1.1)}.opencode-button:hover{transform:scale(1.1);box-shadow:0 6px 16px rgba(102,126,234,.5)}.opencode-button.thinking{background:linear-gradient(135deg,#667eea,#764ba2);animation:thinking-glow 1.5s ease-in-out infinite,thinking-pulse 1.5s ease-in-out infinite;box-shadow:0 0 20px rgba(102,126,234,.6),0 0 40px rgba(118,75,162,.4),0 0 60px rgba(102,126,234,.2)}.opencode-button.thinking svg path{fill:#fff}.opencode-button.thinking:before{content:"";position:absolute;top:-2px;right:-2px;bottom:-2px;left:-2px;border-radius:50%;background:linear-gradient(135deg,#8b9cf5,#9d6bc7);z-index:-1}.opencode-button.thinking:after{content:"";position:absolute;top:-3px;right:-3px;bottom:-3px;left:-3px;border-radius:50%;background:conic-gradient(from 180deg,transparent,rgba(102,126,234,.3),transparent,rgba(118,75,162,.3),transparent);z-index:-2;animation:thinking-rotate 2s linear infinite reverse;filter:blur(8px)}@keyframes thinking-glow{0%,to{box-shadow:0 0 20px rgba(102,126,234,.6),0 0 40px rgba(118,75,162,.4),0 0 60px rgba(102,126,234,.2)}50%{box-shadow:0 0 30px rgba(102,126,234,.8),0 0 60px rgba(118,75,162,.6),0 0 90px rgba(102,126,234,.3)}}@keyframes thinking-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes thinking-pulse{0%,to{transform:scale(1)}50%{transform:scale(.95)}}.opencode-button.opencode-theme-dark{background:linear-gradient(135deg,#667eea,#764ba2);box-shadow:0 4px 12px rgba(102,126,234,.3)}.opencode-button.opencode-theme-dark:before{content:"";position:absolute;top:-2px;right:-2px;bottom:-2px;left:-2px;border-radius:50%;background:linear-gradient(135deg,#8b9cf5,#9d6bc7);z-index:-1}.opencode-button.opencode-theme-dark:hover{box-shadow:0 6px 16px rgba(102,126,234,.4)}.opencode-button.opencode-theme-dark svg path{fill:#fff}
|
|
8
|
-
.floating-bubble{position:fixed;top:0;left:0;z-index:999999;cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none;touch-action:none;
|
|
8
|
+
.floating-bubble{position:fixed;top:0;left:0;z-index:999999;cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none;touch-action:none;will-change:transform}.floating-bubble:active{cursor:grabbing}
|
|
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.25";
|
|
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.25";
|
|
38
38
|
function install(app, options) {
|
|
39
39
|
const components = [
|
|
40
40
|
import_open_code_widget.default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.floating-bubble{position:fixed;top:0;left:0;z-index:999999;cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none;touch-action:none;
|
|
1
|
+
.floating-bubble{position:fixed;top:0;left:0;z-index:999999;cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none;touch-action:none;will-change:transform}.floating-bubble:active{cursor:grabbing}
|
|
@@ -57,12 +57,26 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProp
|
|
|
57
57
|
const props = __props;
|
|
58
58
|
const emit = __emit;
|
|
59
59
|
const rootRef = (0, import_vue2.ref)(null);
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
60
|
+
const getInitialState = () => {
|
|
61
|
+
if (props.offset) {
|
|
62
|
+
return {
|
|
63
|
+
x: props.offset.x,
|
|
64
|
+
y: props.offset.y,
|
|
65
|
+
width: 0,
|
|
66
|
+
height: 0
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
if (typeof window !== "undefined") {
|
|
70
|
+
return {
|
|
71
|
+
x: window.innerWidth - 42 - 24,
|
|
72
|
+
y: window.innerHeight - 42 - 24,
|
|
73
|
+
width: 0,
|
|
74
|
+
height: 0
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return { x: 0, y: 0, width: 0, height: 0 };
|
|
78
|
+
};
|
|
79
|
+
const state = (0, import_vue2.ref)(getInitialState());
|
|
66
80
|
const isObject = (val) => val !== null && typeof val === "object";
|
|
67
81
|
const gapX = (0, import_vue2.computed)(
|
|
68
82
|
() => isObject(props.gap) ? props.gap.x : props.gap
|
|
@@ -85,7 +99,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProp
|
|
|
85
99
|
const x = `${state.value.x}px`;
|
|
86
100
|
const y = `${state.value.y}px`;
|
|
87
101
|
style.transform = `translate3d(${x}, ${y}, 0)`;
|
|
88
|
-
if (dragging.value
|
|
102
|
+
if (dragging.value) {
|
|
89
103
|
style.transition = "none";
|
|
90
104
|
} else {
|
|
91
105
|
style.transition = "transform 0.3s ease";
|
|
@@ -96,6 +110,9 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProp
|
|
|
96
110
|
const updateState = () => {
|
|
97
111
|
if (!show.value || !rootRef.value || typeof window === "undefined") return;
|
|
98
112
|
const rect = rootRef.value.getBoundingClientRect();
|
|
113
|
+
if (rect.width === 0 || rect.height === 0) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
99
116
|
const { offset } = props;
|
|
100
117
|
let x = offset ? offset.x : windowWidth.value - rect.width - gapX.value;
|
|
101
118
|
let y = offset ? offset.y : windowHeight.value - rect.height - gapY.value;
|
|
@@ -231,9 +248,11 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProp
|
|
|
231
248
|
}
|
|
232
249
|
};
|
|
233
250
|
(0, import_vue2.onMounted)(() => {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
251
|
+
requestAnimationFrame(() => {
|
|
252
|
+
updateState();
|
|
253
|
+
requestAnimationFrame(() => {
|
|
254
|
+
initialized.value = true;
|
|
255
|
+
});
|
|
237
256
|
});
|
|
238
257
|
if (typeof window !== "undefined") {
|
|
239
258
|
window.addEventListener("resize", handleResize);
|
|
@@ -266,7 +285,7 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProp
|
|
|
266
285
|
isOnRightSide,
|
|
267
286
|
offset: (0, import_vue2.computed)(() => ({ x: state.value.x, y: state.value.y }))
|
|
268
287
|
});
|
|
269
|
-
const __returned__ = { props, emit, rootRef, state, isObject, gapX, gapY, windowWidth, windowHeight, boundary, dragging, initialized, rootStyle, show, updateState, touch, get prevX() {
|
|
288
|
+
const __returned__ = { props, emit, rootRef, getInitialState, state, isObject, gapX, gapY, windowWidth, windowHeight, boundary, dragging, initialized, rootStyle, show, updateState, touch, get prevX() {
|
|
270
289
|
return prevX;
|
|
271
290
|
}, set prevX(v) {
|
|
272
291
|
prevX = v;
|
|
@@ -299,7 +318,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
299
318
|
36
|
|
300
319
|
/* STYLE, NEED_HYDRATION */
|
|
301
320
|
), [
|
|
302
|
-
[import_vue3.vShow, $setup.show]
|
|
321
|
+
[import_vue3.vShow, $setup.show && $setup.initialized]
|
|
303
322
|
])
|
|
304
323
|
], 8, ["to"]);
|
|
305
324
|
}
|
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.25","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.25",
|
|
4
4
|
"description": "Reusable OpenCode widget components built with Pagoda CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"css-selector-generator": "^3.9.1",
|
|
34
|
-
"@vite-plugin-opencode-assistant/shared": "1.0.
|
|
34
|
+
"@vite-plugin-opencode-assistant/shared": "1.0.25"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@vitejs/plugin-vue": "^6.0.5",
|