@liuovo/agentation-vue-ui 0.0.2
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/LICENSE +27 -0
- package/README.md +32 -0
- package/dist/components/icons.d.ts +63 -0
- package/dist/components/icons.d.ts.map +1 -0
- package/dist/components/icons.js +396 -0
- package/dist/components/icons.js.map +1 -0
- package/dist/composables/useAnnotationsStore.d.ts +30 -0
- package/dist/composables/useAnnotationsStore.d.ts.map +1 -0
- package/dist/composables/useAnnotationsStore.js +234 -0
- package/dist/composables/useAnnotationsStore.js.map +1 -0
- package/dist/composables/useAreaSelection.d.ts +19 -0
- package/dist/composables/useAreaSelection.d.ts.map +1 -0
- package/dist/composables/useAreaSelection.js +58 -0
- package/dist/composables/useAreaSelection.js.map +1 -0
- package/dist/composables/useExport.d.ts +17 -0
- package/dist/composables/useExport.d.ts.map +1 -0
- package/dist/composables/useExport.js +51 -0
- package/dist/composables/useExport.js.map +1 -0
- package/dist/composables/useFreezeState.d.ts +22 -0
- package/dist/composables/useFreezeState.d.ts.map +1 -0
- package/dist/composables/useFreezeState.js +28 -0
- package/dist/composables/useFreezeState.js.map +1 -0
- package/dist/composables/useI18n.d.ts +14 -0
- package/dist/composables/useI18n.d.ts.map +1 -0
- package/dist/composables/useI18n.js +18 -0
- package/dist/composables/useI18n.js.map +1 -0
- package/dist/composables/useKeyboard.d.ts +30 -0
- package/dist/composables/useKeyboard.d.ts.map +1 -0
- package/dist/composables/useKeyboard.js +122 -0
- package/dist/composables/useKeyboard.js.map +1 -0
- package/dist/composables/useOverlay.d.ts +27 -0
- package/dist/composables/useOverlay.d.ts.map +1 -0
- package/dist/composables/useOverlay.js +93 -0
- package/dist/composables/useOverlay.js.map +1 -0
- package/dist/composables/useSelection.d.ts +17 -0
- package/dist/composables/useSelection.d.ts.map +1 -0
- package/dist/composables/useSelection.js +38 -0
- package/dist/composables/useSelection.js.map +1 -0
- package/dist/composables/useSettings.d.ts +75 -0
- package/dist/composables/useSettings.d.ts.map +1 -0
- package/dist/composables/useSettings.js +115 -0
- package/dist/composables/useSettings.js.map +1 -0
- package/dist/composables/useToolbarDrag.d.ts +28 -0
- package/dist/composables/useToolbarDrag.d.ts.map +1 -0
- package/dist/composables/useToolbarDrag.js +253 -0
- package/dist/composables/useToolbarDrag.js.map +1 -0
- package/dist/i18n/en.d.ts +3 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +85 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.d.ts +11 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +23 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/types.d.ts +90 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +2 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/i18n/zh-CN.d.ts +3 -0
- package/dist/i18n/zh-CN.d.ts.map +1 -0
- package/dist/i18n/zh-CN.js +85 -0
- package/dist/i18n/zh-CN.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/injection-keys.d.ts +18 -0
- package/dist/injection-keys.d.ts.map +1 -0
- package/dist/injection-keys.js +9 -0
- package/dist/injection-keys.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.d.ts +83 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +13 -0
- package/dist/utils.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { onMounted, onUnmounted } from "vue";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Keyboard shortcuts composable
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
/**
|
|
6
|
+
* Registers global keyboard shortcuts scoped to the agentation overlay.
|
|
7
|
+
*
|
|
8
|
+
* Global shortcuts (work with modifiers):
|
|
9
|
+
* - `Cmd/Ctrl+Shift+F`: Toggle annotation mode
|
|
10
|
+
*
|
|
11
|
+
* Single-key shortcuts (ignored while typing):
|
|
12
|
+
* - `P`: Toggle animation freeze
|
|
13
|
+
* - `H`: Toggle marker visibility
|
|
14
|
+
* - `C`: Copy the currently selected export format
|
|
15
|
+
* - `X`: Clear all annotations
|
|
16
|
+
* - `Escape`: Dismiss popover → deselect → disable annotation mode
|
|
17
|
+
*
|
|
18
|
+
* Must be called inside a Vue component `setup()`.
|
|
19
|
+
*/
|
|
20
|
+
export function useKeyboardShortcuts(deps) {
|
|
21
|
+
const { store, selection, overlay, settings, exportActions, freezeState } = deps;
|
|
22
|
+
function isOwnElement(el) {
|
|
23
|
+
return !!el.closest("[data-agentation-root]");
|
|
24
|
+
}
|
|
25
|
+
function onKeydown(e) {
|
|
26
|
+
if (e.isComposing)
|
|
27
|
+
return;
|
|
28
|
+
const active = document.activeElement;
|
|
29
|
+
// Cmd/Ctrl+Shift+F → toggle annotation mode
|
|
30
|
+
if ((e.metaKey || e.ctrlKey) && e.shiftKey && e.code === "KeyF") {
|
|
31
|
+
e.preventDefault();
|
|
32
|
+
store.enabled = !store.enabled;
|
|
33
|
+
if (!store.enabled) {
|
|
34
|
+
selection.clearHovered();
|
|
35
|
+
selection.clearSelection();
|
|
36
|
+
overlay.hidePopover();
|
|
37
|
+
}
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Escape — priority chain
|
|
41
|
+
if (e.key === "Escape") {
|
|
42
|
+
if (isEditableField(active) && !isOwnElement(active))
|
|
43
|
+
return;
|
|
44
|
+
// 1. Dismiss popover if visible
|
|
45
|
+
if (overlay.popoverVisible) {
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
selection.clearSelection();
|
|
48
|
+
overlay.hidePopover();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// 2. Deselect if selected
|
|
52
|
+
if (selection.selected) {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
selection.clearSelection();
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// 3. Disable annotation mode
|
|
58
|
+
if (store.enabled) {
|
|
59
|
+
e.preventDefault();
|
|
60
|
+
store.enabled = false;
|
|
61
|
+
selection.clearHovered();
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// --- Single-key shortcuts (skip while typing or with modifiers) ------
|
|
66
|
+
if (isEditableField(active) || isEditableField(e.target))
|
|
67
|
+
return;
|
|
68
|
+
if (e.metaKey || e.ctrlKey || e.altKey)
|
|
69
|
+
return;
|
|
70
|
+
const key = e.key.toLowerCase();
|
|
71
|
+
// P → toggle animation freeze (works even with 0 annotations)
|
|
72
|
+
if (key === "p") {
|
|
73
|
+
e.preventDefault();
|
|
74
|
+
freezeState?.toggleFreeze();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (store.annotations.length === 0)
|
|
78
|
+
return;
|
|
79
|
+
// H → toggle marker visibility
|
|
80
|
+
if (key === "h") {
|
|
81
|
+
e.preventDefault();
|
|
82
|
+
settings.showMarkers = !settings.showMarkers;
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// C → copy current export format
|
|
86
|
+
if (key === "c") {
|
|
87
|
+
e.preventDefault();
|
|
88
|
+
if (settings.copyFormat === "json") {
|
|
89
|
+
void exportActions?.exportJSON();
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
void exportActions?.exportMarkdown();
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// X → clear all annotations
|
|
97
|
+
if (key === "x") {
|
|
98
|
+
e.preventDefault();
|
|
99
|
+
store.clearAll();
|
|
100
|
+
selection.clearHovered();
|
|
101
|
+
selection.clearSelection();
|
|
102
|
+
overlay.hidePopover();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
onMounted(() => {
|
|
106
|
+
document.addEventListener("keydown", onKeydown, true);
|
|
107
|
+
});
|
|
108
|
+
onUnmounted(() => {
|
|
109
|
+
document.removeEventListener("keydown", onKeydown, true);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
// Helpers
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
function isEditableField(target) {
|
|
116
|
+
return target instanceof HTMLElement
|
|
117
|
+
&& (target.tagName === "INPUT"
|
|
118
|
+
|| target.tagName === "TEXTAREA"
|
|
119
|
+
|| target.tagName === "SELECT"
|
|
120
|
+
|| target.isContentEditable);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=useKeyboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useKeyboard.js","sourceRoot":"","sources":["../../src/composables/useKeyboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AnnotationV2 } from "@liuovo/agentation-vue-core";
|
|
2
|
+
import type { SelectionState } from "./useSelection.js";
|
|
3
|
+
export interface OverlayPosition {
|
|
4
|
+
top: number;
|
|
5
|
+
left: number;
|
|
6
|
+
}
|
|
7
|
+
export interface OverlayState {
|
|
8
|
+
readonly popoverVisible: boolean;
|
|
9
|
+
readonly popoverPosition: OverlayPosition | null;
|
|
10
|
+
/** The annotation currently being edited, or null for create mode. */
|
|
11
|
+
readonly editingAnnotation: AnnotationV2 | null;
|
|
12
|
+
/** Incremented when a visible popover should replay its attention animation. */
|
|
13
|
+
readonly shakeTick?: number;
|
|
14
|
+
showPopover(): void;
|
|
15
|
+
hidePopover(): void;
|
|
16
|
+
/** Open the popover in edit mode, anchored to the given rect. */
|
|
17
|
+
showEditPopover(annotation: AnnotationV2, anchorRect: DOMRectReadOnly): void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Creates overlay state driven by the selection state.
|
|
21
|
+
*
|
|
22
|
+
* The popover becomes visible when `showPopover()` is called
|
|
23
|
+
* (typically right after `select()`), and auto-positions itself
|
|
24
|
+
* relative to the selected element's bounding rect.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createOverlayState(selection: SelectionState): OverlayState;
|
|
27
|
+
//# sourceMappingURL=useOverlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOverlay.d.ts","sourceRoot":"","sources":["../../src/composables/useOverlay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAWvD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI,CAAA;IAChD,sEAAsE;IACtE,QAAQ,CAAC,iBAAiB,EAAE,YAAY,GAAG,IAAI,CAAA;IAC/C,gFAAgF;IAChF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,IAAI,IAAI,CAAA;IACnB,WAAW,IAAI,IAAI,CAAA;IACnB,iEAAiE;IACjE,eAAe,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;CAC7E;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,cAAc,GAAG,YAAY,CAmE1E"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { computed, reactive } from "vue";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Overlay state — manages popover visibility & position
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
const POPOVER_OFFSET = 12;
|
|
6
|
+
const POPOVER_MARGIN = 12;
|
|
7
|
+
const POPOVER_WIDTH = 280;
|
|
8
|
+
const POPOVER_HEIGHT = 260;
|
|
9
|
+
/**
|
|
10
|
+
* Creates overlay state driven by the selection state.
|
|
11
|
+
*
|
|
12
|
+
* The popover becomes visible when `showPopover()` is called
|
|
13
|
+
* (typically right after `select()`), and auto-positions itself
|
|
14
|
+
* relative to the selected element's bounding rect.
|
|
15
|
+
*/
|
|
16
|
+
export function createOverlayState(selection) {
|
|
17
|
+
const state = reactive({
|
|
18
|
+
visible: false,
|
|
19
|
+
editingAnnotation: null,
|
|
20
|
+
editAnchorRect: null,
|
|
21
|
+
shakeTick: 0,
|
|
22
|
+
});
|
|
23
|
+
const popoverVisible = computed(() => state.visible && (selection.selected !== null || state.editingAnnotation !== null));
|
|
24
|
+
const popoverPosition = computed(() => {
|
|
25
|
+
if (!popoverVisible.value)
|
|
26
|
+
return null;
|
|
27
|
+
// Edit mode: use the anchor rect from the marker
|
|
28
|
+
if (state.editingAnnotation && state.editAnchorRect) {
|
|
29
|
+
return computePopoverPosition(state.editAnchorRect);
|
|
30
|
+
}
|
|
31
|
+
// Create mode: use the selected element's rect
|
|
32
|
+
if (selection.selected) {
|
|
33
|
+
return computePopoverPosition(selection.selected.rect);
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
get popoverVisible() {
|
|
39
|
+
return popoverVisible.value;
|
|
40
|
+
},
|
|
41
|
+
get popoverPosition() {
|
|
42
|
+
return popoverPosition.value;
|
|
43
|
+
},
|
|
44
|
+
get editingAnnotation() {
|
|
45
|
+
return state.editingAnnotation;
|
|
46
|
+
},
|
|
47
|
+
get shakeTick() {
|
|
48
|
+
return state.shakeTick;
|
|
49
|
+
},
|
|
50
|
+
showPopover() {
|
|
51
|
+
if (!selection.selected)
|
|
52
|
+
return;
|
|
53
|
+
if (state.visible) {
|
|
54
|
+
state.shakeTick += 1;
|
|
55
|
+
}
|
|
56
|
+
state.editingAnnotation = null;
|
|
57
|
+
state.editAnchorRect = null;
|
|
58
|
+
state.visible = true;
|
|
59
|
+
},
|
|
60
|
+
hidePopover() {
|
|
61
|
+
state.visible = false;
|
|
62
|
+
state.editingAnnotation = null;
|
|
63
|
+
state.editAnchorRect = null;
|
|
64
|
+
},
|
|
65
|
+
showEditPopover(annotation, anchorRect) {
|
|
66
|
+
if (state.visible) {
|
|
67
|
+
state.shakeTick += 1;
|
|
68
|
+
}
|
|
69
|
+
state.editingAnnotation = annotation;
|
|
70
|
+
state.editAnchorRect = anchorRect;
|
|
71
|
+
state.visible = true;
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Position computation
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
function computePopoverPosition(rect) {
|
|
79
|
+
const vw = typeof window !== "undefined" ? window.innerWidth : 1024;
|
|
80
|
+
const vh = typeof window !== "undefined" ? window.innerHeight : 768;
|
|
81
|
+
// Prefer below the element
|
|
82
|
+
const preferredTop = rect.bottom + POPOVER_OFFSET;
|
|
83
|
+
const fallbackTop = Math.max(POPOVER_MARGIN, rect.top - POPOVER_HEIGHT - POPOVER_OFFSET);
|
|
84
|
+
const top = preferredTop + POPOVER_HEIGHT <= vh - POPOVER_MARGIN
|
|
85
|
+
? preferredTop
|
|
86
|
+
: fallbackTop;
|
|
87
|
+
// Center horizontally, clamped to viewport
|
|
88
|
+
const maxLeft = Math.max(POPOVER_MARGIN, vw - POPOVER_WIDTH - POPOVER_MARGIN);
|
|
89
|
+
const centeredLeft = rect.left + rect.width / 2 - POPOVER_WIDTH / 2;
|
|
90
|
+
const left = Math.min(Math.max(centeredLeft, POPOVER_MARGIN), maxLeft);
|
|
91
|
+
return { top, left };
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=useOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOverlay.js","sourceRoot":"","sources":["../../src/composables/useOverlay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { HoverSnapshot, SelectionSnapshot } from "../types.js";
|
|
2
|
+
export interface SelectionState {
|
|
3
|
+
readonly hovered: HoverSnapshot | null;
|
|
4
|
+
readonly selected: SelectionSnapshot | null;
|
|
5
|
+
setHovered(snapshot: HoverSnapshot): void;
|
|
6
|
+
clearHovered(): void;
|
|
7
|
+
select(snapshot: SelectionSnapshot): void;
|
|
8
|
+
clearSelection(): void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Creates a singleton selection state manager.
|
|
12
|
+
*
|
|
13
|
+
* Called once by OverlayRoot during setup; runtime event listeners
|
|
14
|
+
* drive state via `setHovered()` / `select()`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createSelectionState(): SelectionState;
|
|
17
|
+
//# sourceMappingURL=useSelection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSelection.d.ts","sourceRoot":"","sources":["../../src/composables/useSelection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAMnE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAA;IACtC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAC3C,UAAU,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAA;IACzC,YAAY,IAAI,IAAI,CAAA;IACpB,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAA;IACzC,cAAc,IAAI,IAAI,CAAA;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAiCrD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { reactive } from "vue";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a singleton selection state manager.
|
|
4
|
+
*
|
|
5
|
+
* Called once by OverlayRoot during setup; runtime event listeners
|
|
6
|
+
* drive state via `setHovered()` / `select()`.
|
|
7
|
+
*/
|
|
8
|
+
export function createSelectionState() {
|
|
9
|
+
const state = reactive({
|
|
10
|
+
hovered: null,
|
|
11
|
+
selected: null,
|
|
12
|
+
});
|
|
13
|
+
return {
|
|
14
|
+
get hovered() {
|
|
15
|
+
return state.hovered;
|
|
16
|
+
},
|
|
17
|
+
get selected() {
|
|
18
|
+
return state.selected;
|
|
19
|
+
},
|
|
20
|
+
setHovered(snapshot) {
|
|
21
|
+
// Suppress hover updates while an element is selected
|
|
22
|
+
if (state.selected)
|
|
23
|
+
return;
|
|
24
|
+
state.hovered = snapshot;
|
|
25
|
+
},
|
|
26
|
+
clearHovered() {
|
|
27
|
+
state.hovered = null;
|
|
28
|
+
},
|
|
29
|
+
select(snapshot) {
|
|
30
|
+
state.selected = snapshot;
|
|
31
|
+
state.hovered = null;
|
|
32
|
+
},
|
|
33
|
+
clearSelection() {
|
|
34
|
+
state.selected = null;
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=useSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSelection.js","sourceRoot":"","sources":["../../src/composables/useSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;AAgB9B;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,KAAK,GAAG,QAAQ,CAAC;QACrB,OAAO,EAAE,IAA4B;QACrC,QAAQ,EAAE,IAAgC;KAC3C,CAAC,CAAA;IAEF,OAAO;QACL,IAAI,OAAO;YACT,OAAO,KAAK,CAAC,OAAO,CAAA;QACtB,CAAC;QACD,IAAI,QAAQ;YACV,OAAO,KAAK,CAAC,QAAQ,CAAA;QACvB,CAAC;QAED,UAAU,CAAC,QAAuB;YAChC,sDAAsD;YACtD,IAAI,KAAK,CAAC,QAAQ;gBAAE,OAAM;YAC1B,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAA;QAC1B,CAAC;QAED,YAAY;YACV,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;QACtB,CAAC;QAED,MAAM,CAAC,QAA2B;YAChC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;YACzB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAA;QACtB,CAAC;QAED,cAAc;YACZ,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAA;QACvB,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { OutputDetailLevel } from "@liuovo/agentation-vue-core";
|
|
2
|
+
import type { Locale } from "../i18n/types.js";
|
|
3
|
+
export declare const COLOR_OPTIONS: readonly [{
|
|
4
|
+
readonly key: "purple";
|
|
5
|
+
readonly value: "#AF52DE";
|
|
6
|
+
}, {
|
|
7
|
+
readonly key: "blue";
|
|
8
|
+
readonly value: "#3c82f7";
|
|
9
|
+
}, {
|
|
10
|
+
readonly key: "cyan";
|
|
11
|
+
readonly value: "#5AC8FA";
|
|
12
|
+
}, {
|
|
13
|
+
readonly key: "green";
|
|
14
|
+
readonly value: "#34C759";
|
|
15
|
+
}, {
|
|
16
|
+
readonly key: "yellow";
|
|
17
|
+
readonly value: "#FFD60A";
|
|
18
|
+
}, {
|
|
19
|
+
readonly key: "orange";
|
|
20
|
+
readonly value: "#FF9500";
|
|
21
|
+
}, {
|
|
22
|
+
readonly key: "red";
|
|
23
|
+
readonly value: "#FF3B30";
|
|
24
|
+
}];
|
|
25
|
+
export declare const DEFAULT_ANNOTATION_COLOR = "#3c82f7";
|
|
26
|
+
export type CopyFormat = "json" | "markdown";
|
|
27
|
+
export interface SettingsState {
|
|
28
|
+
/** Level of detail in export output. */
|
|
29
|
+
outputDetail: OutputDetailLevel;
|
|
30
|
+
/** Whether dark mode is active. */
|
|
31
|
+
darkMode: boolean;
|
|
32
|
+
/** Whether annotation mode is enabled on load. */
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
/** Whether component source resolution is shown. */
|
|
35
|
+
componentSourceEnabled: boolean;
|
|
36
|
+
/** Accent colour for annotation markers. */
|
|
37
|
+
annotationColor: string;
|
|
38
|
+
/** Whether annotation markers are visible. */
|
|
39
|
+
showMarkers: boolean;
|
|
40
|
+
/** Preferred export format for copy actions. */
|
|
41
|
+
copyFormat: CopyFormat;
|
|
42
|
+
/** Whether to clear annotations after a successful copy. */
|
|
43
|
+
autoClearAfterCopy: boolean;
|
|
44
|
+
/** Whether page interactions are blocked while annotating. */
|
|
45
|
+
blockInteractions: boolean;
|
|
46
|
+
/** Current UI locale. */
|
|
47
|
+
locale: Locale;
|
|
48
|
+
/** Webhook endpoint URL. */
|
|
49
|
+
webhookUrl: string;
|
|
50
|
+
/** Whether webhooks auto-send is enabled. */
|
|
51
|
+
webhooksEnabled: boolean;
|
|
52
|
+
/** Toggle between dark and light mode. */
|
|
53
|
+
toggleDarkMode(): void;
|
|
54
|
+
}
|
|
55
|
+
interface PersistedSettings {
|
|
56
|
+
outputDetail?: OutputDetailLevel;
|
|
57
|
+
darkMode?: boolean;
|
|
58
|
+
enabled?: boolean;
|
|
59
|
+
componentSourceEnabled?: boolean;
|
|
60
|
+
annotationColor?: string;
|
|
61
|
+
showMarkers?: boolean;
|
|
62
|
+
copyFormat?: CopyFormat;
|
|
63
|
+
autoClearAfterCopy?: boolean;
|
|
64
|
+
blockInteractions?: boolean;
|
|
65
|
+
locale?: Locale;
|
|
66
|
+
webhookUrl?: string;
|
|
67
|
+
webhooksEnabled?: boolean;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Creates the settings state with layered priority:
|
|
71
|
+
* plugin config < localStorage < runtime toggle
|
|
72
|
+
*/
|
|
73
|
+
export declare function createSettingsState(defaults?: Partial<PersistedSettings>): SettingsState;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=useSettings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSettings.d.ts","sourceRoot":"","sources":["../../src/composables/useSettings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAEpE,OAAO,KAAK,EAAY,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAQxD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;EAQ0C,CAAA;AAEpE,eAAO,MAAM,wBAAwB,YAAY,CAAA;AAEjD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,CAAA;AAE5C,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,YAAY,EAAE,iBAAiB,CAAA;IAC/B,mCAAmC;IACnC,QAAQ,EAAE,OAAO,CAAA;IACjB,kDAAkD;IAClD,OAAO,EAAE,OAAO,CAAA;IAChB,oDAAoD;IACpD,sBAAsB,EAAE,OAAO,CAAA;IAC/B,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAA;IACvB,8CAA8C;IAC9C,WAAW,EAAE,OAAO,CAAA;IACpB,gDAAgD;IAChD,UAAU,EAAE,UAAU,CAAA;IACtB,4DAA4D;IAC5D,kBAAkB,EAAE,OAAO,CAAA;IAC3B,8DAA8D;IAC9D,iBAAiB,EAAE,OAAO,CAAA;IAC1B,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,6CAA6C;IAC7C,eAAe,EAAE,OAAO,CAAA;IAExB,0CAA0C;IAC1C,cAAc,IAAI,IAAI,CAAA;CACvB;AAED,UAAU,iBAAiB;IACzB,YAAY,CAAC,EAAE,iBAAiB,CAAA;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,aAAa,CAoExF"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { reactive, watch } from "vue";
|
|
2
|
+
import { DEFAULT_LOCALE, isValidLocale } from "../i18n/index.js";
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Settings state — persistent user preferences
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
const STORAGE_KEY = "agentation-vue-settings";
|
|
7
|
+
export const COLOR_OPTIONS = [
|
|
8
|
+
{ key: "purple", value: "#AF52DE" },
|
|
9
|
+
{ key: "blue", value: "#3c82f7" },
|
|
10
|
+
{ key: "cyan", value: "#5AC8FA" },
|
|
11
|
+
{ key: "green", value: "#34C759" },
|
|
12
|
+
{ key: "yellow", value: "#FFD60A" },
|
|
13
|
+
{ key: "orange", value: "#FF9500" },
|
|
14
|
+
{ key: "red", value: "#FF3B30" },
|
|
15
|
+
];
|
|
16
|
+
export const DEFAULT_ANNOTATION_COLOR = "#3c82f7";
|
|
17
|
+
/**
|
|
18
|
+
* Creates the settings state with layered priority:
|
|
19
|
+
* plugin config < localStorage < runtime toggle
|
|
20
|
+
*/
|
|
21
|
+
export function createSettingsState(defaults) {
|
|
22
|
+
const persisted = loadSettings();
|
|
23
|
+
const state = reactive({
|
|
24
|
+
outputDetail: persisted.outputDetail ?? defaults?.outputDetail ?? "standard",
|
|
25
|
+
darkMode: persisted.darkMode ?? defaults?.darkMode ?? true,
|
|
26
|
+
enabled: persisted.enabled ?? defaults?.enabled ?? true,
|
|
27
|
+
componentSourceEnabled: persisted.componentSourceEnabled ?? defaults?.componentSourceEnabled ?? true,
|
|
28
|
+
annotationColor: persisted.annotationColor ?? defaults?.annotationColor ?? DEFAULT_ANNOTATION_COLOR,
|
|
29
|
+
showMarkers: persisted.showMarkers ?? defaults?.showMarkers ?? true,
|
|
30
|
+
copyFormat: persisted.copyFormat ?? defaults?.copyFormat ?? "markdown",
|
|
31
|
+
autoClearAfterCopy: persisted.autoClearAfterCopy ?? defaults?.autoClearAfterCopy ?? false,
|
|
32
|
+
blockInteractions: persisted.blockInteractions ?? defaults?.blockInteractions ?? true,
|
|
33
|
+
locale: normalizeLocale(persisted.locale) ?? normalizeLocale(defaults?.locale) ?? DEFAULT_LOCALE,
|
|
34
|
+
webhookUrl: persisted.webhookUrl ?? defaults?.webhookUrl ?? "",
|
|
35
|
+
webhooksEnabled: persisted.webhooksEnabled ?? defaults?.webhooksEnabled ?? false,
|
|
36
|
+
});
|
|
37
|
+
// Persist on every change
|
|
38
|
+
watch(() => ({
|
|
39
|
+
outputDetail: state.outputDetail,
|
|
40
|
+
darkMode: state.darkMode,
|
|
41
|
+
enabled: state.enabled,
|
|
42
|
+
componentSourceEnabled: state.componentSourceEnabled,
|
|
43
|
+
annotationColor: state.annotationColor,
|
|
44
|
+
showMarkers: state.showMarkers,
|
|
45
|
+
copyFormat: state.copyFormat,
|
|
46
|
+
autoClearAfterCopy: state.autoClearAfterCopy,
|
|
47
|
+
blockInteractions: state.blockInteractions,
|
|
48
|
+
locale: state.locale,
|
|
49
|
+
webhookUrl: state.webhookUrl,
|
|
50
|
+
webhooksEnabled: state.webhooksEnabled,
|
|
51
|
+
}), (settings) => saveSettings(settings), { deep: true });
|
|
52
|
+
return {
|
|
53
|
+
get outputDetail() { return state.outputDetail; },
|
|
54
|
+
set outputDetail(v) { state.outputDetail = v; },
|
|
55
|
+
get darkMode() { return state.darkMode; },
|
|
56
|
+
set darkMode(v) { state.darkMode = v; },
|
|
57
|
+
get enabled() { return state.enabled; },
|
|
58
|
+
set enabled(v) { state.enabled = v; },
|
|
59
|
+
get componentSourceEnabled() { return state.componentSourceEnabled; },
|
|
60
|
+
set componentSourceEnabled(v) { state.componentSourceEnabled = v; },
|
|
61
|
+
get annotationColor() { return state.annotationColor; },
|
|
62
|
+
set annotationColor(v) { state.annotationColor = v; },
|
|
63
|
+
get showMarkers() { return state.showMarkers; },
|
|
64
|
+
set showMarkers(v) { state.showMarkers = v; },
|
|
65
|
+
get copyFormat() { return state.copyFormat; },
|
|
66
|
+
set copyFormat(v) { state.copyFormat = v; },
|
|
67
|
+
get autoClearAfterCopy() { return state.autoClearAfterCopy; },
|
|
68
|
+
set autoClearAfterCopy(v) { state.autoClearAfterCopy = v; },
|
|
69
|
+
get blockInteractions() { return state.blockInteractions; },
|
|
70
|
+
set blockInteractions(v) { state.blockInteractions = v; },
|
|
71
|
+
get locale() { return state.locale; },
|
|
72
|
+
set locale(v) { state.locale = normalizeLocale(v) ?? DEFAULT_LOCALE; },
|
|
73
|
+
get webhookUrl() { return state.webhookUrl; },
|
|
74
|
+
set webhookUrl(v) { state.webhookUrl = v; },
|
|
75
|
+
get webhooksEnabled() { return state.webhooksEnabled; },
|
|
76
|
+
set webhooksEnabled(v) { state.webhooksEnabled = v; },
|
|
77
|
+
toggleDarkMode() {
|
|
78
|
+
state.darkMode = !state.darkMode;
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// localStorage helpers
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
function normalizeLocale(value) {
|
|
86
|
+
return isValidLocale(value) ? value : undefined;
|
|
87
|
+
}
|
|
88
|
+
function loadSettings() {
|
|
89
|
+
if (typeof window === "undefined")
|
|
90
|
+
return {};
|
|
91
|
+
try {
|
|
92
|
+
const raw = window.localStorage.getItem(STORAGE_KEY);
|
|
93
|
+
if (!raw)
|
|
94
|
+
return {};
|
|
95
|
+
const parsed = JSON.parse(raw);
|
|
96
|
+
return {
|
|
97
|
+
...parsed,
|
|
98
|
+
locale: normalizeLocale(parsed.locale),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function saveSettings(settings) {
|
|
106
|
+
if (typeof window === "undefined")
|
|
107
|
+
return;
|
|
108
|
+
try {
|
|
109
|
+
window.localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// silent — localStorage may be full or disabled
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=useSettings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSettings.js","sourceRoot":"","sources":["../../src/composables/useSettings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type ComputedRef, type CSSProperties, type Ref } from "vue";
|
|
2
|
+
export interface ToolbarPosition {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
}
|
|
6
|
+
export interface ToolbarDragState {
|
|
7
|
+
readonly position: Readonly<Ref<ToolbarPosition | null>>;
|
|
8
|
+
readonly isDragging: Readonly<Ref<boolean>>;
|
|
9
|
+
readonly justFinishedDrag: Readonly<Ref<boolean>>;
|
|
10
|
+
readonly toolbarStyle: ComputedRef<CSSProperties | undefined>;
|
|
11
|
+
bindToolbarRef(element: HTMLElement | null): void;
|
|
12
|
+
onMouseDown(event: MouseEvent): void;
|
|
13
|
+
consumeJustFinishedDrag(): boolean;
|
|
14
|
+
syncConstraints(): void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Drag composable for the toolbar, powered by @vueuse/core `useDraggable`.
|
|
18
|
+
*
|
|
19
|
+
* Fully reactive — VueUse's `x`/`y` refs are the single source of truth
|
|
20
|
+
* for position. `toolbarStyle` derives from them so Vue's `:style` binding
|
|
21
|
+
* and the drag position are always in sync. No direct DOM writes needed.
|
|
22
|
+
*/
|
|
23
|
+
export declare function useToolbarDrag(options?: {
|
|
24
|
+
padding?: number;
|
|
25
|
+
toolbarHeight?: number;
|
|
26
|
+
dragThreshold?: number;
|
|
27
|
+
}): ToolbarDragState;
|
|
28
|
+
//# sourceMappingURL=useToolbarDrag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useToolbarDrag.d.ts","sourceRoot":"","sources":["../../src/composables/useToolbarDrag.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,GAAG,EACT,MAAM,KAAK,CAAA;AAQZ,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAA;IACxD,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IAC3C,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IACjD,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,aAAa,GAAG,SAAS,CAAC,CAAA;IAC7D,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAAA;IACjD,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IACpC,uBAAuB,IAAI,OAAO,CAAA;IAClC,eAAe,IAAI,IAAI,CAAA;CACxB;AAMD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE;IACtC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG,gBAAgB,CA6OxB"}
|