@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.
- package/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/es/open-code-widget/composables/use-inspector.js +118 -79
- package/es/open-code-widget/composables/use-persist-state.d.ts +24 -0
- package/es/open-code-widget/composables/use-persist-state.js +59 -0
- package/es/open-code-widget/src/components/FloatingBubble/FloatingBubble-sfc.css +1 -1
- package/es/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.d.ts +2 -2
- package/es/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.js +37 -21
- package/es/open-code-widget/src/components/Trigger.vue.d.ts +0 -2
- package/es/open-code-widget/src/components/Trigger.vue.js +10 -27
- package/es/open-code-widget/src/context.d.ts +3 -0
- package/es/open-code-widget/src/index-sfc.css +1 -1
- package/es/open-code-widget/src/index.vue.d.ts +10 -10
- package/es/open-code-widget/src/index.vue.js +107 -29
- package/lib/@vite-plugin-opencode-assistant/components.cjs.js +304 -140
- package/lib/@vite-plugin-opencode-assistant/components.es.js +305 -141
- package/lib/components.css +2 -2
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/open-code-widget/composables/use-inspector.js +118 -79
- package/lib/open-code-widget/composables/use-persist-state.d.ts +24 -0
- package/lib/open-code-widget/composables/use-persist-state.js +78 -0
- package/lib/open-code-widget/src/components/FloatingBubble/FloatingBubble-sfc.css +1 -1
- package/lib/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.d.ts +2 -2
- package/lib/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.js +37 -21
- package/lib/open-code-widget/src/components/Trigger.vue.d.ts +0 -2
- package/lib/open-code-widget/src/components/Trigger.vue.js +10 -27
- package/lib/open-code-widget/src/context.d.ts +3 -0
- package/lib/open-code-widget/src/index-sfc.css +1 -1
- package/lib/open-code-widget/src/index.vue.d.ts +10 -10
- package/lib/open-code-widget/src/index.vue.js +106 -28
- package/lib/web-types.json +1 -1
- package/package.json +2 -2
package/es/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import OpenCodeWidget from './open-code-widget';
|
|
2
2
|
import type { App } from 'vue';
|
|
3
|
-
declare const version = "1.0.
|
|
3
|
+
declare const version = "1.0.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
|
@@ -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
|
-
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
|
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
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
if (
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
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
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
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
|
-
|
|
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 (
|
|
299
|
-
lineInfo = `:${
|
|
300
|
-
if (
|
|
301
|
-
lineInfo += `:${
|
|
296
|
+
if (currentFileInfo.line) {
|
|
297
|
+
lineInfo = `:${currentFileInfo.line}`;
|
|
298
|
+
if (currentFileInfo.column) {
|
|
299
|
+
lineInfo += `:${currentFileInfo.column}`;
|
|
302
300
|
}
|
|
303
301
|
}
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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
|
-
|
|
320
|
-
|
|
321
|
-
|
|
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
|
-
|
|
325
|
-
|
|
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
|
-
|
|
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,
|
|
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: ["
|
|
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
|
|
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
|
-
|
|
43
|
-
emit("offset-change", value);
|
|
24
|
+
handleBubbleOffsetChange(value);
|
|
44
25
|
};
|
|
45
|
-
watch(
|
|
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,
|
|
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-
|
|
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
|
|
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
|
|
4
|
+
'button-icon'?: (props: typeof __VLS_11) => any;
|
|
5
5
|
} & {
|
|
6
|
-
'session-toggle-icon'?: (props: typeof
|
|
6
|
+
'session-toggle-icon'?: (props: typeof __VLS_16) => any;
|
|
7
7
|
} & {
|
|
8
|
-
'select-icon'?: (props: typeof
|
|
8
|
+
'select-icon'?: (props: typeof __VLS_18) => any;
|
|
9
9
|
} & {
|
|
10
|
-
'close-icon'?: (props: typeof
|
|
10
|
+
'close-icon'?: (props: typeof __VLS_20) => any;
|
|
11
11
|
} & {
|
|
12
|
-
'sessions-empty'?: (props: typeof
|
|
12
|
+
'sessions-empty'?: (props: typeof __VLS_25) => any;
|
|
13
13
|
} & {
|
|
14
|
-
'empty-state'?: (props: typeof
|
|
14
|
+
'empty-state'?: (props: typeof __VLS_32) => any;
|
|
15
15
|
} & {
|
|
16
|
-
loading?: (props: typeof
|
|
16
|
+
loading?: (props: typeof __VLS_34) => any;
|
|
17
17
|
} & {
|
|
18
|
-
error?: (props: typeof
|
|
18
|
+
error?: (props: typeof __VLS_36) => any;
|
|
19
19
|
} & {
|
|
20
|
-
content?: (props: typeof
|
|
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?: {
|