react-native-inapp-inspector 2.0.7 → 2.2.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 (85) 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 -19
  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 +49 -448
  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/settingsStore.d.ts +1 -1
  15. package/dist/commonjs/helpers/settingsStore.js +2 -4
  16. package/dist/commonjs/i18n/locales/en.json +2 -3
  17. package/dist/commonjs/index.d.ts +0 -1
  18. package/dist/commonjs/index.js +9 -127
  19. package/dist/commonjs/native/NativeInspector.d.ts +0 -1
  20. package/dist/commonjs/types/enums.d.ts +0 -7
  21. package/dist/commonjs/types/enums.js +0 -7
  22. package/dist/commonjs/types/interfaces.d.ts +0 -77
  23. package/dist/esm/components/Inspector/InspectorHeader.js +25 -28
  24. package/dist/esm/components/Inspector/MainScreen.js +2 -19
  25. package/dist/esm/components/Inspector/NetworkDetail.js +1 -16
  26. package/dist/esm/components/Inspector/PerformanceTab.js +19 -31
  27. package/dist/esm/components/Inspector/SettingsPanel.js +50 -449
  28. package/dist/esm/components/Inspector/TabBar.js +3 -24
  29. package/dist/esm/components/NetworkIcons.d.ts +0 -12
  30. package/dist/esm/components/NetworkIcons.js +0 -57
  31. package/dist/esm/constants/version.d.ts +1 -1
  32. package/dist/esm/constants/version.js +1 -1
  33. package/dist/esm/helpers/index.d.ts +0 -2
  34. package/dist/esm/helpers/index.js +0 -10
  35. package/dist/esm/helpers/settingsStore.d.ts +1 -1
  36. package/dist/esm/helpers/settingsStore.js +2 -4
  37. package/dist/esm/i18n/locales/en.json +2 -3
  38. package/dist/esm/index.d.ts +0 -1
  39. package/dist/esm/index.js +8 -123
  40. package/dist/esm/native/NativeInspector.d.ts +0 -1
  41. package/dist/esm/types/enums.d.ts +0 -7
  42. package/dist/esm/types/enums.js +0 -7
  43. package/dist/esm/types/interfaces.d.ts +0 -77
  44. package/ios/NetworkInspectorModule.mm +5 -12
  45. package/package.json +1 -4
  46. package/dist/commonjs/components/Inspector/AuditTab.d.ts +0 -3
  47. package/dist/commonjs/components/Inspector/AuditTab.js +0 -741
  48. package/dist/commonjs/components/Inspector/DeviceTab.d.ts +0 -3
  49. package/dist/commonjs/components/Inspector/DeviceTab.js +0 -717
  50. package/dist/commonjs/components/Inspector/FirstTimeWalkthroughModal.d.ts +0 -7
  51. package/dist/commonjs/components/Inspector/FirstTimeWalkthroughModal.js +0 -600
  52. package/dist/commonjs/components/Inspector/PerformanceHud.d.ts +0 -7
  53. package/dist/commonjs/components/Inspector/PerformanceHud.js +0 -210
  54. package/dist/commonjs/components/Inspector/RequestReplayModal.d.ts +0 -9
  55. package/dist/commonjs/components/Inspector/RequestReplayModal.js +0 -792
  56. package/dist/commonjs/components/Inspector/RequestReplayView.d.ts +0 -8
  57. package/dist/commonjs/components/Inspector/RequestReplayView.js +0 -871
  58. package/dist/commonjs/components/Inspector/StorageTab.d.ts +0 -3
  59. package/dist/commonjs/components/Inspector/StorageTab.js +0 -610
  60. package/dist/commonjs/customHooks/storageInspector.d.ts +0 -13
  61. package/dist/commonjs/customHooks/storageInspector.js +0 -179
  62. package/dist/commonjs/helpers/deviceInfo.d.ts +0 -4
  63. package/dist/commonjs/helpers/deviceInfo.js +0 -94
  64. package/dist/commonjs/helpers/packageAuditor.d.ts +0 -5
  65. package/dist/commonjs/helpers/packageAuditor.js +0 -182
  66. package/dist/esm/components/Inspector/AuditTab.d.ts +0 -3
  67. package/dist/esm/components/Inspector/AuditTab.js +0 -702
  68. package/dist/esm/components/Inspector/DeviceTab.d.ts +0 -3
  69. package/dist/esm/components/Inspector/DeviceTab.js +0 -678
  70. package/dist/esm/components/Inspector/FirstTimeWalkthroughModal.d.ts +0 -7
  71. package/dist/esm/components/Inspector/FirstTimeWalkthroughModal.js +0 -560
  72. package/dist/esm/components/Inspector/PerformanceHud.d.ts +0 -7
  73. package/dist/esm/components/Inspector/PerformanceHud.js +0 -170
  74. package/dist/esm/components/Inspector/RequestReplayModal.d.ts +0 -9
  75. package/dist/esm/components/Inspector/RequestReplayModal.js +0 -752
  76. package/dist/esm/components/Inspector/RequestReplayView.d.ts +0 -8
  77. package/dist/esm/components/Inspector/RequestReplayView.js +0 -831
  78. package/dist/esm/components/Inspector/StorageTab.d.ts +0 -3
  79. package/dist/esm/components/Inspector/StorageTab.js +0 -571
  80. package/dist/esm/customHooks/storageInspector.d.ts +0 -13
  81. package/dist/esm/customHooks/storageInspector.js +0 -170
  82. package/dist/esm/helpers/deviceInfo.d.ts +0 -4
  83. package/dist/esm/helpers/deviceInfo.js +0 -89
  84. package/dist/esm/helpers/packageAuditor.d.ts +0 -5
  85. 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,20 +55,15 @@ 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
