@buoy-gg/highlight-updates 2.1.4-beta.2 → 2.1.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.
Files changed (64) hide show
  1. package/lib/commonjs/highlight-updates/HighlightUpdatesOverlay.js +1 -285
  2. package/lib/commonjs/highlight-updates/components/HighlightFilterView.js +1 -1371
  3. package/lib/commonjs/highlight-updates/components/HighlightUpdatesModal.js +1 -592
  4. package/lib/commonjs/highlight-updates/components/IdentifierBadge.js +1 -267
  5. package/lib/commonjs/highlight-updates/components/IsolatedRenderList.js +1 -178
  6. package/lib/commonjs/highlight-updates/components/ModalHeaderContent.js +1 -303
  7. package/lib/commonjs/highlight-updates/components/RenderCauseBadge.js +1 -500
  8. package/lib/commonjs/highlight-updates/components/RenderDetailView.js +1 -830
  9. package/lib/commonjs/highlight-updates/components/RenderHistoryViewer.js +1 -894
  10. package/lib/commonjs/highlight-updates/components/RenderListItem.js +1 -226
  11. package/lib/commonjs/highlight-updates/components/StatsDisplay.js +1 -70
  12. package/lib/commonjs/highlight-updates/components/index.js +1 -97
  13. package/lib/commonjs/highlight-updates/utils/HighlightUpdatesController.js +1 -1427
  14. package/lib/commonjs/highlight-updates/utils/PerformanceLogger.js +1 -359
  15. package/lib/commonjs/highlight-updates/utils/ProfilerInterceptor.js +1 -371
  16. package/lib/commonjs/highlight-updates/utils/RenderCauseDetector.js +1 -1828
  17. package/lib/commonjs/highlight-updates/utils/RenderTracker.js +1 -903
  18. package/lib/commonjs/highlight-updates/utils/ViewTypeMapper.js +1 -264
  19. package/lib/commonjs/highlight-updates/utils/renderExportFormatter.js +1 -58
  20. package/lib/commonjs/index.js +1 -311
  21. package/lib/commonjs/preset.js +1 -278
  22. package/lib/module/highlight-updates/HighlightUpdatesOverlay.js +1 -278
  23. package/lib/module/highlight-updates/components/HighlightFilterView.js +1 -1365
  24. package/lib/module/highlight-updates/components/HighlightUpdatesModal.js +1 -586
  25. package/lib/module/highlight-updates/components/IdentifierBadge.js +1 -259
  26. package/lib/module/highlight-updates/components/IsolatedRenderList.js +1 -174
  27. package/lib/module/highlight-updates/components/ModalHeaderContent.js +1 -298
  28. package/lib/module/highlight-updates/components/RenderCauseBadge.js +1 -491
  29. package/lib/module/highlight-updates/components/RenderDetailView.js +1 -826
  30. package/lib/module/highlight-updates/components/RenderHistoryViewer.js +1 -888
  31. package/lib/module/highlight-updates/components/RenderListItem.js +1 -221
  32. package/lib/module/highlight-updates/components/StatsDisplay.js +1 -67
  33. package/lib/module/highlight-updates/components/index.js +1 -16
  34. package/lib/module/highlight-updates/utils/HighlightUpdatesController.js +1 -1423
  35. package/lib/module/highlight-updates/utils/PerformanceLogger.js +1 -353
  36. package/lib/module/highlight-updates/utils/ProfilerInterceptor.js +1 -358
  37. package/lib/module/highlight-updates/utils/RenderCauseDetector.js +1 -1818
  38. package/lib/module/highlight-updates/utils/RenderTracker.js +1 -900
  39. package/lib/module/highlight-updates/utils/ViewTypeMapper.js +1 -255
  40. package/lib/module/highlight-updates/utils/renderExportFormatter.js +1 -54
  41. package/lib/module/index.js +1 -71
  42. package/lib/module/preset.js +1 -272
  43. package/package.json +7 -7
  44. package/lib/typescript/highlight-updates/HighlightUpdatesOverlay.d.ts.map +0 -1
  45. package/lib/typescript/highlight-updates/components/HighlightFilterView.d.ts.map +0 -1
  46. package/lib/typescript/highlight-updates/components/HighlightUpdatesModal.d.ts.map +0 -1
  47. package/lib/typescript/highlight-updates/components/IdentifierBadge.d.ts.map +0 -1
  48. package/lib/typescript/highlight-updates/components/IsolatedRenderList.d.ts.map +0 -1
  49. package/lib/typescript/highlight-updates/components/ModalHeaderContent.d.ts.map +0 -1
  50. package/lib/typescript/highlight-updates/components/RenderCauseBadge.d.ts.map +0 -1
  51. package/lib/typescript/highlight-updates/components/RenderDetailView.d.ts.map +0 -1
  52. package/lib/typescript/highlight-updates/components/RenderHistoryViewer.d.ts.map +0 -1
  53. package/lib/typescript/highlight-updates/components/RenderListItem.d.ts.map +0 -1
  54. package/lib/typescript/highlight-updates/components/StatsDisplay.d.ts.map +0 -1
  55. package/lib/typescript/highlight-updates/components/index.d.ts.map +0 -1
  56. package/lib/typescript/highlight-updates/utils/HighlightUpdatesController.d.ts.map +0 -1
  57. package/lib/typescript/highlight-updates/utils/PerformanceLogger.d.ts.map +0 -1
  58. package/lib/typescript/highlight-updates/utils/ProfilerInterceptor.d.ts.map +0 -1
  59. package/lib/typescript/highlight-updates/utils/RenderCauseDetector.d.ts.map +0 -1
  60. package/lib/typescript/highlight-updates/utils/RenderTracker.d.ts.map +0 -1
  61. package/lib/typescript/highlight-updates/utils/ViewTypeMapper.d.ts.map +0 -1
  62. package/lib/typescript/highlight-updates/utils/renderExportFormatter.d.ts.map +0 -1
  63. package/lib/typescript/index.d.ts.map +0 -1
  64. package/lib/typescript/preset.d.ts.map +0 -1
