react-native-inapp-inspector 1.1.35 → 2.0.1

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 (104) 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 +890 -0
  4. package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.kt +17 -0
  5. package/dist/commonjs/components/ConsoleLogCard.js +5 -5
  6. package/dist/commonjs/components/CopyButton.js +3 -0
  7. package/dist/commonjs/components/EndOfListFooter.js +1 -1
  8. package/dist/commonjs/components/ErrorBoundary.js +3 -0
  9. package/dist/commonjs/components/Inspector/AnalyticsTab.js +25 -73
  10. package/dist/commonjs/components/Inspector/BundleTab.js +671 -189
  11. package/dist/commonjs/components/Inspector/ConsoleTab.js +110 -99
  12. package/dist/commonjs/components/Inspector/CrashTab.js +99 -91
  13. package/dist/commonjs/components/Inspector/InspectorHeader.js +107 -20
  14. package/dist/commonjs/components/Inspector/MainScreen.js +111 -68
  15. package/dist/commonjs/components/Inspector/NetworkTab.js +151 -30
  16. package/dist/commonjs/components/Inspector/PerformanceTab.js +96 -3
  17. package/dist/commonjs/components/Inspector/ReduxTab.js +18 -10
  18. package/dist/commonjs/components/Inspector/SettingsPanel.js +1218 -1238
  19. package/dist/commonjs/components/Inspector/TabBar.js +4 -2
  20. package/dist/commonjs/components/JsonViewer.js +9 -4
  21. package/dist/commonjs/components/LogCard.js +31 -1
  22. package/dist/commonjs/components/LogSyntaxHighlighter.d.ts +16 -0
  23. package/dist/commonjs/components/LogSyntaxHighlighter.js +130 -0
  24. package/dist/commonjs/components/NetworkIcons.d.ts +3 -0
  25. package/dist/commonjs/components/NetworkIcons.js +15 -1
  26. package/dist/commonjs/components/Slider.d.ts +13 -0
  27. package/dist/commonjs/components/Slider.js +261 -0
  28. package/dist/commonjs/components/TouchableScale.d.ts +1 -0
  29. package/dist/commonjs/components/TouchableScale.js +30 -32
  30. package/dist/commonjs/constants/index.d.ts +1 -2
  31. package/dist/commonjs/constants/index.js +4 -0
  32. package/dist/commonjs/constants/version.d.ts +1 -1
  33. package/dist/commonjs/constants/version.js +1 -1
  34. package/dist/commonjs/customHooks/analyticsLogger.d.ts +4 -0
  35. package/dist/commonjs/customHooks/analyticsLogger.js +8 -6
  36. package/dist/commonjs/customHooks/crashHandler.js +8 -1
  37. package/dist/commonjs/helpers/index.d.ts +1 -0
  38. package/dist/commonjs/helpers/index.js +25 -1
  39. package/dist/commonjs/helpers/searchQueryParser.d.ts +6 -0
  40. package/dist/commonjs/helpers/searchQueryParser.js +236 -0
  41. package/dist/commonjs/helpers/settingsStore.d.ts +9 -0
  42. package/dist/commonjs/helpers/settingsStore.js +59 -3
  43. package/dist/commonjs/index.d.ts +1 -0
  44. package/dist/commonjs/index.js +220 -43
  45. package/dist/commonjs/native/NativeInspector.d.ts +125 -0
  46. package/dist/commonjs/native/NativeInspector.js +313 -0
  47. package/dist/commonjs/native/NativeNetworkInspector.d.ts +22 -0
  48. package/dist/commonjs/native/NativeNetworkInspector.js +4 -0
  49. package/dist/commonjs/styles/index.js +41 -41
  50. package/dist/commonjs/types/enums.d.ts +1 -1
  51. package/dist/commonjs/types/interfaces.d.ts +9 -0
  52. package/dist/esm/components/ConsoleLogCard.js +5 -5
  53. package/dist/esm/components/CopyButton.js +3 -0
  54. package/dist/esm/components/EndOfListFooter.js +2 -2
  55. package/dist/esm/components/ErrorBoundary.js +3 -0
  56. package/dist/esm/components/Inspector/AnalyticsTab.js +27 -75
  57. package/dist/esm/components/Inspector/BundleTab.js +671 -189
  58. package/dist/esm/components/Inspector/ConsoleTab.js +111 -100
  59. package/dist/esm/components/Inspector/CrashTab.js +99 -91
  60. package/dist/esm/components/Inspector/InspectorHeader.js +108 -21
  61. package/dist/esm/components/Inspector/MainScreen.js +113 -70
  62. package/dist/esm/components/Inspector/NetworkTab.js +152 -31
  63. package/dist/esm/components/Inspector/PerformanceTab.js +96 -3
  64. package/dist/esm/components/Inspector/ReduxTab.js +18 -10
  65. package/dist/esm/components/Inspector/SettingsPanel.js +1222 -1242
  66. package/dist/esm/components/Inspector/TabBar.js +4 -2
  67. package/dist/esm/components/JsonViewer.js +9 -4
  68. package/dist/esm/components/LogCard.js +32 -2
  69. package/dist/esm/components/LogSyntaxHighlighter.d.ts +16 -0
  70. package/dist/esm/components/LogSyntaxHighlighter.js +123 -0
  71. package/dist/esm/components/NetworkIcons.d.ts +3 -0
  72. package/dist/esm/components/NetworkIcons.js +11 -0
  73. package/dist/esm/components/Slider.d.ts +13 -0
  74. package/dist/esm/components/Slider.js +222 -0
  75. package/dist/esm/components/TouchableScale.d.ts +1 -0
  76. package/dist/esm/components/TouchableScale.js +31 -33
  77. package/dist/esm/constants/index.d.ts +1 -2
  78. package/dist/esm/constants/index.js +4 -0
  79. package/dist/esm/constants/version.d.ts +1 -1
  80. package/dist/esm/constants/version.js +1 -1
  81. package/dist/esm/customHooks/analyticsLogger.d.ts +4 -0
  82. package/dist/esm/customHooks/analyticsLogger.js +6 -5
  83. package/dist/esm/customHooks/crashHandler.js +8 -1
  84. package/dist/esm/helpers/index.d.ts +1 -0
  85. package/dist/esm/helpers/index.js +11 -1
  86. package/dist/esm/helpers/searchQueryParser.d.ts +6 -0
  87. package/dist/esm/helpers/searchQueryParser.js +233 -0
  88. package/dist/esm/helpers/settingsStore.d.ts +9 -0
  89. package/dist/esm/helpers/settingsStore.js +58 -3
  90. package/dist/esm/index.d.ts +1 -0
  91. package/dist/esm/index.js +207 -44
  92. package/dist/esm/native/NativeInspector.d.ts +125 -0
  93. package/dist/esm/native/NativeInspector.js +289 -0
  94. package/dist/esm/native/NativeNetworkInspector.d.ts +22 -0
  95. package/dist/esm/native/NativeNetworkInspector.js +2 -0
  96. package/dist/esm/styles/index.js +41 -41
  97. package/dist/esm/types/enums.d.ts +1 -1
  98. package/dist/esm/types/interfaces.d.ts +9 -0
  99. package/ios/NetworkInspectorModule.h +6 -0
  100. package/ios/NetworkInspectorModule.m +760 -5
  101. package/package.json +13 -2
  102. package/react-native-inapp-inspector.podspec +7 -2
  103. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.java +0 -97
  104. package/android/src/main/java/com/inappinspector/NetworkInspectorPackage.java +0 -28
@@ -39,13 +39,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
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
- const react_native_linear_gradient_1 = __importDefault(require("react-native-linear-gradient"));
43
42
  const InspectorContext_1 = require("./InspectorContext");
44
43
  const TouchableScale_1 = __importDefault(require("../TouchableScale"));
45
- const styles_1 = __importStar(require("../../styles"));
44
+ const Slider_1 = __importDefault(require("../Slider"));
45
+ const styles_1 = require("../../styles");
46
46
  const AppColors_1 = require("../../styles/AppColors");
47
47
  const AppFonts_1 = require("../../styles/AppFonts");
48
- const constants_1 = require("../../constants");
49
48
  const settingsStore_1 = require("../../helpers/settingsStore");
50
49
  const networkLogger_1 = require("../../customHooks/networkLogger");
51
50
  const consoleLogger_1 = require("../../customHooks/consoleLogger");
@@ -59,7 +58,12 @@ const i18n_1 = require("../../i18n");
59
58
  const NetworkIcons_1 = require("../NetworkIcons");
60
59
  const SettingsPanel = () => {
61
60
  const { t } = (0, i18n_1.useTranslation)();
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, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, crashRecords, maxCrashLogs, setMaxCrashLogs, } = (0, InspectorContext_1.useInspector)();
61
+ 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)();
62
+ const [stagedHeight, setStagedHeight] = (0, react_1.useState)(modalHeightPercent);
63
+ (0, react_1.useEffect)(() => {
64
+ setStagedHeight(modalHeightPercent);
65
+ }, [modalHeightPercent]);
66
+ const autoRamProfile = (0, settingsStore_1.calculateRamBasedLimits)(deviceFreeRamMb);
63
67
  const isPersistent = (0, settingsStore_1.isPersistentStorageAvailable)();
64
68
  // Safe Area & Status Bar Padding for All Device Form Factors
65
69
  const statusBarHeight = react_native_1.Platform.OS === 'android' ? react_native_1.StatusBar.currentHeight || 24 : 44;
@@ -155,1387 +159,1268 @@ const SettingsPanel = () => {
155
159
  });
156
160
  react_native_1.Alert.alert(t('settings.settingsSaved'), t('settings.settingsSavedDesc'));
157
161
  };
158
- if (settingsPage === 'main') {
162
+ const [isDefaultTabDropdownOpen, setIsDefaultTabDropdownOpen] = (0, react_1.useState)(false);
163
+ const goBackToMain = () => {
164
+ (0, InspectorContext_1.animateNextLayout)();
165
+ setSettingsPage('main');
166
+ };
167
+ // Helper: settings row with icon + label + optional description
168
+ const renderSettingRow = (opts) => {
159
169
  return (<react_native_1.View style={{
160
- flex: 1,
161
- backgroundColor: AppColors_1.AppColors.grayBackground,
170
+ paddingVertical: 12,
171
+ borderBottomWidth: opts.isLast ? 0 : 1,
172
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
162
173
  }}>
163
- {/* Modern Floating Gradient Header */}
164
- <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}>
165
- <react_native_1.View style={{ paddingTop: headerTopPadding, width: '100%' }}>
166
- <react_native_1.View style={[
167
- styles_1.default.header,
168
- { paddingHorizontal: 16, paddingVertical: 12, gap: 12 },
169
- ]}>
170
- <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={t('settings.back')} onPress={() => {
171
- (0, InspectorContext_1.animateNextLayout)();
172
- setSettingsPage(null);
173
- switchActiveTab('apis');
174
- }} hitSlop={12} style={{
175
- padding: 8,
176
- borderRadius: 10,
177
- backgroundColor: `${AppColors_1.AppColors.white}26`,
178
- borderWidth: 1,
179
- borderColor: `${AppColors_1.AppColors.white}18`,
180
- }}>
181
- <NetworkIcons_1.WhiteBackNavigation color={AppColors_1.AppColors.white} size={16}/>
182
- </TouchableScale_1.default>
183
-
184
- <react_native_1.View style={{ flex: 1 }}>
185
- <react_native_1.View style={{
174
+ <TouchableScale_1.default disabled={!opts.onPress} onPress={opts.onPress} style={{
186
175
  flexDirection: 'row',
187
176
  alignItems: 'center',
188
- gap: 8,
189
- }}>
190
- <react_native_1.Text style={{
191
- fontFamily: AppFonts_1.AppFonts.interBold,
192
- fontSize: 17,
193
- color: AppColors_1.AppColors.white,
194
- letterSpacing: -0.3,
195
- lineHeight: 22,
196
- }}>
197
- {t('settings.mainTitle')}
198
- </react_native_1.Text>
199
- <react_native_1.View style={{
200
- backgroundColor: `${AppColors_1.AppColors.white}26`,
201
- paddingHorizontal: 7,
202
- paddingVertical: 2,
203
- borderRadius: 12,
204
- }}>
205
- <react_native_1.Text style={{
206
- fontFamily: AppFonts_1.AppFonts.interBold,
207
- fontSize: 10,
208
- color: AppColors_1.AppColors.white,
209
- lineHeight: 13,
210
- }}>
211
- {stagedActiveCount}/{allModules.length} Active
212
- </react_native_1.Text>
213
- </react_native_1.View>
214
- </react_native_1.View>
215
- <react_native_1.Text style={{
216
- fontFamily: AppFonts_1.AppFonts.interRegular,
217
- fontSize: 11,
218
- color: `${AppColors_1.AppColors.white}CC`,
219
- marginTop: 2,
220
- lineHeight: 15,
177
+ gap: 12,
221
178
  }}>
222
- {t('settings.mainSubtitle')}
223
- </react_native_1.Text>
224
- </react_native_1.View>
225
-
226
- <react_native_1.View style={{
227
- backgroundColor: `${AppColors_1.AppColors.white}22`,
228
- paddingHorizontal: 8,
229
- paddingVertical: 4,
230
- borderRadius: 8,
179
+ <react_native_1.View style={{
180
+ width: 36,
181
+ height: 36,
182
+ borderRadius: 10,
183
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
231
184
  borderWidth: 1,
232
- borderColor: `${AppColors_1.AppColors.white}1A`,
185
+ borderColor: `${AppColors_1.AppColors.purple}2E`,
186
+ alignItems: 'center',
187
+ justifyContent: 'center',
233
188
  }}>
234
- <react_native_1.Text style={{
189
+ {opts.icon}
190
+ </react_native_1.View>
191
+ <react_native_1.View style={{ flex: 1 }}>
192
+ <react_native_1.Text style={{
235
193
  fontFamily: AppFonts_1.AppFonts.interBold,
236
- fontSize: 10.5,
237
- color: AppColors_1.AppColors.white,
238
- lineHeight: 14,
194
+ fontSize: 14,
195
+ lineHeight: 18,
196
+ color: AppColors_1.AppColors.primaryBlack,
239
197
  }}>
240
- v{constants_1.LIB_VERSION}
241
- </react_native_1.Text>
242
- </react_native_1.View>
243
- </react_native_1.View>
198
+ {opts.label}
199
+ </react_native_1.Text>
200
+ {opts.description ? (<react_native_1.Text style={{
201
+ fontFamily: AppFonts_1.AppFonts.interRegular,
202
+ fontSize: 11,
203
+ lineHeight: 15,
204
+ color: AppColors_1.AppColors.grayText,
205
+ marginTop: 1,
206
+ }}>
207
+ {opts.description}
208
+ </react_native_1.Text>) : null}
244
209
  </react_native_1.View>
245
- </react_native_linear_gradient_1.default>
246
-
247
- <react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 14 }} showsVerticalScrollIndicator={false}>
210
+ {opts.right || null}
211
+ </TouchableScale_1.default>
212
+ {opts.numericInput && (<react_native_1.View style={{ marginTop: 10, gap: 6 }}>
213
+ <react_native_1.View style={{
214
+ flexDirection: 'row',
215
+ alignItems: 'center',
216
+ backgroundColor: AppColors_1.AppColors.grayBackground,
217
+ borderRadius: 8,
218
+ borderWidth: 1,
219
+ borderColor: AppColors_1.AppColors.dividerColor,
220
+ paddingHorizontal: 12,
221
+ paddingVertical: 4,
222
+ }}>
223
+ <react_native_1.TextInput style={{
224
+ flex: 1,
225
+ fontFamily: AppFonts_1.AppFonts.interMedium,
226
+ fontSize: 14,
227
+ lineHeight: 18,
228
+ color: AppColors_1.AppColors.primaryBlack,
229
+ paddingVertical: 6,
230
+ }} value={String(opts.numericInput.value || '')} onChangeText={text => {
231
+ const num = parseInt(text.replace(/[^0-9]/g, ''), 10);
232
+ if (!isNaN(num)) {
233
+ const clamped = Math.max(opts.numericInput?.min ?? 1, Math.min(opts.numericInput?.max ?? 10000, num));
234
+ opts.numericInput?.onChange(clamped);
235
+ }
236
+ }} keyboardType={opts.numericInput.keyboardType ?? 'number-pad'} placeholder={opts.numericInput.placeholder} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} maxLength={6} selectTextOnFocus/>
237
+ <react_native_1.Text style={{
238
+ fontFamily: AppFonts_1.AppFonts.interBold,
239
+ fontSize: 11,
240
+ color: AppColors_1.AppColors.purple,
241
+ marginLeft: 6,
242
+ }}>
243
+ MAX
244
+ </react_native_1.Text>
245
+ </react_native_1.View>
246
+ {opts.numericInput.min !== undefined || opts.numericInput.max !== undefined ? (<react_native_1.Text style={{
247
+ fontFamily: AppFonts_1.AppFonts.interRegular,
248
+ fontSize: 10,
249
+ lineHeight: 13,
250
+ color: AppColors_1.AppColors.grayTextWeak,
251
+ }}>
252
+ Range: {opts.numericInput.min ?? 1} - {opts.numericInput.max ?? '∞'}
253
+ </react_native_1.Text>) : null}
254
+ </react_native_1.View>)}
255
+ {opts.picker && (<react_native_1.View style={{
256
+ flexDirection: 'row',
257
+ backgroundColor: AppColors_1.AppColors.grayBackground,
258
+ borderRadius: 8,
259
+ padding: 2.5,
260
+ marginTop: 10,
261
+ borderWidth: 1,
262
+ borderColor: AppColors_1.AppColors.dividerColor,
263
+ }}>
264
+ {opts.picker.options.map(opt => {
265
+ const isActive = opts.picker.selectedValue === opt;
266
+ return (<TouchableScale_1.default key={String(opt)} onPress={() => opts.picker.onSelect(opt)} style={{
267
+ flex: 1,
268
+ paddingVertical: 6,
269
+ alignItems: 'center',
270
+ borderRadius: 6,
271
+ backgroundColor: isActive
272
+ ? AppColors_1.AppColors.purple
273
+ : 'transparent',
274
+ }}>
275
+ <react_native_1.Text style={{
276
+ fontFamily: AppFonts_1.AppFonts.interBold,
277
+ fontSize: 11,
278
+ lineHeight: 14,
279
+ color: isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayText,
280
+ }}>
281
+ {opts.picker.formatLabel
282
+ ? opts.picker.formatLabel(opt)
283
+ : opt}
284
+ </react_native_1.Text>
285
+ </TouchableScale_1.default>);
286
+ })}
287
+ </react_native_1.View>)}
288
+ </react_native_1.View>);
289
+ };
290
+ const renderMainSettingsContent = () => (<react_native_1.View style={{
291
+ flex: 1,
292
+ backgroundColor: AppColors_1.AppColors.grayBackground,
293
+ }}>
294
+ <react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 14 }} showsVerticalScrollIndicator={false}>
248
295
  {/* Segmented Top Navigation Sub-Tabs */}
249
296
  <react_native_1.View style={{
250
- flexDirection: 'row',
251
- backgroundColor: AppColors_1.AppColors.primaryLight,
252
- borderRadius: 12,
253
- padding: 4,
254
- borderWidth: 1,
255
- borderColor: AppColors_1.AppColors.grayBorderSecondary,
256
- shadowColor: AppColors_1.AppColors.black,
257
- shadowOpacity: 0.04,
258
- shadowRadius: 4,
259
- shadowOffset: { width: 0, height: 2 },
260
- }}>
297
+ flexDirection: 'row',
298
+ backgroundColor: AppColors_1.AppColors.primaryLight,
299
+ borderRadius: 12,
300
+ padding: 4,
301
+ borderWidth: 1,
302
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
303
+ shadowColor: AppColors_1.AppColors.black,
304
+ shadowOpacity: 0.04,
305
+ shadowRadius: 4,
306
+ shadowOffset: { width: 0, height: 2 },
307
+ }}>
261
308
  <TouchableScale_1.default accessible={true} accessibilityRole="tab" accessibilityLabel={t('settings.modulesAndTools')} accessibilityState={{ selected: settingsActiveSubTab === 'module' }} onPress={() => {
262
- (0, InspectorContext_1.animateNextLayout)();
263
- setSettingsActiveSubTab('module');
264
- }} style={{
265
- flex: 1,
266
- paddingVertical: 9,
267
- flexDirection: 'row',
268
- alignItems: 'center',
269
- justifyContent: 'center',
270
- gap: 6,
271
- borderRadius: 9,
272
- backgroundColor: settingsActiveSubTab === 'module'
273
- ? AppColors_1.AppColors.purple
274
- : 'transparent',
275
- }}>
309
+ (0, InspectorContext_1.animateNextLayout)();
310
+ setSettingsActiveSubTab('module');
311
+ }} style={{
312
+ flex: 1,
313
+ paddingVertical: 9,
314
+ flexDirection: 'row',
315
+ alignItems: 'center',
316
+ justifyContent: 'center',
317
+ gap: 6,
318
+ borderRadius: 9,
319
+ backgroundColor: settingsActiveSubTab === 'module'
320
+ ? AppColors_1.AppColors.purple
321
+ : 'transparent',
322
+ }}>
276
323
  <NetworkIcons_1.LayersIcon color={settingsActiveSubTab === 'module'
277
- ? AppColors_1.AppColors.white
278
- : AppColors_1.AppColors.grayText} size={13}/>
324
+ ? AppColors_1.AppColors.white
325
+ : AppColors_1.AppColors.grayText} size={13}/>
279
326
  <react_native_1.Text style={{
280
- fontFamily: AppFonts_1.AppFonts.interBold,
281
- fontSize: 12.5,
282
- lineHeight: 16,
283
- color: settingsActiveSubTab === 'module'
284
- ? AppColors_1.AppColors.white
285
- : AppColors_1.AppColors.grayText,
286
- }}>
327
+ fontFamily: AppFonts_1.AppFonts.interBold,
328
+ fontSize: 12.5,
329
+ lineHeight: 16,
330
+ color: settingsActiveSubTab === 'module'
331
+ ? AppColors_1.AppColors.white
332
+ : AppColors_1.AppColors.grayText,
333
+ }}>
287
334
  {t('settings.modulesAndTools')}
