react-native-inapp-inspector 2.3.19 → 2.3.21

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 (353) hide show
  1. package/README.md +14 -14
  2. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +67 -0
  3. package/dist/commonjs/analytics.js +1 -24
  4. package/dist/commonjs/bundle.js +1 -16
  5. package/dist/commonjs/capture.js +1 -35
  6. package/dist/commonjs/components/AnalyticsDetail.js +92 -623
  7. package/dist/commonjs/components/AnalyticsEventCard.js +54 -350
  8. package/dist/commonjs/components/AnalyticsGraph.js +70 -370
  9. package/dist/commonjs/components/AnimatedEntrance.js +1 -11
  10. package/dist/commonjs/components/AppHeaderLogo.js +7 -134
  11. package/dist/commonjs/components/BrandCircleIcon.js +73 -118
  12. package/dist/commonjs/components/BrandSquareIcon.js +63 -108
  13. package/dist/commonjs/components/CodeSnippet.js +48 -623
  14. package/dist/commonjs/components/ConsoleLogCard.js +63 -537
  15. package/dist/commonjs/components/CopyButton.js +3 -89
  16. package/dist/commonjs/components/DiffViewer.js +19 -83
  17. package/dist/commonjs/components/DomainHeader.js +27 -127
  18. package/dist/commonjs/components/EmptyState.js +10 -87
  19. package/dist/commonjs/components/EndOfListFooter.js +7 -81
  20. package/dist/commonjs/components/ErrorBoundary.js +72 -566
  21. package/dist/commonjs/components/HeadersSection.js +31 -110
  22. package/dist/commonjs/components/HighlightText.js +17 -58
  23. package/dist/commonjs/components/Inspector/AboutModal.d.ts +6 -0
  24. package/dist/commonjs/components/Inspector/AboutModal.js +243 -0
  25. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +98 -797
  26. package/dist/commonjs/components/Inspector/AnalyticsTab.js +284 -930
  27. package/dist/commonjs/components/Inspector/BundleTab.js +551 -2918
  28. package/dist/commonjs/components/Inspector/ConsoleTab.js +79 -492
  29. package/dist/commonjs/components/Inspector/CrashDetail.js +123 -672
  30. package/dist/commonjs/components/Inspector/CrashFilterModal.js +66 -498
  31. package/dist/commonjs/components/Inspector/CrashTab.js +98 -670
  32. package/dist/commonjs/components/Inspector/DebuggingTab.js +74 -875
  33. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +143 -907
  34. package/dist/commonjs/components/Inspector/FabLauncher.js +42 -466
  35. package/dist/commonjs/components/Inspector/FeatureUnderDevNotice.js +6 -99
  36. package/dist/commonjs/components/Inspector/InspectorContext.js +1 -21
  37. package/dist/commonjs/components/Inspector/InspectorHeader.js +191 -1110
  38. package/dist/commonjs/components/Inspector/LogDetail.js +168 -994
  39. package/dist/commonjs/components/Inspector/MainScreen.js +52 -335
  40. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +97 -644
  41. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +90 -605
  42. package/dist/commonjs/components/Inspector/NavigationTracker.js +1 -12
  43. package/dist/commonjs/components/Inspector/NetworkDetail.js +89 -411
  44. package/dist/commonjs/components/Inspector/NetworkFilterModal.js +60 -576
  45. package/dist/commonjs/components/Inspector/NetworkTab.js +84 -514
  46. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +18 -434
  47. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +25 -298
  48. package/dist/commonjs/components/Inspector/PerformanceTab.js +182 -1397
  49. package/dist/commonjs/components/Inspector/ReduxDetail.js +188 -1089
  50. package/dist/commonjs/components/Inspector/ReduxTab.js +85 -701
  51. package/dist/commonjs/components/Inspector/SettingsPanel.js +427 -3807
  52. package/dist/commonjs/components/Inspector/SkeletonPlaceholder.js +11 -180
  53. package/dist/commonjs/components/Inspector/StorageTab.js +93 -826
  54. package/dist/commonjs/components/Inspector/TabBar.js +36 -334
  55. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +37 -412
  56. package/dist/commonjs/components/JsonViewer.js +168 -381
  57. package/dist/commonjs/components/LogCard.js +57 -567
  58. package/dist/commonjs/components/LogSyntaxHighlighter.js +11 -130
  59. package/dist/commonjs/components/MetaAccordion.js +69 -238
  60. package/dist/commonjs/components/MiniBarChart.js +3 -56
  61. package/dist/commonjs/components/MiniLineChart.js +3 -58
  62. package/dist/commonjs/components/NetworkIcons.d.ts +13 -0
  63. package/dist/commonjs/components/NetworkIcons.js +521 -1022
  64. package/dist/commonjs/components/QRCodeView.js +5 -79
  65. package/dist/commonjs/components/SectionHeader.js +15 -37
  66. package/dist/commonjs/components/SegmentedTabs.js +7 -62
  67. package/dist/commonjs/components/SkeletonPlaceholder.js +11 -180
  68. package/dist/commonjs/components/Slider.js +15 -243
  69. package/dist/commonjs/components/SourcePageCard.js +30 -89
  70. package/dist/commonjs/components/Toast.js +5 -147
  71. package/dist/commonjs/components/TouchableScale.js +3 -24
  72. package/dist/commonjs/components/TreeNode.js +55 -130
  73. package/dist/commonjs/console.js +1 -16
  74. package/dist/commonjs/constants/index.js +1 -32
  75. package/dist/commonjs/constants/telemetryConfig.js +1 -6
  76. package/dist/commonjs/constants/version.d.ts +1 -1
  77. package/dist/commonjs/constants/version.js +1 -4
  78. package/dist/commonjs/crash.js +1 -23
  79. package/dist/commonjs/customHooks/analyticsLogger.js +1 -250
  80. package/dist/commonjs/customHooks/bundleAnalyzer.js +1 -957
  81. package/dist/commonjs/customHooks/consoleLogger.js +6 -445
  82. package/dist/commonjs/customHooks/crashHandler.js +7 -656
  83. package/dist/commonjs/customHooks/logFilters.js +1 -23
  84. package/dist/commonjs/customHooks/networkLogger.js +2 -536
  85. package/dist/commonjs/customHooks/performanceTracker.js +63 -750
  86. package/dist/commonjs/customHooks/reduxLogger.js +2 -313
  87. package/dist/commonjs/customHooks/storageInspector.js +1 -435
  88. package/dist/commonjs/customHooks/useAccordion.js +1 -18
  89. package/dist/commonjs/decorators/index.js +1 -100
  90. package/dist/commonjs/helpers/gaAnalyticsRegistry.js +1 -148
  91. package/dist/commonjs/helpers/index.d.ts +1 -0
  92. package/dist/commonjs/helpers/index.js +8 -921
  93. package/dist/commonjs/helpers/memoryManager.js +1 -99
  94. package/dist/commonjs/helpers/qrGenerator.js +1 -367
  95. package/dist/commonjs/helpers/remoteConfig.js +1 -165
  96. package/dist/commonjs/helpers/searchQueryParser.js +1 -62
  97. package/dist/commonjs/helpers/settingsStore.js +1 -144
  98. package/dist/commonjs/helpers/telemetry.js +1 -501
  99. package/dist/commonjs/helpers/toast.js +1 -20
  100. package/dist/commonjs/i18n/index.js +1 -90
  101. package/dist/commonjs/i18n/locales/en.json +1 -1140
  102. package/dist/commonjs/index.js +5 -2168
  103. package/dist/commonjs/metro.js +6 -468
  104. package/dist/commonjs/native/NativeInspector.d.ts +1 -0
  105. package/dist/commonjs/native/NativeInspector.js +1 -415
  106. package/dist/commonjs/native/NativeNetworkInspector.js +1 -4
  107. package/dist/commonjs/network.js +1 -13
  108. package/dist/commonjs/performance.js +1 -29
  109. package/dist/commonjs/redux.js +1 -20
  110. package/dist/commonjs/storage.js +1 -14
  111. package/dist/commonjs/styles/AppColors.js +1 -423
  112. package/dist/commonjs/styles/AppFonts.js +1 -17
  113. package/dist/commonjs/styles/common.js +1 -190
  114. package/dist/commonjs/styles/index.d.ts +6 -0
  115. package/dist/commonjs/styles/index.js +1 -1589
  116. package/dist/commonjs/types/enums.d.ts +0 -1
  117. package/dist/commonjs/types/enums.js +1 -152
  118. package/dist/commonjs/types/index.js +1 -18
  119. package/dist/commonjs/types/interfaces.d.ts +2 -2
  120. package/dist/commonjs/types/interfaces.js +1 -2
  121. package/dist/esm/analytics.js +1 -2
  122. package/dist/esm/bundle.js +1 -2
  123. package/dist/esm/capture.js +1 -32
  124. package/dist/esm/components/AnalyticsDetail.js +171 -664
  125. package/dist/esm/components/AnalyticsEventCard.js +77 -335
  126. package/dist/esm/components/AnalyticsGraph.js +95 -357
  127. package/dist/esm/components/AnimatedEntrance.js +1 -6
  128. package/dist/esm/components/AppHeaderLogo.js +7 -94
  129. package/dist/esm/components/BrandCircleIcon.js +114 -119
  130. package/dist/esm/components/BrandSquareIcon.js +73 -78
  131. package/dist/esm/components/CodeSnippet.js +58 -595
  132. package/dist/esm/components/ConsoleLogCard.js +91 -526
  133. package/dist/esm/components/CopyButton.js +3 -51
  134. package/dist/esm/components/DiffViewer.js +22 -48
  135. package/dist/esm/components/DomainHeader.js +43 -138
  136. package/dist/esm/components/EmptyState.js +17 -56
  137. package/dist/esm/components/EndOfListFooter.js +15 -83
  138. package/dist/esm/components/ErrorBoundary.js +125 -582
  139. package/dist/esm/components/HeadersSection.js +52 -93
  140. package/dist/esm/components/HighlightText.js +17 -53
  141. package/dist/esm/components/Inspector/AboutModal.d.ts +6 -0
  142. package/dist/esm/components/Inspector/AboutModal.js +243 -0
  143. package/dist/esm/components/Inspector/AnalyticsFilterModal.js +225 -886
  144. package/dist/esm/components/Inspector/AnalyticsTab.js +296 -904
  145. package/dist/esm/components/Inspector/BundleTab.js +1175 -3502
  146. package/dist/esm/components/Inspector/ConsoleTab.js +113 -488
  147. package/dist/esm/components/Inspector/CrashDetail.js +236 -747
  148. package/dist/esm/components/Inspector/CrashFilterModal.js +149 -541
  149. package/dist/esm/components/Inspector/CrashTab.js +177 -711
  150. package/dist/esm/components/Inspector/DebuggingTab.js +164 -925
  151. package/dist/esm/components/Inspector/DeviceInfoTab.js +199 -924
  152. package/dist/esm/components/Inspector/FabLauncher.js +68 -454
  153. package/dist/esm/components/Inspector/FeatureUnderDevNotice.js +14 -70
  154. package/dist/esm/components/Inspector/InspectorContext.js +1 -12
  155. package/dist/esm/components/Inspector/InspectorHeader.js +282 -1163
  156. package/dist/esm/components/Inspector/LogDetail.js +235 -1023
  157. package/dist/esm/components/Inspector/MainScreen.js +78 -323
  158. package/dist/esm/components/Inspector/MediaGalleryTab.js +143 -650
  159. package/dist/esm/components/Inspector/MediaPreviewModal.js +138 -613
  160. package/dist/esm/components/Inspector/NavigationTracker.js +1 -10
  161. package/dist/esm/components/Inspector/NetworkDetail.js +138 -455
  162. package/dist/esm/components/Inspector/NetworkFilterModal.js +122 -597
  163. package/dist/esm/components/Inspector/NetworkTab.js +125 -517
  164. package/dist/esm/components/Inspector/NpmStarPrompt.js +58 -434
  165. package/dist/esm/components/Inspector/NpmUpdateToast.js +45 -281
  166. package/dist/esm/components/Inspector/PerformanceTab.js +393 -1570
  167. package/dist/esm/components/Inspector/ReduxDetail.js +307 -1170
  168. package/dist/esm/components/Inspector/ReduxTab.js +144 -722
  169. package/dist/esm/components/Inspector/SettingsPanel.js +643 -3985
  170. package/dist/esm/components/Inspector/SkeletonPlaceholder.js +30 -163
  171. package/dist/esm/components/Inspector/StorageTab.js +172 -866
  172. package/dist/esm/components/Inspector/TabBar.js +45 -305
  173. package/dist/esm/components/Inspector/UpdateAvailableModal.js +80 -418
  174. package/dist/esm/components/JsonViewer.js +179 -354
  175. package/dist/esm/components/LogCard.js +93 -565
  176. package/dist/esm/components/LogSyntaxHighlighter.js +11 -123
  177. package/dist/esm/components/MetaAccordion.js +136 -267
  178. package/dist/esm/components/MiniBarChart.js +3 -18
  179. package/dist/esm/components/MiniLineChart.js +3 -20
  180. package/dist/esm/components/NetworkIcons.d.ts +13 -0
  181. package/dist/esm/components/NetworkIcons.js +523 -838
  182. package/dist/esm/components/QRCodeView.js +8 -45
  183. package/dist/esm/components/SectionHeader.js +22 -39
  184. package/dist/esm/components/SegmentedTabs.js +8 -58
  185. package/dist/esm/components/SkeletonPlaceholder.js +30 -163
  186. package/dist/esm/components/Slider.js +24 -213
  187. package/dist/esm/components/SourcePageCard.js +65 -86
  188. package/dist/esm/components/Toast.js +10 -117
  189. package/dist/esm/components/TouchableScale.js +3 -19
  190. package/dist/esm/components/TreeNode.js +58 -95
  191. package/dist/esm/console.js +1 -2
  192. package/dist/esm/constants/index.js +1 -28
  193. package/dist/esm/constants/telemetryConfig.js +1 -3
  194. package/dist/esm/constants/version.d.ts +1 -1
  195. package/dist/esm/constants/version.js +1 -1
  196. package/dist/esm/crash.js +1 -2
  197. package/dist/esm/customHooks/analyticsLogger.js +1 -230
  198. package/dist/esm/customHooks/bundleAnalyzer.js +1 -944
  199. package/dist/esm/customHooks/consoleLogger.js +6 -432
  200. package/dist/esm/customHooks/crashHandler.js +7 -630
  201. package/dist/esm/customHooks/logFilters.js +1 -20
  202. package/dist/esm/customHooks/networkLogger.js +2 -519
  203. package/dist/esm/customHooks/performanceTracker.js +63 -723
  204. package/dist/esm/customHooks/reduxLogger.js +2 -293
  205. package/dist/esm/customHooks/storageInspector.js +1 -418
  206. package/dist/esm/customHooks/useAccordion.js +1 -16
  207. package/dist/esm/decorators/index.js +1 -95
  208. package/dist/esm/helpers/gaAnalyticsRegistry.js +1 -143
  209. package/dist/esm/helpers/index.d.ts +1 -0
  210. package/dist/esm/helpers/index.js +8 -861
  211. package/dist/esm/helpers/memoryManager.js +1 -91
  212. package/dist/esm/helpers/qrGenerator.js +1 -364
  213. package/dist/esm/helpers/remoteConfig.js +1 -160
  214. package/dist/esm/helpers/searchQueryParser.js +1 -59
  215. package/dist/esm/helpers/settingsStore.js +1 -134
  216. package/dist/esm/helpers/telemetry.js +1 -489
  217. package/dist/esm/helpers/toast.js +1 -15
  218. package/dist/esm/i18n/index.js +1 -78
  219. package/dist/esm/i18n/locales/en.json +1 -1140
  220. package/dist/esm/index.js +7 -1982
  221. package/dist/esm/metro.js +6 -459
  222. package/dist/esm/native/NativeInspector.d.ts +1 -0
  223. package/dist/esm/native/NativeInspector.js +1 -382
  224. package/dist/esm/native/NativeNetworkInspector.js +1 -2
  225. package/dist/esm/network.js +1 -1
  226. package/dist/esm/performance.js +1 -2
  227. package/dist/esm/redux.js +1 -1
  228. package/dist/esm/storage.js +1 -1
  229. package/dist/esm/styles/AppColors.js +1 -417
  230. package/dist/esm/styles/AppFonts.js +1 -13
  231. package/dist/esm/styles/common.js +1 -186
  232. package/dist/esm/styles/index.d.ts +6 -0
  233. package/dist/esm/styles/index.js +1 -1551
  234. package/dist/esm/types/enums.d.ts +0 -1
  235. package/dist/esm/types/enums.js +1 -149
  236. package/dist/esm/types/index.js +1 -2
  237. package/dist/esm/types/interfaces.d.ts +2 -2
  238. package/dist/esm/types/interfaces.js +1 -1
  239. package/ios/NetworkInspectorModule.mm +60 -12
  240. package/package.json +5 -3
  241. package/src/native/NativeInspector.ts +18 -0
  242. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +0 -7
  243. package/dist/commonjs/components/Inspector/FeedbackModal.js +0 -552
  244. package/dist/esm/components/Inspector/FeedbackModal.d.ts +0 -7
  245. package/dist/esm/components/Inspector/FeedbackModal.js +0 -515
  246. package/src/analytics.ts +0 -35
  247. package/src/bundle.ts +0 -25
  248. package/src/capture.ts +0 -109
  249. package/src/components/AnalyticsDetail.tsx +0 -870
  250. package/src/components/AnalyticsEventCard.tsx +0 -444
  251. package/src/components/AnalyticsGraph.tsx +0 -583
  252. package/src/components/AnimatedEntrance.tsx +0 -20
  253. package/src/components/AppHeaderLogo.tsx +0 -143
  254. package/src/components/BrandCircleIcon.tsx +0 -144
  255. package/src/components/BrandSquareIcon.tsx +0 -184
  256. package/src/components/CodeSnippet.tsx +0 -725
  257. package/src/components/ConsoleLogCard.tsx +0 -679
  258. package/src/components/CopyButton.tsx +0 -87
  259. package/src/components/DiffViewer.tsx +0 -82
  260. package/src/components/DomainHeader.tsx +0 -224
  261. package/src/components/EmptyState.tsx +0 -97
  262. package/src/components/EndOfListFooter.tsx +0 -100
  263. package/src/components/ErrorBoundary.tsx +0 -688
  264. package/src/components/HeadersSection.tsx +0 -172
  265. package/src/components/HighlightText.tsx +0 -100
  266. package/src/components/Inspector/AnalyticsFilterModal.tsx +0 -1250
  267. package/src/components/Inspector/AnalyticsTab.tsx +0 -1362
  268. package/src/components/Inspector/BundleTab.tsx +0 -4768
  269. package/src/components/Inspector/ConsoleTab.tsx +0 -726
  270. package/src/components/Inspector/CrashDetail.tsx +0 -997
  271. package/src/components/Inspector/CrashFilterModal.tsx +0 -721
  272. package/src/components/Inspector/CrashTab.tsx +0 -933
  273. package/src/components/Inspector/DebuggingTab.tsx +0 -1103
  274. package/src/components/Inspector/DeviceInfoTab.tsx +0 -1397
  275. package/src/components/Inspector/FabLauncher.tsx +0 -590
  276. package/src/components/Inspector/FeatureUnderDevNotice.tsx +0 -94
  277. package/src/components/Inspector/FeedbackModal.tsx +0 -626
  278. package/src/components/Inspector/InspectorContext.tsx +0 -28
  279. package/src/components/Inspector/InspectorHeader.tsx +0 -1583
  280. package/src/components/Inspector/LogDetail.tsx +0 -1431
  281. package/src/components/Inspector/MainScreen.tsx +0 -460
  282. package/src/components/Inspector/MediaGalleryTab.tsx +0 -829
  283. package/src/components/Inspector/MediaPreviewModal.tsx +0 -783
  284. package/src/components/Inspector/NavigationTracker.tsx +0 -13
  285. package/src/components/Inspector/NetworkDetail.tsx +0 -778
  286. package/src/components/Inspector/NetworkFilterModal.tsx +0 -730
  287. package/src/components/Inspector/NetworkTab.tsx +0 -820
  288. package/src/components/Inspector/NpmStarPrompt.tsx +0 -532
  289. package/src/components/Inspector/NpmUpdateToast.tsx +0 -387
  290. package/src/components/Inspector/PerformanceTab.tsx +0 -1967
  291. package/src/components/Inspector/ReduxDetail.tsx +0 -1651
  292. package/src/components/Inspector/ReduxTab.tsx +0 -987
  293. package/src/components/Inspector/SettingsPanel.tsx +0 -5136
  294. package/src/components/Inspector/SkeletonPlaceholder.tsx +0 -206
  295. package/src/components/Inspector/StorageTab.tsx +0 -1159
  296. package/src/components/Inspector/TabBar.tsx +0 -431
  297. package/src/components/Inspector/UpdateAvailableModal.tsx +0 -555
  298. package/src/components/JsonViewer.tsx +0 -549
  299. package/src/components/LogCard.tsx +0 -694
  300. package/src/components/LogSyntaxHighlighter.tsx +0 -178
  301. package/src/components/MetaAccordion.tsx +0 -355
  302. package/src/components/MiniBarChart.tsx +0 -42
  303. package/src/components/MiniLineChart.tsx +0 -33
  304. package/src/components/NetworkIcons.tsx +0 -2655
  305. package/src/components/QRCodeView.tsx +0 -75
  306. package/src/components/SectionHeader.tsx +0 -101
  307. package/src/components/SegmentedTabs.tsx +0 -84
  308. package/src/components/SkeletonPlaceholder.tsx +0 -206
  309. package/src/components/Slider.tsx +0 -300
  310. package/src/components/SourcePageCard.tsx +0 -150
  311. package/src/components/Toast.tsx +0 -131
  312. package/src/components/TouchableScale.tsx +0 -61
  313. package/src/components/TreeNode.tsx +0 -171
  314. package/src/console.ts +0 -24
  315. package/src/constants/index.ts +0 -41
  316. package/src/constants/telemetryConfig.ts +0 -4
  317. package/src/constants/version.ts +0 -3
  318. package/src/crash.ts +0 -32
  319. package/src/customHooks/analyticsLogger.ts +0 -336
  320. package/src/customHooks/bundleAnalyzer.ts +0 -1256
  321. package/src/customHooks/consoleLogger.ts +0 -530
  322. package/src/customHooks/crashHandler.ts +0 -944
  323. package/src/customHooks/logFilters.ts +0 -32
  324. package/src/customHooks/networkLogger.ts +0 -624
  325. package/src/customHooks/performanceTracker.ts +0 -1014
  326. package/src/customHooks/reduxLogger.ts +0 -406
  327. package/src/customHooks/storageInspector.ts +0 -513
  328. package/src/customHooks/useAccordion.tsx +0 -27
  329. package/src/decorators/index.ts +0 -184
  330. package/src/helpers/gaAnalyticsRegistry.ts +0 -204
  331. package/src/helpers/index.ts +0 -1092
  332. package/src/helpers/memoryManager.ts +0 -138
  333. package/src/helpers/qrGenerator.ts +0 -430
  334. package/src/helpers/remoteConfig.ts +0 -212
  335. package/src/helpers/searchQueryParser.ts +0 -84
  336. package/src/helpers/settingsStore.ts +0 -171
  337. package/src/helpers/telemetry.ts +0 -568
  338. package/src/helpers/toast.ts +0 -17
  339. package/src/i18n/index.ts +0 -104
  340. package/src/i18n/locales/en.json +0 -1141
  341. package/src/index.tsx +0 -2650
  342. package/src/metro.ts +0 -598
  343. package/src/network.ts +0 -22
  344. package/src/performance.ts +0 -38
  345. package/src/redux.ts +0 -23
  346. package/src/storage.ts +0 -18
  347. package/src/styles/AppColors.ts +0 -455
  348. package/src/styles/AppFonts.ts +0 -26
  349. package/src/styles/common.ts +0 -209
  350. package/src/styles/index.ts +0 -1606
  351. package/src/types/enums.ts +0 -210
  352. package/src/types/index.ts +0 -34
  353. package/src/types/interfaces.ts +0 -535
