react-native-inapp-inspector 2.0.0 → 2.0.2

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