react-native-inapp-inspector 1.1.29 → 1.1.32

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 (51) hide show
  1. package/dist/commonjs/components/AnalyticsDetail.js +668 -108
  2. package/dist/commonjs/components/AppHeaderLogo.js +5 -2
  3. package/dist/commonjs/components/ConsoleLogCard.js +81 -59
  4. package/dist/commonjs/components/DomainHeader.js +21 -17
  5. package/dist/commonjs/components/Inspector/AnalyticsTab.js +297 -200
  6. package/dist/commonjs/components/Inspector/ConsoleTab.js +162 -56
  7. package/dist/commonjs/components/Inspector/InspectorHeader.js +56 -119
  8. package/dist/commonjs/components/Inspector/LogDetail.js +45 -12
  9. package/dist/commonjs/components/Inspector/NetworkTab.js +4 -1
  10. package/dist/commonjs/components/Inspector/ReduxDetail.js +237 -42
  11. package/dist/commonjs/components/Inspector/ReduxTab.js +456 -35
  12. package/dist/commonjs/components/JsonViewer.js +1 -1
  13. package/dist/commonjs/components/NetworkIcons.js +19 -10
  14. package/dist/commonjs/components/TreeNode.js +12 -2
  15. package/dist/commonjs/constants/version.d.ts +1 -1
  16. package/dist/commonjs/constants/version.js +1 -1
  17. package/dist/commonjs/customHooks/reduxLogger.js +128 -5
  18. package/dist/commonjs/helpers/index.d.ts +1 -1
  19. package/dist/commonjs/helpers/index.js +32 -16
  20. package/dist/commonjs/i18n/locales/en.json +45 -2
  21. package/dist/commonjs/styles/AppColors.d.ts +6 -0
  22. package/dist/commonjs/styles/AppColors.js +6 -0
  23. package/dist/commonjs/styles/index.d.ts +22 -1
  24. package/dist/commonjs/styles/index.js +25 -4
  25. package/dist/commonjs/types/interfaces.d.ts +7 -0
  26. package/dist/esm/components/AnalyticsDetail.js +670 -110
  27. package/dist/esm/components/AppHeaderLogo.js +5 -2
  28. package/dist/esm/components/ConsoleLogCard.js +81 -59
  29. package/dist/esm/components/DomainHeader.js +21 -17
  30. package/dist/esm/components/Inspector/AnalyticsTab.js +298 -201
  31. package/dist/esm/components/Inspector/ConsoleTab.js +163 -57
  32. package/dist/esm/components/Inspector/InspectorHeader.js +57 -120
  33. package/dist/esm/components/Inspector/LogDetail.js +45 -12
  34. package/dist/esm/components/Inspector/NetworkTab.js +4 -1
  35. package/dist/esm/components/Inspector/ReduxDetail.js +239 -44
  36. package/dist/esm/components/Inspector/ReduxTab.js +458 -37
  37. package/dist/esm/components/JsonViewer.js +1 -1
  38. package/dist/esm/components/NetworkIcons.js +19 -10
  39. package/dist/esm/components/TreeNode.js +12 -2
  40. package/dist/esm/constants/version.d.ts +1 -1
  41. package/dist/esm/constants/version.js +1 -1
  42. package/dist/esm/customHooks/reduxLogger.js +128 -5
  43. package/dist/esm/helpers/index.d.ts +1 -1
  44. package/dist/esm/helpers/index.js +32 -16
  45. package/dist/esm/i18n/locales/en.json +45 -2
  46. package/dist/esm/styles/AppColors.d.ts +6 -0
  47. package/dist/esm/styles/AppColors.js +6 -0
  48. package/dist/esm/styles/index.d.ts +22 -1
  49. package/dist/esm/styles/index.js +25 -4
  50. package/dist/esm/types/interfaces.d.ts +7 -0
  51. package/package.json +11 -11
@@ -125,17 +125,36 @@ const AnalyticsHeader = react_1.default.memo(() => {
125
125
  barWidthPct: Math.round((count / maxVal) * 100),
126
126
  }));
127
127
  }, [filteredAnalyticsEvents]);
