react-native-inapp-inspector 2.2.9 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/commonjs/components/AppHeaderLogo.js +45 -12
  2. package/dist/commonjs/components/BrandSquareIcon.js +92 -49
  3. package/dist/commonjs/components/EmptyState.d.ts +7 -2
  4. package/dist/commonjs/components/EmptyState.js +11 -5
  5. package/dist/commonjs/components/Inspector/AnalyticsTab.js +29 -18
  6. package/dist/commonjs/components/Inspector/ConsoleTab.js +6 -1
  7. package/dist/commonjs/components/Inspector/CrashDetail.js +43 -9
  8. package/dist/commonjs/components/Inspector/CrashTab.js +34 -3
  9. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +80 -16
  10. package/dist/commonjs/components/Inspector/InspectorHeader.js +16 -3
  11. package/dist/commonjs/components/Inspector/MainScreen.js +7 -11
  12. package/dist/commonjs/components/Inspector/NetworkDetail.js +3 -2
  13. package/dist/commonjs/components/Inspector/NetworkTab.js +103 -4
  14. package/dist/commonjs/components/Inspector/ReduxTab.js +19 -3
  15. package/dist/commonjs/components/Inspector/SettingsPanel.js +4 -4
  16. package/dist/commonjs/components/Inspector/StorageTab.js +123 -92
  17. package/dist/commonjs/components/JsonViewer.js +2 -0
  18. package/dist/commonjs/components/MetaAccordion.js +15 -3
  19. package/dist/commonjs/components/SkeletonPlaceholder.d.ts +6 -0
  20. package/dist/commonjs/components/SkeletonPlaceholder.js +208 -0
  21. package/dist/commonjs/constants/version.d.ts +1 -1
  22. package/dist/commonjs/constants/version.js +1 -1
  23. package/dist/commonjs/customHooks/networkLogger.d.ts +3 -0
  24. package/dist/commonjs/customHooks/networkLogger.js +10 -1
  25. package/dist/commonjs/customHooks/storageInspector.d.ts +2 -2
  26. package/dist/commonjs/customHooks/storageInspector.js +17 -13
  27. package/dist/commonjs/helpers/index.d.ts +6 -0
  28. package/dist/commonjs/helpers/index.js +196 -6
  29. package/dist/commonjs/helpers/searchQueryParser.js +62 -20
  30. package/dist/commonjs/i18n/index.d.ts +13 -0
  31. package/dist/commonjs/i18n/index.js +35 -2
  32. package/dist/commonjs/index.d.ts +3 -0
  33. package/dist/commonjs/index.js +108 -35
  34. package/dist/commonjs/styles/AppColors.d.ts +4 -0
  35. package/dist/commonjs/styles/AppColors.js +11 -1
  36. package/dist/commonjs/styles/AppFonts.d.ts +11 -0
  37. package/dist/commonjs/styles/AppFonts.js +11 -1
  38. package/dist/commonjs/types/interfaces.d.ts +2 -2
  39. package/dist/esm/components/AppHeaderLogo.js +45 -12
  40. package/dist/esm/components/BrandSquareIcon.js +92 -49
  41. package/dist/esm/components/EmptyState.d.ts +7 -2
  42. package/dist/esm/components/EmptyState.js +11 -5
  43. package/dist/esm/components/Inspector/AnalyticsTab.js +30 -19
  44. package/dist/esm/components/Inspector/ConsoleTab.js +6 -1
  45. package/dist/esm/components/Inspector/CrashDetail.js +43 -9
  46. package/dist/esm/components/Inspector/CrashTab.js +34 -3
  47. package/dist/esm/components/Inspector/DeviceInfoTab.js +80 -16
  48. package/dist/esm/components/Inspector/InspectorHeader.js +17 -4
  49. package/dist/esm/components/Inspector/MainScreen.js +8 -12
  50. package/dist/esm/components/Inspector/NetworkDetail.js +3 -2
  51. package/dist/esm/components/Inspector/NetworkTab.js +103 -4
  52. package/dist/esm/components/Inspector/ReduxTab.js +19 -3
  53. package/dist/esm/components/Inspector/SettingsPanel.js +4 -4
  54. package/dist/esm/components/Inspector/StorageTab.js +124 -93
  55. package/dist/esm/components/JsonViewer.js +2 -0
  56. package/dist/esm/components/MetaAccordion.js +15 -3
  57. package/dist/esm/components/SkeletonPlaceholder.d.ts +6 -0
  58. package/dist/esm/components/SkeletonPlaceholder.js +173 -0
  59. package/dist/esm/constants/version.d.ts +1 -1
  60. package/dist/esm/constants/version.js +1 -1
  61. package/dist/esm/customHooks/networkLogger.d.ts +3 -0
  62. package/dist/esm/customHooks/networkLogger.js +8 -0
  63. package/dist/esm/customHooks/storageInspector.d.ts +2 -2
  64. package/dist/esm/customHooks/storageInspector.js +17 -13
  65. package/dist/esm/helpers/index.d.ts +6 -0
  66. package/dist/esm/helpers/index.js +193 -5
  67. package/dist/esm/helpers/searchQueryParser.js +62 -20
  68. package/dist/esm/i18n/index.d.ts +13 -0
  69. package/dist/esm/i18n/index.js +33 -3
  70. package/dist/esm/index.d.ts +3 -0
  71. package/dist/esm/index.js +97 -37
  72. package/dist/esm/styles/AppColors.d.ts +4 -0
  73. package/dist/esm/styles/AppColors.js +9 -0
  74. package/dist/esm/styles/AppFonts.d.ts +11 -0
  75. package/dist/esm/styles/AppFonts.js +9 -0
  76. package/dist/esm/types/interfaces.d.ts +2 -2
  77. package/package.json +1 -1
  78. package/src/components/AppHeaderLogo.tsx +46 -12
  79. package/src/components/BrandSquareIcon.tsx +127 -78
  80. package/src/components/EmptyState.tsx +27 -5
  81. package/src/components/Inspector/AnalyticsTab.tsx +48 -27
  82. package/src/components/Inspector/ConsoleTab.tsx +10 -0
  83. package/src/components/Inspector/CrashDetail.tsx +65 -9
  84. package/src/components/Inspector/CrashTab.tsx +41 -3
  85. package/src/components/Inspector/DeviceInfoTab.tsx +87 -16
  86. package/src/components/Inspector/InspectorHeader.tsx +24 -4
  87. package/src/components/Inspector/MainScreen.tsx +7 -11
  88. package/src/components/Inspector/NetworkDetail.tsx +4 -4
  89. package/src/components/Inspector/NetworkTab.tsx +129 -4
  90. package/src/components/Inspector/ReduxTab.tsx +26 -8
  91. package/src/components/Inspector/SettingsPanel.tsx +4 -4
  92. package/src/components/Inspector/StorageTab.tsx +191 -117
  93. package/src/components/JsonViewer.tsx +2 -0
  94. package/src/components/MetaAccordion.tsx +18 -3
  95. package/src/components/SkeletonPlaceholder.tsx +206 -0
  96. package/src/constants/version.ts +1 -1
  97. package/src/customHooks/networkLogger.ts +15 -0
  98. package/src/customHooks/storageInspector.ts +18 -14
  99. package/src/helpers/index.ts +213 -5
  100. package/src/helpers/searchQueryParser.ts +63 -20
  101. package/src/i18n/index.ts +38 -3
  102. package/src/index.tsx +124 -37
  103. package/src/styles/AppColors.ts +9 -0
  104. package/src/styles/AppFonts.ts +16 -0
  105. package/src/types/interfaces.ts +2 -2