288
335
  </react_native_1.Text>
289
336
  </TouchableScale_1.default>
290
337
 
291
338
  <TouchableScale_1.default accessible={true} accessibilityRole="tab" accessibilityLabel={t('settings.uiPreferences')} accessibilityState={{ selected: settingsActiveSubTab === 'ui' }} onPress={() => {
292
- (0, InspectorContext_1.animateNextLayout)();
293
- setSettingsActiveSubTab('ui');
294
- }} style={{
295
- flex: 1,
296
- paddingVertical: 9,
297
- flexDirection: 'row',
298
- alignItems: 'center',
299
- justifyContent: 'center',
300
- gap: 6,
301
- borderRadius: 9,
302
- backgroundColor: settingsActiveSubTab === 'ui'
303
- ? AppColors_1.AppColors.purple
304
- : 'transparent',
305
- }}>
339
+ (0, InspectorContext_1.animateNextLayout)();
340
+ setSettingsActiveSubTab('ui');
341
+ }} style={{
342
+ flex: 1,
343
+ paddingVertical: 9,
344
+ flexDirection: 'row',
345
+ alignItems: 'center',
346
+ justifyContent: 'center',
347
+ gap: 6,
348
+ borderRadius: 9,
349
+ backgroundColor: settingsActiveSubTab === 'ui'
350
+ ? AppColors_1.AppColors.purple
351
+ : 'transparent',
352
+ }}>
306
353
  <NetworkIcons_1.ScreenIcon color={settingsActiveSubTab === 'ui'
307
- ? AppColors_1.AppColors.white
308
- : AppColors_1.AppColors.grayText} size={13}/>
354
+ ? AppColors_1.AppColors.white
355
+ : AppColors_1.AppColors.grayText} size={13}/>
309
356
  <react_native_1.Text style={{
310
- fontFamily: AppFonts_1.AppFonts.interBold,
311
- fontSize: 12.5,
312
- lineHeight: 16,
313
- color: settingsActiveSubTab === 'ui'
314
- ? AppColors_1.AppColors.white
315
- : AppColors_1.AppColors.grayText,
316
- }}>
357
+ fontFamily: AppFonts_1.AppFonts.interBold,
358
+ fontSize: 12.5,
359
+ lineHeight: 16,
360
+ color: settingsActiveSubTab === 'ui'
361
+ ? AppColors_1.AppColors.white
362
+ : AppColors_1.AppColors.grayText,
363
+ }}>
317
364
  {t('settings.uiPreferences')}
318
365
  </react_native_1.Text>
319
366
  </TouchableScale_1.default>
320
367
  </react_native_1.View>
321
368
 
