react-native-inapp-inspector 1.1.34 → 2.0.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 (122) hide show
  1. package/README.md +123 -101
  2. package/android/build.gradle +13 -1
  3. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +904 -0
  4. package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.kt +17 -0
  5. package/dist/commonjs/components/ConsoleLogCard.js +57 -56
  6. package/dist/commonjs/components/CopyButton.js +10 -1
  7. package/dist/commonjs/components/ErrorBoundary.js +3 -0
  8. package/dist/commonjs/components/Inspector/AnalyticsTab.js +7 -3
  9. package/dist/commonjs/components/Inspector/BundleTab.js +20 -20
  10. package/dist/commonjs/components/Inspector/ConsoleTab.js +1 -1
  11. package/dist/commonjs/components/Inspector/CrashDetail.js +16 -12
  12. package/dist/commonjs/components/Inspector/CrashTab.js +97 -90
  13. package/dist/commonjs/components/Inspector/InspectorHeader.js +28 -24
  14. package/dist/commonjs/components/Inspector/MainScreen.js +20 -103
  15. package/dist/commonjs/components/Inspector/NetworkTab.js +143 -10
  16. package/dist/commonjs/components/Inspector/PerformanceTab.js +96 -3
  17. package/dist/commonjs/components/Inspector/ReduxDetail.js +24 -19
  18. package/dist/commonjs/components/Inspector/ReduxTab.js +30 -18
  19. package/dist/commonjs/components/Inspector/SettingsPanel.js +1578 -754
  20. package/dist/commonjs/components/Inspector/TabBar.js +6 -3
  21. package/dist/commonjs/components/LogCard.js +27 -9
  22. package/dist/commonjs/components/MetaAccordion.js +42 -0
  23. package/dist/commonjs/components/NetworkIcons.d.ts +10 -0
  24. package/dist/commonjs/components/NetworkIcons.js +53 -1
  25. package/dist/commonjs/components/Toast.js +3 -3
  26. package/dist/commonjs/components/TouchableScale.d.ts +5 -2
  27. package/dist/commonjs/components/TouchableScale.js +30 -32
  28. package/dist/commonjs/constants/index.d.ts +1 -2
  29. package/dist/commonjs/constants/index.js +4 -0
  30. package/dist/commonjs/constants/version.d.ts +1 -1
  31. package/dist/commonjs/constants/version.js +1 -1
  32. package/dist/commonjs/customHooks/analyticsLogger.d.ts +6 -0
  33. package/dist/commonjs/customHooks/analyticsLogger.js +16 -5
  34. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +2 -0
  35. package/dist/commonjs/customHooks/bundleAnalyzer.js +26 -17
  36. package/dist/commonjs/customHooks/consoleLogger.d.ts +2 -0
  37. package/dist/commonjs/customHooks/consoleLogger.js +10 -1
  38. package/dist/commonjs/customHooks/crashHandler.d.ts +2 -0
  39. package/dist/commonjs/customHooks/crashHandler.js +17 -1
  40. package/dist/commonjs/customHooks/networkLogger.d.ts +2 -0
  41. package/dist/commonjs/customHooks/networkLogger.js +12 -1
  42. package/dist/commonjs/customHooks/performanceTracker.d.ts +3 -1
  43. package/dist/commonjs/customHooks/performanceTracker.js +18 -4
  44. package/dist/commonjs/customHooks/reduxLogger.d.ts +2 -0
  45. package/dist/commonjs/customHooks/reduxLogger.js +10 -1
  46. package/dist/commonjs/helpers/index.js +10 -1
  47. package/dist/commonjs/helpers/settingsStore.d.ts +9 -0
  48. package/dist/commonjs/helpers/settingsStore.js +59 -3
  49. package/dist/commonjs/i18n/locales/en.json +96 -28
  50. package/dist/commonjs/index.d.ts +1 -0
  51. package/dist/commonjs/index.js +307 -73
  52. package/dist/commonjs/native/NativeInspector.d.ts +125 -0
  53. package/dist/commonjs/native/NativeInspector.js +313 -0
  54. package/dist/commonjs/native/NativeNetworkInspector.d.ts +22 -0
  55. package/dist/commonjs/native/NativeNetworkInspector.js +4 -0
  56. package/dist/commonjs/styles/AppColors.d.ts +28 -0
  57. package/dist/commonjs/styles/AppColors.js +30 -0
  58. package/dist/commonjs/styles/index.js +6 -6
  59. package/dist/commonjs/types/enums.d.ts +1 -1
  60. package/dist/commonjs/types/interfaces.d.ts +9 -0
  61. package/dist/esm/components/ConsoleLogCard.js +58 -57
  62. package/dist/esm/components/CopyButton.js +10 -1
  63. package/dist/esm/components/ErrorBoundary.js +3 -0
  64. package/dist/esm/components/Inspector/AnalyticsTab.js +7 -3
  65. package/dist/esm/components/Inspector/BundleTab.js +20 -20
  66. package/dist/esm/components/Inspector/ConsoleTab.js +1 -1
  67. package/dist/esm/components/Inspector/CrashDetail.js +16 -12
  68. package/dist/esm/components/Inspector/CrashTab.js +97 -90
  69. package/dist/esm/components/Inspector/InspectorHeader.js +29 -25
  70. package/dist/esm/components/Inspector/MainScreen.js +21 -71
  71. package/dist/esm/components/Inspector/NetworkTab.js +145 -12
  72. package/dist/esm/components/Inspector/PerformanceTab.js +96 -3
  73. package/dist/esm/components/Inspector/ReduxDetail.js +24 -19
  74. package/dist/esm/components/Inspector/ReduxTab.js +30 -18
  75. package/dist/esm/components/Inspector/SettingsPanel.js +1582 -758
  76. package/dist/esm/components/Inspector/TabBar.js +7 -4
  77. package/dist/esm/components/LogCard.js +27 -9
  78. package/dist/esm/components/MetaAccordion.js +42 -0
  79. package/dist/esm/components/NetworkIcons.d.ts +10 -0
  80. package/dist/esm/components/NetworkIcons.js +42 -0
  81. package/dist/esm/components/Toast.js +3 -3
  82. package/dist/esm/components/TouchableScale.d.ts +5 -2
  83. package/dist/esm/components/TouchableScale.js +31 -33
  84. package/dist/esm/constants/index.d.ts +1 -2
  85. package/dist/esm/constants/index.js +4 -0
  86. package/dist/esm/constants/version.d.ts +1 -1
  87. package/dist/esm/constants/version.js +1 -1
  88. package/dist/esm/customHooks/analyticsLogger.d.ts +6 -0
  89. package/dist/esm/customHooks/analyticsLogger.js +12 -4
  90. package/dist/esm/customHooks/bundleAnalyzer.d.ts +2 -0
  91. package/dist/esm/customHooks/bundleAnalyzer.js +23 -16
  92. package/dist/esm/customHooks/consoleLogger.d.ts +2 -0
  93. package/dist/esm/customHooks/consoleLogger.js +7 -0
  94. package/dist/esm/customHooks/crashHandler.d.ts +2 -0
  95. package/dist/esm/customHooks/crashHandler.js +14 -0
  96. package/dist/esm/customHooks/networkLogger.d.ts +2 -0
  97. package/dist/esm/customHooks/networkLogger.js +9 -0
  98. package/dist/esm/customHooks/performanceTracker.d.ts +3 -1
  99. package/dist/esm/customHooks/performanceTracker.js +15 -3
  100. package/dist/esm/customHooks/reduxLogger.d.ts +2 -0
  101. package/dist/esm/customHooks/reduxLogger.js +7 -0
  102. package/dist/esm/helpers/index.js +10 -1
  103. package/dist/esm/helpers/settingsStore.d.ts +9 -0
  104. package/dist/esm/helpers/settingsStore.js +58 -3
  105. package/dist/esm/i18n/locales/en.json +96 -28
  106. package/dist/esm/index.d.ts +1 -0
  107. package/dist/esm/index.js +279 -59
  108. package/dist/esm/native/NativeInspector.d.ts +125 -0
  109. package/dist/esm/native/NativeInspector.js +289 -0
  110. package/dist/esm/native/NativeNetworkInspector.d.ts +22 -0
  111. package/dist/esm/native/NativeNetworkInspector.js +2 -0
  112. package/dist/esm/styles/AppColors.d.ts +28 -0
  113. package/dist/esm/styles/AppColors.js +30 -0
  114. package/dist/esm/styles/index.js +6 -6
  115. package/dist/esm/types/enums.d.ts +1 -1
  116. package/dist/esm/types/interfaces.d.ts +9 -0
  117. package/ios/NetworkInspectorModule.h +6 -0
  118. package/ios/NetworkInspectorModule.m +720 -5
  119. package/package.json +15 -3
  120. package/react-native-inapp-inspector.podspec +7 -2
  121. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.java +0 -97
  122. package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.java +0 -28
@@ -36,7 +36,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- const react_1 = __importDefault(require("react"));
39
+ const react_1 = __importStar(require("react"));
40
40
  const react_native_1 = require("react-native");
41
41
  const react_native_svg_1 = __importStar(require("react-native-svg"));
42
42
  const react_native_linear_gradient_1 = __importDefault(require("react-native-linear-gradient"));
@@ -51,31 +51,124 @@ const networkLogger_1 = require("../../customHooks/networkLogger");
51
51
  const consoleLogger_1 = require("../../customHooks/consoleLogger");
52
52
  const analyticsLogger_1 = require("../../customHooks/analyticsLogger");
53
53
  const crashHandler_1 = require("../../customHooks/crashHandler");
54
+ const bundleAnalyzer_1 = require("../../customHooks/bundleAnalyzer");
55
+ const performanceTracker_1 = require("../../customHooks/performanceTracker");
54
56
  const reduxLogger_1 = require("../../customHooks/reduxLogger");
55
57
  const analyticsLogger_2 = require("../../customHooks/analyticsLogger");
56
58
  const i18n_1 = require("../../i18n");
57
59
  const NetworkIcons_1 = require("../NetworkIcons");
58
60
  const SettingsPanel = () => {
59
61
  const { t } = (0, i18n_1.useTranslation)();
60
- const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showConsoleLevels, setShowConsoleLevels, resetToDefaults, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, crashRecords, maxCrashLogs, setMaxCrashLogs, } = (0, InspectorContext_1.useInspector)();
62
+ const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showConsoleLevels, setShowConsoleLevels, resetToDefaults, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit, isAutoRamLimitEnabled, setIsAutoRamLimitEnabled, deviceFreeRamMb, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, crashRecords, maxCrashLogs, setMaxCrashLogs, } = (0, InspectorContext_1.useInspector)();
63
+ const autoRamProfile = (0, settingsStore_1.calculateRamBasedLimits)(deviceFreeRamMb);
61
64
  const isPersistent = (0, settingsStore_1.isPersistentStorageAvailable)();
62
- const headerTopPadding = react_native_1.Platform.OS === 'ios' && modalHeightPercent >= 95 ? 44 : 0;
65
+ // Safe Area & Status Bar Padding for All Device Form Factors
66
+ const statusBarHeight = react_native_1.Platform.OS === 'android' ? react_native_1.StatusBar.currentHeight || 24 : 44;
67
+ const headerTopPadding = modalHeightPercent >= 95 ? statusBarHeight : 0;
68
+ const allModules = [
69
+ {
70
+ key: 'apis',
71
+ label: 'APIs (Network)',
72
+ category: 'core',
73
+ icon: 'apis',
74
+ desc: 'HTTP/HTTPS requests, GraphQL, Axios & WebSocket inspector',
75
+ },
76
+ {
77
+ key: 'logs',
78
+ label: 'Console Logs',
79
+ category: 'core',
80
+ icon: 'logs',
81
+ desc: 'Terminal console logs, warnings, errors & stack traces',
82
+ },
83
+ {
84
+ key: 'performance',
85
+ label: 'Performance Tracker',
86
+ category: 'diagnostic',
87
+ icon: 'performance',
88
+ desc: '60 FPS monitor, Hermes memory telemetry & re-render profiler',
89
+ },
90
+ {
91
+ key: 'bundle',
92
+ label: 'Bundle Analyzer',
93
+ category: 'diagnostic',
94
+ icon: 'bundle',
95
+ desc: 'Metro packager dependencies, source maps & asset breakdown',
96
+ },
97
+ {
98
+ key: 'crash',
99
+ label: 'Crash Protection',
100
+ category: 'diagnostic',
101
+ icon: 'crash',
102
+ desc: 'Runtime exception guard, breadcrumbs & memory snapshot',
103
+ },
104
+ {
105
+ key: 'analytics',
106
+ label: 'Analytics Logger',
107
+ category: 'telemetry',
108
+ icon: 'analytics',
109
+ desc: 'Firebase & custom analytics events, user properties & params',
110
+ },
111
+ {
112
+ key: 'redux',
113
+ label: 'Redux Inspector',
114
+ category: 'telemetry',
115
+ icon: 'redux',
116
+ desc: 'Store state diffing, action history & reducer timeline',
117
+ },
118
+ ];
119
+ // Staged selection state for checkboxes before clicking "Save Changes"
120
+ const [stagedTabVisibility, setStagedTabVisibility] = (0, react_1.useState)(() => ({
121
+ apis: true,
122
+ logs: Boolean(tabVisibility?.logs),
123
+ analytics: Boolean(tabVisibility?.analytics),
124
+ redux: Boolean(tabVisibility?.redux),
125
+ bundle: Boolean(tabVisibility?.bundle),
126
+ performance: Boolean(tabVisibility?.performance),
127
+ crash: Boolean(tabVisibility?.crash),
128
+ }));
129
+ // Synchronize staged state with tabVisibility when tabVisibility updates
130
+ (0, react_1.useEffect)(() => {
131
+ setStagedTabVisibility({
132
+ apis: true,
133
+ logs: Boolean(tabVisibility?.logs),
134
+ analytics: Boolean(tabVisibility?.analytics),
135
+ redux: Boolean(tabVisibility?.redux),
136
+ bundle: Boolean(tabVisibility?.bundle),
137
+ performance: Boolean(tabVisibility?.performance),
138
+ crash: Boolean(tabVisibility?.crash),
139
+ });
140
+ }, [tabVisibility]);
141
+ const hasUnsavedChanges = (0, react_1.useMemo)(() => {
142
+ return allModules.some(m => Boolean(stagedTabVisibility[m.key]) !==
143
+ Boolean(tabVisibility?.[m.key]));
144
+ }, [stagedTabVisibility, tabVisibility, allModules]);
145
+ const stagedActiveCount = allModules.filter(m => m.key === 'apis' || Boolean(stagedTabVisibility[m.key])).length;
146
+ const handleSaveChanges = () => {
147
+ (0, InspectorContext_1.animateNextLayout)();
148
+ allModules.forEach(m => {
149
+ if (m.key !== 'apis') {
150
+ const isStagedOn = Boolean(stagedTabVisibility[m.key]);
151
+ const isCurrentOn = Boolean(tabVisibility?.[m.key]);
152
+ if (isStagedOn !== isCurrentOn) {
153
+ toggleTabVisibility(m.key);
154
+ }
155
+ }
156
+ });
157
+ react_native_1.Alert.alert(t('settings.settingsSaved'), t('settings.settingsSavedDesc'));
158
+ };
63
159
  if (settingsPage === 'main') {
64
- const settingsTabs = [
65
- { key: 'apis', label: 'APIs', icon: 'apis' },
66
- { key: 'logs', label: 'Logs', icon: 'logs' },
67
- { key: 'analytics', label: 'Analytics', icon: 'analytics' },
68
- { key: 'redux', label: 'Redux', icon: 'redux' },
69
- { key: 'bundle', label: 'Bundle', icon: 'bundle' },
70
- { key: 'performance', label: 'Performance', icon: 'performance' },
71
- { key: 'crash', label: 'Crash', icon: 'crash' },
72
- ];
73
- return (<react_native_1.View style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }}>
74
- {/* Settings Header with back button */}
160
+ return (<react_native_1.View style={{
161
+ flex: 1,
162
+ backgroundColor: AppColors_1.AppColors.grayBackground,
163
+ }}>
164
+ {/* Modern Floating Gradient Header */}
75
165
  <react_native_linear_gradient_1.default colors={[AppColors_1.AppColors.purple, AppColors_1.AppColors.brandPurple]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 0 }} style={styles_1.default.headerGradient}>
76
166
  <react_native_1.View style={{ paddingTop: headerTopPadding, width: '100%' }}>
