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
@@ -1,9 +1,11 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { getDescription } from "../description";
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { getDescription, getGrabSelectionTitle, GRAB_HOST_LIKE_COMPONENT_NAMES, isHostLikeComponentName, } from "../description";
3
3
  import { composeGrabContextValue, ReactNativeGrabInternalContext } from "../grab-context";
4
4
  vi.mock("../get-rendered-by", () => ({
5
5
  getRenderedBy: vi.fn(async () => []),
6
6
  }));
7
+ import { getRenderedBy } from "../get-rendered-by";
8
+ const mockedGetRenderedBy = vi.mocked(getRenderedBy);
7
9
  const createHostFiber = (props, parent = null) => ({
8
10
  type: "Text",
9
11
  memoizedProps: props,
@@ -20,6 +22,74 @@ const createContextProviderFiber = (value, parent = null) => ({
20
22
  _debugStack: new Error(),
21
23
  _debugOwner: null,
22
24
  });
25
+ const frame = (name) => ({
26
+ name,
27
+ file: null,
28
+ line: null,
29
+ column: null,
30
+ collapse: false,
31
+ });
32
+ describe("isHostLikeComponentName", () => {
33
+ it("treats View and Text as host-like", () => {
34
+ for (const name of GRAB_HOST_LIKE_COMPONENT_NAMES) {
35
+ expect(isHostLikeComponentName(name)).toBe(true);
36
+ }
37
+ expect(isHostLikeComponentName("InstallTabs")).toBe(false);
38
+ });
39
+ it("trims names before matching", () => {
40
+ expect(isHostLikeComponentName(" Text ")).toBe(true);
41
+ });
42
+ });
43
+ describe("getGrabSelectionTitle", () => {
44
+ it("skips host-like owners to show Text (in InstallTabs)", () => {
45
+ const fiber = createHostFiber({ children: "x" });
46
+ expect(getGrabSelectionTitle(fiber, [frame("Text"), frame("InstallTabs")])).toBe("Text (in InstallTabs)");
47
+ });
48
+ it("skips multiple host-like owners", () => {
49
+ const viewFiber = {
50
+ type: "View",
51
+ memoizedProps: {},
52
+ return: null,
53
+ stateNode: null,
54
+ _debugStack: new Error(),
55
+ _debugOwner: null,
56
+ };
57
+ expect(getGrabSelectionTitle(viewFiber, [frame("View"), frame("Text"), frame("Screen")])).toBe("View (in Screen)");
58
+ });
59
+ it("returns host only when every owner is host-like", () => {
60
+ const viewFiber = {
61
+ type: "View",
62
+ memoizedProps: {},
63
+ return: null,
64
+ stateNode: null,
65
+ _debugStack: new Error(),
66
+ _debugOwner: null,
67
+ };
68
+ expect(getGrabSelectionTitle(viewFiber, [frame("View"), frame("Text")])).toBe("View");
69
+ });
70
+ it("returns Selected element when host is unknown", () => {
71
+ const fiber = {
72
+ type: () => null,
73
+ memoizedProps: {},
74
+ return: null,
75
+ stateNode: null,
76
+ _debugStack: new Error(),
77
+ _debugOwner: null,
78
+ };
79
+ expect(getGrabSelectionTitle(fiber, [])).toBe("Selected element");
80
+ });
81
+ it("uses host-like name from renderedBy when the fiber has no string host", () => {
82
+ const fiber = {
83
+ type: () => null,
84
+ memoizedProps: {},
85
+ return: null,
86
+ stateNode: null,
87
+ _debugStack: new Error(),
88
+ _debugOwner: null,
89
+ };
90
+ expect(getGrabSelectionTitle(fiber, [frame("Text"), frame("InstallTabs")])).toBe("Text (in InstallTabs)");
91
+ });
92
+ });
23
93
  describe("composeGrabContextValue", () => {
24
94
  it("returns shallow copy when parent context does not exist", () => {
25
95
  const result = composeGrabContextValue(null, { screen: "home", attempt: 1 });
@@ -36,6 +106,10 @@ describe("composeGrabContextValue", () => {
36
106
  });
37
107
  });
38
108
  describe("getDescription with grab context", () => {
109
+ beforeEach(() => {
110
+ mockedGetRenderedBy.mockReset();
111
+ mockedGetRenderedBy.mockResolvedValue([]);
112
+ });
39
113
  it("keeps current output format when no context provider is in ancestors", async () => {
40
114
  const selectedFiber = createHostFiber({ children: "Hello" });
41
115
  const description = await getDescription(selectedFiber);
@@ -43,6 +117,13 @@ describe("getDescription with grab context", () => {
43
117
  expect(description).toContain("Hello");
44
118
  expect(description).not.toContain("Context:");
45
119
  });
120
+ it("uses first non-host-like renderedBy name for the preview tag", async () => {
121
+ mockedGetRenderedBy.mockResolvedValue([frame("Text"), frame("InstallTabs")]);
122
+ const selectedFiber = createHostFiber({ children: "Hello" });
123
+ const description = await getDescription(selectedFiber);
124
+ expect(description.startsWith("<InstallTabs")).toBe(true);
125
+ expect(description).toContain("Hello");
126
+ });
46
127
  it("appends Context block from nearest provider value", async () => {
47
128
  const parentProvider = createContextProviderFiber({ screen: "home", locale: "en" });
48
129
  const childProvider = createContextProviderFiber({ locale: "pl", section: "cta" }, parentProvider);
@@ -1 +1 @@
1
- {"version":3,"file":"grab-context-description.test.js","sourceRoot":"","sources":["../../../../src/react-native/__tests__/grab-context-description.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grab-context-description.test.js","sourceRoot":"","sources":["../../../../src/react-native/__tests__/grab-context-description.test.ts"],"names":[],"mappings":"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"}
@@ -1,34 +1,109 @@
1
+ import { useSyncExternalStore } from "react";
1
2
  import { findNodeHandle } from "react-native";
2
3
  import { getFabricUIManager } from "./fabric";
3
- let focusedScreenShadowNode = null;
4
- let appRootShadowNode = null;
5
- export const setFocusedScreenRef = (ref) => {
6
- // @ts-expect-error - findNodeHandle is not typed correctly
7
- const nativeTag = findNodeHandle(ref);
8
- if (!nativeTag) {
9
- throw new Error("Failed to find native tag for focused screen");
4
+ let ownerIdCounter = 0;
5
+ let registrationOrder = 0;
6
+ let focusedScreenOwnerId = null;
7
+ const owners = new Map();
8
+ const listeners = new Set();
9
+ const notify = () => {
10
+ for (const listener of listeners) {
11
+ listener();
10
12
  }
11
- focusedScreenShadowNode = getFabricUIManager().findShadowNodeByTag_DEPRECATED(nativeTag);
12
13
  };
13
- export const setAppRootRef = (ref) => {
14
+ const subscribe = (listener) => {
15
+ listeners.add(listener);
16
+ return () => {
17
+ listeners.delete(listener);
18
+ };
19
+ };
20
+ const getSnapshot = () => ({
21
+ owners: new Map(owners),
22
+ focusedScreenOwnerId,
23
+ });
24
+ const getOwnerShadowNode = (ref, errorMessage) => {
14
25
  // @ts-expect-error - findNodeHandle is not typed correctly
15
26
  const nativeTag = findNodeHandle(ref);
16
27
  if (!nativeTag) {
17
- throw new Error("Failed to find native tag for app root");
28
+ throw new Error(errorMessage);
18
29
  }
19
- appRootShadowNode = getFabricUIManager().findShadowNodeByTag_DEPRECATED(nativeTag);
30
+ return getFabricUIManager().findShadowNodeByTag_DEPRECATED(nativeTag);
31
+ };
32
+ const getFallbackRootOwner = () => {
33
+ const rootOwners = Array.from(owners.values()).filter((owner) => owner.kind === "root");
34
+ rootOwners.sort((left, right) => right.registrationOrder - left.registrationOrder);
35
+ return rootOwners[0] ?? null;
20
36
  };
21
- export const getAppRootShadowNode = () => {
22
- if (!appRootShadowNode) {
23
- throw new Error("You seem to forgot to wrap your app root with ReactNativeGrabRoot.");
37
+ export const createGrabSelectionOwnerId = (kind) => {
38
+ ownerIdCounter += 1;
39
+ return `react-native-grab-${kind}-${ownerIdCounter}`;
40
+ };
41
+ export const registerGrabSelectionOwner = (id, kind, ref) => {
42
+ const shadowNode = getOwnerShadowNode(ref, kind === "root"
43
+ ? "Failed to find native tag for app root"
44
+ : "Failed to find native tag for screen");
45
+ registrationOrder += 1;
46
+ owners.set(id, {
47
+ id,
48
+ kind,
49
+ shadowNode,
50
+ registrationOrder,
51
+ });
52
+ notify();
53
+ };
54
+ export const unregisterGrabSelectionOwner = (id) => {
55
+ const removedOwner = owners.get(id);
56
+ if (!removedOwner) {
57
+ return;
58
+ }
59
+ owners.delete(id);
60
+ if (focusedScreenOwnerId === id) {
61
+ focusedScreenOwnerId = null;
24
62
  }
25
- return appRootShadowNode;
63
+ notify();
26
64
  };
27
- export const getFocusedScreenShadowNode = () => {
28
- if (!focusedScreenShadowNode) {
29
- // No native screens, so there will be only the app root.
30
- return getAppRootShadowNode();
65
+ export const setGrabSelectionOwnerFocused = (id, isFocused) => {
66
+ const owner = owners.get(id);
67
+ if (!owner || owner.kind !== "screen") {
68
+ return;
69
+ }
70
+ if (isFocused) {
71
+ focusedScreenOwnerId = id;
72
+ }
73
+ else if (focusedScreenOwnerId === id) {
74
+ focusedScreenOwnerId = null;
31
75
  }
32
- return focusedScreenShadowNode;
76
+ notify();
77
+ };
78
+ export const clearGrabSelectionOwnerFocus = (id) => {
79
+ if (focusedScreenOwnerId !== id) {
80
+ return;
81
+ }
82
+ focusedScreenOwnerId = null;
83
+ notify();
84
+ };
85
+ export const getGrabSelectionOwner = (id) => {
86
+ return owners.get(id) ?? null;
87
+ };
88
+ export const getResolvedGrabSelectionOwner = () => {
89
+ if (focusedScreenOwnerId) {
90
+ const focusedOwner = owners.get(focusedScreenOwnerId);
91
+ if (focusedOwner) {
92
+ return focusedOwner;
93
+ }
94
+ }
95
+ return getFallbackRootOwner();
96
+ };
97
+ export const getResolvedGrabSelectionOwnerId = () => {
98
+ return getResolvedGrabSelectionOwner()?.id ?? null;
99
+ };
100
+ export const useResolvedGrabSelectionOwnerId = () => {
101
+ return useSyncExternalStore(subscribe, () => getResolvedGrabSelectionOwnerId(), () => null);
102
+ };
103
+ export const useIsResolvedGrabSelectionOwner = (id) => {
104
+ return useSyncExternalStore(subscribe, () => getResolvedGrabSelectionOwnerId() === id, () => false);
105
+ };
106
+ export const useSelectionOwnersStore = () => {
107
+ return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
33
108
  };
34
109
  //# sourceMappingURL=containers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"containers.js","sourceRoot":"","sources":["../../../src/react-native/containers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA2B,MAAM,cAAc,CAAC;AAEvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,IAAI,uBAAuB,GAAiC,IAAI,CAAC;AACjE,IAAI,iBAAiB,GAAiC,IAAI,CAAC;AAE3D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAuB,EAAE,EAAE;IAC7D,2DAA2D;IAC3D,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,uBAAuB,GAAG,kBAAkB,EAAE,CAAC,8BAA8B,CAAC,SAAS,CAAC,CAAC;AAC3F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAuB,EAAE,EAAE;IACvD,2DAA2D;IAC3D,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,iBAAiB,GAAG,kBAAkB,EAAE,CAAC,8BAA8B,CAAC,SAAS,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAA0B,EAAE;IAC9D,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,EAAE;IAC7C,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC7B,yDAAyD;QACzD,OAAO,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAED,OAAO,uBAAuB,CAAC;AACjC,CAAC,CAAC"}
1
+ {"version":3,"file":"containers.js","sourceRoot":"","sources":["../../../src/react-native/containers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,cAAc,EAA2B,MAAM,cAAc,CAAC;AAEvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAgB9C,IAAI,cAAc,GAAG,CAAC,CAAC;AACvB,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAC1B,IAAI,oBAAoB,GAAkB,IAAI,CAAC;AAC/C,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;AACrD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;AAExC,MAAM,MAAM,GAAG,GAAG,EAAE;IAClB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,QAAQ,EAAE,CAAC;IACb,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,QAAoB,EAAE,EAAE;IACzC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE;QACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,GAAiC,EAAE,CAAC,CAAC;IACvD,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC;IACvB,oBAAoB;CACrB,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,CAAC,GAAuB,EAAE,YAAoB,EAAE,EAAE;IAC3E,2DAA2D;IAC3D,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,kBAAkB,EAAE,CAAC,8BAA8B,CAAC,SAAS,CAAC,CAAC;AACxE,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,GAAG,EAAE;IAChC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACxF,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnF,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,IAA4B,EAAE,EAAE;IACzE,cAAc,IAAI,CAAC,CAAC;IACpB,OAAO,qBAAqB,IAAI,IAAI,cAAc,EAAE,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,EAAU,EACV,IAA4B,EAC5B,GAAuB,EACvB,EAAE;IACF,MAAM,UAAU,GAAG,kBAAkB,CACnC,GAAG,EACH,IAAI,KAAK,MAAM;QACb,CAAC,CAAC,wCAAwC;QAC1C,CAAC,CAAC,sCAAsC,CAC3C,CAAC;IAEF,iBAAiB,IAAI,CAAC,CAAC;IACvB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE;QACb,EAAE;QACF,IAAI;QACJ,UAAU;QACV,iBAAiB;KAClB,CAAC,CAAC;IACH,MAAM,EAAE,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,EAAU,EAAE,EAAE;IACzD,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAElB,IAAI,oBAAoB,KAAK,EAAE,EAAE,CAAC;QAChC,oBAAoB,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED,MAAM,EAAE,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,EAAU,EAAE,SAAkB,EAAE,EAAE;IAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,oBAAoB,GAAG,EAAE,CAAC;IAC5B,CAAC;SAAM,IAAI,oBAAoB,KAAK,EAAE,EAAE,CAAC;QACvC,oBAAoB,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED,MAAM,EAAE,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,EAAU,EAAE,EAAE;IACzD,IAAI,oBAAoB,KAAK,EAAE,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,oBAAoB,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAAU,EAA6B,EAAE;IAC7E,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAA8B,EAAE;IAC3E,IAAI,oBAAoB,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACtD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,oBAAoB,EAAE,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAkB,EAAE;IACjE,OAAO,6BAA6B,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,EAAE;IAClD,OAAO,oBAAoB,CACzB,SAAS,EACT,GAAG,EAAE,CAAC,+BAA+B,EAAE,EACvC,GAAG,EAAE,CAAC,IAAI,CACX,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,EAAU,EAAE,EAAE;IAC5D,OAAO,oBAAoB,CACzB,SAAS,EACT,GAAG,EAAE,CAAC,+BAA+B,EAAE,KAAK,EAAE,EAC9C,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,EAAE;IAC1C,OAAO,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;AACnE,CAAC,CAAC"}
@@ -0,0 +1,225 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Children, createContext, isValidElement, useContext, useEffect, useMemo, useRef, useState, } from "react";
3
+ import { Animated, Dimensions, Easing, Pressable, StyleSheet, Text, View, } from "react-native";
4
+ const SCREEN_EDGE_MARGIN = 8;
5
+ const ContextMenuContext = createContext(null);
6
+ const getAlignedLeft = (anchorX, menuWidth, horizontalAlignment) => {
7
+ switch (horizontalAlignment) {
8
+ case "left":
9
+ return anchorX;
10
+ case "right":
11
+ return anchorX - menuWidth;
12
+ case "center":
13
+ default:
14
+ return anchorX - menuWidth / 2;
15
+ }
16
+ };
17
+ const getAlignedTop = (anchorY, menuHeight, verticalAlignment) => {
18
+ switch (verticalAlignment) {
19
+ case "center":
20
+ return anchorY - menuHeight / 2;
21
+ case "bottom":
22
+ return anchorY - menuHeight;
23
+ case "top":
24
+ default:
25
+ return anchorY;
26
+ }
27
+ };
28
+ const getMenuPosition = (anchor, menuWidth, menuHeight, horizontalAlignment, verticalAlignment, offset, bounds) => {
29
+ const { width: screenWidth, height: screenHeight } = bounds ?? Dimensions.get("window");
30
+ const preferredLeft = getAlignedLeft(anchor.x, menuWidth, horizontalAlignment) + offset.x;
31
+ const preferredTop = getAlignedTop(anchor.y, menuHeight, verticalAlignment) + offset.y;
32
+ return {
33
+ left: Math.min(Math.max(SCREEN_EDGE_MARGIN, preferredLeft), screenWidth - menuWidth - SCREEN_EDGE_MARGIN),
34
+ top: Math.min(Math.max(SCREEN_EDGE_MARGIN, preferredTop), screenHeight - menuHeight - SCREEN_EDGE_MARGIN),
35
+ };
36
+ };
37
+ const ContextMenuItem = ({ children, destructive = false, disabled = false, onPress, }) => {
38
+ const context = useContext(ContextMenuContext);
39
+ if (!context) {
40
+ throw new Error("ContextMenu.Item must be rendered inside ContextMenu.");
41
+ }
42
+ return (_jsx(Pressable, { accessibilityRole: "menuitem", disabled: disabled, onPress: () => {
43
+ context.onClose();
44
+ onPress();
45
+ }, style: ({ pressed }) => [
46
+ styles.item,
47
+ pressed && !disabled && styles.itemPressed,
48
+ disabled && styles.itemDisabled,
49
+ ], children: _jsx(Text, { style: [styles.itemText, destructive && styles.destructiveText], children: children }) }));
50
+ };
51
+ export const ContextMenu = ({ anchor, bounds = null, children, cutout = null, horizontalAlignment = "center", offset = { x: 0, y: 10 }, onClose, verticalAlignment = "top", visible, }) => {
52
+ const [isRendered, setIsRendered] = useState(visible);
53
+ const [menuSize, setMenuSize] = useState({ width: 0, height: 0 });
54
+ const [renderedAnchor, setRenderedAnchor] = useState(anchor);
55
+ const animation = useRef(new Animated.Value(visible ? 1 : 0)).current;
56
+ useEffect(() => {
57
+ if (visible) {
58
+ setIsRendered(true);
59
+ }
60
+ if (anchor) {
61
+ setRenderedAnchor(anchor);
62
+ }
63
+ Animated.timing(animation, {
64
+ toValue: visible ? 1 : 0,
65
+ duration: visible ? 180 : 140,
66
+ easing: visible ? Easing.out(Easing.cubic) : Easing.in(Easing.cubic),
67
+ useNativeDriver: true,
68
+ }).start(({ finished }) => {
69
+ if (finished && !visible) {
70
+ setIsRendered(false);
71
+ setRenderedAnchor(null);
72
+ }
73
+ });
74
+ }, [anchor, animation, visible]);
75
+ const handleLayout = (event) => {
76
+ const { width, height } = event.nativeEvent.layout;
77
+ if (width === menuSize.width && height === menuSize.height) {
78
+ return;
79
+ }
80
+ setMenuSize({ width, height });
81
+ };
82
+ const position = useMemo(() => {
83
+ if (!renderedAnchor) {
84
+ return { left: SCREEN_EDGE_MARGIN, top: SCREEN_EDGE_MARGIN };
85
+ }
86
+ return getMenuPosition(renderedAnchor, menuSize.width, menuSize.height, horizontalAlignment, verticalAlignment, offset, bounds);
87
+ }, [
88
+ bounds,
89
+ horizontalAlignment,
90
+ menuSize.height,
91
+ menuSize.width,
92
+ offset,
93
+ renderedAnchor,
94
+ verticalAlignment,
95
+ ]);
96
+ const renderedItems = useMemo(() => Children.toArray(children).filter((child) => isValidElement(child)), [children]);
97
+ const dismissalRegions = useMemo(() => {
98
+ const { width: screenWidth, height: screenHeight } = bounds ?? Dimensions.get("window");
99
+ if (!cutout) {
100
+ return [
101
+ {
102
+ key: "full",
103
+ style: StyleSheet.absoluteFillObject,
104
+ },
105
+ ];
106
+ }
107
+ const left = Math.max(0, cutout.x);
108
+ const top = Math.max(0, cutout.y);
109
+ const right = Math.min(screenWidth, cutout.x + cutout.width);
110
+ const bottom = Math.min(screenHeight, cutout.y + cutout.height);
111
+ return [
112
+ {
113
+ key: "top",
114
+ style: {
115
+ position: "absolute",
116
+ top: 0,
117
+ left: 0,
118
+ right: 0,
119
+ height: top,
120
+ },
121
+ },
122
+ {
123
+ key: "left",
124
+ style: {
125
+ position: "absolute",
126
+ top,
127
+ left: 0,
128
+ width: left,
129
+ height: Math.max(0, bottom - top),
130
+ },
131
+ },
132
+ {
133
+ key: "right",
134
+ style: {
135
+ position: "absolute",
136
+ top,
137
+ left: right,
138
+ right: 0,
139
+ height: Math.max(0, bottom - top),
140
+ },
141
+ },
142
+ {
143
+ key: "bottom",
144
+ style: {
145
+ position: "absolute",
146
+ top: bottom,
147
+ left: 0,
148
+ right: 0,
149
+ bottom: 0,
150
+ },
151
+ },
152
+ ];
153
+ }, [bounds, cutout]);
154
+ if (!isRendered || !renderedAnchor || renderedItems.length === 0) {
155
+ return null;
156
+ }
157
+ return (_jsxs(View, { pointerEvents: "box-none", style: styles.overlay, children: [dismissalRegions.map((region) => (_jsx(Pressable, { accessibilityLabel: "Close context menu", onPress: onClose, style: region.style }, `pressable-${region.key}`))), _jsx(ContextMenuContext.Provider, { value: { onClose }, children: _jsx(Animated.View, { onLayout: handleLayout, style: [
158
+ styles.menu,
159
+ position,
160
+ {
161
+ opacity: animation,
162
+ transform: [
163
+ {
164
+ translateY: animation.interpolate({
165
+ inputRange: [0, 1],
166
+ outputRange: [-10, 0],
167
+ }),
168
+ },
169
+ {
170
+ scale: animation.interpolate({
171
+ inputRange: [0, 1],
172
+ outputRange: [0.94, 1],
173
+ }),
174
+ },
175
+ ],
176
+ },
177
+ ], children: _jsx(View, { style: styles.menuContent, children: renderedItems.map((child, index) => (_jsx(View, { style: index > 0 ? styles.itemBorder : undefined, children: child }, index))) }) }) })] }));
178
+ };
179
+ ContextMenu.Item = ContextMenuItem;
180
+ const styles = StyleSheet.create({
181
+ overlay: {
182
+ ...StyleSheet.absoluteFillObject,
183
+ zIndex: 10,
184
+ elevation: 10,
185
+ },
186
+ menu: {
187
+ position: "absolute",
188
+ zIndex: 11,
189
+ minWidth: 176,
190
+ borderRadius: 14,
191
+ shadowColor: "#000000",
192
+ shadowOffset: { width: 0, height: 10 },
193
+ shadowOpacity: 0.16,
194
+ shadowRadius: 24,
195
+ elevation: 10,
196
+ },
197
+ menuContent: {
198
+ borderRadius: 14,
199
+ backgroundColor: "#FFFFFF",
200
+ overflow: "hidden",
201
+ },
202
+ item: {
203
+ paddingHorizontal: 14,
204
+ paddingVertical: 12,
205
+ },
206
+ itemBorder: {
207
+ borderTopWidth: StyleSheet.hairlineWidth,
208
+ borderTopColor: "rgba(17, 17, 17, 0.12)",
209
+ },
210
+ itemPressed: {
211
+ backgroundColor: "rgba(17, 17, 17, 0.06)",
212
+ },
213
+ itemDisabled: {
214
+ opacity: 0.5,
215
+ },
216
+ itemText: {
217
+ color: "#111111",
218
+ fontSize: 14,
219
+ fontWeight: "500",
220
+ },
221
+ destructiveText: {
222
+ color: "#C43D2F",
223
+ },
224
+ });
225
+ //# sourceMappingURL=context-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-menu.js","sourceRoot":"","sources":["../../../src/react-native/context-menu.tsx"],"names":[],"mappings":"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"}
@@ -12,6 +12,20 @@ const PRIORITY_ATTRS = [
12
12
  "accessibilityHint",
13
13
  "accessibilityValue",
14
14
  ];
15
+ /** Owner names treated as host-like when resolving `Text (in Owner)` for the grab menu. */
16
+ export const GRAB_HOST_LIKE_COMPONENT_NAMES = ["View", "Text"];
17
+ const HOST_LIKE_NAME_SET = new Set(GRAB_HOST_LIKE_COMPONENT_NAMES);
18
+ export const isHostLikeComponentName = (name) => HOST_LIKE_NAME_SET.has(name.trim());
19
+ const firstHostLikeRenderedByName = (renderedBy) => {
20
+ const frame = renderedBy.find((f) => isHostLikeComponentName(f.name));
21
+ const trimmed = frame?.name?.trim();
22
+ return trimmed && trimmed.length > 0 ? trimmed : null;
23
+ };
24
+ const firstNonHostRenderedByName = (renderedBy) => {
25
+ const frame = renderedBy.find((f) => !isHostLikeComponentName(f.name));
26
+ const trimmed = frame?.name?.trim();
27
+ return trimmed && trimmed.length > 0 ? trimmed : null;
28
+ };
15
29
  const truncate = (value, maxLength) => {
16
30
  if (value.length <= maxLength)
17
31
  return value;
@@ -106,9 +120,9 @@ const extractPriorityAttrs = (props) => {
106
120
  return pairs.length > 0 ? ` ${pairs.join(" ")}` : "";
107
121
  };
108
122
  const getPreviewComponentName = (node, renderedBy) => {
109
- const firstRenderedBy = renderedBy[0]?.name?.trim();
110
- if (firstRenderedBy)
111
- return firstRenderedBy;
123
+ const fromRenderedBy = firstNonHostRenderedByName(renderedBy);
124
+ if (fromRenderedBy)
125
+ return fromRenderedBy;
112
126
  const hostFiber = getHostFiber(node);
113
127
  return getHostComponentName(hostFiber);
114
128
  };
@@ -166,6 +180,17 @@ const buildContextBlock = (contextValue) => {
166
180
  }
167
181
  return `\n\nContext:\n${JSON.stringify(contextValue, null, 2)}`;
168
182
  };
183
+ export const getGrabSelectionTitle = (node, renderedBy) => {
184
+ const fromFiber = getHostComponentName(getHostFiber(node));
185
+ const rawHostLabel = firstHostLikeRenderedByName(renderedBy) ?? (fromFiber !== "(unknown)" ? fromFiber : null);
186
+ const hostUnknown = rawHostLabel == null;
187
+ const hostLabel = hostUnknown ? "Selected element" : rawHostLabel;
188
+ const ownerName = firstNonHostRenderedByName(renderedBy);
189
+ if (ownerName && ownerName !== hostLabel) {
190
+ return `${hostLabel} (in ${ownerName})`;
191
+ }
192
+ return hostLabel;
193
+ };
169
194
  export const getDescription = async (node) => {
170
195
  let renderedBy = await getRenderedBy(node);
171
196
  const preview = buildElementPreview(node, renderedBy);
@@ -1 +1 @@
1
- {"version":3,"file":"description.js","sourceRoot":"","sources":["../../../src/react-native/description.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAEhE,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,SAAS,GAAG,CAAC,CAAC;AAEpB,MAAM,cAAc,GAAG;IACrB,QAAQ;IACR,UAAU;IACV,oBAAoB;IACpB,mBAAmB;IACnB,mBAAmB;IACnB,oBAAoB;CACZ,CAAC;AAEX,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,SAAiB,EAAU,EAAE;IAC5D,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE;IAC3C,OAAO,KAAK;SACT,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC;SACzB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAAiB,EAAE;IAC3D,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAE,GAAa,EAAE,EAAE;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,KAAqC,EAAU,EAAE;IAC3E,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,oBAAoB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,OAAO,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAA0B,EAA+B,EAAE;IAC/E,IAAI,OAAO,GAAgC,IAAI,CAAC;IAEhD,OAAO,OAAO,EAAE,CAAC;QACf,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IACnC,CAAC;IAED,OAAQ,IAAwC,IAAI,IAAI,CAAC;AAC3D,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,KAAkC,EAAU,EAAE;IAC1E,MAAM,aAAa,GAAG,KAAK,EAAE,IAAI,CAAC;IAClC,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAkC,EAAkC,EAAE;IAC9F,MAAM,KAAK,GAAG,KAAK,EAAE,aAAa,CAAC;IACnC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,KAAqC,EAAU,EAAE;IAC7E,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS;YAAE,MAAM;QACrC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,SAAS;QACxB,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAC9B,IAA0B,EAC1B,UAA6B,EACrB,EAAE;IACV,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACpD,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAE5C,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,IAA0B,EAAE,UAA6B,EAAU,EAAE;IAChG,MAAM,aAAa,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAEvC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,aAAa,GAAG,KAAK,KAAK,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,aAAa,GAAG,KAAK,QAAQ,IAAI,OAAO,aAAa,GAAG,CAAC;AACtE,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAC1B,IAAmB,EACnB,IAAmB,EACnB,MAAqB,EACN,EAAE;IACjB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IAC7C,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,UAA6B,EAAU,EAAE;IAClE,MAAM,KAAK,GAAG,UAAU;SACrB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACtC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC;SACzB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3E,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QACzB,OAAO,UAAU,KAAK,CAAC,IAAI,QAAQ,QAAQ,GAAG,CAAC;IACjD,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC,CAAC;AAaF,MAAM,0BAA0B,GAAG,CAAC,KAA+B,EAAW,EAAE;IAC9E,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC;IAChC,OAAO,CACL,YAAY,KAAK,8BAA8B;QAC/C,YAAY,KAAM,8BAAoD,CAAC,QAAQ,CAChF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAC9B,IAA0B,EACU,EAAE;IACtC,IAAI,OAAO,GAAoC,IAAI,CAAC;IAEpD,OAAO,OAAO,EAAE,CAAC;QACf,IAAI,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,OAAO,OAAO,CAAC,aAAa,EAAE,KAAK,IAAI,IAAI,CAAC;QAC9C,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IACnC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,YAAgD,EAAU,EAAE;IACrF,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,iBAAiB,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,IAA0B,EAAmB,EAAE;IAClF,IAAI,UAAU,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,iBAAiB,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtE,IAAI,CAAC,YAAY;QAAE,OAAO,GAAG,OAAO,GAAG,YAAY,EAAE,CAAC;IACtD,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,EAAE,CAAC;AACpD,CAAC,CAAC"}
1
+ {"version":3,"file":"description.js","sourceRoot":"","sources":["../../../src/react-native/description.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { useEffect } from "react";
2
+ const getDefaultFocusEffectFactory = () => {
3
+ try {
4
+ return require("expo-router").useFocusEffect;
5
+ }
6
+ catch {
7
+ // Nothing we can do about it, it's not installed in the project.
8
+ }
9
+ try {
10
+ return require("@react-navigation/native").useFocusEffect;
11
+ }
12
+ catch {
13
+ // Nothing we can do about it, it's not installed in the project.
14
+ }
15
+ console.warn("[react-native-grab] No supported router found — falling back to useEffect. This may cause issues. Provide a custom focus effect using the setFocusEffect function.");
16
+ const useFallbackFocusEffect = (cb) => {
17
+ useEffect(() => {
18
+ return cb();
19
+ }, [cb]);
20
+ };
21
+ return useFallbackFocusEffect;
22
+ };
23
+ let cachedFocusEffect = null;
24
+ export const getFocusEffect = () => {
25
+ if (!cachedFocusEffect) {
26
+ cachedFocusEffect = getDefaultFocusEffectFactory();
27
+ }
28
+ return cachedFocusEffect;
29
+ };
30
+ export const setFocusEffect = (impl) => {
31
+ cachedFocusEffect = impl;
32
+ };
33
+ //# sourceMappingURL=focus-effect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-effect.js","sourceRoot":"","sources":["../../../src/react-native/focus-effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,MAAM,4BAA4B,GAAG,GAA+B,EAAE;IACpE,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,OAAO,CAAC,IAAI,CACV,oKAAoK,CACrK,CAAC;IAEF,MAAM,sBAAsB,GAAG,CAAC,EAAc,EAAE,EAAE;QAChD,SAAS,CAAC,GAAG,EAAE;YACb,OAAO,EAAE,EAAE,CAAC;QACd,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,OAAO,sBAAsB,CAAC;AAChC,CAAC,CAAC;AAEF,IAAI,iBAAiB,GAAsC,IAAI,CAAC;AAEhE,MAAM,CAAC,MAAM,cAAc,GAAG,GAA+B,EAAE;IAC7D,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,4BAA4B,EAAE,CAAC;IACrD,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAA8B,EAAE,EAAE;IAC/D,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const GRAB_PRIMARY = "#8232FF";
2
+ export const GRAB_HIGHLIGHT_FILL = "rgba(130, 50, 255, 0.2)";
3
+ export const GRAB_BADGE_BACKGROUND = "rgba(130, 50, 255, 0.92)";
4
+ //# sourceMappingURL=grab-colors.js.map