agentation-vue 0.2.10 → 0.2.13
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/README.md +94 -0
- package/dist/AgentationVue.vue +64 -8
- package/dist/components/AgentationToolbar.d.vue.ts +2 -0
- package/dist/components/AgentationToolbar.vue +11 -1
- package/dist/components/AgentationToolbar.vue.d.ts +2 -0
- package/dist/components/AnnotationInput.vue +3 -6
- package/dist/components/AnnotationMarker.d.vue.ts +1 -0
- package/dist/components/AnnotationMarker.vue +12 -3
- package/dist/components/AnnotationMarker.vue.d.ts +1 -0
- package/dist/components/SettingsPanel.vue +24 -3
- package/dist/composables/useOutputFormatter.mjs +2 -1
- package/dist/composables/usePeekMode.d.ts +14 -0
- package/dist/composables/usePeekMode.mjs +119 -0
- package/dist/composables/useSettings.d.ts +1 -0
- package/dist/composables/useSettings.mjs +2 -1
- package/dist/constants.d.ts +2 -1
- package/dist/constants.mjs +3 -1
- package/dist/directives/vaTooltip.mjs +9 -2
- package/dist/styles/agentation.css +1 -1
- package/dist/types.d.ts +1 -0
- package/package.json +2 -2
package/README.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# agentation-vue
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/agentation-vue)
|
|
4
|
+
[](https://www.npmjs.com/package/agentation-vue)
|
|
5
|
+
|
|
6
|
+
Visual feedback tool for AI coding agents. Drop a single component into your Vue app and let your AI agent see and annotate UI elements.
|
|
7
|
+
|
|
8
|
+
Compatible with **Vue 3.3+** and **Vue 2.7**.
|
|
9
|
+
|
|
10
|
+
> **Note:** This is an unofficial, community-maintained Vue adaptation of [Agentation](https://github.com/benjitaylor/agentation). It is not affiliated with or endorsed by the original project.
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install agentation-vue
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Setup — Vue 3
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import { AgentationVuePlugin } from 'agentation-vue'
|
|
22
|
+
// main.ts
|
|
23
|
+
import { createApp } from 'vue'
|
|
24
|
+
import App from './App.vue'
|
|
25
|
+
import 'agentation-vue/style.css'
|
|
26
|
+
|
|
27
|
+
createApp(App)
|
|
28
|
+
.use(AgentationVuePlugin)
|
|
29
|
+
.mount('#app')
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Then place the component once in your root `App.vue`:
|
|
33
|
+
|
|
34
|
+
```vue
|
|
35
|
+
<template>
|
|
36
|
+
<router-view />
|
|
37
|
+
<agentation-vue />
|
|
38
|
+
</template>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Setup — Vue 2.7
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
import { AgentationVuePlugin } from 'agentation-vue'
|
|
45
|
+
// main.ts
|
|
46
|
+
import Vue from 'vue'
|
|
47
|
+
import App from './App.vue'
|
|
48
|
+
import 'agentation-vue/style.css'
|
|
49
|
+
|
|
50
|
+
Vue.use(AgentationVuePlugin)
|
|
51
|
+
|
|
52
|
+
new Vue({
|
|
53
|
+
render: h => h(App),
|
|
54
|
+
}).$mount('#app')
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Then place the component once in your root `App.vue`:
|
|
58
|
+
|
|
59
|
+
```vue
|
|
60
|
+
<template>
|
|
61
|
+
<div>
|
|
62
|
+
<router-view />
|
|
63
|
+
<agentation-vue />
|
|
64
|
+
</div>
|
|
65
|
+
</template>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
> Vue 2 templates require a single root element — wrap your content in a `<div>`.
|
|
69
|
+
|
|
70
|
+
## Chrome extension
|
|
71
|
+
|
|
72
|
+
This repo also contains a Chrome extension for injecting Agentation without modifying the target app code.
|
|
73
|
+
|
|
74
|
+
## Features
|
|
75
|
+
|
|
76
|
+
- **Click-to-annotate** — click any element to pin a numbered marker and leave a comment
|
|
77
|
+
- **Multi-select** — `Shift+drag` to rubber-band select multiple elements at once
|
|
78
|
+
- **Area select** — `Alt+drag` to annotate a screen region
|
|
79
|
+
- **Text selection** — highlight text to annotate it
|
|
80
|
+
- **Vue component tree** — automatically detects and reports the Vue component hierarchy for each annotated element
|
|
81
|
+
- **Markdown output** — copies all annotations as structured Markdown, ready to paste into an AI chat
|
|
82
|
+
- **Forensic mode** — captures bounding boxes, computed styles, CSS classes, and accessibility attributes
|
|
83
|
+
- **Themes** — light, dark, or auto (follows system preference)
|
|
84
|
+
- **Auto-hide launcher** — optionally tucks the collapsed floating button near screen edges and reveals it on approach
|
|
85
|
+
- **Session persistence** — annotations survive refreshes and are scoped per page URL via `sessionStorage`
|
|
86
|
+
- **Custom tooltip directive** — `v-va-tooltip` with optional keyboard shortcut badge
|
|
87
|
+
|
|
88
|
+
## Acknowledgments
|
|
89
|
+
|
|
90
|
+
This project is inspired by and based on [Agentation](https://github.com/benjitaylor/agentation) by [Ben Taylor](https://github.com/benjitaylor). Thank you for the original concept and implementation.
|
|
91
|
+
|
|
92
|
+
## License
|
|
93
|
+
|
|
94
|
+
[PolyForm Shield 1.0.0](./LICENSE) — Copyright (c) 2026 Dorian Becker
|
package/dist/AgentationVue.vue
CHANGED
|
@@ -25,8 +25,10 @@ import {
|
|
|
25
25
|
import { useMarkerPositions } from "./composables/useMarkerPositions.mjs";
|
|
26
26
|
import { useMultiSelect } from "./composables/useMultiSelect.mjs";
|
|
27
27
|
import { useOutputFormatter } from "./composables/useOutputFormatter.mjs";
|
|
28
|
+
import { usePeekMode } from "./composables/usePeekMode.mjs";
|
|
28
29
|
import { useSettings } from "./composables/useSettings.mjs";
|
|
29
30
|
import { useTextSelection } from "./composables/useTextSelection.mjs";
|
|
31
|
+
import { PEEK_HOLD_DURATION_MS } from "./constants.mjs";
|
|
30
32
|
import { isInsideAgentationTree } from "./utils/agentation-tree.mjs";
|
|
31
33
|
import { copyToClipboard } from "./utils/clipboard.mjs";
|
|
32
34
|
import {
|
|
@@ -103,6 +105,25 @@ const areaSelect = useAreaSelect(mode, transition);
|
|
|
103
105
|
const animPause = useAnimationPause();
|
|
104
106
|
const { recalculatePositions: _recalculatePositions } = useMarkerPositions(annotations);
|
|
105
107
|
const { formatAnnotations } = useOutputFormatter();
|
|
108
|
+
const peekActive = ref(false);
|
|
109
|
+
const peekMode = usePeekMode({
|
|
110
|
+
peekKey: () => settings.peekKey,
|
|
111
|
+
enabled: () => mode.value === "idle" && (!toolbarRef.value || !toolbarRef.value.expanded),
|
|
112
|
+
isInputOpen: () => mode.value === "input-open",
|
|
113
|
+
onActivate() {
|
|
114
|
+
peekActive.value = true;
|
|
115
|
+
transition("inspect");
|
|
116
|
+
},
|
|
117
|
+
onDeactivate() {
|
|
118
|
+
peekActive.value = false;
|
|
119
|
+
if (mode.value === "input-open")
|
|
120
|
+
return;
|
|
121
|
+
if (mode.value !== "idle") {
|
|
122
|
+
transition("idle");
|
|
123
|
+
clearHighlight();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
});
|
|
106
127
|
const pendingPosition = ref(null);
|
|
107
128
|
const pendingElementName = ref("");
|
|
108
129
|
const pendingTarget = ref(null);
|
|
@@ -240,6 +261,17 @@ watch(
|
|
|
240
261
|
},
|
|
241
262
|
{ immediate: true }
|
|
242
263
|
);
|
|
264
|
+
let crosshairStyle = null;
|
|
265
|
+
watch(mode, (current, previous) => {
|
|
266
|
+
if (current !== "idle" && previous === "idle") {
|
|
267
|
+
crosshairStyle = document.createElement("style");
|
|
268
|
+
crosshairStyle.textContent = "* { cursor: crosshair !important; }";
|
|
269
|
+
document.head.appendChild(crosshairStyle);
|
|
270
|
+
} else if (current === "idle" && previous !== "idle") {
|
|
271
|
+
crosshairStyle?.remove();
|
|
272
|
+
crosshairStyle = null;
|
|
273
|
+
}
|
|
274
|
+
});
|
|
243
275
|
function onActivate() {
|
|
244
276
|
transition("inspect");
|
|
245
277
|
}
|
|
@@ -262,8 +294,6 @@ function onOverlayMouseMove(e) {
|
|
|
262
294
|
function onOverlayMouseDown(e) {
|
|
263
295
|
if (isInteractionLocked())
|
|
264
296
|
return;
|
|
265
|
-
if (multiSelect.onMouseDown(e))
|
|
266
|
-
return;
|
|
267
297
|
areaSelect.onMouseDown(e);
|
|
268
298
|
}
|
|
269
299
|
function onOverlayMouseUp(e) {
|
|
@@ -579,13 +609,24 @@ function onInputAdd(comment) {
|
|
|
579
609
|
emit("annotation-add", ann);
|
|
580
610
|
}
|
|
581
611
|
resetPendingState();
|
|
582
|
-
|
|
612
|
+
clearHighlight();
|
|
613
|
+
if (peekActive.value) {
|
|
614
|
+
transition("inspect");
|
|
615
|
+
peekMode.scheduleExit();
|
|
616
|
+
} else {
|
|
617
|
+
transition("inspect");
|
|
618
|
+
}
|
|
583
619
|
}
|
|
584
620
|
function onInputCancel() {
|
|
585
621
|
resetPendingState();
|
|
586
|
-
multiSelect.reset();
|
|
587
622
|
areaSelect.reset();
|
|
588
|
-
|
|
623
|
+
clearHighlight();
|
|
624
|
+
if (peekActive.value) {
|
|
625
|
+
transition("idle");
|
|
626
|
+
peekMode.deactivate();
|
|
627
|
+
} else {
|
|
628
|
+
transition("inspect");
|
|
629
|
+
}
|
|
589
630
|
}
|
|
590
631
|
async function onCopy() {
|
|
591
632
|
const markdown = formatAnnotations(
|
|
@@ -663,7 +704,13 @@ function onInputDelete() {
|
|
|
663
704
|
if (removed)
|
|
664
705
|
emit("annotation-delete", removed);
|
|
665
706
|
resetPendingState();
|
|
666
|
-
|
|
707
|
+
clearHighlight();
|
|
708
|
+
if (peekActive.value) {
|
|
709
|
+
transition("idle");
|
|
710
|
+
peekMode.deactivate();
|
|
711
|
+
} else {
|
|
712
|
+
transition("inspect");
|
|
713
|
+
}
|
|
667
714
|
}
|
|
668
715
|
function onInputSave(comment) {
|
|
669
716
|
if (!editingAnnotation.value)
|
|
@@ -672,7 +719,13 @@ function onInputSave(comment) {
|
|
|
672
719
|
if (updated)
|
|
673
720
|
emit("annotation-update", updated);
|
|
674
721
|
resetPendingState();
|
|
675
|
-
|
|
722
|
+
clearHighlight();
|
|
723
|
+
if (peekActive.value) {
|
|
724
|
+
transition("inspect");
|
|
725
|
+
peekMode.scheduleExit();
|
|
726
|
+
} else {
|
|
727
|
+
transition("inspect");
|
|
728
|
+
}
|
|
676
729
|
}
|
|
677
730
|
function onToggleArea(value) {
|
|
678
731
|
areaSelect.isAreaMode.value = value;
|
|
@@ -788,10 +841,11 @@ onBeforeUnmount(() => {
|
|
|
788
841
|
:style="boundingBoxToStyle(areaSelect.areaRect.value)"
|
|
789
842
|
/>
|
|
790
843
|
|
|
791
|
-
<!-- Annotation markers -->
|
|
844
|
+
<!-- Annotation markers (hidden when toolbar is collapsed) -->
|
|
792
845
|
<AnnotationMarker
|
|
793
846
|
v-for="(ann, i) in annotations"
|
|
794
847
|
:key="ann.id"
|
|
848
|
+
:hidden="mode === 'idle'"
|
|
795
849
|
:number="i + 1"
|
|
796
850
|
:x="ann.x"
|
|
797
851
|
:y="ann.y"
|
|
@@ -861,6 +915,8 @@ onBeforeUnmount(() => {
|
|
|
861
915
|
:is-area-mode="areaSelect.isAreaMode.value"
|
|
862
916
|
:auto-hide-enabled="settings.autoHideToolbar"
|
|
863
917
|
:placement="settings.toolbarPlacement"
|
|
918
|
+
:is-peek-charging="peekMode.isCharging.value"
|
|
919
|
+
:peek-duration-ms="PEEK_HOLD_DURATION_MS"
|
|
864
920
|
@activate="onActivate"
|
|
865
921
|
@deactivate="onDeactivate"
|
|
866
922
|
@copy="onCopy"
|
|
@@ -6,6 +6,8 @@ type __VLS_Props = {
|
|
|
6
6
|
isAreaMode: boolean;
|
|
7
7
|
autoHideEnabled: boolean;
|
|
8
8
|
placement: ToolbarAnchor;
|
|
9
|
+
isPeekCharging: boolean;
|
|
10
|
+
peekDurationMs: number;
|
|
9
11
|
};
|
|
10
12
|
declare const _default: import("vue-demi").DefineComponent<__VLS_Props, {
|
|
11
13
|
expanded: import("vue-demi").Ref<boolean, boolean>;
|
|
@@ -10,7 +10,9 @@ const props = defineProps({
|
|
|
10
10
|
isPaused: { type: Boolean, required: true },
|
|
11
11
|
isAreaMode: { type: Boolean, required: true },
|
|
12
12
|
autoHideEnabled: { type: Boolean, required: true },
|
|
13
|
-
placement: { type: String, required: true }
|
|
13
|
+
placement: { type: String, required: true },
|
|
14
|
+
isPeekCharging: { type: Boolean, required: true },
|
|
15
|
+
peekDurationMs: { type: Number, required: true }
|
|
14
16
|
});
|
|
15
17
|
const emit = defineEmits(["activate", "deactivate", "copy", "clear", "toggle-pause", "toggle-area", "update:placement", "open-settings", "drag-start", "drag-end"]);
|
|
16
18
|
const expanded = ref(false);
|
|
@@ -133,6 +135,14 @@ defineExpose({ expanded, placement });
|
|
|
133
135
|
>
|
|
134
136
|
<VaIcon name="cursor" />
|
|
135
137
|
<span v-if="annotationCount > 0" class="__va-toolbar-badge">{{ annotationCount }}</span>
|
|
138
|
+
<svg
|
|
139
|
+
v-if="isPeekCharging"
|
|
140
|
+
class="__va-peek-ring"
|
|
141
|
+
viewBox="0 0 46 46"
|
|
142
|
+
aria-hidden="true"
|
|
143
|
+
>
|
|
144
|
+
<circle cx="23" cy="23" r="21" :style="{ animationDuration: `${peekDurationMs}ms` }" />
|
|
145
|
+
</svg>
|
|
136
146
|
</button>
|
|
137
147
|
</div>
|
|
138
148
|
|
|
@@ -6,6 +6,8 @@ type __VLS_Props = {
|
|
|
6
6
|
isAreaMode: boolean;
|
|
7
7
|
autoHideEnabled: boolean;
|
|
8
8
|
placement: ToolbarAnchor;
|
|
9
|
+
isPeekCharging: boolean;
|
|
10
|
+
peekDurationMs: number;
|
|
9
11
|
};
|
|
10
12
|
declare const _default: import("vue-demi").DefineComponent<__VLS_Props, {
|
|
11
13
|
expanded: import("vue-demi").Ref<boolean, boolean>;
|
|
@@ -64,10 +64,7 @@ function onKeyDown(e) {
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
function onAdd() {
|
|
67
|
-
|
|
68
|
-
if (!text)
|
|
69
|
-
return;
|
|
70
|
-
emit("add", text);
|
|
67
|
+
emit("add", getComment().trim());
|
|
71
68
|
}
|
|
72
69
|
function onPaste(e) {
|
|
73
70
|
e.preventDefault();
|
|
@@ -161,8 +158,8 @@ onMounted(() => {
|
|
|
161
158
|
<VaButton variant="secondary" @click="$emit('cancel')">
|
|
162
159
|
Cancel
|
|
163
160
|
</VaButton>
|
|
164
|
-
<VaButton
|
|
165
|
-
{{ isEditing ? "Save" : "Add" }}
|
|
161
|
+
<VaButton @click="onAdd">
|
|
162
|
+
{{ isEditing ? "Save" : commentText.trim() ? "Add" : "Pin" }}
|
|
166
163
|
</VaButton>
|
|
167
164
|
</div>
|
|
168
165
|
</div>
|
|
@@ -6,6 +6,7 @@ type __VLS_Props = {
|
|
|
6
6
|
isStale?: boolean;
|
|
7
7
|
isPending?: boolean;
|
|
8
8
|
isSelection?: boolean;
|
|
9
|
+
hidden?: boolean;
|
|
9
10
|
};
|
|
10
11
|
declare const _default: import("vue-demi").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue-demi").ComponentOptionsMixin, import("vue-demi").ComponentOptionsMixin, {
|
|
11
12
|
click: () => any;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
import { computed } from "vue-demi";
|
|
2
|
+
import { computed, onMounted, ref } from "vue-demi";
|
|
3
3
|
import VaIcon from "./VaIcon.vue";
|
|
4
4
|
const props = defineProps({
|
|
5
5
|
number: { type: Number, required: true },
|
|
@@ -8,9 +8,16 @@ const props = defineProps({
|
|
|
8
8
|
isFixed: { type: Boolean, required: false },
|
|
9
9
|
isStale: { type: Boolean, required: false },
|
|
10
10
|
isPending: { type: Boolean, required: false },
|
|
11
|
-
isSelection: { type: Boolean, required: false }
|
|
11
|
+
isSelection: { type: Boolean, required: false },
|
|
12
|
+
hidden: { type: Boolean, required: false }
|
|
12
13
|
});
|
|
13
14
|
defineEmits(["click"]);
|
|
15
|
+
const entering = ref(true);
|
|
16
|
+
onMounted(() => {
|
|
17
|
+
requestAnimationFrame(() => {
|
|
18
|
+
entering.value = false;
|
|
19
|
+
});
|
|
20
|
+
});
|
|
14
21
|
const markerStyle = computed(() => ({
|
|
15
22
|
left: `${props.x}%`,
|
|
16
23
|
top: `${props.y}px`
|
|
@@ -24,7 +31,9 @@ const markerStyle = computed(() => ({
|
|
|
24
31
|
'__va-marker--fixed': isFixed,
|
|
25
32
|
'__va-marker--stale': isStale,
|
|
26
33
|
'__va-marker--pending': isPending,
|
|
27
|
-
'__va-marker--selection': isSelection
|
|
34
|
+
'__va-marker--selection': isSelection,
|
|
35
|
+
'__va-marker--hidden': hidden,
|
|
36
|
+
'__va-marker--entering': entering
|
|
28
37
|
}"
|
|
29
38
|
:style="markerStyle"
|
|
30
39
|
data-agentation-vue
|
|
@@ -6,6 +6,7 @@ type __VLS_Props = {
|
|
|
6
6
|
isStale?: boolean;
|
|
7
7
|
isPending?: boolean;
|
|
8
8
|
isSelection?: boolean;
|
|
9
|
+
hidden?: boolean;
|
|
9
10
|
};
|
|
10
11
|
declare const _default: import("vue-demi").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue-demi").ComponentOptionsMixin, import("vue-demi").ComponentOptionsMixin, {
|
|
11
12
|
click: () => any;
|
|
@@ -84,10 +84,10 @@ function toggleTheme() {
|
|
|
84
84
|
<div class="__va-settings-divider" />
|
|
85
85
|
|
|
86
86
|
<div class="__va-settings-row">
|
|
87
|
-
<span class="__va-settings-label">Clear
|
|
87
|
+
<span class="__va-settings-label">Clear After Copy</span>
|
|
88
88
|
<VaToggle
|
|
89
89
|
:model-value="settings.clearAfterCopy"
|
|
90
|
-
aria-label="Clear
|
|
90
|
+
aria-label="Clear After Copy"
|
|
91
91
|
@update:model-value="update('clearAfterCopy', $event)"
|
|
92
92
|
/>
|
|
93
93
|
</div>
|
|
@@ -125,7 +125,28 @@ function toggleTheme() {
|
|
|
125
125
|
{{ isMac ? "\u2325 Option" : "Alt" }}
|
|
126
126
|
</option>
|
|
127
127
|
<option value="Shift">
|
|
128
|
-
Shift
|
|
128
|
+
⇧ Shift
|
|
129
|
+
</option>
|
|
130
|
+
</select>
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<div class="__va-settings-row">
|
|
134
|
+
<span class="__va-settings-label">Peek inspect (hold key)</span>
|
|
135
|
+
<select :value="settings.peekKey" @change="onSelectChange('peekKey', $event)">
|
|
136
|
+
<option value="none">
|
|
137
|
+
Off
|
|
138
|
+
</option>
|
|
139
|
+
<option value="Meta">
|
|
140
|
+
{{ isMac ? "\u2318 Cmd" : "Ctrl" }}
|
|
141
|
+
</option>
|
|
142
|
+
<option value="Alt">
|
|
143
|
+
{{ isMac ? "\u2325 Option" : "Alt" }}
|
|
144
|
+
</option>
|
|
145
|
+
<option value="Shift">
|
|
146
|
+
⇧ Shift
|
|
147
|
+
</option>
|
|
148
|
+
<option value="Control">
|
|
149
|
+
{{ isMac ? "\u2303 Control" : "Ctrl" }}
|
|
129
150
|
</option>
|
|
130
151
|
</select>
|
|
131
152
|
</div>
|
|
@@ -27,7 +27,8 @@ export function formatAnnotations(annotations, detail, pageUrl) {
|
|
|
27
27
|
} else {
|
|
28
28
|
lines.push(`### ${num}. \`${ann.element}\` \u2014 ${ann.elementPath}`);
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
if (ann.comment)
|
|
31
|
+
lines.push(`- **Comment:** ${ann.comment}`);
|
|
31
32
|
if (ann.selectedText) {
|
|
32
33
|
lines.push(`- **In element:** \`${ann.element}\` \u2014 ${ann.elementPath}`);
|
|
33
34
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Ref } from 'vue-demi';
|
|
2
|
+
export interface UsePeekModeOptions {
|
|
3
|
+
peekKey: () => string;
|
|
4
|
+
enabled: () => boolean;
|
|
5
|
+
isInputOpen: () => boolean;
|
|
6
|
+
onActivate: () => void;
|
|
7
|
+
onDeactivate: () => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function usePeekMode(options: UsePeekModeOptions): {
|
|
10
|
+
isCharging: Ref<boolean>;
|
|
11
|
+
isActive: Ref<boolean>;
|
|
12
|
+
deactivate: () => void;
|
|
13
|
+
scheduleExit: () => void;
|
|
14
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { onBeforeUnmount, onMounted, ref } from "vue-demi";
|
|
2
|
+
import { PEEK_HOLD_DURATION_MS } from "../constants.mjs";
|
|
3
|
+
export function usePeekMode(options) {
|
|
4
|
+
const isCharging = ref(false);
|
|
5
|
+
const isActive = ref(false);
|
|
6
|
+
let holdTimer = null;
|
|
7
|
+
let exitTimer = null;
|
|
8
|
+
let listenerAttached = false;
|
|
9
|
+
function clearHoldTimer() {
|
|
10
|
+
if (holdTimer) {
|
|
11
|
+
clearTimeout(holdTimer);
|
|
12
|
+
holdTimer = null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function clearExitTimer() {
|
|
16
|
+
if (exitTimer) {
|
|
17
|
+
clearTimeout(exitTimer);
|
|
18
|
+
exitTimer = null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function clearTimers() {
|
|
22
|
+
clearHoldTimer();
|
|
23
|
+
clearExitTimer();
|
|
24
|
+
}
|
|
25
|
+
function resetAll() {
|
|
26
|
+
clearTimers();
|
|
27
|
+
const wasActive = isActive.value;
|
|
28
|
+
isCharging.value = false;
|
|
29
|
+
isActive.value = false;
|
|
30
|
+
if (wasActive)
|
|
31
|
+
options.onDeactivate();
|
|
32
|
+
}
|
|
33
|
+
function deactivate() {
|
|
34
|
+
clearExitTimer();
|
|
35
|
+
isActive.value = false;
|
|
36
|
+
options.onDeactivate();
|
|
37
|
+
}
|
|
38
|
+
function scheduleExit() {
|
|
39
|
+
clearExitTimer();
|
|
40
|
+
exitTimer = setTimeout(() => {
|
|
41
|
+
exitTimer = null;
|
|
42
|
+
deactivate();
|
|
43
|
+
}, PEEK_HOLD_DURATION_MS);
|
|
44
|
+
}
|
|
45
|
+
function matchesKey(e) {
|
|
46
|
+
const key = options.peekKey();
|
|
47
|
+
if (key === "none")
|
|
48
|
+
return false;
|
|
49
|
+
return e.key === key;
|
|
50
|
+
}
|
|
51
|
+
function onKeyDown(e) {
|
|
52
|
+
if (e.repeat)
|
|
53
|
+
return;
|
|
54
|
+
if (isCharging.value && !matchesKey(e)) {
|
|
55
|
+
clearHoldTimer();
|
|
56
|
+
isCharging.value = false;
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (!matchesKey(e))
|
|
60
|
+
return;
|
|
61
|
+
if (isActive.value && exitTimer) {
|
|
62
|
+
clearExitTimer();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (!options.enabled())
|
|
66
|
+
return;
|
|
67
|
+
if (isCharging.value || isActive.value)
|
|
68
|
+
return;
|
|
69
|
+
isCharging.value = true;
|
|
70
|
+
holdTimer = setTimeout(() => {
|
|
71
|
+
holdTimer = null;
|
|
72
|
+
isCharging.value = false;
|
|
73
|
+
isActive.value = true;
|
|
74
|
+
options.onActivate();
|
|
75
|
+
}, PEEK_HOLD_DURATION_MS);
|
|
76
|
+
}
|
|
77
|
+
function onKeyUp(e) {
|
|
78
|
+
if (!matchesKey(e))
|
|
79
|
+
return;
|
|
80
|
+
clearHoldTimer();
|
|
81
|
+
isCharging.value = false;
|
|
82
|
+
if (isActive.value) {
|
|
83
|
+
if (options.isInputOpen()) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
deactivate();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function onBlurOrVisibility() {
|
|
90
|
+
resetAll();
|
|
91
|
+
}
|
|
92
|
+
function attach() {
|
|
93
|
+
if (listenerAttached)
|
|
94
|
+
return;
|
|
95
|
+
listenerAttached = true;
|
|
96
|
+
window.addEventListener("keydown", onKeyDown, true);
|
|
97
|
+
window.addEventListener("keyup", onKeyUp, true);
|
|
98
|
+
window.addEventListener("blur", onBlurOrVisibility);
|
|
99
|
+
document.addEventListener("visibilitychange", onBlurOrVisibility);
|
|
100
|
+
}
|
|
101
|
+
function detach() {
|
|
102
|
+
if (!listenerAttached)
|
|
103
|
+
return;
|
|
104
|
+
listenerAttached = false;
|
|
105
|
+
window.removeEventListener("keydown", onKeyDown, true);
|
|
106
|
+
window.removeEventListener("keyup", onKeyUp, true);
|
|
107
|
+
window.removeEventListener("blur", onBlurOrVisibility);
|
|
108
|
+
document.removeEventListener("visibilitychange", onBlurOrVisibility);
|
|
109
|
+
resetAll();
|
|
110
|
+
}
|
|
111
|
+
onMounted(attach);
|
|
112
|
+
onBeforeUnmount(detach);
|
|
113
|
+
return {
|
|
114
|
+
isCharging,
|
|
115
|
+
isActive,
|
|
116
|
+
deactivate,
|
|
117
|
+
scheduleExit
|
|
118
|
+
};
|
|
119
|
+
}
|
|
@@ -12,6 +12,7 @@ export declare function useSettings(): {
|
|
|
12
12
|
showComponentTree: boolean;
|
|
13
13
|
theme: "light" | "dark" | "auto";
|
|
14
14
|
activationKey: "none" | "Meta" | "Alt" | "Shift";
|
|
15
|
+
peekKey: "none" | "Meta" | "Alt" | "Shift" | "Control";
|
|
15
16
|
};
|
|
16
17
|
resetSettings: () => void;
|
|
17
18
|
};
|
package/dist/constants.d.ts
CHANGED
package/dist/constants.mjs
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { version } from "../package.json";
|
|
1
2
|
export const VA_DATA_ATTR = "data-agentation-vue";
|
|
2
3
|
export const VA_DATA_ATTR_SELECTOR = "[data-agentation-vue]";
|
|
3
|
-
export const VA_VERSION =
|
|
4
|
+
export const VA_VERSION = version;
|
|
5
|
+
export const PEEK_HOLD_DURATION_MS = 1e3;
|
|
@@ -43,6 +43,12 @@ function isHostDisabled(el) {
|
|
|
43
43
|
return Boolean(el.disabled);
|
|
44
44
|
return false;
|
|
45
45
|
}
|
|
46
|
+
function getTooltipContainer(el) {
|
|
47
|
+
const root = el.getRootNode();
|
|
48
|
+
if (root instanceof ShadowRoot)
|
|
49
|
+
return root;
|
|
50
|
+
return document.body;
|
|
51
|
+
}
|
|
46
52
|
function createTooltipElement(value) {
|
|
47
53
|
const tooltipEl = document.createElement("div");
|
|
48
54
|
tooltipEl.className = "__va-tooltip";
|
|
@@ -125,8 +131,9 @@ function showTooltipNow(el) {
|
|
|
125
131
|
state.tooltipEl = createTooltipElement(state.value);
|
|
126
132
|
else
|
|
127
133
|
updateTooltipContent(state.tooltipEl, state.value);
|
|
128
|
-
|
|
129
|
-
|
|
134
|
+
const container = getTooltipContainer(el);
|
|
135
|
+
if (state.tooltipEl.parentNode !== container)
|
|
136
|
+
container.appendChild(state.tooltipEl);
|
|
130
137
|
positionTooltip(el);
|
|
131
138
|
state.tooltipEl.classList.add("__va-tooltip--visible");
|
|
132
139
|
attachWindowListeners(el);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
[data-agentation-vue]{--va-bg:#fff;--va-bg-secondary:#f5f5f5;--va-text:#1a1a1a;--va-text-secondary:#666;--va-border:#e5e5e5}[data-agentation-vue]:not([data-agentation-vue] [data-agentation-vue]){--va-accent:#42b883;--va-accent-rgb:66,184,131}@media (prefers-color-scheme:dark){[data-agentation-vue]:not([data-va-theme=light]){--va-bg:#1a1a1a;--va-bg-secondary:#2a2a2a;--va-text:#f5f5f5;--va-text-secondary:#999;--va-border:#333}}[data-agentation-vue][data-va-theme=dark],[data-agentation-vue][data-va-theme=dark] [data-agentation-vue]{--va-bg:#1a1a1a;--va-bg-secondary:#2a2a2a;--va-text:#f5f5f5;--va-text-secondary:#999;--va-border:#333}[data-agentation-vue][data-va-theme=light],[data-agentation-vue][data-va-theme=light] [data-agentation-vue]{--va-bg:#fff;--va-bg-secondary:#f5f5f5;--va-text:#1a1a1a;--va-text-secondary:#666;--va-border:#e5e5e5}:where([data-agentation-vue],[data-agentation-vue] *){border:none;box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;line-height:1.5;list-style:none;margin:0;padding:0;text-decoration:none}.__va-intercept{background:transparent;cursor:crosshair;inset:0;position:fixed;z-index:2147483646}.__va-intercept--input-open{pointer-events:none}.__va-toolbar{position:fixed;--va-toolbar-base-transform:translate(0);--va-toolbar-auto-hide-transform:translate(0);--va-toolbar-size:42px;--va-toolbar-edge-offset:20px;--va-toolbar-auto-hide-peek:8px;--va-toolbar-auto-hide-corner-peek:16px;--va-toolbar-auto-hide-shift:calc(var(--va-toolbar-edge-offset) + var(--va-toolbar-size) - var(--va-toolbar-auto-hide-peek));--va-toolbar-auto-hide-corner-shift:calc(var(--va-toolbar-edge-offset) + var(--va-toolbar-size) - var(--va-toolbar-auto-hide-corner-peek));display:block;max-width:42px;min-height:42px;z-index:2147483647;--va-toolbar-resize-delay:0ms;background:var(--va-bg);border:1px solid var(--va-border);border-radius:999px;box-shadow:0 4px 12px rgba(0,0,0,.15);padding:0;transform:var(--va-toolbar-base-transform) var(--va-toolbar-auto-hide-transform);transition:border-radius .12s cubic-bezier(.32,.72,0,1),padding .12s cubic-bezier(.32,.72,0,1),max-width .24s cubic-bezier(.22,1,.36,1) var(--va-toolbar-resize-delay),transform .15s ease,opacity .15s ease,box-shadow .15s ease;-webkit-user-select:none;-moz-user-select:none;user-select:none}.__va-toolbar--place-bottom-right{bottom:20px;right:20px}.__va-toolbar--place-bottom-center{bottom:20px;left:50%;--va-toolbar-base-transform:translateX(-50%)}.__va-toolbar--place-bottom-left{bottom:20px;left:20px}.__va-toolbar--place-top-right{right:20px;top:20px}.__va-toolbar--place-top-center{left:50%;top:20px;--va-toolbar-base-transform:translateX(-50%)}.__va-toolbar--place-top-left{left:20px;top:20px}.__va-toolbar--auto-hide.__va-toolbar--collapsed:not(.__va-toolbar--auto-hide-revealed).__va-toolbar--place-top-left{--va-toolbar-auto-hide-transform:translate(calc(var(--va-toolbar-auto-hide-corner-shift)*-1),calc(var(--va-toolbar-auto-hide-corner-shift)*-1))}.__va-toolbar--auto-hide.__va-toolbar--collapsed:not(.__va-toolbar--auto-hide-revealed).__va-toolbar--place-top-center{--va-toolbar-auto-hide-transform:translateY(calc(var(--va-toolbar-auto-hide-shift)*-1))}.__va-toolbar--auto-hide.__va-toolbar--collapsed:not(.__va-toolbar--auto-hide-revealed).__va-toolbar--place-top-right{--va-toolbar-auto-hide-transform:translate(var(--va-toolbar-auto-hide-corner-shift),calc(var(--va-toolbar-auto-hide-corner-shift)*-1))}.__va-toolbar--auto-hide.__va-toolbar--collapsed:not(.__va-toolbar--auto-hide-revealed).__va-toolbar--place-bottom-left{--va-toolbar-auto-hide-transform:translate(calc(var(--va-toolbar-auto-hide-corner-shift)*-1),var(--va-toolbar-auto-hide-corner-shift))}.__va-toolbar--auto-hide.__va-toolbar--collapsed:not(.__va-toolbar--auto-hide-revealed).__va-toolbar--place-bottom-center{--va-toolbar-auto-hide-transform:translateY(var(--va-toolbar-auto-hide-shift))}.__va-toolbar--auto-hide.__va-toolbar--collapsed:not(.__va-toolbar--auto-hide-revealed).__va-toolbar--place-bottom-right{--va-toolbar-auto-hide-transform:translate(var(--va-toolbar-auto-hide-corner-shift),var(--va-toolbar-auto-hide-corner-shift))}.__va-toolbar--collapsed{cursor:pointer;max-width:42px;min-height:42px}.__va-toolbar--expanded{--va-toolbar-resize-delay:110ms;border-radius:10px;max-width:520px;padding:4px}.__va-toolbar--collapsed:not(.__va-toolbar--auto-hide):hover{box-shadow:0 6px 16px rgba(0,0,0,.2)}.__va-toolbar--dragging{bottom:auto;left:0;right:auto;top:0;transform:none;transition:none}.__va-toolbar--dragging.__va-toolbar--collapsed:hover{transform:none}.__va-toolbar-stage{align-items:center;display:flex;gap:4px}.__va-toolbar-stage--toggle{inset:0;justify-content:center;opacity:1;pointer-events:auto;position:absolute;transform:scale(1);transition:opacity .11s ease,transform .18s cubic-bezier(.22,1,.36,1),visibility 0s linear 0s;visibility:visible}.__va-toolbar-stage--menu{--va-toolbar-menu-enter-x:8px;filter:blur(4px);opacity:0;overflow:hidden;pointer-events:none;transform:translateX(var(--va-toolbar-menu-enter-x));transition:opacity .14s ease 0s,transform .22s cubic-bezier(.22,1,.36,1) 0s,visibility 0s linear .14s,filter 80ms ease 0s;visibility:hidden}.__va-toolbar--expanded .__va-toolbar-stage--toggle{opacity:0;pointer-events:none;transform:scale(.94);transition:opacity 90ms ease,transform .12s ease,visibility 0s linear 90ms;visibility:hidden}.__va-toolbar--expanded .__va-toolbar-stage--menu{filter:blur(0);opacity:1;pointer-events:auto;transform:translateX(0);transition:opacity .15s ease .15s,transform .24s cubic-bezier(.22,1,.36,1) .12s,visibility 0s linear 0s,filter .15s ease .2s;visibility:visible}.__va-toolbar--place-bottom-right .__va-toolbar-stage--menu,.__va-toolbar--place-top-right .__va-toolbar-stage--menu{--va-toolbar-menu-enter-x:-8px}.__va-toolbar--place-bottom-center .__va-toolbar-stage--menu,.__va-toolbar--place-top-center .__va-toolbar-stage--menu{--va-toolbar-menu-enter-x:0px}.__va-snap-zones{inset:0;pointer-events:none;position:fixed;z-index:2147483646}.__va-snap-zone{background:rgba(var(--va-accent-rgb),.035);border:1.5px dashed rgba(var(--va-accent-rgb),.18);border-radius:999px;box-shadow:0 0 0 1px rgba(var(--va-accent-rgb),.04);height:42px;position:fixed;transform:translate(-50%,-50%);transition:all .12s ease;width:42px}.__va-snap-zone--active{background:rgba(var(--va-accent-rgb),.09);border-color:rgba(var(--va-accent-rgb),.4)}.__va-snap-zone--rect{border-radius:8px;transform:none}.__va-snap-zone--rect.__va-snap-zone--active{transform:none}.__va-icon-btn{align-items:center;background:transparent;border:none;border-radius:6px;color:var(--va-text-secondary);cursor:pointer;display:flex;flex-shrink:0;height:32px;justify-content:center;outline:none;padding:0;transition:background .15s ease,color .15s ease;width:32px}.__va-icon-btn:hover{background:var(--va-bg-secondary);color:var(--va-text)}.__va-icon-btn--active{background:rgba(var(--va-accent-rgb),.15);color:var(--va-accent)}.__va-icon-btn--active:hover{background:rgba(var(--va-accent-rgb),.25)}.__va-icon-btn:disabled{cursor:not-allowed;opacity:.3}.__va-icon-btn:disabled:hover{background:transparent}.__va-icon-btn svg{height:18px;width:18px}.__va-toolbar-toggle{align-items:center;background:transparent;border:none;color:var(--va-accent);cursor:pointer;display:flex;height:100%;justify-content:center;line-height:0;outline:none;padding:0;position:relative;width:100%}.__va-toolbar-toggle svg{flex-shrink:0;height:22px;width:22px}.__va-toolbar-sep{background:var(--va-border);flex-shrink:0;height:20px;width:1px}.__va-drag-handle{align-items:center;background:transparent;border:none;border-radius:6px;color:var(--va-text-secondary);cursor:grab;display:flex;flex-shrink:0;height:32px;justify-content:center;outline:none;padding:0;transition:all .15s ease;width:24px}.__va-drag-handle:hover{background:var(--va-bg-secondary);color:var(--va-text)}.__va-drag-handle:active{cursor:grabbing}.__va-drag-handle-dots{display:grid;gap:2.5px;grid-template-columns:repeat(2,3px);grid-template-rows:repeat(3,3px)}.__va-drag-handle-dots span{background:currentColor;border-radius:50%;height:3px;opacity:.6;width:3px}.__va-toolbar-badge{align-items:center;background:var(--va-accent);border-radius:9px;color:#fff;display:flex;font-size:11px;font-weight:600;height:18px;justify-content:center;min-width:18px;padding:0 4px;position:absolute;right:-6px;top:-6px}.__va-tooltip{align-items:center;background:#131518;border:1px solid hsla(0,0%,100%,.08);border-radius:10px;box-shadow:0 10px 24px rgba(0,0,0,.32),0 2px 6px rgba(0,0,0,.28);color:#dce1e7;display:inline-flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:11px;font-weight:500;gap:6px;left:0;line-height:1.15;max-width:min(360px,calc(100vw - 16px));opacity:0;padding:6px 9px;pointer-events:none;position:fixed;top:0;transform:translateY(4px) scale(.98);transform-origin:center bottom;transition:opacity .12s ease,transform .12s ease;white-space:nowrap;z-index:2147483647}.__va-tooltip[data-placement=bottom]{transform:translateY(-4px) scale(.98);transform-origin:center top}.__va-tooltip.__va-tooltip--visible{opacity:1}.__va-tooltip.__va-tooltip--visible[data-placement=bottom],.__va-tooltip.__va-tooltip--visible[data-placement=top]{transform:translateY(0) scale(1)}.__va-tooltip-label{overflow:hidden;text-overflow:ellipsis}.__va-tooltip-shortcut{align-items:center;background:hsla(0,0%,100%,.1);border:1px solid hsla(0,0%,100%,.18);border-radius:6px;color:#b5bec8;display:inline-flex;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:11px;font-weight:600;letter-spacing:.03em;line-height:1;min-height:18px;padding:2px 6px}.__va-tooltip-arrow{background:#131518;border:1px solid hsla(0,0%,100%,.08);border-left:none;border-top:none;height:10px;left:50%;position:absolute;transform:translateX(-50%) rotate(45deg);width:10px}.__va-tooltip[data-placement=top] .__va-tooltip-arrow{bottom:-5px}.__va-tooltip[data-placement=bottom] .__va-tooltip-arrow{top:-5px;transform:translateX(-50%) rotate(225deg)}.__va-highlight{background:rgba(var(--va-accent-rgb),.08);border:2px solid var(--va-accent);border-radius:4px;pointer-events:none;position:fixed;transition:all 80ms ease;z-index:2147483645}.__va-highlight-label{background:var(--va-accent);border-radius:4px;color:#fff;font-size:11px;font-weight:500;left:0;max-width:300px;overflow:hidden;padding:2px 8px;position:absolute;text-overflow:ellipsis;top:-28px;white-space:nowrap}.__va-highlight-label--chain{background:#1a1a1a;max-width:500px;overflow:visible;padding:4px 10px}.__va-marker{align-items:center;background:var(--va-accent);border-radius:50%;box-shadow:0 2px 6px rgba(0,0,0,.3);color:#fff;cursor:pointer;display:flex;font-size:12px;font-weight:700;height:24px;justify-content:center;position:absolute;transform:translate(-50%,-50%);transition:all .15s ease;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:24px;z-index:2147483647}.__va-marker:hover{box-shadow:0 3px 10px rgba(0,0,0,.4);transform:translate(-50%,-50%) scale(1.2)}.__va-marker--fixed{position:fixed}.__va-marker--stale{opacity:.5}.__va-marker-plus{height:14px;stroke-width:3;width:14px}.__va-marker-pencil{display:none;height:12px;width:12px}.__va-marker:not(.__va-marker--pending):hover .__va-marker-number{display:none}.__va-marker:not(.__va-marker--pending):hover .__va-marker-pencil{display:block}.__va-marker--pending{animation:__va-pulse 1.5s ease-in-out infinite}.__va-marker--selection{border-radius:6px;height:26px;width:26px}@keyframes __va-pulse{0%,to{box-shadow:0 2px 6px rgba(0,0,0,.3)}50%{box-shadow:0 2px 12px rgba(var(--va-accent-rgb),.5)}}.__va-input{background:var(--va-bg);border:1px solid var(--va-border);border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,.15);max-width:360px;min-width:280px;padding:12px;position:fixed;z-index:2147483647}.__va-input-label{color:var(--va-text-secondary);display:block;font-size:12px;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.__va-input-chain{margin-bottom:8px}.__va-input-styles{margin-bottom:10px}.__va-input-styles-summary{align-items:center;color:var(--va-text-secondary);cursor:pointer;display:flex;font-size:12px;gap:6px;min-width:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.__va-input-styles-summary::-webkit-details-marker{display:none}.__va-input-styles-summary:before{content:"▸";flex-shrink:0;font-size:11px;transition:transform .16s ease}.__va-input-styles[open] .__va-input-styles-summary:before{transform:rotate(90deg)}.__va-input-styles-block{background:var(--va-bg-secondary);border:1px solid var(--va-border);border-radius:6px;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,monospace;font-size:11px;line-height:1.55;margin-top:8px;padding:8px 10px}.__va-input-styles-element{color:var(--va-text-secondary);display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.__va-input-style-line{color:var(--va-text);word-break:break-word}.__va-input-style-prop{color:#a855f7}.__va-input-style-value{color:var(--va-text)}.__va-comp-chain{align-items:center;display:inline-flex;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,monospace;font-size:11px;gap:6px}.__va-comp,.__va-comp-chain{white-space:nowrap}.__va-comp-bracket{opacity:.4}.__va-comp-chain--dark{color:#fff}.__va-comp-chain--light{color:var(--va-accent)}.__va-comp-ellipsis{font-size:11px;letter-spacing:1px;opacity:.5}.__va-comp-chain--collapsible{cursor:pointer;flex-wrap:wrap}.__va-comp-toggle{flex-shrink:0;font-size:10px;opacity:.6;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:10px}.__va-input-editable{background:var(--va-bg);border:1px solid var(--va-border);border-radius:6px;color:var(--va-text);font-family:inherit;font-size:13px;line-height:1.4;min-height:1.4em;outline:none;overflow:hidden;padding:8px 10px;transition:border-color .15s ease;white-space:pre-wrap;width:100%;word-break:break-word}.__va-input-editable:focus{border-color:var(--va-accent)}.__va-input-editable:empty:before{color:var(--va-text-secondary);content:attr(data-placeholder);pointer-events:none}.__va-mention{background:rgba(var(--va-accent-rgb),.15);border-radius:4px;color:var(--va-accent);cursor:default;display:inline;font-size:12px;font-weight:600;padding:1px 6px;-webkit-user-select:all;-moz-user-select:all;user-select:all;white-space:nowrap}.__va-mention--deleted{opacity:.45;text-decoration:line-through}.__va-mention-dropdown{background:var(--va-bg);border:1px solid var(--va-border);border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.15);max-height:200px;max-width:280px;min-width:180px;overflow-y:auto;padding:4px;position:absolute;z-index:1}.__va-mention-option{align-items:center;border-radius:4px;color:var(--va-text);cursor:pointer;display:flex;font-size:12px;gap:8px;padding:6px 8px}.__va-mention-option--active,.__va-mention-option:hover{background:var(--va-bg-secondary)}.__va-mention-option-number{align-items:center;background:var(--va-accent);border-radius:50%;color:#fff;display:inline-flex;flex-shrink:0;font-size:11px;font-weight:700;height:20px;justify-content:center;width:20px}.__va-mention-option-preview{color:var(--va-text-secondary);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.__va-input-actions{align-items:center;display:flex;gap:8px;justify-content:space-between;margin-top:8px}.__va-input-actions-right{display:flex;gap:8px;margin-left:auto}.__va-input-delete-btn{align-items:center;background:transparent;border:none;border-radius:6px;color:var(--va-text-secondary);cursor:pointer;display:flex;height:32px;justify-content:center;outline:none;padding:0;transition:all .15s ease;width:32px}.__va-input-delete-btn svg{height:16px;width:16px}.__va-input-delete-btn:hover{background:var(--va-bg-secondary);color:#ef4444}.__va-btn{border:none;border-radius:6px;cursor:pointer;font-size:12px;font-weight:500;outline:none;padding:6px 14px;transition:all .15s ease}.__va-btn--secondary{background:var(--va-bg-secondary);color:var(--va-text-secondary)}.__va-btn--secondary:hover{background:var(--va-border)}.__va-btn--primary{background:var(--va-accent);color:#fff}.__va-btn--primary:hover{opacity:.9}.__va-btn:disabled{cursor:not-allowed;opacity:.4}.__va-settings-popover{position:fixed;z-index:2147483647}.__va-settings{background:var(--va-bg);border:1px solid var(--va-border);border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,.15);max-width:min(340px,calc(100vw - 16px));min-width:260px;padding:16px;position:relative}.__va-settings-top{align-items:center;border-bottom:1px solid var(--va-border);display:flex;justify-content:space-between;margin-bottom:12px;padding-bottom:10px}.__va-settings-title{color:var(--va-text);font-size:13px;font-weight:600}.__va-settings-version{color:var(--va-text-secondary);font-size:11px;font-weight:400}.__va-theme-toggle{align-items:center;background:var(--va-bg-secondary);border:1px solid var(--va-border);border-radius:999px;color:var(--va-text-secondary);cursor:pointer;display:inline-flex;height:28px;justify-content:center;transition:all .15s ease;width:28px}.__va-theme-toggle:hover{border-color:var(--va-text-secondary);color:var(--va-text)}.__va-theme-toggle svg{height:15px;width:15px}.__va-settings-row{align-items:center;display:flex;gap:12px;justify-content:space-between;margin-bottom:10px}.__va-settings-label{color:var(--va-text-secondary);font-size:12px;white-space:nowrap}.__va-settings-row--stack{display:block}.__va-settings-row--stack .__va-settings-label{display:block;margin-bottom:8px}.__va-settings-row:last-child{margin-bottom:0}.__va-settings-divider{background:var(--va-border);height:1px;margin:8px 0 12px}.__va-settings select{background:var(--va-bg);border:1px solid var(--va-border);border-radius:4px;color:var(--va-text);font-size:12px;outline:none;padding:4px 8px}.__va-color-swatches{align-items:center;display:flex;gap:6px}.__va-color-swatch{border:2px solid var(--va-border);border-radius:50%;cursor:pointer;flex-shrink:0;height:22px;outline:none;padding:0;transition:all .15s ease;width:22px}.__va-color-swatch:hover{transform:scale(1.15)}.__va-color-swatch--active{border-color:var(--va-text);transform:scale(1.15)}.__va-toggle{background:var(--va-border);border:none;border-radius:10px;cursor:pointer;flex-shrink:0;height:20px;outline:none;padding:0;position:relative;transition:background .15s ease;width:36px}.__va-toggle--active{background:var(--va-accent)}.__va-toggle:after{background:#fff;border-radius:50%;box-shadow:0 1px 3px rgba(0,0,0,.2);content:"";height:16px;left:2px;position:absolute;top:2px;transition:transform .15s ease;width:16px}.__va-toggle--active:after{transform:translateX(16px)}.__va-selection-rect{background:rgba(var(--va-accent-rgb),.06);border:2px dashed var(--va-accent);border-radius:2px;pointer-events:none;position:fixed;z-index:2147483645}.__va-copy-feedback{animation:__va-fadeIn .15s ease;background:var(--va-accent);border-radius:6px;bottom:72px;box-shadow:0 4px 12px rgba(0,0,0,.15);color:#fff;font-size:13px;font-weight:500;padding:8px 16px;position:fixed;right:20px;z-index:2147483647}@keyframes __va-fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.__va-undo-feedback{align-items:center;animation:__va-fadeIn .15s ease;background:var(--va-bg);border:1px solid var(--va-border);border-radius:6px;bottom:72px;box-shadow:0 4px 12px rgba(0,0,0,.15);color:var(--va-text);display:flex;font-size:13px;font-weight:500;gap:12px;padding:8px 12px 8px 16px;position:fixed;right:20px;z-index:2147483647}.__va-undo-feedback--shifted{bottom:112px}.__va-undo-btn{background:var(--va-accent);border:none;border-radius:4px;color:#fff;cursor:pointer;font-family:inherit;font-size:12px;font-weight:600;outline:none;padding:4px 10px;transition:opacity .15s ease}.__va-undo-btn:hover{opacity:.85}
|
|
1
|
+
[data-agentation-vue]{--va-bg:#fff;--va-bg-secondary:#f5f5f5;--va-text:#1a1a1a;--va-text-secondary:#666;--va-border:#e5e5e5}[data-agentation-vue]:not([data-agentation-vue] [data-agentation-vue]){--va-accent:#42b883;--va-accent-rgb:66,184,131}@media (prefers-color-scheme:dark){[data-agentation-vue]:not([data-va-theme=light]){--va-bg:#1a1a1a;--va-bg-secondary:#2a2a2a;--va-text:#f5f5f5;--va-text-secondary:#999;--va-border:#333}}[data-agentation-vue][data-va-theme=dark],[data-agentation-vue][data-va-theme=dark] [data-agentation-vue]{--va-bg:#1a1a1a;--va-bg-secondary:#2a2a2a;--va-text:#f5f5f5;--va-text-secondary:#999;--va-border:#333}[data-agentation-vue][data-va-theme=light],[data-agentation-vue][data-va-theme=light] [data-agentation-vue]{--va-bg:#fff;--va-bg-secondary:#f5f5f5;--va-text:#1a1a1a;--va-text-secondary:#666;--va-border:#e5e5e5}:where([data-agentation-vue],[data-agentation-vue] *){border:none;box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;line-height:1.5;list-style:none;margin:0;padding:0;text-decoration:none}.__va-intercept{background:transparent;cursor:crosshair;inset:0;position:fixed;z-index:2147483646}.__va-intercept--input-open{pointer-events:none}.__va-toolbar{position:fixed;--va-toolbar-base-transform:translate(0);--va-toolbar-auto-hide-transform:translate(0);--va-toolbar-size:42px;--va-toolbar-edge-offset:20px;--va-toolbar-auto-hide-peek:8px;--va-toolbar-auto-hide-corner-peek:16px;--va-toolbar-auto-hide-shift:calc(var(--va-toolbar-edge-offset) + var(--va-toolbar-size) - var(--va-toolbar-auto-hide-peek));--va-toolbar-auto-hide-corner-shift:calc(var(--va-toolbar-edge-offset) + var(--va-toolbar-size) - var(--va-toolbar-auto-hide-corner-peek));display:block;max-width:42px;min-height:42px;z-index:2147483647;--va-toolbar-resize-delay:0ms;background:var(--va-bg);border:1px solid var(--va-border);border-radius:999px;box-shadow:0 4px 12px rgba(0,0,0,.15);padding:0;transform:var(--va-toolbar-base-transform) var(--va-toolbar-auto-hide-transform);transition:border-radius .12s cubic-bezier(.32,.72,0,1),padding .12s cubic-bezier(.32,.72,0,1),max-width .24s cubic-bezier(.22,1,.36,1) var(--va-toolbar-resize-delay),transform .15s ease,opacity .15s ease,box-shadow .15s ease;-webkit-user-select:none;-moz-user-select:none;user-select:none}.__va-toolbar--place-bottom-right{bottom:20px;right:20px}.__va-toolbar--place-bottom-center{bottom:20px;left:50%;--va-toolbar-base-transform:translateX(-50%)}.__va-toolbar--place-bottom-left{bottom:20px;left:20px}.__va-toolbar--place-top-right{right:20px;top:20px}.__va-toolbar--place-top-center{left:50%;top:20px;--va-toolbar-base-transform:translateX(-50%)}.__va-toolbar--place-top-left{left:20px;top:20px}.__va-toolbar--auto-hide.__va-toolbar--collapsed:not(.__va-toolbar--auto-hide-revealed).__va-toolbar--place-top-left{--va-toolbar-auto-hide-transform:translate(calc(var(--va-toolbar-auto-hide-corner-shift)*-1),calc(var(--va-toolbar-auto-hide-corner-shift)*-1))}.__va-toolbar--auto-hide.__va-toolbar--collapsed:not(.__va-toolbar--auto-hide-revealed).__va-toolbar--place-top-center{--va-toolbar-auto-hide-transform:translateY(calc(var(--va-toolbar-auto-hide-shift)*-1))}.__va-toolbar--auto-hide.__va-toolbar--collapsed:not(.__va-toolbar--auto-hide-revealed).__va-toolbar--place-top-right{--va-toolbar-auto-hide-transform:translate(var(--va-toolbar-auto-hide-corner-shift),calc(var(--va-toolbar-auto-hide-corner-shift)*-1))}.__va-toolbar--auto-hide.__va-toolbar--collapsed:not(.__va-toolbar--auto-hide-revealed).__va-toolbar--place-bottom-left{--va-toolbar-auto-hide-transform:translate(calc(var(--va-toolbar-auto-hide-corner-shift)*-1),var(--va-toolbar-auto-hide-corner-shift))}.__va-toolbar--auto-hide.__va-toolbar--collapsed:not(.__va-toolbar--auto-hide-revealed).__va-toolbar--place-bottom-center{--va-toolbar-auto-hide-transform:translateY(var(--va-toolbar-auto-hide-shift))}.__va-toolbar--auto-hide.__va-toolbar--collapsed:not(.__va-toolbar--auto-hide-revealed).__va-toolbar--place-bottom-right{--va-toolbar-auto-hide-transform:translate(var(--va-toolbar-auto-hide-corner-shift),var(--va-toolbar-auto-hide-corner-shift))}.__va-toolbar--collapsed{cursor:pointer;max-width:42px;min-height:42px}.__va-toolbar--expanded{--va-toolbar-resize-delay:110ms;border-radius:10px;max-width:520px;padding:4px}.__va-toolbar--collapsed:not(.__va-toolbar--auto-hide):hover{box-shadow:0 6px 16px rgba(0,0,0,.2)}.__va-toolbar--dragging{bottom:auto;left:0;right:auto;top:0;transform:none;transition:none}.__va-toolbar--dragging.__va-toolbar--collapsed:hover{transform:none}.__va-toolbar-stage{align-items:center;display:flex;gap:4px}.__va-toolbar-stage--toggle{inset:0;justify-content:center;opacity:1;pointer-events:auto;position:absolute;transform:scale(1);transition:opacity .11s ease,transform .18s cubic-bezier(.22,1,.36,1),visibility 0s linear 0s;visibility:visible}.__va-toolbar-stage--menu{--va-toolbar-menu-enter-x:8px;filter:blur(4px);opacity:0;overflow:hidden;pointer-events:none;transform:translateX(var(--va-toolbar-menu-enter-x));transition:opacity .14s ease 0s,transform .22s cubic-bezier(.22,1,.36,1) 0s,visibility 0s linear .14s,filter 80ms ease 0s;visibility:hidden}.__va-toolbar--expanded .__va-toolbar-stage--toggle{opacity:0;pointer-events:none;transform:scale(.94);transition:opacity 90ms ease,transform .12s ease,visibility 0s linear 90ms;visibility:hidden}.__va-toolbar--expanded .__va-toolbar-stage--menu{filter:blur(0);opacity:1;pointer-events:auto;transform:translateX(0);transition:opacity .15s ease .15s,transform .24s cubic-bezier(.22,1,.36,1) .12s,visibility 0s linear 0s,filter .15s ease .2s;visibility:visible}.__va-toolbar--place-bottom-right .__va-toolbar-stage--menu,.__va-toolbar--place-top-right .__va-toolbar-stage--menu{--va-toolbar-menu-enter-x:-8px}.__va-toolbar--place-bottom-center .__va-toolbar-stage--menu,.__va-toolbar--place-top-center .__va-toolbar-stage--menu{--va-toolbar-menu-enter-x:0px}.__va-snap-zones{inset:0;pointer-events:none;position:fixed;z-index:2147483646}.__va-snap-zone{background:rgba(var(--va-accent-rgb),.035);border:1.5px dashed rgba(var(--va-accent-rgb),.18);border-radius:999px;box-shadow:0 0 0 1px rgba(var(--va-accent-rgb),.04);height:42px;position:fixed;transform:translate(-50%,-50%);transition:all .12s ease;width:42px}.__va-snap-zone--active{background:rgba(var(--va-accent-rgb),.09);border-color:rgba(var(--va-accent-rgb),.4)}.__va-snap-zone--rect{border-radius:8px;transform:none}.__va-snap-zone--rect.__va-snap-zone--active{transform:none}.__va-icon-btn{align-items:center;background:transparent;border:none;border-radius:6px;color:var(--va-text-secondary);cursor:pointer;display:flex;flex-shrink:0;height:32px;justify-content:center;outline:none;padding:0;transition:background .15s ease,color .15s ease;width:32px}.__va-icon-btn:hover{background:var(--va-bg-secondary);color:var(--va-text)}.__va-icon-btn--active{background:rgba(var(--va-accent-rgb),.15);color:var(--va-accent)}.__va-icon-btn--active:hover{background:rgba(var(--va-accent-rgb),.25)}.__va-icon-btn:disabled{cursor:not-allowed;opacity:.3}.__va-icon-btn:disabled:hover{background:transparent}.__va-icon-btn svg{height:18px;width:18px}.__va-toolbar-toggle{align-items:center;background:transparent;border:none;color:var(--va-accent);cursor:pointer;display:flex;height:100%;justify-content:center;line-height:0;outline:none;padding:0;position:relative;width:100%}.__va-toolbar-toggle svg:not(.__va-peek-ring){flex-shrink:0;height:22px;width:22px}.__va-peek-ring{height:calc(100% + 6px);inset:-3px;overflow:visible;pointer-events:none;position:absolute;width:calc(100% + 6px)}.__va-peek-ring circle{animation:va-peek-fill linear forwards;fill:none;stroke:var(--va-accent);stroke-dasharray:131.95;stroke-dashoffset:131.95;stroke-linecap:round;stroke-width:3;transform:rotate(-90deg);transform-origin:center}@keyframes va-peek-fill{to{stroke-dashoffset:0}}.__va-toolbar-sep{background:var(--va-border);flex-shrink:0;height:20px;width:1px}.__va-drag-handle{align-items:center;background:transparent;border:none;border-radius:6px;color:var(--va-text-secondary);cursor:grab;display:flex;flex-shrink:0;height:32px;justify-content:center;outline:none;padding:0;transition:all .15s ease;width:24px}.__va-drag-handle:hover{background:var(--va-bg-secondary);color:var(--va-text)}.__va-drag-handle:active{cursor:grabbing}.__va-drag-handle-dots{display:grid;gap:2.5px;grid-template-columns:repeat(2,3px);grid-template-rows:repeat(3,3px)}.__va-drag-handle-dots span{background:currentColor;border-radius:50%;height:3px;opacity:.6;width:3px}.__va-toolbar-badge{align-items:center;background:var(--va-accent);border-radius:9px;color:#fff;display:flex;font-size:11px;font-weight:600;height:18px;justify-content:center;min-width:18px;padding:0 4px;position:absolute;right:-6px;top:-6px;z-index:1}.__va-tooltip{align-items:center;background:#131518;border:1px solid hsla(0,0%,100%,.08);border-radius:10px;box-shadow:0 10px 24px rgba(0,0,0,.32),0 2px 6px rgba(0,0,0,.28);color:#dce1e7;display:inline-flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:11px;font-weight:500;gap:6px;left:0;line-height:1.15;max-width:min(360px,calc(100vw - 16px));opacity:0;padding:6px 9px;pointer-events:none;position:fixed;top:0;transform:translateY(4px) scale(.98);transform-origin:center bottom;transition:opacity .12s ease,transform .12s ease;white-space:nowrap;z-index:2147483647}.__va-tooltip[data-placement=bottom]{transform:translateY(-4px) scale(.98);transform-origin:center top}.__va-tooltip.__va-tooltip--visible{opacity:1}.__va-tooltip.__va-tooltip--visible[data-placement=bottom],.__va-tooltip.__va-tooltip--visible[data-placement=top]{transform:translateY(0) scale(1)}.__va-tooltip-label{overflow:hidden;text-overflow:ellipsis}.__va-tooltip-shortcut{align-items:center;background:hsla(0,0%,100%,.1);border:1px solid hsla(0,0%,100%,.18);border-radius:6px;color:#b5bec8;display:inline-flex;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:11px;font-weight:600;letter-spacing:.03em;line-height:1;min-height:18px;padding:2px 6px}.__va-tooltip-arrow{background:#131518;border:1px solid hsla(0,0%,100%,.08);border-left:none;border-top:none;height:10px;left:50%;position:absolute;transform:translateX(-50%) rotate(45deg);width:10px}.__va-tooltip[data-placement=top] .__va-tooltip-arrow{bottom:-5px}.__va-tooltip[data-placement=bottom] .__va-tooltip-arrow{top:-5px;transform:translateX(-50%) rotate(225deg)}.__va-highlight{background:rgba(var(--va-accent-rgb),.08);border:2px solid var(--va-accent);border-radius:4px;pointer-events:none;position:fixed;transition:all 80ms ease;z-index:2147483645}.__va-highlight-label{background:var(--va-accent);border-radius:4px;color:#fff;font-size:11px;font-weight:500;left:0;max-width:300px;overflow:hidden;padding:2px 8px;position:absolute;text-overflow:ellipsis;top:-28px;white-space:nowrap}.__va-highlight-label--chain{background:#1a1a1a;max-width:500px;overflow:visible;padding:4px 10px}.__va-marker{align-items:center;background:var(--va-accent);border-radius:50%;box-shadow:0 2px 6px rgba(0,0,0,.3);color:#fff;cursor:pointer;display:flex;font-size:12px;font-weight:700;height:24px;justify-content:center;position:absolute;transform:translate(-50%,-50%) scale(1);transition:transform .25s cubic-bezier(.34,1.56,.64,1),box-shadow .15s ease,opacity .15s ease;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:24px;z-index:2147483647}.__va-marker:hover{box-shadow:0 3px 10px rgba(0,0,0,.4);transform:translate(-50%,-50%) scale(1.2)}.__va-marker--entering,.__va-marker--hidden{pointer-events:none;transform:translate(-50%,-50%) scale(0)!important}.__va-marker--hidden{transition:transform .2s cubic-bezier(.55,0,1,.45),box-shadow .15s ease,opacity .15s ease}.__va-marker--fixed{position:fixed}.__va-marker--stale{opacity:.5}.__va-marker-plus{height:14px;stroke-width:3;width:14px}.__va-marker-pencil{display:none;height:12px;width:12px}.__va-marker:not(.__va-marker--pending):hover .__va-marker-number{display:none}.__va-marker:not(.__va-marker--pending):hover .__va-marker-pencil{display:block}.__va-marker--pending{animation:__va-pulse 1.5s ease-in-out infinite}.__va-marker--selection{border-radius:6px;height:26px;width:26px}@keyframes __va-pulse{0%,to{box-shadow:0 2px 6px rgba(0,0,0,.3)}50%{box-shadow:0 2px 12px rgba(var(--va-accent-rgb),.5)}}.__va-input{background:var(--va-bg);border:1px solid var(--va-border);border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,.15);max-width:360px;min-width:280px;padding:12px;position:fixed;z-index:2147483647}.__va-input-label{color:var(--va-text-secondary);display:block;font-size:12px;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.__va-input-chain{margin-bottom:8px}.__va-input-styles{margin-bottom:10px}.__va-input-styles-summary{align-items:center;color:var(--va-text-secondary);cursor:pointer;display:flex;font-size:12px;gap:6px;min-width:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.__va-input-styles-summary::-webkit-details-marker{display:none}.__va-input-styles-summary:before{content:"▸";flex-shrink:0;font-size:11px;transition:transform .16s ease}.__va-input-styles[open] .__va-input-styles-summary:before{transform:rotate(90deg)}.__va-input-styles-block{background:var(--va-bg-secondary);border:1px solid var(--va-border);border-radius:6px;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,monospace;font-size:11px;line-height:1.55;margin-top:8px;padding:8px 10px}.__va-input-styles-element{color:var(--va-text-secondary);display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.__va-input-style-line{color:var(--va-text);word-break:break-word}.__va-input-style-prop{color:#a855f7}.__va-input-style-value{color:var(--va-text)}.__va-comp-chain{align-items:center;display:inline-flex;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,monospace;font-size:11px;gap:6px}.__va-comp,.__va-comp-chain{white-space:nowrap}.__va-comp-bracket{opacity:.4}.__va-comp-chain--dark{color:#fff}.__va-comp-chain--light{color:var(--va-accent)}.__va-comp-ellipsis{font-size:11px;letter-spacing:1px;opacity:.5}.__va-comp-chain--collapsible{cursor:pointer;flex-wrap:wrap}.__va-comp-toggle{flex-shrink:0;font-size:10px;opacity:.6;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:10px}.__va-input-editable{background:var(--va-bg);border:1px solid var(--va-border);border-radius:6px;color:var(--va-text);font-family:inherit;font-size:13px;line-height:1.4;min-height:1.4em;outline:none;overflow:hidden;padding:8px 10px;transition:border-color .15s ease;white-space:pre-wrap;width:100%;word-break:break-word}.__va-input-editable:focus{border-color:var(--va-accent)}.__va-input-editable:empty:before{color:var(--va-text-secondary);content:attr(data-placeholder);pointer-events:none}.__va-mention{background:rgba(var(--va-accent-rgb),.15);border-radius:4px;color:var(--va-accent);cursor:default;display:inline;font-size:12px;font-weight:600;padding:1px 6px;-webkit-user-select:all;-moz-user-select:all;user-select:all;white-space:nowrap}.__va-mention--deleted{opacity:.45;text-decoration:line-through}.__va-mention-dropdown{background:var(--va-bg);border:1px solid var(--va-border);border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.15);max-height:200px;max-width:280px;min-width:180px;overflow-y:auto;padding:4px;position:absolute;z-index:1}.__va-mention-option{align-items:center;border-radius:4px;color:var(--va-text);cursor:pointer;display:flex;font-size:12px;gap:8px;padding:6px 8px}.__va-mention-option--active,.__va-mention-option:hover{background:var(--va-bg-secondary)}.__va-mention-option-number{align-items:center;background:var(--va-accent);border-radius:50%;color:#fff;display:inline-flex;flex-shrink:0;font-size:11px;font-weight:700;height:20px;justify-content:center;width:20px}.__va-mention-option-preview{color:var(--va-text-secondary);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.__va-input-actions{align-items:center;display:flex;gap:8px;justify-content:space-between;margin-top:8px}.__va-input-actions-right{display:flex;gap:8px;margin-left:auto}.__va-input-delete-btn{align-items:center;background:transparent;border:none;border-radius:6px;color:var(--va-text-secondary);cursor:pointer;display:flex;height:32px;justify-content:center;outline:none;padding:0;transition:all .15s ease;width:32px}.__va-input-delete-btn svg{height:16px;width:16px}.__va-input-delete-btn:hover{background:var(--va-bg-secondary);color:#ef4444}.__va-btn{border:none;border-radius:6px;cursor:pointer;font-size:12px;font-weight:500;outline:none;padding:6px 14px;transition:all .15s ease}.__va-btn--secondary{background:var(--va-bg-secondary);color:var(--va-text-secondary)}.__va-btn--secondary:hover{background:var(--va-border)}.__va-btn--primary{background:var(--va-accent);color:#fff}.__va-btn--primary:hover{opacity:.9}.__va-btn:disabled{cursor:not-allowed;opacity:.4}.__va-settings-popover{position:fixed;z-index:2147483647}.__va-settings{background:var(--va-bg);border:1px solid var(--va-border);border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,.15);max-width:min(340px,calc(100vw - 16px));min-width:260px;padding:16px;position:relative}.__va-settings-top{align-items:center;border-bottom:1px solid var(--va-border);display:flex;justify-content:space-between;margin-bottom:12px;padding-bottom:10px}.__va-settings-title{color:var(--va-text);font-size:13px;font-weight:600}.__va-settings-version{color:var(--va-text-secondary);font-size:11px;font-weight:400}.__va-theme-toggle{align-items:center;background:var(--va-bg-secondary);border:1px solid var(--va-border);border-radius:999px;color:var(--va-text-secondary);cursor:pointer;display:inline-flex;height:28px;justify-content:center;transition:all .15s ease;width:28px}.__va-theme-toggle:hover{border-color:var(--va-text-secondary);color:var(--va-text)}.__va-theme-toggle svg{height:15px;width:15px}.__va-settings-row{align-items:center;display:flex;gap:12px;justify-content:space-between;margin-bottom:10px}.__va-settings-label{color:var(--va-text-secondary);font-size:12px;white-space:nowrap}.__va-settings-row--stack{display:block}.__va-settings-row--stack .__va-settings-label{display:block;margin-bottom:8px}.__va-settings-row:last-child{margin-bottom:0}.__va-settings-divider{background:var(--va-border);height:1px;margin:8px 0 12px}.__va-settings select{background:var(--va-bg);border:1px solid var(--va-border);border-radius:4px;color:var(--va-text);font-size:12px;outline:none;padding:4px 8px}.__va-color-swatches{align-items:center;display:flex;gap:6px}.__va-color-swatch{border:2px solid var(--va-border);border-radius:50%;cursor:pointer;flex-shrink:0;height:22px;outline:none;padding:0;transition:all .15s ease;width:22px}.__va-color-swatch:hover{transform:scale(1.15)}.__va-color-swatch--active{border-color:var(--va-text);transform:scale(1.15)}.__va-toggle{background:var(--va-border);border:none;border-radius:10px;cursor:pointer;flex-shrink:0;height:20px;outline:none;padding:0;position:relative;transition:background .15s ease;width:36px}.__va-toggle--active{background:var(--va-accent)}.__va-toggle:after{background:#fff;border-radius:50%;box-shadow:0 1px 3px rgba(0,0,0,.2);content:"";height:16px;left:2px;position:absolute;top:2px;transition:transform .15s ease;width:16px}.__va-toggle--active:after{transform:translateX(16px)}.__va-selection-rect{background:rgba(var(--va-accent-rgb),.06);border:2px dashed var(--va-accent);border-radius:2px;pointer-events:none;position:fixed;z-index:2147483645}.__va-copy-feedback{animation:__va-fadeIn .15s ease;background:var(--va-accent);border-radius:6px;bottom:72px;box-shadow:0 4px 12px rgba(0,0,0,.15);color:#fff;font-size:13px;font-weight:500;padding:8px 16px;position:fixed;right:20px;z-index:2147483647}@keyframes __va-fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.__va-undo-feedback{align-items:center;animation:__va-fadeIn .15s ease;background:var(--va-bg);border:1px solid var(--va-border);border-radius:6px;bottom:72px;box-shadow:0 4px 12px rgba(0,0,0,.15);color:var(--va-text);display:flex;font-size:13px;font-weight:500;gap:12px;padding:8px 12px 8px 16px;position:fixed;right:20px;z-index:2147483647}.__va-undo-feedback--shifted{bottom:112px}.__va-undo-btn{background:var(--va-accent);border:none;border-radius:4px;color:#fff;cursor:pointer;font-family:inherit;font-size:12px;font-weight:600;outline:none;padding:4px 10px;transition:opacity .15s ease}.__va-undo-btn:hover{opacity:.85}
|
package/dist/types.d.ts
CHANGED
|
@@ -68,6 +68,7 @@ export interface Settings {
|
|
|
68
68
|
showComponentTree: boolean;
|
|
69
69
|
theme: 'light' | 'dark' | 'auto';
|
|
70
70
|
activationKey: 'none' | 'Meta' | 'Alt' | 'Shift';
|
|
71
|
+
peekKey: 'none' | 'Meta' | 'Alt' | 'Shift' | 'Control';
|
|
71
72
|
}
|
|
72
73
|
export interface StorageAdapter {
|
|
73
74
|
getItem: (key: string) => string | null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentation-vue",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.13",
|
|
4
4
|
"description": "Visual feedback tool for AI coding agents — Vue 2.7 & 3",
|
|
5
5
|
"author": "Dorian Becker",
|
|
6
6
|
"license": "PolyForm-Shield-1.0.0",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
],
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "unbuild",
|
|
39
|
-
"prepack": "pnpm run build",
|
|
39
|
+
"prepack": "pnpm run build && cp ../../README.md .",
|
|
40
40
|
"dev": "unbuild --stub",
|
|
41
41
|
"typecheck": "vue-tsc --noEmit"
|
|
42
42
|
},
|