react-native-inapp-inspector 2.0.6 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +0 -11
  2. package/dist/commonjs/components/Inspector/InspectorHeader.js +25 -28
  3. package/dist/commonjs/components/Inspector/MainScreen.js +2 -15
  4. package/dist/commonjs/components/Inspector/NetworkDetail.js +0 -15
  5. package/dist/commonjs/components/Inspector/PerformanceTab.js +18 -30
  6. package/dist/commonjs/components/Inspector/SettingsPanel.js +15 -326
  7. package/dist/commonjs/components/Inspector/TabBar.js +2 -23
  8. package/dist/commonjs/components/NetworkIcons.d.ts +0 -12
  9. package/dist/commonjs/components/NetworkIcons.js +3 -72
  10. package/dist/commonjs/constants/version.d.ts +1 -1
  11. package/dist/commonjs/constants/version.js +1 -1
  12. package/dist/commonjs/helpers/index.d.ts +0 -2
  13. package/dist/commonjs/helpers/index.js +1 -12
  14. package/dist/commonjs/helpers/telemetry.js +4 -4
  15. package/dist/commonjs/i18n/locales/en.json +2 -3
  16. package/dist/commonjs/index.d.ts +0 -1
  17. package/dist/commonjs/index.js +9 -113
  18. package/dist/commonjs/native/NativeInspector.d.ts +0 -1
  19. package/dist/commonjs/types/enums.d.ts +0 -7
  20. package/dist/commonjs/types/enums.js +0 -7
  21. package/dist/commonjs/types/interfaces.d.ts +0 -73
  22. package/dist/esm/components/Inspector/InspectorHeader.js +25 -28
  23. package/dist/esm/components/Inspector/MainScreen.js +2 -15
  24. package/dist/esm/components/Inspector/NetworkDetail.js +1 -16
  25. package/dist/esm/components/Inspector/PerformanceTab.js +19 -31
  26. package/dist/esm/components/Inspector/SettingsPanel.js +16 -327
  27. package/dist/esm/components/Inspector/TabBar.js +3 -24
  28. package/dist/esm/components/NetworkIcons.d.ts +0 -12
  29. package/dist/esm/components/NetworkIcons.js +0 -57
  30. package/dist/esm/constants/version.d.ts +1 -1
  31. package/dist/esm/constants/version.js +1 -1
  32. package/dist/esm/helpers/index.d.ts +0 -2
  33. package/dist/esm/helpers/index.js +0 -10
  34. package/dist/esm/helpers/telemetry.js +4 -4
  35. package/dist/esm/i18n/locales/en.json +2 -3
  36. package/dist/esm/index.d.ts +0 -1
  37. package/dist/esm/index.js +8 -109
  38. package/dist/esm/native/NativeInspector.d.ts +0 -1
  39. package/dist/esm/types/enums.d.ts +0 -7
  40. package/dist/esm/types/enums.js +0 -7
  41. package/dist/esm/types/interfaces.d.ts +0 -73
  42. package/ios/NetworkInspectorModule.mm +5 -12
  43. package/package.json +1 -4
  44. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  45. package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
  46. package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
  47. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  48. package/android/.gradle/8.9/executionHistory/executionHistory.lock +0 -0
  49. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  50. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  51. package/android/.gradle/8.9/gc.properties +0 -0
  52. package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
  53. package/android/.gradle/9.2.0/fileChanges/last-build.bin +0 -0
  54. package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
  55. package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
  56. package/android/.gradle/9.2.0/gc.properties +0 -0
  57. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  58. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  59. package/android/.gradle/vcs-1/gc.properties +0 -0
  60. package/android/build/reports/problems/problems-report.html +0 -659
  61. package/dist/commonjs/components/Inspector/AuditTab.d.ts +0 -3
  62. package/dist/commonjs/components/Inspector/AuditTab.js +0 -741
  63. package/dist/commonjs/components/Inspector/DeviceTab.d.ts +0 -3
  64. package/dist/commonjs/components/Inspector/DeviceTab.js +0 -717
  65. package/dist/commonjs/components/Inspector/PerformanceHud.d.ts +0 -7
  66. package/dist/commonjs/components/Inspector/PerformanceHud.js +0 -210
  67. package/dist/commonjs/components/Inspector/RequestReplayModal.d.ts +0 -9
  68. package/dist/commonjs/components/Inspector/RequestReplayModal.js +0 -792
  69. package/dist/commonjs/components/Inspector/RequestReplayView.d.ts +0 -8
  70. package/dist/commonjs/components/Inspector/RequestReplayView.js +0 -871
  71. package/dist/commonjs/components/Inspector/StorageTab.d.ts +0 -3
  72. package/dist/commonjs/components/Inspector/StorageTab.js +0 -610
  73. package/dist/commonjs/customHooks/storageInspector.d.ts +0 -13
  74. package/dist/commonjs/customHooks/storageInspector.js +0 -179
  75. package/dist/commonjs/helpers/deviceInfo.d.ts +0 -4
  76. package/dist/commonjs/helpers/deviceInfo.js +0 -94
  77. package/dist/commonjs/helpers/packageAuditor.d.ts +0 -5
  78. package/dist/commonjs/helpers/packageAuditor.js +0 -182
  79. package/dist/esm/components/Inspector/AuditTab.d.ts +0 -3
  80. package/dist/esm/components/Inspector/AuditTab.js +0 -702
  81. package/dist/esm/components/Inspector/DeviceTab.d.ts +0 -3
  82. package/dist/esm/components/Inspector/DeviceTab.js +0 -678
  83. package/dist/esm/components/Inspector/PerformanceHud.d.ts +0 -7
  84. package/dist/esm/components/Inspector/PerformanceHud.js +0 -170
  85. package/dist/esm/components/Inspector/RequestReplayModal.d.ts +0 -9
  86. package/dist/esm/components/Inspector/RequestReplayModal.js +0 -752
  87. package/dist/esm/components/Inspector/RequestReplayView.d.ts +0 -8
  88. package/dist/esm/components/Inspector/RequestReplayView.js +0 -831
  89. package/dist/esm/components/Inspector/StorageTab.d.ts +0 -3
  90. package/dist/esm/components/Inspector/StorageTab.js +0 -571
  91. package/dist/esm/customHooks/storageInspector.d.ts +0 -13
  92. package/dist/esm/customHooks/storageInspector.js +0 -170
  93. package/dist/esm/helpers/deviceInfo.d.ts +0 -4
  94. package/dist/esm/helpers/deviceInfo.js +0 -89
  95. package/dist/esm/helpers/packageAuditor.d.ts +0 -5
  96. package/dist/esm/helpers/packageAuditor.js +0 -173
