react-native-inapp-inspector 2.2.2 → 2.2.4

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 (159) hide show
  1. package/dist/commonjs/components/AnalyticsDetail.js +5 -1
  2. package/dist/commonjs/components/AnalyticsEventCard.js +2 -1
  3. package/dist/commonjs/components/DiffViewer.js +1 -1
  4. package/dist/commonjs/components/Inspector/BundleTab.js +22 -0
  5. package/dist/commonjs/components/Inspector/DeviceInfoTab.d.ts +3 -0
  6. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +835 -0
  7. package/dist/commonjs/components/Inspector/InspectorHeader.js +12 -14
  8. package/dist/commonjs/components/Inspector/LogDetail.js +6 -3
  9. package/dist/commonjs/components/Inspector/MainScreen.js +7 -3
  10. package/dist/commonjs/components/Inspector/NetworkTab.js +92 -15
  11. package/dist/commonjs/components/Inspector/PerformanceTab.js +38 -12
  12. package/dist/commonjs/components/Inspector/SettingsPanel.js +440 -229
  13. package/dist/commonjs/components/Inspector/StorageTab.d.ts +3 -0
  14. package/dist/commonjs/components/Inspector/StorageTab.js +892 -0
  15. package/dist/commonjs/components/Inspector/TabBar.js +14 -0
  16. package/dist/commonjs/components/Inspector/TelemetryConsentModal.js +11 -2
  17. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +4 -1
  18. package/dist/commonjs/components/NetworkIcons.d.ts +6 -0
  19. package/dist/commonjs/components/NetworkIcons.js +30 -1
  20. package/dist/commonjs/constants/version.d.ts +1 -1
  21. package/dist/commonjs/constants/version.js +1 -1
  22. package/dist/commonjs/customHooks/bundleAnalyzer.js +44 -22
  23. package/dist/commonjs/customHooks/storageInspector.d.ts +67 -0
  24. package/dist/commonjs/customHooks/storageInspector.js +486 -0
  25. package/dist/commonjs/i18n/locales/en.json +8 -2
  26. package/dist/commonjs/index.d.ts +1 -0
  27. package/dist/commonjs/index.js +16 -1
  28. package/dist/commonjs/storage.d.ts +5 -0
  29. package/dist/commonjs/storage.js +18 -0
  30. package/dist/commonjs/types/enums.d.ts +5 -0
  31. package/dist/commonjs/types/enums.js +5 -0
  32. package/dist/esm/components/AnalyticsDetail.js +6 -2
  33. package/dist/esm/components/AnalyticsEventCard.js +2 -1
  34. package/dist/esm/components/DiffViewer.js +1 -1
  35. package/dist/esm/components/Inspector/BundleTab.js +22 -0
  36. package/dist/esm/components/Inspector/DeviceInfoTab.d.ts +3 -0
  37. package/dist/esm/components/Inspector/DeviceInfoTab.js +796 -0
  38. package/dist/esm/components/Inspector/InspectorHeader.js +13 -15
  39. package/dist/esm/components/Inspector/LogDetail.js +7 -4
  40. package/dist/esm/components/Inspector/MainScreen.js +7 -3
  41. package/dist/esm/components/Inspector/NetworkTab.js +93 -16
  42. package/dist/esm/components/Inspector/PerformanceTab.js +39 -13
  43. package/dist/esm/components/Inspector/SettingsPanel.js +441 -230
  44. package/dist/esm/components/Inspector/StorageTab.d.ts +3 -0
  45. package/dist/esm/components/Inspector/StorageTab.js +853 -0
  46. package/dist/esm/components/Inspector/TabBar.js +15 -1
  47. package/dist/esm/components/Inspector/TelemetryConsentModal.js +11 -2
  48. package/dist/esm/components/Inspector/UpdateAvailableModal.js +4 -1
  49. package/dist/esm/components/NetworkIcons.d.ts +6 -0
  50. package/dist/esm/components/NetworkIcons.js +23 -0
  51. package/dist/esm/constants/version.d.ts +1 -1
  52. package/dist/esm/constants/version.js +1 -1
  53. package/dist/esm/customHooks/bundleAnalyzer.js +44 -22
  54. package/dist/esm/customHooks/storageInspector.d.ts +67 -0
  55. package/dist/esm/customHooks/storageInspector.js +469 -0
  56. package/dist/esm/i18n/locales/en.json +8 -2
  57. package/dist/esm/index.d.ts +1 -0
  58. package/dist/esm/index.js +5 -0
  59. package/dist/esm/storage.d.ts +5 -0
  60. package/dist/esm/storage.js +5 -0
  61. package/dist/esm/types/enums.d.ts +5 -0
  62. package/dist/esm/types/enums.js +5 -0
  63. package/package.json +9 -1
  64. package/src/analytics.ts +35 -0
  65. package/src/bundle.ts +25 -0
  66. package/src/components/AnalyticsDetail.tsx +870 -0
  67. package/src/components/AnalyticsEventCard.tsx +442 -0
  68. package/src/components/AnalyticsGraph.tsx +583 -0
  69. package/src/components/AnimatedEntrance.tsx +64 -0
  70. package/src/components/AppHeaderLogo.tsx +109 -0
  71. package/src/components/BrandCircleIcon.tsx +144 -0
  72. package/src/components/BrandSquareIcon.tsx +144 -0
  73. package/src/components/CodeSnippet.tsx +725 -0
  74. package/src/components/ConsoleLogCard.tsx +628 -0
  75. package/src/components/CopyButton.tsx +87 -0
  76. package/src/components/DiffViewer.tsx +82 -0
  77. package/src/components/DomainHeader.tsx +237 -0
  78. package/src/components/EmptyState.tsx +73 -0
  79. package/src/components/EndOfListFooter.tsx +100 -0
  80. package/src/components/ErrorBoundary.tsx +688 -0
  81. package/src/components/HeadersSection.tsx +192 -0
  82. package/src/components/HighlightText.tsx +100 -0
  83. package/src/components/Inspector/AnalyticsFilterModal.tsx +1250 -0
  84. package/src/components/Inspector/AnalyticsTab.tsx +1336 -0
  85. package/src/components/Inspector/BundleTab.tsx +4760 -0
  86. package/src/components/Inspector/ConsoleTab.tsx +702 -0
  87. package/src/components/Inspector/CrashDetail.tsx +941 -0
  88. package/src/components/Inspector/CrashFilterModal.tsx +721 -0
  89. package/src/components/Inspector/CrashTab.tsx +871 -0
  90. package/src/components/Inspector/DeviceInfoTab.tsx +1204 -0
  91. package/src/components/Inspector/FabLauncher.tsx +80 -0
  92. package/src/components/Inspector/InspectorContext.tsx +28 -0
  93. package/src/components/Inspector/InspectorHeader.tsx +972 -0
  94. package/src/components/Inspector/LogDetail.tsx +1431 -0
  95. package/src/components/Inspector/MainScreen.tsx +262 -0
  96. package/src/components/Inspector/NavigationTracker.tsx +13 -0
  97. package/src/components/Inspector/NetworkDetail.tsx +794 -0
  98. package/src/components/Inspector/NetworkTab.tsx +1183 -0
  99. package/src/components/Inspector/NpmUpdateToast.tsx +392 -0
  100. package/src/components/Inspector/PerformanceTab.tsx +1928 -0
  101. package/src/components/Inspector/ReduxDetail.tsx +1651 -0
  102. package/src/components/Inspector/ReduxTab.tsx +954 -0
  103. package/src/components/Inspector/SettingsPanel.tsx +3447 -0
  104. package/src/components/Inspector/StorageTab.tsx +1048 -0
  105. package/src/components/Inspector/TabBar.tsx +207 -0
  106. package/src/components/Inspector/TelemetryConsentModal.tsx +416 -0
  107. package/src/components/Inspector/UpdateAvailableModal.tsx +557 -0
  108. package/src/components/JsonViewer.tsx +486 -0
  109. package/src/components/LogCard.tsx +491 -0
  110. package/src/components/LogSyntaxHighlighter.tsx +178 -0
  111. package/src/components/MetaAccordion.tsx +340 -0
  112. package/src/components/MiniBarChart.tsx +42 -0
  113. package/src/components/MiniLineChart.tsx +33 -0
  114. package/src/components/NetworkIcons.tsx +2221 -0
  115. package/src/components/SectionHeader.tsx +113 -0
  116. package/src/components/SegmentedTabs.tsx +83 -0
  117. package/src/components/Slider.tsx +300 -0
  118. package/src/components/SourcePageCard.tsx +148 -0
  119. package/src/components/Toast.tsx +131 -0
  120. package/src/components/TouchableScale.tsx +91 -0
  121. package/src/components/TreeNode.tsx +186 -0
  122. package/src/console.ts +24 -0
  123. package/src/constants/index.ts +38 -0
  124. package/src/constants/version.ts +3 -0
  125. package/src/crash.ts +32 -0
  126. package/src/customHooks/analyticsLogger.ts +336 -0
  127. package/src/customHooks/bundleAnalyzer.ts +1256 -0
  128. package/src/customHooks/consoleLogger.ts +497 -0
  129. package/src/customHooks/crashHandler.ts +944 -0
  130. package/src/customHooks/logFilters.ts +32 -0
  131. package/src/customHooks/networkLogger.ts +419 -0
  132. package/src/customHooks/performanceTracker.ts +1014 -0
  133. package/src/customHooks/reduxLogger.ts +406 -0
  134. package/src/customHooks/storageInspector.ts +509 -0
  135. package/src/customHooks/useAccordion.tsx +60 -0
  136. package/src/decorators/index.ts +184 -0
  137. package/src/helpers/gaAnalyticsRegistry.ts +204 -0
  138. package/src/helpers/index.ts +860 -0
  139. package/src/helpers/memoryManager.ts +138 -0
  140. package/src/helpers/searchQueryParser.ts +283 -0
  141. package/src/helpers/settingsStore.ts +171 -0
  142. package/src/helpers/telemetry.ts +505 -0
  143. package/src/helpers/toast.ts +17 -0
  144. package/src/i18n/index.ts +69 -0
  145. package/src/i18n/locales/en.json +1058 -0
  146. package/src/index.tsx +2356 -0
  147. package/src/native/NativeInspector.ts +397 -0
  148. package/src/native/NativeNetworkInspector.ts +24 -0
  149. package/src/network.ts +22 -0
  150. package/src/performance.ts +38 -0
  151. package/src/redux.ts +23 -0
  152. package/src/storage.ts +18 -0
  153. package/src/styles/AppColors.ts +408 -0
  154. package/src/styles/AppFonts.ts +8 -0
  155. package/src/styles/common.ts +209 -0
  156. package/src/styles/index.ts +1570 -0
  157. package/src/types/enums.ts +199 -0
  158. package/src/types/index.ts +34 -0
  159. package/src/types/interfaces.ts +515 -0
