react-native-inapp-inspector 2.0.2 → 2.0.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 (42) hide show
  1. package/dist/commonjs/components/AppHeaderLogo.js +21 -2
  2. package/dist/commonjs/components/Inspector/InspectorHeader.js +84 -11
  3. package/dist/commonjs/components/Inspector/MainScreen.js +6 -2
  4. package/dist/commonjs/components/Inspector/NpmUpdateToast.d.ts +3 -0
  5. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +288 -0
  6. package/dist/commonjs/components/Inspector/SettingsPanel.js +192 -1
  7. package/dist/commonjs/components/Inspector/TelemetryConsentModal.js +218 -71
  8. package/dist/commonjs/constants/version.d.ts +1 -1
  9. package/dist/commonjs/constants/version.js +1 -1
  10. package/dist/commonjs/helpers/telemetry.js +4 -4
  11. package/dist/commonjs/index.js +14 -2
  12. package/dist/commonjs/types/interfaces.d.ts +5 -0
  13. package/dist/esm/components/AppHeaderLogo.js +21 -2
  14. package/dist/esm/components/Inspector/InspectorHeader.js +85 -12
  15. package/dist/esm/components/Inspector/MainScreen.js +6 -2
  16. package/dist/esm/components/Inspector/NpmUpdateToast.d.ts +3 -0
  17. package/dist/esm/components/Inspector/NpmUpdateToast.js +251 -0
  18. package/dist/esm/components/Inspector/SettingsPanel.js +192 -1
  19. package/dist/esm/components/Inspector/TelemetryConsentModal.js +219 -72
  20. package/dist/esm/constants/version.d.ts +1 -1
  21. package/dist/esm/constants/version.js +1 -1
  22. package/dist/esm/helpers/telemetry.js +4 -4
  23. package/dist/esm/index.js +14 -2
  24. package/dist/esm/types/interfaces.d.ts +5 -0
  25. package/package.json +1 -1
  26. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  27. package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
  28. package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
  29. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  30. package/android/.gradle/8.9/executionHistory/executionHistory.lock +0 -0
  31. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  32. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  33. package/android/.gradle/8.9/gc.properties +0 -0
  34. package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
  35. package/android/.gradle/9.2.0/fileChanges/last-build.bin +0 -0
  36. package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
  37. package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
  38. package/android/.gradle/9.2.0/gc.properties +0 -0
  39. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  40. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  41. package/android/.gradle/vcs-1/gc.properties +0 -0
  42. package/android/build/reports/problems/problems-report.html +0 -659
@@ -55,11 +55,26 @@ const performanceTracker_1 = require("../../customHooks/performanceTracker");
55
55
  const reduxLogger_1 = require("../../customHooks/reduxLogger");
56
56
  const analyticsLogger_2 = require("../../customHooks/analyticsLogger");
57
57
  const i18n_1 = require("../../i18n");
58
+ const telemetry_1 = require("../../helpers/telemetry");
58
59
  const NetworkIcons_1 = require("../NetworkIcons");
59
60
  const SettingsPanel = () => {
60
61
  const { t } = (0, i18n_1.useTranslation)();
61
- const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showConsoleLevels, setShowConsoleLevels, resetToDefaults, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit, isAutoRamLimitEnabled, setIsAutoRamLimitEnabled, deviceFreeRamMb, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, crashRecords, maxCrashLogs, setMaxCrashLogs, } = (0, InspectorContext_1.useInspector)();
62
+ const { settingsPage, setSettingsPage, settingsActiveSubTab, setSettingsActiveSubTab, tabVisibility, toggleTabVisibility, defaultTab, setDefaultTab, isDark, setIsDark, modalHeightPercent, setModalHeightPercent, modalAnimationType, setModalAnimationType, showDuplicateLogs, setShowDuplicateLogs, showUpdateToast, setShowUpdateToast, showConsoleLevels, setShowConsoleLevels, resetToDefaults, storage, logs, consoleLogs, analyticsEvents, reduxState, maxNetworkLogs, setMaxNetworkLogs, maxConsoleLogs, setMaxConsoleLogs, maxAnalyticsEventsLimit, setMaxAnalyticsEventsLimit, isAutoRamLimitEnabled, setIsAutoRamLimitEnabled, deviceFreeRamMb, reduxAutoRefresh, setReduxAutoRefreshState, reduxExpandDepth, setReduxExpandDepth, switchActiveTab, setSelected, setSelectedEvent, setReduxState, crashRecords, maxCrashLogs, setMaxCrashLogs, } = (0, InspectorContext_1.useInspector)();
62
63
  const [stagedHeight, setStagedHeight] = (0, react_1.useState)(modalHeightPercent);