@@ -9,7 +9,6 @@ import android.os.Build
9
9
  import android.os.Debug
10
10
  import android.os.Environment
11
11
  import android.os.StatFs
12
- import android.provider.Settings
13
12
  import android.util.Log
14
13
  import com.facebook.react.bridge.Arguments
15
14
  import com.facebook.react.bridge.Promise
@@ -176,16 +175,6 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
176
175
  map.putInt("apiLevel", Build.VERSION.SDK_INT)
177
176
  val cpuAbi = if (Build.SUPPORTED_ABIS.isNotEmpty()) Build.SUPPORTED_ABIS[0] else "unknown"
178
177
  map.putString("cpuAbi", cpuAbi)
179
- try {
180
- val androidId = Settings.Secure.getString(reactContext.contentResolver, Settings.Secure.ANDROID_ID)
181
- if (!androidId.isNullOrEmpty()) {
182
- map.putString("deviceId", androidId)
183
- } else {
184
- map.putString("deviceId", Build.FINGERPRINT)
185
- }
186
- } catch (e: Exception) {
187
- map.putString("deviceId", Build.FINGERPRINT)
188
- }
189
178
 
190
179
  // 6. Application Identifiers (Legal & Non-PII)
191
180
  try {
@@ -52,7 +52,7 @@ const telemetry_1 = require("../../helpers/telemetry");
52
52
  const UpdateAvailableModal_1 = require("./UpdateAvailableModal");
53
53
  const NetworkIcons_1 = require("../NetworkIcons");
54
54
  const InspectorHeader = react_1.default.memo(() => {
55
- const { modalHeightPercent, appIcon, selected, setSelected, selectedEvent, setSelectedEvent, selectedLog, setSelectedLog, selectedReduxSlice, setSelectedReduxSlice, selectedReduxAction, setSelectedReduxAction, reduxState, reduxLastActionMap, showHeaderInfo, setShowHeaderInfo, updateAvailable, latestNpmVersion, clearAnim, activePulseAnim, unreadPulseAnim, runClearAllWithAnimation, settingsPage, setSettingsPage, resetToDefaults, closeModal, detailTitle, activeTab, environment, visible, selectedCrash, setSelectedCrash, deviceInfo, } = (0, InspectorContext_1.useInspector)();
55
+ const { modalHeightPercent, appIcon, selected, setSelected, selectedEvent, setSelectedEvent, selectedLog, setSelectedLog, selectedReduxSlice, setSelectedReduxSlice, selectedReduxAction, setSelectedReduxAction, reduxState, reduxLastActionMap, showHeaderInfo, setShowHeaderInfo, updateAvailable, latestNpmVersion, clearAnim, activePulseAnim, unreadPulseAnim, runClearAllWithAnimation, settingsPage, setSettingsPage, resetToDefaults, closeModal, detailTitle, activeTab, environment, visible, selectedCrash, setSelectedCrash, } = (0, InspectorContext_1.useInspector)();
56
56
  const [showUpdateModal, setShowUpdateModal] = react_1.default.useState(false);
57
57
  const [isTelemetryActive, setIsTelemetryActive] = react_1.default.useState(false);
58
58
  const telemetryPulseAnim = react_1.default.useRef(new react_native_1.Animated.Value(1)).current;
@@ -302,44 +302,38 @@ const InspectorHeader = react_1.default.memo(() => {
302
302
  </react_native_1.Pressable>)}
303
303
  </react_native_1.View>
304
304
 
305
- {/* OS & NPM Version Common Chip Bar */}
305
+ {/* OS & NPM Version Representation */}
306
306
  <react_native_1.View style={{
307
307
  flexDirection: 'row',
308
308
  alignItems: 'center',
309
309
  gap: 5,
310
310
  minWidth: 0,
311
311
  }}>
312
- {/* Unified Platform & Build Chip */}
313
312
  <react_native_1.View style={{
314
313
  flexDirection: 'row',
315
314
  alignItems: 'center',
316
- backgroundColor: 'rgba(255, 255, 255, 0.16)',
317
- borderRadius: 6,
318
- paddingHorizontal: 6.5,
319
- paddingVertical: 2.5,
320
- gap: 4.5,
315
+ backgroundColor: `${AppColors_1.AppColors.white}1F`,
316
+ borderRadius: 5,
317
+ paddingHorizontal: 6,
318
+ paddingVertical: 2,
319
+ gap: 4,
321
320
  borderWidth: 1,
322
- borderColor: 'rgba(255, 255, 255, 0.28)',
321
+ borderColor: `${AppColors_1.AppColors.white}2E`,
323
322
  flexShrink: 0,
324
323
  }}>
325
- {react_native_1.Platform.OS === 'ios' ? (<NetworkIcons_1.AppleIcon color="#FFFFFF" size={10.5}/>) : (<NetworkIcons_1.AndroidIcon color="#FFFFFF" size={10.5}/>)}
324
+ {react_native_1.Platform.OS === 'ios' ? (<NetworkIcons_1.AppleIcon color={`${AppColors_1.AppColors.white}E6`} size={10}/>) : (<NetworkIcons_1.AndroidIcon color={`${AppColors_1.AppColors.white}E6`} size={10}/>)}
326
325
  <react_native_1.Text style={{
327
- fontFamily: AppFonts_1.AppFonts.interBold,
326
+ fontFamily: AppFonts_1.AppFonts.interMedium,
328
327
  fontSize: 9.5,
329
- color: '#FFFFFF',
328
+ color: `${AppColors_1.AppColors.white}EB`,
330
329
  letterSpacing: 0.1,
331
330
  }} numberOfLines={1}>
332
331
  {react_native_1.Platform.OS === 'ios'
333
- ? `iOS ${String(deviceInfo?.osVersion || react_native_1.Platform.Version).replace(/^(ios\s*)+/i, '').trim()}${deviceInfo?.buildNumber || deviceInfo?.appVersion
334
- ? ` (${deviceInfo.buildNumber || deviceInfo.appVersion})`
335
- : ''}`
336
- : `Android ${String(deviceInfo?.osVersion || react_native_1.Platform.Version).replace(/^(android\s*)+/i, '').trim()}${deviceInfo?.buildNumber || deviceInfo?.appVersion
337
- ? ` (${deviceInfo.buildNumber || deviceInfo.appVersion})`
338
- : ''}`}
332
+ ? `iOS ${react_native_1.Platform.Version}`
333
+ : `Android ${react_native_1.Platform.Version}`}
339
334
  </react_native_1.Text>
340
335
  </react_native_1.View>
341
336
 
342
- {/* Unified NPM Version Chip */}
343
337
  <react_native_1.Pressable onPress={() => {
344
338
  if (updateAvailable) {
345
339
  setShowUpdateModal(true);
@@ -348,23 +342,26 @@ const InspectorHeader = react_1.default.memo(() => {
348
342
  react_native_1.Linking.openURL('https://www.npmjs.com/package/react-native-inapp-inspector').catch(() => { });
349
343
  }
350
344
  }} style={{
351
- backgroundColor: 'rgba(255, 255, 255, 0.16)',
352
- borderRadius: 6,
353
- paddingHorizontal: 6.5,
354
- paddingVertical: 2.5,
345
+ backgroundColor: '#FFFFFF',
346
+ borderRadius: 5,
347
+ paddingHorizontal: 6,
348
+ paddingVertical: 2,
355
349
  flexDirection: 'row',
356
350
  alignItems: 'center',
357
351
  gap: 4,
358
- borderWidth: 1,
359
- borderColor: 'rgba(255, 255, 255, 0.28)',
360
352
  flexShrink: 0,
353
+ shadowColor: '#000000',
354
+ shadowOffset: { width: 0, height: 1 },
355
+ shadowOpacity: 0.15,
356
+ shadowRadius: 2,
357
+ elevation: 2,
361
358
  }}>
362
- <NetworkIcons_1.NpmIcon size={11} color="#FF6B6B"/>
359
+ <NetworkIcons_1.NpmIcon size={11} color="#CB3837"/>
363
360
  <react_native_1.Text style={{
364
361
  fontFamily: AppFonts_1.AppFonts.interBold,
365
362
  fontSize: 9.5,
366
- color: '#FFFFFF',
367
- letterSpacing: 0.15,
363
+ color: '#CB3837',
364
+ letterSpacing: 0.2,
368
365
  }} numberOfLines={1}>
369
366
  v{constants_2.LIB_VERSION}
370
367
  </react_native_1.Text>
@@ -55,9 +55,6 @@ const BundleTab_1 = __importDefault(require("./BundleTab"));
55
55
  const PerformanceTab_1 = __importDefault(require("./PerformanceTab"));
56
56
  const CrashTab_1 = __importDefault(require("./CrashTab"));
57
57
  const CrashDetail_1 = __importDefault(require("./CrashDetail"));
58
- const StorageTab_1 = __importDefault(require("./StorageTab"));
59
- const DeviceTab_1 = __importDefault(require("./DeviceTab"));
60
- const AuditTab_1 = __importDefault(require("./AuditTab"));
61
58
  const SettingsPanel_1 = __importDefault(require("./SettingsPanel"));
62
59
  const TelemetryConsentModal_1 = __importDefault(require("./TelemetryConsentModal"));
63
60
  const NpmUpdateToast_1 = __importDefault(require("./NpmUpdateToast"));
@@ -65,9 +62,8 @@ const Toast_1 = __importDefault(require("../Toast"));
65
62
  const styles_1 = __importDefault(require("../../styles"));
66
63
  const AppColors_1 = require("../../styles/AppColors");
67
64
  const NavigationTracker_1 = __importDefault(require("./NavigationTracker"));
68
- const PerformanceHud_1 = __importDefault(require("./PerformanceHud"));
69
65
  const MainScreen = () => {
70
- const { visible, setVisible, switchActiveTab, modalAnimationType, closeModal, modalHeightPercent, selected, selectedEvent, selectedLog, selectedReduxSlice, selectedReduxAction, selectedCrash, settingsPage, activeTab, isReady, isEnabled, isPerformanceHudEnabled, useNativeFab, hasNavigationContext, setNavState, } = (0, InspectorContext_1.useInspector)();
66
+ const { visible, modalAnimationType, closeModal, modalHeightPercent, selected, selectedEvent, selectedLog, selectedReduxSlice, selectedReduxAction, selectedCrash, settingsPage, activeTab, isReady, isEnabled, useNativeFab, hasNavigationContext, setNavState, } = (0, InspectorContext_1.useInspector)();
71
67
  const isDetailActive = (activeTab === 'apis' && selected != null) ||
72
68
  (activeTab === 'analytics' && selectedEvent != null) ||
73
69
  (activeTab === 'logs' && selectedLog != null) ||
@@ -108,16 +104,10 @@ const MainScreen = () => {
108
104
  }).start();
109
105
  }, [activeTab]);
110
106
  return (<>
111
- <react_native_1.View pointerEvents="box-none" style={react_native_1.StyleSheet.absoluteFillObject}>
112
- {(react_native_1.Platform.OS === 'ios' || react_native_1.Platform.OS === 'android') &&
107
+ {(react_native_1.Platform.OS === 'ios' || react_native_1.Platform.OS === 'android') &&
113
108
  isEnabled &&
114
109
  !visible &&
115
110
  !useNativeFab && <FabLauncher_1.default />}
116
- {isEnabled && !visible && isPerformanceHudEnabled && (<PerformanceHud_1.default visible={true} onPress={() => {
117
- setVisible(true);
118
- switchActiveTab('performance');
119
- }}/>)}
120
- </react_native_1.View>
121
111
  <react_native_1.Modal visible={visible} animationType={modalAnimationType} transparent statusBarTranslucent={true}>
122
112
  {visible && (<ErrorBoundary_1.default onClose={closeModal}>
123
113
  <react_native_1.View style={styles_1.default.modalBackdrop}>
@@ -161,9 +151,6 @@ const MainScreen = () => {
161
151
  {activeTab === 'logs' && <ConsoleTab_1.default />}
162
152
  {activeTab === 'analytics' && <AnalyticsTab_1.default />}
163
153
  {activeTab === 'redux' && <ReduxTab_1.default />}
164
- {activeTab === 'storage' && <StorageTab_1.default />}
165
- {activeTab === 'device' && <DeviceTab_1.default />}
166
- {activeTab === 'audit' && <AuditTab_1.default />}
167
154
  {activeTab === 'bundle' && <BundleTab_1.default />}
168
155
  {activeTab === 'performance' && <PerformanceTab_1.default />}
169
156
  {activeTab === 'crash' && <CrashTab_1.default />}
@@ -22,10 +22,8 @@ const AppFonts_1 = require("../../styles/AppFonts");
22
22
  const constants_1 = require("../../constants");
23
23
  const helpers_1 = require("../../helpers");
24
24
  const NetworkIcons_1 = require("../NetworkIcons");
25
- const RequestReplayView_1 = __importDefault(require("./RequestReplayView"));
26
25
  const NetworkDetail = react_1.default.memo(() => {
27
26
  const { t } = (0, i18n_1.useTranslation)();
28
- const [isReplayScreenActive, setIsReplayScreenActive] = react_1.default.useState(false);
29
27
  const { selected, detailDisplayUrl, apiDetailActiveTab, setApiDetailActiveTab, detailSearch, setDetailSearch, reqExpanded, setReqExpanded, resExpanded, setResExpanded, showReqDiff, setShowReqDiff, showResDiff, setShowResDiff, prevRequestData, prevResponseData, logRouteMapRef, } = (0, InspectorContext_1.useInspector)();
30
28
  const handleOpenUrl = () => {
31
29
  react_native_1.Alert.alert(t('common.openInBrowser') || 'Open in Browser', `${t('common.openInBrowserPrompt') || 'Are you sure you want to open this URL in your external browser?'}\n\n${detailDisplayUrl}`, [
@@ -49,9 +47,6 @@ const NetworkDetail = react_1.default.memo(() => {
49
47
  };
50
48
  if (!selected)
51
49
  return null;
52
- if (isReplayScreenActive) {
53
- return (<RequestReplayView_1.default request={selected} onBack={() => setIsReplayScreenActive(false)}/>);
54
- }
55
50
  return (<react_native_1.View style={{ flex: 1 }}>
56
51
  {/* Non-scrollable details header */}
57
52
  <react_native_1.View style={{ paddingHorizontal: 6, paddingTop: 4 }}>
@@ -257,16 +252,6 @@ const NetworkDetail = react_1.default.memo(() => {
257
252
  </react_native_1.View>
258
253
 
259
254
  <react_native_1.View style={styles_1.default.detailInfoRight}>
260
- <TouchableScale_1.default style={[
261
- styles_1.default.iconSquareBtn,
262
- {
263
- backgroundColor: `${AppColors_1.AppColors.purple}15`,
264
- borderColor: `${AppColors_1.AppColors.purple}30`,
265
- borderWidth: 1,
266
- },
267
- ]} onPress={() => setIsReplayScreenActive(true)} accessible={true} accessibilityRole="button" accessibilityLabel="Edit & Resend Request" hitSlop={12}>
268
- <NetworkIcons_1.ReplayIcon color={AppColors_1.AppColors.purple} size={14}/>
269
- </TouchableScale_1.default>
270
255
  <TouchableScale_1.default style={[styles_1.default.iconSquareBtn, { backgroundColor: `${AppColors_1.AppColors.sky600}15` }]} onPress={handleOpenUrl} hitSlop={12}>
271
256
  <NetworkIcons_1.ExternalLinkIcon color={AppColors_1.AppColors.sky600} size={14}/>
272
257
  </TouchableScale_1.default>
@@ -411,33 +411,24 @@ const PerformanceTab = react_1.default.memo(() => {
411
411
  <react_native_1.View style={perfStyles.categoryScrollWrapper}>
412
412
  <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} style={perfStyles.categoryScrollView} contentContainerStyle={perfStyles.categoryScroll}>
413
413
  {[
414
- { key: 'ALL', label: t('performance.catAll'), icon: 'all' },
415
- { key: 'JANKY', label: t('performance.catJanky'), icon: 'janky' },
416
- { key: 'NAVIGATION', label: t('performance.catNavigation'), icon: 'nav' },
417
- { key: 'RENDER', label: t('performance.catRender'), icon: 'render' },
418
- { key: 'MEMORY', label: t('performance.catMemory'), icon: 'memory' },
419
- { key: 'IO', label: t('performance.catIo'), icon: 'io' },
414
+ { key: 'ALL', label: t('performance.catAll') },
415
+ { key: 'JANKY', label: t('performance.catJanky') },
416
+ { key: 'NAVIGATION', label: t('performance.catNavigation') },
417
+ { key: 'RENDER', label: t('performance.catRender') },
418
+ { key: 'MEMORY', label: t('performance.catMemory') },
419
+ { key: 'IO', label: t('performance.catIo') },
420
420
  ].map(cat => {
421
421
  const isSelected = filterCategory === cat.key;
422
- const iconColor = isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayText;
423
422
  return (<TouchableScale_1.default key={cat.key} onPress={() => setFilterCategory(cat.key)} style={[
424
423
  perfStyles.categoryChip,
425
424
  isSelected && perfStyles.categoryChipActive,
426
425
  ]}>
427
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 5 }}>
428
- {cat.icon === 'all' && <NetworkIcons_1.SparklesIcon size={12} color={iconColor}/>}
429
- {cat.icon === 'janky' && <NetworkIcons_1.WarningTriangleIcon size={12} color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.errorColor}/>}
430
- {cat.icon === 'nav' && <NetworkIcons_1.MapIcon size={12} color={iconColor}/>}
431
- {cat.icon === 'render' && <NetworkIcons_1.AtomIcon size={12} color={iconColor}/>}
432
- {cat.icon === 'memory' && <NetworkIcons_1.BrainIcon size={12} color={iconColor}/>}
433
- {cat.icon === 'io' && <NetworkIcons_1.GlobeIcon size={12} color={iconColor}/>}
434
- <react_native_1.Text style={[
426
+ <react_native_1.Text style={[
435
427
  perfStyles.categoryChipText,
436
428
  isSelected && perfStyles.categoryChipTextActive,
437
429
  ]}>
438
- {cat.label}
439
- </react_native_1.Text>
440
- </react_native_1.View>
430
+ {cat.label}
431
+ </react_native_1.Text>
441
432
  </TouchableScale_1.default>);
442
433
  })}
443
434
  </react_native_1.ScrollView>
@@ -448,13 +439,13 @@ const PerformanceTab = react_1.default.memo(() => {
448
439
  {/* ── 1. REAL-TIME FPS SCORECARD & SMOOTH AREA GRAPH ── */}
449
440
  <react_native_1.View style={perfStyles.heroCard}>
450
441
  <react_native_1.View style={perfStyles.heroHeaderRow}>
451
- <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8, flex: 1 }}>
452
- <NetworkIcons_1.PerformanceIcon color={AppColors_1.AppColors.purple} size={18}/>
453
- <react_native_1.View style={{ flex: 1 }}>
454
- <react_native_1.Text style={perfStyles.heroTitle} numberOfLines={1}>
442
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
443
+ <NetworkIcons_1.PerformanceIcon color={AppColors_1.AppColors.purple} size={17}/>
444
+ <react_native_1.View>
445
+ <react_native_1.Text style={perfStyles.heroTitle}>
455
446
  {t('performance.fpsAreaChartTitle')}
456
447
  </react_native_1.Text>
457
- <react_native_1.Text style={perfStyles.heroSubTitle} numberOfLines={1}>
448
+ <react_native_1.Text style={perfStyles.heroSubTitle}>
458
449
  {t('performance.fpsAreaChartSub')}
459
450
  </react_native_1.Text>
460
451
  </react_native_1.View>
@@ -1169,21 +1160,18 @@ const perfStyles = react_native_1.StyleSheet.create({
1169
1160
  color: AppColors_1.AppColors.grayTextWeak,
1170
1161
  },
1171
1162
  fpsStatsGrid: {
1172
- flex: 1,
1173
1163
  flexDirection: 'row',
1174
1164
  alignItems: 'center',
1175
- justifyContent: 'space-around',
1176
- marginLeft: 8,
1165
+ gap: 8,
1177
1166
  },
1178
1167
  statItem: {
1179
1168
  alignItems: 'center',
1180
- flex: 1,
1169
+ minWidth: 50,
1181
1170
  },
1182
1171
  statLabel: {
1183
- fontFamily: AppFonts_1.AppFonts.interMedium,
1184
- fontSize: 9.5,
1172
+ fontFamily: AppFonts_1.AppFonts.interRegular,
1173
+ fontSize: 10,
1185
1174
  color: AppColors_1.AppColors.grayTextWeak,
1186
- textAlign: 'center',
1187
1175
  },
1188
1176
  statValue: {
1189
1177
  fontFamily: AppFonts_1.AppFonts.interBold,