@@ -1,412 +1,19 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- const react_1 = __importStar(require("react"));
40
- const react_native_1 = require("react-native");
41
- const react_native_svg_1 = __importStar(require("react-native-svg"));
42
- const TouchableScale_1 = __importDefault(require("../TouchableScale"));
43
- const CopyButton_1 = __importDefault(require("../CopyButton"));
44
- const HighlightText_1 = __importDefault(require("../HighlightText"));
45
- const EndOfListFooter_1 = __importDefault(require("../EndOfListFooter"));
46
- const FeatureUnderDevNotice_1 = __importDefault(require("./FeatureUnderDevNotice"));
47
- const AppColors_1 = require("../../styles/AppColors");
48
- const AppFonts_1 = require("../../styles/AppFonts");
49
- const i18n_1 = require("../../i18n");
50
- const helpers_1 = require("../../helpers");
51
- const NetworkIcons_1 = require("../NetworkIcons");
52
- const performanceTracker_1 = require("../../customHooks/performanceTracker");
53
- const NativeInspector_1 = require("../../native/NativeInspector");
54
- const telemetry_1 = require("../../helpers/telemetry");
55
- const PerformanceTab = react_1.default.memo(() => {
56
- const { t } = (0, i18n_1.useTranslation)();
57
- const [isRecording, setIsRecording] = (0, react_1.useState)(true);
58
- const [currentFps, setCurrentFps] = (0, react_1.useState)(60);
59
- const [minFps, setMinFps] = (0, react_1.useState)(57);
60
- const [maxFps, setMaxFps] = (0, react_1.useState)(60);
61
- const [avgFps, setAvgFps] = (0, react_1.useState)(59);
62
- const [totalFrames, setTotalFrames] = (0, react_1.useState)(4820);
63
- const [jankyFrameCount, setJankyFrameCount] = (0, react_1.useState)(4);
64
- const [jsLagMs, setJsLagMs] = (0, react_1.useState)(1.2);
65
- const [expandedEventIds, setExpandedEventIds] = (0, react_1.useState)({
66
- 'perf-1': true,
67
- });
68
- const toggleEventExpand = (id) => {
69
- setExpandedEventIds(prev => ({
70
- ...prev,
71
- [id]: !prev[id],
72
- }));
73
- };
74
- const [fpsHistory, setFpsHistory] = (0, react_1.useState)([
75
- 60, 59, 60, 60, 58, 60, 59, 60, 60, 60, 57, 60, 59, 60, 60, 58, 60, 60, 59, 60,
76
- ]);
77
- const [events, setEvents] = (0, react_1.useState)(() => (0, performanceTracker_1.getPerformanceEvents)());
78
- const [filterCategory, setFilterCategory] = (0, react_1.useState)('ALL');
79
- const [search, setSearch] = (0, react_1.useState)('');
80
- (0, react_1.useEffect)(() => {
81
- const unsub = (0, performanceTracker_1.subscribePerformanceEvents)(liveEvents => {
82
- setEvents(liveEvents);
83
- });
84
- return unsub;
85
- }, []);
86
- const lastFrameTimeRef = (0, react_1.useRef)(Date.now());
87
- const rafIdRef = (0, react_1.useRef)(null);
88
- const [systemMetrics, setSystemMetrics] = (0, react_1.useState)(null);
89
- (0, react_1.useEffect)(() => {
90
- let isMounted = true;
91
- const fetchMetrics = async () => {
92
- const metrics = await (0, NativeInspector_1.getNativeSystemMetrics)();
93
- if (isMounted && metrics) {
94
- setSystemMetrics(metrics);
95
- }
96
- };
97
- fetchMetrics();
98
- const interval = setInterval(fetchMetrics, 2000);
99
- return () => {
100
- isMounted = false;
101
- clearInterval(interval);
102
- };
103
- }, []);
104
- (0, react_1.useEffect)(() => {
105
- if ((0, NativeInspector_1.isNativeModuleAvailable)()) {
106
- (0, NativeInspector_1.startNativeFpsMonitoring)();
107
- return () => {
108
- (0, NativeInspector_1.stopNativeFpsMonitoring)();
109
- };
110
- }
111
- }, []);
112
- (0, react_1.useEffect)(() => {
113
- if (!isRecording)
114
- return;
115
- let isMounted = true;
116
- let frameCount = 0;
117
- let maxLagInSecond = 0;
118
- let lastSecond = Date.now();
119
- const measureFrame = async () => {
120
- if (!isMounted)
121
- return;
122
- const now = Date.now();
123
- const delta = now - lastFrameTimeRef.current;
124
- lastFrameTimeRef.current = now;
125
- const lag = Math.max(0, delta - 16.67);
126
- if (lag > maxLagInSecond) {
127
- maxLagInSecond = lag;
128
- }
129
- frameCount++;
130
- if (now - lastSecond >= 1000) {
131
- const elapsed = now - lastSecond;
132
- let measuredFps = Math.min(120, Math.max(0, Math.round((frameCount * 1000) / elapsed)));
133
- if ((0, NativeInspector_1.isNativeModuleAvailable)()) {
134
- try {
135
- const nativeMetrics = await (0, NativeInspector_1.getNativeFpsMetrics)();
136
- if (nativeMetrics && nativeMetrics.fps > 0) {
137
- measuredFps = Math.round(nativeMetrics.fps);
138
- }
139
- }
140
- catch { }
141
- }
142
- setCurrentFps(measuredFps);
143
- setMinFps(prev => Math.min(prev, measuredFps));
144
- setMaxFps(prev => Math.max(prev, measuredFps));
145
- setTotalFrames(prev => prev + frameCount);
146
- setJsLagMs(Number(maxLagInSecond.toFixed(1)));
147
- if (measuredFps < 55) {
148
- setJankyFrameCount(prev => prev + 1);
149
- }
150
- setFpsHistory(prev => {
151
- const next = [...prev.slice(-19), measuredFps];
152
- const sum = next.reduce((a, b) => a + b, 0);
153
- setAvgFps(Math.round(sum / next.length));
154
- return next;
155
- });
156
- if (measuredFps < 50) {
157
- const durationStr = (1000 / measuredFps).toFixed(1);
158
- (0, performanceTracker_1.logPerformanceEvent)({
159
- type: 'fps_drop',
160
- category: 'render',
161
- fps: measuredFps,
162
- durationMs: Number(durationStr),
163
- label: t('performance.liveFpsDip', { fps: measuredFps }),
164
- detail: t('performance.liveFpsDipDetail', { duration: durationStr }),
165
- source: t('performance.uiRenderThread'),
166
- breakdown: {
167
- jsTimeMs: Number(((1000 / measuredFps) * 0.65).toFixed(1)),
168
- uiTimeMs: Number(((1000 / measuredFps) * 0.35).toFixed(1)),
169
- },
170
- advice: t('performance.liveFpsDipAdvice'),
171
- severity: measuredFps < 30 ? 'critical' : 'warning',
172
- });
173
- }
174
- frameCount = 0;
175
- maxLagInSecond = 0;
176
- lastSecond = now;
177
- }
178
- rafIdRef.current = requestAnimationFrame(measureFrame);
179
- };
180
- lastFrameTimeRef.current = Date.now();
181
- rafIdRef.current = requestAnimationFrame(measureFrame);
182
- return () => {
183
- isMounted = false;
184
- if (rafIdRef.current)
185
- cancelAnimationFrame(rafIdRef.current);
186
- };
187
- }, [isRecording]);
188
- const filteredEvents = (0, react_1.useMemo)(() => {
189
- return events.filter(e => {
190
- let matchSearch = true;
191
- if (search && search.trim().length > 0) {
192
- const queryTokens = search.trim().toLowerCase().split(/\s+/).filter(Boolean);
193
- const corpus = [
194
- e.label || '',
195
- e.detail || '',
196
- e.source || '',
197
- e.category || '',
198
- e.severity || '',
199
- e.bottleneckThread || '',
200
- ].join(' ').toLowerCase();
201
- matchSearch = queryTokens.every(tok => corpus.includes(tok));
202
- }
203
- const matchFilter = filterCategory === 'ALL'
204
- ? true
205
- : filterCategory === 'JANKY'
206
- ? e.severity === 'warning' || e.severity === 'critical'
207
- : filterCategory === 'NAVIGATION'
208
- ? e.category === 'navigation'
209
- : filterCategory === 'RENDER'
210
- ? e.category === 'render'
211
- : filterCategory === 'MEMORY'
212
- ? e.category === 'memory'
213
- : e.category === 'io' || e.category === 'bridge';
214
- return matchSearch && matchFilter;
215
- });
216
- }, [events, search, filterCategory]);
217
- const performanceScore = (0, react_1.useMemo)(() => {
218
- if (avgFps >= 58) {
219
- return {
220
- score: '98/100',
221
- grade: t('performance.excellent'),
222
- color: AppColors_1.AppColors.emerald600,
223
- bg: AppColors_1.AppColors.greenBg,
224
- };
225
- }
226
- if (avgFps >= 50) {
227
- return {
228
- score: '84/100',
229
- grade: t('performance.good'),
230
- color: AppColors_1.AppColors.firebaseOrange,
231
- bg: AppColors_1.AppColors.amberBg,
232
- };
233
- }
234
- return {
235
- score: '58/100',
236
- grade: t('performance.needsOptimization'),
237
- color: AppColors_1.AppColors.errorColor,
238
- bg: AppColors_1.AppColors.errorCardBg,
239
- };
240
- }, [avgFps, t]);
241
- const runtimeDiagnostics = (0, react_1.useMemo)(() => {
242
- const raw = (0, helpers_1.getRuntimeDiagnostics)();
243
- const engineNameMap = {
244
- hermes: t('performance.hermesAot'),
245
- v8: t('performance.v8Jit'),
246
- jsc: t('performance.jscEngine'),
247
- };
248
- const engineSubMap = {
249
- hermes: t('performance.bytecodeCompiled'),
250
- v8: t('performance.jitEngine'),
251
- jsc: t('performance.webkitEngine'),
252
- };
253
- const archNameMap = {
254
- fabric: t('performance.fabricJsi'),
255
- paper: t('performance.paperBridge'),
256
- };
257
- const archSubMap = {
258
- fabric: t('performance.directCppBindings'),
259
- paper: t('performance.asyncJsonBridge'),
260
- };
261
- return {
262
- jsEngineName: engineNameMap[raw.engineType],
263
- jsEngineSub: engineSubMap[raw.engineType],
264
- uiArchName: archNameMap[raw.archType],
265
- uiArchSub: archSubMap[raw.archType],
266
- usedHeapMb: raw.usedHeapMb,
267
- totalAllocMb: raw.totalAllocMb,
268
- };
269
- }, [t]);
270
- const frameBudgetStats = (0, react_1.useMemo)(() => {
271
- const frameDuration = avgFps > 0 ? 1000 / avgFps : 16.67;
272
- const jsTime = Number(Math.max(1.0, Math.min(frameDuration * 0.45, 2.0 + jsLagMs)).toFixed(1));
273
- const layoutTime = Number(Math.max(1.0, frameDuration * 0.2).toFixed(1));
274
- const renderTime = Number(Math.max(1.0, frameDuration * 0.25).toFixed(1));
275
- const totalUsed = jsTime + layoutTime + renderTime;
276
- const freeTime = Math.max(0, Number((16.67 - totalUsed).toFixed(1)));
277
- const headroomPercent = Math.max(0, Math.min(100, Math.round((freeTime / 16.67) * 100)));
278
- return {
279
- jsTime,
280
- layoutTime,
281
- renderTime,
282
- freeTime,
283
- headroomPercent,
284
- };
285
- }, [avgFps, jsLagMs]);
286
- const [selectedFpsPointIdx, setSelectedFpsPointIdx] = (0, react_1.useState)(null);
287
- const svgGraphWidth = 320;
288
- const svgGraphHeight = 64;
289
- const fpsGraphData = (0, react_1.useMemo)(() => {
290
- const points = fpsHistory.length > 0 ? fpsHistory : [60, 60];
291
- const stepX = svgGraphWidth / Math.max(1, points.length - 1);
292
- const coords = points.map((val, idx) => {
293
- const clamped = Math.max(0, Math.min(60, val));
294
- const x = Number((idx * stepX).toFixed(1));
295
- const y = Number((svgGraphHeight - (clamped / 60) * (svgGraphHeight - 14) - 6).toFixed(1));
296
- return { x, y, val };
297
- });
298
- let linePath = `M ${coords[0].x} ${coords[0].y}`;
299
- for (let i = 0; i < coords.length - 1; i++) {
300
- const p0 = coords[i];
301
- const p1 = coords[i + 1];
302
- const midX = Number(((p0.x + p1.x) / 2).toFixed(1));
303
- linePath += ` C ${midX} ${p0.y}, ${midX} ${p1.y}, ${p1.x} ${p1.y}`;
304
- }
305
- const last = coords[coords.length - 1];
306
- const first = coords[0];
307
- const areaPath = `${linePath} L ${last.x} ${svgGraphHeight} L ${first.x} ${svgGraphHeight} Z`;
308
- return { linePath, areaPath, coords };
309
- }, [fpsHistory]);
310
- const latencyBuckets = (0, react_1.useMemo)(() => {
311
- let optimal = 0;
312
- let minorJank = 0;
313
- let noticeableJank = 0;
314
- let severeFreeze = 0;
315
- fpsHistory.forEach(fps => {
316
- if (fps >= 55)
317
- optimal++;
318
- else if (fps >= 30)
319
- minorJank++;
320
- else if (fps >= 20)
321
- noticeableJank++;
322
- else
323
- severeFreeze++;
324
- });
325
- const total = Math.max(1, fpsHistory.length);
326
- return [
327
- {
328
- key: 'optimal',
329
- label: t('performance.optimalBucket'),
330
- count: optimal,
331
- percent: Number(((optimal / total) * 100).toFixed(0)),
332
- color: AppColors_1.AppColors.emerald500,
333
- bgColor: AppColors_1.AppColors.emerald100,
334
- },
335
- {
336
- key: 'minorJank',
337
- label: t('performance.minorJankBucket'),
338
- count: minorJank,
339
- percent: Number(((minorJank / total) * 100).toFixed(0)),
340
- color: AppColors_1.AppColors.amber500,
341
- bgColor: AppColors_1.AppColors.amber100,
342
- },
343
- {
344
- key: 'noticeableJank',
345
- label: t('performance.noticeableJankBucket'),
346
- count: noticeableJank,
347
- percent: Number(((noticeableJank / total) * 100).toFixed(0)),
348
- color: AppColors_1.AppColors.firebaseOrange,
349
- bgColor: AppColors_1.AppColors.lightOrange,
350
- },
351
- {
352
- key: 'severeFreeze',
353
- label: t('performance.severeFreezeBucket'),
354
- count: severeFreeze,
355
- percent: Number(((severeFreeze / total) * 100).toFixed(0)),
356
- color: AppColors_1.AppColors.errorColor,
357
- bgColor: AppColors_1.AppColors.errorCardBg,
358
- },
359
- ];
360
- }, [fpsHistory, t]);
361
- const clearEvents = () => {
362
- (0, performanceTracker_1.clearPerformanceEvents)();
363
- };
364
- const activeScrubPoint = selectedFpsPointIdx !== null && fpsGraphData.coords[selectedFpsPointIdx]
365
- ? fpsGraphData.coords[selectedFpsPointIdx]
366
- : null;
367
- return (<react_native_1.View style={perfStyles.container}>
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(r,i,g,s){s===void 0&&(s=g);var d=Object.getOwnPropertyDescriptor(i,g);(!d||("get"in d?!i.__esModule:d.writable||d.configurable))&&(d={enumerable:!0,get:function(){return i[g]}}),Object.defineProperty(r,s,d)}):(function(r,i,g,s){s===void 0&&(s=g),r[s]=i[g]})),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(r,i){Object.defineProperty(r,"default",{enumerable:!0,value:i})}):function(r,i){r.default=i}),__importStar=this&&this.__importStar||(function(){var r=function(i){return r=Object.getOwnPropertyNames||function(g){var s=[];for(var d in g)Object.prototype.hasOwnProperty.call(g,d)&&(s[s.length]=d);return s},r(i)};return function(i){if(i&&i.__esModule)return i;var g={};if(i!=null)for(var s=r(i),d=0;d<s.length;d++)s[d]!=="default"&&__createBinding(g,i,s[d]);return __setModuleDefault(g,i),g}})(),__importDefault=this&&this.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(exports,"__esModule",{value:!0});const react_1=__importStar(require("react")),react_native_1=require("react-native"),react_native_svg_1=__importStar(require("react-native-svg")),TouchableScale_1=__importDefault(require("../TouchableScale")),CopyButton_1=__importDefault(require("../CopyButton")),HighlightText_1=__importDefault(require("../HighlightText")),EndOfListFooter_1=__importDefault(require("../EndOfListFooter")),FeatureUnderDevNotice_1=__importDefault(require("./FeatureUnderDevNotice")),AppColors_1=require("../../styles/AppColors"),AppFonts_1=require("../../styles/AppFonts"),i18n_1=require("../../i18n"),helpers_1=require("../../helpers"),NetworkIcons_1=require("../NetworkIcons"),performanceTracker_1=require("../../customHooks/performanceTracker"),NativeInspector_1=require("../../native/NativeInspector"),telemetry_1=require("../../helpers/telemetry"),PerformanceTab=react_1.default.memo(()=>{const{t:r}=(0,i18n_1.useTranslation)(),[i,g]=(0,react_1.useState)(!0),[s,d]=(0,react_1.useState)(60),[W,N]=(0,react_1.useState)(57),[ae,P]=(0,react_1.useState)(60),[m,H]=(0,react_1.useState)(59),[L,j]=(0,react_1.useState)(4820),[E,O]=(0,react_1.useState)(4),[S,$]=(0,react_1.useState)(1.2),[G,q]=(0,react_1.useState)({"perf-1":!0}),J=e=>{q(t=>({...t,[e]:!t[e]}))},[h,K]=(0,react_1.useState)([60,59,60,60,58,60,59,60,60,60,57,60,59,60,60,58,60,60,59,60]),[M,U]=(0,react_1.useState)(()=>(0,performanceTracker_1.getPerformanceEvents)()),[x,Y]=(0,react_1.useState)("ALL"),[f,I]=(0,react_1.useState)("");(0,react_1.useEffect)(()=>(0,performanceTracker_1.subscribePerformanceEvents)(t=>{U(t)}),[]);const R=(0,react_1.useRef)(Date.now()),k=(0,react_1.useRef)(null),[y,X]=(0,react_1.useState)(null);(0,react_1.useEffect)(()=>{let e=!0;const t=async()=>{const a=await(0,NativeInspector_1.getNativeSystemMetrics)();e&&a&&X(a)};t();const o=setInterval(t,2e3);return()=>{e=!1,clearInterval(o)}},[]),(0,react_1.useEffect)(()=>{if((0,NativeInspector_1.isNativeModuleAvailable)())return(0,NativeInspector_1.startNativeFpsMonitoring)(),()=>{(0,NativeInspector_1.stopNativeFpsMonitoring)()}},[]),(0,react_1.useEffect)(()=>{if(!i)return;let e=!0,t=0,o=0,a=Date.now();const c=async()=>{if(!e)return;const p=Date.now(),T=p-R.current;R.current=p;const u=Math.max(0,T-16.67);if(u>o&&(o=u),t++,p-a>=1e3){const A=p-a;let l=Math.min(120,Math.max(0,Math.round(t*1e3/A)));if((0,NativeInspector_1.isNativeModuleAvailable)())try{const n=await(0,NativeInspector_1.getNativeFpsMetrics)();n&&n.fps>0&&(l=Math.round(n.fps))}catch{}if(d(l),N(n=>Math.min(n,l)),P(n=>Math.max(n,l)),j(n=>n+t),$(Number(o.toFixed(1))),l<55&&O(n=>n+1),K(n=>{const V=[...n.slice(-19),l],re=V.reduce((te,oe)=>te+oe,0);return H(Math.round(re/V.length)),V}),l<50){const n=(1e3/l).toFixed(1);(0,performanceTracker_1.logPerformanceEvent)({type:"fps_drop",category:"render",fps:l,durationMs:Number(n),label:r("performance.liveFpsDip",{fps:l}),detail:r("performance.liveFpsDipDetail",{duration:n}),source:r("performance.uiRenderThread"),breakdown:{jsTimeMs:Number((1e3/l*.65).toFixed(1)),uiTimeMs:Number((1e3/l*.35).toFixed(1))},advice:r("performance.liveFpsDipAdvice"),severity:l<30?"critical":"warning"})}t=0,o=0,a=p}k.current=requestAnimationFrame(c)};return R.current=Date.now(),k.current=requestAnimationFrame(c),()=>{e=!1,k.current&&cancelAnimationFrame(k.current)}},[i]);const F=(0,react_1.useMemo)(()=>M.filter(e=>{let t=!0;if(f&&f.trim().length>0){const a=f.trim().toLowerCase().split(/\s+/).filter(Boolean),c=[e.label||"",e.detail||"",e.source||"",e.category||"",e.severity||"",e.bottleneckThread||""].join(" ").toLowerCase();t=a.every(p=>c.includes(p))}const o=x==="ALL"?!0:x==="JANKY"?e.severity==="warning"||e.severity==="critical":x==="NAVIGATION"?e.category==="navigation":x==="RENDER"?e.category==="render":x==="MEMORY"?e.category==="memory":e.category==="io"||e.category==="bridge";return t&&o}),[M,f,x]),z=(0,react_1.useMemo)(()=>m>=58?{score:"98/100",grade:r("performance.excellent"),color:AppColors_1.AppColors.emerald600,bg:AppColors_1.AppColors.greenBg}:m>=50?{score:"84/100",grade:r("performance.good"),color:AppColors_1.AppColors.firebaseOrange,bg:AppColors_1.AppColors.amberBg}:{score:"58/100",grade:r("performance.needsOptimization"),color:AppColors_1.AppColors.errorColor,bg:AppColors_1.AppColors.errorCardBg},[m,r]),w=(0,react_1.useMemo)(()=>{const e=(0,helpers_1.getRuntimeDiagnostics)(),t={hermes:r("performance.hermesAot"),v8:r("performance.v8Jit"),jsc:r("performance.jscEngine")},o={hermes:r("performance.bytecodeCompiled"),v8:r("performance.jitEngine"),jsc:r("performance.webkitEngine")},a={fabric:r("performance.fabricJsi"),paper:r("performance.paperBridge")},c={fabric:r("performance.directCppBindings"),paper:r("performance.asyncJsonBridge")};return{jsEngineName:t[e.engineType],jsEngineSub:o[e.engineType],uiArchName:a[e.archType],uiArchSub:c[e.archType],usedHeapMb:e.usedHeapMb,totalAllocMb:e.totalAllocMb}},[r]),C=(0,react_1.useMemo)(()=>{const e=m>0?1e3/m:16.67,t=Number(Math.max(1,Math.min(e*.45,2+S)).toFixed(1)),o=Number(Math.max(1,e*.2).toFixed(1)),a=Number(Math.max(1,e*.25).toFixed(1)),c=t+o+a,p=Math.max(0,Number((16.67-c).toFixed(1))),T=Math.max(0,Math.min(100,Math.round(p/16.67*100)));return{jsTime:t,layoutTime:o,renderTime:a,freeTime:p,headroomPercent:T}},[m,S]),[v,Z]=(0,react_1.useState)(null),B=320,_=64,b=(0,react_1.useMemo)(()=>{const e=h.length>0?h:[60,60],t=B/Math.max(1,e.length-1),o=e.map((u,A)=>{const l=Math.max(0,Math.min(60,u)),n=Number((A*t).toFixed(1)),V=Number((_-l/60*(_-14)-6).toFixed(1));return{x:n,y:V,val:u}});let a=`M ${o[0].x} ${o[0].y}`;for(let u=0;u<o.length-1;u++){const A=o[u],l=o[u+1],n=Number(((A.x+l.x)/2).toFixed(1));a+=` C ${n} ${A.y}, ${n} ${l.y}, ${l.x} ${l.y}`}const c=o[o.length-1],p=o[0],T=`${a} L ${c.x} ${_} L ${p.x} ${_} Z`;return{linePath:a,areaPath:T,coords:o}},[h]),Q=(0,react_1.useMemo)(()=>{let e=0,t=0,o=0,a=0;h.forEach(p=>{p>=55?e++:p>=30?t++:p>=20?o++:a++});const c=Math.max(1,h.length);return[{key:"optimal",label:r("performance.optimalBucket"),count:e,percent:Number((e/c*100).toFixed(0)),color:AppColors_1.AppColors.emerald500,bgColor:AppColors_1.AppColors.emerald100},{key:"minorJank",label:r("performance.minorJankBucket"),count:t,percent:Number((t/c*100).toFixed(0)),color:AppColors_1.AppColors.amber500,bgColor:AppColors_1.AppColors.amber100},{key:"noticeableJank",label:r("performance.noticeableJankBucket"),count:o,percent:Number((o/c*100).toFixed(0)),color:AppColors_1.AppColors.firebaseOrange,bgColor:AppColors_1.AppColors.lightOrange},{key:"severeFreeze",label:r("performance.severeFreezeBucket"),count:a,percent:Number((a/c*100).toFixed(0)),color:AppColors_1.AppColors.errorColor,bgColor:AppColors_1.AppColors.errorCardBg}]},[h,r]),ee=()=>{(0,performanceTracker_1.clearPerformanceEvents)()},D=v!==null&&b.coords[v]?b.coords[v]:null;return<react_native_1.View style={perfStyles.container}>
368
2
 
369
3
  <react_native_1.View style={perfStyles.headerBar}>
370
4
  <react_native_1.View style={perfStyles.searchBox}>
371
- <NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={15}/>
372
- <react_native_1.TextInput placeholder={t('performance.searchPlaceholder')} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} value={search} onChangeText={setSearch} style={perfStyles.searchInput} autoCapitalize="none" autoCorrect={false}/>
373
- {search ? (<TouchableScale_1.default onPress={() => setSearch('')}>
374
- <NetworkIcons_1.CircleXIcon color={AppColors_1.AppColors.grayTextWeak} size={16}/>
375
- </TouchableScale_1.default>) : null}
5
+ <NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak}size={15}/>
6
+ <react_native_1.TextInput placeholder={r("performance.searchPlaceholder")}placeholderTextColor={AppColors_1.AppColors.grayTextWeak}value={f}onChangeText={I}style={perfStyles.searchInput}autoCapitalize="none"autoCorrect={!1}/>
7
+ {f?<TouchableScale_1.default onPress={()=>I("")}>
8
+ <NetworkIcons_1.CircleXIcon color={AppColors_1.AppColors.grayTextWeak}size={16}/>
9
+ </TouchableScale_1.default>:null}
376
10
  </react_native_1.View>
