react-native-inapp-inspector 2.4.1 → 2.5.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 (295) hide show
  1. package/README.ar.md +163 -0
  2. package/README.de.md +163 -0
  3. package/README.es.md +164 -0
  4. package/README.fr.md +163 -0
  5. package/README.hi.md +163 -0
  6. package/README.ja.md +180 -0
  7. package/README.ko.md +163 -0
  8. package/README.md +340 -243
  9. package/README.pt-BR.md +163 -0
  10. package/README.ru.md +163 -0
  11. package/README.zh-CN.md +387 -0
  12. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +605 -23
  13. package/assets/banner_dark.svg +186 -0
  14. package/assets/banner_light.svg +186 -0
  15. package/assets/icon_circle.svg +148 -0
  16. package/assets/icon_square.svg +369 -0
  17. package/assets/inapp_inspector_icon.gif +0 -0
  18. package/assets/inapp_inspector_icon_original.gif +0 -0
  19. package/assets/social_preview.png +0 -0
  20. package/assets/walkthrough.gif +0 -0
  21. package/dist/commonjs/capture.d.ts +2 -0
  22. package/dist/commonjs/capture.js +1 -1
  23. package/dist/commonjs/components/AnalyticsDetail.js +23 -23
  24. package/dist/commonjs/components/AnalyticsEventCard.js +1 -1
  25. package/dist/commonjs/components/AnalyticsGraph.js +44 -44
  26. package/dist/commonjs/components/AnimatedBrandOwl.d.ts +7 -0
  27. package/dist/commonjs/components/AnimatedBrandOwl.js +175 -0
  28. package/dist/commonjs/components/AppHeaderLogo.d.ts +1 -0
  29. package/dist/commonjs/components/AppHeaderLogo.js +5 -3
  30. package/dist/commonjs/components/BrandCircleIcon.js +28 -28
  31. package/dist/commonjs/components/BrandSquareIcon.d.ts +5 -0
  32. package/dist/commonjs/components/BrandSquareIcon.js +139 -0
  33. package/dist/commonjs/components/ConsoleLogCard.d.ts +2 -1
  34. package/dist/commonjs/components/ConsoleLogCard.js +23 -39
  35. package/dist/commonjs/components/Inspector/AboutModal.js +44 -54
  36. package/dist/commonjs/components/Inspector/AnalyticsTab.js +6 -6
  37. package/dist/commonjs/components/Inspector/ConfirmationModal.d.ts +13 -0
  38. package/dist/commonjs/components/Inspector/ConfirmationModal.js +30 -0
  39. package/dist/commonjs/components/Inspector/ConsoleTab.js +12 -12
  40. package/dist/commonjs/components/Inspector/CrashTab.js +44 -9
  41. package/dist/commonjs/components/Inspector/DebuggingTab.js +17 -17
  42. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +1 -1
  43. package/dist/commonjs/components/Inspector/FabLauncher.js +30 -33
  44. package/dist/commonjs/components/Inspector/FeatureUnderDevNotice.js +2 -2
  45. package/dist/commonjs/components/Inspector/FloatingCaptureWidget.d.ts +3 -0
  46. package/dist/commonjs/components/Inspector/FloatingCaptureWidget.js +54 -0
  47. package/dist/commonjs/components/Inspector/GlobalCrashScreenModal.d.ts +11 -0
  48. package/dist/commonjs/components/Inspector/GlobalCrashScreenModal.js +234 -0
  49. package/dist/commonjs/components/Inspector/InspectorHeader.js +137 -127
  50. package/dist/commonjs/components/Inspector/LanguageSelectorModal.d.ts +15 -0
  51. package/dist/commonjs/components/Inspector/LanguageSelectorModal.js +172 -0
  52. package/dist/commonjs/components/Inspector/MainScreen.js +55 -35
  53. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +40 -35
  54. package/dist/commonjs/components/Inspector/MediaPreviewModal.d.ts +36 -0
  55. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +341 -135
  56. package/dist/commonjs/components/Inspector/NetworkTab.js +50 -50
  57. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +1 -1
  58. package/dist/commonjs/components/Inspector/PushCard.d.ts +3 -2
  59. package/dist/commonjs/components/Inspector/PushCard.js +5 -4
  60. package/dist/commonjs/components/Inspector/PushDetail.js +41 -32
  61. package/dist/commonjs/components/Inspector/PushTab.js +12 -12
  62. package/dist/commonjs/components/Inspector/ReduxDetail.js +32 -32
  63. package/dist/commonjs/components/Inspector/ReduxTab.js +10 -8
  64. package/dist/commonjs/components/Inspector/SecondaryTelemetryStrip.d.ts +2 -0
  65. package/dist/commonjs/components/Inspector/SecondaryTelemetryStrip.js +43 -0
  66. package/dist/commonjs/components/Inspector/SettingsPanel.js +287 -139
  67. package/dist/commonjs/components/Inspector/SocketCard.d.ts +5 -0
  68. package/dist/commonjs/components/Inspector/SocketCard.js +116 -0
  69. package/dist/commonjs/components/Inspector/SocketDetail.d.ts +4 -0
  70. package/dist/commonjs/components/Inspector/SocketDetail.js +327 -0
  71. package/dist/commonjs/components/Inspector/SocketFilterModal.d.ts +13 -0
  72. package/dist/commonjs/components/Inspector/SocketFilterModal.js +69 -0
  73. package/dist/commonjs/components/Inspector/SocketTab.d.ts +3 -0
  74. package/dist/commonjs/components/Inspector/SocketTab.js +112 -0
  75. package/dist/commonjs/components/Inspector/StorageTab.js +39 -37
  76. package/dist/commonjs/components/Inspector/SupportModal.d.ts +7 -0
  77. package/dist/commonjs/components/Inspector/SupportModal.js +125 -0
  78. package/dist/commonjs/components/Inspector/SupportPage.d.ts +5 -0
  79. package/dist/commonjs/components/Inspector/SupportPage.js +227 -0
  80. package/dist/commonjs/components/Inspector/TabBar.js +24 -23
  81. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +24 -24
  82. package/dist/commonjs/components/JsonViewer.js +50 -48
  83. package/dist/commonjs/components/LogCard.d.ts +3 -2
  84. package/dist/commonjs/components/LogCard.js +27 -25
  85. package/dist/commonjs/components/LogSyntaxHighlighter.js +5 -5
  86. package/dist/commonjs/components/ModuleErrorBoundary.js +5 -5
  87. package/dist/commonjs/components/NetworkIcons.d.ts +42 -0
  88. package/dist/commonjs/components/NetworkIcons.js +139 -6
  89. package/dist/commonjs/components/SegmentedTabs.js +1 -1
  90. package/dist/commonjs/constants/version.d.ts +1 -1
  91. package/dist/commonjs/constants/version.js +1 -1
  92. package/dist/commonjs/crash.d.ts +1 -1
  93. package/dist/commonjs/crash.js +1 -1
  94. package/dist/commonjs/customHooks/crashHandler.d.ts +2 -1
  95. package/dist/commonjs/customHooks/crashHandler.js +7 -7
  96. package/dist/commonjs/customHooks/socketLogger.d.ts +26 -0
  97. package/dist/commonjs/customHooks/socketLogger.js +2 -0
  98. package/dist/commonjs/editor.d.ts +13 -0
  99. package/dist/commonjs/editor.js +1 -0
  100. package/dist/commonjs/helpers/index.d.ts +1 -0
  101. package/dist/commonjs/helpers/index.js +3 -3
  102. package/dist/commonjs/helpers/memoryManager.d.ts +1 -0
  103. package/dist/commonjs/helpers/memoryManager.js +1 -1
  104. package/dist/commonjs/helpers/searchQueryParser.d.ts +1 -1
  105. package/dist/commonjs/helpers/searchQueryParser.js +5 -1
  106. package/dist/commonjs/helpers/settingsStore.d.ts +1 -0
  107. package/dist/commonjs/helpers/settingsStore.js +1 -1
  108. package/dist/commonjs/helpers/shareFormatter.d.ts +3 -1
  109. package/dist/commonjs/helpers/shareFormatter.js +8 -7
  110. package/dist/commonjs/helpers/telemetry.js +1 -1
  111. package/dist/commonjs/i18n/index.d.ts +99 -1
  112. package/dist/commonjs/i18n/index.js +1 -1
  113. package/dist/commonjs/i18n/locales/ar.json +1 -1
  114. package/dist/commonjs/i18n/locales/bn.json +1 -0
  115. package/dist/commonjs/i18n/locales/de.json +1 -1
  116. package/dist/commonjs/i18n/locales/en.json +1 -1
  117. package/dist/commonjs/i18n/locales/es.json +1 -1
  118. package/dist/commonjs/i18n/locales/fr.json +1 -1
  119. package/dist/commonjs/i18n/locales/gu.json +1 -0
  120. package/dist/commonjs/i18n/locales/hi.json +1 -1
  121. package/dist/commonjs/i18n/locales/id.json +1 -0
  122. package/dist/commonjs/i18n/locales/it.json +1 -0
  123. package/dist/commonjs/i18n/locales/ja.json +1 -1
  124. package/dist/commonjs/i18n/locales/kn.json +1 -0
  125. package/dist/commonjs/i18n/locales/ko.json +1 -1
  126. package/dist/commonjs/i18n/locales/ml.json +1 -0
  127. package/dist/commonjs/i18n/locales/mr.json +1 -0
  128. package/dist/commonjs/i18n/locales/nl.json +1 -0
  129. package/dist/commonjs/i18n/locales/pa.json +1 -0
  130. package/dist/commonjs/i18n/locales/pl.json +1 -0
  131. package/dist/commonjs/i18n/locales/pt.json +1 -1
  132. package/dist/commonjs/i18n/locales/ru.json +1 -1
  133. package/dist/commonjs/i18n/locales/ta.json +1 -0
  134. package/dist/commonjs/i18n/locales/te.json +1 -0
  135. package/dist/commonjs/i18n/locales/tr.json +1 -0
  136. package/dist/commonjs/i18n/locales/vi.json +1 -0
  137. package/dist/commonjs/i18n/locales/zh.json +1 -1
  138. package/dist/commonjs/index.d.ts +16 -13
  139. package/dist/commonjs/index.js +5 -4
  140. package/dist/commonjs/native/NativeInspector.d.ts +4 -0
  141. package/dist/commonjs/native/NativeInspector.js +1 -1
  142. package/dist/commonjs/native/NativeNetworkInspector.d.ts +4 -0
  143. package/dist/commonjs/socket.d.ts +4 -0
  144. package/dist/commonjs/socket.js +1 -0
  145. package/dist/commonjs/styles/AppColors.d.ts +42 -2
  146. package/dist/commonjs/styles/AppColors.js +1 -1
  147. package/dist/commonjs/styles/common.js +1 -1
  148. package/dist/commonjs/styles/index.d.ts +30 -0
  149. package/dist/commonjs/styles/index.js +1 -1
  150. package/dist/commonjs/types/editor.d.ts +96 -0
  151. package/dist/commonjs/types/editor.js +1 -0
  152. package/dist/commonjs/types/enums.d.ts +40 -0
  153. package/dist/commonjs/types/enums.js +1 -1
  154. package/dist/commonjs/types/interfaces.d.ts +143 -1
  155. package/dist/esm/capture.d.ts +2 -0
  156. package/dist/esm/capture.js +1 -1
  157. package/dist/esm/components/AnalyticsDetail.js +31 -31
  158. package/dist/esm/components/AnalyticsEventCard.js +1 -1
  159. package/dist/esm/components/AnalyticsGraph.js +74 -74
  160. package/dist/esm/components/AnimatedBrandOwl.d.ts +7 -0
  161. package/dist/esm/components/AnimatedBrandOwl.js +175 -0
  162. package/dist/esm/components/AppHeaderLogo.d.ts +1 -0
  163. package/dist/esm/components/AppHeaderLogo.js +7 -5
  164. package/dist/esm/components/BrandCircleIcon.js +70 -70
  165. package/dist/esm/components/BrandSquareIcon.d.ts +5 -0
  166. package/dist/esm/components/BrandSquareIcon.js +139 -0
  167. package/dist/esm/components/ConsoleLogCard.d.ts +2 -1
  168. package/dist/esm/components/ConsoleLogCard.js +61 -77
  169. package/dist/esm/components/Inspector/AboutModal.js +85 -95
  170. package/dist/esm/components/Inspector/AnalyticsTab.js +24 -24
  171. package/dist/esm/components/Inspector/ConfirmationModal.d.ts +13 -0
  172. package/dist/esm/components/Inspector/ConfirmationModal.js +30 -0
  173. package/dist/esm/components/Inspector/ConsoleTab.js +48 -48
  174. package/dist/esm/components/Inspector/CrashTab.js +203 -168
  175. package/dist/esm/components/Inspector/DebuggingTab.js +29 -29
  176. package/dist/esm/components/Inspector/DeviceInfoTab.js +75 -75
  177. package/dist/esm/components/Inspector/FabLauncher.js +57 -60
  178. package/dist/esm/components/Inspector/FeatureUnderDevNotice.js +7 -7
  179. package/dist/esm/components/Inspector/FloatingCaptureWidget.d.ts +3 -0
  180. package/dist/esm/components/Inspector/FloatingCaptureWidget.js +54 -0
  181. package/dist/esm/components/Inspector/GlobalCrashScreenModal.d.ts +11 -0
  182. package/dist/esm/components/Inspector/GlobalCrashScreenModal.js +234 -0
  183. package/dist/esm/components/Inspector/InspectorHeader.js +162 -152
  184. package/dist/esm/components/Inspector/LanguageSelectorModal.d.ts +15 -0
  185. package/dist/esm/components/Inspector/LanguageSelectorModal.js +172 -0
  186. package/dist/esm/components/Inspector/MainScreen.js +130 -110
  187. package/dist/esm/components/Inspector/MediaGalleryTab.js +83 -78
  188. package/dist/esm/components/Inspector/MediaPreviewModal.d.ts +36 -0
  189. package/dist/esm/components/Inspector/MediaPreviewModal.js +345 -139
  190. package/dist/esm/components/Inspector/NetworkTab.js +130 -130
  191. package/dist/esm/components/Inspector/NpmUpdateToast.js +1 -1
  192. package/dist/esm/components/Inspector/PushCard.d.ts +3 -2
  193. package/dist/esm/components/Inspector/PushCard.js +23 -22
  194. package/dist/esm/components/Inspector/PushDetail.js +45 -36
  195. package/dist/esm/components/Inspector/PushTab.js +23 -23
  196. package/dist/esm/components/Inspector/ReduxDetail.js +42 -42
  197. package/dist/esm/components/Inspector/ReduxTab.js +20 -18
  198. package/dist/esm/components/Inspector/SecondaryTelemetryStrip.d.ts +2 -0
  199. package/dist/esm/components/Inspector/SecondaryTelemetryStrip.js +43 -0
  200. package/dist/esm/components/Inspector/SettingsPanel.js +526 -378
  201. package/dist/esm/components/Inspector/SocketCard.d.ts +5 -0
  202. package/dist/esm/components/Inspector/SocketCard.js +116 -0
  203. package/dist/esm/components/Inspector/SocketDetail.d.ts +4 -0
  204. package/dist/esm/components/Inspector/SocketDetail.js +327 -0
  205. package/dist/esm/components/Inspector/SocketFilterModal.d.ts +13 -0
  206. package/dist/esm/components/Inspector/SocketFilterModal.js +69 -0
  207. package/dist/esm/components/Inspector/SocketTab.d.ts +3 -0
  208. package/dist/esm/components/Inspector/SocketTab.js +112 -0
  209. package/dist/esm/components/Inspector/StorageTab.js +139 -137
  210. package/dist/esm/components/Inspector/SupportModal.d.ts +7 -0
  211. package/dist/esm/components/Inspector/SupportModal.js +125 -0
  212. package/dist/esm/components/Inspector/SupportPage.d.ts +5 -0
  213. package/dist/esm/components/Inspector/SupportPage.js +227 -0
  214. package/dist/esm/components/Inspector/TabBar.js +36 -35
  215. package/dist/esm/components/Inspector/UpdateAvailableModal.js +22 -22
  216. package/dist/esm/components/JsonViewer.js +66 -64
  217. package/dist/esm/components/LogCard.d.ts +3 -2
  218. package/dist/esm/components/LogCard.js +57 -55
  219. package/dist/esm/components/LogSyntaxHighlighter.js +5 -5
  220. package/dist/esm/components/ModuleErrorBoundary.js +23 -23
  221. package/dist/esm/components/NetworkIcons.d.ts +42 -0
  222. package/dist/esm/components/NetworkIcons.js +139 -6
  223. package/dist/esm/components/SegmentedTabs.js +7 -7
  224. package/dist/esm/constants/version.d.ts +1 -1
  225. package/dist/esm/constants/version.js +1 -1
  226. package/dist/esm/crash.d.ts +1 -1
  227. package/dist/esm/crash.js +1 -1
  228. package/dist/esm/customHooks/crashHandler.d.ts +2 -1
  229. package/dist/esm/customHooks/crashHandler.js +7 -7
  230. package/dist/esm/customHooks/socketLogger.d.ts +26 -0
  231. package/dist/esm/customHooks/socketLogger.js +2 -0
  232. package/dist/esm/editor.d.ts +13 -0
  233. package/dist/esm/editor.js +1 -0
  234. package/dist/esm/helpers/index.d.ts +1 -0
  235. package/dist/esm/helpers/index.js +4 -4
  236. package/dist/esm/helpers/memoryManager.d.ts +1 -0
  237. package/dist/esm/helpers/memoryManager.js +1 -1
  238. package/dist/esm/helpers/searchQueryParser.d.ts +1 -1
  239. package/dist/esm/helpers/searchQueryParser.js +5 -1
  240. package/dist/esm/helpers/settingsStore.d.ts +1 -0
  241. package/dist/esm/helpers/settingsStore.js +1 -1
  242. package/dist/esm/helpers/shareFormatter.d.ts +3 -1
  243. package/dist/esm/helpers/shareFormatter.js +8 -7
  244. package/dist/esm/helpers/telemetry.js +1 -1
  245. package/dist/esm/i18n/index.d.ts +99 -1
  246. package/dist/esm/i18n/index.js +1 -1
  247. package/dist/esm/i18n/locales/ar.json +1 -1
  248. package/dist/esm/i18n/locales/bn.json +1 -0
  249. package/dist/esm/i18n/locales/de.json +1 -1
  250. package/dist/esm/i18n/locales/en.json +1 -1
  251. package/dist/esm/i18n/locales/es.json +1 -1
  252. package/dist/esm/i18n/locales/fr.json +1 -1
  253. package/dist/esm/i18n/locales/gu.json +1 -0
  254. package/dist/esm/i18n/locales/hi.json +1 -1
  255. package/dist/esm/i18n/locales/id.json +1 -0
  256. package/dist/esm/i18n/locales/it.json +1 -0
  257. package/dist/esm/i18n/locales/ja.json +1 -1
  258. package/dist/esm/i18n/locales/kn.json +1 -0
  259. package/dist/esm/i18n/locales/ko.json +1 -1
  260. package/dist/esm/i18n/locales/ml.json +1 -0
  261. package/dist/esm/i18n/locales/mr.json +1 -0
  262. package/dist/esm/i18n/locales/nl.json +1 -0
  263. package/dist/esm/i18n/locales/pa.json +1 -0
  264. package/dist/esm/i18n/locales/pl.json +1 -0
  265. package/dist/esm/i18n/locales/pt.json +1 -1
  266. package/dist/esm/i18n/locales/ru.json +1 -1
  267. package/dist/esm/i18n/locales/ta.json +1 -0
  268. package/dist/esm/i18n/locales/te.json +1 -0
  269. package/dist/esm/i18n/locales/tr.json +1 -0
  270. package/dist/esm/i18n/locales/vi.json +1 -0
  271. package/dist/esm/i18n/locales/zh.json +1 -1
  272. package/dist/esm/index.d.ts +16 -13
  273. package/dist/esm/index.js +8 -7
  274. package/dist/esm/native/NativeInspector.d.ts +4 -0
  275. package/dist/esm/native/NativeInspector.js +1 -1
  276. package/dist/esm/native/NativeNetworkInspector.d.ts +4 -0
  277. package/dist/esm/socket.d.ts +4 -0
  278. package/dist/esm/socket.js +1 -0
  279. package/dist/esm/styles/AppColors.d.ts +42 -2
  280. package/dist/esm/styles/AppColors.js +1 -1
  281. package/dist/esm/styles/common.js +1 -1
  282. package/dist/esm/styles/index.d.ts +30 -0
  283. package/dist/esm/styles/index.js +1 -1
  284. package/dist/esm/types/editor.d.ts +96 -0
  285. package/dist/esm/types/editor.js +1 -0
  286. package/dist/esm/types/enums.d.ts +40 -0
  287. package/dist/esm/types/enums.js +1 -1
  288. package/dist/esm/types/interfaces.d.ts +143 -1
  289. package/editor.d.ts +1 -0
  290. package/editor.js +1 -0
  291. package/ios/NetworkInspectorModule.mm +531 -12
  292. package/package.json +213 -2
  293. package/react-native-inapp-inspector.podspec +1 -1
  294. package/src/native/NativeInspector.ts +65 -4
  295. package/src/native/NativeNetworkInspector.ts +4 -0
