@buoy-gg/highlight-updates 3.0.0 → 3.0.2

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 (83) hide show
  1. package/lib/commonjs/highlight-updates/HighlightUpdatesOverlay.js +285 -1
  2. package/lib/commonjs/highlight-updates/components/HighlightFilterView.js +1371 -1
  3. package/lib/commonjs/highlight-updates/components/HighlightUpdatesModal.js +564 -1
  4. package/lib/commonjs/highlight-updates/components/IdentifierBadge.js +267 -1
  5. package/lib/commonjs/highlight-updates/components/IsolatedRenderList.js +178 -1
  6. package/lib/commonjs/highlight-updates/components/ModalHeaderContent.js +309 -1
  7. package/lib/commonjs/highlight-updates/components/RenderCauseBadge.js +500 -1
  8. package/lib/commonjs/highlight-updates/components/RenderDetailView.js +803 -1
  9. package/lib/commonjs/highlight-updates/components/RenderHistoryViewer.js +894 -1
  10. package/lib/commonjs/highlight-updates/components/RenderListItem.js +220 -1
  11. package/lib/commonjs/highlight-updates/components/RendersCopySettingsView.js +562 -1
  12. package/lib/commonjs/highlight-updates/components/StatsDisplay.js +70 -1
  13. package/lib/commonjs/highlight-updates/components/index.js +97 -1
  14. package/lib/commonjs/highlight-updates/types/copySettings.js +107 -1
  15. package/lib/commonjs/highlight-updates/utils/HighlightUpdatesController.js +1819 -1
  16. package/lib/commonjs/highlight-updates/utils/PerformanceLogger.js +359 -1
  17. package/lib/commonjs/highlight-updates/utils/ProfilerInterceptor.js +371 -1
  18. package/lib/commonjs/highlight-updates/utils/RenderCauseDetector.js +1828 -1
  19. package/lib/commonjs/highlight-updates/utils/RenderTracker.js +919 -1
  20. package/lib/commonjs/highlight-updates/utils/ViewTypeMapper.js +264 -1
  21. package/lib/commonjs/highlight-updates/utils/copySettingsStorage.js +49 -1
  22. package/lib/commonjs/highlight-updates/utils/renderExportFormatter.js +58 -1
  23. package/lib/commonjs/highlight-updates/utils/rendersExportFormatter.js +485 -1
  24. package/lib/commonjs/index.js +320 -1
  25. package/lib/commonjs/preset.js +278 -1
  26. package/lib/commonjs/sync/highlightUpdatesSyncAdapter.js +83 -0
  27. package/lib/module/highlight-updates/HighlightUpdatesOverlay.js +278 -1
  28. package/lib/module/highlight-updates/components/HighlightFilterView.js +1365 -1
  29. package/lib/module/highlight-updates/components/HighlightUpdatesModal.js +558 -1
  30. package/lib/module/highlight-updates/components/IdentifierBadge.js +259 -1
  31. package/lib/module/highlight-updates/components/IsolatedRenderList.js +174 -1
  32. package/lib/module/highlight-updates/components/ModalHeaderContent.js +304 -1
  33. package/lib/module/highlight-updates/components/RenderCauseBadge.js +491 -1
  34. package/lib/module/highlight-updates/components/RenderDetailView.js +797 -1
  35. package/lib/module/highlight-updates/components/RenderHistoryViewer.js +888 -1
  36. package/lib/module/highlight-updates/components/RenderListItem.js +215 -1
  37. package/lib/module/highlight-updates/components/RendersCopySettingsView.js +558 -1
  38. package/lib/module/highlight-updates/components/StatsDisplay.js +67 -1
  39. package/lib/module/highlight-updates/components/index.js +16 -1
  40. package/lib/module/highlight-updates/types/copySettings.js +102 -1
  41. package/lib/module/highlight-updates/utils/HighlightUpdatesController.js +1815 -1
  42. package/lib/module/highlight-updates/utils/PerformanceLogger.js +353 -1
  43. package/lib/module/highlight-updates/utils/ProfilerInterceptor.js +358 -1
  44. package/lib/module/highlight-updates/utils/RenderCauseDetector.js +1818 -1
  45. package/lib/module/highlight-updates/utils/RenderTracker.js +916 -1
  46. package/lib/module/highlight-updates/utils/ViewTypeMapper.js +255 -1
  47. package/lib/module/highlight-updates/utils/copySettingsStorage.js +43 -1
  48. package/lib/module/highlight-updates/utils/renderExportFormatter.js +54 -1
  49. package/lib/module/highlight-updates/utils/rendersExportFormatter.js +478 -1
  50. package/lib/module/index.js +74 -1
  51. package/lib/module/preset.js +272 -1
  52. package/lib/module/sync/highlightUpdatesSyncAdapter.js +78 -0
  53. package/lib/typescript/highlight-updates/HighlightUpdatesOverlay.d.ts.map +1 -0
  54. package/lib/typescript/highlight-updates/components/HighlightFilterView.d.ts.map +1 -0
  55. package/lib/typescript/highlight-updates/components/HighlightUpdatesModal.d.ts.map +1 -0
  56. package/lib/typescript/highlight-updates/components/IdentifierBadge.d.ts.map +1 -0
  57. package/lib/typescript/highlight-updates/components/IsolatedRenderList.d.ts.map +1 -0
  58. package/lib/typescript/highlight-updates/components/ModalHeaderContent.d.ts.map +1 -0
  59. package/lib/typescript/highlight-updates/components/RenderCauseBadge.d.ts.map +1 -0
  60. package/lib/typescript/highlight-updates/components/RenderDetailView.d.ts.map +1 -0
  61. package/lib/typescript/highlight-updates/components/RenderHistoryViewer.d.ts.map +1 -0
  62. package/lib/typescript/highlight-updates/components/RenderListItem.d.ts.map +1 -0
  63. package/lib/typescript/highlight-updates/components/RendersCopySettingsView.d.ts.map +1 -0
  64. package/lib/typescript/highlight-updates/components/StatsDisplay.d.ts.map +1 -0
  65. package/lib/typescript/highlight-updates/components/index.d.ts.map +1 -0
  66. package/lib/typescript/highlight-updates/types/copySettings.d.ts.map +1 -0
  67. package/lib/typescript/highlight-updates/utils/HighlightUpdatesController.d.ts +90 -0
  68. package/lib/typescript/highlight-updates/utils/HighlightUpdatesController.d.ts.map +1 -0
  69. package/lib/typescript/highlight-updates/utils/PerformanceLogger.d.ts.map +1 -0
  70. package/lib/typescript/highlight-updates/utils/ProfilerInterceptor.d.ts.map +1 -0
  71. package/lib/typescript/highlight-updates/utils/RenderCauseDetector.d.ts.map +1 -0
  72. package/lib/typescript/highlight-updates/utils/RenderTracker.d.ts +10 -0
  73. package/lib/typescript/highlight-updates/utils/RenderTracker.d.ts.map +1 -0
  74. package/lib/typescript/highlight-updates/utils/ViewTypeMapper.d.ts.map +1 -0
  75. package/lib/typescript/highlight-updates/utils/copySettingsStorage.d.ts.map +1 -0
  76. package/lib/typescript/highlight-updates/utils/renderExportFormatter.d.ts.map +1 -0
  77. package/lib/typescript/highlight-updates/utils/rendersExportFormatter.d.ts.map +1 -0
  78. package/lib/typescript/index.d.ts +1 -0
  79. package/lib/typescript/index.d.ts.map +1 -0
  80. package/lib/typescript/preset.d.ts.map +1 -0
  81. package/lib/typescript/sync/highlightUpdatesSyncAdapter.d.ts +36 -0
  82. package/lib/typescript/sync/highlightUpdatesSyncAdapter.d.ts.map +1 -0
  83. package/package.json +7 -7