377
11
 
378
12
 
379
- <TouchableScale_1.default onPress={() => {
380
- setIsRecording(prev => {
381
- const next = !prev;
382
- (0, telemetry_1.trackInspectorScreenRecord)(next ? 'start' : 'stop', 'performance_fps');
383
- return next;
384
- });
385
- }} style={[
386
- perfStyles.recordToggleBtn,
387
- isRecording
388
- ? perfStyles.recordToggleActive
389
- : perfStyles.recordToggleInactive,
390
- ]}>
391
- <react_native_1.View style={[
392
- perfStyles.recordingDot,
393
- {
394
- backgroundColor: isRecording
395
- ? AppColors_1.AppColors.errorColor
396
- : AppColors_1.AppColors.grayTextWeak,
397
- },
398
- ]}/>
399
- <react_native_1.Text style={[
400
- perfStyles.recordToggleText,
401
- {
402
- color: isRecording
403
- ? AppColors_1.AppColors.errorColor
404
- : AppColors_1.AppColors.grayTextWeak,
405
- },
406
- ]}>
407
- {isRecording
408
- ? t('performance.recording')
409
- : t('performance.paused')}
13
+ <TouchableScale_1.default onPress={()=>{g(e=>{const t=!e;return(0,telemetry_1.trackInspectorScreenRecord)(t?"start":"stop","performance_fps"),t})}}style={[perfStyles.recordToggleBtn,i?perfStyles.recordToggleActive:perfStyles.recordToggleInactive]}>
14
+ <react_native_1.View style={[perfStyles.recordingDot,{backgroundColor:i?AppColors_1.AppColors.errorColor:AppColors_1.AppColors.grayTextWeak}]}/>
15
+ <react_native_1.Text style={[perfStyles.recordToggleText,{color:i?AppColors_1.AppColors.errorColor:AppColors_1.AppColors.grayTextWeak}]}>
16
+ {r(i?"performance.recording":"performance.paused")}
410
17
  </react_native_1.Text>
411
18
  </TouchableScale_1.default>
412
19
  </react_native_1.View>