- const FirstTimeWalkthroughModal_1 = __importDefault(require("./FirstTimeWalkthroughModal"));
64
60
  const NpmUpdateToast_1 = __importDefault(require("./NpmUpdateToast"));
65
61
  const Toast_1 = __importDefault(require("../Toast"));
66
62
  const styles_1 = __importDefault(require("../../styles"));
67
63
  const AppColors_1 = require("../../styles/AppColors");
68
64
  const NavigationTracker_1 = __importDefault(require("./NavigationTracker"));
69
- const PerformanceHud_1 = __importDefault(require("./PerformanceHud"));
70
65
  const MainScreen = () => {
71
- const { visible, setVisible, switchActiveTab, modalAnimationType, closeModal, modalHeightPercent, isWalkthroughVisible, setIsWalkthroughVisible, 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)();
72
67
  const isDetailActive = (activeTab === 'apis' && selected != null) ||
73
68
  (activeTab === 'analytics' && selectedEvent != null) ||
74
69
  (activeTab === 'logs' && selectedLog != null) ||
@@ -109,16 +104,10 @@ const MainScreen = () => {
109
104
  }).start();
110
105
  }, [activeTab]);
111
106
  return (<>
112
- <react_native_1.View pointerEvents="box-none" style={react_native_1.StyleSheet.absoluteFillObject}>
113
- {(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') &&
114
108
  isEnabled &&
115
109
  !visible &&
116
110
  !useNativeFab && <FabLauncher_1.default />}
117
- {isEnabled && !visible && isPerformanceHudEnabled && (<PerformanceHud_1.default visible={true} onPress={() => {
118
- setVisible(true);
119
- switchActiveTab('performance');
120
- }}/>)}
121
- </react_native_1.View>
122
111
  <react_native_1.Modal visible={visible} animationType={modalAnimationType} transparent statusBarTranslucent={true}>
123
112
  {visible && (<ErrorBoundary_1.default onClose={closeModal}>
124
113
  <react_native_1.View style={styles_1.default.modalBackdrop}>
@@ -162,9 +151,6 @@ const MainScreen = () => {
162
151
  {activeTab === 'logs' && <ConsoleTab_1.default />}
163
152
  {activeTab === 'analytics' && <AnalyticsTab_1.default />}
164
153
  {activeTab === 'redux' && <ReduxTab_1.default />}
165
- {activeTab === 'storage' && <StorageTab_1.default />}
166
- {activeTab === 'device' && <DeviceTab_1.default />}
167
- {activeTab === 'audit' && <AuditTab_1.default />}
168
154
  {activeTab === 'bundle' && <BundleTab_1.default />}
169
155
  {activeTab === 'performance' && <PerformanceTab_1.default />}
170
156
  {activeTab === 'crash' && <CrashTab_1.default />}
@@ -224,9 +210,6 @@ const MainScreen = () => {
224
210
 
225
211
  {/* NPM Version Update Toast with timeout progress bar */}
226
212
  <NpmUpdateToast_1.default />
227
-
228
- {/* First-Time Walkthrough & Quick Guide Modal */}
229
- <FirstTimeWalkthroughModal_1.default visible={isWalkthroughVisible} onClose={() => setIsWalkthroughVisible(false)}/>
230
213
  </react_native_1.View>
231
214
  </react_native_1.View>
232
215
  </ErrorBoundary_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,