@@ -1,11 +1,11 @@
1
- import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}from"react";import{View as T,Text as C,ScrollView as Te,StyleSheet as Pe,NativeModules as He,TouchableOpacity as G,ActivityIndicator as Ce,Animated as Z}from"react-native";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as B}from"../../styles/AppFonts";import $e from"../QRCodeView";import Se from"../TouchableScale";import{showToast as J}from"../../helpers/toast";import{triggerNativeHaptic as P}from"../../native/NativeInspector";import{InfoCircleIcon as Ne,CheckIcon as Be,BoltIcon as Re,CircleXIcon as Ie,SparkleIcon as Ee,AndroidIcon as Ge,RepeatIcon as Ue,WrenchIcon as _e}from"../NetworkIcons";import Ke,{Path as Qe}from"react-native-svg";const Xe=({color:I=e.purple,size:N=13})=><Ke width={N}height={N}viewBox="0 0 24 24"fill="none">
2
- <Qe d="M4 17l6-6-6-6M12 19h8"stroke={I}strokeWidth="2"strokeLinecap="round"strokeLinejoin="round"/>
3
- </Ke>;export const DebuggingTab=()=>{const I=We(()=>{const k=He.SourceCode?.scriptURL||"";let V="localhost",S=8081;try{if(k.includes("://")){const v=k.split("://")[1].split("/")[0];if(v.includes(":")){const A=v.split(":");V=A[0];const W=parseInt(A[1],10);isNaN(W)||(S=W)}else V=v}}catch{}return{host:V,port:S,scriptURL:k}},[]),[N,Ve]=M(()=>I.host&&I.host!=="localhost"&&I.host!=="127.0.0.1"&&I.host!=="10.0.2.2"?I.host:"192.168.1.2"),[H,ze]=M(I.port||8083),[De,Y]=M("app-debug.apk"),[q,ee]=M(null),[F,oe]=M("assembleRelease"),[L,ve]=M(!0),[R,U]=M({status:"idle",scheme:"assembleRelease",clean:!0,progress:0,currentTask:"",error:null,apkName:null,apkSize:null}),D=X(null),K=X(new Z.Value(0)).current,[Q,Ae]=M(!0),te=X(null);_(()=>{Z.timing(K,{toValue:Math.max(0,Math.min(100,R.progress)),duration:350,useNativeDriver:!1}).start()},[R.progress,K]),_(()=>{R.logs&&R.logs.length>0&&setTimeout(()=>{te.current?.scrollToEnd({animated:!0})},50)},[R.logs]);const E=re(async()=>{const k=Array.from(new Set([I.host,"10.0.2.2","localhost","127.0.0.1"].filter(Boolean))),V=Array.from(new Set([I.port,8083,8081,8082].filter(Boolean)));for(const S of k)for(const O of V)try{const v=new AbortController,A=setTimeout(()=>v.abort(),1200),W=await fetch(`http://${S}:${O}/__inapp_inspector/apk-info`,{signal:v.signal});if(clearTimeout(A),W.ok){const z=await W.json();z.hostIp&&z.hostIp!=="127.0.0.1"&&z.hostIp!=="localhost"&&z.hostIp!=="10.0.2.2"&&Ve(z.hostIp),z.port&&ze(z.port),z.apkName&&Y(z.apkName),z.apkSize&&ee((z.apkSize/(1024*1024)).toFixed(1));return}}catch{}},[I.host,I.port]);_(()=>{E()},[E]),_(()=>()=>{D.current&&clearInterval(D.current)},[]);const Fe=re(()=>{D.current&&clearInterval(D.current);const k=I.host||"10.0.2.2";D.current=setInterval(async()=>{try{const V=await fetch(`http://${k}:${H}/__inapp_inspector/build-status`);if(V.ok){const S=await V.json();U(S),S.status==="completed"?(D.current&&clearInterval(D.current),P("success"),J("\u2713 APK Build Generated Successfully!"),S.apkSize&&ee((S.apkSize/(1024*1024)).toFixed(1)),S.apkName&&Y(S.apkName),E()):S.status==="failed"&&(D.current&&clearInterval(D.current),P("error"),J("\u2715 Build Failed: "+(S.error||"Gradle error")))}}catch{}},1e3)},[I.host,H,E]),Oe=async()=>{P("medium"),U({status:"running",scheme:F,clean:L,progress:5,currentTask:L?"Cleaning build cache...":"Initializing build...",error:null,apkName:null,apkSize:null});const k=Array.from(new Set([I.host,"10.0.2.2","localhost","127.0.0.1"].filter(Boolean))),V=Array.from(new Set([H,8083,8081,8082].filter(Boolean)));let S=!1;for(const O of k)for(const v of V)try{const A=new AbortController,W=setTimeout(()=>A.abort(),2e3),z=await fetch(`http://${O}:${v}/__inapp_inspector/build-apk?scheme=${F}&clean=${L}`,{signal:A.signal});if(clearTimeout(W),z.ok){S=!0,Fe();return}}catch{}S||U(O=>({...O,status:"failed",error:"Cannot reach build server. Ensure npm start or npm run serve-apk is running on host."}))},Me=async()=>{P("warning"),D.current&&clearInterval(D.current);const k=Array.from(new Set([I.host,"10.0.2.2","localhost","127.0.0.1"].filter(Boolean))),V=Array.from(new Set([H,8083,8081,8082].filter(Boolean)));for(const S of k)for(const O of V)try{const v=new AbortController,A=setTimeout(()=>v.abort(),1500);await fetch(`http://${S}:${O}/__inapp_inspector/stop-build`,{signal:v.signal}),clearTimeout(A)}catch{}U(S=>({...S,status:"idle",currentTask:"Build cancelled by user",logs:[...S.logs||[],"\u{1F6D1} Build cancelled by user."]})),J("Build cancelled")},Le=`http://${N}:${H}/${De.replace(/^\/+/,"")}`,$=R.status==="running";return<Te style={o.scrollArea}contentContainerStyle={o.scrollContent}showsVerticalScrollIndicator={!1}>
1
+ import{useState as M,useEffect as _,useMemo as We,useCallback as ie,useRef as X}from"react";import{View as T,Text as C,ScrollView as Te,StyleSheet as Pe,NativeModules as He,TouchableOpacity as G,ActivityIndicator as Ce,Animated as Z}from"react-native";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as B}from"../../styles/AppFonts";import{useTranslation as $e}from"../../i18n";import Ne from"../QRCodeView";import Se from"../TouchableScale";import{showToast as J}from"../../helpers/toast";import{triggerNativeHaptic as H}from"../../native/NativeInspector";import{InfoCircleIcon as Ee,CheckIcon as Be,BoltIcon as Re,CircleXIcon as Ie,SparkleIcon as Ge,AndroidIcon as Ue,RepeatIcon as _e,WrenchIcon as Ke}from"../NetworkIcons";import Qe,{Path as Xe}from"react-native-svg";const Ze=({color:L=e.purple,size:R=13})=><Qe width={R}height={R}viewBox="0 0 24 24"fill="none">
2
+ <Xe d="M4 17l6-6-6-6M12 19h8"stroke={L}strokeWidth="2"strokeLinecap="round"strokeLinejoin="round"/>
3
+ </Qe>;export const DebuggingTab=()=>{const{t:L}=$e(),R=We(()=>{const k=He.SourceCode?.scriptURL||"";let V="localhost",S=8081;try{if(k.includes("://")){const v=k.split("://")[1].split("/")[0];if(v.includes(":")){const A=v.split(":");V=A[0];const P=parseInt(A[1],10);isNaN(P)||(S=P)}else V=v}}catch{}return{host:V,port:S,scriptURL:k}},[]),[Y,Ve]=M(()=>R.host&&R.host!=="localhost"&&R.host!=="127.0.0.1"&&R.host!=="10.0.2.2"?R.host:"192.168.1.2"),[$,ze]=M(R.port||8083),[De,ee]=M("app-debug.apk"),[q,oe]=M(null),[F,te]=M("assembleRelease"),[W,ve]=M(!0),[I,U]=M({status:"idle",scheme:"assembleRelease",clean:!0,progress:0,currentTask:"",error:null,apkName:null,apkSize:null}),D=X(null),K=X(new Z.Value(0)).current,[Q,Ae]=M(!0),re=X(null);_(()=>{Z.timing(K,{toValue:Math.max(0,Math.min(100,I.progress)),duration:350,useNativeDriver:!1}).start()},[I.progress,K]),_(()=>{I.logs&&I.logs.length>0&&setTimeout(()=>{re.current?.scrollToEnd({animated:!0})},50)},[I.logs]);const E=ie(async()=>{const k=Array.from(new Set([R.host,"10.0.2.2","localhost","127.0.0.1"].filter(Boolean))),V=Array.from(new Set([R.port,8083,8081,8082].filter(Boolean)));for(const S of k)for(const O of V)try{const v=new AbortController,A=setTimeout(()=>v.abort(),1200),P=await fetch(`http://${S}:${O}/__inapp_inspector/apk-info`,{signal:v.signal});if(clearTimeout(A),P.ok){const z=await P.json();z.hostIp&&z.hostIp!=="127.0.0.1"&&z.hostIp!=="localhost"&&z.hostIp!=="10.0.2.2"&&Ve(z.hostIp),z.port&&ze(z.port),z.apkName&&ee(z.apkName),z.apkSize&&oe((z.apkSize/(1024*1024)).toFixed(1));return}}catch{}},[R.host,R.port]);_(()=>{E()},[E]),_(()=>()=>{D.current&&clearInterval(D.current)},[]);const Fe=ie(()=>{D.current&&clearInterval(D.current);const k=R.host||"10.0.2.2";D.current=setInterval(async()=>{try{const V=await fetch(`http://${k}:${$}/__inapp_inspector/build-status`);if(V.ok){const S=await V.json();U(S),S.status==="completed"?(D.current&&clearInterval(D.current),H("success"),J(L("debugging.buildSuccess","APK Build Generated Successfully!")),S.apkSize&&oe((S.apkSize/(1024*1024)).toFixed(1)),S.apkName&&ee(S.apkName),E()):S.status==="failed"&&(D.current&&clearInterval(D.current),H("error"),J(L("debugging.buildFailed",{error:S.error||"Gradle error"})))}}catch{}},1e3)},[R.host,$,E]),Oe=async()=>{H("medium"),U({status:"running",scheme:F,clean:W,progress:5,currentTask:W?"Cleaning build cache...":"Initializing build...",error:null,apkName:null,apkSize:null});const k=Array.from(new Set([R.host,"10.0.2.2","localhost","127.0.0.1"].filter(Boolean))),V=Array.from(new Set([$,8083,8081,8082].filter(Boolean)));let S=!1;for(const O of k)for(const v of V)try{const A=new AbortController,P=setTimeout(()=>A.abort(),2e3),z=await fetch(`http://${O}:${v}/__inapp_inspector/build-apk?scheme=${F}&clean=${W}`,{signal:A.signal});if(clearTimeout(P),z.ok){S=!0,Fe();return}}catch{}S||U(O=>({...O,status:"failed",error:"Cannot reach build server. Ensure npm start or npm run serve-apk is running on host."}))},Me=async()=>{H("warning"),D.current&&clearInterval(D.current);const k=Array.from(new Set([R.host,"10.0.2.2","localhost","127.0.0.1"].filter(Boolean))),V=Array.from(new Set([$,8083,8081,8082].filter(Boolean)));for(const S of k)for(const O of V)try{const v=new AbortController,A=setTimeout(()=>v.abort(),1500);await fetch(`http://${S}:${O}/__inapp_inspector/stop-build`,{signal:v.signal}),clearTimeout(A)}catch{}U(S=>({...S,status:"idle",currentTask:L("debugging.buildCancelled","Build cancelled by user"),logs:[...S.logs||[],`[Build] ${L("debugging.buildCancelled","Build cancelled by user")}.`]})),J(L("debugging.buildCancelled","Build cancelled"))},Le=`http://${Y}:${$}/${De.replace(/^\/+/,"")}`,N=I.status==="running";return<Te style={o.scrollArea}contentContainerStyle={o.scrollContent}showsVerticalScrollIndicator={!1}>
4
4
 
5
5
  <T style={o.heroCard}>
6
6
  <T style={o.heroHeader}>
7
7
  <T style={o.heroIconWrap}>
8
- <Ge size={20}color={e.white}/>
8
+ <Ue size={20}color={e.white}/>
9
9
  </T>
10
10
  <T style={{flex:1,minWidth:0}}>
11
11
  <C style={o.heroTitle}numberOfLines={1}>
@@ -26,13 +26,13 @@ import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}
26
26
  <T style={o.heroMetricItem}>