64
+ const [telemetryConsent, setTelemetryConsentState] = (0, react_1.useState)(true);
65
+ (0, react_1.useEffect)(() => {
66
+ (0, telemetry_1.getTelemetryConsentStatus)().then(status => {
67
+ setTelemetryConsentState(status === 'granted');
68
+ });
69
+ }, []);
70
+ const handleToggleTelemetry = async () => {
71
+ const nextVal = !telemetryConsent;
72
+ setTelemetryConsentState(nextVal);
73
+ await (0, telemetry_1.setTelemetryConsent)(nextVal);
74
+ if (nextVal) {
75
+ (0, telemetry_1.sendSessionTelemetryPing)({ force: true });
76
+ }
77
+ };
63
78
  (0, react_1.useEffect)(() => {
64
79
  setStagedHeight(modalHeightPercent);
65
80
  }, [modalHeightPercent]);
@@ -1353,6 +1368,182 @@ const SettingsPanel = () => {
1353
1368
  </react_native_1.View>)}
1354
1369
  </react_native_1.View>
1355
1370
  </react_native_1.View>
1371
+
1372
+ {/* Section 4: Privacy & Diagnostics */}
1373
+ <react_native_1.View style={{
1374
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1375
+ borderRadius: 14,
1376
+ borderWidth: 1,
1377
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1378
+ overflow: 'hidden',
1379
+ padding: 14,
1380
+ gap: 12,
1381
+ }}>
1382
+ <react_native_1.Text style={{
1383
+ fontFamily: AppFonts_1.AppFonts.interBold,
1384
+ fontSize: 11,
1385
+ lineHeight: 14,
1386
+ color: AppColors_1.AppColors.grayTextWeak,
1387
+ letterSpacing: 0.8,
1388
+ }}>
1389
+ PRIVACY & ANONYMOUS DIAGNOSTICS
1390
+ </react_native_1.Text>
1391
+
1392
+ <react_native_1.View style={{
1393
+ flexDirection: 'row',
1394
+ alignItems: 'center',
1395
+ justifyContent: 'space-between',
1396
+ }}>
1397
+ <react_native_1.View style={{
1398
+ flexDirection: 'row',
1399
+ alignItems: 'center',
1400
+ gap: 10,
1401
+ flex: 1,
1402
+ marginRight: 10,
1403
+ }}>
1404
+ <react_native_1.View style={{
1405
+ width: 32,
1406
+ height: 32,
1407
+ borderRadius: 8,
1408
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
1409
+ alignItems: 'center',
1410
+ justifyContent: 'center',
1411
+ }}>
1412
+ <NetworkIcons_1.ShieldAlertIcon color={AppColors_1.AppColors.purple} size={15}/>
1413
+ </react_native_1.View>
1414
+ <react_native_1.View style={{ flex: 1 }}>
1415
+ <react_native_1.Text style={{
1416
+ fontFamily: AppFonts_1.AppFonts.interBold,
1417
+ fontSize: 13.5,
1418
+ lineHeight: 18,
1419
+ color: AppColors_1.AppColors.primaryBlack,
1420
+ }}>
1421
+ Help Improve In-App Inspector
1422
+ </react_native_1.Text>
1423
+ <react_native_1.Text style={{
1424
+ fontFamily: AppFonts_1.AppFonts.interRegular,
1425
+ fontSize: 11,
1426
+ lineHeight: 15,
1427
+ color: AppColors_1.AppColors.grayText,
1428
+ marginTop: 1,
1429
+ }}>
1430
+ Share non-identifiable technical metrics (RN version, JS engine, device model). No user data or network payloads are captured.
1431
+ </react_native_1.Text>
1432
+ </react_native_1.View>
1433
+ </react_native_1.View>
1434
+
1435
+ <TouchableScale_1.default accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle Anonymous Telemetry" accessibilityState={{ checked: telemetryConsent }} onPress={handleToggleTelemetry} style={{
1436
+ width: 42,
1437
+ height: 24,
1438
+ borderRadius: 12,
1439
+ backgroundColor: telemetryConsent
1440
+ ? AppColors_1.AppColors.purple
1441
+ : AppColors_1.AppColors.grayBorderSecondary,
1442
+ padding: 2,
1443
+ justifyContent: 'center',
1444
+ alignItems: telemetryConsent ? 'flex-end' : 'flex-start',
1445
+ }}>
1446
+ <react_native_1.View style={{
1447
+ width: 20,
1448
+ height: 20,
1449
+ borderRadius: 10,
1450
+ backgroundColor: AppColors_1.AppColors.white,
1451
+ shadowColor: AppColors_1.AppColors.black,
1452
+ shadowOpacity: 0.18,
1453
+ shadowRadius: 2,
1454
+ shadowOffset: { width: 0, height: 1 },
1455
+ }}/>
1456
+ </TouchableScale_1.default>
1457
+ </react_native_1.View>
1458
+ </react_native_1.View>
1459
+
1460
+ {/* Section 5: Notifications & Toasts */}
1461
+ <react_native_1.View style={{
1462
+ backgroundColor: AppColors_1.AppColors.primaryLight,
1463
+ borderRadius: 14,
1464
+ borderWidth: 1,
1465
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
1466
+ overflow: 'hidden',
1467
+ padding: 14,
1468
+ gap: 12,
1469
+ }}>
1470
+ <react_native_1.Text style={{
1471
+ fontFamily: AppFonts_1.AppFonts.interBold,
1472
+ fontSize: 11,
1473
+ lineHeight: 14,
1474
+ color: AppColors_1.AppColors.grayTextWeak,
1475
+ letterSpacing: 0.8,
1476
+ }}>
1477
+ NOTIFICATIONS & TOASTS
1478
+ </react_native_1.Text>
1479
+
1480
+ <react_native_1.View style={{
1481
+ flexDirection: 'row',
1482
+ alignItems: 'center',
1483
+ justifyContent: 'space-between',
1484
+ }}>
1485
+ <react_native_1.View style={{
1486
+ flexDirection: 'row',
1487
+ alignItems: 'center',
1488
+ gap: 10,
1489
+ flex: 1,
1490
+ marginRight: 10,
1491
+ }}>
1492
+ <react_native_1.View style={{
1493
+ width: 32,
1494
+ height: 32,
1495
+ borderRadius: 8,
1496
+ backgroundColor: AppColors_1.AppColors.purpleShade50,
1497
+ alignItems: 'center',
1498
+ justifyContent: 'center',
1499
+ }}>
1500
+ <NetworkIcons_1.PackageIcon color={AppColors_1.AppColors.purple} size={15}/>
1501
+ </react_native_1.View>
1502
+ <react_native_1.View style={{ flex: 1 }}>
1503
+ <react_native_1.Text style={{
1504
+ fontFamily: AppFonts_1.AppFonts.interBold,
1505
+ fontSize: 13.5,
1506
+ lineHeight: 18,
1507
+ color: AppColors_1.AppColors.primaryBlack,
1508
+ }}>
1509
+ NPM Update Toast
1510
+ </react_native_1.Text>
1511
+ <react_native_1.Text style={{
1512
+ fontFamily: AppFonts_1.AppFonts.interRegular,
1513
+ fontSize: 11,
1514
+ lineHeight: 15,
1515
+ color: AppColors_1.AppColors.grayText,
1516
+ marginTop: 1,
1517
+ }}>
1518
+ Show a floating toast banner with countdown progress when a newer release is published on npm.
1519
+ </react_native_1.Text>
1520
+ </react_native_1.View>
1521
+ </react_native_1.View>
1522
+
1523
+ <TouchableScale_1.default accessible={true} accessibilityRole="switch" accessibilityLabel="Toggle NPM Update Toast" accessibilityState={{ checked: showUpdateToast }} onPress={() => setShowUpdateToast(prev => !prev)} style={{
1524
+ width: 42,
1525
+ height: 24,
1526
+ borderRadius: 12,
1527
+ backgroundColor: showUpdateToast
1528
+ ? AppColors_1.AppColors.purple
1529
+ : AppColors_1.AppColors.grayBorderSecondary,
1530
+ padding: 2,
1531
+ justifyContent: 'center',
1532
+ alignItems: showUpdateToast ? 'flex-end' : 'flex-start',
1533
+ }}>
1534
+ <react_native_1.View style={{
1535
+ width: 20,
1536
+ height: 20,
1537
+ borderRadius: 10,
1538
+ backgroundColor: AppColors_1.AppColors.white,
1539
+ shadowColor: AppColors_1.AppColors.black,
1540
+ shadowOpacity: 0.18,
1541
+ shadowRadius: 2,
1542
+ shadowOffset: { width: 0, height: 1 },
1543
+ }}/>
1544
+ </TouchableScale_1.default>
1545
+ </react_native_1.View>
1546
+ </react_native_1.View>
1356
1547
  </react_native_1.View>)}
