@buoy-gg/highlight-updates 2.1.10 → 2.1.12

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 (64) 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 +591 -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 +303 -1
  7. package/lib/commonjs/highlight-updates/components/RenderCauseBadge.js +500 -1
  8. package/lib/commonjs/highlight-updates/components/RenderDetailView.js +830 -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/StatsDisplay.js +70 -1
  12. package/lib/commonjs/highlight-updates/components/index.js +97 -1
  13. package/lib/commonjs/highlight-updates/utils/HighlightUpdatesController.js +1435 -1
  14. package/lib/commonjs/highlight-updates/utils/PerformanceLogger.js +359 -1
  15. package/lib/commonjs/highlight-updates/utils/ProfilerInterceptor.js +371 -1
  16. package/lib/commonjs/highlight-updates/utils/RenderCauseDetector.js +1828 -1
  17. package/lib/commonjs/highlight-updates/utils/RenderTracker.js +903 -1
  18. package/lib/commonjs/highlight-updates/utils/ViewTypeMapper.js +264 -1
  19. package/lib/commonjs/highlight-updates/utils/renderExportFormatter.js +58 -1
  20. package/lib/commonjs/index.js +311 -1
  21. package/lib/commonjs/preset.js +278 -1
  22. package/lib/module/highlight-updates/HighlightUpdatesOverlay.js +278 -1
  23. package/lib/module/highlight-updates/components/HighlightFilterView.js +1365 -1
  24. package/lib/module/highlight-updates/components/HighlightUpdatesModal.js +585 -1
  25. package/lib/module/highlight-updates/components/IdentifierBadge.js +259 -1
  26. package/lib/module/highlight-updates/components/IsolatedRenderList.js +174 -1
  27. package/lib/module/highlight-updates/components/ModalHeaderContent.js +298 -1
  28. package/lib/module/highlight-updates/components/RenderCauseBadge.js +491 -1
  29. package/lib/module/highlight-updates/components/RenderDetailView.js +826 -1
  30. package/lib/module/highlight-updates/components/RenderHistoryViewer.js +888 -1
  31. package/lib/module/highlight-updates/components/RenderListItem.js +215 -1
  32. package/lib/module/highlight-updates/components/StatsDisplay.js +67 -1
  33. package/lib/module/highlight-updates/components/index.js +16 -1
  34. package/lib/module/highlight-updates/utils/HighlightUpdatesController.js +1431 -1
  35. package/lib/module/highlight-updates/utils/PerformanceLogger.js +353 -1
  36. package/lib/module/highlight-updates/utils/ProfilerInterceptor.js +358 -1
  37. package/lib/module/highlight-updates/utils/RenderCauseDetector.js +1818 -1
  38. package/lib/module/highlight-updates/utils/RenderTracker.js +900 -1
  39. package/lib/module/highlight-updates/utils/ViewTypeMapper.js +255 -1
  40. package/lib/module/highlight-updates/utils/renderExportFormatter.js +54 -1
  41. package/lib/module/index.js +71 -1
  42. package/lib/module/preset.js +272 -1
  43. package/lib/typescript/highlight-updates/HighlightUpdatesOverlay.d.ts.map +1 -0
  44. package/lib/typescript/highlight-updates/components/HighlightFilterView.d.ts.map +1 -0
  45. package/lib/typescript/highlight-updates/components/HighlightUpdatesModal.d.ts.map +1 -0
  46. package/lib/typescript/highlight-updates/components/IdentifierBadge.d.ts.map +1 -0
  47. package/lib/typescript/highlight-updates/components/IsolatedRenderList.d.ts.map +1 -0
  48. package/lib/typescript/highlight-updates/components/ModalHeaderContent.d.ts.map +1 -0
  49. package/lib/typescript/highlight-updates/components/RenderCauseBadge.d.ts.map +1 -0
  50. package/lib/typescript/highlight-updates/components/RenderDetailView.d.ts.map +1 -0
  51. package/lib/typescript/highlight-updates/components/RenderHistoryViewer.d.ts.map +1 -0
  52. package/lib/typescript/highlight-updates/components/RenderListItem.d.ts.map +1 -0
  53. package/lib/typescript/highlight-updates/components/StatsDisplay.d.ts.map +1 -0
  54. package/lib/typescript/highlight-updates/components/index.d.ts.map +1 -0
  55. package/lib/typescript/highlight-updates/utils/HighlightUpdatesController.d.ts.map +1 -0
  56. package/lib/typescript/highlight-updates/utils/PerformanceLogger.d.ts.map +1 -0
  57. package/lib/typescript/highlight-updates/utils/ProfilerInterceptor.d.ts.map +1 -0
  58. package/lib/typescript/highlight-updates/utils/RenderCauseDetector.d.ts.map +1 -0
  59. package/lib/typescript/highlight-updates/utils/RenderTracker.d.ts.map +1 -0
  60. package/lib/typescript/highlight-updates/utils/ViewTypeMapper.d.ts.map +1 -0
  61. package/lib/typescript/highlight-updates/utils/renderExportFormatter.d.ts.map +1 -0
  62. package/lib/typescript/index.d.ts.map +1 -0
  63. package/lib/typescript/preset.d.ts.map +1 -0
  64. package/package.json +7 -7