322
369
  {settingsActiveSubTab === 'module' ? (<react_native_1.View style={{ gap: 12 }}>
323
- {/* Performance Advisory Banner */}
324
- <react_native_1.View style={{
325
- backgroundColor: `${AppColors_1.AppColors.purple}0A`,
326
- borderRadius: 12,
327
- padding: 12,
328
- borderWidth: 1,
329
- borderColor: `${AppColors_1.AppColors.purple}20`,
330
- flexDirection: 'row',
331
- alignItems: 'center',
332
- gap: 10,
333
- }}>
334
- <react_native_1.View style={{
335
- width: 32,
336
- height: 32,
337
- borderRadius: 8,
338
- backgroundColor: `${AppColors_1.AppColors.purple}14`,
339
- alignItems: 'center',
340
- justifyContent: 'center',
341
- }}>
342
- <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={15}/>
343
- </react_native_1.View>
344
- <react_native_1.View style={{ flex: 1 }}>
345
- <react_native_1.Text style={{
346
- fontFamily: AppFonts_1.AppFonts.interBold,
347
- fontSize: 12,
348
- color: AppColors_1.AppColors.primaryBlack,
349
- lineHeight: 16,
350
- }}>
351
- {t('settings.zeroOverheadTitle')}
352
- </react_native_1.Text>
353
- <react_native_1.Text style={{
354
- fontFamily: AppFonts_1.AppFonts.interRegular,
355
- fontSize: 10.5,
356
- color: AppColors_1.AppColors.grayText,
357
- marginTop: 2,
358
- lineHeight: 14,
359
- }}>
360
- {t('settings.zeroOverheadDesc')}
361
- </react_native_1.Text>
362
- </react_native_1.View>
363
- </react_native_1.View>
364
-
365
- {/* Enhanced Individual Module Cards with Decorative Checkboxes */}
370
+ {/* Individual Module Cards with Left Checkboxes */}
366
371
  <react_native_1.View style={{ gap: 10 }}>
367
372
  {allModules.map(moduleItem => {
368
- const isReduxAvail = (0, reduxLogger_1.isReduxConnected)();
369
- const isAnalyticsAvail = (0, analyticsLogger_2.isAnalyticsConnected)();
370
- const isUnavailable = (moduleItem.key === 'redux' && !isReduxAvail) ||
371
- (moduleItem.key === 'analytics' && !isAnalyticsAvail);
372
- const isLocked = moduleItem.key === 'apis' || isUnavailable;
373
- const isChecked = moduleItem.key === 'apis' ||
374
- (Boolean(stagedTabVisibility?.[moduleItem.key]) &&
375
- !isUnavailable);
376
- const liveStats = moduleItem.key === 'apis'
377
- ? `${logs.length} requests • Limit: ${maxNetworkLogs}`
378
- : moduleItem.key === 'logs'
379
- ? `${consoleLogs.length} logs • Limit: ${maxConsoleLogs}`
380
- : moduleItem.key === 'performance'
381
- ? '60 FPS Target • Memory Telemetry'
382
- : moduleItem.key === 'bundle'
383
- ? 'Metro Packager • Dependency Map'
384
- : moduleItem.key === 'crash'
385
- ? `${crashRecords?.length || 0} crashes recorded • Crash Guard`
386
- : moduleItem.key === 'analytics'
387
- ? `${analyticsEvents.length} events logged`
388
- : moduleItem.key === 'redux'
389
- ? `${Object.keys(reduxState || {}).length} slices • Depth: ${reduxExpandDepth}`
390
- : '';
391
- return (<react_native_1.View key={moduleItem.key} style={{
392
- backgroundColor: AppColors_1.AppColors.primaryLight,
393
- borderRadius: 14,
394
- borderWidth: 1.5,
395
- borderColor: isChecked
396
- ? `${AppColors_1.AppColors.purple}38`
397
- : AppColors_1.AppColors.grayBorderSecondary,
398
- padding: 14,
399
- gap: 10,
400
- shadowColor: AppColors_1.AppColors.black,
401
- shadowOpacity: isChecked ? 0.04 : 0.02,
402
- shadowRadius: 5,
403
- shadowOffset: { width: 0, height: 2 },
404
- }}>
405
- {/* Top Row: Icon + Title & Badges + Checkbox */}
373
+ const isReduxAvail = (0, reduxLogger_1.isReduxConnected)();
374
+ const isAnalyticsAvail = (0, analyticsLogger_2.isAnalyticsConnected)();
375
+ const isUnavailable = (moduleItem.key === 'redux' && !isReduxAvail) ||
376
+ (moduleItem.key === 'analytics' && !isAnalyticsAvail);
377
+ const isLocked = moduleItem.key === 'apis' || isUnavailable;
378
+ const isChecked = moduleItem.key === 'apis' ||
379
+ (Boolean(stagedTabVisibility?.[moduleItem.key]) &&
380
+ !isUnavailable);
381
+ const liveStats = moduleItem.key === 'apis'
382
+ ? `${logs.length} requests • Limit: ${maxNetworkLogs}`
383
+ : moduleItem.key === 'logs'
384
+ ? `${consoleLogs.length} logs • Limit: ${maxConsoleLogs}`
385
+ : moduleItem.key === 'performance'
386
+ ? '60 FPS Target • Memory Telemetry'
387
+ : moduleItem.key === 'bundle'
388
+ ? 'Metro Packager • Dependency Map'
389
+ : moduleItem.key === 'crash'
390
+ ? `${crashRecords?.length || 0} crashes recorded • Crash Guard`
391
+ : moduleItem.key === 'analytics'
392
+ ? `${analyticsEvents.length} events logged`
393
+ : moduleItem.key === 'redux'
394
+ ? `${Object.keys(reduxState || {}).length} slices • Depth: ${reduxExpandDepth}`
395
+ : '';
396
+ return (<react_native_1.View key={moduleItem.key} style={{
397
+ backgroundColor: AppColors_1.AppColors.primaryLight,
398
+ borderRadius: 14,
399
+ borderWidth: 1.5,
400
+ borderColor: isChecked
401
+ ? `${AppColors_1.AppColors.purple}38`
402
+ : AppColors_1.AppColors.grayBorderSecondary,
403
+ padding: 14,
404
+ gap: 10,
405
+ shadowColor: AppColors_1.AppColors.black,
406
+ shadowOpacity: isChecked ? 0.04 : 0.02,
407
+ shadowRadius: 5,
408
+ shadowOffset: { width: 0, height: 2 },
409
+ }}>
410
+ {/* Top Row: [Checkbox] -> [Icon Tile] -> [Title & Subtitle] */}
406
411
  <react_native_1.View style={{
407
- flexDirection: 'row',
408
- alignItems: 'flex-start',
409
- justifyContent: 'space-between',
410
- gap: 10,
411
- }}>
412
- {/* Tap Zone for Details/Settings */}
412
+ flexDirection: 'row',
413
+ alignItems: 'flex-start',
414
+ gap: 10,
415
+ }}>
416
+ {/* 1. Checkbox on the Left */}
417
+ <TouchableScale_1.default accessible={true} accessibilityRole="checkbox" accessibilityLabel={`Select ${moduleItem.label}`} accessibilityState={{
418
+ checked: isChecked,
419
+ disabled: isLocked,
420
+ }} disabled={isLocked} onPress={() => {
421
+ if (isLocked)
422
+ return;
423
+ setStagedTabVisibility(prev => ({
424
+ ...prev,
425
+ [moduleItem.key]: !prev[moduleItem.key],
426
+ }));
427
+ }} hitSlop={8} style={{
428
+ width: 22,
429
+ height: 22,
430
+ borderRadius: 6,
431
+ borderWidth: isChecked ? 0 : 1.8,
432
+ borderColor: isLocked
433
+ ? AppColors_1.AppColors.dividerColor
434
+ : AppColors_1.AppColors.grayBorderSecondary,
435
+ backgroundColor: moduleItem.key === 'apis'
436
+ ? `${AppColors_1.AppColors.blue500}22`
437
+ : isChecked
438
+ ? AppColors_1.AppColors.purple
439
+ : AppColors_1.AppColors.grayBackground,
440
+ alignItems: 'center',
441
+ justifyContent: 'center',
442
+ marginTop: 7,
443
+ shadowColor: isChecked
444
+ ? AppColors_1.AppColors.purple
445
+ : 'transparent',
446
+ shadowOpacity: isChecked ? 0.25 : 0,
447
+ shadowRadius: 2,
448
+ elevation: isChecked ? 2 : 0,
449
+ }}>
450
+ {moduleItem.key === 'apis' ? (<NetworkIcons_1.CheckIcon size={12} color={AppColors_1.AppColors.blue500}/>) : isChecked ? (<NetworkIcons_1.CheckIcon size={12} color={AppColors_1.AppColors.white}/>) : isLocked ? (<react_native_svg_1.default width={10} height={10} viewBox="0 0 24 24" fill="none">
451
+ <react_native_svg_1.Path d="M7 10V7a5 5 0 0 1 10 0v3" stroke={AppColors_1.AppColors.grayText} strokeWidth="2.2" strokeLinecap="round"/>
452
+ <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}/>
453
+ </react_native_svg_1.default>) : null}
454
+ </TouchableScale_1.default>
455
+
456
+ {/* 2. Middle Tap Zone: Icon + Title & Desc */}
413
457
  <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={`${moduleItem.label} settings`} disabled={isUnavailable} onPress={() => {
414
- (0, InspectorContext_1.animateNextLayout)();
415
- setSettingsPage(moduleItem.key);
416
- }} style={{
417
- flex: 1,
418
- flexDirection: 'row',
419
- alignItems: 'flex-start',
420
- gap: 10,
421
- }}>
458
+ (0, InspectorContext_1.animateNextLayout)();
459
+ setSettingsPage(moduleItem.key);
460
+ }} style={{
461
+ flex: 1,
462
+ flexDirection: 'row',
463
+ alignItems: 'flex-start',
464
+ gap: 10,
465
+ }}>
422
466
  {/* Icon Tile */}
423
467
  <react_native_1.View style={{
424
- width: 36,
425
- height: 36,
426
- borderRadius: 10,
427
- backgroundColor: isLocked
428
- ? `${AppColors_1.AppColors.grayBorderSecondary}4D`
429
- : isChecked
430
- ? `${AppColors_1.AppColors.purple}14`
431
- : AppColors_1.AppColors.grayBackground,
432
- borderWidth: 1,
433
- borderColor: isLocked
434
- ? AppColors_1.AppColors.dividerColor
435
- : isChecked
436
- ? `${AppColors_1.AppColors.purple}33`
437
- : AppColors_1.AppColors.grayBorderSecondary,
438
- alignItems: 'center',
439
- justifyContent: 'center',
440
- marginTop: 1,
441
- }}>
468
+ width: 36,
469
+ height: 36,
470
+ borderRadius: 10,
471
+ backgroundColor: isLocked
472
+ ? `${AppColors_1.AppColors.grayBorderSecondary}4D`
473
+ : isChecked
474
+ ? `${AppColors_1.AppColors.purple}14`
475
+ : AppColors_1.AppColors.grayBackground,
476
+ borderWidth: 1,
477
+ borderColor: isLocked
478
+ ? AppColors_1.AppColors.dividerColor
479
+ : isChecked
480
+ ? `${AppColors_1.AppColors.purple}33`
481
+ : AppColors_1.AppColors.grayBorderSecondary,
482
+ alignItems: 'center',
483
+ justifyContent: 'center',
484
+ marginTop: 1,
485
+ }}>
442
486
  {moduleItem.icon === 'apis' && (<NetworkIcons_1.SignalIcon color={isChecked
443
- ? AppColors_1.AppColors.purple
444
- : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
487
+ ? AppColors_1.AppColors.purple
488
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
445
489
  {moduleItem.icon === 'logs' && (<NetworkIcons_1.TerminalIcon color={isChecked
446
- ? AppColors_1.AppColors.purple
447
- : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
490
+ ? AppColors_1.AppColors.purple
491
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
448
492
  {moduleItem.icon === 'performance' && (<NetworkIcons_1.PerformanceIcon color={isChecked
449
- ? AppColors_1.AppColors.purple
450
- : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
493
+ ? AppColors_1.AppColors.purple
494
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
451
495
  {moduleItem.icon === 'bundle' && (<NetworkIcons_1.PackageIcon color={isChecked
452
- ? AppColors_1.AppColors.purple
453
- : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
496
+ ? AppColors_1.AppColors.purple
497
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
454
498
  {moduleItem.icon === 'crash' && (<NetworkIcons_1.CrashIcon color={isChecked
455
- ? AppColors_1.AppColors.purple
456
- : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
499
+ ? AppColors_1.AppColors.purple
500
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
457
501
  {moduleItem.icon === 'analytics' && (<NetworkIcons_1.AnalyticsIcon color={isChecked
458
- ? AppColors_1.AppColors.purple
459
- : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
502
+ ? AppColors_1.AppColors.purple
503
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
460
504
  {moduleItem.icon === 'redux' && (<NetworkIcons_1.ReduxIcon color={isChecked
461
- ? AppColors_1.AppColors.purple
462
- : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
505
+ ? AppColors_1.AppColors.purple
506
+ : AppColors_1.AppColors.grayTextWeak} size={16}/>)}
463
507
  </react_native_1.View>
464
508
 
465
509
  {/* Titles & Status Pill */}
466
510
  <react_native_1.View style={{ flex: 1, gap: 2 }}>
467
511
  <react_native_1.View style={{
468
- flexDirection: 'row',
469
- alignItems: 'center',
470
- gap: 6,
471
- flexWrap: 'wrap',
472
- }}>
512
+ flexDirection: 'row',
513
+ alignItems: 'center',
514
+ gap: 6,
515
+ flexWrap: 'wrap',
516
+ }}>
473
517
  <react_native_1.Text style={{
474
- fontFamily: AppFonts_1.AppFonts.interBold,
475
- fontSize: 14,
476
- lineHeight: 18,
477
- color: isLocked
478
- ? AppColors_1.AppColors.grayText
479
- : AppColors_1.AppColors.primaryBlack,
480
- }}>
518
+ fontFamily: AppFonts_1.AppFonts.interBold,
519
+ fontSize: 14,
520
+ lineHeight: 18,
521
+ color: isLocked
522
+ ? AppColors_1.AppColors.grayText
523
+ : AppColors_1.AppColors.primaryBlack,
524
+ }}>
481
525
  {moduleItem.label}
482
526
  </react_native_1.Text>
483
527
 
484
528
  {/* Default Startup Tab Badge */}
485
529
  {moduleItem.key === defaultTab &&
486
- !isUnavailable && (<react_native_1.View style={{
487
- flexDirection: 'row',
488
- alignItems: 'center',
489
- backgroundColor: `${AppColors_1.AppColors.purple}14`,
490
- borderRadius: 12,
491
- paddingHorizontal: 5,
492
- paddingVertical: 1.5,
493
- borderWidth: 1,
494
- borderColor: `${AppColors_1.AppColors.purple}2E`,
495
- gap: 3,
496
- }}>
530
+ !isUnavailable && (<react_native_1.View style={{
531
+ flexDirection: 'row',
532
+ alignItems: 'center',
533
+ backgroundColor: `${AppColors_1.AppColors.purple}14`,
534
+ borderRadius: 12,
535
+ paddingHorizontal: 5,
536
+ paddingVertical: 1.5,
537
+ borderWidth: 1,
538
+ borderColor: `${AppColors_1.AppColors.purple}2E`,
539
+ gap: 3,
540
+ }}>
497
541
  <react_native_1.View style={{
498
- width: 4,
499
- height: 4,
500
- borderRadius: 2,
501
- backgroundColor: AppColors_1.AppColors.purple,
502
- }}/>
542
+ width: 4,
543
+ height: 4,
544
+ borderRadius: 2,
545
+ backgroundColor: AppColors_1.AppColors.purple,
546
+ }}/>
503
547
  <react_native_1.Text style={{
504
- fontFamily: AppFonts_1.AppFonts.interBold,
505
- fontSize: 8,
506
- lineHeight: 11,
507
- color: AppColors_1.AppColors.purple,
508
- letterSpacing: 0.4,
509
- }}>
510
- {t('settings.defaultBadge')}
548
+ fontFamily: AppFonts_1.AppFonts.interBold,
549
+ fontSize: 8,
550
+ lineHeight: 11,
551
+ color: AppColors_1.AppColors.purple,
552
+ letterSpacing: 0.4,
553
+ }}>
554
+ {t('settings.defaultBadge')}
511
555
  </react_native_1.Text>
512
556
  </react_native_1.View>)}
513
557
 
514
558
  {/* Status Pill */}
515
559
  {moduleItem.key === 'apis' ? (<react_native_1.View style={{
516
- backgroundColor: `${AppColors_1.AppColors.blue500}14`,
517
- borderRadius: 4,
518
- paddingHorizontal: 5,
519
- paddingVertical: 1.5,
520
- borderWidth: 1,
521
- borderColor: `${AppColors_1.AppColors.blue500}33`,
522
- }}>
560
+ backgroundColor: `${AppColors_1.AppColors.blue500}14`,
561
+ borderRadius: 4,
562
+ paddingHorizontal: 5,
563
+ paddingVertical: 1.5,
564
+ borderWidth: 1,
565
+ borderColor: `${AppColors_1.AppColors.blue500}33`,
566
+ }}>
523
567
  <react_native_1.Text style={{
524
- fontFamily: AppFonts_1.AppFonts.interBold,
525
- fontSize: 8,
526
- lineHeight: 11,
527
- color: AppColors_1.AppColors.blue500,
528
- letterSpacing: 0.3,
529
- }}>
568
+ fontFamily: AppFonts_1.AppFonts.interBold,
569
+ fontSize: 8,
570
+ lineHeight: 11,
571
+ color: AppColors_1.AppColors.blue500,
572
+ letterSpacing: 0.3,
573
+ }}>
530
574
  {t('settings.coreBadge')}
531
575
  </react_native_1.Text>
532
576
  </react_native_1.View>) : isUnavailable ? (<react_native_1.View style={{
533
- backgroundColor: `${AppColors_1.AppColors.amber500}18`,
534
- borderRadius: 4,
535
- paddingHorizontal: 5,
536
- paddingVertical: 1.5,
537
- borderWidth: 1,
538
- borderColor: `${AppColors_1.AppColors.amber500}35`,
539
- }}>
577
+ backgroundColor: `${AppColors_1.AppColors.amber500}18`,
578
+ borderRadius: 4,
579
+ paddingHorizontal: 5,
580
+ paddingVertical: 1.5,
581
+ borderWidth: 1,
582
+ borderColor: `${AppColors_1.AppColors.amber500}35`,
583
+ }}>
540
584
  <react_native_1.Text style={{
541
- fontFamily: AppFonts_1.AppFonts.interBold,
542
- fontSize: 8,
543
- lineHeight: 11,
544
- color: AppColors_1.AppColors.amber700,
545
- letterSpacing: 0.3,
546
- }}>
585
+ fontFamily: AppFonts_1.AppFonts.interBold,
586
+ fontSize: 8,
587
+ lineHeight: 11,
588
+ color: AppColors_1.AppColors.amber700,
589
+ letterSpacing: 0.3,
590
+ }}>
547
591
  {moduleItem.key === 'redux'
548
- ? t('settings.notConnectedBadge')
549
- : t('settings.notDetectedBadge')}
592
+ ? t('settings.notConnectedBadge')
593
+ : t('settings.notDetectedBadge')}
550
594
  </react_native_1.Text>
551
595
  </react_native_1.View>) : isChecked ? (<react_native_1.View style={{
552
- backgroundColor: `${AppColors_1.AppColors.liveGreen}18`,
553
- borderRadius: 4,
554
- paddingHorizontal: 5,
555
- paddingVertical: 1.5,
556
- borderWidth: 1,
557
- borderColor: `${AppColors_1.AppColors.liveGreen}38`,
558
- }}>
596
+ backgroundColor: `${AppColors_1.AppColors.liveGreen}18`,
597
+ borderRadius: 4,
598
+ paddingHorizontal: 5,
599
+ paddingVertical: 1.5,
600
+ borderWidth: 1,
601
+ borderColor: `${AppColors_1.AppColors.liveGreen}38`,
602
+ }}>
559
603
  <react_native_1.Text style={{
560
- fontFamily: AppFonts_1.AppFonts.interBold,
561
- fontSize: 8,
562
- lineHeight: 11,
563
- color: AppColors_1.AppColors.green700,
564
- letterSpacing: 0.3,
565
- }}>
604
+ fontFamily: AppFonts_1.AppFonts.interBold,
605
+ fontSize: 8,
606
+ lineHeight: 11,
607
+ color: AppColors_1.AppColors.green700,
608
+ letterSpacing: 0.3,
609
+ }}>
566
610
  {t('settings.activeBadge')}
567
611
  </react_native_1.Text>
568
612
  </react_native_1.View>) : (<react_native_1.View style={{
569
- backgroundColor: `${AppColors_1.AppColors.grayTextWeak}18`,
570
- borderRadius: 4,
571
- paddingHorizontal: 5,
572
- paddingVertical: 1.5,
573
- borderWidth: 1,
574
- borderColor: `${AppColors_1.AppColors.grayTextWeak}2E`,
575
- }}>
613
+ backgroundColor: `${AppColors_1.AppColors.grayTextWeak}18`,
614
+ borderRadius: 4,
615
+ paddingHorizontal: 5,
616
+ paddingVertical: 1.5,
617
+ borderWidth: 1,
618
+ borderColor: `${AppColors_1.AppColors.grayTextWeak}2E`,
619
+ }}>
576
620
  <react_native_1.Text style={{
577
- fontFamily: AppFonts_1.AppFonts.interBold,
578
- fontSize: 8,
579
- lineHeight: 11,
580
- color: AppColors_1.AppColors.grayTextWeak,
581
- letterSpacing: 0.3,
582
- }}>
621
+ fontFamily: AppFonts_1.AppFonts.interBold,
622
+ fontSize: 8,
623
+ lineHeight: 11,
624
+ color: AppColors_1.AppColors.grayTextWeak,
625
+ letterSpacing: 0.3,
626
+ }}>
583
627
  {t('settings.dormantBadge')}
584
628
  </react_native_1.Text>
585
629
  </react_native_1.View>)}
586
630
  </react_native_1.View>
587
631
 
588
632
  <react_native_1.Text style={{
589
- fontFamily: AppFonts_1.AppFonts.interRegular,
590
- fontSize: 11,
591
- color: AppColors_1.AppColors.grayText,
592
- lineHeight: 15,
593
- marginTop: 1,
594
- }}>
633
+ fontFamily: AppFonts_1.AppFonts.interRegular,
634
+ fontSize: 11,
635
+ color: AppColors_1.AppColors.grayText,
636
+ lineHeight: 15,
637
+ marginTop: 1,
638
+ }}>
595
639
  {moduleItem.desc}
596
640
  </react_native_1.Text>
597
641
  </react_native_1.View>
598
642
  </TouchableScale_1.default>
599
-
600
- {/* Decorative Custom Checkbox */}
601
- <TouchableScale_1.default accessible={true} accessibilityRole="checkbox" accessibilityLabel={`Select ${moduleItem.label}`} accessibilityState={{
602
- checked: isChecked,
603
- disabled: isLocked,
604
- }} disabled={isLocked} onPress={() => {
605
- if (isLocked)
606
- return;
607
- setStagedTabVisibility(prev => ({
608
- ...prev,
609
- [moduleItem.key]: !prev[moduleItem.key],
610
- }));
611
- }} style={{
612
- width: 26,
613
- height: 26,
614
- borderRadius: 8,
615
- borderWidth: isChecked ? 0 : 2,
616
- borderColor: isLocked
617
- ? AppColors_1.AppColors.dividerColor
618
- : AppColors_1.AppColors.grayBorderSecondary,
619
- backgroundColor: moduleItem.key === 'apis'
620
- ? `${AppColors_1.AppColors.blue500}22`
621
- : isChecked
622
- ? AppColors_1.AppColors.purple
623
- : AppColors_1.AppColors.grayBackground,
624
- alignItems: 'center',
625
- justifyContent: 'center',
626
- shadowColor: isChecked
627
- ? AppColors_1.AppColors.purple
628
- : 'transparent',
629
- shadowOpacity: isChecked ? 0.3 : 0,
630
- shadowRadius: 3,
631
- shadowOffset: { width: 0, height: 1 },
632
- elevation: isChecked ? 2 : 0,
633
- }}>
634
- {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">
635
- <react_native_svg_1.Path d="M7 10V7a5 5 0 0 1 10 0v3" stroke={AppColors_1.AppColors.grayText} strokeWidth="2.2" strokeLinecap="round"/>
636
- <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}/>
637
- </react_native_svg_1.default>) : null}
638
- </TouchableScale_1.default>
639
643
  </react_native_1.View>
