@buoy-gg/highlight-updates 7.0.3 → 7.0.5

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.
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.HighlightToolView = HighlightToolView;
6
7
  exports.HighlightUpdatesModal = HighlightUpdatesModal;
7
8
  exports.default = void 0;
8
9
  var _react = _interopRequireWildcard(require("react"));
@@ -55,7 +56,8 @@ function HighlightUpdatesModal({
55
56
  onMinimize,
56
57
  enableSharedModalDimensions = false,
57
58
  initialNativeTag,
58
- onInitialNativeTagHandled
59
+ onInitialNativeTagHandled,
60
+ inline = false
59
61
  }) {
60
62
  const isPro = (0, _license.useIsPro)();
61
63
 
@@ -484,6 +486,55 @@ function HighlightUpdatesModal({
484
486
  onEventIndexChange: setHistoryEventIndex,
485
487
  isPro: isPro
486
488
  }) : null;
489
+ const body = /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
490
+ nativeID: "__rn_buoy__highlight-modal",
491
+ style: styles.container,
492
+ children: showCopySettingsView ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_RendersCopySettingsView.RendersCopySettingsView, {
493
+ renders: copyRendersSnapshot
494
+ }) : selectedRender ? detailViewActiveTab === "details" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_RenderDetailView.RenderDetailView, {
495
+ render: selectedRender,
496
+ disableInternalFooter: true,
497
+ onAddFilter: handleAddFilter,
498
+ isPro: isPro
499
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_RenderHistoryViewer.RenderHistoryViewer, {
500
+ render: selectedRender,
501
+ disableInternalFooter: true,
502
+ selectedEventIndex: historyEventIndex,
503
+ onEventIndexChange: setHistoryEventIndex,
504
+ isPro: isPro
505
+ }) : showFilterView ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_HighlightFilterView.HighlightFilterView, {
506
+ filters: filters,
507
+ onFilterChange: handleFilterChange,
508
+ settings: settings,
509
+ onSettingsChange: handleSettingsChange,
510
+ availableProps: _RenderTracker.RenderTracker.getAvailableProps(),
511
+ activeTab: filterViewActiveTab
512
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
513
+ children: [!isTracking && /*#__PURE__*/(0, _jsxRuntime.jsx)(DisabledBanner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_IsolatedRenderList.IsolatedRenderList, {
514
+ searchText: searchText,
515
+ filters: filters,
516
+ onSelectRender: handleRenderPress,
517
+ onStatsChange: handleStatsChange,
518
+ onRendersChange: handleRendersChange,
519
+ isTracking: isTracking,
520
+ isPro: isPro
521
+ })]
522
+ })
523
+ });
524
+
525
+ // The ONLY difference between the phone and the desktop dashboard is which
526
+ // shell the header, body and footer go in. Everything above this is shared.
527
+ if (inline) {
528
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TickProvider, {
529
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
530
+ style: styles.inlineRoot,
531
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
532
+ style: styles.inlineHeader,
533
+ children: renderHeaderContent()
534
+ }), body, footerNode]
535
+ })
536
+ });
537
+ }
487
538
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TickProvider, {
488
539
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.JsModal, {
489
540
  visible: visible,
@@ -500,45 +551,38 @@ function HighlightUpdatesModal({
500
551
  styles: {},
501
552
  footer: footerNode,
502
553
  footerHeight: selectedRender ? detailViewActiveTab === "details" ? 68 : (selectedRender.renderHistory?.length ?? 0) > 1 ? 68 : 0 : 0,
503
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
504
- nativeID: "__rn_buoy__highlight-modal",
505
- style: styles.container,
506
- children: showCopySettingsView ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_RendersCopySettingsView.RendersCopySettingsView, {
507
- renders: copyRendersSnapshot
508
- }) : selectedRender ? detailViewActiveTab === "details" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_RenderDetailView.RenderDetailView, {
509
- render: selectedRender,
510
- disableInternalFooter: true,
511
- onAddFilter: handleAddFilter,
512
- isPro: isPro
513
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_RenderHistoryViewer.RenderHistoryViewer, {
514
- render: selectedRender,
515
- disableInternalFooter: true,
516
- selectedEventIndex: historyEventIndex,
517
- onEventIndexChange: setHistoryEventIndex,
518
- isPro: isPro
519
- }) : showFilterView ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_HighlightFilterView.HighlightFilterView, {
520
- filters: filters,
521
- onFilterChange: handleFilterChange,
522
- settings: settings,
523
- onSettingsChange: handleSettingsChange,
524
- availableProps: _RenderTracker.RenderTracker.getAvailableProps(),
525
- activeTab: filterViewActiveTab
526
- }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
527
- children: [!isTracking && /*#__PURE__*/(0, _jsxRuntime.jsx)(DisabledBanner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_IsolatedRenderList.IsolatedRenderList, {
528
- searchText: searchText,
529
- filters: filters,
530
- onSelectRender: handleRenderPress,
531
- onStatsChange: handleStatsChange,
532
- onRendersChange: handleRendersChange,
533
- isTracking: isTracking,
534
- isPro: isPro
535
- })]
536
- })
537
- })
554
+ children: body
538
555
  })
