@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.
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 +3 -107
  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 +23 -168
  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;
@@ -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";