@agent-native/toolkit 0.11.1 → 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 +4 -108
- 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 +26 -171
- package/src/index.ts +1 -0
|
@@ -13,6 +13,29 @@ import {
|
|
|
13
13
|
import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover.js";
|
|
14
14
|
import { cn } from "../utils.js";
|
|
15
15
|
|
|
16
|
+
export {
|
|
17
|
+
VisualScrubInput,
|
|
18
|
+
resolvePendingScrubCommit,
|
|
19
|
+
type PendingScrubCommit,
|
|
20
|
+
type ScrubInputChangeMeta,
|
|
21
|
+
type ScrubInputProps,
|
|
22
|
+
} from "./scrub-input.js";
|
|
23
|
+
export {
|
|
24
|
+
formatScrubValue,
|
|
25
|
+
getScrubStepFromEvent,
|
|
26
|
+
normalizeScrubNumber,
|
|
27
|
+
parseScrubExpression,
|
|
28
|
+
roundScrubDragValue,
|
|
29
|
+
scrubSnapsToInteger,
|
|
30
|
+
SCRUB_DRAG_THRESHOLD_PX,
|
|
31
|
+
startScrubDrag,
|
|
32
|
+
updateScrubDrag,
|
|
33
|
+
type ParsedScrubExpression,
|
|
34
|
+
type ScrubDragState,
|
|
35
|
+
type ScrubDragTick,
|
|
36
|
+
type ScrubExpressionOptions,
|
|
37
|
+
} from "./scrub-input-utils.js";
|
|
38
|
+
|
|
16
39
|
export type VisualControlValue = string | number | boolean;
|
|
17
40
|
|
|
18
41
|
export interface VisualControlOption {
|
|
@@ -46,13 +69,6 @@ function formatNumber(value: number, unit?: string) {
|
|
|
46
69
|
return unit ? `${rounded}${unit}` : String(rounded);
|
|
47
70
|
}
|
|
48
71
|
|
|
49
|
-
function parseDraftNumber(value: string, fallback: number) {
|
|
50
|
-
const match = value.trim().match(/-?\d+(?:\.\d+)?/);
|
|
51
|
-
if (!match) return fallback;
|
|
52
|
-
const next = Number(match[0]);
|
|
53
|
-
return Number.isFinite(next) ? next : fallback;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
72
|
interface RgbaColor {
|
|
57
73
|
r: number;
|
|
58
74
|
g: number;
|
|
@@ -244,11 +260,11 @@ export function VisualInspectorPanel({
|
|
|
244
260
|
return (
|
|
245
261
|
<aside
|
|
246
262
|
className={cn(
|
|
247
|
-
"w-64 overflow-hidden rounded-xl border border-border bg-card/95 text-card-foreground shadow-2xl shadow-black/35 backdrop-blur",
|
|
263
|
+
"flex w-64 flex-col overflow-hidden rounded-xl border border-border bg-card/95 text-card-foreground shadow-2xl shadow-black/35 backdrop-blur",
|
|
248
264
|
className,
|
|
249
265
|
)}
|
|
250
266
|
>
|
|
251
|
-
<div className="flex min-h-10 items-start justify-between gap-2 border-b border-border/70 px-3 py-2.5">
|
|
267
|
+
<div className="flex min-h-10 shrink-0 items-start justify-between gap-2 border-b border-border/70 px-3 py-2.5">
|
|
252
268
|
<div className="min-w-0">
|
|
253
269
|
<div className="truncate text-[11px] font-semibold uppercase tracking-wide text-muted-foreground">
|
|
254
270
|
{title}
|
|
@@ -261,7 +277,7 @@ export function VisualInspectorPanel({
|
|
|
261
277
|
</div>
|
|
262
278
|
{headerAction}
|
|
263
279
|
</div>
|
|
264
|
-
<div className="max-h-[min(680px,calc(100vh-7rem))] overflow-y-auto p-2">
|
|
280
|
+
<div className="min-h-0 flex-[1_1_auto] max-h-[min(680px,calc(100vh-7rem))] overflow-y-auto p-2">
|
|
265
281
|
{children}
|
|
266
282
|
</div>
|
|
267
283
|
</aside>
|
|
@@ -903,167 +919,6 @@ export function VisualSliderControl({
|
|
|
903
919
|
);
|
|
904
920
|
}
|
|
905
921
|
|
|
906
|
-
export function VisualScrubInput({
|
|
907
|
-
label,
|
|
908
|
-
value,
|
|
909
|
-
onChange,
|
|
910
|
-
min,
|
|
911
|
-
max,
|
|
912
|
-
step = 1,
|
|
913
|
-
unit,
|
|
914
|
-
disabled = false,
|
|
915
|
-
mixed = false,
|
|
916
|
-
mixedLabel = "Mixed",
|
|
917
|
-
}: {
|
|
918
|
-
label: string;
|
|
919
|
-
value: number;
|
|
920
|
-
onChange: (value: number) => void;
|
|
921
|
-
min?: number;
|
|
922
|
-
max?: number;
|
|
923
|
-
step?: number;
|
|
924
|
-
unit?: string;
|
|
925
|
-
disabled?: boolean;
|
|
926
|
-
mixed?: boolean;
|
|
927
|
-
mixedLabel?: string;
|
|
928
|
-
}) {
|
|
929
|
-
const id = useId();
|
|
930
|
-
const [draft, setDraft] = useState(() =>
|
|
931
|
-
mixed ? mixedLabel : formatNumber(value, unit),
|
|
932
|
-
);
|
|
933
|
-
const [focused, setFocused] = useState(false);
|
|
934
|
-
const [hasInteracted, setHasInteracted] = useState(false);
|
|
935
|
-
const dragRef = useRef<{
|
|
936
|
-
pointerId: number;
|
|
937
|
-
prevX: number;
|
|
938
|
-
dragged: boolean;
|
|
939
|
-
} | null>(null);
|
|
940
|
-
|
|
941
|
-
useEffect(() => {
|
|
942
|
-
if (!focused) {
|
|
943
|
-
setDraft(
|
|
944
|
-
mixed && !hasInteracted ? mixedLabel : formatNumber(value, unit),
|
|
945
|
-
);
|
|
946
|
-
}
|
|
947
|
-
}, [focused, hasInteracted, mixed, mixedLabel, unit, value]);
|
|
948
|
-
|
|
949
|
-
useEffect(() => {
|
|
950
|
-
if (mixed) setHasInteracted(false);
|
|
951
|
-
}, [mixed]);
|
|
952
|
-
|
|
953
|
-
const startInteraction = () => {
|
|
954
|
-
if (!hasInteracted) {
|
|
955
|
-
setHasInteracted(true);
|
|
956
|
-
setDraft(formatNumber(value, unit));
|
|
957
|
-
}
|
|
958
|
-
};
|
|
959
|
-
|
|
960
|
-
const commit = (nextDraft = draft) => {
|
|
961
|
-
const parsed = parseDraftNumber(nextDraft, value);
|
|
962
|
-
const next = clampNumber(parsed, min, max);
|
|
963
|
-
onChange(next);
|
|
964
|
-
setDraft(formatNumber(next, unit));
|
|
965
|
-
};
|
|
966
|
-
|
|
967
|
-
const setNext = (next: number) => {
|
|
968
|
-
const clamped = clampNumber(next, min, max);
|
|
969
|
-
onChange(clamped);
|
|
970
|
-
setDraft(formatNumber(clamped, unit));
|
|
971
|
-
};
|
|
972
|
-
|
|
973
|
-
const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
|
|
974
|
-
startInteraction();
|
|
975
|
-
if (event.key === "Enter") {
|
|
976
|
-
event.preventDefault();
|
|
977
|
-
commit();
|
|
978
|
-
event.currentTarget.blur();
|
|
979
|
-
return;
|
|
980
|
-
}
|
|
981
|
-
if (event.key === "Escape") {
|
|
982
|
-
event.preventDefault();
|
|
983
|
-
setDraft(formatNumber(value, unit));
|
|
984
|
-
event.currentTarget.blur();
|
|
985
|
-
return;
|
|
986
|
-
}
|
|
987
|
-
if (event.key === "ArrowUp" || event.key === "ArrowDown") {
|
|
988
|
-
event.preventDefault();
|
|
989
|
-
const mult =
|
|
990
|
-
event.shiftKey || event.metaKey ? 10 : event.altKey ? 0.1 : 1;
|
|
991
|
-
const direction = event.key === "ArrowUp" ? 1 : -1;
|
|
992
|
-
const base = parseDraftNumber(draft, value);
|
|
993
|
-
setNext(base + direction * step * mult);
|
|
994
|
-
}
|
|
995
|
-
};
|
|
996
|
-
|
|
997
|
-
const onPointerDown = (event: PointerEvent<HTMLLabelElement>) => {
|
|
998
|
-
if (disabled || event.button !== 0) return;
|
|
999
|
-
event.preventDefault();
|
|
1000
|
-
startInteraction();
|
|
1001
|
-
dragRef.current = {
|
|
1002
|
-
pointerId: event.pointerId,
|
|
1003
|
-
prevX: event.clientX,
|
|
1004
|
-
dragged: false,
|
|
1005
|
-
};
|
|
1006
|
-
event.currentTarget.setPointerCapture(event.pointerId);
|
|
1007
|
-
};
|
|
1008
|
-
|
|
1009
|
-
const onPointerMove = (event: PointerEvent<HTMLLabelElement>) => {
|
|
1010
|
-
const drag = dragRef.current;
|
|
1011
|
-
if (!drag || drag.pointerId !== event.pointerId) return;
|
|
1012
|
-
const delta = event.clientX - drag.prevX;
|
|
1013
|
-
if (delta === 0) return;
|
|
1014
|
-
drag.prevX = event.clientX;
|
|
1015
|
-
drag.dragged = true;
|
|
1016
|
-
const mult = event.shiftKey || event.metaKey ? 10 : event.altKey ? 0.1 : 1;
|
|
1017
|
-
setNext(value + delta * step * mult);
|
|
1018
|
-
};
|
|
1019
|
-
|
|
1020
|
-
const onPointerUp = (event: PointerEvent<HTMLLabelElement>) => {
|
|
1021
|
-
const drag = dragRef.current;
|
|
1022
|
-
if (!drag || drag.pointerId !== event.pointerId) return;
|
|
1023
|
-
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
1024
|
-
dragRef.current = null;
|
|
1025
|
-
if (!drag.dragged) {
|
|
1026
|
-
document.getElementById(id)?.focus();
|
|
1027
|
-
}
|
|
1028
|
-
};
|
|
1029
|
-
|
|
1030
|
-
return (
|
|
1031
|
-
<div className="flex items-center gap-1.5">
|
|
1032
|
-
<label
|
|
1033
|
-
htmlFor={id}
|
|
1034
|
-
onPointerDown={onPointerDown}
|
|
1035
|
-
onPointerMove={onPointerMove}
|
|
1036
|
-
onPointerUp={onPointerUp}
|
|
1037
|
-
className={cn(
|
|
1038
|
-
"flex w-8 shrink-0 cursor-ew-resize select-none items-center justify-center rounded border border-transparent px-1 text-[10px] font-semibold text-muted-foreground hover:border-border hover:bg-accent/60",
|
|
1039
|
-
disabled && "cursor-not-allowed opacity-50",
|
|
1040
|
-
)}
|
|
1041
|
-
>
|
|
1042
|
-
{label}
|
|
1043
|
-
</label>
|
|
1044
|
-
<input
|
|
1045
|
-
id={id}
|
|
1046
|
-
value={draft}
|
|
1047
|
-
disabled={disabled}
|
|
1048
|
-
onFocus={() => {
|
|
1049
|
-
setFocused(true);
|
|
1050
|
-
startInteraction();
|
|
1051
|
-
}}
|
|
1052
|
-
onBlur={() => {
|
|
1053
|
-
setFocused(false);
|
|
1054
|
-
commit();
|
|
1055
|
-
}}
|
|
1056
|
-
onChange={(event) => {
|
|
1057
|
-
startInteraction();
|
|
1058
|
-
setDraft(event.currentTarget.value);
|
|
1059
|
-
}}
|
|
1060
|
-
onKeyDown={onKeyDown}
|
|
1061
|
-
className="h-7 min-w-0 flex-1 rounded-md border border-input bg-background/70 px-2 text-right text-[11px] tabular-nums text-foreground outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring disabled:opacity-50"
|
|
1062
|
-
/>
|
|
1063
|
-
</div>
|
|
1064
|
-
);
|
|
1065
|
-
}
|
|
1066
|
-
|
|
1067
922
|
export function VisualTweakControl({
|
|
1068
923
|
tweak,
|
|
1069
924
|
value,
|