@buoy-gg/highlight-updates 2.1.11 → 2.1.13

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 (65) hide show
  1. package/LICENSE +58 -0
  2. package/lib/commonjs/highlight-updates/HighlightUpdatesOverlay.js +1 -285
  3. package/lib/commonjs/highlight-updates/components/HighlightFilterView.js +1 -1371
  4. package/lib/commonjs/highlight-updates/components/HighlightUpdatesModal.js +1 -591
  5. package/lib/commonjs/highlight-updates/components/IdentifierBadge.js +1 -267
  6. package/lib/commonjs/highlight-updates/components/IsolatedRenderList.js +1 -178
  7. package/lib/commonjs/highlight-updates/components/ModalHeaderContent.js +1 -303
  8. package/lib/commonjs/highlight-updates/components/RenderCauseBadge.js +1 -500
  9. package/lib/commonjs/highlight-updates/components/RenderDetailView.js +1 -830
  10. package/lib/commonjs/highlight-updates/components/RenderHistoryViewer.js +1 -894
  11. package/lib/commonjs/highlight-updates/components/RenderListItem.js +1 -220
  12. package/lib/commonjs/highlight-updates/components/StatsDisplay.js +1 -70
  13. package/lib/commonjs/highlight-updates/components/index.js +1 -97
  14. package/lib/commonjs/highlight-updates/utils/HighlightUpdatesController.js +1 -1435
  15. package/lib/commonjs/highlight-updates/utils/PerformanceLogger.js +1 -359
  16. package/lib/commonjs/highlight-updates/utils/ProfilerInterceptor.js +1 -371
  17. package/lib/commonjs/highlight-updates/utils/RenderCauseDetector.js +1 -1828
  18. package/lib/commonjs/highlight-updates/utils/RenderTracker.js +1 -903
  19. package/lib/commonjs/highlight-updates/utils/ViewTypeMapper.js +1 -264
  20. package/lib/commonjs/highlight-updates/utils/renderExportFormatter.js +1 -58
  21. package/lib/commonjs/index.js +1 -311
  22. package/lib/commonjs/preset.js +1 -278
  23. package/lib/module/highlight-updates/HighlightUpdatesOverlay.js +1 -278
  24. package/lib/module/highlight-updates/components/HighlightFilterView.js +1 -1365
  25. package/lib/module/highlight-updates/components/HighlightUpdatesModal.js +1 -585
  26. package/lib/module/highlight-updates/components/IdentifierBadge.js +1 -259
  27. package/lib/module/highlight-updates/components/IsolatedRenderList.js +1 -174
  28. package/lib/module/highlight-updates/components/ModalHeaderContent.js +1 -298
  29. package/lib/module/highlight-updates/components/RenderCauseBadge.js +1 -491
  30. package/lib/module/highlight-updates/components/RenderDetailView.js +1 -826
  31. package/lib/module/highlight-updates/components/RenderHistoryViewer.js +1 -888
  32. package/lib/module/highlight-updates/components/RenderListItem.js +1 -215
  33. package/lib/module/highlight-updates/components/StatsDisplay.js +1 -67
  34. package/lib/module/highlight-updates/components/index.js +1 -16
  35. package/lib/module/highlight-updates/utils/HighlightUpdatesController.js +1 -1431
  36. package/lib/module/highlight-updates/utils/PerformanceLogger.js +1 -353
  37. package/lib/module/highlight-updates/utils/ProfilerInterceptor.js +1 -358
  38. package/lib/module/highlight-updates/utils/RenderCauseDetector.js +1 -1818
  39. package/lib/module/highlight-updates/utils/RenderTracker.js +1 -900
  40. package/lib/module/highlight-updates/utils/ViewTypeMapper.js +1 -255
  41. package/lib/module/highlight-updates/utils/renderExportFormatter.js +1 -54
  42. package/lib/module/index.js +1 -71
  43. package/lib/module/preset.js +1 -272
  44. package/package.json +16 -16
  45. package/lib/typescript/highlight-updates/HighlightUpdatesOverlay.d.ts.map +0 -1
  46. package/lib/typescript/highlight-updates/components/HighlightFilterView.d.ts.map +0 -1
  47. package/lib/typescript/highlight-updates/components/HighlightUpdatesModal.d.ts.map +0 -1
  48. package/lib/typescript/highlight-updates/components/IdentifierBadge.d.ts.map +0 -1
  49. package/lib/typescript/highlight-updates/components/IsolatedRenderList.d.ts.map +0 -1
  50. package/lib/typescript/highlight-updates/components/ModalHeaderContent.d.ts.map +0 -1
  51. package/lib/typescript/highlight-updates/components/RenderCauseBadge.d.ts.map +0 -1
  52. package/lib/typescript/highlight-updates/components/RenderDetailView.d.ts.map +0 -1
  53. package/lib/typescript/highlight-updates/components/RenderHistoryViewer.d.ts.map +0 -1
  54. package/lib/typescript/highlight-updates/components/RenderListItem.d.ts.map +0 -1
  55. package/lib/typescript/highlight-updates/components/StatsDisplay.d.ts.map +0 -1
  56. package/lib/typescript/highlight-updates/components/index.d.ts.map +0 -1
  57. package/lib/typescript/highlight-updates/utils/HighlightUpdatesController.d.ts.map +0 -1
  58. package/lib/typescript/highlight-updates/utils/PerformanceLogger.d.ts.map +0 -1
  59. package/lib/typescript/highlight-updates/utils/ProfilerInterceptor.d.ts.map +0 -1
  60. package/lib/typescript/highlight-updates/utils/RenderCauseDetector.d.ts.map +0 -1
  61. package/lib/typescript/highlight-updates/utils/RenderTracker.d.ts.map +0 -1
  62. package/lib/typescript/highlight-updates/utils/ViewTypeMapper.d.ts.map +0 -1
  63. package/lib/typescript/highlight-updates/utils/renderExportFormatter.d.ts.map +0 -1
  64. package/lib/typescript/index.d.ts.map +0 -1
  65. package/lib/typescript/preset.d.ts.map +0 -1
