react-native-grab 1.0.0 → 1.1.1

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 (83) hide show
  1. package/README.md +8 -0
  2. package/dist/cjs/react-native/__tests__/grab-context-description.test.js +81 -0
  3. package/dist/cjs/react-native/__tests__/grab-context-description.test.js.map +1 -1
  4. package/dist/cjs/react-native/containers.js +107 -25
  5. package/dist/cjs/react-native/containers.js.map +1 -1
  6. package/dist/cjs/react-native/context-menu.js +229 -0
  7. package/dist/cjs/react-native/context-menu.js.map +1 -0
  8. package/dist/cjs/react-native/description.js +31 -4
  9. package/dist/cjs/react-native/description.js.map +1 -1
  10. package/dist/cjs/react-native/focus-effect.js +38 -0
  11. package/dist/cjs/react-native/focus-effect.js.map +1 -0
  12. package/dist/cjs/react-native/grab-colors.js +7 -0
  13. package/dist/cjs/react-native/grab-colors.js.map +1 -0
  14. package/dist/cjs/react-native/grab-control-bar.js +105 -0
  15. package/dist/cjs/react-native/grab-control-bar.js.map +1 -0
  16. package/dist/cjs/react-native/grab-controller.js +109 -7
  17. package/dist/cjs/react-native/grab-controller.js.map +1 -1
  18. package/dist/cjs/react-native/grab-overlay.js +216 -51
  19. package/dist/cjs/react-native/grab-overlay.js.map +1 -1
  20. package/dist/cjs/react-native/grab-root-controls.js +89 -0
  21. package/dist/cjs/react-native/grab-root-controls.js.map +1 -0
  22. package/dist/cjs/react-native/grab-root.js +8 -2
  23. package/dist/cjs/react-native/grab-root.js.map +1 -1
  24. package/dist/cjs/react-native/grab-screen.js +20 -19
  25. package/dist/cjs/react-native/grab-screen.js.map +1 -1
  26. package/dist/cjs/react-native/index.js +4 -1
  27. package/dist/cjs/react-native/index.js.map +1 -1
  28. package/dist/cjs/react-native/open.js +21 -0
  29. package/dist/cjs/react-native/open.js.map +1 -0
  30. package/dist/esm/react-native/__tests__/grab-context-description.test.js +83 -2
  31. package/dist/esm/react-native/__tests__/grab-context-description.test.js.map +1 -1
  32. package/dist/esm/react-native/containers.js +95 -20
  33. package/dist/esm/react-native/containers.js.map +1 -1
  34. package/dist/esm/react-native/context-menu.js +225 -0
  35. package/dist/esm/react-native/context-menu.js.map +1 -0
  36. package/dist/esm/react-native/description.js +28 -3
  37. package/dist/esm/react-native/description.js.map +1 -1
  38. package/dist/esm/react-native/focus-effect.js +33 -0
  39. package/dist/esm/react-native/focus-effect.js.map +1 -0
  40. package/dist/esm/react-native/grab-colors.js +4 -0
  41. package/dist/esm/react-native/grab-colors.js.map +1 -0
  42. package/dist/esm/react-native/grab-control-bar.js +101 -0
  43. package/dist/esm/react-native/grab-control-bar.js.map +1 -0
  44. package/dist/esm/react-native/grab-controller.js +100 -5
  45. package/dist/esm/react-native/grab-controller.js.map +1 -1
  46. package/dist/esm/react-native/grab-overlay.js +220 -55
  47. package/dist/esm/react-native/grab-overlay.js.map +1 -1
  48. package/dist/esm/react-native/grab-root-controls.js +85 -0
  49. package/dist/esm/react-native/grab-root-controls.js.map +1 -0
  50. package/dist/esm/react-native/grab-root.js +11 -5
  51. package/dist/esm/react-native/grab-root.js.map +1 -1
  52. package/dist/esm/react-native/grab-screen.js +23 -22
  53. package/dist/esm/react-native/grab-screen.js.map +1 -1
  54. package/dist/esm/react-native/index.js +3 -0
  55. package/dist/esm/react-native/index.js.map +1 -1
  56. package/dist/esm/react-native/open.js +14 -0
  57. package/dist/esm/react-native/open.js.map +1 -0
  58. package/dist/types/react-native/containers.d.ts +23 -4
  59. package/dist/types/react-native/containers.d.ts.map +1 -1
  60. package/dist/types/react-native/context-menu.d.ts +43 -0
  61. package/dist/types/react-native/context-menu.d.ts.map +1 -0
  62. package/dist/types/react-native/description.d.ts +5 -0
  63. package/dist/types/react-native/description.d.ts.map +1 -1
  64. package/dist/types/react-native/focus-effect.d.ts +3 -0
  65. package/dist/types/react-native/focus-effect.d.ts.map +1 -0
  66. package/dist/types/react-native/grab-colors.d.ts +4 -0
  67. package/dist/types/react-native/grab-colors.d.ts.map +1 -0
  68. package/dist/types/react-native/grab-control-bar.d.ts +13 -0
  69. package/dist/types/react-native/grab-control-bar.d.ts.map +1 -0
  70. package/dist/types/react-native/grab-controller.d.ts +18 -2
  71. package/dist/types/react-native/grab-controller.d.ts.map +1 -1
  72. package/dist/types/react-native/grab-overlay.d.ts +6 -1
  73. package/dist/types/react-native/grab-overlay.d.ts.map +1 -1
  74. package/dist/types/react-native/grab-root-controls.d.ts +2 -0
  75. package/dist/types/react-native/grab-root-controls.d.ts.map +1 -0
  76. package/dist/types/react-native/grab-root.d.ts.map +1 -1
  77. package/dist/types/react-native/grab-screen.d.ts +4 -2
  78. package/dist/types/react-native/grab-screen.d.ts.map +1 -1
  79. package/dist/types/react-native/index.d.ts +1 -0
  80. package/dist/types/react-native/index.d.ts.map +1 -1
  81. package/dist/types/react-native/open.d.ts +7 -0
  82. package/dist/types/react-native/open.d.ts.map +1 -0
  83. package/package.json +1 -1
