agentation-vue 0.2.10 → 0.2.12

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 ADDED
@@ -0,0 +1,94 @@
1
+ # agentation-vue
2
+
3
+ [![npm version](https://img.shields.io/npm/v/agentation-vue)](https://www.npmjs.com/package/agentation-vue)
4
+ [![npm downloads](https://img.shields.io/npm/dm/agentation-vue)](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
@@ -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
- transition("inspect");
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
- transition("inspect");
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
- transition("inspect");
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
- transition("inspect");
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
- const text = getComment().trim();
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 :disabled="!commentText.trim()" @click="onAdd">
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 on copy/send</span>
87
+ <span class="__va-settings-label">Clear After Copy</span>
88
88
  <VaToggle
89
89
  :model-value="settings.clearAfterCopy"
90
- aria-label="Clear on copy/send"
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
- lines.push(`- **Comment:** ${ann.comment}`);
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
  };
@@ -18,7 +18,8 @@ const defaults = {
18
18
  clearAfterCopy: false,
19
19
  showComponentTree: true,
20
20
  theme: "auto",
21
- activationKey: "Shift"
21
+ activationKey: "Shift",
22
+ peekKey: "none"
22
23
  };
23
24
  function loadSettings() {
24
25
  try {
@@ -1,3 +1,4 @@
1
1
  export declare const VA_DATA_ATTR = "data-agentation-vue";
2
2
  export declare const VA_DATA_ATTR_SELECTOR = "[data-agentation-vue]";
3
- export declare const VA_VERSION = "0.2.10";
3
+ export declare const VA_VERSION: any;
4
+ export declare const PEEK_HOLD_DURATION_MS = 1000;
@@ -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 = "0.2.10";
4
+ export const VA_VERSION = version;
5
+ export const PEEK_HOLD_DURATION_MS = 1e3;
@@ -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.10",
3
+ "version": "0.2.12",
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
  },