@vite-plugin-opencode-assistant/components 1.0.26 → 1.0.27

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 (33) 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-inspector.js +118 -79
  4. package/es/open-code-widget/composables/use-persist-state.d.ts +24 -0
  5. package/es/open-code-widget/composables/use-persist-state.js +59 -0
  6. package/es/open-code-widget/src/components/FloatingBubble/FloatingBubble-sfc.css +1 -1
  7. package/es/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.d.ts +2 -2
  8. package/es/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.js +37 -21
  9. package/es/open-code-widget/src/components/Trigger.vue.d.ts +0 -2
  10. package/es/open-code-widget/src/components/Trigger.vue.js +10 -27
  11. package/es/open-code-widget/src/context.d.ts +3 -0
  12. package/es/open-code-widget/src/index-sfc.css +1 -1
  13. package/es/open-code-widget/src/index.vue.d.ts +10 -10
  14. package/es/open-code-widget/src/index.vue.js +107 -29
  15. package/lib/@vite-plugin-opencode-assistant/components.cjs.js +304 -140
  16. package/lib/@vite-plugin-opencode-assistant/components.es.js +305 -141
  17. package/lib/components.css +2 -2
  18. package/lib/index.d.ts +1 -1
  19. package/lib/index.js +1 -1
  20. package/lib/open-code-widget/composables/use-inspector.js +118 -79
  21. package/lib/open-code-widget/composables/use-persist-state.d.ts +24 -0
  22. package/lib/open-code-widget/composables/use-persist-state.js +78 -0
  23. package/lib/open-code-widget/src/components/FloatingBubble/FloatingBubble-sfc.css +1 -1
  24. package/lib/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.d.ts +2 -2
  25. package/lib/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.js +37 -21
  26. package/lib/open-code-widget/src/components/Trigger.vue.d.ts +0 -2
  27. package/lib/open-code-widget/src/components/Trigger.vue.js +10 -27
  28. package/lib/open-code-widget/src/context.d.ts +3 -0
  29. package/lib/open-code-widget/src/index-sfc.css +1 -1
  30. package/lib/open-code-widget/src/index.vue.d.ts +10 -10
  31. package/lib/open-code-widget/src/index.vue.js +106 -28
  32. package/lib/web-types.json +1 -1
  33. 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.26";
