react-native-inapp-inspector 2.2.2 → 2.2.3

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