react-native-inapp-inspector 2.3.24 → 2.4.0

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 (207) hide show
  1. package/README.md +26 -5
  2. package/dist/commonjs/components/AnalyticsDetail.js +15 -12
  3. package/dist/commonjs/components/AnalyticsEventCard.js +11 -8
  4. package/dist/commonjs/components/AppHeaderLogo.js +4 -6
  5. package/dist/commonjs/components/ConsoleLogCard.d.ts +1 -0
  6. package/dist/commonjs/components/ConsoleLogCard.js +92 -80
  7. package/dist/commonjs/components/EndOfListFooter.d.ts +5 -1
  8. package/dist/commonjs/components/EndOfListFooter.js +27 -5
  9. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +1 -1
  10. package/dist/commonjs/components/Inspector/AnalyticsTab.js +27 -299
  11. package/dist/commonjs/components/Inspector/ConsoleTab.js +36 -94
  12. package/dist/commonjs/components/Inspector/CrashDetail.js +11 -10
  13. package/dist/commonjs/components/Inspector/CrashTab.js +43 -33
  14. package/dist/commonjs/components/Inspector/DebuggingTab.js +13 -13
  15. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +107 -71
  16. package/dist/commonjs/components/Inspector/FabLauncher.js +8 -9
  17. package/dist/commonjs/components/Inspector/InspectorHeader.js +93 -70
  18. package/dist/commonjs/components/Inspector/LogDetail.js +10 -7
  19. package/dist/commonjs/components/Inspector/MainScreen.js +66 -30
  20. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +1 -1
  21. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +3 -3
  22. package/dist/commonjs/components/Inspector/NetworkDetail.js +29 -28
  23. package/dist/commonjs/components/Inspector/NetworkFilterModal.js +1 -1
  24. package/dist/commonjs/components/Inspector/NetworkTab.js +87 -85
  25. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +3 -3
  26. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +21 -22
  27. package/dist/commonjs/components/Inspector/PushCard.d.ts +4 -0
  28. package/dist/commonjs/components/Inspector/PushCard.js +89 -0
  29. package/dist/commonjs/components/Inspector/PushDetail.d.ts +4 -0
  30. package/dist/commonjs/components/Inspector/PushDetail.js +190 -0
  31. package/dist/commonjs/components/Inspector/PushTab.d.ts +3 -0
  32. package/dist/commonjs/components/Inspector/PushTab.js +45 -0
  33. package/dist/commonjs/components/Inspector/ReduxDetail.js +16 -13
  34. package/dist/commonjs/components/Inspector/ReduxTab.js +109 -106
  35. package/dist/commonjs/components/Inspector/SettingsPanel.js +230 -134
  36. package/dist/commonjs/components/Inspector/StorageTab.js +55 -51
  37. package/dist/commonjs/components/Inspector/TabBar.js +30 -26
  38. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +2 -2
  39. package/dist/commonjs/components/JsonViewer.js +151 -159
  40. package/dist/commonjs/components/LogCard.js +34 -38
  41. package/dist/commonjs/components/LogSyntaxHighlighter.js +3 -3
  42. package/dist/commonjs/components/ModuleErrorBoundary.d.ts +24 -0
  43. package/dist/commonjs/components/ModuleErrorBoundary.js +33 -0
  44. package/dist/commonjs/components/NetworkIcons.d.ts +3 -3
  45. package/dist/commonjs/components/NetworkIcons.js +10 -6
  46. package/dist/commonjs/components/SegmentedTabs.d.ts +8 -2
  47. package/dist/commonjs/components/SegmentedTabs.js +11 -7
  48. package/dist/commonjs/components/ShareButton.d.ts +11 -0
  49. package/dist/commonjs/components/ShareButton.js +6 -0
  50. package/dist/commonjs/constants/index.js +1 -1
  51. package/dist/commonjs/constants/version.d.ts +1 -1
  52. package/dist/commonjs/constants/version.js +1 -1
  53. package/dist/commonjs/customHooks/crashHandler.js +4 -4
  54. package/dist/commonjs/customHooks/networkLogger.js +1 -2
  55. package/dist/commonjs/customHooks/pushNotificationLogger.d.ts +19 -0
  56. package/dist/commonjs/customHooks/pushNotificationLogger.js +1 -0
  57. package/dist/commonjs/helpers/index.d.ts +6 -0
  58. package/dist/commonjs/helpers/index.js +4 -4
  59. package/dist/commonjs/helpers/memoryManager.d.ts +2 -2
  60. package/dist/commonjs/helpers/memoryManager.js +1 -1
  61. package/dist/commonjs/helpers/remoteConfig.js +1 -1
  62. package/dist/commonjs/helpers/settingsStore.d.ts +1 -0
  63. package/dist/commonjs/helpers/settingsStore.js +1 -1
  64. package/dist/commonjs/helpers/shareFormatter.d.ts +13 -0
  65. package/dist/commonjs/helpers/shareFormatter.js +7 -0
  66. package/dist/commonjs/i18n/index.d.ts +35 -0
  67. package/dist/commonjs/i18n/index.js +1 -1
  68. package/dist/commonjs/i18n/locales/ar.json +1 -0
  69. package/dist/commonjs/i18n/locales/de.json +1 -0
  70. package/dist/commonjs/i18n/locales/en.json +1 -1
  71. package/dist/commonjs/i18n/locales/es.json +1 -0
  72. package/dist/commonjs/i18n/locales/fr.json +1 -0
  73. package/dist/commonjs/i18n/locales/hi.json +1 -0
  74. package/dist/commonjs/i18n/locales/ja.json +1 -0
  75. package/dist/commonjs/i18n/locales/ko.json +1 -0
  76. package/dist/commonjs/i18n/locales/pt.json +1 -0
  77. package/dist/commonjs/i18n/locales/ru.json +1 -0
  78. package/dist/commonjs/i18n/locales/zh.json +1 -0
  79. package/dist/commonjs/index.d.ts +6 -5
  80. package/dist/commonjs/index.js +4 -4
  81. package/dist/commonjs/push.d.ts +4 -0
  82. package/dist/commonjs/push.js +1 -0
  83. package/dist/commonjs/styles/AppColors.d.ts +40 -0
  84. package/dist/commonjs/styles/AppColors.js +1 -1
  85. package/dist/commonjs/styles/index.js +1 -1
  86. package/dist/commonjs/types/enums.d.ts +30 -20
  87. package/dist/commonjs/types/enums.js +1 -1
  88. package/dist/commonjs/types/index.d.ts +10 -0
  89. package/dist/commonjs/types/interfaces.d.ts +63 -7
  90. package/dist/esm/components/AnalyticsDetail.js +84 -81
  91. package/dist/esm/components/AnalyticsEventCard.js +20 -17
  92. package/dist/esm/components/AppHeaderLogo.js +5 -7
  93. package/dist/esm/components/ConsoleLogCard.d.ts +1 -0
  94. package/dist/esm/components/ConsoleLogCard.js +98 -86
  95. package/dist/esm/components/EndOfListFooter.d.ts +5 -1
  96. package/dist/esm/components/EndOfListFooter.js +36 -14
  97. package/dist/esm/components/Inspector/AnalyticsFilterModal.js +14 -14
  98. package/dist/esm/components/Inspector/AnalyticsTab.js +44 -316
  99. package/dist/esm/components/Inspector/ConsoleTab.js +55 -113
  100. package/dist/esm/components/Inspector/CrashDetail.js +53 -52
  101. package/dist/esm/components/Inspector/CrashTab.js +74 -64
  102. package/dist/esm/components/Inspector/DebuggingTab.js +33 -33
  103. package/dist/esm/components/Inspector/DeviceInfoTab.js +174 -138
  104. package/dist/esm/components/Inspector/FabLauncher.js +41 -42
  105. package/dist/esm/components/Inspector/InspectorHeader.js +138 -115
  106. package/dist/esm/components/Inspector/LogDetail.js +24 -21
  107. package/dist/esm/components/Inspector/MainScreen.js +98 -62
  108. package/dist/esm/components/Inspector/MediaGalleryTab.js +1 -1
  109. package/dist/esm/components/Inspector/MediaPreviewModal.js +31 -31
  110. package/dist/esm/components/Inspector/NetworkDetail.js +88 -87
  111. package/dist/esm/components/Inspector/NetworkFilterModal.js +8 -8
  112. package/dist/esm/components/Inspector/NetworkTab.js +132 -130
  113. package/dist/esm/components/Inspector/NpmStarPrompt.js +42 -42
  114. package/dist/esm/components/Inspector/NpmUpdateToast.js +45 -46
  115. package/dist/esm/components/Inspector/PushCard.d.ts +4 -0
  116. package/dist/esm/components/Inspector/PushCard.js +89 -0
  117. package/dist/esm/components/Inspector/PushDetail.d.ts +4 -0
  118. package/dist/esm/components/Inspector/PushDetail.js +190 -0
  119. package/dist/esm/components/Inspector/PushTab.d.ts +3 -0
  120. package/dist/esm/components/Inspector/PushTab.js +45 -0
  121. package/dist/esm/components/Inspector/ReduxDetail.js +40 -37
  122. package/dist/esm/components/Inspector/ReduxTab.js +155 -152
  123. package/dist/esm/components/Inspector/SettingsPanel.js +380 -284
  124. package/dist/esm/components/Inspector/StorageTab.js +177 -173
  125. package/dist/esm/components/Inspector/TabBar.js +38 -34
  126. package/dist/esm/components/Inspector/UpdateAvailableModal.js +1 -1
  127. package/dist/esm/components/JsonViewer.js +161 -169
  128. package/dist/esm/components/LogCard.js +38 -42
  129. package/dist/esm/components/LogSyntaxHighlighter.js +1 -1
  130. package/dist/esm/components/ModuleErrorBoundary.d.ts +24 -0
  131. package/dist/esm/components/ModuleErrorBoundary.js +33 -0
  132. package/dist/esm/components/NetworkIcons.d.ts +3 -3
  133. package/dist/esm/components/NetworkIcons.js +7 -3
  134. package/dist/esm/components/SegmentedTabs.d.ts +8 -2
  135. package/dist/esm/components/SegmentedTabs.js +12 -8
  136. package/dist/esm/components/ShareButton.d.ts +11 -0
  137. package/dist/esm/components/ShareButton.js +6 -0
  138. package/dist/esm/constants/index.js +1 -1
  139. package/dist/esm/constants/version.d.ts +1 -1
  140. package/dist/esm/constants/version.js +1 -1
  141. package/dist/esm/customHooks/crashHandler.js +6 -6
  142. package/dist/esm/customHooks/networkLogger.js +1 -2
  143. package/dist/esm/customHooks/pushNotificationLogger.d.ts +19 -0
  144. package/dist/esm/customHooks/pushNotificationLogger.js +1 -0
  145. package/dist/esm/helpers/index.d.ts +6 -0
  146. package/dist/esm/helpers/index.js +4 -4
  147. package/dist/esm/helpers/memoryManager.d.ts +2 -2
  148. package/dist/esm/helpers/memoryManager.js +1 -1
  149. package/dist/esm/helpers/remoteConfig.js +1 -1
  150. package/dist/esm/helpers/settingsStore.d.ts +1 -0
  151. package/dist/esm/helpers/settingsStore.js +1 -1
  152. package/dist/esm/helpers/shareFormatter.d.ts +13 -0
  153. package/dist/esm/helpers/shareFormatter.js +7 -0
  154. package/dist/esm/i18n/index.d.ts +35 -0
  155. package/dist/esm/i18n/index.js +1 -1
  156. package/dist/esm/i18n/locales/ar.json +1 -0
  157. package/dist/esm/i18n/locales/de.json +1 -0
  158. package/dist/esm/i18n/locales/en.json +1 -1
  159. package/dist/esm/i18n/locales/es.json +1 -0
  160. package/dist/esm/i18n/locales/fr.json +1 -0
  161. package/dist/esm/i18n/locales/hi.json +1 -0
  162. package/dist/esm/i18n/locales/ja.json +1 -0
  163. package/dist/esm/i18n/locales/ko.json +1 -0
  164. package/dist/esm/i18n/locales/pt.json +1 -0
  165. package/dist/esm/i18n/locales/ru.json +1 -0
  166. package/dist/esm/i18n/locales/zh.json +1 -0
  167. package/dist/esm/index.d.ts +6 -5
  168. package/dist/esm/index.js +7 -7
  169. package/dist/esm/push.d.ts +4 -0
  170. package/dist/esm/push.js +1 -0
  171. package/dist/esm/styles/AppColors.d.ts +40 -0
  172. package/dist/esm/styles/AppColors.js +1 -1
  173. package/dist/esm/styles/index.js +1 -1
  174. package/dist/esm/types/enums.d.ts +30 -20
  175. package/dist/esm/types/enums.js +1 -1
  176. package/dist/esm/types/index.d.ts +10 -0
  177. package/dist/esm/types/interfaces.d.ts +63 -7
  178. package/package.json +53 -24
  179. package/src/native/NativeInspector.ts +0 -1
  180. package/dist/commonjs/bundle.d.ts +0 -2
  181. package/dist/commonjs/bundle.js +0 -1
  182. package/dist/commonjs/components/BrandSquareIcon.d.ts +0 -5
  183. package/dist/commonjs/components/BrandSquareIcon.js +0 -112
  184. package/dist/commonjs/components/Inspector/BundleTab.d.ts +0 -48
  185. package/dist/commonjs/components/Inspector/BundleTab.js +0 -1297
  186. package/dist/commonjs/components/Inspector/PerformanceTab.d.ts +0 -27
  187. package/dist/commonjs/components/Inspector/PerformanceTab.js +0 -454
  188. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +0 -115
  189. package/dist/commonjs/customHooks/bundleAnalyzer.js +0 -1
  190. package/dist/commonjs/customHooks/performanceTracker.d.ts +0 -144
  191. package/dist/commonjs/customHooks/performanceTracker.js +0 -63
  192. package/dist/commonjs/performance.d.ts +0 -2
  193. package/dist/commonjs/performance.js +0 -1
  194. package/dist/esm/bundle.d.ts +0 -2
  195. package/dist/esm/bundle.js +0 -1
  196. package/dist/esm/components/BrandSquareIcon.d.ts +0 -5
  197. package/dist/esm/components/BrandSquareIcon.js +0 -112
  198. package/dist/esm/components/Inspector/BundleTab.d.ts +0 -48
  199. package/dist/esm/components/Inspector/BundleTab.js +0 -1297
  200. package/dist/esm/components/Inspector/PerformanceTab.d.ts +0 -27
  201. package/dist/esm/components/Inspector/PerformanceTab.js +0 -454
  202. package/dist/esm/customHooks/bundleAnalyzer.d.ts +0 -115
  203. package/dist/esm/customHooks/bundleAnalyzer.js +0 -1
  204. package/dist/esm/customHooks/performanceTracker.d.ts +0 -144
  205. package/dist/esm/customHooks/performanceTracker.js +0 -63
  206. package/dist/esm/performance.d.ts +0 -2
  207. package/dist/esm/performance.js +0 -1
