@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 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.24";
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,5 +1,5 @@
1
1
  import OpenCodeWidget from "./open-code-widget";
2
- const version = "1.0.24";
2
+ const version = "1.0.25";
3
3
  function install(app, options) {
4
4
  const components = [
5
5
  OpenCodeWidget
@@ -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;visibility:hidden;will-change:transform}.floating-bubble[style*=translate3d]{visibility:visible}.floating-bubble:active{cursor:grabbing}
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, nextTick } from "vue";
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 state = ref({
40
- x: 0,
41
- y: 0,
42
- width: 0,
43
- height: 0
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 || !initialized.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
- updateState();
214
- nextTick(() => {
215
- initialized.value = true;
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 state = (0, vue.ref)({
596
- x: 0,
597
- y: 0,
598
- width: 0,
599
- height: 0
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 || !initialized.value) style.transition = "none";
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
- updateState();
747
- (0, vue.nextTick)(() => {
748
- initialized.value = true;
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.24";
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, nextTick, normalizeClass, normalizeStyle, onMounted, onUnmounted, openBlock, provide, ref, renderList, renderSlot, toDisplayString, toRef, useSlots, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
1
+ import { Fragment, Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createStaticVNode, createVNode, defineComponent, inject, normalizeClass, normalizeStyle, onMounted, onUnmounted, openBlock, provide, ref, renderList, renderSlot, toDisplayString, toRef, useSlots, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
2
2
  import { truncate } from "@vite-plugin-opencode-assistant/shared";
3
3
  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 state = ref({
569
- x: 0,
570
- y: 0,
571
- width: 0,
572
- height: 0
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 || !initialized.value) style.transition = "none";
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
- updateState();
720
- nextTick(() => {
721
- initialized.value = true;
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.24";
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);
@@ -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;visibility:hidden;will-change:transform}.floating-bubble[style*=translate3d]{visibility:visible}.floating-bubble:active{cursor:grabbing}
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.24";
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.24";
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;visibility:hidden;will-change:transform}.floating-bubble[style*=translate3d]{visibility:visible}.floating-bubble:active{cursor:grabbing}
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 state = (0, import_vue2.ref)({
61
- x: 0,
62
- y: 0,
63
- width: 0,
64
- height: 0
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 || !initialized.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
- updateState();
235
- (0, import_vue2.nextTick)(() => {
236
- initialized.value = true;
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
  }
@@ -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.24","contributions":{"html":{"tags":[{"name":"open-code","attributes":[{"name":"","default":"`'bottom-right'`","description":"挂件显示的位置","value":{"type":"`'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'`","kind":"expression"}},{"name":"","default":"`false`","description":"挂件是否打开","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`'auto'`","description":"主题模式","value":{"type":"`'light' | 'dark' | 'auto'`","kind":"expression"}},{"name":"","default":"`'AI 助手'`","description":"助手头部显示的标题","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`'Ctrl+K'`","description":"快捷键提示文本","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`'按 ESC 或 Ctrl+P 退出'`","description":"选择模式快捷键提示文本","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`false`","description":"是否进入选择页面元素模式","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`true`","description":"会话列表是否折叠","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`'id'`","description":"会话列表项的唯一键字段","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`false`","description":"iframe 是否显示加载状态","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`undefined`","description":"会话列表是否加载中","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`false`","description":"是否显示会话列表骨架屏","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`false`","description":"是否显示空状态","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`false`","description":"是否显示错误状态","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`'当前项目暂无会话'`","description":"空状态显示的文本","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`'立即创建'`","description":"空状态操作按钮文本","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`''`","description":"Web UI 的 URL 来源","value":{"type":"`string`","kind":"expression"}},{"name":"","default":"`[]`","description":"会话列表数据","value":{"type":"`OpenCodeWidgetSession[]`","kind":"expression"}},{"name":"","default":"`null`","description":"当前选中的会话 ID","value":{"type":"`string | null`","kind":"expression"}},{"name":"","default":"`[]`","description":"已选中的元素列表","value":{"type":"`OpenCodeSelectedElement[]`","kind":"expression"}},{"name":"","default":"`true`","description":"是否显示\"一键清空\"按钮","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`true`","description":"是否启用选择模式","value":{"type":"`boolean`","kind":"expression"}},{"name":"","default":"`false`","description":"是否显示思考状态(加载中)","value":{"type":"`boolean`","kind":"expression"}}],"events":[{"name":"`update:open`","description":"当挂件打开或关闭时触发","arguments":[{"name":"open","type":"en"},{"name":"boolean"}]},{"name":"`update:selectMode`","description":"当选择模式切换时触发","arguments":[{"name":"mode","type":"de"},{"name":"boolean"}]},{"name":"`update:sessionListCollapsed`","description":"当会话列表折叠状态改变时触发","arguments":[{"name":"collapsed","type":"ed"},{"name":"boolean"}]},{"name":"`update:currentSessionId`","description":"当选中的会话 ID 改变时触发","arguments":[{"name":"sessionId","type":"Id"},{"name":"string | null"}]},{"name":"`update:selectedElements`","description":"当已选中的元素列表改变时触发","arguments":[{"name":"elements","type":"ts"},{"name":"OpenCodeSelectedElement[]"}]},{"name":"`update:theme`","description":"当主题模式改变时触发","arguments":[{"name":"theme","type":"me"},{"name":"'light' | 'dark' | 'auto'"}]},{"name":"`update:thinking`","description":"当思考状态改变时触发","arguments":[{"name":"thinking","type":"ng"},{"name":"boolean"}]},{"name":"","description":"点击触发挂件开关","arguments":[{"name":"open","type":"en"},{"name":"boolean"}]},{"name":"","description":"点击关闭按钮时触发","arguments":[]},{"name":"`toggle-session-list`","description":"点击会话列表切换按钮时触发","arguments":[{"name":"collapsed","type":"ed"},{"name":"boolean"}]},{"name":"`toggle-select-mode`","description":"点击选择模式切换按钮时触发","arguments":[{"name":"mode","type":"de"},{"name":"boolean"}]},{"name":"`toggle-theme`","description":"点击主题切换按钮时触发","arguments":[{"name":"theme","type":"me"},{"name":"'light' | 'dark' | 'auto'"}]},{"name":"`create-session`","description":"点击创建新会话时触发","arguments":[]},{"name":"`select-session`","description":"选中某个历史会话时触发","arguments":[{"name":"session","type":"on"},{"name":"OpenCodeWidgetSession"}]},{"name":"`delete-session`","description":"删除某个历史会话时触发","arguments":[{"name":"session","type":"on"},{"name":"OpenCodeWidgetSession"}]},{"name":"`click-selected-node`","description":"点击已选中的气泡或节点卡片时触发","arguments":[{"name":"element","type":"nt"},{"name":"OpenCodeSelectedElement"}]},{"name":"`remove-selected-node`","description":"删除已选中的元素时触发","arguments":[{"name":"payload","type":"ad"},{"name":"OpenCodeRemoveSelectedPayload"}]},{"name":"`clear-selected-nodes`","description":"清空所有选中元素时触发","arguments":[]},{"name":"`empty-action`","description":"点击空状态操作按钮时触发","arguments":[]},{"name":"`frame-loaded`","description":"iframe 加载完成时触发","arguments":[]},{"name":"`thinking-change`","description":"思考状态改变时触发(用于显示加载动画)","arguments":[{"name":"thinking","type":"ng"},{"name":"boolean"}]}],"slots":[{"name":"`button-icon`","description":"自定义触发按钮图标"},{"name":"`session-toggle-icon`","description":"自定义会话列表切换图标"},{"name":"`select-icon`","description":"自定义选择模式切换图标"},{"name":"`close-icon`","description":"自定义关闭按钮图标"},{"name":"`theme-icon`","description":"自定义主题切换图标"},{"name":"`sessions-empty`","description":"自定义会话列表空状态"},{"name":"`empty-state`","description":"自定义 iframe 空状态"},{"name":"","description":"自定义 iframe 加载状态"},{"name":"","description":"自定义错误状态"},{"name":"","description":"自定义 iframe 内容"}]}],"attributes":[]}},"js-types-syntax":"typescript"}
1
+ {"$schema":"https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json","framework":"vue","name":"@vite-plugin-opencode-assistant/components","version":"1.0.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.24",
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.24"
34
+ "@vite-plugin-opencode-assistant/shared": "1.0.25"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@vitejs/plugin-vue": "^6.0.5",