@buoy-gg/highlight-updates 7.0.39 โ†’ 7.0.41

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.
package/README.md CHANGED
@@ -81,3 +81,7 @@ Use a Free or Pro Buoy account. History limits and paid features vary by tool; s
81
81
  ๐Ÿ“š [Full docs](https://buoy.gg/buoy/latest/docs/tools/highlight-updates) ยท [All Buoy tools](https://github.com/Buoy-gg/buoy)
82
82
 
83
83
  Proprietary software. ยฉ Buoy LLC. [Terms](https://buoy.gg/terms)
84
+
85
+ ## Web support (unreleased)
86
+
87
+ Import @buoy-gg/core/web/register before React DOM to capture roots and renders. The shared inspector measures DOM elements. The browser build is available in this checkout and has not been published yet. See the [web setup guide](https://buoy.gg/buoy/latest/docs/web-preview) for registration, dependencies, and browser boundaries.
@@ -297,7 +297,16 @@ function handleCommit(root) {
297
297
  if (visited > MAX_FIBERS_PER_COMMIT) break;
298
298
  let skipSubtree = false;
299
299
  const composite = isCompositeTag(fiber.tag);
300
- if (composite) {
300
+
301
+ // Buoy's own tree โ€” the floating menu, open tool sheets, the Bench REC
302
+ // bar โ€” hangs under one View marked __buoyDevToolsRoot. Name matching
303
+ // missed most of it (ExpandableWindowControls, RunningPanel, anonymous
304
+ // compiled components), so a Bench recording's "top re-renderers" was
305
+ // mostly Buoy redrawing its own recording UI. The marker is structural,
306
+ // so this can't hide app components the way a name prefix did.
307
+ if (fiber.memoizedProps?.__buoyDevToolsRoot) {
308
+ skipSubtree = true;
309
+ } else if (composite) {
301
310
  const compositeName = getComponentName(fiber);
302
311
  // Only Buoy's render-tracking UI gets its SUBTREE pruned โ€” walking it
303
312
  // feeds its own renders back in and loops. Everything else that's merely
@@ -1,3 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _utils = require("@buoy-gg/shared-ui/utils");
8
+ var _ProfilerInterceptor = require("./ProfilerInterceptor");
9
+ var _reactNative = require("react-native");
10
+ var _RenderTracker = require("./RenderTracker");
11
+ var _screenElements = require("./screenElements");
12
+ var _tapMatch = require("./tapMatch");
13
+ var _PerformanceLogger = require("./PerformanceLogger");
14
+ var _RenderCauseDetector = require("./RenderCauseDetector");
15
+ var _sharedUi = require("@buoy-gg/shared-ui");
16
+ var _devtoolsComponentNames = require("./devtoolsComponentNames");
1
17
  /**
2
18
  * Highlight Updates Controller
3
19
  *
@@ -26,20 +42,6 @@
26
42
  */
27
43
 
28
44
  "use strict";
29
-
30
- Object.defineProperty(exports, "__esModule", {
31
- value: true
32
- });
33
- exports.default = void 0;
34
- var _ProfilerInterceptor = require("./ProfilerInterceptor");
35
- var _reactNative = require("react-native");
36
- var _RenderTracker = require("./RenderTracker");
37
- var _screenElements = require("./screenElements");
38
- var _tapMatch = require("./tapMatch");
39
- var _PerformanceLogger = require("./PerformanceLogger");
40
- var _RenderCauseDetector = require("./RenderCauseDetector");
41
- var _sharedUi = require("@buoy-gg/shared-ui");
42
- var _devtoolsComponentNames = require("./devtoolsComponentNames");
43
45
  // State
44
46
  let globalEnabled = false; // User-controlled toggle for visual highlights
45
47
  // When true, tracking + measurement + storage all run as normal, but the
@@ -85,6 +87,8 @@ function debugLog(message, data) {
85
87
  * Get the public instance from a stateNode (the node passed in traceUpdates)
86
88
  */
87
89
  function getPublicInstance(stateNode) {
90
+ const dom = (0, _utils.getDOMPublicInstance)(stateNode);
91
+ if (dom) return dom;
88
92
  if (!stateNode) return null;
89
93
  const node = stateNode;
90
94
 
@@ -109,6 +113,8 @@ function getPublicInstance(stateNode) {
109
113
  * Get native tag from public instance or stateNode
110
114
  */
111
115
  function getNativeTag(instance) {
116
+ const dom = (0, _utils.getDOMNodeHandle)(instance);
117
+ if (dom !== null) return dom;
112
118
  if (instance == null) return null;
113
119
  const inst = instance;
114
120
 
@@ -147,7 +153,7 @@ function extractComponentInfo(stateNode) {
147
153
 
148
154
  // Try to get props from various locations
149
155
  // Fabric: canonical.internalInstanceHandle, Paper: _internalInstanceHandle, RN CLI DEV: _internalFiberInstanceHandleDEV
150
- const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV;
156
+ const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || (0, _utils.getDOMFiber)(node);
151
157
  const currentProps = node?.canonical?.currentProps;
152
158
  const pendingProps = node?.canonical?.pendingProps;
153
159
  const fiberPendingProps = fiber?.pendingProps;
@@ -490,7 +496,7 @@ function isOurOverlayNode(stateNode) {
490
496
  // Fabric: fiber is at canonical.internalInstanceHandle
491
497
  // Paper/Legacy: fiber is at _internalInstanceHandle directly on stateNode
492
498
  // RN CLI DEV: fiber is at _internalFiberInstanceHandleDEV
493
- const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV;
499
+ const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || (0, _utils.getDOMFiber)(node);
494
500
 
495
501
  // Get nativeTag for caching
496
502
  const nativeTag = getNativeTag(stateNode) || getNativeTag(node?.canonical?.publicInstance);
@@ -504,6 +510,7 @@ function isOurOverlayNode(stateNode) {
504
510
  // the cache and can't poison it.
505
511
  const benchMode = (0, _devtoolsComponentNames.isCapturingBuoyToolRenders)();
506
512
  const excludeDevTools = !benchMode && _RenderTracker.RenderTracker.getSettings().excludeDevTools;
513
+ if (excludeDevTools && (0, _utils.isDOMElement)(stateNode) && stateNode.closest('[data-buoy-root]')) return true;
507
514
 
508
515
  // Check cache first (O(1)) - but only for the current excludeDevTools setting
509
516
  // When excludeDevTools is false, skip cache to re-evaluate all nodes
@@ -926,7 +933,7 @@ function handleTraceUpdates(nodes) {
926
933
  let renderCause;
927
934
  if (trackCauses && batchNativeTags) {
928
935
  const node = stateNode;
929
- const fiber = node?.canonical?.internalInstanceHandle;
936
+ const fiber = getFiberFromNode(node);
930
937
  renderCause = (0, _RenderCauseDetector.detectRenderCause)(rect.id, fiber, batchNativeTags, settings.debugLogLevel);
931
938
  }
932
939
  _RenderTracker.RenderTracker.trackRender({
@@ -962,7 +969,7 @@ function handleTraceUpdates(nodes) {
962
969
  let renderCause;
963
970
  if (trackCauses && batchNativeTags) {
964
971
  const node = stateNode;
965
- const fiber = node?.canonical?.internalInstanceHandle;
972
+ const fiber = getFiberFromNode(node);
966
973
  renderCause = (0, _RenderCauseDetector.detectRenderCause)(rect.id, fiber, batchNativeTags, settings.debugLogLevel);
967
974
  }
968
975
  _RenderTracker.RenderTracker.emitRenderEvent({
@@ -1058,7 +1065,7 @@ function measureNode(publicInstance) {
1058
1065
  }
1059
1066
  function getFiberFromNode(stateNode) {
1060
1067
  const node = stateNode;
1061
- return node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || null;
1068
+ return node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || (0, _utils.getDOMFiber)(node) || null;
1062
1069
  }
1063
1070
 
1064
1071
  /**
@@ -1170,7 +1177,7 @@ async function locateComponent(params) {
1170
1177
  const scrollIntoView = params.scrollIntoView !== false;
1171
1178
  const margin = typeof params.margin === "number" ? params.margin : 12;
1172
1179
  const renders = _RenderTracker.RenderTracker.getRenders();
1173
- if (renders.length === 0) {
1180
+ const locateFromScreen = async () => {
1174
1181
  const described = await (0, _screenElements.describeScreen)();
1175
1182
  const q = (params.query ?? "").trim().toLowerCase();
1176
1183
  let best;
@@ -1226,7 +1233,8 @@ async function locateComponent(params) {
1226
1233
  componentName: best.el.name,
1227
1234
  testID: best.el.testID
1228
1235
  };
1229
- }
1236
+ };
1237
+ if (renders.length === 0) return locateFromScreen();
1230
1238
 
1231
1239
  // Rank candidates (skip ranking when an explicit nativeTag was given).
1232
1240
  const q = (params.query ?? "").trim().toLowerCase();
@@ -1246,7 +1254,8 @@ async function locateComponent(params) {
1246
1254
  }));
1247
1255
  const targetTag = params.nativeTag ?? (ranked.length > 0 ? ranked[0].r.nativeTag : undefined);
1248
1256
  if (targetTag == null) {
1249
- return {
1257
+ const located = await locateFromScreen();
1258
+ return located.matched ? located : {
1250
1259
  matched: false,
1251
1260
  reason: "no-match",
1252
1261
  candidates
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "resolveRawEventEmitter", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _utils.resolveDOMEventEmitter;
10
+ }
11
+ });
12
+ var _utils = require("@buoy-gg/shared-ui/utils");
@@ -7,6 +7,7 @@ exports.describeScreen = describeScreen;
7
7
  exports.resolveTouchTarget = resolveTouchTarget;
8
8
  exports.tapElement = tapElement;
9
9
  exports.waitFor = waitFor;
10
+ var _utils = require("@buoy-gg/shared-ui/utils");
10
11
  var _reactNative = require("react-native");
11
12
  var _tapMatch = require("./tapMatch");
12
13
  /**
@@ -167,6 +168,8 @@ function traverseFiberTree(fiber, callback, depth = 0, visited = new Set()) {
167
168
 
168
169
  /** Get a measurable public instance from a host fiber's stateNode. */
169
170
  function getPublicInstance(stateNode) {
171
+ const dom = (0, _utils.getDOMPublicInstance)(stateNode);
172
+ if (dom) return dom;
170
173
  if (!stateNode) return null;
171
174
  const node = stateNode;
172
175
  if (node.canonical?.publicInstance) return node.canonical.publicInstance;
@@ -179,6 +182,8 @@ function getPublicInstance(stateNode) {
179
182
  return null;
180
183
  }
181
184
  function getNativeTag(stateNode) {
185
+ const dom = (0, _utils.getDOMNodeHandle)(stateNode);
186
+ if (dom !== null) return dom;
182
187
  if (stateNode == null) return null;
183
188
  const n = stateNode;
184
189
  if (typeof n.__nativeTag === "number") return n.__nativeTag;
@@ -253,6 +258,15 @@ function findScrollAncestor(fiber) {
253
258
  */
254
259
  async function scrollIntoView(targetFiber, publicInstance, stateNode, margin) {
255
260
  try {
261
+ if ((0, _utils.isDOMElement)(stateNode)) {
262
+ stateNode.scrollIntoView({
263
+ block: 'nearest',
264
+ inline: 'nearest',
265
+ behavior: 'instant'
266
+ });
267
+ await new Promise(resolve => setTimeout(resolve, 16));
268
+ return true;
269
+ }
256
270
  const ancestor = findScrollAncestor(targetFiber);
257
271
  if (!ancestor) return false;
258
272
  const inst = publicInstance;
@@ -325,7 +339,7 @@ function getOwningComponentName(fiber) {
325
339
  return null;
326
340
  }
327
341
  function getProps(fiber) {
328
- return fiber?.memoizedProps ?? fiber?.pendingProps ?? null;
342
+ return (0, _utils.getDOMControlProps)(fiber?.stateNode, fiber?.memoizedProps ?? fiber?.pendingProps ?? null);
329
343
  }
330
344
 
331
345
  /**
@@ -478,6 +492,8 @@ function measureInstance(instance) {
478
492
 
479
493
  // --- Collection -----------------------------------------------------------
480
494
 
495
+ /** Native hosts behind `ActivityIndicator` (iOS, Android). */
496
+ const SPINNER_HOSTS = new Set(["RCTActivityIndicatorView", "AndroidProgressBar"]);
481
497
  function collectCandidates() {
482
498
  const roots = getAllFiberRoots();
483
499
  if (roots.length === 0) return [];
@@ -508,8 +524,13 @@ function collectCandidates() {
508
524
  let text = getVisibleText(props);
509
525
  const roleInteractive = role === "button" || role === "link" || role === "menuitem" || role === "tab" || role === "switch" || role === "checkbox";
510
526
 
527
+ // A spinner carries no text, label or handler, so it earned no row and
528
+ // "is this screen still loading?" had no answer. The host view is the
529
+ // signal: RN renders every ActivityIndicator through one of these.
530
+ const spinner = typeof fiber.type === "string" && SPINNER_HOSTS.has(fiber.type) && props.animating !== false;
531
+
511
532
  // A fiber earns a row only if it carries a real signal.
512
- if (!hasPress && !hasValue && !hasText && !testID && !label && !text && !roleInteractive) {
533
+ if (!hasPress && !hasValue && !hasText && !testID && !label && !text && !roleInteractive && !spinner) {
513
534
  return;
514
535
  }
515
536
 
@@ -572,7 +593,7 @@ function collectCandidates() {
572
593
  const candidate = {
573
594
  nativeTag,
574
595
  name,
575
- role,
596
+ role: role ?? (spinner ? "progressbar" : undefined),
576
597
  testID,
577
598
  label,
578
599
  text,
@@ -293,7 +293,16 @@ function handleCommit(root) {
293
293
  if (visited > MAX_FIBERS_PER_COMMIT) break;
294
294
  let skipSubtree = false;
295
295
  const composite = isCompositeTag(fiber.tag);
296
- if (composite) {
296
+
297
+ // Buoy's own tree โ€” the floating menu, open tool sheets, the Bench REC
298
+ // bar โ€” hangs under one View marked __buoyDevToolsRoot. Name matching
299
+ // missed most of it (ExpandableWindowControls, RunningPanel, anonymous
300
+ // compiled components), so a Bench recording's "top re-renderers" was
301
+ // mostly Buoy redrawing its own recording UI. The marker is structural,
302
+ // so this can't hide app components the way a name prefix did.
303
+ if (fiber.memoizedProps?.__buoyDevToolsRoot) {
304
+ skipSubtree = true;
305
+ } else if (composite) {
297
306
  const compositeName = getComponentName(fiber);
298
307
  // Only Buoy's render-tracking UI gets its SUBTREE pruned โ€” walking it
299
308
  // feeds its own renders back in and loops. Everything else that's merely
@@ -1,3 +1,6 @@
1
+ "use strict";
2
+
3
+ import { getDOMFiber, getDOMNodeHandle, getDOMPublicInstance, isDOMElement } from "@buoy-gg/shared-ui/utils";
1
4
  /**
2
5
  * Highlight Updates Controller
3
6
  *
@@ -26,7 +29,6 @@
26
29
  */
27
30
 
28
31
  "use strict";
29
-
30
32
  import { installProfilerInterceptor, uninstallProfilerInterceptor, setComparisonCallback } from "./ProfilerInterceptor";
31
33
  import { findNodeHandle, UIManager, Dimensions, PixelRatio } from "react-native";
32
34
  import { RenderTracker } from "./RenderTracker";
@@ -81,6 +83,8 @@ function debugLog(message, data) {
81
83
  * Get the public instance from a stateNode (the node passed in traceUpdates)
82
84
  */
83
85
  function getPublicInstance(stateNode) {
86
+ const dom = getDOMPublicInstance(stateNode);
87
+ if (dom) return dom;
84
88
  if (!stateNode) return null;
85
89
  const node = stateNode;
86
90
 
@@ -105,6 +109,8 @@ function getPublicInstance(stateNode) {
105
109
  * Get native tag from public instance or stateNode
106
110
  */
107
111
  function getNativeTag(instance) {
112
+ const dom = getDOMNodeHandle(instance);
113
+ if (dom !== null) return dom;
108
114
  if (instance == null) return null;
109
115
  const inst = instance;
110
116
 
@@ -143,7 +149,7 @@ function extractComponentInfo(stateNode) {
143
149
 
144
150
  // Try to get props from various locations
145
151
  // Fabric: canonical.internalInstanceHandle, Paper: _internalInstanceHandle, RN CLI DEV: _internalFiberInstanceHandleDEV
146
- const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV;
152
+ const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || getDOMFiber(node);
147
153
  const currentProps = node?.canonical?.currentProps;
148
154
  const pendingProps = node?.canonical?.pendingProps;
149
155
  const fiberPendingProps = fiber?.pendingProps;
@@ -486,7 +492,7 @@ function isOurOverlayNode(stateNode) {
486
492
  // Fabric: fiber is at canonical.internalInstanceHandle
487
493
  // Paper/Legacy: fiber is at _internalInstanceHandle directly on stateNode
488
494
  // RN CLI DEV: fiber is at _internalFiberInstanceHandleDEV
489
- const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV;
495
+ const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || getDOMFiber(node);
490
496
 
491
497
  // Get nativeTag for caching
492
498
  const nativeTag = getNativeTag(stateNode) || getNativeTag(node?.canonical?.publicInstance);
@@ -500,6 +506,7 @@ function isOurOverlayNode(stateNode) {
500
506
  // the cache and can't poison it.
501
507
  const benchMode = isCapturingBuoyToolRenders();
502
508
  const excludeDevTools = !benchMode && RenderTracker.getSettings().excludeDevTools;
509
+ if (excludeDevTools && isDOMElement(stateNode) && stateNode.closest('[data-buoy-root]')) return true;
503
510
 
504
511
  // Check cache first (O(1)) - but only for the current excludeDevTools setting
505
512
  // When excludeDevTools is false, skip cache to re-evaluate all nodes
@@ -922,7 +929,7 @@ function handleTraceUpdates(nodes) {
922
929
  let renderCause;
923
930
  if (trackCauses && batchNativeTags) {
924
931
  const node = stateNode;
925
- const fiber = node?.canonical?.internalInstanceHandle;
932
+ const fiber = getFiberFromNode(node);
926
933
  renderCause = detectRenderCause(rect.id, fiber, batchNativeTags, settings.debugLogLevel);
927
934
  }
928
935
  RenderTracker.trackRender({
@@ -958,7 +965,7 @@ function handleTraceUpdates(nodes) {
958
965
  let renderCause;
959
966
  if (trackCauses && batchNativeTags) {
960
967
  const node = stateNode;
961
- const fiber = node?.canonical?.internalInstanceHandle;
968
+ const fiber = getFiberFromNode(node);
962
969
  renderCause = detectRenderCause(rect.id, fiber, batchNativeTags, settings.debugLogLevel);
963
970
  }
964
971
  RenderTracker.emitRenderEvent({
@@ -1054,7 +1061,7 @@ function measureNode(publicInstance) {
1054
1061
  }
1055
1062
  function getFiberFromNode(stateNode) {
1056
1063
  const node = stateNode;
1057
- return node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || null;
1064
+ return node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || getDOMFiber(node) || null;
1058
1065
  }
1059
1066
 
1060
1067
  /**
@@ -1166,7 +1173,7 @@ async function locateComponent(params) {
1166
1173
  const scrollIntoView = params.scrollIntoView !== false;
1167
1174
  const margin = typeof params.margin === "number" ? params.margin : 12;
1168
1175
  const renders = RenderTracker.getRenders();
1169
- if (renders.length === 0) {
1176
+ const locateFromScreen = async () => {
1170
1177
  const described = await describeScreen();
1171
1178
  const q = (params.query ?? "").trim().toLowerCase();
1172
1179
  let best;
@@ -1222,7 +1229,8 @@ async function locateComponent(params) {
1222
1229
  componentName: best.el.name,
1223
1230
  testID: best.el.testID
1224
1231
  };
1225
- }
1232
+ };
1233
+ if (renders.length === 0) return locateFromScreen();
1226
1234
 
1227
1235
  // Rank candidates (skip ranking when an explicit nativeTag was given).
1228
1236
  const q = (params.query ?? "").trim().toLowerCase();
@@ -1242,7 +1250,8 @@ async function locateComponent(params) {
1242
1250
  }));
1243
1251
  const targetTag = params.nativeTag ?? (ranked.length > 0 ? ranked[0].r.nativeTag : undefined);
1244
1252
  if (targetTag == null) {
1245
- return {
1253
+ const located = await locateFromScreen();
1254
+ return located.matched ? located : {
1246
1255
  matched: false,
1247
1256
  reason: "no-match",
1248
1257
  candidates
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+
3
+ export { resolveDOMEventEmitter as resolveRawEventEmitter } from '@buoy-gg/shared-ui/utils';
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ import { getDOMControlProps, getDOMNodeHandle, getDOMPublicInstance, isDOMElement } from "@buoy-gg/shared-ui/utils";
3
4
  /**
4
5
  * On-device screen element discovery + in-JS tap.
5
6
  *
@@ -161,6 +162,8 @@ function traverseFiberTree(fiber, callback, depth = 0, visited = new Set()) {
161
162
 
162
163
  /** Get a measurable public instance from a host fiber's stateNode. */
163
164
  function getPublicInstance(stateNode) {
165
+ const dom = getDOMPublicInstance(stateNode);
166
+ if (dom) return dom;
164
167
  if (!stateNode) return null;
165
168
  const node = stateNode;
166
169
  if (node.canonical?.publicInstance) return node.canonical.publicInstance;
@@ -173,6 +176,8 @@ function getPublicInstance(stateNode) {
173
176
  return null;
174
177
  }
175
178
  function getNativeTag(stateNode) {
179
+ const dom = getDOMNodeHandle(stateNode);
180
+ if (dom !== null) return dom;
176
181
  if (stateNode == null) return null;
177
182
  const n = stateNode;
178
183
  if (typeof n.__nativeTag === "number") return n.__nativeTag;
@@ -247,6 +252,15 @@ function findScrollAncestor(fiber) {
247
252
  */
248
253
  async function scrollIntoView(targetFiber, publicInstance, stateNode, margin) {
249
254
  try {
255
+ if (isDOMElement(stateNode)) {
256
+ stateNode.scrollIntoView({
257
+ block: 'nearest',
258
+ inline: 'nearest',
259
+ behavior: 'instant'
260
+ });
261
+ await new Promise(resolve => setTimeout(resolve, 16));
262
+ return true;
263
+ }
250
264
  const ancestor = findScrollAncestor(targetFiber);
251
265
  if (!ancestor) return false;
252
266
  const inst = publicInstance;
@@ -319,7 +333,7 @@ function getOwningComponentName(fiber) {
319
333
  return null;
320
334
  }
321
335
  function getProps(fiber) {
322
- return fiber?.memoizedProps ?? fiber?.pendingProps ?? null;
336
+ return getDOMControlProps(fiber?.stateNode, fiber?.memoizedProps ?? fiber?.pendingProps ?? null);
323
337
  }
324
338
 
325
339
  /**
@@ -472,6 +486,8 @@ function measureInstance(instance) {
472
486
 
473
487
  // --- Collection -----------------------------------------------------------
474
488
 
489
+ /** Native hosts behind `ActivityIndicator` (iOS, Android). */
490
+ const SPINNER_HOSTS = new Set(["RCTActivityIndicatorView", "AndroidProgressBar"]);
475
491
  function collectCandidates() {
476
492
  const roots = getAllFiberRoots();
477
493
  if (roots.length === 0) return [];
@@ -502,8 +518,13 @@ function collectCandidates() {
502
518
  let text = getVisibleText(props);
503
519
  const roleInteractive = role === "button" || role === "link" || role === "menuitem" || role === "tab" || role === "switch" || role === "checkbox";
504
520
 
521
+ // A spinner carries no text, label or handler, so it earned no row and
522
+ // "is this screen still loading?" had no answer. The host view is the
523
+ // signal: RN renders every ActivityIndicator through one of these.
524
+ const spinner = typeof fiber.type === "string" && SPINNER_HOSTS.has(fiber.type) && props.animating !== false;
525
+
505
526
  // A fiber earns a row only if it carries a real signal.
506
- if (!hasPress && !hasValue && !hasText && !testID && !label && !text && !roleInteractive) {
527
+ if (!hasPress && !hasValue && !hasText && !testID && !label && !text && !roleInteractive && !spinner) {
507
528
  return;
508
529
  }
509
530
 
@@ -566,7 +587,7 @@ function collectCandidates() {
566
587
  const candidate = {
567
588
  nativeTag,
568
589
  name,
569
- role,
590
+ role: role ?? (spinner ? "progressbar" : undefined),
570
591
  testID,
571
592
  label,
572
593
  text,
@@ -1 +1 @@
1
- {"version":3,"file":"CommitProfiler.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/CommitProfiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,oBAAoB,CAAC;AAkb5B,iBAAS,WAAW,IAAI,OAAO,CAI9B;AAED,iBAAS,WAAW,IAAI,OAAO,CAE9B;AAED;;;;;;;;GAQG;AACH,iBAAS,YAAY,CAAC,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAUvD;AAED,uEAAuE;AACvE,iBAAS,WAAW,IAAI,oBAAoB,GAAG,IAAI,CA4ClD;AAMD,eAAO,MAAM,cAAc;;;;;CAK1B,CAAC"}
1
+ {"version":3,"file":"CommitProfiler.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/CommitProfiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,oBAAoB,CAAC;AA0b5B,iBAAS,WAAW,IAAI,OAAO,CAI9B;AAED,iBAAS,WAAW,IAAI,OAAO,CAE9B;AAED;;;;;;;;GAQG;AACH,iBAAS,YAAY,CAAC,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAUvD;AAED,uEAAuE;AACvE,iBAAS,WAAW,IAAI,oBAAoB,GAAG,IAAI,CA4ClD;AAMD,eAAO,MAAM,cAAc;;;;;CAK1B,CAAC"}
@@ -1,29 +1,3 @@
1
- /**
2
- * Highlight Updates Controller
3
- *
4
- * Standalone implementation that replicates React DevTools' "Highlight updates
5
- * when components render" feature WITHOUT requiring DevTools to be connected.
6
- *
7
- * Architecture:
8
- * This controller directly enables the DevTools backend's traceUpdates feature
9
- * by calling setTraceUpdatesEnabled(true) on each renderer interface. This is
10
- * the same function that DevTools' frontend calls when you check the
11
- * "Highlight updates when components render" checkbox.
12
- *
13
- * Key insight: The rendererInterfaces are available on the global hook even
14
- * without DevTools frontend connected. We just need to enable tracing directly.
15
- *
16
- * Flow:
17
- * 1. User enables highlights via toggle()
18
- * 2. We call rendererInterface.setTraceUpdatesEnabled(true) on all renderers
19
- * 3. DevTools backend now tracks renders and emits 'traceUpdates' events
20
- * 4. We subscribe to 'traceUpdates' via hook.sub()
21
- * 5. When components re-render, we receive the Set of host stateNodes
22
- * 6. We measure each node and render colored border highlights
23
- *
24
- * This gives us 100% accuracy with DevTools behavior because we're using the
25
- * exact same detection code - we're just enabling it programmatically.
26
- */
27
1
  interface HighlightRect {
28
2
  id: number;
29
3
  x: number;
@@ -1 +1 @@
1
- {"version":3,"file":"HighlightUpdatesController.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/HighlightUpdatesController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HighlightUpdatesController.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/HighlightUpdatesController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { resolveDOMEventEmitter as resolveRawEventEmitter } from '@buoy-gg/shared-ui/utils';
2
+ export type { RawEvent, RawEventSubscription, RawEventEmitterLike, RawEmitterResolution } from './rawEventEmitter';
3
+ //# sourceMappingURL=rawEventEmitter.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rawEventEmitter.web.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/rawEventEmitter.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,YAAY,EAAE,QAAQ,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1,22 +1,3 @@
1
- /**
2
- * On-device screen element discovery + in-JS tap.
3
- *
4
- * This powers the MCP "describe_screen" / "tap_element" tools. It walks the
5
- * live React fiber tree (all renderers), collects the meaningful / interactive
6
- * elements on the current screen, and measures each one's on-screen rect โ€” the
7
- * same idea as the desktop screenshot tool's component-locate, but producing a
8
- * whole-screen list with normalized tap coordinates instead of a single crop.
9
- *
10
- * Tapping is done PURELY in JS: we resolve the target element, find the nearest
11
- * `onPress` handler up its fiber chain, and invoke it with a synthetic press
12
- * event. No screenshots, no OS-level touch injection, and it works on physical
13
- * devices โ€” because Buoy runs INSIDE the app (unlike external simulator drivers
14
- * that have to inject an OS touch at a pixel coordinate).
15
- *
16
- * Fiber traversal is adapted from image-overlay/utils/fiberScanner.ts and
17
- * debug-borders/utils/fiberTreeTraversal.js; the fiber-access triad matches the
18
- * rest of highlight-updates (Fabric / Paper / RN-CLI-dev).
19
- */
20
1
  export interface ScreenElement {
21
2
  nativeTag: number | null;
22
3
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"screenElements.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/screenElements.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screenElements.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/screenElements.ts"],"names":[],"mappings":"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"}