640
644
 
641
645
  {/* Card Footer: Live Stats + Configure Button */}
642
646
  {!isUnavailable && (<react_native_1.View style={{
643
- flexDirection: 'row',
644
- alignItems: 'center',
645
- justifyContent: 'space-between',
646
- paddingTop: 8,
647
- borderTopWidth: 1,
648
- borderTopColor: AppColors_1.AppColors.dividerColor,
649
- }}>
647
+ flexDirection: 'row',
648
+ alignItems: 'center',
649
+ justifyContent: 'space-between',
650
+ paddingTop: 8,
651
+ borderTopWidth: 1,
652
+ borderTopColor: AppColors_1.AppColors.dividerColor,
653
+ }}>
650
654
  {/* Live Info Pill */}
651
655
  <react_native_1.View style={{
652
- flexDirection: 'row',
653
- alignItems: 'center',
654
- gap: 6,
655
- flex: 1,
656
- }}>
656
+ flexDirection: 'row',
657
+ alignItems: 'center',
658
+ gap: 6,
659
+ flex: 1,
660
+ }}>
657
661
  <react_native_1.View style={{
658
- width: 6,
659
- height: 6,
660
- borderRadius: 3,
661
- backgroundColor: isChecked
662
- ? AppColors_1.AppColors.liveGreen
663
- : AppColors_1.AppColors.grayTextWeak,
664
- }}/>
662
+ width: 6,
663
+ height: 6,
664
+ borderRadius: 3,
665
+ backgroundColor: isChecked
666
+ ? AppColors_1.AppColors.liveGreen
667
+ : AppColors_1.AppColors.grayTextWeak,
668
+ }}/>
665
669
  <react_native_1.Text style={{
666
- fontFamily: AppFonts_1.AppFonts.interMedium,
667
- fontSize: 11,
668
- color: AppColors_1.AppColors.grayText,
669
- lineHeight: 14,
670
- }}>
670
+ fontFamily: AppFonts_1.AppFonts.interMedium,
671
+ fontSize: 11,
672
+ color: AppColors_1.AppColors.grayText,
673
+ lineHeight: 14,
674
+ }}>
671
675
  {liveStats}
672
676
  </react_native_1.Text>
673
677
  </react_native_1.View>
674
678
 
675
679
  {/* Sleek Configure Button */}
676
680
  <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={`Configure ${moduleItem.label} settings`} onPress={() => {
677
- (0, InspectorContext_1.animateNextLayout)();
678
- setSettingsPage(moduleItem.key);
679
- }} style={{
680
- flexDirection: 'row',
681
- alignItems: 'center',
682
- gap: 5,
683
- backgroundColor: `${AppColors_1.AppColors.purple}12`,
684
- paddingHorizontal: 10,
685
- paddingVertical: 5,
686
- borderRadius: 8,
687
- borderWidth: 1,
688
- borderColor: `${AppColors_1.AppColors.purple}26`,
689
- }}>
681
+ (0, InspectorContext_1.animateNextLayout)();
682
+ setSettingsPage(moduleItem.key);
683
+ }} style={{
684
+ flexDirection: 'row',
685
+ alignItems: 'center',
686
+ gap: 5,
687
+ backgroundColor: `${AppColors_1.AppColors.purple}12`,
688
+ paddingHorizontal: 10,
689
+ paddingVertical: 5,
690
+ borderRadius: 8,
691
+ borderWidth: 1,
692
+ borderColor: `${AppColors_1.AppColors.purple}26`,
693
+ }}>
690
694
  <NetworkIcons_1.SettingsIcon color={AppColors_1.AppColors.purple} size={11}/>
691
695
  <react_native_1.Text style={{
692
- fontFamily: AppFonts_1.AppFonts.interBold,
693
- fontSize: 11,
694
- lineHeight: 14,
695
- color: AppColors_1.AppColors.purple,
696
- }}>
696
+ fontFamily: AppFonts_1.AppFonts.interBold,
697
+ fontSize: 11,
698
+ lineHeight: 14,
699
+ color: AppColors_1.AppColors.purple,
700
+ }}>
697
701
  {t('settings.configure')}
698
702
  </react_native_1.Text>
699
703
  <NetworkIcons_1.ForwardChevronIcon color={AppColors_1.AppColors.purple} size={9}/>
700
704
  </TouchableScale_1.default>
701
705
  </react_native_1.View>)}
702
706
  </react_native_1.View>);
703
- })}
707
+ })}
704
708
  </react_native_1.View>
705
- </react_native_1.View>) : (
706
- /* UI Preferences Subtab */
707
- <react_native_1.View style={{ gap: 14 }}>
708
- {/* Section 1: Appearance */}
709
+
710
+ {/* Section 3.5: RAM-Based Auto Limits */}
709
711
  <react_native_1.View style={{
710
- backgroundColor: AppColors_1.AppColors.primaryLight,
711
- borderRadius: 14,
712
- borderWidth: 1,
713
- borderColor: AppColors_1.AppColors.grayBorderSecondary,
714
- overflow: 'hidden',
715
- padding: 14,
716
- gap: 12,
717
- }}>
712
+ backgroundColor: AppColors_1.AppColors.primaryLight,
713
+ borderRadius: 14,
714
+ borderWidth: 1,
715
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
716
+ overflow: 'hidden',
717
+ padding: 14,
718
+ gap: 12,
719
+ }}>
718
720
  <react_native_1.Text style={{
719
- fontFamily: AppFonts_1.AppFonts.interBold,
720
- fontSize: 11,
721
- lineHeight: 14,
722
- color: AppColors_1.AppColors.grayTextWeak,
723
- letterSpacing: 0.8,
724
- }}>
725
- {t('settings.appearanceTheme')}
721
+ fontFamily: AppFonts_1.AppFonts.interBold,
722
+ fontSize: 11,
723
+ lineHeight: 14,
724
+ color: AppColors_1.AppColors.grayTextWeak,
725
+ letterSpacing: 0.8,
726
+ }}>
727
+ RAM-Based Auto Limits
726
728
  </react_native_1.Text>
727
729
 
730
+ {/* Auto RAM Limit Toggle */}
728
731
  <react_native_1.View style={{
729
- flexDirection: 'row',
730
- alignItems: 'center',
731
- justifyContent: 'space-between',
732
- }}>
732
+ flexDirection: 'row',
733
+ alignItems: 'center',
734
+ justifyContent: 'space-between',
735
+ }}>
733
736
  <react_native_1.View style={{
734
- flexDirection: 'row',
735
- alignItems: 'center',
736
- gap: 10,
737
- flex: 1,
738
- }}>
737
+ flexDirection: 'row',
738
+ alignItems: 'center',
739
+ gap: 10,
740
+ flex: 1,
741
+ }}>
739
742
  <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
- {isDark ? (<NetworkIcons_1.SunIcon color={AppColors_1.AppColors.purple} size={15}/>) : (<NetworkIcons_1.MoonIcon color={AppColors_1.AppColors.purple} size={15}/>)}
743
+ width: 32,
744
+ height: 32,
745
+ borderRadius: 8,
746
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
747
+ alignItems: 'center',
748
+ justifyContent: 'center',
749
+ }}>
750
+ <NetworkIcons_1.PerformanceIcon color={AppColors_1.AppColors.purple} size={15}/>
748
751
  </react_native_1.View>
749
752
  <react_native_1.View style={{ flex: 1 }}>
750
753
  <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
- {t('settings.general.darkMode')}
754
+ fontFamily: AppFonts_1.AppFonts.interBold,
755
+ fontSize: 13.5,
756
+ lineHeight: 18,
757
+ color: AppColors_1.AppColors.primaryBlack,
758
+ }}>
759
+ Auto-Calculate Limits from Device RAM
757
760
  </react_native_1.Text>
758
761
  <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
- {t('settings.general.darkModeDescription')}
762
+ fontFamily: AppFonts_1.AppFonts.interRegular,
763
+ fontSize: 11,
764
+ lineHeight: 15,
765
+ color: AppColors_1.AppColors.grayText,
766
+ marginTop: 1,
767
+ }}>
768
+ Automatically set API, Logs, Analytics & Crash limits based on available memory
766
769
  </react_native_1.Text>
767
770
  </react_native_1.View>
768
771
  </react_native_1.View>
769
772
 
770
- <TouchableScale_1.default accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle Dark Theme" accessibilityState={{ checked: isDark }} onPress={() => {
771
- const newTheme = !isDark;
772
- setIsDark(newTheme);
773
- (0, styles_1.toggleGlobalTheme)(newTheme);
774
- }} style={{
775
- width: 42,
776
- height: 24,
777
- borderRadius: 12,
778
- backgroundColor: isDark
779
- ? AppColors_1.AppColors.purple
780
- : AppColors_1.AppColors.grayBorderSecondary,
781
- padding: 2,
782
- justifyContent: 'center',
783
- alignItems: isDark ? 'flex-end' : 'flex-start',
784
- }}>
773
+ <TouchableScale_1.default accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle auto RAM limit calculation" accessibilityState={{ checked: isAutoRamLimitEnabled }} onPress={() => setIsAutoRamLimitEnabled(prev => !prev)} style={{
774
+ width: 42,
775
+ height: 24,
776
+ borderRadius: 12,
777
+ backgroundColor: isAutoRamLimitEnabled
778
+ ? AppColors_1.AppColors.purple
779
+ : AppColors_1.AppColors.grayBorderSecondary,
780
+ padding: 2,
781
+ justifyContent: 'center',
782
+ alignItems: isAutoRamLimitEnabled ? 'flex-end' : 'flex-start',
783
+ }}>
785
784
  <react_native_1.View style={{
786
- width: 20,
787
- height: 20,
788
- borderRadius: 10,
789
- backgroundColor: AppColors_1.AppColors.white,
790
- shadowColor: AppColors_1.AppColors.black,
791
- shadowOpacity: 0.18,
792
- shadowRadius: 2,
793
- shadowOffset: { width: 0, height: 1 },
794
- }}/>
785
+ width: 20,
786
+ height: 20,
787
+ borderRadius: 10,
788
+ backgroundColor: AppColors_1.AppColors.white,
789
+ shadowColor: AppColors_1.AppColors.black,
790
+ shadowOpacity: 0.18,
791
+ shadowRadius: 2,
792
+ shadowOffset: { width: 0, height: 1 },
793
+ }}/>
795
794
  </TouchableScale_1.default>
796
795
  </react_native_1.View>
797
- </react_native_1.View>
798
796
 
799
- {/* Section 2: Window & Layout */}
800
- <react_native_1.View style={{
801
- backgroundColor: AppColors_1.AppColors.primaryLight,
802
- borderRadius: 14,
803
- borderWidth: 1,
804
- borderColor: AppColors_1.AppColors.grayBorderSecondary,
805
- overflow: 'hidden',
806
- padding: 14,
807
- gap: 14,
808
- }}>
809
- <react_native_1.Text style={{
810
- fontFamily: AppFonts_1.AppFonts.interBold,
811
- fontSize: 11,
812
- lineHeight: 14,
813
- color: AppColors_1.AppColors.grayTextWeak,
814
- letterSpacing: 0.8,
815
- }}>
816
- {t('settings.windowLayout')}
817
- </react_native_1.Text>
797
+ <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
818
798
 
819
- {/* Modal Height */}
820
- <react_native_1.View style={{ gap: 8 }}>
799
+ {/* Device Free RAM Display */}
800
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 10 }}>
821
801
  <react_native_1.View style={{
822
- flexDirection: 'row',
823
- alignItems: 'center',
824
- gap: 10,
825
- }}>
826
- <react_native_1.View style={{
827
- width: 32,
828
- height: 32,
829
- borderRadius: 8,
830
- backgroundColor: AppColors_1.AppColors.purpleShade50,
831
- alignItems: 'center',
832
- justifyContent: 'center',
833
- }}>
834
- <NetworkIcons_1.ScreenIcon color={AppColors_1.AppColors.purple} size={15}/>
835
- </react_native_1.View>
836
- <react_native_1.View style={{ flex: 1 }}>
837
- <react_native_1.Text style={{
838
- fontFamily: AppFonts_1.AppFonts.interBold,
839
- fontSize: 13.5,
840
- lineHeight: 18,
841
- color: AppColors_1.AppColors.primaryBlack,
842
- }}>
843
- {t('settings.general.modalHeight')}
844
- </react_native_1.Text>
845
- <react_native_1.Text style={{
846
- fontFamily: AppFonts_1.AppFonts.interRegular,
847
- fontSize: 11,
848
- lineHeight: 15,
849
- color: AppColors_1.AppColors.grayText,
850
- marginTop: 1,
851
- }}>
852
- {t('settings.general.modalHeightDescription')}
853
- </react_native_1.Text>
854
- </react_native_1.View>
802
+ width: 32,
803
+ height: 32,
804
+ borderRadius: 8,
805
+ backgroundColor: isAutoRamLimitEnabled
806
+ ? `${AppColors_1.AppColors.purple}14`
807
+ : AppColors_1.AppColors.grayBackground,
808
+ alignItems: 'center',
809
+ justifyContent: 'center',
810
+ }}>
811
+ <NetworkIcons_1.SignalIcon color={isAutoRamLimitEnabled ? AppColors_1.AppColors.purple : AppColors_1.AppColors.grayTextWeak} size={15}/>
812
+ </react_native_1.View>
813
+ <react_native_1.View style={{ flex: 1 }}>
814
+ <react_native_1.Text style={{
815
+ fontFamily: AppFonts_1.AppFonts.interBold,
816
+ fontSize: 13.5,
817
+ lineHeight: 18,
818
+ color: isAutoRamLimitEnabled
819
+ ? AppColors_1.AppColors.primaryBlack
820
+ : AppColors_1.AppColors.grayText,
821
+ }}>
822
+ Detected Free RAM
823
+ </react_native_1.Text>
824
+ <react_native_1.Text style={{
825
+ fontFamily: AppFonts_1.AppFonts.interRegular,
826
+ fontSize: 11,
827
+ lineHeight: 15,
828
+ color: AppColors_1.AppColors.grayText,
829
+ marginTop: 1,
830
+ }}>
831
+ {deviceFreeRamMb} MB available
832
+ </react_native_1.Text>
855
833
  </react_native_1.View>
856
-
857
834
  <react_native_1.View style={{
858
- flexDirection: 'row',
859
- backgroundColor: AppColors_1.AppColors.grayBackground,
860
- borderRadius: 10,
861
- padding: 3,
862
- borderWidth: 1,
863
- borderColor: AppColors_1.AppColors.dividerColor,
864
- }}>
865
- {[50, 70, 90, 100].map(opt => {
866
- const isActive = modalHeightPercent === opt;
867
- return (<TouchableScale_1.default key={opt} accessible={true} accessibilityRole="button" accessibilityLabel={`Set window height to ${opt} percent`} accessibilityState={{ selected: isActive }} onPress={() => setModalHeightPercent(opt)} style={{
868
- flex: 1,
869
- paddingVertical: 7,
870
- alignItems: 'center',
871
- borderRadius: 8,
872
- backgroundColor: isActive
873
- ? AppColors_1.AppColors.purple
874
- : 'transparent',
875
- }}>
876
- <react_native_1.Text style={{
877
- fontFamily: AppFonts_1.AppFonts.interBold,
878
- fontSize: 11.5,
879
- lineHeight: 15,
880
- color: isActive
881
- ? AppColors_1.AppColors.white
882
- : AppColors_1.AppColors.grayText,
883
- }}>
884
- {opt}%
885
- </react_native_1.Text>
886
- </TouchableScale_1.default>);
887
- })}
835
+ paddingHorizontal: 10,
836
+ paddingVertical: 5,
837
+ borderRadius: 8,
838
+ backgroundColor: isAutoRamLimitEnabled
839
+ ? `${AppColors_1.AppColors.purple}12`
840
+ : AppColors_1.AppColors.grayBackground,
841
+ borderWidth: 1,
842
+ borderColor: isAutoRamLimitEnabled
843
+ ? `${AppColors_1.AppColors.purple}26`
844
+ : AppColors_1.AppColors.dividerColor,
845
+ }}>
846
+ <react_native_1.Text style={{
847
+ fontFamily: AppFonts_1.AppFonts.interBold,
848
+ fontSize: 12,
849
+ lineHeight: 15,
850
+ color: isAutoRamLimitEnabled
851
+ ? AppColors_1.AppColors.purple
852
+ : AppColors_1.AppColors.grayText,
853
+ }}>
854
+ {deviceFreeRamMb} MB
855
+ </react_native_1.Text>
888
856
  </react_native_1.View>