@@ -0,0 +1,557 @@
1
+ import React, {useState, useEffect} from 'react';
2
+ import {
3
+ Modal,
4
+ View,
5
+ Text,
6
+ TouchableOpacity,
7
+ StyleSheet,
8
+ Animated,
9
+ Platform,
10
+ Linking,
11
+ } from 'react-native';
12
+ import Svg, {Path} from 'react-native-svg';
13
+ import {BrandSquareIcon} from '../BrandSquareIcon';
14
+ import {NpmIcon} from '../NetworkIcons';
15
+ import {LIB_VERSION} from '../../constants';
16
+ import {copyToClipboard} from '../../helpers';
17
+ import {showToast} from '../../helpers/toast';
18
+
19
+ // ─── Crisp SVG Icons ─────────────────────────────────────────────────────────
20
+
21
+ const CopySvg = ({size = 14, color = '#64748B'}: {size?: number; color?: string}) => (
22
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
23
+ <Path
24
+ d="M8 4v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2h-8a2 2 0 0 0-2 2z"
25
+ stroke={color}
26
+ strokeWidth="2"
27
+ strokeLinecap="round"
28
+ strokeLinejoin="round"
29
+ />
30
+ <Path
31
+ d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"
32
+ stroke={color}
33
+ strokeWidth="2"
34
+ strokeLinecap="round"
35
+ strokeLinejoin="round"
36
+ />
37
+ </Svg>
38
+ );
39
+
40
+ const CheckSvg = ({size = 14, color = '#10B981'}: {size?: number; color?: string}) => (
41
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
42
+ <Path
43
+ d="M20 6L9 17l-5-5"
44
+ stroke={color}
45
+ strokeWidth="2.4"
46
+ strokeLinecap="round"
47
+ strokeLinejoin="round"
48
+ />
49
+ </Svg>
50
+ );
51
+
52
+ const ExternalLinkSvg = ({size = 13, color = '#FFFFFF'}: {size?: number; color?: string}) => (
53
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
54
+ <Path
55
+ d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"
56
+ stroke={color}
57
+ strokeWidth="2"
58
+ strokeLinecap="round"
59
+ strokeLinejoin="round"
60
+ />
61
+ <Path
62
+ d="M15 3h6v6"
63
+ stroke={color}
64
+ strokeWidth="2"
65
+ strokeLinecap="round"
66
+ strokeLinejoin="round"
67
+ />
68
+ <Path
69
+ d="M10 14L21 3"
70
+ stroke={color}
71
+ strokeWidth="2"
72
+ strokeLinecap="round"
73
+ strokeLinejoin="round"
74
+ />
75
+ </Svg>
76
+ );
77
+
78
+ const CloseSvg = ({size = 13, color = '#64748B'}: {size?: number; color?: string}) => (
79
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
80
+ <Path
81
+ d="M18 6L6 18M6 6l12 12"
82
+ stroke={color}
83
+ strokeWidth="2.2"
84
+ strokeLinecap="round"
85
+ strokeLinejoin="round"
86
+ />
87
+ </Svg>
88
+ );
89
+
90
+ const SparkleSvg = ({size = 14, color = '#F59E0B'}: {size?: number; color?: string}) => (
91
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
92
+ <Path
93
+ d="M12 2l2.4 6.6L21 11l-6.6 2.4L12 20l-2.4-6.6L3 11l6.6-2.4L12 2z"
94
+ fill={color}
95
+ />
96
+ </Svg>
97
+ );
98
+
99
+ const ArrowRightSvg = ({size = 14, color = '#94A3B8'}: {size?: number; color?: string}) => (
100
+ <Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
101
+ <Path
102
+ d="M5 12h14M12 5l7 7-7 7"
103
+ stroke={color}
104
+ strokeWidth="2.2"
105
+ strokeLinecap="round"
106
+ strokeLinejoin="round"
107
+ />
108
+ </Svg>
109
+ );
110
+
111
+ interface UpdateAvailableModalProps {
112
+ visible: boolean;
113
+ latestVersion: string | null;
114
+ onClose: () => void;
115
+ }
116
+
117
+ export const UpdateAvailableModal: React.FC<UpdateAvailableModalProps> = ({
118
+ visible,
119
+ latestVersion,
120
+ onClose,
121
+ }) => {
122
+ const [copied, setCopied] = useState(false);
123
+ const fadeAnim = useState(new Animated.Value(0))[0];
124
+ const scaleAnim = useState(new Animated.Value(0.92))[0];
125
+
126
+ const installCommand = `npm install react-native-inapp-inspector@latest`;
127
+
128
+ useEffect(() => {
129
+ if (visible) {
130
+ setCopied(false);
131
+ Animated.parallel([
132
+ Animated.timing(fadeAnim, {
133
+ toValue: 1,
134
+ duration: 220,
135
+ useNativeDriver: true,
136
+ }),
137
+ Animated.spring(scaleAnim, {
138
+ toValue: 1,
139
+ friction: 8,
140
+ tension: 50,
141
+ useNativeDriver: true,
142
+ }),
143
+ ]).start();
144
+ }
145
+ }, [visible, fadeAnim, scaleAnim]);
146
+
147
+ const handleClose = () => {
148
+ Animated.parallel([
149
+ Animated.timing(fadeAnim, {
150
+ toValue: 0,
151
+ duration: 160,
152
+ useNativeDriver: true,
153
+ }),
154
+ Animated.timing(scaleAnim, {
155
+ toValue: 0.92,
156
+ duration: 160,
157
+ useNativeDriver: true,
158
+ }),
159
+ ]).start(() => {
160
+ onClose();
161
+ });
162
+ };
163
+
164
+ const handleCopyCommand = () => {
165
+ copyToClipboard(installCommand, 'Install Command');
166
+ setCopied(true);
167
+ showToast('Copied npm install command to clipboard!');
168
+ setTimeout(() => {
169
+ setCopied(false);
170
+ }, 2500);
171
+ };
172
+
173
+ const handleOpenNpm = () => {
174
+ Linking.openURL('https://www.npmjs.com/package/react-native-inapp-inspector').catch(() => {});
175
+ handleClose();
176
+ };
177
+
178
+ if (!visible) return null;
179
+
180
+ return (
181
+ <Modal
182
+ transparent
183
+ visible={visible}
184
+ animationType="none"
185
+ statusBarTranslucent
186
+ onRequestClose={handleClose}>
187
+ <View style={styles.overlay}>
188
+ <Animated.View
189
+ style={[
190
+ styles.card,
191
+ {
192
+ opacity: fadeAnim,
193
+ transform: [{scale: scaleAnim}],
194
+ },
195
+ ]}>
196
+ {/* Top-Right Dismiss Button */}
197
+ <TouchableOpacity
198
+ style={styles.topCloseButton}
199
+ onPress={handleClose}
200
+ hitSlop={10}
201
+ activeOpacity={0.7}>
202
+ <CloseSvg size={13} color="#64748B" />
203
+ </TouchableOpacity>
204
+
205
+ {/* Header section with brand square icon & sparkle */}
206
+ <View style={styles.headerSection}>
207
+ <View style={styles.iconHaloRing}>
208
+ <BrandSquareIcon size={52} />
209
+ <View style={styles.sparkleBadge}>
210
+ <SparkleSvg size={13} color="#F59E0B" />
211
+ </View>
212
+ </View>
213
+
214
+ <Text style={styles.title}>Update Available</Text>
215
+ <Text style={styles.subtitle}>
216
+ A newer release of react-native-inapp-inspector is ready
217
+ </Text>
218
+ </View>
219
+
220
+ {/* Version Comparison Card */}
221
+ <View style={styles.versionComparisonCard}>
222
+ <View style={styles.versionColumn}>
223
+ <Text style={styles.versionLabel}>INSTALLED</Text>
224
+ <View style={styles.installedChip}>
225
+ <Text style={styles.installedText}>v{LIB_VERSION}</Text>
226
+ </View>
227
+ </View>
228
+
229
+ <View style={styles.arrowContainer}>
230
+ <ArrowRightSvg size={14} color="#94A3B8" />
231
+ </View>
232
+
233
+ <View style={styles.versionColumn}>
234
+ <Text style={styles.versionLabel}>LATEST ON NPM</Text>
235
+ <View style={styles.latestChip}>
236
+ <NpmIcon size={12} color="#CB3837" />
237
+ <Text style={styles.latestText}>v{latestVersion || 'latest'}</Text>
238
+ </View>
239
+ </View>
240
+ </View>
241
+
242
+ {/* Quick Install Snippet Box */}
243
+ <View style={styles.codeSnippetBox}>
244
+ <View style={styles.codeSnippetHeader}>
245
+ <Text style={styles.codeSnippetLabel}>UPGRADE COMMAND</Text>
246
+ {copied && (
247
+ <View style={styles.copiedIndicator}>
248
+ <CheckSvg size={11} color="#10B981" />
249
+ <Text style={styles.copiedText}>Copied</Text>
250
+ </View>
251
+ )}
252
+ </View>
253
+
254
+ <TouchableOpacity
255
+ style={styles.commandRow}
256
+ onPress={handleCopyCommand}
257
+ activeOpacity={0.75}>
258
+ <Text style={styles.commandText} numberOfLines={1}>
259
+ {installCommand}
260
+ </Text>
261
+ <View style={styles.copyIconWrapper}>
262
+ {copied ? <CheckSvg size={14} color="#10B981" /> : <CopySvg size={14} color="#64748B" />}
263
+ </View>
264
+ </TouchableOpacity>
265
+ </View>
266
+
267
+ {/* Action Buttons */}
268
+ <View style={styles.buttonRow}>
269
+ <TouchableOpacity
270
+ style={styles.secondaryButton}
271
+ onPress={handleClose}
272
+ activeOpacity={0.7}>
273
+ <Text style={styles.secondaryButtonText}>Later</Text>
274
+ </TouchableOpacity>
275
+
276
+ <TouchableOpacity
277
+ style={styles.primaryButton}
278
+ onPress={handleOpenNpm}
279
+ activeOpacity={0.85}>
280
+ <Text style={styles.primaryButtonText}>View on NPM</Text>
281
+ <ExternalLinkSvg size={12} color="#FFFFFF" />
282
+ </TouchableOpacity>
283
+ </View>
284
+ </Animated.View>
285
+ </View>
286
+ </Modal>
287
+ );
288
+ };
289
+
290
+ const fontStack = Platform.select({
291
+ ios: {
292
+ fontFamily: 'System',
293
+ },
294
+ android: {
295
+ fontFamily: 'sans-serif',
296
+ },
297
+ default: {},
298
+ });
299
+
300
+ const styles = StyleSheet.create({
301
+ overlay: {
302
+ flex: 1,
303
+ backgroundColor: 'rgba(15, 23, 42, 0.62)',
304
+ justifyContent: 'center',
305
+ alignItems: 'center',
306
+ paddingHorizontal: 20,
307
+ zIndex: 999999,
308
+ },
309
+ card: {
310
+ width: '100%',
311
+ maxWidth: 360,
312
+ backgroundColor: '#FFFFFF',
313
+ borderRadius: 24,
314
+ borderWidth: 1,
315
+ borderColor: '#E2E8F0',
316
+ paddingHorizontal: 20,
317
+ paddingTop: 22,
318
+ paddingBottom: 20,
319
+ alignItems: 'center',
320
+ shadowColor: '#0F172A',
321
+ shadowOffset: {width: 0, height: 18},
322
+ shadowOpacity: 0.24,
323
+ shadowRadius: 36,
324
+ elevation: 24,
325
+ },
326
+ topCloseButton: {
327
+ position: 'absolute',
328
+ top: 14,
329
+ right: 14,
330
+ width: 28,
331
+ height: 28,
332
+ borderRadius: 14,
333
+ backgroundColor: '#F8FAFC',
334
+ justifyContent: 'center',
335
+ alignItems: 'center',
336
+ borderWidth: 1,
337
+ borderColor: '#E2E8F0',
338
+ zIndex: 10,
339
+ },
340
+ headerSection: {
341
+ alignItems: 'center',
342
+ width: '100%',
343
+ marginBottom: 12,
344
+ },
345
+ iconHaloRing: {
346
+ width: 66,
347
+ height: 66,
348
+ borderRadius: 20,
349
+ backgroundColor: '#FAF5FF',
350
+ justifyContent: 'center',
351
+ alignItems: 'center',
352
+ borderWidth: 1.5,
353
+ borderColor: '#F3E8FF',
354
+ marginBottom: 8,
355
+ shadowColor: '#7C3AED',
356
+ shadowOffset: {width: 0, height: 4},
357
+ shadowOpacity: 0.16,
358
+ shadowRadius: 10,
359
+ elevation: 4,
360
+ },
361
+ sparkleBadge: {
362
+ position: 'absolute',
363
+ top: -4,
364
+ right: -4,
365
+ width: 22,
366
+ height: 22,
367
+ borderRadius: 11,
368
+ backgroundColor: '#FEF3C7',
369
+ justifyContent: 'center',
370
+ alignItems: 'center',
371
+ borderWidth: 1.5,
372
+ borderColor: '#FFFFFF',
373
+ },
374
+ title: {
375
+ fontSize: 17.5,
376
+ fontWeight: '800',
377
+ color: '#0F172A',
378
+ letterSpacing: -0.4,
379
+ textAlign: 'center',
380
+ lineHeight: 22,
381
+ marginBottom: 2,
382
+ ...fontStack,
383
+ },
384
+ subtitle: {
385
+ fontSize: 12,
386
+ fontWeight: '500',
387
+ color: '#64748B',
388
+ textAlign: 'center',
389
+ lineHeight: 16,
390
+ paddingHorizontal: 8,
391
+ ...fontStack,
392
+ },
393
+ versionComparisonCard: {
394
+ flexDirection: 'row',
395
+ alignItems: 'center',
396
+ justifyContent: 'space-between',
397
+ backgroundColor: '#F8FAFC',
398
+ borderRadius: 14,
399
+ borderWidth: 1,
400
+ borderColor: '#E2E8F0',
401
+ paddingVertical: 10,
402
+ paddingHorizontal: 14,
403
+ marginBottom: 12,
404
+ width: '100%',
405
+ },
406
+ versionColumn: {
407
+ alignItems: 'center',
408
+ gap: 4,
409
+ },
410
+ versionLabel: {
411
+ fontSize: 9.5,
412
+ fontWeight: '700',
413
+ color: '#94A3B8',
414
+ letterSpacing: 0.6,
415
+ ...fontStack,
416
+ },
417
+ installedChip: {
418
+ backgroundColor: '#E2E8F0',
419
+ paddingHorizontal: 8,
420
+ paddingVertical: 3,
421
+ borderRadius: 6,
422
+ },
423
+ installedText: {
424
+ fontSize: 12,
425
+ fontWeight: '700',
426
+ color: '#475569',
427
+ ...fontStack,
428
+ },
429
+ arrowContainer: {
430
+ paddingHorizontal: 6,
431
+ },
432
+ arrowText: {
433
+ fontSize: 14,
434
+ color: '#94A3B8',
435
+ fontWeight: '700',
436
+ },
437
+ latestChip: {
438
+ flexDirection: 'row',
439
+ alignItems: 'center',
440
+ gap: 4,
441
+ backgroundColor: '#EDE9FE',
442
+ paddingHorizontal: 8,
443
+ paddingVertical: 3,
444
+ borderRadius: 6,
445
+ borderWidth: 1,
446
+ borderColor: '#DDD6FE',
447
+ },
448
+ latestText: {
449
+ fontSize: 12,
450
+ fontWeight: '800',
451
+ color: '#6D28D9',
452
+ ...fontStack,
453
+ },
454
+ codeSnippetBox: {
455
+ backgroundColor: '#0F172A',
456
+ borderRadius: 12,
457
+ padding: 10,
458
+ width: '100%',
459
+ marginBottom: 14,
460
+ borderWidth: 1,
461
+ borderColor: '#1E293B',
462
+ },
463
+ codeSnippetHeader: {
464
+ flexDirection: 'row',
465
+ justifyContent: 'space-between',
466
+ alignItems: 'center',
467
+ marginBottom: 6,
468
+ },
469
+ codeSnippetLabel: {
470
+ fontSize: 9.5,
471
+ fontWeight: '700',
472
+ color: '#64748B',
473
+ letterSpacing: 0.6,
474
+ ...fontStack,
475
+ },
476
+ copiedIndicator: {
477
+ flexDirection: 'row',
478
+ alignItems: 'center',
479
+ gap: 3,
480
+ },
481
+ copiedText: {
482
+ fontSize: 9.5,
483
+ fontWeight: '600',
484
+ color: '#10B981',
485
+ ...fontStack,
486
+ },
487
+ commandRow: {
488
+ flexDirection: 'row',
489
+ alignItems: 'center',
490
+ justifyContent: 'space-between',
491
+ backgroundColor: '#1E293B',
492
+ borderRadius: 8,
493
+ paddingVertical: 7,
494
+ paddingHorizontal: 9,
495
+ gap: 8,
496
+ },
497
+ commandText: {
498
+ flex: 1,
499
+ fontSize: 11,
500
+ fontFamily: Platform.OS === 'ios' ? 'Courier' : 'monospace',
501
+ color: '#38BDF8',
502
+ },
503
+ copyIconWrapper: {
504
+ width: 22,
505
+ height: 22,
506
+ borderRadius: 6,
507
+ backgroundColor: '#334155',
508
+ justifyContent: 'center',
509
+ alignItems: 'center',
510
+ },
511
+ buttonRow: {
512
+ flexDirection: 'row',
513
+ justifyContent: 'space-between',
514
+ alignItems: 'center',
515
+ gap: 10,
516
+ width: '100%',
517
+ },
518
+ secondaryButton: {
519
+ flex: 1,
520
+ alignItems: 'center',
521
+ justifyContent: 'center',
522
+ paddingVertical: 11,
523
+ borderRadius: 12,
524
+ backgroundColor: '#F1F5F9',
525
+ borderWidth: 1,
526
+ borderColor: '#E2E8F0',
527
+ },
528
+ secondaryButtonText: {
529
+ fontSize: 13,
530
+ fontWeight: '600',
531
+ color: '#475569',
532
+ ...fontStack,
533
+ },
534
+ primaryButton: {
535
+ flex: 1.3,
536
+ flexDirection: 'row',
537
+ alignItems: 'center',
538
+ justifyContent: 'center',
539
+ gap: 6,
540
+ paddingVertical: 11,
541
+ borderRadius: 12,
542
+ backgroundColor: '#7C3AED',
543
+ shadowColor: '#7C3AED',
544
+ shadowOffset: {width: 0, height: 3},
545
+ shadowOpacity: 0.28,
546
+ shadowRadius: 6,
547
+ elevation: 4,
548
+ },
549
+ primaryButtonText: {
550
+ fontSize: 13,
551
+ fontWeight: '700',
552
+ color: '#FFFFFF',
553
+ ...fontStack,
554
+ },
555
+ });
556
+
557
+ export default UpdateAvailableModal;