27
27
  <C style={o.heroMetricLabel}>HOST IP</C>
28
28
  <C style={o.heroMetricValue}numberOfLines={1}>
29
- {N}
29
+ {Y}
30
30
  </C>
31
31
  </T>
32
32
  <T style={o.heroMetricDivider}/>
33
33
  <T style={o.heroMetricItem}>
34
34
  <C style={o.heroMetricLabel}>PORT</C>
35
- <C style={o.heroMetricValue}>{H}</C>
35
+ <C style={o.heroMetricValue}>{$}</C>
36
36
  </T>
37
37
  <T style={o.heroMetricDivider}/>
38
38
  <T style={o.heroMetricItem}>
@@ -56,7 +56,7 @@ import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}
56
56
  <T style={o.sectionHeaderRow}>
57
57
  <C style={o.sectionTitle}>QR CODE & DIRECT DOWNLOAD</C>
58
58
  <G activeOpacity={.7}onPress={E}style={o.refreshBtn}>
59
- <Ue size={12}color={e.purple}/>
59
+ <_e size={12}color={e.purple}/>
60
60
  <C style={o.refreshBtnText}>Refresh</C>
61
61
  </G>
62
62
  </T>
@@ -64,7 +64,7 @@ import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}
64
64
 
65
65
  <T style={o.qrCenteredWrapper}>