889
857
  </react_native_1.View>
890
858
 
891
- <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
892
-
893
- {/* Modal Animation */}
894
- <react_native_1.View style={{ gap: 8 }}>
895
- <react_native_1.View style={{
896
- flexDirection: 'row',
897
- alignItems: 'center',
898
- gap: 10,
859
+ {/* Current Auto-Calculated Limits Preview */}
860
+ {isAutoRamLimitEnabled && (<react_native_1.View style={{ marginTop: 8, paddingTop: 8, borderTopWidth: 1, borderTopColor: AppColors_1.AppColors.dividerColor, gap: 6 }}>
861
+ <react_native_1.Text style={{
862
+ fontFamily: AppFonts_1.AppFonts.interBold,
863
+ fontSize: 11.5,
864
+ lineHeight: 15,
865
+ color: AppColors_1.AppColors.purple,
899
866
  }}>
900
- <react_native_1.View style={{
901
- width: 32,
902
- height: 32,
903
- borderRadius: 8,
904
- backgroundColor: AppColors_1.AppColors.purpleShade50,
905
- alignItems: 'center',
906
- justifyContent: 'center',
907
- }}>
908
- <NetworkIcons_1.MotionIcon color={AppColors_1.AppColors.purple} size={15}/>
909
- </react_native_1.View>
910
- <react_native_1.View style={{ flex: 1 }}>
911
- <react_native_1.Text style={{
912
- fontFamily: AppFonts_1.AppFonts.interBold,
913
- fontSize: 13.5,
914
- lineHeight: 18,
915
- color: AppColors_1.AppColors.primaryBlack,
916
- }}>
917
- {t('settings.general.modalAnimation')}
918
- </react_native_1.Text>
919
- <react_native_1.Text style={{
920
- fontFamily: AppFonts_1.AppFonts.interRegular,
921
- fontSize: 11,
922
- lineHeight: 15,
923
- color: AppColors_1.AppColors.grayText,
924
- marginTop: 1,
925
- }}>
926
- {t('settings.general.modalAnimationDescription')}
927
- </react_native_1.Text>
928
- </react_native_1.View>
929
- </react_native_1.View>
930
-
931
- <react_native_1.View style={{
932
- flexDirection: 'row',
933
- backgroundColor: AppColors_1.AppColors.grayBackground,
934
- borderRadius: 10,
935
- padding: 3,
936
- borderWidth: 1,
937
- borderColor: AppColors_1.AppColors.dividerColor,
938
- }}>
939
- {[
940
- { key: 'slide', label: 'Slide Up' },
941
- { key: 'fade', label: 'Fade' },
942
- { key: 'none', label: 'None' },
943
- ].map(opt => {
944
- const isActive = modalAnimationType === opt.key;
945
- 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={{
946
- flex: 1,
947
- paddingVertical: 7,
948
- alignItems: 'center',
949
- borderRadius: 8,
950
- backgroundColor: isActive
951
- ? AppColors_1.AppColors.purple
952
- : 'transparent',
953
- }}>
867
+ Auto Profile: {autoRamProfile.profileName}
868
+ </react_native_1.Text>
869
+ <react_native_1.View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 8 }}>
870
+ {[
871
+ { label: 'APIs', value: autoRamProfile.maxNetworkLogs, color: AppColors_1.AppColors.blue500 },
872
+ { label: 'Logs', value: autoRamProfile.maxConsoleLogs, color: AppColors_1.AppColors.sky500 },
873
+ { label: 'Analytics', value: autoRamProfile.maxAnalyticsEvents, color: AppColors_1.AppColors.purple },
874
+ { label: 'Crash', value: autoRamProfile.maxCrashRecords, color: AppColors_1.AppColors.errorColor },
875
+ ].map(item => (<react_native_1.View key={item.label} style={{
876
+ flexDirection: 'row',
877
+ alignItems: 'center',
878
+ gap: 4,
879
+ paddingHorizontal: 8,
880
+ paddingVertical: 4,
881
+ borderRadius: 6,
882
+ backgroundColor: `${item.color}14`,
883
+ borderWidth: 1,
884
+ borderColor: `${item.color}33`,
885
+ }}>
954
886
  <react_native_1.Text style={{
955
- fontFamily: AppFonts_1.AppFonts.interBold,
956
- fontSize: 11.5,
957
- lineHeight: 15,
958
- color: isActive
959
- ? AppColors_1.AppColors.white
960
- : AppColors_1.AppColors.grayText,
961
- }}>
962
- {opt.label}
887
+ fontFamily: AppFonts_1.AppFonts.interBold,
888
+ fontSize: 10.5,
889
+ lineHeight: 14,
890
+ color: item.color,
891
+ }}>
892
+ {item.label}
963
893
  </react_native_1.Text>
964
- </TouchableScale_1.default>);
965
- })}
966
- </react_native_1.View>
967
- </react_native_1.View>
894
+ <react_native_1.Text style={{
895
+ fontFamily: AppFonts_1.AppFonts.interBold,
896
+ fontSize: 10.5,
897
+ lineHeight: 14,
898
+ color: item.color,
899
+ }}>
900
+ {item.value}
901
+ </react_native_1.Text>
902
+ </react_native_1.View>))}
903
+ </react_native_1.View>
904
+ </react_native_1.View>)}
968
905
  </react_native_1.View>
969
-
970
- {/* Section 3: Default Startup Tab */}
906
+ </react_native_1.View>) : (<react_native_1.View style={{ gap: 14 }}>
907
+ {/* Section 1: Appearance */}
971
908
  <react_native_1.View style={{
972
- backgroundColor: AppColors_1.AppColors.primaryLight,
973
- borderRadius: 14,
974
- borderWidth: 1,
975
- borderColor: AppColors_1.AppColors.grayBorderSecondary,
976
- overflow: 'hidden',
977
- padding: 14,
978
- gap: 12,
979
- }}>
909
+ backgroundColor: AppColors_1.AppColors.primaryLight,
910
+ borderRadius: 14,
911
+ borderWidth: 1,
912
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
913
+ overflow: 'hidden',
914
+ padding: 14,
915
+ gap: 12,
916
+ }}>
980
917
  <react_native_1.Text style={{
981
- fontFamily: AppFonts_1.AppFonts.interBold,
982
- fontSize: 11,
983
- lineHeight: 14,
984
- color: AppColors_1.AppColors.grayTextWeak,
985
- letterSpacing: 0.8,
986
- }}>
987
- {t('settings.startupDefault')}
918
+ fontFamily: AppFonts_1.AppFonts.interBold,
919
+ fontSize: 11,
920
+ lineHeight: 14,
921
+ color: AppColors_1.AppColors.grayTextWeak,
922
+ letterSpacing: 0.8,
923
+ }}>
924
+ {t('settings.appearanceTheme')}
988
925
  </react_native_1.Text>
989
926
 
990
927
  <react_native_1.View style={{
991
- flexDirection: 'row',
992
- alignItems: 'center',
993
- gap: 10,
994
- }}>
928
+ flexDirection: 'row',
929
+ alignItems: 'center',
930
+ justifyContent: 'space-between',
931
+ }}>
995
932
  <react_native_1.View style={{
996
- width: 32,
997
- height: 32,
998
- borderRadius: 8,
999
- backgroundColor: AppColors_1.AppColors.purpleShade50,
1000
- alignItems: 'center',
1001
- justifyContent: 'center',
1002
- }}>
1003
- <NetworkIcons_1.LayersIcon color={AppColors_1.AppColors.purple} size={15}/>
1004
- </react_native_1.View>
1005
- <react_native_1.View style={{ flex: 1 }}>
1006
- <react_native_1.Text style={{
1007
- fontFamily: AppFonts_1.AppFonts.interBold,
1008
- fontSize: 13.5,
1009
- lineHeight: 18,
1010
- color: AppColors_1.AppColors.primaryBlack,
1011
- }}>
1012
- {t('settings.general.defaultOpeningTab')}
1013
- </react_native_1.Text>
1014
- <react_native_1.Text style={{
1015
- fontFamily: AppFonts_1.AppFonts.interRegular,
1016
- fontSize: 11,
1017
- lineHeight: 15,
1018
- color: AppColors_1.AppColors.grayText,
1019
- marginTop: 1,
1020
- }}>
1021
- {t('settings.general.defaultOpeningTabDesc')}
1022
- </react_native_1.Text>
933
+ flexDirection: 'row',
934
+ alignItems: 'center',
935
+ gap: 10,
936
+ flex: 1,
937
+ }}>
938
+ <react_native_1.View style={{
939
+ width: 32,
940
+ height: 32,
941
+ borderRadius: 8,
942
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
943
+ alignItems: 'center',
944
+ justifyContent: 'center',
945
+ }}>
946
+ {isDark ? (<NetworkIcons_1.SunIcon color={AppColors_1.AppColors.purple} size={15}/>) : (<NetworkIcons_1.MoonIcon color={AppColors_1.AppColors.purple} size={15}/>)}
947
+ </react_native_1.View>
948
+ <react_native_1.View style={{ flex: 1 }}>
949
+ <react_native_1.Text style={{
950
+ fontFamily: AppFonts_1.AppFonts.interBold,
951
+ fontSize: 13.5,
952
+ lineHeight: 18,
953
+ color: AppColors_1.AppColors.primaryBlack,
954
+ }}>
955
+ {t('settings.general.darkMode')}
956
+ </react_native_1.Text>
957
+ <react_native_1.Text style={{
958
+ fontFamily: AppFonts_1.AppFonts.interRegular,
959
+ fontSize: 11,
960
+ lineHeight: 15,
961
+ color: AppColors_1.AppColors.grayText,
962
+ marginTop: 1,
963
+ }}>
964
+ {t('settings.general.darkModeDescription')}
965
+ </react_native_1.Text>
966
+ </react_native_1.View>
1023
967
  </react_native_1.View>
1024
- </react_native_1.View>
1025
968
 
1026
- {/* Grid of Default Tab Cards */}
1027
- <react_native_1.View style={{
1028
- flexDirection: 'row',
1029
- flexWrap: 'wrap',
1030
- gap: 8,
1031
- marginTop: 4,
1032
- }}>
1033
- {allModules
1034
- .filter(tab => tab.key === 'apis' ||
1035
- stagedTabVisibility?.[tab.key] ||
1036
- tabVisibility?.[tab.key])
1037
- .map(tab => {
1038
- const isActive = defaultTab === tab.key;
1039
- 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={{
1040
- flexDirection: 'row',
1041
- alignItems: 'center',
1042
- gap: 8,
1043
- paddingVertical: 10,
1044
- paddingHorizontal: 12,
1045
- borderRadius: 10,
1046
- borderWidth: 1.5,
1047
- borderColor: isActive
1048
- ? AppColors_1.AppColors.purple
1049
- : AppColors_1.AppColors.grayBorderSecondary,
1050
- backgroundColor: isActive
1051
- ? `${AppColors_1.AppColors.purple}0F`
1052
- : AppColors_1.AppColors.primaryLight,
1053
- minWidth: '47%',
1054
- flex: 1,
1055
- }}>
1056
- <react_native_1.Text style={{
1057
- fontFamily: AppFonts_1.AppFonts.interBold,
1058
- fontSize: 12.5,
1059
- lineHeight: 16,
1060
- color: isActive
1061
- ? AppColors_1.AppColors.purple
1062
- : AppColors_1.AppColors.primaryBlack,
1063
- flex: 1,
1064
- }}>
1065
- {tab.label}
1066
- </react_native_1.Text>
1067
- {isActive && (<react_native_1.View style={{
1068
- width: 16,
1069
- height: 16,
1070
- borderRadius: 8,
1071
- backgroundColor: AppColors_1.AppColors.purple,
1072
- alignItems: 'center',
1073
- justifyContent: 'center',
1074
- }}>
1075
- <NetworkIcons_1.CheckIcon size={9} color={AppColors_1.AppColors.white}/>
1076
- </react_native_1.View>)}
1077
- </TouchableScale_1.default>);
1078
- })}
969
+ <TouchableScale_1.default accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle Dark Theme" accessibilityState={{ checked: isDark }} onPress={() => {
970
+ const newTheme = !isDark;
971
+ setIsDark(newTheme);
972
+ (0, styles_1.toggleGlobalTheme)(newTheme);
973
+ }} style={{
974
+ width: 42,
975
+ height: 24,
976
+ borderRadius: 12,
977
+ backgroundColor: isDark
978
+ ? AppColors_1.AppColors.purple
979
+ : AppColors_1.AppColors.grayBorderSecondary,
980
+ padding: 2,
981
+ justifyContent: 'center',
982
+ alignItems: isDark ? 'flex-end' : 'flex-start',
983
+ }}>
984
+ <react_native_1.View style={{
985
+ width: 20,
986
+ height: 20,
987
+ borderRadius: 10,
988
+ backgroundColor: AppColors_1.AppColors.white,
989
+ shadowColor: AppColors_1.AppColors.black,
990
+ shadowOpacity: 0.18,
991
+ shadowRadius: 2,
992
+ shadowOffset: { width: 0, height: 1 },
993
+ }}/>
994
+ </TouchableScale_1.default>
1079
995
  </react_native_1.View>
1080
996
  </react_native_1.View>
1081
997
 
1082
- {/* Section 4: Log Deduplication & Levels */}
998
+ {/* Section 2: Window & Layout */}
1083
999
  <react_native_1.View style={{
1084
- backgroundColor: AppColors_1.AppColors.primaryLight,
1085
- borderRadius: 14,
1086
- borderWidth: 1,
1087
- borderColor: AppColors_1.AppColors.grayBorderSecondary,
1088
- overflow: 'hidden',
1089
- padding: 14,
1090
- gap: 14,
1091
- }}>
1000
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1001
+ borderRadius: 14,
1002
+ borderWidth: 1,
1003
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1004
+ overflow: 'hidden',
1005
+ padding: 14,
1006
+ gap: 14,
1007
+ }}>
1092
1008
  <react_native_1.Text style={{
1093
- fontFamily: AppFonts_1.AppFonts.interBold,
1094
- fontSize: 11,
1095
- lineHeight: 14,
1096
- color: AppColors_1.AppColors.grayTextWeak,
1097
- letterSpacing: 0.8,
1098
- }}>
1099
- {t('settings.logFiltersDeduplication')}
1009
+ fontFamily: AppFonts_1.AppFonts.interBold,
1010
+ fontSize: 11,
1011
+ lineHeight: 14,
1012
+ color: AppColors_1.AppColors.grayTextWeak,
1013
+ letterSpacing: 0.8,
1014
+ }}>
1015
+ {t('settings.windowLayout')}
1100
1016
  </react_native_1.Text>
1101
1017
 