@@ -51,15 +51,23 @@ const AppHeaderLogo = ({ size = 46, customIcon, }) => {
51
51
  height: size,
52
52
  });
53
53
  return (<react_native_1.View style={[
54
- logoStyles.container,
55
- { width: size, height: size, padding: 0, borderRadius: Math.round(size * 0.28) },
54
+ logoStyles.svgContainer,
55
+ {
56
+ width: size,
57
+ height: size,
58
+ borderRadius: Math.round(size * 0.23),
59
+ },
56
60
  ]}>
57
61
  {clonedIcon}
58
62
  </react_native_1.View>);
59
63
  }
60
64
  return (<react_native_1.View style={[
61
- logoStyles.container,
62
- { width: size, height: size, borderRadius: Math.round(size * 0.28) },
65
+ logoStyles.imageContainer,
66
+ {
67
+ width: size,
68
+ height: size,
69
+ borderRadius: Math.round(size * 0.23),
70
+ },
63
71
  ]}>
64
72
  <react_native_1.Image source={customIcon} style={logoStyles.image} resizeMode="cover"/>
65
73
  </react_native_1.View>);
@@ -71,34 +79,59 @@ const AppHeaderLogo = ({ size = 46, customIcon, }) => {
71
79
  android: { uri: 'ic_launcher' },
72
80
  default: { uri: 'AppIcon' },
73
81
  });
74
- return (<react_native_1.View style={[logoStyles.container, { width: size, height: size }]}>
82
+ return (<react_native_1.View style={[
83
+ logoStyles.imageContainer,
84
+ {
85
+ width: size,
86
+ height: size,
87
+ borderRadius: Math.round(size * 0.23),
88
+ },
89
+ ]}>
75
90
  <react_native_1.Image source={nativeSource} style={logoStyles.image} resizeMode="cover" onError={() => setLoadError(true)}/>
76
91
  </react_native_1.View>);
77
92
  }
78
93
  // 3. Fallback: Inspector's Signature Owl Brand Logo
79
94
  return (<react_native_1.View style={[
80
- logoStyles.container,
81
- { width: size, height: size, padding: 0, borderRadius: Math.round(size * 0.28) },
95
+ logoStyles.svgContainer,
96
+ {
97
+ width: size,
98
+ height: size,
99
+ borderRadius: Math.round(size * 0.23),
100
+ },
82
101
  ]}>
83
102
  <BrandSquareIcon_1.default size={size}/>
84
103
  </react_native_1.View>);
85
104
  };
86
105
  exports.AppHeaderLogo = AppHeaderLogo;