66
66
  <T style={o.qrInnerFrame}>
67
- <$e value={Le}size={235}color={e.primaryBlack}backgroundColor={e.white}/>
67
+ <Ne value={Le}size={235}color={e.primaryBlack}backgroundColor={e.white}/>
68
68
  </T>
69
69
  </T>
70
70
  </T>
@@ -76,7 +76,7 @@ import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}
76
76
  <Re size={13}color={e.purple}/>
77
77
  <C style={o.sectionTitle}>BUILD GENERATOR (GRADLE)</C>
78
78
  </T>
79
- {R.status==="completed"&&<T style={o.completedBadge}>
79
+ {I.status==="completed"&&<T style={o.completedBadge}>
80
80
  <Be size={10}color={e.emerald500}/>
81
81
  <C style={o.completedBadgeText}>100% Ready</C>
82
82
  </T>}
@@ -84,7 +84,7 @@ import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}
84
84
 
85
85
 
86
86
  <T style={o.subTabStrip}>
87
- <G disabled={$}activeOpacity={.7}onPress={()=>{P("light"),oe("assembleRelease")}}style={[o.subTabItem,F==="assembleRelease"&&o.subTabItemActive]}>
87
+ <G disabled={N}activeOpacity={.7}onPress={()=>{H("light"),te("assembleRelease")}}style={[o.subTabItem,F==="assembleRelease"&&o.subTabItemActive]}>
88
88
  <T style={{flexDirection:"row",alignItems:"center",gap:5}}>