77
- <react_native_1.View style={[styles_1.default.header, { paddingHorizontal: 16, gap: 12 }]}>
78
- <TouchableScale_1.default onPress={() => {
167
+ <react_native_1.View style={[
168
+ styles_1.default.header,
169
+ { paddingHorizontal: 16, paddingVertical: 12, gap: 12 },
170
+ ]}>
171
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={t('settings.back')} onPress={() => {
79
172
  (0, InspectorContext_1.animateNextLayout)();
80
173
  setSettingsPage(null);
81
174
  switchActiveTab('apis');
@@ -84,223 +177,360 @@ const SettingsPanel = () => {
84
177
  borderRadius: 10,
85
178
  backgroundColor: `${AppColors_1.AppColors.white}26`,
86
179
  borderWidth: 1,
87
- borderColor: `${AppColors_1.AppColors.white}14`,
180
+ borderColor: `${AppColors_1.AppColors.white}18`,
88
181
  }}>
89
- <NetworkIcons_1.WhiteBackNavigation color={AppColors_1.AppColors.white} size={16}/>
90
- </TouchableScale_1.default>
91
- <react_native_1.View style={{ flex: 1 }}>
92
- <react_native_1.Text style={{
182
+ <NetworkIcons_1.WhiteBackNavigation color={AppColors_1.AppColors.white} size={16}/>
183
+ </TouchableScale_1.default>
184
+
185
+ <react_native_1.View style={{ flex: 1 }}>
186
+ <react_native_1.View style={{
187
+ flexDirection: 'row',
188
+ alignItems: 'center',
189
+ gap: 8,
190
+ }}>
191
+ <react_native_1.Text style={{
93
192
  fontFamily: AppFonts_1.AppFonts.interBold,
94
193
  fontSize: 17,
95
194
  color: AppColors_1.AppColors.white,
195
+ letterSpacing: -0.3,
196
+ lineHeight: 22,
96
197
  }}>
97
- Settings
98
- </react_native_1.Text>
99
- <react_native_1.Text style={{
198
+ {t('settings.mainTitle')}
199
+ </react_native_1.Text>
200
+ <react_native_1.View style={{
201
+ backgroundColor: `${AppColors_1.AppColors.white}26`,
202
+ paddingHorizontal: 7,
203
+ paddingVertical: 2,
204
+ borderRadius: 12,
205
+ }}>
206
+ <react_native_1.Text style={{
207
+ fontFamily: AppFonts_1.AppFonts.interBold,
208
+ fontSize: 10,
209
+ color: AppColors_1.AppColors.white,
210
+ lineHeight: 13,
211
+ }}>
212
+ {stagedActiveCount}/{allModules.length} Active
213
+ </react_native_1.Text>
214
+ </react_native_1.View>
215
+ </react_native_1.View>
216
+ <react_native_1.Text style={{
100
217
  fontFamily: AppFonts_1.AppFonts.interRegular,
101
218
  fontSize: 11,
102
- color: `${AppColors_1.AppColors.white}BF`,
103
- marginTop: 1,
219
+ color: `${AppColors_1.AppColors.white}CC`,
220
+ marginTop: 2,
221
+ lineHeight: 15,
104
222
  }}>
105
- Manage modules and preferences
106
- </react_native_1.Text>
107
- </react_native_1.View>
108
- <react_native_1.View style={{
109
- backgroundColor: `${AppColors_1.AppColors.white}26`,
223
+ {t('settings.mainSubtitle')}
224
+ </react_native_1.Text>
225
+ </react_native_1.View>
226
+
227
+ <react_native_1.View style={{
228
+ backgroundColor: `${AppColors_1.AppColors.white}22`,
110
229
  paddingHorizontal: 8,
111
230
  paddingVertical: 4,
112
231
  borderRadius: 8,
113
232
  borderWidth: 1,
114
233
  borderColor: `${AppColors_1.AppColors.white}1A`,
115
234
  }}>
116
- <react_native_1.Text style={{
235
+ <react_native_1.Text style={{
117
236
  fontFamily: AppFonts_1.AppFonts.interBold,
118
237
  fontSize: 10.5,
119
238
  color: AppColors_1.AppColors.white,
239
+ lineHeight: 14,
120
240
  }}>
121
- v{constants_1.LIB_VERSION}
122
- </react_native_1.Text>
241
+ v{constants_1.LIB_VERSION}
242
+ </react_native_1.Text>
243
+ </react_native_1.View>
123
244
  </react_native_1.View>
124
245
  </react_native_1.View>
125
- </react_native_1.View>
126
- </react_native_linear_gradient_1.default>
246
+ </react_native_linear_gradient_1.default>
127
247
 
128
- <react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
129
- {/* Sub Tabs */}
248
+ <react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 14 }} showsVerticalScrollIndicator={false}>
249
+ {/* Segmented Top Navigation Sub-Tabs */}
130
250
  <react_native_1.View style={{
131
251
  flexDirection: 'row',
132
252
  backgroundColor: AppColors_1.AppColors.primaryLight,
133
- borderRadius: 10,
134
- padding: 3,
253
+ borderRadius: 12,
254
+ padding: 4,
135
255
  borderWidth: 1,
136
256
  borderColor: AppColors_1.AppColors.grayBorderSecondary,
137
- marginBottom: 4,
257
+ shadowColor: AppColors_1.AppColors.black,
258
+ shadowOpacity: 0.04,
259
+ shadowRadius: 4,
260
+ shadowOffset: { width: 0, height: 2 },
138
261
  }}>
139
- <react_native_1.TouchableOpacity onPress={() => {
262
+ <TouchableScale_1.default accessible={true} accessibilityRole="tab" accessibilityLabel={t('settings.modulesAndTools')} accessibilityState={{ selected: settingsActiveSubTab === 'module' }} onPress={() => {
140
263
  (0, InspectorContext_1.animateNextLayout)();
141
264
  setSettingsActiveSubTab('module');
142
265
  }} style={{
143
266
  flex: 1,
144
- paddingVertical: 8,
267
+ paddingVertical: 9,
268
+ flexDirection: 'row',
145
269
  alignItems: 'center',
146
270
  justifyContent: 'center',
147
- borderRadius: 8,
271
+ gap: 6,
272
+ borderRadius: 9,
148
273
  backgroundColor: settingsActiveSubTab === 'module'
149
274
  ? AppColors_1.AppColors.purple
150
275
  : 'transparent',
151
276
  }}>
277
+ <NetworkIcons_1.LayersIcon color={settingsActiveSubTab === 'module'
278
+ ? AppColors_1.AppColors.white
279
+ : AppColors_1.AppColors.grayText} size={13}/>
152
280
  <react_native_1.Text style={{
153
281
  fontFamily: AppFonts_1.AppFonts.interBold,
154
- fontSize: 12,
282
+ fontSize: 12.5,
283
+ lineHeight: 16,
155
284
  color: settingsActiveSubTab === 'module'
156
285
  ? AppColors_1.AppColors.white
157
286
  : AppColors_1.AppColors.grayText,
158
287
  }}>
159
- Module
288
+ {t('settings.modulesAndTools')}
160
289
  </react_native_1.Text>
161
- </react_native_1.TouchableOpacity>
162
- <react_native_1.TouchableOpacity onPress={() => {
290
+ </TouchableScale_1.default>
291
+
292
+ <TouchableScale_1.default accessible={true} accessibilityRole="tab" accessibilityLabel={t('settings.uiPreferences')} accessibilityState={{ selected: settingsActiveSubTab === 'ui' }} onPress={() => {
163
293
  (0, InspectorContext_1.animateNextLayout)();
164
294
  setSettingsActiveSubTab('ui');
165
295
  }} style={{
166
296
  flex: 1,
167
- paddingVertical: 8,
297
+ paddingVertical: 9,
298
+ flexDirection: 'row',
168
299
  alignItems: 'center',
169
300
  justifyContent: 'center',
170
- borderRadius: 8,
301
+ gap: 6,
302
+ borderRadius: 9,
171
303
  backgroundColor: settingsActiveSubTab === 'ui'
172
304
  ? AppColors_1.AppColors.purple
173
305
  : 'transparent',
174
306
  }}>
307
+ <NetworkIcons_1.ScreenIcon color={settingsActiveSubTab === 'ui'
308
+ ? AppColors_1.AppColors.white
309
+ : AppColors_1.AppColors.grayText} size={13}/>
175
310
  <react_native_1.Text style={{
176
311
  fontFamily: AppFonts_1.AppFonts.interBold,
177
- fontSize: 12,
312
+ fontSize: 12.5,
313
+ lineHeight: 16,
178
314
  color: settingsActiveSubTab === 'ui'
179
315
  ? AppColors_1.AppColors.white
180
316
  : AppColors_1.AppColors.grayText,
181
317
  }}>
182
- UI Preferences
318
+ {t('settings.uiPreferences')}
183
319
  </react_native_1.Text>
184
- </react_native_1.TouchableOpacity>
320
+ </TouchableScale_1.default>
185
321
  </react_native_1.View>
186
322
 
187
- {settingsActiveSubTab === 'module' ? (
188
- /* Tab list */
189
- <react_native_1.View style={{
190
- backgroundColor: AppColors_1.AppColors.primaryLight,
323
+ {settingsActiveSubTab === 'module' ? (<react_native_1.View style={{ gap: 12 }}>
324
+ {/* Performance Advisory Banner */}
325
+ <react_native_1.View style={{
326
+ backgroundColor: `${AppColors_1.AppColors.purple}0A`,
191
327
  borderRadius: 12,
328
+ padding: 12,
192
329
  borderWidth: 1,
193
- borderColor: AppColors_1.AppColors.grayBorderSecondary,
194
- overflow: 'hidden',
195
- }}>
196
- {/* Table Header */}
197
- <react_native_1.View style={{
330
+ borderColor: `${AppColors_1.AppColors.purple}20`,
198
331
  flexDirection: 'row',
199
332
  alignItems: 'center',
200
- paddingVertical: 8,
201
- paddingHorizontal: 14,
202
- backgroundColor: AppColors_1.AppColors.grayBackground,
203
- borderBottomWidth: 1,
204
- borderBottomColor: AppColors_1.AppColors.dividerColor,
205
- gap: 12,
333
+ gap: 10,
206
334
  }}>
207
- <react_native_1.Text style={{
208
- fontFamily: AppFonts_1.AppFonts.interBold,
209
- fontSize: 10,
210
- color: AppColors_1.AppColors.grayTextWeak,
211
- letterSpacing: 0.6,
212
- flex: 1,
335
+ <react_native_1.View style={{
336
+ width: 32,
337
+ height: 32,
338
+ borderRadius: 8,
339
+ backgroundColor: `${AppColors_1.AppColors.purple}14`,
340
+ alignItems: 'center',
341
+ justifyContent: 'center',
213
342
  }}>
214
- MODULE
215
- </react_native_1.Text>
216
- <react_native_1.Text style={{
343
+ <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={15}/>
344
+ </react_native_1.View>
345
+ <react_native_1.View style={{ flex: 1 }}>
346
+ <react_native_1.Text style={{
217
347
  fontFamily: AppFonts_1.AppFonts.interBold,
218
- fontSize: 10,
219
- color: AppColors_1.AppColors.grayTextWeak,
220
- letterSpacing: 0.6,
221
- width: 90,
222
- textAlign: 'right',
223
- paddingRight: 4,
348
+ fontSize: 12,
349
+ color: AppColors_1.AppColors.primaryBlack,
350
+ lineHeight: 16,
224
351
  }}>
225
- VISIBILITY
226
- </react_native_1.Text>
352
+ {t('settings.zeroOverheadTitle')}
353
+ </react_native_1.Text>
354
+ <react_native_1.Text style={{
355
+ fontFamily: AppFonts_1.AppFonts.interRegular,
356
+ fontSize: 10.5,
357
+ color: AppColors_1.AppColors.grayText,
358
+ marginTop: 2,
359
+ lineHeight: 14,
360
+ }}>
361
+ {t('settings.zeroOverheadDesc')}
362
+ </react_native_1.Text>
363
+ </react_native_1.View>
227
364
  </react_native_1.View>
228
365
 
229
- {settingsTabs.map((tab, idx) => {
366
+ {/* Enhanced Individual Module Cards with Decorative Checkboxes */}
367
+ <react_native_1.View style={{ gap: 10 }}>
368
+ {allModules.map(moduleItem => {
230
369
  const isReduxAvail = (0, reduxLogger_1.isReduxConnected)();
231
370
  const isAnalyticsAvail = (0, analyticsLogger_2.isAnalyticsConnected)();
232
- const isUnavailable = (tab.key === 'redux' && !isReduxAvail) ||
233
- (tab.key === 'analytics' && !isAnalyticsAvail);
234
- const isLocked = tab.key === 'apis' || isUnavailable;
235
- const isVisible = tab.key === 'apis' ||
236
- (Boolean(tabVisibility?.[tab.key]) && !isUnavailable);
237
- const isLast = idx === settingsTabs.length - 1;
238
- return (<react_native_1.View key={tab.key} style={{
371
+ const isUnavailable = (moduleItem.key === 'redux' && !isReduxAvail) ||
372
+ (moduleItem.key === 'analytics' && !isAnalyticsAvail);
373
+ const isLocked = moduleItem.key === 'apis' || isUnavailable;
374
+ const isChecked = moduleItem.key === 'apis' ||
375
+ (Boolean(stagedTabVisibility?.[moduleItem.key]) &&
376
+ !isUnavailable);
377
+ const liveStats = moduleItem.key === 'apis'
378
+ ? `${logs.length} requests • Limit: ${maxNetworkLogs}`
379
+ : moduleItem.key === 'logs'
380
+ ? `${consoleLogs.length} logs • Limit: ${maxConsoleLogs}`
381
+ : moduleItem.key === 'performance'
382
+ ? '60 FPS Target • Memory Telemetry'
383
+ : moduleItem.key === 'bundle'
384
+ ? 'Metro Packager • Dependency Map'
385
+ : moduleItem.key === 'crash'
386
+ ? `${crashRecords?.length || 0} crashes recorded • Crash Guard`
387
+ : moduleItem.key === 'analytics'
388
+ ? `${analyticsEvents.length} events logged`
389
+ : moduleItem.key === 'redux'
390
+ ? `${Object.keys(reduxState || {}).length} slices • Depth: ${reduxExpandDepth}`
391
+ : '';
392
+ return (<react_native_1.View key={moduleItem.key} style={{
393
+ backgroundColor: AppColors_1.AppColors.primaryLight,
394
+ borderRadius: 14,
395
+ borderWidth: 1.5,
396
+ borderColor: isChecked
397
+ ? `${AppColors_1.AppColors.purple}38`
398
+ : AppColors_1.AppColors.grayBorderSecondary,
399
+ padding: 14,
400
+ gap: 10,
401
+ shadowColor: AppColors_1.AppColors.black,
402
+ shadowOpacity: isChecked ? 0.04 : 0.02,
403
+ shadowRadius: 5,
404
+ shadowOffset: { width: 0, height: 2 },
405
+ }}>
406
+ {/* Top Row: Icon + Title & Badges + Checkbox */}
407
+ <react_native_1.View style={{
239
408
  flexDirection: 'row',
240
- alignItems: 'center',
241
- paddingVertical: 10,
242
- paddingHorizontal: 14,
243
- borderBottomWidth: isLast ? 0 : 1,
244
- borderBottomColor: AppColors_1.AppColors.dividerColor,
245
- gap: 12,
409
+ alignItems: 'flex-start',
410
+ justifyContent: 'space-between',
411
+ gap: 10,
246
412
  }}>
247
- {/* Icon + Label fills remaining space */}
248
- <react_native_1.View style={{
413
+ {/* Tap Zone for Details/Settings */}
414
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={`${moduleItem.label} settings`} disabled={isUnavailable} onPress={() => {
415
+ (0, InspectorContext_1.animateNextLayout)();
416
+ setSettingsPage(moduleItem.key);
417
+ }} style={{
249
418
  flex: 1,
250
419
  flexDirection: 'row',
251
- alignItems: 'center',
252
- gap: 8,
253
- flexWrap: 'wrap',
420
+ alignItems: 'flex-start',
421
+ gap: 10,
254
422
  }}>
255
- {/* Small icon tile */}
256
- <react_native_1.View style={{
257
- width: 20,
258
- height: 20,
259
- borderRadius: 6,
423
+ {/* Icon Tile */}
424
+ <react_native_1.View style={{
425
+ width: 36,
426
+ height: 36,
427
+ borderRadius: 10,
260
428
  backgroundColor: isLocked
261
- ? AppColors_1.AppColors.grayBorderSecondary
262
- : AppColors_1.AppColors.purpleShade50,
429
+ ? `${AppColors_1.AppColors.grayBorderSecondary}4D`
430
+ : isChecked
431
+ ? `${AppColors_1.AppColors.purple}14`
432
+ : AppColors_1.AppColors.grayBackground,
263
433
  borderWidth: 1,
264
434
  borderColor: isLocked
265
435
  ? AppColors_1.AppColors.dividerColor
266
- : `${AppColors_1.AppColors.purple}33`,
436
+ : isChecked
437
+ ? `${AppColors_1.AppColors.purple}33`
438
+ : AppColors_1.AppColors.grayBorderSecondary,
267
439
  alignItems: 'center',
268
440
  justifyContent: 'center',
441
+ marginTop: 1,
269
442
  }}>
270
- {tab.icon === 'apis' && (<NetworkIcons_1.SignalIcon color={isLocked
271
- ? AppColors_1.AppColors.grayTextWeak
272
- : AppColors_1.AppColors.purple} size={11}/>)}
273
- {tab.icon === 'logs' && (<NetworkIcons_1.TerminalIcon color={isLocked
274
- ? AppColors_1.AppColors.grayTextWeak
275
- : AppColors_1.AppColors.purple} size={11}/>)}
276
- {tab.icon === 'analytics' && (<NetworkIcons_1.AnalyticsIcon color={isLocked
277
- ? AppColors_1.AppColors.grayTextWeak
278
- : AppColors_1.AppColors.purple} size={11}/>)}
279
- {tab.icon === 'redux' && (<NetworkIcons_1.ReduxIcon color={isLocked
280
- ? AppColors_1.AppColors.grayTextWeak
281
- : AppColors_1.AppColors.purple} size={11}/>)}
282
- {tab.icon === 'bundle' && (<NetworkIcons_1.PackageIcon color={isLocked
283
- ? AppColors_1.AppColors.grayTextWeak
284
- : AppColors_1.AppColors.purple} size={11}/>)}
285
- {tab.icon === 'performance' && (<NetworkIcons_1.PerformanceIcon color={isLocked
286
- ? AppColors_1.AppColors.grayTextWeak
287
- : AppColors_1.AppColors.purple} size={11}/>)}
288
- {tab.icon === 'crash' && (<NetworkIcons_1.CrashIcon color={isLocked
289
- ? AppColors_1.AppColors.grayTextWeak
290
- : AppColors_1.AppColors.purple} size={11}/>)}
291
- </react_native_1.View>
292
- {/* Label + Required badge */}
293
- <react_native_1.Text style={{
443
+ {moduleItem.icon === 'apis' && (<NetworkIcons_1.SignalIcon color={isChecked
444
+ ? AppColors_1.AppColors.purple
445
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
446
+ {moduleItem.icon === 'logs' && (<NetworkIcons_1.TerminalIcon color={isChecked
447
+ ? AppColors_1.AppColors.purple
448
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
449
+ {moduleItem.icon === 'performance' && (<NetworkIcons_1.PerformanceIcon color={isChecked
450
+ ? AppColors_1.AppColors.purple
451
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
452
+ {moduleItem.icon === 'bundle' && (<NetworkIcons_1.PackageIcon color={isChecked
453
+ ? AppColors_1.AppColors.purple
454
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
455
+ {moduleItem.icon === 'crash' && (<NetworkIcons_1.CrashIcon color={isChecked
456
+ ? AppColors_1.AppColors.purple
457
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
458
+ {moduleItem.icon === 'analytics' && (<NetworkIcons_1.AnalyticsIcon color={isChecked
459
+ ? AppColors_1.AppColors.purple
460
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
461
+ {moduleItem.icon === 'redux' && (<NetworkIcons_1.ReduxIcon color={isChecked
462
+ ? AppColors_1.AppColors.purple
463
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
464
+ </react_native_1.View>
465
+
466
+ {/* Titles & Status Pill */}
467
+ <react_native_1.View style={{ flex: 1, gap: 2 }}>
468
+ <react_native_1.View style={{
469
+ flexDirection: 'row',
470
+ alignItems: 'center',
471
+ gap: 6,
472
+ flexWrap: 'wrap',
473
+ }}>
474
+ <react_native_1.Text style={{
294
475
  fontFamily: AppFonts_1.AppFonts.interBold,
295
- fontSize: 13,
476
+ fontSize: 14,
477
+ lineHeight: 18,
296
478
  color: isLocked
297
479
  ? AppColors_1.AppColors.grayText
298
480
  : AppColors_1.AppColors.primaryBlack,
299
481
  }}>
300
- {tab.label}
301
- </react_native_1.Text>
302
- {/* Unavailable badge */}
303
- {isUnavailable && (<react_native_1.View style={{
482
+ {moduleItem.label}
483
+ </react_native_1.Text>
484
+
485
+ {/* Default Startup Tab Badge */}
486
+ {moduleItem.key === defaultTab &&
487
+ !isUnavailable && (<react_native_1.View style={{
488
+ flexDirection: 'row',
489
+ alignItems: 'center',
490
+ backgroundColor: `${AppColors_1.AppColors.purple}14`,
491
+ borderRadius: 12,
492
+ paddingHorizontal: 5,
493
+ paddingVertical: 1.5,
494
+ borderWidth: 1,
495
+ borderColor: `${AppColors_1.AppColors.purple}2E`,
496
+ gap: 3,
497
+ }}>
498
+ <react_native_1.View style={{
499
+ width: 4,
500
+ height: 4,
501
+ borderRadius: 2,
502
+ backgroundColor: AppColors_1.AppColors.purple,
503
+ }}/>
504
+ <react_native_1.Text style={{
505
+ fontFamily: AppFonts_1.AppFonts.interBold,
506
+ fontSize: 8,
507
+ lineHeight: 11,
508
+ color: AppColors_1.AppColors.purple,
509
+ letterSpacing: 0.4,
510
+ }}>
511
+ {t('settings.defaultBadge')}
512
+ </react_native_1.Text>
513
+ </react_native_1.View>)}
514
+
515
+ {/* Status Pill */}
516
+ {moduleItem.key === 'apis' ? (<react_native_1.View style={{
517
+ backgroundColor: `${AppColors_1.AppColors.blue500}14`,
518
+ borderRadius: 4,
519
+ paddingHorizontal: 5,
520
+ paddingVertical: 1.5,
521
+ borderWidth: 1,
522
+ borderColor: `${AppColors_1.AppColors.blue500}33`,
523
+ }}>
524
+ <react_native_1.Text style={{
525
+ fontFamily: AppFonts_1.AppFonts.interBold,
526
+ fontSize: 8,
527
+ lineHeight: 11,
528
+ color: AppColors_1.AppColors.blue500,
529
+ letterSpacing: 0.3,
530
+ }}>
531
+ {t('settings.coreBadge')}
532
+ </react_native_1.Text>
533
+ </react_native_1.View>) : isUnavailable ? (<react_native_1.View style={{
304
534
  backgroundColor: `${AppColors_1.AppColors.amber500}18`,
305
535
  borderRadius: 4,
306
536
  paddingHorizontal: 5,
@@ -308,181 +538,439 @@ const SettingsPanel = () => {
308
538
  borderWidth: 1,
309
539
  borderColor: `${AppColors_1.AppColors.amber500}35`,
310
540
  }}>
311
- <react_native_1.Text style={{
541
+ <react_native_1.Text style={{
312
542
  fontFamily: AppFonts_1.AppFonts.interBold,
313
543
  fontSize: 8,
544
+ lineHeight: 11,
314
545
  color: AppColors_1.AppColors.amber700,
315
546
  letterSpacing: 0.3,
316
547
  }}>
317
- {tab.key === 'redux'
548
+ {moduleItem.key === 'redux'
318
549
  ? t('settings.notConnectedBadge')
319
550
  : t('settings.notDetectedBadge')}
320
- </react_native_1.Text>
321
- </react_native_1.View>)}
322
- {/* #6 — badge marks the configured default tab */}
323
- {tab.key === defaultTab && !isUnavailable && (<react_native_1.View style={{
324
- flexDirection: 'row',
325
- alignItems: 'center',
326
- backgroundColor: `${AppColors_1.AppColors.purple}14`,
327
- borderRadius: 20,
328
- paddingHorizontal: 6,
329
- paddingVertical: 2,
551
+ </react_native_1.Text>
552
+ </react_native_1.View>) : isChecked ? (<react_native_1.View style={{
553
+ backgroundColor: `${AppColors_1.AppColors.liveGreen}18`,
554
+ borderRadius: 4,
555
+ paddingHorizontal: 5,
556
+ paddingVertical: 1.5,
330
557
  borderWidth: 1,
331
- borderColor: `${AppColors_1.AppColors.purple}2E`,
332
- gap: 3,
558
+ borderColor: `${AppColors_1.AppColors.liveGreen}38`,
333
559
  }}>
334
- <react_native_1.View style={{
335
- width: 4,
336
- height: 4,
337
- borderRadius: 2,
338
- backgroundColor: AppColors_1.AppColors.purple,
339
- opacity: 0.7,
340
- }}/>
341
- <react_native_1.Text style={{
560
+ <react_native_1.Text style={{
342
561
  fontFamily: AppFonts_1.AppFonts.interBold,
343
- fontSize: 8.5,
344
- color: AppColors_1.AppColors.purple,
345
- letterSpacing: 0.4,
562
+ fontSize: 8,
563
+ lineHeight: 11,
564
+ color: AppColors_1.AppColors.green700,
565
+ letterSpacing: 0.3,
346
566
  }}>
347
- DEFAULT
348
- </react_native_1.Text>
349
- </react_native_1.View>)}
350
-
351
- {/* Settings gear icon next to label */}
352
- {!isUnavailable && (<TouchableScale_1.default onPress={() => {
353
- (0, InspectorContext_1.animateNextLayout)();
354
- setSettingsPage(tab.key);
355
- }} hitSlop={8} style={{
356
- marginLeft: 4,
357
- padding: 4,
358
- borderRadius: 6,
359
- backgroundColor: AppColors_1.AppColors.purpleShade50,
567
+ {t('settings.activeBadge')}
568
+ </react_native_1.Text>
569
+ </react_native_1.View>) : (<react_native_1.View style={{
570
+ backgroundColor: `${AppColors_1.AppColors.grayTextWeak}18`,
571
+ borderRadius: 4,
572
+ paddingHorizontal: 5,
573
+ paddingVertical: 1.5,
360
574
  borderWidth: 1,
361
- borderColor: `${AppColors_1.AppColors.purple}26`,
362
- alignItems: 'center',
363
- justifyContent: 'center',
575
+ borderColor: `${AppColors_1.AppColors.grayTextWeak}2E`,
364
576
  }}>
365
- <NetworkIcons_1.SettingsIcon color={AppColors_1.AppColors.purple} size={10}/>
366
- </TouchableScale_1.default>)}
367
- </react_native_1.View>
577
+ <react_native_1.Text style={{
578
+ fontFamily: AppFonts_1.AppFonts.interBold,
579
+ fontSize: 8,
580
+ lineHeight: 11,
581
+ color: AppColors_1.AppColors.grayTextWeak,
582
+ letterSpacing: 0.3,
583
+ }}>
584
+ {t('settings.dormantBadge')}
585
+ </react_native_1.Text>
586
+ </react_native_1.View>)}
587
+ </react_native_1.View>
368
588
 
369
- {/* Visibility Switch in VISIBILITY column */}
370
- <react_native_1.View style={{
371
- width: 90,
372
- alignItems: 'flex-end',
373
- justifyContent: 'center',
589
+ <react_native_1.Text style={{
590
+ fontFamily: AppFonts_1.AppFonts.interRegular,
591
+ fontSize: 11,
592
+ color: AppColors_1.AppColors.grayText,
593
+ lineHeight: 15,
594
+ marginTop: 1,
374
595
  }}>
375
- <TouchableScale_1.default disabled={isLocked} onPress={() => toggleTabVisibility(tab.key)} style={{
376
- width: 38,
377
- height: 22,
378
- borderRadius: 11,
379
- backgroundColor: isLocked
380
- ? AppColors_1.AppColors.grayBackground
381
- : isVisible
382
- ? AppColors_1.AppColors.purple
383
- : AppColors_1.AppColors.grayBorderSecondary,
384
- borderWidth: isLocked ? 1.5 : 0,
596
+ {moduleItem.desc}
597
+ </react_native_1.Text>
598
+ </react_native_1.View>
599
+ </TouchableScale_1.default>
600
+
601
+ {/* Decorative Custom Checkbox */}
602
+ <TouchableScale_1.default accessible={true} accessibilityRole="checkbox" accessibilityLabel={`Select ${moduleItem.label}`} accessibilityState={{
603
+ checked: isChecked,
604
+ disabled: isLocked,
605
+ }} disabled={isLocked} onPress={() => {
606
+ if (isLocked)
607
+ return;
608
+ setStagedTabVisibility(prev => ({
609
+ ...prev,
610
+ [moduleItem.key]: !prev[moduleItem.key],
611
+ }));
612
+ }} style={{
613
+ width: 26,
614
+ height: 26,
615
+ borderRadius: 8,
616
+ borderWidth: isChecked ? 0 : 2,
385
617
  borderColor: isLocked
386
- ? AppColors_1.AppColors.grayBorderSecondary
387
- : 'transparent',
388
- borderStyle: isLocked ? 'dashed' : 'solid',
389
- padding: 2,
390
- justifyContent: 'center',
391
- alignItems: isVisible ? 'flex-end' : 'flex-start',
392
- opacity: isLocked ? 0.9 : 1,
393
- }}>
394
- <react_native_1.View style={{
395
- width: 18,
396
- height: 18,
397
- borderRadius: 9,
398
- backgroundColor: isLocked
399
- ? AppColors_1.AppColors.grayBorderSecondary
400
- : AppColors_1.AppColors.white,
618
+ ? AppColors_1.AppColors.dividerColor
619
+ : AppColors_1.AppColors.grayBorderSecondary,
620
+ backgroundColor: moduleItem.key === 'apis'
621
+ ? `${AppColors_1.AppColors.blue500}22`
622
+ : isChecked
623
+ ? AppColors_1.AppColors.purple
624
+ : AppColors_1.AppColors.grayBackground,
401
625
  alignItems: 'center',
402
626
  justifyContent: 'center',
403
- shadowColor: AppColors_1.AppColors.black,
404
- shadowOpacity: isLocked ? 0 : 0.15,
405
- shadowRadius: 1.5,
627
+ shadowColor: isChecked
628
+ ? AppColors_1.AppColors.purple
629
+ : 'transparent',
630
+ shadowOpacity: isChecked ? 0.3 : 0,
631
+ shadowRadius: 3,
406
632
  shadowOffset: { width: 0, height: 1 },
633
+ elevation: isChecked ? 2 : 0,
407
634
  }}>
408
- {isLocked && (<react_native_svg_1.default width={10} height={10} viewBox="0 0 24 24" fill="none">
635
+ {moduleItem.key === 'apis' ? (<NetworkIcons_1.CheckIcon size={14} color={AppColors_1.AppColors.blue500}/>) : isChecked ? (<NetworkIcons_1.CheckIcon size={14} color={AppColors_1.AppColors.white}/>) : isLocked ? (<react_native_svg_1.default width={10} height={10} viewBox="0 0 24 24" fill="none">
409
636
  <react_native_svg_1.Path d="M7 10V7a5 5 0 0 1 10 0v3" stroke={AppColors_1.AppColors.grayText} strokeWidth="2.2" strokeLinecap="round"/>
410
637
  <react_native_svg_1.Path d="M5 10h14v9a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1z" fill={AppColors_1.AppColors.grayText}/>
411
- </react_native_svg_1.default>)}
412
- </react_native_1.View>
413
- </TouchableScale_1.default>
414
- {isLocked && (<react_native_1.Text style={{
415
- fontFamily: AppFonts_1.AppFonts.interBold,
416
- fontSize: 7.5,
417
- color: isUnavailable
418
- ? AppColors_1.AppColors.amber700
638
+ </react_native_svg_1.default>) : null}
639
+ </TouchableScale_1.default>
640
+ </react_native_1.View>
641
+
642
+ {/* Card Footer: Live Stats + Configure Button */}
643
+ {!isUnavailable && (<react_native_1.View style={{
644
+ flexDirection: 'row',
645
+ alignItems: 'center',
646
+ justifyContent: 'space-between',
647
+ paddingTop: 8,
648
+ borderTopWidth: 1,
649
+ borderTopColor: AppColors_1.AppColors.dividerColor,
650
+ }}>
651
+ {/* Live Info Pill */}
652
+ <react_native_1.View style={{
653
+ flexDirection: 'row',
654
+ alignItems: 'center',
655
+ gap: 6,
656
+ flex: 1,
657
+ }}>
658
+ <react_native_1.View style={{
659
+ width: 6,
660
+ height: 6,
661
+ borderRadius: 3,
662
+ backgroundColor: isChecked
663
+ ? AppColors_1.AppColors.liveGreen
419
664
  : AppColors_1.AppColors.grayTextWeak,
420
- letterSpacing: 0.3,
421
- marginTop: 3,
422
- textAlign: 'right',
665
+ }}/>
666
+ <react_native_1.Text style={{
667
+ fontFamily: AppFonts_1.AppFonts.interMedium,
668
+ fontSize: 11,
669
+ color: AppColors_1.AppColors.grayText,
670
+ lineHeight: 14,
423
671
  }}>
424
- {tab.key === 'apis'
425
- ? t('settings.requiredBadge')
426
- : t('settings.readOnlyBadge')}
427
- </react_native_1.Text>)}
428
- </react_native_1.View>
429
- </react_native_1.View>);
672
+ {liveStats}
673
+ </react_native_1.Text>
674
+ </react_native_1.View>
675
+
676
+ {/* Sleek Configure Button */}
677
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={`Configure ${moduleItem.label} settings`} onPress={() => {
678
+ (0, InspectorContext_1.animateNextLayout)();
679
+ setSettingsPage(moduleItem.key);
680
+ }} style={{
681
+ flexDirection: 'row',
682
+ alignItems: 'center',
683
+ gap: 5,
684
+ backgroundColor: `${AppColors_1.AppColors.purple}12`,
685
+ paddingHorizontal: 10,
686
+ paddingVertical: 5,
687
+ borderRadius: 8,
688
+ borderWidth: 1,
689
+ borderColor: `${AppColors_1.AppColors.purple}26`,
690
+ }}>
691
+ <NetworkIcons_1.SettingsIcon color={AppColors_1.AppColors.purple} size={11}/>
692
+ <react_native_1.Text style={{
693
+ fontFamily: AppFonts_1.AppFonts.interBold,
694
+ fontSize: 11,
695
+ lineHeight: 14,
696
+ color: AppColors_1.AppColors.purple,
697
+ }}>
698
+ {t('settings.configure')}
699
+ </react_native_1.Text>
700
+ <NetworkIcons_1.ForwardChevronIcon color={AppColors_1.AppColors.purple} size={9}/>
701
+ </TouchableScale_1.default>
702
+ </react_native_1.View>)}
703
+ </react_native_1.View>);
430
704
  })}
431
- </react_native_1.View>) : (
432
- /* UI Preferences Section */
433
- <react_native_1.View style={{
705
+ </react_native_1.View>
706
+
707
+ {/* Section 3.5: RAM-Based Auto Limits */}
708
+ <react_native_1.View style={{
434
709
  backgroundColor: AppColors_1.AppColors.primaryLight,
435
- borderRadius: 12,
710
+ borderRadius: 14,
436
711
  borderWidth: 1,
437
712
  borderColor: AppColors_1.AppColors.grayBorderSecondary,
438
713
  overflow: 'hidden',
439
- }}>
440
- <react_native_1.View style={{
441
- flexDirection: 'row',
442
- alignItems: 'center',
443
- paddingVertical: 12,
444
- paddingHorizontal: 14,
714
+ padding: 14,
445
715
  gap: 12,
446
716
  }}>
447
- {/* Icon + Label */}
717
+ <react_native_1.Text style={{
718
+ fontFamily: AppFonts_1.AppFonts.interBold,
719
+ fontSize: 11,
720
+ lineHeight: 14,
721
+ color: AppColors_1.AppColors.grayTextWeak,
722
+ letterSpacing: 0.8,
723
+ }}>
724
+ RAM-Based Auto Limits
725
+ </react_native_1.Text>
726
+
727
+ {/* Auto RAM Limit Toggle */}
448
728
  <react_native_1.View style={{
449
- flex: 1,
450
729
  flexDirection: 'row',
451
730
  alignItems: 'center',
452
- gap: 8,
731
+ justifyContent: 'space-between',
453
732
  }}>
454
733
  <react_native_1.View style={{
734
+ flexDirection: 'row',
735
+ alignItems: 'center',
736
+ gap: 10,
737
+ flex: 1,
738
+ }}>
739
+ <react_native_1.View style={{
740
+ width: 32,
741
+ height: 32,
742
+ borderRadius: 8,
743
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
744
+ alignItems: 'center',
745
+ justifyContent: 'center',
746
+ }}>
747
+ <NetworkIcons_1.PerformanceIcon color={AppColors_1.AppColors.purple} size={15}/>
748
+ </react_native_1.View>
749
+ <react_native_1.View style={{ flex: 1 }}>
750
+ <react_native_1.Text style={{
751
+ fontFamily: AppFonts_1.AppFonts.interBold,
752
+ fontSize: 13.5,
753
+ lineHeight: 18,
754
+ color: AppColors_1.AppColors.primaryBlack,
755
+ }}>
756
+ Auto-Calculate Limits from Device RAM
757
+ </react_native_1.Text>
758
+ <react_native_1.Text style={{
759
+ fontFamily: AppFonts_1.AppFonts.interRegular,
760
+ fontSize: 11,
761
+ lineHeight: 15,
762
+ color: AppColors_1.AppColors.grayText,
763
+ marginTop: 1,
764
+ }}>
765
+ Automatically set API, Logs, Analytics & Crash limits based on available memory
766
+ </react_native_1.Text>
767
+ </react_native_1.View>
768
+ </react_native_1.View>
769
+
770
+ <TouchableScale_1.default accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle auto RAM limit calculation" accessibilityState={{ checked: isAutoRamLimitEnabled }} onPress={() => setIsAutoRamLimitEnabled(prev => !prev)} style={{
771
+ width: 42,
772
+ height: 24,
773
+ borderRadius: 12,
774
+ backgroundColor: isAutoRamLimitEnabled
775
+ ? AppColors_1.AppColors.purple
776
+ : AppColors_1.AppColors.grayBorderSecondary,
777
+ padding: 2,
778
+ justifyContent: 'center',
779
+ alignItems: isAutoRamLimitEnabled ? 'flex-end' : 'flex-start',
780
+ }}>
781
+ <react_native_1.View style={{
455
782
  width: 20,
456
783
  height: 20,
457
- borderRadius: 6,
458
- backgroundColor: AppColors_1.AppColors.purpleShade50,
459
- borderWidth: 1,
460
- borderColor: `${AppColors_1.AppColors.purple}33`,
784
+ borderRadius: 10,
785
+ backgroundColor: AppColors_1.AppColors.white,
786
+ shadowColor: AppColors_1.AppColors.black,
787
+ shadowOpacity: 0.18,
788
+ shadowRadius: 2,
789
+ shadowOffset: { width: 0, height: 1 },
790
+ }}/>
791
+ </TouchableScale_1.default>
792
+ </react_native_1.View>
793
+
794
+ <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
795
+
796
+ {/* Device Free RAM Display */}
797
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 10 }}>
798
+ <react_native_1.View style={{
799
+ width: 32,
800
+ height: 32,
801
+ borderRadius: 8,
802
+ backgroundColor: isAutoRamLimitEnabled
803
+ ? `${AppColors_1.AppColors.purple}14`
804
+ : AppColors_1.AppColors.grayBackground,
461
805
  alignItems: 'center',
462
806
  justifyContent: 'center',
463
807
  }}>
464
- {isDark ? (<NetworkIcons_1.SunIcon color={AppColors_1.AppColors.purple} size={11}/>) : (<NetworkIcons_1.MoonIcon color={AppColors_1.AppColors.purple} size={11}/>)}
808
+ <NetworkIcons_1.SignalIcon color={isAutoRamLimitEnabled ? AppColors_1.AppColors.purple : AppColors_1.AppColors.grayTextWeak} size={15}/>
465
809
  </react_native_1.View>
466
810
  <react_native_1.View style={{ flex: 1 }}>
467
811
  <react_native_1.Text style={{
468
812
  fontFamily: AppFonts_1.AppFonts.interBold,
469
- fontSize: 13,
470
- color: AppColors_1.AppColors.primaryBlack,
813
+ fontSize: 13.5,
814
+ lineHeight: 18,
815
+ color: isAutoRamLimitEnabled
816
+ ? AppColors_1.AppColors.primaryBlack
817
+ : AppColors_1.AppColors.grayText,
818
+ }}>
819
+ Detected Free RAM
820
+ </react_native_1.Text>
821
+ <react_native_1.Text style={{
822
+ fontFamily: AppFonts_1.AppFonts.interRegular,
823
+ fontSize: 11,
824
+ lineHeight: 15,
825
+ color: AppColors_1.AppColors.grayText,
826
+ marginTop: 1,
471
827
  }}>
472
- Dark Theme
828
+ {deviceFreeRamMb} MB available
829
+ </react_native_1.Text>
830
+ </react_native_1.View>
831
+ <react_native_1.View style={{
832
+ paddingHorizontal: 10,
833
+ paddingVertical: 5,
834
+ borderRadius: 8,
835
+ backgroundColor: isAutoRamLimitEnabled
836
+ ? `${AppColors_1.AppColors.purple}12`
837
+ : AppColors_1.AppColors.grayBackground,
838
+ borderWidth: 1,
839
+ borderColor: isAutoRamLimitEnabled
840
+ ? `${AppColors_1.AppColors.purple}26`
841
+ : AppColors_1.AppColors.dividerColor,
842
+ }}>
843
+ <react_native_1.Text style={{
844
+ fontFamily: AppFonts_1.AppFonts.interBold,
845
+ fontSize: 12,
846
+ lineHeight: 15,
847
+ color: isAutoRamLimitEnabled
848
+ ? AppColors_1.AppColors.purple
849
+ : AppColors_1.AppColors.grayText,
850
+ }}>
851
+ {deviceFreeRamMb} MB
473
852
  </react_native_1.Text>
474
853
  </react_native_1.View>
475
854
  </react_native_1.View>
476
855
 
477
- {/* Toggle Switch */}
478
- <TouchableScale_1.default onPress={() => {
856
+ {/* Current Auto-Calculated Limits Preview */}
857
+ {isAutoRamLimitEnabled && (<react_native_1.View style={{ marginTop: 8, paddingTop: 8, borderTopWidth: 1, borderTopColor: AppColors_1.AppColors.dividerColor, gap: 6 }}>
858
+ <react_native_1.Text style={{
859
+ fontFamily: AppFonts_1.AppFonts.interBold,
860
+ fontSize: 11.5,
861
+ lineHeight: 15,
862
+ color: AppColors_1.AppColors.purple,
863
+ }}>
864
+ Auto Profile: {autoRamProfile.profileName}
865
+ </react_native_1.Text>
866
+ <react_native_1.View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 8 }}>
867
+ {[
868
+ { label: 'APIs', value: autoRamProfile.maxNetworkLogs, color: AppColors_1.AppColors.blue500 },
869
+ { label: 'Logs', value: autoRamProfile.maxConsoleLogs, color: AppColors_1.AppColors.sky500 },
870
+ { label: 'Analytics', value: autoRamProfile.maxAnalyticsEvents, color: AppColors_1.AppColors.purple },
871
+ { label: 'Crash', value: autoRamProfile.maxCrashRecords, color: AppColors_1.AppColors.errorColor },
872
+ ].map(item => (<react_native_1.View key={item.label} style={{
873
+ flexDirection: 'row',
874
+ alignItems: 'center',
875
+ gap: 4,
876
+ paddingHorizontal: 8,
877
+ paddingVertical: 4,
878
+ borderRadius: 6,
879
+ backgroundColor: `${item.color}14`,
880
+ borderWidth: 1,
881
+ borderColor: `${item.color}33`,
882
+ }}>
883
+ <react_native_1.Text style={{
884
+ fontFamily: AppFonts_1.AppFonts.interBold,
885
+ fontSize: 10.5,
886
+ lineHeight: 14,
887
+ color: item.color,
888
+ }}>
889
+ {item.label}
890
+ </react_native_1.Text>
891
+ <react_native_1.Text style={{
892
+ fontFamily: AppFonts_1.AppFonts.interBold,
893
+ fontSize: 10.5,
894
+ lineHeight: 14,
895
+ color: item.color,
896
+ }}>
897
+ {item.value}
898
+ </react_native_1.Text>
899
+ </react_native_1.View>))}
900
+ </react_native_1.View>
901
+ </react_native_1.View>)}
902
+ </react_native_1.View>
903
+ </react_native_1.View>) : (<react_native_1.View style={{ gap: 14 }}>
904
+ {/* Section 1: Appearance */}
905
+ <react_native_1.View style={{
906
+ backgroundColor: AppColors_1.AppColors.primaryLight,
907
+ borderRadius: 14,
908
+ borderWidth: 1,
909
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
910
+ overflow: 'hidden',
911
+ padding: 14,
912
+ gap: 12,
913
+ }}>
914
+ <react_native_1.Text style={{
915
+ fontFamily: AppFonts_1.AppFonts.interBold,
916
+ fontSize: 11,
917
+ lineHeight: 14,
918
+ color: AppColors_1.AppColors.grayTextWeak,
919
+ letterSpacing: 0.8,
920
+ }}>
921
+ {t('settings.appearanceTheme')}
922
+ </react_native_1.Text>
923
+
924
+ <react_native_1.View style={{
925
+ flexDirection: 'row',
926
+ alignItems: 'center',
927
+ justifyContent: 'space-between',
928
+ }}>
929
+ <react_native_1.View style={{
930
+ flexDirection: 'row',
931
+ alignItems: 'center',
932
+ gap: 10,
933
+ flex: 1,
934
+ }}>
935
+ <react_native_1.View style={{
936
+ width: 32,
937
+ height: 32,
938
+ borderRadius: 8,
939
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
940
+ alignItems: 'center',
941
+ justifyContent: 'center',
942
+ }}>
943
+ {isDark ? (<NetworkIcons_1.SunIcon color={AppColors_1.AppColors.purple} size={15}/>) : (<NetworkIcons_1.MoonIcon color={AppColors_1.AppColors.purple} size={15}/>)}
944
+ </react_native_1.View>
945
+ <react_native_1.View style={{ flex: 1 }}>
946
+ <react_native_1.Text style={{
947
+ fontFamily: AppFonts_1.AppFonts.interBold,
948
+ fontSize: 13.5,
949
+ lineHeight: 18,
950
+ color: AppColors_1.AppColors.primaryBlack,
951
+ }}>
952
+ {t('settings.general.darkMode')}
953
+ </react_native_1.Text>
954
+ <react_native_1.Text style={{
955
+ fontFamily: AppFonts_1.AppFonts.interRegular,
956
+ fontSize: 11,
957
+ lineHeight: 15,
958
+ color: AppColors_1.AppColors.grayText,
959
+ marginTop: 1,
960
+ }}>
961
+ {t('settings.general.darkModeDescription')}
962
+ </react_native_1.Text>
963
+ </react_native_1.View>
964
+ </react_native_1.View>
965
+
966
+ <TouchableScale_1.default accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle Dark Theme" accessibilityState={{ checked: isDark }} onPress={() => {
479
967
  const newTheme = !isDark;
480
968
  setIsDark(newTheme);
481
969
  (0, styles_1.toggleGlobalTheme)(newTheme);
482
970
  }} style={{
483
- width: 38,
484
- height: 22,
485
- borderRadius: 11,
971
+ width: 42,
972
+ height: 24,
973
+ borderRadius: 12,
486
974
  backgroundColor: isDark
487
975
  ? AppColors_1.AppColors.purple
488
976
  : AppColors_1.AppColors.grayBorderSecondary,
@@ -490,226 +978,243 @@ const SettingsPanel = () => {
490
978
  justifyContent: 'center',
491
979
  alignItems: isDark ? 'flex-end' : 'flex-start',
492
980
  }}>
493
- <react_native_1.View style={{
494
- width: 18,
495
- height: 18,
496
- borderRadius: 9,
981
+ <react_native_1.View style={{
982
+ width: 20,
983
+ height: 20,
984
+ borderRadius: 10,
497
985
  backgroundColor: AppColors_1.AppColors.white,
498
986
  shadowColor: AppColors_1.AppColors.black,
499
- shadowOpacity: 0.15,
500
- shadowRadius: 1.5,
987
+ shadowOpacity: 0.18,
988
+ shadowRadius: 2,
501
989
  shadowOffset: { width: 0, height: 1 },
502
990
  }}/>
503
- </TouchableScale_1.default>
991
+ </TouchableScale_1.default>
992
+ </react_native_1.View>
504
993
  </react_native_1.View>
505
994
 
506
- {/* Divider */}
507
- <react_native_1.View style={{
508
- height: 1,
509
- backgroundColor: AppColors_1.AppColors.dividerColor,
510
- }}/>
511
-
512
- {/* Modal Height */}
995
+ {/* Section 2: Window & Layout */}
513
996
  <react_native_1.View style={{
514
- paddingVertical: 12,
515
- paddingHorizontal: 14,
997
+ backgroundColor: AppColors_1.AppColors.primaryLight,
998
+ borderRadius: 14,
999
+ borderWidth: 1,
1000
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1001
+ overflow: 'hidden',
1002
+ padding: 14,
1003
+ gap: 14,
516
1004
  }}>
517
- <react_native_1.View style={{
1005
+ <react_native_1.Text style={{
1006
+ fontFamily: AppFonts_1.AppFonts.interBold,
1007
+ fontSize: 11,
1008
+ lineHeight: 14,
1009
+ color: AppColors_1.AppColors.grayTextWeak,
1010
+ letterSpacing: 0.8,
1011
+ }}>
1012
+ {t('settings.windowLayout')}
1013
+ </react_native_1.Text>
1014
+
1015
+ {/* Modal Height */}
1016
+ <react_native_1.View style={{ gap: 8 }}>
1017
+ <react_native_1.View style={{
518
1018
  flexDirection: 'row',
519
1019
  alignItems: 'center',
520
- gap: 8,
1020
+ gap: 10,
521
1021
  }}>
522
- <react_native_1.View style={{
523
- width: 20,
524
- height: 20,
525
- borderRadius: 6,
1022
+ <react_native_1.View style={{
1023
+ width: 32,
1024
+ height: 32,
1025
+ borderRadius: 8,
526
1026
  backgroundColor: AppColors_1.AppColors.purpleShade50,
527
- borderWidth: 1,
528
- borderColor: `${AppColors_1.AppColors.purple}33`,
529
1027
  alignItems: 'center',
530
1028
  justifyContent: 'center',
531
1029
  }}>
532
- <NetworkIcons_1.ScreenIcon color={AppColors_1.AppColors.purple} size={11}/>
533
- </react_native_1.View>
534
- <react_native_1.View style={{ flex: 1 }}>
535
- <react_native_1.Text style={{
1030
+ <NetworkIcons_1.ScreenIcon color={AppColors_1.AppColors.purple} size={15}/>
1031
+ </react_native_1.View>
1032
+ <react_native_1.View style={{ flex: 1 }}>
1033
+ <react_native_1.Text style={{
536
1034
  fontFamily: AppFonts_1.AppFonts.interBold,
537
- fontSize: 13,
1035
+ fontSize: 13.5,
1036
+ lineHeight: 18,
538
1037
  color: AppColors_1.AppColors.primaryBlack,
539
1038
  }}>
540
- Modal Height
541
- </react_native_1.Text>
542
- <react_native_1.Text style={{
1039
+ {t('settings.general.modalHeight')}
1040
+ </react_native_1.Text>
1041
+ <react_native_1.Text style={{
543
1042
  fontFamily: AppFonts_1.AppFonts.interRegular,
544
1043
  fontSize: 11,
1044
+ lineHeight: 15,
545
1045
  color: AppColors_1.AppColors.grayText,
546
1046
  marginTop: 1,
547
1047
  }}>
548
- Height of the inspector panel relative to the screen
549
- </react_native_1.Text>
1048
+ {t('settings.general.modalHeightDescription')}
1049
+ </react_native_1.Text>
1050
+ </react_native_1.View>
550
1051
  </react_native_1.View>
551
- </react_native_1.View>
552
1052
 
553
- {/* Segmented picker */}
554
- <react_native_1.View style={{
1053
+ <react_native_1.View style={{
555
1054
  flexDirection: 'row',
556
1055
  backgroundColor: AppColors_1.AppColors.grayBackground,
557
- borderRadius: 8,
558
- padding: 2.5,
559
- marginTop: 10,
1056
+ borderRadius: 10,
1057
+ padding: 3,
560
1058
  borderWidth: 1,
561
1059
  borderColor: AppColors_1.AppColors.dividerColor,
562
1060
  }}>
563
- {[50, 70, 90, 100].map(opt => {
1061
+ {[50, 70, 90, 100].map(opt => {
564
1062
  const isActive = modalHeightPercent === opt;
565
- return (<TouchableScale_1.default key={opt} onPress={() => setModalHeightPercent(opt)} style={{
1063
+ return (<TouchableScale_1.default key={opt} accessible={true} accessibilityRole="button" accessibilityLabel={`Set window height to ${opt} percent`} accessibilityState={{ selected: isActive }} onPress={() => setModalHeightPercent(opt)} style={{
566
1064
  flex: 1,
567
- paddingVertical: 6,
1065
+ paddingVertical: 7,
568
1066
  alignItems: 'center',
569
- borderRadius: 6,
1067
+ borderRadius: 8,
570
1068
  backgroundColor: isActive
571
1069
  ? AppColors_1.AppColors.purple
572
1070
  : 'transparent',
573
1071
  }}>
574
- <react_native_1.Text style={{
1072
+ <react_native_1.Text style={{
575
1073
  fontFamily: AppFonts_1.AppFonts.interBold,
576
- fontSize: 11,
577
- color: isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayText,
1074
+ fontSize: 11.5,
1075
+ lineHeight: 15,
1076
+ color: isActive
1077
+ ? AppColors_1.AppColors.white
1078
+ : AppColors_1.AppColors.grayText,
578
1079
  }}>
579
- {opt}%
580
- </react_native_1.Text>
581
- </TouchableScale_1.default>);
1080
+ {opt}%
1081
+ </react_native_1.Text>
1082
+ </TouchableScale_1.default>);
582
1083
  })}
1084
+ </react_native_1.View>
583
1085
  </react_native_1.View>
584
- </react_native_1.View>
585
1086
 
586
- {/* Divider */}
587
- <react_native_1.View style={{
588
- height: 1,
589
- backgroundColor: AppColors_1.AppColors.dividerColor,
590
- }}/>
1087
+ <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
591
1088
 
592
- {/* Modal Animation */}
593
- <react_native_1.View style={{
594
- paddingVertical: 12,
595
- paddingHorizontal: 14,
596
- }}>
597
- <react_native_1.View style={{
1089
+ {/* Modal Animation */}
1090
+ <react_native_1.View style={{ gap: 8 }}>
1091
+ <react_native_1.View style={{
598
1092
  flexDirection: 'row',
599
1093
  alignItems: 'center',
600
- gap: 8,
1094
+ gap: 10,
601
1095
  }}>
602
- <react_native_1.View style={{
603
- width: 20,
604
- height: 20,
605
- borderRadius: 6,
1096
+ <react_native_1.View style={{
1097
+ width: 32,
1098
+ height: 32,
1099
+ borderRadius: 8,
606
1100
  backgroundColor: AppColors_1.AppColors.purpleShade50,
607
- borderWidth: 1,
608
- borderColor: `${AppColors_1.AppColors.purple}33`,
609
1101
  alignItems: 'center',
610
1102
  justifyContent: 'center',
611
1103
  }}>
612
- <NetworkIcons_1.MotionIcon color={AppColors_1.AppColors.purple} size={11}/>
613
- </react_native_1.View>
614
- <react_native_1.View style={{ flex: 1 }}>
615
- <react_native_1.Text style={{
1104
+ <NetworkIcons_1.MotionIcon color={AppColors_1.AppColors.purple} size={15}/>
1105
+ </react_native_1.View>
1106
+ <react_native_1.View style={{ flex: 1 }}>
1107
+ <react_native_1.Text style={{
616
1108
  fontFamily: AppFonts_1.AppFonts.interBold,
617
- fontSize: 13,
1109
+ fontSize: 13.5,
1110
+ lineHeight: 18,
618
1111
  color: AppColors_1.AppColors.primaryBlack,
619
1112
  }}>
620
- Modal Animation
621
- </react_native_1.Text>
622
- <react_native_1.Text style={{
1113
+ {t('settings.general.modalAnimation')}
1114
+ </react_native_1.Text>
1115
+ <react_native_1.Text style={{
623
1116
  fontFamily: AppFonts_1.AppFonts.interRegular,
624
1117
  fontSize: 11,
1118
+ lineHeight: 15,
625
1119
  color: AppColors_1.AppColors.grayText,
626
1120
  marginTop: 1,
627
1121
  }}>
628
- How the inspector panel enters and exits the screen
629
- </react_native_1.Text>
1122
+ {t('settings.general.modalAnimationDescription')}
1123
+ </react_native_1.Text>
1124
+ </react_native_1.View>
630
1125
  </react_native_1.View>
631
- </react_native_1.View>
632
1126
 
633
- {/* Segmented picker */}
634
- <react_native_1.View style={{
1127
+ <react_native_1.View style={{
635
1128
  flexDirection: 'row',
636
1129
  backgroundColor: AppColors_1.AppColors.grayBackground,
637
- borderRadius: 8,
638
- padding: 2.5,
639
- marginTop: 10,
1130
+ borderRadius: 10,
1131
+ padding: 3,
640
1132
  borderWidth: 1,
641
1133
  borderColor: AppColors_1.AppColors.dividerColor,
642
1134
  }}>
643
- {([
1135
+ {[
644
1136
  { key: 'slide', label: 'Slide Up' },
645
1137
  { key: 'fade', label: 'Fade' },
646
1138
  { key: 'none', label: 'None' },
647
- ]).map(opt => {
1139
+ ].map(opt => {
648
1140
  const isActive = modalAnimationType === opt.key;
649
- return (<TouchableScale_1.default key={opt.key} onPress={() => setModalAnimationType(opt.key)} style={{
1141
+ return (<TouchableScale_1.default key={opt.key} accessible={true} accessibilityRole="button" accessibilityLabel={`Set transition animation to ${opt.label}`} accessibilityState={{ selected: isActive }} onPress={() => setModalAnimationType(opt.key)} style={{
650
1142
  flex: 1,
651
- paddingVertical: 6,
1143
+ paddingVertical: 7,
652
1144
  alignItems: 'center',
653
- borderRadius: 6,
1145
+ borderRadius: 8,
654
1146
  backgroundColor: isActive
655
1147
  ? AppColors_1.AppColors.purple
656
1148
  : 'transparent',
657
1149
  }}>
658
- <react_native_1.Text style={{
1150
+ <react_native_1.Text style={{
659
1151
  fontFamily: AppFonts_1.AppFonts.interBold,
660
- fontSize: 11,
661
- color: isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayText,
1152
+ fontSize: 11.5,
1153
+ lineHeight: 15,
1154
+ color: isActive
1155
+ ? AppColors_1.AppColors.white
1156
+ : AppColors_1.AppColors.grayText,
662
1157
  }}>
663
- {opt.label}
664
- </react_native_1.Text>
665
- </TouchableScale_1.default>);
1158
+ {opt.label}
1159
+ </react_native_1.Text>
1160
+ </TouchableScale_1.default>);
666
1161
  })}
1162
+ </react_native_1.View>
667
1163
  </react_native_1.View>
668
1164
  </react_native_1.View>
669
1165
 
670
- {/* Divider */}
671
- <react_native_1.View style={{
672
- height: 1,
673
- backgroundColor: AppColors_1.AppColors.dividerColor,
674
- }}/>
675
-
676
- {/* #6 — Default Tab */}
1166
+ {/* Section 3: Default Startup Tab */}
677
1167
  <react_native_1.View style={{
678
- paddingVertical: 12,
679
- paddingHorizontal: 14,
1168
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1169
+ borderRadius: 14,
1170
+ borderWidth: 1,
1171
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1172
+ overflow: 'hidden',
1173
+ padding: 14,
1174
+ gap: 12,
1175
+ }}>
1176
+ <react_native_1.Text style={{
1177
+ fontFamily: AppFonts_1.AppFonts.interBold,
1178
+ fontSize: 11,
1179
+ lineHeight: 14,
1180
+ color: AppColors_1.AppColors.grayTextWeak,
1181
+ letterSpacing: 0.8,
680
1182
  }}>
1183
+ {t('settings.startupDefault')}
1184
+ </react_native_1.Text>
1185
+
681
1186
  <react_native_1.View style={{
682
1187
  flexDirection: 'row',
683
1188
  alignItems: 'center',
684
- gap: 8,
1189
+ gap: 10,
685
1190
  }}>
686
1191
  <react_native_1.View style={{
687
- width: 20,
688
- height: 20,
689
- borderRadius: 6,
1192
+ width: 32,
1193
+ height: 32,
1194
+ borderRadius: 8,
690
1195
  backgroundColor: AppColors_1.AppColors.purpleShade50,
691
- borderWidth: 1,
692
- borderColor: `${AppColors_1.AppColors.purple}33`,
693
1196
  alignItems: 'center',
694
1197
  justifyContent: 'center',
695
1198
  }}>
696
- <NetworkIcons_1.LayersIcon color={AppColors_1.AppColors.purple} size={11}/>
1199
+ <NetworkIcons_1.LayersIcon color={AppColors_1.AppColors.purple} size={15}/>
697
1200
  </react_native_1.View>
698
1201
  <react_native_1.View style={{ flex: 1 }}>
699
1202
  <react_native_1.Text style={{
700
1203
  fontFamily: AppFonts_1.AppFonts.interBold,
701
- fontSize: 13,
1204
+ fontSize: 13.5,
1205
+ lineHeight: 18,
702
1206
  color: AppColors_1.AppColors.primaryBlack,
703
1207
  }}>
704
- Default Tab
1208
+ {t('settings.general.defaultOpeningTab')}
705
1209
  </react_native_1.Text>
706
1210
  <react_native_1.Text style={{
707
1211
  fontFamily: AppFonts_1.AppFonts.interRegular,
708
1212
  fontSize: 11,
1213
+ lineHeight: 15,
709
1214
  color: AppColors_1.AppColors.grayText,
710
1215
  marginTop: 1,
711
1216
  }}>
712
- Tab shown when the inspector opens
1217
+ {t('settings.general.defaultOpeningTabDesc')}
713
1218
  </react_native_1.Text>
714
1219
  </react_native_1.View>
715
1220
  </react_native_1.View>
@@ -719,13 +1224,15 @@ const SettingsPanel = () => {
719
1224
  flexDirection: 'row',
720
1225
  flexWrap: 'wrap',
721
1226
  gap: 8,
722
- marginTop: 12,
1227
+ marginTop: 4,
723
1228
  }}>
724
- {settingsTabs
725
- .filter(tab => tab.key === 'apis' || tabVisibility?.[tab.key])
1229
+ {allModules
1230
+ .filter(tab => tab.key === 'apis' ||
1231
+ stagedTabVisibility?.[tab.key] ||
1232
+ tabVisibility?.[tab.key])
726
1233
  .map(tab => {
727
1234
  const isActive = defaultTab === tab.key;
728
- return (<TouchableScale_1.default key={tab.key} onPress={() => setDefaultTab(tab.key)} style={{
1235
+ return (<TouchableScale_1.default key={tab.key} accessible={true} accessibilityRole="button" accessibilityLabel={`Set ${tab.label} as default tab`} accessibilityState={{ selected: isActive }} onPress={() => setDefaultTab(tab.key)} style={{
729
1236
  flexDirection: 'row',
730
1237
  alignItems: 'center',
731
1238
  gap: 8,
@@ -733,186 +1240,190 @@ const SettingsPanel = () => {
733
1240
  paddingHorizontal: 12,
734
1241
  borderRadius: 10,
735
1242
  borderWidth: 1.5,
736
- borderColor: isActive ? AppColors_1.AppColors.purple : AppColors_1.AppColors.grayBorderSecondary,
737
- backgroundColor: isActive ? `${AppColors_1.AppColors.purple}0F` : AppColors_1.AppColors.primaryLight,
1243
+ borderColor: isActive
1244
+ ? AppColors_1.AppColors.purple
1245
+ : AppColors_1.AppColors.grayBorderSecondary,
1246
+ backgroundColor: isActive
1247
+ ? `${AppColors_1.AppColors.purple}0F`
1248
+ : AppColors_1.AppColors.primaryLight,
738
1249
  minWidth: '47%',
739
1250
  flex: 1,
740
1251
  }}>
741
- <react_native_1.View style={{
742
- width: 22,
743
- height: 22,
744
- borderRadius: 6,
745
- backgroundColor: isActive ? AppColors_1.AppColors.purple : AppColors_1.AppColors.purpleShade50,
746
- alignItems: 'center',
747
- justifyContent: 'center',
748
- }}>
749
- {tab.icon === 'apis' && (<NetworkIcons_1.SignalIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>)}
750
- {tab.icon === 'logs' && (<NetworkIcons_1.TerminalIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>)}
751
- {tab.icon === 'analytics' && (<NetworkIcons_1.AnalyticsIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>)}
752
- {tab.icon === 'redux' && (<NetworkIcons_1.ReduxIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>)}
753
- {tab.icon === 'bundle' && (<NetworkIcons_1.PackageIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>)}
754
- {tab.icon === 'performance' && (<NetworkIcons_1.PerformanceIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>)}
755
- {tab.icon === 'crash' && (<NetworkIcons_1.CrashIcon color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>)}
756
- </react_native_1.View>
757
1252
  <react_native_1.Text style={{
758
1253
  fontFamily: AppFonts_1.AppFonts.interBold,
759
- fontSize: 13,
760
- color: isActive ? AppColors_1.AppColors.purple : AppColors_1.AppColors.primaryBlack,
1254
+ fontSize: 12.5,
1255
+ lineHeight: 16,
1256
+ color: isActive
1257
+ ? AppColors_1.AppColors.purple
1258
+ : AppColors_1.AppColors.primaryBlack,
761
1259
  flex: 1,
762
1260
  }}>
763
- {tab.label}
1261
+ {tab.label}
764
1262
  </react_native_1.Text>
765
1263
  {isActive && (<react_native_1.View style={{
766
- width: 14,
767
- height: 14,
768
- borderRadius: 7,
1264
+ width: 16,
1265
+ height: 16,
1266
+ borderRadius: 8,
769
1267
  backgroundColor: AppColors_1.AppColors.purple,
770
1268
  alignItems: 'center',
771
1269
  justifyContent: 'center',
772
1270
  }}>
773
- <NetworkIcons_1.CheckIcon size={8} color={AppColors_1.AppColors.white}/>
1271
+ <NetworkIcons_1.CheckIcon size={9} color={AppColors_1.AppColors.white}/>
774
1272
  </react_native_1.View>)}
775
1273
  </TouchableScale_1.default>);
776
1274
  })}
777
1275
  </react_native_1.View>
778
1276
  </react_native_1.View>
779
1277
 
780
- {/* Divider */}
1278
+ {/* Section 4: Log Deduplication & Levels */}
781
1279
  <react_native_1.View style={{
782
- height: 1,
783
- backgroundColor: AppColors_1.AppColors.dividerColor,
784
- }}/>
1280
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1281
+ borderRadius: 14,
1282
+ borderWidth: 1,
1283
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1284
+ overflow: 'hidden',
1285
+ padding: 14,
1286
+ gap: 14,
1287
+ }}>
1288
+ <react_native_1.Text style={{
1289
+ fontFamily: AppFonts_1.AppFonts.interBold,
1290
+ fontSize: 11,
1291
+ lineHeight: 14,
1292
+ color: AppColors_1.AppColors.grayTextWeak,
1293
+ letterSpacing: 0.8,
1294
+ }}>
1295
+ {t('settings.logFiltersDeduplication')}
1296
+ </react_native_1.Text>
785
1297
 
786
- {/* #9 — Show Duplicate Logs */}
787
- <react_native_1.View style={{
1298
+ {/* Show Duplicate Logs */}
1299
+ <react_native_1.View style={{
788
1300
  flexDirection: 'row',
789
1301
  alignItems: 'center',
790
- paddingVertical: 12,
791
- paddingHorizontal: 14,
792
- gap: 12,
1302
+ justifyContent: 'space-between',
793
1303
  }}>
794
- <react_native_1.View style={{
795
- flex: 1,
1304
+ <react_native_1.View style={{
796
1305
  flexDirection: 'row',
797
1306
  alignItems: 'center',
798
- gap: 8,
1307
+ gap: 10,
1308
+ flex: 1,
799
1309
  }}>
800
- <react_native_1.View style={{
801
- width: 20,
802
- height: 20,
803
- borderRadius: 6,
1310
+ <react_native_1.View style={{
1311
+ width: 32,
1312
+ height: 32,
1313
+ borderRadius: 8,
804
1314
  backgroundColor: AppColors_1.AppColors.purpleShade50,
805
- borderWidth: 1,
806
- borderColor: `${AppColors_1.AppColors.purple}33`,
807
1315
  alignItems: 'center',
808
1316
  justifyContent: 'center',
809
1317
  }}>
810
- <NetworkIcons_1.EyeIcon color={AppColors_1.AppColors.purple} size={11}/>
811
- </react_native_1.View>
812
- <react_native_1.View style={{ flex: 1 }}>
813
- <react_native_1.Text style={{
1318
+ <NetworkIcons_1.EyeIcon color={AppColors_1.AppColors.purple} size={15}/>
1319
+ </react_native_1.View>
1320
+ <react_native_1.View style={{ flex: 1 }}>
1321
+ <react_native_1.Text style={{
814
1322
  fontFamily: AppFonts_1.AppFonts.interBold,
815
- fontSize: 13,
1323
+ fontSize: 13.5,
1324
+ lineHeight: 18,
816
1325
  color: AppColors_1.AppColors.primaryBlack,
817
1326
  }}>
818
- Show Duplicate Logs
819
- </react_native_1.Text>
820
- <react_native_1.Text style={{
1327
+ {t('settings.general.duplicateLogs')}
1328
+ </react_native_1.Text>
1329
+ <react_native_1.Text style={{
821
1330
  fontFamily: AppFonts_1.AppFonts.interRegular,
822
1331
  fontSize: 11,
1332
+ lineHeight: 15,
823
1333
  color: AppColors_1.AppColors.grayText,
824
1334
  marginTop: 1,
825
1335
  }}>
826
- Off: repeated identical entries collapse into one row
827
- with a ×N count
828
- </react_native_1.Text>
1336
+ {t('settings.general.duplicateLogsDescription')}
1337
+ </react_native_1.Text>
1338
+ </react_native_1.View>
829
1339
  </react_native_1.View>
830
- </react_native_1.View>
831
1340
 
832
- {/* Toggle Switch */}
833
- <TouchableScale_1.default onPress={() => setShowDuplicateLogs(prev => !prev)} style={{
834
- width: 38,
835
- height: 22,
836
- borderRadius: 11,
1341
+ <TouchableScale_1.default accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle show duplicate logs" accessibilityState={{ checked: showDuplicateLogs }} onPress={() => setShowDuplicateLogs(prev => !prev)} style={{
1342
+ width: 42,
1343
+ height: 24,
1344
+ borderRadius: 12,
837
1345
  backgroundColor: showDuplicateLogs
838
1346
  ? AppColors_1.AppColors.purple
839
1347
  : AppColors_1.AppColors.grayBorderSecondary,
840
1348
  padding: 2,
841
1349
  justifyContent: 'center',
842
- alignItems: showDuplicateLogs ? 'flex-end' : 'flex-start',
1350
+ alignItems: showDuplicateLogs
1351
+ ? 'flex-end'
1352
+ : 'flex-start',
843
1353
  }}>
844
- <react_native_1.View style={{
845
- width: 18,
846
- height: 18,
847
- borderRadius: 9,
1354
+ <react_native_1.View style={{
1355
+ width: 20,
1356
+ height: 20,
1357
+ borderRadius: 10,
848
1358
  backgroundColor: AppColors_1.AppColors.white,
849
1359
  shadowColor: AppColors_1.AppColors.black,
850
- shadowOpacity: 0.15,
851
- shadowRadius: 1.5,
1360
+ shadowOpacity: 0.18,
1361
+ shadowRadius: 2,
852
1362
  shadowOffset: { width: 0, height: 1 },
853
1363
  }}/>
854
- </TouchableScale_1.default>
855
- </react_native_1.View>
1364
+ </TouchableScale_1.default>
1365
+ </react_native_1.View>
856
1366
 
857
- {/* Divider */}
858
- <react_native_1.View style={{
859
- height: 1,
860
- backgroundColor: AppColors_1.AppColors.dividerColor,
861
- }}/>
1367
+ <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
862
1368
 
863
- {/* Logs Console Levels */}
864
- <react_native_1.View style={{
865
- paddingVertical: 12,
866
- paddingHorizontal: 14,
867
- }}>
868
- <react_native_1.View style={{
1369
+ {/* Console Log Levels */}
1370
+ <react_native_1.View style={{ gap: 8 }}>
1371
+ <react_native_1.View style={{
869
1372
  flexDirection: 'row',
870
1373
  alignItems: 'center',
871
- gap: 8,
1374
+ gap: 10,
872
1375
  }}>
873
- <react_native_1.View style={{
874
- width: 20,
875
- height: 20,
876
- borderRadius: 6,
1376
+ <react_native_1.View style={{
1377
+ width: 32,
1378
+ height: 32,
1379
+ borderRadius: 8,
877
1380
  backgroundColor: AppColors_1.AppColors.purpleShade50,
878
- borderWidth: 1,
879
- borderColor: `${AppColors_1.AppColors.purple}33`,
880
1381
  alignItems: 'center',
881
1382
  justifyContent: 'center',
882
1383
  }}>
883
- <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={11}/>
884
- </react_native_1.View>
885
- <react_native_1.View style={{ flex: 1 }}>
886
- <react_native_1.Text style={{
1384
+ <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={15}/>
1385
+ </react_native_1.View>
1386
+ <react_native_1.View style={{ flex: 1 }}>
1387
+ <react_native_1.Text style={{
887
1388
  fontFamily: AppFonts_1.AppFonts.interBold,
888
- fontSize: 13,
1389
+ fontSize: 13.5,
1390
+ lineHeight: 18,
889
1391
  color: AppColors_1.AppColors.primaryBlack,
890
1392
  }}>
891
- Logs Console Levels
892
- </react_native_1.Text>
893
- <react_native_1.Text style={{
1393
+ {t('settings.general.activeConsoleLogLevels')}
1394
+ </react_native_1.Text>
1395
+ <react_native_1.Text style={{
894
1396
  fontFamily: AppFonts_1.AppFonts.interRegular,
895
1397
  fontSize: 11,
1398
+ lineHeight: 15,
896
1399
  color: AppColors_1.AppColors.grayText,
897
1400
  marginTop: 1,
898
1401
  }}>
899
- Toggle which log levels are visible in the Logs tab
900
- </react_native_1.Text>
1402
+ {t('settings.general.activeConsoleLogLevelsDesc')}
1403
+ </react_native_1.Text>
1404
+ </react_native_1.View>
901
1405
  </react_native_1.View>
902
- </react_native_1.View>
903
1406
 
904
- <react_native_1.View style={{
905
- flexDirection: 'row',
906
- gap: 8,
907
- marginTop: 10,
908
- }}>
909
- {([
910
- { key: 'info', label: 'Info', color: AppColors_1.AppColors.blue500 },
911
- { key: 'warn', label: 'Warning', color: AppColors_1.AppColors.amber500 },
912
- { key: 'error', label: 'Error', color: AppColors_1.AppColors.errorColor },
913
- ]).map(level => {
1407
+ <react_native_1.View style={{ flexDirection: 'row', gap: 8, marginTop: 4 }}>
1408
+ {[
1409
+ {
1410
+ key: 'info',
1411
+ label: 'Info',
1412
+ color: AppColors_1.AppColors.blue500,
1413
+ },
1414
+ {
1415
+ key: 'warn',
1416
+ label: 'Warning',
1417
+ color: AppColors_1.AppColors.amber500,
1418
+ },
1419
+ {
1420
+ key: 'error',
1421
+ label: 'Error',
1422
+ color: AppColors_1.AppColors.errorColor,
1423
+ },
1424
+ ].map(level => {
914
1425
  const isActive = showConsoleLevels[level.key];
915
- return (<TouchableScale_1.default key={level.key} onPress={() => setShowConsoleLevels(prev => ({
1426
+ return (<TouchableScale_1.default key={level.key} accessible={true} accessibilityRole="checkbox" accessibilityLabel={`Toggle ${level.label} logs`} accessibilityState={{ checked: isActive }} onPress={() => setShowConsoleLevels(prev => ({
916
1427
  ...prev,
917
1428
  [level.key]: !prev[level.key],
918
1429
  }))} style={{
@@ -922,112 +1433,113 @@ const SettingsPanel = () => {
922
1433
  justifyContent: 'center',
923
1434
  gap: 6,
924
1435
  paddingVertical: 8,
925
- borderRadius: 8,
1436
+ borderRadius: 9,
926
1437
  borderWidth: 1.5,
927
- borderColor: isActive ? level.color : AppColors_1.AppColors.grayBorderSecondary,
928
- backgroundColor: isActive ? `${level.color}0D` : AppColors_1.AppColors.primaryLight,
1438
+ borderColor: isActive
1439
+ ? level.color
1440
+ : AppColors_1.AppColors.grayBorderSecondary,
1441
+ backgroundColor: isActive
1442
+ ? `${level.color}0D`
1443
+ : AppColors_1.AppColors.primaryLight,
929
1444
  }}>
930
- <react_native_1.View style={{
1445
+ <react_native_1.View style={{
931
1446
  width: 8,
932
1447
  height: 8,
933
1448
  borderRadius: 4,
934
- backgroundColor: isActive ? level.color : AppColors_1.AppColors.grayBorderSecondary,
1449
+ backgroundColor: isActive
1450
+ ? level.color
1451
+ : AppColors_1.AppColors.grayBorderSecondary,
935
1452
  }}/>
936
- <react_native_1.Text style={{
1453
+ <react_native_1.Text style={{
937
1454
  fontFamily: AppFonts_1.AppFonts.interBold,
938
- fontSize: 11,
939
- color: isActive ? level.color : AppColors_1.AppColors.grayText,
1455
+ fontSize: 11.5,
1456
+ lineHeight: 15,
1457
+ color: isActive
1458
+ ? level.color
1459
+ : AppColors_1.AppColors.grayText,
940
1460
  }}>
941
- {level.label}
942
- </react_native_1.Text>
943
- </TouchableScale_1.default>);
1461
+ {level.label}
1462
+ </react_native_1.Text>
1463
+ </TouchableScale_1.default>);
944
1464
  })}
1465
+ </react_native_1.View>
945
1466
  </react_native_1.View>
946
1467
  </react_native_1.View>
947
1468
 
948
- {/* Divider */}
949
- <react_native_1.View style={{
950
- height: 1,
951
- backgroundColor: AppColors_1.AppColors.dividerColor,
952
- }}/>
953
-
954
- {/* Reset Settings */}
1469
+ {/* Section 5: Reset Settings */}
955
1470
  <react_native_1.View style={{
1471
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1472
+ borderRadius: 14,
1473
+ borderWidth: 1,
1474
+ borderColor: `${AppColors_1.AppColors.errorColor}33`,
1475
+ overflow: 'hidden',
1476
+ padding: 14,
956
1477
  flexDirection: 'row',
957
1478
  alignItems: 'center',
958
- paddingVertical: 12,
959
- paddingHorizontal: 14,
960
1479
  gap: 12,
961
1480
  }}>
962
1481
  <react_native_1.View style={{
963
- flex: 1,
964
- flexDirection: 'row',
965
- alignItems: 'center',
966
- gap: 8,
967
- }}>
968
- <react_native_1.View style={{
969
- width: 20,
970
- height: 20,
971
- borderRadius: 6,
1482
+ width: 34,
1483
+ height: 34,
1484
+ borderRadius: 9,
972
1485
  backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
973
- borderWidth: 1,
974
- borderColor: `${AppColors_1.AppColors.errorColor}33`,
975
1486
  alignItems: 'center',
976
1487
  justifyContent: 'center',
977
1488
  }}>
978
- <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={11}/>
979
- </react_native_1.View>
980
- <react_native_1.View style={{ flex: 1 }}>
981
- <react_native_1.Text style={{
1489
+ <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={15}/>
1490
+ </react_native_1.View>
1491
+ <react_native_1.View style={{ flex: 1 }}>
1492
+ <react_native_1.Text style={{
982
1493
  fontFamily: AppFonts_1.AppFonts.interBold,
983
- fontSize: 13,
1494
+ fontSize: 13.5,
1495
+ lineHeight: 18,
984
1496
  color: AppColors_1.AppColors.primaryBlack,
985
1497
  }}>
986
- Reset Settings
987
- </react_native_1.Text>
988
- <react_native_1.Text style={{
1498
+ {t('settings.resetSettings')}
1499
+ </react_native_1.Text>
1500
+ <react_native_1.Text style={{
989
1501
  fontFamily: AppFonts_1.AppFonts.interRegular,
990
1502
  fontSize: 11,
1503
+ lineHeight: 15,
991
1504
  color: AppColors_1.AppColors.grayText,
992
1505
  marginTop: 1,
993
1506
  }}>
994
- Wipe custom configurations and load package defaults
995
- </react_native_1.Text>
996
- </react_native_1.View>
1507
+ {t('settings.resetSettingsDesc')}
1508
+ </react_native_1.Text>
997
1509
  </react_native_1.View>
998
1510
 
999
- <TouchableScale_1.default onPress={resetToDefaults} style={{
1000
- paddingHorizontal: 10,
1001
- paddingVertical: 5,
1002
- borderRadius: 7,
1511
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel="Reset all settings to default" onPress={resetToDefaults} style={{
1512
+ paddingHorizontal: 12,
1513
+ paddingVertical: 7,
1514
+ borderRadius: 8,
1003
1515
  backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
1004
1516
  borderWidth: 1,
1005
- borderColor: `${AppColors_1.AppColors.errorColor}33`,
1517
+ borderColor: `${AppColors_1.AppColors.errorColor}38`,
1006
1518
  }}>
1007
1519
  <react_native_1.Text style={{
1008
1520
  fontFamily: AppFonts_1.AppFonts.interBold,
1009
- fontSize: 11,
1521
+ fontSize: 11.5,
1522
+ lineHeight: 15,
1010
1523
  color: AppColors_1.AppColors.errorColor,
1011
1524
  }}>
1012
- Reset
1525
+ {t('settings.reset')}
1013
1526
  </react_native_1.Text>
1014
1527
  </TouchableScale_1.default>
1015
1528
  </react_native_1.View>
1016
1529
  </react_native_1.View>)}
1017
1530
 
1018
-
1019
- {/* Storage Status */}
1531
+ {/* Storage & Engine Status Card */}
1020
1532
  <react_native_1.View style={{
1021
- backgroundColor: (0, settingsStore_1.isPersistentStorageAvailable)()
1022
- ? `${AppColors_1.AppColors.liveGreen}14`
1023
- : `${AppColors_1.AppColors.amber600}14`,
1533
+ backgroundColor: isPersistent
1534
+ ? `${AppColors_1.AppColors.liveGreen}12`
1535
+ : `${AppColors_1.AppColors.amber600}12`,
1024
1536
  borderRadius: 12,
1025
1537
  borderWidth: 1,
1026
- borderColor: (0, settingsStore_1.isPersistentStorageAvailable)()
1538
+ borderColor: isPersistent
1027
1539
  ? `${AppColors_1.AppColors.liveGreen}33`
1028
1540
  : `${AppColors_1.AppColors.amber600}33`,
1029
1541
  padding: 12,
1030
- marginTop: 16,
1542
+ marginBottom: 10,
1031
1543
  flexDirection: 'row',
1032
1544
  alignItems: 'center',
1033
1545
  gap: 10,
@@ -1036,32 +1548,106 @@ const SettingsPanel = () => {
1036
1548
  width: 8,
1037
1549
  height: 8,
1038
1550
  borderRadius: 4,
1039
- backgroundColor: (0, settingsStore_1.isPersistentStorageAvailable)() ? AppColors_1.AppColors.green500 : AppColors_1.AppColors.amber600,
1551
+ backgroundColor: isPersistent
1552
+ ? AppColors_1.AppColors.green500
1553
+ : AppColors_1.AppColors.amber600,
1040
1554
  }}/>
1041
1555
  <react_native_1.View style={{ flex: 1 }}>
1042
1556
  <react_native_1.Text style={{
1043
1557
  fontFamily: AppFonts_1.AppFonts.interBold,
1044
1558
  fontSize: 12,
1045
- color: (0, settingsStore_1.isPersistentStorageAvailable)() ? AppColors_1.AppColors.green700 : AppColors_1.AppColors.amber800,
1559
+ lineHeight: 16,
1560
+ color: isPersistent
1561
+ ? AppColors_1.AppColors.green700
1562
+ : AppColors_1.AppColors.amber800,
1046
1563
  }}>
1047
- {(0, settingsStore_1.isPersistentStorageAvailable)()
1048
- ? `Storage: Persistent (${storage ? 'Custom' : 'iOS Settings'})`
1049
- : 'Storage: Temporary (In-Memory)'}
1564
+ {isPersistent
1565
+ ? t('settings.general.storageStatusEnabled', {
1566
+ type: storage ? 'Custom Storage' : 'iOS NSUserDefaults',
1567
+ })
1568
+ : t('settings.general.storageStatusDisabled')}
1050
1569
  </react_native_1.Text>
1051
1570
  <react_native_1.Text style={{
1052
1571
  fontFamily: AppFonts_1.AppFonts.interRegular,
1053
1572
  fontSize: 10.5,
1054
- color: (0, settingsStore_1.isPersistentStorageAvailable)() ? AppColors_1.AppColors.green800 : AppColors_1.AppColors.amber800,
1573
+ lineHeight: 14,
1574
+ color: isPersistent
1575
+ ? AppColors_1.AppColors.green800
1576
+ : AppColors_1.AppColors.amber800,
1055
1577
  marginTop: 2,
1056
- opacity: 0.8,
1578
+ opacity: 0.85,
1057
1579
  }}>
1058
- {(0, settingsStore_1.isPersistentStorageAvailable)()
1059
- ? 'Your settings are saved across app restarts.'
1060
- : 'Settings reset when closed. To persist settings, pass a storage object to <NetworkInspector storage={...} />.'}
1580
+ {isPersistent
1581
+ ? t('settings.general.storageStatusEnabledDesc')
1582
+ : t('settings.general.storageStatusDisabledDesc')}
1583
+ </react_native_1.Text>
1584
+ </react_native_1.View>
1585
+ </react_native_1.View>
1586
+ </react_native_1.ScrollView>
1587
+
1588
+ {/* Bottom Sticky Action Bar for Save Changes */}
1589
+ {settingsActiveSubTab === 'module' && (<react_native_1.View style={{
1590
+ paddingHorizontal: 16,
1591
+ paddingTop: 12,
1592
+ paddingBottom: react_native_1.Platform.OS === 'ios' ? 26 : 14,
1593
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1594
+ borderTopWidth: 1,
1595
+ borderTopColor: AppColors_1.AppColors.dividerColor,
1596
+ flexDirection: 'row',
1597
+ alignItems: 'center',
1598
+ gap: 12,
1599
+ shadowColor: AppColors_1.AppColors.black,
1600
+ shadowOpacity: 0.08,
1601
+ shadowRadius: 8,
1602
+ shadowOffset: { width: 0, height: -3 },
1603
+ elevation: 8,
1604
+ }}>
1605
+ <react_native_1.View style={{ flex: 1 }}>
1606
+ <react_native_1.Text style={{
1607
+ fontFamily: AppFonts_1.AppFonts.interBold,
1608
+ fontSize: 13,
1609
+ lineHeight: 17,
1610
+ color: AppColors_1.AppColors.primaryBlack,
1611
+ }}>
1612
+ {stagedActiveCount} of {allModules.length} Modules Active
1613
+ </react_native_1.Text>
1614
+ <react_native_1.Text style={{
1615
+ fontFamily: AppFonts_1.AppFonts.interRegular,
1616
+ fontSize: 11,
1617
+ lineHeight: 15,
1618
+ color: hasUnsavedChanges
1619
+ ? AppColors_1.AppColors.purple
1620
+ : AppColors_1.AppColors.grayText,
1621
+ marginTop: 1,
1622
+ }}>
1623
+ {hasUnsavedChanges
1624
+ ? t('settings.unsavedPending')
1625
+ : t('settings.allSynchronized')}
1626
+ </react_native_1.Text>
1627
+ </react_native_1.View>
1628
+
1629
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel="Save Changes" onPress={handleSaveChanges} style={{
1630
+ flexDirection: 'row',
1631
+ alignItems: 'center',
1632
+ gap: 6,
1633
+ backgroundColor: hasUnsavedChanges
1634
+ ? AppColors_1.AppColors.purple
1635
+ : `${AppColors_1.AppColors.purple}22`,
1636
+ paddingHorizontal: 18,
1637
+ paddingVertical: 10,
1638
+ borderRadius: 10,
1639
+ }}>
1640
+ <NetworkIcons_1.CheckIcon size={14} color={hasUnsavedChanges ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple}/>
1641
+ <react_native_1.Text style={{
1642
+ fontFamily: AppFonts_1.AppFonts.interBold,
1643
+ fontSize: 13,
1644
+ lineHeight: 17,
1645
+ color: hasUnsavedChanges ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple,
1646
+ }}>
1647
+ {t('settings.saveChanges')}
1061
1648
  </react_native_1.Text>
1062
- </react_native_1.View>
1063
- </react_native_1.View>
1064
- </react_native_1.ScrollView>
1649
+ </TouchableScale_1.default>
1650
+ </react_native_1.View>)}
1065
1651
  </react_native_1.View>);
1066
1652
  }
1067
1653
  const goBackToMain = () => {
@@ -1069,105 +1655,154 @@ const SettingsPanel = () => {
1069
1655
  setSettingsPage('main');
1070
1656
  };
1071
1657
  // Helper: settings row with icon + label + optional description
1072
- const renderSettingRow = (opts) => (<react_native_1.View style={{
1073
- paddingVertical: 12,
1074
- borderBottomWidth: opts.isLast ? 0 : 1,
1075
- borderBottomColor: AppColors_1.AppColors.dividerColor,
1076
- }}>
1077
- <TouchableScale_1.default disabled={!opts.onPress} onPress={opts.onPress} style={{
1078
- flexDirection: 'row',
1079
- alignItems: 'center',
1080
- gap: 12,
1081
- }}>
1082
- <react_native_1.View style={{
1083
- width: 36,
1084
- height: 36,
1085
- borderRadius: 10,
1086
- backgroundColor: AppColors_1.AppColors.purpleShade50,
1087
- borderWidth: 1,
1088
- borderColor: `${AppColors_1.AppColors.purple}2E`,
1089
- alignItems: 'center',
1090
- justifyContent: 'center',
1091
- }}>
1092
- {opts.icon}
1093
- </react_native_1.View>
1094
- <react_native_1.View style={{ flex: 1 }}>
1095
- <react_native_1.Text style={{
1096
- fontFamily: AppFonts_1.AppFonts.interBold,
1097
- fontSize: 14,
1098
- color: AppColors_1.AppColors.primaryBlack,
1099
- }}>
1100
- {opts.label}
1101
- </react_native_1.Text>
1102
- {opts.description ? (<react_native_1.Text style={{
1103
- fontFamily: AppFonts_1.AppFonts.interRegular,
1104
- fontSize: 11,
1105
- color: AppColors_1.AppColors.grayText,
1106
- marginTop: 1,
1658
+ const renderSettingRow = (opts) => {
1659
+ return (<react_native_1.View style={{
1660
+ paddingVertical: 12,
1661
+ borderBottomWidth: opts.isLast ? 0 : 1,
1662
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
1107
1663
  }}>
1108
- {opts.description}
1109
- </react_native_1.Text>) : null}
1110
- </react_native_1.View>
1111
- {opts.right || null}
1112
- </TouchableScale_1.default>
1113
- {opts.picker && (<react_native_1.View style={{
1664
+ <TouchableScale_1.default disabled={!opts.onPress} onPress={opts.onPress} style={{
1114
1665
  flexDirection: 'row',
1115
- backgroundColor: AppColors_1.AppColors.grayBackground,
1116
- borderRadius: 8,
1117
- padding: 2.5,
1118
- marginTop: 10,
1666
+ alignItems: 'center',
1667
+ gap: 12,
1668
+ }}>
1669
+ <react_native_1.View style={{
1670
+ width: 36,
1671
+ height: 36,
1672
+ borderRadius: 10,
1673
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
1119
1674
  borderWidth: 1,
1120
- borderColor: AppColors_1.AppColors.dividerColor,
1675
+ borderColor: `${AppColors_1.AppColors.purple}2E`,
1676
+ alignItems: 'center',
1677
+ justifyContent: 'center',
1121
1678
  }}>
1122
- {opts.picker.options.map(opt => {
1123
- const isActive = opts.picker.selectedValue === opt;
1124
- return (<TouchableScale_1.default key={String(opt)} onPress={() => opts.picker.onSelect(opt)} style={{
1125
- flex: 1,
1126
- paddingVertical: 6,
1127
- alignItems: 'center',
1128
- borderRadius: 6,
1129
- backgroundColor: isActive
1130
- ? AppColors_1.AppColors.purple
1131
- : 'transparent',
1132
- }}>
1133
- <react_native_1.Text style={{
1134
- fontFamily: AppFonts_1.AppFonts.interBold,
1135
- fontSize: 11,
1136
- color: isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayText,
1679
+ {opts.icon}
1680
+ </react_native_1.View>
1681
+ <react_native_1.View style={{ flex: 1 }}>
1682
+ <react_native_1.Text style={{
1683
+ fontFamily: AppFonts_1.AppFonts.interBold,
1684
+ fontSize: 14,
1685
+ lineHeight: 18,
1686
+ color: AppColors_1.AppColors.primaryBlack,
1687
+ }}>
1688
+ {opts.label}
1689
+ </react_native_1.Text>
1690
+ {opts.description ? (<react_native_1.Text style={{
1691
+ fontFamily: AppFonts_1.AppFonts.interRegular,
1692
+ fontSize: 11,
1693
+ lineHeight: 15,
1694
+ color: AppColors_1.AppColors.grayText,
1695
+ marginTop: 1,
1696
+ }}>
1697
+ {opts.description}
1698
+ </react_native_1.Text>) : null}
1699
+ </react_native_1.View>
1700
+ {opts.right || null}
1701
+ </TouchableScale_1.default>
1702
+ {opts.numericInput && (<react_native_1.View style={{ marginTop: 10, gap: 6 }}>
1703
+ <react_native_1.View style={{
1704
+ flexDirection: 'row',
1705
+ alignItems: 'center',
1706
+ backgroundColor: AppColors_1.AppColors.grayBackground,
1707
+ borderRadius: 8,
1708
+ borderWidth: 1,
1709
+ borderColor: AppColors_1.AppColors.dividerColor,
1710
+ paddingHorizontal: 12,
1711
+ paddingVertical: 4,
1712
+ }}>
1713
+ <react_native_1.TextInput style={{
1714
+ flex: 1,
1715
+ fontFamily: AppFonts_1.AppFonts.interMedium,
1716
+ fontSize: 14,
1717
+ lineHeight: 18,
1718
+ color: AppColors_1.AppColors.primaryBlack,
1719
+ paddingVertical: 6,
1720
+ }} value={String(opts.numericInput.value || '')} onChangeText={text => {
1721
+ const num = parseInt(text.replace(/[^0-9]/g, ''), 10);
1722
+ if (!isNaN(num)) {
1723
+ const clamped = Math.max(opts.numericInput?.min ?? 1, Math.min(opts.numericInput?.max ?? 10000, num));
1724
+ opts.numericInput?.onChange(clamped);
1725
+ }
1726
+ }} keyboardType={opts.numericInput.keyboardType ?? 'number-pad'} placeholder={opts.numericInput.placeholder} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} maxLength={6} selectTextOnFocus/>
1727
+ <react_native_1.Text style={{
1728
+ fontFamily: AppFonts_1.AppFonts.interBold,
1729
+ fontSize: 11,
1730
+ color: AppColors_1.AppColors.purple,
1731
+ marginLeft: 6,
1732
+ }}>
1733
+ MAX
1734
+ </react_native_1.Text>
1735
+ </react_native_1.View>
1736
+ {opts.numericInput.min !== undefined || opts.numericInput.max !== undefined ? (<react_native_1.Text style={{
1737
+ fontFamily: AppFonts_1.AppFonts.interRegular,
1738
+ fontSize: 10,
1739
+ lineHeight: 13,
1740
+ color: AppColors_1.AppColors.grayTextWeak,
1137
1741
  }}>
1138
- {opts.picker.formatLabel
1139
- ? opts.picker.formatLabel(opt)
1140
- : opt}
1141
- </react_native_1.Text>
1142
- </TouchableScale_1.default>);
1143
- })}
1144
- </react_native_1.View>)}
1145
- </react_native_1.View>);
1742
+ Range: {opts.numericInput.min ?? 1} - {opts.numericInput.max ?? '∞'}
1743
+ </react_native_1.Text>) : null}
1744
+ </react_native_1.View>)}
1745
+ {opts.picker && (<react_native_1.View style={{
1746
+ flexDirection: 'row',
1747
+ backgroundColor: AppColors_1.AppColors.grayBackground,
1748
+ borderRadius: 8,
1749
+ padding: 2.5,
1750
+ marginTop: 10,
1751
+ borderWidth: 1,
1752
+ borderColor: AppColors_1.AppColors.dividerColor,
1753
+ }}>
1754
+ {opts.picker.options.map(opt => {
1755
+ const isActive = opts.picker.selectedValue === opt;
1756
+ return (<TouchableScale_1.default key={String(opt)} onPress={() => opts.picker.onSelect(opt)} style={{
1757
+ flex: 1,
1758
+ paddingVertical: 6,
1759
+ alignItems: 'center',
1760
+ borderRadius: 6,
1761
+ backgroundColor: isActive
1762
+ ? AppColors_1.AppColors.purple
1763
+ : 'transparent',
1764
+ }}>
1765
+ <react_native_1.Text style={{
1766
+ fontFamily: AppFonts_1.AppFonts.interBold,
1767
+ fontSize: 11,
1768
+ lineHeight: 14,
1769
+ color: isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayText,
1770
+ }}>
1771
+ {opts.picker.formatLabel
1772
+ ? opts.picker.formatLabel(opt)
1773
+ : opt}
1774
+ </react_native_1.Text>
1775
+ </TouchableScale_1.default>);
1776
+ })}
1777
+ </react_native_1.View>)}
1778
+ </react_native_1.View>);
1779
+ };
1146
1780
  let content = null;
1147
1781
  let title = '';
1148
1782
  let icon = null;
1149
1783
  let rightInfo = '';
1150
1784
  if (settingsPage === 'apis') {
1151
- title = 'APIs Settings';
1785
+ title = t('settings.apis.title');
1152
1786
  icon = <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.white} size={16}/>;
1153
- rightInfo = `Total: ${logs.length}`;
1154
- content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
1787
+ rightInfo = t('settings.apis.total', { count: logs.length });
1788
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
1155
1789
  <react_native_1.View style={{
1156
1790
  backgroundColor: AppColors_1.AppColors.primaryLight,
1157
1791
  padding: 16,
1158
- borderRadius: 12,
1792
+ borderRadius: 14,
1159
1793
  borderWidth: 1,
1160
1794
  borderColor: AppColors_1.AppColors.grayBorderSecondary,
1161
- gap: 4,
1162
1795
  }}>
1163
1796
  {renderSettingRow({
1164
1797
  icon: <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={16}/>,
1165
- label: 'Max Request Logs',
1166
- description: 'How many network requests to keep in memory',
1167
- picker: {
1168
- options: [50, 100, 200, 500],
1169
- selectedValue: maxNetworkLogs,
1170
- onSelect: setMaxNetworkLogs,
1798
+ label: t('settings.apis.maxRequestLogs'),
1799
+ description: t('settings.apis.maxRequestLogsDescription'),
1800
+ numericInput: {
1801
+ value: maxNetworkLogs,
1802
+ onChange: setMaxNetworkLogs,
1803
+ min: 10,
1804
+ max: 5000,
1805
+ placeholder: 'Enter max requests (10-5000)',
1171
1806
  },
1172
1807
  isLast: true,
1173
1808
  })}
@@ -1175,26 +1810,25 @@ const SettingsPanel = () => {
1175
1810
 
1176
1811
  <react_native_1.View style={{
1177
1812
  backgroundColor: AppColors_1.AppColors.primaryLight,
1178
- borderRadius: 12,
1813
+ borderRadius: 14,
1179
1814
  borderWidth: 1,
1180
1815
  borderColor: AppColors_1.AppColors.grayBorderSecondary,
1181
1816
  padding: 16,
1182
- marginTop: 12,
1183
1817
  }}>
1184
1818
  {renderSettingRow({
1185
1819
  icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1186
- label: 'Clear Network Logs',
1187
- description: `${logs.length} requests stored`,
1820
+ label: t('settings.apis.clearNetworkLogs'),
1821
+ description: t('settings.apis.clearNetworkLogsDescription', { count: logs.length }),
1188
1822
  isLast: true,
1189
1823
  onPress: () => {
1190
1824
  (0, networkLogger_1.clearNetworkLogs)();
1191
1825
  setSelected(null);
1192
- react_native_1.Alert.alert('Success', 'Network logs cleared.');
1826
+ react_native_1.Alert.alert(t('common.success'), t('settings.apis.networkLogsCleared'));
1193
1827
  },
1194
1828
  right: (<react_native_1.View style={{
1195
- paddingHorizontal: 10,
1196
- paddingVertical: 5,
1197
- borderRadius: 7,
1829
+ paddingHorizontal: 12,
1830
+ paddingVertical: 6,
1831
+ borderRadius: 8,
1198
1832
  backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
1199
1833
  borderWidth: 1,
1200
1834
  borderColor: `${AppColors_1.AppColors.errorColor}33`,
@@ -1202,9 +1836,10 @@ const SettingsPanel = () => {
1202
1836
  <react_native_1.Text style={{
1203
1837
  fontFamily: AppFonts_1.AppFonts.interBold,
1204
1838
  fontSize: 11,
1839
+ lineHeight: 14,
1205
1840
  color: AppColors_1.AppColors.errorColor,
1206
1841
  }}>
1207
- Clear
1842
+ {t('common.clear')}
1208
1843
  </react_native_1.Text>
1209
1844
  </react_native_1.View>),
1210
1845
  })}
@@ -1212,36 +1847,39 @@ const SettingsPanel = () => {
1212
1847
  </react_native_1.ScrollView>);
1213
1848
  }
1214
1849
  else if (settingsPage === 'logs') {
1215
- title = 'Logs Settings';
1850
+ title = t('settings.logs.title');
1216
1851
  icon = <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.white} size={16}/>;
1217
- rightInfo = `Total: ${consoleLogs.length}`;
1218
- content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
1852
+ rightInfo = t('settings.logs.total', { count: consoleLogs.length });
1853
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
1219
1854
  <react_native_1.View style={{
1220
1855
  backgroundColor: AppColors_1.AppColors.primaryLight,
1221
1856
  padding: 16,
1222
- borderRadius: 12,
1857
+ borderRadius: 14,
1223
1858
  borderWidth: 1,
1224
1859
  borderColor: AppColors_1.AppColors.grayBorderSecondary,
1225
1860
  gap: 4,
1226
1861
  }}>
1227
1862
  {renderSettingRow({
1228
1863
  icon: <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={16}/>,
1229
- label: 'Max Console Logs',
1230
- description: 'How many console messages to retain',
1231
- picker: {
1232
- options: [100, 200, 500, 1000],
1233
- selectedValue: maxConsoleLogs,
1234
- onSelect: setMaxConsoleLogs,
1864
+ label: t('settings.logs.maxConsoleLogs'),
1865
+ description: t('settings.logs.maxConsoleLogsDescription'),
1866
+ numericInput: {
1867
+ value: maxConsoleLogs,
1868
+ onChange: setMaxConsoleLogs,
1869
+ min: 10,
1870
+ max: 10000,
1871
+ placeholder: 'Enter max logs (10-10000)',
1235
1872
  },
1236
1873
  })}
1237
1874
  <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
1238
1875
  <react_native_1.Text style={{
1239
1876
  fontFamily: AppFonts_1.AppFonts.interBold,
1240
1877
  fontSize: 13,
1878
+ lineHeight: 17,
1241
1879
  color: AppColors_1.AppColors.primaryBlack,
1242
- paddingTop: 4,
1880
+ paddingTop: 6,
1243
1881
  }}>
1244
- Log Levels
1882
+ {t('settings.logs.logLevels')}
1245
1883
  </react_native_1.Text>
1246
1884
  {['info', 'warn', 'error'].map(level => {
1247
1885
  const isLvlActive = showConsoleLevels?.[level];
@@ -1250,19 +1888,25 @@ const SettingsPanel = () => {
1250
1888
  : level === 'warn'
1251
1889
  ? AppColors_1.AppColors.warningIconGold
1252
1890
  : AppColors_1.AppColors.skyBlue;
1891
+ const label = level === 'info'
1892
+ ? t('settings.logs.showInfo')
1893
+ : level === 'warn'
1894
+ ? t('settings.logs.showWarn')
1895
+ : t('settings.logs.showError');
1896
+ const desc = level === 'info'
1897
+ ? t('settings.logs.showInfoDesc')
1898
+ : level === 'warn'
1899
+ ? t('settings.logs.showWarnDesc')
1900
+ : t('settings.logs.showErrorDesc');
1253
1901
  return renderSettingRow({
1254
1902
  icon: (<react_native_1.View style={{
1255
- width: 10,
1256
- height: 10,
1257
- borderRadius: 5,
1903
+ width: 12,
1904
+ height: 12,
1905
+ borderRadius: 6,
1258
1906
  backgroundColor: levelColor,
1259
1907
  }}/>),
1260
- label: `Show ${level.charAt(0).toUpperCase() + level.slice(1)} logs`,
1261
- description: level === 'info'
1262
- ? 'Informational messages'
1263
- : level === 'warn'
1264
- ? 'Warning messages'
1265
- : 'Error messages',
1908
+ label,
1909
+ description: desc,
1266
1910
  isLast: level === 'error',
1267
1911
  onPress: () => setShowConsoleLevels(prev => ({
1268
1912
  ...prev,
@@ -1290,25 +1934,24 @@ const SettingsPanel = () => {
1290
1934
 
1291
1935
  <react_native_1.View style={{
1292
1936
  backgroundColor: AppColors_1.AppColors.primaryLight,
1293
- borderRadius: 12,
1937
+ borderRadius: 14,
1294
1938
  borderWidth: 1,
1295
1939
  borderColor: AppColors_1.AppColors.grayBorderSecondary,
1296
1940
  padding: 16,
1297
- marginTop: 12,
1298
1941
  }}>
1299
1942
  {renderSettingRow({
1300
1943
  icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1301
- label: 'Clear Console Logs',
1302
- description: `${consoleLogs.length} logs stored`,
1944
+ label: t('settings.logs.clearConsoleLogs'),
1945
+ description: t('settings.logs.clearConsoleLogsDescription', { count: consoleLogs.length }),
1303
1946
  isLast: true,
1304
1947
  onPress: () => {
1305
1948
  (0, consoleLogger_1.clearConsoleLogs)();
1306
- react_native_1.Alert.alert('Success', 'Console logs cleared.');
1949
+ react_native_1.Alert.alert(t('common.success'), t('settings.logs.consoleLogsCleared'));
1307
1950
  },
1308
1951
  right: (<react_native_1.View style={{
1309
- paddingHorizontal: 10,
1310
- paddingVertical: 5,
1311
- borderRadius: 7,
1952
+ paddingHorizontal: 12,
1953
+ paddingVertical: 6,
1954
+ borderRadius: 8,
1312
1955
  backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
1313
1956
  borderWidth: 1,
1314
1957
  borderColor: `${AppColors_1.AppColors.errorColor}33`,
@@ -1316,9 +1959,10 @@ const SettingsPanel = () => {
1316
1959
  <react_native_1.Text style={{
1317
1960
  fontFamily: AppFonts_1.AppFonts.interBold,
1318
1961
  fontSize: 11,
1962
+ lineHeight: 14,
1319
1963
  color: AppColors_1.AppColors.errorColor,
1320
1964
  }}>
1321
- Clear
1965
+ {t('common.clear')}
1322
1966
  </react_native_1.Text>
1323
1967
  </react_native_1.View>),
1324
1968
  })}
@@ -1326,47 +1970,52 @@ const SettingsPanel = () => {
1326
1970
  </react_native_1.ScrollView>);
1327
1971
  }
1328
1972
  else if (settingsPage === 'analytics') {
1329
- title = 'Analytics Settings';
1973
+ title = t('settings.analytics.title');
1330
1974
  icon = <NetworkIcons_1.AnalyticsIcon color={AppColors_1.AppColors.white} size={16}/>;
1331
- rightInfo = `Events: ${analyticsEvents.length}`;
1332
- content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
1975
+ rightInfo = t('settings.analytics.total', { count: analyticsEvents.length });
1976
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
1333
1977
  <react_native_1.View style={{
1334
1978
  backgroundColor: AppColors_1.AppColors.primaryLight,
1335
1979
  padding: 16,
1336
- borderRadius: 12,
1980
+ borderRadius: 14,
1337
1981
  borderWidth: 1,
1338
1982
  borderColor: AppColors_1.AppColors.grayBorderSecondary,
1339
- gap: 4,
1340
1983
  }}>
1341
1984
  {renderSettingRow({
1342
1985
  icon: <NetworkIcons_1.AnalyticsIcon color={AppColors_1.AppColors.purple} size={16}/>,
1343
- label: 'Events Captured',
1344
- description: `${analyticsEvents.length} analytics events stored`,
1986
+ label: t('settings.analytics.maxAnalyticsEvents'),
1987
+ description: t('settings.analytics.maxAnalyticsEventsDescription', { count: analyticsEvents.length }),
1988
+ numericInput: {
1989
+ value: maxAnalyticsEventsLimit,
1990
+ onChange: setMaxAnalyticsEventsLimit,
1991
+ min: 10,
1992
+ max: 5000,
1993
+ placeholder: 'Enter max events (10-5000)',
1994
+ },
1345
1995
  isLast: true,
1346
1996
  })}
1347
1997
  </react_native_1.View>
1348
1998
  <react_native_1.View style={{
1349
1999
  backgroundColor: AppColors_1.AppColors.primaryLight,
1350
- borderRadius: 12,
2000
+ borderRadius: 14,
1351
2001
  borderWidth: 1,
1352
2002
  borderColor: AppColors_1.AppColors.grayBorderSecondary,
1353
2003
  padding: 16,
1354
- marginTop: 12,
1355
2004
  }}>
1356
2005
  {renderSettingRow({
1357
2006
  icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1358
- label: 'Clear Analytics History',
1359
- description: 'Remove all captured events',
2007
+ label: t('settings.analytics.clearAnalyticsEvents'),
2008
+ description: t('settings.analytics.clearAnalyticsEventsDescription'),
1360
2009
  isLast: true,
1361
2010
  onPress: () => {
1362
2011
  (0, analyticsLogger_1.clearAnalyticsEvents)();
1363
2012
  setSelectedEvent(null);
1364
- react_native_1.Alert.alert('Success', 'Analytics events cleared.');
2013
+ react_native_1.Alert.alert(t('common.success'), t('settings.analytics.analyticsEventsCleared'));
1365
2014
  },
1366
2015
  right: (<react_native_1.View style={{
1367
- paddingHorizontal: 10,
1368
- paddingVertical: 5,
1369
- borderRadius: 7,
2016
+ paddingHorizontal: 12,
2017
+ paddingVertical: 6,
2018
+ borderRadius: 8,
1370
2019
  backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
1371
2020
  borderWidth: 1,
1372
2021
  borderColor: `${AppColors_1.AppColors.errorColor}33`,
@@ -1374,9 +2023,10 @@ const SettingsPanel = () => {
1374
2023
  <react_native_1.Text style={{
1375
2024
  fontFamily: AppFonts_1.AppFonts.interBold,
1376
2025
  fontSize: 11,
2026
+ lineHeight: 14,
1377
2027
  color: AppColors_1.AppColors.errorColor,
1378
2028
  }}>
1379
- Clear
2029
+ {t('common.clear')}
1380
2030
  </react_native_1.Text>
1381
2031
  </react_native_1.View>),
1382
2032
  })}
@@ -1384,22 +2034,22 @@ const SettingsPanel = () => {
1384
2034
  </react_native_1.ScrollView>);
1385
2035
  }
1386
2036
  else if (settingsPage === 'redux') {
1387
- title = 'Redux Settings';
1388
- icon = <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.white} size={16}/>;
1389
- rightInfo = `Reducers: ${Object.keys(reduxState || {}).length}`;
1390
- content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
2037
+ title = t('settings.redux.title');
2038
+ icon = <NetworkIcons_1.ReduxIcon color={AppColors_1.AppColors.white} size={16}/>;
2039
+ rightInfo = t('settings.redux.reducers', { count: Object.keys(reduxState || {}).length });
2040
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
1391
2041
  <react_native_1.View style={{
1392
2042
  backgroundColor: AppColors_1.AppColors.primaryLight,
1393
2043
  padding: 16,
1394
- borderRadius: 12,
2044
+ borderRadius: 14,
1395
2045
  borderWidth: 1,
1396
2046
  borderColor: AppColors_1.AppColors.grayBorderSecondary,
1397
2047
  gap: 4,
1398
2048
  }}>
1399
2049
  {renderSettingRow({
1400
- icon: <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={16}/>,
1401
- label: 'Auto-refresh Store',
1402
- description: 'Automatically capture Redux store state updates',
2050
+ icon: <NetworkIcons_1.ReduxIcon color={AppColors_1.AppColors.purple} size={16}/>,
2051
+ label: t('settings.redux.autoRefresh'),
2052
+ description: t('settings.redux.autoRefreshDescription'),
1403
2053
  onPress: () => setReduxAutoRefreshState(prev => !prev),
1404
2054
  right: (<react_native_1.View style={{
1405
2055
  width: 22,
@@ -1421,8 +2071,8 @@ const SettingsPanel = () => {
1421
2071
  <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
1422
2072
  {renderSettingRow({
1423
2073
  icon: <NetworkIcons_1.LayersIcon color={AppColors_1.AppColors.purple} size={16}/>,
1424
- label: 'Default JSON Expand Depth',
1425
- description: 'Initial depth of Redux state tree to auto-expand',
2074
+ label: t('settings.redux.defaultJsonExpandDepth'),
2075
+ description: t('settings.redux.defaultJsonExpandDepthDescription'),
1426
2076
  picker: {
1427
2077
  options: [1, 2, 3, 5],
1428
2078
  selectedValue: reduxExpandDepth,
@@ -1434,27 +2084,26 @@ const SettingsPanel = () => {
1434
2084
 
1435
2085
  <react_native_1.View style={{
1436
2086
  backgroundColor: AppColors_1.AppColors.primaryLight,
1437
- borderRadius: 12,
2087
+ borderRadius: 14,
1438
2088
  borderWidth: 1,
1439
2089
  borderColor: AppColors_1.AppColors.grayBorderSecondary,
1440
2090
  padding: 16,
1441
- marginTop: 12,
1442
2091
  }}>
1443
2092
  {renderSettingRow({
1444
2093
  icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1445
- label: 'Clear Redux State',
2094
+ label: t('settings.redux.clearReduxState'),
1446
2095
  description: reduxState
1447
- ? 'Reset state snapshot in inspector'
1448
- : 'No store snapshot stored',
2096
+ ? t('settings.redux.clearReduxStateDescription')
2097
+ : t('settings.redux.clearReduxStateEmpty'),
1449
2098
  isLast: true,
1450
2099
  onPress: () => {
1451
2100
  setReduxState(null);
1452
- react_native_1.Alert.alert('Success', 'Redux state snapshot cleared.');
2101
+ react_native_1.Alert.alert(t('common.success'), t('settings.redux.reduxStateCleared'));
1453
2102
  },
1454
2103
  right: (<react_native_1.View style={{
1455
- paddingHorizontal: 10,
1456
- paddingVertical: 5,
1457
- borderRadius: 7,
2104
+ paddingHorizontal: 12,
2105
+ paddingVertical: 6,
2106
+ borderRadius: 8,
1458
2107
  backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
1459
2108
  borderWidth: 1,
1460
2109
  borderColor: `${AppColors_1.AppColors.errorColor}33`,
@@ -1462,9 +2111,10 @@ const SettingsPanel = () => {
1462
2111
  <react_native_1.Text style={{
1463
2112
  fontFamily: AppFonts_1.AppFonts.interBold,
1464
2113
  fontSize: 11,
2114
+ lineHeight: 14,
1465
2115
  color: AppColors_1.AppColors.errorColor,
1466
2116
  }}>
1467
- Clear
2117
+ {t('common.clear')}
1468
2118
  </react_native_1.Text>
1469
2119
  </react_native_1.View>),
1470
2120
  })}
@@ -1472,33 +2122,35 @@ const SettingsPanel = () => {
1472
2122
  </react_native_1.ScrollView>);
1473
2123
  }
1474
2124
  else if (settingsPage === 'crash') {
1475
- title = 'Crash Settings';
2125
+ title = t('settings.crash.title');
1476
2126
  icon = <NetworkIcons_1.CrashIcon color={AppColors_1.AppColors.white} size={16}/>;
1477
2127
  rightInfo = `Total: ${crashRecords?.length || 0}`;
1478
- content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16 }}>
2128
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
1479
2129
  <react_native_1.View style={{
1480
2130
  backgroundColor: AppColors_1.AppColors.primaryLight,
1481
2131
  padding: 16,
1482
- borderRadius: 12,
2132
+ borderRadius: 14,
1483
2133
  borderWidth: 1,
1484
2134
  borderColor: AppColors_1.AppColors.grayBorderSecondary,
1485
2135
  gap: 4,
1486
2136
  }}>
1487
2137
  {renderSettingRow({
1488
2138
  icon: <NetworkIcons_1.LayersIcon color={AppColors_1.AppColors.purple} size={16}/>,
1489
- label: 'Max Crash Logs',
1490
- description: 'How many crash records to preserve in history',
1491
- picker: {
1492
- options: [25, 50, 100, 200],
1493
- selectedValue: maxCrashLogs || 100,
1494
- onSelect: val => setMaxCrashLogs(val),
2139
+ label: t('settings.crash.maxCrashLogs'),
2140
+ description: t('settings.crash.maxCrashLogsDesc'),
2141
+ numericInput: {
2142
+ value: maxCrashLogs,
2143
+ onChange: setMaxCrashLogs,
2144
+ min: 5,
2145
+ max: 500,
2146
+ placeholder: 'Enter max crashes (5-500)',
1495
2147
  },
1496
2148
  })}
1497
2149
  <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
1498
2150
  {renderSettingRow({
1499
2151
  icon: <NetworkIcons_1.ShieldAlertIcon color={AppColors_1.AppColors.greenColor} size={16}/>,
1500
- label: 'Global Crash Guard',
1501
- description: 'Intercepts native, JS, and render errors directly',
2152
+ label: t('settings.crash.globalGuard'),
2153
+ description: t('settings.crash.globalGuardDesc'),
1502
2154
  isLast: true,
1503
2155
  right: (<react_native_1.View style={{
1504
2156
  paddingHorizontal: 8,
@@ -1509,9 +2161,10 @@ const SettingsPanel = () => {
1509
2161
  <react_native_1.Text style={{
1510
2162
  fontFamily: AppFonts_1.AppFonts.interBold,
1511
2163
  fontSize: 10,
2164
+ lineHeight: 13,
1512
2165
  color: AppColors_1.AppColors.greenColor,
1513
2166
  }}>
1514
- PROTECTED
2167
+ {t('settings.protectedBadge')}
1515
2168
  </react_native_1.Text>
1516
2169
  </react_native_1.View>),
1517
2170
  })}
@@ -1519,25 +2172,190 @@ const SettingsPanel = () => {
1519
2172
 
1520
2173
  <react_native_1.View style={{
1521
2174
  backgroundColor: AppColors_1.AppColors.primaryLight,
1522
- borderRadius: 12,
2175
+ borderRadius: 14,
1523
2176
  borderWidth: 1,
1524
2177
  borderColor: AppColors_1.AppColors.grayBorderSecondary,
1525
2178
  padding: 16,
1526
- marginTop: 12,
1527
2179
  }}>
1528
2180
  {renderSettingRow({
1529
2181
  icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
1530
- label: 'Clear Crash History',
1531
- description: `${crashRecords?.length || 0} crash logs stored`,
2182
+ label: t('settings.crash.clearHistory'),
2183
+ description: t('settings.crash.clearHistoryDesc', { count: crashRecords?.length || 0 }),
1532
2184
  isLast: true,
1533
2185
  onPress: () => {
1534
2186
  (0, crashHandler_1.clearCrashRecords)();
1535
- react_native_1.Alert.alert('Success', 'Crash logs cleared.');
2187
+ react_native_1.Alert.alert(t('common.success'), t('settings.crash.historyCleared'));
2188
+ },
2189
+ right: (<react_native_1.View style={{
2190
+ paddingHorizontal: 12,
2191
+ paddingVertical: 6,
2192
+ borderRadius: 8,
2193
+ backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
2194
+ borderWidth: 1,
2195
+ borderColor: `${AppColors_1.AppColors.errorColor}33`,
2196
+ }}>
2197
+ <react_native_1.Text style={{
2198
+ fontFamily: AppFonts_1.AppFonts.interBold,
2199
+ fontSize: 11,
2200
+ lineHeight: 14,
2201
+ color: AppColors_1.AppColors.errorColor,
2202
+ }}>
2203
+ {t('common.clear')}
2204
+ </react_native_1.Text>
2205
+ </react_native_1.View>),
2206
+ })}
2207
+ </react_native_1.View>
2208
+ </react_native_1.ScrollView>);
2209
+ }
2210
+ else if (settingsPage === 'bundle') {
2211
+ title = t('settings.bundle.title');
2212
+ icon = <NetworkIcons_1.PackageIcon color={AppColors_1.AppColors.white} size={16}/>;
2213
+ rightInfo = 'Metro';
2214
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
2215
+ <react_native_1.View style={{
2216
+ backgroundColor: AppColors_1.AppColors.primaryLight,
2217
+ padding: 16,
2218
+ borderRadius: 14,
2219
+ borderWidth: 1,
2220
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
2221
+ gap: 8,
2222
+ }}>
2223
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 10 }}>
2224
+ <react_native_1.View style={{
2225
+ width: 36,
2226
+ height: 36,
2227
+ borderRadius: 10,
2228
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
2229
+ alignItems: 'center',
2230
+ justifyContent: 'center',
2231
+ }}>
2232
+ <NetworkIcons_1.PackageIcon color={AppColors_1.AppColors.purple} size={16}/>
2233
+ </react_native_1.View>
2234
+ <react_native_1.View style={{ flex: 1 }}>
2235
+ <react_native_1.Text style={{
2236
+ fontFamily: AppFonts_1.AppFonts.interBold,
2237
+ fontSize: 14,
2238
+ lineHeight: 18,
2239
+ color: AppColors_1.AppColors.primaryBlack,
2240
+ }}>
2241
+ {t('settings.bundle.sourceBundler')}
2242
+ </react_native_1.Text>
2243
+ <react_native_1.Text style={{
2244
+ fontFamily: AppFonts_1.AppFonts.interRegular,
2245
+ fontSize: 11,
2246
+ lineHeight: 15,
2247
+ color: AppColors_1.AppColors.grayText,
2248
+ marginTop: 1,
2249
+ }}>
2250
+ {t('settings.bundle.sourceBundlerDesc')}
2251
+ </react_native_1.Text>
2252
+ </react_native_1.View>
2253
+ </react_native_1.View>
2254
+ </react_native_1.View>
2255
+
2256
+ <react_native_1.View style={{
2257
+ backgroundColor: AppColors_1.AppColors.primaryLight,
2258
+ borderRadius: 14,
2259
+ borderWidth: 1,
2260
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
2261
+ padding: 16,
2262
+ }}>
2263
+ {renderSettingRow({
2264
+ icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
2265
+ label: t('settings.bundle.clearCache'),
2266
+ description: t('settings.bundle.clearCacheDesc'),
2267
+ isLast: true,
2268
+ onPress: () => {
2269
+ (0, bundleAnalyzer_1.clearCachedBundleAnalysis)();
2270
+ react_native_1.Alert.alert(t('common.success'), t('settings.bundle.cacheCleared'));
2271
+ },
2272
+ right: (<react_native_1.View style={{
2273
+ paddingHorizontal: 12,
2274
+ paddingVertical: 6,
2275
+ borderRadius: 8,
2276
+ backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
2277
+ borderWidth: 1,
2278
+ borderColor: `${AppColors_1.AppColors.errorColor}33`,
2279
+ }}>
2280
+ <react_native_1.Text style={{
2281
+ fontFamily: AppFonts_1.AppFonts.interBold,
2282
+ fontSize: 11,
2283
+ lineHeight: 14,
2284
+ color: AppColors_1.AppColors.errorColor,
2285
+ }}>
2286
+ {t('common.clear')}
2287
+ </react_native_1.Text>
2288
+ </react_native_1.View>),
2289
+ })}
2290
+ </react_native_1.View>
2291
+ </react_native_1.ScrollView>);
2292
+ }
2293
+ else if (settingsPage === 'performance') {
2294
+ title = t('settings.performance.title');
2295
+ icon = <NetworkIcons_1.PerformanceIcon color={AppColors_1.AppColors.white} size={16}/>;
2296
+ rightInfo = '60 FPS Target';
2297
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
2298
+ <react_native_1.View style={{
2299
+ backgroundColor: AppColors_1.AppColors.primaryLight,
2300
+ padding: 16,
2301
+ borderRadius: 14,
2302
+ borderWidth: 1,
2303
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
2304
+ gap: 8,
2305
+ }}>
2306
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 10 }}>
2307
+ <react_native_1.View style={{
2308
+ width: 36,
2309
+ height: 36,
2310
+ borderRadius: 10,
2311
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
2312
+ alignItems: 'center',
2313
+ justifyContent: 'center',
2314
+ }}>
2315
+ <NetworkIcons_1.PerformanceIcon color={AppColors_1.AppColors.purple} size={16}/>
2316
+ </react_native_1.View>
2317
+ <react_native_1.View style={{ flex: 1 }}>
2318
+ <react_native_1.Text style={{
2319
+ fontFamily: AppFonts_1.AppFonts.interBold,
2320
+ fontSize: 14,
2321
+ lineHeight: 18,
2322
+ color: AppColors_1.AppColors.primaryBlack,
2323
+ }}>
2324
+ {t('settings.performance.frameMeasurement')}
2325
+ </react_native_1.Text>
2326
+ <react_native_1.Text style={{
2327
+ fontFamily: AppFonts_1.AppFonts.interRegular,
2328
+ fontSize: 11,
2329
+ lineHeight: 15,
2330
+ color: AppColors_1.AppColors.grayText,
2331
+ marginTop: 1,
2332
+ }}>
2333
+ {t('settings.performance.frameMeasurementDesc')}
2334
+ </react_native_1.Text>
2335
+ </react_native_1.View>
2336
+ </react_native_1.View>
2337
+ </react_native_1.View>
2338
+
2339
+ <react_native_1.View style={{
2340
+ backgroundColor: AppColors_1.AppColors.primaryLight,
2341
+ borderRadius: 14,
2342
+ borderWidth: 1,
2343
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
2344
+ padding: 16,
2345
+ }}>
2346
+ {renderSettingRow({
2347
+ icon: <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={16}/>,
2348
+ label: t('settings.performance.clearEvents'),
2349
+ description: t('settings.performance.clearEventsDesc'),
2350
+ isLast: true,
2351
+ onPress: () => {
2352
+ (0, performanceTracker_1.clearPerformanceEvents)();
2353
+ react_native_1.Alert.alert(t('common.success'), t('settings.performance.eventsCleared'));
1536
2354
  },
1537
2355
  right: (<react_native_1.View style={{
1538
- paddingHorizontal: 10,
1539
- paddingVertical: 5,
1540
- borderRadius: 7,
2356
+ paddingHorizontal: 12,
2357
+ paddingVertical: 6,
2358
+ borderRadius: 8,
1541
2359
  backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
1542
2360
  borderWidth: 1,
1543
2361
  borderColor: `${AppColors_1.AppColors.errorColor}33`,
@@ -1545,29 +2363,33 @@ const SettingsPanel = () => {
1545
2363
  <react_native_1.Text style={{
1546
2364
  fontFamily: AppFonts_1.AppFonts.interBold,
1547
2365
  fontSize: 11,
2366
+ lineHeight: 14,
1548
2367
  color: AppColors_1.AppColors.errorColor,
1549
2368
  }}>
1550
- Clear
2369
+ {t('common.clear')}
1551
2370
  </react_native_1.Text>
1552
2371
  </react_native_1.View>),
1553
2372
  })}
1554
2373
  </react_native_1.View>
1555
2374
  </react_native_1.ScrollView>);
1556
2375
  }
1557
- return (<react_native_1.View style={{ flex: 1, backgroundColor: AppColors_1.AppColors.grayBackground }}>
2376
+ return (<react_native_1.View style={{
2377
+ flex: 1,
2378
+ backgroundColor: AppColors_1.AppColors.grayBackground,
2379
+ }}>
1558
2380
  <react_native_linear_gradient_1.default colors={[AppColors_1.AppColors.purple, AppColors_1.AppColors.brandPurple]} start={{ x: 0, y: 0 }} end={{ x: 1, y: 0 }} style={styles_1.default.headerGradient}>
1559
2381
  <react_native_1.View style={{ paddingTop: headerTopPadding, width: '100%' }}>
1560
2382
  <react_native_1.View style={[styles_1.default.header, { paddingHorizontal: 16, gap: 12 }]}>
1561
- <TouchableScale_1.default onPress={goBackToMain} hitSlop={12} style={{
2383
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={t('settings.back')} onPress={goBackToMain} hitSlop={12} style={{
1562
2384
  padding: 8,
1563
2385
  borderRadius: 10,
1564
2386
  backgroundColor: `${AppColors_1.AppColors.white}26`,
1565
2387
  borderWidth: 1,
1566
2388
  borderColor: `${AppColors_1.AppColors.white}14`,
1567
2389
  }}>
1568
- <NetworkIcons_1.WhiteBackNavigation color={AppColors_1.AppColors.white} size={16}/>
1569
- </TouchableScale_1.default>
1570
- {icon && (<react_native_1.View style={{
2390
+ <NetworkIcons_1.WhiteBackNavigation color={AppColors_1.AppColors.white} size={16}/>
2391
+ </TouchableScale_1.default>
2392
+ {icon && (<react_native_1.View style={{
1571
2393
  width: 30,
1572
2394
  height: 30,
1573
2395
  borderRadius: 8,
@@ -1575,18 +2397,19 @@ const SettingsPanel = () => {
1575
2397
  alignItems: 'center',
1576
2398
  justifyContent: 'center',
1577
2399
  }}>
1578
- {icon}
1579
- </react_native_1.View>)}
1580
- <react_native_1.View style={{ flex: 1 }}>
1581
- <react_native_1.Text style={{
2400
+ {icon}
2401
+ </react_native_1.View>)}
2402
+ <react_native_1.View style={{ flex: 1 }}>
2403
+ <react_native_1.Text style={{
1582
2404
  fontFamily: AppFonts_1.AppFonts.interBold,
1583
2405
  fontSize: 17,
2406
+ lineHeight: 22,
1584
2407
  color: AppColors_1.AppColors.white,
1585
2408
  }}>
1586
- {title}
1587
- </react_native_1.Text>
1588
- </react_native_1.View>
1589
- {rightInfo ? (<react_native_1.View style={{
2409
+ {title}
2410
+ </react_native_1.Text>
2411
+ </react_native_1.View>
2412
+ {rightInfo ? (<react_native_1.View style={{
1590
2413
  backgroundColor: `${AppColors_1.AppColors.white}26`,
1591
2414
  paddingHorizontal: 8,
1592
2415
  paddingVertical: 4,
@@ -1594,17 +2417,18 @@ const SettingsPanel = () => {
1594
2417
  borderWidth: 1,
1595
2418
  borderColor: `${AppColors_1.AppColors.white}1A`,
1596
2419
  }}>
1597
- <react_native_1.Text style={{
2420
+ <react_native_1.Text style={{
1598
2421
  fontFamily: AppFonts_1.AppFonts.interBold,
1599
2422
  fontSize: 11,
2423
+ lineHeight: 14,
1600
2424
  color: AppColors_1.AppColors.white,
1601
2425
  }}>
1602
- {rightInfo}
1603
- </react_native_1.Text>
1604
- </react_native_1.View>) : null}
2426
+ {rightInfo}
2427
+ </react_native_1.Text>
2428
+ </react_native_1.View>) : null}
2429
+ </react_native_1.View>
1605
2430
  </react_native_1.View>
1606
- </react_native_1.View>
1607
- </react_native_linear_gradient_1.default>
2431
+ </react_native_linear_gradient_1.default>
1608
2432
  {content}
1609
2433
  </react_native_1.View>);
1610
2434
  };