@vite-plugin-opencode-assistant/components 1.0.23 → 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.
Files changed (41) hide show
  1. package/es/index.d.ts +1 -1
  2. package/es/index.js +1 -1
  3. package/es/open-code-widget/composables/use-widget.d.ts +0 -1
  4. package/es/open-code-widget/composables/use-widget.js +0 -1
  5. package/es/open-code-widget/src/components/FloatingBubble/FloatingBubble-sfc.css +1 -0
  6. package/es/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.d.ts +44 -0
  7. package/es/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.js +309 -0
  8. package/es/open-code-widget/src/components/FloatingBubble/index.d.ts +3 -0
  9. package/es/open-code-widget/src/components/FloatingBubble/index.js +5 -0
  10. package/es/open-code-widget/src/components/FloatingBubble/types.d.ts +24 -0
  11. package/es/open-code-widget/src/components/FloatingBubble/types.js +0 -0
  12. package/es/open-code-widget/src/components/Trigger-sfc.css +1 -1
  13. package/es/open-code-widget/src/components/Trigger.vue.d.ts +21 -3
  14. package/es/open-code-widget/src/components/Trigger.vue.js +127 -48
  15. package/es/open-code-widget/src/index-sfc.css +1 -1
  16. package/es/open-code-widget/src/index.vue.d.ts +10 -11
  17. package/es/open-code-widget/src/index.vue.js +82 -17
  18. package/es/open-code-widget/src/types.d.ts +1 -2
  19. package/lib/@vite-plugin-opencode-assistant/components.cjs.js +562 -99
  20. package/lib/@vite-plugin-opencode-assistant/components.es.js +558 -95
  21. package/lib/components.css +3 -2
  22. package/lib/index.d.ts +1 -1
  23. package/lib/index.js +1 -1
  24. package/lib/open-code-widget/composables/use-widget.d.ts +0 -1
  25. package/lib/open-code-widget/composables/use-widget.js +0 -1
  26. package/lib/open-code-widget/src/components/FloatingBubble/FloatingBubble-sfc.css +1 -0
  27. package/lib/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.d.ts +44 -0
  28. package/lib/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.js +326 -0
  29. package/lib/open-code-widget/src/components/FloatingBubble/index.d.ts +3 -0
  30. package/lib/open-code-widget/src/components/FloatingBubble/index.js +35 -0
  31. package/lib/open-code-widget/src/components/FloatingBubble/types.d.ts +24 -0
  32. package/lib/open-code-widget/src/components/FloatingBubble/types.js +15 -0
  33. package/lib/open-code-widget/src/components/Trigger-sfc.css +1 -1
  34. package/lib/open-code-widget/src/components/Trigger.vue.d.ts +21 -3
  35. package/lib/open-code-widget/src/components/Trigger.vue.js +137 -48
  36. package/lib/open-code-widget/src/index-sfc.css +1 -1
  37. package/lib/open-code-widget/src/index.vue.d.ts +10 -11
  38. package/lib/open-code-widget/src/index.vue.js +80 -15
  39. package/lib/open-code-widget/src/types.d.ts +1 -2
  40. package/lib/web-types.json +1 -1
  41. 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.23";
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.23";
2
+ const version = "1.0.25";
3
3
  function install(app, options) {
4
4
  const components = [
5
5
  OpenCodeWidget
@@ -1,7 +1,6 @@
1
1
  import { type Ref } from "vue";
2
2
  import type { OpenCodeWidgetTheme } from "../src/types";
3
3
  export interface UseWidgetOptions {
4
- position: Ref<string>;
5
4
  theme: Ref<string>;
6
5
  open: Ref<boolean>;
7
6
  selectMode: Ref<boolean>;
@@ -30,7 +30,6 @@ function useWidget(options) {
30
30
  });
31
31
  const containerClasses = computed(() => [
32
32
  "opencode-widget",
33
- options.position.value,
34
33
  `opencode-theme-${resolvedTheme.value}`
35
34
  ]);
36
35
  const buttonActive = computed(() => !!(options.open.value || options.selectMode.value));
@@ -0,0 +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;will-change:transform}.floating-bubble:active{cursor:grabbing}
@@ -0,0 +1,44 @@
1
+ import type { FloatingBubbleAxis, FloatingBubbleMagnetic, FloatingBubbleOffset, FloatingBubbleGap } from "./types";
2
+ type __VLS_Props = {
3
+ offset?: FloatingBubbleOffset;
4
+ axis?: FloatingBubbleAxis;
5
+ magnetic?: FloatingBubbleMagnetic;
6
+ gap?: number | FloatingBubbleGap;
7
+ teleport?: string | Element;
8
+ };
9
+ declare var __VLS_5: {};
10
+ type __VLS_Slots = {} & {
11
+ default?: (props: typeof __VLS_5) => any;
12
+ };
13
+ declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {
14
+ isOnRightSide: import("vue").ComputedRef<boolean>;
15
+ offset: import("vue").ComputedRef<{
16
+ x: number;
17
+ y: number;
18
+ }>;
19
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
20
+ click: (event: MouseEvent) => any;
21
+ "update:offset": (value: FloatingBubbleOffset) => any;
22
+ "offset-change": (offset: FloatingBubbleOffset) => any;
23
+ "drag-start": () => any;
24
+ "drag-end": () => any;
25
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
26
+ onClick?: ((event: MouseEvent) => any) | undefined;
27
+ "onUpdate:offset"?: ((value: FloatingBubbleOffset) => any) | undefined;
28
+ "onOffset-change"?: ((offset: FloatingBubbleOffset) => any) | undefined;
29
+ "onDrag-start"?: (() => any) | undefined;
30
+ "onDrag-end"?: (() => any) | undefined;
31
+ }>, {
32
+ offset: FloatingBubbleOffset;
33
+ axis: FloatingBubbleAxis;
34
+ magnetic: FloatingBubbleMagnetic;
35
+ gap: number | FloatingBubbleGap;
36
+ teleport: string | Element;
37
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
38
+ declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
39
+ export default _default;
40
+ type __VLS_WithSlots<T, S> = T & {
41
+ new (): {
42
+ $slots: S;
43
+ };
44
+ };
@@ -0,0 +1,309 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ import "./FloatingBubble-sfc.css";
21
+ import { defineComponent as _defineComponent } from "vue";
22
+ import { ref, computed, watch, onMounted, onUnmounted } from "vue";
23
+ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValues({}, {
24
+ name: "FloatingBubble"
25
+ }), {
26
+ __name: "FloatingBubble",
27
+ props: {
28
+ offset: { type: Object, required: false, default: void 0 },
29
+ axis: { type: String, required: false, default: "xy" },
30
+ magnetic: { type: String, required: false, default: void 0 },
31
+ gap: { type: [Number, Object], required: false, default: 24 },
32
+ teleport: { type: null, required: false, default: "body" }
33
+ },
34
+ emits: ["update:offset", "click", "offset-change", "drag-start", "drag-end"],
35
+ setup(__props, { expose: __expose, emit: __emit }) {
36
+ const props = __props;
37
+ const emit = __emit;
38
+ const rootRef = ref(null);
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());
59
+ const isObject = (val) => val !== null && typeof val === "object";
60
+ const gapX = computed(
61
+ () => isObject(props.gap) ? props.gap.x : props.gap
62
+ );
63
+ const gapY = computed(
64
+ () => isObject(props.gap) ? props.gap.y : props.gap
65
+ );
66
+ const windowWidth = ref(typeof window !== "undefined" ? window.innerWidth : 0);
67
+ const windowHeight = ref(typeof window !== "undefined" ? window.innerHeight : 0);
68
+ const boundary = computed(() => ({
69
+ top: gapY.value,
70
+ right: windowWidth.value - state.value.width - gapX.value,
71
+ bottom: windowHeight.value - state.value.height - gapY.value,
72
+ left: gapX.value
73
+ }));
74
+ const dragging = ref(false);
75
+ const initialized = ref(false);
76
+ const rootStyle = computed(() => {
77
+ const style = {};
78
+ const x = `${state.value.x}px`;
79
+ const y = `${state.value.y}px`;
80
+ style.transform = `translate3d(${x}, ${y}, 0)`;
81
+ if (dragging.value) {
82
+ style.transition = "none";
83
+ } else {
84
+ style.transition = "transform 0.3s ease";
85
+ }
86
+ return style;
87
+ });
88
+ const show = ref(true);
89
+ const updateState = () => {
90
+ if (!show.value || !rootRef.value || typeof window === "undefined") return;
91
+ const rect = rootRef.value.getBoundingClientRect();
92
+ if (rect.width === 0 || rect.height === 0) {
93
+ return;
94
+ }
95
+ const { offset } = props;
96
+ let x = offset ? offset.x : windowWidth.value - rect.width - gapX.value;
97
+ let y = offset ? offset.y : windowHeight.value - rect.height - gapY.value;
98
+ const maxX = windowWidth.value - rect.width - gapX.value;
99
+ const maxY = windowHeight.value - rect.height - gapY.value;
100
+ if (x < gapX.value) x = gapX.value;
101
+ if (x > maxX) x = maxX;
102
+ if (y < gapY.value) y = gapY.value;
103
+ if (y > maxY) y = maxY;
104
+ state.value = {
105
+ x,
106
+ y,
107
+ width: rect.width,
108
+ height: rect.height
109
+ };
110
+ };
111
+ const touch = {
112
+ startX: ref(0),
113
+ startY: ref(0),
114
+ deltaX: ref(0),
115
+ deltaY: ref(0),
116
+ offsetX: ref(0),
117
+ offsetY: ref(0),
118
+ isTap: ref(true),
119
+ start(e) {
120
+ this.startX.value = "touches" in e ? e.touches[0].clientX : e.clientX;
121
+ this.startY.value = "touches" in e ? e.touches[0].clientY : e.clientY;
122
+ this.deltaX.value = 0;
123
+ this.deltaY.value = 0;
124
+ this.offsetX.value = 0;
125
+ this.offsetY.value = 0;
126
+ this.isTap.value = true;
127
+ },
128
+ move(e) {
129
+ const clientX = "touches" in e ? e.touches[0].clientX : e.clientX;
130
+ const clientY = "touches" in e ? e.touches[0].clientY : e.clientY;
131
+ this.deltaX.value = clientX - this.startX.value;
132
+ this.deltaY.value = clientY - this.startY.value;
133
+ this.offsetX.value = Math.abs(this.deltaX.value);
134
+ this.offsetY.value = Math.abs(this.deltaY.value);
135
+ const TAP_OFFSET = 5;
136
+ if (this.isTap.value && (this.offsetX.value > TAP_OFFSET || this.offsetY.value > TAP_OFFSET)) {
137
+ this.isTap.value = false;
138
+ }
139
+ }
140
+ };
141
+ let prevX = 0;
142
+ let prevY = 0;
143
+ const onTouchStart = (e) => {
144
+ touch.start(e);
145
+ dragging.value = true;
146
+ prevX = state.value.x;
147
+ prevY = state.value.y;
148
+ if (!("touches" in e)) {
149
+ window.addEventListener("mousemove", onTouchMove, { passive: false });
150
+ window.addEventListener("mouseup", onTouchEnd);
151
+ }
152
+ };
153
+ const onTouchMove = (e) => {
154
+ if (e.cancelable) {
155
+ e.preventDefault();
156
+ }
157
+ const wasTap = touch.isTap.value;
158
+ touch.move(e);
159
+ if (wasTap && !touch.isTap.value) {
160
+ emit("drag-start");
161
+ }
162
+ if (props.axis === "lock") return;
163
+ if (!touch.isTap.value) {
164
+ if (props.axis === "x" || props.axis === "xy") {
165
+ let nextX = prevX + touch.deltaX.value;
166
+ if (nextX < boundary.value.left) nextX = boundary.value.left;
167
+ if (nextX > boundary.value.right) nextX = boundary.value.right;
168
+ state.value.x = nextX;
169
+ }
170
+ if (props.axis === "y" || props.axis === "xy") {
171
+ let nextY = prevY + touch.deltaY.value;
172
+ if (nextY < boundary.value.top) nextY = boundary.value.top;
173
+ if (nextY > boundary.value.bottom) nextY = boundary.value.bottom;
174
+ state.value.y = nextY;
175
+ }
176
+ const offset = { x: state.value.x, y: state.value.y };
177
+ emit("update:offset", offset);
178
+ }
179
+ };
180
+ const closest = (arr, target) => {
181
+ return arr.reduce(
182
+ (pre, cur) => Math.abs(pre - target) < Math.abs(cur - target) ? pre : cur
183
+ );
184
+ };
185
+ const onTouchEnd = (e) => {
186
+ dragging.value = false;
187
+ if (e && !("touches" in e) && e.type === "mouseup") {
188
+ window.removeEventListener("mousemove", onTouchMove);
189
+ window.removeEventListener("mouseup", onTouchEnd);
190
+ }
191
+ requestAnimationFrame(() => {
192
+ if (props.magnetic === "x") {
193
+ const nextX = closest(
194
+ [boundary.value.left, boundary.value.right],
195
+ state.value.x
196
+ );
197
+ state.value.x = nextX;
198
+ }
199
+ if (props.magnetic === "y") {
200
+ const nextY = closest(
201
+ [boundary.value.top, boundary.value.bottom],
202
+ state.value.y
203
+ );
204
+ state.value.y = nextY;
205
+ }
206
+ if (!touch.isTap.value) {
207
+ emit("drag-end");
208
+ const offset = { x: state.value.x, y: state.value.y };
209
+ emit("update:offset", offset);
210
+ if (prevX !== offset.x || prevY !== offset.y) {
211
+ emit("offset-change", offset);
212
+ }
213
+ }
214
+ });
215
+ };
216
+ const onClick = (e) => {
217
+ if (touch.isTap.value) {
218
+ emit("click", e);
219
+ } else {
220
+ e.stopPropagation();
221
+ }
222
+ };
223
+ const handleResize = () => {
224
+ if (typeof window !== "undefined") {
225
+ windowWidth.value = window.innerWidth;
226
+ windowHeight.value = window.innerHeight;
227
+ }
228
+ };
229
+ onMounted(() => {
230
+ requestAnimationFrame(() => {
231
+ updateState();
232
+ requestAnimationFrame(() => {
233
+ initialized.value = true;
234
+ });
235
+ });
236
+ if (typeof window !== "undefined") {
237
+ window.addEventListener("resize", handleResize);
238
+ }
239
+ if (rootRef.value) {
240
+ rootRef.value.addEventListener("touchmove", onTouchMove, {
241
+ passive: false
242
+ });
243
+ }
244
+ });
245
+ onUnmounted(() => {
246
+ if (typeof window !== "undefined") {
247
+ window.removeEventListener("resize", handleResize);
248
+ window.removeEventListener("mousemove", onTouchMove);
249
+ window.removeEventListener("mouseup", onTouchEnd);
250
+ }
251
+ if (rootRef.value) {
252
+ rootRef.value.removeEventListener("touchmove", onTouchMove);
253
+ }
254
+ });
255
+ watch(
256
+ [windowWidth, windowHeight, gapX, gapY, () => props.offset],
257
+ updateState,
258
+ { deep: true }
259
+ );
260
+ const isOnRightSide = computed(() => {
261
+ return state.value.x > windowWidth.value / 2;
262
+ });
263
+ __expose({
264
+ isOnRightSide,
265
+ offset: computed(() => ({ x: state.value.x, y: state.value.y }))
266
+ });
267
+ const __returned__ = { props, emit, rootRef, getInitialState, state, isObject, gapX, gapY, windowWidth, windowHeight, boundary, dragging, initialized, rootStyle, show, updateState, touch, get prevX() {
268
+ return prevX;
269
+ }, set prevX(v) {
270
+ prevX = v;
271
+ }, get prevY() {
272
+ return prevY;
273
+ }, set prevY(v) {
274
+ prevY = v;
275
+ }, onTouchStart, onTouchMove, closest, onTouchEnd, onClick, handleResize, isOnRightSide };
276
+ Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
277
+ return __returned__;
278
+ }
279
+ }));
280
+ import { renderSlot as _renderSlot, vShow as _vShow, normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode, withDirectives as _withDirectives, Teleport as _Teleport, openBlock as _openBlock, createBlock as _createBlock } from "vue";
281
+ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
282
+ return _openBlock(), _createBlock(_Teleport, { to: $props.teleport }, [
283
+ _withDirectives(_createElementVNode(
284
+ "div",
285
+ {
286
+ ref: "rootRef",
287
+ class: "floating-bubble",
288
+ style: _normalizeStyle($setup.rootStyle),
289
+ onTouchstartPassive: $setup.onTouchStart,
290
+ onTouchend: $setup.onTouchEnd,
291
+ onTouchcancel: $setup.onTouchEnd,
292
+ onMousedown: $setup.onTouchStart,
293
+ onClickCapture: $setup.onClick
294
+ },
295
+ [
296
+ _renderSlot(_ctx.$slots, "default")
297
+ ],
298
+ 36
299
+ /* STYLE, NEED_HYDRATION */
300
+ ), [
301
+ [_vShow, $setup.show && $setup.initialized]
302
+ ])
303
+ ], 8, ["to"]);
304
+ }
305
+ __vue_sfc__.render = __vue_render__;
306
+ var FloatingBubble_vue_default = __vue_sfc__;
307
+ export {
308
+ FloatingBubble_vue_default as default
309
+ };
@@ -0,0 +1,3 @@
1
+ import FloatingBubble from "./FloatingBubble.vue";
2
+ export { FloatingBubble };
3
+ export * from "./types";
@@ -0,0 +1,5 @@
1
+ import FloatingBubble from "./FloatingBubble.vue.js";
2
+ export * from "./types";
3
+ export {
4
+ FloatingBubble
5
+ };
@@ -0,0 +1,24 @@
1
+ export type FloatingBubbleAxis = "x" | "y" | "xy" | "lock";
2
+ export type FloatingBubbleMagnetic = "x" | "y";
3
+ export interface FloatingBubbleOffset {
4
+ x: number;
5
+ y: number;
6
+ }
7
+ export interface FloatingBubbleGap {
8
+ x: number;
9
+ y: number;
10
+ }
11
+ export interface FloatingBubbleProps {
12
+ offset?: FloatingBubbleOffset;
13
+ axis?: FloatingBubbleAxis;
14
+ magnetic?: FloatingBubbleMagnetic;
15
+ gap?: number | FloatingBubbleGap;
16
+ teleport?: string | Element;
17
+ }
18
+ export type FloatingBubbleEmits = {
19
+ (e: "update:offset", value: FloatingBubbleOffset): void;
20
+ (e: "click", event: MouseEvent): void;
21
+ (e: "offset-change", offset: FloatingBubbleOffset): void;
22
+ (e: "drag-start"): void;
23
+ (e: "drag-end"): void;
24
+ };
@@ -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;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}}
1
+ .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}
@@ -1,8 +1,26 @@
1
- declare var __VLS_1: {};
1
+ import type { FloatingBubbleOffset } from "./FloatingBubble/types";
2
+ declare var __VLS_13: {};
2
3
  type __VLS_Slots = {} & {
3
- default?: (props: typeof __VLS_1) => any;
4
+ default?: (props: typeof __VLS_13) => any;
4
5
  };
5
- declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
6
+ declare const __VLS_component: import("vue").DefineComponent<{}, {
7
+ isOnRightSide: import("vue").ComputedRef<boolean>;
8
+ offset: import("vue").Ref<{
9
+ x: number;
10
+ y: number;
11
+ }, FloatingBubbleOffset | {
12
+ x: number;
13
+ y: number;
14
+ }>;
15
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
16
+ "offset-change": (offset: FloatingBubbleOffset) => any;
17
+ "drag-start": () => any;
18
+ "drag-end": () => any;
19
+ }, string, import("vue").PublicProps, Readonly<{}> & Readonly<{
20
+ "onOffset-change"?: ((offset: FloatingBubbleOffset) => any) | undefined;
21
+ "onDrag-start"?: (() => any) | undefined;
22
+ "onDrag-end"?: (() => any) | undefined;
23
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
6
24
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
7
25
  export default _default;
8
26
  type __VLS_WithSlots<T, S> = T & {