react-native-inapp-inspector 2.3.24 → 2.3.25

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 (145) hide show
  1. package/dist/commonjs/components/AnalyticsDetail.js +8 -8
  2. package/dist/commonjs/components/AnalyticsEventCard.js +11 -8
  3. package/dist/commonjs/components/AppHeaderLogo.js +1 -1
  4. package/dist/commonjs/components/BrandSquareIcon.js +12 -12
  5. package/dist/commonjs/components/ConsoleLogCard.d.ts +1 -0
  6. package/dist/commonjs/components/ConsoleLogCard.js +92 -80
  7. package/dist/commonjs/components/EndOfListFooter.d.ts +5 -1
  8. package/dist/commonjs/components/EndOfListFooter.js +27 -5
  9. package/dist/commonjs/components/Inspector/AnalyticsTab.js +30 -298
  10. package/dist/commonjs/components/Inspector/ConsoleTab.js +38 -93
  11. package/dist/commonjs/components/Inspector/CrashDetail.js +12 -12
  12. package/dist/commonjs/components/Inspector/CrashTab.js +43 -33
  13. package/dist/commonjs/components/Inspector/DebuggingTab.js +9 -9
  14. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +54 -52
  15. package/dist/commonjs/components/Inspector/InspectorHeader.js +1 -1
  16. package/dist/commonjs/components/Inspector/MainScreen.js +23 -25
  17. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +1 -1
  18. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +3 -3
  19. package/dist/commonjs/components/Inspector/NetworkTab.js +31 -31
  20. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +3 -3
  21. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +21 -22
  22. package/dist/commonjs/components/Inspector/ReduxTab.js +110 -97
  23. package/dist/commonjs/components/Inspector/SettingsPanel.js +48 -100
  24. package/dist/commonjs/components/Inspector/StorageTab.js +56 -52
  25. package/dist/commonjs/components/Inspector/TabBar.js +29 -26
  26. package/dist/commonjs/components/JsonViewer.js +169 -164
  27. package/dist/commonjs/components/LogCard.js +34 -38
  28. package/dist/commonjs/components/LogSyntaxHighlighter.js +3 -3
  29. package/dist/commonjs/components/SegmentedTabs.d.ts +4 -1
  30. package/dist/commonjs/components/SegmentedTabs.js +8 -8
  31. package/dist/commonjs/constants/index.js +1 -1
  32. package/dist/commonjs/constants/version.d.ts +1 -1
  33. package/dist/commonjs/constants/version.js +1 -1
  34. package/dist/commonjs/customHooks/networkLogger.js +1 -2
  35. package/dist/commonjs/helpers/index.d.ts +6 -0
  36. package/dist/commonjs/helpers/index.js +4 -4
  37. package/dist/commonjs/helpers/memoryManager.d.ts +0 -1
  38. package/dist/commonjs/helpers/memoryManager.js +1 -1
  39. package/dist/commonjs/helpers/remoteConfig.js +1 -1
  40. package/dist/commonjs/helpers/settingsStore.js +1 -1
  41. package/dist/commonjs/i18n/index.d.ts +35 -0
  42. package/dist/commonjs/i18n/index.js +1 -1
  43. package/dist/commonjs/i18n/locales/ar.json +1 -0
  44. package/dist/commonjs/i18n/locales/de.json +1 -0
  45. package/dist/commonjs/i18n/locales/en.json +1 -1
  46. package/dist/commonjs/i18n/locales/es.json +1 -0
  47. package/dist/commonjs/i18n/locales/fr.json +1 -0
  48. package/dist/commonjs/i18n/locales/hi.json +1 -0
  49. package/dist/commonjs/i18n/locales/ja.json +1 -0
  50. package/dist/commonjs/i18n/locales/ko.json +1 -0
  51. package/dist/commonjs/i18n/locales/pt.json +1 -0
  52. package/dist/commonjs/i18n/locales/ru.json +1 -0
  53. package/dist/commonjs/i18n/locales/zh.json +1 -0
  54. package/dist/commonjs/index.d.ts +2 -4
  55. package/dist/commonjs/index.js +2 -2
  56. package/dist/commonjs/styles/AppColors.d.ts +40 -0
  57. package/dist/commonjs/styles/AppColors.js +1 -1
  58. package/dist/commonjs/styles/index.js +1 -1
  59. package/dist/commonjs/types/enums.d.ts +0 -20
  60. package/dist/commonjs/types/enums.js +1 -1
  61. package/dist/esm/components/AnalyticsDetail.js +75 -75
  62. package/dist/esm/components/AnalyticsEventCard.js +20 -17
  63. package/dist/esm/components/AppHeaderLogo.js +5 -5
  64. package/dist/esm/components/BrandSquareIcon.js +39 -39
  65. package/dist/esm/components/ConsoleLogCard.d.ts +1 -0
  66. package/dist/esm/components/ConsoleLogCard.js +98 -86
  67. package/dist/esm/components/EndOfListFooter.d.ts +5 -1
  68. package/dist/esm/components/EndOfListFooter.js +36 -14
  69. package/dist/esm/components/Inspector/AnalyticsTab.js +47 -315
  70. package/dist/esm/components/Inspector/ConsoleTab.js +61 -116
  71. package/dist/esm/components/Inspector/CrashDetail.js +49 -49
  72. package/dist/esm/components/Inspector/CrashTab.js +75 -65
  73. package/dist/esm/components/Inspector/DebuggingTab.js +31 -31
  74. package/dist/esm/components/Inspector/DeviceInfoTab.js +146 -144
  75. package/dist/esm/components/Inspector/InspectorHeader.js +5 -5
  76. package/dist/esm/components/Inspector/MainScreen.js +51 -53
  77. package/dist/esm/components/Inspector/MediaGalleryTab.js +1 -1
  78. package/dist/esm/components/Inspector/MediaPreviewModal.js +31 -31
  79. package/dist/esm/components/Inspector/NetworkTab.js +63 -63
  80. package/dist/esm/components/Inspector/NpmStarPrompt.js +42 -42
  81. package/dist/esm/components/Inspector/NpmUpdateToast.js +45 -46
  82. package/dist/esm/components/Inspector/ReduxTab.js +163 -150
  83. package/dist/esm/components/Inspector/SettingsPanel.js +136 -188
  84. package/dist/esm/components/Inspector/StorageTab.js +88 -84
  85. package/dist/esm/components/Inspector/TabBar.js +37 -34
  86. package/dist/esm/components/JsonViewer.js +173 -168
  87. package/dist/esm/components/LogCard.js +38 -42
  88. package/dist/esm/components/LogSyntaxHighlighter.js +1 -1
  89. package/dist/esm/components/SegmentedTabs.d.ts +4 -1
  90. package/dist/esm/components/SegmentedTabs.js +8 -8
  91. package/dist/esm/constants/index.js +1 -1
  92. package/dist/esm/constants/version.d.ts +1 -1
  93. package/dist/esm/constants/version.js +1 -1
  94. package/dist/esm/customHooks/networkLogger.js +1 -2
  95. package/dist/esm/helpers/index.d.ts +6 -0
  96. package/dist/esm/helpers/index.js +4 -4
  97. package/dist/esm/helpers/memoryManager.d.ts +0 -1
  98. package/dist/esm/helpers/memoryManager.js +1 -1
  99. package/dist/esm/helpers/remoteConfig.js +1 -1
  100. package/dist/esm/helpers/settingsStore.js +1 -1
  101. package/dist/esm/i18n/index.d.ts +35 -0
  102. package/dist/esm/i18n/index.js +1 -1
  103. package/dist/esm/i18n/locales/ar.json +1 -0
  104. package/dist/esm/i18n/locales/de.json +1 -0
  105. package/dist/esm/i18n/locales/en.json +1 -1
  106. package/dist/esm/i18n/locales/es.json +1 -0
  107. package/dist/esm/i18n/locales/fr.json +1 -0
  108. package/dist/esm/i18n/locales/hi.json +1 -0
  109. package/dist/esm/i18n/locales/ja.json +1 -0
  110. package/dist/esm/i18n/locales/ko.json +1 -0
  111. package/dist/esm/i18n/locales/pt.json +1 -0
  112. package/dist/esm/i18n/locales/ru.json +1 -0
  113. package/dist/esm/i18n/locales/zh.json +1 -0
  114. package/dist/esm/index.d.ts +2 -4
  115. package/dist/esm/index.js +5 -5
  116. package/dist/esm/styles/AppColors.d.ts +40 -0
  117. package/dist/esm/styles/AppColors.js +1 -1
  118. package/dist/esm/styles/index.js +1 -1
  119. package/dist/esm/types/enums.d.ts +0 -20
  120. package/dist/esm/types/enums.js +1 -1
  121. package/package.json +1 -15
  122. package/dist/commonjs/bundle.d.ts +0 -2
  123. package/dist/commonjs/bundle.js +0 -1
  124. package/dist/commonjs/components/Inspector/BundleTab.d.ts +0 -48
  125. package/dist/commonjs/components/Inspector/BundleTab.js +0 -1297
  126. package/dist/commonjs/components/Inspector/PerformanceTab.d.ts +0 -27
  127. package/dist/commonjs/components/Inspector/PerformanceTab.js +0 -454
  128. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +0 -115
  129. package/dist/commonjs/customHooks/bundleAnalyzer.js +0 -1
  130. package/dist/commonjs/customHooks/performanceTracker.d.ts +0 -144
  131. package/dist/commonjs/customHooks/performanceTracker.js +0 -63
  132. package/dist/commonjs/performance.d.ts +0 -2
  133. package/dist/commonjs/performance.js +0 -1
  134. package/dist/esm/bundle.d.ts +0 -2
  135. package/dist/esm/bundle.js +0 -1
  136. package/dist/esm/components/Inspector/BundleTab.d.ts +0 -48
  137. package/dist/esm/components/Inspector/BundleTab.js +0 -1297
  138. package/dist/esm/components/Inspector/PerformanceTab.d.ts +0 -27
  139. package/dist/esm/components/Inspector/PerformanceTab.js +0 -454
  140. package/dist/esm/customHooks/bundleAnalyzer.d.ts +0 -115
  141. package/dist/esm/customHooks/bundleAnalyzer.js +0 -1
  142. package/dist/esm/customHooks/performanceTracker.d.ts +0 -144
  143. package/dist/esm/customHooks/performanceTracker.js +0 -63
  144. package/dist/esm/performance.d.ts +0 -2
  145. package/dist/esm/performance.js +0 -1
