react-native-inapp-inspector 1.1.26 → 1.1.28

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 (67) hide show
  1. package/android/build.gradle +1 -0
  2. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.java +34 -0
  3. package/dist/commonjs/components/ErrorBoundary.d.ts +1 -1
  4. package/dist/commonjs/components/ErrorBoundary.js +530 -100
  5. package/dist/commonjs/components/Inspector/AnalyticsTab.js +176 -126
  6. package/dist/commonjs/components/Inspector/BundleTab.d.ts +1 -0
  7. package/dist/commonjs/components/Inspector/BundleTab.js +145 -21
  8. package/dist/commonjs/components/Inspector/CrashTab.js +0 -8
  9. package/dist/commonjs/components/Inspector/NetworkDetail.js +41 -0
  10. package/dist/commonjs/components/Inspector/PerformanceTab.d.ts +5 -0
  11. package/dist/commonjs/components/Inspector/PerformanceTab.js +588 -155
  12. package/dist/commonjs/components/Inspector/SettingsPanel.js +57 -22
  13. package/dist/commonjs/components/Inspector/TabBar.js +13 -1
  14. package/dist/commonjs/components/LogCard.js +75 -34
  15. package/dist/commonjs/components/NetworkIcons.d.ts +112 -102
  16. package/dist/commonjs/constants/version.d.ts +1 -1
  17. package/dist/commonjs/constants/version.js +1 -1
  18. package/dist/commonjs/customHooks/analyticsLogger.d.ts +1 -11
  19. package/dist/commonjs/customHooks/analyticsLogger.js +8 -1
  20. package/dist/commonjs/customHooks/bundleAnalyzer.js +121 -124
  21. package/dist/commonjs/customHooks/networkLogger.d.ts +1 -0
  22. package/dist/commonjs/customHooks/networkLogger.js +16 -0
  23. package/dist/commonjs/customHooks/performanceTracker.d.ts +74 -0
  24. package/dist/commonjs/customHooks/performanceTracker.js +546 -392
  25. package/dist/commonjs/customHooks/reduxLogger.d.ts +1 -0
  26. package/dist/commonjs/customHooks/reduxLogger.js +3 -1
  27. package/dist/commonjs/helpers/index.js +27 -3
  28. package/dist/commonjs/i18n/locales/en.json +225 -4
  29. package/dist/commonjs/index.d.ts +1 -1
  30. package/dist/commonjs/index.js +36 -2
  31. package/dist/commonjs/styles/index.d.ts +3 -1
  32. package/dist/commonjs/styles/index.js +8 -6
  33. package/dist/commonjs/types/interfaces.d.ts +3 -0
  34. package/dist/esm/components/ErrorBoundary.d.ts +1 -1
  35. package/dist/esm/components/ErrorBoundary.js +498 -101
  36. package/dist/esm/components/Inspector/AnalyticsTab.js +177 -127
  37. package/dist/esm/components/Inspector/BundleTab.d.ts +1 -0
  38. package/dist/esm/components/Inspector/BundleTab.js +145 -23
  39. package/dist/esm/components/Inspector/CrashTab.js +0 -8
  40. package/dist/esm/components/Inspector/NetworkDetail.js +41 -0
  41. package/dist/esm/components/Inspector/PerformanceTab.d.ts +5 -0
  42. package/dist/esm/components/Inspector/PerformanceTab.js +591 -158
  43. package/dist/esm/components/Inspector/SettingsPanel.js +57 -22
  44. package/dist/esm/components/Inspector/TabBar.js +13 -1
  45. package/dist/esm/components/LogCard.js +75 -34
  46. package/dist/esm/components/NetworkIcons.d.ts +112 -102
  47. package/dist/esm/constants/version.d.ts +1 -1
  48. package/dist/esm/constants/version.js +1 -1
  49. package/dist/esm/customHooks/analyticsLogger.d.ts +1 -11
  50. package/dist/esm/customHooks/analyticsLogger.js +6 -0
  51. package/dist/esm/customHooks/bundleAnalyzer.js +121 -124
  52. package/dist/esm/customHooks/networkLogger.d.ts +1 -0
  53. package/dist/esm/customHooks/networkLogger.js +16 -0
  54. package/dist/esm/customHooks/performanceTracker.d.ts +74 -0
  55. package/dist/esm/customHooks/performanceTracker.js +531 -391
  56. package/dist/esm/customHooks/reduxLogger.d.ts +1 -0
  57. package/dist/esm/customHooks/reduxLogger.js +1 -0
  58. package/dist/esm/helpers/index.js +27 -3
  59. package/dist/esm/i18n/locales/en.json +225 -4
  60. package/dist/esm/index.d.ts +1 -1
  61. package/dist/esm/index.js +24 -3
  62. package/dist/esm/styles/index.d.ts +3 -1
  63. package/dist/esm/styles/index.js +8 -6
  64. package/dist/esm/types/interfaces.d.ts +3 -0
  65. package/ios/NetworkInspectorModule.h +2 -0
  66. package/ios/NetworkInspectorModule.m +10 -0
  67. package/package.json +1 -1