1102
- {/* Show Duplicate Logs */}
1103
- <react_native_1.View style={{
1104
- flexDirection: 'row',
1105
- alignItems: 'center',
1106
- justifyContent: 'space-between',
1107
- }}>
1018
+ {/* Modal Height */}
1019
+ <react_native_1.View style={{ gap: 8 }}>
1108
1020
  <react_native_1.View style={{
1109
- flexDirection: 'row',
1110
- alignItems: 'center',
1111
- gap: 10,
1112
- flex: 1,
1113
- }}>
1021
+ flexDirection: 'row',
1022
+ alignItems: 'center',
1023
+ justifyContent: 'space-between',
1024
+ gap: 10,
1025
+ }}>
1114
1026
  <react_native_1.View style={{
1115
- width: 32,
1116
- height: 32,
1117
- borderRadius: 8,
1118
- backgroundColor: AppColors_1.AppColors.purpleShade50,
1027
+ flexDirection: 'row',
1028
+ alignItems: 'center',
1029
+ gap: 10,
1030
+ flex: 1,
1031
+ }}>
1032
+ <react_native_1.View style={{
1033
+ width: 32,
1034
+ height: 32,
1035
+ borderRadius: 8,
1036
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
1037
+ alignItems: 'center',
1038
+ justifyContent: 'center',
1039
+ }}>
1040
+ <NetworkIcons_1.ScreenIcon color={AppColors_1.AppColors.purple} size={15}/>
1041
+ </react_native_1.View>
1042
+ <react_native_1.View style={{ flex: 1 }}>
1043
+ <react_native_1.Text style={{
1044
+ fontFamily: AppFonts_1.AppFonts.interBold,
1045
+ fontSize: 13.5,
1046
+ lineHeight: 18,
1047
+ color: AppColors_1.AppColors.primaryBlack,
1048
+ }}>
1049
+ {t('settings.general.modalHeight')}
1050
+ </react_native_1.Text>
1051
+ <react_native_1.Text style={{
1052
+ fontFamily: AppFonts_1.AppFonts.interRegular,
1053
+ fontSize: 11,
1054
+ lineHeight: 15,
1055
+ color: AppColors_1.AppColors.grayText,
1056
+ marginTop: 1,
1057
+ }}>
1058
+ {t('settings.general.modalHeightDescription')}
1059
+ </react_native_1.Text>
1060
+ </react_native_1.View>
1061
+ </react_native_1.View>
1062
+
1063
+ {stagedHeight !== modalHeightPercent && (<TouchableScale_1.default onPress={() => {
1064
+ setModalHeightPercent(stagedHeight);
1065
+ }} style={{
1066
+ flexDirection: 'row',
1119
1067
  alignItems: 'center',
1120
- justifyContent: 'center',
1068
+ gap: 5,
1069
+ backgroundColor: AppColors_1.AppColors.purple,
1070
+ paddingHorizontal: 10,
1071
+ paddingVertical: 5,
1072
+ borderRadius: 7,
1073
+ shadowColor: AppColors_1.AppColors.purple,
1074
+ shadowOffset: { width: 0, height: 1 },
1075
+ shadowOpacity: 0.28,
1076
+ shadowRadius: 2,
1077
+ elevation: 2,
1121
1078
  }}>
1122
- <NetworkIcons_1.EyeIcon color={AppColors_1.AppColors.purple} size={15}/>
1123
- </react_native_1.View>
1124
- <react_native_1.View style={{ flex: 1 }}>
1125
- <react_native_1.Text style={{
1079
+ <NetworkIcons_1.CheckIcon size={11} color={AppColors_1.AppColors.white}/>
1080
+ <react_native_1.Text style={{
1126
1081
  fontFamily: AppFonts_1.AppFonts.interBold,
1127
- fontSize: 13.5,
1128
- lineHeight: 18,
1129
- color: AppColors_1.AppColors.primaryBlack,
1130
- }}>
1131
- {t('settings.general.duplicateLogs')}
1132
- </react_native_1.Text>
1133
- <react_native_1.Text style={{
1134
- fontFamily: AppFonts_1.AppFonts.interRegular,
1135
1082
  fontSize: 11,
1136
- lineHeight: 15,
1137
- color: AppColors_1.AppColors.grayText,
1138
- marginTop: 1,
1083
+ color: AppColors_1.AppColors.white,
1139
1084
  }}>
1140
- {t('settings.general.duplicateLogsDescription')}
1141
- </react_native_1.Text>
1142
- </react_native_1.View>
1085
+ Save ({stagedHeight}%)
1086
+ </react_native_1.Text>
1087
+ </TouchableScale_1.default>)}
1143
1088
  </react_native_1.View>
1144
1089
 
1145
- <TouchableScale_1.default accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle show duplicate logs" accessibilityState={{ checked: showDuplicateLogs }} onPress={() => setShowDuplicateLogs(prev => !prev)} style={{
1146
- width: 42,
1147
- height: 24,
1148
- borderRadius: 12,
1149
- backgroundColor: showDuplicateLogs
1150
- ? AppColors_1.AppColors.purple
1151
- : AppColors_1.AppColors.grayBorderSecondary,
1152
- padding: 2,
1153
- justifyContent: 'center',
1154
- alignItems: showDuplicateLogs
1155
- ? 'flex-end'
1156
- : 'flex-start',
1157
- }}>
1158
- <react_native_1.View style={{
1159
- width: 20,
1160
- height: 20,
1161
- borderRadius: 10,
1162
- backgroundColor: AppColors_1.AppColors.white,
1163
- shadowColor: AppColors_1.AppColors.black,
1164
- shadowOpacity: 0.18,
1165
- shadowRadius: 2,
1166
- shadowOffset: { width: 0, height: 1 },
1167
- }}/>
1168
- </TouchableScale_1.default>
1090
+ <react_native_1.View style={{ marginTop: 6 }}>
1091
+ <Slider_1.default value={stagedHeight} onValueChange={setStagedHeight} min={50} max={90} step={5} quickPresets={[50, 60, 70, 80, 90]} formatLabel={val => `${Math.round(val)}%`}/>
1092
+ </react_native_1.View>
1169
1093
  </react_native_1.View>
1170
1094
 
1171
1095
  <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
1172
1096
 
1173
- {/* Console Log Levels */}
1097
+ {/* Modal Animation */}
1174
1098
  <react_native_1.View style={{ gap: 8 }}>
1175
1099
  <react_native_1.View style={{
1176
- flexDirection: 'row',
1177
- alignItems: 'center',
1178
- gap: 10,
1179
- }}>
1100
+ flexDirection: 'row',
1101
+ alignItems: 'center',
1102
+ gap: 10,
1103
+ }}>
1180
1104
  <react_native_1.View style={{
1181
- width: 32,
1182
- height: 32,
1183
- borderRadius: 8,
1184
- backgroundColor: AppColors_1.AppColors.purpleShade50,
1185
- alignItems: 'center',
1186
- justifyContent: 'center',
1187
- }}>
1188
- <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={15}/>
1105
+ width: 32,
1106
+ height: 32,
1107
+ borderRadius: 8,
1108
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
1109
+ alignItems: 'center',
1110
+ justifyContent: 'center',
1111
+ }}>
1112
+ <NetworkIcons_1.MotionIcon color={AppColors_1.AppColors.purple} size={15}/>
1189
1113
  </react_native_1.View>
1190
1114
  <react_native_1.View style={{ flex: 1 }}>
1191
1115
  <react_native_1.Text style={{
1192
- fontFamily: AppFonts_1.AppFonts.interBold,
1193
- fontSize: 13.5,
1194
- lineHeight: 18,
1195
- color: AppColors_1.AppColors.primaryBlack,
1196
- }}>
1197
- {t('settings.general.activeConsoleLogLevels')}
1116
+ fontFamily: AppFonts_1.AppFonts.interBold,
1117
+ fontSize: 13.5,
1118
+ lineHeight: 18,
1119
+ color: AppColors_1.AppColors.primaryBlack,
1120
+ }}>
1121
+ {t('settings.general.modalAnimation')}
1198
1122
  </react_native_1.Text>
1199
1123
  <react_native_1.Text style={{
1200
- fontFamily: AppFonts_1.AppFonts.interRegular,
1201
- fontSize: 11,
1202
- lineHeight: 15,
1203
- color: AppColors_1.AppColors.grayText,
1204
- marginTop: 1,
1205
- }}>
1206
- {t('settings.general.activeConsoleLogLevelsDesc')}
1124
+ fontFamily: AppFonts_1.AppFonts.interRegular,
1125
+ fontSize: 11,
1126
+ lineHeight: 15,
1127
+ color: AppColors_1.AppColors.grayText,
1128
+ marginTop: 1,
1129
+ }}>
1130
+ {t('settings.general.modalAnimationDescription')}
1207
1131
  </react_native_1.Text>
1208
1132
  </react_native_1.View>
1209
1133
  </react_native_1.View>
1210
1134
 
1211
- <react_native_1.View style={{ flexDirection: 'row', gap: 8, marginTop: 4 }}>
1135
+ <react_native_1.View style={{
1136
+ flexDirection: 'row',
1137
+ backgroundColor: AppColors_1.AppColors.grayBackground,
1138
+ borderRadius: 10,
1139
+ padding: 3,
1140
+ borderWidth: 1,
1141
+ borderColor: AppColors_1.AppColors.dividerColor,
1142
+ }}>
1212
1143
  {[
1213
- {
1214
- key: 'info',
1215
- label: 'Info',
1216
- color: AppColors_1.AppColors.blue500,
1217
- },
1218
- {
1219
- key: 'warn',
1220
- label: 'Warning',
1221
- color: AppColors_1.AppColors.amber500,
1222
- },
1223
- {
1224
- key: 'error',
1225
- label: 'Error',
1226
- color: AppColors_1.AppColors.errorColor,
1227
- },
1228
- ].map(level => {
1229
- const isActive = showConsoleLevels[level.key];
1230
- return (<TouchableScale_1.default key={level.key} accessible={true} accessibilityRole="checkbox" accessibilityLabel={`Toggle ${level.label} logs`} accessibilityState={{ checked: isActive }} onPress={() => setShowConsoleLevels(prev => ({
1231
- ...prev,
1232
- [level.key]: !prev[level.key],
1233
- }))} style={{
1234
- flex: 1,
1235
- flexDirection: 'row',
1236
- alignItems: 'center',
1237
- justifyContent: 'center',
1238
- gap: 6,
1239
- paddingVertical: 8,
1240
- borderRadius: 9,
1241
- borderWidth: 1.5,
1242
- borderColor: isActive
1243
- ? level.color
1244
- : AppColors_1.AppColors.grayBorderSecondary,
1245
- backgroundColor: isActive
1246
- ? `${level.color}0D`
1247
- : AppColors_1.AppColors.primaryLight,
1248
- }}>
1249
- <react_native_1.View style={{
1250
- width: 8,
1251
- height: 8,
1252
- borderRadius: 4,
1253
- backgroundColor: isActive
1254
- ? level.color
1255
- : AppColors_1.AppColors.grayBorderSecondary,
1256
- }}/>
1144
+ { key: 'slide', label: 'Slide Up' },
1145
+ { key: 'fade', label: 'Fade' },
1146
+ { key: 'none', label: 'None' },
1147
+ ].map(opt => {
1148
+ const isActive = modalAnimationType === opt.key;
1149
+ 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={{
1150
+ flex: 1,
1151
+ paddingVertical: 7,
1152
+ alignItems: 'center',
1153
+ borderRadius: 8,
1154
+ backgroundColor: isActive
1155
+ ? AppColors_1.AppColors.purple
1156
+ : 'transparent',
1157
+ }}>
1257
1158
  <react_native_1.Text style={{
1258
- fontFamily: AppFonts_1.AppFonts.interBold,
1259
- fontSize: 11.5,
1260
- lineHeight: 15,
1261
- color: isActive
1262
- ? level.color
1263
- : AppColors_1.AppColors.grayText,
1264
- }}>
1265
- {level.label}
1159
+ fontFamily: AppFonts_1.AppFonts.interBold,
1160
+ fontSize: 11.5,
1161
+ lineHeight: 15,
1162
+ color: isActive
1163
+ ? AppColors_1.AppColors.white
1164
+ : AppColors_1.AppColors.grayText,
1165
+ }}>
1166
+ {opt.label}
1266
1167
  </react_native_1.Text>
1267
1168
  </TouchableScale_1.default>);
1268
- })}
1169
+ })}
1269
1170
  </react_native_1.View>
1270
1171
  </react_native_1.View>
1271
1172
  </react_native_1.View>
1272
1173
 
1273
- {/* Section 5: Reset Settings */}
1174
+ {/* Section 3: Default Startup Tab */}
1274
1175
  <react_native_1.View style={{
1275
- backgroundColor: AppColors_1.AppColors.primaryLight,
1276
- borderRadius: 14,
1277
- borderWidth: 1,
1278
- borderColor: `${AppColors_1.AppColors.errorColor}33`,
1279
- overflow: 'hidden',
1280
- padding: 14,
1281
- flexDirection: 'row',
1282
- alignItems: 'center',
1283
- gap: 12,
1284
- }}>
1176
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1177
+ borderRadius: 14,
1178
+ borderWidth: 1,
1179
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1180
+ overflow: 'hidden',
1181
+ padding: 14,
1182
+ gap: 12,
1183
+ }}>
1184
+ <react_native_1.Text style={{
1185
+ fontFamily: AppFonts_1.AppFonts.interBold,
1186
+ fontSize: 11,
1187
+ lineHeight: 14,
1188
+ color: AppColors_1.AppColors.grayTextWeak,
1189
+ letterSpacing: 0.8,
1190
+ }}>
1191
+ {t('settings.startupDefault')}
1192
+ </react_native_1.Text>
1193
+
1285
1194
  <react_native_1.View style={{
1286
- width: 34,
1287
- height: 34,
1288
- borderRadius: 9,
1289
- backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
1290
- alignItems: 'center',
1291
- justifyContent: 'center',
1292
- }}>
1293
- <NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.errorColor} size={15}/>
1294
- </react_native_1.View>
1295
- <react_native_1.View style={{ flex: 1 }}>
1296
- <react_native_1.Text style={{
1297
- fontFamily: AppFonts_1.AppFonts.interBold,
1298
- fontSize: 13.5,
1299
- lineHeight: 18,
1300
- color: AppColors_1.AppColors.primaryBlack,
1301
- }}>
1302
- {t('settings.resetSettings')}
1303
- </react_native_1.Text>
1304
- <react_native_1.Text style={{
1305
- fontFamily: AppFonts_1.AppFonts.interRegular,
1306
- fontSize: 11,
1307
- lineHeight: 15,
1308
- color: AppColors_1.AppColors.grayText,
1309
- marginTop: 1,
1310
- }}>
1311
- {t('settings.resetSettingsDesc')}
1312
- </react_native_1.Text>
1195
+ flexDirection: 'row',
1196
+ alignItems: 'center',
1197
+ gap: 10,
1198
+ }}>
1199
+ <react_native_1.View style={{
1200
+ width: 32,
1201
+ height: 32,
1202
+ borderRadius: 8,
1203
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
1204
+ alignItems: 'center',
1205
+ justifyContent: 'center',
1206
+ }}>
1207
+ <NetworkIcons_1.LayersIcon color={AppColors_1.AppColors.purple} size={15}/>
1208
+ </react_native_1.View>
1209
+ <react_native_1.View style={{ flex: 1 }}>
1210
+ <react_native_1.Text style={{
1211
+ fontFamily: AppFonts_1.AppFonts.interBold,
1212
+ fontSize: 13.5,
1213
+ lineHeight: 18,
1214
+ color: AppColors_1.AppColors.primaryBlack,
1215
+ }}>
1216
+ {t('settings.general.defaultOpeningTab')}
1217
+ </react_native_1.Text>
1218
+ <react_native_1.Text style={{
1219
+ fontFamily: AppFonts_1.AppFonts.interRegular,
1220
+ fontSize: 11,
1221
+ lineHeight: 15,
1222
+ color: AppColors_1.AppColors.grayText,
1223
+ marginTop: 1,
1224
+ }}>
1225
+ {t('settings.general.defaultOpeningTabDesc')}
1226
+ </react_native_1.Text>
1227
+ </react_native_1.View>
1313
1228
  </react_native_1.View>
1314
1229
 