@@ -415,85 +22,37 @@ const PerformanceTab = react_1.default.memo(() => {
415
22
 
416
23
 
417
24
  <react_native_1.View style={perfStyles.categoryScrollWrapper}>
418
- <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} style={perfStyles.categoryScrollView} contentContainerStyle={perfStyles.categoryScroll}>
419
- {[
420
- {
421
- key: 'ALL',
422
- label: t('performance.catAll'),
423
- icon: (color) => <NetworkIcons_1.PerformanceIcon size={12} color={color}/>,
424
- },
425
- {
426
- key: 'JANKY',
427
- label: t('performance.catJanky'),
428
- icon: (color) => <NetworkIcons_1.CircleAlertIcon size={12} color={color}/>,
429
- },
430
- {
431
- key: 'NAVIGATION',
432
- label: t('performance.catNavigation'),
433
- icon: (color) => <NetworkIcons_1.MapIcon size={12} color={color}/>,
434
- },
435
- {
436
- key: 'RENDER',
437
- label: t('performance.catRender'),
438
- icon: (color) => <NetworkIcons_1.AtomIcon size={12} color={color}/>,
439
- },
440
- {
441
- key: 'MEMORY',
442
- label: t('performance.catMemory'),
443
- icon: (color) => <NetworkIcons_1.BrainIcon size={12} color={color}/>,
444
- },
445
- {
446
- key: 'IO',
447
- label: t('performance.catIo'),
448
- icon: (color) => <NetworkIcons_1.GlobeIcon size={12} color={color}/>,
449
- },
450
- ].map(cat => {
451
- const isSelected = filterCategory === cat.key;
452
- const iconColor = isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayTextWeak;
453
- return (<TouchableScale_1.default key={cat.key} onPress={() => setFilterCategory(cat.key)} style={[
454
- perfStyles.categoryChip,
455
- isSelected && perfStyles.categoryChipActive,
456
- { flexDirection: 'row', alignItems: 'center', gap: 5 },
457
- ]}>
458
- {cat.icon(iconColor)}
459
- <react_native_1.Text style={[
460
- perfStyles.categoryChipText,
461
- isSelected && perfStyles.categoryChipTextActive,
462
- ]}>
463
- {cat.label}
25
+ <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={!1}style={perfStyles.categoryScrollView}contentContainerStyle={perfStyles.categoryScroll}>
26
+ {[{key:"ALL",label:r("performance.catAll"),icon:e=><NetworkIcons_1.PerformanceIcon size={12}color={e}/>},{key:"JANKY",label:r("performance.catJanky"),icon:e=><NetworkIcons_1.CircleAlertIcon size={12}color={e}/>},{key:"NAVIGATION",label:r("performance.catNavigation"),icon:e=><NetworkIcons_1.MapIcon size={12}color={e}/>},{key:"RENDER",label:r("performance.catRender"),icon:e=><NetworkIcons_1.AtomIcon size={12}color={e}/>},{key:"MEMORY",label:r("performance.catMemory"),icon:e=><NetworkIcons_1.BrainIcon size={12}color={e}/>},{key:"IO",label:r("performance.catIo"),icon:e=><NetworkIcons_1.GlobeIcon size={12}color={e}/>}].map(e=>{const t=x===e.key,o=t?AppColors_1.AppColors.white:AppColors_1.AppColors.grayTextWeak;return<TouchableScale_1.default key={e.key}onPress={()=>Y(e.key)}style={[perfStyles.categoryChip,t&&perfStyles.categoryChipActive,{flexDirection:"row",alignItems:"center",gap:5}]}>
27
+ {e.icon(o)}
28
+ <react_native_1.Text style={[perfStyles.categoryChipText,t&&perfStyles.categoryChipTextActive]}>
29
+ {e.label}
464
30
  </react_native_1.Text>
465
- </TouchableScale_1.default>);
466
- })}
31
+ </TouchableScale_1.default>})}
467
32
  </react_native_1.ScrollView>
468
33
  </react_native_1.View>
469
34
 
470
35
 
471
- <react_native_1.ScrollView style={perfStyles.scrollBody} contentContainerStyle={perfStyles.scrollContent} showsVerticalScrollIndicator={false}>
36
+ <react_native_1.ScrollView style={perfStyles.scrollBody}contentContainerStyle={perfStyles.scrollContent}showsVerticalScrollIndicator={!1}>
472
37
 
473
38
  <react_native_1.View style={perfStyles.heroCard}>
474
39
  <react_native_1.View style={perfStyles.heroHeaderRow}>
475
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
476
- <NetworkIcons_1.PerformanceIcon color={AppColors_1.AppColors.purple} size={17}/>
40
+ <react_native_1.View style={{flexDirection:"row",alignItems:"center",gap:6}}>
41
+ <NetworkIcons_1.PerformanceIcon color={AppColors_1.AppColors.purple}size={17}/>
477
42
  <react_native_1.View>
478
43
  <react_native_1.Text style={perfStyles.heroTitle}>
479
- {t('performance.fpsAreaChartTitle')}
44
+ {r("performance.fpsAreaChartTitle")}
480
45
  </react_native_1.Text>
481
46
  <react_native_1.Text style={perfStyles.heroSubTitle}>
482
- {t('performance.fpsAreaChartSub')}
47
+ {r("performance.fpsAreaChartSub")}
483
48
  </react_native_1.Text>
484
49
  </react_native_1.View>
485
50
  </react_native_1.View>
486
51
 
487
52
 
488
- <react_native_1.View style={[
489
- perfStyles.scorePill,
490
- { backgroundColor: performanceScore.bg },
491
- ]}>
492
- <react_native_1.Text style={[
493
- perfStyles.scorePillText,
494
- { color: performanceScore.color },
495
- ]}>
496
- {performanceScore.grade}
53
+ <react_native_1.View style={[perfStyles.scorePill,{backgroundColor:z.bg}]}>
54
+ <react_native_1.Text style={[perfStyles.scorePillText,{color:z.color}]}>
55
+ {z.grade}
497
56
  </react_native_1.Text>
498
57
  </react_native_1.View>
499
58
  </react_native_1.View>
@@ -501,134 +60,96 @@ const PerformanceTab = react_1.default.memo(() => {
501
60
 
502
61
  <react_native_1.View style={perfStyles.primaryFpsRow}>
503
62
  <react_native_1.View style={perfStyles.fpsBigNumberBox}>
504
- <react_native_1.Text style={[
505
- perfStyles.fpsBigNumber,
506
- {
507
- color: currentFps >= 55
508
- ? AppColors_1.AppColors.emerald600
509
- : currentFps >= 40
510
- ? AppColors_1.AppColors.firebaseOrange
511
- : AppColors_1.AppColors.errorColor,
512
- },
513
- ]}>
514
- {currentFps}
63
+ <react_native_1.Text style={[perfStyles.fpsBigNumber,{color:s>=55?AppColors_1.AppColors.emerald600:s>=40?AppColors_1.AppColors.firebaseOrange:AppColors_1.AppColors.errorColor}]}>
64
+ {s}
515
65
  </react_native_1.Text>
516
- <react_native_1.Text style={perfStyles.fpsUnit}>{t('performance.fpsUnit')}</react_native_1.Text>
66
+ <react_native_1.Text style={perfStyles.fpsUnit}>{r("performance.fpsUnit")}</react_native_1.Text>
517
67
  </react_native_1.View>
518
68
 
519
69
  <react_native_1.View style={perfStyles.fpsStatsGrid}>
520
70
  <react_native_1.View style={perfStyles.statItem}>
521
71
  <react_native_1.Text style={perfStyles.statLabel}>
522
- {t('performance.avgFrameTime')}
72
+ {r("performance.avgFrameTime")}
523
73
  </react_native_1.Text>
524
- <react_native_1.Text style={perfStyles.statValue}>{avgFps}</react_native_1.Text>
74
+ <react_native_1.Text style={perfStyles.statValue}>{m}</react_native_1.Text>
525
75
  </react_native_1.View>
526
76
  <react_native_1.View style={perfStyles.statItem}>
527
77
  <react_native_1.Text style={perfStyles.statLabel}>
528
- {t('performance.peakTime')}
78
+ {r("performance.peakTime")}
529
79
  </react_native_1.Text>
530
- <react_native_1.Text style={[
531
- perfStyles.statValue,
532
- minFps < 50 && { color: AppColors_1.AppColors.firebaseOrange },
533
- ]}>
534
- {minFps}
80
+ <react_native_1.Text style={[perfStyles.statValue,W<50&&{color:AppColors_1.AppColors.firebaseOrange}]}>
81
+ {W}
535
82
  </react_native_1.Text>
536
83
  </react_native_1.View>
537
84
  <react_native_1.View style={perfStyles.statItem}>
538
85
  <react_native_1.Text style={perfStyles.statLabel}>
539
- {t('performance.jsLag')}
86
+ {r("performance.jsLag")}
540
87
  </react_native_1.Text>
541
- <react_native_1.Text style={[
542
- perfStyles.statValue,
543
- jsLagMs > 5 && { color: AppColors_1.AppColors.firebaseOrange },
544
- ]}>
545
- {jsLagMs}ms
88
+ <react_native_1.Text style={[perfStyles.statValue,S>5&&{color:AppColors_1.AppColors.firebaseOrange}]}>
89
+ {S}ms
546
90
  </react_native_1.Text>
547
91
  </react_native_1.View>
548
92
  <react_native_1.View style={perfStyles.statItem}>
549
93
  <react_native_1.Text style={perfStyles.statLabel}>
550
- {t('performance.jankRate')}
94
+ {r("performance.jankRate")}
551
95
  </react_native_1.Text>
552
96
  <react_native_1.Text style={perfStyles.statValue}>
553
- {totalFrames > 0
554
- ? `${((jankyFrameCount / Math.max(1, totalFrames / 60)) *
555
- 100).toFixed(0)}%`
556
- : '0%'}
97
+ {L>0?`${(E/Math.max(1,L/60)*100).toFixed(0)}%`:"0%"}
557
98
  </react_native_1.Text>
558
99
  </react_native_1.View>
559
100
  </react_native_1.View>
560
101
  </react_native_1.View>
561
102
 
562
103
 
563
- {activeScrubPoint && (<react_native_1.View style={perfStyles.graphScrubTooltip}>
104
+ {D&&<react_native_1.View style={perfStyles.graphScrubTooltip}>
564
105
  <react_native_1.Text style={perfStyles.graphScrubTooltipText}>
565
- {activeScrubPoint.val} FPS •{' '}
566
- {Number((1000 / Math.max(1, activeScrubPoint.val)).toFixed(1))}
106
+ {D.val} FPS •{" "}
107
+ {Number((1e3/Math.max(1,D.val)).toFixed(1))}
567
108
  ms
568
109
  </react_native_1.Text>
569
- </react_native_1.View>)}
110
+ </react_native_1.View>}
570
111
 
571
112
 
572
113
  <react_native_1.View style={perfStyles.svgGraphContainer}>
573
- <react_native_svg_1.default width="100%" height={svgGraphHeight} viewBox={`0 0 ${svgGraphWidth} ${svgGraphHeight}`} preserveAspectRatio="none">
114
+ <react_native_svg_1.default width="100%"height={_}viewBox={`0 0 ${B} ${_}`}preserveAspectRatio="none">
574
115
  <react_native_svg_1.Defs>
575
- <react_native_svg_1.LinearGradient id="fpsAreaGradient" x1="0" y1="0" x2="0" y2="1">
576
- <react_native_svg_1.Stop offset="0%" stopColor={avgFps >= 55
577
- ? AppColors_1.AppColors.emerald500
578
- : avgFps >= 40
579
- ? AppColors_1.AppColors.amber500
580
- : AppColors_1.AppColors.errorColor} stopOpacity="0.32"/>
581
- <react_native_svg_1.Stop offset="100%" stopColor={avgFps >= 55
582
- ? AppColors_1.AppColors.emerald500
583
- : avgFps >= 40
584
- ? AppColors_1.AppColors.amber500
585
- : AppColors_1.AppColors.errorColor} stopOpacity="0.02"/>
116
+ <react_native_svg_1.LinearGradient id="fpsAreaGradient"x1="0"y1="0"x2="0"y2="1">
117
+ <react_native_svg_1.Stop offset="0%"stopColor={m>=55?AppColors_1.AppColors.emerald500:m>=40?AppColors_1.AppColors.amber500:AppColors_1.AppColors.errorColor}stopOpacity="0.32"/>
118
+ <react_native_svg_1.Stop offset="100%"stopColor={m>=55?AppColors_1.AppColors.emerald500:m>=40?AppColors_1.AppColors.amber500:AppColors_1.AppColors.errorColor}stopOpacity="0.02"/>
586
119
  </react_native_svg_1.LinearGradient>
587
120
  </react_native_svg_1.Defs>
588
121
 
589
122
 
590
- <react_native_svg_1.Line x1="0" y1="7" x2={svgGraphWidth} y2="7" stroke={AppColors_1.AppColors.emerald500} strokeWidth="1" strokeDasharray="4,4" opacity="0.4"/>
123
+ <react_native_svg_1.Line x1="0"y1="7"x2={B}y2="7"stroke={AppColors_1.AppColors.emerald500}strokeWidth="1"strokeDasharray="4,4"opacity="0.4"/>
591
124
 
592
125
 
593
- <react_native_svg_1.Line x1="0" y1={svgGraphHeight / 2} x2={svgGraphWidth} y2={svgGraphHeight / 2} stroke={AppColors_1.AppColors.amber500} strokeWidth="0.8" strokeDasharray="3,3" opacity="0.3"/>
126
+ <react_native_svg_1.Line x1="0"y1={_/2}x2={B}y2={_/2}stroke={AppColors_1.AppColors.amber500}strokeWidth="0.8"strokeDasharray="3,3"opacity="0.3"/>
594
127
 
595
128
 
596
- {fpsGraphData.areaPath ? (<react_native_svg_1.Path d={fpsGraphData.areaPath} fill="url(#fpsAreaGradient)"/>) : null}
129
+ {b.areaPath?<react_native_svg_1.Path d={b.areaPath}fill="url(#fpsAreaGradient)"/>:null}
597
130
 
598
131
 
599
- {fpsGraphData.linePath ? (<react_native_svg_1.Path d={fpsGraphData.linePath} fill="none" stroke={avgFps >= 55
600
- ? AppColors_1.AppColors.emerald600
601
- : avgFps >= 40
602
- ? AppColors_1.AppColors.amber600
603
- : AppColors_1.AppColors.errorColor} strokeWidth="2.2"/>) : null}
132
+ {b.linePath?<react_native_svg_1.Path d={b.linePath}fill="none"stroke={m>=55?AppColors_1.AppColors.emerald600:m>=40?AppColors_1.AppColors.amber600:AppColors_1.AppColors.errorColor}strokeWidth="2.2"/>:null}
604
133
 
605
134
 
606
- {fpsGraphData.coords.map((c, idx) => {
607
- const isSelected = selectedFpsPointIdx === idx;
608
- const isDip = c.val < 50;
609
- return (<react_native_svg_1.G key={idx}>
610
- {isDip && (<react_native_svg_1.Circle cx={c.x} cy={c.y} r="4" fill={AppColors_1.AppColors.errorColor} opacity="0.25"/>)}
611
- <react_native_svg_1.Circle cx={c.x} cy={c.y} r={isSelected ? 4 : isDip ? 2.5 : 1.8} fill={isSelected
612
- ? AppColors_1.AppColors.brandPurple
613
- : isDip
614
- ? AppColors_1.AppColors.errorColor
615
- : AppColors_1.AppColors.emerald600} stroke={AppColors_1.AppColors.white} strokeWidth={isSelected ? 1.5 : 0.8}/>
616
- </react_native_svg_1.G>);
617
- })}
135
+ {b.coords.map((e,t)=>{const o=v===t,a=e.val<50;return<react_native_svg_1.G key={t}>
136
+ {a&&<react_native_svg_1.Circle cx={e.x}cy={e.y}r="4"fill={AppColors_1.AppColors.errorColor}opacity="0.25"/>}
137
+ <react_native_svg_1.Circle cx={e.x}cy={e.y}r={o?4:a?2.5:1.8}fill={o?AppColors_1.AppColors.brandPurple:a?AppColors_1.AppColors.errorColor:AppColors_1.AppColors.emerald600}stroke={AppColors_1.AppColors.white}strokeWidth={o?1.5:.8}/>
138
+ </react_native_svg_1.G>})}
618
139
  </react_native_svg_1.default>
619
140
 
620
141
 
621
142
  <react_native_1.View style={perfStyles.svgTouchOverlay}>
622
- {fpsGraphData.coords.map((_, idx) => (<react_native_1.TouchableOpacity key={idx} style={perfStyles.svgTouchCol} activeOpacity={0.7} onPress={() => setSelectedFpsPointIdx(selectedFpsPointIdx === idx ? null : idx)}/>))}
143
+ {b.coords.map((e,t)=><react_native_1.TouchableOpacity key={t}style={perfStyles.svgTouchCol}activeOpacity={.7}onPress={()=>Z(v===t?null:t)}/>)}
623
144
  </react_native_1.View>
624
145
  </react_native_1.View>
625
146
 
626
147
  <react_native_1.View style={perfStyles.sparklineFooter}>
627
148
  <react_native_1.Text style={perfStyles.sparklineFooterText}>
628
- {t('performance.realtimeWindow')}
149
+ {r("performance.realtimeWindow")}
629
150
  </react_native_1.Text>
630
151
  <react_native_1.Text style={perfStyles.sparklineFooterTarget}>
631
- {t('performance.target60Fps', { fps: avgFps })}
152
+ {r("performance.target60Fps",{fps:m})}
632
153
  </react_native_1.Text>
633
154
  </react_native_1.View>
634
155
  </react_native_1.View>
@@ -636,55 +157,37 @@ const PerformanceTab = react_1.default.memo(() => {
636
157
 
637
158
  <react_native_1.View style={perfStyles.budgetCard}>
638
159
  <react_native_1.View style={perfStyles.budgetHeader}>
639
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
640
- <NetworkIcons_1.BoltIcon color={AppColors_1.AppColors.brandPurple} size={15}/>
160
+ <react_native_1.View style={{flexDirection:"row",alignItems:"center",gap:6}}>
161
+ <NetworkIcons_1.BoltIcon color={AppColors_1.AppColors.brandPurple}size={15}/>
641
162
  <react_native_1.View>
642
163
  <react_native_1.Text style={perfStyles.budgetTitle}>Native Hardware & System Health</react_native_1.Text>
643
164
  <react_native_1.Text style={perfStyles.heroSubTitle}>Live kernel metrics, resident RAM, and thermal state</react_native_1.Text>
644
165
  </react_native_1.View>
645
166
  </react_native_1.View>
646
- {systemMetrics && (<react_native_1.View style={{
647
- paddingHorizontal: 7,
648
- paddingVertical: 2.5,
649
- borderRadius: 5,
650
- backgroundColor: systemMetrics.thermalState === 'nominal'
651
- ? `${AppColors_1.AppColors.emerald600}18`
652
- : systemMetrics.thermalState === 'fair'
653
- ? `${AppColors_1.AppColors.amber800Warm}18`
654
- : `${AppColors_1.AppColors.errorColor}18`,
655
- }}>
656
- <react_native_1.Text style={{
657
- fontFamily: AppFonts_1.AppFonts.interBold,
658
- fontSize: 9.5,
659
- color: systemMetrics.thermalState === 'nominal'
660
- ? AppColors_1.AppColors.emerald600
661
- : systemMetrics.thermalState === 'fair'
662
- ? AppColors_1.AppColors.amber800Warm
663
- : AppColors_1.AppColors.errorColor,
664
- textTransform: 'uppercase',
665
- }}>
666
- {systemMetrics.thermalState} THERMAL
167
+ {y&&<react_native_1.View style={{paddingHorizontal:7,paddingVertical:2.5,borderRadius:5,backgroundColor:y.thermalState==="nominal"?`${AppColors_1.AppColors.emerald600}18`:y.thermalState==="fair"?`${AppColors_1.AppColors.amber800Warm}18`:`${AppColors_1.AppColors.errorColor}18`}}>
168
+ <react_native_1.Text style={{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:9.5,color:y.thermalState==="nominal"?AppColors_1.AppColors.emerald600:y.thermalState==="fair"?AppColors_1.AppColors.amber800Warm:AppColors_1.AppColors.errorColor,textTransform:"uppercase"}}>
169
+ {y.thermalState} THERMAL
667
170
  </react_native_1.Text>
668
- </react_native_1.View>)}
171
+ </react_native_1.View>}
669
172
  </react_native_1.View>
670
173
 
671
- <react_native_1.View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 8, marginTop: 10 }}>
672
- <react_native_1.View style={{ flex: 1, minWidth: 100, backgroundColor: AppColors_1.AppColors.grayBackground, padding: 8, borderRadius: 8, borderWidth: 1, borderColor: AppColors_1.AppColors.dividerColor }}>
673
- <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interRegular, fontSize: 9.5, color: AppColors_1.AppColors.grayTextWeak }}>Resident RAM</react_native_1.Text>
674
- <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 13, color: AppColors_1.AppColors.brandPurple, marginTop: 2 }}>
675
- {systemMetrics ? `${systemMetrics.residentRamMb.toFixed(1)} MB` : '18.4 MB'}
174
+ <react_native_1.View style={{flexDirection:"row",flexWrap:"wrap",gap:8,marginTop:10}}>
175
+ <react_native_1.View style={{flex:1,minWidth:100,backgroundColor:AppColors_1.AppColors.grayBackground,padding:8,borderRadius:8,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor}}>
176
+ <react_native_1.Text style={{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:9.5,color:AppColors_1.AppColors.grayTextWeak}}>Resident RAM</react_native_1.Text>
177
+ <react_native_1.Text style={{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:13,color:AppColors_1.AppColors.brandPurple,marginTop:2}}>
178
+ {y?`${y.residentRamMb.toFixed(1)} MB`:"18.4 MB"}
676
179
  </react_native_1.Text>