@@ -1,45 +1,110 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.ErrorBoundary = void 0;
4
- const react_1 = require("react");
37
+ const react_1 = __importStar(require("react"));
5
38
  const react_native_1 = require("react-native");
6
39
  const AppColors_1 = require("../styles/AppColors");
7
40
  const AppFonts_1 = require("../styles/AppFonts");
8
41
  const helpers_1 = require("../helpers");
42
+ const i18n_1 = require("../i18n");
43
+ const NetworkIcons_1 = require("./NetworkIcons");
9
44
  const crashHandler_1 = require("../customHooks/crashHandler");
10
45
  const enums_1 = require("../types/enums");
11
46
  function parseStackTrace(stack) {
12
47
  if (!stack)
13
- return null;
48
+ return { rootFrame: null, frames: [] };
14
49
  const lines = stack.split('\n');
50
+ const frames = [];
15
51
  for (const line of lines) {
16
52
  if (line.includes('ErrorBoundary') ||
17
53
  line.includes('getDerivedStateFromError') ||
18
- line.includes('componentDidCatch')) {
54
+ line.includes('componentDidCatch') ||
55
+ line.includes('handleInterceptedCrash')) {
19
56
  continue;
20
57
  }
21
- // Matching ios format: method@url:line:col
22
- const iosMatch = line.match(/^([^@]+)@(.*):(\d+):(\d+)$/);
58
+ // iOS format: method@url:line:col
59
+ const iosMatch = line.match(/^([^@]*)@(.*):(\d+):(\d+)$/);
23
60
  if (iosMatch) {
24
- const [, method, file, lineNum, colNum] = iosMatch;
25
- const cleanFile = file.split('?')[0].split('/').pop() || file;
26
- return { method: method.trim(), file: cleanFile, line: lineNum, column: colNum };
61
+ const [, method, fullPath, lineNum, colNum] = iosMatch;
62
+ const cleanFile = fullPath.split('?')[0].split('/').pop() || fullPath;
63
+ const isProject = !fullPath.includes('node_modules') && !fullPath.includes('Libraries/Core');
64
+ frames.push({
65
+ method: method.trim() || 'anonymous',
66
+ file: cleanFile,
67
+ fullPath: fullPath.split('?')[0],
68
+ line: lineNum,
69
+ column: colNum,
70
+ isProjectFile: isProject,
71
+ });
72
+ continue;
27
73
  }
28
- // Matching android format: at method (url:line:col) or at url:line:col
74
+ // Android format: at method (url:line:col) or at url:line:col
29
75
  const androidMatch = line.match(/^\s*at\s+(.+)\s+\((.+):(\d+):(\d+)\)$/);
30
76
  if (androidMatch) {
31
- const [, method, file, lineNum, colNum] = androidMatch;
32
- const cleanFile = file.split('?')[0].split('/').pop() || file;
33
- return { method: method.trim(), file: cleanFile, line: lineNum, column: colNum };
77
+ const [, method, fullPath, lineNum, colNum] = androidMatch;
78
+ const cleanFile = fullPath.split('?')[0].split('/').pop() || fullPath;
79
+ const isProject = !fullPath.includes('node_modules') && !fullPath.includes('Libraries/Core');
80
+ frames.push({
81
+ method: method.trim(),
82
+ file: cleanFile,
83
+ fullPath: fullPath.split('?')[0],
84
+ line: lineNum,
85
+ column: colNum,
86
+ isProjectFile: isProject,
87
+ });
88
+ continue;
34
89
  }
35
90
  const androidMatchSimple = line.match(/^\s*at\s+(.+):(\d+):(\d+)$/);
36
91
  if (androidMatchSimple) {
37
- const [, file, lineNum, colNum] = androidMatchSimple;
38
- const cleanFile = file.split('?')[0].split('/').pop() || file;
39
- return { method: 'anonymous', file: cleanFile, line: lineNum, column: colNum };
92
+ const [, fullPath, lineNum, colNum] = androidMatchSimple;
93
+ const cleanFile = fullPath.split('?')[0].split('/').pop() || fullPath;
94
+ const isProject = !fullPath.includes('node_modules') && !fullPath.includes('Libraries/Core');
95
+ frames.push({
96
+ method: 'anonymous',
97
+ file: cleanFile,
98
+ fullPath: fullPath.split('?')[0],
99
+ line: lineNum,
100
+ column: colNum,
101
+ isProjectFile: isProject,
102
+ });
40
103
  }
41
104
  }
42
- return null;
105
+ // Find topmost project frame, or fallback to first frame
106
+ const rootFrame = frames.find(f => f.isProjectFile) || frames[0] || null;
107
+ return { rootFrame, frames };
43
108
  }