@@ -1 +1,564 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.HighlightUpdatesModal=HighlightUpdatesModal,exports.default=void 0;var _react=_interopRequireWildcard(require("react")),_reactNative=require("react-native"),_sharedUi=require("@buoy-gg/shared-ui"),_license=require("@buoy-gg/license"),_HighlightUpdatesController=_interopRequireDefault(require("../utils/HighlightUpdatesController")),_RenderTracker=require("../utils/RenderTracker"),_RenderDetailView=require("./RenderDetailView"),_HighlightFilterView=require("./HighlightFilterView"),_IsolatedRenderList=require("./IsolatedRenderList"),_ModalHeaderContent=require("./ModalHeaderContent"),_RenderHistoryViewer=require("./RenderHistoryViewer"),_RendersCopySettingsView=require("./RendersCopySettingsView"),_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,a=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var n,i,s={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return s;if(n=t?a:r){if(n.has(e))return n.get(e);n.set(e,s)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((i=(n=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(i.get||i.set)?n(s,t,i):s[t]=e[t]);return s})(e,t)}const DisabledBanner=_react.default.memo(function(){return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.disabledBanner,children:[(0,_jsxRuntime.jsx)(_sharedUi.Power,{size:14,color:_sharedUi.buoyColors.warning}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.disabledText,children:"Render tracking is disabled"})]})});function HighlightUpdatesModal({visible:e,onClose:t,onBack:r,onMinimize:a,enableSharedModalDimensions:n=!1,initialNativeTag:i,onInitialNativeTagHandled:s}){const l=(0,_license.useIsPro)(),[o,c]=(0,_react.useState)(!1),[d,u]=(0,_react.useState)(()=>_HighlightUpdatesController.default.getFrozen()),[g,_]=(0,_react.useState)(()=>_RenderTracker.RenderTracker.getStats().totalComponents>0),[h,p]=(0,_react.useState)(null),[f,R]=(0,_react.useState)(0),[T,x]=(0,_react.useState)(!1),[C,y]=(0,_react.useState)(!1),[k,S]=(0,_react.useState)([]),[m,b]=(0,_react.useState)("filters"),[v,w]=(0,_react.useState)("details"),[j,H]=(0,_react.useState)(0),[U,I]=(0,_react.useState)(""),[P,D]=(0,_react.useState)(!1),F=(0,_react.useRef)(null),V=(0,_react.useRef)([]),M=(0,_react.useRef)(_RenderTracker.RenderTracker.getFilters()),[N,q]=(0,_react.useState)(()=>{const e=_RenderTracker.RenderTracker.getFilters();return e.includePatterns.length+e.excludePatterns.length}),[E,z]=(0,_react.useState)(()=>_RenderTracker.RenderTracker.getFilters()),[A,O]=(0,_react.useState)(()=>_RenderTracker.RenderTracker.getSettings()),B=(0,_react.useRef)(!1),L=(0,_react.useRef)(!1),K=(0,_react.useRef)(!1);(0,_react.useEffect)(()=>{e&&!B.current&&(B.current=!0)},[e]),(0,_react.useEffect)(()=>{e&&!L.current&&(async()=>{try{const e=await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.highlightUpdates.filters());if(e){const t=JSON.parse(e),r={includeTestID:new Set(t.includeTestID||[]),includeNativeID:new Set(t.includeNativeID||[]),includeViewType:new Set(t.includeViewType||[]),includeComponent:new Set(t.includeComponent||[]),excludeTestID:new Set(t.excludeTestID||[]),excludeNativeID:new Set(t.excludeNativeID||[]),excludeViewType:new Set(t.excludeViewType||[]),excludeComponent:new Set(t.excludeComponent||[]),includePatterns:t.includePatterns||[],excludePatterns:t.excludePatterns||[]};_RenderTracker.RenderTracker.setFilters(r);const a=_RenderTracker.RenderTracker.getFilters();M.current=a,z(a),q(a.includePatterns.length+a.excludePatterns.length)}L.current=!0}catch(e){}})()},[e]),(0,_react.useEffect)(()=>{L.current&&(async()=>{try{const e={includeTestID:Array.from(E.includeTestID),includeNativeID:Array.from(E.includeNativeID),includeViewType:Array.from(E.includeViewType),includeComponent:Array.from(E.includeComponent),excludeTestID:Array.from(E.excludeTestID),excludeNativeID:Array.from(E.excludeNativeID),excludeViewType:Array.from(E.excludeViewType),excludeComponent:Array.from(E.excludeComponent),includePatterns:E.includePatterns,excludePatterns:E.excludePatterns};await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.highlightUpdates.filters(),JSON.stringify(e))}catch(e){}})()},[E]),(0,_react.useEffect)(()=>{e&&!K.current&&(async()=>{try{const e=await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.highlightUpdates.settings());if(e){const t=JSON.parse(e),{performanceLogging:r,excludeDevTools:a,...n}=t;_RenderTracker.RenderTracker.setSettings(n),O(_RenderTracker.RenderTracker.getSettings())}K.current=!0}catch(e){K.current=!0}})()},[e]),(0,_react.useEffect)(()=>{K.current&&(async()=>{try{const{performanceLogging:e,excludeDevTools:t,...r}=A;await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.highlightUpdates.settings(),JSON.stringify(r))}catch(e){}})()},[A]),(0,_react.useEffect)(()=>{const e=_RenderTracker.RenderTracker.subscribeToState(e=>{c(e.isTracking)});return()=>{e()}},[]),(0,_react.useEffect)(()=>{const e=_HighlightUpdatesController.default.subscribeToFreeze(e=>{u(e)});return()=>{e()}},[]),(0,_react.useEffect)(()=>{P&&requestAnimationFrame(()=>{F.current?.focus()})},[P]),(0,_react.useEffect)(()=>{e||_HighlightUpdatesController.default.setSpotlight(null)},[e]),(0,_react.useEffect)(()=>{if(e&&null!=i){const e=_RenderTracker.RenderTracker.getRender(String(i));e&&(p(e),R(0),x(!1),_HighlightUpdatesController.default.setSpotlight(e.nativeTag)),s?.()}},[e,i,s]);const W=(0,_react.useCallback)(()=>{_HighlightUpdatesController.default.isInitialized()||_HighlightUpdatesController.default.initialize(),_HighlightUpdatesController.default.toggle()},[]),J=(0,_react.useCallback)(()=>{_HighlightUpdatesController.default.toggleFreeze()},[]),G=(0,_react.useCallback)(()=>{_HighlightUpdatesController.default.clearRenderCounts(),_(!1)},[]),Q=(0,_react.useCallback)(()=>{S(_RenderTracker.RenderTracker.getFilteredRenders(U)),y(!0)},[U]),X=(0,_react.useCallback)(()=>{y(!1)},[]),Y=(0,_react.useCallback)(e=>{I(e)},[]),Z=(0,_react.useCallback)((e,t,r)=>{p(e),R(t),w("details"),H(0),V.current=r,_HighlightUpdatesController.default.setSpotlight(e.nativeTag)},[]),$=(0,_react.useCallback)(e=>{V.current=e},[]),ee=(0,_react.useCallback)(()=>{p(null),R(0),_HighlightUpdatesController.default.setSpotlight(null)},[]),te=(0,_react.useCallback)(()=>{const e=V.current;if(f>0){const t=f-1,r=e[t];r&&(p(r),R(t),_HighlightUpdatesController.default.setSpotlight(r.nativeTag))}},[f]),re=(0,_react.useCallback)(()=>{const e=V.current;if(f<e.length-1){const t=f+1,r=e[t];r&&(p(r),R(t),_HighlightUpdatesController.default.setSpotlight(r.nativeTag))}},[f]),ae=(0,_react.useCallback)(()=>{x(!1)},[]),ne=(0,_react.useCallback)(()=>{x(!0)},[]),ie=(0,_react.useCallback)(()=>{D(!0)},[]),se=(0,_react.useCallback)(()=>{D(!1)},[]),le=(0,_react.useCallback)(e=>{_RenderTracker.RenderTracker.setFilters(e);const t=_RenderTracker.RenderTracker.getFilters();M.current=t,z(t),q(t.includePatterns.length+t.excludePatterns.length)},[]),oe=(0,_react.useCallback)((e,t)=>{const r=_RenderTracker.RenderTracker.getFilters(),a={};"include"===t?r.includePatterns.some(t=>t.type===e.type&&t.value===e.value)||(a.includePatterns=[...r.includePatterns,e]):r.excludePatterns.some(t=>t.type===e.type&&t.value===e.value)||(a.excludePatterns=[...r.excludePatterns,e]),Object.keys(a).length>0&&(le(a),p(null),R(0),_HighlightUpdatesController.default.setSpotlight(null))},[le]),ce=(0,_react.useCallback)(e=>{_RenderTracker.RenderTracker.setSettings(e),O(_RenderTracker.RenderTracker.getSettings())},[]),de=(0,_react.useCallback)(e=>{_(e.totalComponents>0)},[]),ue=(0,_react.useCallback)(()=>C?(0,_jsxRuntime.jsx)(_ModalHeaderContent.CopySettingsViewHeader,{onBack:X}):T?(0,_jsxRuntime.jsx)(_ModalHeaderContent.FilterViewHeader,{onBack:ae,activeTab:m,onTabChange:b,activeFilterCount:N}):h?(0,_jsxRuntime.jsx)(_ModalHeaderContent.DetailViewHeader,{onBack:ee,activeTab:v,onTabChange:w,hasHistory:(h.renderHistory?.length??0)>0}):(0,_jsxRuntime.jsx)(_ModalHeaderContent.MainListHeader,{onBack:r,isSearchActive:P,searchText:U,onSearchChange:Y,onSearchToggle:ie,onSearchClose:se,onFilterToggle:ne,onToggleTracking:W,onToggleFreeze:J,onClear:G,onOpenCopySettings:Q,isTracking:o,isFrozen:d,activeFilterCount:N,hasRenders:g,searchInputRef:F}),[C,T,h,r,P,U,o,d,N,g,m,v,ae,ee,X,Y,ie,se,ne,W,J,G,Q]),ge=n?_sharedUi.devToolsStorageKeys.modal.root():_sharedUi.devToolsStorageKeys.highlightUpdates.modal();if(!e)return null;const _e=V.current.length,he=h?"details"===v?(0,_jsxRuntime.jsx)(_sharedUi.EventStepperFooter,{currentIndex:f,totalItems:_e,onPrevious:te,onNext:re,itemLabel:"Component",subtitle:h.componentName||h.displayName||h.viewType}):(0,_jsxRuntime.jsx)(_RenderHistoryViewer.RenderHistoryFooter,{render:h,selectedEventIndex:j,onEventIndexChange:H,isPro:l}):null;return(0,_jsxRuntime.jsx)(_sharedUi.TickProvider,{children:(0,_jsxRuntime.jsx)(_sharedUi.JsModal,{visible:e,onClose:t,onMinimize:a,persistenceKey:ge,header:{showToggleButton:!0,customContent:ue()},enablePersistence:!0,initialMode:"bottomSheet",enableGlitchEffects:!0,styles:{},footer:he,footerHeight:h&&("details"===v||(h.renderHistory?.length??0)>1)?68:0,children:(0,_jsxRuntime.jsx)(_reactNative.View,{nativeID:"__rn_buoy__highlight-modal",style:styles.container,children:C?(0,_jsxRuntime.jsx)(_RendersCopySettingsView.RendersCopySettingsView,{renders:k}):h?"details"===v?(0,_jsxRuntime.jsx)(_RenderDetailView.RenderDetailView,{render:h,disableInternalFooter:!0,onAddFilter:oe,isPro:l}):(0,_jsxRuntime.jsx)(_RenderHistoryViewer.RenderHistoryViewer,{render:h,disableInternalFooter:!0,selectedEventIndex:j,onEventIndexChange:H,isPro:l}):T?(0,_jsxRuntime.jsx)(_HighlightFilterView.HighlightFilterView,{filters:E,onFilterChange:le,settings:A,onSettingsChange:ce,availableProps:_RenderTracker.RenderTracker.getAvailableProps(),activeTab:m}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[!o&&(0,_jsxRuntime.jsx)(DisabledBanner,{}),(0,_jsxRuntime.jsx)(_IsolatedRenderList.IsolatedRenderList,{searchText:U,filters:E,onSelectRender:Z,onStatsChange:de,onRendersChange:$,isTracking:o,isPro:l})]})})})})}const styles=_reactNative.StyleSheet.create({container:{flex:1,backgroundColor:_sharedUi.buoyColors.base},disabledBanner:{flexDirection:"row",alignItems:"center",gap:8,padding:10,marginHorizontal:12,marginTop:8,backgroundColor:_sharedUi.buoyColors.warning+"15",borderRadius:8,borderWidth:1,borderColor:_sharedUi.buoyColors.warning+"20"},disabledText:{color:_sharedUi.buoyColors.warning,fontSize:11,flex:1}});var _default=exports.default=HighlightUpdatesModal;
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.HighlightUpdatesModal = HighlightUpdatesModal;
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 _license = require("@buoy-gg/license");
12
+ var _HighlightUpdatesController = _interopRequireDefault(require("../utils/HighlightUpdatesController"));
13
+ var _RenderTracker = require("../utils/RenderTracker");
14
+ var _RenderDetailView = require("./RenderDetailView");
15
+ var _HighlightFilterView = require("./HighlightFilterView");
16
+ var _IsolatedRenderList = require("./IsolatedRenderList");
17
+ var _ModalHeaderContent = require("./ModalHeaderContent");
18
+ var _RenderHistoryViewer = require("./RenderHistoryViewer");
19
+ var _RendersCopySettingsView = require("./RendersCopySettingsView");
20
+ var _jsxRuntime = require("react/jsx-runtime");
21
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
+ 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); }
23
+ /**
24
+ * HighlightUpdatesModal
25
+ *
26
+ * Main modal interface for the Highlight Updates dev tool.
27
+ * Shows a list of tracked component renders with controls for
28
+ * start/stop, clear, and filtering.
29
+ *
30
+ * PERFORMANCE OPTIMIZED:
31
+ * - Uses isolated components to prevent parent re-renders
32
+ * - Stats display is isolated (StatsDisplay)
33
+ * - Render list is isolated (IsolatedRenderList)
34
+ * - Header components are memoized
35
+ * - Uses refs for values not displayed in UI
36
+ */
37
+
38
+ // Disabled banner - memoized since props rarely change
39
+ const DisabledBanner = /*#__PURE__*/_react.default.memo(function DisabledBanner() {
40
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
41
+ style: styles.disabledBanner,
42
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Power, {
43
+ size: 14,
44
+ color: _sharedUi.buoyColors.warning
45
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
46
+ style: styles.disabledText,
47
+ children: "Render tracking is disabled"
48
+ })]
49
+ });
50
+ });
51
+ function HighlightUpdatesModal({
52
+ visible,
53
+ onClose,
54
+ onBack,
55
+ onMinimize,
56
+ enableSharedModalDimensions = false,
57
+ initialNativeTag,
58
+ onInitialNativeTagHandled
59
+ }) {
60
+ const isPro = (0, _license.useIsPro)();
61
+
62
+ // ============================================================================
63
+ // TRACKING STATE - subscribed via isolated component
64
+ // ============================================================================
65
+ const [isTracking, setIsTracking] = (0, _react.useState)(false);
66
+ const [isFrozen, setIsFrozen] = (0, _react.useState)(() => _HighlightUpdatesController.default.getFrozen());
67
+
68
+ // Track if there are renders for header clear button state
69
+ const [hasRenders, setHasRenders] = (0, _react.useState)(() => _RenderTracker.RenderTracker.getStats().totalComponents > 0);
70
+
71
+ // ============================================================================
72
+ // UI STATE - kept in parent for view switching
73
+ // ============================================================================
74
+ const [selectedRender, setSelectedRender] = (0, _react.useState)(null);
75
+ const [selectedRenderIndex, setSelectedRenderIndex] = (0, _react.useState)(0);
76
+ const [showFilterView, setShowFilterView] = (0, _react.useState)(false);
77
+ const [showCopySettingsView, setShowCopySettingsView] = (0, _react.useState)(false);
78
+ const [copyRendersSnapshot, setCopyRendersSnapshot] = (0, _react.useState)([]);
79
+ const [filterViewActiveTab, setFilterViewActiveTab] = (0, _react.useState)("filters");
80
+ const [detailViewActiveTab, setDetailViewActiveTab] = (0, _react.useState)("details");
81
+ const [historyEventIndex, setHistoryEventIndex] = (0, _react.useState)(0);
82
+ const [searchText, setSearchText] = (0, _react.useState)("");
83
+ const [isSearchActive, setIsSearchActive] = (0, _react.useState)(false);
84
+ const searchInputRef = (0, _react.useRef)(null);
85
+
86
+ // Track the renders list for navigation
87
+ const rendersListRef = (0, _react.useRef)([]);
88
+
89
+ // ============================================================================
90
+ // FILTER STATE - use ref for filter config, state for display count only
91
+ // ============================================================================
92
+ const filtersRef = (0, _react.useRef)(_RenderTracker.RenderTracker.getFilters());
93
+ const [activeFilterCount, setActiveFilterCount] = (0, _react.useState)(() => {
94
+ const filters = _RenderTracker.RenderTracker.getFilters();
95
+ return filters.includePatterns.length + filters.excludePatterns.length;
96
+ });
97
+
98
+ // Expose filters via state for HighlightFilterView (it needs to display them)
99
+ const [filters, setFilters] = (0, _react.useState)(() => _RenderTracker.RenderTracker.getFilters());
100
+
101
+ // ============================================================================
102
+ // SETTINGS STATE
103
+ // ============================================================================
104
+ const [settings, setSettings] = (0, _react.useState)(() => _RenderTracker.RenderTracker.getSettings());
105
+
106
+ // ============================================================================
107
+ // PERSISTENCE REFS - prevent saving on initial load
108
+ // ============================================================================
109
+ const hasLoadedTrackingState = (0, _react.useRef)(false);
110
+ const hasLoadedFilters = (0, _react.useRef)(false);
111
+ const hasLoadedSettings = (0, _react.useRef)(false);
112
+
113
+ // ============================================================================
114
+ // LOAD PERSISTED STATE
115
+ // ============================================================================
116
+
117
+ // Tracking state is intentionally NOT persisted.
118
+ // Always starts OFF to prevent infinite re-render loops on load where
119
+ // the overlay highlights its own components before exclusion filters can take effect.
120
+ // The user must explicitly enable tracking each session.
121
+ (0, _react.useEffect)(() => {
122
+ if (!visible || hasLoadedTrackingState.current) return;
123
+ hasLoadedTrackingState.current = true;
124
+ }, [visible]);
125
+
126
+ // Load persisted filters on mount
127
+ (0, _react.useEffect)(() => {
128
+ if (!visible || hasLoadedFilters.current) return;
129
+ const loadFilters = async () => {
130
+ try {
131
+ const storedFilters = await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.highlightUpdates.filters());
132
+ if (storedFilters) {
133
+ const parsedFilters = JSON.parse(storedFilters);
134
+ const restoredFilters = {
135
+ includeTestID: new Set(parsedFilters.includeTestID || []),
136
+ includeNativeID: new Set(parsedFilters.includeNativeID || []),
137
+ includeViewType: new Set(parsedFilters.includeViewType || []),
138
+ includeComponent: new Set(parsedFilters.includeComponent || []),
139
+ excludeTestID: new Set(parsedFilters.excludeTestID || []),
140
+ excludeNativeID: new Set(parsedFilters.excludeNativeID || []),
141
+ excludeViewType: new Set(parsedFilters.excludeViewType || []),
142
+ excludeComponent: new Set(parsedFilters.excludeComponent || []),
143
+ includePatterns: parsedFilters.includePatterns || [],
144
+ excludePatterns: parsedFilters.excludePatterns || []
145
+ };
146
+ _RenderTracker.RenderTracker.setFilters(restoredFilters);
147
+ const newFilters = _RenderTracker.RenderTracker.getFilters();
148
+ filtersRef.current = newFilters;
149
+ setFilters(newFilters);
150
+ setActiveFilterCount(newFilters.includePatterns.length + newFilters.excludePatterns.length);
151
+ }
152
+ hasLoadedFilters.current = true;
153
+ } catch (error) {
154
+ // Failed to load filters
155
+ }
156
+ };
157
+ loadFilters();
158
+ }, [visible]);
159
+
160
+ // Save filters when they change
161
+ (0, _react.useEffect)(() => {
162
+ if (!hasLoadedFilters.current) return;
163
+ const saveFilters = async () => {
164
+ try {
165
+ const filtersToSave = {
166
+ includeTestID: Array.from(filters.includeTestID),
167
+ includeNativeID: Array.from(filters.includeNativeID),
168
+ includeViewType: Array.from(filters.includeViewType),
169
+ includeComponent: Array.from(filters.includeComponent),
170
+ excludeTestID: Array.from(filters.excludeTestID),
171
+ excludeNativeID: Array.from(filters.excludeNativeID),
172
+ excludeViewType: Array.from(filters.excludeViewType),
173
+ excludeComponent: Array.from(filters.excludeComponent),
174
+ includePatterns: filters.includePatterns,
175
+ excludePatterns: filters.excludePatterns
176
+ };
177
+ await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.highlightUpdates.filters(), JSON.stringify(filtersToSave));
178
+ } catch (error) {
179
+ // Failed to save filters
180
+ }
181
+ };
182
+ saveFilters();
183
+ }, [filters]);
184
+
185
+ // Load persisted settings on mount
186
+ (0, _react.useEffect)(() => {
187
+ if (!visible || hasLoadedSettings.current) return;
188
+ const loadSettings = async () => {
189
+ try {
190
+ const storedSettings = await _sharedUi.persistentStorage.getItem(_sharedUi.devToolsStorageKeys.highlightUpdates.settings());
191
+ if (storedSettings) {
192
+ const parsedSettings = JSON.parse(storedSettings);
193
+ // Never restore excludeDevTools or performanceLogging from persistence -
194
+ // excludeDevTools must always default to true to prevent infinite re-render loops
195
+ const {
196
+ performanceLogging: _ignored,
197
+ excludeDevTools: _alwaysTrue,
198
+ ...settingsToRestore
199
+ } = parsedSettings;
200
+ _RenderTracker.RenderTracker.setSettings(settingsToRestore);
201
+ setSettings(_RenderTracker.RenderTracker.getSettings());
202
+ }
203
+ hasLoadedSettings.current = true;
204
+ } catch (error) {
205
+ hasLoadedSettings.current = true;
206
+ }
207
+ };
208
+ loadSettings();
209
+ }, [visible]);
210
+
211
+ // Save settings when they change
212
+ (0, _react.useEffect)(() => {
213
+ if (!hasLoadedSettings.current) return;
214
+ const saveSettings = async () => {
215
+ try {
216
+ // Never persist excludeDevTools - it must always default to true on startup
217
+ const {
218
+ performanceLogging: _ignored,
219
+ excludeDevTools: _neverPersist,
220
+ ...settingsToSave
221
+ } = settings;
222
+ await _sharedUi.persistentStorage.setItem(_sharedUi.devToolsStorageKeys.highlightUpdates.settings(), JSON.stringify(settingsToSave));
223
+ } catch (error) {
224
+ // Failed to save settings
225
+ }
226
+ };
227
+ saveSettings();
228
+ }, [settings]);
229
+
230
+ // ============================================================================
231
+ // SUBSCRIPTIONS - only for tracking state, not renders
232
+ // ============================================================================
233
+
234
+ // Subscribe to tracking state changes only
235
+ (0, _react.useEffect)(() => {
236
+ const unsubscribeState = _RenderTracker.RenderTracker.subscribeToState(state => {
237
+ setIsTracking(state.isTracking);
238
+ });
239
+ return () => {
240
+ unsubscribeState();
241
+ };
242
+ }, []);
243
+
244
+ // Subscribe to freeze state changes
245
+ (0, _react.useEffect)(() => {
246
+ const unsubscribeFreeze = _HighlightUpdatesController.default.subscribeToFreeze(frozen => {
247
+ setIsFrozen(frozen);
248
+ });
249
+ return () => {
250
+ unsubscribeFreeze();
251
+ };
252
+ }, []);
253
+
254
+ // Focus search input when activated
255
+ (0, _react.useEffect)(() => {
256
+ if (isSearchActive) {
257
+ requestAnimationFrame(() => {
258
+ searchInputRef.current?.focus();
259
+ });
260
+ }
261
+ }, [isSearchActive]);
262
+
263
+ // Clear spotlight when modal is closed
264
+ (0, _react.useEffect)(() => {
265
+ if (!visible) {
266
+ _HighlightUpdatesController.default.setSpotlight(null);
267
+ }
268
+ }, [visible]);
269
+
270
+ // ============================================================================
271
+ // DEEP LINK NAVIGATION - "Click Overlay Badge → Jump to Detail"
272
+ // ============================================================================
273
+
274
+ // Handle initial navigation when a badge is tapped
275
+ (0, _react.useEffect)(() => {
276
+ if (visible && initialNativeTag != null) {
277
+ // Look up the render by nativeTag
278
+ const render = _RenderTracker.RenderTracker.getRender(String(initialNativeTag));
279
+ if (render) {
280
+ // Navigate to detail view for this component
281
+ setSelectedRender(render);
282
+ setSelectedRenderIndex(0);
283
+ setShowFilterView(false);
284
+ // Set spotlight to show which component is being viewed
285
+ _HighlightUpdatesController.default.setSpotlight(render.nativeTag);
286
+ }
287
+ // Notify parent that we've handled the navigation
288
+ onInitialNativeTagHandled?.();
289
+ }
290
+ }, [visible, initialNativeTag, onInitialNativeTagHandled]);
291
+
292
+ // ============================================================================
293
+ // CALLBACKS - stable references for child components
294
+ // ============================================================================
295
+
296
+ const handleToggleTracking = (0, _react.useCallback)(() => {
297
+ if (!_HighlightUpdatesController.default.isInitialized()) {
298
+ _HighlightUpdatesController.default.initialize();
299
+ }
300
+ _HighlightUpdatesController.default.toggle();
301
+ }, []);
302
+ const handleToggleFreeze = (0, _react.useCallback)(() => {
303
+ _HighlightUpdatesController.default.toggleFreeze();
304
+ }, []);
305
+ const handleClear = (0, _react.useCallback)(() => {
306
+ _HighlightUpdatesController.default.clearRenderCounts();
307
+ setHasRenders(false);
308
+ }, []);
309
+ const handleOpenCopySettings = (0, _react.useCallback)(() => {
310
+ // Snapshot the same filtered list the user sees in the main list view
311
+ // (respects include/exclude patterns and the search box).
312
+ setCopyRendersSnapshot(_RenderTracker.RenderTracker.getFilteredRenders(searchText));
313
+ setShowCopySettingsView(true);
314
+ }, [searchText]);
315
+ const handleCloseCopySettings = (0, _react.useCallback)(() => {
316
+ setShowCopySettingsView(false);
317
+ }, []);
318
+ const handleSearch = (0, _react.useCallback)(text => {
319
+ setSearchText(text);
320
+ }, []);
321
+ const handleRenderPress = (0, _react.useCallback)((render, index, allRenders) => {
322
+ setSelectedRender(render);
323
+ setSelectedRenderIndex(index);
324
+ setDetailViewActiveTab("details"); // Reset to details tab when selecting a new render
325
+ setHistoryEventIndex(0); // Reset history event index when selecting a new render
326
+ rendersListRef.current = allRenders;
327
+ // Set spotlight to show which component is being viewed
328
+ _HighlightUpdatesController.default.setSpotlight(render.nativeTag);
329
+ }, []);
330
+ const handleRendersChange = (0, _react.useCallback)(renders => {
331
+ rendersListRef.current = renders;
332
+ }, []);
333
+ const handleBackFromDetail = (0, _react.useCallback)(() => {
334
+ setSelectedRender(null);
335
+ setSelectedRenderIndex(0);
336
+ // Clear the spotlight
337
+ _HighlightUpdatesController.default.setSpotlight(null);
338
+ }, []);
339
+ const handlePreviousRender = (0, _react.useCallback)(() => {
340
+ const renders = rendersListRef.current;
341
+ if (selectedRenderIndex > 0) {
342
+ const newIndex = selectedRenderIndex - 1;
343
+ const newRender = renders[newIndex];
344
+ if (newRender) {
345
+ setSelectedRender(newRender);
346
+ setSelectedRenderIndex(newIndex);
347
+ _HighlightUpdatesController.default.setSpotlight(newRender.nativeTag);
348
+ }
349
+ }
350
+ }, [selectedRenderIndex]);
351
+ const handleNextRender = (0, _react.useCallback)(() => {
352
+ const renders = rendersListRef.current;
353
+ if (selectedRenderIndex < renders.length - 1) {
354
+ const newIndex = selectedRenderIndex + 1;
355
+ const newRender = renders[newIndex];
356
+ if (newRender) {
357
+ setSelectedRender(newRender);
358
+ setSelectedRenderIndex(newIndex);
359
+ _HighlightUpdatesController.default.setSpotlight(newRender.nativeTag);
360
+ }
361
+ }
362
+ }, [selectedRenderIndex]);
363
+ const handleBackFromFilter = (0, _react.useCallback)(() => {
364
+ setShowFilterView(false);
365
+ }, []);
366
+ const handleFilterToggle = (0, _react.useCallback)(() => {
367
+ setShowFilterView(true);
368
+ }, []);
369
+ const handleSearchToggle = (0, _react.useCallback)(() => {
370
+ setIsSearchActive(true);
371
+ }, []);
372
+ const handleSearchClose = (0, _react.useCallback)(() => {
373
+ setIsSearchActive(false);
374
+ }, []);
375
+ const handleFilterChange = (0, _react.useCallback)(newFilters => {
376
+ _RenderTracker.RenderTracker.setFilters(newFilters);
377
+ const updatedFilters = _RenderTracker.RenderTracker.getFilters();
378
+ filtersRef.current = updatedFilters;
379
+ setFilters(updatedFilters);
380
+ setActiveFilterCount(updatedFilters.includePatterns.length + updatedFilters.excludePatterns.length);
381
+ }, []);
382
+
383
+ // Handler for adding a filter from the detail view (quick actions)
384
+ const handleAddFilter = (0, _react.useCallback)((pattern, mode) => {
385
+ const currentFilters = _RenderTracker.RenderTracker.getFilters();
386
+ const newFilters = {};
387
+ if (mode === "include") {
388
+ // Check if pattern already exists
389
+ const exists = currentFilters.includePatterns.some(p => p.type === pattern.type && p.value === pattern.value);
390
+ if (!exists) {
391
+ newFilters.includePatterns = [...currentFilters.includePatterns, pattern];
392
+ }
393
+ } else {
394
+ // Check if pattern already exists
395
+ const exists = currentFilters.excludePatterns.some(p => p.type === pattern.type && p.value === pattern.value);
396
+ if (!exists) {
397
+ newFilters.excludePatterns = [...currentFilters.excludePatterns, pattern];
398
+ }
399
+ }
400
+ if (Object.keys(newFilters).length > 0) {
401
+ handleFilterChange(newFilters);
402
+ // Go back to the list view after adding filter
403
+ setSelectedRender(null);
404
+ setSelectedRenderIndex(0);
405
+ // Clear the spotlight
406
+ _HighlightUpdatesController.default.setSpotlight(null);
407
+ }
408
+ }, [handleFilterChange]);
409
+ const handleSettingsChange = (0, _react.useCallback)(newSettings => {
410
+ _RenderTracker.RenderTracker.setSettings(newSettings);
411
+ setSettings(_RenderTracker.RenderTracker.getSettings());
412
+ }, []);
413
+
414
+ // Callback for IsolatedRenderList to update hasRenders (for header clear button)
415
+ const handleStatsChange = (0, _react.useCallback)(stats => {
416
+ setHasRenders(stats.totalComponents > 0);
417
+ }, []);
418
+
419
+ // ============================================================================
420
+ // HEADER RENDERING - using memoized components
421
+ // ============================================================================
422
+
423
+ const renderHeaderContent = (0, _react.useCallback)(() => {
424
+ if (showCopySettingsView) {
425
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ModalHeaderContent.CopySettingsViewHeader, {
426
+ onBack: handleCloseCopySettings
427
+ });
428
+ }
429
+ if (showFilterView) {
430
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ModalHeaderContent.FilterViewHeader, {
431
+ onBack: handleBackFromFilter,
432
+ activeTab: filterViewActiveTab,
433
+ onTabChange: setFilterViewActiveTab,
434
+ activeFilterCount: activeFilterCount
435
+ });
436
+ }
437
+ if (selectedRender) {
438
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ModalHeaderContent.DetailViewHeader, {
439
+ onBack: handleBackFromDetail,
440
+ activeTab: detailViewActiveTab,
441
+ onTabChange: setDetailViewActiveTab,
442
+ hasHistory: (selectedRender.renderHistory?.length ?? 0) > 0
443
+ });
444
+ }
445
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ModalHeaderContent.MainListHeader, {
446
+ onBack: onBack,
447
+ isSearchActive: isSearchActive,
448
+ searchText: searchText,
449
+ onSearchChange: handleSearch,
450
+ onSearchToggle: handleSearchToggle,
451
+ onSearchClose: handleSearchClose,
452
+ onFilterToggle: handleFilterToggle,
453
+ onToggleTracking: handleToggleTracking,
454
+ onToggleFreeze: handleToggleFreeze,
455
+ onClear: handleClear,
456
+ onOpenCopySettings: handleOpenCopySettings,
457
+ isTracking: isTracking,
458
+ isFrozen: isFrozen,
459
+ activeFilterCount: activeFilterCount,
460
+ hasRenders: hasRenders,
461
+ searchInputRef: searchInputRef
462
+ });
463
+ }, [showCopySettingsView, showFilterView, selectedRender, onBack, isSearchActive, searchText, isTracking, isFrozen, activeFilterCount, hasRenders, filterViewActiveTab, detailViewActiveTab, handleBackFromFilter, handleBackFromDetail, handleCloseCopySettings, handleSearch, handleSearchToggle, handleSearchClose, handleFilterToggle, handleToggleTracking, handleToggleFreeze, handleClear, handleOpenCopySettings]);
464
+
465
+ // ============================================================================
466
+ // RENDER
467
+ // ============================================================================
468
+
469
+ const persistenceKey = enableSharedModalDimensions ? _sharedUi.devToolsStorageKeys.modal.root() : _sharedUi.devToolsStorageKeys.highlightUpdates.modal();
470
+ if (!visible) return null;
471
+
472
+ // Footer for navigating through the renders list or history events
473
+ const totalRenders = rendersListRef.current.length;
474
+ const footerNode = selectedRender ? detailViewActiveTab === "details" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.EventStepperFooter, {
475
+ currentIndex: selectedRenderIndex,
476
+ totalItems: totalRenders,
477
+ onPrevious: handlePreviousRender,
478
+ onNext: handleNextRender,
479
+ itemLabel: "Component",
480
+ subtitle: selectedRender.componentName || selectedRender.displayName || selectedRender.viewType
481
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_RenderHistoryViewer.RenderHistoryFooter, {
482
+ render: selectedRender,
483
+ selectedEventIndex: historyEventIndex,
484
+ onEventIndexChange: setHistoryEventIndex,
485
+ isPro: isPro
486
+ }) : null;
487
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TickProvider, {
488
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.JsModal, {
489
+ visible: visible,
490
+ onClose: onClose,
491
+ onMinimize: onMinimize,
492
+ persistenceKey: persistenceKey,
493
+ header: {
494
+ showToggleButton: true,
495
+ customContent: renderHeaderContent()
496
+ },
497
+ enablePersistence: true,
498
+ initialMode: "bottomSheet",
499
+ enableGlitchEffects: true,
500
+ styles: {},
501
+ footer: footerNode,
502
+ 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
+ })
538
+ })
539
+ });
540
+ }
541
+ const styles = _reactNative.StyleSheet.create({
542
+ container: {
543
+ flex: 1,
544
+ backgroundColor: _sharedUi.buoyColors.base
545
+ },
546
+ disabledBanner: {
547
+ flexDirection: "row",
548
+ alignItems: "center",
549
+ gap: 8,
550
+ padding: 10,
551
+ marginHorizontal: 12,
552
+ marginTop: 8,
553
+ backgroundColor: _sharedUi.buoyColors.warning + "15",
554
+ borderRadius: 8,
555
+ borderWidth: 1,
556
+ borderColor: _sharedUi.buoyColors.warning + "20"
557
+ },
558
+ disabledText: {
559
+ color: _sharedUi.buoyColors.warning,
560
+ fontSize: 11,
561
+ flex: 1
562
+ }
563
+ });
564
+ var _default = exports.default = HighlightUpdatesModal;