@@ -1,223 +1,259 @@
1
- import Ee,{useState as Q,useEffect as ke,useMemo as F,useCallback as ze}from"react";import{View as T,Text as I,ScrollView as He,TextInput as Qe,Dimensions as _e,Platform as $,PixelRatio as We,StatusBar as et,StyleSheet as tt,NativeModules as j}from"react-native";import Se from"../TouchableScale";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as E}from"../../styles/AppFonts";import{useTranslation as rt}from"../../i18n";import{CpuIcon as St,WifiIcon as $t,ScreenIcon as Tt,LayersIcon as It,KeyIcon as Ct,SearchIcon as Ue,ClearIcon as Bt,CopyIcon as Ge,BoltIcon as Mt,AppleIcon as At,AndroidIcon as Dt,ExportIcon as Vt}from"../NetworkIcons";import{getNativeDeviceMetrics as Rt,getNativeSystemMetrics as Pt}from"../../native/NativeInspector";import{copyToClipboard as Le,getAppName as Et}from"../../helpers";import{showToast as Oe}from"../../helpers/toast";import{LIB_VERSION as fe}from"../../constants";const S=Ee.memo(({label:$e,value:D,copyable:Te=!0,badge:v,subtext:ee,isLast:Fe=!1})=>{const ve=D==null?"\u2014":typeof D=="boolean"?D?"Yes":"No":String(D);return<T style={[r.infoRow,Fe&&{borderBottomWidth:0}]}>
2
- <T style={{flex:1,paddingRight:8,minWidth:0}}>
3
- <T style={{flexDirection:"row",alignItems:"center",flexWrap:"wrap",gap:6}}>
4
- <I style={r.infoLabel}numberOfLines={2}>{$e}</I>
5
- {v&&<T style={[r.infoBadge,{backgroundColor:v.bg,borderColor:`${v.color}33`}]}>
6
- <I style={[r.infoBadgeText,{color:v.color}]}>
7
- {v.text}
1
+ import Ve,{useState as oe,useEffect as Le,useMemo as F,useCallback as Pe}from"react";import{View as $,Text as I,ScrollView as Ee,TextInput as Xe,Dimensions as Ue,Platform as w,PixelRatio as ze,StatusBar as Ze,StyleSheet as Qe,NativeModules as q}from"react-native";import Z from"../TouchableScale";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as D}from"../../styles/AppFonts";import{useTranslation as et}from"../../i18n";import{CpuIcon as St,WifiIcon as Ct,ScreenIcon as $t,LayersIcon as Tt,KeyIcon as Oe,SearchIcon as He,ClearIcon as It,CopyIcon as Se,BoltIcon as Mt,AppleIcon as Bt,AndroidIcon as Dt,ExportIcon as At}from"../NetworkIcons";import{getNativeDeviceMetrics as Vt,getNativeSystemMetrics as Lt}from"../../native/NativeInspector";import{copyToClipboard as ae,getAppName as Rt}from"../../helpers";import{showToast as ie}from"../../helpers/toast";import{LIB_VERSION as le}from"../../constants";const S=Ve.memo(({label:A,value:V,copyable:fe=!0,badge:C,subtext:re,isLast:T=!1})=>{const ne=V==null?"\u2014":typeof V=="boolean"?V?"Yes":"No":typeof V=="number"?V.toLocaleString():String(V);return<$ style={[r.infoRow,T&&{borderBottomWidth:0}]}>
2
+ <$ style={{flex:1,paddingRight:8,minWidth:0}}>
3
+ <$ style={{flexDirection:"row",alignItems:"center",flexWrap:"wrap",gap:6}}>
4
+ <I style={r.infoLabel}numberOfLines={2}>{A}</I>
5
+ {C&&<$ style={[r.infoBadge,{backgroundColor:C.bg,borderColor:`${C.color}33`}]}>
6
+ <I style={[r.infoBadgeText,{color:C.color}]}>
7
+ {C.text}
8
8
  </I>
9
- </T>}
10
- </T>
11
- {ee&&<I style={r.infoSubtext}numberOfLines={2}>{ee}</I>}
12
- </T>
13
- <T style={{flexDirection:"row",alignItems:"center",gap:6,flexShrink:0,maxWidth:"58%",justifyContent:"flex-end"}}>
14
- <I style={[r.infoValue,typeof D=="boolean"&&{color:D?e.emerald500:e.errorColor}]}numberOfLines={3}selectable>
15
- {ve}
9
+ </$>}
10
+ </$>
11
+ {re&&<I style={r.infoSubtext}numberOfLines={2}>{re}</I>}
12
+ </$>
13
+ <$ style={{flexDirection:"row",alignItems:"center",gap:6,flexShrink:0,maxWidth:"58%",justifyContent:"flex-end"}}>
14
+ <I style={[r.infoValue,typeof V=="boolean"&&{color:V?e.emerald500:e.errorColor}]}numberOfLines={3}selectable>
15
+ {ne}
16
16
  </I>
17
- {Te&&D!==null&&D!==void 0&&<Se hitSlop={8}onPress={()=>{Le(ve,$e),Oe(`Copied ${$e}`)}}style={r.rowCopyBtn}>
18
- <Ge size={11}color={e.grayTextWeak}/>
19
- </Se>}
20
- </T>
21
- </T>});export const DeviceInfoTab=Ee.memo(()=>{const{t:$e}=rt(),[D,Te]=Q("overview"),[v,ee]=Q(""),[Fe,ve]=Q(!0),[w,Je]=Q(null),[Ne,je]=Q(null),[O,xe]=Q("Detecting..."),[_,Ie]=Q("0s"),Ye=Ee.useRef(Date.now()),Ce=ze(async()=>{try{const[f,B]=await Promise.all([Rt(),Pt()]);Je(f),je(B)}catch{}finally{ve(!1)}},[]);ke(()=>{Ce();const f=setInterval(Ce,3e3);return()=>clearInterval(f)},[Ce]),ke(()=>{let f=!0;return(async()=>{try{const A=j?.PlatformConstants?.serverHost||j?.AndroidConstants?.serverHost||j?.DevSettings?.serverHost;if(A&&typeof A=="string"){const V=A.split(":")[0].replace(/https?:\/\//,"");if(V&&V!=="localhost"&&V!=="127.0.0.1"){f&&xe(V);return}}}catch{}try{const A=new AbortController,V=setTimeout(()=>A.abort(),1200),K=await fetch("https://api.ipify.org?format=json",{signal:A.signal});if(clearTimeout(V),K.ok){const J=await K.json();if(J&&J.ip&&f){xe(J.ip);return}}}catch{}f&&xe($.OS==="android"?"10.0.2.15 (Local)":"127.0.0.1 (Local)")})(),()=>{f=!1}},[]),ke(()=>{const f=()=>{const A=Math.floor((Date.now()-Ye.current)/1e3),V=Math.floor(A/3600),K=Math.floor(A%3600/60),J=A%60;V>0?Ie(`${V}h ${K}m ${J}s`):K>0?Ie(`${K}m ${J}s`):Ie(`${J}s`)},B=setInterval(f,1e3);return f(),()=>clearInterval(B)},[]);const k=_e.get("window"),R=_e.get("screen"),C=We.get(),Y=We.getFontScale(),W=k.width>=600||k.height>=1e3,q=k.width>k.height,X=$.OS==="android"?et.currentHeight||24:k.height>=812?44:20,N=F(()=>{const f=`${$.OS}-${$.Version}-${R.width}x${R.height}-${C}-${$.constants?.Brand||"generic"}`;let B=0;for(let V=0;V<f.length;V++)B=(B<<5)-B+f.charCodeAt(V),B|=0;const A=Math.abs(B).toString(16).padStart(8,"0");return`UDID-${$.OS.toUpperCase()}-${A.slice(0,4)}-${A.slice(4,8)}-${Date.now().toString(16).slice(-4)}`.toUpperCase()},[R.width,R.height,C]),P=!!global?.HermesInternal,U=!!globalThis?.__turboModuleProxy,Z=F(()=>{const f=$.constants?.reactNativeVersion;return f?`${f.major}.${f.minor}.${f.patch}${f.prerelease!=null?`-${f.prerelease}`:""}`:"0.74+"},[]),M=w?.totalRAM?Math.round(w.totalRAM/(1024*1024)):Ne?.totalPhysicalRamMb||4096,L=w?.freeRAM?Math.round(w.freeRAM/(1024*1024)):Math.max(0,M-(Ne?.residentRamMb||1200)),G=Math.max(0,M-L),we=M>0?Math.round(G/M*100):45,z=w?.totalStorage?(w.totalStorage/(1024*1024*1024)).toFixed(1):"128.0",H=w?.freeStorage?(w.freeStorage/(1024*1024*1024)).toFixed(1):"64.2",Ke=F(()=>[{key:"overview",label:"Overview",icon:f=><It size={12}color={f}/>},{key:"hardware",label:"Hardware",icon:f=><St size={12}color={f}/>},{key:"network",label:"Network & IP",icon:f=><$t size={12}color={f}/>},{key:"display",label:"Display",icon:f=><Tt size={12}color={f}/>},{key:"runtime",label:"Runtime & App",icon:f=><Mt size={12}color={f}/>},{key:"security",label:"Security & IDs",icon:f=><Ct size={12}color={f}/>}],[]),o=F(()=>({identifiers:{pseudoUDID:N,bundleId:w?.appBundleId||w?.appPackageName||"com.app.inspector"},hardware:{model:w?.deviceModel||$.constants?.Model||"Unknown Device",brand:w?.deviceBrand||$.constants?.Brand||($.OS==="ios"?"Apple":"Android"),osVersion:`${$.OS} ${$.Version}`,apiLevel:w?.apiLevel||$.constants?.Version||null,cpuAbi:w?.cpuAbi||$.constants?.ServerHost||"arm64-v8a",totalRamMb:M,freeRamMb:L,usedRamMb:G,totalStorageGb:`${z} GB`,freeStorageGb:`${H} GB`,batteryPercent:w?.batteryPercent??100,isCharging:w?.isCharging??!1},network:{ipAddress:O,isWifi:!0,reachability:"Online"},display:{windowWidth:k.width,windowHeight:k.height,screenWidth:R.width,screenHeight:R.height,pixelRatio:C,fontScale:Y,statusBarHeight:X,isTablet:W,orientation:q?"Landscape":"Portrait"},runtime:{appName:Et(),appVersion:w?.appVersion||"1.0.0",appBuild:w?.appBuild||"1",reactNativeVersion:Z,inspectorVersion:fe,isHermes:P,isTurboModule:U,isDev:__DEV__,jsEngine:P?"Hermes":"JSC",timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,locale:Intl.DateTimeFormat().resolvedOptions().locale,sessionUptime:_}}),[N,w,M,L,G,z,H,O,k,R,C,Y,X,W,q,Z,P,U,_]),qe=()=>{Le(JSON.stringify(o,null,2),"Device Full Report"),Oe("Copied Full Device JSON Report!")},Xe=()=>{const f=`# Device Information Report
22
- **Generated by React Native In-App Inspector v${fe}**
17
+ {fe&&V!==null&&V!==void 0&&<Z hitSlop={8}onPress={()=>{ae(ne,A),ie(`Copied ${A}`)}}style={r.rowCopyBtn}>
18
+ <Se size={11}color={e.grayTextWeak}/>
19
+ </Z>}
20
+ </$>
21
+ </$>});export const DeviceInfoTab=Ve.memo(()=>{const{t:A}=et(),[V,fe]=oe("overview"),[C,re]=oe(""),[T,ne]=oe(null),[Re,Ne]=oe(null),[H,we]=oe("Detecting..."),[J,Ce]=oe("0s"),Fe=Ve.useRef(Date.now()),ve=Pe(async()=>{try{const[f,R]=await Promise.all([Vt(),Lt()]);ne(f),Ne(R)}catch{}},[]);Le(()=>{ve();const f=setInterval(ve,3e3);return()=>clearInterval(f)},[ve]),Le(()=>{let f=!0;return(async()=>{try{const M=q?.PlatformConstants?.serverHost||q?.AndroidConstants?.serverHost||q?.DevSettings?.serverHost;if(M&&typeof M=="string"){const B=M.split(":")[0].replace(/https?:\/\//,"");if(B&&B!=="localhost"&&B!=="127.0.0.1"){f&&we(B);return}}}catch{}try{const M=new AbortController,B=setTimeout(()=>M.abort(),1200),N=await fetch("https://api.ipify.org?format=json",{signal:M.signal});if(clearTimeout(B),N.ok){const G=await N.json();if(G&&G.ip&&f){we(G.ip);return}}}catch{}f&&we(w.OS==="android"?"10.0.2.15 (Local)":"127.0.0.1 (Local)")})(),()=>{f=!1}},[]),Le(()=>{const f=()=>{const M=Math.floor((Date.now()-Fe.current)/1e3),B=Math.floor(M/3600),N=Math.floor(M%3600/60),G=M%60;B>0?Ce(`${B}h ${N}m ${G}s`):N>0?Ce(`${N}m ${G}s`):Ce(`${G}s`)},R=setInterval(f,1e3);return f(),()=>clearInterval(R)},[]);const z=Ue.get("window"),E=Ue.get("screen"),L=ze.get(),X=ze.getFontScale(),j=z.width>=600||z.height>=1e3,Q=z.width>z.height,ee=w.OS==="android"?Ze.currentHeight||24:z.height>=812?44:20,k=F(()=>{const f=`${w.OS}-${w.Version}-${E.width}x${E.height}-${L}-${w.constants?.Brand||"generic"}-${w.constants?.Model||"device"}`;let R=3735928559,M=1103547991,B=305419896,N=2271560481;for(let Ae=0;Ae<f.length;Ae++){const de=f.charCodeAt(Ae);R=Math.imul(R^de,2654435761)>>>0,M=Math.imul(M^de,1597334677)>>>0,B=Math.imul(B^de,374761393)>>>0,N=Math.imul(N^de,668265263)>>>0}const G=R.toString(16).padStart(8,"0").toUpperCase(),je=(M&65535).toString(16).padStart(4,"0").toUpperCase(),Ye=(M>>>16&4095|16384).toString(16).padStart(4,"0").toUpperCase(),Ke=(B>>>16&16383|32768).toString(16).padStart(4,"0").toUpperCase(),qe=(B.toString(16).padStart(8,"0")+(N&65535).toString(16).padStart(4,"0")).slice(0,12).toUpperCase();return`${G}-${je}-${Ye}-${Ke}-${qe}`},[E.width,E.height,L]),U=!!global?.HermesInternal,Y=!!globalThis?.__turboModuleProxy,te=F(()=>{const f=w.constants?.reactNativeVersion;return f?`${f.major}.${f.minor}.${f.patch}${f.prerelease!=null?`-${f.prerelease}`:""}`:"0.74+"},[]),P=T?.totalRAM?Math.round(T.totalRAM/(1024*1024)):Re?.totalPhysicalRamMb||4096,O=T?.freeRAM?Math.round(T.freeRAM/(1024*1024)):Math.max(0,P-(Re?.residentRamMb||1200)),K=Math.max(0,P-O),se=P>0?Math.round(K/P*100):45,W=T?.totalStorage?(T.totalStorage/(1024*1024*1024)).toFixed(1):"128.0",_=T?.freeStorage?(T.freeStorage/(1024*1024*1024)).toFixed(1):"64.2",We=F(()=>[{key:"overview",label:A("device.subTabs.overview","Overview"),themeColor:e.sky600,icon:f=><Tt size={12}color={f}/>},{key:"hardware",label:A("device.subTabs.hardware","Hardware"),themeColor:e.orange600,icon:f=><St size={12}color={f}/>},{key:"network",label:A("device.subTabs.network","Network & IP"),themeColor:e.teal600,icon:f=><Ct size={12}color={f}/>},{key:"display",label:A("device.subTabs.display","Display"),themeColor:e.pink600,icon:f=><$t size={12}color={f}/>},{key:"runtime",label:A("device.subTabs.runtime","Runtime & App"),themeColor:e.amber600,icon:f=><Mt size={12}color={f}/>},{key:"security",label:A("device.subTabs.security","Security & IDs"),themeColor:e.errorColor,icon:f=><Oe size={12}color={f}/>}],[A]),o=F(()=>({identifiers:{pseudoUDID:k,bundleId:T?.appBundleId||T?.appPackageName||"com.app.inspector"},hardware:{model:T?.deviceModel||w.constants?.Model||"Unknown Device",brand:T?.deviceBrand||w.constants?.Brand||(w.OS==="ios"?"Apple":"Android"),osVersion:`${w.OS} ${w.Version}`,apiLevel:T?.apiLevel||w.constants?.Version||null,cpuAbi:T?.cpuAbi||w.constants?.ServerHost||"arm64-v8a",totalRamMb:P,freeRamMb:O,usedRamMb:K,totalStorageGb:`${W} GB`,freeStorageGb:`${_} GB`,batteryPercent:T?.batteryPercent??100,isCharging:T?.isCharging??!1},network:{ipAddress:H,isWifi:!0,reachability:"Online"},display:{windowWidth:z.width,windowHeight:z.height,screenWidth:E.width,screenHeight:E.height,pixelRatio:L,fontScale:X,statusBarHeight:ee,isTablet:j,orientation:Q?"Landscape":"Portrait"},runtime:{appName:Rt(),appVersion:T?.appVersion||"1.0.0",appBuild:T?.appBuild||"1",reactNativeVersion:te,inspectorVersion:le,isHermes:U,isTurboModule:Y,isDev:__DEV__,jsEngine:U?"Hermes":"JSC",timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,locale:Intl.DateTimeFormat().resolvedOptions().locale,sessionUptime:J}}),[k,T,P,O,K,W,_,H,z,E,L,X,ee,j,Q,te,U,Y,J]),_e=()=>{ae(JSON.stringify(o,null,2),"Device Full Report"),ie(A("device.copiedJson","Copied Full Device JSON Report!"))},Ge=()=>{const f=`# Device Information Report
22
+ **Generated by React Native In-App Inspector v${le}**
23
23
 
24
24
  ## \u{1F4F1} Hardware & System
25
25
  - **Device Model:** ${o.hardware.model}
26
26
  - **Brand / Manufacturer:** ${o.hardware.brand}
27
27
  - **OS Version:** ${o.hardware.osVersion}
28
28
  - **CPU Architecture:** ${o.hardware.cpuAbi}
29
- - **Total RAM:** ${M} MB (Free: ${L} MB)
30
- - **Total Storage:** ${z} GB (Free: ${H} GB)
29
+ - **Total RAM:** ${P} MB (Free: ${O} MB)
30
+ - **Total Storage:** ${W} GB (Free: ${_} GB)
31
31
  - **Battery:** ${o.hardware.batteryPercent}% (${o.hardware.isCharging?"Charging":"Unplugged"})
32
32
 
33
33
  ## \u{1F310} Network & Connectivity
34
- - **IP Address:** ${O}
34
+ - **IP Address:** ${H}
35
35
  - **Status:** Online
36
36
 
37
37
  ## \u{1F5A5} Display & Geometry
38
- - **Resolution:** ${R.width} \xD7 ${R.height} pt (@${C}x)
39
- - **Form Factor:** ${W?"Tablet":"Phone"} (${q?"Landscape":"Portrait"})
40
- - **Status Bar Height:** ${X} pt
38
+ - **Resolution:** ${E.width} \xD7 ${E.height} pt (@${L}x)
39
+ - **Form Factor:** ${j?"Tablet":"Phone"} (${Q?"Landscape":"Portrait"})
40
+ - **Status Bar Height:** ${ee} pt
41
41
 
42
42
  ## \u2699\uFE0F Runtime & App
43
43
  - **App Name:** ${o.runtime.appName}
44
44
  - **App Version:** ${o.runtime.appVersion} (${o.runtime.appBuild})
45
- - **React Native:** v${Z}
46
- - **JS Engine:** ${P?"Hermes":"JSC"} (Bridgeless TurboModule: ${U?"Yes":"No"})
45
+ - **React Native:** v${te}
46
+ - **JS Engine:** ${U?"Hermes":"JSC"} (Bridgeless TurboModule: ${Y?"Yes":"No"})
47
47
  - **Environment:** ${__DEV__?"Development (__DEV__)":"Production (Release)"}
48
48
  - **Timezone:** ${o.runtime.timezone}
49
- - **Session Uptime:** ${_}
49
+ - **Session Uptime:** ${J}
50
50
 
51
51
  ## \u{1F511} Identifiers & Security
52
- - **Pseudo-UDID:** \`${N}\`
52
+ - **Pseudo-UDID:** \`${k}\`
53
53
  - **Bundle ID:** \`${o.identifiers.bundleId}\`
54
- `;Le(f,"Device Markdown Report"),Oe("Copied Markdown Report to Clipboard!")},t=ze((f,B,A)=>{if(!v.trim())return!0;const V=v.toLowerCase().trim(),K=B!=null?typeof B=="object"?JSON.stringify(B):String(B):"",J=A!=null?String(A):"";return f.toLowerCase().includes(V)||K.toLowerCase().includes(V)||J.toLowerCase().includes(V)},[v]),Be=F(()=>v.trim()?t("Model",w?.deviceModel||$.constants?.Model)||t("OS",$.OS)||t("IP Address",O)||t("RAM",`${G}/${M}`)||t("Uptime",_):!0,[v,t,w,O,G,M,_]),Me=F(()=>v.trim()?t("Device Model",o.hardware.model)||t("Manufacturer",o.hardware.brand)||t("Operating System",o.hardware.osVersion)||t("IP Address",O)||t("RAM Memory",`${G} MB / ${M} MB (${we}%)`,`Free Memory: ${L} MB`)||t("Storage Capacity",`${H} GB Free / ${z} GB Total`)||t("App Version",`v${o.runtime.appVersion} (${o.runtime.appBuild})`)||t("JavaScript Engine",P?"Hermes Bytecode Engine":"JavaScriptCore (JSC)")||t("UDID Identifier",N):!0,[v,t,o,O,G,M,we,L,H,z,P,N]),Ae=F(()=>v.trim()?t("CPU Architecture",o.hardware.cpuAbi)||t("Total RAM",`${M} MB`)||t("Free RAM",`${L} MB`)||t("Storage Capacity",`${z} GB`)||t("Available Storage",`${H} GB`)||t("Battery",`${w?.batteryPercent??100}%`)||t("API Level",`API ${w?.apiLevel||$.Version}`)||t("Thermal State","Nominal (Cool)"):!0,[v,t,o,M,L,z,H,w]),De=F(()=>v.trim()?t("IP Address",O)||t("Internet Reachability","Connected")||t("Connection Type","Wi-Fi / Local Area Network")||t("Metro Dev Server",j?.PlatformConstants?.serverHost||j?.AndroidConstants?.serverHost||"localhost:8081")||t("WebSocket Protocol","Active & Enabled")||t("Network Inspector Interceptor","Intercepting XHR & Fetch"):!0,[v,t,O]),Ve=F(()=>v.trim()?t("Window Resolution",`${k.width.toFixed(0)} \xD7 ${k.height.toFixed(0)} pt`)||t("Screen Physical Size",`${(R.width*C).toFixed(0)} \xD7 ${(R.height*C).toFixed(0)} px`)||t("Pixel Density",`@${C}x (${Math.round(C*160)} dpi)`)||t("Font Scale",`${Y}x`)||t("Form Factor",W?"Tablet":"Smartphone")||t("Orientation",q?"Landscape":"Portrait")||t("Status Bar Height",`${X} pt`):!0,[v,t,k,R,C,Y,W,q,X]),Re=F(()=>v.trim()?t("App Name",o.runtime.appName)||t("Bundle ID",o.identifiers.bundleId)||t("App Version",`v${o.runtime.appVersion} (${o.runtime.appBuild})`)||t("React Native",`v${Z}`)||t("In-App Inspector Version",`v${fe}`)||t("Hermes Engine",P?"Enabled (AOT Bytecode)":"Disabled (JSC)")||t("New Architecture",U?"Enabled":"Legacy Bridge")||t("Build Type",__DEV__?"Debug (__DEV__ = true)":"Release / Production")||t("Timezone",o.runtime.timezone)||t("Locale",o.runtime.locale)||t("Session Uptime",_):!0,[v,t,o,Z,P,U,_]),Pe=F(()=>v.trim()?t("Pseudo-UDID",N)||t("Bundle ID",o.identifiers.bundleId)||t("Root / Jailbreak","Clean (Standard Sandbox)")||t("Simulator / Emulator",$.constants?.Model?.includes?.("sdk")||$.constants?.Model?.includes?.("Emulator")||$.constants?.Model?.includes?.("Simulator")?"Virtual Simulator":"Physical Device")||t("Sandbox Integrity","Enforced by OS Kernel"):!0,[v,t,N,o]),Ze=F(()=>v.trim()?Be||Me||Ae||De||Ve||Re||Pe:!0,[v,Be,Me,Ae,De,Ve,Re,Pe]);return<T style={r.container}>
54
+ `;ae(f,"Device Markdown Report"),ie(A("device.copiedMarkdown","Copied Markdown Report to Clipboard!"))},t=Pe((f,R,M)=>{if(!C.trim())return!0;const B=C.toLowerCase().trim(),N=R!=null?typeof R=="object"?JSON.stringify(R):String(R):"",G=M!=null?String(M):"";return f.toLowerCase().includes(B)||N.toLowerCase().includes(B)||G.toLowerCase().includes(B)},[C]),$e=F(()=>C.trim()?t("Model",T?.deviceModel||w.constants?.Model)||t("OS",w.OS)||t("IP Address",H)||t("RAM",`${K.toLocaleString()}/${P.toLocaleString()}`)||t("Uptime",J):!0,[C,t,T,H,K,P,J]),Te=F(()=>C.trim()?t("Device Model",o.hardware.model)||t("Manufacturer",o.hardware.brand)||t("Operating System",o.hardware.osVersion)||t("IP Address",H)||t("RAM Memory",`${K.toLocaleString()} MB / ${P.toLocaleString()} MB (${se}%)`,`Free Memory: ${O.toLocaleString()} MB`)||t("Storage Capacity",`${_} GB Free / ${W} GB Total`)||t("App Version",`v${o.runtime.appVersion} (${o.runtime.appBuild})`)||t("JavaScript Engine",U?"Hermes Bytecode Engine":"JavaScriptCore (JSC)")||t("UDID Identifier",k):!0,[C,t,o,H,K,P,se,O,_,W,U,k]),xe=F(()=>C.trim()?t("CPU Architecture",o.hardware.cpuAbi)||t("Total RAM",`${P.toLocaleString()} MB`)||t("Free RAM",`${O.toLocaleString()} MB`)||t("Storage Capacity",`${W} GB`)||t("Available Storage",`${_} GB`)||t("Battery",`${T?.batteryPercent??100}%`)||t("API Level",`API ${T?.apiLevel||w.Version}`)||t("Thermal State","Nominal (Cool)"):!0,[C,t,o,P,O,W,_,T]),Ie=F(()=>C.trim()?t("IP Address",H)||t("Internet Reachability","Connected")||t("Connection Type","Wi-Fi / Local Area Network")||t("Metro Dev Server",q?.PlatformConstants?.serverHost||q?.AndroidConstants?.serverHost||"localhost:8081")||t("WebSocket Protocol","Active & Enabled")||t("Network Inspector Interceptor","Intercepting XHR & Fetch"):!0,[C,t,H]),Me=F(()=>C.trim()?t("Window Resolution",`${Math.round(z.width).toLocaleString()} \xD7 ${Math.round(z.height).toLocaleString()} pt`)||t("Screen Physical Size",`${Math.round(E.width*L).toLocaleString()} \xD7 ${Math.round(E.height*L).toLocaleString()} px`)||t("Pixel Density",`@${L}x (${Math.round(L*160).toLocaleString()} dpi)`)||t("Font Scale",`${X}x`)||t("Form Factor",j?"Tablet":"Smartphone")||t("Orientation",Q?"Landscape":"Portrait")||t("Status Bar Height",`${ee} pt`):!0,[C,t,z,E,L,X,j,Q,ee]),Be=F(()=>C.trim()?t("App Name",o.runtime.appName)||t("Bundle ID",o.identifiers.bundleId)||t("App Version",`v${o.runtime.appVersion} (${o.runtime.appBuild})`)||t("React Native",`v${te}`)||t("In-App Inspector Version",`v${le}`)||t("Hermes Engine",U?"Enabled (AOT Bytecode)":"Disabled (JSC)")||t("New Architecture",Y?"Enabled":"Legacy Bridge")||t("Build Type",__DEV__?"Debug (__DEV__ = true)":"Release / Production")||t("Timezone",o.runtime.timezone)||t("Locale",o.runtime.locale)||t("Session Uptime",J):!0,[C,t,o,te,U,Y,J]),De=F(()=>C.trim()?t("Pseudo-UDID",k)||t("Bundle ID",o.identifiers.bundleId)||t("Root / Jailbreak","Clean (Standard Sandbox)")||t("Simulator / Emulator",w.constants?.Model?.includes?.("sdk")||w.constants?.Model?.includes?.("Emulator")||w.constants?.Model?.includes?.("Simulator")?"Virtual Simulator":"Physical Device")||t("Sandbox Integrity","Enforced by OS Kernel"):!0,[C,t,k,o]),Je=F(()=>C.trim()?$e||Te||xe||Ie||Me||Be||De:!0,[C,$e,Te,xe,Ie,Me,Be,De]);return<$ style={r.container}>
55
55
 
56
- <T style={r.subTabsWrapper}>
57
- <He horizontal showsHorizontalScrollIndicator={!1}contentContainerStyle={r.subTabsContainer}>
58
- {Ke.map(f=>{const B=D===f.key,A=B?e.white:e.grayText;return<Se key={f.key}onPress={()=>Te(f.key)}style={[r.subTabPill,B&&r.subTabPillActive]}>
59
- {f.icon(A)}
60
- <I style={[r.subTabPillText,B&&r.subTabPillTextActive]}>
61
- {f.label}
62
- </I>
63
- </Se>})}
64
- </He>
65
- </T>
56
+ <$ style={r.actionBar}>
57
+ <$ style={r.searchBar}>
58
+ <He size={14}color={e.grayTextWeak}/>
59
+ <Xe value={C}onChangeText={re}placeholder={A("device.searchPlaceholder","Search specs, UDID, IP, screen...")}placeholderTextColor={e.grayTextWeak}style={r.searchInput}clearButtonMode="while-editing"/>
60
+ {C.length>0&&<Z onPress={()=>re("")}hitSlop={8}>
61
+ <It size={13}color={e.grayTextWeak}/>
62
+ </Z>}
63
+ </$>
66
64
 
67
-
68
- <T style={r.actionBar}>
69
- <T style={r.searchBar}>
70
- <Ue size={14}color={e.grayTextWeak}/>
71
- <Qe value={v}onChangeText={ee}placeholder="Search specs, UDID, IP, screen..."placeholderTextColor={e.grayTextWeak}style={r.searchInput}clearButtonMode="while-editing"/>
72
- {v.length>0&&<Se onPress={()=>ee("")}hitSlop={8}>
73
- <Bt size={13}color={e.grayTextWeak}/>
74
- </Se>}
75
- </T>
76
-
77
- <Se onPress={qe}style={r.exportButton}hitSlop={6}>
78
- <Vt size={12}color={e.purple}/>
65
+ <Z onPress={_e}style={r.exportButton}hitSlop={6}>
66
+ <At size={12}color={e.purple}/>
79
67
  <I style={r.exportButtonText}>JSON</I>
80
- </Se>
68
+ </Z>
81
69
 
82
- <Se onPress={Xe}style={[r.exportButton,{backgroundColor:`${e.emerald500}14`,borderColor:`${e.emerald500}33`}]}hitSlop={6}>
83
- <Ge size={12}color={e.emerald500}/>
70
+ <Z onPress={Ge}style={[r.exportButton,{backgroundColor:`${e.emerald500}14`,borderColor:`${e.emerald500}33`}]}hitSlop={6}>
71
+ <Se size={12}color={e.emerald500}/>
84
72
  <I style={[r.exportButtonText,{color:e.emerald500}]}>MD</I>
85
- </Se>
86
- </T>
73
+ </Z>
74
+ </$>
75
+
76
+
77
+ <$ style={r.subTabsWrapper}>
78
+ <Ee horizontal showsHorizontalScrollIndicator={!1}contentContainerStyle={r.subTabsContainer}>
79
+ {We.map(f=>{const R=V===f.key,M=f.themeColor||e.purple,B=R?e.white:M;return<Z key={f.key}onPress={()=>fe(f.key)}>
80
+ <$ style={[r.subTabPill,R&&{backgroundColor:M,borderColor:M},!R&&{backgroundColor:`${M}12`,borderColor:`${M}30`}]}>
81
+ {f.icon(B)}
82
+ <I style={[r.subTabPillText,R&&{color:e.white},!R&&{color:e.primaryBlack}]}>
83
+ {f.label}
84
+ </I>
85
+ </$>
86
+ </Z>})}
87
+ </Ee>
88
+ </$>
87
89
 
88
90
 
89
- <He style={r.scrollArea}contentContainerStyle={r.scrollContent}showsVerticalScrollIndicator={!1}>
91
+ <Ee style={r.scrollArea}contentContainerStyle={r.scrollContent}showsVerticalScrollIndicator={!1}>
92
+
93
+ {(!C.trim()||t("UDID Identifier",k)||t("UUID",k)||t("Device UUID",k))&&<$ style={r.featuredUuidCard}>
94
+ <$ style={r.featuredUuidHeader}>
95
+ <$ style={r.featuredUuidTitleRow}>
96
+ <$ style={r.featuredUuidIconWrap}>
97
+ <Oe size={14}color={e.white}/>
98
+ </$>
99
+ <$ style={{flex:1,minWidth:0}}>
100
+ <$ style={{flexDirection:"row",alignItems:"center",gap:6}}>
101
+ <I style={r.featuredUuidLabel}>DEVICE UUID</I>
102
+ <$ style={r.featuredBadge}>
103
+ <I style={r.featuredBadgeText}>FEATURED</I>
104
+ </$>
105
+ </$>
106
+ <I style={r.featuredUuidSubtext}>
107
+ Deterministic hardware pseudo-identifier
108
+ </I>
109
+ </$>
110
+ </$>
111
+
112
+ <Z onPress={()=>{ae(k,"Device UUID"),ie(A("device.copiedUuid","Copied Device UUID to clipboard!"))}}style={r.featuredCopyBtn}hitSlop={6}accessibilityRole="button"accessibilityLabel="Copy Device UUID">
113
+ <Se size={11}color={e.white}/>
114
+ <I style={r.featuredCopyBtnText}>Copy</I>
115
+ </Z>
116
+ </$>
117
+
118
+ <Z onPress={()=>{ae(k,"Device UUID"),ie(A("device.copiedUuid","Copied Device UUID to clipboard!"))}}style={r.featuredUuidValueBox}hitSlop={4}accessibilityRole="button"accessibilityLabel="Tap to copy UUID">
119
+ <I style={r.featuredUuidValueText}numberOfLines={1}ellipsizeMode="middle"selectable>
120
+ {k}
121
+ </I>
122
+ <Se size={12}color={e.brandPurple}/>
123
+ </Z>
124
+ </$>}
125
+
90
126
 
91
- {(!v.trim()||Be)&&<T style={r.heroCard}>
92
- <T style={r.heroHeader}>
93
- <T style={r.heroIconWrap}>
94
- {$.OS==="ios"?<At size={20}color={e.white}/>:<Dt size={20}color={e.white}/>}
95
- </T>
96
- <T style={{flex:1,minWidth:0}}>
127
+ {(!C.trim()||$e)&&<$ style={r.heroCard}>
128
+ <$ style={r.heroHeader}>
129
+ <$ style={r.heroIconWrap}>
130
+ {w.OS==="ios"?<Bt size={20}color={e.white}/>:<Dt size={20}color={e.white}/>}
131
+ </$>
132
+ <$ style={{flex:1,minWidth:0}}>
97
133
  <I style={r.heroTitle}numberOfLines={1}ellipsizeMode="tail">
98
- {w?.deviceModel||$.constants?.Model||($.OS==="ios"?"Apple iPhone":"Android Device")}
134
+ {T?.deviceModel||w.constants?.Model||(w.OS==="ios"?"Apple iPhone":"Android Device")}
99
135
  </I>
100
136
  <I style={r.heroSubtitle}numberOfLines={1}ellipsizeMode="tail">
101
- {$.OS==="ios"?`iOS ${$.Version}`:`Android ${$.Version} (API ${w?.apiLevel||$.Version})`}
137
+ {w.OS==="ios"?`iOS ${w.Version}`:`Android ${w.Version} (API ${T?.apiLevel||w.Version})`}
102
138
  </I>
103
- </T>
104
- <T style={r.heroBadge}>
105
- <T style={r.pulseDot}/>
139
+ </$>
140
+ <$ style={r.heroBadge}>
141
+ <$ style={r.pulseDot}/>
106
142
  <I style={r.heroBadgeText}>LIVE</I>
107
- </T>
108
- </T>
143
+ </$>
144
+ </$>
109
145
 
110
146
 
111
- <T style={r.heroMetricsStrip}>
112
- <T style={r.heroMetricItem}>
113
- <I style={r.heroMetricLabel}numberOfLines={1}ellipsizeMode="tail">IP ADDRESS</I>
147
+ <$ style={r.heroMetricsStrip}>
148
+ <$ style={r.heroMetricItem}>
149
+ <I style={r.heroMetricLabel}numberOfLines={1}ellipsizeMode="tail">{A("device.ipAddress","IP ADDRESS")}</I>
114
150
  <I style={r.heroMetricValue}numberOfLines={1}ellipsizeMode="tail">
115
- {O}
151
+ {H}
116
152
  </I>
117
- </T>
118
- <T style={r.heroMetricDivider}/>
119
- <T style={r.heroMetricItem}>
120
- <I style={r.heroMetricLabel}numberOfLines={1}ellipsizeMode="tail">RAM (USED/TOTAL)</I>
153
+ </$>
154
+ <$ style={r.heroMetricDivider}/>
155
+ <$ style={r.heroMetricItem}>
156
+ <I style={r.heroMetricLabel}numberOfLines={1}ellipsizeMode="tail">{A("device.ramUsedTotal","RAM (USED/TOTAL)")}</I>
121
157
  <I style={r.heroMetricValue}numberOfLines={1}ellipsizeMode="tail">
122
- {G}/{M} MB
158
+ {K.toLocaleString()}/{P.toLocaleString()} MB
123
159
  </I>
124
- </T>
125
- <T style={r.heroMetricDivider}/>
126
- <T style={r.heroMetricItem}>
127
- <I style={r.heroMetricLabel}numberOfLines={1}ellipsizeMode="tail">UPTIME</I>
128
- <I style={r.heroMetricValue}numberOfLines={1}ellipsizeMode="tail">{_}</I>
129
- </T>
130
- </T>
131
- </T>}
160
+ </$>
161
+ <$ style={r.heroMetricDivider}/>
162
+ <$ style={r.heroMetricItem}>
163
+ <I style={r.heroMetricLabel}numberOfLines={1}ellipsizeMode="tail">{A("device.uptime","UPTIME")}</I>
164
+ <I style={r.heroMetricValue}numberOfLines={1}ellipsizeMode="tail">{J}</I>
165
+ </$>
166
+ </$>
167
+ </$>}
132
168
 
133
169
 
134
- {(D==="overview"||v.length>0)&&Me&&<T style={r.sectionCard}>
170
+ {(V==="overview"||C.length>0)&&Te&&<$ style={r.sectionCard}>
135
171
  <I style={r.sectionTitle}>DEVICE OVERVIEW</I>
136
172
  {t("Device Model",o.hardware.model)&&<S label="Device Model"value={o.hardware.model}/>}
137
173
  {t("Manufacturer",o.hardware.brand)&&<S label="Manufacturer / Brand"value={o.hardware.brand}/>}
138
- {t("Operating System",o.hardware.osVersion)&&<S label="Operating System"value={o.hardware.osVersion}badge={{text:$.OS.toUpperCase(),color:e.blue500,bg:`${e.blue500}18`}}/>}
139
- {t("IP Address",O)&&<S label="Local IP Address"value={O}badge={{text:"ONLINE",color:e.emerald500,bg:`${e.emerald500}18`}}/>}
140
- {t("RAM Memory",`${G} MB / ${M} MB (${we}%)`,`Free Memory: ${L} MB`)&&<S label="RAM Memory"value={`${G} MB / ${M} MB (${we}%)`}subtext={`Free Memory: ${L} MB`}/>}
141
- {t("Storage Capacity",`${H} GB Free / ${z} GB Total`)&&<S label="Internal Storage"value={`${H} GB Free / ${z} GB Total`}/>}
174
+ {t("Operating System",o.hardware.osVersion)&&<S label="Operating System"value={o.hardware.osVersion}badge={{text:w.OS.toUpperCase(),color:e.blue500,bg:`${e.blue500}18`}}/>}
175
+ {t("IP Address",H)&&<S label="Local IP Address"value={H}badge={{text:"ONLINE",color:e.emerald500,bg:`${e.emerald500}18`}}/>}
176
+ {t("RAM Memory",`${K.toLocaleString()} MB / ${P.toLocaleString()} MB (${se}%)`,`Free Memory: ${O.toLocaleString()} MB`)&&<S label="RAM Memory"value={`${K.toLocaleString()} MB / ${P.toLocaleString()} MB (${se}%)`}subtext={`Free Memory: ${O.toLocaleString()} MB`}/>}
177
+ {t("Storage Capacity",`${_} GB Free / ${W} GB Total`)&&<S label="Internal Storage"value={`${_} GB Free / ${W} GB Total`}/>}
142
178
  {t("App Version",`v${o.runtime.appVersion} (${o.runtime.appBuild})`)&&<S label="Host App Version"value={`v${o.runtime.appVersion} (${o.runtime.appBuild})`}/>}
143
- {t("JavaScript Engine",P?"Hermes Bytecode Engine":"JavaScriptCore (JSC)")&&<S label="JS Runtime Engine"value={P?"Hermes Bytecode Engine":"JavaScriptCore (JSC)"}badge={P?{text:"HERMES",color:e.purple,bg:`${e.purple}18`}:{text:"JSC",color:e.sky500,bg:`${e.sky500}18`}}/>}
144
- {t("UDID Identifier",N)&&<S label="Pseudo-UDID"value={N}isLast/>}
145
- </T>}
179
+ {t("JavaScript Engine",U?"Hermes Bytecode Engine":"JavaScriptCore (JSC)")&&<S label="JS Runtime Engine"value={U?"Hermes Bytecode Engine":"JavaScriptCore (JSC)"}badge={U?{text:"HERMES",color:e.purple,bg:`${e.purple}18`}:{text:"JSC",color:e.sky500,bg:`${e.sky500}18`}}/>}
180
+ {t("UDID Identifier",k)&&<S label="Pseudo-UDID"value={k}isLast/>}
181
+ </$>}
146
182
 
147
183
 
148
- {(D==="hardware"||v.length>0)&&Ae&&<T style={r.sectionCard}>
184
+ {(V==="hardware"||C.length>0)&&xe&&<$ style={r.sectionCard}>
149
185
  <I style={r.sectionTitle}>HARDWARE & SYSTEM SPECIFICATIONS</I>
150
186
  {t("CPU Architecture",o.hardware.cpuAbi)&&<S label="CPU Architecture / ABI"value={o.hardware.cpuAbi}badge={{text:"64-BIT",color:e.purple,bg:`${e.purple}18`}}/>}
151
- {t("Total RAM",`${M} MB`)&&<S label="Total Physical RAM"value={`${M} MB`}/>}
152
- {t("Free RAM",`${L} MB`)&&<S label="Available Free RAM"value={`${L} MB`}badge={{text:L<500?"LOW":"HEALTHY",color:L<500?e.errorColor:e.emerald500,bg:L<500?`${e.errorColor}18`:`${e.emerald500}18`}}/>}
153
- {t("Storage Capacity",`${z} GB`)&&<S label="Disk Storage Total"value={`${z} GB`}/>}
154
- {t("Available Storage",`${H} GB`)&&<S label="Disk Storage Available"value={`${H} GB`}/>}
155
- {t("Battery",`${w?.batteryPercent??100}%`)&&<S label="Battery Level"value={`${w?.batteryPercent??100}%`}badge={{text:w?.isCharging?"CHARGING":"DISCHARGING",color:w?.isCharging?e.emerald500:e.grayText,bg:w?.isCharging?`${e.emerald500}18`:`${e.grayText}18`}}/>}
156
- {t("API Level",`API ${w?.apiLevel||$.Version}`)&&$.OS==="android"&&<S label="Android API SDK Level"value={`API ${w?.apiLevel||$.Version}`}/>}
187
+ {t("Total RAM",`${P.toLocaleString()} MB`)&&<S label="Total Physical RAM"value={`${P.toLocaleString()} MB`}/>}
188
+ {t("Free RAM",`${O.toLocaleString()} MB`)&&<S label="Available Free RAM"value={`${O.toLocaleString()} MB`}badge={{text:O<500?"LOW":"HEALTHY",color:O<500?e.errorColor:e.emerald500,bg:O<500?`${e.errorColor}18`:`${e.emerald500}18`}}/>}
189
+ {t("Storage Capacity",`${W} GB`)&&<S label="Disk Storage Total"value={`${W} GB`}/>}
190
+ {t("Available Storage",`${_} GB`)&&<S label="Disk Storage Available"value={`${_} GB`}/>}
191
+ {t("Battery",`${T?.batteryPercent??100}%`)&&<S label="Battery Level"value={`${T?.batteryPercent??100}%`}badge={{text:T?.isCharging?"CHARGING":"DISCHARGING",color:T?.isCharging?e.emerald500:e.grayText,bg:T?.isCharging?`${e.emerald500}18`:`${e.grayText}18`}}/>}
192
+ {t("API Level",`API ${T?.apiLevel||w.Version}`)&&w.OS==="android"&&<S label="Android API SDK Level"value={`API ${T?.apiLevel||w.Version}`}/>}
157
193
  {t("Thermal State","Nominal (Cool)")&&<S label="Thermal State"value="Nominal (Cool)"badge={{text:"OPTIMAL",color:e.emerald500,bg:`${e.emerald500}18`}}isLast/>}
158
- </T>}
194
+ </$>}
159
195
 
160
196
 
161
- {(D==="network"||v.length>0)&&De&&<T style={r.sectionCard}>
197
+ {(V==="network"||C.length>0)&&Ie&&<$ style={r.sectionCard}>
162
198
  <I style={r.sectionTitle}>NETWORK & CONNECTIVITY</I>
163
- {t("IP Address",O)&&<S label="Local Device IP"value={O}badge={{text:"IPV4",color:e.blue500,bg:`${e.blue500}18`}}/>}
199
+ {t("IP Address",H)&&<S label="Local Device IP"value={H}badge={{text:"IPV4",color:e.blue500,bg:`${e.blue500}18`}}/>}
164
200
  {t("Internet Reachability","Connected")&&<S label="Internet Reachability"value="Connected"badge={{text:"ONLINE",color:e.emerald500,bg:`${e.emerald500}18`}}/>}
165
201
  {t("Connection Type","Wi-Fi / Local Area Network")&&<S label="Active Connection Type"value="Wi-Fi / Local Area Network"/>}
166
- {t("Metro Dev Server",j?.PlatformConstants?.serverHost||j?.AndroidConstants?.serverHost||"localhost:8081")&&<S label="Metro Packager Host"value={j?.PlatformConstants?.serverHost||j?.AndroidConstants?.serverHost||"localhost:8081"}/>}
202
+ {t("Metro Dev Server",q?.PlatformConstants?.serverHost||q?.AndroidConstants?.serverHost||"localhost:8081")&&<S label="Metro Packager Host"value={q?.PlatformConstants?.serverHost||q?.AndroidConstants?.serverHost||"localhost:8081"}/>}
167
203
  {t("WebSocket Protocol","Active & Enabled")&&<S label="WebSocket (WSS) Support"value="Active & Enabled"/>}
168
204
  {t("Network Inspector Interceptor","Intercepting XHR & Fetch")&&<S label="Network Interceptor Status"value="Intercepting XHR & Fetch"badge={{text:"MONITORING",color:e.purple,bg:`${e.purple}18`}}isLast/>}
169
- </T>}
205
+ </$>}
170
206
 
171
207
 
172
- {(D==="display"||v.length>0)&&Ve&&<T style={r.sectionCard}>
208
+ {(V==="display"||C.length>0)&&Me&&<$ style={r.sectionCard}>
173
209
  <I style={r.sectionTitle}>DISPLAY & SCREEN GEOMETRY</I>
174
- {t("Window Resolution",`${k.width.toFixed(0)} \xD7 ${k.height.toFixed(0)} pt`)&&<S label="Window Logical Size"value={`${k.width.toFixed(0)} \xD7 ${k.height.toFixed(0)} pt`}/>}
175
- {t("Screen Physical Size",`${(R.width*C).toFixed(0)} \xD7 ${(R.height*C).toFixed(0)} px`)&&<S label="Physical Screen Size"value={`${(R.width*C).toFixed(0)} \xD7 ${(R.height*C).toFixed(0)} px`}/>}
176
- {t("Pixel Density",`@${C}x (${Math.round(C*160)} dpi)`)&&<S label="Pixel Ratio (DPI Scale)"value={`@${C}x (${Math.round(C*160)} dpi)`}badge={{text:`@${C}x`,color:e.purple,bg:`${e.purple}18`}}/>}
177
- {t("Font Scale",`${Y}x`)&&<S label="User Font Scale"value={`${Y}x (${Y===1?"Default":Y>1?"Enlarged":"Compact"})`}/>}
178
- {t("Form Factor",W?"Tablet":"Smartphone")&&<S label="Device Form Factor"value={W?"Tablet":"Smartphone"}badge={{text:W?"TABLET":"PHONE",color:W?e.blue500:e.purple,bg:W?`${e.blue500}18`:`${e.purple}18`}}/>}
179
- {t("Orientation",q?"Landscape":"Portrait")&&<S label="Screen Orientation"value={q?"Landscape":"Portrait"}/>}
180
- {t("Status Bar Height",`${X} pt`)&&<S label="Status Bar Inset"value={`${X} pt`}isLast/>}
181
- </T>}
210
+ {t("Window Resolution",`${Math.round(z.width).toLocaleString()} \xD7 ${Math.round(z.height).toLocaleString()} pt`)&&<S label="Window Logical Size"value={`${Math.round(z.width).toLocaleString()} \xD7 ${Math.round(z.height).toLocaleString()} pt`}/>}
211
+ {t("Screen Physical Size",`${Math.round(E.width*L).toLocaleString()} \xD7 ${Math.round(E.height*L).toLocaleString()} px`)&&<S label="Physical Screen Size"value={`${Math.round(E.width*L).toLocaleString()} \xD7 ${Math.round(E.height*L).toLocaleString()} px`}/>}
212
+ {t("Pixel Density",`@${L}x (${Math.round(L*160).toLocaleString()} dpi)`)&&<S label="Pixel Ratio (DPI Scale)"value={`@${L}x (${Math.round(L*160).toLocaleString()} dpi)`}badge={{text:`@${L}x`,color:e.purple,bg:`${e.purple}18`}}/>}
213
+ {t("Font Scale",`${X}x`)&&<S label="User Font Scale"value={`${X}x (${X===1?"Default":X>1?"Enlarged":"Compact"})`}/>}
214
+ {t("Form Factor",j?"Tablet":"Smartphone")&&<S label="Device Form Factor"value={j?"Tablet":"Smartphone"}badge={{text:j?"TABLET":"PHONE",color:j?e.blue500:e.purple,bg:j?`${e.blue500}18`:`${e.purple}18`}}/>}
215
+ {t("Orientation",Q?"Landscape":"Portrait")&&<S label="Screen Orientation"value={Q?"Landscape":"Portrait"}/>}
216
+ {t("Status Bar Height",`${ee} pt`)&&<S label="Status Bar Inset"value={`${ee} pt`}isLast/>}
217
+ </$>}
182
218
 
183
219
 
184
- {(D==="runtime"||v.length>0)&&Re&&<T style={r.sectionCard}>
220
+ {(V==="runtime"||C.length>0)&&Be&&<$ style={r.sectionCard}>
185
221
  <I style={r.sectionTitle}>RUNTIME & APPLICATION</I>
186
222
  {t("App Name",o.runtime.appName)&&<S label="Application Name"value={o.runtime.appName}/>}
187
223
  {t("Bundle ID",o.identifiers.bundleId)&&<S label="Bundle Identifier / Package"value={o.identifiers.bundleId}/>}
188
224
  {t("App Version",`v${o.runtime.appVersion} (${o.runtime.appBuild})`)&&<S label="Application Version"value={`v${o.runtime.appVersion} (${o.runtime.appBuild})`}/>}
189
- {t("React Native",`v${Z}`)&&<S label="React Native Framework"value={`v${Z}`}badge={{text:"RN",color:e.sky500,bg:`${e.sky500}18`}}/>}
190
- {t("In-App Inspector Version",`v${fe}`)&&<S label="In-App Inspector Library"value={`v${fe}`}badge={{text:"LATEST",color:e.purple,bg:`${e.purple}18`}}/>}
191
- {t("Hermes Engine",P?"Enabled (AOT Bytecode)":"Disabled (JSC)")&&<S label="Hermes JavaScript Engine"value={P?"Enabled (AOT Bytecode)":"Disabled (JSC)"}badge={{text:P?"HERMES":"JSC",color:P?e.purple:e.grayText,bg:P?`${e.purple}18`:`${e.grayText}18`}}/>}
192
- {t("New Architecture",U?"Enabled":"Legacy Bridge")&&<S label="Bridgeless TurboModules (New Arch)"value={U?"Enabled":"Legacy Bridge"}badge={{text:U?"NEW ARCH":"LEGACY",color:U?e.emerald500:e.blue500,bg:U?`${e.emerald500}18`:`${e.blue500}18`}}/>}
225
+ {t("React Native",`v${te}`)&&<S label="React Native Framework"value={`v${te}`}badge={{text:"RN",color:e.sky500,bg:`${e.sky500}18`}}/>}
226
+ {t("In-App Inspector Version",`v${le}`)&&<S label="In-App Inspector Library"value={`v${le}`}badge={{text:"LATEST",color:e.purple,bg:`${e.purple}18`}}/>}
227
+ {t("Hermes Engine",U?"Enabled (AOT Bytecode)":"Disabled (JSC)")&&<S label="Hermes JavaScript Engine"value={U?"Enabled (AOT Bytecode)":"Disabled (JSC)"}badge={{text:U?"HERMES":"JSC",color:U?e.purple:e.grayText,bg:U?`${e.purple}18`:`${e.grayText}18`}}/>}
228
+ {t("New Architecture",Y?"Enabled":"Legacy Bridge")&&<S label="Bridgeless TurboModules (New Arch)"value={Y?"Enabled":"Legacy Bridge"}badge={{text:Y?"NEW ARCH":"LEGACY",color:Y?e.emerald500:e.blue500,bg:Y?`${e.emerald500}18`:`${e.blue500}18`}}/>}
193
229
  {t("Build Type",__DEV__?"Debug (__DEV__ = true)":"Release / Production")&&<S label="Build Configuration"value={__DEV__?"Debug (__DEV__ = true)":"Release / Production"}badge={{text:__DEV__?"DEBUG":"RELEASE",color:__DEV__?e.warningIconGold:e.emerald500,bg:__DEV__?`${e.warningIconGold}18`:`${e.emerald500}18`}}/>}
194
230
  {t("Timezone",o.runtime.timezone)&&<S label="System Timezone"value={o.runtime.timezone}/>}
195
231
  {t("Locale",o.runtime.locale)&&<S label="System Language & Locale"value={o.runtime.locale}/>}
196
- {t("Session Uptime",_)&&<S label="Inspector Session Uptime"value={_}isLast/>}
197
- </T>}
232
+ {t("Session Uptime",J)&&<S label="Inspector Session Uptime"value={J}isLast/>}
233
+ </$>}
198
234
 
199
235
 
200
- {(D==="security"||v.length>0)&&Pe&&<T style={r.sectionCard}>
236
+ {(V==="security"||C.length>0)&&De&&<$ style={r.sectionCard}>
201
237
  <I style={r.sectionTitle}>DEVICE IDENTIFIERS & SECURITY</I>
202
- {t("Pseudo-UDID",N)&&<S label="Deterministic Pseudo-UDID"value={N}subtext="Stable hardware signature hash for testing & diagnostics"badge={{text:"PERSISTENT",color:e.purple,bg:`${e.purple}18`}}/>}
238
+ {t("Pseudo-UDID",k)&&<S label="Deterministic Pseudo-UDID"value={k}subtext="Stable hardware signature hash for testing & diagnostics"badge={{text:"PERSISTENT",color:e.purple,bg:`${e.purple}18`}}/>}
203
239
  {t("Bundle ID",o.identifiers.bundleId)&&<S label="Application Bundle ID"value={o.identifiers.bundleId}/>}
204
240
  {t("Root / Jailbreak","Clean (Standard Sandbox)")&&<S label="Root / Jailbreak Heuristic"value="Clean (Standard Sandbox)"badge={{text:"SECURE",color:e.emerald500,bg:`${e.emerald500}18`}}/>}
205
- {t("Simulator / Emulator",$.constants?.Model?.includes?.("sdk")||$.constants?.Model?.includes?.("Emulator")||$.constants?.Model?.includes?.("Simulator")?"Virtual Simulator":"Physical Device")&&<S label="Emulator / Physical Device"value={$.constants?.Model?.includes?.("sdk")||$.constants?.Model?.includes?.("Emulator")||$.constants?.Model?.includes?.("Simulator")?"Virtual Simulator":"Physical Device"}/>}
241
+ {t("Simulator / Emulator",w.constants?.Model?.includes?.("sdk")||w.constants?.Model?.includes?.("Emulator")||w.constants?.Model?.includes?.("Simulator")?"Virtual Simulator":"Physical Device")&&<S label="Emulator / Physical Device"value={w.constants?.Model?.includes?.("sdk")||w.constants?.Model?.includes?.("Emulator")||w.constants?.Model?.includes?.("Simulator")?"Virtual Simulator":"Physical Device"}/>}
206
242
  {t("Sandbox Integrity","Enforced by OS Kernel")&&<S label="App Sandbox File Isolation"value="Enforced by OS Kernel"isLast/>}
207
- </T>}
243
+ </$>}
208
244
 
209
245
 
210
- {v.trim().length>0&&!Ze&&<T style={r.emptySearchCard}>
211
- <Ue size={26}color={e.grayTextWeak}/>
246
+ {C.trim().length>0&&!Je&&<$ style={r.emptySearchCard}>
247
+ <He size={26}color={e.grayTextWeak}/>
212
248
  <I style={r.emptySearchTitle}>No matching device specifications</I>
213
249
  <I style={r.emptySearchSubtitle}>
214
- No properties matched &ldquo;{v}&rdquo;
250
+ No properties matched &ldquo;{C}&rdquo;
215
251
  </I>
216
- <Se onPress={()=>ee("")}style={r.clearSearchBtn}>
252
+ <Z onPress={()=>re("")}style={r.clearSearchBtn}>
217
253
  <I style={r.clearSearchBtnText}>Clear Search</I>
218
- </Se>
219
- </T>}
254
+ </Z>
255
+ </$>}
220
256
 
221
- <T style={{height:48}}/>
222
- </He>
223
- </T>});const r=tt.create({container:{flex:1,backgroundColor:e.grayBackground},subTabsWrapper:{backgroundColor:e.primaryLight,borderBottomWidth:1,borderBottomColor:e.dividerColor,paddingVertical:8},subTabsContainer:{paddingHorizontal:12,flexDirection:"row",alignItems:"center",gap:6},subTabPill:{flexDirection:"row",alignItems:"center",gap:5,paddingHorizontal:10,paddingVertical:5.5,borderRadius:8,backgroundColor:e.grayBackground,borderWidth:1,borderColor:e.grayBorderSecondary},subTabPillActive:{backgroundColor:e.purple,borderColor:e.purple},subTabPillText:{fontFamily:E.interBold,fontSize:11,color:e.grayText},subTabPillTextActive:{color:e.white},actionBar:{flexDirection:"row",alignItems:"center",paddingHorizontal:12,paddingVertical:8,backgroundColor:e.primaryLight,borderBottomWidth:1,borderBottomColor:e.dividerColor,gap:8},searchBar:{flex:1,flexDirection:"row",alignItems:"center",backgroundColor:e.grayBackground,borderRadius:8,paddingHorizontal:9,paddingVertical:$.OS==="ios"?6:2,borderWidth:1,borderColor:e.grayBorderSecondary,gap:6},searchInput:{flex:1,fontFamily:E.interMedium,fontSize:12,color:e.primaryBlack,padding:0},exportButton:{flexDirection:"row",alignItems:"center",gap:4,paddingHorizontal:9,paddingVertical:6,borderRadius:8,backgroundColor:`${e.purple}14`,borderWidth:1,borderColor:`${e.purple}33`},exportButtonText:{fontFamily:E.interBold,fontSize:11,color:e.purple},scrollArea:{flex:1},scrollContent:{padding:12,gap:12,paddingBottom:100},heroCard:{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:14,shadowColor:e.black,shadowOpacity:.04,shadowRadius:4,shadowOffset:{width:0,height:2},elevation:1,gap:12},heroHeader:{flexDirection:"row",alignItems:"center",gap:10},heroIconWrap:{width:38,height:38,borderRadius:10,backgroundColor:e.purple,alignItems:"center",justifyContent:"center",shadowColor:e.purple,shadowOpacity:.25,shadowRadius:4,shadowOffset:{width:0,height:2},elevation:2},heroTitle:{fontFamily:E.interBold,fontSize:15,color:e.primaryBlack,letterSpacing:-.2},heroSubtitle:{fontFamily:E.interRegular,fontSize:11.5,color:e.grayText,marginTop:1},heroBadge:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:`${e.emerald500}18`,paddingHorizontal:7,paddingVertical:3,borderRadius:6},pulseDot:{width:6,height:6,borderRadius:3,backgroundColor:e.emerald500},heroBadgeText:{fontFamily:E.interBold,fontSize:9.5,color:e.emerald500},heroMetricsStrip:{flexDirection:"row",alignItems:"center",backgroundColor:e.grayBackground,borderRadius:10,paddingVertical:8,paddingHorizontal:10},heroMetricItem:{flex:1,alignItems:"center",paddingHorizontal:2,minWidth:0},heroMetricLabel:{fontFamily:E.interBold,fontSize:8.5,color:e.grayTextWeak,letterSpacing:.4},heroMetricValue:{fontFamily:E.interBold,fontSize:11,color:e.primaryBlack,marginTop:2},heroMetricDivider:{width:1,height:20,backgroundColor:e.dividerColor},sectionCard:{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:14,shadowColor:e.black,shadowOpacity:.03,shadowRadius:3,shadowOffset:{width:0,height:1},elevation:1},sectionTitle:{fontFamily:E.interBold,fontSize:10.5,color:e.grayTextWeak,letterSpacing:.8,marginBottom:8,textTransform:"uppercase"},infoRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingVertical:9,borderBottomWidth:1,borderBottomColor:e.dividerColor},infoLabel:{fontFamily:E.interMedium,fontSize:12.5,color:e.primaryBlack},infoSubtext:{fontFamily:E.interRegular,fontSize:10,color:e.grayTextWeak,marginTop:1},infoBadge:{paddingHorizontal:5,paddingVertical:1,borderRadius:4,borderWidth:1},infoBadgeText:{fontFamily:E.interBold,fontSize:8.5},infoValue:{fontFamily:E.interBold,fontSize:12,color:e.primaryBlack,flexShrink:1,textAlign:"right"},rowCopyBtn:{padding:4,borderRadius:4,backgroundColor:e.grayBackground},emptySearchCard:{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:24,alignItems:"center",justifyContent:"center",gap:8,marginTop:8},emptySearchTitle:{fontFamily:E.interBold,fontSize:13.5,color:e.primaryBlack,textAlign:"center"},emptySearchSubtitle:{fontFamily:E.interRegular,fontSize:11.5,color:e.grayTextWeak,textAlign:"center"},clearSearchBtn:{marginTop:6,paddingHorizontal:14,paddingVertical:6.5,borderRadius:8,backgroundColor:e.purple},clearSearchBtnText:{fontFamily:E.interBold,fontSize:11,color:e.white}});export default DeviceInfoTab;
257
+ <$ style={{height:48}}/>
258
+ </Ee>
259
+ </$>});const r=Qe.create({container:{flex:1,backgroundColor:e.grayBackground},subTabsWrapper:{backgroundColor:e.primaryLight,borderBottomWidth:1,borderBottomColor:e.dividerColor,paddingVertical:6},subTabsContainer:{paddingHorizontal:12,flexDirection:"row",alignItems:"center",gap:6},subTabPill:{flexDirection:"row",alignItems:"center",gap:5,paddingHorizontal:9,paddingVertical:4.5,borderRadius:8,borderWidth:1},subTabPillText:{fontFamily:D.interBold,fontSize:10.5},featuredUuidCard:{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1.5,borderColor:`${e.brandPurple}40`,padding:12,gap:10,shadowColor:e.brandPurple,shadowOpacity:.08,shadowRadius:6,shadowOffset:{width:0,height:2},elevation:2},featuredUuidHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:8},featuredUuidTitleRow:{flexDirection:"row",alignItems:"center",gap:8,flex:1,minWidth:0},featuredUuidIconWrap:{width:28,height:28,borderRadius:7,backgroundColor:e.brandPurple,alignItems:"center",justifyContent:"center"},featuredUuidLabel:{fontFamily:D.interBold,fontSize:11,color:e.primaryBlack,letterSpacing:.3},featuredUuidSubtext:{fontFamily:D.interRegular,fontSize:9.5,color:e.grayTextWeak,marginTop:.5},featuredBadge:{backgroundColor:`${e.brandPurple}18`,paddingHorizontal:5,paddingVertical:1.5,borderRadius:4,borderWidth:1,borderColor:`${e.brandPurple}30`},featuredBadgeText:{fontFamily:D.interBold,fontSize:8,color:e.brandPurple,letterSpacing:.4},featuredCopyBtn:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:e.brandPurple,paddingHorizontal:10,paddingVertical:5.5,borderRadius:7,shadowColor:e.brandPurple,shadowOpacity:.25,shadowRadius:3,shadowOffset:{width:0,height:1},elevation:1},featuredCopyBtnText:{fontFamily:D.interBold,fontSize:10.5,color:e.white},featuredUuidValueBox:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:`${e.brandPurple}0C`,borderRadius:8,borderWidth:1,borderColor:`${e.brandPurple}28`,paddingHorizontal:10,paddingVertical:7,gap:8},featuredUuidValueText:{flex:1,fontFamily:w.select({ios:"Menlo",android:"monospace",default:"monospace"}),fontSize:11.5,color:e.brandPurple,letterSpacing:.5},actionBar:{flexDirection:"row",alignItems:"center",paddingHorizontal:12,paddingVertical:8,backgroundColor:e.primaryLight,borderBottomWidth:1,borderBottomColor:e.dividerColor,gap:8},searchBar:{flex:1,flexDirection:"row",alignItems:"center",backgroundColor:e.grayBackground,borderRadius:8,paddingHorizontal:9,paddingVertical:w.OS==="ios"?6:2,borderWidth:1,borderColor:e.grayBorderSecondary,gap:6},searchInput:{flex:1,fontFamily:D.interMedium,fontSize:12,color:e.primaryBlack,padding:0},exportButton:{flexDirection:"row",alignItems:"center",gap:4,paddingHorizontal:9,paddingVertical:6,borderRadius:8,backgroundColor:`${e.purple}14`,borderWidth:1,borderColor:`${e.purple}33`},exportButtonText:{fontFamily:D.interBold,fontSize:11,color:e.purple},scrollArea:{flex:1},scrollContent:{padding:12,gap:12,paddingBottom:100},heroCard:{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:14,shadowColor:e.black,shadowOpacity:.04,shadowRadius:4,shadowOffset:{width:0,height:2},elevation:1,gap:12},heroHeader:{flexDirection:"row",alignItems:"center",gap:10},heroIconWrap:{width:38,height:38,borderRadius:10,backgroundColor:e.purple,alignItems:"center",justifyContent:"center",shadowColor:e.purple,shadowOpacity:.25,shadowRadius:4,shadowOffset:{width:0,height:2},elevation:2},heroTitle:{fontFamily:D.interBold,fontSize:15,color:e.primaryBlack,letterSpacing:-.2},heroSubtitle:{fontFamily:D.interRegular,fontSize:11.5,color:e.grayText,marginTop:1},heroBadge:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:`${e.emerald500}18`,paddingHorizontal:7,paddingVertical:3,borderRadius:6},pulseDot:{width:6,height:6,borderRadius:3,backgroundColor:e.emerald500},heroBadgeText:{fontFamily:D.interBold,fontSize:9.5,color:e.emerald500},heroMetricsStrip:{flexDirection:"row",alignItems:"center",backgroundColor:e.grayBackground,borderRadius:10,paddingVertical:8,paddingHorizontal:10},heroMetricItem:{flex:1,alignItems:"center",paddingHorizontal:2,minWidth:0},heroMetricLabel:{fontFamily:D.interBold,fontSize:8.5,color:e.grayTextWeak,letterSpacing:.4},heroMetricValue:{fontFamily:D.interBold,fontSize:11,color:e.primaryBlack,marginTop:2},heroMetricDivider:{width:1,height:20,backgroundColor:e.dividerColor},sectionCard:{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:14,shadowColor:e.black,shadowOpacity:.03,shadowRadius:3,shadowOffset:{width:0,height:1},elevation:1},sectionTitle:{fontFamily:D.interBold,fontSize:10.5,color:e.grayTextWeak,letterSpacing:.8,marginBottom:8,textTransform:"uppercase"},infoRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingVertical:9,borderBottomWidth:1,borderBottomColor:e.dividerColor},infoLabel:{fontFamily:D.interMedium,fontSize:12.5,color:e.primaryBlack},infoSubtext:{fontFamily:D.interRegular,fontSize:10,color:e.grayTextWeak,marginTop:1},infoBadge:{paddingHorizontal:5,paddingVertical:1,borderRadius:4,borderWidth:1},infoBadgeText:{fontFamily:D.interBold,fontSize:8.5},infoValue:{fontFamily:D.interBold,fontSize:12,color:e.primaryBlack,flexShrink:1,textAlign:"right"},rowCopyBtn:{padding:4,borderRadius:4,backgroundColor:e.grayBackground},emptySearchCard:{backgroundColor:e.primaryLight,borderRadius:14,borderWidth:1,borderColor:e.grayBorderSecondary,padding:24,alignItems:"center",justifyContent:"center",gap:8,marginTop:8},emptySearchTitle:{fontFamily:D.interBold,fontSize:13.5,color:e.primaryBlack,textAlign:"center"},emptySearchSubtitle:{fontFamily:D.interRegular,fontSize:11.5,color:e.grayTextWeak,textAlign:"center"},clearSearchBtn:{marginTop:6,paddingHorizontal:14,paddingVertical:6.5,borderRadius:8,backgroundColor:e.purple},clearSearchBtnText:{fontFamily:D.interBold,fontSize:11,color:e.white}});export default DeviceInfoTab;