1315
- <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel="Reset all settings to default" onPress={resetToDefaults} style={{
1316
- paddingHorizontal: 12,
1317
- paddingVertical: 7,
1318
- borderRadius: 8,
1319
- backgroundColor: `${AppColors_1.AppColors.errorColor}14`,
1320
- borderWidth: 1,
1321
- borderColor: `${AppColors_1.AppColors.errorColor}38`,
1322
- }}>
1323
- <react_native_1.Text style={{
1324
- fontFamily: AppFonts_1.AppFonts.interBold,
1325
- fontSize: 11.5,
1326
- lineHeight: 15,
1327
- color: AppColors_1.AppColors.errorColor,
1328
- }}>
1329
- {t('settings.reset')}
1330
- </react_native_1.Text>
1331
- </TouchableScale_1.default>
1332
- </react_native_1.View>
1333
- </react_native_1.View>)}
1334
-
1335
- {/* Storage & Engine Status Card */}
1336
- <react_native_1.View style={{
1337
- backgroundColor: isPersistent
1338
- ? `${AppColors_1.AppColors.liveGreen}12`
1339
- : `${AppColors_1.AppColors.amber600}12`,
1340
- borderRadius: 12,
1341
- borderWidth: 1,
1342
- borderColor: isPersistent
1343
- ? `${AppColors_1.AppColors.liveGreen}33`
1344
- : `${AppColors_1.AppColors.amber600}33`,
1345
- padding: 12,
1346
- marginBottom: 10,
1230
+ {/* Sleek Interactive Dropdown Picker */}
1231
+ <react_native_1.View style={{ marginTop: 6, gap: 6 }}>
1232
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={`Default opening tab: ${allModules.find(m => m.key === defaultTab)?.label || 'APIs'}`} onPress={() => setIsDefaultTabDropdownOpen(prev => !prev)} style={{
1233
+ flexDirection: 'row',
1234
+ alignItems: 'center',
1235
+ justifyContent: 'space-between',
1236
+ backgroundColor: AppColors_1.AppColors.grayBackground,
1237
+ borderRadius: 10,
1238
+ borderWidth: 1.5,
1239
+ borderColor: isDefaultTabDropdownOpen
1240
+ ? AppColors_1.AppColors.purple
1241
+ : AppColors_1.AppColors.grayBorderSecondary,
1242
+ paddingHorizontal: 14,
1243
+ paddingVertical: 11,
1244
+ }}>
1245
+ <react_native_1.View style={{
1347
1246
  flexDirection: 'row',
1348
1247
  alignItems: 'center',
1349
1248
  gap: 10,
1249
+ flex: 1,
1350
1250
  }}>
1351
- <react_native_1.View style={{
1251
+ <react_native_1.View style={{
1352
1252
  width: 8,
1353
1253
  height: 8,
1354
1254
  borderRadius: 4,
1355
- backgroundColor: isPersistent
1356
- ? AppColors_1.AppColors.green500
1357
- : AppColors_1.AppColors.amber600,
1255
+ backgroundColor: AppColors_1.AppColors.purple,
1358
1256
  }}/>
1359
- <react_native_1.View style={{ flex: 1 }}>
1360
- <react_native_1.Text style={{
1257
+ <react_native_1.Text style={{
1361
1258
  fontFamily: AppFonts_1.AppFonts.interBold,
1362
- fontSize: 12,
1363
- lineHeight: 16,
1364
- color: isPersistent
1365
- ? AppColors_1.AppColors.green700
1366
- : AppColors_1.AppColors.amber800,
1367
- }}>
1368
- {isPersistent
1369
- ? t('settings.general.storageStatusEnabled', {
1370
- type: storage ? 'Custom Storage' : 'iOS NSUserDefaults',
1371
- })
1372
- : t('settings.general.storageStatusDisabled')}
1373
- </react_native_1.Text>
1374
- <react_native_1.Text style={{
1375
- fontFamily: AppFonts_1.AppFonts.interRegular,
1376
- fontSize: 10.5,
1377
- lineHeight: 14,
1378
- color: isPersistent
1379
- ? AppColors_1.AppColors.green800
1380
- : AppColors_1.AppColors.amber800,
1381
- marginTop: 2,
1382
- opacity: 0.85,
1383
- }}>
1384
- {isPersistent
1385
- ? t('settings.general.storageStatusEnabledDesc')
1386
- : t('settings.general.storageStatusDisabledDesc')}
1387
- </react_native_1.Text>
1388
- </react_native_1.View>
1389
- </react_native_1.View>
1390
- </react_native_1.ScrollView>
1259
+ fontSize: 13.5,
1260
+ lineHeight: 18,
1261
+ color: AppColors_1.AppColors.primaryBlack,
1262
+ }}>
1263
+ {allModules.find(m => m.key === defaultTab)?.label || 'APIs (Network)'}
1264
+ </react_native_1.Text>
1265
+ <react_native_1.View style={{
1266
+ backgroundColor: `${AppColors_1.AppColors.purple}14`,
1267
+ paddingHorizontal: 6,
1268
+ paddingVertical: 1.5,
1269
+ borderRadius: 6,
1270
+ }}>
1271
+ <react_native_1.Text style={{
1272
+ fontFamily: AppFonts_1.AppFonts.interBold,
1273
+ fontSize: 8.5,
1274
+ color: AppColors_1.AppColors.purple,
1275
+ }}>
1276
+ DEFAULT
1277
+ </react_native_1.Text>
1278
+ </react_native_1.View>
1279
+ </react_native_1.View>
1391
1280
 
1392
- {/* Bottom Sticky Action Bar for Save Changes */}
1393
- {settingsActiveSubTab === 'module' && (<react_native_1.View style={{
1394
- paddingHorizontal: 16,
1395
- paddingTop: 12,
1396
- paddingBottom: react_native_1.Platform.OS === 'ios' ? 26 : 14,
1281
+ <react_native_1.View style={{
1282
+ transform: [
1283
+ { rotate: isDefaultTabDropdownOpen ? '180deg' : '0deg' },
1284
+ ],
1285
+ }}>
1286
+ <NetworkIcons_1.ChevronDownIcon color={AppColors_1.AppColors.grayText} size={15}/>
1287
+ </react_native_1.View>
1288
+ </TouchableScale_1.default>
1289
+
1290
+ {/* Dropdown Options List */}
1291
+ {isDefaultTabDropdownOpen && (<react_native_1.View style={{
1397
1292
  backgroundColor: AppColors_1.AppColors.primaryLight,
1398
- borderTopWidth: 1,
1399
- borderTopColor: AppColors_1.AppColors.dividerColor,
1400
- flexDirection: 'row',
1401
- alignItems: 'center',
1402
- gap: 12,
1293
+ borderRadius: 10,
1294
+ borderWidth: 1,
1295
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1296
+ overflow: 'hidden',
1403
1297
  shadowColor: AppColors_1.AppColors.black,
1404
1298
  shadowOpacity: 0.08,
1405
- shadowRadius: 8,
1406
- shadowOffset: { width: 0, height: -3 },
1407
- elevation: 8,
1299
+ shadowRadius: 6,
1300
+ shadowOffset: { width: 0, height: 3 },
1301
+ elevation: 4,
1408
1302
  }}>
1303
+ {allModules
1304
+ .filter(tab => tab.key === 'apis' ||
1305
+ stagedTabVisibility?.[tab.key] ||
1306
+ tabVisibility?.[tab.key])
1307
+ .map((tab, idx, arr) => {
1308
+ const isActive = defaultTab === tab.key;
1309
+ const isLast = idx === arr.length - 1;
1310
+ return (<TouchableScale_1.default key={tab.key} accessible={true} accessibilityRole="button" accessibilityLabel={`Select ${tab.label} as default tab`} onPress={() => {
1311
+ setDefaultTab(tab.key);
1312
+ setIsDefaultTabDropdownOpen(false);
1313
+ }} style={{
1314
+ flexDirection: 'row',
1315
+ alignItems: 'center',
1316
+ justifyContent: 'space-between',
1317
+ paddingHorizontal: 14,
1318
+ paddingVertical: 11,
1319
+ backgroundColor: isActive
1320
+ ? `${AppColors_1.AppColors.purple}0F`
1321
+ : 'transparent',
1322
+ borderBottomWidth: isLast ? 0 : 1,
1323
+ borderBottomColor: AppColors_1.AppColors.dividerColor,
1324
+ }}>
1325
+ <react_native_1.View style={{
1326
+ flexDirection: 'row',
1327
+ alignItems: 'center',
1328
+ gap: 10,
1329
+ }}>
1330
+ <react_native_1.View style={{
1331
+ width: 6,
1332
+ height: 6,
1333
+ borderRadius: 3,
1334
+ backgroundColor: isActive
1335
+ ? AppColors_1.AppColors.purple
1336
+ : AppColors_1.AppColors.grayTextWeak,
1337
+ }}/>
1338
+ <react_native_1.Text style={{
1339
+ fontFamily: isActive
1340
+ ? AppFonts_1.AppFonts.interBold
1341
+ : AppFonts_1.AppFonts.interMedium,
1342
+ fontSize: 13,
1343
+ color: isActive
1344
+ ? AppColors_1.AppColors.purple
1345
+ : AppColors_1.AppColors.primaryBlack,
1346
+ }}>
1347
+ {tab.label}
1348
+ </react_native_1.Text>
1349
+ </react_native_1.View>
1350
+ {isActive && (<NetworkIcons_1.CheckIcon size={14} color={AppColors_1.AppColors.purple}/>)}
1351
+ </TouchableScale_1.default>);
1352
+ })}
1353
+ </react_native_1.View>)}
1354
+ </react_native_1.View>
1355
+ </react_native_1.View>
1356
+ </react_native_1.View>)}
1357
+ <react_native_1.View style={{ height: 48 }}/>
1358
+ </react_native_1.ScrollView>
1359
+
1360
+ {/* Bottom Sticky Action Bar for Save Changes */}
1361
+ {settingsActiveSubTab === 'module' && (<react_native_1.View style={{
1362
+ paddingHorizontal: 16,
1363
+ paddingTop: 12,
1364
+ paddingBottom: react_native_1.Platform.OS === 'ios' ? 36 : 24,
1365
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1366
+ borderTopWidth: 1,
1367
+ borderTopColor: AppColors_1.AppColors.dividerColor,
1368
+ flexDirection: 'row',
1369
+ alignItems: 'center',
1370
+ gap: 12,
1371
+ shadowColor: AppColors_1.AppColors.black,
1372
+ shadowOpacity: 0.08,
1373
+ shadowRadius: 8,
1374
+ shadowOffset: { width: 0, height: -3 },
1375
+ elevation: 8,
1376
+ }}>
1409
1377
  <react_native_1.View style={{ flex: 1 }}>
1410
1378
  <react_native_1.Text style={{
1411
- fontFamily: AppFonts_1.AppFonts.interBold,
1412
- fontSize: 13,
1413
- lineHeight: 17,
1414
- color: AppColors_1.AppColors.primaryBlack,
1415
- }}>
1379
+ fontFamily: AppFonts_1.AppFonts.interBold,
1380
+ fontSize: 13,
1381
+ lineHeight: 17,
1382
+ color: AppColors_1.AppColors.primaryBlack,
1383
+ }}>
1416
1384
  {stagedActiveCount} of {allModules.length} Modules Active
1417
1385
  </react_native_1.Text>
1418
1386
  <react_native_1.Text style={{
1419
- fontFamily: AppFonts_1.AppFonts.interRegular,
1420
- fontSize: 11,
1421
- lineHeight: 15,
1422
- color: hasUnsavedChanges
1423
- ? AppColors_1.AppColors.purple
1424
- : AppColors_1.AppColors.grayText,
1425
- marginTop: 1,
1426
- }}>
1387
+ fontFamily: AppFonts_1.AppFonts.interRegular,
1388
+ fontSize: 11,
1389
+ lineHeight: 15,
1390
+ color: hasUnsavedChanges
1391
+ ? AppColors_1.AppColors.purple
1392
+ : AppColors_1.AppColors.grayText,
1393
+ marginTop: 1,
1394
+ }}>
1427
1395
  {hasUnsavedChanges
1428
- ? t('settings.unsavedPending')
1429
- : t('settings.allSynchronized')}
1396
+ ? t('settings.unsavedPending')
1397
+ : t('settings.allSynchronized')}
1430
1398
  </react_native_1.Text>
1431
1399
  </react_native_1.View>
1432
1400
 
1433
1401
  <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel="Save Changes" onPress={handleSaveChanges} style={{
1434
- flexDirection: 'row',
1435
- alignItems: 'center',
1436
- gap: 6,
1437
- backgroundColor: hasUnsavedChanges
1438
- ? AppColors_1.AppColors.purple
1439
- : `${AppColors_1.AppColors.purple}22`,
1440
- paddingHorizontal: 18,
1441
- paddingVertical: 10,
1442
- borderRadius: 10,
1443
- }}>
1402
+ flexDirection: 'row',
1403
+ alignItems: 'center',
1404
+ gap: 6,
1405
+ backgroundColor: hasUnsavedChanges
1406
+ ? AppColors_1.AppColors.purple
1407
+ : `${AppColors_1.AppColors.purple}22`,
1408
+ paddingHorizontal: 18,
1409
+ paddingVertical: 10,
1410
+ borderRadius: 10,
1411
+ }}>
1444
1412
  <NetworkIcons_1.CheckIcon size={14} color={hasUnsavedChanges ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple}/>
1445
1413
  <react_native_1.Text style={{
1446
- fontFamily: AppFonts_1.AppFonts.interBold,
1447
- fontSize: 13,
1448
- lineHeight: 17,
1449
- color: hasUnsavedChanges ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple,
1450
- }}>
1414
+ fontFamily: AppFonts_1.AppFonts.interBold,
1415
+ fontSize: 13,
1416
+ lineHeight: 17,
1417
+ color: hasUnsavedChanges ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple,
1418
+ }}>
1451
1419
  {t('settings.saveChanges')}
1452
1420
  </react_native_1.Text>
1453
1421
  </TouchableScale_1.default>
1454
1422
  </react_native_1.View>)}
1455
1423
  </react_native_1.View>);
1456
- }
1457
- const goBackToMain = () => {
1458
- (0, InspectorContext_1.animateNextLayout)();
1459
- setSettingsPage('main');
1460
- };
1461
- // Helper: settings row with icon + label + optional description
1462
- const renderSettingRow = (opts) => (<react_native_1.View style={{
1463
- paddingVertical: 12,
1464
- borderBottomWidth: opts.isLast ? 0 : 1,
1465
- borderBottomColor: AppColors_1.AppColors.dividerColor,
1466
- }}>
1467
- <TouchableScale_1.default disabled={!opts.onPress} onPress={opts.onPress} style={{
1468
- flexDirection: 'row',
1469
- alignItems: 'center',
1470
- gap: 12,
1471
- }}>
1472
- <react_native_1.View style={{
1473
- width: 36,
1474
- height: 36,
1475
- borderRadius: 10,
1476
- backgroundColor: AppColors_1.AppColors.purpleShade50,
1477
- borderWidth: 1,
1478
- borderColor: `${AppColors_1.AppColors.purple}2E`,
1479
- alignItems: 'center',
1480
- justifyContent: 'center',
1481
- }}>
1482
- {opts.icon}
1483
- </react_native_1.View>
1484
- <react_native_1.View style={{ flex: 1 }}>
1485
- <react_native_1.Text style={{
1486
- fontFamily: AppFonts_1.AppFonts.interBold,
1487
- fontSize: 14,
1488
- lineHeight: 18,
1489
- color: AppColors_1.AppColors.primaryBlack,
1490
- }}>
1491
- {opts.label}
1492
- </react_native_1.Text>
1493
- {opts.description ? (<react_native_1.Text style={{
1494
- fontFamily: AppFonts_1.AppFonts.interRegular,
1495
- fontSize: 11,
1496
- lineHeight: 15,
1497
- color: AppColors_1.AppColors.grayText,
1498
- marginTop: 1,
1499
- }}>
1500
- {opts.description}
1501
- </react_native_1.Text>) : null}
1502
- </react_native_1.View>
1503
- {opts.right || null}
1504
- </TouchableScale_1.default>
1505
- {opts.picker && (<react_native_1.View style={{
1506
- flexDirection: 'row',
1507
- backgroundColor: AppColors_1.AppColors.grayBackground,
1508
- borderRadius: 8,
1509
- padding: 2.5,
1510
- marginTop: 10,
1511
- borderWidth: 1,
1512
- borderColor: AppColors_1.AppColors.dividerColor,
1513
- }}>
1514
- {opts.picker.options.map(opt => {
1515
- const isActive = opts.picker.selectedValue === opt;
1516
- return (<TouchableScale_1.default key={String(opt)} onPress={() => opts.picker.onSelect(opt)} style={{
1517
- flex: 1,
1518
- paddingVertical: 6,
1519
- alignItems: 'center',
1520
- borderRadius: 6,
1521
- backgroundColor: isActive
1522
- ? AppColors_1.AppColors.purple
1523
- : 'transparent',
1524
- }}>
1525
- <react_native_1.Text style={{
1526
- fontFamily: AppFonts_1.AppFonts.interBold,
1527
- fontSize: 11,
1528
- lineHeight: 14,
1529
- color: isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayText,
1530
- }}>
1531
- {opts.picker.formatLabel
1532
- ? opts.picker.formatLabel(opt)
1533
- : opt}
1534
- </react_native_1.Text>
1535
- </TouchableScale_1.default>);
1536
- })}
1537
- </react_native_1.View>)}
1538
- </react_native_1.View>);
1539
1424
  let content = null;
1540
1425
  let title = '';
1541
1426
  let icon = null;
@@ -1544,7 +1429,7 @@ const SettingsPanel = () => {
1544
1429
  title = t('settings.apis.title');
1545
1430
  icon = <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.white} size={16}/>;
1546
1431
  rightInfo = t('settings.apis.total', { count: logs.length });
1547
- content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
1432
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
1548
1433
  <react_native_1.View style={{
1549
1434
  backgroundColor: AppColors_1.AppColors.primaryLight,
1550
1435
  padding: 16,
@@ -1556,10 +1441,12 @@ const SettingsPanel = () => {
1556
1441
  icon: <NetworkIcons_1.SignalIcon color={AppColors_1.AppColors.purple} size={16}/>,
1557
1442
  label: t('settings.apis.maxRequestLogs'),
1558
1443
  description: t('settings.apis.maxRequestLogsDescription'),
1559
- picker: {
1560
- options: [50, 100, 200, 500],
1561
- selectedValue: maxNetworkLogs,
1562
- onSelect: setMaxNetworkLogs,
1444
+ numericInput: {
1445
+ value: maxNetworkLogs,
1446
+ onChange: setMaxNetworkLogs,
1447
+ min: 10,
1448
+ max: 100,
1449
+ placeholder: 'Enter max requests (10-100)',
1563
1450
  },
1564
1451
  isLast: true,
1565
1452
  })}
@@ -1601,13 +1488,14 @@ const SettingsPanel = () => {
1601
1488
  </react_native_1.View>),
1602
1489
  })}