3
+ declare const version = "1.0.27";
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.26";
2
+ const version = "1.0.27";
3
3
  function install(app, options) {
4
4
  const components = [
5
5
  OpenCodeWidget
@@ -202,35 +202,20 @@ function findFileInfo(element, inspector) {
202
202
  return fallbackFileInfo || { file: null, line: null, column: null };
203
203
  }
204
204
  function getPreciseElementAtPoint(x, y, boundary) {
205
- var _a, _b;
206
- const highlight = document.querySelector(".opencode-element-highlight");
207
- const tooltip = document.querySelector(".opencode-element-tooltip");
208
- const highlightDisplay = ((_a = highlight == null ? void 0 : highlight.getAttribute("style")) == null ? void 0 : _a.includes("display: block")) ? "block" : "none";
209
- const tooltipDisplay = ((_b = tooltip == null ? void 0 : tooltip.getAttribute("style")) == null ? void 0 : _b.includes("display: block")) ? "block" : "none";
210
- if (highlight) highlight.style.display = "none";
211
- if (tooltip) tooltip.style.display = "none";
212
- let element = null;
213
- try {
214
- const elements = document.elementsFromPoint(x, y);
215
- for (const el of elements) {
216
- if (el.closest("#vue-inspector-container")) continue;
217
- if (el.closest(".opencode-widget")) continue;
218
- if (el.hasAttribute("data-v-inspector-ignore")) continue;
219
- if (boundary) {
220
- if (boundary.contains(el) || el === boundary) {
221
- element = el;
222
- break;
223
- }
224
- } else {
225
- element = el;
226
- break;
205
+ const elements = document.elementsFromPoint(x, y);
206
+ for (const el of elements) {
207
+ if (el.closest("#vue-inspector-container")) continue;
208
+ if (el.closest(".opencode-widget")) continue;
209
+ if (el.hasAttribute("data-v-inspector-ignore")) continue;
210
+ if (boundary) {
211
+ if (boundary.contains(el) || el === boundary) {
212
+ return el;
227
213
  }
214
+ } else {
215
+ return el;
228
216
  }
229
- } finally {
230
- if (highlight) highlight.style.display = highlightDisplay;
231
- if (tooltip) tooltip.style.display = tooltipDisplay;
232
217
  }
233
- return element;
218
+ return null;
234
219
  }
235
220
  function useInspector(options) {
236
221
  const highlightVisible = ref(false);
@@ -245,67 +230,99 @@ function useInspector(options) {
245
230
  const tooltipContent = ref({ description: "", fileInfo: "" });
246
231
  const INSPECTOR_CHECK_INTERVAL = 500;
247
232
  let inspectorCheckTimer = null;
233
+ let currentHighlightElement = null;
234
+ let currentFileInfo = { file: null, line: null, column: null };
235
+ let currentPrimary = "#3b82f6";
236
+ let currentPrimaryBg = "rgba(59, 130, 246, 0.1)";
237
+ let currentDescription = "";
238
+ let currentFileInfoText = "";
248
239
  function handleMouseMoveCore(e) {
249
240
  var _a, _b;
250
241
  if (!options.selectMode.value) return;
251
242
  const inspector = window.__VUE_INSPECTOR__;
243
+ const highlight = document.querySelector(".opencode-element-highlight");
244
+ const tooltip = document.querySelector(".opencode-element-tooltip");
245
+ if (highlight) highlight.style.pointerEvents = "none";
246
+ if (tooltip) tooltip.style.pointerEvents = "none";
252
247
  let elementToHighlight = null;
248
+ let targetNode = null;
253
249
  let fileInfo = { file: null, line: null, column: null };
254
- if (inspector) {
255
- const { targetNode, params } = inspector.getTargetNode(e);
256
- if (targetNode) {
257
- const preciseElement = getPreciseElementAtPoint(e.clientX, e.clientY, targetNode);
258
- elementToHighlight = preciseElement || targetNode;
259
- if (params && params.file) {
260
- fileInfo = {
261
- file: params.file,
262
- line: (_a = params.line) != null ? _a : null,
263
- column: (_b = params.column) != null ? _b : null
264
- };
265
- } else if (elementToHighlight) {
266
- fileInfo = findFileInfo(elementToHighlight, inspector);
250
+ try {
251
+ if (inspector) {
252
+ const result = inspector.getTargetNode(e);
253
+ targetNode = result.targetNode;
254
+ const params = result.params;
255
+ if (targetNode) {
256
+ const preciseElement = getPreciseElementAtPoint(e.clientX, e.clientY, targetNode);
257
+ elementToHighlight = preciseElement || targetNode;
258
+ if (params && params.file) {
259
+ fileInfo = {
260
+ file: params.file,
261
+ line: (_a = params.line) != null ? _a : null,
262
+ column: (_b = params.column) != null ? _b : null
263
+ };
264
+ } else {
265
+ fileInfo = findFileInfo(targetNode, inspector);
266
+ }
267
267
  }
268
268
  }
269
- }
270
- if (!elementToHighlight) {
271
- elementToHighlight = getPreciseElementAtPoint(e.clientX, e.clientY, null);
272
- }
273
- if (elementToHighlight && !fileInfo.file) {
274
- fileInfo = getFileInfoFromVueInstance(elementToHighlight) || fileInfo;
269
+ if (!elementToHighlight) {
270
+ elementToHighlight = getPreciseElementAtPoint(e.clientX, e.clientY, null);
271
+ }
272
+ if (elementToHighlight && !fileInfo.file) {
273
+ fileInfo = getFileInfoFromVueInstance(elementToHighlight) || fileInfo;
274
+ }
275
+ } finally {
276
+ if (highlight) highlight.style.pointerEvents = "";
277
+ if (tooltip) tooltip.style.pointerEvents = "";
275
278
  }
276
279
  if (elementToHighlight) {
277
- const rect = elementToHighlight.getBoundingClientRect();
278
- const widget = document.querySelector(".opencode-widget");
279
- let primary = "#3b82f6";
280
- let primaryBg = "rgba(59, 130, 246, 0.1)";
281
- if (widget) {
282
- const style = getComputedStyle(widget);
283
- primary = style.getPropertyValue("--oc-primary").trim() || primary;
284
- primaryBg = style.getPropertyValue("--oc-primary-bg").trim() || primaryBg;
280
+ const elementChanged = currentHighlightElement !== elementToHighlight;
281
+ if (elementChanged) {
282
+ currentHighlightElement = elementToHighlight;
283
+ currentFileInfo = fileInfo;
284
+ const widget = document.querySelector(".opencode-widget");
285
+ if (widget) {
286
+ const style = getComputedStyle(widget);
287
+ currentPrimary = style.getPropertyValue("--oc-primary").trim() || currentPrimary;
288
+ currentPrimaryBg = style.getPropertyValue("--oc-primary-bg").trim() || currentPrimaryBg;
289
+ }
290
+ currentDescription = getElementDescription(elementToHighlight);
291
+ } else if (!currentFileInfo.file && fileInfo.file) {
292
+ currentFileInfo = fileInfo;
285
293
  }
286
- highlightVisible.value = true;
287
- highlightStyle.value = {
288
- top: `${rect.top}px`,
289
- left: `${rect.left}px`,
290
- width: `${rect.width}px`,
291
- height: `${rect.height}px`,
292
- border: `2px solid ${primary}`,
293
- background: primaryBg
294
- };
295
- const description = getElementDescription(elementToHighlight);
296
- const fileName = fileInfo.file ? fileInfo.file.split("/").pop() : "";
294
+ const fileName = currentFileInfo.file ? currentFileInfo.file.split("/").pop() : "";
297
295
  let lineInfo = "";
298
- if (fileInfo.line) {
299
- lineInfo = `:${fileInfo.line}`;
300
- if (fileInfo.column) {
301
- lineInfo += `:${fileInfo.column}`;
296
+ if (currentFileInfo.line) {
297
+ lineInfo = `:${currentFileInfo.line}`;
298
+ if (currentFileInfo.column) {
299
+ lineInfo += `:${currentFileInfo.column}`;
302
300
  }
303
301
  }
304
- tooltipContent.value = {
305
- description,
306
- fileInfo: fileName ? `${fileName}${lineInfo}` : ""
307
- };
308
- tooltipVisible.value = true;
302
+ const newFileInfoText = fileName ? `${fileName}${lineInfo}` : "";
303
+ const fileInfoChanged = currentFileInfoText !== newFileInfoText;
304
+ if (elementChanged || fileInfoChanged) {
305
+ currentFileInfoText = newFileInfoText;
306
+ tooltipContent.value = {
307
+ description: currentDescription,
308
+ fileInfo: currentFileInfoText
309
+ };
310
+ }
311
+ const rect = elementToHighlight.getBoundingClientRect();
312
+ const newTop = `${rect.top}px`;
313
+ const newLeft = `${rect.left}px`;
314
+ const newWidth = `${rect.width}px`;
315
+ const newHeight = `${rect.height}px`;
316
+ if (highlightStyle.value.top !== newTop || highlightStyle.value.left !== newLeft || highlightStyle.value.width !== newWidth || highlightStyle.value.height !== newHeight) {
317
+ highlightStyle.value = {
318
+ top: newTop,
319
+ left: newLeft,
320
+ width: newWidth,
321
+ height: newHeight,
322
+ border: `2px solid ${currentPrimary}`,
323
+ background: currentPrimaryBg
324
+ };
325
+ }
309
326
  const tooltipHeight = 50;
310
327
  const tooltipWidth = 200;
311
328
  let tooltipTop = rect.top - tooltipHeight - 8;
@@ -316,13 +333,31 @@ function useInspector(options) {
316
333
  if (tooltipLeft + tooltipWidth > window.innerWidth - 10) {
317
334
  tooltipLeft = window.innerWidth - tooltipWidth - 10;
318
335
  }
319
- tooltipStyle.value = {
320
- top: `${tooltipTop}px`,
321
- left: `${tooltipLeft}px`
322
- };
336
+ const newTooltipTop = `${tooltipTop}px`;
337
+ const newTooltipLeft = `${tooltipLeft}px`;
338
+ if (tooltipStyle.value.top !== newTooltipTop || tooltipStyle.value.left !== newTooltipLeft) {
339
+ tooltipStyle.value = {
340
+ top: newTooltipTop,
341
+ left: newTooltipLeft
342
+ };
343
+ }
344
+ if (!highlightVisible.value) {
345
+ highlightVisible.value = true;
346
+ }
347
+ if (!tooltipVisible.value) {
348
+ tooltipVisible.value = true;
349
+ }
323
350
  } else {
324
- highlightVisible.value = false;
325
- tooltipVisible.value = false;
351
+ currentHighlightElement = null;
352
+ currentDescription = "";
353
+ currentFileInfoText = "";
354
+ currentFileInfo = { file: null, line: null, column: null };
355
+ if (highlightVisible.value) {
356
+ highlightVisible.value = false;
357
+ }
358
+ if (tooltipVisible.value) {
359
+ tooltipVisible.value = false;
360
+ }
326
361
  }
327
362
  }
328
363
  const handleMouseMove = throttle(handleMouseMoveCore, 16);
@@ -394,6 +429,10 @@ function useInspector(options) {
394
429
  }
395
430
  document.removeEventListener("mousemove", handleMouseMove);
396
431
  document.removeEventListener("keydown", handleKeydown, true);
432
+ currentHighlightElement = null;
433
+ currentDescription = "";
434
+ currentFileInfoText = "";
435
+ currentFileInfo = { file: null, line: null, column: null };
397
436
  highlightVisible.value = false;
398
437
  tooltipVisible.value = false;
399
438
  }
@@ -0,0 +1,24 @@
1
+ import { type Ref } from "vue";
2
+ import type { FloatingBubbleOffset } from "../src/components/FloatingBubble/types";
3
+ import type { OpenCodeWidgetTheme } from "../src/types";
4
+ export interface WidgetPersistState {
5
+ open: boolean;
6
+ minimized: boolean;
7
+ promptDockVisible: boolean;
8
+ bubbleOffset?: FloatingBubbleOffset;
9
+ theme: OpenCodeWidgetTheme;
10
+ sessionListCollapsed: boolean;
11
+ }
12
+ export interface UsePersistStateOptions {
13
+ open: Ref<boolean>;
14
+ minimized: Ref<boolean>;
15
+ promptDockVisible: Ref<boolean>;
16
+ bubbleOffset: Ref<FloatingBubbleOffset | undefined>;
17
+ theme: Ref<OpenCodeWidgetTheme>;
18
+ sessionListCollapsed: Ref<boolean>;
19
+ onRestore?: (state: Partial<WidgetPersistState>) => void;
20
+ }
21
+ export declare function usePersistState(options: UsePersistStateOptions): {
22
+ restoreState: () => Partial<WidgetPersistState> | null;
23
+ persistState: () => void;
24
+ };
@@ -0,0 +1,59 @@
1
+ import { watch, onMounted } from "vue";
2
+ const STORAGE_KEY = "opencode-widget-state";
3
+ function loadState() {
4
+ if (typeof window === "undefined") return null;
5
+ try {
6
+ const stored = localStorage.getItem(STORAGE_KEY);
7
+ if (stored) {
8
+ return JSON.parse(stored);
9
+ }
10
+ } catch (e) {
11
+ console.warn("[OpenCodeWidget] Failed to load persisted state:", e);
12
+ }
13
+ return null;
14
+ }
15
+ function saveState(state) {
16
+ if (typeof window === "undefined") return;
17
+ try {
18
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(state));
19
+ } catch (e) {
20
+ console.warn("[OpenCodeWidget] Failed to save state:", e);
21
+ }
22
+ }
23
+ function usePersistState(options) {
24
+ const restoreState = () => {
25
+ const saved = loadState();
26
+ if (options.onRestore) {
27
+ options.onRestore(saved || {});
28
+ }
29
+ return saved;
30
+ };
31
+ const getCurrentState = () => ({
32
+ open: options.open.value,
33
+ minimized: options.minimized.value,
34
+ promptDockVisible: options.promptDockVisible.value,
35
+ bubbleOffset: options.bubbleOffset.value,
36
+ theme: options.theme.value,
37
+ sessionListCollapsed: options.sessionListCollapsed.value
38
+ });
39
+ const persistState = () => {
40
+ saveState(getCurrentState());
41
+ };
42
+ onMounted(() => {
43
+ restoreState();
44
+ watch(
45
+ [options.open, options.minimized, options.promptDockVisible, options.bubbleOffset, options.theme, options.sessionListCollapsed],
46
+ () => {
47
+ persistState();
48
+ },
49
+ { deep: true }
50
+ );
51
+ });
52
+ return {
53
+ restoreState,
54
+ persistState
55
+ };
56
+ }
57
+ export {
58
+ usePersistState
59
+ };
@@ -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;will-change:transform}.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}body.floating-bubble-dragging *{pointer-events:none!important}body.floating-bubble-dragging .floating-bubble,body.floating-bubble-dragging .floating-bubble *{pointer-events:auto!important}
@@ -16,14 +16,14 @@ declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {
16
16
  y: number;
17
17
  }>;
18
18
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
19
- click: (event: MouseEvent) => any;
20
19
  "update:offset": (value: FloatingBubbleOffset) => any;
20
+ click: (event: MouseEvent) => any;
21
21
  "offset-change": (offset: FloatingBubbleOffset) => any;
22
22
  "drag-start": () => any;
23
23
  "drag-end": () => any;
24
24
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
25
- onClick?: ((event: MouseEvent) => any) | undefined;
26
25
  "onUpdate:offset"?: ((value: FloatingBubbleOffset) => any) | undefined;
26
+ onClick?: ((event: MouseEvent) => any) | undefined;
27
27
  "onOffset-change"?: ((offset: FloatingBubbleOffset) => any) | undefined;
28
28
  "onDrag-start"?: (() => any) | undefined;
29
29
  "onDrag-end"?: (() => any) | undefined;
@@ -57,6 +57,27 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
57
57
  bottom: windowHeight.value - state.value.height - gapY.value,
58
58
  left: gapX.value
59
59
  }));
60
+ const closest = (arr, target) => {
61
+ return arr.reduce(
62
+ (pre, cur) => Math.abs(pre - target) < Math.abs(cur - target) ? pre : cur
63
+ );
64
+ };
65
+ const applyMagnetic = () => {
66
+ if (props.magnetic === "x") {
67
+ const nextX = closest(
68
+ [boundary.value.left, boundary.value.right],
69
+ state.value.x
70
+ );
71
+ state.value.x = nextX;
72
+ }
73
+ if (props.magnetic === "y") {
74
+ const nextY = closest(
75
+ [boundary.value.top, boundary.value.bottom],
76
+ state.value.y
77
+ );
78
+ state.value.y = nextY;
79
+ }
80
+ };
60
81
  const dragging = ref(false);
61
82
  const initialized = ref(false);
62
83
  const rootStyle = computed(() => {
@@ -83,12 +104,22 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
83
104
  if (x > maxX) x = maxX;
84
105
  if (y < gapY.value) y = gapY.value;
85
106
  if (y > maxY) y = maxY;
107
+ const oldX = state.value.x;
108
+ const oldY = state.value.y;
86
109
  state.value = {
87
110
  x,
88
111
  y,
89
112
  width: rect.width,
90
113
  height: rect.height
91
114
  };
115
+ if (!dragging.value) {
116
+ applyMagnetic();
117
+ if (state.value.x !== oldX || state.value.y !== oldY) {
118
+ const offset2 = { x: state.value.x, y: state.value.y };
119
+ emit("update:offset", offset2);
120
+ emit("offset-change", offset2);
121
+ }
122
+ }
92
123
  };
93
124
  const touch = {
94
125
  startX: ref(0),
@@ -127,6 +158,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
127
158
  dragging.value = true;
128
159
  prevX = state.value.x;
129
160
  prevY = state.value.y;
161
+ document.body.classList.add("floating-bubble-dragging");
130
162
  if (!("touches" in e)) {
131
163
  window.addEventListener("mousemove", onTouchMove, { passive: false });
132
164
  window.addEventListener("mouseup", onTouchEnd);
@@ -159,32 +191,15 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
159
191
  emit("update:offset", offset);
160
192
  }
161
193
  };
162
- const closest = (arr, target) => {
163
- return arr.reduce(
164
- (pre, cur) => Math.abs(pre - target) < Math.abs(cur - target) ? pre : cur
165
- );
166
- };
167
194
  const onTouchEnd = (e) => {
168
195
  dragging.value = false;
196
+ document.body.classList.remove("floating-bubble-dragging");
169
197
  if (e && !("touches" in e) && e.type === "mouseup") {
170
198
  window.removeEventListener("mousemove", onTouchMove);
171
199
  window.removeEventListener("mouseup", onTouchEnd);
172
200
  }
173
201
  requestAnimationFrame(() => {
174
- if (props.magnetic === "x") {
175
- const nextX = closest(
176
- [boundary.value.left, boundary.value.right],
177
- state.value.x
178
- );
179
- state.value.x = nextX;
180
- }
181
- if (props.magnetic === "y") {
182
- const nextY = closest(
183
- [boundary.value.top, boundary.value.bottom],
184
- state.value.y
185
- );
186
- state.value.y = nextY;
187
- }
202
+ applyMagnetic();
188
203
  if (!touch.isTap.value) {
189
204
  emit("drag-end");
190
205
  const offset = { x: state.value.x, y: state.value.y };
@@ -223,6 +238,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
223
238
  }
224
239
  });
225
240
  onUnmounted(() => {
241
+ document.body.classList.remove("floating-bubble-dragging");
226
242
  if (typeof window !== "undefined") {
227
243
  window.removeEventListener("resize", handleResize);
228
244
  window.removeEventListener("mousemove", onTouchMove);
@@ -240,7 +256,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
240
256
  __expose({
241
257
  offset: computed(() => ({ x: state.value.x, y: state.value.y }))
242
258
  });
243
- const __returned__ = { props, emit, rootRef, state, isObject, gapX, gapY, windowWidth, windowHeight, boundary, dragging, initialized, rootStyle, updateState, touch, get prevX() {
259
+ const __returned__ = { props, emit, rootRef, state, isObject, gapX, gapY, windowWidth, windowHeight, boundary, closest, applyMagnetic, dragging, initialized, rootStyle, updateState, touch, get prevX() {
244
260
  return prevX;
245
261
  }, set prevX(v) {
246
262
  prevX = v;
@@ -248,7 +264,7 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent(__spreadProps(__spreadValue
248
264
  return prevY;
249
265
  }, set prevY(v) {
250
266
  prevY = v;
251
- }, onTouchStart, onTouchMove, closest, onTouchEnd, onClick, handleResize };
267
+ }, onTouchStart, onTouchMove, onTouchEnd, onClick, handleResize };
252
268
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
253
269
  return __returned__;
254
270
  }
@@ -12,11 +12,9 @@ declare const __VLS_component: import("vue").DefineComponent<{}, {
12
12
  y: number;
13
13
  } | undefined>;
14
14
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
15
- "offset-change": (offset: FloatingBubbleOffset | undefined) => any;
16
15
  "drag-start": () => any;
17
16
  "drag-end": () => any;
18
17
  }, string, import("vue").PublicProps, Readonly<{}> & Readonly<{
19
- "onOffset-change"?: ((offset: FloatingBubbleOffset | undefined) => any) | undefined;
20
18
  "onDrag-start"?: (() => any) | undefined;
21
19
  "onDrag-end"?: (() => any) | undefined;
22
20
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -3,10 +3,9 @@ import { defineComponent as _defineComponent } from "vue";
3
3
  import { ref, watch } from "vue";
4
4
  import { useOpenCodeWidgetContext } from "../context";
5
5
  import FloatingBubble from "./FloatingBubble/FloatingBubble.vue.js";
6
- const STORAGE_KEY = "opencode-bubble-offset";
7
6
  const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
8
7
  __name: "Trigger",
9
- emits: ["offset-change", "drag-start", "drag-end"],
8
+ emits: ["drag-start", "drag-end"],
10
9
  setup(__props, { expose: __expose, emit: __emit }) {
11
10
  const {
12
11
  buttonActive: active,
@@ -14,39 +13,23 @@ const __vue_sfc__ = /* @__PURE__ */ _defineComponent({
14
13
  hotkeyLabel,
15
14
  thinking,
16
15
  resolvedTheme,
17
- handleToggle
16
+ handleToggle,
17
+ bubbleOffset,
18
+ handleBubbleOffsetChange
18
19
  } = useOpenCodeWidgetContext();
19
- const loadOffset = () => {
20
- try {
21
- const saved = localStorage.getItem(STORAGE_KEY);
22
- if (saved) {
23
- const parsed = JSON.parse(saved);
24
- if (parsed && (parsed.x !== 0 || parsed.y !== 0)) {
25
- return parsed;
26
- }
27
- }
28
- } catch (e) {
29
- }
30
- return void 0;
31
- };
32
- const offset = ref(loadOffset());
20
+ const offset = ref(bubbleOffset.value);
33
21
  const emit = __emit;
34
- const saveOffset = (value) => {
35
- try {
36
- localStorage.setItem(STORAGE_KEY, JSON.stringify(value));
37
- } catch (e) {
38
- }
39
- };
40
22
  const handleOffsetChange = (value) => {
41
23
  offset.value = value;
42
- saveOffset(value);
43
- emit("offset-change", value);
24
+ handleBubbleOffsetChange(value);
44
25
  };
45
- watch(offset, handleOffsetChange, { immediate: true });
26
+ watch(bubbleOffset, (newOffset) => {
27
+ offset.value = newOffset;
28
+ });
46
29
  __expose({
47
30
  offset
48
31
  });
49
- const __returned__ = { active, open, hotkeyLabel, thinking, resolvedTheme, handleToggle, STORAGE_KEY, loadOffset, offset, emit, saveOffset, handleOffsetChange, FloatingBubble };
32
+ const __returned__ = { active, open, hotkeyLabel, thinking, resolvedTheme, handleToggle, bubbleOffset, handleBubbleOffsetChange, offset, emit, handleOffsetChange, FloatingBubble };
50
33
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
51
34
  return __returned__;
52
35
  }
@@ -1,5 +1,6 @@
1
1
  import { type Ref } from "vue";
2
2
  import type { OpenCodeWidgetSessionItem, OpenCodeSelectedElementItem, OpenCodeRemoveSelectedPayload } from "./types";
3
+ import type { FloatingBubbleOffset } from "./components/FloatingBubble/types";
3
4
  export interface OpenCodeWidgetContext {
4
5
  theme: Ref<string>;
5
6
  resolvedTheme: Ref<"light" | "dark">;
@@ -22,6 +23,7 @@ export interface OpenCodeWidgetContext {
22
23
  thinking: Ref<boolean>;
23
24
  minimized: Ref<boolean>;
24
25
  promptDockVisible: Ref<boolean>;
26
+ bubbleOffset: Ref<FloatingBubbleOffset | undefined>;
25
27
  iframeSource: Ref<string>;
26
28
  buttonActive: Ref<boolean>;
27
29
  sessionListTitle: Ref<string>;
@@ -48,6 +50,7 @@ export interface OpenCodeWidgetContext {
48
50
  }) => void;
49
51
  handleClearSelectedNodes: () => void;
50
52
  handleFrameLoaded: () => void;
53
+ handleBubbleOffsetChange: (offset: FloatingBubbleOffset | undefined) => void;
51
54
  }
52
55
  export declare function provideOpenCodeWidgetContext(context: OpenCodeWidgetContext): void;
53
56
  export declare function useOpenCodeWidgetContext(): OpenCodeWidgetContext;
@@ -1 +1 @@
1
- .opencode-widget{--oc-bg-main: #ffffff;--oc-bg-secondary: #f8f9fa;--oc-bg-tertiary: #f3f4f6;--oc-overlay-bg: rgba(255, 255, 255, .9);--oc-bg-inverse: #1e1e1e;--oc-text-primary: #282828;--oc-text-secondary: #4b5563;--oc-text-tertiary: #6b7280;--oc-text-placeholder: #9ca3af;--oc-text-inverse: #ffffff;--oc-border-primary: #e5e7eb;--oc-border-secondary: #d1d5db;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .1);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(0, 0, 0, .5);--oc-tooltip-bg: #1e1e1e;--oc-dialog-overlay: rgba(0, 0, 0, .5);--oc-thinking-gradient-1: #10b981;--oc-thinking-gradient-2: #059669;--oc-thinking-glow: rgba(16, 185, 129, .3);--oc-thinking-glow-strong: rgba(16, 185, 129, .6);--oc-skeleton-bg: #e5e7eb;--oc-skeleton-gradient: linear-gradient(90deg, #e5e7eb 25%, #f3f4f6 50%, #e5e7eb 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .1);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .15);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .12);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .3);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .2);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .3);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .3);--oc-trigger-bg: #3b82f6;--oc-trigger-bg-hover: #2563eb;--oc-trigger-bg-active: #1d4ed8;--oc-trigger-shadow: 0 2px 8px rgba(59, 130, 246, .3);--oc-trigger-shadow-hover: 0 4px 12px rgba(59, 130, 246, .4);--oc-trigger-shadow-active: 0 4px 12px rgba(59, 130, 246, .5);position:fixed;z-index:999999;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-widget.opencode-theme-dark{--oc-bg-main: #1a1a1a;--oc-bg-secondary: #1e1e1e;--oc-bg-tertiary: #282828;--oc-overlay-bg: rgba(26, 26, 26, .9);--oc-bg-inverse: #ffffff;--oc-text-primary: #f3f4f6;--oc-text-secondary: #d1d5db;--oc-text-tertiary: #9ca3af;--oc-text-placeholder: #6b7280;--oc-text-inverse: #282828;--oc-border-primary: #282828;--oc-border-secondary: #4b5563;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .15);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(26, 26, 26, .9);--oc-tooltip-bg: #282828;--oc-dialog-overlay: rgba(0, 0, 0, .7);--oc-thinking-gradient-1: #34d399;--oc-thinking-gradient-2: #10b981;--oc-thinking-glow: rgba(52, 211, 153, .3);--oc-thinking-glow-strong: rgba(52, 211, 153, .6);--oc-skeleton-bg: #151515;--oc-skeleton-gradient: linear-gradient(90deg, #282828 25%, #4b5563 50%, #282828 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .3);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .4);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .4);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .6);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .3);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .4);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .4);--oc-trigger-bg: #60a5fa;--oc-trigger-bg-hover: #3b82f6;--oc-trigger-bg-active: #2563eb;--oc-trigger-shadow: 0 2px 8px rgba(96, 165, 250, .4);--oc-trigger-shadow-hover: 0 4px 12px rgba(96, 165, 250, .5);--oc-trigger-shadow-active: 0 4px 12px rgba(96, 165, 250, .6)}.opencode-chat{position:fixed;bottom:20px;width:700px;height:86vh;max-height:calc(100vh - 40px);background:var(--oc-bg-main);border-radius:16px;box-shadow:var(--oc-shadow-lg);overflow:hidden;opacity:0;visibility:hidden;transform:translate3d(var(---chatAnimationOrigin\.x),var(---chatAnimationOrigin\.y),0) scale(.95);transition:all .3s ease;display:flex;flex-direction:column;z-index:99999}.opencode-chat.minimized{width:300px;height:300px}.opencode-chat.minimized .opencode-iframe-container{margin-top:-146px}.opencode-chat-content{display:flex;flex:1;overflow:hidden}.opencode-chat.open{opacity:1;visibility:visible;transform:translateZ(0) scale(1)}.opencode-notification{position:absolute;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px rgba(59,130,246,.4),0 0 0 2px rgba(59,130,246,.2);animation:slideDown .3s ease;z-index:10000000;display:flex;align-items:center;gap:10px}.opencode-notification:before{content:"\1f4a1";font-size:16px}.opencode-dialog-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--oc-dialog-overlay);display:flex;align-items:center;justify-content:center;z-index:9999999;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.opencode-dialog{background:var(--oc-bg-main);border-radius:12px;padding:24px;min-width:320px;max-width:400px;box-shadow:var(--oc-shadow-xl);animation:scaleIn .2s ease}@keyframes scaleIn{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}.opencode-dialog-content{margin-bottom:20px}.opencode-dialog-message{font-size:15px;color:var(--oc-text-primary);line-height:1.5}.opencode-dialog-actions{display:flex;gap:12px;justify-content:flex-end}.opencode-dialog-btn{padding:10px 20px;border-radius:8px;border:none;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s}.opencode-dialog-btn.cancel{background:var(--oc-bg-tertiary);color:var(--oc-text-primary)}.opencode-dialog-btn.cancel:hover{background:var(--oc-text-primary);color:var(--oc-bg-main)}.opencode-dialog-btn.confirm{background:var(--oc-danger);color:#fff}.opencode-dialog-btn.confirm:hover{background:var(--oc-danger-hover)}@keyframes slideDown{0%{transform:translate(-50%) translateY(-100%);opacity:0}to{transform:translate(-50%) translateY(0);opacity:1}}.opencode-page-notification{position:fixed;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px rgba(59,130,246,.4),0 0 0 2px rgba(59,130,246,.2);animation:slideDown .3s ease;z-index:2147483647;display:flex;align-items:center;gap:10px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-page-notification:before{content:"\1f4a1";font-size:16px}.opencode-element-highlight{position:fixed;pointer-events:none;z-index:999998;display:none;transition:all .1s ease;border-radius:4px}#vue-inspector-container{display:none!important}.opencode-element-tooltip{position:fixed;background:var(--oc-tooltip-bg);color:#fff;padding:8px 12px;border-radius:6px;font-size:12px;z-index:9999998;display:none;box-shadow:var(--oc-shadow-md);max-width:300px;pointer-events:none}.opencode-tooltip-tag{font-weight:500;margin-bottom:4px;word-break:break-all}.opencode-tooltip-file{font-size:11px;color:var(--oc-text-placeholder);word-break:break-all}.opencode-element-highlight-temp{position:absolute;pointer-events:none;z-index:999998;border-radius:4px;animation:highlight-pulse 2s ease-out forwards}@keyframes highlight-pulse{0%{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.02)}to{opacity:0;transform:scale(1)}}@media(max-width:768px){.opencode-chat{width:calc(100vw - 40px);height:calc(100vh - 100px)}}
1
+ .opencode-widget{--oc-bg-main: #ffffff;--oc-bg-secondary: #f8f9fa;--oc-bg-tertiary: #f3f4f6;--oc-overlay-bg: rgba(255, 255, 255, .9);--oc-bg-inverse: #1e1e1e;--oc-text-primary: #282828;--oc-text-secondary: #4b5563;--oc-text-tertiary: #6b7280;--oc-text-placeholder: #9ca3af;--oc-text-inverse: #ffffff;--oc-border-primary: #e5e7eb;--oc-border-secondary: #d1d5db;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .1);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(0, 0, 0, .5);--oc-tooltip-bg: #1e1e1e;--oc-dialog-overlay: rgba(0, 0, 0, .5);--oc-thinking-gradient-1: #10b981;--oc-thinking-gradient-2: #059669;--oc-thinking-glow: rgba(16, 185, 129, .3);--oc-thinking-glow-strong: rgba(16, 185, 129, .6);--oc-skeleton-bg: #e5e7eb;--oc-skeleton-gradient: linear-gradient(90deg, #e5e7eb 25%, #f3f4f6 50%, #e5e7eb 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .1);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .15);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .12);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .3);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .2);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .3);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .3);--oc-trigger-bg: #3b82f6;--oc-trigger-bg-hover: #2563eb;--oc-trigger-bg-active: #1d4ed8;--oc-trigger-shadow: 0 2px 8px rgba(59, 130, 246, .3);--oc-trigger-shadow-hover: 0 4px 12px rgba(59, 130, 246, .4);--oc-trigger-shadow-active: 0 4px 12px rgba(59, 130, 246, .5);position:fixed;z-index:999999;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-widget.opencode-theme-dark{--oc-bg-main: #1a1a1a;--oc-bg-secondary: #1e1e1e;--oc-bg-tertiary: #282828;--oc-overlay-bg: rgba(26, 26, 26, .9);--oc-bg-inverse: #ffffff;--oc-text-primary: #f3f4f6;--oc-text-secondary: #d1d5db;--oc-text-tertiary: #9ca3af;--oc-text-placeholder: #6b7280;--oc-text-inverse: #282828;--oc-border-primary: #282828;--oc-border-secondary: #4b5563;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .15);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(26, 26, 26, .9);--oc-tooltip-bg: #282828;--oc-dialog-overlay: rgba(0, 0, 0, .7);--oc-thinking-gradient-1: #34d399;--oc-thinking-gradient-2: #10b981;--oc-thinking-glow: rgba(52, 211, 153, .3);--oc-thinking-glow-strong: rgba(52, 211, 153, .6);--oc-skeleton-bg: #151515;--oc-skeleton-gradient: linear-gradient(90deg, #282828 25%, #4b5563 50%, #282828 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .3);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .4);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .4);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .6);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .3);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .4);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .4);--oc-trigger-bg: #60a5fa;--oc-trigger-bg-hover: #3b82f6;--oc-trigger-bg-active: #2563eb;--oc-trigger-shadow: 0 2px 8px rgba(96, 165, 250, .4);--oc-trigger-shadow-hover: 0 4px 12px rgba(96, 165, 250, .5);--oc-trigger-shadow-active: 0 4px 12px rgba(96, 165, 250, .6)}.opencode-chat{position:fixed;bottom:20px;width:700px;height:86vh;max-height:calc(100vh - 40px);background:var(--oc-bg-main);border-radius:16px;box-shadow:var(--oc-shadow-lg);overflow:hidden;opacity:0;visibility:hidden;transform:translate3d(var(---chatAnimationOrigin\.x),var(---chatAnimationOrigin\.y),0) scale(.95);transition:all .3s ease;display:flex;flex-direction:column;z-index:99999}.opencode-chat.open{opacity:1;visibility:visible;transform:translateZ(0) scale(1)}.opencode-chat.no-transition,.opencode-chat.no-transition.open{transition:none!important}.opencode-chat.minimized{width:300px;height:300px}.opencode-chat.minimized .opencode-iframe-container{margin-top:-146px}.opencode-chat-content{display:flex;flex:1;overflow:hidden}.opencode-notification{position:absolute;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px rgba(59,130,246,.4),0 0 0 2px rgba(59,130,246,.2);animation:slideDown .3s ease;z-index:10000000;display:flex;align-items:center;gap:10px}.opencode-notification:before{content:"\1f4a1";font-size:16px}.opencode-dialog-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--oc-dialog-overlay);display:flex;align-items:center;justify-content:center;z-index:9999999;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.opencode-dialog{background:var(--oc-bg-main);border-radius:12px;padding:24px;min-width:320px;max-width:400px;box-shadow:var(--oc-shadow-xl);animation:scaleIn .2s ease}@keyframes scaleIn{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}.opencode-dialog-content{margin-bottom:20px}.opencode-dialog-message{font-size:15px;color:var(--oc-text-primary);line-height:1.5}.opencode-dialog-actions{display:flex;gap:12px;justify-content:flex-end}.opencode-dialog-btn{padding:10px 20px;border-radius:8px;border:none;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s}.opencode-dialog-btn.cancel{background:var(--oc-bg-tertiary);color:var(--oc-text-primary)}.opencode-dialog-btn.cancel:hover{background:var(--oc-text-primary);color:var(--oc-bg-main)}.opencode-dialog-btn.confirm{background:var(--oc-danger);color:#fff}.opencode-dialog-btn.confirm:hover{background:var(--oc-danger-hover)}@keyframes slideDown{0%{transform:translate(-50%) translateY(-100%);opacity:0}to{transform:translate(-50%) translateY(0);opacity:1}}.opencode-page-notification{position:fixed;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px rgba(59,130,246,.4),0 0 0 2px rgba(59,130,246,.2);animation:slideDown .3s ease;z-index:2147483647;display:flex;align-items:center;gap:10px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-page-notification:before{content:"\1f4a1";font-size:16px}.opencode-element-highlight{position:fixed;pointer-events:none;z-index:999998;border-radius:4px}#vue-inspector-container{display:none!important}.opencode-element-tooltip{position:fixed;background:var(--oc-tooltip-bg);color:#fff;padding:8px 12px;border-radius:6px;font-size:12px;z-index:9999998;box-shadow:var(--oc-shadow-md);max-width:300px;pointer-events:none}.opencode-tooltip-tag{font-weight:500;margin-bottom:4px;word-break:break-all}.opencode-tooltip-file{font-size:11px;color:var(--oc-text-placeholder);word-break:break-all}.opencode-element-highlight-temp{position:absolute;pointer-events:none;z-index:999998;border-radius:4px;animation:highlight-pulse 2s ease-out forwards}@keyframes highlight-pulse{0%{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.02)}to{opacity:0;transform:scale(1)}}@media(max-width:768px){.opencode-chat{width:calc(100vw - 40px);height:calc(100vh - 100px)}}
@@ -1,23 +1,23 @@
1
1
  import type { OpenCodeWidgetProps } from "./types";
2
- declare var __VLS_12: {}, __VLS_17: {}, __VLS_19: {}, __VLS_21: {}, __VLS_26: {}, __VLS_33: {}, __VLS_35: {}, __VLS_37: {}, __VLS_39: {};
2
+ declare var __VLS_11: {}, __VLS_16: {}, __VLS_18: {}, __VLS_20: {}, __VLS_25: {}, __VLS_32: {}, __VLS_34: {}, __VLS_36: {}, __VLS_38: {};
3
3
  type __VLS_Slots = {} & {
4
- 'button-icon'?: (props: typeof __VLS_12) => any;
4
+ 'button-icon'?: (props: typeof __VLS_11) => any;
5
5
  } & {
6
- 'session-toggle-icon'?: (props: typeof __VLS_17) => any;
6
+ 'session-toggle-icon'?: (props: typeof __VLS_16) => any;
7
7
  } & {
8
- 'select-icon'?: (props: typeof __VLS_19) => any;
8
+ 'select-icon'?: (props: typeof __VLS_18) => any;
9
9
  } & {
10
- 'close-icon'?: (props: typeof __VLS_21) => any;
10
+ 'close-icon'?: (props: typeof __VLS_20) => any;
11
11
  } & {
12
- 'sessions-empty'?: (props: typeof __VLS_26) => any;
12
+ 'sessions-empty'?: (props: typeof __VLS_25) => any;
13
13
  } & {
14
- 'empty-state'?: (props: typeof __VLS_33) => any;
14
+ 'empty-state'?: (props: typeof __VLS_32) => any;
15
15
  } & {
16
- loading?: (props: typeof __VLS_35) => any;
16
+ loading?: (props: typeof __VLS_34) => any;
17
17
  } & {
18
- error?: (props: typeof __VLS_37) => any;
18
+ error?: (props: typeof __VLS_36) => any;
19
19
  } & {
20
- content?: (props: typeof __VLS_39) => any;
20
+ content?: (props: typeof __VLS_38) => any;
21
21
  };
22
22
  declare const __VLS_component: import("vue").DefineComponent<OpenCodeWidgetProps, {
23
23
  showNotification: (message: string, options?: {