@buoy-gg/highlight-updates 2.1.9 → 2.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/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 +16 -16
  65. package/LICENSE +0 -58
@@ -1 +1,1371 @@
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;
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;