1603
1490
  </react_native_1.View>
1491
+ <react_native_1.View style={{ height: 48 }}/>
1604
1492
  </react_native_1.ScrollView>);
1605
1493
  }
1606
1494
  else if (settingsPage === 'logs') {
1607
1495
  title = t('settings.logs.title');
1608
1496
  icon = <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.white} size={16}/>;
1609
1497
  rightInfo = t('settings.logs.total', { count: consoleLogs.length });
1610
- content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
1498
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
1611
1499
  <react_native_1.View style={{
1612
1500
  backgroundColor: AppColors_1.AppColors.primaryLight,
1613
1501
  padding: 16,
@@ -1620,10 +1508,12 @@ const SettingsPanel = () => {
1620
1508
  icon: <NetworkIcons_1.TerminalIcon color={AppColors_1.AppColors.purple} size={16}/>,
1621
1509
  label: t('settings.logs.maxConsoleLogs'),
1622
1510
  description: t('settings.logs.maxConsoleLogsDescription'),
1623
- picker: {
1624
- options: [100, 200, 500, 1000],
1625
- selectedValue: maxConsoleLogs,
1626
- onSelect: setMaxConsoleLogs,
1511
+ numericInput: {
1512
+ value: maxConsoleLogs,
1513
+ onChange: setMaxConsoleLogs,
1514
+ min: 10,
1515
+ max: 100,
1516
+ placeholder: 'Enter max logs (10-100)',
1627
1517
  },
1628
1518
  })}
1629
1519
  <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
@@ -1687,6 +1577,96 @@ const SettingsPanel = () => {
1687
1577
  })}
1688
1578
  </react_native_1.View>
1689
1579
 
1580
+ {/* Log Deduplication Card */}
1581
+ <react_native_1.View style={{
1582
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1583
+ borderRadius: 14,
1584
+ borderWidth: 1,
1585
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1586
+ overflow: 'hidden',
1587
+ padding: 16,
1588
+ gap: 14,
1589
+ }}>
1590
+ <react_native_1.Text style={{
1591
+ fontFamily: AppFonts_1.AppFonts.interBold,
1592
+ fontSize: 11,
1593
+ lineHeight: 14,
1594
+ color: AppColors_1.AppColors.grayTextWeak,
1595
+ letterSpacing: 0.8,
1596
+ }}>
1597
+ {t('settings.logFiltersDeduplication')}
1598
+ </react_native_1.Text>
1599
+
1600
+ {/* Show Duplicate Logs */}
1601
+ <react_native_1.View style={{
1602
+ flexDirection: 'row',
1603
+ alignItems: 'center',
1604
+ justifyContent: 'space-between',
1605
+ }}>
1606
+ <react_native_1.View style={{
1607
+ flexDirection: 'row',
1608
+ alignItems: 'center',
1609
+ gap: 10,
1610
+ flex: 1,
1611
+ }}>
1612
+ <react_native_1.View style={{
1613
+ width: 32,
1614
+ height: 32,
1615
+ borderRadius: 8,
1616
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
1617
+ alignItems: 'center',
1618
+ justifyContent: 'center',
1619
+ }}>
1620
+ <NetworkIcons_1.EyeIcon color={AppColors_1.AppColors.purple} size={15}/>
1621
+ </react_native_1.View>
1622
+ <react_native_1.View style={{ flex: 1 }}>
1623
+ <react_native_1.Text style={{
1624
+ fontFamily: AppFonts_1.AppFonts.interBold,
1625
+ fontSize: 13.5,
1626
+ lineHeight: 18,
1627
+ color: AppColors_1.AppColors.primaryBlack,
1628
+ }}>
1629
+ {t('settings.general.duplicateLogs')}
1630
+ </react_native_1.Text>
1631
+ <react_native_1.Text style={{
1632
+ fontFamily: AppFonts_1.AppFonts.interRegular,
1633
+ fontSize: 11,
1634
+ lineHeight: 15,
1635
+ color: AppColors_1.AppColors.grayText,
1636
+ marginTop: 1,
1637
+ }}>
1638
+ {t('settings.general.duplicateLogsDescription')}
1639
+ </react_native_1.Text>
1640
+ </react_native_1.View>
1641
+ </react_native_1.View>
1642
+
1643
+ <TouchableScale_1.default accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle show duplicate logs" accessibilityState={{ checked: showDuplicateLogs }} onPress={() => setShowDuplicateLogs(prev => !prev)} style={{
1644
+ width: 42,
1645
+ height: 24,
1646
+ borderRadius: 12,
1647
+ backgroundColor: showDuplicateLogs
1648
+ ? AppColors_1.AppColors.purple
1649
+ : AppColors_1.AppColors.grayBorderSecondary,
1650
+ padding: 2,
1651
+ justifyContent: 'center',
1652
+ alignItems: showDuplicateLogs
1653
+ ? 'flex-end'
1654
+ : 'flex-start',
1655
+ }}>
1656
+ <react_native_1.View style={{
1657
+ width: 20,
1658
+ height: 20,
1659
+ borderRadius: 10,
1660
+ backgroundColor: AppColors_1.AppColors.white,
1661
+ shadowColor: AppColors_1.AppColors.black,
1662
+ shadowOpacity: 0.18,
1663
+ shadowRadius: 2,
1664
+ shadowOffset: { width: 0, height: 1 },
1665
+ }}/>
1666
+ </TouchableScale_1.default>
1667
+ </react_native_1.View>
1668
+ </react_native_1.View>
1669
+
1690
1670
  <react_native_1.View style={{
1691
1671
  backgroundColor: AppColors_1.AppColors.primaryLight,
1692
1672
  borderRadius: 14,
@@ -1722,13 +1702,14 @@ const SettingsPanel = () => {
1722
1702
  </react_native_1.View>),
1723
1703
  })}
1724
1704
  </react_native_1.View>
1705
+ <react_native_1.View style={{ height: 48 }}/>
1725
1706
  </react_native_1.ScrollView>);
1726
1707
  }
1727
1708
  else if (settingsPage === 'analytics') {
1728
1709
  title = t('settings.analytics.title');
1729
1710
  icon = <NetworkIcons_1.AnalyticsIcon color={AppColors_1.AppColors.white} size={16}/>;
1730
1711
  rightInfo = t('settings.analytics.total', { count: analyticsEvents.length });
1731
- content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
1712
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
1732
1713
  <react_native_1.View style={{
1733
1714
  backgroundColor: AppColors_1.AppColors.primaryLight,
1734
1715
  padding: 16,
@@ -1740,6 +1721,13 @@ const SettingsPanel = () => {
1740
1721
  icon: <NetworkIcons_1.AnalyticsIcon color={AppColors_1.AppColors.purple} size={16}/>,
1741
1722
  label: t('settings.analytics.maxAnalyticsEvents'),
1742
1723
  description: t('settings.analytics.maxAnalyticsEventsDescription', { count: analyticsEvents.length }),
1724
+ numericInput: {
1725
+ value: maxAnalyticsEventsLimit,
1726
+ onChange: setMaxAnalyticsEventsLimit,
1727
+ min: 10,
1728
+ max: 75,
1729
+ placeholder: 'Enter max events (10-75)',
1730
+ },
1743
1731
  isLast: true,
1744
1732
  })}
1745
1733
  </react_native_1.View>
@@ -1779,13 +1767,14 @@ const SettingsPanel = () => {
1779
1767
  </react_native_1.View>),
1780
1768
  })}
1781
1769
  </react_native_1.View>
1770
+ <react_native_1.View style={{ height: 48 }}/>
1782
1771
  </react_native_1.ScrollView>);
1783
1772
  }
1784
1773
  else if (settingsPage === 'redux') {
1785
1774
  title = t('settings.redux.title');
1786
1775
  icon = <NetworkIcons_1.ReduxIcon color={AppColors_1.AppColors.white} size={16}/>;
1787
1776
  rightInfo = t('settings.redux.reducers', { count: Object.keys(reduxState || {}).length });
1788
- content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
1777
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
1789
1778
  <react_native_1.View style={{
1790
1779
  backgroundColor: AppColors_1.AppColors.primaryLight,
1791
1780
  padding: 16,
@@ -1867,13 +1856,14 @@ const SettingsPanel = () => {
1867
1856
  </react_native_1.View>),
1868
1857
  })}
1869
1858
  </react_native_1.View>
1859
+ <react_native_1.View style={{ height: 48 }}/>
1870
1860
  </react_native_1.ScrollView>);
1871
1861
  }
1872
1862
  else if (settingsPage === 'crash') {
1873
1863
  title = t('settings.crash.title');
1874
1864
  icon = <NetworkIcons_1.CrashIcon color={AppColors_1.AppColors.white} size={16}/>;
1875
1865
  rightInfo = `Total: ${crashRecords?.length || 0}`;
1876
- content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
1866
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
1877
1867
  <react_native_1.View style={{
1878
1868
  backgroundColor: AppColors_1.AppColors.primaryLight,
1879
1869
  padding: 16,
@@ -1886,10 +1876,12 @@ const SettingsPanel = () => {
1886
1876
  icon: <NetworkIcons_1.LayersIcon color={AppColors_1.AppColors.purple} size={16}/>,
1887
1877
  label: t('settings.crash.maxCrashLogs'),
1888
1878
  description: t('settings.crash.maxCrashLogsDesc'),
1889
- picker: {
1890
- options: [25, 50, 100, 200],
1891
- selectedValue: maxCrashLogs || 100,
1892
- onSelect: val => setMaxCrashLogs(val),
1879
+ numericInput: {
1880
+ value: maxCrashLogs,
1881
+ onChange: setMaxCrashLogs,
1882
+ min: 5,
1883
+ max: 50,
1884
+ placeholder: 'Enter max crashes (5-50)',
1893
1885
  },
1894
1886
  })}
1895
1887
  <react_native_1.View style={{ height: 1, backgroundColor: AppColors_1.AppColors.dividerColor }}/>
@@ -1951,13 +1943,14 @@ const SettingsPanel = () => {
1951
1943
  </react_native_1.View>),
1952
1944
  })}
1953
1945
  </react_native_1.View>
1946
+ <react_native_1.View style={{ height: 48 }}/>
1954
1947
  </react_native_1.ScrollView>);
1955
1948
  }
1956
1949
  else if (settingsPage === 'bundle') {
1957
1950
  title = t('settings.bundle.title');
1958
1951
  icon = <NetworkIcons_1.PackageIcon color={AppColors_1.AppColors.white} size={16}/>;
1959
1952
  rightInfo = 'Metro';
1960
- content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
1953
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
1961
1954
  <react_native_1.View style={{
1962
1955
  backgroundColor: AppColors_1.AppColors.primaryLight,
1963
1956
  padding: 16,
@@ -2034,13 +2027,14 @@ const SettingsPanel = () => {
2034
2027
  </react_native_1.View>),
2035
2028
  })}
2036
2029
  </react_native_1.View>
2030
+ <react_native_1.View style={{ height: 48 }}/>
2037
2031
  </react_native_1.ScrollView>);
2038
2032
  }
2039
2033
  else if (settingsPage === 'performance') {
2040
2034
  title = t('settings.performance.title');
2041
2035
  icon = <NetworkIcons_1.PerformanceIcon color={AppColors_1.AppColors.white} size={16}/>;
2042
2036
  rightInfo = '60 FPS Target';
2043
- content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, gap: 12 }}>
2037
+ content = (<react_native_1.ScrollView style={{ flex: 1 }} contentContainerStyle={{ padding: 16, paddingBottom: 100, gap: 12 }}>
2044
2038
  <react_native_1.View style={{
2045
2039
  backgroundColor: AppColors_1.AppColors.primaryLight,
2046
2040
  padding: 16,
@@ -2117,65 +2111,51 @@ const SettingsPanel = () => {
2117
2111
  </react_native_1.View>),
2118
2112
  })}
2119
2113
  </react_native_1.View>
2114
+ <react_native_1.View style={{ height: 48 }}/>
2120
2115
  </react_native_1.ScrollView>);
2121
2116
  }
2117
+ const subPageAnim = (0, react_1.useRef)(new react_native_1.Animated.Value(0)).current;
2118
+ (0, react_1.useEffect)(() => {
2119
+ if (settingsPage !== 'main') {
2120
+ subPageAnim.setValue(0);
2121
+ react_native_1.Animated.spring(subPageAnim, {
2122
+ toValue: 1,
2123
+ friction: 8,
2124
+ tension: 65,
2125
+ useNativeDriver: true,
2126
+ }).start();
2127
+ }
2128
+ }, [settingsPage]);
2122
2129
  return (<react_native_1.View style={{
2123
2130
  flex: 1,
2124
2131
  backgroundColor: AppColors_1.AppColors.grayBackground,
2125
2132
  }}>
2126
- <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}>
2127
- <react_native_1.View style={{ paddingTop: headerTopPadding, width: '100%' }}>
2128
- <react_native_1.View style={[styles_1.default.header, { paddingHorizontal: 16, gap: 12 }]}>
2129
- <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={t('settings.back')} onPress={goBackToMain} hitSlop={12} style={{
2130
- padding: 8,
2131
- borderRadius: 10,
2132
- backgroundColor: `${AppColors_1.AppColors.white}26`,
2133
- borderWidth: 1,
2134
- borderColor: `${AppColors_1.AppColors.white}14`,
2135
- }}>
2136
- <NetworkIcons_1.WhiteBackNavigation color={AppColors_1.AppColors.white} size={16}/>
2137
- </TouchableScale_1.default>
2138
- {icon && (<react_native_1.View style={{
2139
- width: 30,
2140
- height: 30,
2141
- borderRadius: 8,
2142
- backgroundColor: `${AppColors_1.AppColors.white}26`,
2143
- alignItems: 'center',
2144
- justifyContent: 'center',
2145
- }}>
2146
- {icon}
2147
- </react_native_1.View>)}
2148
- <react_native_1.View style={{ flex: 1 }}>
2149
- <react_native_1.Text style={{
2150
- fontFamily: AppFonts_1.AppFonts.interBold,
2151
- fontSize: 17,
2152
- lineHeight: 22,
2153
- color: AppColors_1.AppColors.white,
2154
- }}>
2155
- {title}
2156
- </react_native_1.Text>
2157
- </react_native_1.View>
2158
- {rightInfo ? (<react_native_1.View style={{
2159
- backgroundColor: `${AppColors_1.AppColors.white}26`,
2160
- paddingHorizontal: 8,
2161
- paddingVertical: 4,
2162
- borderRadius: 8,
2163
- borderWidth: 1,
2164
- borderColor: `${AppColors_1.AppColors.white}1A`,
2165
- }}>
2166
- <react_native_1.Text style={{
2167
- fontFamily: AppFonts_1.AppFonts.interBold,
2168
- fontSize: 11,
2169
- lineHeight: 14,
2170
- color: AppColors_1.AppColors.white,
2171
- }}>
2172
- {rightInfo}
2173
- </react_native_1.Text>
2174
- </react_native_1.View>) : null}
2175
- </react_native_1.View>
2176
- </react_native_1.View>
2177
- </react_native_linear_gradient_1.default>
2178
- {content}
2133
+ {/* ─── Persistent Main Settings (Retains 100% scroll position) ─── */}
2134
+ <react_native_1.View style={[
2135
+ react_native_1.StyleSheet.absoluteFill,
2136
+ settingsPage !== 'main' && { pointerEvents: 'none' },
2137
+ ]}>
2138
+ {renderMainSettingsContent()}
2139
+ </react_native_1.View>
2140
+
2141
+ {/* ─── Sub-module Settings Overlay (Smooth Animated Slide) ─── */}
2142
+ {settingsPage !== 'main' && (<react_native_1.Animated.View style={[
2143
+ react_native_1.StyleSheet.absoluteFill,
2144
+ {
2145
+ backgroundColor: AppColors_1.AppColors.grayBackground,
2146
+ opacity: subPageAnim,
2147
+ transform: [
2148
+ {
2149
+ translateX: subPageAnim.interpolate({
2150
+ inputRange: [0, 1],
2151
+ outputRange: [30, 0],
2152
+ }),
2153
+ },
2154
+ ],
2155
+ },
2156
+ ]}>
2157
+ {content}
2158
+ </react_native_1.Animated.View>)}
2179
2159
  </react_native_1.View>);
2180
2160
  };
2181
2161
  exports.default = SettingsPanel;