539
556
  });
540
557
  }
558
+
559
+ /**
560
+ * The same renders tool as `HighlightUpdatesModal`, rendered INLINE for hosts
561
+ * that place tools in a panel rather than a modal. Exists so there is exactly
562
+ * one implementation — the desktop dashboard used to ship its own copy of this
563
+ * component's header and screen router.
564
+ */
565
+ function HighlightToolView(props = {}) {
566
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(HighlightUpdatesModal, {
567
+ ...props,
568
+ inline: true,
569
+ visible: true,
570
+ onClose: () => {}
571
+ });
572
+ }
541
573
  const styles = _reactNative.StyleSheet.create({
574
+ inlineRoot: {
575
+ flex: 1,
576
+ minHeight: 0,
577
+ backgroundColor: _sharedUi.buoyColors.base
578
+ },
579
+ inlineHeader: {
580
+ paddingHorizontal: 12,
581
+ paddingVertical: 8,
582
+ borderBottomWidth: 1,
583
+ borderBottomColor: _sharedUi.buoyColors.border,
584
+ backgroundColor: _sharedUi.buoyColors.card
585
+ },
542
586
  container: {
543
587
  flex: 1,
544
588
  backgroundColor: _sharedUi.buoyColors.base
@@ -298,23 +298,27 @@ function collectDescendantText(root, maxDepth) {
298
298
  return joined ? joined.slice(0, 80) : undefined;
299
299
  }
300
300
 
301
- /** Nearest onPress (then onLongPress) handler at or above a fiber. */
301
+ /** Nearest onPress / onLongPress handlers at or above a fiber. */
302
+
302
303
  function findPressHandler(fiber) {
303
304
  let cur = fiber;
304
305
  let depth = 0;
306
+ let press = null;
305
307
  let longPress = null;
306
- while (cur && depth < 25) {
308
+ while (cur && depth < 25 && !(press && longPress)) {
307
309
  const p = getProps(cur);
308
310
  if (p) {
309
- if (typeof p.onPress === "function") return {
310
- handler: p.onPress,
311
- kind: "onPress"
312
- };
311
+ if (!press && typeof p.onPress === "function") press = p.onPress;
313
312
  if (!longPress && typeof p.onLongPress === "function") longPress = p.onLongPress;
314
313
  }
315
314
  cur = cur.return;
316
315
  depth++;
317
316
  }
317
+ if (press) return {
318
+ handler: press,
319
+ kind: "onPress",
320
+ longPress: longPress ?? undefined
321
+ };
318
322
  return longPress ? {
319
323
  handler: longPress,
320
324
  kind: "onLongPress"
@@ -440,7 +444,9 @@ function collectCandidates() {
440
444
  if (instance && seenInstances.has(instance)) {
441
445
  const existing = out.find(c => c.instance === instance);
442
446
  if (existing) {
443
- if (!existing.press && press) existing.press = press;
447
+ if (!existing.press && press) existing.press = press;else if (existing.press && press?.longPress && !existing.press.longPress) {
448
+ existing.press.longPress = press.longPress;
449
+ }
444
450
  if (!existing.valueControl && valueControl) existing.valueControl = valueControl;
445
451
  if (!existing.textControl && textControl) existing.textControl = textControl;
446
452
  if (!existing.testID && testID) existing.testID = testID;
@@ -518,6 +524,7 @@ async function describeScreen() {
518
524
  label: c.label,
519
525
  text: c.text,
520
526
  interactive: !!(c.press || c.valueControl || c.textControl),
527
+ longPressable: c.press && (c.press.kind === "onLongPress" || c.press.longPress) ? true : undefined,
521
528
  control,
522
529
  value,
523
530
  tap,
@@ -659,6 +666,29 @@ async function tapElement(params) {
659
666
  };
660
667
  try {
661
668
  if (c.press) {
669
+ if (params.longPress) {
670
+ const lp = c.press.kind === "onLongPress" ? c.press.handler : c.press.longPress;
671
+ if (!lp) {
672
+ return {
673
+ tapped: false,
674
+ scrolled,
675
+ reason: `Matched "${c.name}"${c.text ? ` ("${c.text}")` : ""} but it has no onLongPress handler — call tap_element without longPress to tap it normally.`,
676
+ matched: {
677
+ ...base,
678
+ via: "onPress"
679
+ }
680
+ };
681
+ }
682
+ lp(makeSyntheticPressEvent(c.rect));
683
+ return {
684
+ tapped: true,
685
+ scrolled,
686
+ matched: {
687
+ ...base,
688
+ via: "onLongPress"
689
+ }
690
+ };
691
+ }
662
692
  c.press.handler(makeSyntheticPressEvent(c.rect));
663
693
  return {
664
694
  tapped: true,
@@ -27,6 +27,12 @@ Object.defineProperty(exports, "HighlightFilterView", {
27
27
  return _HighlightFilterView.HighlightFilterView;
28
28
  }
29
29
  });
30
+ Object.defineProperty(exports, "HighlightToolView", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _HighlightUpdatesModal.HighlightToolView;
34
+ }
35
+ });
30
36
  Object.defineProperty(exports, "HighlightUpdatesController", {
31
37
  enumerable: true,
32
38
  get: function () {
@@ -382,6 +388,8 @@ const onRenderEvent = callback => {
382
388
  // ViewTypeMapper for translating native view names to component names
383
389
 
384
390
  // Modal components for custom integrations
391
+ // `HighlightToolView` is the same tool rendered inline (header bar + body +
392
+ // footer) instead of inside a JsModal — for hosts that show tools in a panel.
385
393
 
386
394
  // Simple JSON export for renders
387
395
  exports.onRenderEvent = onRenderEvent;
@@ -49,7 +49,8 @@ export function HighlightUpdatesModal({
49
49
  onMinimize,
50
50
  enableSharedModalDimensions = false,
51
51
  initialNativeTag,
52
- onInitialNativeTagHandled
52
+ onInitialNativeTagHandled,
53
+ inline = false
53
54
  }) {
54
55
  const isPro = useIsPro();
55
56
 
@@ -478,6 +479,55 @@ export function HighlightUpdatesModal({
478
479
  onEventIndexChange: setHistoryEventIndex,
479
480
  isPro: isPro
480
481
  }) : null;
482
+ const body = /*#__PURE__*/_jsx(View, {
483
+ nativeID: "__rn_buoy__highlight-modal",
484
+ style: styles.container,
485
+ children: showCopySettingsView ? /*#__PURE__*/_jsx(RendersCopySettingsView, {
486
+ renders: copyRendersSnapshot
487
+ }) : selectedRender ? detailViewActiveTab === "details" ? /*#__PURE__*/_jsx(RenderDetailView, {
488
+ render: selectedRender,
489
+ disableInternalFooter: true,
490
+ onAddFilter: handleAddFilter,
491
+ isPro: isPro
492
+ }) : /*#__PURE__*/_jsx(RenderHistoryViewer, {
493
+ render: selectedRender,
494
+ disableInternalFooter: true,
495
+ selectedEventIndex: historyEventIndex,
496
+ onEventIndexChange: setHistoryEventIndex,
497
+ isPro: isPro
498
+ }) : showFilterView ? /*#__PURE__*/_jsx(HighlightFilterView, {
499
+ filters: filters,
500
+ onFilterChange: handleFilterChange,
501
+ settings: settings,
502
+ onSettingsChange: handleSettingsChange,
503
+ availableProps: RenderTracker.getAvailableProps(),
504
+ activeTab: filterViewActiveTab
505
+ }) : /*#__PURE__*/_jsxs(_Fragment, {
506
+ children: [!isTracking && /*#__PURE__*/_jsx(DisabledBanner, {}), /*#__PURE__*/_jsx(IsolatedRenderList, {
507
+ searchText: searchText,
508
+ filters: filters,
509
+ onSelectRender: handleRenderPress,
510
+ onStatsChange: handleStatsChange,
511
+ onRendersChange: handleRendersChange,
512
+ isTracking: isTracking,
513
+ isPro: isPro
514
+ })]
515
+ })
516
+ });
517
+
518
+ // The ONLY difference between the phone and the desktop dashboard is which
519
+ // shell the header, body and footer go in. Everything above this is shared.
520
+ if (inline) {
521
+ return /*#__PURE__*/_jsx(TickProvider, {
522
+ children: /*#__PURE__*/_jsxs(View, {
523
+ style: styles.inlineRoot,
524
+ children: [/*#__PURE__*/_jsx(View, {
525
+ style: styles.inlineHeader,
526
+ children: renderHeaderContent()
527
+ }), body, footerNode]
528
+ })
529
+ });
530
+ }
481
531
  return /*#__PURE__*/_jsx(TickProvider, {
482
532
  children: /*#__PURE__*/_jsx(JsModal, {
483
533
  visible: visible,
@@ -494,45 +544,38 @@ export function HighlightUpdatesModal({
494
544
  styles: {},
495
545
  footer: footerNode,
496
546
  footerHeight: selectedRender ? detailViewActiveTab === "details" ? 68 : (selectedRender.renderHistory?.length ?? 0) > 1 ? 68 : 0 : 0,
497
- children: /*#__PURE__*/_jsx(View, {
498
- nativeID: "__rn_buoy__highlight-modal",
499
- style: styles.container,
500
- children: showCopySettingsView ? /*#__PURE__*/_jsx(RendersCopySettingsView, {
501
- renders: copyRendersSnapshot
502
- }) : selectedRender ? detailViewActiveTab === "details" ? /*#__PURE__*/_jsx(RenderDetailView, {
503
- render: selectedRender,
504
- disableInternalFooter: true,
505
- onAddFilter: handleAddFilter,
506
- isPro: isPro
507
- }) : /*#__PURE__*/_jsx(RenderHistoryViewer, {
508
- render: selectedRender,
509
- disableInternalFooter: true,
510
- selectedEventIndex: historyEventIndex,
511
- onEventIndexChange: setHistoryEventIndex,
512
- isPro: isPro
513
- }) : showFilterView ? /*#__PURE__*/_jsx(HighlightFilterView, {
514
- filters: filters,
515
- onFilterChange: handleFilterChange,
516
- settings: settings,
517
- onSettingsChange: handleSettingsChange,
518
- availableProps: RenderTracker.getAvailableProps(),
519
- activeTab: filterViewActiveTab
520
- }) : /*#__PURE__*/_jsxs(_Fragment, {
521
- children: [!isTracking && /*#__PURE__*/_jsx(DisabledBanner, {}), /*#__PURE__*/_jsx(IsolatedRenderList, {
522
- searchText: searchText,
523
- filters: filters,
524
- onSelectRender: handleRenderPress,
525
- onStatsChange: handleStatsChange,
526
- onRendersChange: handleRendersChange,
527
- isTracking: isTracking,
528
- isPro: isPro
529
- })]
530
- })
531
- })
547
+ children: body
532
548
  })
533
549
  });
534
550
  }
551
+
552
+ /**
553
+ * The same renders tool as `HighlightUpdatesModal`, rendered INLINE for hosts
554
+ * that place tools in a panel rather than a modal. Exists so there is exactly
555
+ * one implementation — the desktop dashboard used to ship its own copy of this
556
+ * component's header and screen router.
557
+ */
558
+ export function HighlightToolView(props = {}) {
559
+ return /*#__PURE__*/_jsx(HighlightUpdatesModal, {
560
+ ...props,
561
+ inline: true,
562
+ visible: true,
563
+ onClose: () => {}
564
+ });
565
+ }
535
566
  const styles = StyleSheet.create({
567
+ inlineRoot: {
568
+ flex: 1,
569
+ minHeight: 0,
570
+ backgroundColor: buoyColors.base
571
+ },
572
+ inlineHeader: {
573
+ paddingHorizontal: 12,
574
+ paddingVertical: 8,
575
+ borderBottomWidth: 1,
576
+ borderBottomColor: buoyColors.border,
577
+ backgroundColor: buoyColors.card
578
+ },
536
579
  container: {
537
580
  flex: 1,
538
581
  backgroundColor: buoyColors.base
@@ -294,23 +294,27 @@ function collectDescendantText(root, maxDepth) {
294
294
  return joined ? joined.slice(0, 80) : undefined;
295
295
  }
296
296
 
297
- /** Nearest onPress (then onLongPress) handler at or above a fiber. */
297
+ /** Nearest onPress / onLongPress handlers at or above a fiber. */
298
+
298
299
  function findPressHandler(fiber) {
299
300
  let cur = fiber;
300
301
  let depth = 0;
302
+ let press = null;
301
303
  let longPress = null;
302
- while (cur && depth < 25) {
304
+ while (cur && depth < 25 && !(press && longPress)) {
303
305
  const p = getProps(cur);
304
306
  if (p) {
305
- if (typeof p.onPress === "function") return {
306
- handler: p.onPress,
307
- kind: "onPress"
308
- };
307
+ if (!press && typeof p.onPress === "function") press = p.onPress;
309
308
  if (!longPress && typeof p.onLongPress === "function") longPress = p.onLongPress;
310
309
  }
311
310
  cur = cur.return;
312
311
  depth++;
313
312
  }
313
+ if (press) return {
314
+ handler: press,
315
+ kind: "onPress",
316
+ longPress: longPress ?? undefined
317
+ };
314
318
  return longPress ? {
315
319
  handler: longPress,
316
320
  kind: "onLongPress"
@@ -436,7 +440,9 @@ function collectCandidates() {
436
440
  if (instance && seenInstances.has(instance)) {
437
441
  const existing = out.find(c => c.instance === instance);
438
442
  if (existing) {
439
- if (!existing.press && press) existing.press = press;
443
+ if (!existing.press && press) existing.press = press;else if (existing.press && press?.longPress && !existing.press.longPress) {
444
+ existing.press.longPress = press.longPress;
445
+ }
440
446
  if (!existing.valueControl && valueControl) existing.valueControl = valueControl;
441
447
  if (!existing.textControl && textControl) existing.textControl = textControl;
442
448
  if (!existing.testID && testID) existing.testID = testID;
@@ -514,6 +520,7 @@ export async function describeScreen() {
514
520
  label: c.label,
515
521
  text: c.text,
516
522
  interactive: !!(c.press || c.valueControl || c.textControl),
523
+ longPressable: c.press && (c.press.kind === "onLongPress" || c.press.longPress) ? true : undefined,
517
524
  control,
518
525
  value,
519
526
  tap,
@@ -655,6 +662,29 @@ export async function tapElement(params) {
655
662
  };
656
663
  try {
657
664
  if (c.press) {
665
+ if (params.longPress) {
666
+ const lp = c.press.kind === "onLongPress" ? c.press.handler : c.press.longPress;
667
+ if (!lp) {
668
+ return {
669
+ tapped: false,
670
+ scrolled,
671
+ reason: `Matched "${c.name}"${c.text ? ` ("${c.text}")` : ""} but it has no onLongPress handler — call tap_element without longPress to tap it normally.`,
672
+ matched: {
673
+ ...base,
674
+ via: "onPress"
675
+ }
676
+ };
677
+ }
678
+ lp(makeSyntheticPressEvent(c.rect));
679
+ return {
680
+ tapped: true,
681
+ scrolled,
682
+ matched: {
683
+ ...base,
684
+ via: "onLongPress"
685
+ }
686
+ };
687
+ }
658
688
  c.press.handler(makeSyntheticPressEvent(c.rect));
659
689
  return {
660
690
  tapped: true,
@@ -113,7 +113,9 @@ export { PerformanceLogger } from "./highlight-updates/utils/PerformanceLogger";
113
113
  export { VIEW_TYPE_MAP, getComponentDisplayName, getNativeViewType, isKnownViewType, getAllNativeViewTypes, getAllComponentNames } from "./highlight-updates/utils/ViewTypeMapper";
114
114
 
115
115
  // Modal components for custom integrations
116
- export { HighlightUpdatesModal } from "./highlight-updates/components/HighlightUpdatesModal";
116
+ // `HighlightToolView` is the same tool rendered inline (header bar + body +
117
+ // footer) instead of inside a JsModal — for hosts that show tools in a panel.
118
+ export { HighlightUpdatesModal, HighlightToolView } from "./highlight-updates/components/HighlightUpdatesModal";
117
119
  export { RenderListItem } from "./highlight-updates/components/RenderListItem";
118
120
  export { RenderDetailView } from "./highlight-updates/components/RenderDetailView";
119
121
  export { HighlightFilterView } from "./highlight-updates/components/HighlightFilterView";
@@ -16,6 +16,13 @@ import React from "react";
16
16
  interface HighlightUpdatesModalProps {
17
17
  visible: boolean;
18
18
  onClose: () => void;
19
+ /**
20
+ * Render as a header-bar + body (+ footer) stack instead of inside `JsModal`,
21
+ * for hosts that place tools in a panel rather than a modal (Buoy Desktop).
22
+ * Only the shell differs — header, screens and state are shared. See
23
+ * `HighlightToolView` at the bottom of this file.
24
+ */
25
+ inline?: boolean;
19
26
  onBack?: () => void;
20
27
  onMinimize?: (modalState: any) => void;
21
28
  enableSharedModalDimensions?: boolean;
@@ -31,6 +38,13 @@ interface HighlightUpdatesModalProps {
31
38
  */
32
39
  onInitialNativeTagHandled?: () => void;
33
40
  }
34
- export declare function HighlightUpdatesModal({ visible, onClose, onBack, onMinimize, enableSharedModalDimensions, initialNativeTag, onInitialNativeTagHandled, }: HighlightUpdatesModalProps): React.JSX.Element | null;
41
+ export declare function HighlightUpdatesModal({ visible, onClose, onBack, onMinimize, enableSharedModalDimensions, initialNativeTag, onInitialNativeTagHandled, inline, }: HighlightUpdatesModalProps): React.JSX.Element | null;
42
+ /**
43
+ * The same renders tool as `HighlightUpdatesModal`, rendered INLINE for hosts
44
+ * that place tools in a panel rather than a modal. Exists so there is exactly
45
+ * one implementation — the desktop dashboard used to ship its own copy of this
46
+ * component's header and screen router.
47
+ */
48
+ export declare function HighlightToolView(props?: Omit<HighlightUpdatesModalProps, "visible" | "onClose" | "inline">): React.JSX.Element;
35
49
  export default HighlightUpdatesModal;
36
50
  //# sourceMappingURL=HighlightUpdatesModal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"HighlightUpdatesModal.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/components/HighlightUpdatesModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAgCxE,UAAU,0BAA0B;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,IAAI,CAAC;CACxC;AAcD,wBAAgB,qBAAqB,CAAC,EACpC,OAAO,EACP,OAAO,EACP,MAAM,EACN,UAAU,EACV,2BAAmC,EACnC,gBAAgB,EAChB,yBAAyB,GAC1B,EAAE,0BAA0B,4BAyjB5B;AA0BD,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"HighlightUpdatesModal.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/components/HighlightUpdatesModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAgCxE,UAAU,0BAA0B;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,IAAI,CAAC;CACxC;AAcD,wBAAgB,qBAAqB,CAAC,EACpC,OAAO,EACP,OAAO,EACP,MAAM,EACN,UAAU,EACV,2BAAmC,EACnC,gBAAgB,EAChB,yBAAyB,EACzB,MAAc,GACf,EAAE,0BAA0B,4BA6kB5B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,GAAE,IAAI,CAAC,0BAA0B,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAM,qBAK/E;AAsCD,eAAe,qBAAqB,CAAC"}
@@ -34,6 +34,8 @@ export interface ScreenElement {
34
34
  control?: "toggle" | "slider" | "text";
35
35
  /** Current value for toggle/slider/text controls. */
36
36
  value?: number | boolean | string;
37
+ /** True when an onLongPress handler is reachable (drive with longPress:true). */
38
+ longPressable?: boolean;
37
39
  /** Normalized [0,1] tap point (center of the element). */
38
40
  tap?: {
39
41
  x: number;
@@ -61,6 +63,8 @@ export interface TapElementParams {
61
63
  query?: string;
62
64
  /** Scroll the target into view first if it's off-screen. Default true. */
63
65
  scrollIntoView?: boolean;
66
+ /** Invoke the element's onLongPress instead of onPress. Fails if it has none. */
67
+ longPress?: boolean;
64
68
  /**
65
69
  * For value controls: the value to set. A toggle/switch flips to !current
66
70
  * when omitted; a slider goes to the far end when omitted. Booleans target
@@ -1 +1 @@
1
- {"version":3,"file":"screenElements.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/screenElements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AA6ZH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,WAAW,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC,0DAA0D;IAC1D,GAAG,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,8BAA8B;IAC9B,KAAK,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACjE;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,SAAS,GAAG,aAAa,GAAG,eAAe,GAAG,cAAc,CAAC;QAClE,sDAAsD;QACtD,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;KACnC,CAAC;IACF,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChG;AA2JD,wBAAsB,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC,CA+DpE;AAsDD,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyGpF"}
1
+ {"version":3,"file":"screenElements.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/screenElements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAqaH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,WAAW,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC,iFAAiF;IACjF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0DAA0D;IAC1D,GAAG,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,8BAA8B;IAC9B,KAAK,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACjE;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,SAAS,GAAG,aAAa,GAAG,eAAe,GAAG,cAAc,CAAC;QAClE,sDAAsD;QACtD,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;KACnC,CAAC;IACF,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChG;AA8JD,wBAAsB,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAiEpE;AAsDD,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsHpF"}
@@ -38,7 +38,7 @@ export { detectRenderCause, clearRenderCauseState, removeRenderCauseState, getRe
38
38
  export { PerformanceLogger } from "./highlight-updates/utils/PerformanceLogger";
39
39
  export type { BatchMetrics, BatchTimer } from "./highlight-updates/utils/PerformanceLogger";
40
40
  export { VIEW_TYPE_MAP, getComponentDisplayName, getNativeViewType, isKnownViewType, getAllNativeViewTypes, getAllComponentNames, } from "./highlight-updates/utils/ViewTypeMapper";
41
- export { HighlightUpdatesModal } from "./highlight-updates/components/HighlightUpdatesModal";
41
+ export { HighlightUpdatesModal, HighlightToolView, } from "./highlight-updates/components/HighlightUpdatesModal";
42
42
  export { RenderListItem } from "./highlight-updates/components/RenderListItem";
43
43
  export { RenderDetailView } from "./highlight-updates/components/RenderDetailView";
44
44
  export { HighlightFilterView } from "./highlight-updates/components/HighlightFilterView";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,sDAAsD,CAAC;AAG7G,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAGjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AAGtF,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,+CAA+C,CAAC;AAGvD,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAK1E,OAAO,EACL,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,kDAAkD,CAAC;AA6C1D,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACxE,YAAY,EACV,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,eAAe,GAChB,MAAM,yCAAyC,CAAC;AAGjD,eAAO,MAAM,aAAa,GACxB,UAAU,CACR,KAAK,EAAE,OAAO,yCAAyC,EAAE,WAAW,EACpE,MAAM,EAAE,OAAO,yCAAyC,EAAE,aAAa,KACpE,IAAI,QAIV,CAAC;AAGF,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EAEnB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,+CAA+C,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAChF,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,6CAA6C,CAAC;AAG5F,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sDAAsD,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAC;AACzF,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,sBAAsB,GACvB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,oDAAoD,CAAC;AAG5D,OAAO,EACL,mBAAmB,GACpB,MAAM,iDAAiD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,sDAAsD,CAAC;AAG7G,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAGjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AAGtF,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,+CAA+C,CAAC;AAGvD,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAK1E,OAAO,EACL,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,kDAAkD,CAAC;AA6C1D,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACxE,YAAY,EACV,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,eAAe,GAChB,MAAM,yCAAyC,CAAC;AAGjD,eAAO,MAAM,aAAa,GACxB,UAAU,CACR,KAAK,EAAE,OAAO,yCAAyC,EAAE,WAAW,EACpE,MAAM,EAAE,OAAO,yCAAyC,EAAE,aAAa,KACpE,IAAI,QAIV,CAAC;AAGF,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EAEnB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,+CAA+C,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAChF,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,6CAA6C,CAAC;AAG5F,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,0CAA0C,CAAC;AAKlD,OAAO,EACL,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAC;AACzF,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,sBAAsB,GACvB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,oDAAoD,CAAC;AAG5D,OAAO,EACL,mBAAmB,GACpB,MAAM,iDAAiD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buoy-gg/highlight-updates",
3
- "version": "7.0.3",
3
+ "version": "7.0.5",
4
4
  "description": "Render highlighter for React Native — see every render with its cause: mount, state, props, or parent. Part of Buoy devtools.",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -26,14 +26,14 @@
26
26
  ],
27
27
  "sideEffects": false,
28
28
  "dependencies": {
29
- "@buoy-gg/floating-tools-core": "7.0.3",
30
- "@buoy-gg/shared-ui": "7.0.3"
29
+ "@buoy-gg/floating-tools-core": "7.0.5",
30
+ "@buoy-gg/shared-ui": "7.0.5"
31
31
  },
32
32
  "peerDependencies": {
33
- "@buoy-gg/license": "7.0.3",
33
+ "@buoy-gg/license": "7.0.5",
34
34
  "react": "*",
35
35
  "react-native": "*",
36
- "@buoy-gg/core": "7.0.3"
36
+ "@buoy-gg/core": "7.0.5"
37
37
  },
38
38
  "peerDependenciesMeta": {
39
39
  "@buoy-gg/core": {
@@ -44,8 +44,8 @@
44
44
  "@types/react": "^19.1.0",
45
45
  "@types/react-native": "^0.73.0",
46
46
  "typescript": "~5.8.3",
47
- "@buoy-gg/core": "7.0.3",
48
- "@buoy-gg/license": "7.0.3"
47
+ "@buoy-gg/license": "7.0.5",
48
+ "@buoy-gg/core": "7.0.5"
49
49
  },
50
50
  "react-native-builder-bob": {
51
51
  "source": "src",