87
106
  const logoStyles = react_native_1.StyleSheet.create({
88
- container: {
89
- borderRadius: 10,
107
+ svgContainer: {
108
+ overflow: 'hidden',
109
+ alignItems: 'center',
110
+ justifyContent: 'center',
111
+ shadowColor: '#000',
112
+ shadowOffset: { width: 0, height: 2 },
113
+ shadowOpacity: 0.25,
114
+ shadowRadius: 3,
115
+ elevation: 3,
116
+ },
117
+ imageContainer: {
90
118
  overflow: 'hidden',
91
119
  backgroundColor: 'rgba(255, 255, 255, 0.15)',
92
120
  borderWidth: 1,
93
- borderColor: 'rgba(255, 255, 255, 0.28)',
94
- padding: 2.5,
121
+ borderColor: 'rgba(255, 255, 255, 0.35)',
122
+ padding: 2,
95
123
  alignItems: 'center',
96
124
  justifyContent: 'center',
125
+ shadowColor: '#000',
126
+ shadowOffset: { width: 0, height: 2 },
127
+ shadowOpacity: 0.25,
128
+ shadowRadius: 3,
129
+ elevation: 3,
97
130
  },
98
131
  image: {
99
132
  width: '100%',
100
133
  height: '100%',
101
- borderRadius: 7.5,
134
+ borderRadius: 8,
102
135
  },
103
136
  });
104
137
  exports.default = exports.AppHeaderLogo;
@@ -42,72 +42,115 @@ const react_native_svg_1 = __importStar(require("react-native-svg"));
42
42
  const BrandSquareIcon = ({ size = 56 }) => {
43
43
  return (<react_native_svg_1.default width={size} height={size} viewBox="0 0 256 256" fill="none">
44
44
  <react_native_svg_1.Defs>
45
+ {/* App Tile Background - Crisp Royal Deep Violet to Midnight */}
45
46
  <react_native_svg_1.LinearGradient id="bs_tile" x1="0" y1="0" x2="256" y2="256" gradientUnits="userSpaceOnUse">
46
- <react_native_svg_1.Stop offset="0" stopColor="#1E1B4B"/>
47
- <react_native_svg_1.Stop offset="1" stopColor="#0F172A"/>
47
+ <react_native_svg_1.Stop offset="0%" stopColor="#1E1B4B"/>
48
+ <react_native_svg_1.Stop offset="50%" stopColor="#18182F"/>
49
+ <react_native_svg_1.Stop offset="100%" stopColor="#0B0F19"/>
48
50
  </react_native_svg_1.LinearGradient>
49
- <react_native_svg_1.LinearGradient id="bs_beam" x1="0" y1="0" x2="256" y2="256" gradientUnits="userSpaceOnUse">
50
- <react_native_svg_1.Stop offset="0" stopColor="#818CF8"/>
51
- <react_native_svg_1.Stop offset="0.5" stopColor="#A855F7"/>
52
- <react_native_svg_1.Stop offset="1" stopColor="#EC4899"/>
51
+
52
+ {/* Outer Neon Cyber Border */}
53
+ <react_native_svg_1.LinearGradient id="bs_border" x1="0" y1="0" x2="256" y2="256" gradientUnits="userSpaceOnUse">
54
+ <react_native_svg_1.Stop offset="0%" stopColor="#818CF8" stopOpacity={0.9}/>
55
+ <react_native_svg_1.Stop offset="45%" stopColor="#C084FC" stopOpacity={0.8}/>
56
+ <react_native_svg_1.Stop offset="80%" stopColor="#F472B6" stopOpacity={0.85}/>
57
+ <react_native_svg_1.Stop offset="100%" stopColor="#38BDF8" stopOpacity={0.9}/>
58
+ </react_native_svg_1.LinearGradient>
59
+
60
+ {/* Ambient Top Glow */}
61
+ <react_native_svg_1.RadialGradient id="bs_top_glow" cx="50%" cy="15%" r="65%">
62
+ <react_native_svg_1.Stop offset="0%" stopColor="#818CF8" stopOpacity={0.35}/>
63
+ <react_native_svg_1.Stop offset="60%" stopColor="#A855F7" stopOpacity={0.12}/>
64
+ <react_native_svg_1.Stop offset="100%" stopColor="#1E1B4B" stopOpacity={0}/>
65
+ </react_native_svg_1.RadialGradient>
66
+
67
+ {/* Owl Outer Body Gradient - High Contrast */}
68
+ <react_native_svg_1.LinearGradient id="bs_body" x1="64" y1="40" x2="192" y2="220" gradientUnits="userSpaceOnUse">
69
+ <react_native_svg_1.Stop offset="0%" stopColor="#3730A3"/>
70
+ <react_native_svg_1.Stop offset="50%" stopColor="#2E1065"/>
71
+ <react_native_svg_1.Stop offset="100%" stopColor="#17123A"/>
53
72
  </react_native_svg_1.LinearGradient>
54
- <react_native_svg_1.LinearGradient id="bs_body" x1="0" y1="0" x2="0" y2="256" gradientUnits="userSpaceOnUse">
55
- <react_native_svg_1.Stop offset="0" stopColor="#312E81"/>
56
- <react_native_svg_1.Stop offset="1" stopColor="#1E1B4B"/>
73
+
74
+ {/* Neon Cyber Beam Stroke */}
75
+ <react_native_svg_1.LinearGradient id="bs_beam" x1="40" y1="40" x2="220" y2="220" gradientUnits="userSpaceOnUse">
76
+ <react_native_svg_1.Stop offset="0%" stopColor="#67E8F9"/>
77
+ <react_native_svg_1.Stop offset="35%" stopColor="#818CF8"/>
78
+ <react_native_svg_1.Stop offset="70%" stopColor="#C084FC"/>
79
+ <react_native_svg_1.Stop offset="100%" stopColor="#F472B6"/>
57
80
  </react_native_svg_1.LinearGradient>
58
- <react_native_svg_1.RadialGradient id="bs_iris" cx="40%" cy="40%" r="60%">
59
- <react_native_svg_1.Stop offset="0" stopColor="#FDE047"/>
60
- <react_native_svg_1.Stop offset="0.7" stopColor="#F59E0B"/>
61
- <react_native_svg_1.Stop offset="1" stopColor="#D97706"/>
81
+
82
+ {/* Eyes Radiant Iris */}
83
+ <react_native_svg_1.RadialGradient id="bs_iris" cx="38%" cy="36%" r="65%">
84
+ <react_native_svg_1.Stop offset="0%" stopColor="#FEF08A"/>
85
+ <react_native_svg_1.Stop offset="40%" stopColor="#FBBF24"/>
86
+ <react_native_svg_1.Stop offset="80%" stopColor="#F59E0B"/>
87
+ <react_native_svg_1.Stop offset="100%" stopColor="#D97706"/>
62
88
  </react_native_svg_1.RadialGradient>
63
- <react_native_svg_1.LinearGradient id="bs_beak" x1="0" y1="0" x2="0" y2="20" gradientUnits="userSpaceOnUse">
64
- <react_native_svg_1.Stop offset="0" stopColor="#FBBF24"/>
65
- <react_native_svg_1.Stop offset="1" stopColor="#F97316"/>
89
+
90
+ {/* Beak Gradient */}
91
+ <react_native_svg_1.LinearGradient id="bs_beak" x1="124" y1="120" x2="132" y2="136" gradientUnits="userSpaceOnUse">
92
+ <react_native_svg_1.Stop offset="0%" stopColor="#FDE047"/>
93
+ <react_native_svg_1.Stop offset="100%" stopColor="#EA580C"/>
66
94
  </react_native_svg_1.LinearGradient>
95
+
96
+ {/* Diagnostic Lens Glass Flare */}
97
+ <react_native_svg_1.RadialGradient id="bs_lens" cx="40%" cy="35%" r="65%">
98
+ <react_native_svg_1.Stop offset="0%" stopColor="#A5F3FC" stopOpacity={0.4}/>
99
+ <react_native_svg_1.Stop offset="50%" stopColor="#38BDF8" stopOpacity={0.18}/>
100
+ <react_native_svg_1.Stop offset="100%" stopColor="#0284C7" stopOpacity={0.05}/>
101
+ </react_native_svg_1.RadialGradient>
67
102
  </react_native_svg_1.Defs>
68
103
 
69
- {/* Rounded App Tile Background */}
70
- <react_native_svg_1.Rect x="8" y="8" width="240" height="240" rx="54" fill="url(#bs_tile)"/>
71
- <react_native_svg_1.Rect x="8" y="8" width="240" height="240" rx="54" fill="none" stroke="url(#bs_beam)" strokeWidth="3" strokeOpacity={0.4}/>
104
+ {/* ── 1. Rounded App Tile Base (Full Edge-to-Edge) ── */}
105
+ <react_native_svg_1.Rect x="2" y="2" width="252" height="252" rx="58" fill="url(#bs_tile)"/>
106
+ <react_native_svg_1.Rect x="2" y="2" width="252" height="252" rx="58" fill="url(#bs_top_glow)"/>
107
+ <react_native_svg_1.Rect x="2" y="2" width="252" height="252" rx="58" fill="none" stroke="url(#bs_border)" strokeWidth="3.5"/>
108
+
109
+ {/* ── 2. Owl Outer Wings (Layered behind) ── */}
110
+ <react_native_svg_1.Path d="M62 120 C42 152 46 194 76 210 C68 178 66 146 80 120 Z" fill="#1E1B4B" stroke="url(#bs_beam)" strokeWidth="3" strokeOpacity={0.75}/>
111
+ <react_native_svg_1.Path d="M194 120 C214 152 210 194 180 210 C188 178 190 146 176 120 Z" fill="#1E1B4B" stroke="url(#bs_beam)" strokeWidth="3" strokeOpacity={0.75}/>
72
112
 
73
- {/* Owl Outer Body Contour */}
74
- <react_native_svg_1.Path d="M64 148 C60 102 72 68 92 56 L100 40 L118 60 Q128 55 138 60 L156 40 L164 56 C184 68 196 102 192 148 C196 178 182 202 150 210 C138 214 118 214 106 210 C74 202 60 178 64 148 Z" fill="url(#bs_body)" stroke="url(#bs_beam)" strokeWidth="4" strokeLinejoin="round"/>
113
+ {/* ── 3. Owl Body Contour ── */}
114
+ <react_native_svg_1.Path d="M58 146 C54 98 68 64 88 52 L98 34 L118 56 Q128 50 138 56 L158 34 L168 52 C188 64 202 98 198 146 C202 180 186 208 152 216 C140 220 116 220 104 216 C70 208 54 180 58 146 Z" fill="url(#bs_body)" stroke="url(#bs_beam)" strokeWidth="4.5" strokeLinejoin="round"/>
75
115
 
76
- {/* Wings */}
77
- <react_native_svg_1.Path d="M74 124 C58 154 60 190 86 204 C79 176 77 148 88 126 Z" fill="#1E1B4B" stroke="#818CF8" strokeWidth="2.5" strokeOpacity={0.6}/>
78
- <react_native_svg_1.Path d="M182 124 C198 154 196 190 170 204 C177 176 179 148 168 126 Z" fill="#1E1B4B" stroke="#818CF8" strokeWidth="2.5" strokeOpacity={0.6}/>
116
+ {/* Inner Ear Highlights */}
117
+ <react_native_svg_1.Path d="M98 42 L112 56 L102 57 Z" fill="#67E8F9" opacity={0.6}/>
118
+ <react_native_svg_1.Path d="M158 42 L144 56 L154 57 Z" fill="#F472B6" opacity={0.6}/>
79
119
 
80
- {/* Belly Screen Plate */}
81
- <react_native_svg_1.Rect x="105" y="160" width="46" height="34" rx="8" fill="#0B0F19" stroke="url(#bs_beam)" strokeWidth="2"/>
82
- {/* Code Emblem on Chest */}
83
- <react_native_svg_1.G stroke="#A5B4FC" strokeWidth="2.8" strokeLinecap="round" strokeLinejoin="round" fill="none">
84
- <react_native_svg_1.Path d="M120 171 L114 177 L120 183"/>
85
- <react_native_svg_1.Path d="M136 171 L142 177 L136 183"/>
86
- <react_native_svg_1.Path d="M130 169 L126 185" stroke="#EC4899"/>
120
+ {/* ── 4. Chest Terminal & Code Braces ── */}
121
+ <react_native_svg_1.Rect x="98" y="162" width="60" height="38" rx="10" fill="#050811" stroke="url(#bs_beam)" strokeWidth="2.5"/>
122
+ <react_native_svg_1.G strokeWidth="3" strokeLinecap="round" strokeLinejoin="round" fill="none">
123
+ <react_native_svg_1.Path d="M116 174 L108 181 L116 188" stroke="#38BDF8"/>
124
+ <react_native_svg_1.Path d="M140 174 L148 181 L140 188" stroke="#38BDF8"/>
125
+ <react_native_svg_1.Path d="M131 171 L125 191" stroke="#F43F5E"/>
87
126
  </react_native_svg_1.G>
88
127
 
89
- {/* Facial Disc & Mask */}
90
- <react_native_svg_1.Path d="M128 92 C148 70 186 78 186 108 C186 134 160 152 128 152 C96 152 70 134 70 108 C70 78 108 70 128 92 Z" fill="#2E1065" stroke="#818CF8" strokeWidth="2" strokeOpacity={0.6}/>
128
+ {/* ── 5. Facial Mask Plate ── */}
129
+ <react_native_svg_1.Path d="M128 88 C152 64 192 72 192 104 C192 132 162 152 128 152 C94 152 64 132 64 104 C64 72 104 64 128 88 Z" fill="#1E1B4B" stroke="url(#bs_beam)" strokeWidth="2.8"/>
130
+
131
+ {/* ── 6. Right Eye (Glowing Owl Eye) ── */}
132
+ <react_native_svg_1.Circle cx="156" cy="106" r="19" fill="url(#bs_iris)" stroke="#0F172A" strokeWidth="2.5"/>
133
+ <react_native_svg_1.Circle cx="156" cy="106" r="9.5" fill="#0B0F19"/>
134
+ <react_native_svg_1.Circle cx="159.5" cy="102.5" r="3.5" fill="#FFFFFF"/>
135
+ <react_native_svg_1.Circle cx="153" cy="109.5" r="1.8" fill="#FFFFFF" opacity={0.85}/>
91
136
 
92
- {/* Right Eye (Normal Cute Eye) */}
93
- <react_native_svg_1.Circle cx="154" cy="108" r="17" fill="url(#bs_iris)" stroke="#0F172A" strokeWidth="2"/>
94
- <react_native_svg_1.Circle cx="154" cy="108" r="8.5" fill="#0F172A"/>
95
- <react_native_svg_1.Circle cx="157" cy="105" r="3" fill="#FFFFFF"/>
96
- <react_native_svg_1.Circle cx="151" cy="111" r="1.5" fill="#FFFFFF" opacity={0.8}/>
137
+ {/* ── 7. Left Eye (Diagnostic Magnifier Lens) ── */}
138
+ {/* Magnifier Glass Glow */}
139
+ <react_native_svg_1.Circle cx="94" cy="104" r="30" fill="url(#bs_lens)" stroke="url(#bs_beam)" strokeWidth="6"/>
140
+ <react_native_svg_1.Line x1="72" y1="126" x2="48" y2="152" stroke="#0B0F19" strokeWidth="13" strokeLinecap="round"/>
141
+ <react_native_svg_1.Line x1="72" y1="126" x2="48" y2="152" stroke="url(#bs_beam)" strokeWidth="8" strokeLinecap="round"/>
97
142
 
98
- {/* Left Eye (Diagnostic Magnifier Lens) */}
99
- <react_native_svg_1.Circle cx="96" cy="104" r="20" fill="url(#bs_iris)" stroke="#0F172A" strokeWidth="2"/>
100
- <react_native_svg_1.Circle cx="96" cy="104" r="10" fill="#0F172A"/>
101
- <react_native_svg_1.Circle cx="99.5" cy="100.5" r="3.5" fill="#FFFFFF"/>
102
- <react_native_svg_1.Circle cx="92" cy="107" r="1.8" fill="#FFFFFF" opacity={0.8}/>
143
+ {/* Eye Inside Magnifier */}
144
+ <react_native_svg_1.Circle cx="94" cy="104" r="21" fill="url(#bs_iris)" stroke="#0F172A" strokeWidth="2.5"/>
145
+ <react_native_svg_1.Circle cx="94" cy="104" r="10.5" fill="#0B0F19"/>
146
+ <react_native_svg_1.Circle cx="98" cy="100" r="4" fill="#FFFFFF"/>
147
+ <react_native_svg_1.Circle cx="90.5" cy="107.5" r="2" fill="#FFFFFF" opacity={0.85}/>
103
148
 
104
- {/* Magnifier Glass Ring & Handle */}
105
- <react_native_svg_1.Line x1="76" y1="124" x2="55" y2="148" stroke="#0F172A" strokeWidth="12" strokeLinecap="round"/>
106
- <react_native_svg_1.Line x1="76" y1="124" x2="55" y2="148" stroke="url(#bs_beam)" strokeWidth="7" strokeLinecap="round"/>
107
- <react_native_svg_1.Circle cx="96" cy="104" r="28" fill="#38BDF8" fillOpacity={0.12} stroke="url(#bs_beam)" strokeWidth="6"/>
149
+ {/* Lens Reflection Highlight */}
150
+ <react_native_svg_1.Path d="M74 94 A26 26 0 0 1 106 78" stroke="#FFFFFF" strokeWidth="3" strokeLinecap="round" opacity={0.65} fill="none"/>
108
151
 
109
- {/* Beak */}
110
- <react_native_svg_1.Path d="M123.5 123 Q128 121 132.5 123 Q131 132 128 134.5 Q125 132 123.5 123 Z" fill="url(#bs_beak)"/>
152
+ {/* ── 8. Beak ── */}
153
+ <react_native_svg_1.Path d="M123 120 Q128 118 133 120 Q131.5 133 128 137 Q124.5 133 123 120 Z" fill="url(#bs_beak)" stroke="#78350F" strokeWidth="1"/>
111
154
  </react_native_svg_1.default>);
112
155
  };
113
156
  exports.BrandSquareIcon = BrandSquareIcon;
@@ -1,5 +1,10 @@
1
1
  import React from 'react';
2
- declare const EmptyState: React.NamedExoticComponent<{
2
+ interface EmptyStateProps {
3
3
  isSearch?: boolean;
4
- }>;
4
+ searchQuery?: string;
5
+ customTitle?: string;
6
+ customSub?: string;
7
+ onClearSearch?: () => void;
8
+ }
9
+ declare const EmptyState: React.NamedExoticComponent<EmptyStateProps>;
5
10
  export default EmptyState;
@@ -46,7 +46,7 @@ const NetworkIcons_1 = require("./NetworkIcons");
46
46
  // Stylesheet
47
47
  const AppColors_1 = require("../styles/AppColors");
48
48
  const styles_1 = __importDefault(require("../styles"));
49
- const EmptyState = react_1.default.memo(function EmptyState({ isSearch }) {
49
+ const EmptyState = react_1.default.memo(function EmptyState({ isSearch, searchQuery, customTitle, customSub, onClearSearch, }) {
50
50
  const iconPulse = (0, react_1.useRef)(new react_native_1.Animated.Value(1)).current;
51
51
  (0, react_1.useEffect)(() => {
52
52
  const loop = react_native_1.Animated.loop(react_native_1.Animated.sequence([
@@ -76,13 +76,19 @@ const EmptyState = react_1.default.memo(function EmptyState({ isSearch }) {
76
76
  <NetworkIcons_1.EmptyRadarIcon color={AppColors_1.AppColors.purple} size={32}/>
77
77
  </react_native_1.Animated.View>
78
78
  <react_native_1.Text style={styles_1.default.emptyTitle}>
79
- {isSearch ? 'No matching APIs' : 'No network activity'}
79
+ {customTitle || (isSearch ? 'No matching results' : 'No network activity')}
80
80
  </react_native_1.Text>
81
81
  <react_native_1.Text style={styles_1.default.emptySub}>
82
- {isSearch
83
- ? 'Try adjusting your filters or search.'
84
- : 'Listening for incoming API calls...'}
82
+ {customSub ||
83
+ (isSearch
84
+ ? searchQuery
85
+ ? `No items matched "${searchQuery}"`
86
+ : 'Try adjusting your filters or search keywords.'
87
+ : 'Listening for incoming API calls...')}
85
88
  </react_native_1.Text>
89
+ {isSearch && onClearSearch && (<TouchableScale_1.default style={styles_1.default.reloadBtn} onPress={onClearSearch}>
90
+ <react_native_1.Text style={styles_1.default.reloadBtnText}>Clear Search & Filters</react_native_1.Text>
91
+ </TouchableScale_1.default>)}
86
92
  {!isSearch && (<TouchableScale_1.default style={styles_1.default.reloadBtn} onPress={handleReload}>
87
93
  <react_native_1.Text style={styles_1.default.reloadBtnText}>Reload App</react_native_1.Text>
88
94
  </TouchableScale_1.default>)}
@@ -42,6 +42,7 @@ const InspectorContext_1 = require("./InspectorContext");
42
42
  const AnalyticsEventCard_1 = __importDefault(require("../AnalyticsEventCard"));
43
43
  const AnalyticsFilterModal_1 = __importDefault(require("./AnalyticsFilterModal"));
44
44
  const EndOfListFooter_1 = __importDefault(require("../EndOfListFooter"));
45
+ const EmptyState_1 = __importDefault(require("../EmptyState"));
45
46
  const styles_1 = __importDefault(require("../../styles"));
46
47
  const AppColors_1 = require("../../styles/AppColors");
47
48
  const AppFonts_1 = require("../../styles/AppFonts");
@@ -888,9 +889,29 @@ const AnalyticsTab = react_1.default.memo(() => {
888
889
  <react_native_1.View style={styles_1.default.searchContainer}>
889
890
  <NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={16}/>
890
891
  <react_native_1.TextInput placeholder="Search events..." placeholderTextColor={AppColors_1.AppColors.grayTextWeak} value={analyticsSearch} onChangeText={setAnalyticsSearch} style={styles_1.default.searchInput} autoCorrect={false} autoCapitalize="none"/>
891
- {analyticsSearch.length > 0 && (<react_native_1.Pressable onPress={() => setAnalyticsSearch('')} hitSlop={10} style={styles_1.default.clearBtn}>
892
- <NetworkIcons_1.ClearIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
893
- </react_native_1.Pressable>)}
892
+ {analyticsSearch.length > 0 && (<react_native_1.View style={{
893
+ flexDirection: 'row',
894
+ alignItems: 'center',
895
+ gap: 4,
896
+ }}>
897
+ <react_native_1.View style={{
898
+ backgroundColor: `${AppColors_1.AppColors.purple}20`,
899
+ borderRadius: 10,
900
+ paddingHorizontal: 6,
901
+ paddingVertical: 1.5,
902
+ }}>
903
+ <react_native_1.Text style={{
904
+ color: AppColors_1.AppColors.purple,
905
+ fontSize: 9.5,
906
+ fontFamily: AppFonts_1.AppFonts.interBold,
907
+ }}>
908
+ {filteredAnalyticsEvents.length}
909
+ </react_native_1.Text>
910
+ </react_native_1.View>
911
+ <react_native_1.Pressable onPress={() => setAnalyticsSearch('')} hitSlop={10} style={styles_1.default.clearBtn}>
912
+ <NetworkIcons_1.ClearIcon color={AppColors_1.AppColors.grayTextWeak} size={13}/>
913
+ </react_native_1.Pressable>
914
+ </react_native_1.View>)}
894
915
  </react_native_1.View>
895
916
  <react_native_1.View style={styles_1.default.toolbarRight}>
896
917
  <react_native_1.TouchableOpacity style={[
@@ -945,21 +966,11 @@ const AnalyticsTab = react_1.default.memo(() => {
945
966
  <AnalyticsFilterModal_1.default visible={isFilterModalOpen} onClose={() => setIsFilterModalOpen(false)}/>
946
967
 
947
968
  <react_native_1.View style={{ flex: 1 }} onLayout={() => setIsAnalyticsLayoutReady(true)}>
948
- {isAnalyticsLayoutReady ? (<react_native_1.FlatList data={filteredAnalyticsEvents} keyExtractor={keyExtractor} ListHeaderComponent={AnalyticsHeader} renderItem={renderItem} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} ListEmptyComponent={<react_native_1.View style={styles_1.default.emptyContainer}>
949
- <react_native_1.View style={styles_1.default.emptyIconWrap}>
950
- <NetworkIcons_1.EmptyRadarIcon color={AppColors_1.AppColors.purple} size={32}/>
951
- </react_native_1.View>
952
- <react_native_1.Text style={styles_1.default.emptyTitle}>
953
- {analyticsSearch.length > 0
954
- ? 'No matching events'
955
- : 'No analytics events yet'}
956
- </react_native_1.Text>
957
- <react_native_1.Text style={styles_1.default.emptySub}>
958
- {analyticsSearch.length > 0
959
- ? 'Try adjusting your search.'
960
- : 'Call setupAnalyticsLogger(analytics()) at app start.'}
961
- </react_native_1.Text>
962
- </react_native_1.View>} ListFooterComponent={filteredAnalyticsEvents.length > 0 ? (<EndOfListFooter_1.default count={filteredAnalyticsEvents.length} label="events"/>) : null} contentContainerStyle={[
969
+ {isAnalyticsLayoutReady ? (<react_native_1.FlatList data={filteredAnalyticsEvents} keyExtractor={keyExtractor} ListHeaderComponent={AnalyticsHeader} renderItem={renderItem} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} ListEmptyComponent={<EmptyState_1.default isSearch={analyticsSearch.length > 0} searchQuery={analyticsSearch} customTitle={analyticsSearch.length > 0
970
+ ? 'No matching analytics events'
971
+ : 'No analytics events yet'} customSub={analyticsSearch.length > 0
972
+ ? `No events matched "${analyticsSearch}"`
973
+ : 'Call setupAnalyticsLogger(analytics()) at app start.'} onClearSearch={() => setAnalyticsSearch('')}/>} ListFooterComponent={filteredAnalyticsEvents.length > 0 ? (<EndOfListFooter_1.default count={filteredAnalyticsEvents.length} label="events"/>) : null} contentContainerStyle={[
963
974
  styles_1.default.listContent,
964
975
  filteredAnalyticsEvents.length === 0 && {
965
976
  flexGrow: 1,
@@ -518,7 +518,12 @@ const ConsoleTab = react_1.default.memo(() => {
518
518
  </react_native_1.ScrollView>
519
519
  </react_native_1.View>
520
520
 
521
- <react_native_1.FlatList data={filteredConsoleLogs} keyExtractor={keyExtractor} ListHeaderComponent={listHeader} renderItem={renderItem} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} ListEmptyComponent={<EmptyState_1.default isSearch={logSearch.length > 0 || logFilters.size > 0}/>} ListFooterComponent={filteredConsoleLogs.length > 0 ? (<EndOfListFooter_1.default count={filteredConsoleLogs.length} label="logs"/>) : null} contentContainerStyle={[
521
+ <react_native_1.FlatList data={filteredConsoleLogs} keyExtractor={keyExtractor} ListHeaderComponent={listHeader} renderItem={renderItem} initialNumToRender={12} maxToRenderPerBatch={8} windowSize={5} removeClippedSubviews={true} renderToHardwareTextureAndroid={true} ListEmptyComponent={<EmptyState_1.default isSearch={logSearch.length > 0 || logFilters.size > 0} searchQuery={logSearch} customTitle={logSearch.length > 0
522
+ ? 'No matching console logs'
523
+ : 'No console logs'} onClearSearch={() => {
524
+ setLogSearch('');
525
+ setLogFilters(new Set());
526
+ }}/>} ListFooterComponent={filteredConsoleLogs.length > 0 ? (<EndOfListFooter_1.default count={filteredConsoleLogs.length} label="logs"/>) : null} contentContainerStyle={[
522
527
  styles_1.default.listContent,
523
528
  filteredConsoleLogs.length === 0 && { flexGrow: 1 },
524
529
  ]} keyboardShouldPersistTaps="handled"/>
@@ -44,6 +44,7 @@ const TouchableScale_1 = __importDefault(require("../TouchableScale"));
44
44
  const SegmentedTabs_1 = __importDefault(require("../SegmentedTabs"));
45
45
  const HighlightText_1 = __importDefault(require("../HighlightText"));
46
46
  const JsonViewer_1 = __importDefault(require("../JsonViewer"));
47
+ const CopyButton_1 = __importDefault(require("../CopyButton"));
47
48
  const AppColors_1 = require("../../styles/AppColors");
48
49
  const AppFonts_1 = require("../../styles/AppFonts");
49
50
  const crashHandler_1 = require("../../customHooks/crashHandler");
@@ -366,9 +367,20 @@ const CrashDetail = react_1.default.memo(() => {
366
367
  {activeSubTab === 'diagnostics' && (<react_native_1.View style={{ gap: 12 }}>
367
368
  {/* Device & OS Diagnostics Card */}
368
369
  <react_native_1.View style={localStyles.sectionCard}>
369
- <react_native_1.View style={localStyles.sectionCardHeader}>
370
- <NetworkIcons_1.GlobeIcon color={AppColors_1.AppColors.purple} size={14}/>
371
- <react_native_1.Text style={localStyles.sectionCardTitle}>{t('crash.deviceEnvironment')}</react_native_1.Text>
370
+ <react_native_1.View style={[
371
+ localStyles.sectionCardHeader,
372
+ { justifyContent: 'space-between' },
373
+ ]}>
374
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
375
+ <NetworkIcons_1.GlobeIcon color={AppColors_1.AppColors.purple} size={14}/>
376
+ <react_native_1.Text style={localStyles.sectionCardTitle}>
377
+ {t('crash.deviceEnvironment')}
378
+ </react_native_1.Text>
379
+ </react_native_1.View>
380
+ <CopyButton_1.default value={selectedCrash.deviceInfo || {
381
+ platform: react_native_1.Platform.OS,
382
+ osVersion: String(react_native_1.Platform.Version),
383
+ }} label="Diagnostics"/>
372
384
  </react_native_1.View>
373
385
 
374
386
  <react_native_1.View style={localStyles.diagGrid}>
@@ -418,9 +430,17 @@ const CrashDetail = react_1.default.memo(() => {
418
430
 
419
431
  {/* Memory Metrics Card */}
420
432
  {selectedCrash.memoryInfo && (<react_native_1.View style={localStyles.sectionCard}>
421
- <react_native_1.View style={localStyles.sectionCardHeader}>
422
- <NetworkIcons_1.LayersIcon color={AppColors_1.AppColors.purple} size={14}/>
423
- <react_native_1.Text style={localStyles.sectionCardTitle}>{t('crash.jsHeapMemory')}</react_native_1.Text>
433
+ <react_native_1.View style={[
434
+ localStyles.sectionCardHeader,
435
+ { justifyContent: 'space-between' },
436
+ ]}>
437
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
438
+ <NetworkIcons_1.LayersIcon color={AppColors_1.AppColors.purple} size={14}/>
439
+ <react_native_1.Text style={localStyles.sectionCardTitle}>
440
+ {t('crash.jsHeapMemory')}
441
+ </react_native_1.Text>
442
+ </react_native_1.View>
443
+ <CopyButton_1.default value={selectedCrash.memoryInfo} label="Memory Info"/>
424
444
  </react_native_1.View>
425
445
 
426
446
  <react_native_1.View style={localStyles.diagGrid}>
@@ -443,6 +463,13 @@ const CrashDetail = react_1.default.memo(() => {
443
463
 
444
464
  {/* 3. BREADCRUMBS TAB */}
445
465
  {activeSubTab === 'breadcrumbs' && (<react_native_1.View style={{ gap: 10 }}>
466
+ {selectedCrash.breadcrumbs && selectedCrash.breadcrumbs.length > 0 && (<react_native_1.View style={{
467
+ flexDirection: 'row',
468
+ justifyContent: 'flex-end',
469
+ marginBottom: 2,
470
+ }}>
471
+ <CopyButton_1.default value={selectedCrash.breadcrumbs} label="All Breadcrumbs"/>
472
+ </react_native_1.View>)}
446
473
  {selectedCrash.breadcrumbs && selectedCrash.breadcrumbs.length > 0 ? (selectedCrash.breadcrumbs.map((b, idx) => (<react_native_1.View key={`crumb_${idx}`} style={localStyles.breadcrumbCard}>
447
474
  <react_native_1.View style={localStyles.breadcrumbHeader}>
448
475
  <react_native_1.View style={localStyles.breadcrumbTag}>
@@ -450,9 +477,16 @@ const CrashDetail = react_1.default.memo(() => {
450
477
  {b.type.toUpperCase()}
451
478
  </react_native_1.Text>
452
479
  </react_native_1.View>
453
- <react_native_1.Text style={localStyles.breadcrumbTime}>
454
- {new Date(b.timestamp).toLocaleTimeString()}
455
- </react_native_1.Text>
480
+ <react_native_1.View style={{
481
+ flexDirection: 'row',
482
+ alignItems: 'center',
483
+ gap: 8,
484
+ }}>
485
+ <react_native_1.Text style={localStyles.breadcrumbTime}>
486
+ {new Date(b.timestamp).toLocaleTimeString()}
487
+ </react_native_1.Text>
488
+ <CopyButton_1.default value={`${new Date(b.timestamp).toLocaleTimeString()} [${b.type.toUpperCase()}] ${b.message}${b.data ? ' ' + JSON.stringify(b.data) : ''}`} label="Breadcrumb"/>
489
+ </react_native_1.View>
456
490
  </react_native_1.View>
457
491
  <react_native_1.Text style={localStyles.breadcrumbMessage}>{b.message}</react_native_1.Text>
458
492
  {b.data && (<react_native_1.View style={{ marginTop: 6 }}>
@@ -345,9 +345,25 @@ const CrashTab = react_1.default.memo(() => {
345
345
  <react_native_1.View style={localStyles.searchInputWrapper}>
346
346
  <NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
347
347
  <react_native_1.TextInput value={searchQuery} onChangeText={setSearchQuery} placeholder={t('crash.searchPlaceholder')} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} style={localStyles.searchInput} autoCapitalize="none" autoCorrect={false}/>
348
- {searchQuery.length > 0 && (<react_native_1.TouchableOpacity onPress={() => setSearchQuery('')} hitSlop={8}>
349
- <NetworkIcons_1.ClearIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
350
- </react_native_1.TouchableOpacity>)}
348
+ {searchQuery.length > 0 && (<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 4 }}>
349
+ <react_native_1.View style={{
350
+ backgroundColor: `${AppColors_1.AppColors.purple}20`,
351
+ borderRadius: 10,
352
+ paddingHorizontal: 6,
353
+ paddingVertical: 1.5,
354
+ }}>
355
+ <react_native_1.Text style={{
356
+ color: AppColors_1.AppColors.purple,
357
+ fontSize: 9.5,
358
+ fontFamily: AppFonts_1.AppFonts.interBold,
359
+ }}>
360
+ {filteredList.length}
361
+ </react_native_1.Text>
362
+ </react_native_1.View>
363
+ <react_native_1.TouchableOpacity onPress={() => setSearchQuery('')} hitSlop={8}>
364
+ <NetworkIcons_1.ClearIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
365
+ </react_native_1.TouchableOpacity>
366
+ </react_native_1.View>)}
351
367
  </react_native_1.View>
352
368
 
353
369
  {/* Crash Filters */}
@@ -419,6 +435,21 @@ const CrashTab = react_1.default.memo(() => {
419
435
  ? t('crash.emptySearchSubtitle')
420
436
  : t('crash.emptySubtitle')}
421
437
  </react_native_1.Text>
438
+ {searchQuery.length > 0 && (<TouchableScale_1.default onPress={() => setSearchQuery('')} style={{
439
+ marginTop: 10,
440
+ paddingHorizontal: 14,
441
+ paddingVertical: 7,
442
+ borderRadius: 8,
443
+ backgroundColor: AppColors_1.AppColors.purple,
444
+ }}>
445
+ <react_native_1.Text style={{
446
+ fontFamily: AppFonts_1.AppFonts.interBold,
447
+ fontSize: 11.5,
448
+ color: AppColors_1.AppColors.white,
449
+ }}>
450
+ Clear Search
451
+ </react_native_1.Text>
452
+ </TouchableScale_1.default>)}
422
453
  </react_native_1.ScrollView>) : (<react_native_1.FlatList 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 />}/>)}
423
454
 
424
455
  {/* Filter Modal */}