677
180
  </react_native_1.View>
678
- <react_native_1.View style={{ flex: 1, minWidth: 100, backgroundColor: AppColors_1.AppColors.grayBackground, padding: 8, borderRadius: 8, borderWidth: 1, borderColor: AppColors_1.AppColors.dividerColor }}>
679
- <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interRegular, fontSize: 9.5, color: AppColors_1.AppColors.grayTextWeak }}>Total Physical RAM</react_native_1.Text>
680
- <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 13, color: AppColors_1.AppColors.primaryBlack, marginTop: 2 }}>
681
- {systemMetrics ? `${Math.round(systemMetrics.totalPhysicalRamMb)} MB` : '3840 MB'}
181
+ <react_native_1.View style={{flex:1,minWidth:100,backgroundColor:AppColors_1.AppColors.grayBackground,padding:8,borderRadius:8,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor}}>
182
+ <react_native_1.Text style={{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:9.5,color:AppColors_1.AppColors.grayTextWeak}}>Total Physical RAM</react_native_1.Text>
183
+ <react_native_1.Text style={{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:13,color:AppColors_1.AppColors.primaryBlack,marginTop:2}}>
184
+ {y?`${Math.round(y.totalPhysicalRamMb)} MB`:"3840 MB"}
682
185
  </react_native_1.Text>
683
186
  </react_native_1.View>
684
- <react_native_1.View style={{ flex: 1, minWidth: 100, backgroundColor: AppColors_1.AppColors.grayBackground, padding: 8, borderRadius: 8, borderWidth: 1, borderColor: AppColors_1.AppColors.dividerColor }}>
685
- <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interRegular, fontSize: 9.5, color: AppColors_1.AppColors.grayTextWeak }}>Active CPU Cores</react_native_1.Text>
686
- <react_native_1.Text style={{ fontFamily: AppFonts_1.AppFonts.interBold, fontSize: 13, color: AppColors_1.AppColors.skyBlue, marginTop: 2 }}>
687
- {systemMetrics ? `${systemMetrics.activeCpuCores} Cores` : '6 Cores'}
187
+ <react_native_1.View style={{flex:1,minWidth:100,backgroundColor:AppColors_1.AppColors.grayBackground,padding:8,borderRadius:8,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor}}>
188
+ <react_native_1.Text style={{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:9.5,color:AppColors_1.AppColors.grayTextWeak}}>Active CPU Cores</react_native_1.Text>
189
+ <react_native_1.Text style={{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:13,color:AppColors_1.AppColors.skyBlue,marginTop:2}}>
190
+ {y?`${y.activeCpuCores} Cores`:"6 Cores"}
688
191
  </react_native_1.Text>
689
192
  </react_native_1.View>
690
193
  </react_native_1.View>
