react-grab 0.1.47 → 0.1.48-dev.06cda9a

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 +18 -59
  2. package/dist/{copy-content-CqFXlS9J.d.ts → copy-content-CNRKFr6F.d.ts} +107 -42
  3. package/dist/{copy-content-BoeDJ9l0.d.cts → copy-content-CtYUWe5l.d.cts} +107 -42
  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-BRRAx8TD.js +14 -0
  9. package/dist/core-C_KU3ZuP.cjs +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-BD4Nv4s0.js +9 -0
  13. package/dist/execute-context-menu-action-CcaVL0mJ.cjs +9 -0
  14. package/dist/freeze-updates-CCSp2kR9.js +52 -0
  15. package/dist/freeze-updates-CeUaPRYb.cjs +52 -0
  16. package/dist/{index-Ci1cIBwN.d.cts → index-BgTe-uWs.d.cts} +1 -1
  17. package/dist/{index-ssynL7Na.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 -20
  22. package/dist/index.js +1 -1
  23. package/dist/open-file-BhNjSVzK.js +29 -0
  24. package/dist/open-file-NhyWAHag.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-9otVqSB-.cjs +9 -0
  30. package/dist/renderer-B8kwrqGU.js +9 -0
  31. package/dist/styles.css +1 -1
  32. package/package.json +19 -4
  33. package/dist/action-shortcuts-DK7e2eLe.cjs +0 -9
  34. package/dist/action-shortcuts-DN8Q9O9k.js +0 -9
  35. package/dist/copy-content-BG5RrXFG.cjs +0 -10
  36. package/dist/copy-content-Drw2cQ8V.js +0 -10
  37. package/dist/core-CX-oJjgu.js +0 -15
  38. package/dist/core-CvEeB6XL.cjs +0 -15
  39. package/dist/freeze-updates-8grKqOPM.cjs +0 -51
  40. package/dist/freeze-updates-DiPhJRln.js +0 -51
  41. package/dist/renderer-B79Ze5ly.js +0 -9
  42. package/dist/renderer-CjUwZ1og.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[];
@@ -214,6 +229,12 @@ interface EnumPendingEdit {
214
229
  }
215
230
  type PendingEdit = NumericPendingEdit | ColorPendingEdit | EnumPendingEdit;
216
231
  type PendingEdits = PendingEdit[];
232
+ interface DesignTokenResolver {
233
+ readonly hasTokens: boolean;
234
+ matchColor: (hex: string) => string | null;
235
+ matchLength: (px: number, cssProperty: string) => string | null;
236
+ stepLength: (px: number, direction: 1 | -1, cssProperty: string) => number | null;
237
+ }
217
238
  interface PreviewStyles {
218
239
  apply: (cssProperties: readonly string[], cssValue: string) => void;
219
240
  restore: () => void;
@@ -222,16 +243,15 @@ interface PreviewStyles {
222
243
  interface EditPanelState {
223
244
  element: Element;
224
245
  position: Position;
225
- selectionBounds: OverlayBounds;
226
246
  properties: EditableProperty[];
227
247
  preview: PreviewStyles;
228
248
  filePath?: string;
229
249
  lineNumber?: number;
230
250
  componentName?: string;
231
251
  tagName?: string;
232
- htmlPreview?: string;
233
252
  initialSearchQuery?: string;
234
253
  hasSessionEdits?: boolean;
254
+ designTokens?: DesignTokenResolver;
235
255
  }
236
256
  interface ContextMenuAction {
237
257
  id: string;
@@ -242,34 +262,35 @@ interface ContextMenuAction {
242
262
  enabled?: boolean | ((context: ActionContext) => boolean);
243
263
  onAction: (context: ContextMenuActionContext) => void | Promise<void>;
244
264
  }
245
- interface ArrowNavigationItem {
265
+ interface HierarchyItem {
246
266
  tagName: string;
247
267
  componentName?: string;
268
+ depth: number;
269
+ isLast: boolean;
248
270
  }
249
- interface ArrowNavigationState {
250
- items: ArrowNavigationItem[];
271
+ interface HierarchyState {
272
+ items: HierarchyItem[];
251
273
  activeIndex: number;
252
- isVisible: boolean;
253
274
  }
254
275
  interface PluginHooks {
255
- onActivate?: () => void;
256
- onDeactivate?: () => void;
257
- onElementHover?: (element: Element) => void;
276
+ onActivate?: () => void | Promise<void>;
277
+ onDeactivate?: () => void | Promise<void>;
278
+ onElementHover?: (element: Element) => void | Promise<void>;
258
279
  onElementSelect?: (element: Element) => boolean | void | Promise<boolean>;
259
- onDragStart?: (startX: number, startY: number) => void;
260
- onDragEnd?: (elements: Element[], bounds: DragRect) => void;
280
+ onDragStart?: (startX: number, startY: number) => void | Promise<void>;
281
+ onDragEnd?: (elements: Element[], bounds: DragRect) => void | Promise<void>;
261
282
  onBeforeCopy?: (elements: Element[]) => void | Promise<void>;
262
283
  transformCopyContent?: (content: string, elements: Element[]) => string | Promise<string>;
263
- onAfterCopy?: (elements: Element[], success: boolean) => void;
264
- onCopySuccess?: (elements: Element[], content: string) => void;
265
- onCopyError?: (error: Error) => void;
266
- onStateChange?: (state: ReactGrabState) => void;
267
- onPromptModeChange?: (isPromptMode: boolean, context: PromptModeContext) => void;
268
- onSelectionBox?: (visible: boolean, bounds: OverlayBounds | null, element: Element | null) => void;
269
- onDragBox?: (visible: boolean, bounds: OverlayBounds | null) => void;
270
- onGrabbedBox?: (bounds: OverlayBounds, element: Element) => void;
271
- onElementLabel?: (visible: boolean, variant: ElementLabelVariant, context: ElementLabelContext) => void;
272
- 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>;
273
294
  onOpenFile?: (filePath: string, lineNumber?: number) => boolean | void;
274
295
  transformHtmlContent?: (html: string, elements: Element[]) => string | Promise<string>;
275
296
  transformAgentContext?: (context: AgentContext, elements: Element[]) => AgentContext | Promise<AgentContext>;
@@ -281,7 +302,7 @@ interface PluginConfig {
281
302
  options?: SettableOptions;
282
303
  actions?: ContextMenuAction[];
283
304
  hooks?: PluginHooks;
284
- cleanup?: () => void;
305
+ cleanup?: () => undefined;
285
306
  }
286
307
  interface Plugin {
287
308
  name: string;
@@ -293,6 +314,12 @@ interface Plugin {
293
314
  }
294
315
  interface Options {
295
316
  enabled?: boolean;
317
+ /**
318
+ * Confine React Grab to a single container element instead of the whole page.
319
+ * Hit-testing, the toolbar viewport, and scroll re-anchoring are scoped to it.
320
+ * Used by the demo build to scope the showcase to its card.
321
+ */
322
+ container?: HTMLElement;
296
323
  activationMode?: ActivationMode;
297
324
  keyHoldDuration?: number;
298
325
  allowActivationInsideInput?: boolean;
@@ -324,12 +351,31 @@ interface Options {
324
351
  interface SettableOptions extends Options {
325
352
  enabled?: never;
326
353
  telemetry?: never;
354
+ container?: never;
327
355
  }
328
356
  interface SourceInfo {
329
357
  filePath: string;
330
358
  lineNumber: number | null;
331
359
  componentName: string | null;
332
360
  }
361
+ interface SelectedElementPayload {
362
+ tagName: string;
363
+ id?: string;
364
+ className?: string;
365
+ textContent?: string;
366
+ componentName?: string;
367
+ filePath?: string;
368
+ lineNumber?: number;
369
+ columnNumber?: number;
370
+ }
371
+ interface ElementSelectedEventDetail {
372
+ elements: SelectedElementPayload[];
373
+ }
374
+ declare global {
375
+ interface WindowEventMap {
376
+ "react-grab:element-selected": CustomEvent<ElementSelectedEventDetail>;
377
+ }
378
+ }
333
379
  interface ToolbarState {
334
380
  edge: "top" | "bottom" | "left" | "right";
335
381
  ratio: number;
@@ -353,6 +399,7 @@ interface ReactGrabAPI {
353
399
  getToolbarState: () => ToolbarState | null;
354
400
  setToolbarState: (state: Partial<ToolbarState>) => void;
355
401
  onToolbarStateChange: (callback: (state: ToolbarState) => void) => () => void;
402
+ reset: () => void;
356
403
  dispose: () => void;
357
404
  copyElement: (elements: Element | Element[]) => Promise<boolean>;
358
405
  getSource: (element: Element) => Promise<SourceInfo | null>;
@@ -398,13 +445,19 @@ interface FrozenLabelEntry {
398
445
  bounds: OverlayBounds;
399
446
  mouseX?: number;
400
447
  }
448
+ interface FrozenLabelEntryAccessor {
449
+ read: () => FrozenLabelEntry | null;
450
+ }
451
+ interface SelectionLabelInstanceAccessor {
452
+ read: () => SelectionLabelInstance | null;
453
+ }
401
454
  interface ReactGrabRendererProps {
402
455
  selectionVisible?: boolean;
403
456
  selectionBounds?: OverlayBounds;
404
457
  selectionBoundsMultiple?: OverlayBounds[];
405
458
  selectionShouldSnap?: boolean;
406
459
  selectionElementsCount?: number;
407
- frozenLabelEntries?: FrozenLabelEntry[];
460
+ frozenLabelEntryAccessors?: FrozenLabelEntryAccessor[];
408
461
  pendingShiftPreviewEntry?: FrozenLabelEntry;
409
462
  selectionFilePath?: string;
410
463
  selectionLineNumber?: number;
@@ -412,9 +465,10 @@ interface ReactGrabRendererProps {
412
465
  selectionComponentName?: string;
413
466
  selectionLabelVisible?: boolean;
414
467
  selectionLabelStatus?: SelectionLabelStatus;
415
- selectionArrowNavigationState?: ArrowNavigationState;
416
- onArrowNavigationSelect?: (index: number) => void;
468
+ hierarchyState?: HierarchyState;
469
+ hierarchyMenuPosition?: DropdownAnchor | null;
417
470
  labelInstances?: SelectionLabelInstance[];
471
+ labelInstanceAccessors?: SelectionLabelInstanceAccessor[];
418
472
  dragVisible?: boolean;
419
473
  dragBounds?: OverlayBounds;
420
474
  grabbedBoxes?: Array<{
@@ -427,12 +481,15 @@ interface ReactGrabRendererProps {
427
481
  inputValue?: string;
428
482
  isPromptMode?: boolean;
429
483
  onShowContextMenuInstance?: (instanceId: string) => void;
484
+ onRetryInstance?: (instanceId: string) => void;
485
+ onAcknowledgeErrorInstance?: (instanceId: string) => void;
430
486
  onLabelInstanceHoverChange?: (instanceId: string, isHovered: boolean) => void;
431
487
  onInputChange?: (value: string) => void;
432
488
  onInputSubmit?: () => void;
433
489
  onToggleExpand?: () => void;
434
490
  selectionLabelShakeCount?: number;
435
491
  onConfirmDismiss?: () => void;
492
+ onOpenSelectionFile?: () => void;
436
493
  discardPrompt?: SelectionDiscardPrompt;
437
494
  toolbarVisible?: boolean;
438
495
  isActive?: boolean;
@@ -514,7 +571,7 @@ interface ReactGrabEntry {
514
571
  frames?: ReactGrabStackFrame[];
515
572
  }
516
573
  //#endregion
517
- //#region ../../node_modules/.pnpm/bippy@0.5.41_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
518
575
  type Flags = number;
519
576
  type Lanes = number;
520
577
  type TypeOfMode = number;
@@ -604,6 +661,14 @@ interface Effect {
604
661
  interface Family {
605
662
  current: unknown;
606
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
+ }
607
672
  /**
608
673
  * Represents a react-internal Fiber node.
609
674
  */
@@ -654,6 +719,7 @@ interface ReactDevToolsGlobalHook {
654
719
  onCommitFiberRoot: (rendererID: number, root: FiberRoot, priority: number | void) => void;
655
720
  onCommitFiberUnmount: (rendererID: number, fiber: Fiber) => void;
656
721
  onPostCommitFiberRoot: (rendererID: number, root: FiberRoot) => void;
722
+ onScheduleFiberRoot?: (rendererID: number, root: FiberRoot, children: ReactNode) => void;
657
723
  renderers: Map<number, ReactRenderer>;
658
724
  supportsFiber: boolean;
659
725
  supportsFlight: boolean;
@@ -672,10 +738,7 @@ interface ReactRenderer {
672
738
  overridePropsRenamePath?: (fiber: Fiber, oldPath: Array<number | string>, newPath: Array<number | string>) => void;
673
739
  reconcilerVersion: string;
674
740
  rendererPackageName: string;
675
- scheduleRefresh?: (root: FiberRoot, update: {
676
- staleFamilies: Set<Family>;
677
- updatedFamilies: Set<Family>;
678
- }) => void;
741
+ scheduleRefresh?: (root: FiberRoot, update: RendererRefreshUpdate) => void;
679
742
  scheduleRoot?: (root: FiberRoot, element: React.ReactNode) => void;
680
743
  scheduleUpdate?: (fiber: Fiber) => void;
681
744
  setErrorHandler?: (newShouldErrorImpl: (fiber: Fiber) => boolean) => void;
@@ -686,28 +749,30 @@ interface ReactRenderer {
686
749
  declare global {
687
750
  var __REACT_DEVTOOLS_GLOBAL_HOOK__: ReactDevToolsGlobalHook | undefined;
688
751
  } //#endregion
689
- //#region src/rdt-hook.d.ts
690
- /**
691
- * Returns `true` if bippy's instrumentation is active.
692
- */
693
- declare const isInstrumentationActive: () => boolean;
694
- /**
695
- * Returns the latest fiber (since it may be double-buffered).
696
- */
752
+ //#region src/unsubscribe.d.ts
697
753
  //#endregion
698
- //#region ../../node_modules/.pnpm/bippy@0.5.41_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
699
755
  //#region src/source/parse-stack.d.ts
700
756
  interface StackFrame {
701
757
  args?: unknown[];
702
758
  columnNumber?: number;
703
759
  lineNumber?: number;
760
+ enclosingLineNumber?: number;
761
+ enclosingColumnNumber?: number;
704
762
  fileName?: string;
705
763
  functionName?: string;
706
764
  source?: string;
707
765
  isServer?: boolean;
708
766
  isSymbolicated?: boolean;
767
+ isIgnoreListed?: boolean;
709
768
  }
710
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
711
776
  //#region src/utils/copy-content.d.ts
712
777
  interface CopyContentOptions {
713
778
  componentName?: string;
@@ -717,4 +782,4 @@ interface CopyContentOptions {
717
782
  }
718
783
  declare const copyContent: (content: string, options?: CopyContentOptions) => boolean;
719
784
  //#endregion
720
- export { ToolbarState as A, ReactGrabAPI as C, SettableOptions as D, Rect as E, SourceInfo as O, PromptModeContext as S, ReactGrabState as T, OverlayBounds as _, ActionContext as a, PluginHooks as b, AgentContext as c, DeepPartial as d, DragRect as f, Options as g, GrabbedBox as h, isInstrumentationActive as i, Theme 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, Plugin as v, ReactGrabRendererProps as w, Position as x, PluginConfig 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 };