@agent-native/toolkit 0.11.2 → 0.12.0
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 +19 -0
- package/agent-native.eject.json +38 -0
- package/dist/canvas-annotations/CanvasCommentPins.d.ts +68 -0
- package/dist/canvas-annotations/CanvasCommentPins.d.ts.map +1 -0
- package/dist/canvas-annotations/CanvasCommentPins.js +513 -0
- package/dist/canvas-annotations/CanvasCommentPins.js.map +1 -0
- package/dist/canvas-annotations/DrawOverlay.d.ts +108 -0
- package/dist/canvas-annotations/DrawOverlay.d.ts.map +1 -0
- package/dist/canvas-annotations/DrawOverlay.js +746 -0
- package/dist/canvas-annotations/DrawOverlay.js.map +1 -0
- package/dist/canvas-annotations/DrawOverlay.spec.d.ts +2 -0
- package/dist/canvas-annotations/DrawOverlay.spec.d.ts.map +1 -0
- package/dist/canvas-annotations/DrawOverlay.spec.js +111 -0
- package/dist/canvas-annotations/DrawOverlay.spec.js.map +1 -0
- package/dist/canvas-annotations/index.d.ts +4 -0
- package/dist/canvas-annotations/index.d.ts.map +1 -0
- package/dist/canvas-annotations/index.js +3 -0
- package/dist/canvas-annotations/index.js.map +1 -0
- package/dist/canvas-annotations/types.d.ts +8 -0
- package/dist/canvas-annotations/types.d.ts.map +1 -0
- package/dist/canvas-annotations/types.js +2 -0
- package/dist/canvas-annotations/types.js.map +1 -0
- package/dist/canvas-interactions/canvas-interactions.d.ts +334 -0
- package/dist/canvas-interactions/canvas-interactions.d.ts.map +1 -0
- package/dist/canvas-interactions/canvas-interactions.js +451 -0
- package/dist/canvas-interactions/canvas-interactions.js.map +1 -0
- package/dist/canvas-interactions/canvas-interactions.spec.d.ts +2 -0
- package/dist/canvas-interactions/canvas-interactions.spec.d.ts.map +1 -0
- package/dist/canvas-interactions/canvas-interactions.spec.js +538 -0
- package/dist/canvas-interactions/canvas-interactions.spec.js.map +1 -0
- package/dist/canvas-interactions/index.d.ts +2 -0
- package/dist/canvas-interactions/index.d.ts.map +1 -0
- package/dist/canvas-interactions/index.js +2 -0
- package/dist/canvas-interactions/index.js.map +1 -0
- package/dist/design-tweaks/scrub-input-utils.d.ts +61 -0
- package/dist/design-tweaks/scrub-input-utils.d.ts.map +1 -0
- package/dist/design-tweaks/scrub-input-utils.js +235 -0
- package/dist/design-tweaks/scrub-input-utils.js.map +1 -0
- package/dist/design-tweaks/scrub-input.d.ts +66 -0
- package/dist/design-tweaks/scrub-input.d.ts.map +1 -0
- package/dist/design-tweaks/scrub-input.js +313 -0
- package/dist/design-tweaks/scrub-input.js.map +1 -0
- package/dist/design-tweaks/visual-style-controls.d.ts +2 -12
- package/dist/design-tweaks/visual-style-controls.d.ts.map +1 -1
- package/dist/design-tweaks/visual-style-controls.js +3 -107
- package/dist/design-tweaks/visual-style-controls.js.map +1 -1
- package/dist/design-tweaks/visual-style-controls.spec.js +26 -0
- package/dist/design-tweaks/visual-style-controls.spec.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +29 -1
- package/src/canvas-annotations/CanvasCommentPins.tsx +861 -0
- package/src/canvas-annotations/DrawOverlay.spec.tsx +145 -0
- package/src/canvas-annotations/DrawOverlay.tsx +1233 -0
- package/src/canvas-annotations/index.ts +15 -0
- package/src/canvas-annotations/types.ts +14 -0
- package/src/canvas-interactions/canvas-interactions.spec.ts +688 -0
- package/src/canvas-interactions/canvas-interactions.ts +933 -0
- package/src/canvas-interactions/index.ts +67 -0
- package/src/design-tweaks/scrub-input-utils.ts +311 -0
- package/src/design-tweaks/scrub-input.tsx +491 -0
- package/src/design-tweaks/visual-style-controls.spec.tsx +60 -0
- package/src/design-tweaks/visual-style-controls.tsx +23 -168
- package/src/index.ts +1 -0
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { IconBolt, IconLoader2, IconMessage, IconMessageCheck, IconSend, IconX, } from "@tabler/icons-react";
|
|
3
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
4
|
+
import { toast } from "sonner";
|
|
5
|
+
import { Button } from "../ui/button.js";
|
|
6
|
+
import { Textarea } from "../ui/textarea.js";
|
|
7
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "../ui/tooltip.js";
|
|
8
|
+
import { cn } from "../utils.js";
|
|
9
|
+
function escapeAttributeValue(value) {
|
|
10
|
+
return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
11
|
+
}
|
|
12
|
+
function escapeCssIdentifier(value) {
|
|
13
|
+
if (typeof CSS !== "undefined" && typeof CSS.escape === "function") {
|
|
14
|
+
return CSS.escape(value);
|
|
15
|
+
}
|
|
16
|
+
return value.replace(/[^a-zA-Z0-9_-]/g, "\\$&");
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Best-effort check for whether a pin's captured anchor element still exists
|
|
20
|
+
* on the canvas. Only meaningful for parent-DOM canvases with a captured
|
|
21
|
+
* `targetSelector` — iframe canvases never capture one (see `dropPinAt`), so
|
|
22
|
+
* this naturally no-ops there rather than mislabeling every iframe pin as
|
|
23
|
+
* stale. Recomputed on each render (already triggered by scroll/resize/pins
|
|
24
|
+
* changes); this deliberately avoids adding a dedicated poll so idle canvas
|
|
25
|
+
* perf is unaffected.
|
|
26
|
+
*/
|
|
27
|
+
function pinAnchorStillPresent(canvas, pin) {
|
|
28
|
+
if (!pin.targetSelector)
|
|
29
|
+
return true;
|
|
30
|
+
try {
|
|
31
|
+
return canvas.querySelector(pin.targetSelector) !== null;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// A selector that no longer parses shouldn't be reported as "stale" —
|
|
35
|
+
// that's a different failure mode than "the element was removed".
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function getTargetAnchor(target) {
|
|
40
|
+
const anchor = target?.closest("[data-agent-native-node-id], [data-builder-id], [data-loc], [id]");
|
|
41
|
+
if (!(anchor instanceof HTMLElement))
|
|
42
|
+
return {};
|
|
43
|
+
for (const attribute of [
|
|
44
|
+
"data-agent-native-node-id",
|
|
45
|
+
"data-builder-id",
|
|
46
|
+
"data-loc",
|
|
47
|
+
]) {
|
|
48
|
+
const value = anchor.getAttribute(attribute);
|
|
49
|
+
if (value) {
|
|
50
|
+
return {
|
|
51
|
+
targetSelector: `[${attribute}="${escapeAttributeValue(value)}"]`,
|
|
52
|
+
targetAnchorId: value,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (anchor.id) {
|
|
57
|
+
return {
|
|
58
|
+
targetSelector: `#${escapeCssIdentifier(anchor.id)}`,
|
|
59
|
+
targetAnchorId: anchor.id,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return {};
|
|
63
|
+
}
|
|
64
|
+
function getTargetBehindClickPlane(clickPlane, canvas, clientX, clientY) {
|
|
65
|
+
const pointerEvents = clickPlane.style.pointerEvents;
|
|
66
|
+
clickPlane.style.pointerEvents = "none";
|
|
67
|
+
try {
|
|
68
|
+
const targets = document.elementsFromPoint
|
|
69
|
+
? document.elementsFromPoint(clientX, clientY)
|
|
70
|
+
: [document.elementFromPoint(clientX, clientY)];
|
|
71
|
+
for (const target of targets) {
|
|
72
|
+
if (!(target instanceof HTMLElement) || !canvas.contains(target)) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
return target instanceof HTMLIFrameElement ? null : target;
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
clickPlane.style.pointerEvents = pointerEvents;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Purely visual "same spot" check used to spread overlapping markers apart on
|
|
85
|
+
* screen. This also considers submitted pins so a new pin dropped on top of an
|
|
86
|
+
* earlier confirmation marker doesn't render fully hidden underneath it.
|
|
87
|
+
*/
|
|
88
|
+
function pinsAtSameSpot(pin, other) {
|
|
89
|
+
if (pin.id === other.id)
|
|
90
|
+
return false;
|
|
91
|
+
const xDelta = Math.abs(pin.xPct - other.xPct);
|
|
92
|
+
const yDelta = Math.abs(pin.yPct - other.yPct);
|
|
93
|
+
return xDelta <= 3 && yDelta <= 3;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Deterministic pixel nudge for a pin whose marker would otherwise render
|
|
97
|
+
* stacked exactly on top of an earlier pin at (approximately) the same
|
|
98
|
+
* canvas position. Pins are placed in a small golden-angle spiral around
|
|
99
|
+
* their true position so every marker in a cluster stays visible and
|
|
100
|
+
* individually clickable; the stored `xPct`/`yPct` (and the position sent to
|
|
101
|
+
* the agent) are unaffected.
|
|
102
|
+
*/
|
|
103
|
+
function pinClusterOffset(pin, indexInPins, pins) {
|
|
104
|
+
let clusterIndex = 0;
|
|
105
|
+
for (let i = 0; i < indexInPins; i++) {
|
|
106
|
+
if (pinsAtSameSpot(pin, pins[i]))
|
|
107
|
+
clusterIndex += 1;
|
|
108
|
+
}
|
|
109
|
+
if (clusterIndex === 0)
|
|
110
|
+
return { dx: 0, dy: 0 };
|
|
111
|
+
const angle = clusterIndex * 2.4; // golden angle (radians) for even spread
|
|
112
|
+
const radius = 9 + clusterIndex * 5;
|
|
113
|
+
return {
|
|
114
|
+
dx: Math.round(Math.cos(angle) * radius),
|
|
115
|
+
dy: Math.round(Math.sin(angle) * radius),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Click-to-comment pins anchored to the canvas.
|
|
120
|
+
*
|
|
121
|
+
* Mirrors claude.ai/design's "inline comments" feature — the most-praised
|
|
122
|
+
* interaction pattern of that tool. A user clicks anywhere on the canvas to
|
|
123
|
+
* drop a pin, types a one-line instruction, and the pin's position + nearby
|
|
124
|
+
* element selector + instruction is sent to the agent. Submitted pins stay on
|
|
125
|
+
* the canvas as local confirmation; the agent's reply lands in the chat
|
|
126
|
+
* sidebar where it can make targeted edits.
|
|
127
|
+
*
|
|
128
|
+
* Why pins (vs text-anchored comments):
|
|
129
|
+
* The existing slide_comments table anchors comments to text selections via
|
|
130
|
+
* TipTap. That's good for prose review — but Rochkind also wants to point
|
|
131
|
+
* to images, charts, and whitespace. Pins handle those cases without
|
|
132
|
+
* requiring a text selection.
|
|
133
|
+
*/
|
|
134
|
+
export function CanvasCommentPins({ translate, sendToAgent, onSendError, allowQueue = true, showAnchorDetails = true, showSubmitShortcut = true, active, submitMode = "direct", onClose, onPinsChange, submitQueuedSignal, clickPlaneUnderToolbar = false, canvasSelector, contextId, contextLabel, }) {
|
|
135
|
+
const t = translate;
|
|
136
|
+
const [pins, setPins] = useState([]);
|
|
137
|
+
// Mirrors `pins` so the context-change reset effect below can inspect what
|
|
138
|
+
// was on the canvas the instant `contextId` changes, without re-running on
|
|
139
|
+
// every pin edit (it should only fire once, on the context switch itself).
|
|
140
|
+
const pinsRef = useRef(pins);
|
|
141
|
+
pinsRef.current = pins;
|
|
142
|
+
const [activePinId, setActivePinId] = useState(null);
|
|
143
|
+
const [sending, setSending] = useState(false);
|
|
144
|
+
const containerRef = useRef(null);
|
|
145
|
+
const lastSubmitQueuedSignalRef = useRef(submitQueuedSignal);
|
|
146
|
+
const [canvasEl, setCanvasEl] = useState(null);
|
|
147
|
+
// Dummy tick forces a re-render (and a fresh getBoundingClientRect()) whenever
|
|
148
|
+
// the canvas scrolls or resizes, keeping pin overlays in sync.
|
|
149
|
+
const [, setLayoutTick] = useState(0);
|
|
150
|
+
// Reset pins when the context (slide) changes — they're scoped to one view.
|
|
151
|
+
useEffect(() => {
|
|
152
|
+
// Queued-but-unsent comment drafts don't survive a context switch (pins
|
|
153
|
+
// are intentionally scoped to one view). Losing them is unavoidable here
|
|
154
|
+
// since we don't control cross-view navigation, but it must never be
|
|
155
|
+
// silent — warn instead of quietly wiping the user's typed drafts.
|
|
156
|
+
const discardedDraftCount = pinsRef.current.filter((pin) => pin.queued && !pin.submitted && (pin.draft || "").trim()).length;
|
|
157
|
+
if (discardedDraftCount > 0) {
|
|
158
|
+
toast(t("visualEditor.queuedCommentsDiscarded", {
|
|
159
|
+
count: discardedDraftCount,
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
setPins([]);
|
|
163
|
+
setActivePinId(null);
|
|
164
|
+
setCanvasEl(null);
|
|
165
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- only fire on an
|
|
166
|
+
// actual context (slide/design) switch, not on every pins/t change.
|
|
167
|
+
}, [contextId]);
|
|
168
|
+
// Find the canvas container the pins overlay
|
|
169
|
+
useEffect(() => {
|
|
170
|
+
if (!active)
|
|
171
|
+
return;
|
|
172
|
+
const findCanvas = () => {
|
|
173
|
+
const el = document.querySelector(canvasSelector);
|
|
174
|
+
if (el) {
|
|
175
|
+
containerRef.current = el;
|
|
176
|
+
setCanvasEl(el);
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
findCanvas();
|
|
180
|
+
const t = setTimeout(findCanvas, 50);
|
|
181
|
+
return () => clearTimeout(t);
|
|
182
|
+
}, [active, canvasSelector, contextId]);
|
|
183
|
+
// Re-render when the canvas element moves in the viewport (scroll or resize),
|
|
184
|
+
// so getBoundingClientRect() returns fresh coordinates for pin overlays.
|
|
185
|
+
useEffect(() => {
|
|
186
|
+
const canvas = containerRef.current ?? canvasEl;
|
|
187
|
+
if (!canvas)
|
|
188
|
+
return;
|
|
189
|
+
const bump = () => setLayoutTick((t) => t + 1);
|
|
190
|
+
// ResizeObserver fires when the canvas element's own size changes.
|
|
191
|
+
const ro = new ResizeObserver(bump);
|
|
192
|
+
ro.observe(canvas);
|
|
193
|
+
// Scroll listeners on every scrollable ancestor and the window cover both
|
|
194
|
+
// page-level scrolling and container-level panning. Walk the ancestor
|
|
195
|
+
// chain with getComputedStyle instead of a class-name heuristic so
|
|
196
|
+
// inline-styled, nested, and multiple scroll containers are all covered.
|
|
197
|
+
const isScrollable = (value) => value === "auto" || value === "scroll" || value === "overlay";
|
|
198
|
+
const scrollTargets = [];
|
|
199
|
+
for (let el = canvas; el; el = el.parentElement) {
|
|
200
|
+
const style = getComputedStyle(el);
|
|
201
|
+
if (isScrollable(style.overflow) ||
|
|
202
|
+
isScrollable(style.overflowX) ||
|
|
203
|
+
isScrollable(style.overflowY)) {
|
|
204
|
+
scrollTargets.push(el);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
scrollTargets.push(window);
|
|
208
|
+
for (const target of scrollTargets) {
|
|
209
|
+
target.addEventListener("scroll", bump, { passive: true });
|
|
210
|
+
}
|
|
211
|
+
window.addEventListener("resize", bump, { passive: true });
|
|
212
|
+
return () => {
|
|
213
|
+
ro.disconnect();
|
|
214
|
+
for (const target of scrollTargets) {
|
|
215
|
+
target.removeEventListener("scroll", bump);
|
|
216
|
+
}
|
|
217
|
+
window.removeEventListener("resize", bump);
|
|
218
|
+
};
|
|
219
|
+
}, [canvasEl]);
|
|
220
|
+
const dropPinAt = useCallback((clientX, clientY, target) => {
|
|
221
|
+
const canvas = containerRef.current;
|
|
222
|
+
if (!canvas)
|
|
223
|
+
return;
|
|
224
|
+
const rect = canvas.getBoundingClientRect();
|
|
225
|
+
const xPct = ((clientX - rect.left) / rect.width) * 100;
|
|
226
|
+
const yPct = ((clientY - rect.top) / rect.height) * 100;
|
|
227
|
+
if (xPct < 0 || xPct > 100 || yPct < 0 || yPct > 100)
|
|
228
|
+
return; // i18n-ignore geometry bounds check, not UI copy
|
|
229
|
+
// Build a best-effort selector for parent-DOM canvases. For iframe
|
|
230
|
+
// canvases the transparent overlay captures the click, so target details
|
|
231
|
+
// are intentionally omitted but the precise position is preserved.
|
|
232
|
+
const { targetSelector, targetAnchorId } = getTargetAnchor(target);
|
|
233
|
+
const targetText = target?.textContent?.trim().slice(0, 80) || undefined;
|
|
234
|
+
const newPin = {
|
|
235
|
+
id: crypto.randomUUID(),
|
|
236
|
+
xPct,
|
|
237
|
+
yPct,
|
|
238
|
+
targetSelector,
|
|
239
|
+
targetAnchorId,
|
|
240
|
+
targetText,
|
|
241
|
+
draft: "",
|
|
242
|
+
};
|
|
243
|
+
setPins((prev) => [...prev, newPin]);
|
|
244
|
+
setActivePinId(newPin.id);
|
|
245
|
+
}, []);
|
|
246
|
+
// Click handler — drops a pin where the user clicks a non-iframe canvas.
|
|
247
|
+
// Iframe canvases cannot bubble clicks to the parent, so the rendered
|
|
248
|
+
// transparent overlay below handles those reliably.
|
|
249
|
+
useEffect(() => {
|
|
250
|
+
if (!active)
|
|
251
|
+
return;
|
|
252
|
+
const onClick = (e) => {
|
|
253
|
+
const canvas = containerRef.current;
|
|
254
|
+
if (!canvas)
|
|
255
|
+
return;
|
|
256
|
+
const target = e.target;
|
|
257
|
+
// Ignore clicks on UI chrome (the pin popovers themselves)
|
|
258
|
+
if (target.closest("[data-pin-popover]"))
|
|
259
|
+
return;
|
|
260
|
+
if (target.closest("[data-pin-click-overlay]"))
|
|
261
|
+
return;
|
|
262
|
+
if (!canvas.contains(target))
|
|
263
|
+
return;
|
|
264
|
+
dropPinAt(e.clientX, e.clientY, target);
|
|
265
|
+
e.stopPropagation();
|
|
266
|
+
e.preventDefault();
|
|
267
|
+
};
|
|
268
|
+
window.addEventListener("click", onClick, { capture: true });
|
|
269
|
+
return () => window.removeEventListener("click", onClick, { capture: true });
|
|
270
|
+
}, [active, dropPinAt]);
|
|
271
|
+
// Escape closes pin mode
|
|
272
|
+
useEffect(() => {
|
|
273
|
+
if (!active)
|
|
274
|
+
return;
|
|
275
|
+
const onKey = (e) => {
|
|
276
|
+
if (e.key === "Escape") {
|
|
277
|
+
onClose();
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
window.addEventListener("keydown", onKey);
|
|
281
|
+
return () => window.removeEventListener("keydown", onKey);
|
|
282
|
+
}, [active, onClose]);
|
|
283
|
+
const updatePin = (id, updates) => {
|
|
284
|
+
setPins((prev) => prev.map((p) => (p.id === id ? { ...p, ...updates } : p)));
|
|
285
|
+
};
|
|
286
|
+
const removePin = (id) => {
|
|
287
|
+
setPins((prev) => prev.filter((p) => p.id !== id));
|
|
288
|
+
if (activePinId === id)
|
|
289
|
+
setActivePinId(null);
|
|
290
|
+
};
|
|
291
|
+
const queuedPins = useMemo(() => pins.filter((pin) => pin.queued && !pin.submitted && (pin.draft || "").trim()), [pins]);
|
|
292
|
+
useEffect(() => {
|
|
293
|
+
onPinsChange?.(pins);
|
|
294
|
+
}, [onPinsChange, pins]);
|
|
295
|
+
useEffect(() => {
|
|
296
|
+
if (submitQueuedSignal === undefined ||
|
|
297
|
+
submitQueuedSignal === lastSubmitQueuedSignalRef.current) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
lastSubmitQueuedSignalRef.current = submitQueuedSignal;
|
|
301
|
+
if (queuedPins.length === 0)
|
|
302
|
+
return;
|
|
303
|
+
const submittedIds = new Set(queuedPins.map((pin) => pin.id));
|
|
304
|
+
setPins((prev) => prev.map((pin) => submittedIds.has(pin.id)
|
|
305
|
+
? { ...pin, queued: false, submitted: true }
|
|
306
|
+
: pin));
|
|
307
|
+
setActivePinId(null);
|
|
308
|
+
}, [queuedPins, submitQueuedSignal]);
|
|
309
|
+
const submittedCount = pins.filter((pin) => pin.submitted).length;
|
|
310
|
+
const buildPinLines = (pin, index) => {
|
|
311
|
+
const lines = [
|
|
312
|
+
index === undefined
|
|
313
|
+
? `[Comment pin on ${contextLabel || contextId}]`
|
|
314
|
+
: `[${index + 1}] Comment pin on ${contextLabel || contextId}`,
|
|
315
|
+
`Position: ${pin.xPct.toFixed(1)}% from left, ${pin.yPct.toFixed(1)}% from top`,
|
|
316
|
+
];
|
|
317
|
+
if (pin.targetAnchorId)
|
|
318
|
+
lines.push(`Anchor id: ${pin.targetAnchorId}`);
|
|
319
|
+
if (pin.targetSelector)
|
|
320
|
+
lines.push(`Element: ${pin.targetSelector}`);
|
|
321
|
+
if (pin.targetText)
|
|
322
|
+
lines.push(`Nearby text: "${pin.targetText}"`);
|
|
323
|
+
lines.push("");
|
|
324
|
+
lines.push((pin.draft || "").trim());
|
|
325
|
+
return lines;
|
|
326
|
+
};
|
|
327
|
+
const sendPinsToAgent = async (targetPins, batch = false) => {
|
|
328
|
+
const message = batch
|
|
329
|
+
? [
|
|
330
|
+
`[Comment batch on ${contextLabel || contextId}]`,
|
|
331
|
+
`Annotations: ${targetPins.length}`,
|
|
332
|
+
"",
|
|
333
|
+
...targetPins.flatMap((pin, index) => [
|
|
334
|
+
...buildPinLines(pin, index),
|
|
335
|
+
"",
|
|
336
|
+
]),
|
|
337
|
+
].join("\n")
|
|
338
|
+
: buildPinLines(targetPins[0]).join("\n");
|
|
339
|
+
try {
|
|
340
|
+
return await sendToAgent({
|
|
341
|
+
message,
|
|
342
|
+
submit: true,
|
|
343
|
+
openSidebar: true,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
catch (err) {
|
|
347
|
+
console.error("[CanvasCommentPins] failed to send to agent:", err);
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
const queuePin = (pin) => {
|
|
352
|
+
const text = (pin.draft || "").trim();
|
|
353
|
+
if (!text) {
|
|
354
|
+
removePin(pin.id);
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
updatePin(pin.id, { draft: text, queued: true });
|
|
358
|
+
setActivePinId(null);
|
|
359
|
+
};
|
|
360
|
+
const submitPin = async (pin) => {
|
|
361
|
+
const text = (pin.draft || "").trim();
|
|
362
|
+
if (!text) {
|
|
363
|
+
removePin(pin.id);
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
if (submitMode === "queue") {
|
|
367
|
+
queuePin(pin);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
const nextPin = { ...pin, draft: text };
|
|
371
|
+
setSending(true);
|
|
372
|
+
const delivered = await sendPinsToAgent([nextPin]);
|
|
373
|
+
setSending(false);
|
|
374
|
+
if (delivered) {
|
|
375
|
+
updatePin(pin.id, { draft: text, queued: false, submitted: true });
|
|
376
|
+
setActivePinId(null);
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
onSendError?.();
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
const submitQueuedPins = async () => {
|
|
383
|
+
if (queuedPins.length === 0)
|
|
384
|
+
return;
|
|
385
|
+
if (submitMode === "queue")
|
|
386
|
+
return;
|
|
387
|
+
setSending(true);
|
|
388
|
+
const delivered = await sendPinsToAgent(queuedPins, true);
|
|
389
|
+
setSending(false);
|
|
390
|
+
if (!delivered) {
|
|
391
|
+
onSendError?.();
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
const submittedIds = new Set(queuedPins.map((pin) => pin.id));
|
|
395
|
+
setPins((prev) => prev.map((pin) => submittedIds.has(pin.id)
|
|
396
|
+
? { ...pin, queued: false, submitted: true }
|
|
397
|
+
: pin));
|
|
398
|
+
setActivePinId(null);
|
|
399
|
+
};
|
|
400
|
+
// Refs for drag-detection on the click overlay (Bug 3 fix).
|
|
401
|
+
// A pin is only dropped on a completed click, not on any drag gesture.
|
|
402
|
+
const overlayDownPos = useRef(null);
|
|
403
|
+
const overlayDidDrag = useRef(false);
|
|
404
|
+
if (!active && pins.length === 0)
|
|
405
|
+
return null;
|
|
406
|
+
// Render pins as portaled overlays positioned on top of the canvas
|
|
407
|
+
const canvas = containerRef.current ?? canvasEl;
|
|
408
|
+
if (!canvas)
|
|
409
|
+
return null;
|
|
410
|
+
const rect = canvas.getBoundingClientRect();
|
|
411
|
+
// Clamp summaryLeft so the w-64 (256px) panel, which is shifted left by
|
|
412
|
+
// -translate-x-full, never overflows the left viewport edge.
|
|
413
|
+
// 264 = 256 (panel width) + 8 (minimum margin from the viewport left edge).
|
|
414
|
+
const summaryLeft = Math.max(264, Math.min(rect.right - 8, window.innerWidth - 8));
|
|
415
|
+
const summaryTop = Math.max(rect.top + 8, 72);
|
|
416
|
+
return (_jsxs(TooltipProvider, { children: [active && (_jsx("div", { "data-pin-click-overlay": true, className: cn("fixed cursor-crosshair", clickPlaneUnderToolbar ? "z-[20]" : "z-[54]"), style: {
|
|
417
|
+
left: rect.left,
|
|
418
|
+
top: rect.top,
|
|
419
|
+
width: rect.width,
|
|
420
|
+
height: rect.height,
|
|
421
|
+
}, onPointerDown: (e) => {
|
|
422
|
+
overlayDownPos.current = { x: e.clientX, y: e.clientY };
|
|
423
|
+
overlayDidDrag.current = false;
|
|
424
|
+
e.stopPropagation();
|
|
425
|
+
}, onPointerMove: (e) => {
|
|
426
|
+
if (overlayDownPos.current) {
|
|
427
|
+
const dx = e.clientX - overlayDownPos.current.x;
|
|
428
|
+
const dy = e.clientY - overlayDownPos.current.y;
|
|
429
|
+
if (dx * dx + dy * dy > 16)
|
|
430
|
+
overlayDidDrag.current = true;
|
|
431
|
+
}
|
|
432
|
+
}, onClick: (e) => {
|
|
433
|
+
e.preventDefault();
|
|
434
|
+
e.stopPropagation();
|
|
435
|
+
if (!overlayDidDrag.current) {
|
|
436
|
+
dropPinAt(e.clientX, e.clientY, getTargetBehindClickPlane(e.currentTarget, canvas, e.clientX, e.clientY));
|
|
437
|
+
}
|
|
438
|
+
overlayDownPos.current = null;
|
|
439
|
+
overlayDidDrag.current = false;
|
|
440
|
+
} })), active && (_jsxs("div", { "data-pin-mode-banner": true, className: "fixed top-16 left-1/2 -translate-x-1/2 z-50 flex items-center gap-2 rounded-full border border-border bg-popover px-3 py-1.5 shadow-lg pointer-events-none", children: [_jsx(IconMessage, { className: "w-3.5 h-3.5 text-[#609FF8]" }), _jsx("span", { className: "!text-[11px] text-foreground", children: t("visualEditor.clickToDropCommentPin") }), _jsx("span", { className: "text-[10px] text-muted-foreground ml-1", children: t("visualEditor.escToExit") })] })), allowQueue && pins.length > 0 && (_jsx("div", { "data-pin-popover": true, className: "fixed z-[56] w-64 -translate-x-full rounded-lg border border-border bg-popover p-3 shadow-xl", style: { left: summaryLeft, top: summaryTop }, children: _jsxs("div", { className: "mb-2 flex items-center justify-between gap-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "truncate text-xs font-semibold text-foreground", children: t("visualEditor.annotationQueue") }), _jsx("p", { className: "text-[10px] text-muted-foreground", children: t("visualEditor.annotationQueueCounts", {
|
|
441
|
+
queued: queuedPins.length,
|
|
442
|
+
sent: submittedCount,
|
|
443
|
+
}) })] }), submitMode === "direct" ? (_jsxs(Button, { size: "sm", className: "h-7 gap-1 px-2 text-[10px]", onClick: submitQueuedPins, disabled: queuedPins.length === 0 || sending, children: [sending ? (_jsx(IconLoader2, { className: "size-3 animate-spin" })) : (_jsx(IconBolt, { className: "size-3" })), t("visualEditor.batchApply")] })) : (_jsx("span", { className: "rounded-md bg-muted px-2 py-1 text-[10px] font-medium text-muted-foreground", children: t("visualEditor.queued") }))] }) })), pins.map((pin, pinIndex) => {
|
|
444
|
+
const { dx, dy } = pinClusterOffset(pin, pinIndex, pins);
|
|
445
|
+
const left = rect.left + (pin.xPct / 100) * rect.width + dx;
|
|
446
|
+
const top = rect.top + (pin.yPct / 100) * rect.height + dy;
|
|
447
|
+
const isActive = activePinId === pin.id;
|
|
448
|
+
const PinIcon = pin.submitted ? IconMessageCheck : IconMessage;
|
|
449
|
+
// Not submitted yet + claims a specific anchor that's no longer on
|
|
450
|
+
// the canvas (e.g. the element was deleted or the design was edited
|
|
451
|
+
// elsewhere) — flag it instead of silently pretending the position
|
|
452
|
+
// is still meaningful.
|
|
453
|
+
const isStaleAnchor = !pin.submitted && !pinAnchorStillPresent(canvas, pin);
|
|
454
|
+
return (_jsxs("div", { "data-pin-popover": true, "data-pin-id": pin.id, className: "fixed z-[55]", style: { left, top }, children: [_jsxs(Tooltip, { open: isActive ? false : undefined, children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { onClick: () => {
|
|
455
|
+
if (!pin.submitted)
|
|
456
|
+
setActivePinId(pin.id);
|
|
457
|
+
}, className: cn("absolute -mt-1 flex size-7 -translate-x-1/2 -translate-y-full cursor-pointer items-center justify-center rounded-full rounded-bl-none shadow-lg ring-2 transition-transform hover:scale-110", pin.submitted
|
|
458
|
+
? "bg-emerald-500 text-white ring-emerald-200"
|
|
459
|
+
: "bg-[#609FF8] text-white ring-blue-200", pin.submitted && "opacity-95", isStaleAnchor &&
|
|
460
|
+
"outline outline-2 outline-dashed outline-offset-2 outline-muted-foreground/70"), children: _jsx(PinIcon, { className: "size-3.5" }) }) }), _jsx(TooltipContent, { className: "pointer-events-none", children: isStaleAnchor
|
|
461
|
+
? t("visualEditor.staleAnchorDetail")
|
|
462
|
+
: pin.queued
|
|
463
|
+
? t("visualEditor.queued")
|
|
464
|
+
: pin.draft ||
|
|
465
|
+
(pin.submitted
|
|
466
|
+
? t("visualEditor.commentSent")
|
|
467
|
+
: t("visualEditor.comment")) })] }), isActive &&
|
|
468
|
+
!pin.submitted &&
|
|
469
|
+
(() => {
|
|
470
|
+
const composerW = 288; // w-72
|
|
471
|
+
const composerH = 220; // estimated height
|
|
472
|
+
const flipX = left + 12 + composerW > window.innerWidth;
|
|
473
|
+
const flipY = top + 4 + composerH > window.innerHeight;
|
|
474
|
+
return (_jsxs("div", { "data-pin-popover": true, className: "absolute z-[260] w-72 rounded-lg border border-border bg-popover shadow-xl p-2", style: {
|
|
475
|
+
...(flipX
|
|
476
|
+
? { right: "calc(100% + 4px)", left: "auto" }
|
|
477
|
+
: { left: "0.75rem" }),
|
|
478
|
+
...(flipY
|
|
479
|
+
? { bottom: "calc(100% + 4px)", top: "auto" }
|
|
480
|
+
: { top: "0.25rem" }),
|
|
481
|
+
}, children: [_jsx("p", { className: "mb-2 text-xs font-semibold text-foreground", children: t("visualEditor.editDesign") }), _jsx(Textarea, { autoFocus: true, value: pin.draft || "", onChange: (e) => updatePin(pin.id, {
|
|
482
|
+
draft: e.target.value,
|
|
483
|
+
queued: false,
|
|
484
|
+
}), onKeyDown: (e) => {
|
|
485
|
+
if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) {
|
|
486
|
+
e.preventDefault();
|
|
487
|
+
submitPin(pin);
|
|
488
|
+
}
|
|
489
|
+
if (e.key === "Escape") {
|
|
490
|
+
// Stop propagation so the window Escape listener (which
|
|
491
|
+
// calls onClose) does not also fire. Collapse the composer
|
|
492
|
+
// back to the pin dot while preserving the draft text —
|
|
493
|
+
// the pin and any typed draft survive. A second Escape
|
|
494
|
+
// with no composer open exits pin mode, matching Figma.
|
|
495
|
+
e.stopPropagation();
|
|
496
|
+
e.preventDefault();
|
|
497
|
+
setActivePinId(null);
|
|
498
|
+
}
|
|
499
|
+
}, placeholder: t("visualEditor.tellAgentWhatToChange"), className: "resize-none text-xs min-h-[60px]" }), showAnchorDetails && pin.targetAnchorId && (_jsx("div", { className: cn("mt-1 truncate rounded-md px-2 py-1 text-[10px]", isStaleAnchor
|
|
500
|
+
? "bg-destructive/10 text-destructive"
|
|
501
|
+
: "bg-muted/45 text-muted-foreground"), children: isStaleAnchor
|
|
502
|
+
? t("visualEditor.staleAnchorDetail")
|
|
503
|
+
: t("visualEditor.anchorLabel", {
|
|
504
|
+
id: pin.targetAnchorId,
|
|
505
|
+
}) })), showAnchorDetails && pin.targetText && (_jsx("div", { className: "text-[10px] text-muted-foreground mt-1 italic line-clamp-1", children: t("visualEditor.nearText", { text: pin.targetText }) })), _jsxs("div", { className: "flex items-center justify-between mt-2", children: [showSubmitShortcut ? (_jsx("span", { className: "text-[10px] text-muted-foreground", children: t("visualEditor.submitShortcut", {
|
|
506
|
+
mod: /Mac|iPhone|iPad/.test(navigator.userAgent)
|
|
507
|
+
? "⌘"
|
|
508
|
+
: "Ctrl",
|
|
509
|
+
}) })) : (_jsx("span", {})), _jsxs("div", { className: "flex gap-1", children: [_jsx(Button, { size: "sm", variant: "ghost", className: "h-6 px-2 text-[10px] cursor-pointer", onClick: () => removePin(pin.id), children: _jsx(IconX, { className: "w-3 h-3" }) }), allowQueue ? (_jsx(Button, { size: "sm", variant: "outline", className: "h-6 gap-1 px-2 text-[10px] cursor-pointer", onClick: () => queuePin(pin), disabled: !(pin.draft || "").trim(), children: t("visualEditor.queue") })) : null, submitMode === "direct" && (_jsxs(Button, { size: "sm", className: "h-6 gap-1 px-2 text-[10px] cursor-pointer", onClick: () => submitPin(pin), disabled: !(pin.draft || "").trim() || sending, children: [sending ? (_jsx(IconLoader2, { className: "size-3 animate-spin" })) : (_jsx(IconSend, { className: "size-3" })), t("visualEditor.send")] }))] })] })] }));
|
|
510
|
+
})()] }, pin.id));
|
|
511
|
+
})] }));
|
|
512
|
+
}
|
|
513
|
+
//# sourceMappingURL=CanvasCommentPins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CanvasCommentPins.js","sourceRoot":"","sources":["../../src/canvas-annotations/CanvasCommentPins.tsx"],"names":[],"mappings":"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"}
|