react-native-inapp-inspector 1.1.33 → 1.1.35

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 (75) hide show
  1. package/dist/commonjs/components/ConsoleLogCard.js +57 -56
  2. package/dist/commonjs/components/CopyButton.js +7 -1
  3. package/dist/commonjs/components/Inspector/BundleTab.js +268 -27
  4. package/dist/commonjs/components/Inspector/CrashDetail.js +16 -12
  5. package/dist/commonjs/components/Inspector/InspectorHeader.js +16 -16
  6. package/dist/commonjs/components/Inspector/MainScreen.js +6 -2
  7. package/dist/commonjs/components/Inspector/NetworkTab.js +97 -1
  8. package/dist/commonjs/components/Inspector/ReduxDetail.js +24 -19
  9. package/dist/commonjs/components/Inspector/ReduxTab.js +12 -8
  10. package/dist/commonjs/components/Inspector/SettingsPanel.js +1243 -673
  11. package/dist/commonjs/components/LogCard.js +27 -9
  12. package/dist/commonjs/components/MetaAccordion.js +42 -0
  13. package/dist/commonjs/components/NetworkIcons.d.ts +9 -0
  14. package/dist/commonjs/components/NetworkIcons.js +48 -1
  15. package/dist/commonjs/components/Toast.js +3 -3
  16. package/dist/commonjs/components/TouchableScale.d.ts +4 -2
  17. package/dist/commonjs/components/TouchableScale.js +4 -4
  18. package/dist/commonjs/constants/version.d.ts +1 -1
  19. package/dist/commonjs/constants/version.js +1 -1
  20. package/dist/commonjs/customHooks/analyticsLogger.d.ts +2 -0
  21. package/dist/commonjs/customHooks/analyticsLogger.js +10 -1
  22. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +2 -0
  23. package/dist/commonjs/customHooks/bundleAnalyzer.js +80 -33
  24. package/dist/commonjs/customHooks/consoleLogger.d.ts +2 -0
  25. package/dist/commonjs/customHooks/consoleLogger.js +10 -1
  26. package/dist/commonjs/customHooks/crashHandler.d.ts +2 -0
  27. package/dist/commonjs/customHooks/crashHandler.js +10 -1
  28. package/dist/commonjs/customHooks/networkLogger.d.ts +2 -0
  29. package/dist/commonjs/customHooks/networkLogger.js +12 -1
  30. package/dist/commonjs/customHooks/performanceTracker.d.ts +3 -1
  31. package/dist/commonjs/customHooks/performanceTracker.js +18 -4
  32. package/dist/commonjs/customHooks/reduxLogger.d.ts +2 -0
  33. package/dist/commonjs/customHooks/reduxLogger.js +10 -1
  34. package/dist/commonjs/i18n/locales/en.json +96 -28
  35. package/dist/commonjs/index.js +78 -34
  36. package/dist/commonjs/styles/AppColors.d.ts +28 -0
  37. package/dist/commonjs/styles/AppColors.js +30 -0
  38. package/dist/esm/components/ConsoleLogCard.js +58 -57
  39. package/dist/esm/components/CopyButton.js +7 -1
  40. package/dist/esm/components/Inspector/BundleTab.js +268 -27
  41. package/dist/esm/components/Inspector/CrashDetail.js +16 -12
  42. package/dist/esm/components/Inspector/InspectorHeader.js +16 -16
  43. package/dist/esm/components/Inspector/MainScreen.js +6 -2
  44. package/dist/esm/components/Inspector/NetworkTab.js +99 -3
  45. package/dist/esm/components/Inspector/ReduxDetail.js +24 -19
  46. package/dist/esm/components/Inspector/ReduxTab.js +12 -8
  47. package/dist/esm/components/Inspector/SettingsPanel.js +1246 -676
  48. package/dist/esm/components/LogCard.js +27 -9
  49. package/dist/esm/components/MetaAccordion.js +42 -0
  50. package/dist/esm/components/NetworkIcons.d.ts +9 -0
  51. package/dist/esm/components/NetworkIcons.js +38 -0
  52. package/dist/esm/components/Toast.js +3 -3
  53. package/dist/esm/components/TouchableScale.d.ts +4 -2
  54. package/dist/esm/components/TouchableScale.js +4 -4
  55. package/dist/esm/constants/version.d.ts +1 -1
  56. package/dist/esm/constants/version.js +1 -1
  57. package/dist/esm/customHooks/analyticsLogger.d.ts +2 -0
  58. package/dist/esm/customHooks/analyticsLogger.js +7 -0
  59. package/dist/esm/customHooks/bundleAnalyzer.d.ts +2 -0
  60. package/dist/esm/customHooks/bundleAnalyzer.js +77 -32
  61. package/dist/esm/customHooks/consoleLogger.d.ts +2 -0
  62. package/dist/esm/customHooks/consoleLogger.js +7 -0
  63. package/dist/esm/customHooks/crashHandler.d.ts +2 -0
  64. package/dist/esm/customHooks/crashHandler.js +7 -0
  65. package/dist/esm/customHooks/networkLogger.d.ts +2 -0
  66. package/dist/esm/customHooks/networkLogger.js +9 -0
  67. package/dist/esm/customHooks/performanceTracker.d.ts +3 -1
  68. package/dist/esm/customHooks/performanceTracker.js +15 -3
  69. package/dist/esm/customHooks/reduxLogger.d.ts +2 -0
  70. package/dist/esm/customHooks/reduxLogger.js +7 -0
  71. package/dist/esm/i18n/locales/en.json +96 -28
  72. package/dist/esm/index.js +64 -20
  73. package/dist/esm/styles/AppColors.d.ts +28 -0
  74. package/dist/esm/styles/AppColors.js +30 -0
  75. package/package.json +3 -2