@@ -1,27 +0,0 @@
1
- import React from 'react';
2
- export interface PerformanceEvent {
3
- id: string;
4
- timestamp: number;
5
- type: 'fps_drop' | 'slow_render' | 'transition' | 'memory' | 'network' | 'bridge' | 'touch';
6
- category: 'render' | 'navigation' | 'memory' | 'io' | 'bridge';
7
- fps: number;
8
- durationMs: number;
9
- droppedFrames?: number;
10
- frameTimeMs?: number;
11
- frameBudgetPct?: number;
12
- bottleneckThread?: 'JS Thread' | 'UI Thread' | 'Bridge' | 'Balanced';
13
- screenName?: string;
14
- label: string;
15
- detail: string;
16
- source?: string;
17
- breakdown?: {
18
- jsTimeMs: number;
19
- uiTimeMs: number;
20
- bridgeLatencyMs?: number;
21
- };
22
- heapDeltaKb?: number;
23
- advice?: string;
24
- severity: 'optimal' | 'warning' | 'critical';
25
- }
26
- declare const PerformanceTab: React.MemoExoticComponent<() => React.JSX.Element>;
27
- export default PerformanceTab;
@@ -1,454 +0,0 @@
1
- import rr,{useState as I,useEffect as Q,useMemo as J,useRef as ke}from"react";import{ScrollView as Se,StyleSheet as tr,Text as C,TextInput as Tr,TouchableOpacity as Cr,View as T}from"react-native";import Sr,{Path as Be,Defs as Br,LinearGradient as Fr,Stop as Fe,Line as Me,Circle as Ve,G as Mr}from"react-native-svg";import K from"../TouchableScale";import Vr from"../CopyButton";import Re from"../HighlightText";import Rr from"../EndOfListFooter";import Ir from"./FeatureUnderDevNotice";import{AppColors as e}from"../../styles/AppColors";import{AppFonts as k}from"../../styles/AppFonts";import{useTranslation as vr}from"../../i18n";import{getRuntimeDiagnostics as Dr}from"../../helpers";import{SearchIcon as Wr,CircleXIcon as Lr,CircleAlertIcon as Ar,PerformanceIcon as Ie,BoltIcon as Te,LightbulbIcon as Hr,MapIcon as Nr,AtomIcon as Pr,BrainIcon as Er,GlobeIcon as $r,ChevronIcon as Gr}from"../NetworkIcons";import{getPerformanceEvents as Or,subscribePerformanceEvents as Jr,logPerformanceEvent as Kr,clearPerformanceEvents as Ur}from"../../customHooks/performanceTracker";import{startNativeFpsMonitoring as Yr,stopNativeFpsMonitoring as qr,getNativeFpsMetrics as Xr,getNativeSystemMetrics as _r,isNativeModuleAvailable as ve}from"../../native/NativeInspector";import{trackInspectorScreenRecord as Zr}from"../../helpers/telemetry";const Qr=rr.memo(()=>{const{t:w}=vr(),[j,De]=I(!0),[ee,We]=I(60),[we,Le]=I(57),[et,Ae]=I(60),[v,He]=I(59),[Ce,Ne]=I(4820),[Pe,Ee]=I(4),[q,je]=I(1.2),[$e,Ge]=I({"perf-1":!0}),Oe=t=>{Ge(S=>({...S,[t]:!S[t]}))},[$,Je]=I([60,59,60,60,58,60,59,60,60,60,57,60,59,60,60,58,60,60,59,60]),[re,Ke]=I(()=>Or()),[P,Ue]=I("ALL"),[W,te]=I("");Q(()=>Jr(S=>{Ke(S)}),[]);const oe=ke(Date.now()),X=ke(null),[L,Ye]=I(null);Q(()=>{let t=!0;const S=async()=>{const F=await _r();t&&F&&Ye(F)};S();const B=setInterval(S,2e3);return()=>{t=!1,clearInterval(B)}},[]),Q(()=>{if(ve())return Yr(),()=>{qr()}},[]),Q(()=>{if(!j)return;let t=!0,S=0,B=0,F=Date.now();const R=async()=>{if(!t)return;const z=Date.now(),E=z-oe.current;oe.current=z;const D=Math.max(0,E-16.67);if(D>B&&(B=D),S++,z-F>=1e3){const O=z-F;let V=Math.min(120,Math.max(0,Math.round(S*1e3/O)));if(ve())try{const M=await Xr();M&&M.fps>0&&(V=Math.round(M.fps))}catch{}if(We(V),Le(M=>Math.min(M,V)),Ae(M=>Math.max(M,V)),Ne(M=>M+S),je(Number(B.toFixed(1))),V<55&&Ee(M=>M+1),Je(M=>{const Y=[...M.slice(-19),V],Ze=Y.reduce((Qe,er)=>Qe+er,0);return He(Math.round(Ze/Y.length)),Y}),V<50){const M=(1e3/V).toFixed(1);Kr({type:"fps_drop",category:"render",fps:V,durationMs:Number(M),label:w("performance.liveFpsDip",{fps:V}),detail:w("performance.liveFpsDipDetail",{duration:M}),source:w("performance.uiRenderThread"),breakdown:{jsTimeMs:Number((1e3/V*.65).toFixed(1)),uiTimeMs:Number((1e3/V*.35).toFixed(1))},advice:w("performance.liveFpsDipAdvice"),severity:V<30?"critical":"warning"})}S=0,B=0,F=z}X.current=requestAnimationFrame(R)};return oe.current=Date.now(),X.current=requestAnimationFrame(R),()=>{t=!1,X.current&&cancelAnimationFrame(X.current)}},[j]);const _=J(()=>re.filter(t=>{let S=!0;if(W&&W.trim().length>0){const F=W.trim().toLowerCase().split(/\s+/).filter(Boolean),R=[t.label||"",t.detail||"",t.source||"",t.category||"",t.severity||"",t.bottleneckThread||""].join(" ").toLowerCase();S=F.every(z=>R.includes(z))}const B=P==="ALL"?!0:P==="JANKY"?t.severity==="warning"||t.severity==="critical":P==="NAVIGATION"?t.category==="navigation":P==="RENDER"?t.category==="render":P==="MEMORY"?t.category==="memory":t.category==="io"||t.category==="bridge";return S&&B}),[re,W,P]),ae=J(()=>v>=58?{score:"98/100",grade:w("performance.excellent"),color:e.emerald600,bg:e.greenBg}:v>=50?{score:"84/100",grade:w("performance.good"),color:e.firebaseOrange,bg:e.amberBg}:{score:"58/100",grade:w("performance.needsOptimization"),color:e.errorColor,bg:e.errorCardBg},[v,w]),G=J(()=>{const t=Dr(),S={hermes:w("performance.hermesAot"),v8:w("performance.v8Jit"),jsc:w("performance.jscEngine")},B={hermes:w("performance.bytecodeCompiled"),v8:w("performance.jitEngine"),jsc:w("performance.webkitEngine")},F={fabric:w("performance.fabricJsi"),paper:w("performance.paperBridge")},R={fabric:w("performance.directCppBindings"),paper:w("performance.asyncJsonBridge")};return{jsEngineName:S[t.engineType],jsEngineSub:B[t.engineType],uiArchName:F[t.archType],uiArchSub:R[t.archType],usedHeapMb:t.usedHeapMb,totalAllocMb:t.totalAllocMb}},[w]),A=J(()=>{const t=v>0?1e3/v:16.67,S=Number(Math.max(1,Math.min(t*.45,2+q)).toFixed(1)),B=Number(Math.max(1,t*.2).toFixed(1)),F=Number(Math.max(1,t*.25).toFixed(1)),R=S+B+F,z=Math.max(0,Number((16.67-R).toFixed(1))),E=Math.max(0,Math.min(100,Math.round(z/16.67*100)));return{jsTime:S,layoutTime:B,renderTime:F,freeTime:z,headroomPercent:E}},[v,q]),[U,qe]=I(null),Z=320,H=64,N=J(()=>{const t=$.length>0?$:[60,60],S=Z/Math.max(1,t.length-1),B=t.map((D,O)=>{const V=Math.max(0,Math.min(60,D)),M=Number((O*S).toFixed(1)),Y=Number((H-V/60*(H-14)-6).toFixed(1));return{x:M,y:Y,val:D}});let F=`M ${B[0].x} ${B[0].y}`;for(let D=0;D<B.length-1;D++){const O=B[D],V=B[D+1],M=Number(((O.x+V.x)/2).toFixed(1));F+=` C ${M} ${O.y}, ${M} ${V.y}, ${V.x} ${V.y}`}const R=B[B.length-1],z=B[0],E=`${F} L ${R.x} ${H} L ${z.x} ${H} Z`;return{linePath:F,areaPath:E,coords:B}},[$]),Xe=J(()=>{let t=0,S=0,B=0,F=0;$.forEach(z=>{z>=55?t++:z>=30?S++:z>=20?B++:F++});const R=Math.max(1,$.length);return[{key:"optimal",label:w("performance.optimalBucket"),count:t,percent:Number((t/R*100).toFixed(0)),color:e.emerald500,bgColor:e.emerald100},{key:"minorJank",label:w("performance.minorJankBucket"),count:S,percent:Number((S/R*100).toFixed(0)),color:e.amber500,bgColor:e.amber100},{key:"noticeableJank",label:w("performance.noticeableJankBucket"),count:B,percent:Number((B/R*100).toFixed(0)),color:e.firebaseOrange,bgColor:e.lightOrange},{key:"severeFreeze",label:w("performance.severeFreezeBucket"),count:F,percent:Number((F/R*100).toFixed(0)),color:e.errorColor,bgColor:e.errorCardBg}]},[$,w]),_e=()=>{Ur()},ie=U!==null&&N.coords[U]?N.coords[U]:null;return<T style={r.container}>
2
-
3
- <T style={r.headerBar}>
4
- <T style={r.searchBox}>
5
- <Wr color={e.grayTextWeak}size={15}/>
6
- <Tr placeholder={w("performance.searchPlaceholder")}placeholderTextColor={e.grayTextWeak}value={W}onChangeText={te}style={r.searchInput}autoCapitalize="none"autoCorrect={!1}/>
7
- {W?<K onPress={()=>te("")}>
8
- <Lr color={e.grayTextWeak}size={16}/>
9
- </K>:null}
10
- </T>
11
-
12
-
13
- <K onPress={()=>{De(t=>{const S=!t;return Zr(S?"start":"stop","performance_fps"),S})}}style={[r.recordToggleBtn,j?r.recordToggleActive:r.recordToggleInactive]}>
14
- <T style={[r.recordingDot,{backgroundColor:j?e.errorColor:e.grayTextWeak}]}/>
15
- <C style={[r.recordToggleText,{color:j?e.errorColor:e.grayTextWeak}]}>
16
- {w(j?"performance.recording":"performance.paused")}
17
- </C>
18
- </K>
19
- </T>
20
-
21
- <Ir featureName="Performance & FPS Profiler"/>
22
-
23
-
24
- <T style={r.categoryScrollWrapper}>
25
- <Se horizontal showsHorizontalScrollIndicator={!1}style={r.categoryScrollView}contentContainerStyle={r.categoryScroll}>
26
- {[{key:"ALL",label:w("performance.catAll"),icon:t=><Ie size={12}color={t}/>},{key:"JANKY",label:w("performance.catJanky"),icon:t=><Ar size={12}color={t}/>},{key:"NAVIGATION",label:w("performance.catNavigation"),icon:t=><Nr size={12}color={t}/>},{key:"RENDER",label:w("performance.catRender"),icon:t=><Pr size={12}color={t}/>},{key:"MEMORY",label:w("performance.catMemory"),icon:t=><Er size={12}color={t}/>},{key:"IO",label:w("performance.catIo"),icon:t=><$r size={12}color={t}/>}].map(t=>{const S=P===t.key,B=S?e.white:e.grayTextWeak;return<K key={t.key}onPress={()=>Ue(t.key)}style={[r.categoryChip,S&&r.categoryChipActive,{flexDirection:"row",alignItems:"center",gap:5}]}>
27
- {t.icon(B)}
28
- <C style={[r.categoryChipText,S&&r.categoryChipTextActive]}>
29
- {t.label}
30
- </C>
31
- </K>})}
32
- </Se>
33
- </T>
34
-
35
-
36
- <Se style={r.scrollBody}contentContainerStyle={r.scrollContent}showsVerticalScrollIndicator={!1}>
37
-
38
- <T style={r.heroCard}>
39
- <T style={r.heroHeaderRow}>
40
- <T style={{flexDirection:"row",alignItems:"center",gap:6}}>
41
- <Ie color={e.purple}size={17}/>
42
- <T>
43
- <C style={r.heroTitle}>
44
- {w("performance.fpsAreaChartTitle")}
45
- </C>
46
- <C style={r.heroSubTitle}>
47
- {w("performance.fpsAreaChartSub")}
48
- </C>
49
- </T>
50
- </T>
51
-
52
-
53
- <T style={[r.scorePill,{backgroundColor:ae.bg}]}>
54
- <C style={[r.scorePillText,{color:ae.color}]}>
55
- {ae.grade}
56
- </C>
57
- </T>
58
- </T>
59
-
60
-
61
- <T style={r.primaryFpsRow}>
62
- <T style={r.fpsBigNumberBox}>
63
- <C style={[r.fpsBigNumber,{color:ee>=55?e.emerald600:ee>=40?e.firebaseOrange:e.errorColor}]}>
64
- {ee}
65
- </C>
66
- <C style={r.fpsUnit}>{w("performance.fpsUnit")}</C>
67
- </T>
68
-
69
- <T style={r.fpsStatsGrid}>
70
- <T style={r.statItem}>
71
- <C style={r.statLabel}>
72
- {w("performance.avgFrameTime")}
73
- </C>
74
- <C style={r.statValue}>{v}</C>
75
- </T>
76
- <T style={r.statItem}>
77
- <C style={r.statLabel}>
78
- {w("performance.peakTime")}
79
- </C>
80
- <C style={[r.statValue,we<50&&{color:e.firebaseOrange}]}>
81
- {we}
82
- </C>
83
- </T>
84
- <T style={r.statItem}>
85
- <C style={r.statLabel}>
86
- {w("performance.jsLag")}
87
- </C>
88
- <C style={[r.statValue,q>5&&{color:e.firebaseOrange}]}>
89
- {q}ms
90
- </C>
91
- </T>
92
- <T style={r.statItem}>
93
- <C style={r.statLabel}>
94
- {w("performance.jankRate")}
95
- </C>
96
- <C style={r.statValue}>
97
- {Ce>0?`${(Pe/Math.max(1,Ce/60)*100).toFixed(0)}%`:"0%"}
98
- </C>
99
- </T>
100
- </T>
101
- </T>
102
-
103
-
104
- {ie&&<T style={r.graphScrubTooltip}>
105
- <C style={r.graphScrubTooltipText}>
106
- {ie.val} FPS •{" "}
107
- {Number((1e3/Math.max(1,ie.val)).toFixed(1))}
108
- ms
109
- </C>
110
- </T>}
111
-
112
-
113
- <T style={r.svgGraphContainer}>
114
- <Sr width="100%"height={H}viewBox={`0 0 ${Z} ${H}`}preserveAspectRatio="none">
115
- <Br>
116
- <Fr id="fpsAreaGradient"x1="0"y1="0"x2="0"y2="1">
117
- <Fe offset="0%"stopColor={v>=55?e.emerald500:v>=40?e.amber500:e.errorColor}stopOpacity="0.32"/>
118
- <Fe offset="100%"stopColor={v>=55?e.emerald500:v>=40?e.amber500:e.errorColor}stopOpacity="0.02"/>
119
- </Fr>
120
- </Br>
121
-
122
-
123
- <Me x1="0"y1="7"x2={Z}y2="7"stroke={e.emerald500}strokeWidth="1"strokeDasharray="4,4"opacity="0.4"/>
124
-
125
-
126
- <Me x1="0"y1={H/2}x2={Z}y2={H/2}stroke={e.amber500}strokeWidth="0.8"strokeDasharray="3,3"opacity="0.3"/>
127
-
128
-
129
- {N.areaPath?<Be d={N.areaPath}fill="url(#fpsAreaGradient)"/>:null}
130
-
131
-
132
- {N.linePath?<Be d={N.linePath}fill="none"stroke={v>=55?e.emerald600:v>=40?e.amber600:e.errorColor}strokeWidth="2.2"/>:null}
133
-
134
-
135
- {N.coords.map((t,S)=>{const B=U===S,F=t.val<50;return<Mr key={S}>
136
- {F&&<Ve cx={t.x}cy={t.y}r="4"fill={e.errorColor}opacity="0.25"/>}
137
- <Ve cx={t.x}cy={t.y}r={B?4:F?2.5:1.8}fill={B?e.brandPurple:F?e.errorColor:e.emerald600}stroke={e.white}strokeWidth={B?1.5:.8}/>
138
- </Mr>})}
139
- </Sr>
140
-
141
-
142
- <T style={r.svgTouchOverlay}>
143
- {N.coords.map((t,S)=><Cr key={S}style={r.svgTouchCol}activeOpacity={.7}onPress={()=>qe(U===S?null:S)}/>)}
144
- </T>
145
- </T>
146
-
147
- <T style={r.sparklineFooter}>
148
- <C style={r.sparklineFooterText}>
149
- {w("performance.realtimeWindow")}
150
- </C>
151
- <C style={r.sparklineFooterTarget}>
152
- {w("performance.target60Fps",{fps:v})}
153
- </C>
154
- </T>
155
- </T>
156
-
157
-
158
- <T style={r.budgetCard}>
159
- <T style={r.budgetHeader}>
160
- <T style={{flexDirection:"row",alignItems:"center",gap:6}}>
161
- <Te color={e.brandPurple}size={15}/>
162
- <T>
163
- <C style={r.budgetTitle}>Native Hardware & System Health</C>
164
- <C style={r.heroSubTitle}>Live kernel metrics, resident RAM, and thermal state</C>
165
- </T>
166
- </T>
167
- {L&&<T style={{paddingHorizontal:7,paddingVertical:2.5,borderRadius:5,backgroundColor:L.thermalState==="nominal"?`${e.emerald600}18`:L.thermalState==="fair"?`${e.amber800Warm}18`:`${e.errorColor}18`}}>
168
- <C style={{fontFamily:k.interBold,fontSize:9.5,color:L.thermalState==="nominal"?e.emerald600:L.thermalState==="fair"?e.amber800Warm:e.errorColor,textTransform:"uppercase"}}>
169
- {L.thermalState} THERMAL
170
- </C>
171
- </T>}
172
- </T>
173
-
174
- <T style={{flexDirection:"row",flexWrap:"wrap",gap:8,marginTop:10}}>
175
- <T style={{flex:1,minWidth:100,backgroundColor:e.grayBackground,padding:8,borderRadius:8,borderWidth:1,borderColor:e.dividerColor}}>
176
- <C style={{fontFamily:k.interRegular,fontSize:9.5,color:e.grayTextWeak}}>Resident RAM</C>
177
- <C style={{fontFamily:k.interBold,fontSize:13,color:e.brandPurple,marginTop:2}}>
178
- {L?`${L.residentRamMb.toFixed(1)} MB`:"18.4 MB"}
179
- </C>
180
- </T>
181
- <T style={{flex:1,minWidth:100,backgroundColor:e.grayBackground,padding:8,borderRadius:8,borderWidth:1,borderColor:e.dividerColor}}>
182
- <C style={{fontFamily:k.interRegular,fontSize:9.5,color:e.grayTextWeak}}>Total Physical RAM</C>
183
- <C style={{fontFamily:k.interBold,fontSize:13,color:e.primaryBlack,marginTop:2}}>
184
- {L?`${Math.round(L.totalPhysicalRamMb)} MB`:"3840 MB"}
185
- </C>
186
- </T>
187
- <T style={{flex:1,minWidth:100,backgroundColor:e.grayBackground,padding:8,borderRadius:8,borderWidth:1,borderColor:e.dividerColor}}>
188
- <C style={{fontFamily:k.interRegular,fontSize:9.5,color:e.grayTextWeak}}>Active CPU Cores</C>
189
- <C style={{fontFamily:k.interBold,fontSize:13,color:e.skyBlue,marginTop:2}}>
190
- {L?`${L.activeCpuCores} Cores`:"6 Cores"}
191
- </C>
192
- </T>
193
- </T>
194
- </T>
195
-
196
-
197
- <T style={r.budgetCard}>
198
- <T style={r.budgetHeader}>
199
- <T>
200
- <C style={r.budgetTitle}>
201
- {w("performance.frameLatencyDistTitle")}
202
- </C>
203
- <C style={r.heroSubTitle}>
204
- {w("performance.frameLatencyDistSub")}
205
- </C>
206
- </T>
207
- </T>
208
-
209
- <T style={r.histogramContainer}>
210
- {Xe.map(t=><T key={t.key}style={r.histogramRow}>
211
- <T style={r.histogramLabelCol}>
212
- <T style={[r.legendDot,{backgroundColor:t.color}]}/>
213
- <C style={r.histogramLabelText}>{t.label}</C>
214
- </T>
215
-
216
- <T style={r.histogramBarCol}>
217
- <T style={r.histogramTrack}>
218
- <T style={[r.histogramBarFill,{width:`${Math.max(t.percent>0?4:0,t.percent)}%`,backgroundColor:t.color}]}/>
219
- </T>
220
- </T>
221
-
222
- <T style={r.histogramStatsCol}>
223
- <C style={[r.histogramPercentText,{color:t.color}]}>
224
- {t.percent}%
225
- </C>
226
- <C style={r.histogramCountText}>
227
- ({t.count})
228
- </C>
229
- </T>
230
- </T>)}
231
- </T>
232
- </T>
233
-
234
-
235
- <T style={r.budgetCard}>
236
- <T style={r.budgetHeader}>
237
- <C style={r.budgetTitle}>{w("performance.budgetUsage")}</C>
238
- <C style={r.budgetHeadroom}>
239
- {w("performance.budgetHeadroom",{time:A.freeTime,percent:A.headroomPercent})}
240
- </C>
241
- </T>
242
-
243
-
244
- <T style={r.budgetBarContainer}>
245
- <T style={[r.budgetBarSegment,{flex:Math.max(.5,A.jsTime),backgroundColor:e.sky400}]}/>
246
- <T style={[r.budgetBarSegment,{flex:Math.max(.5,A.layoutTime),backgroundColor:e.indigo500}]}/>
247
- <T style={[r.budgetBarSegment,{flex:Math.max(.5,A.renderTime),backgroundColor:e.pink400}]}/>
248
- <T style={[r.budgetBarSegment,{flex:Math.max(.5,A.freeTime),backgroundColor:e.emerald400}]}/>
249
- </T>
250
-
251
- <T style={r.budgetLegendGrid}>
252
- <T style={r.legendItem}>
253
- <T style={[r.legendDot,{backgroundColor:e.sky400}]}/>
254
- <C style={r.legendText}>
255
- {w("performance.jsExec",{time:A.jsTime})}
256
- </C>
257
- </T>
258
- <T style={r.legendItem}>
259
- <T style={[r.legendDot,{backgroundColor:e.indigo500}]}/>
260
- <C style={r.legendText}>
261
- {w("performance.yogaLayoutTime",{time:A.layoutTime})}
262
- </C>
263
- </T>
264
- <T style={r.legendItem}>
265
- <T style={[r.legendDot,{backgroundColor:e.pink400}]}/>
266
- <C style={r.legendText}>
267
- {w("performance.uiRenderTime",{time:A.renderTime})}
268
- </C>
269
- </T>
270
- <T style={r.legendItem}>
271
- <T style={[r.legendDot,{backgroundColor:e.emerald400}]}/>
272
- <C style={[r.legendText,{color:e.emerald600,fontFamily:k.interBold}]}>
273
- {w("performance.freeTime",{time:A.freeTime})}
274
- </C>
275
- </T>
276
- </T>
277
- </T>
278
-
279
-
280
- <T style={r.engineSummaryGrid}>
281
- <T style={r.engineSummaryCard}>
282
- <C style={r.engineSummaryLabel}>{w("performance.jsEngine")}</C>
283
- <C style={r.engineSummaryValue}>{G.jsEngineName}</C>
284
- <C style={r.engineSummarySub}>{G.jsEngineSub}</C>
285
- </T>
286
- <T style={r.engineSummaryCard}>
287
- <C style={r.engineSummaryLabel}>{w("performance.uiRenderThread")}</C>
288
- <C style={r.engineSummaryValue}>{G.uiArchName}</C>
289
- <C style={r.engineSummarySub}>{G.uiArchSub}</C>
290
- </T>
291
- <T style={r.engineSummaryCard}>
292
- <C style={r.engineSummaryLabel}>{w("performance.tabMemory")}</C>
293
- <C style={r.engineSummaryValue}>{G.usedHeapMb} MB</C>
294
- <C style={r.engineSummarySub}>
295
- {w("performance.heapAllocatedSub",{allocated:G.totalAllocMb})}
296
- </C>
297
- </T>
298
- </T>
299
-
300
-
301
- <T style={r.logsHeaderRow}>
302
- <C style={r.logsSectionHeading}>
303
- {w("performance.recordedEvents")} ({_.length})
304
- </C>
305
- {re.length>0&&<K onPress={_e}>
306
- <C style={r.clearLink}>{w("common.clear")}</C>
307
- </K>}
308
- </T>
309
-
310
- {_.length===0?<T style={r.emptyCard}>
311
- <Te color={e.amber500}size={30}/>
312
- <C style={r.emptyTitle}>
313
- {W.trim().length>0?"No Matching Events":w("performance.emptyTitle")}
314
- </C>
315
- <C style={r.emptySub}>
316
- {W.trim().length>0?`No performance events match "${W}"`:w("performance.emptySubtitle")}
317
- </C>
318
- {W.trim().length>0&&<K onPress={()=>te("")}style={{marginTop:10,paddingHorizontal:14,paddingVertical:6,borderRadius:8,backgroundColor:e.grayBackground,borderWidth:1,borderColor:e.grayBorderSecondary}}>
319
- <C style={{color:e.brandPurple,fontSize:12,fontFamily:k.interBold}}>
320
- Clear Search
321
- </C>
322
- </K>}
323
- </T>:_.map(t=>{const S=t.severity==="optimal",B=t.severity==="warning",F=t.severity==="critical",R=!!$e[t.id],z=S?e.greenBg:B?e.amberBg:e.errorCardBg,E=S?e.greenBorder:B?e.lightOrange:e.errorBorder,D=S?e.emerald600:B?e.amber700:e.errorColor;return<K key={t.id}onPress={()=>Oe(t.id)}style={[r.eventCard,F&&{borderColor:e.errorBorder,backgroundColor:e.errorCardBg}]}>
324
- <T style={r.eventTopRow}>
325
- <T style={r.fpsBadgeGroup}>
326
- <T style={[r.fpsBadge,{backgroundColor:z,borderColor:E}]}>
327
- <C style={[r.fpsBadgeText,{color:D}]}>
328
- {t.fps} FPS
329
- </C>
330
- </T>
331
-
332
-
333
- <T style={[r.droppedBadge,(t.droppedFrames??Math.max(0,60-t.fps))>0?r.droppedBadgeWarning:r.droppedBadgeOptimal]}>
334
- <C style={[r.droppedBadgeText,(t.droppedFrames??Math.max(0,60-t.fps))>0?{color:e.red600}:{color:e.emerald600}]}>
335
- {(t.droppedFrames??Math.max(0,60-t.fps))>0?w("performance.droppedFrames",{count:t.droppedFrames??Math.max(0,60-t.fps)}):w("performance.zeroDropped")}
336
- </C>
337
- </T>
338
-
339
-
340
- {t.bottleneckThread&&<T style={[r.bottleneckTag,{flexDirection:"row",alignItems:"center",gap:3}]}>
341
- {t.bottleneckThread==="JS Thread"&&<Te size={10}color={e.warningIconGold}/>}
342
- <C style={r.bottleneckTagText}>
343
- {t.bottleneckThread==="JS Thread"?w("performance.jsBound"):t.bottleneckThread==="UI Thread"?w("performance.uiBound"):w("performance.balanced")}
344
- </C>
345
- </T>}
346
- </T>
347
-
348
- <T style={{flexDirection:"row",alignItems:"center",gap:6}}>
349
- <Vr value={()=>t}label={w("common.copyJson")}/>
350
- <Gr isExpanded={R}size={14}color={e.grayTextWeak}/>
351
- </T>
352
- </T>
353
-
354
-
355
- <T style={{marginTop:4}}>
356
- <Re text={t.label}search={W}style={r.eventLabel}highlightStyle={r.searchHighlight}/>
357
- <T style={r.eventMetaRow}>
358
- <C style={r.eventMeta}>
359
- {w("performance.msTotal",{duration:t.durationMs,time:new Date(t.timestamp).toLocaleTimeString()})}
360
- </C>
361
- <C style={r.eventMetaDot}>•</C>
362
- <C style={[r.frameBudgetHint,t.durationMs>16.67?{color:e.amber800Warm}:{color:e.emerald600}]}>
363
- {w("performance.frameBudgetMs",{time:t.durationMs,budget:Number((t.durationMs/16.67*100).toFixed(0))})}
364
- </C>
365
- </T>
366
- </T>
367
-
368
-
369
- <T style={r.frameBarTrack}>
370
- <T style={[r.frameBarFill,{width:`${Math.min(100,Math.max(10,t.durationMs/33.33*100))}%`,backgroundColor:D}]}/>
371
- </T>
372
-
373
- <Re text={t.detail}search={W}style={r.eventDetail}highlightStyle={r.searchHighlight}/>
374
-
375
-
376
- {R&&<T style={r.expandedDetailBox}>
377
-
378
- {(t.screenName||t.source)&&<T style={r.sourceRow}>
379
- <C style={r.sourceTag}>{w("performance.screenContext")}</C>
380
- <C style={r.sourceText}numberOfLines={1}>
381
- {t.screenName||t.source}
382
- </C>
383
- </T>}
384
-
385
-
386
- <T style={r.fpsMetricsGrid}>
387
- <T style={r.fpsMetricItem}>
388
- <C style={r.fpsMetricLabel}>{w("performance.target60Fps",{fps:t.fps})}</C>
389
- <C style={[r.fpsMetricVal,{color:D}]}>
390
- {t.fps} FPS
391
- </C>
392
- </T>
393
- <T style={r.fpsMetricItem}>
394
- <C style={r.fpsMetricLabel}>{w("performance.frameDuration")}</C>
395
- <C style={r.fpsMetricVal}>
396
- {t.durationMs} ms
397
- </C>
398
- </T>
399
- <T style={r.fpsMetricItem}>
400
- <C style={r.fpsMetricLabel}>{w("performance.jankRate")}</C>
401
- <C style={[r.fpsMetricVal,(t.droppedFrames??0)>0?{color:e.red600}:{color:e.emerald600}]}>
402
- {t.droppedFrames??Math.max(0,60-t.fps)} frames
403
- </C>
404
- </T>
405
- <T style={r.fpsMetricItem}>
406
- <C style={r.fpsMetricLabel}>{w("performance.bottleneck")}</C>
407
- <C style={r.fpsMetricVal}>
408
- {t.bottleneckThread||w("performance.balanced")}
409
- </C>
410
- </T>
411
- </T>
412
-
413
-
414
- {t.breakdown&&<T style={r.breakdownGrid}>
415
- <T style={r.breakdownCol}>
416
- <C style={r.breakdownLabel}>{w("performance.jsThread")}</C>
417
- <C style={r.breakdownVal}>
418
- {t.breakdown.jsTimeMs} ms
419
- </C>
420
- </T>
421
- <T style={r.breakdownCol}>
422
- <C style={r.breakdownLabel}>{w("performance.uiThread")}</C>
423
- <C style={r.breakdownVal}>
424
- {t.breakdown.uiTimeMs} ms
425
- </C>
426
- </T>
427
- {t.breakdown.bridgeLatencyMs!=null&&<T style={r.breakdownCol}>
428
- <C style={r.breakdownLabel}>{w("performance.jsiLatency")}</C>
429
- <C style={r.breakdownVal}>
430
- {t.breakdown.bridgeLatencyMs} ms
431
- </C>
432
- </T>}
433
- {t.heapDeltaKb!=null&&<T style={r.breakdownCol}>
434
- <C style={r.breakdownLabel}>{w("performance.heapImpact")}</C>
435
- <C style={[r.breakdownVal,{color:t.heapDeltaKb>0?e.amber700:e.emerald600}]}>
436
- {t.heapDeltaKb>0?`+${t.heapDeltaKb}`:t.heapDeltaKb} KB
437
- </C>
438
- </T>}
439
- </T>}
440
-
441
-
442
- {t.advice&&<T style={r.adviceCard}>
443
- <T style={{flexDirection:"row",alignItems:"center",gap:5}}>
444
- <Hr color={e.purpleShade700}size={12}/>
445
- <C style={r.adviceHeading}>{w("performance.optimizationTip")}</C>
446
- </T>
447
- <C style={r.adviceBodyText}>{t.advice}</C>
448
- </T>}
449
- </T>}
450
- </K>})}
451
-
452
- <Rr count={_.length}label={w("performance.recordedEvents")}/>
453
- </Se>
454
- </T>}),r=tr.create({container:{flex:1,backgroundColor:e.grayBackground},headerBar:{flexDirection:"row",alignItems:"center",paddingHorizontal:12,paddingVertical:8,backgroundColor:e.white,borderBottomWidth:1,borderBottomColor:e.dividerColor,gap:8},searchBox:{flex:1,flexDirection:"row",alignItems:"center",backgroundColor:e.grayBackground,borderRadius:8,paddingHorizontal:8,height:36,gap:6,borderWidth:1,borderColor:e.dividerColor},searchInput:{flex:1,fontFamily:k.interRegular,fontSize:12,color:e.primaryBlack,paddingVertical:0},recordToggleBtn:{flexDirection:"row",alignItems:"center",gap:5,paddingHorizontal:8,paddingVertical:6,borderRadius:7,borderWidth:1},recordToggleActive:{backgroundColor:`${e.errorColor}14`,borderColor:`${e.errorColor}30`},recordToggleInactive:{backgroundColor:e.graySurface,borderColor:e.dividerColor},recordingDot:{width:6,height:6,borderRadius:3},recordToggleText:{fontFamily:k.interBold,fontSize:11},categoryScrollWrapper:{backgroundColor:e.white,borderBottomWidth:1,borderBottomColor:e.dividerColor,height:42},categoryScrollView:{flexGrow:0,height:42},categoryScroll:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:12,height:42},categoryChip:{flexDirection:"row",alignItems:"center",justifyContent:"center",paddingHorizontal:12,height:28,borderRadius:14,backgroundColor:e.grayBackground,borderWidth:1,borderColor:e.dividerColor},categoryChipActive:{backgroundColor:e.brandPurple,borderColor:e.brandPurple},categoryChipText:{fontFamily:k.interMedium,fontSize:11,color:e.grayTextStrong},categoryChipTextActive:{fontFamily:k.interBold,color:e.white},scrollBody:{flex:1},scrollContent:{padding:12,gap:10},heroCard:{backgroundColor:e.white,borderRadius:12,padding:14,borderWidth:1,borderColor:e.dividerColor,shadowColor:e.black,shadowOffset:{width:0,height:1},shadowOpacity:.05,shadowRadius:3,elevation:1},heroHeaderRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:10},heroTitle:{fontFamily:k.interBold,fontSize:13,color:e.primaryBlack},heroSubTitle:{fontFamily:k.interRegular,fontSize:9.5,color:e.grayTextWeak,marginTop:1},scorePill:{paddingHorizontal:8,paddingVertical:3,borderRadius:6},scorePillText:{fontFamily:k.interBold,fontSize:10.5},primaryFpsRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingVertical:6},fpsBigNumberBox:{flexDirection:"row",alignItems:"baseline",gap:4,minWidth:80},fpsBigNumber:{fontFamily:k.interBold,fontSize:42,lineHeight:48,letterSpacing:-1,minWidth:54},fpsUnit:{fontFamily:k.interBold,fontSize:14,color:e.grayTextWeak},fpsStatsGrid:{flexDirection:"row",alignItems:"center",gap:8},statItem:{alignItems:"center",minWidth:50},statLabel:{fontFamily:k.interRegular,fontSize:10,color:e.grayTextWeak},statValue:{fontFamily:k.interBold,fontSize:13,color:e.primaryBlack,marginTop:2,textAlign:"center"},graphScrubTooltip:{alignSelf:"center",backgroundColor:e.primaryBlack,paddingHorizontal:8,paddingVertical:3,borderRadius:6,marginBottom:4},graphScrubTooltipText:{fontFamily:k.interBold,fontSize:10,color:e.white},svgGraphContainer:{width:"100%",height:64,marginTop:6,position:"relative",overflow:"hidden",borderRadius:8},svgTouchOverlay:{position:"absolute",top:0,left:0,right:0,bottom:0,flexDirection:"row"},svgTouchCol:{flex:1,height:"100%"},histogramContainer:{gap:8,marginTop:4},histogramRow:{flexDirection:"row",alignItems:"center",gap:8},histogramLabelCol:{flexDirection:"row",alignItems:"center",gap:6,width:140},histogramLabelText:{fontFamily:k.interMedium,fontSize:10,color:e.grayTextStrong},histogramBarCol:{flex:1},histogramTrack:{height:8,backgroundColor:e.grayBackground,borderRadius:4,overflow:"hidden"},histogramBarFill:{height:"100%",borderRadius:4},histogramStatsCol:{flexDirection:"row",alignItems:"center",gap:4,minWidth:52,justifyContent:"flex-end"},histogramPercentText:{fontFamily:k.interBold,fontSize:10.5},histogramCountText:{fontFamily:k.interRegular,fontSize:9.5,color:e.grayTextWeak},sparklineFooter:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginTop:6},sparklineFooterText:{fontFamily:k.interRegular,fontSize:10,color:e.grayTextWeak},sparklineFooterTarget:{fontFamily:k.interMedium,fontSize:10,color:e.emerald600},budgetCard:{backgroundColor:e.white,borderRadius:12,padding:12,borderWidth:1,borderColor:e.dividerColor,gap:8},budgetHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},budgetTitle:{fontFamily:k.interBold,fontSize:12.5,color:e.primaryBlack},budgetHeadroom:{fontFamily:k.interBold,fontSize:11,color:e.emerald600},budgetBarContainer:{flexDirection:"row",height:8,borderRadius:4,overflow:"hidden",backgroundColor:e.grayBackground,gap:2},budgetBarSegment:{height:"100%",borderRadius:2},budgetLegendGrid:{flexDirection:"row",flexWrap:"wrap",gap:10,marginTop:2},legendItem:{flexDirection:"row",alignItems:"center",gap:4},legendDot:{width:6,height:6,borderRadius:3},legendText:{fontFamily:k.interRegular,fontSize:10,color:e.grayTextStrong},engineSummaryGrid:{flexDirection:"row",alignItems:"center",gap:8},engineSummaryCard:{flex:1,backgroundColor:e.white,borderRadius:10,padding:10,borderWidth:1,borderColor:e.dividerColor},engineSummaryLabel:{fontFamily:k.interMedium,fontSize:10,color:e.grayTextWeak},engineSummaryValue:{fontFamily:k.interBold,fontSize:11.5,color:e.primaryBlack,marginTop:2},engineSummarySub:{fontFamily:k.interRegular,fontSize:9.5,color:e.grayTextWeak,marginTop:1},logsHeaderRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginTop:4},logsSectionHeading:{fontFamily:k.interBold,fontSize:13,color:e.primaryBlack},clearLink:{fontFamily:k.interBold,fontSize:11.5,color:e.purple},eventCard:{backgroundColor:e.white,borderRadius:10,padding:10,borderWidth:1,borderColor:e.dividerColor,gap:6},eventTopRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},fpsBadgeGroup:{flexDirection:"row",alignItems:"center",gap:6,flexWrap:"wrap"},fpsBadge:{paddingHorizontal:6,paddingVertical:2,borderRadius:5,borderWidth:1},fpsBadgeText:{fontFamily:k.interBold,fontSize:10},droppedBadge:{paddingHorizontal:6,paddingVertical:2,borderRadius:5,borderWidth:1},droppedBadgeWarning:{backgroundColor:e.red100,borderColor:e.errorBorder},droppedBadgeOptimal:{backgroundColor:e.green100,borderColor:e.greenBorder},droppedBadgeText:{fontFamily:k.interBold,fontSize:9.5},bottleneckTag:{backgroundColor:e.purpleShade50,paddingHorizontal:5,paddingVertical:2,borderRadius:4,borderWidth:1,borderColor:e.purpleTint2},bottleneckTagText:{fontFamily:k.interMedium,fontSize:9.5,color:e.purple},eventMetaRow:{flexDirection:"row",alignItems:"center",gap:6,marginTop:2,flexWrap:"wrap"},eventMetaDot:{fontSize:9,color:e.grayTextWeak},frameBudgetHint:{fontFamily:k.interMedium,fontSize:10},frameBarTrack:{height:4,borderRadius:2,backgroundColor:e.graySurface,overflow:"hidden",marginVertical:4},frameBarFill:{height:"100%",borderRadius:2},fpsMetricsGrid:{flexDirection:"row",alignItems:"center",backgroundColor:e.white,borderRadius:6,padding:6,borderWidth:1,borderColor:e.dividerColor,justifyContent:"space-between",gap:4},fpsMetricItem:{alignItems:"center",flex:1},fpsMetricLabel:{fontFamily:k.interRegular,fontSize:8.5,color:e.grayTextWeak,textAlign:"center"},fpsMetricVal:{fontFamily:k.interBold,fontSize:10.5,color:e.primaryBlack,marginTop:1,textAlign:"center"},eventLabel:{fontFamily:k.interBold,fontSize:12,color:e.primaryBlack},eventMeta:{fontFamily:k.interRegular,fontSize:10,color:e.grayTextWeak,marginTop:1},eventDetail:{fontFamily:k.interRegular,fontSize:11,color:e.grayTextStrong,lineHeight:15},expandChevron:{fontSize:10,color:e.grayTextWeak,marginLeft:2},expandedDetailBox:{backgroundColor:e.grayBackground,borderRadius:8,padding:8,marginTop:4,gap:6,borderWidth:1,borderColor:e.dividerColor},sourceRow:{flexDirection:"row",alignItems:"center",gap:6},sourceTag:{fontFamily:k.interBold,fontSize:8.5,color:e.purple,backgroundColor:`${e.purple}14`,paddingHorizontal:4,paddingVertical:1,borderRadius:3},sourceText:{fontFamily:k.interMedium,fontSize:10.5,color:e.grayTextStrong,flex:1},breakdownGrid:{flexDirection:"row",alignItems:"center",backgroundColor:e.white,borderRadius:6,padding:6,borderWidth:1,borderColor:e.dividerColor,justifyContent:"space-between"},breakdownCol:{alignItems:"center",flex:1},breakdownLabel:{fontFamily:k.interRegular,fontSize:9,color:e.grayTextWeak},breakdownVal:{fontFamily:k.interBold,fontSize:11,color:e.primaryBlack,marginTop:1},adviceCard:{backgroundColor:e.purpleTintBg,borderRadius:6,padding:6,borderWidth:1,borderColor:e.purpleBorder},adviceHeading:{fontFamily:k.interBold,fontSize:10,color:e.purpleShade700},adviceBodyText:{fontFamily:k.interRegular,fontSize:10.5,color:e.purple,lineHeight:14,marginTop:1},searchHighlight:{backgroundColor:e.yellowHighlight,color:e.amber800,fontFamily:k.interBold},emptyCard:{backgroundColor:e.white,borderRadius:12,padding:24,alignItems:"center",justifyContent:"center",gap:8,borderWidth:1,borderColor:e.dividerColor},emptyTitle:{fontFamily:k.interBold,fontSize:14,color:e.primaryBlack},emptySub:{fontFamily:k.interRegular,fontSize:11.5,color:e.grayTextWeak,textAlign:"center",lineHeight:16}});export default Qr;
@@ -1,115 +0,0 @@
1
- export type FileTypeCategory = 'image' | 'typescript' | 'javascript' | 'font' | 'json';
2
- export interface HostBundleFileItem {
3
- id: string;
4
- name: string;
5
- path: string;
6
- ext: string;
7
- category: FileTypeCategory;
8
- sizeKb: number;
9
- meta: string;
10
- color: string;
11
- status?: 'optimal' | 'warning' | 'info';
12
- advice?: string;
13
- isConsumed?: boolean;
14
- previewUri?: string;
15
- }
16
- export interface HostBundlePackageItem {
17
- id: string;
18
- name: string;
19
- version: string;
20
- latestVersion?: string;
21
- sizeKb: number;
22
- percentage: number;
23
- type: 'direct' | 'peer' | 'transitive';
24
- isDirectDefined?: boolean;
25
- parentPackageName?: string;
26
- subpackages?: HostBundlePackageItem[];
27
- category: 'core' | 'navigation' | 'network' | 'ui' | 'utils';
28
- color: string;
29
- description: string;
30
- npmUrl?: string;
31
- isDeprecated?: boolean;
32
- deprecationReason?: string;
33
- lastActive?: string;
34
- }
35
- export interface HostBinaryComponentItem {
36
- id: string;
37
- name: string;
38
- category: 'js' | 'native' | 'frameworks' | 'assets' | 'meta';
39
- sizeMb: number;
40
- pct: number;
41
- color: string;
42
- description: string;
43
- advice: string;
44
- }
45
- export interface HostBundleAnalysisResult {
46
- isLive: boolean;
47
- scriptURL: string;
48
- totalDevBytes: number;
49
- totalDevMb: number;
50
- totalDevKb: number;
51
- isHermes: boolean;
52
- moduleCount: number;
53
- packageCount: number;
54
- filesCount: number;
55
- splitUp: {
56
- appSource: {
57
- kb: number;
58
- mb: number;
59
- pct: number;
60
- };
61
- nodeModules: {
62
- kb: number;
63
- mb: number;
64
- pct: number;
65
- };
66
- assetsMedia: {
67
- kb: number;
68
- mb: number;
69
- pct: number;
70
- };
71
- metroDevOverhead: {
72
- kb: number;
73
- mb: number;
74
- pct: number;
75
- };
76
- };
77
- files: HostBundleFileItem[];
78
- packages: HostBundlePackageItem[];
79
- production: {
80
- ios: {
81
- totalInstallMb: number;
82
- totalDownloadMb: number;
83
- compressionRatioPct: number;
84
- components: HostBinaryComponentItem[];
85
- };
86
- androidAab: {
87
- totalInstallMb: number;
88
- totalDownloadMb: number;
89
- compressionRatioPct: number;
90
- components: HostBinaryComponentItem[];
91
- };
92
- androidApk: {
93
- totalInstallMb: number;
94
- totalDownloadMb: number;
95
- compressionRatioPct: number;
96
- components: HostBinaryComponentItem[];
97
- };
98
- android: {
99
- totalInstallMb: number;
100
- totalDownloadMb: number;
101
- compressionRatioPct: number;
102
- components: HostBinaryComponentItem[];
103
- };
104
- };
105
- }
106
- export declare const setBundleModuleEnabled: (enabled: boolean) => void;
107
- export declare const getBundleModuleEnabled: () => boolean;
108
- export declare const getHostScriptURL: () => string;
109
- export declare const trackRuntimeModuleExecution: () => void;
110
- export declare const trackRuntimeDefine: () => void;
111
- export declare const parseBundleSource: (bundleText: string, totalBytes: number, scriptURL: string, isLive?: boolean) => HostBundleAnalysisResult;
112
- export declare const getInitialBundleAnalysis: () => HostBundleAnalysisResult;
113
- export declare const analyzeHostAppBundle: (forceRefresh?: boolean) => Promise<HostBundleAnalysisResult>;
114
- export declare const clearCachedBundleAnalysis: () => void;
115
- export declare const getCachedBundleAnalysis: () => HostBundleAnalysisResult | null;