react-grab 0.1.48 → 0.1.49-dev.c704a67

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 (42) hide show
  1. package/README.md +16 -59
  2. package/dist/{copy-content-BPJ08fM-.d.cts → copy-content-CcSwO8vJ.d.ts} +68 -36
  3. package/dist/{copy-content-tDo_MSv9.d.ts → copy-content-Dxdqj7pl.d.cts} +68 -36
  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-DDUyWwIM.cjs +14 -0
  9. package/dist/core-ICddiuc-.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-DWdsRzfn.cjs +9 -0
  13. package/dist/execute-context-menu-action-NGurrRz4.js +9 -0
  14. package/dist/freeze-updates-BG_wQYjL.js +43 -0
  15. package/dist/freeze-updates-sokrLTw8.cjs +43 -0
  16. package/dist/{index-Cx-YnOMQ.d.ts → index-Cd-ADR9Q.d.ts} +1 -1
  17. package/dist/{index-CjtwpNJq.d.cts → index-DdYffA2X.d.cts} +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-BumkIdCE.cjs +20 -0
  24. package/dist/open-file-ST9byhOS.js +29 -0
  25. package/dist/primitives.cjs +2 -2
  26. package/dist/primitives.d.cts +51 -2
  27. package/dist/primitives.d.ts +51 -2
  28. package/dist/primitives.js +2 -2
  29. package/dist/renderer-C9kv-VJx.js +9 -0
  30. package/dist/renderer-DhnDbrj1.cjs +9 -0
  31. package/dist/styles.css +1 -1
  32. package/package.json +11 -5
  33. package/dist/copy-content-BuqfLMsd.js +0 -10
  34. package/dist/copy-content-t2EX8O0f.cjs +0 -10
  35. package/dist/core-BG_m3H2l.js +0 -14
  36. package/dist/core-Dc7B2kQ-.cjs +0 -14
  37. package/dist/create-pointer-move-prompt-handoff-C_G_UhQ-.js +0 -9
  38. package/dist/create-pointer-move-prompt-handoff-CaakrBE0.cjs +0 -9
  39. package/dist/freeze-updates-DWTRok0k.cjs +0 -51
  40. package/dist/freeze-updates-DrGhS1i0.js +0 -51
  41. package/dist/renderer-Bg32Pg9L.cjs +0 -9
  42. package/dist/renderer-OgmF5gNo.js +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,29 @@ 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) => isElementGrabbable(candidate) && !toolbarElement.contains(candidate),
