react-native-inapp-inspector 1.1.22 → 1.1.24

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 (31) hide show
  1. package/dist/commonjs/components/AnalyticsEventCard.js +5 -2
  2. package/dist/commonjs/components/ErrorBoundary.js +17 -8
  3. package/dist/commonjs/components/Inspector/BundleTab.d.ts +1 -0
  4. package/dist/commonjs/components/Inspector/BundleTab.js +172 -48
  5. package/dist/commonjs/components/Inspector/LogDetail.js +12 -6
  6. package/dist/commonjs/components/Inspector/PerformanceTab.js +12 -12
  7. package/dist/commonjs/components/Inspector/ReduxTab.js +6 -3
  8. package/dist/commonjs/components/NetworkIcons.d.ts +12 -0
  9. package/dist/commonjs/components/NetworkIcons.js +92 -1
  10. package/dist/commonjs/components/TreeNode.js +1 -1
  11. package/dist/commonjs/constants/version.d.ts +1 -1
  12. package/dist/commonjs/constants/version.js +1 -1
  13. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +1 -1
  14. package/dist/commonjs/customHooks/bundleAnalyzer.js +95 -28
  15. package/dist/commonjs/i18n/locales/en.json +24 -22
  16. package/dist/esm/components/AnalyticsEventCard.js +5 -2
  17. package/dist/esm/components/ErrorBoundary.js +17 -8
  18. package/dist/esm/components/Inspector/BundleTab.d.ts +1 -0
  19. package/dist/esm/components/Inspector/BundleTab.js +174 -50
  20. package/dist/esm/components/Inspector/LogDetail.js +13 -7
  21. package/dist/esm/components/Inspector/PerformanceTab.js +13 -13
  22. package/dist/esm/components/Inspector/ReduxTab.js +7 -4
  23. package/dist/esm/components/NetworkIcons.d.ts +12 -0
  24. package/dist/esm/components/NetworkIcons.js +79 -0
  25. package/dist/esm/components/TreeNode.js +2 -2
  26. package/dist/esm/constants/version.d.ts +1 -1
  27. package/dist/esm/constants/version.js +1 -1
  28. package/dist/esm/customHooks/bundleAnalyzer.d.ts +1 -1
  29. package/dist/esm/customHooks/bundleAnalyzer.js +96 -29
  30. package/dist/esm/i18n/locales/en.json +24 -22
  31. package/package.json +1 -1
@@ -44,6 +44,7 @@ const helpers_1 = require("../helpers");
44
44
  const i18n_1 = require("../i18n");
45
45
  const HighlightText_1 = __importDefault(require("./HighlightText"));
46
46
  const TouchableScale_1 = __importDefault(require("./TouchableScale"));
47
+ const NetworkIcons_1 = require("./NetworkIcons");
47
48
  // ─── Component ────────────────────────────────────────────────────────────────
48
49
  const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ event, onPress, isNew = false, searchStr = '', msSincePrev, computedScreenName, }) {
49
50
  const { t } = (0, i18n_1.useTranslation)();
@@ -204,6 +205,7 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
204
205
  borderColor: AppColors_1.AppColors.amberBorder,
205
206
  },
206
207
  ]}>
208
+ <NetworkIcons_1.CartIcon color={AppColors_1.AppColors.amber700} size={12}/>
207
209
  <react_native_1.Text style={[
208
210
  cardStyles.chipText,
209
211
  {
@@ -211,7 +213,7 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
211
213
  fontFamily: AppFonts_1.AppFonts.interBold,
212
214
  },
213
215
  ]}>
214
- 🛒 {items.length}{' '}
216
+ {items.length}{' '}
215
217
  {items.length === 1
216
218
  ? t('analytics.item')
217
219
  : t('analytics.items')}
@@ -236,6 +238,7 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
236
238
  borderColor: AppColors_1.AppColors.emeraldBorder,
237
239
  },
238
240
  ]}>
241
+ <NetworkIcons_1.MoneyIcon color={AppColors_1.AppColors.emerald600} size={12}/>
239
242
  <react_native_1.Text style={[
240
243
  cardStyles.chipText,
241
244
  {
@@ -243,7 +246,7 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
243
246
  fontFamily: AppFonts_1.AppFonts.interBold,
244
247
  },
245
248
  ]}>
246
- 💰 {String(val)} {currencyStr}
249
+ {String(val)} {currencyStr}
247
250
  </react_native_1.Text>
248
251
  </react_native_1.View>);
249
252
  }
@@ -39,6 +39,7 @@ const react_native_1 = require("react-native");
39
39
  const AppColors_1 = require("../styles/AppColors");
40
40
  const AppFonts_1 = require("../styles/AppFonts");
41
41
  const helpers_1 = require("../helpers");