89
89
  <Re size={12}color={F==="assembleRelease"?e.white:e.grayText}/>
90
90
  <C style={[o.subTabText,F==="assembleRelease"&&o.subTabTextActive]}>
@@ -93,9 +93,9 @@ import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}
93
93
  </T>
94
94
  </G>
95
95
 
96
- <G disabled={$}activeOpacity={.7}onPress={()=>{P("light"),oe("assembleDebug")}}style={[o.subTabItem,F==="assembleDebug"&&o.subTabItemActive]}>
96
+ <G disabled={N}activeOpacity={.7}onPress={()=>{H("light"),te("assembleDebug")}}style={[o.subTabItem,F==="assembleDebug"&&o.subTabItemActive]}>
97
97
  <T style={{flexDirection:"row",alignItems:"center",gap:5}}>
98
- <_e size={12}color={F==="assembleDebug"?e.white:e.grayText}/>
98
+ <Ke size={12}color={F==="assembleDebug"?e.white:e.grayText}/>
99
99
  <C style={[o.subTabText,F==="assembleDebug"&&o.subTabTextActive]}>
100
100
  Debug (assembleDebug)
101
101
  </C>
@@ -104,9 +104,9 @@ import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}
104
104
  </T>
105
105
 
106
106
 
107
- <G disabled={$}activeOpacity={.7}onPress={()=>{P("light"),ve(!L)}}style={o.cleanRow}>
108
- <T style={[o.checkboxBox,L&&o.checkboxBoxActive]}>
109
- {L&&<Be size={11}color={e.white}/>}
107
+ <G disabled={N}activeOpacity={.7}onPress={()=>{H("light"),ve(!W)}}style={o.cleanRow}>
108
+ <T style={[o.checkboxBox,W&&o.checkboxBoxActive]}>
109
+ {W&&<Be size={11}color={e.white}/>}
110
110
  </T>
111
111
  <C style={o.cleanLabel}>
112
112
  Clean build cache <C style={o.cleanCode}>(./gradlew clean)</C>
@@ -114,16 +114,16 @@ import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}
114
114
  </G>
115
115
 
116
116
 
117
- {$&&<T style={o.progressContainer}>
117
+ {N&&<T style={o.progressContainer}>
118
118
  <T style={o.progressTopRow}>
119
119
  <T style={o.progressTaskGroup}>
120
120
  <Ce size="small"color={e.purple}/>
121
121
  <C style={o.progressTaskText}numberOfLines={1}>
122
- {R.currentTask||"Executing Gradle tasks..."}
122
+ {I.currentTask||"Executing Gradle tasks..."}
123
123
  </C>
124
124
  </T>
125
125
  <C style={o.progressPercentageText}>
126
- {R.progress}%
126
+ {I.progress}%
127
127
  </C>
128
128
  </T>
129
129
 
@@ -134,18 +134,18 @@ import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}
134
134
  </T>}