@@ -419,7 +419,7 @@ const BundleTreeNodeView = ({ node, level, search, totalBundleKb, expandedFolder
419
419
  const indentLeft = level * 16 + 10;
420
420
  if (node.isFolder) {
421
421
  return (<react_native_1.View style={bundleStyles.treeFolderBlock}>
422
- <TouchableScale_1.default onPress={() => toggleFolder(node.fullPath)} style={[
422
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={`Folder ${node.name}, ${node.fileCount} ${node.fileCount === 1 ? 'file' : 'files'}, ${node.sizeKb >= 1024 ? `${(node.sizeKb / 1024).toFixed(2)} MB` : `${node.sizeKb} KB`}`} accessibilityState={{ expanded: isExpanded }} accessibilityHint="Double tap to expand or collapse folder" onPress={() => toggleFolder(node.fullPath)} style={[
423
423
  bundleStyles.treeFolderRow,
424
424
  { paddingLeft: indentLeft },
425
425
  ]}>
@@ -493,7 +493,7 @@ const BundleTreeNodeView = ({ node, level, search, totalBundleKb, expandedFolder
493
493
  </react_native_1.View>
494
494
 
495
495
  <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 5 }}>
496
- {onDownload && (<TouchableScale_1.default onPress={() => onDownload(file)} style={bundleStyles.treeActionBtn} hitSlop={8}>
496
+ {onDownload && (<TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={`Download source code for ${file.name}`} accessibilityHint="Fetches module source code from Metro dev server" onPress={() => onDownload(file)} style={bundleStyles.treeActionBtn} hitSlop={8}>
497
497
  <NetworkIcons_1.DownloadIcon size={13} color={AppColors_1.AppColors.sky500}/>
498
498
  </TouchableScale_1.default>)}
499
499
 
@@ -786,7 +786,7 @@ const BundleTab = react_1.default.memo(() => {
786
786
  <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} style={{ flex: 1 }} contentContainerStyle={bundleStyles.subTabsScroll}>
787
787
  {subTabs.map(tab => {
788
788
  const isActive = activeSubTab === tab.key;
789
- return (<TouchableScale_1.default key={tab.key} onPress={() => setActiveSubTab(tab.key)} style={[
789
+ return (<TouchableScale_1.default key={tab.key} accessible={true} accessibilityRole="tab" accessibilityLabel={`${tab.label} tab`} accessibilityState={{ selected: isActive }} accessibilityHint={`Switches to ${tab.label} tab`} onPress={() => setActiveSubTab(tab.key)} style={[
790
790
  bundleStyles.subTabPill,
791
791
  isActive && bundleStyles.subTabPillActive,
792
792
  ]}>
@@ -800,7 +800,7 @@ const BundleTab = react_1.default.memo(() => {
800
800
  </TouchableScale_1.default>);
801
801
  })}
802
802
  </react_native_1.ScrollView>
803
- <TouchableScale_1.default onPress={refreshAnalysis} style={bundleStyles.reloadButton} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
803
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={isAnalyzing ? "Analyzing Metro bundle" : "Reload bundle analysis"} accessibilityHint="Re-probes Metro dev server and refreshes bundle statistics" onPress={refreshAnalysis} style={bundleStyles.reloadButton} hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}>
804
804
  {isAnalyzing ? (<react_native_1.ActivityIndicator size="small" color={AppColors_1.AppColors.brandPurple}/>) : (<NetworkIcons_1.RefreshCcwIcon color={AppColors_1.AppColors.brandPurple} size={14}/>)}
805
805
  </TouchableScale_1.default>
806
806
  </react_native_1.View>
@@ -822,7 +822,7 @@ const BundleTab = react_1.default.memo(() => {
822
822
  <react_native_1.Text style={bundleStyles.heroSubtitle}>
823
823
  {t('bundle.heroSubtitle')}
824
824
  </react_native_1.Text>
825
- <react_native_1.Pressable style={{
825
+ <react_native_1.Pressable accessible={true} accessibilityRole="link" accessibilityLabel={`Live Metro bundle URL: ${analysis.scriptURL}`} accessibilityHint="Opens Metro bundle script in browser" style={{
826
826
  backgroundColor: `${AppColors_1.AppColors.skyBlue}10`,
827
827
  borderColor: `${AppColors_1.AppColors.skyBlue}30`,
828
828
  borderWidth: 1,
@@ -1032,7 +1032,7 @@ const BundleTab = react_1.default.memo(() => {
1032
1032
  <CopyButton_1.default value={() => summary} label={t('bundle.categoriesJson')}/>
1033
1033
  </react_native_1.View>
1034
1034
 
1035
- {summary.categories.map((cat, cIdx) => (<react_native_1.Pressable key={cIdx} style={({ pressed }) => [
1035
+ {summary.categories.map((cat, cIdx) => (<react_native_1.Pressable key={cIdx} accessible={true} accessibilityRole="button" accessibilityLabel={`${cat.title}, ${cat.sizeKb >= 1024 ? `${cat.sizeMb} MB` : `${cat.sizeKb} KB`}, ${cat.pct}% of bundle`} accessibilityHint={`Double tap to view ${cat.title} details`} style={({ pressed }) => [
1036
1036
  bundleStyles.catRowCard,
1037
1037
  pressed && { opacity: 0.85, transform: [{ scale: 0.99 }] },
1038
1038
  ]} onPress={() => setActiveSubTab(cat.targetTab)}>
@@ -1126,6 +1126,155 @@ const BundleTab = react_1.default.memo(() => {
1126
1126
  </react_native_1.View>
1127
1127
  </react_native_1.View>
1128
1128
  </react_native_1.View>
1129
+
1130
+ {/* Detailed Subsystem Architecture Split-up */}
1131
+ <react_native_1.View style={bundleStyles.sectionCard}>
1132
+ <react_native_1.View style={bundleStyles.sectionHeaderRow}>
1133
+ <react_native_1.View>
1134
+ <react_native_1.Text style={bundleStyles.sectionTitle}>Bundle Subsystem Breakdown</react_native_1.Text>
1135
+ <react_native_1.Text style={bundleStyles.sectionSub}>
1136
+ Granular analysis of packages, application source, engine runtime & assets
1137
+ </react_native_1.Text>
1138
+ </react_native_1.View>
1139
+ <CopyButton_1.default value={() => ({
1140
+ directPackages: bundlePackages.filter(p => p.type === 'direct').length,
1141
+ transitivePackages: bundlePackages.filter(p => p.type !== 'direct').length,
1142
+ hermesEngine: isHermes ? 'Hermes (Bytecode)' : 'JSC (Source)',
1143
+ jsDevKb: summary.totalKb,
1144
+ jsHermesReleaseKb: Math.round(summary.totalKb * 0.38),
1145
+ appSourceFiles: bundleFiles.filter(f => f.category === 'typescript' || f.category === 'javascript').length,
1146
+ mediaAssets: bundleFiles.filter(f => f.category === 'image' || f.category === 'font' || f.category === 'json').length,
1147
+ })} label="Subsystem Split JSON"/>
1148
+ </react_native_1.View>
1149
+
1150
+ {/* 1. NPM Dependencies Layer */}
1151
+ <react_native_1.View style={bundleStyles.subsystemCard}>
1152
+ <react_native_1.View style={bundleStyles.subsystemHeader}>
1153
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
1154
+ <BundleCategoryIcon type="deps" size={16} color={AppColors_1.AppColors.indigo500}/>
1155
+ <react_native_1.Text style={bundleStyles.subsystemTitle}>NPM & Third-Party Dependencies</react_native_1.Text>
1156
+ </react_native_1.View>
1157
+ <react_native_1.View style={[bundleStyles.subsystemBadge, { backgroundColor: `${AppColors_1.AppColors.indigo500}18` }]}>
1158
+ <react_native_1.Text style={[bundleStyles.subsystemBadgeText, { color: AppColors_1.AppColors.indigo500 }]}>
1159
+ {(summary.nodeModulesKb / 1024).toFixed(1)} MB • {summary.nodeModulesPct}%
1160
+ </react_native_1.Text>
1161
+ </react_native_1.View>
1162
+ </react_native_1.View>
1163
+ <react_native_1.View style={bundleStyles.subsystemGrid}>
1164
+ <react_native_1.View style={bundleStyles.subsystemItem}>
1165
+ <react_native_1.Text style={bundleStyles.subsystemItemText}>
1166
+ Direct: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundlePackages.filter(p => p.type === 'direct').length || 12} pkgs</react_native_1.Text>
1167
+ </react_native_1.Text>
1168
+ </react_native_1.View>
1169
+ <react_native_1.View style={bundleStyles.subsystemItem}>
1170
+ <react_native_1.Text style={bundleStyles.subsystemItemText}>
1171
+ Transitive: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundlePackages.filter(p => p.type !== 'direct').length || 41} pkgs</react_native_1.Text>
1172
+ </react_native_1.Text>
1173
+ </react_native_1.View>
1174
+ <react_native_1.View style={bundleStyles.subsystemItem}>
1175
+ <react_native_1.Text style={bundleStyles.subsystemItemText}>
1176
+ Top Package: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundlePackages[0]?.name || 'react-native'} ({bundlePackages[0]?.sizeKb || 1240} KB)</react_native_1.Text>
1177
+ </react_native_1.Text>
1178
+ </react_native_1.View>
1179
+ </react_native_1.View>
1180
+ </react_native_1.View>
1181
+
1182
+ {/* 2. App Source Code Layer */}
1183
+ <react_native_1.View style={bundleStyles.subsystemCard}>
1184
+ <react_native_1.View style={bundleStyles.subsystemHeader}>
1185
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
1186
+ <BundleCategoryIcon type="source" size={16} color={AppColors_1.AppColors.sky500}/>
1187
+ <react_native_1.Text style={bundleStyles.subsystemTitle}>Application Source Code</react_native_1.Text>
1188
+ </react_native_1.View>
1189
+ <react_native_1.View style={[bundleStyles.subsystemBadge, { backgroundColor: `${AppColors_1.AppColors.sky500}18` }]}>
1190
+ <react_native_1.Text style={[bundleStyles.subsystemBadgeText, { color: AppColors_1.AppColors.sky500 }]}>
1191
+ {(summary.appSourceKb / 1024).toFixed(1)} MB • {summary.appSourcePct}%
1192
+ </react_native_1.Text>
1193
+ </react_native_1.View>
1194
+ </react_native_1.View>
1195
+ <react_native_1.View style={bundleStyles.subsystemGrid}>
1196
+ <react_native_1.View style={bundleStyles.subsystemItem}>
1197
+ <react_native_1.Text style={bundleStyles.subsystemItemText}>
1198
+ TypeScript/TSX: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundleFiles.filter(f => f.category === 'typescript').length || 14} files</react_native_1.Text>
1199
+ </react_native_1.Text>
1200
+ </react_native_1.View>
1201
+ <react_native_1.View style={bundleStyles.subsystemItem}>
1202
+ <react_native_1.Text style={bundleStyles.subsystemItemText}>
1203
+ JavaScript/JSX: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundleFiles.filter(f => f.category === 'javascript').length || 3} files</react_native_1.Text>
1204
+ </react_native_1.Text>
1205
+ </react_native_1.View>
1206
+ <react_native_1.View style={bundleStyles.subsystemItem}>
1207
+ <react_native_1.Text style={bundleStyles.subsystemItemText}>
1208
+ Tracked Modules: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundleFiles.length || 18} files</react_native_1.Text>
1209
+ </react_native_1.Text>
1210
+ </react_native_1.View>
1211
+ </react_native_1.View>
1212
+ </react_native_1.View>
1213
+
1214
+ {/* 3. Hermes Optimization & Bytecode Engine */}
1215
+ <react_native_1.View style={bundleStyles.subsystemCard}>
1216
+ <react_native_1.View style={bundleStyles.subsystemHeader}>
1217
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
1218
+ <BundleCategoryIcon type="bolt" size={16} color={AppColors_1.AppColors.emerald600}/>
1219
+ <react_native_1.Text style={bundleStyles.subsystemTitle}>Hermes Bytecode Engine</react_native_1.Text>
1220
+ </react_native_1.View>
1221
+ <react_native_1.View style={[bundleStyles.subsystemBadge, { backgroundColor: `${AppColors_1.AppColors.emerald500}18` }]}>
1222
+ <react_native_1.Text style={[bundleStyles.subsystemBadgeText, { color: AppColors_1.AppColors.emerald700 }]}>
1223
+ ~62% AOT Compression
1224
+ </react_native_1.Text>
1225
+ </react_native_1.View>
1226
+ </react_native_1.View>
1227
+ <react_native_1.View style={bundleStyles.subsystemGrid}>
1228
+ <react_native_1.View style={bundleStyles.subsystemItem}>
1229
+ <react_native_1.Text style={bundleStyles.subsystemItemText}>
1230
+ Dev JS Size: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{summary.totalMb} MB</react_native_1.Text>
1231
+ </react_native_1.Text>
1232
+ </react_native_1.View>
1233
+ <react_native_1.View style={bundleStyles.subsystemItem}>
1234
+ <react_native_1.Text style={bundleStyles.subsystemItemText}>
1235
+ Hermes Bytecode: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{((summary.totalKb * 0.38) / 1024).toFixed(2)} MB</react_native_1.Text>
1236
+ </react_native_1.Text>
1237
+ </react_native_1.View>
1238
+ <react_native_1.View style={bundleStyles.subsystemItem}>
1239
+ <react_native_1.Text style={bundleStyles.subsystemItemText}>
1240
+ Execution: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{isHermes ? 'Hermes JSI Direct' : 'JSC Standard'}</react_native_1.Text>
1241
+ </react_native_1.Text>
1242
+ </react_native_1.View>
1243
+ </react_native_1.View>
1244
+ </react_native_1.View>
1245
+
1246
+ {/* 4. Assets & Media Layer */}
1247
+ <react_native_1.View style={bundleStyles.subsystemCard}>
1248
+ <react_native_1.View style={bundleStyles.subsystemHeader}>
1249
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
1250
+ <BundleCategoryIcon type="media" size={16} color={AppColors_1.AppColors.pink500}/>
1251
+ <react_native_1.Text style={bundleStyles.subsystemTitle}>Images, Fonts & Static Assets</react_native_1.Text>
1252
+ </react_native_1.View>
1253
+ <react_native_1.View style={[bundleStyles.subsystemBadge, { backgroundColor: `${AppColors_1.AppColors.pink500}18` }]}>
1254
+ <react_native_1.Text style={[bundleStyles.subsystemBadgeText, { color: AppColors_1.AppColors.pink500 }]}>
1255
+ {summary.assetsMediaKb} KB • {summary.assetsMediaPct}%
1256
+ </react_native_1.Text>
1257
+ </react_native_1.View>
1258
+ </react_native_1.View>
1259
+ <react_native_1.View style={bundleStyles.subsystemGrid}>
1260
+ <react_native_1.View style={bundleStyles.subsystemItem}>
1261
+ <react_native_1.Text style={bundleStyles.subsystemItemText}>
1262
+ Images & Icons: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundleFiles.filter(f => f.category === 'image').length || 2} assets</react_native_1.Text>
1263
+ </react_native_1.Text>
1264
+ </react_native_1.View>
1265
+ <react_native_1.View style={bundleStyles.subsystemItem}>
1266
+ <react_native_1.Text style={bundleStyles.subsystemItemText}>
1267
+ JSON Data: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundleFiles.filter(f => f.category === 'json').length || 1} files</react_native_1.Text>
1268
+ </react_native_1.Text>
1269
+ </react_native_1.View>
1270
+ <react_native_1.View style={bundleStyles.subsystemItem}>
1271
+ <react_native_1.Text style={bundleStyles.subsystemItemText}>
1272
+ Custom Fonts: <react_native_1.Text style={bundleStyles.subsystemItemVal}>{bundleFiles.filter(f => f.category === 'font').length || 0} fonts</react_native_1.Text>
1273
+ </react_native_1.Text>
1274
+ </react_native_1.View>
1275
+ </react_native_1.View>
1276
+ </react_native_1.View>
1277
+ </react_native_1.View>
1129
1278
  </react_native_1.ScrollView>)}
1130
1279
 
1131
1280
  {/* ══════════════════════════════════════════════════════════════════════ */}
@@ -1136,12 +1285,12 @@ const BundleTab = react_1.default.memo(() => {
1136
1285
  {/* Platform Segmented Switcher (Horizontally Scrollable) */}
1137
1286
  <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={bundleStyles.prodPlatformScroll}>
1138
1287
  {[
1139
- { key: 'ios', label: 'iOS App (.ipa)', badge: `${analysis?.production.ios.totalInstallMb || 59.2} MB` },
1140
- { key: 'androidAab', label: 'Android AAB (.aab)', badge: `${analysis?.production.androidAab.totalInstallMb || 24.3} MB` },
1141
- { key: 'androidApk', label: 'Universal APK (.apk)', badge: `${analysis?.production.androidApk.totalInstallMb || 64.0} MB` },
1288
+ { key: 'ios', label: 'iOS App (.ipa)', badge: `${analysis?.production.ios.totalDownloadMb || 111.9} MB` },
1289
+ { key: 'androidAab', label: 'Android AAB (.aab)', badge: `${analysis?.production.androidAab.totalDownloadMb || 38.5} MB` },
1290
+ { key: 'androidApk', label: 'Universal APK (.apk)', badge: `${analysis?.production.androidApk.totalInstallMb || 364.0} MB` },
1142
1291
  ].map(tab => {
1143
1292
  const isSelected = prodPlatform === tab.key;
1144
- return (<TouchableScale_1.default key={tab.key} onPress={() => setProdPlatform(tab.key)} style={[
1293
+ return (<TouchableScale_1.default key={tab.key} accessible={true} accessibilityRole="tab" accessibilityLabel={`${tab.label}, ${tab.badge}`} accessibilityState={{ selected: isSelected }} accessibilityHint={`Switches production estimate to ${tab.label}`} onPress={() => setProdPlatform(tab.key)} style={[
1145
1294
  bundleStyles.prodPlatformBtn,
1146
1295
  isSelected && bundleStyles.prodPlatformBtnActive,
1147
1296
  ]}>
@@ -1249,6 +1398,33 @@ const BundleTab = react_1.default.memo(() => {
1249
1398
  <CopyButton_1.default value={() => analysis.production[prodPlatform].components} label="Components JSON"/>
1250
1399
  </react_native_1.View>
1251
1400
 
1401
+ {/* Visual Binary Component Ratio Bar */}
1402
+ <react_native_1.View style={bundleStyles.prodTreemapBar}>
1403
+ {analysis.production[prodPlatform].components.map((comp, cIdx) => (<react_native_1.View key={cIdx} style={{
1404
+ flex: Math.max(comp.pct, 2),
1405
+ backgroundColor: comp.color,
1406
+ height: 16,
1407
+ }}/>))}
1408
+ </react_native_1.View>
1409
+
1410
+ {/* Production Binary Legend */}
1411
+ <react_native_1.View style={[bundleStyles.legendGrid, { marginBottom: 12 }]}>
1412
+ {analysis.production[prodPlatform].components.map((comp, cIdx) => (<react_native_1.View key={cIdx} style={bundleStyles.legendItem}>
1413
+ <react_native_1.View style={{
1414
+ width: 8,
1415
+ height: 8,
1416
+ borderRadius: 4,
1417
+ backgroundColor: comp.color,
1418
+ }}/>
1419
+ <react_native_1.Text style={bundleStyles.legendText} numberOfLines={1}>
1420
+ {comp.name}{' '}
1421
+ <react_native_1.Text style={bundleStyles.legendVal}>
1422
+ {comp.sizeMb} MB ({comp.pct}%)
1423
+ </react_native_1.Text>
1424
+ </react_native_1.Text>
1425
+ </react_native_1.View>))}
1426
+ </react_native_1.View>
1427
+
1252
1428
  {analysis.production[prodPlatform].components.map((comp, idx) => (<react_native_1.View key={idx} style={bundleStyles.catRowCard}>
1253
1429
  <react_native_1.View style={bundleStyles.catRowTop}>
1254
1430
  <react_native_1.View style={[
@@ -1364,8 +1540,8 @@ const BundleTab = react_1.default.memo(() => {
1364
1540
  <react_native_1.View style={bundleStyles.filterContainer}>
1365
1541
  <react_native_1.View style={bundleStyles.searchRow}>
1366
1542
  <NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={15}/>
1367
- <react_native_1.TextInput placeholder={t('bundle.searchFilesPlaceholder')} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} value={search} onChangeText={setSearch} style={bundleStyles.searchInput} autoCorrect={false} autoCapitalize="none"/>
1368
- {search.length > 0 && (<react_native_1.Pressable onPress={() => setSearch('')} hitSlop={10}>
1543
+ <react_native_1.TextInput accessible={true} accessibilityRole="search" accessibilityLabel="Search files" accessibilityHint="Type a filename, path, or extension to filter" placeholder={t('bundle.searchFilesPlaceholder')} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} value={search} onChangeText={setSearch} style={bundleStyles.searchInput} autoCorrect={false} autoCapitalize="none"/>
1544
+ {search.length > 0 && (<react_native_1.Pressable accessible={true} accessibilityRole="button" accessibilityLabel="Clear search input" onPress={() => setSearch('')} hitSlop={10}>
1369
1545
  <NetworkIcons_1.ClearIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
1370
1546
  </react_native_1.Pressable>)}
1371
1547
  <CopyButton_1.default value={() => filteredFiles} label={t('bundle.filteredFilesJson')}/>
@@ -1382,7 +1558,7 @@ const BundleTab = react_1.default.memo(() => {
1382
1558
  : tab.key === 'CONSUMED'
1383
1559
  ? bundleFiles.filter(f => f.isConsumed !== false).length
1384
1560
  : bundleFiles.filter(f => f.category === tab.key).length;
1385
- return (<TouchableScale_1.default key={tab.key} onPress={() => setActiveCategory(tab.key)} style={[
1561
+ return (<TouchableScale_1.default key={tab.key} accessible={true} accessibilityRole="button" accessibilityLabel={`Filter by ${t(tab.labelKey)}, ${count} items`} accessibilityState={{ selected: isActive }} accessibilityHint={`Filters files list to ${t(tab.labelKey)}`} onPress={() => setActiveCategory(tab.key)} style={[
1386
1562
  bundleStyles.catPill,
1387
1563
  isActive && bundleStyles.catPillActive,
1388
1564
  tab.key === 'UNUSED' && isActive && { backgroundColor: AppColors_1.AppColors.red500, borderColor: AppColors_1.AppColors.red600 },
@@ -1406,7 +1582,7 @@ const BundleTab = react_1.default.memo(() => {
1406
1582
  {/* View Mode Toggle Header Bar */}
1407
1583
  <react_native_1.View style={bundleStyles.treeHeaderRow}>
1408
1584
  <react_native_1.View style={bundleStyles.viewModeToggleGroup}>
1409
- <TouchableScale_1.default onPress={() => setFilesViewMode('tree')} style={[
1585
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel="Tree folder view" accessibilityState={{ selected: filesViewMode === 'tree' }} onPress={() => setFilesViewMode('tree')} style={[
1410
1586
  bundleStyles.viewModeBtn,
1411
1587
  filesViewMode === 'tree' && bundleStyles.viewModeBtnActive,
1412
1588
  ]}>
@@ -1417,7 +1593,7 @@ const BundleTab = react_1.default.memo(() => {
1417
1593
  {t('bundle.treeView')}
1418
1594
  </react_native_1.Text>
1419
1595
  </TouchableScale_1.default>
1420
- <TouchableScale_1.default onPress={() => setFilesViewMode('list')} style={[
1596
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel="Flat list view" accessibilityState={{ selected: filesViewMode === 'list' }} onPress={() => setFilesViewMode('list')} style={[
1421
1597
  bundleStyles.viewModeBtn,
1422
1598
  filesViewMode === 'list' && bundleStyles.viewModeBtnActive,
1423
1599
  ]}>
@@ -1431,11 +1607,11 @@ const BundleTab = react_1.default.memo(() => {
1431
1607
  </react_native_1.View>
1432
1608
 
1433
1609
  {filesViewMode === 'tree' ? (<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
1434
- <TouchableScale_1.default onPress={expandAllFolders}>
1610
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel="Expand all folders" onPress={expandAllFolders}>
1435
1611
  <react_native_1.Text style={bundleStyles.treeActionLink}>{t('bundle.expand')}</react_native_1.Text>
1436
1612
  </TouchableScale_1.default>
1437
1613
  <react_native_1.Text style={{ color: AppColors_1.AppColors.grayTextWeak, fontSize: 11 }}>•</react_native_1.Text>
1438
- <TouchableScale_1.default onPress={collapseAllFolders}>
1614
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel="Collapse all folders" onPress={collapseAllFolders}>
1439
1615
  <react_native_1.Text style={bundleStyles.treeActionLink}>{t('bundle.collapse')}</react_native_1.Text>
1440
1616
  </TouchableScale_1.default>
1441
1617
  </react_native_1.View>) : (<react_native_1.Text style={bundleStyles.listHeaderCount}>
@@ -1559,8 +1735,8 @@ const BundleTab = react_1.default.memo(() => {
1559
1735
  <react_native_1.View style={bundleStyles.filterContainer}>
1560
1736
  <react_native_1.View style={bundleStyles.searchRow}>
1561
1737
  <NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={15}/>
1562
- <react_native_1.TextInput placeholder={t('bundle.searchPackagesPlaceholder')} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} value={search} onChangeText={setSearch} style={bundleStyles.searchInput} autoCorrect={false} autoCapitalize="none"/>
1563
- {search.length > 0 && (<react_native_1.Pressable onPress={() => setSearch('')} hitSlop={10}>
1738
+ <react_native_1.TextInput accessible={true} accessibilityRole="search" accessibilityLabel="Search packages" accessibilityHint="Type a package name or description to filter" placeholder={t('bundle.searchPackagesPlaceholder')} placeholderTextColor={AppColors_1.AppColors.grayTextWeak} value={search} onChangeText={setSearch} style={bundleStyles.searchInput} autoCorrect={false} autoCapitalize="none"/>
1739
+ {search.length > 0 && (<react_native_1.Pressable accessible={true} accessibilityRole="button" accessibilityLabel="Clear search input" onPress={() => setSearch('')} hitSlop={10}>
1564
1740
  <NetworkIcons_1.ClearIcon color={AppColors_1.AppColors.grayTextWeak} size={14}/>
1565
1741
  </react_native_1.Pressable>)}
1566
1742
  <CopyButton_1.default value={() => filteredPackages} label={t('bundle.dependenciesJson')}/>
@@ -1575,7 +1751,7 @@ const BundleTab = react_1.default.memo(() => {
1575
1751
  const cleanInstalledVersion = pkg.version ? pkg.version.replace(/^\^/, '') : '';
1576
1752
  const hasUpdate = !!pkg.latestVersion && !!cleanInstalledVersion &&
1577
1753
  pkg.latestVersion !== cleanInstalledVersion;
1578
- return (<react_native_1.View key={pkg.id} style={[bundleStyles.fileCard, pkg.isDeprecated && { borderColor: AppColors_1.AppColors.errorBorder, backgroundColor: '#FFFDFD' }]}>
1754
+ return (<react_native_1.View key={pkg.id} style={[bundleStyles.fileCard, pkg.isDeprecated && { borderColor: AppColors_1.AppColors.errorBorder, backgroundColor: AppColors_1.AppColors.errorCardBg }]}>
1579
1755
  {/* Header Row: #s.no + Logo + Package Name + Version Pill + Update/Deprecated Badges + Size & Copy */}
1580
1756
  <react_native_1.View style={bundleStyles.fileCardTop}>
1581
1757
  <react_native_1.View style={bundleStyles.sNoBadge}>
@@ -1675,7 +1851,7 @@ const BundleTab = react_1.default.memo(() => {
1675
1851
  <react_native_1.Text style={bundleStyles.fileMetaText}>
1676
1852
  {t('bundle.minified', { size: pkg.sizeKb })}
1677
1853
  </react_native_1.Text>
1678
- <TouchableScale_1.default onPress={() => {
1854
+ <TouchableScale_1.default accessible={true} accessibilityRole="link" accessibilityLabel={`Open ${pkg.name} on NPM`} accessibilityHint="Opens NPM package page in browser" onPress={() => {
1679
1855
  const url = pkg.npmUrl || `https://www.npmjs.com/package/${pkg.name}`;
1680
1856
  react_native_1.Linking.openURL(url).catch(() => { });
1681
1857
  }} style={bundleStyles.npmLinkBtn}>
@@ -1754,7 +1930,7 @@ const BundleTab = react_1.default.memo(() => {
1754
1930
  {t('bundle.fileSizeKb', { size: file.sizeKb })}
1755
1931
  </react_native_1.Text>
1756
1932
  </react_native_1.View>
1757
- <TouchableScale_1.default onPress={() => (0, exports.downloadBundleFile)(file, analysis?.scriptURL)} style={bundleStyles.downloadFileBtn} hitSlop={8}>
1933
+ <TouchableScale_1.default accessible={true} accessibilityRole="button" accessibilityLabel={`Download ${file.name}`} accessibilityHint="Downloads media asset file" onPress={() => (0, exports.downloadBundleFile)(file, analysis?.scriptURL)} style={bundleStyles.downloadFileBtn} hitSlop={8}>
1758
1934
  <NetworkIcons_1.DownloadIcon size={14} color={AppColors_1.AppColors.sky500}/>
1759
1935
  </TouchableScale_1.default>
1760
1936
  <CopyButton_1.default value={() => file} label={t('bundle.mediaItemJson')}/>
@@ -2124,29 +2300,94 @@ const bundleStyles = react_native_1.StyleSheet.create({
2124
2300
  marginBottom: 12,
2125
2301
  backgroundColor: AppColors_1.AppColors.slate200,
2126
2302
  },
2303
+ prodTreemapBar: {
2304
+ flexDirection: 'row',
2305
+ borderRadius: 6,
2306
+ overflow: 'hidden',
2307
+ height: 16,
2308
+ marginBottom: 12,
2309
+ backgroundColor: AppColors_1.AppColors.slate200,
2310
+ },
2127
2311
  legendGrid: {
2128
2312
  flexDirection: 'row',
2129
2313
  flexWrap: 'wrap',
2130
- justifyContent: 'space-between',
2131
- rowGap: 8,
2132
- columnGap: 10,
2314
+ gap: 8,
2133
2315
  },
2134
2316
  legendItem: {
2135
2317
  flexDirection: 'row',
2136
2318
  alignItems: 'center',
2137
2319
  gap: 6,
2138
- width: '48%',
2320
+ paddingHorizontal: 8,
2321
+ paddingVertical: 5,
2322
+ borderRadius: 8,
2323
+ backgroundColor: `${AppColors_1.AppColors.slate200}40`,
2324
+ borderWidth: 1,
2325
+ borderColor: `${AppColors_1.AppColors.dividerColor}`,
2326
+ flexShrink: 0,
2139
2327
  },
2140
2328
  legendText: {
2141
2329
  fontFamily: AppFonts_1.AppFonts.interMedium,
2142
2330
  fontSize: 11,
2143
2331
  color: AppColors_1.AppColors.grayTextStrong,
2144
- flex: 1,
2145
2332
  },
2146
2333
  legendVal: {
2147
2334
  fontFamily: AppFonts_1.AppFonts.interBold,
2148
2335
  color: AppColors_1.AppColors.primaryBlack,
2149
2336
  },
2337
+ subsystemCard: {
2338
+ backgroundColor: AppColors_1.AppColors.white,
2339
+ borderRadius: 12,
2340
+ padding: 12,
2341
+ marginBottom: 8,
2342
+ borderWidth: 1,
2343
+ borderColor: AppColors_1.AppColors.dividerColor,
2344
+ gap: 8,
2345
+ },
2346
+ subsystemHeader: {
2347
+ flexDirection: 'row',
2348
+ alignItems: 'center',
2349
+ justifyContent: 'space-between',
2350
+ gap: 8,
2351
+ },
2352
+ subsystemTitle: {
2353
+ fontFamily: AppFonts_1.AppFonts.interBold,
2354
+ fontSize: 12.5,
2355
+ color: AppColors_1.AppColors.primaryBlack,
2356
+ },
2357
+ subsystemBadge: {
2358
+ paddingHorizontal: 6,
2359
+ paddingVertical: 2,
2360
+ borderRadius: 6,
2361
+ },
2362
+ subsystemBadgeText: {
2363
+ fontFamily: AppFonts_1.AppFonts.interBold,
2364
+ fontSize: 10,
2365
+ },
2366
+ subsystemGrid: {
2367
+ flexDirection: 'row',
2368
+ flexWrap: 'wrap',
2369
+ gap: 6,
2370
+ },
2371
+ subsystemItem: {
2372
+ flexDirection: 'row',
2373
+ alignItems: 'center',
2374
+ gap: 5,
2375
+ paddingHorizontal: 8,
2376
+ paddingVertical: 4,
2377
+ borderRadius: 6,
2378
+ backgroundColor: AppColors_1.AppColors.grayBackground,
2379
+ borderWidth: 1,
2380
+ borderColor: AppColors_1.AppColors.dividerColor,
2381
+ },
2382
+ subsystemItemText: {
2383
+ fontFamily: AppFonts_1.AppFonts.interMedium,
2384
+ fontSize: 10.5,
2385
+ color: AppColors_1.AppColors.grayTextStrong,
2386
+ },
2387
+ subsystemItemVal: {
2388
+ fontFamily: AppFonts_1.AppFonts.interBold,
2389
+ color: AppColors_1.AppColors.primaryBlack,
2390
+ },
2150
2391
  catRowCard: {
2151
2392
  backgroundColor: AppColors_1.AppColors.grayBackground,
2152
2393
  borderRadius: 12,
@@ -135,23 +135,27 @@ const CrashDetail = react_1.default.memo(() => {
135
135
  localStyles.pillBadge,
136
136
  {
137
137
  backgroundColor: selectedCrash.isFatal
138
- ? '#FEE2E2'
139
- : '#FEF3C7',
140
- borderColor: selectedCrash.isFatal ? '#FCA5A5' : '#FCD34D',
138
+ ? AppColors_1.AppColors.errorCardBg
139
+ : AppColors_1.AppColors.amberBg,
140
+ borderColor: selectedCrash.isFatal
141
+ ? AppColors_1.AppColors.errorBorder
142
+ : AppColors_1.AppColors.amberWarmBorder,
141
143
  },
142
144
  ]}>
143
145
  <react_native_1.View style={[
144
146
  localStyles.statusDot,
145
147
  {
146
148
  backgroundColor: selectedCrash.isFatal
147
- ? '#DC2626'
148
- : '#D97706',
149
+ ? AppColors_1.AppColors.red600
150
+ : AppColors_1.AppColors.amber600,
149
151
  },
150
152
  ]}/>
151
153
  <react_native_1.Text style={[
152
154
  localStyles.pillBadgeText,
153
155
  {
154
- color: selectedCrash.isFatal ? '#991B1B' : '#92400E',
156
+ color: selectedCrash.isFatal
157
+ ? AppColors_1.AppColors.redErrorText
158
+ : AppColors_1.AppColors.amberWarmText,
155
159
  },
156
160
  ]}>
157
161
  {selectedCrash.isFatal ? t('crash.fatalCrash') : t('crash.handledException')}
@@ -162,11 +166,11 @@ const CrashDetail = react_1.default.memo(() => {
162
166
  <react_native_1.View style={[
163
167
  localStyles.pillBadge,
164
168
  {
165
- backgroundColor: '#EDE9FE',
166
- borderColor: '#C4B5FD',
169
+ backgroundColor: AppColors_1.AppColors.violetSoftBg,
170
+ borderColor: AppColors_1.AppColors.violetSoftBorder,
167
171
  },
168
172
  ]}>
169
- <react_native_1.Text style={[localStyles.pillBadgeText, { color: '#6D28D9' }]}>
173
+ <react_native_1.Text style={[localStyles.pillBadgeText, { color: AppColors_1.AppColors.purple700 }]}>
170
174
  {selectedCrash.type.toUpperCase()}
171
175
  </react_native_1.Text>
172
176
  </react_native_1.View>
@@ -176,12 +180,12 @@ const CrashDetail = react_1.default.memo(() => {
176
180
  {/* Copy Report Action */}
177
181
  <TouchableScale_1.default onPress={handleCopyReport} hitSlop={10} style={[
178
182
  localStyles.actionButton,
179
- copiedSuccess && { backgroundColor: '#ECFDF5', borderColor: '#6EE7B7' },
183
+ copiedSuccess && { backgroundColor: AppColors_1.AppColors.mintGreenBg, borderColor: AppColors_1.AppColors.mintGreenBorder },
180
184
  ]}>
181
- {copiedSuccess ? (<NetworkIcons_1.CircleCheckIcon color="#059669" size={12}/>) : (<NetworkIcons_1.CopyIcon color={AppColors_1.AppColors.purple} size={12}/>)}
185
+ {copiedSuccess ? (<NetworkIcons_1.CircleCheckIcon color={AppColors_1.AppColors.mintGreenText} size={12}/>) : (<NetworkIcons_1.CopyIcon color={AppColors_1.AppColors.purple} size={12}/>)}
182
186
  <react_native_1.Text style={[
183
187
  localStyles.actionButtonText,
184
- copiedSuccess && { color: '#059669' },
188
+ copiedSuccess && { color: AppColors_1.AppColors.mintGreenText },
185
189
  ]}>
186
190
  {copiedSuccess ? t('crash.copied') : t('crash.copyReport')}
187
191
  </react_native_1.Text>
@@ -57,33 +57,33 @@ const InspectorHeader = react_1.default.memo(() => {
57
57
  if (clean === 'DEV' || clean.includes('DEV') || clean === 'LOCAL') {
58
58
  return {
59
59
  label: rawEnv,
60
- bg: 'rgba(16, 185, 129, 0.25)', // emerald
61
- border: 'rgba(110, 231, 183, 0.55)',
62
- text: '#A7F3D0',
60
+ bg: `${AppColors_1.AppColors.emerald500}40`, // emerald
61
+ border: `${AppColors_1.AppColors.emerald400}8C`,
62
+ text: AppColors_1.AppColors.mintGreenBorder,
63
63
  };
64
64
  }
65
65
  if (clean === 'UAT' || clean === 'QA' || clean === 'TEST') {
66
66
  return {
67
67
  label: rawEnv,
68
- bg: 'rgba(245, 158, 11, 0.28)', // amber
69
- border: 'rgba(252, 211, 77, 0.6)',
70
- text: '#FDE68A',
68
+ bg: `${AppColors_1.AppColors.amber500}47`, // amber
69
+ border: `${AppColors_1.AppColors.amber400}99`,
70
+ text: AppColors_1.AppColors.amberWarmBorder,
71
71
  };
72
72
  }
73
73
  if (clean === 'PREPROD' || clean === 'STAGE' || clean === 'STAGING') {
74
74
  return {
75
75
  label: rawEnv,
76
- bg: 'rgba(139, 92, 246, 0.28)', // purple
77
- border: 'rgba(196, 181, 253, 0.6)',
78
- text: '#DDD6FE',
76
+ bg: `${AppColors_1.AppColors.purple500}47`, // purple
77
+ border: `${AppColors_1.AppColors.purple400}99`,
78
+ text: AppColors_1.AppColors.violetSoftBorder,
79
79
  };
80
80
  }
81
81
  // PROD / Live
82
82
  return {
83
83
  label: rawEnv,
84
- bg: 'rgba(244, 63, 94, 0.25)', // rose
85
- border: 'rgba(253, 164, 175, 0.55)',
86
- text: '#FECDD3',
84
+ bg: `${AppColors_1.AppColors.rose500}40`, // rose
85
+ border: `${AppColors_1.AppColors.roseBorder}8C`,
86
+ text: AppColors_1.AppColors.errorBorder,
87
87
  };
88
88
  }, [environment]);
89
89
  const isDetailView = (activeTab === 'apis' && selected != null) ||
@@ -484,8 +484,8 @@ const InspectorHeader = react_1.default.memo(() => {
484
484
  styles_1.default.headerMethodBadge,
485
485
  {
486
486
  backgroundColor: selectedCrash.isFatal
487
- ? '#DC2626'
488
- : '#D97706',
487
+ ? AppColors_1.AppColors.red600
488
+ : AppColors_1.AppColors.amber600,
489
489
  },
490
490
  ]}>
491
491
  <react_native_1.Text style={styles_1.default.headerMethodText}>
@@ -501,8 +501,8 @@ const InspectorHeader = react_1.default.memo(() => {
501
501
  styles_1.default.headerStatusDot,
502
502
  {
503
503
  backgroundColor: selectedCrash.isFatal
504
- ? '#DC2626'
505
- : '#F59E0B',
504
+ ? AppColors_1.AppColors.red600
505
+ : AppColors_1.AppColors.amber500,
506
506
  },
507
507
  ]}/>
508
508
  <react_native_1.Text style={styles_1.default.headerSubTitle}>
@@ -80,13 +80,17 @@ const MainScreen = () => {
80
80
  (activeTab === 'crash' && selectedCrash != null);
81
81
  return (<>
82
82
  {(react_native_1.Platform.OS === 'ios' || react_native_1.Platform.OS === 'android') && isEnabled && <FabLauncher_1.default />}
83
- <react_native_1.Modal visible={visible} animationType={modalAnimationType} transparent>
83
+ <react_native_1.Modal visible={visible} animationType={modalAnimationType} transparent statusBarTranslucent={true}>
84
84
  {visible && (<ErrorBoundary_1.default onClose={closeModal}>
85
85
  <react_native_1.View style={styles_1.default.modalBackdrop}>
86
86
  <react_native_1.Pressable style={styles_1.default.modalBackdropPressable} onPress={closeModal}/>
87
87
  <react_native_1.View style={[
88
88
  styles_1.default.modalContentCard,
89
- { height: `${modalHeightPercent}%` },
89
+ {
90
+ height: `${modalHeightPercent}%`,
91
+ borderTopLeftRadius: modalHeightPercent >= 100 ? 0 : 20,
92
+ borderTopRightRadius: modalHeightPercent >= 100 ? 0 : 20,
93
+ },
90
94
  ]}>
91
95
  <react_native_1.StatusBar translucent backgroundColor="transparent" barStyle="light-content"/>
92
96