@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.
Files changed (66) hide show
  1. package/README.md +19 -0
  2. package/agent-native.eject.json +38 -0
  3. package/dist/canvas-annotations/CanvasCommentPins.d.ts +68 -0
  4. package/dist/canvas-annotations/CanvasCommentPins.d.ts.map +1 -0
  5. package/dist/canvas-annotations/CanvasCommentPins.js +513 -0
  6. package/dist/canvas-annotations/CanvasCommentPins.js.map +1 -0
  7. package/dist/canvas-annotations/DrawOverlay.d.ts +108 -0
  8. package/dist/canvas-annotations/DrawOverlay.d.ts.map +1 -0
  9. package/dist/canvas-annotations/DrawOverlay.js +746 -0
  10. package/dist/canvas-annotations/DrawOverlay.js.map +1 -0
  11. package/dist/canvas-annotations/DrawOverlay.spec.d.ts +2 -0
  12. package/dist/canvas-annotations/DrawOverlay.spec.d.ts.map +1 -0
  13. package/dist/canvas-annotations/DrawOverlay.spec.js +111 -0
  14. package/dist/canvas-annotations/DrawOverlay.spec.js.map +1 -0
  15. package/dist/canvas-annotations/index.d.ts +4 -0
  16. package/dist/canvas-annotations/index.d.ts.map +1 -0
  17. package/dist/canvas-annotations/index.js +3 -0
  18. package/dist/canvas-annotations/index.js.map +1 -0
  19. package/dist/canvas-annotations/types.d.ts +8 -0
  20. package/dist/canvas-annotations/types.d.ts.map +1 -0
  21. package/dist/canvas-annotations/types.js +2 -0
  22. package/dist/canvas-annotations/types.js.map +1 -0
  23. package/dist/canvas-interactions/canvas-interactions.d.ts +334 -0
  24. package/dist/canvas-interactions/canvas-interactions.d.ts.map +1 -0
  25. package/dist/canvas-interactions/canvas-interactions.js +451 -0
  26. package/dist/canvas-interactions/canvas-interactions.js.map +1 -0
  27. package/dist/canvas-interactions/canvas-interactions.spec.d.ts +2 -0
  28. package/dist/canvas-interactions/canvas-interactions.spec.d.ts.map +1 -0
  29. package/dist/canvas-interactions/canvas-interactions.spec.js +538 -0
  30. package/dist/canvas-interactions/canvas-interactions.spec.js.map +1 -0
  31. package/dist/canvas-interactions/index.d.ts +2 -0
  32. package/dist/canvas-interactions/index.d.ts.map +1 -0
  33. package/dist/canvas-interactions/index.js +2 -0
  34. package/dist/canvas-interactions/index.js.map +1 -0
  35. package/dist/design-tweaks/scrub-input-utils.d.ts +61 -0
  36. package/dist/design-tweaks/scrub-input-utils.d.ts.map +1 -0
  37. package/dist/design-tweaks/scrub-input-utils.js +235 -0
  38. package/dist/design-tweaks/scrub-input-utils.js.map +1 -0
  39. package/dist/design-tweaks/scrub-input.d.ts +66 -0
  40. package/dist/design-tweaks/scrub-input.d.ts.map +1 -0
  41. package/dist/design-tweaks/scrub-input.js +313 -0
  42. package/dist/design-tweaks/scrub-input.js.map +1 -0
  43. package/dist/design-tweaks/visual-style-controls.d.ts +2 -12
  44. package/dist/design-tweaks/visual-style-controls.d.ts.map +1 -1
  45. package/dist/design-tweaks/visual-style-controls.js +4 -108
  46. package/dist/design-tweaks/visual-style-controls.js.map +1 -1
  47. package/dist/design-tweaks/visual-style-controls.spec.js +26 -0
  48. package/dist/design-tweaks/visual-style-controls.spec.js.map +1 -1
  49. package/dist/index.d.ts +1 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +1 -0
  52. package/dist/index.js.map +1 -1
  53. package/package.json +29 -1
  54. package/src/canvas-annotations/CanvasCommentPins.tsx +861 -0
  55. package/src/canvas-annotations/DrawOverlay.spec.tsx +145 -0
  56. package/src/canvas-annotations/DrawOverlay.tsx +1233 -0
  57. package/src/canvas-annotations/index.ts +15 -0
  58. package/src/canvas-annotations/types.ts +14 -0
  59. package/src/canvas-interactions/canvas-interactions.spec.ts +688 -0
  60. package/src/canvas-interactions/canvas-interactions.ts +933 -0
  61. package/src/canvas-interactions/index.ts +67 -0
  62. package/src/design-tweaks/scrub-input-utils.ts +311 -0
  63. package/src/design-tweaks/scrub-input.tsx +491 -0
  64. package/src/design-tweaks/visual-style-controls.spec.tsx +60 -0
  65. package/src/design-tweaks/visual-style-controls.tsx +26 -171
  66. 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,
package/src/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from "./app-shell/index.js";
2
+ export * from "./canvas-interactions/index.js";
2
3
  export * from "./collab-ui/index.js";
3
4
  export * from "./dashboard/index.js";
4
5
  export * from "./hooks/index.js";