@@ -1 +1,303 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.SearchSection=exports.MainListHeader=exports.HeaderActions=exports.FilterViewHeader=exports.DetailViewHeader=void 0;var _react=_interopRequireWildcard(require("react")),_reactNative=require("react-native"),_sharedUi=require("@buoy-gg/shared-ui"),_StatsDisplay=require("./StatsDisplay"),_jsxRuntime=require("react/jsx-runtime");function _interopRequireWildcard(e,r){if("function"==typeof WeakMap)var t=new WeakMap,o=new WeakMap;return(_interopRequireWildcard=function(e,r){if(!r&&e&&e.__esModule)return e;var a,i,s={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return s;if(a=r?o:t){if(a.has(e))return a.get(e);a.set(e,s)}for(const r in e)"default"!==r&&{}.hasOwnProperty.call(e,r)&&((i=(a=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,r))&&(i.get||i.set)?a(s,r,i):s[r]=e[r]);return s})(e,r)}const SearchSectionInner=(0,_react.memo)(function({isActive:e,searchText:r,onSearchChange:t,onSearchClose:o}){return e?(0,_jsxRuntime.jsxs)(_reactNative.View,{nativeID:"__rn_buoy__search-container",style:styles.headerSearchContainer,children:[(0,_jsxRuntime.jsx)(_sharedUi.Search,{size:14,color:_sharedUi.buoyColors.textSecondary}),(0,_jsxRuntime.jsx)(_reactNative.TextInput,{style:styles.headerSearchInput,placeholder:"Search testID, nativeID, component...",placeholderTextColor:_sharedUi.buoyColors.textMuted,value:r,onChangeText:t,onSubmitEditing:o,onBlur:o,accessibilityLabel:"Search renders",autoCapitalize:"none",autoCorrect:!1,returnKeyType:"search",autoFocus:!0}),r.length>0?(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:()=>{t(""),o()},style:styles.headerSearchClear,children:(0,_jsxRuntime.jsx)(_sharedUi.X,{size:14,color:_sharedUi.buoyColors.textSecondary})}):null]}):null}),SearchSection=exports.SearchSection=SearchSectionInner,HeaderActionsInner=(0,_react.memo)(function({onSearchToggle:e,onFilterToggle:r,onToggleTracking:t,onToggleFreeze:o,onClear:a,copyData:i,isTracking:s,isFrozen:n,activeFilterCount:l,hasRenders:d}){return(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader.Actions,{children:[(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:e,style:styles.headerActionButton,children:(0,_jsxRuntime.jsx)(_sharedUi.Search,{size:14,color:_sharedUi.buoyColors.textSecondary})}),(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:r,style:[styles.headerActionButton,l>0&&styles.activeFilterButton],children:(0,_jsxRuntime.jsx)(_sharedUi.Filter,{size:14,color:l>0?_sharedUi.buoyColors.primary:_sharedUi.buoyColors.textMuted})}),(0,_jsxRuntime.jsx)(_sharedUi.CopyButton,{value:i,size:14,buttonStyle:d?styles.headerActionButton:styles.headerActionButtonCopyDisabled,disabled:!d,colors:{idle:d?_sharedUi.buoyColors.textSecondary:_sharedUi.buoyColors.textMuted}}),(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:o,style:[styles.headerActionButton,n&&styles.freezeButton,!s&&styles.headerActionButtonDisabled],disabled:!s,children:(0,_jsxRuntime.jsx)(_sharedUi.Pause,{size:14,color:s&&n?_sharedUi.buoyColors.primary:_sharedUi.buoyColors.textMuted})}),(0,_jsxRuntime.jsx)(_sharedUi.PowerToggleButton,{isEnabled:s,onToggle:t,accessibilityLabel:"Toggle render tracking"}),(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:a,style:[styles.headerActionButton,!d&&styles.headerActionButtonDisabled],disabled:!d,children:(0,_jsxRuntime.jsx)(_sharedUi.Trash2,{size:14,color:_sharedUi.buoyColors.textMuted})})]})}),HeaderActions=exports.HeaderActions=HeaderActionsInner,MainListHeader=exports.MainListHeader=(0,_react.memo)(function({onBack:e,isSearchActive:r,searchText:t,onSearchChange:o,onSearchToggle:a,onSearchClose:i,onFilterToggle:s,onToggleTracking:n,onToggleFreeze:l,onClear:d,copyData:c,isTracking:u,isFrozen:h,activeFilterCount:_,hasRenders:x,searchInputRef:y}){return(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[e&&(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:e}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"",children:r?(0,_jsxRuntime.jsx)(SearchSection,{isActive:r,searchText:t,onSearchChange:o,onSearchClose:i,searchInputRef:y}):(0,_jsxRuntime.jsx)(_StatsDisplay.StatsDisplay,{})}),(0,_jsxRuntime.jsx)(HeaderActions,{onSearchToggle:a,onFilterToggle:s,onToggleTracking:n,onToggleFreeze:l,onClear:d,copyData:c,isTracking:u,isFrozen:h,activeFilterCount:_,hasRenders:x})]})}),FilterViewHeader=exports.FilterViewHeader=(0,_react.memo)(function({onBack:e,activeTab:r,onTabChange:t,activeFilterCount:o=0}){const a=[{key:"filters",label:"Filters"+(o>0?` (${o})`:"")},{key:"settings",label:"Settings"}];return(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:e}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"",noMargin:!0,children:(0,_jsxRuntime.jsx)(_sharedUi.TabSelector,{tabs:a,activeTab:r,onTabChange:e=>t(e)})}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Actions,{})]})}),DetailViewHeader=exports.DetailViewHeader=(0,_react.memo)(function({onBack:e,activeTab:r,onTabChange:t,hasHistory:o=!0}){const a=[{key:"details",label:"Details"},{key:"history",label:"History",disabled:!o}];return(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:e}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"",noMargin:!0,children:(0,_jsxRuntime.jsx)(_sharedUi.TabSelector,{tabs:a,activeTab:r,onTabChange:e=>t(e)})}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Actions,{})]})}),styles=_reactNative.StyleSheet.create({headerSearchContainer:{flexDirection:"row",alignItems:"center",backgroundColor:_sharedUi.buoyColors.input,borderRadius:10,borderWidth:1,borderColor:_sharedUi.buoyColors.border,paddingHorizontal:12,paddingVertical:5},headerSearchInput:{flex:1,color:_sharedUi.buoyColors.text,fontSize:13,marginLeft:6,paddingVertical:2},headerSearchClear:{marginLeft:6,padding:4},headerActionButton:{width:32,height:32,borderRadius:8,backgroundColor:_sharedUi.buoyColors.hover,borderWidth:1,borderColor:_sharedUi.buoyColors.border,alignItems:"center",justifyContent:"center"},headerActionButtonDisabled:{opacity:.55},headerActionButtonCopyDisabled:{width:32,height:32,borderRadius:8,backgroundColor:_sharedUi.buoyColors.hover,borderWidth:1,borderColor:_sharedUi.buoyColors.border,alignItems:"center",justifyContent:"center",opacity:.55},activeFilterButton:{backgroundColor:_sharedUi.buoyColors.primary+"15",borderColor:_sharedUi.buoyColors.primary+"40"},freezeButton:{backgroundColor:_sharedUi.buoyColors.primary+"15",borderColor:_sharedUi.buoyColors.primary+"40"}});
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SearchSection = exports.MainListHeader = exports.HeaderActions = exports.FilterViewHeader = exports.DetailViewHeader = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _sharedUi = require("@buoy-gg/shared-ui");
10
+ var _StatsDisplay = require("./StatsDisplay");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ 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); }
13
+ /**
14
+ * ModalHeaderContent
15
+ *
16
+ * Memoized header content components for the HighlightUpdatesModal.
17
+ * Extracted to prevent re-renders when parent state changes unrelated to header.
18
+ *
19
+ * Following the optimization guide: extract inline JSX to memoized components.
20
+ */
21
+
22
+ // ============================================================================
23
+ // Search Section - isolated component for search UI
24
+ // ============================================================================
25
+
26
+ const SearchSectionInner = /*#__PURE__*/(0, _react.memo)(function SearchSection({
27
+ isActive,
28
+ searchText,
29
+ onSearchChange,
30
+ onSearchClose
31
+ }) {
32
+ if (!isActive) return null;
33
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
34
+ nativeID: "__rn_buoy__search-container",
35
+ style: styles.headerSearchContainer,
36
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
37
+ size: 14,
38
+ color: _sharedUi.buoyColors.textSecondary
39
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
40
+ style: styles.headerSearchInput,
41
+ placeholder: "Search testID, nativeID, component...",
42
+ placeholderTextColor: _sharedUi.buoyColors.textMuted,
43
+ value: searchText,
44
+ onChangeText: onSearchChange,
45
+ onSubmitEditing: onSearchClose,
46
+ onBlur: onSearchClose,
47
+ accessibilityLabel: "Search renders",
48
+ autoCapitalize: "none",
49
+ autoCorrect: false,
50
+ returnKeyType: "search",
51
+ autoFocus: true
52
+ }), searchText.length > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
53
+ onPress: () => {
54
+ onSearchChange("");
55
+ onSearchClose();
56
+ },
57
+ style: styles.headerSearchClear,
58
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.X, {
59
+ size: 14,
60
+ color: _sharedUi.buoyColors.textSecondary
61
+ })
62
+ }) : null]
63
+ });
64
+ });
65
+ const SearchSection = exports.SearchSection = SearchSectionInner;
66
+
67
+ // ============================================================================
68
+ // Header Actions - isolated component for action buttons
69
+ // ============================================================================
70
+
71
+ const HeaderActionsInner = /*#__PURE__*/(0, _react.memo)(function HeaderActions({
72
+ onSearchToggle,
73
+ onFilterToggle,
74
+ onToggleTracking,
75
+ onToggleFreeze,
76
+ onClear,
77
+ copyData,
78
+ isTracking,
79
+ isFrozen,
80
+ activeFilterCount,
81
+ hasRenders
82
+ }) {
83
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader.Actions, {
84
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
85
+ onPress: onSearchToggle,
86
+ style: styles.headerActionButton,
87
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
88
+ size: 14,
89
+ color: _sharedUi.buoyColors.textSecondary
90
+ })
91
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
92
+ onPress: onFilterToggle,
93
+ style: [styles.headerActionButton, activeFilterCount > 0 && styles.activeFilterButton],
94
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Filter, {
95
+ size: 14,
96
+ color: activeFilterCount > 0 ? _sharedUi.buoyColors.primary : _sharedUi.buoyColors.textMuted
97
+ })
98
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.CopyButton, {
99
+ value: copyData,
100
+ size: 14,
101
+ buttonStyle: hasRenders ? styles.headerActionButton : styles.headerActionButtonCopyDisabled,
102
+ disabled: !hasRenders,
103
+ colors: {
104
+ idle: hasRenders ? _sharedUi.buoyColors.textSecondary : _sharedUi.buoyColors.textMuted
105
+ }
106
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
107
+ onPress: onToggleFreeze,
108
+ style: [styles.headerActionButton, isFrozen && styles.freezeButton, !isTracking && styles.headerActionButtonDisabled],
109
+ disabled: !isTracking,
110
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Pause, {
111
+ size: 14,
112
+ color: !isTracking ? _sharedUi.buoyColors.textMuted : isFrozen ? _sharedUi.buoyColors.primary : _sharedUi.buoyColors.textMuted
113
+ })
114
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.PowerToggleButton, {
115
+ isEnabled: isTracking,
116
+ onToggle: onToggleTracking,
117
+ accessibilityLabel: "Toggle render tracking"
118
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
119
+ onPress: onClear,
120
+ style: [styles.headerActionButton, !hasRenders && styles.headerActionButtonDisabled],
121
+ disabled: !hasRenders,
122
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Trash2, {
123
+ size: 14,
124
+ color: hasRenders ? _sharedUi.buoyColors.textMuted : _sharedUi.buoyColors.textMuted
125
+ })
126
+ })]
127
+ });
128
+ });
129
+ const HeaderActions = exports.HeaderActions = HeaderActionsInner;
130
+
131
+ // ============================================================================
132
+ // Main List Header - complete header for main list view
133
+ // ============================================================================
134
+
135
+ const MainListHeader = exports.MainListHeader = /*#__PURE__*/(0, _react.memo)(function MainListHeader({
136
+ onBack,
137
+ isSearchActive,
138
+ searchText,
139
+ onSearchChange,
140
+ onSearchToggle,
141
+ onSearchClose,
142
+ onFilterToggle,
143
+ onToggleTracking,
144
+ onToggleFreeze,
145
+ onClear,
146
+ copyData,
147
+ isTracking,
148
+ isFrozen,
149
+ activeFilterCount,
150
+ hasRenders,
151
+ searchInputRef
152
+ }) {
153
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
154
+ children: [onBack && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
155
+ onBack: onBack
156
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
157
+ title: "",
158
+ children: isSearchActive ? /*#__PURE__*/(0, _jsxRuntime.jsx)(SearchSection, {
159
+ isActive: isSearchActive,
160
+ searchText: searchText,
161
+ onSearchChange: onSearchChange,
162
+ onSearchClose: onSearchClose,
163
+ searchInputRef: searchInputRef
164
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_StatsDisplay.StatsDisplay, {})
165
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(HeaderActions, {
166
+ onSearchToggle: onSearchToggle,
167
+ onFilterToggle: onFilterToggle,
168
+ onToggleTracking: onToggleTracking,
169
+ onToggleFreeze: onToggleFreeze,
170
+ onClear: onClear,
171
+ copyData: copyData,
172
+ isTracking: isTracking,
173
+ isFrozen: isFrozen,
174
+ activeFilterCount: activeFilterCount,
175
+ hasRenders: hasRenders
176
+ })]
177
+ });
178
+ });
179
+
180
+ // ============================================================================
181
+ // Filter View Header
182
+ // ============================================================================
183
+
184
+ const FilterViewHeader = exports.FilterViewHeader = /*#__PURE__*/(0, _react.memo)(function FilterViewHeader({
185
+ onBack,
186
+ activeTab,
187
+ onTabChange,
188
+ activeFilterCount = 0
189
+ }) {
190
+ const tabs = [{
191
+ key: "filters",
192
+ label: `Filters${activeFilterCount > 0 ? ` (${activeFilterCount})` : ""}`
193
+ }, {
194
+ key: "settings",
195
+ label: "Settings"
196
+ }];
197
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
198
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
199
+ onBack: onBack
200
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
201
+ title: "",
202
+ noMargin: true,
203
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TabSelector, {
204
+ tabs: tabs,
205
+ activeTab: activeTab,
206
+ onTabChange: tab => onTabChange(tab)
207
+ })
208
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Actions, {})]
209
+ });
210
+ });
211
+
212
+ // ============================================================================
213
+ // Detail View Header
214
+ // ============================================================================
215
+
216
+ const DetailViewHeader = exports.DetailViewHeader = /*#__PURE__*/(0, _react.memo)(function DetailViewHeader({
217
+ onBack,
218
+ activeTab,
219
+ onTabChange,
220
+ hasHistory = true
221
+ }) {
222
+ const tabs = [{
223
+ key: "details",
224
+ label: "Details"
225
+ }, {
226
+ key: "history",
227
+ label: "History",
228
+ disabled: !hasHistory
229
+ }];
230
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.ModalHeader, {
231
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation, {
232
+ onBack: onBack
233
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Content, {
234
+ title: "",
235
+ noMargin: true,
236
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TabSelector, {
237
+ tabs: tabs,
238
+ activeTab: activeTab,
239
+ onTabChange: tab => onTabChange(tab)
240
+ })
241
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Actions, {})]
242
+ });
243
+ });
244
+
245
+ // ============================================================================
246
+ // Styles
247
+ // ============================================================================
248
+
249
+ const styles = _reactNative.StyleSheet.create({
250
+ headerSearchContainer: {
251
+ flexDirection: "row",
252
+ alignItems: "center",
253
+ backgroundColor: _sharedUi.buoyColors.input,
254
+ borderRadius: 10,
255
+ borderWidth: 1,
256
+ borderColor: _sharedUi.buoyColors.border,
257
+ paddingHorizontal: 12,
258
+ paddingVertical: 5
259
+ },
260
+ headerSearchInput: {
261
+ flex: 1,
262
+ color: _sharedUi.buoyColors.text,
263
+ fontSize: 13,
264
+ marginLeft: 6,
265
+ paddingVertical: 2
266
+ },
267
+ headerSearchClear: {
268
+ marginLeft: 6,
269
+ padding: 4
270
+ },
271
+ headerActionButton: {
272
+ width: 32,
273
+ height: 32,
274
+ borderRadius: 8,
275
+ backgroundColor: _sharedUi.buoyColors.hover,
276
+ borderWidth: 1,
277
+ borderColor: _sharedUi.buoyColors.border,
278
+ alignItems: "center",
279
+ justifyContent: "center"
280
+ },
281
+ headerActionButtonDisabled: {
282
+ opacity: 0.55
283
+ },
284
+ headerActionButtonCopyDisabled: {
285
+ width: 32,
286
+ height: 32,
287
+ borderRadius: 8,
288
+ backgroundColor: _sharedUi.buoyColors.hover,
289
+ borderWidth: 1,
290
+ borderColor: _sharedUi.buoyColors.border,
291
+ alignItems: "center",
292
+ justifyContent: "center",
293
+ opacity: 0.55
294
+ },
295
+ activeFilterButton: {
296
+ backgroundColor: _sharedUi.buoyColors.primary + "15",
297
+ borderColor: _sharedUi.buoyColors.primary + "40"
298
+ },
299
+ freezeButton: {
300
+ backgroundColor: _sharedUi.buoyColors.primary + "15",
301
+ borderColor: _sharedUi.buoyColors.primary + "40"
302
+ }
303
+ });