135
135
 
136
136
 
137
- {R.status==="failed"&&<T style={o.errorContainer}>
137
+ {I.status==="failed"&&<T style={o.errorContainer}>
138
138
  <Ie size={13}color={e.errorColor}/>
139
139
  <C style={o.errorText}numberOfLines={2}>
140
- {R.error||"Build execution failed."}
140
+ {I.error||"Build execution failed."}
141
141
  </C>
142
142
  </T>}
143
143
 
144
144
 
145
- {(R.logs&&R.logs.length>0||$)&&<T style={o.consoleContainer}>
145
+ {(I.logs&&I.logs.length>0||N)&&<T style={o.consoleContainer}>
146
146
  <T style={o.consoleHeaderRow}>
147
147
  <T style={{flexDirection:"row",alignItems:"center",gap:6}}>
148
- <Xe color={e.sky400}size={12}/>
148
+ <Ze color={e.sky400}size={12}/>
149
149
  <C style={o.consoleHeaderTitle}>GRADLE VERBOSE OUTPUT</C>
150
150
  </T>
151
151
  <G activeOpacity={.7}onPress={()=>Ae(!Q)}style={o.consoleToggleBtn}>
@@ -155,8 +155,8 @@ import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}
155
155
  </G>
156
156
  </T>
157
157
 
158
- {Q&&<Te ref={te}style={o.consoleLogBox}contentContainerStyle={o.consoleLogContent}nestedScrollEnabled showsVerticalScrollIndicator>
159
- {R.logs&&R.logs.length>0?R.logs.map((k,V)=>{let S=e.slate400;return k.startsWith("> Task :")?S=e.sky400:k.includes("BUILD SUCCESSFUL")?S=e.buildSuccessGreen:k.includes("FAILURE")||k.includes("error:")?S=e.buildFailureRed:k.includes("UP-TO-DATE")&&(S=e.purple400),<C key={V}style={[o.consoleLogLine,{color:S}]}>
158
+ {Q&&<Te ref={re}style={o.consoleLogBox}contentContainerStyle={o.consoleLogContent}nestedScrollEnabled showsVerticalScrollIndicator>
159
+ {I.logs&&I.logs.length>0?I.logs.map((k,V)=>{let S=e.slate400;return k.startsWith("> Task :")?S=e.sky400:k.includes("BUILD SUCCESSFUL")?S=e.buildSuccessGreen:k.includes("FAILURE")||k.includes("error:")?S=e.buildFailureRed:k.includes("UP-TO-DATE")&&(S=e.purple400),<C key={V}style={[o.consoleLogLine,{color:S}]}>
160
160
  {k}
161
161
  </C>}):<C style={o.consoleLogPlaceholder}>
162
162
  Waiting for Gradle daemon output...
@@ -165,11 +165,11 @@ import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}
165
165
  </T>}
166
166
 
167
167
 
168
- {$?<T style={o.buildingActionsRow}>
168
+ {N?<T style={o.buildingActionsRow}>
169
169
  <T style={o.buildingStatusPill}>
170
170
  <Ce size="small"color={e.purple}/>
171
171
  <C style={o.buildingStatusPillText}numberOfLines={1}>
172
- Building ({R.progress}%)
172
+ Building ({I.progress}%)
173
173
  </C>
174
174
  </T>
175
175
 
@@ -179,9 +179,9 @@ import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}
179
179
  </Se>
180
180
  </T>:<Se onPress={Oe}style={o.generateBtn}>
181
181
  <T style={o.ctaContentRow}>
182
- <Ee size={14}color={e.white}/>
182
+ <Ge size={14}color={e.white}/>
183
183
  <C style={o.generateBtnText}>
184
- {L?"Clean & Generate Build":"Generate Build"}
184
+ {W?"Clean & Generate Build":"Generate Build"}
185
185
  </C>
186
186
  </T>
187
187
  </Se>}
@@ -189,7 +189,7 @@ import{useState as M,useEffect as _,useMemo as We,useCallback as re,useRef as X}
189
189
 
190
190
 
191
191
  <T style={o.footerNoteRow}>
192
- <Ne size={13}color={e.grayTextWeak}/>
192
+ <Ee size={13}color={e.grayTextWeak}/>
193
193
  <C style={o.footerNoteText}>
194
194
  Ensure both Android devices are connected to the same Wi-Fi network.
195
195
  </C>
@@ -1,24 +1,24 @@
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}}>
1
+ import Ve,{useState as oe,useEffect as Le,useMemo as F,useCallback as Pe}from"react";import{View as T,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 Tt,LayersIcon as $t,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:$=!1})=>{const ne=V==null?"\u2014":typeof V=="boolean"?V?"Yes":"No":typeof V=="number"?V.toLocaleString():String(V);return<T style={[r.infoRow,$&&{borderBottomWidth:0}]}>
2
+ <T style={{flex:1,paddingRight:8,minWidth:0}}>
3
+ <T style={{flexDirection:"row",alignItems:"center",flexWrap:"wrap",gap:6}}>
4
4
  <I style={r.infoLabel}numberOfLines={2}>{A}</I>
5
- {C&&<$ style={[r.infoBadge,{backgroundColor:C.bg,borderColor:`${C.color}33`}]}>
5
+ {C&&<T style={[r.infoBadge,{backgroundColor:C.bg,borderColor:`${C.color}33`}]}>
6
6
  <I style={[r.infoBadgeText,{color:C.color}]}>
7
7
  {C.text}
8
8
  </I>
9
- </$>}
10
- </$>
9
+ </T>}
10
+ </T>
11
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"}}>
12
+ </T>
13
+ <T style={{flexDirection:"row",alignItems:"center",gap:6,flexShrink:0,maxWidth:"58%",justifyContent:"flex-end"}}>
14
14
  <I style={[r.infoValue,typeof V=="boolean"&&{color:V?e.emerald500:e.errorColor}]}numberOfLines={3}selectable>
15
15
  {ne}
16
16
  </I>
17
17
  {fe&&V!==null&&V!==void 0&&<Z hitSlop={8}onPress={()=>{ae(ne,A),ie(`Copied ${A}`)}}style={r.rowCopyBtn}>
18
18
  <Se size={11}color={e.grayTextWeak}/>
19
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
20
+ </T>
21
+ </T>});export const DeviceInfoTab=Ve.memo(()=>{const{t:A}=et(),[V,fe]=oe("overview"),[C,re]=oe(""),[$,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=$?.totalRAM?Math.round($.totalRAM/(1024*1024)):Re?.totalPhysicalRamMb||4096,O=$?.freeRAM?Math.round($.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=$?.totalStorage?($.totalStorage/(1024*1024*1024)).toFixed(1):"128.0",_=$?.freeStorage?($.freeStorage/(1024*1024*1024)).toFixed(1):"64.2",We=F(()=>[{key:"overview",label:A("device.subTabs.overview","Overview"),themeColor:e.sky600,icon:f=><$t 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=><Tt 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:$?.appBundleId||$?.appPackageName||"com.app.inspector"},hardware:{model:$?.deviceModel||w.constants?.Model||"Unknown Device",brand:$?.deviceBrand||w.constants?.Brand||(w.OS==="ios"?"Apple":"Android"),osVersion:`${w.OS} ${w.Version}`,apiLevel:$?.apiLevel||w.constants?.Version||null,cpuAbi:$?.cpuAbi||w.constants?.ServerHost||"arm64-v8a",totalRamMb:P,freeRamMb:O,usedRamMb:K,totalStorageGb:`${W} GB`,freeStorageGb:`${_} GB`,batteryPercent:$?.batteryPercent??100,isCharging:$?.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:$?.appVersion||"1.0.0",appBuild:$?.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,$,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
22
  **Generated by React Native In-App Inspector v${le}**
23
23
 
24
24
  ## \u{1F4F1} Hardware & System
@@ -51,16 +51,16 @@ import Ve,{useState as oe,useEffect as Le,useMemo as F,useCallback as Pe}from"re
51
51
  ## \u{1F511} Identifiers & Security
52
52
  - **Pseudo-UDID:** \`${k}\`
53
53
  - **Bundle ID:** \`${o.identifiers.bundleId}\`
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}>
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]),Te=F(()=>C.trim()?t("Model",$?.deviceModel||w.constants?.Model)||t("OS",w.OS)||t("IP Address",H)||t("RAM",`${K.toLocaleString()}/${P.toLocaleString()}`)||t("Uptime",J):!0,[C,t,$,H,K,P,J]),$e=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",`${$?.batteryPercent??100}%`)||t("API Level",`API ${$?.apiLevel||w.Version}`)||t("Thermal State","Nominal (Cool)"):!0,[C,t,o,P,O,W,_,$]),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()?Te||$e||xe||Ie||Me||Be||De:!0,[C,Te,$e,xe,Ie,Me,Be,De]);return<T style={r.container}>
55
55
 
56
- <$ style={r.actionBar}>
57
- <$ style={r.searchBar}>
56
+ <T style={r.actionBar}>
57
+ <T style={r.searchBar}>
58
58
  <He size={14}color={e.grayTextWeak}/>
59
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
60
  {C.length>0&&<Z onPress={()=>re("")}hitSlop={8}>
61
61
  <It size={13}color={e.grayTextWeak}/>
62
62
  </Z>}
63
- </$>
63
+ </T>
64
64
 
65
65
  <Z onPress={_e}style={r.exportButton}hitSlop={6}>
66
66
  <At size={12}color={e.purple}/>
@@ -71,49 +71,49 @@ import Ve,{useState as oe,useEffect as Le,useMemo as F,useCallback as Pe}from"re
71
71
  <Se size={12}color={e.emerald500}/>
72
72
  <I style={[r.exportButtonText,{color:e.emerald500}]}>MD</I>
73
73
  </Z>
74
- </$>
74
+ </T>
75
75
 
76
76
 
77
- <$ style={r.subTabsWrapper}>
77
+ <T style={r.subTabsWrapper}>
78
78
  <Ee horizontal showsHorizontalScrollIndicator={!1}contentContainerStyle={r.subTabsContainer}>
79
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`}]}>
80
+ <T style={[r.subTabPill,R&&{backgroundColor:M,borderColor:M},!R&&{backgroundColor:`${M}12`,borderColor:`${M}30`}]}>
81
81
  {f.icon(B)}
82
82
  <I style={[r.subTabPillText,R&&{color:e.white},!R&&{color:e.primaryBlack}]}>
83
83
  {f.label}
84
84
  </I>
85
- </$>
85
+ </T>
86
86
  </Z>})}
87
87
  </Ee>
88
- </$>
88
+ </T>
89
89
 
90
90
 
91
- <Ee style={r.scrollArea}contentContainerStyle={r.scrollContent}showsVerticalScrollIndicator={!1}>
91
+ <Ee style={[r.scrollArea,{flex:1}]}contentContainerStyle={[r.scrollContent,{flexGrow:1}]}showsVerticalScrollIndicator={!1}nestedScrollEnabled={!0}keyboardShouldPersistTaps="handled">
92
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}>
93
+ {(!C.trim()||t("UDID Identifier",k)||t("UUID",k)||t("Device UUID",k))&&<T style={r.featuredUuidCard}>
94
+ <T style={r.featuredUuidHeader}>
95
+ <T style={r.featuredUuidTitleRow}>
96
+ <T style={r.featuredUuidIconWrap}>
97
97
  <Oe size={14}color={e.white}/>
98
- </$>
99
- <$ style={{flex:1,minWidth:0}}>
100
- <$ style={{flexDirection:"row",alignItems:"center",gap:6}}>
98
+ </T>
99
+ <T style={{flex:1,minWidth:0}}>
100
+ <T style={{flexDirection:"row",alignItems:"center",gap:6}}>
101
101
  <I style={r.featuredUuidLabel}>DEVICE UUID</I>
102
- <$ style={r.featuredBadge}>
102
+ <T style={r.featuredBadge}>
103
103
  <I style={r.featuredBadgeText}>FEATURED</I>
104
- </$>
105
- </$>
104
+ </T>
105
+ </T>
106
106
  <I style={r.featuredUuidSubtext}>
107
107
  Deterministic hardware pseudo-identifier
108
108
  </I>
109
- </$>
110
- </$>
109
+ </T>
110
+ </T>
111
111
 
112
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
113
  <Se size={11}color={e.white}/>
114
114
  <I style={r.featuredCopyBtnText}>Copy</I>
115
115
  </Z>
116
- </$>
116
+ </T>
117
117
 
118
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
119
  <I style={r.featuredUuidValueText}numberOfLines={1}ellipsizeMode="middle"selectable>
@@ -121,53 +121,53 @@ import Ve,{useState as oe,useEffect as Le,useMemo as F,useCallback as Pe}from"re
121
121
  </I>
122
122
  <Se size={12}color={e.brandPurple}/>
123
123
  </Z>
124
- </$>}
124
+ </T>}
125
125
 
126
126
 
127
- {(!C.trim()||$e)&&<$ style={r.heroCard}>
128
- <$ style={r.heroHeader}>
129
- <$ style={r.heroIconWrap}>
127
+ {(!C.trim()||Te)&&<T style={r.heroCard}>
128
+ <T style={r.heroHeader}>
129
+ <T style={r.heroIconWrap}>
130
130
  {w.OS==="ios"?<Bt size={20}color={e.white}/>:<Dt size={20}color={e.white}/>}
131
- </$>
132
- <$ style={{flex:1,minWidth:0}}>
131
+ </T>
132
+ <T style={{flex:1,minWidth:0}}>
133
133
  <I style={r.heroTitle}numberOfLines={1}ellipsizeMode="tail">
134
- {T?.deviceModel||w.constants?.Model||(w.OS==="ios"?"Apple iPhone":"Android Device")}
134
+ {$?.deviceModel||w.constants?.Model||(w.OS==="ios"?"Apple iPhone":"Android Device")}
135
135
  </I>
136
136
  <I style={r.heroSubtitle}numberOfLines={1}ellipsizeMode="tail">
137
- {w.OS==="ios"?`iOS ${w.Version}`:`Android ${w.Version} (API ${T?.apiLevel||w.Version})`}
137
+ {w.OS==="ios"?`iOS ${w.Version}`:`Android ${w.Version} (API ${$?.apiLevel||w.Version})`}
138
138
  </I>
139
- </$>
140
- <$ style={r.heroBadge}>
141
- <$ style={r.pulseDot}/>
139
+ </T>
140
+ <T style={r.heroBadge}>
141
+ <T style={r.pulseDot}/>
142
142
  <I style={r.heroBadgeText}>LIVE</I>
143
- </$>
144
- </$>
143
+ </T>
144
+ </T>
145
145
 
146
146
 
147
- <$ style={r.heroMetricsStrip}>
148
- <$ style={r.heroMetricItem}>
147
+ <T style={r.heroMetricsStrip}>
148
+ <T style={r.heroMetricItem}>
149
149
  <I style={r.heroMetricLabel}numberOfLines={1}ellipsizeMode="tail">{A("device.ipAddress","IP ADDRESS")}</I>
150
150
  <I style={r.heroMetricValue}numberOfLines={1}ellipsizeMode="tail">
151
151
  {H}
152
152
  </I>
153
- </$>
154
- <$ style={r.heroMetricDivider}/>
155
- <$ style={r.heroMetricItem}>
153
+ </T>
154
+ <T style={r.heroMetricDivider}/>
155
+ <T style={r.heroMetricItem}>
156
156
  <I style={r.heroMetricLabel}numberOfLines={1}ellipsizeMode="tail">{A("device.ramUsedTotal","RAM (USED/TOTAL)")}</I>
157
157
  <I style={r.heroMetricValue}numberOfLines={1}ellipsizeMode="tail">
158
158
  {K.toLocaleString()}/{P.toLocaleString()} MB
159
159
  </I>
160
- </$>
161
- <$ style={r.heroMetricDivider}/>
162
- <$ style={r.heroMetricItem}>
160
+ </T>
161
+ <T style={r.heroMetricDivider}/>
162
+ <T style={r.heroMetricItem}>
163
163
  <I style={r.heroMetricLabel}numberOfLines={1}ellipsizeMode="tail">{A("device.uptime","UPTIME")}</I>
164
164
  <I style={r.heroMetricValue}numberOfLines={1}ellipsizeMode="tail">{J}</I>
165
- </$>
166
- </$>
167
- </$>}
165
+ </T>
166
+ </T>
167
+ </T>}
168
168
 
169
169
 
170
- {(V==="overview"||C.length>0)&&Te&&<$ style={r.sectionCard}>
170
+ {(V==="overview"||C.length>0)&&$e&&<T style={r.sectionCard}>
171
171
  <I style={r.sectionTitle}>DEVICE OVERVIEW</I>
172
172
  {t("Device Model",o.hardware.model)&&<S label="Device Model"value={o.hardware.model}/>}
173
173
  {t("Manufacturer",o.hardware.brand)&&<S label="Manufacturer / Brand"value={o.hardware.brand}/>}
@@ -178,23 +178,23 @@ import Ve,{useState as oe,useEffect as Le,useMemo as F,useCallback as Pe}from"re
178
178
  {t("App Version",`v${o.runtime.appVersion} (${o.runtime.appBuild})`)&&<S label="Host App Version"value={`v${o.runtime.appVersion} (${o.runtime.appBuild})`}/>}
179
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
180
  {t("UDID Identifier",k)&&<S label="Pseudo-UDID"value={k}isLast/>}
181
- </$>}
181
+ </T>}
182
182
 
183
183
 
184
- {(V==="hardware"||C.length>0)&&xe&&<$ style={r.sectionCard}>
184
+ {(V==="hardware"||C.length>0)&&xe&&<T style={r.sectionCard}>
185
185
  <I style={r.sectionTitle}>HARDWARE & SYSTEM SPECIFICATIONS</I>
186
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`}}/>}
187
187
  {t("Total RAM",`${P.toLocaleString()} MB`)&&<S label="Total Physical RAM"value={`${P.toLocaleString()} MB`}/>}
188
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
189
  {t("Storage Capacity",`${W} GB`)&&<S label="Disk Storage Total"value={`${W} GB`}/>}
190
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}`}/>}
191
+ {t("Battery",`${$?.batteryPercent??100}%`)&&<S label="Battery Level"value={`${$?.batteryPercent??100}%`}badge={{text:$?.isCharging?"CHARGING":"DISCHARGING",color:$?.isCharging?e.emerald500:e.grayText,bg:$?.isCharging?`${e.emerald500}18`:`${e.grayText}18`}}/>}
192
+ {t("API Level",`API ${$?.apiLevel||w.Version}`)&&w.OS==="android"&&<S label="Android API SDK Level"value={`API ${$?.apiLevel||w.Version}`}/>}
193
193
  {t("Thermal State","Nominal (Cool)")&&<S label="Thermal State"value="Nominal (Cool)"badge={{text:"OPTIMAL",color:e.emerald500,bg:`${e.emerald500}18`}}isLast/>}
194
- </$>}
194
+ </T>}
195
195
 