@@ -695,103 +198,79 @@ const PerformanceTab = react_1.default.memo(() => {
695
198
  <react_native_1.View style={perfStyles.budgetHeader}>
696
199
  <react_native_1.View>
697
200
  <react_native_1.Text style={perfStyles.budgetTitle}>
698
- {t('performance.frameLatencyDistTitle')}
201
+ {r("performance.frameLatencyDistTitle")}
699
202
  </react_native_1.Text>
700
203
  <react_native_1.Text style={perfStyles.heroSubTitle}>
701
- {t('performance.frameLatencyDistSub')}
204
+ {r("performance.frameLatencyDistSub")}
702
205
  </react_native_1.Text>
703
206
  </react_native_1.View>
704
207
  </react_native_1.View>
705
208
 
706
209
  <react_native_1.View style={perfStyles.histogramContainer}>
707
- {latencyBuckets.map(b => (<react_native_1.View key={b.key} style={perfStyles.histogramRow}>
210
+ {Q.map(e=><react_native_1.View key={e.key}style={perfStyles.histogramRow}>
708
211
  <react_native_1.View style={perfStyles.histogramLabelCol}>
709
- <react_native_1.View style={[perfStyles.legendDot, { backgroundColor: b.color }]}/>
710
- <react_native_1.Text style={perfStyles.histogramLabelText}>{b.label}</react_native_1.Text>
212
+ <react_native_1.View style={[perfStyles.legendDot,{backgroundColor:e.color}]}/>
213
+ <react_native_1.Text style={perfStyles.histogramLabelText}>{e.label}</react_native_1.Text>
711
214
  </react_native_1.View>
712
215
 
713
216
  <react_native_1.View style={perfStyles.histogramBarCol}>
714
217
  <react_native_1.View style={perfStyles.histogramTrack}>
715
- <react_native_1.View style={[
716
- perfStyles.histogramBarFill,
717
- {
718
- width: `${Math.max(b.percent > 0 ? 4 : 0, b.percent)}%`,
719
- backgroundColor: b.color,
720
- },
721
- ]}/>
218
+ <react_native_1.View style={[perfStyles.histogramBarFill,{width:`${Math.max(e.percent>0?4:0,e.percent)}%`,backgroundColor:e.color}]}/>
722
219
  </react_native_1.View>
723
220
  </react_native_1.View>
724
221
 
725
222
  <react_native_1.View style={perfStyles.histogramStatsCol}>
726
- <react_native_1.Text style={[
727
- perfStyles.histogramPercentText,
728
- { color: b.color },
729
- ]}>
730
- {b.percent}%
223
+ <react_native_1.Text style={[perfStyles.histogramPercentText,{color:e.color}]}>
224
+ {e.percent}%
731
225
  </react_native_1.Text>
732
226
  <react_native_1.Text style={perfStyles.histogramCountText}>
733
- ({b.count})
227
+ ({e.count})
734
228
  </react_native_1.Text>
735
229
  </react_native_1.View>
736
- </react_native_1.View>))}
230
+ </react_native_1.View>)}
737
231
  </react_native_1.View>
738
232
  </react_native_1.View>
739
233
 
740
234
 
741
235
  <react_native_1.View style={perfStyles.budgetCard}>
742
236
  <react_native_1.View style={perfStyles.budgetHeader}>
743
- <react_native_1.Text style={perfStyles.budgetTitle}>{t('performance.budgetUsage')}</react_native_1.Text>
237
+ <react_native_1.Text style={perfStyles.budgetTitle}>{r("performance.budgetUsage")}</react_native_1.Text>
744
238
  <react_native_1.Text style={perfStyles.budgetHeadroom}>
745
- {t('performance.budgetHeadroom', {
746
- time: frameBudgetStats.freeTime,
747
- percent: frameBudgetStats.headroomPercent,
748
- })}
239
+ {r("performance.budgetHeadroom",{time:C.freeTime,percent:C.headroomPercent})}
749
240
  </react_native_1.Text>
750
241
  </react_native_1.View>
751
242
 
752
243
 
753
244
  <react_native_1.View style={perfStyles.budgetBarContainer}>
754
- <react_native_1.View style={[
755
- perfStyles.budgetBarSegment,
756
- { flex: Math.max(0.5, frameBudgetStats.jsTime), backgroundColor: AppColors_1.AppColors.sky400 },
757
- ]}/>
758
- <react_native_1.View style={[
759
- perfStyles.budgetBarSegment,
760
- { flex: Math.max(0.5, frameBudgetStats.layoutTime), backgroundColor: AppColors_1.AppColors.indigo500 },
761
- ]}/>
762
- <react_native_1.View style={[
763
- perfStyles.budgetBarSegment,
764
- { flex: Math.max(0.5, frameBudgetStats.renderTime), backgroundColor: AppColors_1.AppColors.pink400 },
765
- ]}/>
766
- <react_native_1.View style={[
767
- perfStyles.budgetBarSegment,
768
- { flex: Math.max(0.5, frameBudgetStats.freeTime), backgroundColor: AppColors_1.AppColors.emerald400 },
769
- ]}/>
245
+ <react_native_1.View style={[perfStyles.budgetBarSegment,{flex:Math.max(.5,C.jsTime),backgroundColor:AppColors_1.AppColors.sky400}]}/>
246
+ <react_native_1.View style={[perfStyles.budgetBarSegment,{flex:Math.max(.5,C.layoutTime),backgroundColor:AppColors_1.AppColors.indigo500}]}/>
247
+ <react_native_1.View style={[perfStyles.budgetBarSegment,{flex:Math.max(.5,C.renderTime),backgroundColor:AppColors_1.AppColors.pink400}]}/>
248
+ <react_native_1.View style={[perfStyles.budgetBarSegment,{flex:Math.max(.5,C.freeTime),backgroundColor:AppColors_1.AppColors.emerald400}]}/>
770
249
  </react_native_1.View>
771
250
 
772
251
  <react_native_1.View style={perfStyles.budgetLegendGrid}>
773
252
  <react_native_1.View style={perfStyles.legendItem}>
774
- <react_native_1.View style={[perfStyles.legendDot, { backgroundColor: AppColors_1.AppColors.sky400 }]}/>
253
+ <react_native_1.View style={[perfStyles.legendDot,{backgroundColor:AppColors_1.AppColors.sky400}]}/>
775
254
  <react_native_1.Text style={perfStyles.legendText}>
776
- {t('performance.jsExec', { time: frameBudgetStats.jsTime })}
255
+ {r("performance.jsExec",{time:C.jsTime})}
777
256
  </react_native_1.Text>
778
257
  </react_native_1.View>
779
258
  <react_native_1.View style={perfStyles.legendItem}>
780
- <react_native_1.View style={[perfStyles.legendDot, { backgroundColor: AppColors_1.AppColors.indigo500 }]}/>
259
+ <react_native_1.View style={[perfStyles.legendDot,{backgroundColor:AppColors_1.AppColors.indigo500}]}/>
781
260
  <react_native_1.Text style={perfStyles.legendText}>
782
- {t('performance.yogaLayoutTime', { time: frameBudgetStats.layoutTime })}
261
+ {r("performance.yogaLayoutTime",{time:C.layoutTime})}
783
262
  </react_native_1.Text>
784
263
  </react_native_1.View>
785
264
  <react_native_1.View style={perfStyles.legendItem}>
786
- <react_native_1.View style={[perfStyles.legendDot, { backgroundColor: AppColors_1.AppColors.pink400 }]}/>
265
+ <react_native_1.View style={[perfStyles.legendDot,{backgroundColor:AppColors_1.AppColors.pink400}]}/>
787
266
  <react_native_1.Text style={perfStyles.legendText}>
788
- {t('performance.uiRenderTime', { time: frameBudgetStats.renderTime })}
267
+ {r("performance.uiRenderTime",{time:C.renderTime})}
789
268
  </react_native_1.Text>
790
269
  </react_native_1.View>
791
270
  <react_native_1.View style={perfStyles.legendItem}>
792
- <react_native_1.View style={[perfStyles.legendDot, { backgroundColor: AppColors_1.AppColors.emerald400 }]}/>
793
- <react_native_1.Text style={[perfStyles.legendText, { color: AppColors_1.AppColors.emerald600, fontFamily: AppFonts_1.AppFonts.interBold }]}>
794
- {t('performance.freeTime', { time: frameBudgetStats.freeTime })}
271
+ <react_native_1.View style={[perfStyles.legendDot,{backgroundColor:AppColors_1.AppColors.emerald400}]}/>
272
+ <react_native_1.Text style={[perfStyles.legendText,{color:AppColors_1.AppColors.emerald600,fontFamily:AppFonts_1.AppFonts.interBold}]}>
273
+ {r("performance.freeTime",{time:C.freeTime})}
795
274
  </react_native_1.Text>
796
275
  </react_native_1.View>
797
276
  </react_native_1.View>
@@ -800,20 +279,20 @@ const PerformanceTab = react_1.default.memo(() => {
800
279
 
801
280
  <react_native_1.View style={perfStyles.engineSummaryGrid}>
802
281
  <react_native_1.View style={perfStyles.engineSummaryCard}>
803
- <react_native_1.Text style={perfStyles.engineSummaryLabel}>{t('performance.jsEngine')}</react_native_1.Text>
804
- <react_native_1.Text style={perfStyles.engineSummaryValue}>{runtimeDiagnostics.jsEngineName}</react_native_1.Text>
805
- <react_native_1.Text style={perfStyles.engineSummarySub}>{runtimeDiagnostics.jsEngineSub}</react_native_1.Text>
282
+ <react_native_1.Text style={perfStyles.engineSummaryLabel}>{r("performance.jsEngine")}</react_native_1.Text>
283
+ <react_native_1.Text style={perfStyles.engineSummaryValue}>{w.jsEngineName}</react_native_1.Text>
284
+ <react_native_1.Text style={perfStyles.engineSummarySub}>{w.jsEngineSub}</react_native_1.Text>
806
285
  </react_native_1.View>
807
286
  <react_native_1.View style={perfStyles.engineSummaryCard}>
808
- <react_native_1.Text style={perfStyles.engineSummaryLabel}>{t('performance.uiRenderThread')}</react_native_1.Text>
809
- <react_native_1.Text style={perfStyles.engineSummaryValue}>{runtimeDiagnostics.uiArchName}</react_native_1.Text>
810
- <react_native_1.Text style={perfStyles.engineSummarySub}>{runtimeDiagnostics.uiArchSub}</react_native_1.Text>
287
+ <react_native_1.Text style={perfStyles.engineSummaryLabel}>{r("performance.uiRenderThread")}</react_native_1.Text>
288
+ <react_native_1.Text style={perfStyles.engineSummaryValue}>{w.uiArchName}</react_native_1.Text>
289
+ <react_native_1.Text style={perfStyles.engineSummarySub}>{w.uiArchSub}</react_native_1.Text>
811
290
  </react_native_1.View>
812
291
  <react_native_1.View style={perfStyles.engineSummaryCard}>
813
- <react_native_1.Text style={perfStyles.engineSummaryLabel}>{t('performance.tabMemory')}</react_native_1.Text>
814
- <react_native_1.Text style={perfStyles.engineSummaryValue}>{runtimeDiagnostics.usedHeapMb} MB</react_native_1.Text>
292
+ <react_native_1.Text style={perfStyles.engineSummaryLabel}>{r("performance.tabMemory")}</react_native_1.Text>
293
+ <react_native_1.Text style={perfStyles.engineSummaryValue}>{w.usedHeapMb} MB</react_native_1.Text>
815
294
  <react_native_1.Text style={perfStyles.engineSummarySub}>
816
- {t('performance.heapAllocatedSub', { allocated: runtimeDiagnostics.totalAllocMb })}
295
+ {r("performance.heapAllocatedSub",{allocated:w.totalAllocMb})}
817
296
  </react_native_1.Text>
818
297
  </react_native_1.View>
819
298
  </react_native_1.View>
@@ -821,849 +300,155 @@ const PerformanceTab = react_1.default.memo(() => {
821
300
 
822
301
  <react_native_1.View style={perfStyles.logsHeaderRow}>
823
302
  <react_native_1.Text style={perfStyles.logsSectionHeading}>
824
- {t('performance.recordedEvents')} ({filteredEvents.length})
303
+ {r("performance.recordedEvents")} ({F.length})
825
304
  </react_native_1.Text>
826
- {events.length > 0 && (<TouchableScale_1.default onPress={clearEvents}>
827
- <react_native_1.Text style={perfStyles.clearLink}>{t('common.clear')}</react_native_1.Text>
828
- </TouchableScale_1.default>)}
305
+ {M.length>0&&<TouchableScale_1.default onPress={ee}>
306
+ <react_native_1.Text style={perfStyles.clearLink}>{r("common.clear")}</react_native_1.Text>
307
+ </TouchableScale_1.default>}
829
308
  </react_native_1.View>
830
309
 
831
- {filteredEvents.length === 0 ? (<react_native_1.View style={perfStyles.emptyCard}>
832
- <NetworkIcons_1.BoltIcon color={AppColors_1.AppColors.amber500} size={30}/>
310
+ {F.length===0?<react_native_1.View style={perfStyles.emptyCard}>
311
+ <NetworkIcons_1.BoltIcon color={AppColors_1.AppColors.amber500}size={30}/>
833
312
  <react_native_1.Text style={perfStyles.emptyTitle}>
834
- {search.trim().length > 0 ? 'No Matching Events' : t('performance.emptyTitle')}
313
+ {f.trim().length>0?"No Matching Events":r("performance.emptyTitle")}
835
314
  </react_native_1.Text>
836
315
  <react_native_1.Text style={perfStyles.emptySub}>
837
- {search.trim().length > 0
838
- ? `No performance events match "${search}"`
839
- : t('performance.emptySubtitle')}
316
+ {f.trim().length>0?`No performance events match "${f}"`:r("performance.emptySubtitle")}
840
317
  </react_native_1.Text>
841
- {search.trim().length > 0 && (<TouchableScale_1.default onPress={() => setSearch('')} style={{
842
- marginTop: 10,
843
- paddingHorizontal: 14,
844
- paddingVertical: 6,
845
- borderRadius: 8,
846
- backgroundColor: AppColors_1.AppColors.grayBackground,
847
- borderWidth: 1,
848
- borderColor: AppColors_1.AppColors.grayBorderSecondary,
849
- }}>
850
- <react_native_1.Text style={{ color: AppColors_1.AppColors.brandPurple, fontSize: 12, fontFamily: AppFonts_1.AppFonts.interBold }}>
318
+ {f.trim().length>0&&<TouchableScale_1.default onPress={()=>I("")}style={{marginTop:10,paddingHorizontal:14,paddingVertical:6,borderRadius:8,backgroundColor:AppColors_1.AppColors.grayBackground,borderWidth:1,borderColor:AppColors_1.AppColors.grayBorderSecondary}}>
319
+ <react_native_1.Text style={{color:AppColors_1.AppColors.brandPurple,fontSize:12,fontFamily:AppFonts_1.AppFonts.interBold}}>
851
320
  Clear Search
852
321
  </react_native_1.Text>
853
- </TouchableScale_1.default>)}
854
- </react_native_1.View>) : (filteredEvents.map(event => {
855
- const isOptimal = event.severity === 'optimal';
856
- const isWarning = event.severity === 'warning';
857
- const isCritical = event.severity === 'critical';
858
- const isExpanded = !!expandedEventIds[event.id];
859
- const badgeBg = isOptimal ? AppColors_1.AppColors.greenBg : isWarning ? AppColors_1.AppColors.amberBg : AppColors_1.AppColors.errorCardBg;
860
- const badgeBorder = isOptimal ? AppColors_1.AppColors.greenBorder : isWarning ? AppColors_1.AppColors.lightOrange : AppColors_1.AppColors.errorBorder;
861
- const badgeColor = isOptimal ? AppColors_1.AppColors.emerald600 : isWarning ? AppColors_1.AppColors.amber700 : AppColors_1.AppColors.errorColor;
862
- return (<TouchableScale_1.default key={event.id} onPress={() => toggleEventExpand(event.id)} style={[
863
- perfStyles.eventCard,
864
- isCritical && { borderColor: AppColors_1.AppColors.errorBorder, backgroundColor: AppColors_1.AppColors.errorCardBg },
865
- ]}>
322
+ </TouchableScale_1.default>}
323
+ </react_native_1.View>:F.map(e=>{const t=e.severity==="optimal",o=e.severity==="warning",a=e.severity==="critical",c=!!G[e.id],p=t?AppColors_1.AppColors.greenBg:o?AppColors_1.AppColors.amberBg:AppColors_1.AppColors.errorCardBg,T=t?AppColors_1.AppColors.greenBorder:o?AppColors_1.AppColors.lightOrange:AppColors_1.AppColors.errorBorder,u=t?AppColors_1.AppColors.emerald600:o?AppColors_1.AppColors.amber700:AppColors_1.AppColors.errorColor;return<TouchableScale_1.default key={e.id}onPress={()=>J(e.id)}style={[perfStyles.eventCard,a&&{borderColor:AppColors_1.AppColors.errorBorder,backgroundColor:AppColors_1.AppColors.errorCardBg}]}>
866
324
  <react_native_1.View style={perfStyles.eventTopRow}>
867
325
  <react_native_1.View style={perfStyles.fpsBadgeGroup}>
868
- <react_native_1.View style={[
869
- perfStyles.fpsBadge,
870
- { backgroundColor: badgeBg, borderColor: badgeBorder },
871
- ]}>
872
- <react_native_1.Text style={[perfStyles.fpsBadgeText, { color: badgeColor }]}>
873
- {event.fps} FPS
326
+ <react_native_1.View style={[perfStyles.fpsBadge,{backgroundColor:p,borderColor:T}]}>
327
+ <react_native_1.Text style={[perfStyles.fpsBadgeText,{color:u}]}>
328
+ {e.fps} FPS
874
329
  </react_native_1.Text>
875
330
  </react_native_1.View>
876
331
 
877
332
 
878
- <react_native_1.View style={[
879
- perfStyles.droppedBadge,
880
- (event.droppedFrames ?? Math.max(0, 60 - event.fps)) > 0
881
- ? perfStyles.droppedBadgeWarning
882
- : perfStyles.droppedBadgeOptimal,
883
- ]}>
884
- <react_native_1.Text style={[
885
- perfStyles.droppedBadgeText,
886
- (event.droppedFrames ?? Math.max(0, 60 - event.fps)) > 0
887
- ? { color: AppColors_1.AppColors.red600 }
888
- : { color: AppColors_1.AppColors.emerald600 },
889
- ]}>
890
- {(event.droppedFrames ?? Math.max(0, 60 - event.fps)) > 0
891
- ? t('performance.droppedFrames', { count: event.droppedFrames ?? Math.max(0, 60 - event.fps) })
892
- : t('performance.zeroDropped')}
333
+ <react_native_1.View style={[perfStyles.droppedBadge,(e.droppedFrames??Math.max(0,60-e.fps))>0?perfStyles.droppedBadgeWarning:perfStyles.droppedBadgeOptimal]}>
334
+ <react_native_1.Text style={[perfStyles.droppedBadgeText,(e.droppedFrames??Math.max(0,60-e.fps))>0?{color:AppColors_1.AppColors.red600}:{color:AppColors_1.AppColors.emerald600}]}>
335
+ {(e.droppedFrames??Math.max(0,60-e.fps))>0?r("performance.droppedFrames",{count:e.droppedFrames??Math.max(0,60-e.fps)}):r("performance.zeroDropped")}
893
336
  </react_native_1.Text>
894
337
  </react_native_1.View>
895
338
 
896
339
 
897
- {event.bottleneckThread && (<react_native_1.View style={[perfStyles.bottleneckTag, { flexDirection: 'row', alignItems: 'center', gap: 3 }]}>
898
- {event.bottleneckThread === 'JS Thread' && (<NetworkIcons_1.BoltIcon size={10} color={AppColors_1.AppColors.warningIconGold}/>)}
340
+ {e.bottleneckThread&&<react_native_1.View style={[perfStyles.bottleneckTag,{flexDirection:"row",alignItems:"center",gap:3}]}>
341
+ {e.bottleneckThread==="JS Thread"&&<NetworkIcons_1.BoltIcon size={10}color={AppColors_1.AppColors.warningIconGold}/>}
899
342
  <react_native_1.Text style={perfStyles.bottleneckTagText}>
900
- {event.bottleneckThread === 'JS Thread'
901
- ? t('performance.jsBound')
902
- : event.bottleneckThread === 'UI Thread'
903
- ? t('performance.uiBound')
904
- : t('performance.balanced')}
343
+ {e.bottleneckThread==="JS Thread"?r("performance.jsBound"):e.bottleneckThread==="UI Thread"?r("performance.uiBound"):r("performance.balanced")}
905
344
  </react_native_1.Text>
906
- </react_native_1.View>)}
345
+ </react_native_1.View>}
907
346
  </react_native_1.View>
908
347
 
909
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
910
- <CopyButton_1.default value={() => event} label={t('common.copyJson')}/>
911
- <NetworkIcons_1.ChevronIcon isExpanded={isExpanded} size={14} color={AppColors_1.AppColors.grayTextWeak}/>
348
+ <react_native_1.View style={{flexDirection:"row",alignItems:"center",gap:6}}>
349
+ <CopyButton_1.default value={()=>e}label={r("common.copyJson")}/>
350
+ <NetworkIcons_1.ChevronIcon isExpanded={c}size={14}color={AppColors_1.AppColors.grayTextWeak}/>
912
351
  </react_native_1.View>
913
352
  </react_native_1.View>
914
353
 
915
354
 
916
- <react_native_1.View style={{ marginTop: 4 }}>
917
- <HighlightText_1.default text={event.label} search={search} style={perfStyles.eventLabel} highlightStyle={perfStyles.searchHighlight}/>
355
+ <react_native_1.View style={{marginTop:4}}>
356
+ <HighlightText_1.default text={e.label}search={f}style={perfStyles.eventLabel}highlightStyle={perfStyles.searchHighlight}/>
918
357
  <react_native_1.View style={perfStyles.eventMetaRow}>
919
358
  <react_native_1.Text style={perfStyles.eventMeta}>
920
- {t('performance.msTotal', {
921
- duration: event.durationMs,
922
- time: new Date(event.timestamp).toLocaleTimeString(),
923
- })}
359
+ {r("performance.msTotal",{duration:e.durationMs,time:new Date(e.timestamp).toLocaleTimeString()})}
924
360
  </react_native_1.Text>
925
361
  <react_native_1.Text style={perfStyles.eventMetaDot}>•</react_native_1.Text>
926
- <react_native_1.Text style={[
927
- perfStyles.frameBudgetHint,
928
- event.durationMs > 16.67
929
- ? { color: AppColors_1.AppColors.amber800Warm }
930
- : { color: AppColors_1.AppColors.emerald600 },
931
- ]}>
932
- {t('performance.frameBudgetMs', {
933
- time: event.durationMs,
934
- budget: Number(((event.durationMs / 16.67) * 100).toFixed(0)),
935
- })}
362
+ <react_native_1.Text style={[perfStyles.frameBudgetHint,e.durationMs>16.67?{color:AppColors_1.AppColors.amber800Warm}:{color:AppColors_1.AppColors.emerald600}]}>
363
+ {r("performance.frameBudgetMs",{time:e.durationMs,budget:Number((e.durationMs/16.67*100).toFixed(0))})}
936
364
  </react_native_1.Text>
937
365
  </react_native_1.View>
938
366
  </react_native_1.View>
939
367
 
940
368
 
941
369
  <react_native_1.View style={perfStyles.frameBarTrack}>
942
- <react_native_1.View style={[
943
- perfStyles.frameBarFill,
944
- {
945
- width: `${Math.min(100, Math.max(10, (event.durationMs / 33.33) * 100))}%`,
946
- backgroundColor: badgeColor,
947
- },
948
- ]}/>
370
+ <react_native_1.View style={[perfStyles.frameBarFill,{width:`${Math.min(100,Math.max(10,e.durationMs/33.33*100))}%`,backgroundColor:u}]}/>
949
371
  </react_native_1.View>
950
372
 
951
- <HighlightText_1.default text={event.detail} search={search} style={perfStyles.eventDetail} highlightStyle={perfStyles.searchHighlight}/>
373
+ <HighlightText_1.default text={e.detail}search={f}style={perfStyles.eventDetail}highlightStyle={perfStyles.searchHighlight}/>
952
374
 
953
375
 
954
- {isExpanded && (<react_native_1.View style={perfStyles.expandedDetailBox}>
376
+ {c&&<react_native_1.View style={perfStyles.expandedDetailBox}>
955
377
 
956
- {(event.screenName || event.source) && (<react_native_1.View style={perfStyles.sourceRow}>
957
- <react_native_1.Text style={perfStyles.sourceTag}>{t('performance.screenContext')}</react_native_1.Text>
958
- <react_native_1.Text style={perfStyles.sourceText} numberOfLines={1}>
959
- {event.screenName || event.source}
378
+ {(e.screenName||e.source)&&<react_native_1.View style={perfStyles.sourceRow}>
379
+ <react_native_1.Text style={perfStyles.sourceTag}>{r("performance.screenContext")}</react_native_1.Text>
380
+ <react_native_1.Text style={perfStyles.sourceText}numberOfLines={1}>
381
+ {e.screenName||e.source}
960
382
  </react_native_1.Text>
961
- </react_native_1.View>)}
383
+ </react_native_1.View>}
962
384
 
963
385
 
964
386
  <react_native_1.View style={perfStyles.fpsMetricsGrid}>
965
387
  <react_native_1.View style={perfStyles.fpsMetricItem}>
966
- <react_native_1.Text style={perfStyles.fpsMetricLabel}>{t('performance.target60Fps', { fps: event.fps })}</react_native_1.Text>
967
- <react_native_1.Text style={[perfStyles.fpsMetricVal, { color: badgeColor }]}>
968
- {event.fps} FPS
388
+ <react_native_1.Text style={perfStyles.fpsMetricLabel}>{r("performance.target60Fps",{fps:e.fps})}</react_native_1.Text>
389
+ <react_native_1.Text style={[perfStyles.fpsMetricVal,{color:u}]}>
390
+ {e.fps} FPS
969
391
  </react_native_1.Text>
970
392
  </react_native_1.View>
971
393
  <react_native_1.View style={perfStyles.fpsMetricItem}>
972
- <react_native_1.Text style={perfStyles.fpsMetricLabel}>{t('performance.frameDuration')}</react_native_1.Text>
394
+ <react_native_1.Text style={perfStyles.fpsMetricLabel}>{r("performance.frameDuration")}</react_native_1.Text>
973
395
  <react_native_1.Text style={perfStyles.fpsMetricVal}>
974
- {event.durationMs} ms
396
+ {e.durationMs} ms
975
397
  </react_native_1.Text>
976
398
  </react_native_1.View>
977
399
  <react_native_1.View style={perfStyles.fpsMetricItem}>
978
- <react_native_1.Text style={perfStyles.fpsMetricLabel}>{t('performance.jankRate')}</react_native_1.Text>
979
- <react_native_1.Text style={[
980
- perfStyles.fpsMetricVal,
981
- (event.droppedFrames ?? 0) > 0 ? { color: AppColors_1.AppColors.red600 } : { color: AppColors_1.AppColors.emerald600 },
982
- ]}>
983
- {event.droppedFrames ?? Math.max(0, 60 - event.fps)} frames
400
+ <react_native_1.Text style={perfStyles.fpsMetricLabel}>{r("performance.jankRate")}</react_native_1.Text>
401
+ <react_native_1.Text style={[perfStyles.fpsMetricVal,(e.droppedFrames??0)>0?{color:AppColors_1.AppColors.red600}:{color:AppColors_1.AppColors.emerald600}]}>
402
+ {e.droppedFrames??Math.max(0,60-e.fps)} frames
984
403
  </react_native_1.Text>
985
404
  </react_native_1.View>
986
405
  <react_native_1.View style={perfStyles.fpsMetricItem}>
987
- <react_native_1.Text style={perfStyles.fpsMetricLabel}>{t('performance.bottleneck')}</react_native_1.Text>
406
+ <react_native_1.Text style={perfStyles.fpsMetricLabel}>{r("performance.bottleneck")}</react_native_1.Text>
988
407
  <react_native_1.Text style={perfStyles.fpsMetricVal}>
989
- {event.bottleneckThread || t('performance.balanced')}
408
+ {e.bottleneckThread||r("performance.balanced")}
990
409
  </react_native_1.Text>
991
410
  </react_native_1.View>
992
411
  </react_native_1.View>
993
412
 
994
413
 
995
- {event.breakdown && (<react_native_1.View style={perfStyles.breakdownGrid}>
414
+ {e.breakdown&&<react_native_1.View style={perfStyles.breakdownGrid}>
996
415
  <react_native_1.View style={perfStyles.breakdownCol}>
997
- <react_native_1.Text style={perfStyles.breakdownLabel}>{t('performance.jsThread')}</react_native_1.Text>
416
+ <react_native_1.Text style={perfStyles.breakdownLabel}>{r("performance.jsThread")}</react_native_1.Text>
998
417
  <react_native_1.Text style={perfStyles.breakdownVal}>
999
- {event.breakdown.jsTimeMs} ms
418
+ {e.breakdown.jsTimeMs} ms
1000
419
  </react_native_1.Text>
1001
420
  </react_native_1.View>
1002
421
  <react_native_1.View style={perfStyles.breakdownCol}>
1003
- <react_native_1.Text style={perfStyles.breakdownLabel}>{t('performance.uiThread')}</react_native_1.Text>
422
+ <react_native_1.Text style={perfStyles.breakdownLabel}>{r("performance.uiThread")}</react_native_1.Text>
1004
423
  <react_native_1.Text style={perfStyles.breakdownVal}>
1005
- {event.breakdown.uiTimeMs} ms
424
+ {e.breakdown.uiTimeMs} ms
1006
425
  </react_native_1.Text>
1007
426
  </react_native_1.View>
1008
- {event.breakdown.bridgeLatencyMs != null && (<react_native_1.View style={perfStyles.breakdownCol}>
1009
- <react_native_1.Text style={perfStyles.breakdownLabel}>{t('performance.jsiLatency')}</react_native_1.Text>
427
+ {e.breakdown.bridgeLatencyMs!=null&&<react_native_1.View style={perfStyles.breakdownCol}>
428
+ <react_native_1.Text style={perfStyles.breakdownLabel}>{r("performance.jsiLatency")}</react_native_1.Text>
1010
429
  <react_native_1.Text style={perfStyles.breakdownVal}>
1011
- {event.breakdown.bridgeLatencyMs} ms
430
+ {e.breakdown.bridgeLatencyMs} ms
1012
431
  </react_native_1.Text>
1013
- </react_native_1.View>)}
1014
- {event.heapDeltaKb != null && (<react_native_1.View style={perfStyles.breakdownCol}>
1015
- <react_native_1.Text style={perfStyles.breakdownLabel}>{t('performance.heapImpact')}</react_native_1.Text>
1016
- <react_native_1.Text style={[
1017
- perfStyles.breakdownVal,
1018
- { color: event.heapDeltaKb > 0 ? AppColors_1.AppColors.amber700 : AppColors_1.AppColors.emerald600 },
1019
- ]}>
1020
- {event.heapDeltaKb > 0 ? `+${event.heapDeltaKb}` : event.heapDeltaKb} KB
432
+ </react_native_1.View>}
433
+ {e.heapDeltaKb!=null&&<react_native_1.View style={perfStyles.breakdownCol}>
434
+ <react_native_1.Text style={perfStyles.breakdownLabel}>{r("performance.heapImpact")}</react_native_1.Text>
435
+ <react_native_1.Text style={[perfStyles.breakdownVal,{color:e.heapDeltaKb>0?AppColors_1.AppColors.amber700:AppColors_1.AppColors.emerald600}]}>
436
+ {e.heapDeltaKb>0?`+${e.heapDeltaKb}`:e.heapDeltaKb} KB
1021
437
  </react_native_1.Text>
1022
- </react_native_1.View>)}
1023
- </react_native_1.View>)}
438
+ </react_native_1.View>}
439
+ </react_native_1.View>}
1024
440
 
1025
441
 
1026
- {event.advice && (<react_native_1.View style={perfStyles.adviceCard}>
1027
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 5 }}>
1028
- <NetworkIcons_1.LightbulbIcon color={AppColors_1.AppColors.purpleShade700} size={12}/>
1029
- <react_native_1.Text style={perfStyles.adviceHeading}>{t('performance.optimizationTip')}</react_native_1.Text>
442
+ {e.advice&&<react_native_1.View style={perfStyles.adviceCard}>
443
+ <react_native_1.View style={{flexDirection:"row",alignItems:"center",gap:5}}>
444
+ <NetworkIcons_1.LightbulbIcon color={AppColors_1.AppColors.purpleShade700}size={12}/>
445
+ <react_native_1.Text style={perfStyles.adviceHeading}>{r("performance.optimizationTip")}</react_native_1.Text>
1030
446
  </react_native_1.View>
1031
- <react_native_1.Text style={perfStyles.adviceBodyText}>{event.advice}</react_native_1.Text>
1032
- </react_native_1.View>)}
1033
- </react_native_1.View>)}
1034
- </TouchableScale_1.default>);
1035
- }))}
447
+ <react_native_1.Text style={perfStyles.adviceBodyText}>{e.advice}</react_native_1.Text>
448
+ </react_native_1.View>}
449
+ </react_native_1.View>}
450
+ </TouchableScale_1.default>})}
1036
451
 
1037
- <EndOfListFooter_1.default count={filteredEvents.length} label={t('performance.recordedEvents')}/>
452
+ <EndOfListFooter_1.default count={F.length}label={r("performance.recordedEvents")}/>
1038
453
  </react_native_1.ScrollView>
1039
- </react_native_1.View>);
1040
- });
1041
- const perfStyles = react_native_1.StyleSheet.create({
1042
- container: {
1043
- flex: 1,
1044
- backgroundColor: AppColors_1.AppColors.grayBackground,
1045
- },
1046
- headerBar: {
1047
- flexDirection: 'row',
1048
- alignItems: 'center',
1049
- paddingHorizontal: 12,
1050
- paddingVertical: 8,
1051
- backgroundColor: AppColors_1.AppColors.white,
1052
- borderBottomWidth: 1,
1053
- borderBottomColor: AppColors_1.AppColors.dividerColor,
1054
- gap: 8,
1055
- },
1056
- searchBox: {
1057
- flex: 1,
1058
- flexDirection: 'row',
1059
- alignItems: 'center',
1060
- backgroundColor: AppColors_1.AppColors.grayBackground,
1061
- borderRadius: 8,
1062
- paddingHorizontal: 8,
1063
- height: 36,
1064
- gap: 6,
1065
- borderWidth: 1,
1066
- borderColor: AppColors_1.AppColors.dividerColor,
1067
- },
1068
- searchInput: {
1069
- flex: 1,
1070
- fontFamily: AppFonts_1.AppFonts.interRegular,
1071
- fontSize: 12,
1072
- color: AppColors_1.AppColors.primaryBlack,
1073
- paddingVertical: 0,
1074
- },
1075
- recordToggleBtn: {
1076
- flexDirection: 'row',
1077
- alignItems: 'center',
1078
- gap: 5,
1079
- paddingHorizontal: 8,
1080
- paddingVertical: 6,
1081
- borderRadius: 7,
1082
- borderWidth: 1,
1083
- },
1084
- recordToggleActive: {
1085
- backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
1086
- borderColor: `${AppColors_1.AppColors.errorColor}30`,
1087
- },
1088
- recordToggleInactive: {
1089
- backgroundColor: AppColors_1.AppColors.graySurface,
1090
- borderColor: AppColors_1.AppColors.dividerColor,
1091
- },
1092
- recordingDot: {
1093
- width: 6,
1094
- height: 6,
1095
- borderRadius: 3,
1096
- },
1097
- recordToggleText: {
1098
- fontFamily: AppFonts_1.AppFonts.interBold,
1099
- fontSize: 11,
1100
- },
1101
- categoryScrollWrapper: {
1102
- backgroundColor: AppColors_1.AppColors.white,
1103
- borderBottomWidth: 1,
1104
- borderBottomColor: AppColors_1.AppColors.dividerColor,
1105
- height: 42,
1106
- },
1107
- categoryScrollView: {
1108
- flexGrow: 0,
1109
- height: 42,
1110
- },
1111
- categoryScroll: {
1112
- flexDirection: 'row',
1113
- alignItems: 'center',
1114
- gap: 6,
1115
- paddingHorizontal: 12,
1116
- height: 42,
1117
- },
1118
- categoryChip: {
1119
- flexDirection: 'row',
1120
- alignItems: 'center',
1121
- justifyContent: 'center',
1122
- paddingHorizontal: 12,
1123
- height: 28,
1124
- borderRadius: 14,
1125
- backgroundColor: AppColors_1.AppColors.grayBackground,
1126
- borderWidth: 1,
1127
- borderColor: AppColors_1.AppColors.dividerColor,
1128
- },
1129
- categoryChipActive: {
1130
- backgroundColor: AppColors_1.AppColors.brandPurple,
1131
- borderColor: AppColors_1.AppColors.brandPurple,
1132
- },
1133
- categoryChipText: {
1134
- fontFamily: AppFonts_1.AppFonts.interMedium,
1135
- fontSize: 11,
1136
- color: AppColors_1.AppColors.grayTextStrong,
1137
- },
1138
- categoryChipTextActive: {
1139
- fontFamily: AppFonts_1.AppFonts.interBold,
1140
- color: AppColors_1.AppColors.white,
1141
- },
1142
- scrollBody: {
1143
- flex: 1,
1144
- },
1145
- scrollContent: {
1146
- padding: 12,
1147
- gap: 10,
1148
- },
1149
- heroCard: {
1150
- backgroundColor: AppColors_1.AppColors.white,
1151
- borderRadius: 12,
1152
- padding: 14,
1153
- borderWidth: 1,
1154
- borderColor: AppColors_1.AppColors.dividerColor,
1155
- shadowColor: AppColors_1.AppColors.black,
1156
- shadowOffset: { width: 0, height: 1 },
1157
- shadowOpacity: 0.05,
1158
- shadowRadius: 3,
1159
- elevation: 1,
1160
- },
1161
- heroHeaderRow: {
1162
- flexDirection: 'row',
1163
- alignItems: 'center',
1164
- justifyContent: 'space-between',
1165
- marginBottom: 10,
1166
- },
1167
- heroTitle: {
1168
- fontFamily: AppFonts_1.AppFonts.interBold,
1169
- fontSize: 13,
1170
- color: AppColors_1.AppColors.primaryBlack,
1171
- },
1172
- heroSubTitle: {
1173
- fontFamily: AppFonts_1.AppFonts.interRegular,
1174
- fontSize: 9.5,
1175
- color: AppColors_1.AppColors.grayTextWeak,
1176
- marginTop: 1,
1177
- },
1178
- scorePill: {
1179
- paddingHorizontal: 8,
1180
- paddingVertical: 3,
1181
- borderRadius: 6,
1182
- },
1183
- scorePillText: {
1184
- fontFamily: AppFonts_1.AppFonts.interBold,
1185
- fontSize: 10.5,
1186
- },
1187
- primaryFpsRow: {
1188
- flexDirection: 'row',
1189
- alignItems: 'center',
1190
- justifyContent: 'space-between',
1191
- paddingVertical: 6,
1192
- },
1193
- fpsBigNumberBox: {
1194
- flexDirection: 'row',
1195
- alignItems: 'baseline',
1196
- gap: 4,
1197
- minWidth: 80,
1198
- },
1199
- fpsBigNumber: {
1200
- fontFamily: AppFonts_1.AppFonts.interBold,
1201
- fontSize: 42,
1202
- lineHeight: 48,
1203
- letterSpacing: -1,
1204
- minWidth: 54,
1205
- },
1206
- fpsUnit: {
1207
- fontFamily: AppFonts_1.AppFonts.interBold,
1208
- fontSize: 14,
1209
- color: AppColors_1.AppColors.grayTextWeak,
1210
- },
1211
- fpsStatsGrid: {
1212
- flexDirection: 'row',
1213
- alignItems: 'center',
1214
- gap: 8,
1215
- },
1216
- statItem: {
1217
- alignItems: 'center',
1218
- minWidth: 50,
1219
- },
1220
- statLabel: {
1221
- fontFamily: AppFonts_1.AppFonts.interRegular,
1222
- fontSize: 10,
1223
- color: AppColors_1.AppColors.grayTextWeak,
1224
- },
1225
- statValue: {
1226
- fontFamily: AppFonts_1.AppFonts.interBold,
1227
- fontSize: 13,
1228
- color: AppColors_1.AppColors.primaryBlack,
1229
- marginTop: 2,
1230
- textAlign: 'center',
1231
- },
1232
- graphScrubTooltip: {
1233
- alignSelf: 'center',
1234
- backgroundColor: AppColors_1.AppColors.primaryBlack,
1235
- paddingHorizontal: 8,
1236
- paddingVertical: 3,
1237
- borderRadius: 6,
1238
- marginBottom: 4,
1239
- },
1240
- graphScrubTooltipText: {
1241
- fontFamily: AppFonts_1.AppFonts.interBold,
1242
- fontSize: 10,
1243
- color: AppColors_1.AppColors.white,
1244
- },
1245
- svgGraphContainer: {
1246
- width: '100%',
1247
- height: 64,
1248
- marginTop: 6,
1249
- position: 'relative',
1250
- overflow: 'hidden',
1251
- borderRadius: 8,
1252
- },
1253
- svgTouchOverlay: {
1254
- position: 'absolute',
1255
- top: 0,
1256
- left: 0,
1257
- right: 0,
1258
- bottom: 0,
1259
- flexDirection: 'row',
1260
- },
1261
- svgTouchCol: {
1262
- flex: 1,
1263
- height: '100%',
1264
- },
1265
- histogramContainer: {
1266
- gap: 8,
1267
- marginTop: 4,
1268
- },
1269
- histogramRow: {
1270
- flexDirection: 'row',
1271
- alignItems: 'center',
1272
- gap: 8,
1273
- },
1274
- histogramLabelCol: {
1275
- flexDirection: 'row',
1276
- alignItems: 'center',
1277
- gap: 6,
1278
- width: 140,
1279
- },
1280
- histogramLabelText: {
1281
- fontFamily: AppFonts_1.AppFonts.interMedium,
1282
- fontSize: 10,
1283
- color: AppColors_1.AppColors.grayTextStrong,
1284
- },
1285
- histogramBarCol: {
1286
- flex: 1,
1287
- },
1288
- histogramTrack: {
1289
- height: 8,
1290
- backgroundColor: AppColors_1.AppColors.grayBackground,
1291
- borderRadius: 4,
1292
- overflow: 'hidden',
1293
- },
1294
- histogramBarFill: {
1295
- height: '100%',
1296
- borderRadius: 4,
1297
- },
1298
- histogramStatsCol: {
1299
- flexDirection: 'row',
1300
- alignItems: 'center',
1301
- gap: 4,
1302
- minWidth: 52,
1303
- justifyContent: 'flex-end',
1304
- },
1305
- histogramPercentText: {
1306
- fontFamily: AppFonts_1.AppFonts.interBold,
1307
- fontSize: 10.5,
1308
- },
1309
- histogramCountText: {
1310
- fontFamily: AppFonts_1.AppFonts.interRegular,
1311
- fontSize: 9.5,
1312
- color: AppColors_1.AppColors.grayTextWeak,
1313
- },
1314
- sparklineFooter: {
1315
- flexDirection: 'row',
1316
- alignItems: 'center',
1317
- justifyContent: 'space-between',
1318
- marginTop: 6,
1319
- },
1320
- sparklineFooterText: {
1321
- fontFamily: AppFonts_1.AppFonts.interRegular,
1322
- fontSize: 10,
1323
- color: AppColors_1.AppColors.grayTextWeak,
1324
- },
1325
- sparklineFooterTarget: {
1326
- fontFamily: AppFonts_1.AppFonts.interMedium,
1327
- fontSize: 10,
1328
- color: AppColors_1.AppColors.emerald600,
1329
- },
1330
- budgetCard: {
1331
- backgroundColor: AppColors_1.AppColors.white,
1332
- borderRadius: 12,
1333
- padding: 12,
1334
- borderWidth: 1,
1335
- borderColor: AppColors_1.AppColors.dividerColor,
1336
- gap: 8,
1337
- },
1338
- budgetHeader: {
1339
- flexDirection: 'row',
1340
- alignItems: 'center',
1341
- justifyContent: 'space-between',
1342
- },
1343
- budgetTitle: {
1344
- fontFamily: AppFonts_1.AppFonts.interBold,
1345
- fontSize: 12.5,
1346
- color: AppColors_1.AppColors.primaryBlack,
1347
- },
1348
- budgetHeadroom: {
1349
- fontFamily: AppFonts_1.AppFonts.interBold,
1350
- fontSize: 11,
1351
- color: AppColors_1.AppColors.emerald600,
1352
- },
1353
- budgetBarContainer: {
1354
- flexDirection: 'row',
1355
- height: 8,
1356
- borderRadius: 4,
1357
- overflow: 'hidden',
1358
- backgroundColor: AppColors_1.AppColors.grayBackground,
1359
- gap: 2,
1360
- },
1361
- budgetBarSegment: {
1362
- height: '100%',
1363
- borderRadius: 2,
1364
- },
1365
- budgetLegendGrid: {
1366
- flexDirection: 'row',
1367
- flexWrap: 'wrap',
1368
- gap: 10,
1369
- marginTop: 2,
1370
- },
1371
- legendItem: {
1372
- flexDirection: 'row',
1373
- alignItems: 'center',
1374
- gap: 4,
1375
- },
1376
- legendDot: {
1377
- width: 6,
1378
- height: 6,
1379
- borderRadius: 3,
1380
- },
1381
- legendText: {
1382
- fontFamily: AppFonts_1.AppFonts.interRegular,
1383
- fontSize: 10,
1384
- color: AppColors_1.AppColors.grayTextStrong,
1385
- },
1386
- engineSummaryGrid: {
1387
- flexDirection: 'row',
1388
- alignItems: 'center',
1389
- gap: 8,
1390
- },
1391
- engineSummaryCard: {
1392
- flex: 1,
1393
- backgroundColor: AppColors_1.AppColors.white,
1394
- borderRadius: 10,
1395
- padding: 10,
1396
- borderWidth: 1,
1397
- borderColor: AppColors_1.AppColors.dividerColor,
1398
- },
1399
- engineSummaryLabel: {
1400
- fontFamily: AppFonts_1.AppFonts.interMedium,
1401
- fontSize: 10,
1402
- color: AppColors_1.AppColors.grayTextWeak,
1403
- },
1404
- engineSummaryValue: {
1405
- fontFamily: AppFonts_1.AppFonts.interBold,
1406
- fontSize: 11.5,
1407
- color: AppColors_1.AppColors.primaryBlack,
1408
- marginTop: 2,
1409
- },
1410
- engineSummarySub: {
1411
- fontFamily: AppFonts_1.AppFonts.interRegular,
1412
- fontSize: 9.5,
1413
- color: AppColors_1.AppColors.grayTextWeak,
1414
- marginTop: 1,
1415
- },
1416
- logsHeaderRow: {
1417
- flexDirection: 'row',
1418
- alignItems: 'center',
1419
- justifyContent: 'space-between',
1420
- marginTop: 4,
1421
- },
1422
- logsSectionHeading: {
1423
- fontFamily: AppFonts_1.AppFonts.interBold,
1424
- fontSize: 13,
1425
- color: AppColors_1.AppColors.primaryBlack,
1426
- },
1427
- clearLink: {
1428
- fontFamily: AppFonts_1.AppFonts.interBold,
1429
- fontSize: 11.5,
1430
- color: AppColors_1.AppColors.purple,
1431
- },
1432
- eventCard: {
1433
- backgroundColor: AppColors_1.AppColors.white,
1434
- borderRadius: 10,
1435
- padding: 10,
1436
- borderWidth: 1,
1437
- borderColor: AppColors_1.AppColors.dividerColor,
1438
- gap: 6,
1439
- },
1440
- eventTopRow: {
1441
- flexDirection: 'row',
1442
- alignItems: 'center',
1443
- justifyContent: 'space-between',
1444
- },
1445
- fpsBadgeGroup: {
1446
- flexDirection: 'row',
1447
- alignItems: 'center',
1448
- gap: 6,
1449
- flexWrap: 'wrap',
1450
- },
1451
- fpsBadge: {
1452
- paddingHorizontal: 6,
1453
- paddingVertical: 2,
1454
- borderRadius: 5,
1455
- borderWidth: 1,
1456
- },
1457
- fpsBadgeText: {
1458
- fontFamily: AppFonts_1.AppFonts.interBold,
1459
- fontSize: 10,
1460
- },
1461
- droppedBadge: {
1462
- paddingHorizontal: 6,
1463
- paddingVertical: 2,
1464
- borderRadius: 5,
1465
- borderWidth: 1,
1466
- },
1467
- droppedBadgeWarning: {
1468
- backgroundColor: AppColors_1.AppColors.red100,
1469
- borderColor: AppColors_1.AppColors.errorBorder,
1470
- },
1471
- droppedBadgeOptimal: {
1472
- backgroundColor: AppColors_1.AppColors.green100,
1473
- borderColor: AppColors_1.AppColors.greenBorder,
1474
- },
1475
- droppedBadgeText: {
1476
- fontFamily: AppFonts_1.AppFonts.interBold,
1477
- fontSize: 9.5,
1478
- },
1479
- bottleneckTag: {
1480
- backgroundColor: AppColors_1.AppColors.purpleShade50,
1481
- paddingHorizontal: 5,
1482
- paddingVertical: 2,
1483
- borderRadius: 4,
1484
- borderWidth: 1,
1485
- borderColor: AppColors_1.AppColors.purpleTint2,
1486
- },
1487
- bottleneckTagText: {
1488
- fontFamily: AppFonts_1.AppFonts.interMedium,
1489
- fontSize: 9.5,
1490
- color: AppColors_1.AppColors.purple,
1491
- },
1492
- eventMetaRow: {
1493
- flexDirection: 'row',
1494
- alignItems: 'center',
1495
- gap: 6,
1496
- marginTop: 2,
1497
- flexWrap: 'wrap',
1498
- },
1499
- eventMetaDot: {
1500
- fontSize: 9,
1501
- color: AppColors_1.AppColors.grayTextWeak,
1502
- },
1503
- frameBudgetHint: {
1504
- fontFamily: AppFonts_1.AppFonts.interMedium,
1505
- fontSize: 10,
1506
- },
1507
- frameBarTrack: {
1508
- height: 4,
1509
- borderRadius: 2,
1510
- backgroundColor: AppColors_1.AppColors.graySurface,
1511
- overflow: 'hidden',
1512
- marginVertical: 4,
1513
- },
1514
- frameBarFill: {
1515
- height: '100%',
1516
- borderRadius: 2,
1517
- },
1518
- fpsMetricsGrid: {
1519
- flexDirection: 'row',
1520
- alignItems: 'center',
1521
- backgroundColor: AppColors_1.AppColors.white,
1522
- borderRadius: 6,
1523
- padding: 6,
1524
- borderWidth: 1,
1525
- borderColor: AppColors_1.AppColors.dividerColor,
1526
- justifyContent: 'space-between',
1527
- gap: 4,
1528
- },
1529
- fpsMetricItem: {
1530
- alignItems: 'center',
1531
- flex: 1,
1532
- },
1533
- fpsMetricLabel: {
1534
- fontFamily: AppFonts_1.AppFonts.interRegular,
1535
- fontSize: 8.5,
1536
- color: AppColors_1.AppColors.grayTextWeak,
1537
- textAlign: 'center',
1538
- },
1539
- fpsMetricVal: {
1540
- fontFamily: AppFonts_1.AppFonts.interBold,
1541
- fontSize: 10.5,
1542
- color: AppColors_1.AppColors.primaryBlack,
1543
- marginTop: 1,
1544
- textAlign: 'center',
1545
- },
1546
- eventLabel: {
1547
- fontFamily: AppFonts_1.AppFonts.interBold,
1548
- fontSize: 12,
1549
- color: AppColors_1.AppColors.primaryBlack,
1550
- },
1551
- eventMeta: {
1552
- fontFamily: AppFonts_1.AppFonts.interRegular,
1553
- fontSize: 10,
1554
- color: AppColors_1.AppColors.grayTextWeak,
1555
- marginTop: 1,
1556
- },
1557
- eventDetail: {
1558
- fontFamily: AppFonts_1.AppFonts.interRegular,
1559
- fontSize: 11,
1560
- color: AppColors_1.AppColors.grayTextStrong,
1561
- lineHeight: 15,
1562
- },
1563
- expandChevron: {
1564
- fontSize: 10,
1565
- color: AppColors_1.AppColors.grayTextWeak,
1566
- marginLeft: 2,
1567
- },
1568
- expandedDetailBox: {
1569
- backgroundColor: AppColors_1.AppColors.grayBackground,
1570
- borderRadius: 8,
1571
- padding: 8,
1572
- marginTop: 4,
1573
- gap: 6,
1574
- borderWidth: 1,
1575
- borderColor: AppColors_1.AppColors.dividerColor,
1576
- },
1577
- sourceRow: {
1578
- flexDirection: 'row',
1579
- alignItems: 'center',
1580
- gap: 6,
1581
- },
1582
- sourceTag: {
1583
- fontFamily: AppFonts_1.AppFonts.interBold,
1584
- fontSize: 8.5,
1585
- color: AppColors_1.AppColors.purple,
1586
- backgroundColor: `${AppColors_1.AppColors.purple}14`,
1587
- paddingHorizontal: 4,
1588
- paddingVertical: 1,
1589
- borderRadius: 3,
1590
- },
1591
- sourceText: {
1592
- fontFamily: AppFonts_1.AppFonts.interMedium,
1593
- fontSize: 10.5,
1594
- color: AppColors_1.AppColors.grayTextStrong,
1595
- flex: 1,
1596
- },
1597
- breakdownGrid: {
1598
- flexDirection: 'row',
1599
- alignItems: 'center',
1600
- backgroundColor: AppColors_1.AppColors.white,
1601
- borderRadius: 6,
1602
- padding: 6,
1603
- borderWidth: 1,
1604
- borderColor: AppColors_1.AppColors.dividerColor,
1605
- justifyContent: 'space-between',
1606
- },
1607
- breakdownCol: {
1608
- alignItems: 'center',
1609
- flex: 1,
1610
- },
1611
- breakdownLabel: {
1612
- fontFamily: AppFonts_1.AppFonts.interRegular,
1613
- fontSize: 9,
1614
- color: AppColors_1.AppColors.grayTextWeak,
1615
- },
1616
- breakdownVal: {
1617
- fontFamily: AppFonts_1.AppFonts.interBold,
1618
- fontSize: 11,
1619
- color: AppColors_1.AppColors.primaryBlack,
1620
- marginTop: 1,
1621
- },
1622
- adviceCard: {
1623
- backgroundColor: AppColors_1.AppColors.purpleTintBg,
1624
- borderRadius: 6,
1625
- padding: 6,
1626
- borderWidth: 1,
1627
- borderColor: AppColors_1.AppColors.purpleBorder,
1628
- },
1629
- adviceHeading: {
1630
- fontFamily: AppFonts_1.AppFonts.interBold,
1631
- fontSize: 10,
1632
- color: AppColors_1.AppColors.purpleShade700,
1633
- },
1634
- adviceBodyText: {
1635
- fontFamily: AppFonts_1.AppFonts.interRegular,
1636
- fontSize: 10.5,
1637
- color: AppColors_1.AppColors.purple,
1638
- lineHeight: 14,
1639
- marginTop: 1,
1640
- },
1641
- searchHighlight: {
1642
- backgroundColor: AppColors_1.AppColors.yellowHighlight,
1643
- color: AppColors_1.AppColors.amber800,
1644
- fontFamily: AppFonts_1.AppFonts.interBold,
1645
- },
1646
- emptyCard: {
1647
- backgroundColor: AppColors_1.AppColors.white,
1648
- borderRadius: 12,
1649
- padding: 24,
1650
- alignItems: 'center',
1651
- justifyContent: 'center',
1652
- gap: 8,
1653
- borderWidth: 1,
1654
- borderColor: AppColors_1.AppColors.dividerColor,
1655
- },
1656
- emptyTitle: {
1657
- fontFamily: AppFonts_1.AppFonts.interBold,
1658
- fontSize: 14,
1659
- color: AppColors_1.AppColors.primaryBlack,
1660
- },
1661
- emptySub: {
1662
- fontFamily: AppFonts_1.AppFonts.interRegular,
1663
- fontSize: 11.5,
1664
- color: AppColors_1.AppColors.grayTextWeak,
1665
- textAlign: 'center',
1666
- lineHeight: 16,
1667
- },
1668
- });
1669
- exports.default = PerformanceTab;
454
+ </react_native_1.View>}),perfStyles=react_native_1.StyleSheet.create({container:{flex:1,backgroundColor:AppColors_1.AppColors.grayBackground},headerBar:{flexDirection:"row",alignItems:"center",paddingHorizontal:12,paddingVertical:8,backgroundColor:AppColors_1.AppColors.white,borderBottomWidth:1,borderBottomColor:AppColors_1.AppColors.dividerColor,gap:8},searchBox:{flex:1,flexDirection:"row",alignItems:"center",backgroundColor:AppColors_1.AppColors.grayBackground,borderRadius:8,paddingHorizontal:8,height:36,gap:6,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor},searchInput:{flex:1,fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:12,color:AppColors_1.AppColors.primaryBlack,paddingVertical:0},recordToggleBtn:{flexDirection:"row",alignItems:"center",gap:5,paddingHorizontal:8,paddingVertical:6,borderRadius:7,borderWidth:1},recordToggleActive:{backgroundColor:`${AppColors_1.AppColors.errorColor}14`,borderColor:`${AppColors_1.AppColors.errorColor}30`},recordToggleInactive:{backgroundColor:AppColors_1.AppColors.graySurface,borderColor:AppColors_1.AppColors.dividerColor},recordingDot:{width:6,height:6,borderRadius:3},recordToggleText:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:11},categoryScrollWrapper:{backgroundColor:AppColors_1.AppColors.white,borderBottomWidth:1,borderBottomColor:AppColors_1.AppColors.dividerColor,height:42},categoryScrollView:{flexGrow:0,height:42},categoryScroll:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:12,height:42},categoryChip:{flexDirection:"row",alignItems:"center",justifyContent:"center",paddingHorizontal:12,height:28,borderRadius:14,backgroundColor:AppColors_1.AppColors.grayBackground,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor},categoryChipActive:{backgroundColor:AppColors_1.AppColors.brandPurple,borderColor:AppColors_1.AppColors.brandPurple},categoryChipText:{fontFamily:AppFonts_1.AppFonts.interMedium,fontSize:11,color:AppColors_1.AppColors.grayTextStrong},categoryChipTextActive:{fontFamily:AppFonts_1.AppFonts.interBold,color:AppColors_1.AppColors.white},scrollBody:{flex:1},scrollContent:{padding:12,gap:10},heroCard:{backgroundColor:AppColors_1.AppColors.white,borderRadius:12,padding:14,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor,shadowColor:AppColors_1.AppColors.black,shadowOffset:{width:0,height:1},shadowOpacity:.05,shadowRadius:3,elevation:1},heroHeaderRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:10},heroTitle:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:13,color:AppColors_1.AppColors.primaryBlack},heroSubTitle:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:9.5,color:AppColors_1.AppColors.grayTextWeak,marginTop:1},scorePill:{paddingHorizontal:8,paddingVertical:3,borderRadius:6},scorePillText:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:10.5},primaryFpsRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingVertical:6},fpsBigNumberBox:{flexDirection:"row",alignItems:"baseline",gap:4,minWidth:80},fpsBigNumber:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:42,lineHeight:48,letterSpacing:-1,minWidth:54},fpsUnit:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:14,color:AppColors_1.AppColors.grayTextWeak},fpsStatsGrid:{flexDirection:"row",alignItems:"center",gap:8},statItem:{alignItems:"center",minWidth:50},statLabel:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:10,color:AppColors_1.AppColors.grayTextWeak},statValue:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:13,color:AppColors_1.AppColors.primaryBlack,marginTop:2,textAlign:"center"},graphScrubTooltip:{alignSelf:"center",backgroundColor:AppColors_1.AppColors.primaryBlack,paddingHorizontal:8,paddingVertical:3,borderRadius:6,marginBottom:4},graphScrubTooltipText:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:10,color:AppColors_1.AppColors.white},svgGraphContainer:{width:"100%",height:64,marginTop:6,position:"relative",overflow:"hidden",borderRadius:8},svgTouchOverlay:{position:"absolute",top:0,left:0,right:0,bottom:0,flexDirection:"row"},svgTouchCol:{flex:1,height:"100%"},histogramContainer:{gap:8,marginTop:4},histogramRow:{flexDirection:"row",alignItems:"center",gap:8},histogramLabelCol:{flexDirection:"row",alignItems:"center",gap:6,width:140},histogramLabelText:{fontFamily:AppFonts_1.AppFonts.interMedium,fontSize:10,color:AppColors_1.AppColors.grayTextStrong},histogramBarCol:{flex:1},histogramTrack:{height:8,backgroundColor:AppColors_1.AppColors.grayBackground,borderRadius:4,overflow:"hidden"},histogramBarFill:{height:"100%",borderRadius:4},histogramStatsCol:{flexDirection:"row",alignItems:"center",gap:4,minWidth:52,justifyContent:"flex-end"},histogramPercentText:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:10.5},histogramCountText:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:9.5,color:AppColors_1.AppColors.grayTextWeak},sparklineFooter:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginTop:6},sparklineFooterText:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:10,color:AppColors_1.AppColors.grayTextWeak},sparklineFooterTarget:{fontFamily:AppFonts_1.AppFonts.interMedium,fontSize:10,color:AppColors_1.AppColors.emerald600},budgetCard:{backgroundColor:AppColors_1.AppColors.white,borderRadius:12,padding:12,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor,gap:8},budgetHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},budgetTitle:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:12.5,color:AppColors_1.AppColors.primaryBlack},budgetHeadroom:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:11,color:AppColors_1.AppColors.emerald600},budgetBarContainer:{flexDirection:"row",height:8,borderRadius:4,overflow:"hidden",backgroundColor:AppColors_1.AppColors.grayBackground,gap:2},budgetBarSegment:{height:"100%",borderRadius:2},budgetLegendGrid:{flexDirection:"row",flexWrap:"wrap",gap:10,marginTop:2},legendItem:{flexDirection:"row",alignItems:"center",gap:4},legendDot:{width:6,height:6,borderRadius:3},legendText:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:10,color:AppColors_1.AppColors.grayTextStrong},engineSummaryGrid:{flexDirection:"row",alignItems:"center",gap:8},engineSummaryCard:{flex:1,backgroundColor:AppColors_1.AppColors.white,borderRadius:10,padding:10,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor},engineSummaryLabel:{fontFamily:AppFonts_1.AppFonts.interMedium,fontSize:10,color:AppColors_1.AppColors.grayTextWeak},engineSummaryValue:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:11.5,color:AppColors_1.AppColors.primaryBlack,marginTop:2},engineSummarySub:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:9.5,color:AppColors_1.AppColors.grayTextWeak,marginTop:1},logsHeaderRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginTop:4},logsSectionHeading:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:13,color:AppColors_1.AppColors.primaryBlack},clearLink:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:11.5,color:AppColors_1.AppColors.purple},eventCard:{backgroundColor:AppColors_1.AppColors.white,borderRadius:10,padding:10,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor,gap:6},eventTopRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},fpsBadgeGroup:{flexDirection:"row",alignItems:"center",gap:6,flexWrap:"wrap"},fpsBadge:{paddingHorizontal:6,paddingVertical:2,borderRadius:5,borderWidth:1},fpsBadgeText:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:10},droppedBadge:{paddingHorizontal:6,paddingVertical:2,borderRadius:5,borderWidth:1},droppedBadgeWarning:{backgroundColor:AppColors_1.AppColors.red100,borderColor:AppColors_1.AppColors.errorBorder},droppedBadgeOptimal:{backgroundColor:AppColors_1.AppColors.green100,borderColor:AppColors_1.AppColors.greenBorder},droppedBadgeText:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:9.5},bottleneckTag:{backgroundColor:AppColors_1.AppColors.purpleShade50,paddingHorizontal:5,paddingVertical:2,borderRadius:4,borderWidth:1,borderColor:AppColors_1.AppColors.purpleTint2},bottleneckTagText:{fontFamily:AppFonts_1.AppFonts.interMedium,fontSize:9.5,color:AppColors_1.AppColors.purple},eventMetaRow:{flexDirection:"row",alignItems:"center",gap:6,marginTop:2,flexWrap:"wrap"},eventMetaDot:{fontSize:9,color:AppColors_1.AppColors.grayTextWeak},frameBudgetHint:{fontFamily:AppFonts_1.AppFonts.interMedium,fontSize:10},frameBarTrack:{height:4,borderRadius:2,backgroundColor:AppColors_1.AppColors.graySurface,overflow:"hidden",marginVertical:4},frameBarFill:{height:"100%",borderRadius:2},fpsMetricsGrid:{flexDirection:"row",alignItems:"center",backgroundColor:AppColors_1.AppColors.white,borderRadius:6,padding:6,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor,justifyContent:"space-between",gap:4},fpsMetricItem:{alignItems:"center",flex:1},fpsMetricLabel:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:8.5,color:AppColors_1.AppColors.grayTextWeak,textAlign:"center"},fpsMetricVal:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:10.5,color:AppColors_1.AppColors.primaryBlack,marginTop:1,textAlign:"center"},eventLabel:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:12,color:AppColors_1.AppColors.primaryBlack},eventMeta:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:10,color:AppColors_1.AppColors.grayTextWeak,marginTop:1},eventDetail:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:11,color:AppColors_1.AppColors.grayTextStrong,lineHeight:15},expandChevron:{fontSize:10,color:AppColors_1.AppColors.grayTextWeak,marginLeft:2},expandedDetailBox:{backgroundColor:AppColors_1.AppColors.grayBackground,borderRadius:8,padding:8,marginTop:4,gap:6,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor},sourceRow:{flexDirection:"row",alignItems:"center",gap:6},sourceTag:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:8.5,color:AppColors_1.AppColors.purple,backgroundColor:`${AppColors_1.AppColors.purple}14`,paddingHorizontal:4,paddingVertical:1,borderRadius:3},sourceText:{fontFamily:AppFonts_1.AppFonts.interMedium,fontSize:10.5,color:AppColors_1.AppColors.grayTextStrong,flex:1},breakdownGrid:{flexDirection:"row",alignItems:"center",backgroundColor:AppColors_1.AppColors.white,borderRadius:6,padding:6,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor,justifyContent:"space-between"},breakdownCol:{alignItems:"center",flex:1},breakdownLabel:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:9,color:AppColors_1.AppColors.grayTextWeak},breakdownVal:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:11,color:AppColors_1.AppColors.primaryBlack,marginTop:1},adviceCard:{backgroundColor:AppColors_1.AppColors.purpleTintBg,borderRadius:6,padding:6,borderWidth:1,borderColor:AppColors_1.AppColors.purpleBorder},adviceHeading:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:10,color:AppColors_1.AppColors.purpleShade700},adviceBodyText:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:10.5,color:AppColors_1.AppColors.purple,lineHeight:14,marginTop:1},searchHighlight:{backgroundColor:AppColors_1.AppColors.yellowHighlight,color:AppColors_1.AppColors.amber800,fontFamily:AppFonts_1.AppFonts.interBold},emptyCard:{backgroundColor:AppColors_1.AppColors.white,borderRadius:12,padding:24,alignItems:"center",justifyContent:"center",gap:8,borderWidth:1,borderColor:AppColors_1.AppColors.dividerColor},emptyTitle:{fontFamily:AppFonts_1.AppFonts.interBold,fontSize:14,color:AppColors_1.AppColors.primaryBlack},emptySub:{fontFamily:AppFonts_1.AppFonts.interRegular,fontSize:11.5,color:AppColors_1.AppColors.grayTextWeak,textAlign:"center",lineHeight:16}});exports.default=PerformanceTab;