155
136
  });
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
137
  ```
181
138
 
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.
139
+ Add `data-react-grab-ignore` to your picker interface so hit testing skips its subtree.
183
140
 
184
141
  ## Resources & Contributing Back
185
142
 
@@ -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[];
@@ -228,14 +243,12 @@ interface PreviewStyles {
228
243
  interface EditPanelState {
229
244
  element: Element;
230
245
  position: Position;
231
- selectionBounds: OverlayBounds;
232
246
  properties: EditableProperty[];
233
247
  preview: PreviewStyles;
234
248
  filePath?: string;
235
249
  lineNumber?: number;
236
250
  componentName?: string;
237
251
  tagName?: string;
238
- htmlPreview?: string;
239
252
  initialSearchQuery?: string;
240
253
  hasSessionEdits?: boolean;
241
254
  designTokens?: DesignTokenResolver;
@@ -260,24 +273,24 @@ interface HierarchyState {
260
273
  activeIndex: number;
261
274
  }
262
275
  interface PluginHooks {
263
- onActivate?: () => void;
264
- onDeactivate?: () => void;
265
- onElementHover?: (element: Element) => void;
276
+ onActivate?: () => void | Promise<void>;
277
+ onDeactivate?: () => void | Promise<void>;
278
+ onElementHover?: (element: Element) => void | Promise<void>;
266
279
  onElementSelect?: (element: Element) => boolean | void | Promise<boolean>;
267
- onDragStart?: (startX: number, startY: number) => void;
268
- onDragEnd?: (elements: Element[], bounds: DragRect) => void;
280
+ onDragStart?: (startX: number, startY: number) => void | Promise<void>;
281
+ onDragEnd?: (elements: Element[], bounds: DragRect) => void | Promise<void>;
269
282
  onBeforeCopy?: (elements: Element[]) => void | Promise<void>;
270
283
  transformCopyContent?: (content: string, elements: Element[]) => string | Promise<string>;
271
- onAfterCopy?: (elements: Element[], success: boolean) => void;
272
- onCopySuccess?: (elements: Element[], content: string) => void;
273
- onCopyError?: (error: Error) => void;
274
- onStateChange?: (state: ReactGrabState) => void;
275
- onPromptModeChange?: (isPromptMode: boolean, context: PromptModeContext) => void;
276
- onSelectionBox?: (visible: boolean, bounds: OverlayBounds | null, element: Element | null) => void;
277
- onDragBox?: (visible: boolean, bounds: OverlayBounds | null) => void;
278
- onGrabbedBox?: (bounds: OverlayBounds, element: Element) => void;
279
- onElementLabel?: (visible: boolean, variant: ElementLabelVariant, context: ElementLabelContext) => void;
280
- 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>;
281
294
  onOpenFile?: (filePath: string, lineNumber?: number) => boolean | void;
282
295
  transformHtmlContent?: (html: string, elements: Element[]) => string | Promise<string>;
283
296
  transformAgentContext?: (context: AgentContext, elements: Element[]) => AgentContext | Promise<AgentContext>;
@@ -289,7 +302,7 @@ interface PluginConfig {
289
302
  options?: SettableOptions;
290
303
  actions?: ContextMenuAction[];
291
304
  hooks?: PluginHooks;
292
- cleanup?: () => void;
305
+ cleanup?: () => undefined;
293
306
  }
294
307
  interface Plugin {
295
308
  name: string;
@@ -343,6 +356,7 @@ interface SettableOptions extends Options {
343
356
  interface SourceInfo {
344
357
  filePath: string;
345
358
  lineNumber: number | null;
359
+ columnNumber: number | null;
346
360
  componentName: string | null;
347
361
  }
348
362
  interface SelectedElementPayload {
@@ -432,13 +446,19 @@ interface FrozenLabelEntry {
432
446
  bounds: OverlayBounds;
433
447
  mouseX?: number;
434
448
  }
449
+ interface FrozenLabelEntryAccessor {
450
+ read: () => FrozenLabelEntry | null;
451
+ }
452
+ interface SelectionLabelInstanceAccessor {
453
+ read: () => SelectionLabelInstance | null;
454
+ }
435
455
  interface ReactGrabRendererProps {
436
456
  selectionVisible?: boolean;
437
457
  selectionBounds?: OverlayBounds;
438
458
  selectionBoundsMultiple?: OverlayBounds[];
439
459
  selectionShouldSnap?: boolean;
440
460
  selectionElementsCount?: number;
441
- frozenLabelEntries?: FrozenLabelEntry[];
461
+ frozenLabelEntryAccessors?: FrozenLabelEntryAccessor[];
442
462
  pendingShiftPreviewEntry?: FrozenLabelEntry;
443
463
  selectionFilePath?: string;
444
464
  selectionLineNumber?: number;
@@ -449,6 +469,7 @@ interface ReactGrabRendererProps {
449
469
  hierarchyState?: HierarchyState;
450
470
  hierarchyMenuPosition?: DropdownAnchor | null;
451
471
  labelInstances?: SelectionLabelInstance[];
472
+ labelInstanceAccessors?: SelectionLabelInstanceAccessor[];
452
473
  dragVisible?: boolean;
453
474
  dragBounds?: OverlayBounds;
454
475
  grabbedBoxes?: Array<{
@@ -461,12 +482,15 @@ interface ReactGrabRendererProps {
461
482
  inputValue?: string;
462
483
  isPromptMode?: boolean;
463
484
  onShowContextMenuInstance?: (instanceId: string) => void;
485
+ onRetryInstance?: (instanceId: string) => void;
486
+ onAcknowledgeErrorInstance?: (instanceId: string) => void;
464
487
  onLabelInstanceHoverChange?: (instanceId: string, isHovered: boolean) => void;
465
488
  onInputChange?: (value: string) => void;
466
489
  onInputSubmit?: () => void;
467
490
  onToggleExpand?: () => void;
468
491
  selectionLabelShakeCount?: number;
469
492
  onConfirmDismiss?: () => void;
493
+ onOpenSelectionFile?: () => void;
470
494
  discardPrompt?: SelectionDiscardPrompt;
471
495
  toolbarVisible?: boolean;
472
496
  isActive?: boolean;
@@ -548,7 +572,7 @@ interface ReactGrabEntry {
548
572
  frames?: ReactGrabStackFrame[];
549
573
  }
550
574
  //#endregion
551
- //#region ../../node_modules/.pnpm/bippy@0.5.43_react@19.2.6/node_modules/bippy/dist/core.d.ts
575
+ //#region ../../node_modules/.pnpm/bippy@0.6.1_react@19.2.6/node_modules/bippy/dist/unsubscribe.d.ts
552
576
  type Flags = number;
553
577
  type Lanes = number;
554
578
  type TypeOfMode = number;
@@ -638,6 +662,14 @@ interface Effect {
638
662
  interface Family {
639
663
  current: unknown;
640
664
  }
665
+ /**
666
+ * React 19 flight metadata for a server component owner (ReactComponentInfo).
667
+ * Unlike client owners it has no `tag`; the owner chain continues via `owner`.
668
+ */
669
+ interface RendererRefreshUpdate {
670
+ staleFamilies: Set<Family>;
671
+ updatedFamilies: Set<Family>;
672
+ }
641
673
  /**
642
674
  * Represents a react-internal Fiber node.
643
675
  */
@@ -688,6 +720,7 @@ interface ReactDevToolsGlobalHook {
688
720
  onCommitFiberRoot: (rendererID: number, root: FiberRoot, priority: number | void) => void;
689
721
  onCommitFiberUnmount: (rendererID: number, fiber: Fiber) => void;
690
722
  onPostCommitFiberRoot: (rendererID: number, root: FiberRoot) => void;
723
+ onScheduleFiberRoot?: (rendererID: number, root: FiberRoot, children: ReactNode) => void;
691
724
  renderers: Map<number, ReactRenderer>;
692
725
  supportsFiber: boolean;
693
726
  supportsFlight: boolean;
@@ -706,10 +739,7 @@ interface ReactRenderer {
706
739
  overridePropsRenamePath?: (fiber: Fiber, oldPath: Array<number | string>, newPath: Array<number | string>) => void;
707
740
  reconcilerVersion: string;
708
741
  rendererPackageName: string;
709
- scheduleRefresh?: (root: FiberRoot, update: {
710
- staleFamilies: Set<Family>;
711
- updatedFamilies: Set<Family>;
712
- }) => void;
742
+ scheduleRefresh?: (root: FiberRoot, update: RendererRefreshUpdate) => void;
713
743
  scheduleRoot?: (root: FiberRoot, element: React.ReactNode) => void;
714
744
  scheduleUpdate?: (fiber: Fiber) => void;
715
745
  setErrorHandler?: (newShouldErrorImpl: (fiber: Fiber) => boolean) => void;
@@ -720,28 +750,30 @@ interface ReactRenderer {
720
750
  declare global {
721
751
  var __REACT_DEVTOOLS_GLOBAL_HOOK__: ReactDevToolsGlobalHook | undefined;
722
752
  } //#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
- */
753
+ //#region src/unsubscribe.d.ts
731
754
  //#endregion
732
- //#region ../../node_modules/.pnpm/bippy@0.5.43_react@19.2.6/node_modules/bippy/dist/source.d.ts
755
+ //#region ../../node_modules/.pnpm/bippy@0.6.1_react@19.2.6/node_modules/bippy/dist/source.d.ts
733
756
  //#region src/source/parse-stack.d.ts
734
757
  interface StackFrame {
735
758
  args?: unknown[];
736
759
  columnNumber?: number;
737
760
  lineNumber?: number;
761
+ enclosingLineNumber?: number;
762
+ enclosingColumnNumber?: number;
738
763
  fileName?: string;
739
764
  functionName?: string;
740
765
  source?: string;
741
766
  isServer?: boolean;
742
767
  isSymbolicated?: boolean;
768
+ isIgnoreListed?: boolean;
743
769
  }
744
770
  //#endregion
771
+ //#region ../../node_modules/.pnpm/bippy@0.6.1_react@19.2.6/node_modules/bippy/dist/core.d.ts
772
+ /**
773
+ * Returns `true` if bippy's instrumentation is active.
774
+ */
775
+ declare const isInstrumentationActive: () => boolean;
776
+ //#endregion
745
777
  //#region src/utils/copy-content.d.ts
746
778
  interface CopyContentOptions {
747
779
  componentName?: string;
@@ -751,4 +783,4 @@ interface CopyContentOptions {
751
783
  }
752
784
  declare const copyContent: (content: string, options?: CopyContentOptions) => boolean;
753
785
  //#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 };
786
+ 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[];
@@ -228,14 +243,12 @@ interface PreviewStyles {
228
243
  interface EditPanelState {
229
244
  element: Element;
230
245
  position: Position;
231
- selectionBounds: OverlayBounds;
232
246
  properties: EditableProperty[];
233
247
  preview: PreviewStyles;
234
248
  filePath?: string;
235
249
  lineNumber?: number;
236
250
  componentName?: string;
237
251
  tagName?: string;
238
- htmlPreview?: string;
239
252
  initialSearchQuery?: string;
240
253
  hasSessionEdits?: boolean;
241
254
  designTokens?: DesignTokenResolver;
@@ -260,24 +273,24 @@ interface HierarchyState {
260
273
  activeIndex: number;
261
274
  }
262
275
  interface PluginHooks {
263
- onActivate?: () => void;
264
- onDeactivate?: () => void;
265
- onElementHover?: (element: Element) => void;
276
+ onActivate?: () => void | Promise<void>;
277
+ onDeactivate?: () => void | Promise<void>;
278
+ onElementHover?: (element: Element) => void | Promise<void>;
266
279
  onElementSelect?: (element: Element) => boolean | void | Promise<boolean>;
267
- onDragStart?: (startX: number, startY: number) => void;
268
- onDragEnd?: (elements: Element[], bounds: DragRect) => void;
280
+ onDragStart?: (startX: number, startY: number) => void | Promise<void>;
281
+ onDragEnd?: (elements: Element[], bounds: DragRect) => void | Promise<void>;
269
282
  onBeforeCopy?: (elements: Element[]) => void | Promise<void>;
270
283
  transformCopyContent?: (content: string, elements: Element[]) => string | Promise<string>;
271
- onAfterCopy?: (elements: Element[], success: boolean) => void;
272
- onCopySuccess?: (elements: Element[], content: string) => void;
273
- onCopyError?: (error: Error) => void;
274
- onStateChange?: (state: ReactGrabState) => void;
275
- onPromptModeChange?: (isPromptMode: boolean, context: PromptModeContext) => void;
276
- onSelectionBox?: (visible: boolean, bounds: OverlayBounds | null, element: Element | null) => void;
277
- onDragBox?: (visible: boolean, bounds: OverlayBounds | null) => void;
278
- onGrabbedBox?: (bounds: OverlayBounds, element: Element) => void;
279
- onElementLabel?: (visible: boolean, variant: ElementLabelVariant, context: ElementLabelContext) => void;
280
- 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>;
281
294
  onOpenFile?: (filePath: string, lineNumber?: number) => boolean | void;
282
295
  transformHtmlContent?: (html: string, elements: Element[]) => string | Promise<string>;
283
296
  transformAgentContext?: (context: AgentContext, elements: Element[]) => AgentContext | Promise<AgentContext>;
@@ -289,7 +302,7 @@ interface PluginConfig {
289
302
  options?: SettableOptions;
290
303
  actions?: ContextMenuAction[];
291
304
  hooks?: PluginHooks;
292
- cleanup?: () => void;
305
+ cleanup?: () => undefined;
293
306
  }
294
307
  interface Plugin {
295
308
  name: string;
@@ -343,6 +356,7 @@ interface SettableOptions extends Options {
343
356
  interface SourceInfo {
344
357
  filePath: string;
345
358
  lineNumber: number | null;
359
+ columnNumber: number | null;
346
360
  componentName: string | null;
347
361
  }
348
362
  interface SelectedElementPayload {
@@ -432,13 +446,19 @@ interface FrozenLabelEntry {
432
446
  bounds: OverlayBounds;
433
447
  mouseX?: number;
434
448
  }
449
+ interface FrozenLabelEntryAccessor {
450
+ read: () => FrozenLabelEntry | null;
451
+ }
452
+ interface SelectionLabelInstanceAccessor {
453
+ read: () => SelectionLabelInstance | null;
454
+ }
435
455
  interface ReactGrabRendererProps {
436
456
  selectionVisible?: boolean;
437
457
  selectionBounds?: OverlayBounds;
438
458
  selectionBoundsMultiple?: OverlayBounds[];
439
459
  selectionShouldSnap?: boolean;
440
460
  selectionElementsCount?: number;
441
- frozenLabelEntries?: FrozenLabelEntry[];
461
+ frozenLabelEntryAccessors?: FrozenLabelEntryAccessor[];
442
462
  pendingShiftPreviewEntry?: FrozenLabelEntry;
443
463
  selectionFilePath?: string;
444
464
  selectionLineNumber?: number;
@@ -449,6 +469,7 @@ interface ReactGrabRendererProps {
449
469
  hierarchyState?: HierarchyState;
450
470
  hierarchyMenuPosition?: DropdownAnchor | null;
451
471
  labelInstances?: SelectionLabelInstance[];
472
+ labelInstanceAccessors?: SelectionLabelInstanceAccessor[];
452
473
  dragVisible?: boolean;
453
474
  dragBounds?: OverlayBounds;
454
475
  grabbedBoxes?: Array<{
@@ -461,12 +482,15 @@ interface ReactGrabRendererProps {
461
482
  inputValue?: string;
462
483
  isPromptMode?: boolean;
463
484
  onShowContextMenuInstance?: (instanceId: string) => void;
485
+ onRetryInstance?: (instanceId: string) => void;
486
+ onAcknowledgeErrorInstance?: (instanceId: string) => void;
464
487
  onLabelInstanceHoverChange?: (instanceId: string, isHovered: boolean) => void;
465
488
  onInputChange?: (value: string) => void;
466
489
  onInputSubmit?: () => void;
467
490
  onToggleExpand?: () => void;
468
491
  selectionLabelShakeCount?: number;
469
492
  onConfirmDismiss?: () => void;
493
+ onOpenSelectionFile?: () => void;
470
494
  discardPrompt?: SelectionDiscardPrompt;
471
495
  toolbarVisible?: boolean;
472
496
  isActive?: boolean;
@@ -548,7 +572,7 @@ interface ReactGrabEntry {
548
572
  frames?: ReactGrabStackFrame[];
549
573
  }
550
574
  //#endregion
551
- //#region ../../node_modules/.pnpm/bippy@0.5.43_react@19.2.6/node_modules/bippy/dist/core.d.ts
575
+ //#region ../../node_modules/.pnpm/bippy@0.6.1_react@19.2.6/node_modules/bippy/dist/unsubscribe.d.ts
552
576
  type Flags = number;
553
577
  type Lanes = number;
554
578
  type TypeOfMode = number;
@@ -638,6 +662,14 @@ interface Effect {
638
662
  interface Family {
639
663
  current: unknown;
640
664
  }
665
+ /**
666
+ * React 19 flight metadata for a server component owner (ReactComponentInfo).
667
+ * Unlike client owners it has no `tag`; the owner chain continues via `owner`.
668
+ */
669
+ interface RendererRefreshUpdate {
670
+ staleFamilies: Set<Family>;
671
+ updatedFamilies: Set<Family>;
672
+ }
641
673
  /**
642
674
  * Represents a react-internal Fiber node.
643
675
  */
@@ -688,6 +720,7 @@ interface ReactDevToolsGlobalHook {
688
720
  onCommitFiberRoot: (rendererID: number, root: FiberRoot, priority: number | void) => void;
689
721
  onCommitFiberUnmount: (rendererID: number, fiber: Fiber) => void;
690
722
  onPostCommitFiberRoot: (rendererID: number, root: FiberRoot) => void;
723
+ onScheduleFiberRoot?: (rendererID: number, root: FiberRoot, children: ReactNode) => void;
691
724
  renderers: Map<number, ReactRenderer>;
692
725
  supportsFiber: boolean;
693
726
  supportsFlight: boolean;
@@ -706,10 +739,7 @@ interface ReactRenderer {
706
739
  overridePropsRenamePath?: (fiber: Fiber, oldPath: Array<number | string>, newPath: Array<number | string>) => void;
707
740
  reconcilerVersion: string;
708
741
  rendererPackageName: string;
709
- scheduleRefresh?: (root: FiberRoot, update: {
710
- staleFamilies: Set<Family>;
711
- updatedFamilies: Set<Family>;
712
- }) => void;
742
+ scheduleRefresh?: (root: FiberRoot, update: RendererRefreshUpdate) => void;
713
743
  scheduleRoot?: (root: FiberRoot, element: React.ReactNode) => void;
714
744
  scheduleUpdate?: (fiber: Fiber) => void;
715
745
  setErrorHandler?: (newShouldErrorImpl: (fiber: Fiber) => boolean) => void;
@@ -720,28 +750,30 @@ interface ReactRenderer {
720
750
  declare global {
721
751
  var __REACT_DEVTOOLS_GLOBAL_HOOK__: ReactDevToolsGlobalHook | undefined;
722
752
  } //#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
- */
753
+ //#region src/unsubscribe.d.ts
731
754
  //#endregion
732
- //#region ../../node_modules/.pnpm/bippy@0.5.43_react@19.2.6/node_modules/bippy/dist/source.d.ts
755
+ //#region ../../node_modules/.pnpm/bippy@0.6.1_react@19.2.6/node_modules/bippy/dist/source.d.ts
733
756
  //#region src/source/parse-stack.d.ts
734
757
  interface StackFrame {
735
758
  args?: unknown[];
736
759
  columnNumber?: number;
737
760
  lineNumber?: number;
761
+ enclosingLineNumber?: number;
762
+ enclosingColumnNumber?: number;
738
763
  fileName?: string;
739
764
  functionName?: string;
740
765
  source?: string;
741
766
  isServer?: boolean;
742
767
  isSymbolicated?: boolean;
768
+ isIgnoreListed?: boolean;
743
769
  }
744
770
  //#endregion
771
+ //#region ../../node_modules/.pnpm/bippy@0.6.1_react@19.2.6/node_modules/bippy/dist/core.d.ts
772
+ /**
773
+ * Returns `true` if bippy's instrumentation is active.
774
+ */
775
+ declare const isInstrumentationActive: () => boolean;
776
+ //#endregion
745
777
  //#region src/utils/copy-content.d.ts
746
778
  interface CopyContentOptions {
747
779
  componentName?: string;
@@ -751,4 +783,4 @@ interface CopyContentOptions {
751
783
  }
752
784
  declare const copyContent: (content: string, options?: CopyContentOptions) => boolean;
753
785
  //#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 };
786
+ 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-Dc7B2kQ-.cjs`),t=require(`../freeze-updates-DWTRok0k.cjs`),n=require(`../copy-content-t2EX8O0f.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.A;
9
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../core-DDUyWwIM.cjs`),t=require(`../freeze-updates-sokrLTw8.cjs`),n=require(`../open-file-BumkIdCE.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.it;
@@ -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-BPJ08fM-.cjs";
10
- import { a as getStack, i as formatElementInfo, n as generateSnippet, r as DEFAULT_THEME, t as init } from "../index-CjtwpNJq.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-Dxdqj7pl.cjs";
10
+ import { a as getStack, i as formatElementInfo, n as generateSnippet, r as DEFAULT_THEME, t as init } from "../index-DdYffA2X.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-tDo_MSv9.js";
10
- import { a as getStack, i as formatElementInfo, n as generateSnippet, r as DEFAULT_THEME, t as init } from "../index-Cx-YnOMQ.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-CcSwO8vJ.js";
10
+ import { a as getStack, i as formatElementInfo, n as generateSnippet, r as DEFAULT_THEME, t as init } from "../index-Cd-ADR9Q.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-BG_m3H2l.js";import{A as r}from"../freeze-updates-DrGhS1i0.js";import{n as i,o as a,t as o}from"../copy-content-BuqfLMsd.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-ICddiuc-.js";import{it as r}from"../freeze-updates-BG_wQYjL.js";import{n as i,r as a,s as o}from"../open-file-ST9byhOS.js";export{e as DEFAULT_THEME,i as copyContent,a as formatElementInfo,t as generateSnippet,o as getStack,n as init,r as isInstrumentationActive};