44
109
  class ErrorBoundary extends react_1.Component {
45
110
  constructor() {
@@ -57,14 +122,19 @@ class ErrorBoundary extends react_1.Component {
57
122
  this.handleCopyTrace = () => {
58
123
  const error = this.state.error;
59
124
  if (error) {
60
- const isNativeCrash = error.message.includes('Native') || error.message.includes('native') || error.message.includes('Swift') || error.message.includes('Java');
61
- const parsed = error.stack ? parseStackTrace(error.stack) : null;
62
- const detailStr = `Crash Source: ${isNativeCrash ? 'Native Crash' : 'JavaScript Crash'}
125
+ const { rootFrame } = parseStackTrace(error.stack || '');
126
+ const detailStr = `─────────────────────────────────────────────────────────────
127
+ IN-APP INSPECTOR INTERCEPTED CRASH REPORT
128
+ ─────────────────────────────────────────────────────────────
129
+ Error: ${error.name || 'Error'}
63
130
  Message: ${error.message}
64
- ${parsed ? `Method: ${parsed.method}\nFile: ${parsed.file}\nLine: ${parsed.line}:${parsed.column}` : ''}
131
+ ${rootFrame ? `Location: ${rootFrame.file}:${rootFrame.line}:${rootFrame.column}\nMethod: ${rootFrame.method}\nPath: ${rootFrame.fullPath}` : ''}
132
+ Timestamp: ${new Date().toISOString()}
133
+
65
134
  Stack Trace:
66
- ${error.stack}`;
67
- (0, helpers_1.copyToClipboard)(detailStr, 'Crash traceback');
135
+ ${error.stack || 'No stack trace available'}
136
+ ─────────────────────────────────────────────────────────────`;
137
+ (0, helpers_1.copyToClipboard)(detailStr, (0, i18n_1.t)('errors.errorReport'));
68
138
  }
69
139
  };
70
140
  }
@@ -73,133 +143,493 @@ ${error.stack}`;
73
143
  }
74
144
  componentDidCatch(error, errorInfo) {
75
145
  try {
76
- const stack = error?.stack || errorInfo?.componentStack;
146
+ const stack = error?.stack || errorInfo?.componentStack || '';
77
147
  (0, crashHandler_1.handleInterceptedCrash)(error, stack, false, enums_1.CrashType.Render, errorInfo?.componentStack);
78
148
  }
79
149
  catch { }
80
150
  }
81
151
  render() {
82
- if (this.state.hasError) {
83
- return null;
152
+ const { hasError, error } = this.state;
153
+ if (!hasError || !error) {
154
+ return this.props.children;
155
+ }
156
+ const { rootFrame, frames } = parseStackTrace(error.stack || '');
157
+ const errorType = error.name || (0, i18n_1.t)('errors.title');
158
+ const isSyntaxOrType = errorType.includes('Syntax') ||
159
+ errorType.includes('Type') ||
160
+ errorType.includes('Reference');
161
+ // ─── Inline Fallback View ─────────────────────────────────────────────
162
+ if (this.props.fallbackType === 'inline') {
163
+ return (<react_native_1.View style={styles.inlineContainer}>
164
+ <react_native_1.View style={styles.inlineHeader}>
165
+ <NetworkIcons_1.WarningTriangleIcon color={AppColors_1.AppColors.red600} size={18}/>
166
+ <react_native_1.View style={{ flex: 1 }}>
167
+ <react_native_1.Text style={styles.inlineTitle} numberOfLines={1}>
168
+ {errorType}: {error.message}
169
+ </react_native_1.Text>
170
+ {rootFrame && (<react_native_1.Text style={styles.inlineLoc} numberOfLines={1}>
171
+ {rootFrame.file}:{rootFrame.line} ({rootFrame.method})
172
+ </react_native_1.Text>)}
173
+ </react_native_1.View>
174
+ </react_native_1.View>
175
+ <react_native_1.View style={styles.inlineActions}>
176
+ <react_native_1.TouchableOpacity onPress={this.handleReset} style={styles.inlineBtn} activeOpacity={0.7}>
177
+ <NetworkIcons_1.RefreshCcwIcon size={12} color={AppColors_1.AppColors.white}/>
178
+ <react_native_1.Text style={styles.inlineBtnText}>{(0, i18n_1.t)('errors.retry')}</react_native_1.Text>
179
+ </react_native_1.TouchableOpacity>
180
+ <react_native_1.TouchableOpacity onPress={this.handleCopyTrace} style={styles.inlineCopyBtn} activeOpacity={0.7}>
181
+ <NetworkIcons_1.CopyIcon size={12} color={AppColors_1.AppColors.redErrorText}/>
182
+ <react_native_1.Text style={styles.inlineCopyBtnText}>{(0, i18n_1.t)('errors.copy')}</react_native_1.Text>
183
+ </react_native_1.TouchableOpacity>
184
+ </react_native_1.View>
185
+ </react_native_1.View>);
84
186
  }
85
- return this.props.children;
187
+ // ─── Full-Screen Custom Native Recovery Modal ─────────────────────────
188
+ return (<react_native_1.SafeAreaView style={styles.safeArea}>
189
+ <react_native_1.View style={styles.container}>
190
+ {/* Header Banner */}
191
+ <react_native_1.View style={styles.header}>
192
+ <react_native_1.View style={styles.iconGlowWrap}>
193
+ <NetworkIcons_1.WarningTriangleIcon color={AppColors_1.AppColors.red500} size={28}/>
194
+ </react_native_1.View>
195
+ <react_native_1.View style={{ flex: 1 }}>
196
+ <react_native_1.View style={styles.badgeRow}>
197
+ <react_native_1.View style={styles.crashBadge}>
198
+ <react_native_1.Text style={styles.crashBadgeText}>
199
+ {isSyntaxOrType ? `JS ${errorType.toUpperCase()}` : (0, i18n_1.t)('errors.crashIntercepted')}
200
+ </react_native_1.Text>
201
+ </react_native_1.View>
202
+ <react_native_1.View style={styles.shieldBadge}>
203
+ <react_native_1.Text style={styles.shieldBadgeText}>{(0, i18n_1.t)('errors.protected')}</react_native_1.Text>
204
+ </react_native_1.View>
205
+ </react_native_1.View>
206
+ <react_native_1.Text style={styles.title}>{(0, i18n_1.t)('errors.rootCauseTitle')}</react_native_1.Text>
207
+ <react_native_1.Text style={styles.subtitle}>{(0, i18n_1.t)('errors.rootCauseSubtitle')}</react_native_1.Text>
208
+ </react_native_1.View>
209
+ {this.props.onClose && (<react_native_1.TouchableOpacity onPress={this.props.onClose} style={styles.closeIconBtn} activeOpacity={0.7}>
210
+ <NetworkIcons_1.ClearIcon size={16} color={AppColors_1.AppColors.slate400}/>
211
+ </react_native_1.TouchableOpacity>)}
212
+ </react_native_1.View>
213
+
214
+ <react_native_1.ScrollView style={styles.scrollArea} contentContainerStyle={styles.scrollContent} showsVerticalScrollIndicator={false}>
215
+ {/* Error Message Box */}
216
+ <react_native_1.View style={styles.errorBox}>
217
+ <react_native_1.View style={styles.errorBoxHeader}>
218
+ <NetworkIcons_1.CircleAlertIcon size={14} color={AppColors_1.AppColors.red500}/>
219
+ <react_native_1.Text style={styles.errorBoxTitle}>{errorType}</react_native_1.Text>
220
+ </react_native_1.View>
221
+ <react_native_1.Text style={styles.errorMessage}>{error.message}</react_native_1.Text>
222
+ </react_native_1.View>
223
+
224
+ {/* Root Cause Location Card */}
225
+ {rootFrame && (<react_native_1.View style={styles.locationCard}>
226
+ <react_native_1.Text style={styles.cardHeaderTitle}>{(0, i18n_1.t)('errors.exactLocation')}</react_native_1.Text>
227
+ <react_native_1.View style={styles.locRow}>
228
+ <react_native_1.Text style={styles.locLabel}>{(0, i18n_1.t)('errors.file')}</react_native_1.Text>
229
+ <react_native_1.Text style={styles.locValFile} numberOfLines={1}>
230
+ {rootFrame.file}
231
+ </react_native_1.Text>
232
+ </react_native_1.View>
233
+ <react_native_1.View style={styles.locRow}>
234
+ <react_native_1.Text style={styles.locLabel}>{(0, i18n_1.t)('errors.lineCol')}</react_native_1.Text>
235
+ <react_native_1.Text style={styles.locValNum}>
236
+ {(0, i18n_1.t)('errors.lineColVal', { line: rootFrame.line, col: rootFrame.column })}
237
+ </react_native_1.Text>
238
+ </react_native_1.View>
239
+ <react_native_1.View style={styles.locRow}>
240
+ <react_native_1.Text style={styles.locLabel}>{(0, i18n_1.t)('errors.function')}</react_native_1.Text>
241
+ <react_native_1.Text style={styles.locValMethod}>{rootFrame.method}()</react_native_1.Text>
242
+ </react_native_1.View>
243
+ {rootFrame.fullPath ? (<react_native_1.Text style={styles.fullPathText} numberOfLines={2}>
244
+ {rootFrame.fullPath}
245
+ </react_native_1.Text>) : null}
246
+ </react_native_1.View>)}
247
+
248
+ {/* Formatted Stack Frames */}
249
+ <react_native_1.View style={styles.stackCard}>
250
+ <react_native_1.View style={styles.stackCardHeader}>
251
+ <react_native_1.Text style={styles.cardHeaderTitle}>{(0, i18n_1.t)('errors.callStack')}</react_native_1.Text>
252
+ <react_native_1.Text style={styles.frameCountText}>
253
+ {(0, i18n_1.t)('errors.framesCount', { count: frames.length })}
254
+ </react_native_1.Text>
255
+ </react_native_1.View>
256
+
257
+ {frames.slice(0, 8).map((frame, idx) => (<react_native_1.View key={idx} style={[
258
+ styles.frameItem,
259
+ frame.isProjectFile && styles.frameItemProject,
260
+ ]}>
261
+ <react_native_1.View style={styles.frameNumBadge}>
262
+ <react_native_1.Text style={[
263
+ styles.frameNumText,
264
+ frame.isProjectFile && { color: AppColors_1.AppColors.sky400 },
265
+ ]}>
266
+ #{idx + 1}
267
+ </react_native_1.Text>
268
+ </react_native_1.View>
269
+ <react_native_1.View style={{ flex: 1 }}>
270
+ <react_native_1.Text style={[
271
+ styles.frameMethod,
272
+ frame.isProjectFile && styles.frameMethodProject,
273
+ ]} numberOfLines={1}>
274
+ {frame.method}
275
+ </react_native_1.Text>
276
+ <react_native_1.Text style={styles.frameLoc} numberOfLines={1}>
277
+ {frame.file}:{frame.line}:{frame.column}
278
+ </react_native_1.Text>
279
+ </react_native_1.View>
280
+ {frame.isProjectFile && (<react_native_1.View style={styles.appTag}>
281
+ <react_native_1.Text style={styles.appTagText}>{(0, i18n_1.t)('errors.appTag')}</react_native_1.Text>
282
+ </react_native_1.View>)}
283
+ </react_native_1.View>))}
284
+ </react_native_1.View>
285
+ </react_native_1.ScrollView>
286
+
287
+ {/* Action Buttons Footer */}
288
+ <react_native_1.View style={styles.footer}>
289
+ <react_native_1.TouchableOpacity onPress={this.handleReset} style={styles.retryBtn} activeOpacity={0.8}>
290
+ <NetworkIcons_1.RefreshCcwIcon size={16} color={AppColors_1.AppColors.white}/>
291
+ <react_native_1.Text style={styles.retryBtnText}>{(0, i18n_1.t)('errors.tryAgainRecover')}</react_native_1.Text>
292
+ </react_native_1.TouchableOpacity>
293
+
294
+ <react_native_1.TouchableOpacity onPress={this.handleCopyTrace} style={styles.copyBtn} activeOpacity={0.8}>
295
+ <NetworkIcons_1.CopyIcon size={16} color={AppColors_1.AppColors.slate900}/>
296
+ <react_native_1.Text style={styles.copyBtnText}>{(0, i18n_1.t)('errors.copyDiagnostics')}</react_native_1.Text>
297
+ </react_native_1.TouchableOpacity>
298
+ </react_native_1.View>
299
+ </react_native_1.View>
300
+ </react_native_1.SafeAreaView>);
86
301
  }
87
302
  }
88
303
  exports.ErrorBoundary = ErrorBoundary;
89
- const monoFont = AppFonts_1.AppFonts.interRegular;
90
304
  const styles = react_native_1.StyleSheet.create({
305
+ safeArea: {
306
+ flex: 1,
307
+ backgroundColor: AppColors_1.AppColors.slate850,
308
+ },
91
309
  container: {
92
310
  flex: 1,
93
- backgroundColor: `${AppColors_1.AppColors.black}4D`,
94
- justifyContent: 'center',
311
+ backgroundColor: AppColors_1.AppColors.slate850,
312
+ },
313
+ header: {
314
+ flexDirection: 'row',
315
+ alignItems: 'flex-start',
316
+ paddingHorizontal: 16,
317
+ paddingTop: 14,
318
+ paddingBottom: 12,
319
+ borderBottomWidth: 1,
320
+ borderBottomColor: AppColors_1.AppColors.slate800,
321
+ gap: 12,
322
+ },
323
+ iconGlowWrap: {
324
+ width: 44,
325
+ height: 44,
326
+ borderRadius: 12,
327
+ backgroundColor: `${AppColors_1.AppColors.red500}26`,
328
+ borderWidth: 1,
329
+ borderColor: `${AppColors_1.AppColors.red500}59`,
95
330
  alignItems: 'center',
96
- padding: 16,
331
+ justifyContent: 'center',
332
+ marginTop: 2,
97
333
  },
98
- card: {
99
- width: '100%',
100
- maxWidth: 400,
101
- backgroundColor: AppColors_1.AppColors.white,
102
- borderRadius: 16,
103
- padding: 20,
334
+ badgeRow: {
335
+ flexDirection: 'row',
104
336
  alignItems: 'center',
105
- shadowColor: AppColors_1.AppColors.black,
106
- shadowOffset: { width: 0, height: 4 },
107
- shadowOpacity: 0.1,
108
- shadowRadius: 12,
109
- elevation: 8,
337
+ gap: 6,
338
+ marginBottom: 4,
339
+ },
340
+ crashBadge: {
341
+ backgroundColor: `${AppColors_1.AppColors.red500}33`,
342
+ paddingHorizontal: 7,
343
+ paddingVertical: 2,
344
+ borderRadius: 4,
345
+ borderWidth: 1,
346
+ borderColor: `${AppColors_1.AppColors.red500}66`,
347
+ },
348
+ crashBadgeText: {
349
+ fontFamily: AppFonts_1.AppFonts.interBold,
350
+ fontSize: 9.5,
351
+ color: AppColors_1.AppColors.red500,
352
+ letterSpacing: 0.5,
353
+ },
354
+ shieldBadge: {
355
+ backgroundColor: `${AppColors_1.AppColors.emerald500}26`,
356
+ paddingHorizontal: 6,
357
+ paddingVertical: 2,
358
+ borderRadius: 4,
359
+ borderWidth: 1,
360
+ borderColor: `${AppColors_1.AppColors.emerald500}4D`,
361
+ },
362
+ shieldBadgeText: {
363
+ fontFamily: AppFonts_1.AppFonts.interBold,
364
+ fontSize: 9,
365
+ color: AppColors_1.AppColors.emerald500,
366
+ letterSpacing: 0.5,
110
367
  },
111
368
  title: {
112
- fontFamily: AppFonts_1.AppFonts.interBold || 'System',
113
- fontSize: 18,
114
- color: AppColors_1.AppColors.slate900,
115
- marginBottom: 8,
116
- textAlign: 'center',
369
+ fontFamily: AppFonts_1.AppFonts.interBold,
370
+ fontSize: 16,
371
+ color: AppColors_1.AppColors.white,
372
+ letterSpacing: -0.2,
117
373
  },
118
374
  subtitle: {
119
- fontFamily: AppFonts_1.AppFonts.interRegular || 'System',
120
- fontSize: 12,
121
- color: AppColors_1.AppColors.slate500,
122
- lineHeight: 18,
123
- textAlign: 'center',
124
- marginBottom: 16,
125
- },
126
- scroll: {
127
- width: '100%',
128
- maxHeight: 180,
129
- backgroundColor: AppColors_1.AppColors.slate50,
375
+ fontFamily: AppFonts_1.AppFonts.interRegular,
376
+ fontSize: 11,
377
+ color: AppColors_1.AppColors.slate400,
378
+ marginTop: 1,
379
+ },
380
+ closeIconBtn: {
381
+ padding: 6,
130
382
  borderRadius: 8,
131
- borderWidth: 1,
132
- borderColor: AppColors_1.AppColors.slate200,
133
- padding: 10,
134
- marginBottom: 20,
383
+ backgroundColor: AppColors_1.AppColors.slate800,
384
+ },
385
+ scrollArea: {
386
+ flex: 1,
135
387
  },
136
388
  scrollContent: {
137
- paddingBottom: 10,
389
+ padding: 16,
390
+ gap: 12,
138
391
  },
139
- code: {
140
- fontFamily: monoFont,
141
- fontSize: 11,
142
- color: AppColors_1.AppColors.rose600,
392
+ errorBox: {
393
+ backgroundColor: `${AppColors_1.AppColors.red500}1A`,
394
+ borderRadius: 12,
395
+ borderWidth: 1,
396
+ borderColor: `${AppColors_1.AppColors.red500}40`,
397
+ padding: 14,
398
+ gap: 6,
143
399
  },
144
- btnRow: {
400
+ errorBoxHeader: {
145
401
  flexDirection: 'row',
146
- gap: 12,
147
- width: '100%',
402
+ alignItems: 'center',
403
+ gap: 6,
404
+ },
405
+ errorBoxTitle: {
406
+ fontFamily: AppFonts_1.AppFonts.interBold,
407
+ fontSize: 12,
408
+ color: AppColors_1.AppColors.red500,
409
+ letterSpacing: 0.3,
410
+ },
411
+ errorMessage: {
412
+ fontFamily: AppFonts_1.AppFonts.interBold,
413
+ fontSize: 13.5,
414
+ color: AppColors_1.AppColors.red100,
415
+ lineHeight: 19,
416
+ },
417
+ locationCard: {
418
+ backgroundColor: AppColors_1.AppColors.slate800,
419
+ borderRadius: 12,
420
+ padding: 14,
421
+ borderWidth: 1,
422
+ borderColor: AppColors_1.AppColors.slate700,
423
+ gap: 8,
424
+ },
425
+ cardHeaderTitle: {
426
+ fontFamily: AppFonts_1.AppFonts.interBold,
427
+ fontSize: 10.5,
428
+ color: AppColors_1.AppColors.slate400,
429
+ letterSpacing: 0.8,
430
+ },
431
+ locRow: {
432
+ flexDirection: 'row',
433
+ alignItems: 'center',
434
+ justifyContent: 'space-between',
435
+ gap: 8,
436
+ },
437
+ locLabel: {
438
+ fontFamily: AppFonts_1.AppFonts.interMedium,
439
+ fontSize: 12,
440
+ color: AppColors_1.AppColors.slate400,
441
+ minWidth: 80,
148
442
  },
149
- resetBtn: {
443
+ locValFile: {
444
+ fontFamily: AppFonts_1.AppFonts.interBold,
445
+ fontSize: 12.5,
446
+ color: AppColors_1.AppColors.sky400,
150
447
  flex: 1,
151
- backgroundColor: AppColors_1.AppColors.purple,
152
- height: 40,
448
+ textAlign: 'right',
449
+ },
450
+ locValNum: {
451
+ fontFamily: AppFonts_1.AppFonts.interBold,
452
+ fontSize: 12,
453
+ color: AppColors_1.AppColors.white,
454
+ },
455
+ locValMethod: {
456
+ fontFamily: AppFonts_1.AppFonts.interMedium,
457
+ fontSize: 12,
458
+ color: AppColors_1.AppColors.purple400,
459
+ },
460
+ fullPathText: {
461
+ fontFamily: AppFonts_1.AppFonts.interRegular,
462
+ fontSize: 10,
463
+ color: AppColors_1.AppColors.slate500,
464
+ marginTop: 2,
465
+ paddingTop: 6,
466
+ borderTopWidth: 1,
467
+ borderTopColor: AppColors_1.AppColors.slate700,
468
+ },
469
+ stackCard: {
470
+ backgroundColor: AppColors_1.AppColors.slate800,
471
+ borderRadius: 12,
472
+ padding: 14,
473
+ borderWidth: 1,
474
+ borderColor: AppColors_1.AppColors.slate700,
475
+ gap: 8,
476
+ },
477
+ stackCardHeader: {
478
+ flexDirection: 'row',
479
+ justifyContent: 'space-between',
480
+ alignItems: 'center',
481
+ marginBottom: 4,
482
+ },
483
+ frameCountText: {
484
+ fontFamily: AppFonts_1.AppFonts.interMedium,
485
+ fontSize: 10.5,
486
+ color: AppColors_1.AppColors.slate400,
487
+ },
488
+ frameItem: {
489
+ flexDirection: 'row',
490
+ alignItems: 'center',
491
+ backgroundColor: AppColors_1.AppColors.slate850,
492
+ padding: 10,
153
493
  borderRadius: 8,
154
- justifyContent: 'center',
494
+ gap: 10,
495
+ borderWidth: 1,
496
+ borderColor: AppColors_1.AppColors.slate800,
497
+ },
498
+ frameItemProject: {
499
+ borderColor: `${AppColors_1.AppColors.sky400}4D`,
500
+ backgroundColor: `${AppColors_1.AppColors.sky400}0D`,
501
+ },
502
+ frameNumBadge: {
503
+ width: 24,
504
+ alignItems: 'center',
505
+ },
506
+ frameNumText: {
507
+ fontFamily: AppFonts_1.AppFonts.interBold,
508
+ fontSize: 10.5,
509
+ color: AppColors_1.AppColors.slate500,
510
+ },
511
+ frameMethod: {
512
+ fontFamily: AppFonts_1.AppFonts.interBold,
513
+ fontSize: 11.5,
514
+ color: AppColors_1.AppColors.slate200,
515
+ },
516
+ frameMethodProject: {
517
+ color: AppColors_1.AppColors.white,
518
+ },
519
+ frameLoc: {
520
+ fontFamily: AppFonts_1.AppFonts.interRegular,
521
+ fontSize: 10,
522
+ color: AppColors_1.AppColors.slate400,
523
+ marginTop: 1,
524
+ },
525
+ appTag: {
526
+ backgroundColor: `${AppColors_1.AppColors.sky400}33`,
527
+ paddingHorizontal: 5,
528
+ paddingVertical: 2,
529
+ borderRadius: 4,
530
+ },
531
+ appTagText: {
532
+ fontFamily: AppFonts_1.AppFonts.interBold,
533
+ fontSize: 8.5,
534
+ color: AppColors_1.AppColors.sky400,
535
+ },
536
+ footer: {
537
+ flexDirection: 'row',
538
+ padding: 14,
539
+ backgroundColor: AppColors_1.AppColors.slate800,
540
+ borderTopWidth: 1,
541
+ borderTopColor: AppColors_1.AppColors.slate700,
542
+ gap: 10,
543
+ },
544
+ retryBtn: {
545
+ flex: 1.2,
546
+ flexDirection: 'row',
155
547
  alignItems: 'center',
548
+ justifyContent: 'center',
549
+ gap: 8,
550
+ backgroundColor: AppColors_1.AppColors.purple,
551
+ height: 44,
552
+ borderRadius: 10,
156
553
  },
157
- resetBtnText: {
158
- fontFamily: AppFonts_1.AppFonts.interBold || 'System',
554
+ retryBtnText: {
555
+ fontFamily: AppFonts_1.AppFonts.interBold,
159
556
  fontSize: 13,
160
557
  color: AppColors_1.AppColors.white,
161
558
  },
162
- closeBtn: {
559
+ copyBtn: {
163
560
  flex: 1,
164
- backgroundColor: AppColors_1.AppColors.slate100,
165
- borderWidth: 1,
166
- borderColor: AppColors_1.AppColors.slate200,
167
- height: 40,
168
- borderRadius: 8,
169
- justifyContent: 'center',
561
+ flexDirection: 'row',
170
562
  alignItems: 'center',
563
+ justifyContent: 'center',
564
+ gap: 8,
565
+ backgroundColor: AppColors_1.AppColors.slate100,
566
+ height: 44,
567
+ borderRadius: 10,
171
568
  },
172
- closeBtnText: {
173
- fontFamily: AppFonts_1.AppFonts.interBold || 'System',
569
+ copyBtnText: {
570
+ fontFamily: AppFonts_1.AppFonts.interBold,
174
571
  fontSize: 13,
175
- color: AppColors_1.AppColors.slate600,
572
+ color: AppColors_1.AppColors.slate900,
176
573
  },
177
574
  inlineContainer: {
178
- padding: 8,
179
- backgroundColor: AppColors_1.AppColors.roseBg,
575
+ padding: 12,
576
+ backgroundColor: AppColors_1.AppColors.red50,
180
577
  borderWidth: 1,
181
578
  borderColor: AppColors_1.AppColors.errorBorder,
182
- borderRadius: 8,
183
- flexDirection: 'row',
184
- alignItems: 'center',
185
- justifyContent: 'space-between',
579
+ borderRadius: 10,
186
580
  margin: 8,
581
+ gap: 10,
582
+ },
583
+ inlineHeader: {
584
+ flexDirection: 'row',
585
+ alignItems: 'flex-start',
586
+ gap: 10,
187
587
  },
188
588
  inlineTitle: {
189
- fontFamily: AppFonts_1.AppFonts.interBold || 'System',
190
- fontSize: 11,
589
+ fontFamily: AppFonts_1.AppFonts.interBold,
590
+ fontSize: 12,
591
+ color: AppColors_1.AppColors.red600,
592
+ },
593
+ inlineLoc: {
594
+ fontFamily: AppFonts_1.AppFonts.interMedium,
595
+ fontSize: 10.5,
191
596
  color: AppColors_1.AppColors.redErrorText,
597
+ marginTop: 2,
192
598
  },
193
- inlineResetBtn: {
194
- backgroundColor: AppColors_1.AppColors.redErrorText,
599
+ inlineActions: {
600
+ flexDirection: 'row',
601
+ gap: 8,
602
+ justifyContent: 'flex-end',
603
+ },
604
+ inlineBtn: {
605
+ flexDirection: 'row',
606
+ alignItems: 'center',
607
+ gap: 4,
608
+ backgroundColor: AppColors_1.AppColors.red600,
195
609
  paddingHorizontal: 10,
196
- paddingVertical: 4,
197
- borderRadius: 4,
610
+ paddingVertical: 5,
611
+ borderRadius: 6,
198
612
  },
199
- inlineResetText: {
200
- fontFamily: AppFonts_1.AppFonts.interBold || 'System',
201
- fontSize: 10,
613
+ inlineBtnText: {
614
+ fontFamily: AppFonts_1.AppFonts.interBold,
615
+ fontSize: 11,
202
616
  color: AppColors_1.AppColors.white,
203
617
  },
618
+ inlineCopyBtn: {
619
+ flexDirection: 'row',
620
+ alignItems: 'center',
621
+ gap: 4,
622
+ backgroundColor: AppColors_1.AppColors.red100,
623
+ borderWidth: 1,
624
+ borderColor: AppColors_1.AppColors.errorBorder,
625
+ paddingHorizontal: 10,
626
+ paddingVertical: 5,
627
+ borderRadius: 6,
628
+ },
629
+ inlineCopyBtnText: {
630
+ fontFamily: AppFonts_1.AppFonts.interMedium,
631
+ fontSize: 11,
632
+ color: AppColors_1.AppColors.redErrorText,
633
+ },
204
634
  });
205
635
  exports.default = ErrorBoundary;