42
+ const NetworkIcons_1 = require("./NetworkIcons");
42
43
  function parseStackTrace(stack) {
43
44
  if (!stack)
44
45
  return null;
@@ -110,7 +111,10 @@ ${error.stack}`;
110
111
  const isInline = this.props.fallbackType === 'inline';
111
112
  if (isInline) {
112
113
  return (<react_native_1.View style={styles.inlineContainer}>
113
- <react_native_1.Text style={styles.inlineTitle}>⚠️ Inspector Crash</react_native_1.Text>
114
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
115
+ <NetworkIcons_1.WarningTriangleIcon color={AppColors_1.AppColors.redErrorText} size={14}/>
116
+ <react_native_1.Text style={styles.inlineTitle}>Inspector Crash</react_native_1.Text>
117
+ </react_native_1.View>
114
118
  <react_native_1.TouchableOpacity style={styles.inlineResetBtn} onPress={this.handleReset}>
115
119
  <react_native_1.Text style={styles.inlineResetText}>Reload</react_native_1.Text>
116
120
  </react_native_1.TouchableOpacity>
@@ -121,7 +125,9 @@ ${error.stack}`;
121
125
  const parsed = error && error.stack ? parseStackTrace(error.stack) : null;
122
126
  return (<react_native_1.View style={styles.container}>
123
127
  <react_native_1.View style={styles.card}>
124
- <react_native_1.Text style={styles.emoji}>⚠️</react_native_1.Text>
128
+ <react_native_1.View style={{ marginBottom: 12, alignItems: 'center' }}>
129
+ <NetworkIcons_1.WarningTriangleIcon color={AppColors_1.AppColors.amber500} size={44}/>
130
+ </react_native_1.View>
125
131
  <react_native_1.Text style={styles.title}>Something went wrong</react_native_1.Text>
126
132
 
127
133
  <react_native_1.View style={{
@@ -134,13 +140,19 @@ ${error.stack}`;
134
140
  marginBottom: 12,
135
141
  gap: 4
136
142
  }}>
143
+ <react_native_1.View style={{
144
+ width: 8,
145
+ height: 8,
146
+ borderRadius: 4,
147
+ backgroundColor: isNativeCrash ? AppColors_1.AppColors.errorColor : AppColors_1.AppColors.amber500,
148
+ }}/>
137
149
  <react_native_1.Text style={{
138
150
  fontSize: 10,
139
151
  fontWeight: 'bold',
140
152
  color: isNativeCrash ? AppColors_1.AppColors.errorColor : AppColors_1.AppColors.amber500,
141
153
  fontFamily: AppFonts_1.AppFonts.interBold || 'System'
142
154
  }}>
143
- {isNativeCrash ? '🔴 NATIVE CRASH' : '🟡 JAVASCRIPT CRASH'}
155
+ {isNativeCrash ? 'NATIVE CRASH' : 'JAVASCRIPT CRASH'}
144
156
  </react_native_1.Text>
145
157
  </react_native_1.View>
146
158
 
@@ -187,8 +199,9 @@ ${error.stack}`;
187
199
  flexDirection: 'row',
188
200
  gap: 6
189
201
  }} onPress={this.handleCopyTrace}>
202
+ <NetworkIcons_1.CopyIcon color={AppColors_1.AppColors.white} size={14}/>
190
203
  <react_native_1.Text style={{ color: AppColors_1.AppColors.white, fontSize: 12, fontWeight: 'bold', fontFamily: AppFonts_1.AppFonts.interBold || 'System' }}>
191
- 📋 Copy Crash Traceback
204
+ Copy Crash Traceback
192
205
  </react_native_1.Text>
193
206
  </react_native_1.TouchableOpacity>
194
207
  </react_native_1.View>
@@ -231,10 +244,6 @@ const styles = react_native_1.StyleSheet.create({
231
244
  shadowRadius: 12,
232
245
  elevation: 8,
233
246
  },
234
- emoji: {
235
- fontSize: 40,
236
- marginBottom: 12,
237
- },
238
247
  title: {
239
248
  fontFamily: AppFonts_1.AppFonts.interBold || 'System',
240
249
  fontSize: 18,
@@ -32,6 +32,7 @@ export interface BundlePackageItem {
32
32
  lastActive?: string;
33
33
  npmUrl?: string;
34
34
  }
35
+ export type BundleIconType = 'source' | 'deps' | 'media' | 'overhead' | 'image' | 'typescript' | 'javascript' | 'font' | 'json' | 'folder' | 'ban' | 'bolt';
35
36
  export interface TreeNode {
36
37
  id: string;
37
38
  name: string;
@@ -162,6 +162,77 @@ const PackageLogoRenderer = ({ name, size = 28 }) => {
162
162
  </react_native_svg_1.default>
163
163
  </react_native_1.View>);
164
164
  };
165
+ const BundleCategoryIcon = ({ type, size = 16, color = AppColors_1.AppColors.purple }) => {
166
+ const stroke = { stroke: color, strokeWidth: 1.7, strokeLinecap: 'round', strokeLinejoin: 'round' };
167
+ const renderGlyph = () => {
168
+ switch (type) {
169
+ case 'folder':
170
+ return (<react_native_svg_1.G>
171
+ <react_native_svg_1.Path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" {...stroke}/>
172
+ </react_native_svg_1.G>);
173
+ case 'ban':
174
+ return (<react_native_svg_1.G>
175
+ <react_native_svg_1.Circle cx="12" cy="12" r="8.5" {...stroke}/>
176
+ <react_native_svg_1.Path d="M5.5 5.5 18.5 18.5" {...stroke}/>
177
+ </react_native_svg_1.G>);
178
+ case 'bolt':
179
+ return (<react_native_svg_1.G>
180
+ <react_native_svg_1.Path d="M13 2 4.5 13.5 H10.5 L9 22 19.5 9.5 H13.5 Z" {...stroke}/>
181
+ </react_native_svg_1.G>);
182
+ case 'source':
183
+ return (<react_native_svg_1.G>
184
+ <react_native_svg_1.Path d="M8.5 7 L4 12 L8.5 17" {...stroke}/>
185
+ <react_native_svg_1.Path d="M15.5 7 L20 12 L15.5 17" {...stroke}/>
186
+ <react_native_svg_1.Path d="M13.5 4.5 L10.5 19.5" {...stroke}/>
187
+ </react_native_svg_1.G>);
188
+ case 'deps':
189
+ return (<react_native_svg_1.G>
190
+ <react_native_svg_1.Rect x="4" y="4" width="16" height="16" rx="2.5" {...stroke}/>
191
+ <react_native_svg_1.Path d="M4 9.5 H20" {...stroke}/>
192
+ <react_native_svg_1.Path d="M9.5 9.5 V20" {...stroke}/>
193
+ </react_native_svg_1.G>);
194
+ case 'media':
195
+ case 'image':
196
+ return (<react_native_svg_1.G>
197
+ <react_native_svg_1.Rect x="3.5" y="4.5" width="17" height="15" rx="2" {...stroke}/>
198
+ <react_native_svg_1.Circle cx="9" cy="10" r="1.5" {...stroke}/>
199
+ <react_native_svg_1.Path d="M3.5 17.5 L9.5 12.5 L14 16.5 L17 13.5 L20.5 17.5" {...stroke}/>
200
+ </react_native_svg_1.G>);
201
+ case 'overhead':
202
+ return (<react_native_svg_1.G>
203
+ <react_native_svg_1.Circle cx="12" cy="12" r="3.2" {...stroke}/>
204
+ <react_native_svg_1.Path d="M12 2.5 V5.5 M12 18.5 V21.5 M2.5 12 H5.5 M18.5 12 H21.5 M5.3 5.3 L7.4 7.4 M16.6 16.6 L18.7 18.7 M18.7 5.3 L16.6 7.4 M7.4 16.6 L5.3 18.7" {...stroke}/>
205
+ </react_native_svg_1.G>);
206
+ case 'typescript':
207
+ return (<react_native_svg_1.G>
208
+ <react_native_svg_1.Path d="M6.5 3.5 H14 L18.5 8 V20.5 H6.5 Z" {...stroke}/>
209
+ <react_native_svg_1.Path d="M14 3.5 V8 H18.5" {...stroke}/>
210
+ <react_native_svg_1.Path d="M9.5 13.5 H15 M12 13.5 V16.5 M9.5 16.5 H13" {...stroke}/>
211
+ </react_native_svg_1.G>);
212
+ case 'javascript':
213
+ return (<react_native_svg_1.G>
214
+ <react_native_svg_1.Path d="M9.5 3.5 C7.5 3.5 7.5 6.5 7.5 9 C7.5 11 6.5 12 5 12 C6.5 12 7.5 13 7.5 15 C7.5 17.5 7.5 20.5 9.5 20.5" {...stroke}/>
215
+ <react_native_svg_1.Path d="M14.5 3.5 C16.5 3.5 16.5 6.5 16.5 9 C16.5 11 17.5 12 19 12 C17.5 12 16.5 13 16.5 15 C16.5 17.5 16.5 20.5 14.5 20.5" {...stroke}/>
216
+ </react_native_svg_1.G>);
217
+ case 'font':
218
+ return (<react_native_svg_1.G>
219
+ <react_native_svg_1.Path d="M8 19 L12 5.5 L16 19" {...stroke}/>
220
+ <react_native_svg_1.Path d="M9.4 14.5 H14.6" {...stroke}/>
221
+ </react_native_svg_1.G>);
222
+ case 'json':
223
+ return (<react_native_svg_1.G>
224
+ <react_native_svg_1.Path d="M9 3.5 C7 3.5 7 6 7 8.5 C7 10.5 6 11.5 5 12 C6 12.5 7 13.5 7 15.5 C7 18 7 20.5 9 20.5" {...stroke}/>
225
+ <react_native_svg_1.Circle cx="12" cy="12" r="1.1" fill={color}/>
226
+ <react_native_svg_1.Path d="M15 3.5 C17 3.5 17 6 17 8.5 C17 10.5 18 11.5 19 12 C18 12.5 17 13.5 17 15.5 C17 18 17 20.5 15 20.5" {...stroke}/>
227
+ </react_native_svg_1.G>);
228
+ default:
229
+ return null;
230
+ }
231
+ };
232
+ return (<react_native_svg_1.default width={size} height={size} viewBox="0 0 24 24" fill="none">
233
+ {renderGlyph()}
234
+ </react_native_svg_1.default>);
235
+ };
165
236
  // ─── Media File Thumbnail Component ──────────────────────────────────────────
166
237
  const MediaPreviewThumbnail = ({ file }) => {
167
238
  const [loadError, setLoadError] = (0, react_1.useState)(false);
@@ -282,7 +353,7 @@ const BundleTreeNodeView = ({ node, level, search, totalBundleKb, collapsedFolde
282
353
  {isCollapsed ? '▶' : '▼'}
283
354
  </react_native_1.Text>
284
355
  </react_native_1.View>
285
- <react_native_1.Text style={{ fontSize: 16 }}>{isCollapsed ? '📁' : '📂'}</react_native_1.Text>
356
+ {isCollapsed ? (<NetworkIcons_1.FolderIcon color={AppColors_1.AppColors.amber500} size={16}/>) : (<NetworkIcons_1.FolderOpenIcon color={AppColors_1.AppColors.amber500} size={16}/>)}
286
357
  <HighlightText_1.default text={node.name + '/'} search={search} style={bundleStyles.treeFolderName} highlightStyle={bundleStyles.searchHighlight}/>
287
358
  <react_native_1.View style={bundleStyles.treeCountBadge}>
288
359
  <react_native_1.Text style={bundleStyles.treeCountBadgeText}>
@@ -360,27 +431,29 @@ const BundleTreeNodeView = ({ node, level, search, totalBundleKb, collapsedFolde
360
431
  isUnused && bundleStyles.adviceUnused,
361
432
  { marginLeft: 26, marginTop: 4 },
362
433
  ]}>
363
- <react_native_1.Text style={[
434
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'flex-start', gap: 5 }}>
435
+ {isUnused ? (<NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.red600} size={12}/>) : file.status === 'warning' ? (<NetworkIcons_1.LightbulbIcon color={AppColors_1.AppColors.amber800Warm} size={12}/>) : (<NetworkIcons_1.SparkleIcon color={AppColors_1.AppColors.emerald700} size={12}/>)}
436
+ <react_native_1.Text style={[
364
437
  bundleStyles.adviceText,
365
438
  file.status === 'warning' && { color: AppColors_1.AppColors.amber800Warm },
366
439
  file.status === 'optimal' && { color: AppColors_1.AppColors.emerald700 },
367
440
  isUnused && { color: AppColors_1.AppColors.red600 },
368
441
  ]}>
369
- {isUnused ? '🗑️ ' : file.status === 'warning' ? '💡 ' : '✨ '}
370
- {file.advice}
371
- </react_native_1.Text>
442
+ {file.advice}
443
+ </react_native_1.Text>
444
+ </react_native_1.View>
372
445
  </react_native_1.View>)}
373
446
  </react_native_1.View>);
374
447
  };
375
448
  const CATEGORY_TABS = [
376
- { key: 'ALL', labelKey: 'bundle.catAll', icon: '📁' },
377
- { key: 'UNUSED', labelKey: 'bundle.catUnused', icon: '🚫' },
378
- { key: 'CONSUMED', labelKey: 'bundle.catConsumed', icon: '' },
379
- { key: 'image', labelKey: 'bundle.catImages', icon: '🖼️' },
380
- { key: 'typescript', labelKey: 'bundle.catTypescript', icon: '📜' },
381
- { key: 'javascript', labelKey: 'bundle.catJavascript', icon: '⚙️' },
382
- { key: 'font', labelKey: 'bundle.catFonts', icon: '🔤' },
383
- { key: 'json', labelKey: 'bundle.catJson', icon: '📄' },
449
+ { key: 'ALL', labelKey: 'bundle.catAll', iconType: 'folder' },
450
+ { key: 'UNUSED', labelKey: 'bundle.catUnused', iconType: 'ban' },
451
+ { key: 'CONSUMED', labelKey: 'bundle.catConsumed', iconType: 'bolt' },
452
+ { key: 'image', labelKey: 'bundle.catImages', iconType: 'image' },
453
+ { key: 'typescript', labelKey: 'bundle.catTypescript', iconType: 'typescript' },
454
+ { key: 'javascript', labelKey: 'bundle.catJavascript', iconType: 'javascript' },
455
+ { key: 'font', labelKey: 'bundle.catFonts', iconType: 'font' },
456
+ { key: 'json', labelKey: 'bundle.catJson', iconType: 'json' },
384
457
  ];
385
458
  const CATEGORY_COLORS = {
386
459
  image: { label: 'Images & Media', color: AppColors_1.AppColors.pink500, bg: AppColors_1.AppColors.pink100 },
@@ -689,6 +762,21 @@ const BundleTab = react_1.default.memo(() => {
689
762
  </react_native_1.View>
690
763
  </react_native_1.View>
691
764
 
765
+ {/* Live analysis unavailable warning */}
766
+ {analysis && !analysis.isLive && (<react_native_1.View style={bundleStyles.liveWarningCard}>
767
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6, flex: 1 }}>
768
+ <NetworkIcons_1.CircleAlertIcon color={AppColors_1.AppColors.amber700} size={16}/>
769
+ <react_native_1.View style={{ flex: 1 }}>
770
+ <react_native_1.Text style={bundleStyles.liveWarningTitle}>
771
+ {t('bundle.liveAnalysisUnavailable')}
772
+ </react_native_1.Text>
773
+ <react_native_1.Text style={bundleStyles.liveWarningDesc}>
774
+ {t('bundle.liveAnalysisUnavailableSub')}
775
+ </react_native_1.Text>
776
+ </react_native_1.View>
777
+ </react_native_1.View>
778
+ </react_native_1.View>)}
779
+
692
780
  {/* Development Bundle Split-Up (derived from the real running bundle) */}
693
781
  {analysis && (<react_native_1.View style={bundleStyles.sectionCard}>
694
782
  <react_native_1.View style={bundleStyles.sectionHeaderRow}>
@@ -707,28 +795,32 @@ const BundleTab = react_1.default.memo(() => {
707
795
 
708
796
  {[
709
797
  {
798
+ iconType: 'source',
710
799
  label: t('bundle.splitAppSource'),
711
800
  color: AppColors_1.AppColors.sky500,
712
801
  ...analysis.splitUp.appSource,
713
802
  },
714
803
  {
804
+ iconType: 'deps',
715
805
  label: t('bundle.splitNodeModules'),
716
806
  color: AppColors_1.AppColors.indigo500,
717
807
  ...analysis.splitUp.nodeModules,
718
808
  },
719
809
  {
810
+ iconType: 'media',
720
811
  label: t('bundle.splitAssetsMedia'),
721
812
  color: AppColors_1.AppColors.pink500,
722
813
  ...analysis.splitUp.assetsMedia,
723
814
  },
724
815
  {
816
+ iconType: 'overhead',
725
817
  label: t('bundle.splitMetroOverhead'),
726
818
  color: AppColors_1.AppColors.amber500,
727
819
  ...analysis.splitUp.metroDevOverhead,
728
820
  },
729
821
  ].map((part, idx) => (<react_native_1.View key={idx} style={bundleStyles.catRowCard}>
730
822
  <react_native_1.View style={bundleStyles.catRowTop}>
731
- <react_native_1.Text style={bundleStyles.catRowIcon}>{['📦', '🧩', '🖼️', '⚙️'][idx]}</react_native_1.Text>
823
+ <BundleCategoryIcon type={part.iconType} size={18} color={part.color}/>
732
824
  <react_native_1.View style={{ flex: 1 }}>
733
825
  <react_native_1.Text style={bundleStyles.catRowTitle}>{part.label}</react_native_1.Text>
734
826
  <react_native_1.Text style={bundleStyles.catRowDesc}>
@@ -805,7 +897,7 @@ const BundleTab = react_1.default.memo(() => {
805
897
  {/* Legend Grid */}
806
898
  <react_native_1.View style={bundleStyles.legendGrid}>
807
899
  <react_native_1.View style={bundleStyles.legendItem}>
808
- <react_native_1.View style={[bundleStyles.legendDot, { backgroundColor: AppColors_1.AppColors.pink500 }]}/>
900
+ <BundleCategoryIcon type="image" size={13} color={AppColors_1.AppColors.pink500}/>
809
901
  <react_native_1.Text style={bundleStyles.legendText}>
810
902
  {t('bundle.legendImages')}{' '}
811
903
  <react_native_1.Text style={bundleStyles.legendVal}>
@@ -814,7 +906,7 @@ const BundleTab = react_1.default.memo(() => {
814
906
  </react_native_1.Text>
815
907
  </react_native_1.View>
816
908
  <react_native_1.View style={bundleStyles.legendItem}>
817
- <react_native_1.View style={[bundleStyles.legendDot, { backgroundColor: AppColors_1.AppColors.sky500 }]}/>
909
+ <BundleCategoryIcon type="typescript" size={13} color={AppColors_1.AppColors.sky500}/>
818
910
  <react_native_1.Text style={bundleStyles.legendText}>
819
911
  {t('bundle.legendTs')}{' '}
820
912
  <react_native_1.Text style={bundleStyles.legendVal}>
@@ -823,7 +915,7 @@ const BundleTab = react_1.default.memo(() => {
823
915
  </react_native_1.Text>
824
916
  </react_native_1.View>
825
917
  <react_native_1.View style={bundleStyles.legendItem}>
826
- <react_native_1.View style={[bundleStyles.legendDot, { backgroundColor: AppColors_1.AppColors.indigo500 }]}/>
918
+ <BundleCategoryIcon type="javascript" size={13} color={AppColors_1.AppColors.indigo500}/>
827
919
  <react_native_1.Text style={bundleStyles.legendText}>
828
920
  {t('bundle.legendJs')}{' '}
829
921
  <react_native_1.Text style={bundleStyles.legendVal}>
@@ -832,7 +924,7 @@ const BundleTab = react_1.default.memo(() => {
832
924
  </react_native_1.Text>
833
925
  </react_native_1.View>
834
926
  <react_native_1.View style={bundleStyles.legendItem}>
835
- <react_native_1.View style={[bundleStyles.legendDot, { backgroundColor: AppColors_1.AppColors.purple500 }]}/>
927
+ <BundleCategoryIcon type="font" size={13} color={AppColors_1.AppColors.purple500}/>
836
928
  <react_native_1.Text style={bundleStyles.legendText}>
837
929
  {t('bundle.legendFonts')}{' '}
838
930
  <react_native_1.Text style={bundleStyles.legendVal}>
@@ -841,7 +933,7 @@ const BundleTab = react_1.default.memo(() => {
841
933
  </react_native_1.Text>
842
934
  </react_native_1.View>
843
935
  <react_native_1.View style={bundleStyles.legendItem}>
844
- <react_native_1.View style={[bundleStyles.legendDot, { backgroundColor: AppColors_1.AppColors.emerald500 }]}/>
936
+ <BundleCategoryIcon type="json" size={13} color={AppColors_1.AppColors.emerald500}/>
845
937
  <react_native_1.Text style={bundleStyles.legendText}>
846
938
  {t('bundle.legendJson')}{' '}
847
939
  <react_native_1.Text style={bundleStyles.legendVal}>
@@ -871,7 +963,7 @@ const BundleTab = react_1.default.memo(() => {
871
963
 
872
964
  {[
873
965
  {
874
- icon: '🖼️',
966
+ iconType: 'image',
875
967
  title: t('bundle.catImagesTitle'),
876
968
  count: summary.images.count,
877
969
  size: t('bundle.fileSizeKb', { size: summary.images.kb }),
@@ -880,7 +972,7 @@ const BundleTab = react_1.default.memo(() => {
880
972
  desc: t('bundle.catImagesDesc'),
881
973
  },
882
974
  {
883
- icon: '⚙️',
975
+ iconType: 'javascript',
884
976
  title: t('bundle.catJsTitle'),
885
977
  count: summary.js.count,
886
978
  size: t('bundle.fileSizeKb', { size: summary.js.kb }),
@@ -889,7 +981,7 @@ const BundleTab = react_1.default.memo(() => {
889
981
  desc: t('bundle.catJsDesc'),
890
982
  },
891
983
  {
892
- icon: '🔤',
984
+ iconType: 'font',
893
985
  title: t('bundle.catFontsTitle'),
894
986
  count: summary.fonts.count,
895
987
  size: t('bundle.fileSizeKb', { size: summary.fonts.kb }),
@@ -901,7 +993,7 @@ const BundleTab = react_1.default.memo(() => {
901
993
  .join(', ') || t('bundle.catFontsDesc'),
902
994
  },
903
995
  {
904
- icon: '📜',
996
+ iconType: 'typescript',
905
997
  title: t('bundle.catTsTitle'),
906
998
  count: summary.ts.count,
907
999
  size: t('bundle.fileSizeKb', { size: summary.ts.kb }),
@@ -910,7 +1002,7 @@ const BundleTab = react_1.default.memo(() => {
910
1002
  desc: t('bundle.catTsDesc'),
911
1003
  },
912
1004
  {
913
- icon: '📄',
1005
+ iconType: 'json',
914
1006
  title: t('bundle.catJsonTitle'),
915
1007
  count: summary.json.count,
916
1008
  size: t('bundle.fileSizeKb', { size: summary.json.kb }),
@@ -920,7 +1012,7 @@ const BundleTab = react_1.default.memo(() => {
920
1012
  },
921
1013
  ].map((cat, cIdx) => (<react_native_1.View key={cIdx} style={bundleStyles.catRowCard}>
922
1014
  <react_native_1.View style={bundleStyles.catRowTop}>
923
- <react_native_1.Text style={bundleStyles.catRowIcon}>{cat.icon}</react_native_1.Text>
1015
+ <BundleCategoryIcon type={cat.iconType} size={18} color={cat.color}/>
924
1016
  <react_native_1.View style={{ flex: 1 }}>
925
1017
  <react_native_1.Text style={bundleStyles.catRowTitle}>{cat.title}</react_native_1.Text>
926
1018
  <react_native_1.Text style={bundleStyles.catRowDesc}>
@@ -1000,7 +1092,7 @@ const BundleTab = react_1.default.memo(() => {
1000
1092
  tab.key === 'UNUSED' && isActive && { backgroundColor: AppColors_1.AppColors.red500, borderColor: AppColors_1.AppColors.red600 },
1001
1093
  tab.key === 'CONSUMED' && isActive && { backgroundColor: AppColors_1.AppColors.emerald600, borderColor: AppColors_1.AppColors.emerald700 },
1002
1094
  ]}>
1003
- <react_native_1.Text style={bundleStyles.catPillIcon}>{tab.icon}</react_native_1.Text>
1095
+ <BundleCategoryIcon type={tab.iconType} size={12} color={isActive ? AppColors_1.AppColors.white : AppColors_1.AppColors.grayTextStrong}/>
1004
1096
  <react_native_1.Text style={[
1005
1097
  bundleStyles.catPillText,
1006
1098
  isActive && bundleStyles.catPillTextActive,
@@ -1118,15 +1210,17 @@ const BundleTab = react_1.default.memo(() => {
1118
1210
  file.status === 'optimal' && bundleStyles.adviceOptimal,
1119
1211
  isUnused && bundleStyles.adviceUnused,
1120
1212
  ]}>
1213
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'flex-start', gap: 5 }}>
1214
+ {isUnused ? (<NetworkIcons_1.TrashIcon color={AppColors_1.AppColors.red600} size={12}/>) : file.status === 'warning' ? (<NetworkIcons_1.LightbulbIcon color={AppColors_1.AppColors.amber800Warm} size={12}/>) : (<NetworkIcons_1.SparkleIcon color={AppColors_1.AppColors.emerald700} size={12}/>)}
1121
1215
  <react_native_1.Text style={[
1122
1216
  bundleStyles.adviceText,
1123
1217
  file.status === 'warning' && { color: AppColors_1.AppColors.amber800Warm },
1124
1218
  file.status === 'optimal' && { color: AppColors_1.AppColors.emerald700 },
1125
1219
  isUnused && { color: AppColors_1.AppColors.red600 },
1126
1220
  ]}>
1127
- {isUnused ? '🗑️ ' : file.status === 'warning' ? '💡 ' : '✨ '}
1128
1221
  {file.advice}
1129
1222
  </react_native_1.Text>
1223
+ </react_native_1.View>
1130
1224
  </react_native_1.View>)}
1131
1225
  </react_native_1.View>
1132
1226
  </react_native_1.View>);
@@ -1243,9 +1337,12 @@ const BundleTab = react_1.default.memo(() => {
1243
1337
 
1244
1338
  {/* Deprecation Warning Banner if deprecated */}
1245
1339
  {pkg.isDeprecated && pkg.deprecationReason && (<react_native_1.View style={bundleStyles.deprecationBox}>
1246
- <react_native_1.Text style={bundleStyles.deprecationText}>
1247
- ⚠️ {pkg.deprecationReason}
1248
- </react_native_1.Text>
1340
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 5 }}>
1341
+ <NetworkIcons_1.CircleAlertIcon color={AppColors_1.AppColors.errorColor} size={12}/>
1342
+ <react_native_1.Text style={bundleStyles.deprecationText}>
1343
+ {pkg.deprecationReason}
1344
+ </react_native_1.Text>
1345
+ </react_native_1.View>
1249
1346
  </react_native_1.View>)}
1250
1347
 
1251
1348
  <react_native_1.View style={bundleStyles.fileProgressTrack}>
@@ -1263,9 +1360,12 @@ const BundleTab = react_1.default.memo(() => {
1263
1360
  {pkg.type === 'direct' ? t('bundle.direct') : t('bundle.transitive')}
1264
1361
  </react_native_1.Text>
1265
1362
  </react_native_1.View>
1266
- {pkg.lastActive && (<react_native_1.Text style={bundleStyles.lastActiveText}>
1267
- 🕒 {pkg.lastActive}
1268
- </react_native_1.Text>)}
1363
+ {pkg.lastActive && (<react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 4 }}>
1364
+ <NetworkIcons_1.ClockIcon color={AppColors_1.AppColors.grayTextWeak} size={11}/>
1365
+ <react_native_1.Text style={bundleStyles.lastActiveText}>
1366
+ {pkg.lastActive}
1367
+ </react_native_1.Text>
1368
+ </react_native_1.View>)}
1269
1369
  </react_native_1.View>
1270
1370
 
1271
1371
  <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
@@ -1362,14 +1462,16 @@ const BundleTab = react_1.default.memo(() => {
1362
1462
  file.status === 'warning' && bundleStyles.adviceWarning,
1363
1463
  file.status === 'optimal' && bundleStyles.adviceOptimal,
1364
1464
  ]}>
1365
- <react_native_1.Text style={[
1465
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'flex-start', gap: 5 }}>
1466
+ {file.status === 'warning' ? (<NetworkIcons_1.LightbulbIcon color={AppColors_1.AppColors.amber800Warm} size={12}/>) : (<NetworkIcons_1.SparkleIcon color={AppColors_1.AppColors.emerald700} size={12}/>)}
1467
+ <react_native_1.Text style={[
1366
1468
  bundleStyles.adviceText,
1367
1469
  file.status === 'warning' && { color: AppColors_1.AppColors.amber800Warm },
1368
1470
  file.status === 'optimal' && { color: AppColors_1.AppColors.emerald700 },
1369
1471
  ]}>
1370
- {file.status === 'warning' ? '💡 ' : '✨ '}
1371
- {file.advice}
1372
- </react_native_1.Text>
1472
+ {file.advice}
1473
+ </react_native_1.Text>
1474
+ </react_native_1.View>
1373
1475
  </react_native_1.View>)}
1374
1476
  </react_native_1.View>
1375
1477
  </react_native_1.View>))}
@@ -1414,12 +1516,16 @@ const BundleTab = react_1.default.memo(() => {
1414
1516
 
1415
1517
  {[
1416
1518
  {
1519
+ iconType: 'image',
1520
+ iconColor: AppColors_1.AppColors.pink500,
1417
1521
  title: t('bundle.optTip1Title'),
1418
1522
  desc: t('bundle.optTip1Desc'),
1419
1523
  badge: t('bundle.highImpact'),
1420
1524
  badgeColor: AppColors_1.AppColors.pink500,
1421
1525
  },
1422
1526
  {
1527
+ iconType: 'bolt',
1528
+ iconColor: isHermes ? AppColors_1.AppColors.emerald500 : AppColors_1.AppColors.amber500,
1423
1529
  title: t('bundle.optTip2Title'),
1424
1530
  desc: isHermes
1425
1531
  ? t('bundle.optTip2DescActive')
@@ -1428,18 +1534,24 @@ const BundleTab = react_1.default.memo(() => {
1428
1534
  badgeColor: isHermes ? AppColors_1.AppColors.emerald500 : AppColors_1.AppColors.amber500,
1429
1535
  },
1430
1536
  {
1537
+ iconType: 'font',
1538
+ iconColor: AppColors_1.AppColors.purple500,
1431
1539
  title: t('bundle.optTip3Title'),
1432
1540
  desc: t('bundle.optTip3Desc'),
1433
1541
  badge: t('bundle.mediumImpact'),
1434
1542
  badgeColor: AppColors_1.AppColors.purple500,
1435
1543
  },
1436
1544
  {
1545
+ iconType: 'source',
1546
+ iconColor: AppColors_1.AppColors.sky500,
1437
1547
  title: t('bundle.optTip4Title'),
1438
1548
  desc: t('bundle.optTip4Desc'),
1439
1549
  badge: t('bundle.bestPractice'),
1440
1550
  badgeColor: AppColors_1.AppColors.sky500,
1441
1551
  },
1442
1552
  {
1553
+ iconType: 'overhead',
1554
+ iconColor: AppColors_1.AppColors.indigo500,
1443
1555
  title: t('bundle.optTip5Title'),
1444
1556
  desc: t('bundle.optTip5Desc'),
1445
1557
  badge: t('bundle.bestPractice'),
@@ -1451,6 +1563,7 @@ const BundleTab = react_1.default.memo(() => {
1451
1563
  <react_native_1.View style={bundleStyles.sNoBadge}>
1452
1564
  <react_native_1.Text style={bundleStyles.sNoText}>#{tIdx + 1}</react_native_1.Text>
1453
1565
  </react_native_1.View>
1566
+ <BundleCategoryIcon type={tip.iconType} size={14} color={tip.iconColor}/>
1454
1567
  <react_native_1.Text style={bundleStyles.tipTitle}>{tip.title}</react_native_1.Text>
1455
1568
  </react_native_1.View>
1456
1569
  <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
@@ -1650,11 +1763,6 @@ const bundleStyles = react_native_1.StyleSheet.create({
1650
1763
  gap: 5,
1651
1764
  minWidth: '45%',
1652
1765
  },
1653
- legendDot: {
1654
- width: 8,
1655
- height: 8,
1656
- borderRadius: 4,
1657
- },
1658
1766
  legendText: {
1659
1767
  fontFamily: AppFonts_1.AppFonts.interMedium,
1660
1768
  fontSize: 11,
@@ -1678,9 +1786,6 @@ const bundleStyles = react_native_1.StyleSheet.create({
1678
1786
  gap: 8,
1679
1787
  marginBottom: 8,
1680
1788
  },
1681
- catRowIcon: {
1682
- fontSize: 16,
1683
- },
1684
1789
  catRowTitle: {
1685
1790
  fontFamily: AppFonts_1.AppFonts.interBold,
1686
1791
  fontSize: 12,
@@ -1756,9 +1861,6 @@ const bundleStyles = react_native_1.StyleSheet.create({
1756
1861
  backgroundColor: AppColors_1.AppColors.brandPurple,
1757
1862
  borderColor: AppColors_1.AppColors.brandPurple,
1758
1863
  },
1759
- catPillIcon: {
1760
- fontSize: 11,
1761
- },
1762
1864
  catPillText: {
1763
1865
  fontFamily: AppFonts_1.AppFonts.interMedium,
1764
1866
  fontSize: 11,
@@ -2146,6 +2248,28 @@ const bundleStyles = react_native_1.StyleSheet.create({
2146
2248
  borderWidth: 1,
2147
2249
  borderColor: AppColors_1.AppColors.errorBorder,
2148
2250
  },
2251
+ liveWarningCard: {
2252
+ flexDirection: 'row',
2253
+ alignItems: 'center',
2254
+ backgroundColor: AppColors_1.AppColors.amber100,
2255
+ borderWidth: 1,
2256
+ borderColor: AppColors_1.AppColors.amber200,
2257
+ borderRadius: 10,
2258
+ padding: 12,
2259
+ marginBottom: 12,
2260
+ },
2261
+ liveWarningTitle: {
2262
+ fontFamily: AppFonts_1.AppFonts.interBold,
2263
+ fontSize: 12,
2264
+ color: AppColors_1.AppColors.amber800Warm,
2265
+ marginBottom: 2,
2266
+ },
2267
+ liveWarningDesc: {
2268
+ fontFamily: AppFonts_1.AppFonts.interRegular,
2269
+ fontSize: 10.5,
2270
+ lineHeight: 14,
2271
+ color: AppColors_1.AppColors.amber800Warm,
2272
+ },
2149
2273
  adviceBadge: {
2150
2274
  paddingHorizontal: 8,
2151
2275
  paddingVertical: 4,
@@ -306,14 +306,17 @@ const LogDetail = react_1.default.memo(() => {
306
306
  paddingVertical: 2,
307
307
  },
308
308
  ]}>
309
- <react_native_1.Text style={[
309
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 3 }}>
310
+ <NetworkIcons_1.DocIcon color={AppColors_1.AppColors.brandPurple} size={10}/>
311
+ <react_native_1.Text style={[
310
312
  styles_1.default.metaChipText,
311
313
  { color: AppColors_1.AppColors.brandPurple, fontSize: 10, fontFamily: AppFonts_1.AppFonts.interBold },
312
314
  ]}>
313
- 📄 {originFrame.fileName}
314
- {originFrame.lineNumber ? `:${originFrame.lineNumber}` : ''}
315
- {originFrame.columnNumber ? `:${originFrame.columnNumber}` : ''}
316
- </react_native_1.Text>
315
+ {originFrame.fileName}
316
+ {originFrame.lineNumber ? `:${originFrame.lineNumber}` : ''}
317
+ {originFrame.columnNumber ? `:${originFrame.columnNumber}` : ''}
318
+ </react_native_1.Text>
319
+ </react_native_1.View>
317
320
  </react_native_1.View>)}
318
321
  </react_native_1.View>
319
322
 
@@ -749,6 +752,8 @@ const LogDetail = react_1.default.memo(() => {
749
752
  {frame.fileExt.toUpperCase()}
750
753
  </react_native_1.Text>
751
754
  </react_native_1.View>)}
755
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 3 }}>
756
+ <NetworkIcons_1.DocIcon color={isTopFrame ? AppColors_1.AppColors.brandPurple : AppColors_1.AppColors.grayTextWeak} size={10}/>
752
757
  <react_native_1.Text style={{
753
758
  fontFamily: AppFonts_1.AppFonts.interMedium,
754
759
  fontSize: 10.5,
@@ -756,9 +761,10 @@ const LogDetail = react_1.default.memo(() => {
756
761
  ? AppColors_1.AppColors.brandPurple
757
762
  : AppColors_1.AppColors.grayTextWeak,
758
763
  }}>
759
- 📄 {frame.fileName}
764
+ {frame.fileName}
760
765
  </react_native_1.Text>
761
766
  </react_native_1.View>
767
+ </react_native_1.View>
762
768
 
763
769
  {/* Full path */}
764
770
  {frame.fullPath && frame.fullPath !== frame.fileName && (<react_native_1.Text selectable style={{