128
- // Toggle category filter from top button group
128
+ // Multi-select category toggle from top button group
129
129
  const toggleCategoryFilter = (cat) => {
130
130
  (0, InspectorContext_1.animateNextLayout)();
131
131
  setAnalyticsFilters(prev => {
132
- const isSelected = !prev.categories.has('all') && prev.categories.has(cat);
133
- if (isSelected) {
132
+ if (cat === 'all') {
134
133
  return { ...prev, categories: new Set(['all']) };
135
134
  }
135
+ const nextCategories = new Set(prev.categories);
136
+ if (nextCategories.has('all')) {
137
+ nextCategories.delete('all');
138
+ nextCategories.add(cat);
139
+ }
136
140
  else {
137
- return { ...prev, categories: new Set([cat]) };
141
+ if (nextCategories.has(cat)) {
142
+ nextCategories.delete(cat);
143
+ if (nextCategories.size === 0) {
144
+ nextCategories.add('all');
145
+ }
146
+ }
147
+ else {
148
+ nextCategories.add(cat);
149
+ if (nextCategories.has('ecommerce') &&
150
+ nextCategories.has('page_view') &&
151
+ nextCategories.has('system') &&
152
+ nextCategories.has('custom')) {
153
+ return { ...prev, categories: new Set(['all']) };
154
+ }
155
+ }
138
156
  }
157
+ return { ...prev, categories: nextCategories };
139
158
  });
140
159
  };
141
160
  // 12-Bucket GA4 Realtime Stacked Histogram & Spline Wave Graph (-30m / 30s to NOW)
@@ -215,7 +234,7 @@ const AnalyticsHeader = react_1.default.memo(() => {
215
234
  }, [filteredAnalyticsEvents, chartHeight, svgWidth, t]);
216
235
  const selectedBucket = selectedBucketIdx != null ? histogramData.buckets[selectedBucketIdx] : null;
217
236
  return (<react_native_1.View style={styles_1.default.analyticsHeaderCard}>
218
- {/* ── Top Header Row (GA4 Style) ─────────────────────────────────────── */}
237
+ {/* ── 1. Top Header Row (GA4 Style) ─────────────────────────────────── */}
219
238
  <react_native_1.View style={styles_1.default.analyticsHeaderTop}>
220
239
  <react_native_1.View style={{ flex: 1 }}>
221
240
  <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
@@ -255,9 +274,280 @@ const AnalyticsHeader = react_1.default.memo(() => {
255
274
  </react_native_1.TouchableOpacity>
256
275
  </react_native_1.View>
257
276
 
258
- {/* ── GA4 Realtime Metric Hero & Activity Chart ─────────────────────── */}
277
+ {/* ── 2. Multi-Select Category Filter Buttons (AT THE TOP) ──────────── */}
278
+ <react_native_1.View style={{ marginTop: 10, marginBottom: 8 }}>
279
+ {/* Multi-color Proportional Segmented Bar */}
280
+ <react_native_1.View style={{
281
+ height: 4.5,
282
+ borderRadius: 2.5,
283
+ backgroundColor: `${AppColors_1.AppColors.grayBorderSecondary}40`,
284
+ flexDirection: 'row',
285
+ overflow: 'hidden',
286
+ marginBottom: 8,
287
+ }}>
288
+ {categoryStats.ecommerce > 0 && (<react_native_1.View style={{
289
+ flex: categoryStats.ecommerce,
290
+ backgroundColor: AppColors_1.AppColors.amber500,
291
+ }}/>)}
292
+ {categoryStats.page_view > 0 && (<react_native_1.View style={{
293
+ flex: categoryStats.page_view,
294
+ backgroundColor: AppColors_1.AppColors.sky500,
295
+ }}/>)}
296
+ {categoryStats.system > 0 && (<react_native_1.View style={{
297
+ flex: categoryStats.system,
298
+ backgroundColor: AppColors_1.AppColors.purple,
299
+ }}/>)}
300
+ {categoryStats.custom > 0 && (<react_native_1.View style={{
301
+ flex: categoryStats.custom,
302
+ backgroundColor: AppColors_1.AppColors.brandPurple,
303
+ }}/>)}
304
+ </react_native_1.View>
305
+
306
+ {/* Multi-Select Category Buttons with Checkboxes */}
307
+ <react_native_1.View style={{
308
+ flexDirection: 'row',
309
+ flexWrap: 'wrap',
310
+ gap: 6,
311
+ }}>
312
+ {/* All Button */}
313
+ {(() => {
314
+ const isAllSelected = analyticsFilters.categories.has('all');
315
+ return (<TouchableScale_1.default onPress={() => toggleCategoryFilter('all')} style={[
316
+ {
317
+ flexDirection: 'row',
318
+ alignItems: 'center',
319
+ gap: 5,
320
+ backgroundColor: isAllSelected ? AppColors_1.AppColors.indigo600Alt : AppColors_1.AppColors.indigo50,
321
+ paddingHorizontal: 8,
322
+ paddingVertical: 5,
323
+ borderRadius: 7,
324
+ borderWidth: 1,
325
+ borderColor: isAllSelected ? AppColors_1.AppColors.indigo600 : AppColors_1.AppColors.indigo400,
326
+ },
327
+ isAllSelected && {
328
+ shadowColor: AppColors_1.AppColors.indigo600Alt,
329
+ shadowOffset: { width: 0, height: 1 },
330
+ shadowOpacity: 0.28,
331
+ shadowRadius: 2.5,
332
+ elevation: 2,
333
+ },
334
+ ]}>
335
+ <react_native_1.View style={{
336
+ width: 12,
337
+ height: 12,
338
+ borderRadius: 3,
339
+ borderWidth: 1.2,
340
+ borderColor: isAllSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.indigo400,
341
+ backgroundColor: isAllSelected ? AppColors_1.AppColors.white : 'transparent',
342
+ alignItems: 'center',
343
+ justifyContent: 'center',
344
+ }}>
345
+ {isAllSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.indigo600Alt} size={8}/>}
346
+ </react_native_1.View>
347
+ <NetworkIcons_1.LayersIcon color={isAllSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.indigo600Alt} size={11}/>
348
+ <react_native_1.Text style={{
349
+ fontFamily: AppFonts_1.AppFonts.interBold,
350
+ fontSize: 10,
351
+ color: isAllSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.indigo600Alt,
352
+ }}>
353
+ {t('analytics.allCategory')}: {categoryStats.totalCount}
354
+ </react_native_1.Text>
355
+ </TouchableScale_1.default>);
356
+ })()}
357
+
358
+ {/* Ecommerce Button */}
359
+ {(() => {
360
+ const isSelected = !analyticsFilters.categories.has('all') &&
361
+ analyticsFilters.categories.has('ecommerce');
362
+ return (<TouchableScale_1.default onPress={() => toggleCategoryFilter('ecommerce')} style={[
363
+ {
364
+ flexDirection: 'row',
365
+ alignItems: 'center',
366
+ gap: 5,
367
+ backgroundColor: isSelected ? AppColors_1.AppColors.amber600 : AppColors_1.AppColors.amber100,
368
+ paddingHorizontal: 8,
369
+ paddingVertical: 5,
370
+ borderRadius: 7,
371
+ borderWidth: 1,
372
+ borderColor: isSelected ? AppColors_1.AppColors.amber700 : AppColors_1.AppColors.amber200,
373
+ },
374
+ isSelected && {
375
+ shadowColor: AppColors_1.AppColors.amber600,
376
+ shadowOffset: { width: 0, height: 1 },
377
+ shadowOpacity: 0.28,
378
+ shadowRadius: 2.5,
379
+ elevation: 2,
380
+ },
381
+ ]}>
382
+ <react_native_1.View style={{
383
+ width: 12,
384
+ height: 12,
385
+ borderRadius: 3,
386
+ borderWidth: 1.2,
387
+ borderColor: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.amber500,
388
+ backgroundColor: isSelected ? AppColors_1.AppColors.white : 'transparent',
389
+ alignItems: 'center',
390
+ justifyContent: 'center',
391
+ }}>
392
+ {isSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.amber600} size={8}/>}
393
+ </react_native_1.View>
394
+ <NetworkIcons_1.CartIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.amber700} size={11}/>
395
+ <react_native_1.Text style={{
396
+ fontFamily: AppFonts_1.AppFonts.interBold,
397
+ fontSize: 10,
398
+ color: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.amber800Warm,
399
+ }}>
400
+ {t('analytics.ecommerceCategory')}: {categoryStats.ecommerce} ({categoryStats.ecommercePct}%)
401
+ </react_native_1.Text>
402
+ </TouchableScale_1.default>);
403
+ })()}
404
+
405
+ {/* Screens Button */}
406
+ {(() => {
407
+ const isSelected = !analyticsFilters.categories.has('all') &&
408
+ analyticsFilters.categories.has('page_view');
409
+ return (<TouchableScale_1.default onPress={() => toggleCategoryFilter('page_view')} style={[
410
+ {
411
+ flexDirection: 'row',
412
+ alignItems: 'center',
413
+ gap: 5,
414
+ backgroundColor: isSelected ? AppColors_1.AppColors.sky600 : AppColors_1.AppColors.sky100,
415
+ paddingHorizontal: 8,
416
+ paddingVertical: 5,
417
+ borderRadius: 7,
418
+ borderWidth: 1,
419
+ borderColor: isSelected ? AppColors_1.AppColors.blue700 : AppColors_1.AppColors.sky400,
420
+ },
421
+ isSelected && {
422
+ shadowColor: AppColors_1.AppColors.sky600,
423
+ shadowOffset: { width: 0, height: 1 },
424
+ shadowOpacity: 0.28,
425
+ shadowRadius: 2.5,
426
+ elevation: 2,
427
+ },
428
+ ]}>
429
+ <react_native_1.View style={{
430
+ width: 12,
431
+ height: 12,
432
+ borderRadius: 3,
433
+ borderWidth: 1.2,
434
+ borderColor: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.sky400,
435
+ backgroundColor: isSelected ? AppColors_1.AppColors.white : 'transparent',
436
+ alignItems: 'center',
437
+ justifyContent: 'center',
438
+ }}>
439
+ {isSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.sky600} size={8}/>}
440
+ </react_native_1.View>
441
+ <NetworkIcons_1.GlobeIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.sky600} size={11}/>
442
+ <react_native_1.Text style={{
443
+ fontFamily: AppFonts_1.AppFonts.interBold,
444
+ fontSize: 10,
445
+ color: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.sky600,
446
+ }}>
447
+ {t('analytics.screensCategory')}: {categoryStats.page_view} ({categoryStats.page_viewPct}%)
448
+ </react_native_1.Text>
449
+ </TouchableScale_1.default>);
450
+ })()}
451
+
452
+ {/* System Button */}
453
+ {(() => {
454
+ const isSelected = !analyticsFilters.categories.has('all') &&
455
+ analyticsFilters.categories.has('system');
456
+ return (<TouchableScale_1.default onPress={() => toggleCategoryFilter('system')} style={[
457
+ {
458
+ flexDirection: 'row',
459
+ alignItems: 'center',
460
+ gap: 5,
461
+ backgroundColor: isSelected ? AppColors_1.AppColors.violet600 : AppColors_1.AppColors.purple100,
462
+ paddingHorizontal: 8,
463
+ paddingVertical: 5,
464
+ borderRadius: 7,
465
+ borderWidth: 1,
466
+ borderColor: isSelected ? AppColors_1.AppColors.purpleShade700 : AppColors_1.AppColors.purple200,
467
+ },
468
+ isSelected && {
469
+ shadowColor: AppColors_1.AppColors.violet600,
470
+ shadowOffset: { width: 0, height: 1 },
471
+ shadowOpacity: 0.28,
472
+ shadowRadius: 2.5,
473
+ elevation: 2,
474
+ },
475
+ ]}>
476
+ <react_native_1.View style={{
477
+ width: 12,
478
+ height: 12,
479
+ borderRadius: 3,
480
+ borderWidth: 1.2,
481
+ borderColor: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple400,
482
+ backgroundColor: isSelected ? AppColors_1.AppColors.white : 'transparent',
483
+ alignItems: 'center',
484
+ justifyContent: 'center',
485
+ }}>
486
+ {isSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.violet600} size={8}/>}
487
+ </react_native_1.View>
488
+ <NetworkIcons_1.BoltIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>
489
+ <react_native_1.Text style={{
490
+ fontFamily: AppFonts_1.AppFonts.interBold,
491
+ fontSize: 10,
492
+ color: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.brandPurple,
493
+ }}>
494
+ {t('analytics.systemCategory')}: {categoryStats.system} ({categoryStats.systemPct}%)
495
+ </react_native_1.Text>
496
+ </TouchableScale_1.default>);
497
+ })()}
498
+
499
+ {/* Custom Button */}
500
+ {(() => {
501
+ const isSelected = !analyticsFilters.categories.has('all') &&
502
+ analyticsFilters.categories.has('custom');
503
+ return (<TouchableScale_1.default onPress={() => toggleCategoryFilter('custom')} style={[
504
+ {
505
+ flexDirection: 'row',
506
+ alignItems: 'center',
507
+ gap: 5,
508
+ backgroundColor: isSelected ? AppColors_1.AppColors.pink600 : AppColors_1.AppColors.pink100,
509
+ paddingHorizontal: 8,
510
+ paddingVertical: 5,
511
+ borderRadius: 7,
512
+ borderWidth: 1,
513
+ borderColor: isSelected ? AppColors_1.AppColors.rose700 : AppColors_1.AppColors.roseBorder,
514
+ },
515
+ isSelected && {
516
+ shadowColor: AppColors_1.AppColors.pink600,
517
+ shadowOffset: { width: 0, height: 1 },
518
+ shadowOpacity: 0.28,
519
+ shadowRadius: 2.5,
520
+ elevation: 2,
521
+ },
522
+ ]}>
523
+ <react_native_1.View style={{
524
+ width: 12,
525
+ height: 12,
526
+ borderRadius: 3,
527
+ borderWidth: 1.2,
528
+ borderColor: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.pink400,
529
+ backgroundColor: isSelected ? AppColors_1.AppColors.white : 'transparent',
530
+ alignItems: 'center',
531
+ justifyContent: 'center',
532
+ }}>
533
+ {isSelected && <NetworkIcons_1.CheckIcon color={AppColors_1.AppColors.pink600} size={8}/>}
534
+ </react_native_1.View>
535
+ <NetworkIcons_1.SparkleIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.brandPurple} size={11}/>
536
+ <react_native_1.Text style={{
537
+ fontFamily: AppFonts_1.AppFonts.interBold,
538
+ fontSize: 10,
539
+ color: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.pink600,
540
+ }}>
541
+ {t('analytics.customCategory')}: {categoryStats.custom} ({categoryStats.customPct}%)
542
+ </react_native_1.Text>
543
+ </TouchableScale_1.default>);
544
+ })()}
545
+ </react_native_1.View>
546
+ </react_native_1.View>
547
+
548
+ {/* ── 3. GA4 Realtime Metric Hero & Activity Chart (UNDER CATEGORIES) ─ */}
259
549
  <react_native_1.View style={{
260
- marginTop: 10,
550
+ marginTop: 2,
261
551
  marginBottom: 8,
262
552
  backgroundColor: AppColors_1.AppColors.grayBackground,
263
553
  borderRadius: 10,
@@ -475,199 +765,6 @@ const AnalyticsHeader = react_1.default.memo(() => {
475
765
  </react_native_1.View>
476
766
  </react_native_1.View>
477
767
 
478
- {/* ── Category Breakdown Distribution Bar & Interactive Filter Buttons ─ */}
479
- <react_native_1.View style={{ marginTop: 2, marginBottom: 4 }}>
480
- {/* Multi-color Proportional Segmented Bar */}
481
- <react_native_1.View style={{
482
- height: 5,
483
- borderRadius: 2.5,
484
- backgroundColor: `${AppColors_1.AppColors.grayBorderSecondary}40`,
485
- flexDirection: 'row',
486
- overflow: 'hidden',
487
- marginBottom: 8,
488
- }}>
489
- {categoryStats.ecommerce > 0 && (<react_native_1.View style={{
490
- flex: categoryStats.ecommerce,
491
- backgroundColor: AppColors_1.AppColors.amber500,
492
- }}/>)}
493
- {categoryStats.page_view > 0 && (<react_native_1.View style={{
494
- flex: categoryStats.page_view,
495
- backgroundColor: AppColors_1.AppColors.sky500,
496
- }}/>)}
497
- {categoryStats.system > 0 && (<react_native_1.View style={{
498
- flex: categoryStats.system,
499
- backgroundColor: AppColors_1.AppColors.purple,
500
- }}/>)}
501
- {categoryStats.custom > 0 && (<react_native_1.View style={{
502
- flex: categoryStats.custom,
503
- backgroundColor: AppColors_1.AppColors.brandPurple,
504
- }}/>)}
505
- </react_native_1.View>
506
-
507
- {/* 4 Interactive Category Filter Buttons */}
508
- <react_native_1.View style={{
509
- flexDirection: 'row',
510
- flexWrap: 'wrap',
511
- gap: 6,
512
- }}>
513
- {/* Ecommerce Button */}
514
- {(() => {
515
- const isSelected = !analyticsFilters.categories.has('all') &&
516
- analyticsFilters.categories.has('ecommerce');
517
- return (<TouchableScale_1.default onPress={() => toggleCategoryFilter('ecommerce')} style={[
518
- {
519
- flexDirection: 'row',
520
- alignItems: 'center',
521
- gap: 4.5,
522
- backgroundColor: isSelected
523
- ? AppColors_1.AppColors.amber500
524
- : `${AppColors_1.AppColors.amber500}14`,
525
- paddingHorizontal: 7,
526
- paddingVertical: 4.5,
527
- borderRadius: 6,
528
- borderWidth: 1,
529
- borderColor: isSelected
530
- ? AppColors_1.AppColors.amber500
531
- : `${AppColors_1.AppColors.amber500}35`,
532
- },
533
- isSelected && {
534
- shadowColor: AppColors_1.AppColors.amber500,
535
- shadowOffset: { width: 0, height: 1 },
536
- shadowOpacity: 0.25,
537
- shadowRadius: 2,
538
- elevation: 2,
539
- },
540
- ]}>
541
- <NetworkIcons_1.CartIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.amber700} size={11}/>
542
- <react_native_1.Text style={{
543
- fontFamily: AppFonts_1.AppFonts.interBold,
544
- fontSize: 10,
545
- color: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.amber700,
546
- }}>
547
- Ecommerce: {categoryStats.ecommerce} ({categoryStats.ecommercePct}%)
548
- </react_native_1.Text>
549
- </TouchableScale_1.default>);
550
- })()}
551
-
552
- {/* Screens Button */}
553
- {(() => {
554
- const isSelected = !analyticsFilters.categories.has('all') &&
555
- analyticsFilters.categories.has('page_view');
556
- return (<TouchableScale_1.default onPress={() => toggleCategoryFilter('page_view')} style={[
557
- {
558
- flexDirection: 'row',
559
- alignItems: 'center',
560
- gap: 4.5,
561
- backgroundColor: isSelected
562
- ? AppColors_1.AppColors.sky600
563
- : `${AppColors_1.AppColors.sky500}14`,
564
- paddingHorizontal: 7,
565
- paddingVertical: 4.5,
566
- borderRadius: 6,
567
- borderWidth: 1,
568
- borderColor: isSelected
569
- ? AppColors_1.AppColors.sky600
570
- : `${AppColors_1.AppColors.sky500}35`,
571
- },
572
- isSelected && {
573
- shadowColor: AppColors_1.AppColors.sky600,
574
- shadowOffset: { width: 0, height: 1 },
575
- shadowOpacity: 0.25,
576
- shadowRadius: 2,
577
- elevation: 2,
578
- },
579
- ]}>
580
- <NetworkIcons_1.GlobeIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.sky600} size={11}/>
581
- <react_native_1.Text style={{
582
- fontFamily: AppFonts_1.AppFonts.interBold,
583
- fontSize: 10,
584
- color: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.sky600,
585
- }}>
586
- Screens: {categoryStats.page_view} ({categoryStats.page_viewPct}%)
587
- </react_native_1.Text>
588
- </TouchableScale_1.default>);
589
- })()}
590
-
591
- {/* System Button */}
592
- {(() => {
593
- const isSelected = !analyticsFilters.categories.has('all') &&
594
- analyticsFilters.categories.has('system');
595
- return (<TouchableScale_1.default onPress={() => toggleCategoryFilter('system')} style={[
596
- {
597
- flexDirection: 'row',
598
- alignItems: 'center',
599
- gap: 4.5,
600
- backgroundColor: isSelected
601
- ? AppColors_1.AppColors.purple
602
- : `${AppColors_1.AppColors.purple}14`,
603
- paddingHorizontal: 7,
604
- paddingVertical: 4.5,
605
- borderRadius: 6,
606
- borderWidth: 1,
607
- borderColor: isSelected
608
- ? AppColors_1.AppColors.purple
609
- : `${AppColors_1.AppColors.purple}35`,
610
- },
611
- isSelected && {
612
- shadowColor: AppColors_1.AppColors.purple,
613
- shadowOffset: { width: 0, height: 1 },
614
- shadowOpacity: 0.25,
615
- shadowRadius: 2,
616
- elevation: 2,
617
- },
618
- ]}>
619
- <NetworkIcons_1.BoltIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple} size={11}/>
620
- <react_native_1.Text style={{
621
- fontFamily: AppFonts_1.AppFonts.interBold,
622
- fontSize: 10,
623
- color: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.purple,
624
- }}>
625
- System: {categoryStats.system} ({categoryStats.systemPct}%)
626
- </react_native_1.Text>
627
- </TouchableScale_1.default>);
628
- })()}
629
-
630
- {/* Custom Button */}
631
- {(() => {
632
- const isSelected = !analyticsFilters.categories.has('all') &&
633
- analyticsFilters.categories.has('custom');
634
- return (<TouchableScale_1.default onPress={() => toggleCategoryFilter('custom')} style={[
635
- {
636
- flexDirection: 'row',
637
- alignItems: 'center',
638
- gap: 4.5,
639
- backgroundColor: isSelected
640
- ? AppColors_1.AppColors.brandPurple
641
- : `${AppColors_1.AppColors.brandPurple}14`,
642
- paddingHorizontal: 7,
643
- paddingVertical: 4.5,
644
- borderRadius: 6,
645
- borderWidth: 1,
646
- borderColor: isSelected
647
- ? AppColors_1.AppColors.brandPurple
648
- : `${AppColors_1.AppColors.brandPurple}35`,
649
- },
650
- isSelected && {
651
- shadowColor: AppColors_1.AppColors.brandPurple,
652
- shadowOffset: { width: 0, height: 1 },
653
- shadowOpacity: 0.25,
654
- shadowRadius: 2,
655
- elevation: 2,
656
- },
657
- ]}>
658
- <NetworkIcons_1.SparkleIcon color={isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.brandPurple} size={11}/>
659
- <react_native_1.Text style={{
660
- fontFamily: AppFonts_1.AppFonts.interBold,
661
- fontSize: 10,
662
- color: isSelected ? AppColors_1.AppColors.white : AppColors_1.AppColors.brandPurple,
663
- }}>
664
- Custom: {categoryStats.custom} ({categoryStats.customPct}%)
665
- </react_native_1.Text>
666
- </TouchableScale_1.default>);
667
- })()}
668
- </react_native_1.View>
669
- </react_native_1.View>
670
-
671
768
  {/* ── Top Screens / Views Mini Leaderboard (GA4 Realtime Overview) ──── */}
672
769
  {topScreens.length > 0 && (<react_native_1.View style={{
673
770
  marginTop: 8,