1357
1548
  <react_native_1.View style={{ height: 48 }}/>
1358
1549
  </react_native_1.ScrollView>
@@ -36,34 +36,61 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.TelemetryConsentModal = void 0;
37
37
  const react_1 = __importStar(require("react"));
38
38
  const react_native_1 = require("react-native");
39
- const AppColors_1 = require("../../styles/AppColors");
40
- const BrandCircleIcon_1 = require("../BrandCircleIcon");
39
+ const react_native_svg_1 = __importStar(require("react-native-svg"));
40
+ const BrandSquareIcon_1 = require("../BrandSquareIcon");
41
41
  const telemetry_1 = require("../../helpers/telemetry");
42
+ // ─── Inline Crisp SVG Icons ───────────────────────────────────────────────────
43
+ const ShieldCheckSvg = ({ size = 15, color = '#7C3AED' }) => (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
44
+ <react_native_svg_1.Path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
45
+ <react_native_svg_1.Path d="M9 12l2 2 4-4" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
46
+ </react_native_svg_1.default>);
47
+ const CheckSvg = ({ size = 14, color = '#FFFFFF' }) => (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
48
+ <react_native_svg_1.Path d="M20 6L9 17l-5-5" stroke={color} strokeWidth="2.4" strokeLinecap="round" strokeLinejoin="round"/>
49
+ </react_native_svg_1.default>);
50
+ const CloseSvg = ({ size = 13, color = '#64748B' }) => (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
51
+ <react_native_svg_1.Path d="M18 6L6 18M6 6l12 12" stroke={color} strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round"/>
52
+ </react_native_svg_1.default>);
42
53
  const TelemetryConsentModal = () => {
43
54
  const [visible, setVisible] = (0, react_1.useState)(false);
44
55
  const fadeAnim = (0, react_1.useState)(new react_native_1.Animated.Value(0))[0];
56
+ const scaleAnim = (0, react_1.useState)(new react_native_1.Animated.Value(0.92))[0];
45
57
  (0, react_1.useEffect)(() => {
46
58
  let isMounted = true;
47
59
  (0, telemetry_1.getTelemetryConsentStatus)().then(status => {
48
60
  if (isMounted && status === 'undetermined') {
49
61
  setVisible(true);
50
- react_native_1.Animated.timing(fadeAnim, {
51
- toValue: 1,
52
- duration: 300,
53
- useNativeDriver: true,
54
- }).start();
62
+ react_native_1.Animated.parallel([
63
+ react_native_1.Animated.timing(fadeAnim, {
64
+ toValue: 1,
65
+ duration: 250,
66
+ useNativeDriver: true,
67
+ }),
68
+ react_native_1.Animated.spring(scaleAnim, {
69
+ toValue: 1,
70
+ friction: 8,
71
+ tension: 45,
72
+ useNativeDriver: true,
73
+ }),
74
+ ]).start();
55
75
  }
56
76
  });
57
77
  return () => {
58
78
  isMounted = false;
59
79
  };
60
- }, [fadeAnim]);
80
+ }, [fadeAnim, scaleAnim]);
61
81
  const handleDecision = async (granted) => {
62
- react_native_1.Animated.timing(fadeAnim, {
63
- toValue: 0,
64
- duration: 200,
65
- useNativeDriver: true,
66
- }).start(async () => {
82
+ react_native_1.Animated.parallel([
83
+ react_native_1.Animated.timing(fadeAnim, {
84
+ toValue: 0,
85
+ duration: 180,
86
+ useNativeDriver: true,
87
+ }),
88
+ react_native_1.Animated.timing(scaleAnim, {
89
+ toValue: 0.92,
90
+ duration: 180,
91
+ useNativeDriver: true,
92
+ }),
93
+ ]).start(async () => {
67
94
  setVisible(false);
68
95
  await (0, telemetry_1.setTelemetryConsent)(granted);
69
96
  if (granted) {
@@ -76,37 +103,63 @@ const TelemetryConsentModal = () => {
76
103
  return null;
77
104
  return (<react_native_1.Modal transparent visible={visible} animationType="none" statusBarTranslucent>
78
105
  <react_native_1.View style={styles.overlay}>
79
- <react_native_1.Animated.View style={[styles.card, { opacity: fadeAnim }]}>
80
- <react_native_1.View style={styles.headerRow}>
81
- <react_native_1.View style={styles.iconWrapper}>
82
- <BrandCircleIcon_1.BrandCircleIcon size={40}/>
106
+ <react_native_1.Animated.View style={[
107
+ styles.card,
108
+ {
109
+ opacity: fadeAnim,
110
+ transform: [{ scale: scaleAnim }],
111
+ },
112
+ ]}>
113
+ {/* Top-Right Dismiss Icon Button */}
114
+ <react_native_1.TouchableOpacity style={styles.topCloseButton} onPress={() => handleDecision(false)} hitSlop={10} activeOpacity={0.7}>
115
+ <CloseSvg size={13} color="#64748B"/>
116
+ </react_native_1.TouchableOpacity>
117
+
118
+ {/* Centered Enlarged Square Brand Icon Header */}
119
+ <react_native_1.View style={styles.headerSection}>
120
+ <react_native_1.View style={styles.iconHaloRing}>
121
+ <BrandSquareIcon_1.BrandSquareIcon size={54}/>
83
122
  </react_native_1.View>
84
- <react_native_1.View style={styles.titleContainer}>
85
- <react_native_1.Text style={styles.title}>Help Improve In-App Inspector</react_native_1.Text>
86
- <react_native_1.Text style={styles.subtitle}>Anonymous Diagnostic Insights</react_native_1.Text>
123
+
124
+ <react_native_1.Text style={styles.title}>Help Improve In-App Inspector</react_native_1.Text>
125
+ <react_native_1.Text style={styles.subtitle}>Anonymous Diagnostic Insights</react_native_1.Text>
126
+
127
+ {/* Subheading instruction hint badge */}
128
+ <react_native_1.View style={styles.hintBadge}>
129
+ <react_native_1.Text style={styles.hintBadgeText}>
130
+ ⚙️ You can enable or disable this anytime in Settings
131
+ </react_native_1.Text>
87
132
  </react_native_1.View>
88
133
  </react_native_1.View>
89
134
 
135
+ {/* Description */}
90
136
  <react_native_1.Text style={styles.description}>
91
137
  To help us continually enhance tooling performance and compatibility,
92
138
  would you mind sharing anonymous diagnostics (such as React Native
93
- version, JavaScript engine, and platform architecture)?
139
+ version, JavaScript engine, and device architecture)?
94
140
  </react_native_1.Text>
95
141
 
142
+ {/* Privacy Callout Box */}
96
143
  <react_native_1.View style={styles.privacyBadge}>
144
+ <react_native_1.View style={styles.privacyShieldWrapper}>
145
+ <ShieldCheckSvg size={15} color="#7C3AED"/>
146
+ </react_native_1.View>
97
147
  <react_native_1.Text style={styles.privacyText}>
98
- 🔒 <react_native_1.Text style={{ fontWeight: '700' }}>Privacy Guaranteed:</react_native_1.Text> We
99
- only collect non-identifiable environment metrics. No personal
100
- data, tokens, or network request payloads are ever collected.
148
+ <react_native_1.Text style={styles.privacyHighlight}>Privacy Guaranteed:</react_native_1.Text> We
149
+ strictly collect non-identifiable technical metrics. No user data,
150
+ passwords, tokens, or network payload bodies are ever captured.
101
151
  </react_native_1.Text>
102
152
  </react_native_1.View>
103
153
 
154
+ {/* Enhanced Action Buttons with Icons */}
104
155
  <react_native_1.View style={styles.buttonRow}>
105
156
  <react_native_1.TouchableOpacity style={styles.declineButton} onPress={() => handleDecision(false)} activeOpacity={0.7}>
157
+ <CloseSvg size={12} color="#64748B"/>
106
158
  <react_native_1.Text style={styles.declineText}>Not Now</react_native_1.Text>
107
159
  </react_native_1.TouchableOpacity>
108
160
 
109
- <react_native_1.TouchableOpacity style={styles.allowButton} onPress={() => handleDecision(true)} activeOpacity={0.8}>
161
+ <react_native_1.TouchableOpacity style={styles.allowButton} onPress={() => handleDecision(true)} activeOpacity={0.85}>
162
+ <CheckSvg size={13} color="#FFFFFF"/>
110
163
  <react_native_1.Text style={styles.allowText}>Allow & Share</react_native_1.Text>
111
164
  </react_native_1.TouchableOpacity>
112
165
  </react_native_1.View>
@@ -115,98 +168,192 @@ const TelemetryConsentModal = () => {
115
168
  </react_native_1.Modal>);
116
169
  };
117
170
  exports.TelemetryConsentModal = TelemetryConsentModal;
171
+ const fontStack = react_native_1.Platform.select({
172
+ ios: {
173
+ fontFamily: 'System',
174
+ },
175
+ android: {
176
+ fontFamily: 'sans-serif',
177
+ },
178
+ default: {},
179
+ });
118
180
  const styles = react_native_1.StyleSheet.create({
119
181
  overlay: {
120
182
  flex: 1,
121
- backgroundColor: 'rgba(0, 0, 0, 0.65)',
183
+ backgroundColor: 'rgba(15, 23, 42, 0.56)',
122
184
  justifyContent: 'center',
123
185
  alignItems: 'center',
124
- padding: 24,
186
+ paddingHorizontal: 20,
125
187
  zIndex: 999999,
126
188
  },
127
189
  card: {
128
190
  width: '100%',
129
- maxWidth: 420,
130
- backgroundColor: '#1E1F29',
131
- borderRadius: 20,
132
- padding: 22,
191
+ maxWidth: 356,
192
+ backgroundColor: '#FFFFFF',
193
+ borderRadius: 24,
133
194
  borderWidth: 1,
134
- borderColor: 'rgba(255, 255, 255, 0.12)',
135
- shadowColor: '#000',
136
- shadowOffset: { width: 0, height: 10 },
137
- shadowOpacity: 0.5,
138
- shadowRadius: 20,
195
+ borderColor: '#E2E8F0',
196
+ paddingHorizontal: 20,
197
+ paddingTop: 22,
198
+ paddingBottom: 20,
199
+ alignItems: 'center',
200
+ shadowColor: '#0F172A',
201
+ shadowOffset: { width: 0, height: 16 },
202
+ shadowOpacity: 0.22,
203
+ shadowRadius: 32,
139
204
  elevation: 24,
140
205
  },
141
- headerRow: {
142
- flexDirection: 'row',
206
+ topCloseButton: {
207
+ position: 'absolute',
208
+ top: 14,
209
+ right: 14,
210
+ width: 28,
211
+ height: 28,
212
+ borderRadius: 14,
213
+ backgroundColor: '#F8FAFC',
214
+ justifyContent: 'center',
143
215
  alignItems: 'center',
144
- marginBottom: 14,
216
+ borderWidth: 1,
217
+ borderColor: '#E2E8F0',
218
+ zIndex: 10,
145
219
  },
146
- iconWrapper: {
147
- marginRight: 14,
220
+ headerSection: {
221
+ alignItems: 'center',
222
+ width: '100%',
223
+ marginBottom: 4,
148
224
  },
149
- titleContainer: {
150
- flex: 1,
225
+ iconHaloRing: {
226
+ width: 66,
227
+ height: 66,
228
+ borderRadius: 20,
229
+ backgroundColor: '#FAF5FF',
230
+ justifyContent: 'center',
231
+ alignItems: 'center',
232
+ borderWidth: 1.5,
233
+ borderColor: '#F3E8FF',
234
+ marginBottom: 8,
235
+ shadowColor: '#7C3AED',
236
+ shadowOffset: { width: 0, height: 4 },
237
+ shadowOpacity: 0.16,
238
+ shadowRadius: 10,
239
+ elevation: 4,
151
240
  },
152
241
  title: {
153
242
  fontSize: 17,
154
- fontWeight: '700',
155
- color: '#FFFFFF',
156
- letterSpacing: -0.2,
243
+ fontWeight: '800',
244
+ color: '#0F172A',
245
+ letterSpacing: -0.4,
246
+ textAlign: 'center',
247
+ lineHeight: 22,
248
+ marginBottom: 2,
249
+ ...fontStack,
157
250
  },
158
251
  subtitle: {
159
- fontSize: 12,
160
- color: AppColors_1.AppColors.purple || '#9055FF',
252
+ fontSize: 11.5,
161
253
  fontWeight: '600',
162
- marginTop: 2,
254
+ color: '#7C3AED',
255
+ textAlign: 'center',
256
+ letterSpacing: 0.2,
257
+ marginBottom: 6,
258
+ ...fontStack,
259
+ },
260
+ hintBadge: {
261
+ backgroundColor: '#EDE9FE80',
262
+ borderWidth: 1,
263
+ borderColor: '#DDD6FE',
264
+ borderRadius: 7,
265
+ paddingHorizontal: 8,
266
+ paddingVertical: 2.5,
267
+ marginBottom: 8,
268
+ },
269
+ hintBadgeText: {
270
+ fontSize: 10,
271
+ fontWeight: '600',
272
+ color: '#6D28D9',
273
+ textAlign: 'center',
274
+ ...fontStack,
163
275
  },
164
276
  description: {
165
- fontSize: 13,
166
- lineHeight: 19,
167
- color: 'rgba(255, 255, 255, 0.75)',
168
- marginBottom: 14,
277
+ fontSize: 12,
278
+ lineHeight: 17.5,
279
+ color: '#475569',
280
+ textAlign: 'center',
281
+ marginBottom: 12,
282
+ paddingHorizontal: 2,
283
+ ...fontStack,
169
284
  },
170
285
  privacyBadge: {
171
- backgroundColor: 'rgba(144, 85, 255, 0.12)',
172
- borderRadius: 10,
173
- padding: 10,
286
+ flexDirection: 'row',
287
+ alignItems: 'flex-start',
288
+ backgroundColor: '#F8FAFC',
289
+ borderRadius: 12,
290
+ paddingVertical: 8,
291
+ paddingHorizontal: 10,
174
292
  borderWidth: 1,
175
- borderColor: 'rgba(144, 85, 255, 0.25)',
176
- marginBottom: 20,
293
+ borderColor: '#E2E8F0',
294
+ marginBottom: 14,
295
+ width: '100%',
296
+ },
297
+ privacyShieldWrapper: {
298
+ marginRight: 7,
299
+ marginTop: 1,
177
300
  },
178
301
  privacyText: {
179
- fontSize: 11,
180
- lineHeight: 16,
181
- color: '#D8C6FF',
302
+ flex: 1,
303
+ fontSize: 10.8,
304
+ lineHeight: 15,
305
+ color: '#475569',
306
+ ...fontStack,
307
+ },
308
+ privacyHighlight: {
309
+ fontWeight: '700',
310
+ color: '#1E293B',
182
311
  },
183
312
  buttonRow: {
184
313
  flexDirection: 'row',
185
- justifyContent: 'flex-end',
314
+ justifyContent: 'space-between',
186
315
  alignItems: 'center',
187
- gap: 12,
316
+ gap: 10,
317
+ width: '100%',
188
318
  },
189
319
  declineButton: {
190
- paddingVertical: 10,
191
- paddingHorizontal: 16,
192
- borderRadius: 10,
193
- backgroundColor: 'rgba(255, 255, 255, 0.08)',
320
+ flex: 1,
321
+ flexDirection: 'row',
322
+ alignItems: 'center',
323
+ justifyContent: 'center',
324
+ gap: 5,
325
+ paddingVertical: 11,
326
+ borderRadius: 12,
327
+ backgroundColor: '#F1F5F9',
328
+ borderWidth: 1,
329
+ borderColor: '#E2E8F0',
194
330
  },
195
331
  declineText: {
196
332
  fontSize: 13,
197
333
  fontWeight: '600',
198
- color: 'rgba(255, 255, 255, 0.7)',
334
+ color: '#475569',
335
+ ...fontStack,
199
336
  },
200
337
  allowButton: {
201
- paddingVertical: 10,
202
- paddingHorizontal: 20,
203
- borderRadius: 10,
338
+ flex: 1,
339
+ flexDirection: 'row',
340
+ alignItems: 'center',
341
+ justifyContent: 'center',
342
+ gap: 5,
343
+ paddingVertical: 11,
344
+ borderRadius: 12,
204
345
  backgroundColor: '#7C3AED',
346
+ shadowColor: '#7C3AED',
347
+ shadowOffset: { width: 0, height: 3 },
348
+ shadowOpacity: 0.28,
349
+ shadowRadius: 6,
350
+ elevation: 4,
205
351
  },
206
352
  allowText: {
207
353
  fontSize: 13,
208
354
  fontWeight: '700',
209
355
  color: '#FFFFFF',
356
+ ...fontStack,
210
357
  },
211
358
  });
212
359
  exports.default = exports.TelemetryConsentModal;
@@ -1 +1 @@
1
- export declare const LIB_VERSION = "2.0.2";
1
+ export declare const LIB_VERSION = "2.0.4";
@@ -3,4 +3,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LIB_VERSION = void 0;
4
4
  // AUTO-GENERATED FILE — do not edit by hand.
5
5
  // Regenerated from package.json on every build by scripts/gen-version.js.
6
- exports.LIB_VERSION = '2.0.2';
6
+ exports.LIB_VERSION = '2.0.4';
@@ -31,8 +31,8 @@ const constants_1 = require("../constants");
31
31
  const NativeInspector_1 = require("../native/NativeInspector");
32
32
  // ─── GA4 Measurement Protocol Configuration ──────────────────────────────────
33
33
  // Automatically replaced at build-time from .env by scripts/inject-telemetry.js
34
- exports.GA4_MEASUREMENT_ID = 'G-3QGMQVZX5V';
35
- exports.GA4_API_SECRET = 'C46RQZ3PTfmHDnLnvU3KIg';
34
+ exports.GA4_MEASUREMENT_ID = 'G-XXXXXXXXXX';
35
+ exports.GA4_API_SECRET = 'YOUR_GA4_API_SECRET';
36
36
  const GA4_ENDPOINT = 'https://www.google-analytics.com/mp/collect';
37
37
  const CLIENT_ID_KEY = 'telemetry_client_id';
38
38
  // Stable session ID created once per JavaScript runtime instance
@@ -254,9 +254,9 @@ async function trackTelemetryEvent(eventName, params = {}, options) {
254
254
  return;
255
255
  // Don't send if credentials haven't been configured yet
256
256
  if (!exports.GA4_MEASUREMENT_ID ||
257
- exports.GA4_MEASUREMENT_ID === 'G-3QGMQVZX5V' ||
257
+ exports.GA4_MEASUREMENT_ID === 'G-XXXXXXXXXX' ||
258
258
  !exports.GA4_API_SECRET ||
259
- exports.GA4_API_SECRET === 'C46RQZ3PTfmHDnLnvU3KIg') {
259
+ exports.GA4_API_SECRET === 'YOUR_GA4_API_SECRET') {
260
260
  return;
261
261
  }
262
262
  try {