react-native-inapp-inspector 2.3.14 → 2.3.16

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 (125) hide show
  1. package/README.md +1 -0
  2. package/dist/commonjs/components/AnimatedEntrance.js +3 -3
  3. package/dist/commonjs/components/ConsoleLogCard.js +174 -100
  4. package/dist/commonjs/components/Inspector/AnalyticsTab.js +0 -22
  5. package/dist/commonjs/components/Inspector/ConsoleTab.js +25 -38
  6. package/dist/commonjs/components/Inspector/CrashTab.js +19 -28
  7. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +198 -98
  8. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +7 -0
  9. package/dist/commonjs/components/Inspector/FeedbackModal.js +552 -0
  10. package/dist/commonjs/components/Inspector/InspectorHeader.js +58 -6
  11. package/dist/commonjs/components/Inspector/MainScreen.js +100 -58
  12. package/dist/commonjs/components/Inspector/NetworkTab.js +26 -371
  13. package/dist/commonjs/components/Inspector/NpmStarPrompt.d.ts +3 -0
  14. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +494 -0
  15. package/dist/commonjs/components/Inspector/PerformanceTab.js +40 -7
  16. package/dist/commonjs/components/Inspector/ReduxTab.js +3 -23
  17. package/dist/commonjs/components/Inspector/SettingsPanel.js +1035 -173
  18. package/dist/commonjs/components/Inspector/StorageTab.js +23 -28
  19. package/dist/commonjs/components/Inspector/TabBar.js +50 -15
  20. package/dist/commonjs/components/JsonViewer.js +14 -2
  21. package/dist/commonjs/components/LogCard.js +428 -227
  22. package/dist/commonjs/components/NetworkIcons.d.ts +5 -0
  23. package/dist/commonjs/components/NetworkIcons.js +33 -2
  24. package/dist/commonjs/constants/version.d.ts +1 -1
  25. package/dist/commonjs/constants/version.js +1 -1
  26. package/dist/commonjs/customHooks/analyticsLogger.js +1 -1
  27. package/dist/commonjs/customHooks/consoleLogger.js +34 -2
  28. package/dist/commonjs/customHooks/crashHandler.js +1 -1
  29. package/dist/commonjs/customHooks/networkLogger.js +184 -26
  30. package/dist/commonjs/helpers/index.d.ts +1 -0
  31. package/dist/commonjs/helpers/index.js +1 -0
  32. package/dist/commonjs/helpers/remoteConfig.d.ts +4 -0
  33. package/dist/commonjs/helpers/remoteConfig.js +165 -0
  34. package/dist/commonjs/helpers/searchQueryParser.d.ts +1 -1
  35. package/dist/commonjs/helpers/searchQueryParser.js +39 -291
  36. package/dist/commonjs/helpers/telemetry.d.ts +5 -0
  37. package/dist/commonjs/helpers/telemetry.js +339 -8
  38. package/dist/commonjs/index.d.ts +1 -0
  39. package/dist/commonjs/index.js +173 -29
  40. package/dist/commonjs/styles/AppFonts.d.ts +2 -0
  41. package/dist/commonjs/styles/AppFonts.js +1 -0
  42. package/dist/commonjs/styles/index.d.ts +22 -0
  43. package/dist/commonjs/styles/index.js +19 -0
  44. package/dist/commonjs/types/enums.d.ts +1 -0
  45. package/dist/commonjs/types/enums.js +1 -0
  46. package/dist/commonjs/types/interfaces.d.ts +12 -0
  47. package/dist/esm/components/AnimatedEntrance.js +3 -3
  48. package/dist/esm/components/ConsoleLogCard.js +141 -100
  49. package/dist/esm/components/Inspector/AnalyticsTab.js +1 -23
  50. package/dist/esm/components/Inspector/ConsoleTab.js +26 -39
  51. package/dist/esm/components/Inspector/CrashTab.js +20 -29
  52. package/dist/esm/components/Inspector/DeviceInfoTab.js +198 -98
  53. package/dist/esm/components/Inspector/FeedbackModal.d.ts +7 -0
  54. package/dist/esm/components/Inspector/FeedbackModal.js +515 -0
  55. package/dist/esm/components/Inspector/InspectorHeader.js +60 -8
  56. package/dist/esm/components/Inspector/MainScreen.js +101 -59
  57. package/dist/esm/components/Inspector/NetworkTab.js +27 -372
  58. package/dist/esm/components/Inspector/NpmStarPrompt.d.ts +3 -0
  59. package/dist/esm/components/Inspector/NpmStarPrompt.js +454 -0
  60. package/dist/esm/components/Inspector/PerformanceTab.js +40 -7
  61. package/dist/esm/components/Inspector/ReduxTab.js +4 -24
  62. package/dist/esm/components/Inspector/SettingsPanel.js +1038 -176
  63. package/dist/esm/components/Inspector/StorageTab.js +23 -28
  64. package/dist/esm/components/Inspector/TabBar.js +50 -15
  65. package/dist/esm/components/JsonViewer.js +14 -2
  66. package/dist/esm/components/LogCard.js +422 -221
  67. package/dist/esm/components/NetworkIcons.d.ts +5 -0
  68. package/dist/esm/components/NetworkIcons.js +26 -0
  69. package/dist/esm/constants/version.d.ts +1 -1
  70. package/dist/esm/constants/version.js +1 -1
  71. package/dist/esm/customHooks/analyticsLogger.js +1 -1
  72. package/dist/esm/customHooks/consoleLogger.js +34 -2
  73. package/dist/esm/customHooks/crashHandler.js +1 -1
  74. package/dist/esm/customHooks/networkLogger.js +184 -26
  75. package/dist/esm/helpers/index.d.ts +1 -0
  76. package/dist/esm/helpers/index.js +1 -0
  77. package/dist/esm/helpers/remoteConfig.d.ts +4 -0
  78. package/dist/esm/helpers/remoteConfig.js +160 -0
  79. package/dist/esm/helpers/searchQueryParser.d.ts +1 -1
  80. package/dist/esm/helpers/searchQueryParser.js +39 -291
  81. package/dist/esm/helpers/telemetry.d.ts +5 -0
  82. package/dist/esm/helpers/telemetry.js +332 -9
  83. package/dist/esm/index.d.ts +1 -0
  84. package/dist/esm/index.js +171 -29
  85. package/dist/esm/styles/AppFonts.d.ts +2 -0
  86. package/dist/esm/styles/AppFonts.js +1 -0
  87. package/dist/esm/styles/index.d.ts +22 -0
  88. package/dist/esm/styles/index.js +19 -0
  89. package/dist/esm/types/enums.d.ts +1 -0
  90. package/dist/esm/types/enums.js +1 -0
  91. package/dist/esm/types/interfaces.d.ts +12 -0
  92. package/package.json +1 -1
  93. package/src/components/AnimatedEntrance.tsx +3 -3
  94. package/src/components/ConsoleLogCard.tsx +154 -103
  95. package/src/components/Inspector/AnalyticsTab.tsx +0 -23
  96. package/src/components/Inspector/ConsoleTab.tsx +27 -41
  97. package/src/components/Inspector/CrashTab.tsx +19 -28
  98. package/src/components/Inspector/DeviceInfoTab.tsx +224 -102
  99. package/src/components/Inspector/FeedbackModal.tsx +626 -0
  100. package/src/components/Inspector/InspectorHeader.tsx +83 -5
  101. package/src/components/Inspector/MainScreen.tsx +61 -6
  102. package/src/components/Inspector/NetworkTab.tsx +70 -480
  103. package/src/components/Inspector/NpmStarPrompt.tsx +532 -0
  104. package/src/components/Inspector/PerformanceTab.tsx +44 -8
  105. package/src/components/Inspector/ReduxTab.tsx +9 -24
  106. package/src/components/Inspector/SettingsPanel.tsx +1162 -197
  107. package/src/components/Inspector/StorageTab.tsx +27 -30
  108. package/src/components/Inspector/TabBar.tsx +57 -20
  109. package/src/components/JsonViewer.tsx +15 -2
  110. package/src/components/LogCard.tsx +528 -339
  111. package/src/components/NetworkIcons.tsx +92 -0
  112. package/src/constants/version.ts +1 -1
  113. package/src/customHooks/analyticsLogger.ts +1 -1
  114. package/src/customHooks/consoleLogger.ts +36 -3
  115. package/src/customHooks/crashHandler.ts +1 -1
  116. package/src/customHooks/networkLogger.ts +214 -26
  117. package/src/helpers/index.ts +1 -0
  118. package/src/helpers/remoteConfig.ts +212 -0
  119. package/src/helpers/searchQueryParser.ts +42 -284
  120. package/src/helpers/telemetry.ts +381 -10
  121. package/src/index.tsx +374 -211
  122. package/src/styles/AppFonts.ts +2 -0
  123. package/src/styles/index.ts +20 -1
  124. package/src/types/enums.ts +1 -0
  125. package/src/types/interfaces.ts +12 -0