@@ -1,1371 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.HighlightFilterView = HighlightFilterView;
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 _IdentifierBadge = require("./IdentifierBadge");
12
- var _jsxRuntime = require("react/jsx-runtime");
13
- 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); }
14
- /**
15
- * HighlightFilterView
16
- *
17
- * Simplified filter configuration for tracked component renders.
18
- * Uses a badge-based approach where users select a filter type
19
- * (Any, ViewType, testID, Component) then enter a value.
20
- */
21
-
22
- // Use shared identifier config (FilterType is a subset of IdentifierType)
23
- const getFilterConfig = type => _IdentifierBadge.IDENTIFIER_CONFIG[type];
24
-
25
- // Filter types available for selection (all identifier types)
26
- const FILTER_TYPES = ["any", "viewType", "testID", "nativeID", "component", "accessibilityLabel"];
27
-
28
- // Type picker component
29
- function TypePicker({
30
- onSelect,
31
- onCancel
32
- }) {
33
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
34
- nativeID: "__rn_buoy__type-picker",
35
- style: styles.typePicker,
36
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
37
- style: styles.typePickerRow,
38
- children: FILTER_TYPES.map(type => {
39
- const config = getFilterConfig(type);
40
- const IconComponent = config.icon;
41
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
42
- style: [styles.typeOption, {
43
- backgroundColor: config.color + "15",
44
- borderColor: config.color + "40"
45
- }],
46
- onPress: () => onSelect(type),
47
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(IconComponent, {
48
- size: 14,
49
- color: config.color
50
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
51
- style: [styles.typeOptionText, {
52
- color: config.color
53
- }],
54
- children: config.label
55
- })]
56
- }, type);
57
- })
58
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
59
- onPress: onCancel,
60
- style: styles.typePickerCancel,
61
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.X, {
62
- size: 16,
63
- color: _sharedUi.buoyColors.textMuted
64
- })
65
- })]
66
- });
67
- }
68
-
69
- // Pattern input with badge prefix
70
- function PatternInput({
71
- type,
72
- onSubmit,
73
- onCancel
74
- }) {
75
- const [value, setValue] = (0, _react.useState)("");
76
- const config = getFilterConfig(type);
77
- const handleSubmit = () => {
78
- if (value.trim()) {
79
- onSubmit(value.trim());
80
- }
81
- };
82
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
83
- nativeID: "__rn_buoy__pattern-input",
84
- style: styles.patternInputContainer,
85
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_IdentifierBadge.IdentifierBadge, {
86
- type: type,
87
- value: "",
88
- badgeOnly: true,
89
- compact: true
90
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
91
- value: value,
92
- onChangeText: setValue,
93
- onSubmitEditing: handleSubmit,
94
- placeholder: "Enter pattern...",
95
- placeholderTextColor: _sharedUi.buoyColors.textMuted,
96
- style: styles.patternInput,
97
- autoFocus: true,
98
- returnKeyType: "done",
99
- autoCorrect: false,
100
- autoCapitalize: "none"
101
- }), value.trim() && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
102
- onPress: handleSubmit,
103
- style: [styles.addPatternButton, {
104
- backgroundColor: config.color + "20"
105
- }],
106
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
107
- style: [styles.addPatternButtonText, {
108
- color: config.color
109
- }],
110
- children: "Add"
111
- })
112
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
113
- onPress: onCancel,
114
- style: styles.cancelButton,
115
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.X, {
116
- size: 16,
117
- color: _sharedUi.buoyColors.textMuted
118
- })
119
- })]
120
- });
121
- }
122
-
123
- // Pattern chip (removable badge) - tap to remove
124
- function PatternChip({
125
- pattern,
126
- onRemove
127
- }) {
128
- const config = getFilterConfig(pattern.type);
129
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
130
- style: [styles.patternChip, {
131
- borderColor: config.color + "40"
132
- }],
133
- onPress: onRemove,
134
- activeOpacity: 0.7,
135
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
136
- style: [styles.patternChipBadge, {
137
- backgroundColor: config.color + "20"
138
- }],
139
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
140
- style: [styles.patternChipBadgeText, {
141
- color: config.color
142
- }],
143
- children: config.shortLabel
144
- })
145
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
146
- style: styles.patternChipValue,
147
- numberOfLines: 1,
148
- children: pattern.value
149
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.X, {
150
- size: 12,
151
- color: _sharedUi.buoyColors.textMuted,
152
- style: styles.patternChipX
153
- })]
154
- });
155
- }
156
-
157
- // Category type including "all"
158
-
159
- // Config for "all" category
160
- const ALL_CATEGORY_CONFIG = {
161
- label: "All",
162
- shortLabel: "All",
163
- color: _sharedUi.buoyColors.textSecondary,
164
- icon: _sharedUi.Box
165
- };
166
-
167
- // Category badge for horizontal scroll - always colored
168
- function DetectedCategoryBadge({
169
- filterType,
170
- count,
171
- isSelected,
172
- onPress
173
- }) {
174
- // "all" has its own config
175
- const config = filterType === "all" ? ALL_CATEGORY_CONFIG : getFilterConfig(filterType);
176
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
177
- style: [styles.categoryBadge, {
178
- backgroundColor: config.color + "15",
179
- borderColor: isSelected ? config.color : config.color + "40",
180
- borderWidth: isSelected ? 2 : 1
181
- }],
182
- onPress: onPress,
183
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(config.icon, {
184
- size: 12,
185
- color: config.color
186
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
187
- style: [styles.categoryBadgeText, {
188
- color: config.color
189
- }],
190
- children: config.label
191
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
192
- style: [styles.categoryBadgeCountBubble, {
193
- backgroundColor: config.color + "25"
194
- }],
195
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
196
- style: [styles.categoryBadgeCount, {
197
- color: config.color
198
- }],
199
- children: count
200
- })
201
- })]
202
- });
203
- }
204
-
205
- // Batch size presets for the slider
206
- const BATCH_SIZE_PRESETS = [{
207
- value: 20,
208
- label: "20"
209
- }, {
210
- value: 50,
211
- label: "50"
212
- }, {
213
- value: 100,
214
- label: "100"
215
- }, {
216
- value: 150,
217
- label: "150"
218
- }, {
219
- value: 250,
220
- label: "250"
221
- }, {
222
- value: 500,
223
- label: "500"
224
- }];
225
-
226
- // Debug log level presets
227
- const DEBUG_LOG_LEVEL_PRESETS = [{
228
- value: "off",
229
- label: "Off",
230
- description: "No debug logging"
231
- }, {
232
- value: "minimal",
233
- label: "Minimal",
234
- description: "Only hook value changes"
235
- }, {
236
- value: "verbose",
237
- label: "Verbose",
238
- description: "Component + cause + changes"
239
- }, {
240
- value: "all",
241
- label: "All",
242
- description: "Full fiber dump"
243
- }];
244
- function HighlightFilterView({
245
- filters,
246
- onFilterChange,
247
- settings,
248
- onSettingsChange,
249
- availableProps,
250
- activeTab
251
- }) {
252
- // UI state for add inputs
253
- const [showIncludeTypePicker, setShowIncludeTypePicker] = (0, _react.useState)(false);
254
- const [showExcludeTypePicker, setShowExcludeTypePicker] = (0, _react.useState)(false);
255
- const [includeInputType, setIncludeInputType] = (0, _react.useState)(null);
256
- const [excludeInputType, setExcludeInputType] = (0, _react.useState)(null);
257
-
258
- // State for selected detected category (default to "all")
259
- const [selectedCategory, setSelectedCategory] = (0, _react.useState)("all");
260
-
261
- // State for action popup when tapping detected item
262
- const [actionPopupItem, setActionPopupItem] = (0, _react.useState)(null);
263
-
264
- // Get items for selected category with their filter type
265
- const getItemsForCategory = category => {
266
- switch (category) {
267
- case "viewType":
268
- return availableProps.viewTypes.map(v => ({
269
- value: v,
270
- type: "viewType"
271
- }));
272
- case "testID":
273
- return availableProps.testIDs.map(v => ({
274
- value: v,
275
- type: "testID"
276
- }));
277
- case "nativeID":
278
- return availableProps.nativeIDs.map(v => ({
279
- value: v,
280
- type: "nativeID"
281
- }));
282
- case "component":
283
- return availableProps.componentNames.map(v => ({
284
- value: v,
285
- type: "component"
286
- }));
287
- case "accessibilityLabel":
288
- return availableProps.accessibilityLabels.map(v => ({
289
- value: v,
290
- type: "accessibilityLabel"
291
- }));
292
- case "all":
293
- default:
294
- // Combine all items with their types
295
- return [...availableProps.viewTypes.map(v => ({
296
- value: v,
297
- type: "viewType"
298
- })), ...availableProps.testIDs.map(v => ({
299
- value: v,
300
- type: "testID"
301
- })), ...availableProps.nativeIDs.map(v => ({
302
- value: v,
303
- type: "nativeID"
304
- })), ...availableProps.componentNames.map(v => ({
305
- value: v,
306
- type: "component"
307
- })), ...availableProps.accessibilityLabels.map(v => ({
308
- value: v,
309
- type: "accessibilityLabel"
310
- }))];
311
- }
312
- };
313
- const selectedItems = getItemsForCategory(selectedCategory);
314
- const totalItemCount = availableProps.viewTypes.length + availableProps.testIDs.length + availableProps.nativeIDs.length + availableProps.componentNames.length + availableProps.accessibilityLabels.length;
315
-
316
- // Add include pattern
317
- const handleAddIncludePattern = (0, _react.useCallback)((type, value) => {
318
- const newPatterns = [...filters.includePatterns, {
319
- type,
320
- value
321
- }];
322
- onFilterChange({
323
- includePatterns: newPatterns
324
- });
325
- setIncludeInputType(null);
326
- }, [filters.includePatterns, onFilterChange]);
327
-
328
- // Add exclude pattern
329
- const handleAddExcludePattern = (0, _react.useCallback)((type, value) => {
330
- const newPatterns = [...filters.excludePatterns, {
331
- type,
332
- value
333
- }];
334
- onFilterChange({
335
- excludePatterns: newPatterns
336
- });
337
- setExcludeInputType(null);
338
- }, [filters.excludePatterns, onFilterChange]);
339
-
340
- // Remove include pattern
341
- const handleRemoveIncludePattern = (0, _react.useCallback)(index => {
342
- const newPatterns = filters.includePatterns.filter((_, i) => i !== index);
343
- onFilterChange({
344
- includePatterns: newPatterns
345
- });
346
- }, [filters.includePatterns, onFilterChange]);
347
-
348
- // Remove exclude pattern
349
- const handleRemoveExcludePattern = (0, _react.useCallback)(index => {
350
- const newPatterns = filters.excludePatterns.filter((_, i) => i !== index);
351
- onFilterChange({
352
- excludePatterns: newPatterns
353
- });
354
- }, [filters.excludePatterns, onFilterChange]);
355
-
356
- // Show action popup for detected item
357
- const handleDetectedItemPress = (0, _react.useCallback)((type, value) => {
358
- setActionPopupItem({
359
- type,
360
- value
361
- });
362
- }, []);
363
-
364
- // Add to include from popup
365
- const handlePopupInclude = (0, _react.useCallback)(() => {
366
- if (actionPopupItem) {
367
- handleAddIncludePattern(actionPopupItem.type, actionPopupItem.value);
368
- setActionPopupItem(null);
369
- }
370
- }, [actionPopupItem, handleAddIncludePattern]);
371
-
372
- // Add to exclude from popup
373
- const handlePopupExclude = (0, _react.useCallback)(() => {
374
- if (actionPopupItem) {
375
- handleAddExcludePattern(actionPopupItem.type, actionPopupItem.value);
376
- setActionPopupItem(null);
377
- }
378
- }, [actionPopupItem, handleAddExcludePattern]);
379
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
380
- style: styles.container,
381
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
382
- nativeID: "__rn_buoy__filter-view",
383
- style: styles.scrollView,
384
- contentContainerStyle: styles.scrollContent,
385
- showsVerticalScrollIndicator: false,
386
- children: activeTab === "filters" ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
387
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
388
- style: styles.section,
389
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.SectionHeader, {
390
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Icon, {
391
- icon: _sharedUi.Eye,
392
- color: _sharedUi.buoyColors.success,
393
- size: 12
394
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Title, {
395
- children: "INCLUDE ONLY"
396
- }), filters.includePatterns.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Badge, {
397
- count: filters.includePatterns.length,
398
- color: _sharedUi.buoyColors.success
399
- })]
400
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
401
- style: styles.sectionDescription,
402
- children: "Show only components matching these patterns. If any are set, components must match at least one."
403
- }), filters.includePatterns.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
404
- style: styles.patternChips,
405
- children: filters.includePatterns.map((pattern, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)(PatternChip, {
406
- pattern: pattern,
407
- onRemove: () => handleRemoveIncludePattern(index)
408
- }, `${pattern.type}-${pattern.value}-${index}`))
409
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
410
- style: styles.addPatternRow,
411
- children: showIncludeTypePicker ? /*#__PURE__*/(0, _jsxRuntime.jsx)(TypePicker, {
412
- onSelect: type => {
413
- setShowIncludeTypePicker(false);
414
- setIncludeInputType(type);
415
- },
416
- onCancel: () => setShowIncludeTypePicker(false)
417
- }) : includeInputType ? /*#__PURE__*/(0, _jsxRuntime.jsx)(PatternInput, {
418
- type: includeInputType,
419
- onSubmit: value => handleAddIncludePattern(includeInputType, value),
420
- onCancel: () => setIncludeInputType(null)
421
- }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
422
- style: [styles.addButton, {
423
- borderColor: _sharedUi.buoyColors.success + "40"
424
- }],
425
- onPress: () => setShowIncludeTypePicker(true),
426
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Plus, {
427
- size: 14,
428
- color: _sharedUi.buoyColors.success
429
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
430
- style: [styles.addButtonText, {
431
- color: _sharedUi.buoyColors.success
432
- }],
433
- children: "Add include pattern"
434
- })]
435
- })
436
- })]
437
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
438
- style: styles.section,
439
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.SectionHeader, {
440
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Icon, {
441
- icon: _sharedUi.Filter,
442
- color: _sharedUi.buoyColors.primary,
443
- size: 12
444
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Title, {
445
- children: "EXCLUDE"
446
- }), filters.excludePatterns.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Badge, {
447
- count: filters.excludePatterns.length,
448
- color: _sharedUi.buoyColors.primary
449
- })]
450
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
451
- style: styles.sectionDescription,
452
- children: "Hide components matching these patterns from the list."
453
- }), filters.excludePatterns.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
454
- style: styles.patternChips,
455
- children: filters.excludePatterns.map((pattern, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)(PatternChip, {
456
- pattern: pattern,
457
- onRemove: () => handleRemoveExcludePattern(index)
458
- }, `${pattern.type}-${pattern.value}-${index}`))
459
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
460
- style: styles.addPatternRow,
461
- children: showExcludeTypePicker ? /*#__PURE__*/(0, _jsxRuntime.jsx)(TypePicker, {
462
- onSelect: type => {
463
- setShowExcludeTypePicker(false);
464
- setExcludeInputType(type);
465
- },
466
- onCancel: () => setShowExcludeTypePicker(false)
467
- }) : excludeInputType ? /*#__PURE__*/(0, _jsxRuntime.jsx)(PatternInput, {
468
- type: excludeInputType,
469
- onSubmit: value => handleAddExcludePattern(excludeInputType, value),
470
- onCancel: () => setExcludeInputType(null)
471
- }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
472
- style: [styles.addButton, {
473
- borderColor: _sharedUi.buoyColors.primary + "40"
474
- }],
475
- onPress: () => setShowExcludeTypePicker(true),
476
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Plus, {
477
- size: 14,
478
- color: _sharedUi.buoyColors.primary
479
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
480
- style: [styles.addButtonText, {
481
- color: _sharedUi.buoyColors.primary
482
- }],
483
- children: "Add exclude pattern"
484
- })]
485
- })
486
- })]
487
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
488
- style: styles.section,
489
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.SectionHeader, {
490
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Icon, {
491
- icon: _sharedUi.Hash,
492
- color: _sharedUi.buoyColors.warning,
493
- size: 12
494
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Title, {
495
- children: "RENDER COUNT RANGE"
496
- }), (filters.minRenderCount !== undefined || filters.maxRenderCount !== undefined) && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Badge, {
497
- count: 1,
498
- color: _sharedUi.buoyColors.warning
499
- })]
500
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
501
- style: styles.sectionDescription,
502
- children: "Show only components with render count in a specific range."
503
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
504
- nativeID: "__rn_buoy__render-count-range",
505
- style: styles.renderCountRangeContainer,
506
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
507
- style: styles.renderCountInputRow,
508
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
509
- style: styles.renderCountInputGroup,
510
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
511
- style: styles.renderCountLabel,
512
- children: "Min"
513
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
514
- value: filters.minRenderCount !== undefined ? String(filters.minRenderCount) : "",
515
- onChangeText: text => {
516
- const num = parseInt(text, 10);
517
- if (text === "" || text === undefined) {
518
- onFilterChange({
519
- minRenderCount: undefined
520
- });
521
- } else if (!isNaN(num) && num >= 0) {
522
- onFilterChange({
523
- minRenderCount: num
524
- });
525
- }
526
- },
527
- placeholder: "0",
528
- placeholderTextColor: _sharedUi.buoyColors.textMuted,
529
- style: styles.renderCountInput,
530
- keyboardType: "number-pad",
531
- returnKeyType: "done"
532
- })]
533
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
534
- style: styles.renderCountSeparator,
535
- children: "to"
536
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
537
- style: styles.renderCountInputGroup,
538
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
539
- style: styles.renderCountLabel,
540
- children: "Max"
541
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TextInput, {
542
- value: filters.maxRenderCount !== undefined ? String(filters.maxRenderCount) : "",
543
- onChangeText: text => {
544
- const num = parseInt(text, 10);
545
- if (text === "" || text === undefined) {
546
- onFilterChange({
547
- maxRenderCount: undefined
548
- });
549
- } else if (!isNaN(num) && num >= 0) {
550
- onFilterChange({
551
- maxRenderCount: num
552
- });
553
- }
554
- },
555
- placeholder: "\u221E",
556
- placeholderTextColor: _sharedUi.buoyColors.textMuted,
557
- style: styles.renderCountInput,
558
- keyboardType: "number-pad",
559
- returnKeyType: "done"
560
- })]
561
- })]
562
- }), (filters.minRenderCount !== undefined || filters.maxRenderCount !== undefined) && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
563
- style: styles.clearRangeButton,
564
- onPress: () => onFilterChange({
565
- minRenderCount: undefined,
566
- maxRenderCount: undefined
567
- }),
568
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.X, {
569
- size: 12,
570
- color: _sharedUi.buoyColors.warning
571
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
572
- style: styles.clearRangeButtonText,
573
- children: "Clear Range"
574
- })]
575
- })]
576
- })]
577
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
578
- style: styles.section,
579
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.SectionHeader, {
580
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Icon, {
581
- icon: _sharedUi.Box,
582
- color: _sharedUi.buoyColors.textSecondary,
583
- size: 12
584
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Title, {
585
- children: "DETECTED ITEMS"
586
- })]
587
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
588
- style: styles.sectionDescription,
589
- children: "Tap an item to quickly add it as an exclude pattern."
590
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.ScrollView, {
591
- horizontal: true,
592
- showsHorizontalScrollIndicator: false,
593
- style: styles.categoryBadgeScroll,
594
- contentContainerStyle: styles.categoryBadgeScrollContent,
595
- children: [totalItemCount > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(DetectedCategoryBadge, {
596
- filterType: "all",
597
- count: totalItemCount,
598
- isSelected: selectedCategory === "all",
599
- onPress: () => setSelectedCategory("all")
600
- }), availableProps.viewTypes.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(DetectedCategoryBadge, {
601
- filterType: "viewType",
602
- count: availableProps.viewTypes.length,
603
- isSelected: selectedCategory === "viewType",
604
- onPress: () => setSelectedCategory("viewType")
605
- }), availableProps.testIDs.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(DetectedCategoryBadge, {
606
- filterType: "testID",
607
- count: availableProps.testIDs.length,
608
- isSelected: selectedCategory === "testID",
609
- onPress: () => setSelectedCategory("testID")
610
- }), availableProps.nativeIDs.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(DetectedCategoryBadge, {
611
- filterType: "nativeID",
612
- count: availableProps.nativeIDs.length,
613
- isSelected: selectedCategory === "nativeID",
614
- onPress: () => setSelectedCategory("nativeID")
615
- }), availableProps.componentNames.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(DetectedCategoryBadge, {
616
- filterType: "component",
617
- count: availableProps.componentNames.length,
618
- isSelected: selectedCategory === "component",
619
- onPress: () => setSelectedCategory("component")
620
- }), availableProps.accessibilityLabels.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(DetectedCategoryBadge, {
621
- filterType: "accessibilityLabel",
622
- count: availableProps.accessibilityLabels.length,
623
- isSelected: selectedCategory === "accessibilityLabel",
624
- onPress: () => setSelectedCategory("accessibilityLabel")
625
- })]
626
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
627
- nativeID: "__rn_buoy__detected-items",
628
- style: styles.detectedItemsContainer,
629
- children: selectedItems.length > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
630
- style: styles.detectedItemsScroll,
631
- contentContainerStyle: styles.detectedItems,
632
- nestedScrollEnabled: true,
633
- showsVerticalScrollIndicator: true,
634
- children: selectedItems.map(item => {
635
- const itemConfig = getFilterConfig(item.type);
636
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
637
- style: [styles.detectedItem, {
638
- borderColor: itemConfig.color + "40"
639
- }],
640
- onPress: () => handleDetectedItemPress(item.type, item.value),
641
- children: selectedCategory === "all" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_IdentifierBadge.IdentifierBadge, {
642
- type: item.type,
643
- value: item.value,
644
- compact: true,
645
- shortLabel: true
646
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
647
- style: styles.detectedItemText,
648
- numberOfLines: 1,
649
- children: item.value
650
- })
651
- }, `${item.type}-${item.value}`);
652
- })
653
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
654
- style: styles.emptyText,
655
- children: "No items detected yet. Start tracking to see components here."
656
- })
657
- })]
658
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Modal, {
659
- visible: actionPopupItem !== null,
660
- transparent: true,
661
- animationType: "fade",
662
- onRequestClose: () => setActionPopupItem(null),
663
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
664
- style: styles.modalOverlay,
665
- onPress: () => setActionPopupItem(null),
666
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
667
- style: styles.actionPopup,
668
- children: actionPopupItem && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
669
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
670
- style: styles.actionPopupHeader,
671
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IdentifierBadge.IdentifierBadge, {
672
- type: actionPopupItem.type,
673
- value: actionPopupItem.value,
674
- compact: true,
675
- shortLabel: true
676
- })
677
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
678
- style: styles.actionPopupButtons,
679
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
680
- style: [styles.actionPopupButton, styles.actionPopupInclude],
681
- onPress: handlePopupInclude,
682
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Eye, {
683
- size: 16,
684
- color: _sharedUi.buoyColors.success
685
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
686
- style: [styles.actionPopupButtonText, {
687
- color: _sharedUi.buoyColors.success
688
- }],
689
- children: "Include Only"
690
- })]
691
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
692
- style: [styles.actionPopupButton, styles.actionPopupExclude],
693
- onPress: handlePopupExclude,
694
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Filter, {
695
- size: 16,
696
- color: _sharedUi.buoyColors.primary
697
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
698
- style: [styles.actionPopupButtonText, {
699
- color: _sharedUi.buoyColors.primary
700
- }],
701
- children: "Exclude"
702
- })]
703
- })]
704
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
705
- style: styles.actionPopupCancel,
706
- onPress: () => setActionPopupItem(null),
707
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
708
- style: styles.actionPopupCancelText,
709
- children: "Cancel"
710
- })
711
- })]
712
- })
713
- })
714
- })
715
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
716
- style: styles.section,
717
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.SectionHeader, {
718
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Icon, {
719
- icon: _sharedUi.Filter,
720
- color: _sharedUi.buoyColors.textMuted,
721
- size: 12
722
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Title, {
723
- children: "HOW FILTERS WORK"
724
- })]
725
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
726
- style: styles.howItWorks,
727
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
728
- style: styles.howItWorksText,
729
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
730
- style: styles.howItWorksBold,
731
- children: "Any:"
732
- }), " Matches against all fields", "\n", /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
733
- style: styles.howItWorksBold,
734
- children: "ViewType:"
735
- }), " Native component class (RCTView, RCTText)", "\n", /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
736
- style: styles.howItWorksBold,
737
- children: "testID:"
738
- }), " Component testID prop", "\n", /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
739
- style: styles.howItWorksBold,
740
- children: "Component:"
741
- }), " React component name from fiber"]
742
- })
743
- })]
744
- })]
745
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
746
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
747
- style: styles.section,
748
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_sharedUi.SectionHeader, {
749
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Icon, {
750
- icon: _sharedUi.Settings,
751
- color: _sharedUi.buoyColors.textMuted,
752
- size: 12
753
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.SectionHeader.Title, {
754
- children: "SETTINGS"
755
- })]
756
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
757
- style: styles.settingsSection,
758
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
759
- style: styles.settingItem,
760
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
761
- style: styles.settingHeader,
762
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
763
- style: styles.settingLabel,
764
- children: "Show Render Count"
765
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Switch, {
766
- value: settings.showRenderCount,
767
- onValueChange: value => {
768
- onSettingsChange({
769
- showRenderCount: value
770
- });
771
- // If disabling render count, also disable cause tracking
772
- if (!value && settings.trackRenderCauses) {
773
- onSettingsChange({
774
- trackRenderCauses: false
775
- });
776
- }
777
- },
778
- trackColor: {
779
- false: _sharedUi.buoyColors.input,
780
- true: _sharedUi.buoyColors.success + "80"
781
- },
782
- thumbColor: settings.showRenderCount ? _sharedUi.buoyColors.success : _sharedUi.buoyColors.textMuted
783
- })]
784
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
785
- style: styles.settingDescription,
786
- children: "Display render count badge on highlights. Disabling improves performance by skipping count tracking."
787
- })]
788
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
789
- style: [styles.settingItem, styles.settingItemSpaced],
790
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
791
- style: styles.settingHeader,
792
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
793
- style: [styles.settingLabel, !settings.showRenderCount && styles.settingLabelDisabled],
794
- children: "Track Render Causes"
795
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Switch, {
796
- value: settings.trackRenderCauses,
797
- onValueChange: value => onSettingsChange({
798
- trackRenderCauses: value
799
- }),
800
- trackColor: {
801
- false: _sharedUi.buoyColors.input,
802
- true: _sharedUi.buoyColors.warning + "80"
803
- },
804
- thumbColor: settings.trackRenderCauses ? _sharedUi.buoyColors.warning : _sharedUi.buoyColors.textMuted,
805
- disabled: !settings.showRenderCount
806
- })]
807
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
808
- style: styles.settingDescription,
809
- children: ["Detect WHY components render (props, hooks, parent re-render).", !settings.showRenderCount && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
810
- style: styles.settingWarning,
811
- children: ["\n", "Requires \"Show Render Count\" to be enabled."]
812
- })]
813
- })]
814
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
815
- style: [styles.settingItem, styles.settingItemSpaced],
816
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
817
- style: styles.settingHeader,
818
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
819
- style: [styles.settingLabel, !settings.trackRenderCauses && styles.settingLabelDisabled],
820
- children: "Enable Render History"
821
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Switch, {
822
- value: settings.enableRenderHistory,
823
- onValueChange: value => onSettingsChange({
824
- enableRenderHistory: value
825
- }),
826
- trackColor: {
827
- false: _sharedUi.buoyColors.input,
828
- true: _sharedUi.buoyColors.primary + "80"
829
- },
830
- thumbColor: settings.enableRenderHistory ? _sharedUi.buoyColors.primary : _sharedUi.buoyColors.textMuted,
831
- disabled: !settings.trackRenderCauses
832
- })]
833
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
834
- style: styles.settingDescription,
835
- children: ["Store render events for each component to view in the History tab.", !settings.trackRenderCauses && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
836
- style: styles.settingWarning,
837
- children: ["\n", "Requires \"Track Render Causes\" to be enabled."]
838
- })]
839
- })]
840
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
841
- style: [styles.settingItem, styles.settingItemSpaced],
842
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
843
- style: styles.settingHeader,
844
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
845
- style: styles.settingLabel,
846
- children: "Debug Log Level"
847
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
848
- style: styles.settingValue,
849
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
850
- style: [styles.settingValueText, settings.debugLogLevel !== "off" && {
851
- color: _sharedUi.buoyColors.warning
852
- }],
853
- children: DEBUG_LOG_LEVEL_PRESETS.find(p => p.value === settings.debugLogLevel)?.label || "Off"
854
- })
855
- })]
856
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
857
- style: styles.settingDescription,
858
- children: "Control console logging verbosity for render cause detection."
859
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
860
- style: styles.batchSizePresets,
861
- children: DEBUG_LOG_LEVEL_PRESETS.map(preset => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
862
- style: [styles.batchSizePreset, settings.debugLogLevel === preset.value && styles.batchSizePresetActive, preset.value !== "off" && settings.debugLogLevel === preset.value && {
863
- backgroundColor: _sharedUi.buoyColors.warning + "30",
864
- borderColor: _sharedUi.buoyColors.warning
865
- }],
866
- onPress: () => onSettingsChange({
867
- debugLogLevel: preset.value
868
- }),
869
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
870
- style: [styles.batchSizePresetText, settings.debugLogLevel === preset.value && styles.batchSizePresetTextActive, preset.value !== "off" && settings.debugLogLevel === preset.value && {
871
- color: _sharedUi.buoyColors.warning
872
- }],
873
- children: preset.label
874
- })
875
- }, preset.value))
876
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
877
- style: styles.settingDescriptionMuted,
878
- children: [DEBUG_LOG_LEVEL_PRESETS.find(p => p.value === settings.debugLogLevel)?.description, settings.debugLogLevel !== "off" && " • Check Metro console for logs"]
879
- })]
880
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
881
- style: [styles.settingItem, styles.settingItemSpaced],
882
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
883
- style: styles.settingHeader,
884
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
885
- style: styles.settingLabel,
886
- children: "Batch Size"
887
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
888
- style: styles.settingValue,
889
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
890
- style: styles.settingValueText,
891
- children: settings.batchSize
892
- })
893
- })]
894
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
895
- style: styles.settingDescription,
896
- children: "Maximum components to highlight per render update. Higher values capture more re-renders but may impact performance on complex screens."
897
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
898
- style: styles.batchSizePresets,
899
- children: BATCH_SIZE_PRESETS.map(preset => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
900
- style: [styles.batchSizePreset, settings.batchSize === preset.value && styles.batchSizePresetActive],
901
- onPress: () => onSettingsChange({
902
- batchSize: preset.value
903
- }),
904
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
905
- style: [styles.batchSizePresetText, settings.batchSize === preset.value && styles.batchSizePresetTextActive],
906
- children: preset.label
907
- })
908
- }, preset.value))
909
- })]
910
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
911
- style: [styles.settingItem, styles.settingItemSpaced],
912
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
913
- style: styles.settingHeader,
914
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
915
- style: styles.settingLabel,
916
- children: "Highlight Dev Tools"
917
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Switch, {
918
- value: !settings.excludeDevTools,
919
- onValueChange: value => onSettingsChange({
920
- excludeDevTools: !value
921
- }),
922
- trackColor: {
923
- false: _sharedUi.buoyColors.input,
924
- true: _sharedUi.buoyColors.primary + "80"
925
- },
926
- thumbColor: !settings.excludeDevTools ? _sharedUi.buoyColors.primary : _sharedUi.buoyColors.textMuted
927
- })]
928
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
929
- style: styles.settingDescription,
930
- children: ["Show re-render highlights on Buoy dev tools (floating menu, modals, etc.). Useful for optimizing the dev tools themselves.", !settings.excludeDevTools && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
931
- style: styles.settingWarning,
932
- children: ["\n", "The highlight overlay is always excluded to prevent infinite loops."]
933
- })]
934
- })]
935
- })]
936
- })]
937
- })
938
- })
939
- })
940
- });
941
- }
942
- const styles = _reactNative.StyleSheet.create({
943
- container: {
944
- flex: 1,
945
- backgroundColor: _sharedUi.buoyColors.base
946
- },
947
- scrollView: {
948
- flex: 1
949
- },
950
- scrollContent: {
951
- paddingHorizontal: 16,
952
- paddingTop: 12,
953
- paddingBottom: 32
954
- },
955
- section: {
956
- backgroundColor: _sharedUi.buoyColors.card,
957
- borderRadius: 8,
958
- borderWidth: 1,
959
- borderColor: _sharedUi.buoyColors.border + "50",
960
- marginBottom: 12,
961
- overflow: "hidden"
962
- },
963
- sectionDescription: {
964
- fontSize: 11,
965
- color: _sharedUi.buoyColors.textSecondary,
966
- paddingHorizontal: 16,
967
- paddingTop: 8,
968
- lineHeight: 16
969
- },
970
- patternChips: {
971
- flexDirection: "row",
972
- flexWrap: "wrap",
973
- gap: 8,
974
- paddingHorizontal: 16,
975
- paddingTop: 12
976
- },
977
- patternChip: {
978
- flexDirection: "row",
979
- alignItems: "center",
980
- backgroundColor: _sharedUi.buoyColors.input,
981
- borderRadius: 6,
982
- borderWidth: 1,
983
- paddingVertical: 4,
984
- paddingLeft: 4,
985
- paddingRight: 6,
986
- maxWidth: "100%",
987
- gap: 4
988
- },
989
- patternChipBadge: {
990
- paddingVertical: 2,
991
- paddingHorizontal: 5,
992
- borderRadius: 4
993
- },
994
- patternChipBadgeText: {
995
- fontSize: 9,
996
- fontWeight: "700"
997
- },
998
- patternChipValue: {
999
- fontSize: 11,
1000
- color: _sharedUi.buoyColors.text,
1001
- fontFamily: "monospace",
1002
- flexShrink: 1
1003
- },
1004
- patternChipX: {
1005
- marginLeft: 2
1006
- },
1007
- addPatternRow: {
1008
- paddingHorizontal: 16,
1009
- paddingTop: 12,
1010
- paddingBottom: 16
1011
- },
1012
- addButton: {
1013
- flexDirection: "row",
1014
- alignItems: "center",
1015
- justifyContent: "center",
1016
- paddingVertical: 10,
1017
- paddingHorizontal: 16,
1018
- borderRadius: 8,
1019
- borderWidth: 1,
1020
- borderStyle: "dashed",
1021
- gap: 6
1022
- },
1023
- addButtonText: {
1024
- fontSize: 12,
1025
- fontWeight: "500"
1026
- },
1027
- typePicker: {
1028
- flexDirection: "row",
1029
- alignItems: "center",
1030
- gap: 8
1031
- },
1032
- typePickerRow: {
1033
- flex: 1,
1034
- flexDirection: "row",
1035
- flexWrap: "wrap",
1036
- gap: 8
1037
- },
1038
- typeOption: {
1039
- flexDirection: "row",
1040
- alignItems: "center",
1041
- paddingVertical: 8,
1042
- paddingHorizontal: 12,
1043
- borderRadius: 6,
1044
- borderWidth: 1,
1045
- backgroundColor: _sharedUi.buoyColors.input,
1046
- gap: 6
1047
- },
1048
- typeOptionText: {
1049
- fontSize: 11,
1050
- fontWeight: "600"
1051
- },
1052
- typePickerCancel: {
1053
- padding: 8
1054
- },
1055
- patternInputContainer: {
1056
- flexDirection: "row",
1057
- alignItems: "center",
1058
- backgroundColor: _sharedUi.buoyColors.input,
1059
- borderRadius: 8,
1060
- borderWidth: 1,
1061
- borderColor: _sharedUi.buoyColors.border,
1062
- paddingLeft: 4,
1063
- paddingRight: 8,
1064
- paddingVertical: 4,
1065
- gap: 4
1066
- },
1067
- patternInput: {
1068
- flex: 1,
1069
- fontSize: 12,
1070
- color: _sharedUi.buoyColors.text,
1071
- paddingVertical: 6,
1072
- paddingHorizontal: 4
1073
- },
1074
- addPatternButton: {
1075
- paddingVertical: 6,
1076
- paddingHorizontal: 10,
1077
- borderRadius: 4
1078
- },
1079
- addPatternButtonText: {
1080
- fontSize: 11,
1081
- fontWeight: "600"
1082
- },
1083
- cancelButton: {
1084
- padding: 4
1085
- },
1086
- categoryBadgeScroll: {
1087
- marginTop: 12
1088
- },
1089
- categoryBadgeScrollContent: {
1090
- paddingHorizontal: 16,
1091
- gap: 8
1092
- },
1093
- categoryBadge: {
1094
- flexDirection: "row",
1095
- alignItems: "center",
1096
- paddingVertical: 8,
1097
- paddingLeft: 10,
1098
- paddingRight: 6,
1099
- borderRadius: 8,
1100
- borderWidth: 1,
1101
- gap: 6
1102
- },
1103
- categoryBadgeText: {
1104
- fontSize: 11,
1105
- fontWeight: "600"
1106
- },
1107
- categoryBadgeCountBubble: {
1108
- paddingHorizontal: 6,
1109
- paddingVertical: 2,
1110
- borderRadius: 10,
1111
- minWidth: 20,
1112
- alignItems: "center"
1113
- },
1114
- categoryBadgeCount: {
1115
- fontSize: 10,
1116
- fontWeight: "600"
1117
- },
1118
- detectedItemsContainer: {
1119
- paddingHorizontal: 16,
1120
- paddingTop: 12,
1121
- paddingBottom: 16
1122
- },
1123
- detectedItemsScroll: {
1124
- maxHeight: 200
1125
- },
1126
- detectedItems: {
1127
- flexDirection: "row",
1128
- flexWrap: "wrap",
1129
- gap: 8
1130
- },
1131
- detectedItem: {
1132
- flexDirection: "row",
1133
- alignItems: "center",
1134
- backgroundColor: _sharedUi.buoyColors.input,
1135
- borderRadius: 6,
1136
- borderWidth: 1,
1137
- paddingVertical: 6,
1138
- paddingHorizontal: 10,
1139
- gap: 6
1140
- },
1141
- detectedItemText: {
1142
- fontSize: 11,
1143
- color: _sharedUi.buoyColors.text,
1144
- fontFamily: "monospace"
1145
- },
1146
- emptyText: {
1147
- fontSize: 11,
1148
- color: _sharedUi.buoyColors.textMuted,
1149
- fontStyle: "italic",
1150
- textAlign: "center",
1151
- paddingVertical: 16,
1152
- paddingHorizontal: 16
1153
- },
1154
- howItWorks: {
1155
- paddingHorizontal: 16,
1156
- paddingVertical: 12
1157
- },
1158
- howItWorksText: {
1159
- fontSize: 11,
1160
- color: _sharedUi.buoyColors.textMuted,
1161
- lineHeight: 18,
1162
- fontFamily: "monospace"
1163
- },
1164
- howItWorksBold: {
1165
- fontWeight: "700",
1166
- color: _sharedUi.buoyColors.textSecondary
1167
- },
1168
- // Action popup modal styles
1169
- modalOverlay: {
1170
- flex: 1,
1171
- backgroundColor: "rgba(0, 0, 0, 0.5)",
1172
- justifyContent: "center",
1173
- alignItems: "center",
1174
- padding: 32
1175
- },
1176
- actionPopup: {
1177
- backgroundColor: _sharedUi.buoyColors.card,
1178
- borderRadius: 12,
1179
- borderWidth: 1,
1180
- borderColor: _sharedUi.buoyColors.border,
1181
- width: "100%",
1182
- maxWidth: 300,
1183
- overflow: "hidden"
1184
- },
1185
- actionPopupHeader: {
1186
- padding: 16,
1187
- borderBottomWidth: 1,
1188
- borderBottomColor: _sharedUi.buoyColors.border + "50",
1189
- alignItems: "center"
1190
- },
1191
- actionPopupButtons: {
1192
- flexDirection: "row",
1193
- padding: 12,
1194
- gap: 8
1195
- },
1196
- actionPopupButton: {
1197
- flex: 1,
1198
- flexDirection: "row",
1199
- alignItems: "center",
1200
- justifyContent: "center",
1201
- paddingVertical: 12,
1202
- paddingHorizontal: 12,
1203
- borderRadius: 8,
1204
- gap: 8
1205
- },
1206
- actionPopupInclude: {
1207
- backgroundColor: _sharedUi.buoyColors.success + "15"
1208
- },
1209
- actionPopupExclude: {
1210
- backgroundColor: _sharedUi.buoyColors.primary + "15"
1211
- },
1212
- actionPopupButtonText: {
1213
- fontSize: 13,
1214
- fontWeight: "600"
1215
- },
1216
- actionPopupCancel: {
1217
- padding: 12,
1218
- borderTopWidth: 1,
1219
- borderTopColor: _sharedUi.buoyColors.border + "50",
1220
- alignItems: "center"
1221
- },
1222
- actionPopupCancelText: {
1223
- fontSize: 13,
1224
- color: _sharedUi.buoyColors.textMuted,
1225
- fontWeight: "500"
1226
- },
1227
- // Settings styles
1228
- settingsSection: {
1229
- paddingHorizontal: 16,
1230
- paddingTop: 8,
1231
- paddingBottom: 16
1232
- },
1233
- settingItem: {
1234
- gap: 8
1235
- },
1236
- settingItemSpaced: {
1237
- marginTop: 16,
1238
- paddingTop: 16,
1239
- borderTopWidth: 1,
1240
- borderTopColor: _sharedUi.buoyColors.border + "30"
1241
- },
1242
- settingHeader: {
1243
- flexDirection: "row",
1244
- alignItems: "center",
1245
- justifyContent: "space-between"
1246
- },
1247
- settingLabel: {
1248
- fontSize: 13,
1249
- fontWeight: "600",
1250
- color: _sharedUi.buoyColors.text
1251
- },
1252
- settingValue: {
1253
- backgroundColor: _sharedUi.buoyColors.textMuted + "20",
1254
- paddingHorizontal: 10,
1255
- paddingVertical: 4,
1256
- borderRadius: 6
1257
- },
1258
- settingValueText: {
1259
- fontSize: 12,
1260
- fontWeight: "700",
1261
- color: _sharedUi.buoyColors.textMuted,
1262
- fontFamily: "monospace"
1263
- },
1264
- settingDescription: {
1265
- fontSize: 11,
1266
- color: _sharedUi.buoyColors.textSecondary,
1267
- lineHeight: 16
1268
- },
1269
- settingDescriptionMuted: {
1270
- fontSize: 10,
1271
- color: _sharedUi.buoyColors.textMuted,
1272
- lineHeight: 14,
1273
- marginTop: 4,
1274
- fontStyle: "italic"
1275
- },
1276
- settingLabelDisabled: {
1277
- color: _sharedUi.buoyColors.textMuted
1278
- },
1279
- settingWarning: {
1280
- color: _sharedUi.buoyColors.warning,
1281
- fontWeight: "500"
1282
- },
1283
- batchSizePresets: {
1284
- flexDirection: "row",
1285
- flexWrap: "wrap",
1286
- gap: 8,
1287
- marginTop: 4
1288
- },
1289
- batchSizePreset: {
1290
- paddingVertical: 8,
1291
- paddingHorizontal: 14,
1292
- borderRadius: 6,
1293
- backgroundColor: _sharedUi.buoyColors.input,
1294
- borderWidth: 1,
1295
- borderColor: _sharedUi.buoyColors.border + "50"
1296
- },
1297
- batchSizePresetActive: {
1298
- backgroundColor: _sharedUi.buoyColors.textMuted + "20",
1299
- borderColor: _sharedUi.buoyColors.textMuted
1300
- },
1301
- batchSizePresetText: {
1302
- fontSize: 12,
1303
- fontWeight: "500",
1304
- color: _sharedUi.buoyColors.textSecondary,
1305
- fontFamily: "monospace"
1306
- },
1307
- batchSizePresetTextActive: {
1308
- color: _sharedUi.buoyColors.textMuted,
1309
- fontWeight: "700"
1310
- },
1311
- // Render count range styles
1312
- renderCountRangeContainer: {
1313
- paddingHorizontal: 16,
1314
- paddingTop: 12,
1315
- paddingBottom: 16,
1316
- gap: 12
1317
- },
1318
- renderCountInputRow: {
1319
- flexDirection: "row",
1320
- alignItems: "center",
1321
- gap: 12
1322
- },
1323
- renderCountInputGroup: {
1324
- flex: 1,
1325
- gap: 4
1326
- },
1327
- renderCountLabel: {
1328
- fontSize: 10,
1329
- fontWeight: "600",
1330
- color: _sharedUi.buoyColors.textMuted,
1331
- textTransform: "uppercase",
1332
- letterSpacing: 0.5
1333
- },
1334
- renderCountInput: {
1335
- backgroundColor: _sharedUi.buoyColors.input,
1336
- borderRadius: 8,
1337
- borderWidth: 1,
1338
- borderColor: _sharedUi.buoyColors.border,
1339
- paddingVertical: 10,
1340
- paddingHorizontal: 12,
1341
- fontSize: 14,
1342
- fontWeight: "600",
1343
- color: _sharedUi.buoyColors.text,
1344
- fontFamily: "monospace",
1345
- textAlign: "center"
1346
- },
1347
- renderCountSeparator: {
1348
- fontSize: 12,
1349
- color: _sharedUi.buoyColors.textMuted,
1350
- marginTop: 18
1351
- },
1352
- clearRangeButton: {
1353
- flexDirection: "row",
1354
- alignItems: "center",
1355
- justifyContent: "center",
1356
- paddingVertical: 8,
1357
- paddingHorizontal: 12,
1358
- borderRadius: 6,
1359
- backgroundColor: _sharedUi.buoyColors.warning + "15",
1360
- borderWidth: 1,
1361
- borderColor: _sharedUi.buoyColors.warning + "40",
1362
- gap: 6,
1363
- alignSelf: "center"
1364
- },
1365
- clearRangeButtonText: {
1366
- fontSize: 11,
1367
- fontWeight: "600",
1368
- color: _sharedUi.buoyColors.warning
1369
- }
1370
- });
1371
- var _default = exports.default = HighlightFilterView;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.HighlightFilterView=HighlightFilterView,exports.default=void 0;var _react=_interopRequireWildcard(require("react")),_reactNative=require("react-native"),_sharedUi=require("@buoy-gg/shared-ui"),_IdentifierBadge=require("./IdentifierBadge"),_jsxRuntime=require("react/jsx-runtime");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var s=new WeakMap,i=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var r,o,n={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return n;if(r=t?i:s){if(r.has(e))return r.get(e);r.set(e,n)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((o=(r=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(o.get||o.set)?r(n,t,o):n[t]=e[t]);return n})(e,t)}const getFilterConfig=e=>_IdentifierBadge.IDENTIFIER_CONFIG[e],FILTER_TYPES=["any","viewType","testID","nativeID","component","accessibilityLabel"];function TypePicker({onSelect:e,onCancel:t}){return(0,_jsxRuntime.jsxs)(_reactNative.View,{nativeID:"__rn_buoy__type-picker",style:styles.typePicker,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.typePickerRow,children:FILTER_TYPES.map(t=>{const s=getFilterConfig(t),i=s.icon;return(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{style:[styles.typeOption,{backgroundColor:s.color+"15",borderColor:s.color+"40"}],onPress:()=>e(t),children:[(0,_jsxRuntime.jsx)(i,{size:14,color:s.color}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.typeOptionText,{color:s.color}],children:s.label})]},t)})}),(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:t,style:styles.typePickerCancel,children:(0,_jsxRuntime.jsx)(_sharedUi.X,{size:16,color:_sharedUi.buoyColors.textMuted})})]})}function PatternInput({type:e,onSubmit:t,onCancel:s}){const[i,r]=(0,_react.useState)(""),o=getFilterConfig(e),n=()=>{i.trim()&&t(i.trim())};return(0,_jsxRuntime.jsxs)(_reactNative.View,{nativeID:"__rn_buoy__pattern-input",style:styles.patternInputContainer,children:[(0,_jsxRuntime.jsx)(_IdentifierBadge.IdentifierBadge,{type:e,value:"",badgeOnly:!0,compact:!0}),(0,_jsxRuntime.jsx)(_reactNative.TextInput,{value:i,onChangeText:r,onSubmitEditing:n,placeholder:"Enter pattern...",placeholderTextColor:_sharedUi.buoyColors.textMuted,style:styles.patternInput,autoFocus:!0,returnKeyType:"done",autoCorrect:!1,autoCapitalize:"none"}),i.trim()&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:n,style:[styles.addPatternButton,{backgroundColor:o.color+"20"}],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.addPatternButtonText,{color:o.color}],children:"Add"})}),(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:s,style:styles.cancelButton,children:(0,_jsxRuntime.jsx)(_sharedUi.X,{size:16,color:_sharedUi.buoyColors.textMuted})})]})}function PatternChip({pattern:e,onRemove:t}){const s=getFilterConfig(e.type);return(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{style:[styles.patternChip,{borderColor:s.color+"40"}],onPress:t,activeOpacity:.7,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.patternChipBadge,{backgroundColor:s.color+"20"}],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.patternChipBadgeText,{color:s.color}],children:s.shortLabel})}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.patternChipValue,numberOfLines:1,children:e.value}),(0,_jsxRuntime.jsx)(_sharedUi.X,{size:12,color:_sharedUi.buoyColors.textMuted,style:styles.patternChipX})]})}const ALL_CATEGORY_CONFIG={label:"All",shortLabel:"All",color:_sharedUi.buoyColors.textSecondary,icon:_sharedUi.Box};function DetectedCategoryBadge({filterType:e,count:t,isSelected:s,onPress:i}){const r="all"===e?ALL_CATEGORY_CONFIG:getFilterConfig(e);return(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{style:[styles.categoryBadge,{backgroundColor:r.color+"15",borderColor:s?r.color:r.color+"40",borderWidth:s?2:1}],onPress:i,children:[(0,_jsxRuntime.jsx)(r.icon,{size:12,color:r.color}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.categoryBadgeText,{color:r.color}],children:r.label}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.categoryBadgeCountBubble,{backgroundColor:r.color+"25"}],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.categoryBadgeCount,{color:r.color}],children:t})})]})}const BATCH_SIZE_PRESETS=[{value:20,label:"20"},{value:50,label:"50"},{value:100,label:"100"},{value:150,label:"150"},{value:250,label:"250"},{value:500,label:"500"}],DEBUG_LOG_LEVEL_PRESETS=[{value:"off",label:"Off",description:"No debug logging"},{value:"minimal",label:"Minimal",description:"Only hook value changes"},{value:"verbose",label:"Verbose",description:"Component + cause + changes"},{value:"all",label:"All",description:"Full fiber dump"}];function HighlightFilterView({filters:e,onFilterChange:t,settings:s,onSettingsChange:i,availableProps:r,activeTab:o}){const[n,a]=(0,_react.useState)(!1),[l,c]=(0,_react.useState)(!1),[d,u]=(0,_react.useState)(null),[y,x]=(0,_react.useState)(null),[_,h]=(0,_react.useState)("all"),[p,g]=(0,_react.useState)(null),m=(e=>{switch(e){case"viewType":return r.viewTypes.map(e=>({value:e,type:"viewType"}));case"testID":return r.testIDs.map(e=>({value:e,type:"testID"}));case"nativeID":return r.nativeIDs.map(e=>({value:e,type:"nativeID"}));case"component":return r.componentNames.map(e=>({value:e,type:"component"}));case"accessibilityLabel":return r.accessibilityLabels.map(e=>({value:e,type:"accessibilityLabel"}));default:return[...r.viewTypes.map(e=>({value:e,type:"viewType"})),...r.testIDs.map(e=>({value:e,type:"testID"})),...r.nativeIDs.map(e=>({value:e,type:"nativeID"})),...r.componentNames.map(e=>({value:e,type:"component"})),...r.accessibilityLabels.map(e=>({value:e,type:"accessibilityLabel"}))]}})(_),j=r.viewTypes.length+r.testIDs.length+r.nativeIDs.length+r.componentNames.length+r.accessibilityLabels.length,b=(0,_react.useCallback)((s,i)=>{const r=[...e.includePatterns,{type:s,value:i}];t({includePatterns:r}),u(null)},[e.includePatterns,t]),C=(0,_react.useCallback)((s,i)=>{const r=[...e.excludePatterns,{type:s,value:i}];t({excludePatterns:r}),x(null)},[e.excludePatterns,t]),v=(0,_react.useCallback)(s=>{const i=e.includePatterns.filter((e,t)=>t!==s);t({includePatterns:i})},[e.includePatterns,t]),R=(0,_react.useCallback)(s=>{const i=e.excludePatterns.filter((e,t)=>t!==s);t({excludePatterns:i})},[e.excludePatterns,t]),T=(0,_react.useCallback)((e,t)=>{g({type:e,value:t})},[]),f=(0,_react.useCallback)(()=>{p&&(b(p.type,p.value),g(null))},[p,b]),S=(0,_react.useCallback)(()=>{p&&(C(p.type,p.value),g(null))},[p,C]);return(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.container,children:(0,_jsxRuntime.jsx)(_reactNative.ScrollView,{nativeID:"__rn_buoy__filter-view",style:styles.scrollView,contentContainerStyle:styles.scrollContent,showsVerticalScrollIndicator:!1,children:"filters"===o?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.section,children:[(0,_jsxRuntime.jsxs)(_sharedUi.SectionHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Icon,{icon:_sharedUi.Eye,color:_sharedUi.buoyColors.success,size:12}),(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Title,{children:"INCLUDE ONLY"}),e.includePatterns.length>0&&(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Badge,{count:e.includePatterns.length,color:_sharedUi.buoyColors.success})]}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.sectionDescription,children:"Show only components matching these patterns. If any are set, components must match at least one."}),e.includePatterns.length>0&&(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.patternChips,children:e.includePatterns.map((e,t)=>(0,_jsxRuntime.jsx)(PatternChip,{pattern:e,onRemove:()=>v(t)},`${e.type}-${e.value}-${t}`))}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.addPatternRow,children:n?(0,_jsxRuntime.jsx)(TypePicker,{onSelect:e=>{a(!1),u(e)},onCancel:()=>a(!1)}):d?(0,_jsxRuntime.jsx)(PatternInput,{type:d,onSubmit:e=>b(d,e),onCancel:()=>u(null)}):(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{style:[styles.addButton,{borderColor:_sharedUi.buoyColors.success+"40"}],onPress:()=>a(!0),children:[(0,_jsxRuntime.jsx)(_sharedUi.Plus,{size:14,color:_sharedUi.buoyColors.success}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.addButtonText,{color:_sharedUi.buoyColors.success}],children:"Add include pattern"})]})})]}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.section,children:[(0,_jsxRuntime.jsxs)(_sharedUi.SectionHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Icon,{icon:_sharedUi.Filter,color:_sharedUi.buoyColors.primary,size:12}),(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Title,{children:"EXCLUDE"}),e.excludePatterns.length>0&&(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Badge,{count:e.excludePatterns.length,color:_sharedUi.buoyColors.primary})]}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.sectionDescription,children:"Hide components matching these patterns from the list."}),e.excludePatterns.length>0&&(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.patternChips,children:e.excludePatterns.map((e,t)=>(0,_jsxRuntime.jsx)(PatternChip,{pattern:e,onRemove:()=>R(t)},`${e.type}-${e.value}-${t}`))}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.addPatternRow,children:l?(0,_jsxRuntime.jsx)(TypePicker,{onSelect:e=>{c(!1),x(e)},onCancel:()=>c(!1)}):y?(0,_jsxRuntime.jsx)(PatternInput,{type:y,onSubmit:e=>C(y,e),onCancel:()=>x(null)}):(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{style:[styles.addButton,{borderColor:_sharedUi.buoyColors.primary+"40"}],onPress:()=>c(!0),children:[(0,_jsxRuntime.jsx)(_sharedUi.Plus,{size:14,color:_sharedUi.buoyColors.primary}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.addButtonText,{color:_sharedUi.buoyColors.primary}],children:"Add exclude pattern"})]})})]}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.section,children:[(0,_jsxRuntime.jsxs)(_sharedUi.SectionHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Icon,{icon:_sharedUi.Hash,color:_sharedUi.buoyColors.warning,size:12}),(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Title,{children:"RENDER COUNT RANGE"}),(void 0!==e.minRenderCount||void 0!==e.maxRenderCount)&&(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Badge,{count:1,color:_sharedUi.buoyColors.warning})]}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.sectionDescription,children:"Show only components with render count in a specific range."}),(0,_jsxRuntime.jsxs)(_reactNative.View,{nativeID:"__rn_buoy__render-count-range",style:styles.renderCountRangeContainer,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.renderCountInputRow,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.renderCountInputGroup,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.renderCountLabel,children:"Min"}),(0,_jsxRuntime.jsx)(_reactNative.TextInput,{value:void 0!==e.minRenderCount?String(e.minRenderCount):"",onChangeText:e=>{const s=parseInt(e,10);""===e||void 0===e?t({minRenderCount:void 0}):!isNaN(s)&&s>=0&&t({minRenderCount:s})},placeholder:"0",placeholderTextColor:_sharedUi.buoyColors.textMuted,style:styles.renderCountInput,keyboardType:"number-pad",returnKeyType:"done"})]}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.renderCountSeparator,children:"to"}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.renderCountInputGroup,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.renderCountLabel,children:"Max"}),(0,_jsxRuntime.jsx)(_reactNative.TextInput,{value:void 0!==e.maxRenderCount?String(e.maxRenderCount):"",onChangeText:e=>{const s=parseInt(e,10);""===e||void 0===e?t({maxRenderCount:void 0}):!isNaN(s)&&s>=0&&t({maxRenderCount:s})},placeholder:"∞",placeholderTextColor:_sharedUi.buoyColors.textMuted,style:styles.renderCountInput,keyboardType:"number-pad",returnKeyType:"done"})]})]}),(void 0!==e.minRenderCount||void 0!==e.maxRenderCount)&&(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{style:styles.clearRangeButton,onPress:()=>t({minRenderCount:void 0,maxRenderCount:void 0}),children:[(0,_jsxRuntime.jsx)(_sharedUi.X,{size:12,color:_sharedUi.buoyColors.warning}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.clearRangeButtonText,children:"Clear Range"})]})]})]}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.section,children:[(0,_jsxRuntime.jsxs)(_sharedUi.SectionHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Icon,{icon:_sharedUi.Box,color:_sharedUi.buoyColors.textSecondary,size:12}),(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Title,{children:"DETECTED ITEMS"})]}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.sectionDescription,children:"Tap an item to quickly add it as an exclude pattern."}),(0,_jsxRuntime.jsxs)(_reactNative.ScrollView,{horizontal:!0,showsHorizontalScrollIndicator:!1,style:styles.categoryBadgeScroll,contentContainerStyle:styles.categoryBadgeScrollContent,children:[j>0&&(0,_jsxRuntime.jsx)(DetectedCategoryBadge,{filterType:"all",count:j,isSelected:"all"===_,onPress:()=>h("all")}),r.viewTypes.length>0&&(0,_jsxRuntime.jsx)(DetectedCategoryBadge,{filterType:"viewType",count:r.viewTypes.length,isSelected:"viewType"===_,onPress:()=>h("viewType")}),r.testIDs.length>0&&(0,_jsxRuntime.jsx)(DetectedCategoryBadge,{filterType:"testID",count:r.testIDs.length,isSelected:"testID"===_,onPress:()=>h("testID")}),r.nativeIDs.length>0&&(0,_jsxRuntime.jsx)(DetectedCategoryBadge,{filterType:"nativeID",count:r.nativeIDs.length,isSelected:"nativeID"===_,onPress:()=>h("nativeID")}),r.componentNames.length>0&&(0,_jsxRuntime.jsx)(DetectedCategoryBadge,{filterType:"component",count:r.componentNames.length,isSelected:"component"===_,onPress:()=>h("component")}),r.accessibilityLabels.length>0&&(0,_jsxRuntime.jsx)(DetectedCategoryBadge,{filterType:"accessibilityLabel",count:r.accessibilityLabels.length,isSelected:"accessibilityLabel"===_,onPress:()=>h("accessibilityLabel")})]}),(0,_jsxRuntime.jsx)(_reactNative.View,{nativeID:"__rn_buoy__detected-items",style:styles.detectedItemsContainer,children:m.length>0?(0,_jsxRuntime.jsx)(_reactNative.ScrollView,{style:styles.detectedItemsScroll,contentContainerStyle:styles.detectedItems,nestedScrollEnabled:!0,showsVerticalScrollIndicator:!0,children:m.map(e=>{const t=getFilterConfig(e.type);return(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{style:[styles.detectedItem,{borderColor:t.color+"40"}],onPress:()=>T(e.type,e.value),children:"all"===_?(0,_jsxRuntime.jsx)(_IdentifierBadge.IdentifierBadge,{type:e.type,value:e.value,compact:!0,shortLabel:!0}):(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.detectedItemText,numberOfLines:1,children:e.value})},`${e.type}-${e.value}`)})}):(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptyText,children:"No items detected yet. Start tracking to see components here."})})]}),(0,_jsxRuntime.jsx)(_reactNative.Modal,{visible:null!==p,transparent:!0,animationType:"fade",onRequestClose:()=>g(null),children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:styles.modalOverlay,onPress:()=>g(null),children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.actionPopup,children:p&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.actionPopupHeader,children:(0,_jsxRuntime.jsx)(_IdentifierBadge.IdentifierBadge,{type:p.type,value:p.value,compact:!0,shortLabel:!0})}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.actionPopupButtons,children:[(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{style:[styles.actionPopupButton,styles.actionPopupInclude],onPress:f,children:[(0,_jsxRuntime.jsx)(_sharedUi.Eye,{size:16,color:_sharedUi.buoyColors.success}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.actionPopupButtonText,{color:_sharedUi.buoyColors.success}],children:"Include Only"})]}),(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{style:[styles.actionPopupButton,styles.actionPopupExclude],onPress:S,children:[(0,_jsxRuntime.jsx)(_sharedUi.Filter,{size:16,color:_sharedUi.buoyColors.primary}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.actionPopupButtonText,{color:_sharedUi.buoyColors.primary}],children:"Exclude"})]})]}),(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{style:styles.actionPopupCancel,onPress:()=>g(null),children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.actionPopupCancelText,children:"Cancel"})})]})})})}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.section,children:[(0,_jsxRuntime.jsxs)(_sharedUi.SectionHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Icon,{icon:_sharedUi.Filter,color:_sharedUi.buoyColors.textMuted,size:12}),(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Title,{children:"HOW FILTERS WORK"})]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.howItWorks,children:(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.howItWorksText,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.howItWorksBold,children:"Any:"})," Matches against all fields","\n",(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.howItWorksBold,children:"ViewType:"})," Native component class (RCTView, RCTText)","\n",(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.howItWorksBold,children:"testID:"})," Component testID prop","\n",(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.howItWorksBold,children:"Component:"})," React component name from fiber"]})})]})]}):(0,_jsxRuntime.jsx)(_jsxRuntime.Fragment,{children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.section,children:[(0,_jsxRuntime.jsxs)(_sharedUi.SectionHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Icon,{icon:_sharedUi.Settings,color:_sharedUi.buoyColors.textMuted,size:12}),(0,_jsxRuntime.jsx)(_sharedUi.SectionHeader.Title,{children:"SETTINGS"})]}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingsSection,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingItem,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingHeader,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.settingLabel,children:"Show Render Count"}),(0,_jsxRuntime.jsx)(_reactNative.Switch,{value:s.showRenderCount,onValueChange:e=>{i({showRenderCount:e}),!e&&s.trackRenderCauses&&i({trackRenderCauses:!1})},trackColor:{false:_sharedUi.buoyColors.input,true:_sharedUi.buoyColors.success+"80"},thumbColor:s.showRenderCount?_sharedUi.buoyColors.success:_sharedUi.buoyColors.textMuted})]}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.settingDescription,children:"Display render count badge on highlights. Disabling improves performance by skipping count tracking."})]}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[styles.settingItem,styles.settingItemSpaced],children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingHeader,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.settingLabel,!s.showRenderCount&&styles.settingLabelDisabled],children:"Track Render Causes"}),(0,_jsxRuntime.jsx)(_reactNative.Switch,{value:s.trackRenderCauses,onValueChange:e=>i({trackRenderCauses:e}),trackColor:{false:_sharedUi.buoyColors.input,true:_sharedUi.buoyColors.warning+"80"},thumbColor:s.trackRenderCauses?_sharedUi.buoyColors.warning:_sharedUi.buoyColors.textMuted,disabled:!s.showRenderCount})]}),(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.settingDescription,children:["Detect WHY components render (props, hooks, parent re-render).",!s.showRenderCount&&(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.settingWarning,children:["\n",'Requires "Show Render Count" to be enabled.']})]})]}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[styles.settingItem,styles.settingItemSpaced],children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingHeader,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.settingLabel,!s.trackRenderCauses&&styles.settingLabelDisabled],children:"Enable Render History"}),(0,_jsxRuntime.jsx)(_reactNative.Switch,{value:s.enableRenderHistory,onValueChange:e=>i({enableRenderHistory:e}),trackColor:{false:_sharedUi.buoyColors.input,true:_sharedUi.buoyColors.primary+"80"},thumbColor:s.enableRenderHistory?_sharedUi.buoyColors.primary:_sharedUi.buoyColors.textMuted,disabled:!s.trackRenderCauses})]}),(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.settingDescription,children:["Store render events for each component to view in the History tab.",!s.trackRenderCauses&&(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.settingWarning,children:["\n",'Requires "Track Render Causes" to be enabled.']})]})]}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[styles.settingItem,styles.settingItemSpaced],children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingHeader,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.settingLabel,children:"Debug Log Level"}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.settingValue,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.settingValueText,"off"!==s.debugLogLevel&&{color:_sharedUi.buoyColors.warning}],children:DEBUG_LOG_LEVEL_PRESETS.find(e=>e.value===s.debugLogLevel)?.label||"Off"})})]}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.settingDescription,children:"Control console logging verbosity for render cause detection."}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.batchSizePresets,children:DEBUG_LOG_LEVEL_PRESETS.map(e=>(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{style:[styles.batchSizePreset,s.debugLogLevel===e.value&&styles.batchSizePresetActive,"off"!==e.value&&s.debugLogLevel===e.value&&{backgroundColor:_sharedUi.buoyColors.warning+"30",borderColor:_sharedUi.buoyColors.warning}],onPress:()=>i({debugLogLevel:e.value}),children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.batchSizePresetText,s.debugLogLevel===e.value&&styles.batchSizePresetTextActive,"off"!==e.value&&s.debugLogLevel===e.value&&{color:_sharedUi.buoyColors.warning}],children:e.label})},e.value))}),(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.settingDescriptionMuted,children:[DEBUG_LOG_LEVEL_PRESETS.find(e=>e.value===s.debugLogLevel)?.description,"off"!==s.debugLogLevel&&" • Check Metro console for logs"]})]}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[styles.settingItem,styles.settingItemSpaced],children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingHeader,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.settingLabel,children:"Batch Size"}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.settingValue,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.settingValueText,children:s.batchSize})})]}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.settingDescription,children:"Maximum components to highlight per render update. Higher values capture more re-renders but may impact performance on complex screens."}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.batchSizePresets,children:BATCH_SIZE_PRESETS.map(e=>(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{style:[styles.batchSizePreset,s.batchSize===e.value&&styles.batchSizePresetActive],onPress:()=>i({batchSize:e.value}),children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.batchSizePresetText,s.batchSize===e.value&&styles.batchSizePresetTextActive],children:e.label})},e.value))})]}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[styles.settingItem,styles.settingItemSpaced],children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.settingHeader,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.settingLabel,children:"Highlight Dev Tools"}),(0,_jsxRuntime.jsx)(_reactNative.Switch,{value:!s.excludeDevTools,onValueChange:e=>i({excludeDevTools:!e}),trackColor:{false:_sharedUi.buoyColors.input,true:_sharedUi.buoyColors.primary+"80"},thumbColor:s.excludeDevTools?_sharedUi.buoyColors.textMuted:_sharedUi.buoyColors.primary})]}),(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.settingDescription,children:["Show re-render highlights on Buoy dev tools (floating menu, modals, etc.). Useful for optimizing the dev tools themselves.",!s.excludeDevTools&&(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.settingWarning,children:["\n","The highlight overlay is always excluded to prevent infinite loops."]})]})]})]})]})})})})}const styles=_reactNative.StyleSheet.create({container:{flex:1,backgroundColor:_sharedUi.buoyColors.base},scrollView:{flex:1},scrollContent:{paddingHorizontal:16,paddingTop:12,paddingBottom:32},section:{backgroundColor:_sharedUi.buoyColors.card,borderRadius:8,borderWidth:1,borderColor:_sharedUi.buoyColors.border+"50",marginBottom:12,overflow:"hidden"},sectionDescription:{fontSize:11,color:_sharedUi.buoyColors.textSecondary,paddingHorizontal:16,paddingTop:8,lineHeight:16},patternChips:{flexDirection:"row",flexWrap:"wrap",gap:8,paddingHorizontal:16,paddingTop:12},patternChip:{flexDirection:"row",alignItems:"center",backgroundColor:_sharedUi.buoyColors.input,borderRadius:6,borderWidth:1,paddingVertical:4,paddingLeft:4,paddingRight:6,maxWidth:"100%",gap:4},patternChipBadge:{paddingVertical:2,paddingHorizontal:5,borderRadius:4},patternChipBadgeText:{fontSize:9,fontWeight:"700"},patternChipValue:{fontSize:11,color:_sharedUi.buoyColors.text,fontFamily:"monospace",flexShrink:1},patternChipX:{marginLeft:2},addPatternRow:{paddingHorizontal:16,paddingTop:12,paddingBottom:16},addButton:{flexDirection:"row",alignItems:"center",justifyContent:"center",paddingVertical:10,paddingHorizontal:16,borderRadius:8,borderWidth:1,borderStyle:"dashed",gap:6},addButtonText:{fontSize:12,fontWeight:"500"},typePicker:{flexDirection:"row",alignItems:"center",gap:8},typePickerRow:{flex:1,flexDirection:"row",flexWrap:"wrap",gap:8},typeOption:{flexDirection:"row",alignItems:"center",paddingVertical:8,paddingHorizontal:12,borderRadius:6,borderWidth:1,backgroundColor:_sharedUi.buoyColors.input,gap:6},typeOptionText:{fontSize:11,fontWeight:"600"},typePickerCancel:{padding:8},patternInputContainer:{flexDirection:"row",alignItems:"center",backgroundColor:_sharedUi.buoyColors.input,borderRadius:8,borderWidth:1,borderColor:_sharedUi.buoyColors.border,paddingLeft:4,paddingRight:8,paddingVertical:4,gap:4},patternInput:{flex:1,fontSize:12,color:_sharedUi.buoyColors.text,paddingVertical:6,paddingHorizontal:4},addPatternButton:{paddingVertical:6,paddingHorizontal:10,borderRadius:4},addPatternButtonText:{fontSize:11,fontWeight:"600"},cancelButton:{padding:4},categoryBadgeScroll:{marginTop:12},categoryBadgeScrollContent:{paddingHorizontal:16,gap:8},categoryBadge:{flexDirection:"row",alignItems:"center",paddingVertical:8,paddingLeft:10,paddingRight:6,borderRadius:8,borderWidth:1,gap:6},categoryBadgeText:{fontSize:11,fontWeight:"600"},categoryBadgeCountBubble:{paddingHorizontal:6,paddingVertical:2,borderRadius:10,minWidth:20,alignItems:"center"},categoryBadgeCount:{fontSize:10,fontWeight:"600"},detectedItemsContainer:{paddingHorizontal:16,paddingTop:12,paddingBottom:16},detectedItemsScroll:{maxHeight:200},detectedItems:{flexDirection:"row",flexWrap:"wrap",gap:8},detectedItem:{flexDirection:"row",alignItems:"center",backgroundColor:_sharedUi.buoyColors.input,borderRadius:6,borderWidth:1,paddingVertical:6,paddingHorizontal:10,gap:6},detectedItemText:{fontSize:11,color:_sharedUi.buoyColors.text,fontFamily:"monospace"},emptyText:{fontSize:11,color:_sharedUi.buoyColors.textMuted,fontStyle:"italic",textAlign:"center",paddingVertical:16,paddingHorizontal:16},howItWorks:{paddingHorizontal:16,paddingVertical:12},howItWorksText:{fontSize:11,color:_sharedUi.buoyColors.textMuted,lineHeight:18,fontFamily:"monospace"},howItWorksBold:{fontWeight:"700",color:_sharedUi.buoyColors.textSecondary},modalOverlay:{flex:1,backgroundColor:"rgba(0, 0, 0, 0.5)",justifyContent:"center",alignItems:"center",padding:32},actionPopup:{backgroundColor:_sharedUi.buoyColors.card,borderRadius:12,borderWidth:1,borderColor:_sharedUi.buoyColors.border,width:"100%",maxWidth:300,overflow:"hidden"},actionPopupHeader:{padding:16,borderBottomWidth:1,borderBottomColor:_sharedUi.buoyColors.border+"50",alignItems:"center"},actionPopupButtons:{flexDirection:"row",padding:12,gap:8},actionPopupButton:{flex:1,flexDirection:"row",alignItems:"center",justifyContent:"center",paddingVertical:12,paddingHorizontal:12,borderRadius:8,gap:8},actionPopupInclude:{backgroundColor:_sharedUi.buoyColors.success+"15"},actionPopupExclude:{backgroundColor:_sharedUi.buoyColors.primary+"15"},actionPopupButtonText:{fontSize:13,fontWeight:"600"},actionPopupCancel:{padding:12,borderTopWidth:1,borderTopColor:_sharedUi.buoyColors.border+"50",alignItems:"center"},actionPopupCancelText:{fontSize:13,color:_sharedUi.buoyColors.textMuted,fontWeight:"500"},settingsSection:{paddingHorizontal:16,paddingTop:8,paddingBottom:16},settingItem:{gap:8},settingItemSpaced:{marginTop:16,paddingTop:16,borderTopWidth:1,borderTopColor:_sharedUi.buoyColors.border+"30"},settingHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},settingLabel:{fontSize:13,fontWeight:"600",color:_sharedUi.buoyColors.text},settingValue:{backgroundColor:_sharedUi.buoyColors.textMuted+"20",paddingHorizontal:10,paddingVertical:4,borderRadius:6},settingValueText:{fontSize:12,fontWeight:"700",color:_sharedUi.buoyColors.textMuted,fontFamily:"monospace"},settingDescription:{fontSize:11,color:_sharedUi.buoyColors.textSecondary,lineHeight:16},settingDescriptionMuted:{fontSize:10,color:_sharedUi.buoyColors.textMuted,lineHeight:14,marginTop:4,fontStyle:"italic"},settingLabelDisabled:{color:_sharedUi.buoyColors.textMuted},settingWarning:{color:_sharedUi.buoyColors.warning,fontWeight:"500"},batchSizePresets:{flexDirection:"row",flexWrap:"wrap",gap:8,marginTop:4},batchSizePreset:{paddingVertical:8,paddingHorizontal:14,borderRadius:6,backgroundColor:_sharedUi.buoyColors.input,borderWidth:1,borderColor:_sharedUi.buoyColors.border+"50"},batchSizePresetActive:{backgroundColor:_sharedUi.buoyColors.textMuted+"20",borderColor:_sharedUi.buoyColors.textMuted},batchSizePresetText:{fontSize:12,fontWeight:"500",color:_sharedUi.buoyColors.textSecondary,fontFamily:"monospace"},batchSizePresetTextActive:{color:_sharedUi.buoyColors.textMuted,fontWeight:"700"},renderCountRangeContainer:{paddingHorizontal:16,paddingTop:12,paddingBottom:16,gap:12},renderCountInputRow:{flexDirection:"row",alignItems:"center",gap:12},renderCountInputGroup:{flex:1,gap:4},renderCountLabel:{fontSize:10,fontWeight:"600",color:_sharedUi.buoyColors.textMuted,textTransform:"uppercase",letterSpacing:.5},renderCountInput:{backgroundColor:_sharedUi.buoyColors.input,borderRadius:8,borderWidth:1,borderColor:_sharedUi.buoyColors.border,paddingVertical:10,paddingHorizontal:12,fontSize:14,fontWeight:"600",color:_sharedUi.buoyColors.text,fontFamily:"monospace",textAlign:"center"},renderCountSeparator:{fontSize:12,color:_sharedUi.buoyColors.textMuted,marginTop:18},clearRangeButton:{flexDirection:"row",alignItems:"center",justifyContent:"center",paddingVertical:8,paddingHorizontal:12,borderRadius:6,backgroundColor:_sharedUi.buoyColors.warning+"15",borderWidth:1,borderColor:_sharedUi.buoyColors.warning+"40",gap:6,alignSelf:"center"},clearRangeButtonText:{fontSize:11,fontWeight:"600",color:_sharedUi.buoyColors.warning}});var _default=exports.default=HighlightFilterView;