react-native-inapp-inspector 2.3.10 → 2.3.11

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 (43) hide show
  1. package/dist/commonjs/components/Inspector/DebuggingTab.d.ts +3 -0
  2. package/dist/commonjs/components/Inspector/DebuggingTab.js +682 -0
  3. package/dist/commonjs/components/Inspector/MainScreen.js +2 -0
  4. package/dist/commonjs/components/Inspector/SettingsPanel.js +12 -0
  5. package/dist/commonjs/components/Inspector/TabBar.js +9 -0
  6. package/dist/commonjs/components/NetworkIcons.d.ts +1 -0
  7. package/dist/commonjs/components/NetworkIcons.js +8 -1
  8. package/dist/commonjs/components/QRCodeView.d.ts +9 -0
  9. package/dist/commonjs/components/QRCodeView.js +79 -0
  10. package/dist/commonjs/constants/version.d.ts +1 -1
  11. package/dist/commonjs/constants/version.js +1 -1
  12. package/dist/commonjs/helpers/qrGenerator.d.ts +2 -0
  13. package/dist/commonjs/helpers/qrGenerator.js +170 -0
  14. package/dist/commonjs/index.js +2 -0
  15. package/dist/commonjs/types/enums.d.ts +2 -0
  16. package/dist/commonjs/types/enums.js +2 -0
  17. package/dist/esm/components/Inspector/DebuggingTab.d.ts +3 -0
  18. package/dist/esm/components/Inspector/DebuggingTab.js +642 -0
  19. package/dist/esm/components/Inspector/MainScreen.js +2 -0
  20. package/dist/esm/components/Inspector/SettingsPanel.js +13 -1
  21. package/dist/esm/components/Inspector/TabBar.js +10 -1
  22. package/dist/esm/components/NetworkIcons.d.ts +1 -0
  23. package/dist/esm/components/NetworkIcons.js +6 -0
  24. package/dist/esm/components/QRCodeView.d.ts +9 -0
  25. package/dist/esm/components/QRCodeView.js +42 -0
  26. package/dist/esm/constants/version.d.ts +1 -1
  27. package/dist/esm/constants/version.js +1 -1
  28. package/dist/esm/helpers/qrGenerator.d.ts +2 -0
  29. package/dist/esm/helpers/qrGenerator.js +167 -0
  30. package/dist/esm/index.js +2 -0
  31. package/dist/esm/types/enums.d.ts +2 -0
  32. package/dist/esm/types/enums.js +2 -0
  33. package/package.json +1 -1
  34. package/src/components/Inspector/DebuggingTab.tsx +755 -0
  35. package/src/components/Inspector/MainScreen.tsx +2 -0
  36. package/src/components/Inspector/SettingsPanel.tsx +20 -0
  37. package/src/components/Inspector/TabBar.tsx +11 -0
  38. package/src/components/NetworkIcons.tsx +39 -0
  39. package/src/components/QRCodeView.tsx +71 -0
  40. package/src/constants/version.ts +1 -1
  41. package/src/helpers/qrGenerator.ts +184 -0
  42. package/src/index.tsx +2 -0
  43. package/src/types/enums.ts +2 -0
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare const DebuggingTab: React.FC;
3
+ export default DebuggingTab;
@@ -0,0 +1,682 @@
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
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.DebuggingTab = void 0;
40
+ const react_1 = __importStar(require("react"));
41
+ const react_native_1 = require("react-native");
42
+ const AppColors_1 = require("../../styles/AppColors");
43
+ const AppFonts_1 = require("../../styles/AppFonts");
44
+ const QRCodeView_1 = __importDefault(require("../QRCodeView"));
45
+ const TouchableScale_1 = __importDefault(require("../TouchableScale"));
46
+ const helpers_1 = require("../../helpers");
47
+ const toast_1 = require("../../helpers/toast");
48
+ const i18n_1 = require("../../i18n");
49
+ const NetworkIcons_1 = require("../NetworkIcons");
50
+ const COMMON_PORTS = [8081, 8082, 8083, 19000];
51
+ const DebuggingTab = () => {
52
+ const { t } = (0, i18n_1.useTranslation)();
53
+ const detectedConfig = (0, react_1.useMemo)(() => {
54
+ const scriptURL = react_native_1.NativeModules.SourceCode?.scriptURL || '';
55
+ let host = 'localhost';
56
+ let port = 8081;
57
+ try {
58
+ if (scriptURL.includes('://')) {
59
+ const urlWithoutScheme = scriptURL.split('://')[1];
60
+ const hostAndPort = urlWithoutScheme.split('/')[0];
61
+ if (hostAndPort.includes(':')) {
62
+ const parts = hostAndPort.split(':');
63
+ host = parts[0];
64
+ const parsedPort = parseInt(parts[1], 10);
65
+ if (!isNaN(parsedPort))
66
+ port = parsedPort;
67
+ }
68
+ else {
69
+ host = hostAndPort;
70
+ }
71
+ }
72
+ }
73
+ catch { }
74
+ return { host, port, scriptURL };
75
+ }, []);
76
+ const [hostIp, setHostIp] = (0, react_1.useState)(() => {
77
+ if (detectedConfig.host === 'localhost' ||
78
+ detectedConfig.host === '127.0.0.1' ||
79
+ detectedConfig.host === '10.0.2.2') {
80
+ return '192.168.1.15';
81
+ }
82
+ return detectedConfig.host;
83
+ });
84
+ const [selectedPort, setSelectedPort] = (0, react_1.useState)(detectedConfig.port);
85
+ const [apkPath, setApkPath] = (0, react_1.useState)('app-debug.apk');
86
+ const [activeQrTab, setActiveQrTab] = (0, react_1.useState)('metro');
87
+ const [isAutoDetecting, setIsAutoDetecting] = (0, react_1.useState)(false);
88
+ const [portsStatus, setPortsStatus] = (0, react_1.useState)({});
89
+ const probePorts = (0, react_1.useCallback)(async () => {
90
+ setIsAutoDetecting(true);
91
+ const results = {};
92
+ for (const p of COMMON_PORTS) {
93
+ results[p] = { port: p, status: 'checking' };
94
+ }
95
+ setPortsStatus({ ...results });
96
+ let foundActivePort = null;
97
+ for (const p of COMMON_PORTS) {
98
+ const startTime = Date.now();
99
+ try {
100
+ const controller = new AbortController();
101
+ const timeoutId = setTimeout(() => controller.abort(), 1500);
102
+ const res = await fetch(`http://localhost:${p}/status`, {
103
+ signal: controller.signal,
104
+ });
105
+ clearTimeout(timeoutId);
106
+ const text = await res.text();
107
+ const latency = Date.now() - startTime;
108
+ if (res.ok && text.includes('packager-status:running')) {
109
+ results[p] = { port: p, status: 'active', latencyMs: latency };
110
+ if (!foundActivePort)
111
+ foundActivePort = p;
112
+ }
113
+ else {
114
+ results[p] = { port: p, status: 'inactive' };
115
+ }
116
+ }
117
+ catch {
118
+ results[p] = { port: p, status: 'inactive' };
119
+ }
120
+ setPortsStatus({ ...results });
121
+ }
122
+ if (foundActivePort) {
123
+ setSelectedPort(foundActivePort);
124
+ (0, toast_1.showToast)(`Detected Metro running on Port ${foundActivePort}!`);
125
+ }
126
+ setIsAutoDetecting(false);
127
+ }, []);
128
+ (0, react_1.useEffect)(() => {
129
+ probePorts();
130
+ }, [probePorts]);
131
+ const metroBundleUrl = `http://${hostIp}:${selectedPort}/index.bundle?platform=android&dev=true`;
132
+ const apkDownloadUrl = `http://${hostIp}:${selectedPort}/${apkPath}`;
133
+ const devSettingsHost = `${hostIp}:${selectedPort}`;
134
+ const currentQrValue = (0, react_1.useMemo)(() => {
135
+ if (activeQrTab === 'apk')
136
+ return apkDownloadUrl;
137
+ if (activeQrTab === 'host')
138
+ return devSettingsHost;
139
+ return metroBundleUrl;
140
+ }, [activeQrTab, apkDownloadUrl, devSettingsHost, metroBundleUrl]);
141
+ const activePortInfo = portsStatus[selectedPort];
142
+ return (<react_native_1.ScrollView style={styles.container} contentContainerStyle={styles.content} showsVerticalScrollIndicator={false}>
143
+
144
+ <react_native_1.View style={styles.serverCard}>
145
+ <react_native_1.View style={styles.serverCardTop}>
146
+ <react_native_1.View style={styles.serverStatusLeft}>
147
+ <react_native_1.View style={[
148
+ styles.statusDot,
149
+ {
150
+ backgroundColor: activePortInfo?.status === 'active'
151
+ ? AppColors_1.AppColors.greenColor
152
+ : activePortInfo?.status === 'checking'
153
+ ? AppColors_1.AppColors.warningIconGold
154
+ : AppColors_1.AppColors.errorColor,
155
+ },
156
+ ]}/>
157
+ <react_native_1.View>
158
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
159
+ <react_native_1.Text style={styles.serverTitle}>Metro Dev Server</react_native_1.Text>
160
+ <react_native_1.View style={styles.portPill}>
161
+ <react_native_1.Text style={styles.portPillText}>Port {selectedPort}</react_native_1.Text>
162
+ </react_native_1.View>
163
+ </react_native_1.View>
164
+ <react_native_1.Text style={styles.serverSubtitle}>
165
+ {activePortInfo?.status === 'active'
166
+ ? `🟢 Active & Bundling (${activePortInfo.latencyMs}ms)`
167
+ : activePortInfo?.status === 'checking'
168
+ ? '🟡 Probing Metro Ports...'
169
+ : '🔴 Standby / Select active port'}
170
+ </react_native_1.Text>
171
+ </react_native_1.View>
172
+ </react_native_1.View>
173
+
174
+ <TouchableScale_1.default onPress={probePorts} style={styles.scanBtn} hitSlop={8}>
175
+ <NetworkIcons_1.RepeatIcon size={12} color={AppColors_1.AppColors.purple}/>
176
+ <react_native_1.Text style={styles.scanBtnText}>Re-scan</react_native_1.Text>
177
+ </TouchableScale_1.default>
178
+ </react_native_1.View>
179
+
180
+
181
+ <react_native_1.View style={styles.portsRow}>
182
+ {COMMON_PORTS.map(p => {
183
+ const isSelected = selectedPort === p;
184
+ const pInfo = portsStatus[p];
185
+ const isActive = pInfo?.status === 'active';
186
+ return (<react_native_1.TouchableOpacity key={p} activeOpacity={0.7} onPress={() => setSelectedPort(p)} style={[
187
+ styles.portChip,
188
+ isSelected && styles.portChipSelected,
189
+ isActive && { borderColor: AppColors_1.AppColors.greenColor },
190
+ ]}>
191
+ <react_native_1.View style={[
192
+ styles.portMiniDot,
193
+ {
194
+ backgroundColor: isActive
195
+ ? AppColors_1.AppColors.greenColor
196
+ : AppColors_1.AppColors.grayTextWeak,
197
+ },
198
+ ]}/>
199
+ <react_native_1.Text style={[
200
+ styles.portChipText,
201
+ isSelected && styles.portChipTextSelected,
202
+ ]}>
203
+ {p}
204
+ </react_native_1.Text>
205
+ {isActive && (<react_native_1.View style={styles.liveBadge}>
206
+ <react_native_1.Text style={styles.liveBadgeText}>LIVE</react_native_1.Text>
207
+ </react_native_1.View>)}
208
+ </react_native_1.TouchableOpacity>);
209
+ })}
210
+ </react_native_1.View>
211
+ </react_native_1.View>
212
+
213
+
214
+ <react_native_1.View style={styles.card}>
215
+ <react_native_1.View style={styles.cardHeader}>
216
+ <react_native_1.Text style={styles.cardTitle}>HOST IP & BUNDLE LOCATION</react_native_1.Text>
217
+ <react_native_1.TouchableOpacity onPress={() => {
218
+ if (detectedConfig.host !== 'localhost' &&
219
+ detectedConfig.host !== '127.0.0.1' &&
220
+ detectedConfig.host !== '10.0.2.2') {
221
+ setHostIp(detectedConfig.host);
222
+ (0, toast_1.showToast)(`Reset to detected IP: ${detectedConfig.host}`);
223
+ }
224
+ }}>
225
+ <react_native_1.Text style={styles.headerActionText}>Reset to Detected</react_native_1.Text>
226
+ </react_native_1.TouchableOpacity>
227
+ </react_native_1.View>
228
+
229
+ <react_native_1.View style={styles.inputContainer}>
230
+ <react_native_1.Text style={styles.inputPrefix}>http://</react_native_1.Text>
231
+ <react_native_1.TextInput style={styles.input} value={hostIp} onChangeText={setHostIp} placeholder="192.168.1.15" placeholderTextColor={AppColors_1.AppColors.grayTextWeak} autoCapitalize="none" autoCorrect={false}/>
232
+ <react_native_1.Text style={styles.inputSuffix}>:{selectedPort}</react_native_1.Text>
233
+ </react_native_1.View>
234
+ <react_native_1.Text style={styles.inputHint}>
235
+ 💡 Ensure your physical Android device and Mac are connected to the same Wi-Fi network.
236
+ </react_native_1.Text>
237
+ </react_native_1.View>
238
+
239
+
240
+ <react_native_1.View style={styles.qrCard}>
241
+
242
+ <react_native_1.View style={styles.qrTabsRow}>
243
+ <react_native_1.TouchableOpacity activeOpacity={0.7} onPress={() => setActiveQrTab('metro')} style={[
244
+ styles.qrTab,
245
+ activeQrTab === 'metro' && styles.qrTabActive,
246
+ ]}>
247
+ <NetworkIcons_1.BoltIcon size={13} color={activeQrTab === 'metro' ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayText}/>
248
+ <react_native_1.Text style={[
249
+ styles.qrTabText,
250
+ activeQrTab === 'metro' && styles.qrTabTextActive,
251
+ ]}>
252
+ Metro Live Reload
253
+ </react_native_1.Text>
254
+ </react_native_1.TouchableOpacity>
255
+
256
+ <react_native_1.TouchableOpacity activeOpacity={0.7} onPress={() => setActiveQrTab('apk')} style={[
257
+ styles.qrTab,
258
+ activeQrTab === 'apk' && styles.qrTabActive,
259
+ ]}>
260
+ <NetworkIcons_1.PackageIcon size={13} color={activeQrTab === 'apk' ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayText}/>
261
+ <react_native_1.Text style={[
262
+ styles.qrTabText,
263
+ activeQrTab === 'apk' && styles.qrTabTextActive,
264
+ ]}>
265
+ Install Debug APK
266
+ </react_native_1.Text>
267
+ </react_native_1.TouchableOpacity>
268
+
269
+ <react_native_1.TouchableOpacity activeOpacity={0.7} onPress={() => setActiveQrTab('host')} style={[
270
+ styles.qrTab,
271
+ activeQrTab === 'host' && styles.qrTabActive,
272
+ ]}>
273
+ <NetworkIcons_1.SmartphoneIcon size={13} color={activeQrTab === 'host' ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayText}/>
274
+ <react_native_1.Text style={[
275
+ styles.qrTabText,
276
+ activeQrTab === 'host' && styles.qrTabTextActive,
277
+ ]}>
278
+ Dev Host Info
279
+ </react_native_1.Text>
280
+ </react_native_1.TouchableOpacity>
281
+ </react_native_1.View>
282
+
283
+
284
+ <react_native_1.View style={styles.qrWrapper}>
285
+ <QRCodeView_1.default value={currentQrValue} size={190} color={AppColors_1.AppColors.primaryBlack} backgroundColor={AppColors_1.AppColors.white}/>
286
+
287
+ <react_native_1.View style={styles.qrInfoBox}>
288
+ <react_native_1.Text style={styles.qrTargetTitle}>
289
+ {activeQrTab === 'apk'
290
+ ? '📦 Direct APK Download URL'
291
+ : activeQrTab === 'host'
292
+ ? '📱 Dev Settings Bundle Host'
293
+ : '⚡ Live Metro Fast-Refresh Endpoint'}
294
+ </react_native_1.Text>
295
+ <react_native_1.Text style={styles.qrTargetUrl} numberOfLines={2} ellipsizeMode="middle">
296
+ {currentQrValue}
297
+ </react_native_1.Text>
298
+ </react_native_1.View>
299
+ </react_native_1.View>
300
+
301
+
302
+ <react_native_1.View style={styles.qrActionsRow}>
303
+ <TouchableScale_1.default onPress={() => (0, helpers_1.copyToClipboard)(currentQrValue, 'QR Link')} style={styles.actionBtn}>
304
+ <react_native_1.Text style={styles.actionBtnText}>Copy Link</react_native_1.Text>
305
+ </TouchableScale_1.default>
306
+
307
+ <TouchableScale_1.default onPress={() => {
308
+ react_native_1.Share.share({
309
+ message: currentQrValue,
310
+ title: 'Metro Debug Link',
311
+ });
312
+ }} style={[styles.actionBtn, styles.actionBtnPrimary]}>
313
+ <react_native_1.Text style={styles.actionBtnPrimaryText}>Share to Device</react_native_1.Text>
314
+ </TouchableScale_1.default>
315
+ </react_native_1.View>
316
+ </react_native_1.View>
317
+
318
+
319
+ <react_native_1.View style={styles.guideCard}>
320
+ <react_native_1.Text style={styles.guideHeading}>📱 HOW TO CONNECT ANDROID DEVICE:</react_native_1.Text>
321
+
322
+ <react_native_1.View style={styles.stepRow}>
323
+ <react_native_1.View style={styles.stepNumberBadge}>
324
+ <react_native_1.Text style={styles.stepNumberText}>1</react_native_1.Text>
325
+ </react_native_1.View>
326
+ <react_native_1.View style={{ flex: 1 }}>
327
+ <react_native_1.Text style={styles.stepTitle}>Connect to Same Wi-Fi</react_native_1.Text>
328
+ <react_native_1.Text style={styles.stepDesc}>
329
+ Make sure your Android phone is connected to the same Wi-Fi router or Mac Mobile Hotspot.
330
+ </react_native_1.Text>
331
+ </react_native_1.View>
332
+ </react_native_1.View>
333
+
334
+ <react_native_1.View style={styles.stepRow}>
335
+ <react_native_1.View style={styles.stepNumberBadge}>
336
+ <react_native_1.Text style={styles.stepNumberText}>2</react_native_1.Text>
337
+ </react_native_1.View>
338
+ <react_native_1.View style={{ flex: 1 }}>
339
+ <react_native_1.Text style={styles.stepTitle}>Scan to Install / Connect</react_native_1.Text>
340
+ <react_native_1.Text style={styles.stepDesc}>
341
+ Open Android Camera or browser, scan the QR code above to download the APK or connect Metro.
342
+ </react_native_1.Text>
343
+ </react_native_1.View>
344
+ </react_native_1.View>
345
+
346
+ <react_native_1.View style={styles.stepRow}>
347
+ <react_native_1.View style={styles.stepNumberBadge}>
348
+ <react_native_1.Text style={styles.stepNumberText}>3</react_native_1.Text>
349
+ </react_native_1.View>
350
+ <react_native_1.View style={{ flex: 1 }}>
351
+ <react_native_1.Text style={styles.stepTitle}>Simultaneous Live Fast-Refresh ⚡</react_native_1.Text>
352
+ <react_native_1.Text style={styles.stepDesc}>
353
+ Any changes saved in VS Code will immediately update <react_native_1.Text style={{ fontWeight: '700' }}>both the iOS Simulator and physical Android phone</react_native_1.Text> in real-time!
354
+ </react_native_1.Text>
355
+ </react_native_1.View>
356
+ </react_native_1.View>
357
+ </react_native_1.View>
358
+ </react_native_1.ScrollView>);
359
+ };
360
+ exports.DebuggingTab = DebuggingTab;
361
+ const styles = react_native_1.StyleSheet.create({
362
+ container: {
363
+ flex: 1,
364
+ backgroundColor: AppColors_1.AppColors.contentBg,
365
+ },
366
+ content: {
367
+ padding: 12,
368
+ gap: 12,
369
+ paddingBottom: 40,
370
+ },
371
+ serverCard: {
372
+ backgroundColor: AppColors_1.AppColors.primaryLight,
373
+ borderRadius: 14,
374
+ padding: 14,
375
+ borderWidth: 1,
376
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
377
+ shadowColor: AppColors_1.AppColors.black,
378
+ shadowOffset: { width: 0, height: 2 },
379
+ shadowOpacity: 0.05,
380
+ shadowRadius: 4,
381
+ elevation: 2,
382
+ gap: 12,
383
+ },
384
+ serverCardTop: {
385
+ flexDirection: 'row',
386
+ alignItems: 'center',
387
+ justifyContent: 'space-between',
388
+ },
389
+ serverStatusLeft: {
390
+ flexDirection: 'row',
391
+ alignItems: 'center',
392
+ gap: 10,
393
+ flex: 1,
394
+ },
395
+ statusDot: {
396
+ width: 12,
397
+ height: 12,
398
+ borderRadius: 6,
399
+ },
400
+ serverTitle: {
401
+ fontFamily: AppFonts_1.AppFonts.interBold,
402
+ fontSize: 15,
403
+ color: AppColors_1.AppColors.primaryBlack,
404
+ },
405
+ serverSubtitle: {
406
+ fontFamily: AppFonts_1.AppFonts.interMedium,
407
+ fontSize: 11,
408
+ color: AppColors_1.AppColors.grayText,
409
+ marginTop: 2,
410
+ },
411
+ portPill: {
412
+ backgroundColor: `${AppColors_1.AppColors.purple}18`,
413
+ paddingHorizontal: 6,
414
+ paddingVertical: 2,
415
+ borderRadius: 6,
416
+ },
417
+ portPillText: {
418
+ fontFamily: AppFonts_1.AppFonts.interBold,
419
+ fontSize: 10,
420
+ color: AppColors_1.AppColors.purple,
421
+ },
422
+ scanBtn: {
423
+ flexDirection: 'row',
424
+ alignItems: 'center',
425
+ gap: 4,
426
+ paddingHorizontal: 8,
427
+ paddingVertical: 4,
428
+ borderRadius: 6,
429
+ backgroundColor: `${AppColors_1.AppColors.purple}14`,
430
+ borderWidth: 1,
431
+ borderColor: `${AppColors_1.AppColors.purple}30`,
432
+ },
433
+ scanBtnText: {
434
+ fontFamily: AppFonts_1.AppFonts.interBold,
435
+ fontSize: 11,
436
+ color: AppColors_1.AppColors.purple,
437
+ },
438
+ portsRow: {
439
+ flexDirection: 'row',
440
+ gap: 8,
441
+ },
442
+ portChip: {
443
+ flex: 1,
444
+ flexDirection: 'row',
445
+ alignItems: 'center',
446
+ justifyContent: 'center',
447
+ gap: 4,
448
+ paddingVertical: 7,
449
+ borderRadius: 8,
450
+ backgroundColor: AppColors_1.AppColors.grayBackground,
451
+ borderWidth: 1,
452
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
453
+ },
454
+ portChipSelected: {
455
+ backgroundColor: `${AppColors_1.AppColors.purple}18`,
456
+ borderColor: AppColors_1.AppColors.purple,
457
+ },
458
+ portMiniDot: {
459
+ width: 5,
460
+ height: 5,
461
+ borderRadius: 2.5,
462
+ },
463
+ portChipText: {
464
+ fontFamily: AppFonts_1.AppFonts.interBold,
465
+ fontSize: 11,
466
+ color: AppColors_1.AppColors.grayTextStrong,
467
+ },
468
+ portChipTextSelected: {
469
+ color: AppColors_1.AppColors.purple,
470
+ },
471
+ liveBadge: {
472
+ backgroundColor: AppColors_1.AppColors.greenColor,
473
+ paddingHorizontal: 3,
474
+ paddingVertical: 0.5,
475
+ borderRadius: 3,
476
+ },
477
+ liveBadgeText: {
478
+ fontFamily: AppFonts_1.AppFonts.interBold,
479
+ fontSize: 7.5,
480
+ color: AppColors_1.AppColors.white,
481
+ },
482
+ card: {
483
+ backgroundColor: AppColors_1.AppColors.primaryLight,
484
+ borderRadius: 14,
485
+ padding: 14,
486
+ borderWidth: 1,
487
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
488
+ shadowColor: AppColors_1.AppColors.black,
489
+ shadowOffset: { width: 0, height: 2 },
490
+ shadowOpacity: 0.05,
491
+ shadowRadius: 4,
492
+ elevation: 2,
493
+ gap: 8,
494
+ },
495
+ cardHeader: {
496
+ flexDirection: 'row',
497
+ alignItems: 'center',
498
+ justifyContent: 'space-between',
499
+ },
500
+ cardTitle: {
501
+ fontFamily: AppFonts_1.AppFonts.interBold,
502
+ fontSize: 11,
503
+ color: AppColors_1.AppColors.grayTextWeak,
504
+ letterSpacing: 0.6,
505
+ },
506
+ headerActionText: {
507
+ fontFamily: AppFonts_1.AppFonts.interBold,
508
+ fontSize: 11,
509
+ color: AppColors_1.AppColors.purple,
510
+ },
511
+ inputContainer: {
512
+ flexDirection: 'row',
513
+ alignItems: 'center',
514
+ backgroundColor: AppColors_1.AppColors.grayBackground,
515
+ borderRadius: 10,
516
+ borderWidth: 1,
517
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
518
+ paddingHorizontal: 10,
519
+ height: 40,
520
+ },
521
+ inputPrefix: {
522
+ fontFamily: AppFonts_1.AppFonts.interMedium,
523
+ fontSize: 12.5,
524
+ color: AppColors_1.AppColors.grayTextWeak,
525
+ },
526
+ input: {
527
+ flex: 1,
528
+ fontFamily: AppFonts_1.AppFonts.interBold,
529
+ fontSize: 13,
530
+ color: AppColors_1.AppColors.primaryBlack,
531
+ paddingVertical: 0,
532
+ },
533
+ inputSuffix: {
534
+ fontFamily: AppFonts_1.AppFonts.interBold,
535
+ fontSize: 12.5,
536
+ color: AppColors_1.AppColors.purple,
537
+ },
538
+ inputHint: {
539
+ fontFamily: AppFonts_1.AppFonts.interRegular,
540
+ fontSize: 11,
541
+ color: AppColors_1.AppColors.grayTextWeak,
542
+ lineHeight: 15,
543
+ },
544
+ qrCard: {
545
+ backgroundColor: AppColors_1.AppColors.primaryLight,
546
+ borderRadius: 14,
547
+ padding: 14,
548
+ borderWidth: 1,
549
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
550
+ shadowColor: AppColors_1.AppColors.black,
551
+ shadowOffset: { width: 0, height: 2 },
552
+ shadowOpacity: 0.05,
553
+ shadowRadius: 4,
554
+ elevation: 2,
555
+ alignItems: 'center',
556
+ gap: 14,
557
+ },
558
+ qrTabsRow: {
559
+ flexDirection: 'row',
560
+ backgroundColor: AppColors_1.AppColors.grayBackground,
561
+ borderRadius: 10,
562
+ padding: 3,
563
+ width: '100%',
564
+ gap: 4,
565
+ },
566
+ qrTab: {
567
+ flex: 1,
568
+ flexDirection: 'row',
569
+ alignItems: 'center',
570
+ justifyContent: 'center',
571
+ gap: 4,
572
+ paddingVertical: 7,
573
+ borderRadius: 8,
574
+ },
575
+ qrTabActive: {
576
+ backgroundColor: AppColors_1.AppColors.purple,
577
+ },
578
+ qrTabText: {
579
+ fontFamily: AppFonts_1.AppFonts.interMedium,
580
+ fontSize: 11,
581
+ color: AppColors_1.AppColors.grayText,
582
+ },
583
+ qrTabTextActive: {
584
+ color: AppColors_1.AppColors.white,
585
+ fontFamily: AppFonts_1.AppFonts.interBold,
586
+ },
587
+ qrWrapper: {
588
+ alignItems: 'center',
589
+ gap: 12,
590
+ },
591
+ qrInfoBox: {
592
+ alignItems: 'center',
593
+ maxWidth: 280,
594
+ gap: 2,
595
+ },
596
+ qrTargetTitle: {
597
+ fontFamily: AppFonts_1.AppFonts.interBold,
598
+ fontSize: 11.5,
599
+ color: AppColors_1.AppColors.primaryBlack,
600
+ },
601
+ qrTargetUrl: {
602
+ fontFamily: AppFonts_1.AppFonts.interRegular,
603
+ fontSize: 10.5,
604
+ color: AppColors_1.AppColors.skyBlue,
605
+ textAlign: 'center',
606
+ },
607
+ qrActionsRow: {
608
+ flexDirection: 'row',
609
+ gap: 10,
610
+ width: '100%',
611
+ },
612
+ actionBtn: {
613
+ flex: 1,
614
+ paddingVertical: 10,
615
+ borderRadius: 10,
616
+ borderWidth: 1,
617
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
618
+ backgroundColor: AppColors_1.AppColors.grayBackground,
619
+ alignItems: 'center',
620
+ justifyContent: 'center',
621
+ },
622
+ actionBtnText: {
623
+ fontFamily: AppFonts_1.AppFonts.interBold,
624
+ fontSize: 12,
625
+ color: AppColors_1.AppColors.grayTextStrong,
626
+ },
627
+ actionBtnPrimary: {
628
+ backgroundColor: AppColors_1.AppColors.purple,
629
+ borderColor: AppColors_1.AppColors.purple,
630
+ },
631
+ actionBtnPrimaryText: {
632
+ fontFamily: AppFonts_1.AppFonts.interBold,
633
+ fontSize: 12,
634
+ color: AppColors_1.AppColors.white,
635
+ },
636
+ guideCard: {
637
+ backgroundColor: AppColors_1.AppColors.primaryLight,
638
+ borderRadius: 14,
639
+ padding: 14,
640
+ borderWidth: 1,
641
+ borderColor: AppColors_1.AppColors.grayBorderSecondary,
642
+ gap: 10,
643
+ },
644
+ guideHeading: {
645
+ fontFamily: AppFonts_1.AppFonts.interBold,
646
+ fontSize: 11,
647
+ color: AppColors_1.AppColors.grayTextWeak,
648
+ letterSpacing: 0.6,
649
+ },
650
+ stepRow: {
651
+ flexDirection: 'row',
652
+ alignItems: 'flex-start',
653
+ gap: 10,
654
+ },
655
+ stepNumberBadge: {
656
+ width: 22,
657
+ height: 22,
658
+ borderRadius: 11,
659
+ backgroundColor: `${AppColors_1.AppColors.purple}18`,
660
+ alignItems: 'center',
661
+ justifyContent: 'center',
662
+ marginTop: 1,
663
+ },
664
+ stepNumberText: {
665
+ fontFamily: AppFonts_1.AppFonts.interBold,
666
+ fontSize: 11,
667
+ color: AppColors_1.AppColors.purple,
668
+ },
669
+ stepTitle: {
670
+ fontFamily: AppFonts_1.AppFonts.interBold,
671
+ fontSize: 12.5,
672
+ color: AppColors_1.AppColors.primaryBlack,
673
+ },
674
+ stepDesc: {
675
+ fontFamily: AppFonts_1.AppFonts.interRegular,
676
+ fontSize: 11,
677
+ color: AppColors_1.AppColors.grayText,
678
+ lineHeight: 16,
679
+ marginTop: 1,
680
+ },
681
+ });
682
+ exports.default = exports.DebuggingTab;