@@ -0,0 +1,85 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback, useMemo, useRef } from "react";
3
+ import { Animated, Dimensions, PanResponder, StyleSheet, View } from "react-native";
4
+ import { useDevMenu } from "./dev-menu";
5
+ import { FullScreenOverlay } from "./full-screen-overlay";
6
+ import { enableGrabbing, toggleGrabMenu, useGrabControllerState } from "./grab-controller";
7
+ import { GrabControlBar } from "./grab-control-bar";
8
+ const BAR_HEIGHT = 36;
9
+ const BAR_WIDTH = 108;
10
+ const INITIAL_BAR_POSITION = {
11
+ x: (Dimensions.get("window").width - BAR_WIDTH) / 2,
12
+ y: 72,
13
+ };
14
+ const clamp = (value, min, max) => {
15
+ return Math.min(Math.max(value, min), max);
16
+ };
17
+ export const ReactNativeGrabRootControls = () => {
18
+ const state = useGrabControllerState();
19
+ const controlBarPosition = useRef(new Animated.ValueXY(INITIAL_BAR_POSITION)).current;
20
+ const shouldResetControlBarPositionRef = useRef(false);
21
+ const isControlBarVisible = state.isMenuVisible && state.selectionSessionOwnerId === null && state.selectedOwnerId === null;
22
+ const toggleMenuVisibility = useCallback(() => {
23
+ shouldResetControlBarPositionRef.current = state.isMenuVisible;
24
+ toggleGrabMenu();
25
+ }, [state.isMenuVisible]);
26
+ const resetControlBarPosition = useCallback(() => {
27
+ if (!shouldResetControlBarPositionRef.current) {
28
+ return;
29
+ }
30
+ shouldResetControlBarPositionRef.current = false;
31
+ controlBarPosition.setValue(INITIAL_BAR_POSITION);
32
+ }, [controlBarPosition]);
33
+ useDevMenu(toggleMenuVisibility);
34
+ const dragHandlePanResponder = useRef(PanResponder.create({
35
+ onStartShouldSetPanResponder: () => true,
36
+ onMoveShouldSetPanResponder: (_, gestureState) => Math.abs(gestureState.dx) > 2 || Math.abs(gestureState.dy) > 2,
37
+ onPanResponderGrant: () => {
38
+ controlBarPosition.stopAnimation((value) => {
39
+ controlBarPosition.setOffset(value);
40
+ controlBarPosition.setValue({ x: 0, y: 0 });
41
+ });
42
+ },
43
+ onPanResponderMove: Animated.event([null, { dx: controlBarPosition.x, dy: controlBarPosition.y }], { useNativeDriver: false }),
44
+ onPanResponderRelease: () => {
45
+ controlBarPosition.flattenOffset();
46
+ controlBarPosition.stopAnimation((value) => {
47
+ const { width, height } = Dimensions.get("window");
48
+ controlBarPosition.setValue({
49
+ x: clamp(value.x, 0, Math.max(0, width - BAR_WIDTH)),
50
+ y: clamp(value.y, 0, Math.max(0, height - BAR_HEIGHT)),
51
+ });
52
+ });
53
+ },
54
+ onPanResponderTerminate: () => {
55
+ controlBarPosition.flattenOffset();
56
+ controlBarPosition.stopAnimation((value) => {
57
+ const { width, height } = Dimensions.get("window");
58
+ controlBarPosition.setValue({
59
+ x: clamp(value.x, 0, Math.max(0, width - BAR_WIDTH)),
60
+ y: clamp(value.y, 0, Math.max(0, height - BAR_HEIGHT)),
61
+ });
62
+ });
63
+ },
64
+ })).current;
65
+ const containerStyle = useMemo(() => [
66
+ styles.controlBar,
67
+ {
68
+ transform: controlBarPosition.getTranslateTransform(),
69
+ },
70
+ ], [controlBarPosition]);
71
+ return (_jsx(FullScreenOverlay, { children: _jsx(View, { pointerEvents: "box-none", style: styles.overlayRoot, children: _jsx(GrabControlBar, { containerStyle: containerStyle, dragHandlePanHandlers: dragHandlePanResponder.panHandlers, isSessionEnabled: state.selectionSessionOwnerId !== null, isVisible: isControlBarVisible, onHidden: resetControlBarPosition, onPressHide: toggleMenuVisibility, onPressSelect: enableGrabbing }) }) }));
72
+ };
73
+ const styles = StyleSheet.create({
74
+ overlayRoot: {
75
+ ...StyleSheet.absoluteFillObject,
76
+ zIndex: 9999,
77
+ },
78
+ controlBar: {
79
+ position: "absolute",
80
+ top: 0,
81
+ left: 0,
82
+ zIndex: 2,
83
+ },
84
+ });
85
+ //# sourceMappingURL=grab-root-controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grab-root-controls.js","sourceRoot":"","sources":["../../../src/react-native/grab-root-controls.tsx"],"names":[],"mappings":"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"}
@@ -1,16 +1,22 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useRef } from "react";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
3
  import { View } from "react-native";
