react-grab 0.1.48-dev.cac6157 → 0.1.48-dev.d05136b

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 (41) hide show
  1. package/README.md +18 -59
  2. package/dist/{copy-content-BPB8MmpL.d.cts → copy-content-CNRKFr6F.d.ts} +65 -34
  3. package/dist/{copy-content-C7lFyXsY.d.ts → copy-content-CtYUWe5l.d.cts} +65 -34
  4. package/dist/core/index.cjs +1 -1
  5. package/dist/core/index.d.cts +2 -2
  6. package/dist/core/index.d.ts +2 -2
  7. package/dist/core/index.js +1 -1
  8. package/dist/core-DUaBdaBx.cjs +14 -0
  9. package/dist/core-DtCvyR6O.js +14 -0
  10. package/dist/errors-BEgowzRA.d.ts +29 -0
  11. package/dist/errors-CTlIFDQs.d.cts +29 -0
  12. package/dist/execute-context-menu-action-DgdWPLSR.cjs +9 -0
  13. package/dist/execute-context-menu-action-N-Tbfec8.js +9 -0
  14. package/dist/freeze-updates-BV9yAm-a.js +52 -0
  15. package/dist/freeze-updates-Dy4xv_JC.cjs +52 -0
  16. package/dist/{index-DMyJsiaz.d.cts → index-BgTe-uWs.d.cts} +1 -1
  17. package/dist/{index-VkohC_Hw.d.ts → index-CdWMNcJF.d.ts} +1 -1
  18. package/dist/index.cjs +1 -1
  19. package/dist/index.d.cts +10 -7
  20. package/dist/index.d.ts +10 -7
  21. package/dist/index.global.js +21 -19
  22. package/dist/index.js +1 -1
  23. package/dist/open-file-Cdyp5qMt.js +29 -0
  24. package/dist/open-file-DDxsoo-i.cjs +20 -0
  25. package/dist/primitives.cjs +2 -2
  26. package/dist/primitives.d.cts +41 -2
  27. package/dist/primitives.d.ts +41 -2
  28. package/dist/primitives.js +2 -2
  29. package/dist/renderer-CL4EDf3E.cjs +9 -0
  30. package/dist/renderer-vYq7lcHs.js +9 -0
  31. package/package.json +10 -4
  32. package/dist/copy-content-CbjqLSIH.js +0 -10
  33. package/dist/copy-content-DoR-wbHM.cjs +0 -10
  34. package/dist/core-7jNiR5NZ.cjs +0 -14
  35. package/dist/core-C2C_YRT3.js +0 -14
  36. package/dist/create-pointer-move-prompt-handoff-D41bFo0b.cjs +0 -9
  37. package/dist/create-pointer-move-prompt-handoff-DwNZaiRA.js +0 -9
  38. package/dist/freeze-updates-CqzBfk2W.cjs +0 -51
  39. package/dist/freeze-updates-DlHvYaiv.js +0 -51
  40. package/dist/renderer-D0g-Fo8Z.js +0 -9
  41. package/dist/renderer-Dfd9Vhgx.cjs +0 -9
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Copy any UI element for your agent.
7
7
 