package/LICENSE ADDED
@@ -0,0 +1,58 @@
1
+ PROPRIETARY SOFTWARE LICENSE
2
+
3
+ Copyright (c) 2024-present Buoy. All rights reserved.
4
+
5
+ This software and its source code are proprietary and confidential.
6
+
7
+ NOTICE: This is NOT open source software. This software is licensed,
8
+ not sold, and is protected by copyright laws and international treaties.
9
+
10
+ TERMS AND CONDITIONS:
11
+
12
+ 1. LICENSE GRANT
13
+ Subject to the terms of this Agreement and payment of applicable fees,
14
+ Buoy grants you a limited, non-exclusive, non-transferable license
15
+ to use the compiled software packages in your applications.
16
+
17
+ 2. RESTRICTIONS
18
+ You may NOT:
19
+ - Copy, modify, or distribute the source code
20
+ - Reverse engineer, decompile, or disassemble the software
21
+ - Remove or alter any proprietary notices or labels
22
+ - Sublicense, rent, lease, or lend the software
23
+ - Use the software to create competing products
24
+ - Share access credentials with unauthorized parties
25
+
26
+ 3. OWNERSHIP
27
+ React Buoy retains all right, title, and interest in the software,
28
+ including all intellectual property rights. This license does not
29
+ grant you any rights to trademarks or service marks.
30
+
31
+ 4. TERMINATION
32
+ This license is effective until terminated. Your rights under this
33
+ license will terminate automatically without notice if you fail to
34
+ comply with any of its terms. Upon termination, you must cease all
35
+ use and destroy all copies of the software.
36
+
37
+ 5. DISCLAIMER OF WARRANTIES
38
+ THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
39
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
40
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT.
41
+
42
+ 6. LIMITATION OF LIABILITY
43
+ IN NO EVENT SHALL BUOY BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
44
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN
45
+ CONNECTION WITH THIS LICENSE OR THE USE OF THE SOFTWARE.
46
+
47
+ 7. GOVERNING LAW
48
+ This Agreement shall be governed by and construed in accordance with
49
+ the laws of the United States, without regard to its conflict of
50
+ law provisions.
51
+
52
+ For licensing inquiries and subscription information:
53
+ - Website: https://buoy.gg
54
+ - Email: AustinLovesWorking@gmail.com
55
+
56
+ Unauthorized reproduction or distribution of this software, or any
57
+ portion of it, may result in severe civil and criminal penalties,
58
+ and will be prosecuted to the maximum extent possible under the law.
@@ -1,285 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.HighlightUpdatesOverlay = HighlightUpdatesOverlay;
7
- exports.default = void 0;
8
- var _react = _interopRequireWildcard(require("react"));
9
- var _reactNative = require("react-native");
10
- var _sharedUi = require("@buoy-gg/shared-ui");
11
- var _HighlightUpdatesController = _interopRequireDefault(require("./utils/HighlightUpdatesController"));
12
- var _PerformanceLogger = require("./utils/PerformanceLogger");
13
- var _RenderTracker = require("./utils/RenderTracker");
14
- var _jsxRuntime = require("react/jsx-runtime");
15
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
17
- /**
18
- * HighlightUpdatesOverlay
19
- *
20
- * Renders colored highlight rectangles for components that have updated.
21
- * Uses View-based rendering (similar to debug-borders) instead of the
22
- * native DebuggingOverlay component for better compatibility.
23
- */
24
-
25
- // Declare performance API available in React Native's JavaScript environment
26
-
27
- // How long highlights stay visible (ms)
28
- const HIGHLIGHT_DURATION = 1000;
29
- function HighlightUpdatesOverlay({
30
- onBadgePress
31
- } = {}) {
32
- const [highlights, setHighlights] = (0, _react.useState)([]);
33
- const [isFrozen, setIsFrozen] = (0, _react.useState)(() => _HighlightUpdatesController.default.getFrozen());
34
- const [spotlightTag, setSpotlightTag] = (0, _react.useState)(null);
35
- const cleanupTimerRef = (0, _react.useRef)(null);
36
- const renderStartTimeRef = (0, _react.useRef)(0);
37
- const highlightCountRef = (0, _react.useRef)(0);
38
- const frozenRef = (0, _react.useRef)(isFrozen);
39
-
40
- // Keep ref in sync with state for use in interval callback
41
- frozenRef.current = isFrozen;
42
-
43
- // Track render start time
44
- if (_PerformanceLogger.PerformanceLogger.isEnabled()) {
45
- renderStartTimeRef.current = performance.now();
46
- highlightCountRef.current = highlights.length;
47
- }
48
-
49
- // Measure render completion time using useLayoutEffect (runs after DOM mutations)
50
- (0, _react.useLayoutEffect)(() => {
51
- if (_PerformanceLogger.PerformanceLogger.isEnabled() && renderStartTimeRef.current > 0 && highlightCountRef.current > 0) {
52
- const renderTime = performance.now() - renderStartTimeRef.current;
53
- // Mark end-to-end timing (for benchmark recording only - no console logs)
54
- (0, _PerformanceLogger.markOverlayRendered)(highlightCountRef.current, renderTime);
55
- }
56
- });
57
-
58
- // Subscribe to freeze state changes
59
- (0, _react.useEffect)(() => {
60
- const unsubscribe = _HighlightUpdatesController.default.subscribeToFreeze(frozen => {
61
- setIsFrozen(frozen);
62
- });
63
- return unsubscribe;
64
- }, []);
65
-
66
- // Subscribe to filter changes - refresh frozen highlights when filters change
67
- (0, _react.useEffect)(() => {
68
- const unsubscribe = _RenderTracker.RenderTracker.subscribeToFilters(() => {
69
- // When filters change, filter out highlights that no longer match
70
- setHighlights(prev => {
71
- return prev.filter(highlight => {
72
- // Look up the render by nativeTag
73
- const render = _RenderTracker.RenderTracker.getRender(String(highlight.id));
74
- if (!render) {
75
- // If render not found, keep the highlight (it might be from a different source)
76
- return true;
77
- }
78
- // Check if the render should still be shown based on new filters
79
- return _RenderTracker.RenderTracker.shouldShowRender(render);
80
- });
81
- });
82
- });
83
- return unsubscribe;
84
- }, []);
85
-
86
- // Subscribe to spotlight changes - show which component is being viewed in detail
87
- (0, _react.useEffect)(() => {
88
- _HighlightUpdatesController.default.setSpotlightCallback(tag => {
89
- setSpotlightTag(tag);
90
- });
91
- return () => {
92
- _HighlightUpdatesController.default.setSpotlightCallback(null);
93
- };
94
- }, []);
95
-
96
- // Callback to add new highlights
97
- const addHighlights = (0, _react.useCallback)(newRects => {
98
- const now = Date.now();
99
- const timestampedRects = newRects.map(rect => ({
100
- ...rect,
101
- timestamp: now
102
- }));
103
- setHighlights(prev => {
104
- // Merge new highlights, replacing any with same id
105
- const updated = [...prev];
106
- for (const newRect of timestampedRects) {
107
- const existingIndex = updated.findIndex(r => r.id === newRect.id);
108
- if (existingIndex >= 0) {
109
- updated[existingIndex] = newRect;
110
- } else {
111
- updated.push(newRect);
112
- }
113
- }
114
- return updated;
115
- });
116
- }, []);
117
-
118
- // Register the callback with the controller
119
- (0, _react.useEffect)(() => {
120
- _HighlightUpdatesController.default.setHighlightCallback(addHighlights);
121
-
122
- // Cleanup timer to remove old highlights
123
- // When frozen, skip cleanup to keep highlights visible indefinitely
124
- cleanupTimerRef.current = setInterval(() => {
125
- // Check frozen state via ref (doesn't cause re-subscription)
126
- if (frozenRef.current) {
127
- return; // Skip cleanup when frozen
128
- }
129
- const now = Date.now();
130
- setHighlights(prev => prev.filter(rect => now - rect.timestamp < HIGHLIGHT_DURATION));
131
- }, 50);
132
- return () => {
133
- _HighlightUpdatesController.default.setHighlightCallback(null);
134
- if (cleanupTimerRef.current) {
135
- clearInterval(cleanupTimerRef.current);
136
- }
137
- };
138
- }, [addHighlights]);
139
-
140
- // Check if badge press handling is enabled (via props or controller)
141
- const hasBadgePressHandler = onBadgePress || _HighlightUpdatesController.default.getBadgePressCallback();
142
-
143
- // Handle badge press - navigate to detail view for this component
144
- const handleBadgePress = (0, _react.useCallback)(nativeTag => {
145
- // First try the prop callback
146
- if (onBadgePress) {
147
- onBadgePress(nativeTag);
148
- } else {
149
- // Fall back to controller callback
150
- _HighlightUpdatesController.default.handleBadgePress(nativeTag);
151
- }
152
- }, [onBadgePress]);
153
-
154
- // Get spotlight render info if we have a spotlight active
155
- const spotlightRender = spotlightTag ? _RenderTracker.RenderTracker.getRender(String(spotlightTag)) : null;
156
-
157
- // Render nothing if no highlights and no spotlight
158
- if (highlights.length === 0 && !spotlightRender?.measurements) {
159
- return null;
160
- }
161
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
162
- style: styles.overlay,
163
- pointerEvents: "box-none",
164
- nativeID: "highlight-updates-overlay",
165
- children: [spotlightRender?.measurements && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
166
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
167
- pointerEvents: "none",
168
- nativeID: "__spotlight_highlight__",
169
- style: [styles.spotlightHighlight, {
170
- // Offset by border width so border renders outside the component bounds
171
- left: spotlightRender.measurements.x - 3,
172
- top: spotlightRender.measurements.y - 3,
173
- width: spotlightRender.measurements.width + 6,
174
- height: spotlightRender.measurements.height + 6
175
- }]
176
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
177
- pointerEvents: "none",
178
- style: [styles.spotlightLabel, {
179
- left: spotlightRender.measurements.x,
180
- top: spotlightRender.measurements.y + spotlightRender.measurements.height + 4
181
- }],
182
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
183
- style: styles.spotlightLabelText,
184
- children: spotlightRender.componentName || spotlightRender.displayName || spotlightRender.viewType
185
- })
186
- })]
187
- }), highlights.map(rect => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
188
- pointerEvents: "box-none",
189
- nativeID: `__highlight_rect_${rect.id}__`,
190
- style: [styles.highlight, {
191
- left: rect.x,
192
- top: rect.y,
193
- width: rect.width,
194
- height: rect.height,
195
- borderColor: rect.color
196
- }],
197
- children: rect.count > 0 && (hasBadgePressHandler ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
198
- onPress: () => handleBadgePress(rect.id),
199
- style: [styles.badge, {
200
- backgroundColor: rect.color
201
- }],
202
- activeOpacity: 0.7,
203
- hitSlop: {
204
- top: 8,
205
- bottom: 8,
206
- left: 8,
207
- right: 8
208
- },
209
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
210
- style: styles.badgeText,
211
- nativeID: `__highlight_text_${rect.id}__`,
212
- children: rect.count
213
- })
214
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
215
- style: [styles.badge, {
216
- backgroundColor: rect.color
217
- }],
218
- nativeID: `__highlight_badge_${rect.id}__`,
219
- pointerEvents: "none",
220
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
221
- style: styles.badgeText,
222
- nativeID: `__highlight_text_${rect.id}__`,
223
- children: rect.count
224
- })
225
- }))
226
- }, `highlight-${rect.id}`))]
227
- });
228
- }
229
- const styles = _reactNative.StyleSheet.create({
230
- overlay: {
231
- position: "absolute",
232
- top: 0,
233
- left: 0,
234
- right: 0,
235
- bottom: 0,
236
- zIndex: 999999,
237
- elevation: 999999,
238
- borderWidth: 0
239
- },
240
- highlight: {
241
- position: "absolute",
242
- borderWidth: 2,
243
- borderStyle: "solid",
244
- backgroundColor: "transparent"
245
- },
246
- badge: {
247
- position: "absolute",
248
- top: 0,
249
- right: 0,
250
- height: 14,
251
- borderRadius: 0,
252
- justifyContent: "center",
253
- alignItems: "center",
254
- paddingHorizontal: 2
255
- },
256
- badgeText: {
257
- color: "#000",
258
- fontSize: 9,
259
- fontWeight: "bold"
260
- },
261
- // Spotlight highlight styles
262
- spotlightHighlight: {
263
- position: "absolute",
264
- borderWidth: 2,
265
- borderStyle: "dashed",
266
- borderColor: _sharedUi.buoyColors.primary,
267
- backgroundColor: "transparent"
268
- },
269
- spotlightLabel: {
270
- position: "absolute",
271
- backgroundColor: _sharedUi.buoyColors.card,
272
- borderWidth: 1,
273
- borderColor: _sharedUi.buoyColors.primary,
274
- paddingHorizontal: 8,
275
- paddingVertical: 3,
276
- borderRadius: 4
277
- },
278
- spotlightLabelText: {
279
- color: _sharedUi.buoyColors.primary,
280
- fontSize: 11,
281
- fontWeight: "600",
282
- fontFamily: "monospace"
283
- }
284
- });
285
- var _default = exports.default = HighlightUpdatesOverlay;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.HighlightUpdatesOverlay=HighlightUpdatesOverlay,exports.default=void 0;var _react=_interopRequireWildcard(require("react")),_reactNative=require("react-native"),_sharedUi=require("@buoy-gg/shared-ui"),_HighlightUpdatesController=_interopRequireDefault(require("./utils/HighlightUpdatesController")),_PerformanceLogger=require("./utils/PerformanceLogger"),_RenderTracker=require("./utils/RenderTracker"),_jsxRuntime=require("react/jsx-runtime");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap,i=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var a,o,n={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return n;if(a=t?i:r){if(a.has(e))return a.get(e);a.set(e,n)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((o=(a=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(o.get||o.set)?a(n,t,o):n[t]=e[t]);return n})(e,t)}const HIGHLIGHT_DURATION=1e3;function HighlightUpdatesOverlay({onBadgePress:e}={}){const[t,r]=(0,_react.useState)([]),[i,a]=(0,_react.useState)(()=>_HighlightUpdatesController.default.getFrozen()),[o,n]=(0,_react.useState)(null),l=(0,_react.useRef)(null),s=(0,_react.useRef)(0),c=(0,_react.useRef)(0),u=(0,_react.useRef)(i);u.current=i,_PerformanceLogger.PerformanceLogger.isEnabled()&&(s.current=performance.now(),c.current=t.length),(0,_react.useLayoutEffect)(()=>{if(_PerformanceLogger.PerformanceLogger.isEnabled()&&s.current>0&&c.current>0){const e=performance.now()-s.current;(0,_PerformanceLogger.markOverlayRendered)(c.current,e)}}),(0,_react.useEffect)(()=>_HighlightUpdatesController.default.subscribeToFreeze(e=>{a(e)}),[]),(0,_react.useEffect)(()=>_RenderTracker.RenderTracker.subscribeToFilters(()=>{r(e=>e.filter(e=>{const t=_RenderTracker.RenderTracker.getRender(String(e.id));return!t||_RenderTracker.RenderTracker.shouldShowRender(t)}))}),[]),(0,_react.useEffect)(()=>(_HighlightUpdatesController.default.setSpotlightCallback(e=>{n(e)}),()=>{_HighlightUpdatesController.default.setSpotlightCallback(null)}),[]);const d=(0,_react.useCallback)(e=>{const t=Date.now(),i=e.map(e=>({...e,timestamp:t}));r(e=>{const t=[...e];for(const e of i){const r=t.findIndex(t=>t.id===e.id);r>=0?t[r]=e:t.push(e)}return t})},[]);(0,_react.useEffect)(()=>(_HighlightUpdatesController.default.setHighlightCallback(d),l.current=setInterval(()=>{if(u.current)return;const e=Date.now();r(t=>t.filter(t=>e-t.timestamp<HIGHLIGHT_DURATION))},50),()=>{_HighlightUpdatesController.default.setHighlightCallback(null),l.current&&clearInterval(l.current)}),[d]);const h=e||_HighlightUpdatesController.default.getBadgePressCallback(),g=(0,_react.useCallback)(t=>{e?e(t):_HighlightUpdatesController.default.handleBadgePress(t)},[e]),_=o?_RenderTracker.RenderTracker.getRender(String(o)):null;return 0!==t.length||_?.measurements?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.overlay,pointerEvents:"box-none",nativeID:"highlight-updates-overlay",children:[_?.measurements&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_reactNative.View,{pointerEvents:"none",nativeID:"__spotlight_highlight__",style:[styles.spotlightHighlight,{left:_.measurements.x-3,top:_.measurements.y-3,width:_.measurements.width+6,height:_.measurements.height+6}]}),(0,_jsxRuntime.jsx)(_reactNative.View,{pointerEvents:"none",style:[styles.spotlightLabel,{left:_.measurements.x,top:_.measurements.y+_.measurements.height+4}],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.spotlightLabelText,children:_.componentName||_.displayName||_.viewType})})]}),t.map(e=>(0,_jsxRuntime.jsx)(_reactNative.View,{pointerEvents:"box-none",nativeID:`__highlight_rect_${e.id}__`,style:[styles.highlight,{left:e.x,top:e.y,width:e.width,height:e.height,borderColor:e.color}],children:e.count>0&&(h?(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:()=>g(e.id),style:[styles.badge,{backgroundColor:e.color}],activeOpacity:.7,hitSlop:{top:8,bottom:8,left:8,right:8},children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.badgeText,nativeID:`__highlight_text_${e.id}__`,children:e.count})}):(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.badge,{backgroundColor:e.color}],nativeID:`__highlight_badge_${e.id}__`,pointerEvents:"none",children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.badgeText,nativeID:`__highlight_text_${e.id}__`,children:e.count})}))},`highlight-${e.id}`))]}):null}const styles=_reactNative.StyleSheet.create({overlay:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:999999,elevation:999999,borderWidth:0},highlight:{position:"absolute",borderWidth:2,borderStyle:"solid",backgroundColor:"transparent"},badge:{position:"absolute",top:0,right:0,height:14,borderRadius:0,justifyContent:"center",alignItems:"center",paddingHorizontal:2},badgeText:{color:"#000",fontSize:9,fontWeight:"bold"},spotlightHighlight:{position:"absolute",borderWidth:2,borderStyle:"dashed",borderColor:_sharedUi.buoyColors.primary,backgroundColor:"transparent"},spotlightLabel:{position:"absolute",backgroundColor:_sharedUi.buoyColors.card,borderWidth:1,borderColor:_sharedUi.buoyColors.primary,paddingHorizontal:8,paddingVertical:3,borderRadius:4},spotlightLabelText:{color:_sharedUi.buoyColors.primary,fontSize:11,fontWeight:"600",fontFamily:"monospace"}});var _default=exports.default=HighlightUpdatesOverlay;