4
- import { setAppRootRef } from "./containers";
4
+ import { createGrabSelectionOwnerId, registerGrabSelectionOwner, unregisterGrabSelectionOwner, } from "./containers";
5
5
  import { ReactNativeGrabOverlay } from "./grab-overlay";
6
+ import { ReactNativeGrabRootControls } from "./grab-root-controls";
6
7
  export const ReactNativeGrabRoot = ({ children, style, ...props }) => {
7
8
  const rootRef = useRef(null);
9
+ const ownerIdRef = useRef(createGrabSelectionOwnerId("root"));
10
+ const [panHandlers, setPanHandlers] = useState(null);
8
11
  useEffect(() => {
9
12
  if (!rootRef.current) {
10
13
  return;
11
14
  }
12
- setAppRootRef(rootRef.current);
15
+ registerGrabSelectionOwner(ownerIdRef.current, "root", rootRef.current);
16
+ return () => {
17
+ unregisterGrabSelectionOwner(ownerIdRef.current);
18
+ };
13
19
  }, []);
14
- return (_jsxs(_Fragment, { children: [_jsx(View, { ...props, ref: rootRef, style: [{ flex: 1 }, style], children: children }), _jsx(ReactNativeGrabOverlay, {})] }));
20
+ return (_jsxs(_Fragment, { children: [_jsxs(View, { ...props, ...(panHandlers ?? {}), collapsable: false, ref: rootRef, style: [{ flex: 1 }, style], children: [children, _jsx(ReactNativeGrabOverlay, { ownerId: ownerIdRef.current, onPanHandlersChange: setPanHandlers })] }), _jsx(ReactNativeGrabRootControls, {})] }));
15
21
  };
16
22
  //# sourceMappingURL=grab-root.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"grab-root.js","sourceRoot":"","sources":["../../../src/react-native/grab-root.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAa,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,EAA4B,EAAE,EAAE;IAC7F,MAAM,OAAO,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAE1C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,8BACE,KAAC,IAAI,OAAK,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,YACvD,QAAQ,GACJ,EAEP,KAAC,sBAAsB,KAAG,IACzB,CACJ,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"grab-root.js","sourceRoot":"","sources":["../../../src/react-native/grab-root.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,IAAI,EAA4C,MAAM,cAAc,CAAC;AAC9E,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAInE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,EAA4B,EAAE,EAAE;IAC7F,MAAM,OAAO,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAkC,IAAI,CAAC,CAAC;IAEtF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,0BAA0B,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACxE,OAAO,GAAG,EAAE;YACV,4BAA4B,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,8BACE,MAAC,IAAI,OACC,KAAK,KACL,CAAC,WAAW,IAAI,EAAE,CAAC,EACvB,WAAW,EAAE,KAAK,EAClB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,aAE1B,QAAQ,EACT,KAAC,sBAAsB,IAAC,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,mBAAmB,EAAE,cAAc,GAAI,IACvF,EAEP,KAAC,2BAA2B,KAAG,IAC9B,CACJ,CAAC;AACJ,CAAC,CAAC"}
@@ -1,31 +1,32 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useCallback, useRef } from "react";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
3
  import { View } from "react-native";