196
196
 
197
- {(V==="network"||C.length>0)&&Ie&&<$ style={r.sectionCard}>
197
+ {(V==="network"||C.length>0)&&Ie&&<T style={r.sectionCard}>
198
198
  <I style={r.sectionTitle}>NETWORK & CONNECTIVITY</I>
199
199
  {t("IP Address",H)&&<S label="Local Device IP"value={H}badge={{text:"IPV4",color:e.blue500,bg:`${e.blue500}18`}}/>}
200
200
  {t("Internet Reachability","Connected")&&<S label="Internet Reachability"value="Connected"badge={{text:"ONLINE",color:e.emerald500,bg:`${e.emerald500}18`}}/>}
@@ -202,10 +202,10 @@ import Ve,{useState as oe,useEffect as Le,useMemo as F,useCallback as Pe}from"re
202
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"}/>}
203
203
  {t("WebSocket Protocol","Active & Enabled")&&<S label="WebSocket (WSS) Support"value="Active & Enabled"/>}
204
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/>}
205
- </$>}
205
+ </T>}
206
206
 
207
207
 
208
- {(V==="display"||C.length>0)&&Me&&<$ style={r.sectionCard}>
208
+ {(V==="display"||C.length>0)&&Me&&<T style={r.sectionCard}>
209
209
  <I style={r.sectionTitle}>DISPLAY & SCREEN GEOMETRY</I>
210
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
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`}/>}
@@ -214,10 +214,10 @@ import Ve,{useState as oe,useEffect as Le,useMemo as F,useCallback as Pe}from"re
214
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
215
  {t("Orientation",Q?"Landscape":"Portrait")&&<S label="Screen Orientation"value={Q?"Landscape":"Portrait"}/>}
216
216
  {t("Status Bar Height",`${ee} pt`)&&<S label="Status Bar Inset"value={`${ee} pt`}isLast/>}
217
- </$>}
217
+ </T>}
218
218
 
219
219
 
220
- {(V==="runtime"||C.length>0)&&Be&&<$ style={r.sectionCard}>
220
+ {(V==="runtime"||C.length>0)&&Be&&<T style={r.sectionCard}>
221
221
  <I style={r.sectionTitle}>RUNTIME & APPLICATION</I>
222
222
  {t("App Name",o.runtime.appName)&&<S label="Application Name"value={o.runtime.appName}/>}
223
223
  {t("Bundle ID",o.identifiers.bundleId)&&<S label="Bundle Identifier / Package"value={o.identifiers.bundleId}/>}
@@ -230,20 +230,20 @@ import Ve,{useState as oe,useEffect as Le,useMemo as F,useCallback as Pe}from"re
230
230
  {t("Timezone",o.runtime.timezone)&&<S label="System Timezone"value={o.runtime.timezone}/>}
231
231
  {t("Locale",o.runtime.locale)&&<S label="System Language & Locale"value={o.runtime.locale}/>}
232
232
  {t("Session Uptime",J)&&<S label="Inspector Session Uptime"value={J}isLast/>}
233
- </$>}
233
+ </T>}
234
234
 
235
235
 
236
- {(V==="security"||C.length>0)&&De&&<$ style={r.sectionCard}>
236
+ {(V==="security"||C.length>0)&&De&&<T style={r.sectionCard}>
237
237
  <I style={r.sectionTitle}>DEVICE IDENTIFIERS & SECURITY</I>
238
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`}}/>}
239
239
  {t("Bundle ID",o.identifiers.bundleId)&&<S label="Application Bundle ID"value={o.identifiers.bundleId}/>}
240
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`}}/>}
241
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"}/>}
242
242
  {t("Sandbox Integrity","Enforced by OS Kernel")&&<S label="App Sandbox File Isolation"value="Enforced by OS Kernel"isLast/>}
243
- </$>}
243
+ </T>}
244
244
 
245
245
 
246
- {C.trim().length>0&&!Je&&<$ style={r.emptySearchCard}>
246
+ {C.trim().length>0&&!Je&&<T style={r.emptySearchCard}>
247
247
  <He size={26}color={e.grayTextWeak}/>
248
248
  <I style={r.emptySearchTitle}>No matching device specifications</I>
249
249
  <I style={r.emptySearchSubtitle}>
@@ -252,8 +252,8 @@ import Ve,{useState as oe,useEffect as Le,useMemo as F,useCallback as Pe}from"re
252
252
  <Z onPress={()=>re("")}style={r.clearSearchBtn}>
253
253
  <I style={r.clearSearchBtnText}>Clear Search</I>
254
254
  </Z>
255
- </$>}
255
+ </T>}
256
256
 
257
- <$ style={{height:48}}/>
257
+ <T style={{height:48}}/>
258
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;
259
+ </T>});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;