@@ -45,7 +45,6 @@ const AnimatedEntrance_1 = __importDefault(require("../AnimatedEntrance"));
45
45
  const EndOfListFooter_1 = __importDefault(require("../EndOfListFooter"));
46
46
  const FeatureUnderDevNotice_1 = __importDefault(require("./FeatureUnderDevNotice"));
47
47
  const HighlightText_1 = __importDefault(require("../HighlightText"));
48
- const styles_1 = __importDefault(require("../../styles"));
49
48
  const AppColors_1 = require("../../styles/AppColors");
50
49
  const AppFonts_1 = require("../../styles/AppFonts");
51
50
  const crashHandler_1 = require("../../customHooks/crashHandler");
@@ -425,13 +424,27 @@ const CrashTab = react_1.default.memo(() => {
425
424
  <react_native_1.View style={localStyles.emptyIconCircle}>
426
425
  <NetworkIcons_1.ShieldAlertIcon size={38} color={AppColors_1.AppColors.greenColor}/>
427
426
  </react_native_1.View>
428
- <react_native_1.Text style={localStyles.emptyTitle}>{t('crash.emptyTitle')}</react_native_1.Text>
427
+ <react_native_1.Text style={localStyles.emptyTitle}>
428
+ {searchQuery.length > 0
429
+ ? 'No matching crash entries'
430
+ : filterType !== 'all' || !(0, CrashFilterModal_1.isCrashFiltersDefault)(crashFilters)
431
+ ? 'No crashes match filters'
432
+ : t('crash.emptyTitle')}
433
+ </react_native_1.Text>
429
434
  <react_native_1.Text style={localStyles.emptySub}>
430
435
  {searchQuery
431
- ? t('crash.emptySearchSubtitle')
432
- : t('crash.emptySubtitle')}
436
+ ? `No crash entries matched "${searchQuery}"`
437
+ : filterType !== 'all' || !(0, CrashFilterModal_1.isCrashFiltersDefault)(crashFilters)
438
+ ? 'Try adjusting your filters or search keywords.'
439
+ : t('crash.emptySubtitle')}
433
440
  </react_native_1.Text>
434
- {searchQuery.length > 0 && (<TouchableScale_1.default onPress={() => setSearchQuery('')} style={{
441
+ {(searchQuery.length > 0 ||
442
+ filterType !== 'all' ||
443
+ !(0, CrashFilterModal_1.isCrashFiltersDefault)(crashFilters)) && (<TouchableScale_1.default onPress={() => {
444
+ setSearchQuery('');
445
+ setFilterType('all');
446
+ setCrashFilters(CrashFilterModal_1.DEFAULT_CRASH_FILTERS);
447
+ }} style={{
435
448
  marginTop: 10,
436
449
  paddingHorizontal: 14,
437
450
  paddingVertical: 7,
@@ -443,33 +456,11 @@ const CrashTab = react_1.default.memo(() => {
443
456
  fontSize: 11.5,
444
457
  color: AppColors_1.AppColors.white,
445
458
  }}>
446
- Clear Search
459
+ Clear Search & Filters
447
460
  </react_native_1.Text>
448
461
  </TouchableScale_1.default>)}
449
462
  </react_native_1.ScrollView>) : (<>
450
463
  <react_native_1.FlatList ref={listRef} data={filteredList} keyExtractor={item => item.id} renderItem={renderCard} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} contentContainerStyle={localStyles.listContent} showsVerticalScrollIndicator={false} ListFooterComponent={<EndOfListFooter_1.default />}/>
451
-
452
- <TouchableScale_1.default onPress={() => {
453
- try {
454
- listRef.current?.scrollToOffset({
455
- offset: 0,
456
- animated: true,
457
- });
458
- }
459
- catch {
460
- try {
461
- listRef.current?.scrollToIndex({
462
- index: 0,
463
- animated: true,
464
- });
465
- }
466
- catch { }
467
- }
468
- }} hitSlop={12} style={styles_1.default.scrollTopBtn}>
469
- <react_native_1.View style={{ transform: [{ rotate: '180deg' }] }}>
470
- <NetworkIcons_1.ChevronIcon color={AppColors_1.AppColors.white} size={18}/>
471
- </react_native_1.View>
472
- </TouchableScale_1.default>
473
464
  </>)}
474
465
 
475
466
 
@@ -377,19 +377,119 @@ exports.DeviceInfoTab = react_1.default.memo(() => {
377
377
  (0, helpers_1.copyToClipboard)(md, 'Device Markdown Report');
378
378
  (0, toast_1.showToast)('Copied Markdown Report to Clipboard!');
379
379
  };
380
- const isMatch = (text) => {
380
+ const isMatch = (0, react_1.useCallback)((label, value, subtext) => {
381
381
  if (!search.trim())
382
382
  return true;
383
- return text.toLowerCase().includes(search.toLowerCase().trim());
384
- };
383
+ const query = search.toLowerCase().trim();
384
+ const strVal = value != null
385
+ ? typeof value === 'object'
386
+ ? JSON.stringify(value)
387
+ : String(value)
388
+ : '';
389
+ const strSub = subtext != null ? String(subtext) : '';
390
+ return (label.toLowerCase().includes(query) ||
391
+ strVal.toLowerCase().includes(query) ||
392
+ strSub.toLowerCase().includes(query));
393
+ }, [search]);
394
+ const hasHeroMatch = (0, react_1.useMemo)(() => {
395
+ if (!search.trim())
396
+ return true;
397
+ return (isMatch('Model', deviceMetrics?.deviceModel || react_native_1.Platform.constants?.Model) ||
398
+ isMatch('OS', react_native_1.Platform.OS) ||
399
+ isMatch('IP Address', ipAddress) ||
400
+ isMatch('RAM', `${usedRamMb}/${totalRamMb}`) ||
401
+ isMatch('Uptime', deviceUptime));
402
+ }, [search, isMatch, deviceMetrics, ipAddress, usedRamMb, totalRamMb, deviceUptime]);
403
+ const hasOverviewMatch = (0, react_1.useMemo)(() => {
404
+ if (!search.trim())
405
+ return true;
406
+ return (isMatch('Device Model', fullDeviceData.hardware.model) ||
407
+ isMatch('Manufacturer', fullDeviceData.hardware.brand) ||
408
+ isMatch('Operating System', fullDeviceData.hardware.osVersion) ||
409
+ isMatch('IP Address', ipAddress) ||
410
+ isMatch('RAM Memory', `${usedRamMb} MB / ${totalRamMb} MB (${ramUsagePct}%)`, `Free Memory: ${freeRamMb} MB`) ||
411
+ isMatch('Storage Capacity', `${freeStorageGb} GB Free / ${totalStorageGb} GB Total`) ||
412
+ isMatch('App Version', `v${fullDeviceData.runtime.appVersion} (${fullDeviceData.runtime.appBuild})`) ||
413
+ isMatch('JavaScript Engine', isHermes ? 'Hermes Bytecode Engine' : 'JavaScriptCore (JSC)') ||
414
+ isMatch('UDID Identifier', pseudoUDID));
415
+ }, [search, isMatch, fullDeviceData, ipAddress, usedRamMb, totalRamMb, ramUsagePct, freeRamMb, freeStorageGb, totalStorageGb, isHermes, pseudoUDID]);
416
+ const hasHardwareMatch = (0, react_1.useMemo)(() => {
417
+ if (!search.trim())
418
+ return true;
419
+ return (isMatch('CPU Architecture', fullDeviceData.hardware.cpuAbi) ||
420
+ isMatch('Total RAM', `${totalRamMb} MB`) ||
421
+ isMatch('Free RAM', `${freeRamMb} MB`) ||
422
+ isMatch('Storage Capacity', `${totalStorageGb} GB`) ||
423
+ isMatch('Available Storage', `${freeStorageGb} GB`) ||
424
+ isMatch('Battery', `${deviceMetrics?.batteryPercent ?? 100}%`) ||
425
+ isMatch('API Level', `API ${deviceMetrics?.apiLevel || react_native_1.Platform.Version}`) ||
426
+ isMatch('Thermal State', 'Nominal (Cool)'));
427
+ }, [search, isMatch, fullDeviceData, totalRamMb, freeRamMb, totalStorageGb, freeStorageGb, deviceMetrics]);
428
+ const hasNetworkMatch = (0, react_1.useMemo)(() => {
429
+ if (!search.trim())
430
+ return true;
431
+ return (isMatch('IP Address', ipAddress) ||
432
+ isMatch('Internet Reachability', 'Connected') ||
433
+ isMatch('Connection Type', 'Wi-Fi / Local Area Network') ||
434
+ isMatch('Metro Dev Server', react_native_1.NativeModules?.PlatformConstants?.serverHost || react_native_1.NativeModules?.AndroidConstants?.serverHost || 'localhost:8081') ||
435
+ isMatch('WebSocket Protocol', 'Active & Enabled') ||
436
+ isMatch('Network Inspector Interceptor', 'Intercepting XHR & Fetch'));
437
+ }, [search, isMatch, ipAddress]);
438
+ const hasDisplayMatch = (0, react_1.useMemo)(() => {
439
+ if (!search.trim())
440
+ return true;
441
+ return (isMatch('Window Resolution', `${windowDims.width.toFixed(0)} × ${windowDims.height.toFixed(0)} pt`) ||
442
+ isMatch('Screen Physical Size', `${(screenDims.width * pixelRatio).toFixed(0)} × ${(screenDims.height * pixelRatio).toFixed(0)} px`) ||
443
+ isMatch('Pixel Density', `@${pixelRatio}x (${Math.round(pixelRatio * 160)} dpi)`) ||
444
+ isMatch('Font Scale', `${fontScale}x`) ||
445
+ isMatch('Form Factor', isTablet ? 'Tablet' : 'Smartphone') ||
446
+ isMatch('Orientation', isLandscape ? 'Landscape' : 'Portrait') ||
447
+ isMatch('Status Bar Height', `${statusBarHeight} pt`));
448
+ }, [search, isMatch, windowDims, screenDims, pixelRatio, fontScale, isTablet, isLandscape, statusBarHeight]);
449
+ const hasRuntimeMatch = (0, react_1.useMemo)(() => {
450
+ if (!search.trim())
451
+ return true;
452
+ return (isMatch('App Name', fullDeviceData.runtime.appName) ||
453
+ isMatch('Bundle ID', fullDeviceData.identifiers.bundleId) ||
454
+ isMatch('App Version', `v${fullDeviceData.runtime.appVersion} (${fullDeviceData.runtime.appBuild})`) ||
455
+ isMatch('React Native', `v${reactNativeVersion}`) ||
456
+ isMatch('In-App Inspector Version', `v${constants_1.LIB_VERSION}`) ||
457
+ isMatch('Hermes Engine', isHermes ? 'Enabled (AOT Bytecode)' : 'Disabled (JSC)') ||
458
+ isMatch('New Architecture', isTurboModule ? 'Enabled' : 'Legacy Bridge') ||
459
+ isMatch('Build Type', __DEV__ ? 'Debug (__DEV__ = true)' : 'Release / Production') ||
460
+ isMatch('Timezone', fullDeviceData.runtime.timezone) ||
461
+ isMatch('Locale', fullDeviceData.runtime.locale) ||
462
+ isMatch('Session Uptime', deviceUptime));
463
+ }, [search, isMatch, fullDeviceData, reactNativeVersion, isHermes, isTurboModule, deviceUptime]);
464
+ const hasSecurityMatch = (0, react_1.useMemo)(() => {
465
+ if (!search.trim())
466
+ return true;
467
+ return (isMatch('Pseudo-UDID', pseudoUDID) ||
468
+ isMatch('Bundle ID', fullDeviceData.identifiers.bundleId) ||
469
+ isMatch('Root / Jailbreak', 'Clean (Standard Sandbox)') ||
470
+ isMatch('Simulator / Emulator', react_native_1.Platform.constants?.Model?.includes?.('sdk') || react_native_1.Platform.constants?.Model?.includes?.('Emulator') || react_native_1.Platform.constants?.Model?.includes?.('Simulator') ? 'Virtual Simulator' : 'Physical Device') ||
471
+ isMatch('Sandbox Integrity', 'Enforced by OS Kernel'));
472
+ }, [search, isMatch, pseudoUDID, fullDeviceData]);
385
473
  const hasAnyMatch = (0, react_1.useMemo)(() => {
386
474
  if (!search.trim())
387
475
  return true;
388
- const query = search.toLowerCase().trim();
389
- return (JSON.stringify(fullDeviceData).toLowerCase().includes(query) ||
390
- ipAddress.toLowerCase().includes(query) ||
391
- pseudoUDID.toLowerCase().includes(query));
392
- }, [search, fullDeviceData, ipAddress, pseudoUDID]);
476
+ return (hasHeroMatch ||
477
+ hasOverviewMatch ||
478
+ hasHardwareMatch ||
479
+ hasNetworkMatch ||
480
+ hasDisplayMatch ||
481
+ hasRuntimeMatch ||
482
+ hasSecurityMatch);
483
+ }, [
484
+ search,
485
+ hasHeroMatch,
486
+ hasOverviewMatch,
487
+ hasHardwareMatch,
488
+ hasNetworkMatch,
489
+ hasDisplayMatch,
490
+ hasRuntimeMatch,
491
+ hasSecurityMatch,
492
+ ]);
393
493
  return (<react_native_1.View style={styles.container}>
394
494
 
395
495
  <react_native_1.View style={styles.subTabsWrapper}>
@@ -434,154 +534,154 @@ exports.DeviceInfoTab = react_1.default.memo(() => {
434
534
 
435
535
  <react_native_1.ScrollView style={styles.scrollArea} contentContainerStyle={styles.scrollContent} showsVerticalScrollIndicator={false}>
436
536
 
437
- <react_native_1.View style={styles.heroCard}>
438
- <react_native_1.View style={styles.heroHeader}>
439
- <react_native_1.View style={styles.heroIconWrap}>
440
- {react_native_1.Platform.OS === 'ios' ? (<NetworkIcons_1.AppleIcon size={20} color={AppColors_1.AppColors.white}/>) : (<NetworkIcons_1.AndroidIcon size={20} color={AppColors_1.AppColors.white}/>)}
441
- </react_native_1.View>
442
- <react_native_1.View style={{ flex: 1, minWidth: 0 }}>
443
- <react_native_1.Text style={styles.heroTitle} numberOfLines={1} ellipsizeMode="tail">
444
- {deviceMetrics?.deviceModel || react_native_1.Platform.constants?.Model || (react_native_1.Platform.OS === 'ios' ? 'Apple iPhone' : 'Android Device')}
445
- </react_native_1.Text>
446
- <react_native_1.Text style={styles.heroSubtitle} numberOfLines={1} ellipsizeMode="tail">
447
- {react_native_1.Platform.OS === 'ios' ? `iOS ${react_native_1.Platform.Version}` : `Android ${react_native_1.Platform.Version} (API ${deviceMetrics?.apiLevel || react_native_1.Platform.Version})`}
448
- </react_native_1.Text>
449
- </react_native_1.View>
450
- <react_native_1.View style={styles.heroBadge}>
451
- <react_native_1.View style={styles.pulseDot}/>
452
- <react_native_1.Text style={styles.heroBadgeText}>LIVE</react_native_1.Text>
537
+ {(!search.trim() || hasHeroMatch) && (<react_native_1.View style={styles.heroCard}>
538
+ <react_native_1.View style={styles.heroHeader}>
539
+ <react_native_1.View style={styles.heroIconWrap}>
540
+ {react_native_1.Platform.OS === 'ios' ? (<NetworkIcons_1.AppleIcon size={20} color={AppColors_1.AppColors.white}/>) : (<NetworkIcons_1.AndroidIcon size={20} color={AppColors_1.AppColors.white}/>)}
541
+ </react_native_1.View>
542
+ <react_native_1.View style={{ flex: 1, minWidth: 0 }}>
543
+ <react_native_1.Text style={styles.heroTitle} numberOfLines={1} ellipsizeMode="tail">
544
+ {deviceMetrics?.deviceModel || react_native_1.Platform.constants?.Model || (react_native_1.Platform.OS === 'ios' ? 'Apple iPhone' : 'Android Device')}
545
+ </react_native_1.Text>
546
+ <react_native_1.Text style={styles.heroSubtitle} numberOfLines={1} ellipsizeMode="tail">
547
+ {react_native_1.Platform.OS === 'ios' ? `iOS ${react_native_1.Platform.Version}` : `Android ${react_native_1.Platform.Version} (API ${deviceMetrics?.apiLevel || react_native_1.Platform.Version})`}
548
+ </react_native_1.Text>
549
+ </react_native_1.View>
550
+ <react_native_1.View style={styles.heroBadge}>
551
+ <react_native_1.View style={styles.pulseDot}/>
552
+ <react_native_1.Text style={styles.heroBadgeText}>LIVE</react_native_1.Text>
553
+ </react_native_1.View>
453
554
  </react_native_1.View>
454
- </react_native_1.View>
455
555
 
456
-
457
- <react_native_1.View style={styles.heroMetricsStrip}>
458
- <react_native_1.View style={styles.heroMetricItem}>
459
- <react_native_1.Text style={styles.heroMetricLabel} numberOfLines={1} ellipsizeMode="tail">IP ADDRESS</react_native_1.Text>
460
- <react_native_1.Text style={styles.heroMetricValue} numberOfLines={1} ellipsizeMode="tail">
461
- {ipAddress}
462
- </react_native_1.Text>
463
- </react_native_1.View>
464
- <react_native_1.View style={styles.heroMetricDivider}/>
465
- <react_native_1.View style={styles.heroMetricItem}>
466
- <react_native_1.Text style={styles.heroMetricLabel} numberOfLines={1} ellipsizeMode="tail">RAM (USED/TOTAL)</react_native_1.Text>
467
- <react_native_1.Text style={styles.heroMetricValue} numberOfLines={1} ellipsizeMode="tail">
468
- {usedRamMb}/{totalRamMb} MB
469
- </react_native_1.Text>
470
- </react_native_1.View>
471
- <react_native_1.View style={styles.heroMetricDivider}/>
472
- <react_native_1.View style={styles.heroMetricItem}>
473
- <react_native_1.Text style={styles.heroMetricLabel} numberOfLines={1} ellipsizeMode="tail">UPTIME</react_native_1.Text>
474
- <react_native_1.Text style={styles.heroMetricValue} numberOfLines={1} ellipsizeMode="tail">{deviceUptime}</react_native_1.Text>
556
+
557
+ <react_native_1.View style={styles.heroMetricsStrip}>
558
+ <react_native_1.View style={styles.heroMetricItem}>
559
+ <react_native_1.Text style={styles.heroMetricLabel} numberOfLines={1} ellipsizeMode="tail">IP ADDRESS</react_native_1.Text>
560
+ <react_native_1.Text style={styles.heroMetricValue} numberOfLines={1} ellipsizeMode="tail">
561
+ {ipAddress}
562
+ </react_native_1.Text>
563
+ </react_native_1.View>
564
+ <react_native_1.View style={styles.heroMetricDivider}/>
565
+ <react_native_1.View style={styles.heroMetricItem}>
566
+ <react_native_1.Text style={styles.heroMetricLabel} numberOfLines={1} ellipsizeMode="tail">RAM (USED/TOTAL)</react_native_1.Text>
567
+ <react_native_1.Text style={styles.heroMetricValue} numberOfLines={1} ellipsizeMode="tail">
568
+ {usedRamMb}/{totalRamMb} MB
569
+ </react_native_1.Text>
570
+ </react_native_1.View>
571
+ <react_native_1.View style={styles.heroMetricDivider}/>
572
+ <react_native_1.View style={styles.heroMetricItem}>
573
+ <react_native_1.Text style={styles.heroMetricLabel} numberOfLines={1} ellipsizeMode="tail">UPTIME</react_native_1.Text>
574
+ <react_native_1.Text style={styles.heroMetricValue} numberOfLines={1} ellipsizeMode="tail">{deviceUptime}</react_native_1.Text>
575
+ </react_native_1.View>
475
576
  </react_native_1.View>
476
- </react_native_1.View>
477
- </react_native_1.View>
577
+ </react_native_1.View>)}
478
578
 
479
579
 
480
- {(activeSubTab === 'overview' || search.length > 0) && (<react_native_1.View style={styles.sectionCard}>
580
+ {(activeSubTab === 'overview' || search.length > 0) && hasOverviewMatch && (<react_native_1.View style={styles.sectionCard}>
481
581
  <react_native_1.Text style={styles.sectionTitle}>DEVICE OVERVIEW</react_native_1.Text>
482
- {isMatch('Device Model') && (<InfoRow label="Device Model" value={fullDeviceData.hardware.model}/>)}
483
- {isMatch('Manufacturer') && (<InfoRow label="Manufacturer / Brand" value={fullDeviceData.hardware.brand}/>)}
484
- {isMatch('Operating System') && (<InfoRow label="Operating System" value={fullDeviceData.hardware.osVersion} badge={{ text: react_native_1.Platform.OS.toUpperCase(), color: AppColors_1.AppColors.blue500, bg: `${AppColors_1.AppColors.blue500}18` }}/>)}
485
- {isMatch('IP Address') && (<InfoRow label="Local IP Address" value={ipAddress} badge={{ text: 'ONLINE', color: AppColors_1.AppColors.emerald500, bg: `${AppColors_1.AppColors.emerald500}18` }}/>)}
486
- {isMatch('RAM Memory') && (<InfoRow label="RAM Memory" value={`${usedRamMb} MB / ${totalRamMb} MB (${ramUsagePct}%)`} subtext={`Free Memory: ${freeRamMb} MB`}/>)}
487
- {isMatch('Storage Capacity') && (<InfoRow label="Internal Storage" value={`${freeStorageGb} GB Free / ${totalStorageGb} GB Total`}/>)}
488
- {isMatch('App Version') && (<InfoRow label="Host App Version" value={`v${fullDeviceData.runtime.appVersion} (${fullDeviceData.runtime.appBuild})`}/>)}
489
- {isMatch('JavaScript Engine') && (<InfoRow label="JS Runtime Engine" value={isHermes ? 'Hermes Bytecode Engine' : 'JavaScriptCore (JSC)'} badge={isHermes
582
+ {isMatch('Device Model', fullDeviceData.hardware.model) && (<InfoRow label="Device Model" value={fullDeviceData.hardware.model}/>)}
583
+ {isMatch('Manufacturer', fullDeviceData.hardware.brand) && (<InfoRow label="Manufacturer / Brand" value={fullDeviceData.hardware.brand}/>)}
584
+ {isMatch('Operating System', fullDeviceData.hardware.osVersion) && (<InfoRow label="Operating System" value={fullDeviceData.hardware.osVersion} badge={{ text: react_native_1.Platform.OS.toUpperCase(), color: AppColors_1.AppColors.blue500, bg: `${AppColors_1.AppColors.blue500}18` }}/>)}
585
+ {isMatch('IP Address', ipAddress) && (<InfoRow label="Local IP Address" value={ipAddress} badge={{ text: 'ONLINE', color: AppColors_1.AppColors.emerald500, bg: `${AppColors_1.AppColors.emerald500}18` }}/>)}
586
+ {isMatch('RAM Memory', `${usedRamMb} MB / ${totalRamMb} MB (${ramUsagePct}%)`, `Free Memory: ${freeRamMb} MB`) && (<InfoRow label="RAM Memory" value={`${usedRamMb} MB / ${totalRamMb} MB (${ramUsagePct}%)`} subtext={`Free Memory: ${freeRamMb} MB`}/>)}
587
+ {isMatch('Storage Capacity', `${freeStorageGb} GB Free / ${totalStorageGb} GB Total`) && (<InfoRow label="Internal Storage" value={`${freeStorageGb} GB Free / ${totalStorageGb} GB Total`}/>)}
588
+ {isMatch('App Version', `v${fullDeviceData.runtime.appVersion} (${fullDeviceData.runtime.appBuild})`) && (<InfoRow label="Host App Version" value={`v${fullDeviceData.runtime.appVersion} (${fullDeviceData.runtime.appBuild})`}/>)}
589
+ {isMatch('JavaScript Engine', isHermes ? 'Hermes Bytecode Engine' : 'JavaScriptCore (JSC)') && (<InfoRow label="JS Runtime Engine" value={isHermes ? 'Hermes Bytecode Engine' : 'JavaScriptCore (JSC)'} badge={isHermes
490
590
  ? { text: 'HERMES', color: AppColors_1.AppColors.purple, bg: `${AppColors_1.AppColors.purple}18` }
491
591
  : { text: 'JSC', color: AppColors_1.AppColors.sky500, bg: `${AppColors_1.AppColors.sky500}18` }}/>)}
492
- {isMatch('UDID Identifier') && (<InfoRow label="Pseudo-UDID" value={pseudoUDID} isLast/>)}
592
+ {isMatch('UDID Identifier', pseudoUDID) && (<InfoRow label="Pseudo-UDID" value={pseudoUDID} isLast/>)}
493
593
  </react_native_1.View>)}
494
594
 
495
595
 
496
- {(activeSubTab === 'hardware' || search.length > 0) && (<react_native_1.View style={styles.sectionCard}>
596
+ {(activeSubTab === 'hardware' || search.length > 0) && hasHardwareMatch && (<react_native_1.View style={styles.sectionCard}>
497
597
  <react_native_1.Text style={styles.sectionTitle}>HARDWARE & SYSTEM SPECIFICATIONS</react_native_1.Text>
498
- {isMatch('CPU Architecture') && (<InfoRow label="CPU Architecture / ABI" value={fullDeviceData.hardware.cpuAbi} badge={{ text: '64-BIT', color: AppColors_1.AppColors.purple, bg: `${AppColors_1.AppColors.purple}18` }}/>)}
499
- {isMatch('Total RAM') && (<InfoRow label="Total Physical RAM" value={`${totalRamMb} MB`}/>)}
500
- {isMatch('Free RAM') && (<InfoRow label="Available Free RAM" value={`${freeRamMb} MB`} badge={{
598
+ {isMatch('CPU Architecture', fullDeviceData.hardware.cpuAbi) && (<InfoRow label="CPU Architecture / ABI" value={fullDeviceData.hardware.cpuAbi} badge={{ text: '64-BIT', color: AppColors_1.AppColors.purple, bg: `${AppColors_1.AppColors.purple}18` }}/>)}
599
+ {isMatch('Total RAM', `${totalRamMb} MB`) && (<InfoRow label="Total Physical RAM" value={`${totalRamMb} MB`}/>)}
600
+ {isMatch('Free RAM', `${freeRamMb} MB`) && (<InfoRow label="Available Free RAM" value={`${freeRamMb} MB`} badge={{
501
601
  text: freeRamMb < 500 ? 'LOW' : 'HEALTHY',
502
602
  color: freeRamMb < 500 ? AppColors_1.AppColors.errorColor : AppColors_1.AppColors.emerald500,
503
603
  bg: freeRamMb < 500 ? `${AppColors_1.AppColors.errorColor}18` : `${AppColors_1.AppColors.emerald500}18`,
504
604
  }}/>)}
505
- {isMatch('Storage Capacity') && (<InfoRow label="Disk Storage Total" value={`${totalStorageGb} GB`}/>)}
506
- {isMatch('Available Storage') && (<InfoRow label="Disk Storage Available" value={`${freeStorageGb} GB`}/>)}
507
- {isMatch('Battery') && (<InfoRow label="Battery Level" value={`${deviceMetrics?.batteryPercent ?? 100}%`} badge={{
605
+ {isMatch('Storage Capacity', `${totalStorageGb} GB`) && (<InfoRow label="Disk Storage Total" value={`${totalStorageGb} GB`}/>)}
606
+ {isMatch('Available Storage', `${freeStorageGb} GB`) && (<InfoRow label="Disk Storage Available" value={`${freeStorageGb} GB`}/>)}
607
+ {isMatch('Battery', `${deviceMetrics?.batteryPercent ?? 100}%`) && (<InfoRow label="Battery Level" value={`${deviceMetrics?.batteryPercent ?? 100}%`} badge={{
508
608
  text: deviceMetrics?.isCharging ? 'CHARGING' : 'DISCHARGING',
509
609
  color: deviceMetrics?.isCharging ? AppColors_1.AppColors.emerald500 : AppColors_1.AppColors.grayText,
510
610
  bg: deviceMetrics?.isCharging ? `${AppColors_1.AppColors.emerald500}18` : `${AppColors_1.AppColors.grayText}18`,
511
611
  }}/>)}
512
- {isMatch('API Level') && react_native_1.Platform.OS === 'android' && (<InfoRow label="Android API SDK Level" value={`API ${deviceMetrics?.apiLevel || react_native_1.Platform.Version}`}/>)}
513
- {isMatch('Thermal State') && (<InfoRow label="Thermal State" value="Nominal (Cool)" badge={{ text: 'OPTIMAL', color: AppColors_1.AppColors.emerald500, bg: `${AppColors_1.AppColors.emerald500}18` }} isLast/>)}
612
+ {isMatch('API Level', `API ${deviceMetrics?.apiLevel || react_native_1.Platform.Version}`) && react_native_1.Platform.OS === 'android' && (<InfoRow label="Android API SDK Level" value={`API ${deviceMetrics?.apiLevel || react_native_1.Platform.Version}`}/>)}
613
+ {isMatch('Thermal State', 'Nominal (Cool)') && (<InfoRow label="Thermal State" value="Nominal (Cool)" badge={{ text: 'OPTIMAL', color: AppColors_1.AppColors.emerald500, bg: `${AppColors_1.AppColors.emerald500}18` }} isLast/>)}
514
614
  </react_native_1.View>)}
515
615
 
516
616
 
517
- {(activeSubTab === 'network' || search.length > 0) && (<react_native_1.View style={styles.sectionCard}>
617
+ {(activeSubTab === 'network' || search.length > 0) && hasNetworkMatch && (<react_native_1.View style={styles.sectionCard}>
518
618
  <react_native_1.Text style={styles.sectionTitle}>NETWORK & CONNECTIVITY</react_native_1.Text>
519
- {isMatch('IP Address') && (<InfoRow label="Local Device IP" value={ipAddress} badge={{ text: 'IPV4', color: AppColors_1.AppColors.blue500, bg: `${AppColors_1.AppColors.blue500}18` }}/>)}
520
- {isMatch('Internet Reachability') && (<InfoRow label="Internet Reachability" value="Connected" badge={{ text: 'ONLINE', color: AppColors_1.AppColors.emerald500, bg: `${AppColors_1.AppColors.emerald500}18` }}/>)}
521
- {isMatch('Connection Type') && (<InfoRow label="Active Connection Type" value="Wi-Fi / Local Area Network"/>)}
522
- {isMatch('Metro Dev Server') && (<InfoRow label="Metro Packager Host" value={react_native_1.NativeModules?.PlatformConstants?.serverHost ||
619
+ {isMatch('IP Address', ipAddress) && (<InfoRow label="Local Device IP" value={ipAddress} badge={{ text: 'IPV4', color: AppColors_1.AppColors.blue500, bg: `${AppColors_1.AppColors.blue500}18` }}/>)}
620
+ {isMatch('Internet Reachability', 'Connected') && (<InfoRow label="Internet Reachability" value="Connected" badge={{ text: 'ONLINE', color: AppColors_1.AppColors.emerald500, bg: `${AppColors_1.AppColors.emerald500}18` }}/>)}
621
+ {isMatch('Connection Type', 'Wi-Fi / Local Area Network') && (<InfoRow label="Active Connection Type" value="Wi-Fi / Local Area Network"/>)}
622
+ {isMatch('Metro Dev Server', react_native_1.NativeModules?.PlatformConstants?.serverHost || react_native_1.NativeModules?.AndroidConstants?.serverHost || 'localhost:8081') && (<InfoRow label="Metro Packager Host" value={react_native_1.NativeModules?.PlatformConstants?.serverHost ||
523
623
  react_native_1.NativeModules?.AndroidConstants?.serverHost ||
524
624
  'localhost:8081'}/>)}
525
- {isMatch('WebSocket Protocol') && (<InfoRow label="WebSocket (WSS) Support" value="Active & Enabled"/>)}
526
- {isMatch('Network Inspector Interceptor') && (<InfoRow label="Network Interceptor Status" value="Intercepting XHR & Fetch" badge={{ text: 'MONITORING', color: AppColors_1.AppColors.purple, bg: `${AppColors_1.AppColors.purple}18` }} isLast/>)}
625
+ {isMatch('WebSocket Protocol', 'Active & Enabled') && (<InfoRow label="WebSocket (WSS) Support" value="Active & Enabled"/>)}
626
+ {isMatch('Network Inspector Interceptor', 'Intercepting XHR & Fetch') && (<InfoRow label="Network Interceptor Status" value="Intercepting XHR & Fetch" badge={{ text: 'MONITORING', color: AppColors_1.AppColors.purple, bg: `${AppColors_1.AppColors.purple}18` }} isLast/>)}
527
627
  </react_native_1.View>)}
528
628
 
529
629
 
530
- {(activeSubTab === 'display' || search.length > 0) && (<react_native_1.View style={styles.sectionCard}>
630
+ {(activeSubTab === 'display' || search.length > 0) && hasDisplayMatch && (<react_native_1.View style={styles.sectionCard}>
531
631
  <react_native_1.Text style={styles.sectionTitle}>DISPLAY & SCREEN GEOMETRY</react_native_1.Text>
532
- {isMatch('Window Resolution') && (<InfoRow label="Window Logical Size" value={`${windowDims.width.toFixed(0)} × ${windowDims.height.toFixed(0)} pt`}/>)}
533
- {isMatch('Screen Physical Size') && (<InfoRow label="Physical Screen Size" value={`${(screenDims.width * pixelRatio).toFixed(0)} × ${(screenDims.height * pixelRatio).toFixed(0)} px`}/>)}
534
- {isMatch('Pixel Density') && (<InfoRow label="Pixel Ratio (DPI Scale)" value={`@${pixelRatio}x (${Math.round(pixelRatio * 160)} dpi)`} badge={{ text: `@${pixelRatio}x`, color: AppColors_1.AppColors.purple, bg: `${AppColors_1.AppColors.purple}18` }}/>)}
535
- {isMatch('Font Scale') && (<InfoRow label="User Font Scale" value={`${fontScale}x (${fontScale === 1 ? 'Default' : fontScale > 1 ? 'Enlarged' : 'Compact'})`}/>)}
536
- {isMatch('Form Factor') && (<InfoRow label="Device Form Factor" value={isTablet ? 'Tablet' : 'Smartphone'} badge={{
632
+ {isMatch('Window Resolution', `${windowDims.width.toFixed(0)} × ${windowDims.height.toFixed(0)} pt`) && (<InfoRow label="Window Logical Size" value={`${windowDims.width.toFixed(0)} × ${windowDims.height.toFixed(0)} pt`}/>)}
633
+ {isMatch('Screen Physical Size', `${(screenDims.width * pixelRatio).toFixed(0)} × ${(screenDims.height * pixelRatio).toFixed(0)} px`) && (<InfoRow label="Physical Screen Size" value={`${(screenDims.width * pixelRatio).toFixed(0)} × ${(screenDims.height * pixelRatio).toFixed(0)} px`}/>)}
634
+ {isMatch('Pixel Density', `@${pixelRatio}x (${Math.round(pixelRatio * 160)} dpi)`) && (<InfoRow label="Pixel Ratio (DPI Scale)" value={`@${pixelRatio}x (${Math.round(pixelRatio * 160)} dpi)`} badge={{ text: `@${pixelRatio}x`, color: AppColors_1.AppColors.purple, bg: `${AppColors_1.AppColors.purple}18` }}/>)}
635
+ {isMatch('Font Scale', `${fontScale}x`) && (<InfoRow label="User Font Scale" value={`${fontScale}x (${fontScale === 1 ? 'Default' : fontScale > 1 ? 'Enlarged' : 'Compact'})`}/>)}
636
+ {isMatch('Form Factor', isTablet ? 'Tablet' : 'Smartphone') && (<InfoRow label="Device Form Factor" value={isTablet ? 'Tablet' : 'Smartphone'} badge={{
537
637
  text: isTablet ? 'TABLET' : 'PHONE',
538
638
  color: isTablet ? AppColors_1.AppColors.blue500 : AppColors_1.AppColors.purple,
539
639
  bg: isTablet ? `${AppColors_1.AppColors.blue500}18` : `${AppColors_1.AppColors.purple}18`,
540
640
  }}/>)}
541
- {isMatch('Orientation') && (<InfoRow label="Screen Orientation" value={isLandscape ? 'Landscape' : 'Portrait'}/>)}
542
- {isMatch('Status Bar Height') && (<InfoRow label="Status Bar Inset" value={`${statusBarHeight} pt`} isLast/>)}
641
+ {isMatch('Orientation', isLandscape ? 'Landscape' : 'Portrait') && (<InfoRow label="Screen Orientation" value={isLandscape ? 'Landscape' : 'Portrait'}/>)}
642
+ {isMatch('Status Bar Height', `${statusBarHeight} pt`) && (<InfoRow label="Status Bar Inset" value={`${statusBarHeight} pt`} isLast/>)}
543
643
  </react_native_1.View>)}
544
644
 
545
645
 
546
- {(activeSubTab === 'runtime' || search.length > 0) && (<react_native_1.View style={styles.sectionCard}>
646
+ {(activeSubTab === 'runtime' || search.length > 0) && hasRuntimeMatch && (<react_native_1.View style={styles.sectionCard}>
547
647
  <react_native_1.Text style={styles.sectionTitle}>RUNTIME & APPLICATION</react_native_1.Text>
548
- {isMatch('App Name') && (<InfoRow label="Application Name" value={fullDeviceData.runtime.appName}/>)}
549
- {isMatch('Bundle ID') && (<InfoRow label="Bundle Identifier / Package" value={fullDeviceData.identifiers.bundleId}/>)}
550
- {isMatch('App Version') && (<InfoRow label="Application Version" value={`v${fullDeviceData.runtime.appVersion} (${fullDeviceData.runtime.appBuild})`}/>)}
551
- {isMatch('React Native') && (<InfoRow label="React Native Framework" value={`v${reactNativeVersion}`} badge={{ text: 'RN', color: AppColors_1.AppColors.sky500, bg: `${AppColors_1.AppColors.sky500}18` }}/>)}
552
- {isMatch('In-App Inspector Version') && (<InfoRow label="In-App Inspector Library" value={`v${constants_1.LIB_VERSION}`} badge={{ text: 'LATEST', color: AppColors_1.AppColors.purple, bg: `${AppColors_1.AppColors.purple}18` }}/>)}
553
- {isMatch('Hermes Engine') && (<InfoRow label="Hermes JavaScript Engine" value={isHermes ? 'Enabled (AOT Bytecode)' : 'Disabled (JSC)'} badge={{
648
+ {isMatch('App Name', fullDeviceData.runtime.appName) && (<InfoRow label="Application Name" value={fullDeviceData.runtime.appName}/>)}
649
+ {isMatch('Bundle ID', fullDeviceData.identifiers.bundleId) && (<InfoRow label="Bundle Identifier / Package" value={fullDeviceData.identifiers.bundleId}/>)}
650
+ {isMatch('App Version', `v${fullDeviceData.runtime.appVersion} (${fullDeviceData.runtime.appBuild})`) && (<InfoRow label="Application Version" value={`v${fullDeviceData.runtime.appVersion} (${fullDeviceData.runtime.appBuild})`}/>)}
651
+ {isMatch('React Native', `v${reactNativeVersion}`) && (<InfoRow label="React Native Framework" value={`v${reactNativeVersion}`} badge={{ text: 'RN', color: AppColors_1.AppColors.sky500, bg: `${AppColors_1.AppColors.sky500}18` }}/>)}
652
+ {isMatch('In-App Inspector Version', `v${constants_1.LIB_VERSION}`) && (<InfoRow label="In-App Inspector Library" value={`v${constants_1.LIB_VERSION}`} badge={{ text: 'LATEST', color: AppColors_1.AppColors.purple, bg: `${AppColors_1.AppColors.purple}18` }}/>)}
653
+ {isMatch('Hermes Engine', isHermes ? 'Enabled (AOT Bytecode)' : 'Disabled (JSC)') && (<InfoRow label="Hermes JavaScript Engine" value={isHermes ? 'Enabled (AOT Bytecode)' : 'Disabled (JSC)'} badge={{
554
654
  text: isHermes ? 'HERMES' : 'JSC',
555
655
  color: isHermes ? AppColors_1.AppColors.purple : AppColors_1.AppColors.grayText,
556
656
  bg: isHermes ? `${AppColors_1.AppColors.purple}18` : `${AppColors_1.AppColors.grayText}18`,
557
657
  }}/>)}
558
- {isMatch('New Architecture') && (<InfoRow label="Bridgeless TurboModules (New Arch)" value={isTurboModule ? 'Enabled' : 'Legacy Bridge'} badge={{
658
+ {isMatch('New Architecture', isTurboModule ? 'Enabled' : 'Legacy Bridge') && (<InfoRow label="Bridgeless TurboModules (New Arch)" value={isTurboModule ? 'Enabled' : 'Legacy Bridge'} badge={{
559
659
  text: isTurboModule ? 'NEW ARCH' : 'LEGACY',
560
660
  color: isTurboModule ? AppColors_1.AppColors.emerald500 : AppColors_1.AppColors.blue500,
561
661
  bg: isTurboModule ? `${AppColors_1.AppColors.emerald500}18` : `${AppColors_1.AppColors.blue500}18`,
562
662
  }}/>)}
563
- {isMatch('Build Type') && (<InfoRow label="Build Configuration" value={__DEV__ ? 'Debug (__DEV__ = true)' : 'Release / Production'} badge={{
663
+ {isMatch('Build Type', __DEV__ ? 'Debug (__DEV__ = true)' : 'Release / Production') && (<InfoRow label="Build Configuration" value={__DEV__ ? 'Debug (__DEV__ = true)' : 'Release / Production'} badge={{
564
664
  text: __DEV__ ? 'DEBUG' : 'RELEASE',
565
665
  color: __DEV__ ? AppColors_1.AppColors.warningIconGold : AppColors_1.AppColors.emerald500,
566
666
  bg: __DEV__ ? `${AppColors_1.AppColors.warningIconGold}18` : `${AppColors_1.AppColors.emerald500}18`,
567
667
  }}/>)}
568
- {isMatch('Timezone') && (<InfoRow label="System Timezone" value={fullDeviceData.runtime.timezone}/>)}
569
- {isMatch('Locale') && (<InfoRow label="System Language & Locale" value={fullDeviceData.runtime.locale}/>)}
570
- {isMatch('Session Uptime') && (<InfoRow label="Inspector Session Uptime" value={deviceUptime} isLast/>)}
668
+ {isMatch('Timezone', fullDeviceData.runtime.timezone) && (<InfoRow label="System Timezone" value={fullDeviceData.runtime.timezone}/>)}
669
+ {isMatch('Locale', fullDeviceData.runtime.locale) && (<InfoRow label="System Language & Locale" value={fullDeviceData.runtime.locale}/>)}
670
+ {isMatch('Session Uptime', deviceUptime) && (<InfoRow label="Inspector Session Uptime" value={deviceUptime} isLast/>)}
571
671
  </react_native_1.View>)}
572
672
 
573
673
 
574
- {(activeSubTab === 'security' || search.length > 0) && (<react_native_1.View style={styles.sectionCard}>
674
+ {(activeSubTab === 'security' || search.length > 0) && hasSecurityMatch && (<react_native_1.View style={styles.sectionCard}>
575
675
  <react_native_1.Text style={styles.sectionTitle}>DEVICE IDENTIFIERS & SECURITY</react_native_1.Text>
576
- {isMatch('Pseudo-UDID') && (<InfoRow label="Deterministic Pseudo-UDID" value={pseudoUDID} subtext="Stable hardware signature hash for testing & diagnostics" badge={{ text: 'PERSISTENT', color: AppColors_1.AppColors.purple, bg: `${AppColors_1.AppColors.purple}18` }}/>)}
577
- {isMatch('Bundle ID') && (<InfoRow label="Application Bundle ID" value={fullDeviceData.identifiers.bundleId}/>)}
578
- {isMatch('Root / Jailbreak') && (<InfoRow label="Root / Jailbreak Heuristic" value="Clean (Standard Sandbox)" badge={{ text: 'SECURE', color: AppColors_1.AppColors.emerald500, bg: `${AppColors_1.AppColors.emerald500}18` }}/>)}
579
- {isMatch('Simulator / Emulator') && (<InfoRow label="Emulator / Physical Device" value={react_native_1.Platform.constants?.Model?.includes?.('sdk') ||
676
+ {isMatch('Pseudo-UDID', pseudoUDID) && (<InfoRow label="Deterministic Pseudo-UDID" value={pseudoUDID} subtext="Stable hardware signature hash for testing & diagnostics" badge={{ text: 'PERSISTENT', color: AppColors_1.AppColors.purple, bg: `${AppColors_1.AppColors.purple}18` }}/>)}
677
+ {isMatch('Bundle ID', fullDeviceData.identifiers.bundleId) && (<InfoRow label="Application Bundle ID" value={fullDeviceData.identifiers.bundleId}/>)}
678
+ {isMatch('Root / Jailbreak', 'Clean (Standard Sandbox)') && (<InfoRow label="Root / Jailbreak Heuristic" value="Clean (Standard Sandbox)" badge={{ text: 'SECURE', color: AppColors_1.AppColors.emerald500, bg: `${AppColors_1.AppColors.emerald500}18` }}/>)}
679
+ {isMatch('Simulator / Emulator', react_native_1.Platform.constants?.Model?.includes?.('sdk') || react_native_1.Platform.constants?.Model?.includes?.('Emulator') || react_native_1.Platform.constants?.Model?.includes?.('Simulator') ? 'Virtual Simulator' : 'Physical Device') && (<InfoRow label="Emulator / Physical Device" value={react_native_1.Platform.constants?.Model?.includes?.('sdk') ||
580
680
  react_native_1.Platform.constants?.Model?.includes?.('Emulator') ||
581
681
  react_native_1.Platform.constants?.Model?.includes?.('Simulator')
582
682
  ? 'Virtual Simulator'
583
683
  : 'Physical Device'}/>)}
584
- {isMatch('Sandbox Integrity') && (<InfoRow label="App Sandbox File Isolation" value="Enforced by OS Kernel" isLast/>)}
684
+ {isMatch('Sandbox Integrity', 'Enforced by OS Kernel') && (<InfoRow label="App Sandbox File Isolation" value="Enforced by OS Kernel" isLast/>)}
585
685
  </react_native_1.View>)}
586
686
 
587
687
 
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ export interface FeedbackModalProps {
3
+ visible?: boolean;
4
+ onClose: () => void;
5
+ }
6
+ export declare const FeedbackModal: React.FC<FeedbackModalProps>;
7
+ export default FeedbackModal;