4
- import { setFocusedScreenRef } from "./containers";
5
- const getFocusEffectImpl = () => {
6
- try {
7
- return require("expo-router").useFocusEffect;
8
- }
9
- catch {
10
- // Nothing we can do about it, it's not installed in the project.
11
- }
12
- try {
13
- return require("@react-navigation/native").useFocusEffect;
14
- }
15
- catch {
16
- // Nothing we can do about it, it's not installed in the project.
17
- }
18
- throw new Error("No useFocusEffect implementation found");
19
- };
20
- const useFocusEffect = getFocusEffectImpl();
21
- export const ReactNativeGrabScreen = ({ children, style, ...props }) => {
4
+ import { clearGrabSelectionOwnerFocus, createGrabSelectionOwnerId, registerGrabSelectionOwner, setGrabSelectionOwnerFocused, unregisterGrabSelectionOwner, } from "./containers";
5
+ import { getFocusEffect } from "./focus-effect";
6
+ import { ReactNativeGrabOverlay } from "./grab-overlay";
7
+ const useFocusEffect = getFocusEffect();
8
+ export const ReactNativeGrabScreen = ({ children, style, id, ...props }) => {
22
9
  const screenRef = useRef(null);
10
+ const ownerIdRef = useRef(id ?? createGrabSelectionOwnerId("screen"));
11
+ const [panHandlers, setPanHandlers] = useState(null);
12
+ useEffect(() => {
13
+ if (!screenRef.current) {
14
+ return;
15
+ }
16
+ registerGrabSelectionOwner(ownerIdRef.current, "screen", screenRef.current);
17
+ return () => {
18
+ unregisterGrabSelectionOwner(ownerIdRef.current);
19
+ };
20
+ }, []);
23
21
  useFocusEffect(useCallback(() => {
24
22
  if (!screenRef.current) {
25
23
  return;
26
24
  }
27
- setFocusedScreenRef(screenRef.current);
25
+ setGrabSelectionOwnerFocused(ownerIdRef.current, true);
26
+ return () => {
27
+ clearGrabSelectionOwnerFocus(ownerIdRef.current);
28
+ };
28
29
  }, []));
29
- return (_jsx(View, { ...props, ref: screenRef, style: [{ flex: 1 }, style], children: children }));
30
+ return (_jsxs(View, { ...props, ...(panHandlers ?? {}), collapsable: false, ref: screenRef, style: [{ flex: 1 }, style], children: [children, _jsx(ReactNativeGrabOverlay, { ownerId: ownerIdRef.current, onPanHandlersChange: setPanHandlers })] }));
30
31
  };
31
32
  //# sourceMappingURL=grab-screen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"grab-screen.js","sourceRoot":"","sources":["../../../src/react-native/grab-screen.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAkB,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,kBAAkB,GAAG,GAA+B,EAAE;IAC1D,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,aAAa,CAAC,CAAC,cAAc,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;IAED,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,0BAA0B,CAAC,CAAC,cAAc,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,kBAAkB,EAAE,CAAC;AAI5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EACpC,QAAQ,EACR,KAAK,EACL,GAAG,KAAK,EACmB,EAAE,EAAE;IAC/B,MAAM,SAAS,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAE5C,cAAc,CACZ,WAAW,CAAC,GAAG,EAAE;QACf,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,mBAAmB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC,EAAE,EAAE,CAAC,CACP,CAAC;IAEF,OAAO,CACL,KAAC,IAAI,OAAK,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,YACzD,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"grab-screen.js","sourceRoot":"","sources":["../../../src/react-native/grab-screen.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,IAAI,EAAiD,MAAM,cAAc,CAAC;AACnF,OAAO,EACL,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,cAAc,GAAG,cAAc,EAAE,CAAC;AAMxC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EACpC,QAAQ,EACR,KAAK,EACL,EAAE,EACF,GAAG,KAAK,EACmB,EAAE,EAAE;IAC/B,MAAM,SAAS,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,IAAI,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAkC,IAAI,CAAC,CAAC;IAEtF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,0BAA0B,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5E,OAAO,GAAG,EAAE;YACV,4BAA4B,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,cAAc,CACZ,WAAW,CAAC,GAAG,EAAE;QACf,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,4BAA4B,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACvD,OAAO,GAAG,EAAE;YACV,4BAA4B,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CACP,CAAC;IAEF,OAAO,CACL,MAAC,IAAI,OACC,KAAK,KACL,CAAC,WAAW,IAAI,EAAE,CAAC,EACvB,WAAW,EAAE,KAAK,EAClB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,aAE1B,QAAQ,EACT,KAAC,sBAAsB,IAAC,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,mBAAmB,EAAE,cAAc,GAAI,IACvF,CACR,CAAC;AACJ,CAAC,CAAC"}
@@ -10,4 +10,7 @@ export const ReactNativeGrabContextProvider = __DEV__ ? require("./grab-context"
10
10
  export const enableGrabbing = __DEV__
11
11
  ? require("./grab-controller").enableGrabbing
12
12
  : noop;
13
+ export const setFocusEffect = __DEV__
14
+ ? require("./focus-effect").setFocusEffect
15
+ : noop;
13
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react-native/index.ts"],"names":[],"mappings":"AAeA,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;AACtB,MAAM,WAAW,GAAG,CAAC,EAAE,QAAQ,EAA4B,EAAE,EAAE,CAAC,QAAQ,CAAC;AAEzE,MAAM,CAAC,MAAM,mBAAmB,GAAkD,OAAO;IACvF,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,mBAAmB;IAC5C,CAAC,CAAC,WAAW,CAAC;AAEhB,MAAM,CAAC,MAAM,qBAAqB,GAAoD,OAAO;IAC3F,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,qBAAqB;IAChD,CAAC,CAAC,WAAW,CAAC;AAEhB,MAAM,CAAC,MAAM,8BAA8B,GACzC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,WAAW,CAAC;AAEnF,MAAM,CAAC,MAAM,cAAc,GAAe,OAAO;IAC/C,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,cAAc;IAC7C,CAAC,CAAC,IAAI,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react-native/index.ts"],"names":[],"mappings":"AAYA,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;AACtB,MAAM,WAAW,GAAG,CAAC,EAAE,QAAQ,EAA4B,EAAE,EAAE,CAAC,QAAQ,CAAC;AAEzE,MAAM,CAAC,MAAM,mBAAmB,GAAkD,OAAO;IACvF,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,mBAAmB;IAC5C,CAAC,CAAC,WAAW,CAAC;AAEhB,MAAM,CAAC,MAAM,qBAAqB,GAAoD,OAAO;IAC3F,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,qBAAqB;IAChD,CAAC,CAAC,WAAW,CAAC;AAEhB,MAAM,CAAC,MAAM,8BAA8B,GACzC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,WAAW,CAAC;AAEnF,MAAM,CAAC,MAAM,cAAc,GAAe,OAAO;IAC/C,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,cAAc;IAC7C,CAAC,CAAC,IAAI,CAAC;AAET,MAAM,CAAC,MAAM,cAAc,GAA6C,OAAO;IAC7E,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,cAAc;IAC1C,CAAC,CAAC,IAAI,CAAC"}
@@ -0,0 +1,14 @@
1
+ import getDevServer from "react-native/Libraries/Core/Devtools/getDevServer";
2
+ export const openStackFrameInEditor = async (payload) => {
3
+ const response = await fetch(`${getDevServer().url}open-stack-frame`, {
4
+ method: "POST",
5
+ headers: {
6
+ "Content-Type": "application/json",
7
+ },
8
+ body: JSON.stringify(payload),
9
+ });
10
+ if (!response.ok) {
11
+ throw new Error(`Open stack frame request failed with status ${response.status}`);
12
+ }
13
+ };
14
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/react-native/open.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,mDAAmD,CAAC;AAO7E,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EAAE,OAAyB,EAAiB,EAAE;IACvF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,YAAY,EAAE,CAAC,GAAG,kBAAkB,EAAE;QACpE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,+CAA+C,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACpF,CAAC;AACH,CAAC,CAAC"}
@@ -1,7 +1,26 @@
1
1
  import { type ReactNativeElement } from "react-native";
2
2
  import type { ReactNativeShadowNode } from "./types";
3
- export declare const setFocusedScreenRef: (ref: ReactNativeElement) => void;
4
- export declare const setAppRootRef: (ref: ReactNativeElement) => void;
5
- export declare const getAppRootShadowNode: () => ReactNativeShadowNode;
6
- export declare const getFocusedScreenShadowNode: () => unknown;
3
+ export type GrabSelectionOwnerKind = "root" | "screen";
4
+ export type GrabSelectionOwner = {
5
+ id: string;
6
+ kind: GrabSelectionOwnerKind;
7
+ shadowNode: ReactNativeShadowNode;
8
+ registrationOrder: number;
9
+ };
10
+ type SelectionOwnersStoreSnapshot = {
11
+ owners: Map<string, GrabSelectionOwner>;
12
+ focusedScreenOwnerId: string | null;
13
+ };
14
+ export declare const createGrabSelectionOwnerId: (kind: GrabSelectionOwnerKind) => string;
15
+ export declare const registerGrabSelectionOwner: (id: string, kind: GrabSelectionOwnerKind, ref: ReactNativeElement) => void;
16
+ export declare const unregisterGrabSelectionOwner: (id: string) => void;
17
+ export declare const setGrabSelectionOwnerFocused: (id: string, isFocused: boolean) => void;
18
+ export declare const clearGrabSelectionOwnerFocus: (id: string) => void;
19
+ export declare const getGrabSelectionOwner: (id: string) => GrabSelectionOwner | null;
20
+ export declare const getResolvedGrabSelectionOwner: () => GrabSelectionOwner | null;
21
+ export declare const getResolvedGrabSelectionOwnerId: () => string | null;
22
+ export declare const useResolvedGrabSelectionOwnerId: () => string | null;
23
+ export declare const useIsResolvedGrabSelectionOwner: (id: string) => boolean;
24
+ export declare const useSelectionOwnersStore: () => SelectionOwnersStoreSnapshot;
25
+ export {};
7
26
  //# sourceMappingURL=containers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"containers.d.ts","sourceRoot":"","sources":["../../../src/react-native/containers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAMrD,eAAO,MAAM,mBAAmB,GAAI,KAAK,kBAAkB,SAS1D,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,KAAK,kBAAkB,SASpD,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAO,qBAMvC,CAAC;AACF,eAAO,MAAM,0BAA0B,eAOtC,CAAC"}
1
+ {"version":3,"file":"containers.d.ts","sourceRoot":"","sources":["../../../src/react-native/containers.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAGrD,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,sBAAsB,CAAC;IAC7B,UAAU,EAAE,qBAAqB,CAAC;IAClC,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,KAAK,4BAA4B,GAAG;IAClC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACxC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC,CAAC;AA2CF,eAAO,MAAM,0BAA0B,GAAI,MAAM,sBAAsB,WAGtE,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,IAAI,MAAM,EACV,MAAM,sBAAsB,EAC5B,KAAK,kBAAkB,SAiBxB,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,IAAI,MAAM,SAatD,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,IAAI,MAAM,EAAE,WAAW,OAAO,SAa1E,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,IAAI,MAAM,SAOtD,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,IAAI,MAAM,KAAG,kBAAkB,GAAG,IAEvE,CAAC;AAEF,eAAO,MAAM,6BAA6B,QAAO,kBAAkB,GAAG,IASrE,CAAC;AAEF,eAAO,MAAM,+BAA+B,QAAO,MAAM,GAAG,IAE3D,CAAC;AAEF,eAAO,MAAM,+BAA+B,qBAM3C,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAAI,IAAI,MAAM,YAMzD,CAAC;AAEF,eAAO,MAAM,uBAAuB,oCAEnC,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { type ReactNode } from "react";
2
+ export type ContextMenuAnchor = {
3
+ x: number;
4
+ y: number;
5
+ };
6
+ export type ContextMenuCutout = {
7
+ x: number;
8
+ y: number;
9
+ width: number;
10
+ height: number;
11
+ };
12
+ export type ContextMenuBounds = {
13
+ width: number;
14
+ height: number;
15
+ };
16
+ export type ContextMenuHorizontalAlignment = "left" | "center" | "right";
17
+ export type ContextMenuVerticalAlignment = "top" | "center" | "bottom";
18
+ export type ContextMenuOffset = {
19
+ x: number;
20
+ y: number;
21
+ };
22
+ export type ContextMenuProps = {
23
+ anchor: ContextMenuAnchor | null;
24
+ bounds?: ContextMenuBounds | null;
25
+ children?: ReactNode;
26
+ cutout?: ContextMenuCutout | null;
27
+ horizontalAlignment?: ContextMenuHorizontalAlignment;
28
+ offset?: ContextMenuOffset;
29
+ onClose: () => void;
30
+ verticalAlignment?: ContextMenuVerticalAlignment;
31
+ visible: boolean;
32
+ };
33
+ export type ContextMenuItemProps = {
34
+ children: ReactNode;
35
+ destructive?: boolean;
36
+ disabled?: boolean;
37
+ onPress: () => void;
38
+ };
39
+ export declare const ContextMenu: {
40
+ ({ anchor, bounds, children, cutout, horizontalAlignment, offset, onClose, verticalAlignment, visible, }: ContextMenuProps): import("react/jsx-runtime").JSX.Element | null;
41
+ Item: ({ children, destructive, disabled, onPress, }: ContextMenuItemProps) => import("react/jsx-runtime").JSX.Element;
42
+ };
43
+ //# sourceMappingURL=context-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-menu.d.ts","sourceRoot":"","sources":["../../../src/react-native/context-menu.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAcf,MAAM,MAAM,iBAAiB,GAAG;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AACzE,MAAM,MAAM,4BAA4B,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACvE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAQF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC,mBAAmB,CAAC,EAAE,8BAA8B,CAAC;IACrD,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,iBAAiB,CAAC,EAAE,4BAA4B,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AA0FF,eAAO,MAAM,WAAW;8GAUrB,gBAAgB;0DApChB,oBAAoB;CAuNtB,CAAC"}
@@ -1,3 +1,8 @@
1
1
  import { ReactNativeFiberNode } from "./types";
2
+ import type { RenderedByFrame } from "./get-rendered-by";
3
+ /** Owner names treated as host-like when resolving `Text (in Owner)` for the grab menu. */
4
+ export declare const GRAB_HOST_LIKE_COMPONENT_NAMES: readonly ["View", "Text"];
5
+ export declare const isHostLikeComponentName: (name: string) => boolean;
6
+ export declare const getGrabSelectionTitle: (node: ReactNativeFiberNode, renderedBy: RenderedByFrame[]) => string;
2
7
  export declare const getDescription: (node: ReactNativeFiberNode) => Promise<string>;
3
8
  //# sourceMappingURL=description.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"description.d.ts","sourceRoot":"","sources":["../../../src/react-native/description.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAkN/C,eAAO,MAAM,cAAc,GAAU,MAAM,oBAAoB,KAAG,OAAO,CAAC,MAAM,CAS/E,CAAC"}
1
+ {"version":3,"file":"description.d.ts","sourceRoot":"","sources":["../../../src/react-native/description.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAkBzD,2FAA2F;AAC3F,eAAO,MAAM,8BAA8B,2BAA4B,CAAC;AAIxE,eAAO,MAAM,uBAAuB,GAAI,MAAM,MAAM,KAAG,OAClB,CAAC;AA4MtC,eAAO,MAAM,qBAAqB,GAChC,MAAM,oBAAoB,EAC1B,YAAY,eAAe,EAAE,KAC5B,MAWF,CAAC;AAEF,eAAO,MAAM,cAAc,GAAU,MAAM,oBAAoB,KAAG,OAAO,CAAC,MAAM,CAS/E,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const getFocusEffect: () => ((cb: () => void) => void);
2
+ export declare const setFocusEffect: (impl: (cb: () => void) => void) => void;
3
+ //# sourceMappingURL=focus-effect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-effect.d.ts","sourceRoot":"","sources":["../../../src/react-native/focus-effect.ts"],"names":[],"mappings":"AA8BA,eAAO,MAAM,cAAc,QAAO,CAAC,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAM1D,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,SAE5D,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const GRAB_PRIMARY = "#8232FF";
2
+ export declare const GRAB_HIGHLIGHT_FILL = "rgba(130, 50, 255, 0.2)";
3
+ export declare const GRAB_BADGE_BACKGROUND = "rgba(130, 50, 255, 0.92)";
4
+ //# sourceMappingURL=grab-colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grab-colors.d.ts","sourceRoot":"","sources":["../../../src/react-native/grab-colors.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,mBAAmB,4BAA4B,CAAC;AAC7D,eAAO,MAAM,qBAAqB,6BAA6B,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { GestureResponderHandlers, type StyleProp, type ViewStyle } from "react-native";
2
+ export type GrabControlBarProps = {
3
+ dragHandlePanHandlers?: GestureResponderHandlers;
4
+ isSessionEnabled: boolean;
5
+ isVisible: boolean;
6
+ onHidden?: () => void;
7
+ onPressHide: () => void;
8
+ onPressSelect: () => void;
9
+ containerStyle?: StyleProp<ViewStyle>;
10
+ style?: StyleProp<ViewStyle>;
11
+ };
12
+ export declare const GrabControlBar: ({ dragHandlePanHandlers, isSessionEnabled, isVisible, onHidden, onPressHide, onPressSelect, containerStyle, style, }: GrabControlBarProps) => import("react/jsx-runtime").JSX.Element | null;
13
+ //# sourceMappingURL=grab-control-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grab-control-bar.d.ts","sourceRoot":"","sources":["../../../src/react-native/grab-control-bar.tsx"],"names":[],"mappings":"AACA,OAAO,EAGL,wBAAwB,EAKxB,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AActB,MAAM,MAAM,mBAAmB,GAAG;IAChC,qBAAqB,CAAC,EAAE,wBAAwB,CAAC;IACjD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,sHAS5B,mBAAmB,mDA+FrB,CAAC"}
@@ -1,5 +1,21 @@
1
- type EnableGrabbingHandler = () => void;
2
- export declare const setEnableGrabbingHandler: (handler: EnableGrabbingHandler | null) => void;
1
+ type LocalGrabSelectionController = {
2
+ closeSelectionMenu: () => void;
3
+ startSelection: () => void;
4
+ stopSelection: () => void;
5
+ };
6
+ type GrabControllerState = {
7
+ isMenuVisible: boolean;
8
+ selectedOwnerId: string | null;
9
+ selectionSessionOwnerId: string | null;
10
+ };
11
+ export declare const registerLocalGrabSelectionController: (ownerId: string, controller: LocalGrabSelectionController) => void;
12
+ export declare const unregisterLocalGrabSelectionController: (ownerId: string) => void;
13
+ export declare const useGrabControllerState: () => GrabControllerState;
14
+ export declare const setGrabSelectionSessionOwner: (ownerId: string | null) => void;
15
+ export declare const showGrabSelectionMenu: (ownerId: string) => void;
16
+ export declare const hideGrabSelectionMenu: (ownerId: string) => void;
17
+ export declare const clearGrabOwnerPresentation: (ownerId: string) => void;
3
18
  export declare const enableGrabbing: () => void;
19
+ export declare const toggleGrabMenu: () => void;
4
20
  export {};
5
21
  //# sourceMappingURL=grab-controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"grab-controller.d.ts","sourceRoot":"","sources":["../../../src/react-native/grab-controller.ts"],"names":[],"mappings":"AAAA,KAAK,qBAAqB,GAAG,MAAM,IAAI,CAAC;AAIxC,eAAO,MAAM,wBAAwB,GAAI,SAAS,qBAAqB,GAAG,IAAI,SAE7E,CAAC;AAEF,eAAO,MAAM,cAAc,YAS1B,CAAC"}
1
+ {"version":3,"file":"grab-controller.d.ts","sourceRoot":"","sources":["../../../src/react-native/grab-controller.ts"],"names":[],"mappings":"AAGA,KAAK,4BAA4B,GAAG;IAClC,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC,CAAC;AAsCF,eAAO,MAAM,oCAAoC,GAC/C,SAAS,MAAM,EACf,YAAY,4BAA4B,SAGzC,CAAC;AAEF,eAAO,MAAM,sCAAsC,GAAI,SAAS,MAAM,SASrE,CAAC;AAEF,eAAO,MAAM,sBAAsB,2BAMlC,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,SAAS,MAAM,GAAG,IAAI,SAKlE,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,SAAS,MAAM,SAOpD,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,SAAS,MAAM,SAKpD,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,SAAS,MAAM,SAOzD,CAAC;AAEF,eAAO,MAAM,cAAc,YAwB1B,CAAC;AAEF,eAAO,MAAM,cAAc,YAiB1B,CAAC"}
@@ -1,2 +1,7 @@
1
- export declare const ReactNativeGrabOverlay: () => import("react/jsx-runtime").JSX.Element;
1
+ import { type GestureResponderHandlers } from "react-native";
2
+ export type ReactNativeGrabOverlayProps = {
3
+ ownerId: string;
4
+ onPanHandlersChange?: (panHandlers: GestureResponderHandlers | null) => void;
5
+ };
6
+ export declare const ReactNativeGrabOverlay: ({ ownerId, onPanHandlersChange, }: ReactNativeGrabOverlayProps) => import("react/jsx-runtime").JSX.Element | null;
2
7
  //# sourceMappingURL=grab-overlay.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"grab-overlay.d.ts","sourceRoot":"","sources":["../../../src/react-native/grab-overlay.tsx"],"names":[],"mappings":"AAqBA,eAAO,MAAM,sBAAsB,+CAiLlC,CAAC"}
1
+ {"version":3,"file":"grab-overlay.d.ts","sourceRoot":"","sources":["../../../src/react-native/grab-overlay.tsx"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,wBAAwB,EAC9B,MAAM,cAAc,CAAC;AAiCtB,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,wBAAwB,GAAG,IAAI,KAAK,IAAI,CAAC;CAC9E,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,mCAGpC,2BAA2B,mDA6W7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const ReactNativeGrabRootControls: () => import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=grab-root-controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grab-root-controls.d.ts","sourceRoot":"","sources":["../../../src/react-native/grab-root-controls.tsx"],"names":[],"mappings":"AAkBA,eAAO,MAAM,2BAA2B,+CAyFvC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"grab-root.d.ts","sourceRoot":"","sources":["../../../src/react-native/grab-root.tsx"],"names":[],"mappings":"AACA,OAAO,EAAQ,SAAS,EAAE,MAAM,cAAc,CAAC;AAI/C,MAAM,MAAM,wBAAwB,GAAG,SAAS,CAAC;AAEjD,eAAO,MAAM,mBAAmB,GAAI,+BAA+B,wBAAwB,4CAoB1F,CAAC"}
1
+ {"version":3,"file":"grab-root.d.ts","sourceRoot":"","sources":["../../../src/react-native/grab-root.tsx"],"names":[],"mappings":"AACA,OAAO,EAAQ,SAAS,EAAiC,MAAM,cAAc,CAAC;AAS9E,MAAM,MAAM,wBAAwB,GAAG,SAAS,CAAC;AAEjD,eAAO,MAAM,mBAAmB,GAAI,+BAA+B,wBAAwB,4CAgC1F,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import { type ViewProps } from "react-native";
2
- export type ReactNativeGrabScreenProps = ViewProps;
3
- export declare const ReactNativeGrabScreen: ({ children, style, ...props }: ReactNativeGrabScreenProps) => import("react/jsx-runtime").JSX.Element;
2
+ export type ReactNativeGrabScreenProps = ViewProps & {
3
+ id?: string;
4
+ };
5
+ export declare const ReactNativeGrabScreen: ({ children, style, id, ...props }: ReactNativeGrabScreenProps) => import("react/jsx-runtime").JSX.Element;
4
6
  //# sourceMappingURL=grab-screen.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"grab-screen.d.ts","sourceRoot":"","sources":["../../../src/react-native/grab-screen.tsx"],"names":[],"mappings":"AACA,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAqBpD,MAAM,MAAM,0BAA0B,GAAG,SAAS,CAAC;AAEnD,eAAO,MAAM,qBAAqB,GAAI,+BAInC,0BAA0B,4CAkB5B,CAAC"}
1
+ {"version":3,"file":"grab-screen.d.ts","sourceRoot":"","sources":["../../../src/react-native/grab-screen.tsx"],"names":[],"mappings":"AACA,OAAO,EAAuC,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAanF,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG;IACnD,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,mCAKnC,0BAA0B,4CAyC5B,CAAC"}
@@ -8,4 +8,5 @@ export declare const ReactNativeGrabRoot: React.ComponentType<ReactNativeGrabRoo
8
8
  export declare const ReactNativeGrabScreen: React.ComponentType<ReactNativeGrabScreenProps>;
9
9
  export declare const ReactNativeGrabContextProvider: React.ComponentType<ReactNativeGrabContextProviderProps>;
10
10
  export declare const enableGrabbing: () => void;
11
+ export declare const setFocusEffect: (impl: (cb: () => void) => void) => void;
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react-native/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,KAAK,EACV,mCAAmC,EAEpC,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,YAAY,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAChE,YAAY,EACV,mCAAmC,EACnC,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AAKxB,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,aAAa,CAAC,wBAAwB,CAE/D,CAAC;AAEhB,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,CAEnE,CAAC;AAEhB,eAAO,MAAM,8BAA8B,EAAE,KAAK,CAAC,aAAa,CAAC,mCAAmC,CAClB,CAAC;AAEnF,eAAO,MAAM,cAAc,EAAE,MAAM,IAE3B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react-native/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,gBAAgB,CAAC;AAG1E,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,YAAY,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAChE,YAAY,EACV,mCAAmC,EACnC,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AAKxB,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,aAAa,CAAC,wBAAwB,CAE/D,CAAC;AAEhB,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,CAEnE,CAAC;AAEhB,eAAO,MAAM,8BAA8B,EAAE,KAAK,CAAC,aAAa,CAAC,mCAAmC,CAClB,CAAC;AAEnF,eAAO,MAAM,cAAc,EAAE,MAAM,IAE3B,CAAC;AAET,eAAO,MAAM,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,KAAK,IAEzD,CAAC"}
@@ -0,0 +1,7 @@
1
+ type OpenFramePayload = {
2
+ file: string;
3
+ lineNumber: number;
4
+ };
5
+ export declare const openStackFrameInEditor: (payload: OpenFramePayload) => Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=open.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/react-native/open.ts"],"names":[],"mappings":"AAEA,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAU,SAAS,gBAAgB,KAAG,OAAO,CAAC,IAAI,CAYpF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-grab",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "Touch-to-grab context for React Native agents.",
5
5
  "keywords": [
6
6
  "devtools",