8
- React Grab points agents to the actual source behind each selection. Agents are [**2× faster**](https://benchmark.react-grab.com/) and more accurate when using React Grab.
8
+ React Grab points agents to the actual source behind each selection. Agents are [**2× faster**](https://react-grab.com/benchmarks) and more accurate when using React Grab.
9
9
 
10
10
  [**Website →**](https://react-grab.com)
11
11
 
@@ -114,72 +114,31 @@ if (process.env.NODE_ENV === "development") {
114
114
  }
115
115
  ```
116
116
 
117
- ## Plugins
117
+ ## Build your own React Grab
118
118
 
119
- Use plugins to extend React Grab's built-in UI with context menu actions, toolbar menu items, lifecycle hooks, and theme overrides.
119
+ Build a custom interface with the selection engine from `react-grab/primitives`. Use its APIs for hit testing, source context, page freezing, clipboard access, and editor navigation.
120
120
 
121
- Register a plugin using the `registerPlugin` export:
121
+ ### Customize hit testing
122
122
 
123
- ```js
124
- import { registerPlugin } from "react-grab";
123
+ Scope hit testing to a container or replace the default element filter with your own rules.
125
124
 
126
- registerPlugin({
127
- name: "my-plugin",
128
- hooks: {
129
- onElementSelect: (element) => {
130
- console.log("Selected:", element.tagName);
131
- },
132
- },
133
- });
134
- ```
135
-
136
- If writing in React, register inside a `useEffect`:
125
+ ```typescript
126
+ import { getElementAtPoint, isElementGrabbable } from "react-grab/primitives";
137
127
 
138
- ```jsx
139
- import { registerPlugin, unregisterPlugin } from "react-grab";
140
-
141
- useEffect(() => {
142
- registerPlugin({
143
- name: "my-plugin",
144
- actions: [
145
- {
146
- id: "my-action",
147
- label: "My Action",
148
- shortcut: "M",
149
- onAction: (context) => {
150
- console.log("Action on:", context.element);
151
- context.hideContextMenu();
152
- },
153
- },
154
- ],
128
+ export const getPickerTarget = (
129
+ event: PointerEvent,
130
+ appElement: Element,
131
+ toolbarElement: Element,
132
+ ): Element | null =>
133
+ getElementAtPoint(event.clientX, event.clientY, {
134
+ container: appElement,
135
+ filter: (candidate) =>
136
+ isElementGrabbable(candidate) &&
137
+ !toolbarElement.contains(candidate),
155
138
  });
156
-
157
- return () => unregisterPlugin("my-plugin");
158
- }, []);
159
- ```
160
-
161
- Actions use a `target` field to control where they appear. Omit `target` (or set `"context-menu"`) for the right-click menu, or set `"toolbar"` for the toolbar dropdown:
162
-
163
- ```js
164
- actions: [
165
- {
166
- id: "inspect",
167
- label: "Inspect",
168
- shortcut: "I",
169
- onAction: (ctx) => console.dir(ctx.element),
170
- },
171
- {
172
- id: "toggle-freeze",
173
- label: "Freeze",
174
- // Only show in the toolbar
175
- target: "toolbar",
176
- isActive: () => isFrozen,
177
- onAction: () => toggleFreeze(),
178
- },
179
- ];
180
139
  ```
181
140
 
182
- See [`packages/react-grab/src/types.ts`](https://github.com/aidenybai/react-grab/blob/main/packages/react-grab/src/types.ts) for the full `Plugin`, `PluginHooks`, and `PluginConfig` interfaces.
141
+ Add `data-react-grab-ignore` to your picker interface so hit testing skips its subtree.
183
142
 
184
143
  ## Resources & Contributing Back
185
144
 
@@ -6,6 +6,8 @@
6
6
  * This source code is licensed under the MIT license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
+ import { ReactNode } from "react";
10
+
9
11
  //#region ../../node_modules/.pnpm/solid-js@1.9.12/node_modules/solid-js/types/reactive/observable.d.ts
10
12
  declare global {
11
13
  interface SymbolConstructor {
@@ -23,6 +25,17 @@ interface Position {
23
25
  x: number;
24
26
  y: number;
25
27
  }
28
+ interface ElementAtPointOptions {
29
+ container?: Element;
30
+ filter?: (element: Element) => boolean;
31
+ }
32
+ interface ElementBounds {
33
+ x: number;
34
+ y: number;
35
+ width: number;
36
+ height: number;
37
+ borderRadius: string;
38
+ }
26
39
  type DeepPartial<T> = { [P in keyof T]?: T[P] extends object ? T[P] extends ((...args: unknown[]) => unknown) ? T[P] : DeepPartial<T[P]> : T[P] };
27
40
  interface Theme {
28
41
  /**
@@ -138,11 +151,13 @@ interface AgentContext<T = unknown> {
138
151
  sessionId?: string;
139
152
  }
140
153
  type ActivationMode = "toggle" | "hold";
141
- interface ActionContextHooks {
142
- transformHtmlContent: (html: string, elements: Element[]) => Promise<string>;
154
+ interface OpenFileActionHooks {
143
155
  onOpenFile: (filePath: string, lineNumber?: number) => boolean | void;
144
156
  transformOpenFileUrl: (url: string, filePath: string, lineNumber?: number) => string;
145
157
  }
158
+ interface ActionContextHooks extends OpenFileActionHooks {
159
+ transformHtmlContent: (html: string, elements: Element[]) => Promise<string>;
160
+ }
146
161
  interface ActionContext {
147
162
  element: Element;
148
163
  elements: Element[];
@@ -258,24 +273,24 @@ interface HierarchyState {
258
273
  activeIndex: number;
259
274
  }
260
275
  interface PluginHooks {
261
- onActivate?: () => void;
262
- onDeactivate?: () => void;
263
- onElementHover?: (element: Element) => void;
276
+ onActivate?: () => void | Promise<void>;
277
+ onDeactivate?: () => void | Promise<void>;
278
+ onElementHover?: (element: Element) => void | Promise<void>;
264
279
  onElementSelect?: (element: Element) => boolean | void | Promise<boolean>;
265
- onDragStart?: (startX: number, startY: number) => void;
266
- onDragEnd?: (elements: Element[], bounds: DragRect) => void;
280
+ onDragStart?: (startX: number, startY: number) => void | Promise<void>;
281
+ onDragEnd?: (elements: Element[], bounds: DragRect) => void | Promise<void>;
267
282
  onBeforeCopy?: (elements: Element[]) => void | Promise<void>;
268
283
  transformCopyContent?: (content: string, elements: Element[]) => string | Promise<string>;
269
- onAfterCopy?: (elements: Element[], success: boolean) => void;
270
- onCopySuccess?: (elements: Element[], content: string) => void;
271
- onCopyError?: (error: Error) => void;
272
- onStateChange?: (state: ReactGrabState) => void;
273
- onPromptModeChange?: (isPromptMode: boolean, context: PromptModeContext) => void;
274
- onSelectionBox?: (visible: boolean, bounds: OverlayBounds | null, element: Element | null) => void;
275
- onDragBox?: (visible: boolean, bounds: OverlayBounds | null) => void;
276
- onGrabbedBox?: (bounds: OverlayBounds, element: Element) => void;
277
- onElementLabel?: (visible: boolean, variant: ElementLabelVariant, context: ElementLabelContext) => void;
278
- onContextMenu?: (element: Element, position: Position) => void;
284
+ onAfterCopy?: (elements: Element[], success: boolean) => void | Promise<void>;
285
+ onCopySuccess?: (elements: Element[], content: string) => void | Promise<void>;
286
+ onCopyError?: (error: Error) => void | Promise<void>;
287
+ onStateChange?: (state: ReactGrabState) => void | Promise<void>;
288
+ onPromptModeChange?: (isPromptMode: boolean, context: PromptModeContext) => void | Promise<void>;
289
+ onSelectionBox?: (visible: boolean, bounds: OverlayBounds | null, element: Element | null) => void | Promise<void>;
290
+ onDragBox?: (visible: boolean, bounds: OverlayBounds | null) => void | Promise<void>;
291
+ onGrabbedBox?: (bounds: OverlayBounds, element: Element) => void | Promise<void>;
292
+ onElementLabel?: (visible: boolean, variant: ElementLabelVariant, context: ElementLabelContext) => void | Promise<void>;
293
+ onContextMenu?: (element: Element, position: Position) => void | Promise<void>;
279
294
  onOpenFile?: (filePath: string, lineNumber?: number) => boolean | void;
280
295
  transformHtmlContent?: (html: string, elements: Element[]) => string | Promise<string>;
281
296
  transformAgentContext?: (context: AgentContext, elements: Element[]) => AgentContext | Promise<AgentContext>;
@@ -287,7 +302,7 @@ interface PluginConfig {
287
302
  options?: SettableOptions;
288
303
  actions?: ContextMenuAction[];
289
304
  hooks?: PluginHooks;
290
- cleanup?: () => void;
305
+ cleanup?: () => undefined;
291
306
  }
292
307
  interface Plugin {
293
308
  name: string;
@@ -430,13 +445,19 @@ interface FrozenLabelEntry {
430
445
  bounds: OverlayBounds;
431
446
  mouseX?: number;
432
447
  }
448
+ interface FrozenLabelEntryAccessor {
449
+ read: () => FrozenLabelEntry | null;
450
+ }
451
+ interface SelectionLabelInstanceAccessor {
452
+ read: () => SelectionLabelInstance | null;
453
+ }
433
454
  interface ReactGrabRendererProps {
434
455
  selectionVisible?: boolean;
435
456
  selectionBounds?: OverlayBounds;
436
457
  selectionBoundsMultiple?: OverlayBounds[];
437
458
  selectionShouldSnap?: boolean;
438
459
  selectionElementsCount?: number;
439
- frozenLabelEntries?: FrozenLabelEntry[];
460
+ frozenLabelEntryAccessors?: FrozenLabelEntryAccessor[];
440
461
  pendingShiftPreviewEntry?: FrozenLabelEntry;
441
462
  selectionFilePath?: string;
442
463
  selectionLineNumber?: number;
@@ -447,6 +468,7 @@ interface ReactGrabRendererProps {
447
468
  hierarchyState?: HierarchyState;
448
469
  hierarchyMenuPosition?: DropdownAnchor | null;
449
470
  labelInstances?: SelectionLabelInstance[];
471
+ labelInstanceAccessors?: SelectionLabelInstanceAccessor[];
450
472
  dragVisible?: boolean;
451
473
  dragBounds?: OverlayBounds;
452
474
  grabbedBoxes?: Array<{
@@ -467,6 +489,7 @@ interface ReactGrabRendererProps {
467
489
  onToggleExpand?: () => void;
468
490
  selectionLabelShakeCount?: number;
469
491
  onConfirmDismiss?: () => void;
492
+ onOpenSelectionFile?: () => void;
470
493
  discardPrompt?: SelectionDiscardPrompt;
471
494
  toolbarVisible?: boolean;
472
495
  isActive?: boolean;
@@ -548,7 +571,7 @@ interface ReactGrabEntry {
548
571
  frames?: ReactGrabStackFrame[];
549
572
  }
550
573
  //#endregion
551
- //#region ../../node_modules/.pnpm/bippy@0.5.43_react@19.2.6/node_modules/bippy/dist/core.d.ts
574
+ //#region ../../node_modules/.pnpm/bippy@0.6.0_react@19.2.6/node_modules/bippy/dist/unsubscribe.d.ts
552
575
  type Flags = number;
553
576
  type Lanes = number;
554
577
  type TypeOfMode = number;
@@ -638,6 +661,14 @@ interface Effect {
638
661
  interface Family {
639
662
  current: unknown;
640
663
  }
664
+ /**
665
+ * React 19 flight metadata for a server component owner (ReactComponentInfo).
666
+ * Unlike client owners it has no `tag`; the owner chain continues via `owner`.
667
+ */
668
+ interface RendererRefreshUpdate {
669
+ staleFamilies: Set<Family>;
670
+ updatedFamilies: Set<Family>;
671
+ }
641
672
  /**
642
673
  * Represents a react-internal Fiber node.
643
674
  */
@@ -688,6 +719,7 @@ interface ReactDevToolsGlobalHook {
688
719
  onCommitFiberRoot: (rendererID: number, root: FiberRoot, priority: number | void) => void;
689
720
  onCommitFiberUnmount: (rendererID: number, fiber: Fiber) => void;
690
721
  onPostCommitFiberRoot: (rendererID: number, root: FiberRoot) => void;
722
+ onScheduleFiberRoot?: (rendererID: number, root: FiberRoot, children: ReactNode) => void;
691
723
  renderers: Map<number, ReactRenderer>;
692
724
  supportsFiber: boolean;
693
725
  supportsFlight: boolean;
@@ -706,10 +738,7 @@ interface ReactRenderer {
706
738
  overridePropsRenamePath?: (fiber: Fiber, oldPath: Array<number | string>, newPath: Array<number | string>) => void;
707
739
  reconcilerVersion: string;
708
740
  rendererPackageName: string;
709
- scheduleRefresh?: (root: FiberRoot, update: {
710
- staleFamilies: Set<Family>;
711
- updatedFamilies: Set<Family>;
712
- }) => void;
741
+ scheduleRefresh?: (root: FiberRoot, update: RendererRefreshUpdate) => void;
713
742
  scheduleRoot?: (root: FiberRoot, element: React.ReactNode) => void;
714
743
  scheduleUpdate?: (fiber: Fiber) => void;
715
744
  setErrorHandler?: (newShouldErrorImpl: (fiber: Fiber) => boolean) => void;
@@ -720,28 +749,30 @@ interface ReactRenderer {
720
749
  declare global {
721
750
  var __REACT_DEVTOOLS_GLOBAL_HOOK__: ReactDevToolsGlobalHook | undefined;
722
751
  } //#endregion
723
- //#region src/rdt-hook.d.ts
724
- /**
725
- * Returns `true` if bippy's instrumentation is active.
726
- */
727
- declare const isInstrumentationActive: () => boolean;
728
- /**
729
- * Returns the latest fiber (since it may be double-buffered).
730
- */
752
+ //#region src/unsubscribe.d.ts
731
753
  //#endregion
732
- //#region ../../node_modules/.pnpm/bippy@0.5.43_react@19.2.6/node_modules/bippy/dist/source.d.ts
754
+ //#region ../../node_modules/.pnpm/bippy@0.6.0_react@19.2.6/node_modules/bippy/dist/source.d.ts
733
755
  //#region src/source/parse-stack.d.ts
734
756
  interface StackFrame {
735
757
  args?: unknown[];
736
758
  columnNumber?: number;
737
759
  lineNumber?: number;
760
+ enclosingLineNumber?: number;
761
+ enclosingColumnNumber?: number;
738
762
  fileName?: string;
739
763
  functionName?: string;
740
764
  source?: string;
741
765
  isServer?: boolean;
742
766
  isSymbolicated?: boolean;
767
+ isIgnoreListed?: boolean;
743
768
  }
744
769
  //#endregion
770
+ //#region ../../node_modules/.pnpm/bippy@0.6.0_react@19.2.6/node_modules/bippy/dist/core.d.ts
771
+ /**
772
+ * Returns `true` if bippy's instrumentation is active.
773
+ */
774
+ declare const isInstrumentationActive: () => boolean;
775
+ //#endregion
745
776
  //#region src/utils/copy-content.d.ts
746
777
  interface CopyContentOptions {
747
778
  componentName?: string;
@@ -751,4 +782,4 @@ interface CopyContentOptions {
751
782
  }
752
783
  declare const copyContent: (content: string, options?: CopyContentOptions) => boolean;
753
784
  //#endregion
754
- export { SourceInfo as A, PromptModeContext as C, Rect as D, ReactGrabState as E, ToolbarState as M, SelectedElementPayload as O, Position as S, ReactGrabRendererProps as T, Options as _, ActionContext as a, PluginConfig as b, AgentContext as c, DeepPartial as d, DragRect as f, GrabbedBox as g, ElementSelectedEventDetail as h, isInstrumentationActive as i, Theme as j, SettableOptions as k, ContextMenuAction as l, ElementLabelVariant as m, StackFrame as n, ActionContextHooks as o, ElementLabelContext as p, Fiber as r, ActivationMode as s, copyContent as t, ContextMenuActionContext as u, OverlayBounds as v, ReactGrabAPI as w, PluginHooks as x, Plugin as y };
785
+ export { Rect as A, PluginConfig as C, ReactGrabAPI as D, PromptModeContext as E, ToolbarState as F, SettableOptions as M, SourceInfo as N, ReactGrabRendererProps as O, Theme as P, Plugin as S, Position as T, ElementSelectedEventDetail as _, ActionContext as a, Options as b, AgentContext as c, DeepPartial as d, DragRect as f, ElementLabelVariant as g, ElementLabelContext as h, Fiber as i, SelectedElementPayload as j, ReactGrabState as k, ContextMenuAction as l, ElementBounds as m, isInstrumentationActive as n, ActionContextHooks as o, ElementAtPointOptions as p, StackFrame as r, ActivationMode as s, copyContent as t, ContextMenuActionContext as u, GrabbedBox as v, PluginHooks as w, OverlayBounds as x, OpenFileActionHooks as y };
@@ -6,6 +6,8 @@
6
6
  * This source code is licensed under the MIT license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
+ import { ReactNode } from "react";
10
+
9
11
  //#region ../../node_modules/.pnpm/solid-js@1.9.12/node_modules/solid-js/types/reactive/observable.d.ts
10
12
  declare global {
11
13
  interface SymbolConstructor {
@@ -23,6 +25,17 @@ interface Position {
23
25
  x: number;
24
26
  y: number;
25
27
  }
28
+ interface ElementAtPointOptions {
29
+ container?: Element;
30
+ filter?: (element: Element) => boolean;
31
+ }
32
+ interface ElementBounds {
33
+ x: number;
34
+ y: number;
35
+ width: number;
36
+ height: number;
37
+ borderRadius: string;
38
+ }
26
39
  type DeepPartial<T> = { [P in keyof T]?: T[P] extends object ? T[P] extends ((...args: unknown[]) => unknown) ? T[P] : DeepPartial<T[P]> : T[P] };
27
40
  interface Theme {
28
41
  /**
@@ -138,11 +151,13 @@ interface AgentContext<T = unknown> {
138
151
  sessionId?: string;
139
152
  }
140
153
  type ActivationMode = "toggle" | "hold";
141
- interface ActionContextHooks {
142
- transformHtmlContent: (html: string, elements: Element[]) => Promise<string>;
154
+ interface OpenFileActionHooks {
143
155
  onOpenFile: (filePath: string, lineNumber?: number) => boolean | void;
144
156
  transformOpenFileUrl: (url: string, filePath: string, lineNumber?: number) => string;
145
157
  }
158
+ interface ActionContextHooks extends OpenFileActionHooks {
159
+ transformHtmlContent: (html: string, elements: Element[]) => Promise<string>;
160
+ }
146
161
  interface ActionContext {
147
162
  element: Element;
148
163
  elements: Element[];
@@ -258,24 +273,24 @@ interface HierarchyState {
258
273
  activeIndex: number;
259
274
  }
260
275
  interface PluginHooks {
261
- onActivate?: () => void;
262
- onDeactivate?: () => void;
263
- onElementHover?: (element: Element) => void;
276
+ onActivate?: () => void | Promise<void>;
277
+ onDeactivate?: () => void | Promise<void>;
278
+ onElementHover?: (element: Element) => void | Promise<void>;
264
279
  onElementSelect?: (element: Element) => boolean | void | Promise<boolean>;
265
- onDragStart?: (startX: number, startY: number) => void;
266
- onDragEnd?: (elements: Element[], bounds: DragRect) => void;
280
+ onDragStart?: (startX: number, startY: number) => void | Promise<void>;
281
+ onDragEnd?: (elements: Element[], bounds: DragRect) => void | Promise<void>;
267
282
  onBeforeCopy?: (elements: Element[]) => void | Promise<void>;
268
283
  transformCopyContent?: (content: string, elements: Element[]) => string | Promise<string>;
269
- onAfterCopy?: (elements: Element[], success: boolean) => void;
270
- onCopySuccess?: (elements: Element[], content: string) => void;
271
- onCopyError?: (error: Error) => void;
272
- onStateChange?: (state: ReactGrabState) => void;
273
- onPromptModeChange?: (isPromptMode: boolean, context: PromptModeContext) => void;
274
- onSelectionBox?: (visible: boolean, bounds: OverlayBounds | null, element: Element | null) => void;
275
- onDragBox?: (visible: boolean, bounds: OverlayBounds | null) => void;
276
- onGrabbedBox?: (bounds: OverlayBounds, element: Element) => void;
277
- onElementLabel?: (visible: boolean, variant: ElementLabelVariant, context: ElementLabelContext) => void;
278
- onContextMenu?: (element: Element, position: Position) => void;
284
+ onAfterCopy?: (elements: Element[], success: boolean) => void | Promise<void>;
285
+ onCopySuccess?: (elements: Element[], content: string) => void | Promise<void>;
286
+ onCopyError?: (error: Error) => void | Promise<void>;
287
+ onStateChange?: (state: ReactGrabState) => void | Promise<void>;
288
+ onPromptModeChange?: (isPromptMode: boolean, context: PromptModeContext) => void | Promise<void>;
289
+ onSelectionBox?: (visible: boolean, bounds: OverlayBounds | null, element: Element | null) => void | Promise<void>;
290
+ onDragBox?: (visible: boolean, bounds: OverlayBounds | null) => void | Promise<void>;
291
+ onGrabbedBox?: (bounds: OverlayBounds, element: Element) => void | Promise<void>;
292
+ onElementLabel?: (visible: boolean, variant: ElementLabelVariant, context: ElementLabelContext) => void | Promise<void>;
293
+ onContextMenu?: (element: Element, position: Position) => void | Promise<void>;
279
294
  onOpenFile?: (filePath: string, lineNumber?: number) => boolean | void;
280
295
  transformHtmlContent?: (html: string, elements: Element[]) => string | Promise<string>;
281
296
  transformAgentContext?: (context: AgentContext, elements: Element[]) => AgentContext | Promise<AgentContext>;
@@ -287,7 +302,7 @@ interface PluginConfig {
287
302
  options?: SettableOptions;
288
303
  actions?: ContextMenuAction[];
289
304
  hooks?: PluginHooks;
290
- cleanup?: () => void;
305
+ cleanup?: () => undefined;
291
306
  }
292
307
  interface Plugin {
293
308
  name: string;
@@ -430,13 +445,19 @@ interface FrozenLabelEntry {
430
445
  bounds: OverlayBounds;
431
446
  mouseX?: number;
432
447
  }
448
+ interface FrozenLabelEntryAccessor {
449
+ read: () => FrozenLabelEntry | null;
450
+ }
451
+ interface SelectionLabelInstanceAccessor {
452
+ read: () => SelectionLabelInstance | null;
453
+ }
433
454
  interface ReactGrabRendererProps {
434
455
  selectionVisible?: boolean;
435
456
  selectionBounds?: OverlayBounds;
436
457
  selectionBoundsMultiple?: OverlayBounds[];
437
458
  selectionShouldSnap?: boolean;
438
459
  selectionElementsCount?: number;
439
- frozenLabelEntries?: FrozenLabelEntry[];
460
+ frozenLabelEntryAccessors?: FrozenLabelEntryAccessor[];
440
461
  pendingShiftPreviewEntry?: FrozenLabelEntry;
441
462
  selectionFilePath?: string;
442
463
  selectionLineNumber?: number;
@@ -447,6 +468,7 @@ interface ReactGrabRendererProps {
447
468
  hierarchyState?: HierarchyState;
448
469
  hierarchyMenuPosition?: DropdownAnchor | null;
449
470
  labelInstances?: SelectionLabelInstance[];
471
+ labelInstanceAccessors?: SelectionLabelInstanceAccessor[];
450
472
  dragVisible?: boolean;
451
473
  dragBounds?: OverlayBounds;
452
474
  grabbedBoxes?: Array<{
@@ -467,6 +489,7 @@ interface ReactGrabRendererProps {
467
489
  onToggleExpand?: () => void;
468
490
  selectionLabelShakeCount?: number;
469
491
  onConfirmDismiss?: () => void;
492
+ onOpenSelectionFile?: () => void;
470
493
  discardPrompt?: SelectionDiscardPrompt;
471
494
  toolbarVisible?: boolean;
472
495
  isActive?: boolean;
@@ -548,7 +571,7 @@ interface ReactGrabEntry {
548
571
  frames?: ReactGrabStackFrame[];
549
572
  }
550
573
  //#endregion
551
- //#region ../../node_modules/.pnpm/bippy@0.5.43_react@19.2.6/node_modules/bippy/dist/core.d.ts
574
+ //#region ../../node_modules/.pnpm/bippy@0.6.0_react@19.2.6/node_modules/bippy/dist/unsubscribe.d.ts
552
575
  type Flags = number;
553
576
  type Lanes = number;
554
577
  type TypeOfMode = number;
@@ -638,6 +661,14 @@ interface Effect {
638
661
  interface Family {
639
662
  current: unknown;
640
663
  }
664
+ /**
665
+ * React 19 flight metadata for a server component owner (ReactComponentInfo).
666
+ * Unlike client owners it has no `tag`; the owner chain continues via `owner`.
667
+ */
668
+ interface RendererRefreshUpdate {
669
+ staleFamilies: Set<Family>;
670
+ updatedFamilies: Set<Family>;
671
+ }
641
672
  /**
642
673
  * Represents a react-internal Fiber node.
643
674
  */
@@ -688,6 +719,7 @@ interface ReactDevToolsGlobalHook {
688
719
  onCommitFiberRoot: (rendererID: number, root: FiberRoot, priority: number | void) => void;
689
720
  onCommitFiberUnmount: (rendererID: number, fiber: Fiber) => void;
690
721
  onPostCommitFiberRoot: (rendererID: number, root: FiberRoot) => void;
722
+ onScheduleFiberRoot?: (rendererID: number, root: FiberRoot, children: ReactNode) => void;
691
723
  renderers: Map<number, ReactRenderer>;
692
724
  supportsFiber: boolean;
693
725
  supportsFlight: boolean;
@@ -706,10 +738,7 @@ interface ReactRenderer {
706
738
  overridePropsRenamePath?: (fiber: Fiber, oldPath: Array<number | string>, newPath: Array<number | string>) => void;
707
739
  reconcilerVersion: string;
708
740
  rendererPackageName: string;
709
- scheduleRefresh?: (root: FiberRoot, update: {
710
- staleFamilies: Set<Family>;
711
- updatedFamilies: Set<Family>;
712
- }) => void;
741
+ scheduleRefresh?: (root: FiberRoot, update: RendererRefreshUpdate) => void;
713
742
  scheduleRoot?: (root: FiberRoot, element: React.ReactNode) => void;
714
743
  scheduleUpdate?: (fiber: Fiber) => void;
715
744
  setErrorHandler?: (newShouldErrorImpl: (fiber: Fiber) => boolean) => void;
@@ -720,28 +749,30 @@ interface ReactRenderer {
720
749
  declare global {
721
750
  var __REACT_DEVTOOLS_GLOBAL_HOOK__: ReactDevToolsGlobalHook | undefined;
722
751
  } //#endregion
723
- //#region src/rdt-hook.d.ts
724
- /**
725
- * Returns `true` if bippy's instrumentation is active.
726
- */
727
- declare const isInstrumentationActive: () => boolean;
728
- /**
729
- * Returns the latest fiber (since it may be double-buffered).
730
- */
752
+ //#region src/unsubscribe.d.ts
731
753
  //#endregion
732
- //#region ../../node_modules/.pnpm/bippy@0.5.43_react@19.2.6/node_modules/bippy/dist/source.d.ts
754
+ //#region ../../node_modules/.pnpm/bippy@0.6.0_react@19.2.6/node_modules/bippy/dist/source.d.ts
733
755
  //#region src/source/parse-stack.d.ts
734
756
  interface StackFrame {
735
757
  args?: unknown[];
736
758
  columnNumber?: number;
737
759
  lineNumber?: number;
760
+ enclosingLineNumber?: number;
761
+ enclosingColumnNumber?: number;
738
762
  fileName?: string;
739
763
  functionName?: string;
740
764
  source?: string;
741
765
  isServer?: boolean;
742
766
  isSymbolicated?: boolean;
767
+ isIgnoreListed?: boolean;
743
768
  }
744
769
  //#endregion
770
+ //#region ../../node_modules/.pnpm/bippy@0.6.0_react@19.2.6/node_modules/bippy/dist/core.d.ts
771
+ /**
772
+ * Returns `true` if bippy's instrumentation is active.
773
+ */
774
+ declare const isInstrumentationActive: () => boolean;
775
+ //#endregion
745
776
  //#region src/utils/copy-content.d.ts
746
777
  interface CopyContentOptions {
747
778
  componentName?: string;
@@ -751,4 +782,4 @@ interface CopyContentOptions {
751
782
  }
752
783
  declare const copyContent: (content: string, options?: CopyContentOptions) => boolean;
753
784
  //#endregion
754
- export { SourceInfo as A, PromptModeContext as C, Rect as D, ReactGrabState as E, ToolbarState as M, SelectedElementPayload as O, Position as S, ReactGrabRendererProps as T, Options as _, ActionContext as a, PluginConfig as b, AgentContext as c, DeepPartial as d, DragRect as f, GrabbedBox as g, ElementSelectedEventDetail as h, isInstrumentationActive as i, Theme as j, SettableOptions as k, ContextMenuAction as l, ElementLabelVariant as m, StackFrame as n, ActionContextHooks as o, ElementLabelContext as p, Fiber as r, ActivationMode as s, copyContent as t, ContextMenuActionContext as u, OverlayBounds as v, ReactGrabAPI as w, PluginHooks as x, Plugin as y };
785
+ export { Rect as A, PluginConfig as C, ReactGrabAPI as D, PromptModeContext as E, ToolbarState as F, SettableOptions as M, SourceInfo as N, ReactGrabRendererProps as O, Theme as P, Plugin as S, Position as T, ElementSelectedEventDetail as _, ActionContext as a, Options as b, AgentContext as c, DeepPartial as d, DragRect as f, ElementLabelVariant as g, ElementLabelContext as h, Fiber as i, SelectedElementPayload as j, ReactGrabState as k, ContextMenuAction as l, ElementBounds as m, isInstrumentationActive as n, ActionContextHooks as o, ElementAtPointOptions as p, StackFrame as r, ActivationMode as s, copyContent as t, ContextMenuActionContext as u, GrabbedBox as v, PluginHooks as w, OverlayBounds as x, OpenFileActionHooks as y };
@@ -6,4 +6,4 @@
6
6
  * This source code is licensed under the MIT license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../core-7jNiR5NZ.cjs`),t=require(`../freeze-updates-CqzBfk2W.cjs`),n=require(`../copy-content-DoR-wbHM.cjs`);exports.DEFAULT_THEME=e.a,exports.copyContent=n.t,exports.formatElementInfo=n.n,exports.generateSnippet=e.n,exports.getStack=n.o,exports.init=e.t,exports.isInstrumentationActive=t.N;
9
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../core-DUaBdaBx.cjs`),t=require(`../freeze-updates-Dy4xv_JC.cjs`),n=require(`../open-file-DDxsoo-i.cjs`);exports.DEFAULT_THEME=e.l,exports.copyContent=n.n,exports.formatElementInfo=n.r,exports.generateSnippet=e.n,exports.getStack=n.s,exports.init=e.t,exports.isInstrumentationActive=t.U;
@@ -6,6 +6,6 @@
6
6
  * This source code is licensed under the MIT license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
- import { A as SourceInfo, T as ReactGrabRendererProps, _ as Options, a as ActionContext, b as PluginConfig, c as AgentContext, i as isInstrumentationActive, k as SettableOptions, l as ContextMenuAction, t as copyContent, v as OverlayBounds, w as ReactGrabAPI, x as PluginHooks, y as Plugin } from "../copy-content-BPB8MmpL.cjs";
10
- import { a as getStack, i as formatElementInfo, n as generateSnippet, r as DEFAULT_THEME, t as init } from "../index-DMyJsiaz.cjs";
9
+ import { C as PluginConfig, D as ReactGrabAPI, M as SettableOptions, N as SourceInfo, O as ReactGrabRendererProps, S as Plugin, a as ActionContext, b as Options, c as AgentContext, l as ContextMenuAction, n as isInstrumentationActive, t as copyContent, w as PluginHooks, x as OverlayBounds } from "../copy-content-CtYUWe5l.cjs";
10
+ import { a as getStack, i as formatElementInfo, n as generateSnippet, r as DEFAULT_THEME, t as init } from "../index-BgTe-uWs.cjs";
11
11
  export { ActionContext, AgentContext, ContextMenuAction, DEFAULT_THEME, Options, OverlayBounds, Plugin, PluginConfig, PluginHooks, ReactGrabAPI, ReactGrabRendererProps, SettableOptions, SourceInfo, copyContent, formatElementInfo, generateSnippet, getStack, init, isInstrumentationActive };
@@ -6,6 +6,6 @@
6
6
  * This source code is licensed under the MIT license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
- import { A as SourceInfo, T as ReactGrabRendererProps, _ as Options, a as ActionContext, b as PluginConfig, c as AgentContext, i as isInstrumentationActive, k as SettableOptions, l as ContextMenuAction, t as copyContent, v as OverlayBounds, w as ReactGrabAPI, x as PluginHooks, y as Plugin } from "../copy-content-C7lFyXsY.js";
10
- import { a as getStack, i as formatElementInfo, n as generateSnippet, r as DEFAULT_THEME, t as init } from "../index-VkohC_Hw.js";
9
+ import { C as PluginConfig, D as ReactGrabAPI, M as SettableOptions, N as SourceInfo, O as ReactGrabRendererProps, S as Plugin, a as ActionContext, b as Options, c as AgentContext, l as ContextMenuAction, n as isInstrumentationActive, t as copyContent, w as PluginHooks, x as OverlayBounds } from "../copy-content-CNRKFr6F.js";
10
+ import { a as getStack, i as formatElementInfo, n as generateSnippet, r as DEFAULT_THEME, t as init } from "../index-CdWMNcJF.js";
11
11
  export { ActionContext, AgentContext, ContextMenuAction, DEFAULT_THEME, Options, OverlayBounds, Plugin, PluginConfig, PluginHooks, ReactGrabAPI, ReactGrabRendererProps, SettableOptions, SourceInfo, copyContent, formatElementInfo, generateSnippet, getStack, init, isInstrumentationActive };
@@ -6,4 +6,4 @@
6
6
  * This source code is licensed under the MIT license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
- import{a as e,n as t,t as n}from"../core-C2C_YRT3.js";import{N as r}from"../freeze-updates-DlHvYaiv.js";import{n as i,o as a,t as o}from"../copy-content-CbjqLSIH.js";export{e as DEFAULT_THEME,o as copyContent,i as formatElementInfo,t as generateSnippet,a as getStack,n as init,r as isInstrumentationActive};
9
+ import{l as e,n as t,t as n}from"../core-DtCvyR6O.js";import{U as r}from"../freeze-updates-BV9yAm-a.js";import{n as i,r as a,s as o}from"../open-file-Cdyp5qMt.js";export{e as DEFAULT_THEME,i as copyContent,a as formatElementInfo,t as generateSnippet,o as getStack,n as init,r as isInstrumentationActive};