react-native-inapp-inspector 2.3.5 → 2.3.7

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 (226) hide show
  1. package/dist/commonjs/analytics.d.ts +0 -4
  2. package/dist/commonjs/analytics.js +0 -4
  3. package/dist/commonjs/bundle.d.ts +0 -4
  4. package/dist/commonjs/bundle.js +0 -4
  5. package/dist/commonjs/components/AnalyticsDetail.js +18 -27
  6. package/dist/commonjs/components/AnalyticsEventCard.js +9 -12
  7. package/dist/commonjs/components/AnalyticsGraph.js +10 -15
  8. package/dist/commonjs/components/AppHeaderLogo.js +0 -3
  9. package/dist/commonjs/components/BrandCircleIcon.js +15 -15
  10. package/dist/commonjs/components/BrandSquareIcon.js +20 -20
  11. package/dist/commonjs/components/CodeSnippet.js +6 -19
  12. package/dist/commonjs/components/ConsoleLogCard.js +0 -1
  13. package/dist/commonjs/components/CopyButton.js +0 -4
  14. package/dist/commonjs/components/DiffViewer.js +0 -2
  15. package/dist/commonjs/components/DomainHeader.js +0 -4
  16. package/dist/commonjs/components/EmptyState.js +0 -3
  17. package/dist/commonjs/components/ErrorBoundary.js +5 -10
  18. package/dist/commonjs/components/HeadersSection.js +0 -5
  19. package/dist/commonjs/components/HighlightText.js +1 -4
  20. package/dist/commonjs/components/Inspector/AnalyticsFilterModal.js +11 -26
  21. package/dist/commonjs/components/Inspector/AnalyticsTab.js +34 -40
  22. package/dist/commonjs/components/Inspector/BundleTab.js +56 -84
  23. package/dist/commonjs/components/Inspector/ConsoleTab.js +7 -7
  24. package/dist/commonjs/components/Inspector/CrashDetail.js +18 -20
  25. package/dist/commonjs/components/Inspector/CrashFilterModal.js +0 -1
  26. package/dist/commonjs/components/Inspector/CrashTab.js +11 -20
  27. package/dist/commonjs/components/Inspector/DeviceInfoTab.js +12 -24
  28. package/dist/commonjs/components/Inspector/FabLauncher.js +1 -1
  29. package/dist/commonjs/components/Inspector/InspectorContext.js +0 -2
  30. package/dist/commonjs/components/Inspector/InspectorHeader.js +7 -8
  31. package/dist/commonjs/components/Inspector/LogDetail.js +27 -29
  32. package/dist/commonjs/components/Inspector/MainScreen.js +9 -10
  33. package/dist/commonjs/components/Inspector/NetworkDetail.js +10 -11
  34. package/dist/commonjs/components/Inspector/NetworkTab.js +14 -14
  35. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +6 -9
  36. package/dist/commonjs/components/Inspector/PerformanceTab.js +30 -43
  37. package/dist/commonjs/components/Inspector/ReduxDetail.js +18 -34
  38. package/dist/commonjs/components/Inspector/ReduxTab.js +11 -20
  39. package/dist/commonjs/components/Inspector/SettingsPanel.js +32 -36
  40. package/dist/commonjs/components/Inspector/SkeletonPlaceholder.js +6 -6
  41. package/dist/commonjs/components/Inspector/StorageTab.js +14 -26
  42. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +5 -6
  43. package/dist/commonjs/components/JsonViewer.js +3 -10
  44. package/dist/commonjs/components/LogCard.js +7 -7
  45. package/dist/commonjs/components/MetaAccordion.js +1 -7
  46. package/dist/commonjs/components/NetworkIcons.js +12 -16
  47. package/dist/commonjs/components/SectionHeader.js +0 -4
  48. package/dist/commonjs/components/SkeletonPlaceholder.js +6 -6
  49. package/dist/commonjs/components/Slider.js +6 -6
  50. package/dist/commonjs/components/SourcePageCard.js +0 -4
  51. package/dist/commonjs/components/TreeNode.js +0 -4
  52. package/dist/commonjs/console.d.ts +0 -4
  53. package/dist/commonjs/console.js +0 -4
  54. package/dist/commonjs/constants/index.js +6 -9
  55. package/dist/commonjs/constants/telemetryConfig.d.ts +3 -0
  56. package/dist/commonjs/constants/telemetryConfig.js +6 -0
  57. package/dist/commonjs/constants/version.d.ts +1 -1
  58. package/dist/commonjs/constants/version.js +1 -3
  59. package/dist/commonjs/crash.d.ts +0 -4
  60. package/dist/commonjs/crash.js +0 -4
  61. package/dist/commonjs/customHooks/analyticsLogger.d.ts +0 -7
  62. package/dist/commonjs/customHooks/analyticsLogger.js +3 -59
  63. package/dist/commonjs/customHooks/bundleAnalyzer.d.ts +0 -9
  64. package/dist/commonjs/customHooks/bundleAnalyzer.js +3 -86
  65. package/dist/commonjs/customHooks/consoleLogger.js +0 -16
  66. package/dist/commonjs/customHooks/crashHandler.d.ts +0 -28
  67. package/dist/commonjs/customHooks/crashHandler.js +0 -55
  68. package/dist/commonjs/customHooks/logFilters.d.ts +0 -4
  69. package/dist/commonjs/customHooks/logFilters.js +0 -11
  70. package/dist/commonjs/customHooks/networkLogger.js +2 -13
  71. package/dist/commonjs/customHooks/performanceTracker.d.ts +0 -27
  72. package/dist/commonjs/customHooks/performanceTracker.js +0 -31
  73. package/dist/commonjs/customHooks/reduxLogger.d.ts +0 -12
  74. package/dist/commonjs/customHooks/reduxLogger.js +0 -51
  75. package/dist/commonjs/customHooks/storageInspector.d.ts +0 -40
  76. package/dist/commonjs/customHooks/storageInspector.js +1 -56
  77. package/dist/commonjs/decorators/index.d.ts +0 -37
  78. package/dist/commonjs/decorators/index.js +0 -42
  79. package/dist/commonjs/helpers/gaAnalyticsRegistry.d.ts +0 -10
  80. package/dist/commonjs/helpers/gaAnalyticsRegistry.js +0 -26
  81. package/dist/commonjs/helpers/index.d.ts +0 -7
  82. package/dist/commonjs/helpers/index.js +1 -42
  83. package/dist/commonjs/helpers/memoryManager.d.ts +0 -11
  84. package/dist/commonjs/helpers/memoryManager.js +0 -13
  85. package/dist/commonjs/helpers/searchQueryParser.d.ts +0 -4
  86. package/dist/commonjs/helpers/searchQueryParser.js +0 -18
  87. package/dist/commonjs/helpers/settingsStore.js +0 -8
  88. package/dist/commonjs/helpers/telemetry.d.ts +2 -0
  89. package/dist/commonjs/helpers/telemetry.js +136 -0
  90. package/dist/commonjs/i18n/index.d.ts +0 -9
  91. package/dist/commonjs/i18n/index.js +0 -15
  92. package/dist/commonjs/index.js +15 -97
  93. package/dist/commonjs/native/NativeInspector.d.ts +0 -54
  94. package/dist/commonjs/native/NativeInspector.js +0 -56
  95. package/dist/commonjs/network.d.ts +0 -4
  96. package/dist/commonjs/network.js +0 -4
  97. package/dist/commonjs/performance.d.ts +0 -4
  98. package/dist/commonjs/performance.js +0 -4
  99. package/dist/commonjs/redux.d.ts +0 -4
  100. package/dist/commonjs/redux.js +0 -4
  101. package/dist/commonjs/storage.d.ts +0 -4
  102. package/dist/commonjs/storage.js +0 -4
  103. package/dist/commonjs/styles/AppColors.d.ts +0 -3
  104. package/dist/commonjs/styles/AppColors.js +15 -30
  105. package/dist/commonjs/styles/AppFonts.d.ts +0 -4
  106. package/dist/commonjs/styles/AppFonts.js +0 -4
  107. package/dist/commonjs/styles/common.js +0 -11
  108. package/dist/commonjs/styles/index.js +0 -8
  109. package/dist/commonjs/types/enums.js +0 -3
  110. package/dist/commonjs/types/interfaces.d.ts +3 -3
  111. package/dist/esm/analytics.d.ts +0 -4
  112. package/dist/esm/analytics.js +0 -4
  113. package/dist/esm/bundle.d.ts +0 -4
  114. package/dist/esm/bundle.js +0 -4
  115. package/dist/esm/components/AnalyticsDetail.js +18 -27
  116. package/dist/esm/components/AnalyticsEventCard.js +9 -12
  117. package/dist/esm/components/AnalyticsGraph.js +10 -15
  118. package/dist/esm/components/AppHeaderLogo.js +0 -3
  119. package/dist/esm/components/BrandCircleIcon.js +15 -15
  120. package/dist/esm/components/BrandSquareIcon.js +20 -20
  121. package/dist/esm/components/CodeSnippet.js +6 -19
  122. package/dist/esm/components/ConsoleLogCard.js +0 -1
  123. package/dist/esm/components/CopyButton.js +0 -4
  124. package/dist/esm/components/DiffViewer.js +0 -2
  125. package/dist/esm/components/DomainHeader.js +0 -4
  126. package/dist/esm/components/EmptyState.js +0 -3
  127. package/dist/esm/components/ErrorBoundary.js +5 -10
  128. package/dist/esm/components/HeadersSection.js +0 -5
  129. package/dist/esm/components/HighlightText.js +1 -4
  130. package/dist/esm/components/Inspector/AnalyticsFilterModal.js +11 -26
  131. package/dist/esm/components/Inspector/AnalyticsTab.js +34 -40
  132. package/dist/esm/components/Inspector/BundleTab.js +56 -84
  133. package/dist/esm/components/Inspector/ConsoleTab.js +7 -7
  134. package/dist/esm/components/Inspector/CrashDetail.js +18 -20
  135. package/dist/esm/components/Inspector/CrashFilterModal.js +0 -1
  136. package/dist/esm/components/Inspector/CrashTab.js +11 -20
  137. package/dist/esm/components/Inspector/DeviceInfoTab.js +12 -24
  138. package/dist/esm/components/Inspector/FabLauncher.js +1 -1
  139. package/dist/esm/components/Inspector/InspectorContext.js +0 -2
  140. package/dist/esm/components/Inspector/InspectorHeader.js +7 -8
  141. package/dist/esm/components/Inspector/LogDetail.js +27 -29
  142. package/dist/esm/components/Inspector/MainScreen.js +9 -10
  143. package/dist/esm/components/Inspector/NetworkDetail.js +10 -11
  144. package/dist/esm/components/Inspector/NetworkTab.js +14 -14
  145. package/dist/esm/components/Inspector/NpmUpdateToast.js +6 -9
  146. package/dist/esm/components/Inspector/PerformanceTab.js +30 -43
  147. package/dist/esm/components/Inspector/ReduxDetail.js +18 -34
  148. package/dist/esm/components/Inspector/ReduxTab.js +11 -20
  149. package/dist/esm/components/Inspector/SettingsPanel.js +32 -36
  150. package/dist/esm/components/Inspector/SkeletonPlaceholder.js +6 -6
  151. package/dist/esm/components/Inspector/StorageTab.js +14 -26
  152. package/dist/esm/components/Inspector/UpdateAvailableModal.js +5 -6
  153. package/dist/esm/components/JsonViewer.js +3 -10
  154. package/dist/esm/components/LogCard.js +7 -7
  155. package/dist/esm/components/MetaAccordion.js +1 -7
  156. package/dist/esm/components/NetworkIcons.js +12 -16
  157. package/dist/esm/components/SectionHeader.js +0 -4
  158. package/dist/esm/components/SkeletonPlaceholder.js +6 -6
  159. package/dist/esm/components/Slider.js +6 -6
  160. package/dist/esm/components/SourcePageCard.js +0 -4
  161. package/dist/esm/components/TreeNode.js +0 -4
  162. package/dist/esm/console.d.ts +0 -4
  163. package/dist/esm/console.js +0 -4
  164. package/dist/esm/constants/index.js +6 -9
  165. package/dist/esm/constants/telemetryConfig.d.ts +3 -0
  166. package/dist/esm/constants/telemetryConfig.js +3 -0
  167. package/dist/esm/constants/version.d.ts +1 -1
  168. package/dist/esm/constants/version.js +1 -3
  169. package/dist/esm/crash.d.ts +0 -4
  170. package/dist/esm/crash.js +0 -4
  171. package/dist/esm/customHooks/analyticsLogger.d.ts +0 -7
  172. package/dist/esm/customHooks/analyticsLogger.js +3 -59
  173. package/dist/esm/customHooks/bundleAnalyzer.d.ts +0 -9
  174. package/dist/esm/customHooks/bundleAnalyzer.js +3 -86
  175. package/dist/esm/customHooks/consoleLogger.js +0 -16
  176. package/dist/esm/customHooks/crashHandler.d.ts +0 -28
  177. package/dist/esm/customHooks/crashHandler.js +0 -55
  178. package/dist/esm/customHooks/logFilters.d.ts +0 -4
  179. package/dist/esm/customHooks/logFilters.js +0 -11
  180. package/dist/esm/customHooks/networkLogger.js +2 -13
  181. package/dist/esm/customHooks/performanceTracker.d.ts +0 -27
  182. package/dist/esm/customHooks/performanceTracker.js +0 -31
  183. package/dist/esm/customHooks/reduxLogger.d.ts +0 -12
  184. package/dist/esm/customHooks/reduxLogger.js +0 -51
  185. package/dist/esm/customHooks/storageInspector.d.ts +0 -40
  186. package/dist/esm/customHooks/storageInspector.js +1 -56
  187. package/dist/esm/decorators/index.d.ts +0 -37
  188. package/dist/esm/decorators/index.js +0 -42
  189. package/dist/esm/helpers/gaAnalyticsRegistry.d.ts +0 -10
  190. package/dist/esm/helpers/gaAnalyticsRegistry.js +0 -26
  191. package/dist/esm/helpers/index.d.ts +0 -7
  192. package/dist/esm/helpers/index.js +1 -42
  193. package/dist/esm/helpers/memoryManager.d.ts +0 -11
  194. package/dist/esm/helpers/memoryManager.js +0 -13
  195. package/dist/esm/helpers/searchQueryParser.d.ts +0 -4
  196. package/dist/esm/helpers/searchQueryParser.js +0 -18
  197. package/dist/esm/helpers/settingsStore.js +0 -8
  198. package/dist/esm/helpers/telemetry.d.ts +2 -0
  199. package/dist/esm/helpers/telemetry.js +132 -0
  200. package/dist/esm/i18n/index.d.ts +0 -9
  201. package/dist/esm/i18n/index.js +0 -15
  202. package/dist/esm/index.js +15 -97
  203. package/dist/esm/native/NativeInspector.d.ts +0 -54
  204. package/dist/esm/native/NativeInspector.js +0 -56
  205. package/dist/esm/network.d.ts +0 -4
  206. package/dist/esm/network.js +0 -4
  207. package/dist/esm/performance.d.ts +0 -4
  208. package/dist/esm/performance.js +0 -4
  209. package/dist/esm/redux.d.ts +0 -4
  210. package/dist/esm/redux.js +0 -4
  211. package/dist/esm/storage.d.ts +0 -4
  212. package/dist/esm/storage.js +0 -4
  213. package/dist/esm/styles/AppColors.d.ts +0 -3
  214. package/dist/esm/styles/AppColors.js +15 -30
  215. package/dist/esm/styles/AppFonts.d.ts +0 -4
  216. package/dist/esm/styles/AppFonts.js +0 -4
  217. package/dist/esm/styles/common.js +0 -11
  218. package/dist/esm/styles/index.js +0 -8
  219. package/dist/esm/types/enums.js +0 -3
  220. package/dist/esm/types/interfaces.d.ts +3 -3
  221. package/package.json +2 -2
  222. package/src/constants/telemetryConfig.ts +6 -0
  223. package/src/constants/version.ts +1 -1
  224. package/src/helpers/telemetry.ts +161 -0
  225. package/src/index.tsx +15 -1
  226. package/src/types/interfaces.ts +3 -0
@@ -1,7 +1,3 @@
1
- /**
2
- * Sub-module entry point: react-native-inapp-inspector/analytics
3
- * Clean tree-shaking & isolated Firebase/custom Analytics logger.
4
- */
5
1
  export { setupAnalyticsLogger, autoSetupAnalyticsLogger, logAnalyticsEvent, subscribeAnalyticsEvents, clearAnalyticsEvents, getAnalyticsEvents, isAnalyticsConnected, isFirebaseAnalyticsPatched, setAnalyticsModuleEnabled, getAnalyticsModuleEnabled, getCurrentUserProperties, getCurrentUserId, getDefaultEventParameters, getCollectionEnabled, setMaxAnalyticsLogsLimit, getMaxAnalyticsLogsLimit, pruneAnalyticsLogs, } from './customHooks/analyticsLogger';
6
2
  export { getEventCategory, registerGAPlugin, type GAPlugin, } from './helpers/gaAnalyticsRegistry';
7
3
  export type { AnalyticsEvent, AnalyticsEventSource, GAEventCategory, } from './types';
@@ -1,10 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerGAPlugin = exports.getEventCategory = exports.pruneAnalyticsLogs = exports.getMaxAnalyticsLogsLimit = exports.setMaxAnalyticsLogsLimit = exports.getCollectionEnabled = exports.getDefaultEventParameters = exports.getCurrentUserId = exports.getCurrentUserProperties = exports.getAnalyticsModuleEnabled = exports.setAnalyticsModuleEnabled = exports.isFirebaseAnalyticsPatched = exports.isAnalyticsConnected = exports.getAnalyticsEvents = exports.clearAnalyticsEvents = exports.subscribeAnalyticsEvents = exports.logAnalyticsEvent = exports.autoSetupAnalyticsLogger = exports.setupAnalyticsLogger = void 0;
4
- /**
5
- * Sub-module entry point: react-native-inapp-inspector/analytics
6
- * Clean tree-shaking & isolated Firebase/custom Analytics logger.
7
- */
8
4
  var analyticsLogger_1 = require("./customHooks/analyticsLogger");
9
5
  Object.defineProperty(exports, "setupAnalyticsLogger", { enumerable: true, get: function () { return analyticsLogger_1.setupAnalyticsLogger; } });
10
6
  Object.defineProperty(exports, "autoSetupAnalyticsLogger", { enumerable: true, get: function () { return analyticsLogger_1.autoSetupAnalyticsLogger; } });
@@ -1,6 +1,2 @@
1
- /**
2
- * Sub-module entry point: react-native-inapp-inspector/bundle
3
- * Clean tree-shaking & isolated JS bundle size analyzer.
4
- */
5
1
  export { analyzeHostAppBundle, parseBundleSource, getInitialBundleAnalysis, getCachedBundleAnalysis, clearCachedBundleAnalysis, setBundleModuleEnabled, getBundleModuleEnabled, getHostScriptURL, trackRuntimeModuleExecution, trackRuntimeDefine, type HostBundleAnalysisResult, type HostBundleFileItem, type HostBundlePackageItem, type HostBinaryComponentItem, type FileTypeCategory, } from './customHooks/bundleAnalyzer';
6
2
  export { BundleSubTab, } from './types';
@@ -1,10 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BundleSubTab = exports.trackRuntimeDefine = exports.trackRuntimeModuleExecution = exports.getHostScriptURL = exports.getBundleModuleEnabled = exports.setBundleModuleEnabled = exports.clearCachedBundleAnalysis = exports.getCachedBundleAnalysis = exports.getInitialBundleAnalysis = exports.parseBundleSource = exports.analyzeHostAppBundle = void 0;
4
- /**
5
- * Sub-module entry point: react-native-inapp-inspector/bundle
6
- * Clean tree-shaking & isolated JS bundle size analyzer.
7
- */
8
4
  var bundleAnalyzer_1 = require("./customHooks/bundleAnalyzer");
9
5
  Object.defineProperty(exports, "analyzeHostAppBundle", { enumerable: true, get: function () { return bundleAnalyzer_1.analyzeHostAppBundle; } });
10
6
  Object.defineProperty(exports, "parseBundleSource", { enumerable: true, get: function () { return bundleAnalyzer_1.parseBundleSource; } });
@@ -38,13 +38,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  const react_1 = __importStar(require("react"));
40
40
  const react_native_1 = require("react-native");
41
- // Components
42
41
  const CopyButton_1 = __importDefault(require("./CopyButton"));
43
42
  const JsonViewer_1 = __importDefault(require("./JsonViewer"));
44
43
  const SegmentedTabs_1 = __importDefault(require("./SegmentedTabs"));
45
44
  const HighlightText_1 = __importDefault(require("./HighlightText"));
46
45
  const AnimatedEntrance_1 = __importDefault(require("./AnimatedEntrance"));
47
- // Helpers & Icons
48
46
  const AppFonts_1 = require("../styles/AppFonts");
49
47
  const AppColors_1 = require("../styles/AppColors");
50
48
  const helpers_1 = require("../helpers");
@@ -60,7 +58,6 @@ const AnalyticsDetail = ({ event, }) => {
60
58
  const paramKeys = (0, react_1.useMemo)(() => Object.keys(params), [params]);
61
59
  const userPropKeys = (0, react_1.useMemo)(() => Object.keys(userProperties), [userProperties]);
62
60
  const category = (0, react_1.useMemo)(() => (0, gaAnalyticsRegistry_1.getEventCategory)(event.name, params), [event.name, params]);
63
- // Combined full JSON payload
64
61
  const fullJsonData = (0, react_1.useMemo)(() => ({
65
62
  name: event.name,
66
63
  timestamp: event.timestamp,
@@ -73,7 +70,6 @@ const AnalyticsDetail = ({ event, }) => {
73
70
  params,
74
71
  ...(userPropKeys.length > 0 ? { userProperties } : {}),
75
72
  }), [event, params, userPropKeys.length, userProperties]);
76
- // E-commerce revenue calculation
77
73
  const revenueInfo = (0, react_1.useMemo)(() => {
78
74
  const val = params.value ?? params.price;
79
75
  const currency = params.currency ?? 'USD';
@@ -85,14 +81,12 @@ const AnalyticsDetail = ({ event, }) => {
85
81
  }
86
82
  return null;
87
83
  }, [params]);
88
- // Items count if an items array exists
89
84
  const itemsCount = (0, react_1.useMemo)(() => {
90
85
  if (Array.isArray(params.items)) {
91
86
  return params.items.length;
92
87
  }
93
88
  return null;
94
89
  }, [params.items]);
95
- // Screen Context
96
90
  const screenContext = (0, react_1.useMemo)(() => {
97
91
  return (event.screenName ||
98
92
  params.firebase_screen ||
@@ -101,7 +95,6 @@ const AnalyticsDetail = ({ event, }) => {
101
95
  event.screenClass ||
102
96
  params.firebase_screen_class);
103
97
  }, [event.screenName, event.screenClass, params]);
104
- // Filtered parameter entries
105
98
  const filteredParamEntries = (0, react_1.useMemo)(() => {
106
99
  const entries = Object.entries(params);
107
100
  if (!paramSearch.trim())
@@ -112,7 +105,6 @@ const AnalyticsDetail = ({ event, }) => {
112
105
  return k.toLowerCase().includes(q) || valStr.toLowerCase().includes(q);
113
106
  });
114
107
  }, [params, paramSearch]);
115
- // Category Theme Meta
116
108
  const catMeta = (0, react_1.useMemo)(() => {
117
109
  switch (category) {
118
110
  case 'ecommerce':
@@ -168,12 +160,12 @@ const AnalyticsDetail = ({ event, }) => {
168
160
  ];
169
161
  return (<react_native_1.ScrollView style={detailStyles.scroll} contentContainerStyle={detailStyles.content} showsVerticalScrollIndicator contentInsetAdjustmentBehavior="never" automaticallyAdjustContentInsets={false}>
170
162
 
171
- {/* ── 1. Hero Event Header Card ────────────────────────────────────── */}
163
+
172
164
  <react_native_1.View style={detailStyles.heroCard}>
173
- {/* Top Badges Row */}
165
+
174
166
  <react_native_1.View style={detailStyles.heroTopRow}>
175
167
  <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6, flexWrap: 'wrap', flex: 1 }}>
176
- {/* Source Badge */}
168
+
177
169
  <react_native_1.View style={[
178
170
  detailStyles.sourceBadge,
179
171
  event.source === 'firebase'
@@ -200,7 +192,7 @@ const AnalyticsDetail = ({ event, }) => {
200
192
  </react_native_1.Text>
201
193
  </react_native_1.View>
202
194
 
203
- {/* Category Badge */}
195
+
204
196
  <react_native_1.View style={[
205
197
  detailStyles.catBadge,
206
198
  { backgroundColor: catMeta.bg, borderColor: catMeta.border },
@@ -212,18 +204,18 @@ const AnalyticsDetail = ({ event, }) => {
212
204
  </react_native_1.View>
213
205
  </react_native_1.View>
214
206
 
215
- {/* Copy Full Event JSON Button */}
207
+
216
208
  <CopyButton_1.default value={JSON.stringify(fullJsonData, null, 2)} label={t('analytics.eventDetails')}/>
217
209
  </react_native_1.View>
218
210
 
219
- {/* Event Name Heading */}
211
+
220
212
  <react_native_1.View style={detailStyles.titleRow}>
221
213
  <react_native_1.Text style={detailStyles.eventTitle} selectable numberOfLines={2}>
222
214
  {event.name}
223
215
  </react_native_1.Text>
224
216
  </react_native_1.View>
225
217
 
226
- {/* Sub Details Row: Timestamp & Screen Location */}
218
+
227
219
  <react_native_1.View style={detailStyles.metaRow}>
228
220
  <react_native_1.View style={detailStyles.timePill}>
229
221
  <NetworkIcons_1.ClockIcon color={AppColors_1.AppColors.purple} size={11}/>
@@ -240,7 +232,7 @@ const AnalyticsDetail = ({ event, }) => {
240
232
  </react_native_1.View>)}
241
233
  </react_native_1.View>
242
234
 
243
- {/* ── 2. Metric Pills Summary ──────────────────────────────────────── */}
235
+
244
236
  <react_native_1.View style={detailStyles.metricsBar}>
245
237
  <react_native_1.View style={detailStyles.metricPill}>
246
238
  <react_native_1.Text style={detailStyles.metricLabel}>Params:</react_native_1.Text>
@@ -273,14 +265,14 @@ const AnalyticsDetail = ({ event, }) => {
273
265
  </react_native_1.View>
274
266
  </react_native_1.View>
275
267
 
276
- {/* ── 3. View Switcher Tabs (Overview, Tree, Raw) ───────────────────── */}
268
+
277
269
  <react_native_1.View style={detailStyles.tabsWrap}>
278
270
  <SegmentedTabs_1.default tabs={viewTabs} activeKey={activeViewTab} onChange={key => setActiveViewTab(key)}/>
279
271
  </react_native_1.View>
280
272
 
281
- {/* ── 4. Main Tab Body Content ───────────────────────────────────────── */}
273
+
282
274
  {activeViewTab === 'overview' && (<react_native_1.View style={detailStyles.tabContent}>
283
- {/* Metadata Card (Session, User ID, Client ID) */}
275
+
284
276
  {(event.userId || event.sessionId || event.trackingId) && (<react_native_1.View style={detailStyles.sectionCard}>
285
277
  <react_native_1.View style={detailStyles.sectionHeader}>
286
278
  <NetworkIcons_1.LayersIcon color={AppColors_1.AppColors.purple} size={12}/>
@@ -302,7 +294,7 @@ const AnalyticsDetail = ({ event, }) => {
302
294
  </react_native_1.View>
303
295
  </react_native_1.View>)}
304
296
 
305
- {/* Parameters Table Section */}
297
+
306
298
  <react_native_1.View style={detailStyles.sectionCard}>
307
299
  <react_native_1.View style={detailStyles.sectionHeaderBetween}>
308
300
  <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}>
@@ -316,7 +308,7 @@ const AnalyticsDetail = ({ event, }) => {
316
308
  </react_native_1.Text>
317
309
  </react_native_1.View>
318
310
 
319
- {/* Search filter within parameters (if > 4 params) */}
311
+
320
312
  {paramKeys.length > 4 && (<react_native_1.View style={detailStyles.searchBar}>
321
313
  <NetworkIcons_1.SearchIcon color={AppColors_1.AppColors.grayTextWeak} size={13}/>
322
314
  <react_native_1.TextInput placeholder="Filter parameters by key or value..." placeholderTextColor={AppColors_1.AppColors.grayTextWeak} value={paramSearch} onChangeText={setParamSearch} style={detailStyles.searchInput} autoCorrect={false} autoCapitalize="none"/>
@@ -346,7 +338,6 @@ const AnalyticsDetail = ({ event, }) => {
346
338
  else if (isObject)
347
339
  typeStr = 'object';
348
340
  const valString = isObject ? JSON.stringify(val, null, 2) : String(val);
349
- // Highlight standard GA4 ecom/screen keys
350
341
  const isKeyHighlighted = key === 'value' ||
351
342
  key === 'price' ||
352
343
  key === 'currency' ||
@@ -355,7 +346,7 @@ const AnalyticsDetail = ({ event, }) => {
355
346
  key === 'item_name';
356
347
  return (<AnimatedEntrance_1.default key={key} index={pIdx} distance={4}>
357
348
  <react_native_1.View style={detailStyles.paramCard}>
358
- {/* Param Top Row: Key + Type + Copy */}
349
+
359
350
  <react_native_1.View style={detailStyles.paramCardHeader}>
360
351
  <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 6, flex: 1, minWidth: 0 }}>
361
352
  <HighlightText_1.default text={key} search={paramSearch} style={[
@@ -372,7 +363,7 @@ const AnalyticsDetail = ({ event, }) => {
372
363
  <CopyButton_1.default value={valString} label={key}/>
373
364
  </react_native_1.View>
374
365
 
375
- {/* Param Value Display */}
366
+
376
367
  <react_native_1.View style={detailStyles.paramValBox}>
377
368
  {isObject ? (<JsonViewer_1.default data={val} search={paramSearch} hideTabs wrap/>) : (<HighlightText_1.default text={valString} search={paramSearch} style={detailStyles.paramValText} highlightStyle={detailStyles.highlight} selectable/>)}
378
369
  </react_native_1.View>
@@ -382,7 +373,7 @@ const AnalyticsDetail = ({ event, }) => {
382
373
  </react_native_1.View>)}
383
374
  </react_native_1.View>
384
375
 
385
- {/* User Properties Section (if any) */}
376
+
386
377
  {userPropKeys.length > 0 && (<react_native_1.View style={detailStyles.sectionCard}>
387
378
  <react_native_1.View style={detailStyles.sectionHeader}>
388
379
  <NetworkIcons_1.SparkleIcon color={AppColors_1.AppColors.purple} size={12}/>
@@ -401,12 +392,12 @@ const AnalyticsDetail = ({ event, }) => {
401
392
  </react_native_1.View>)}
402
393
  </react_native_1.View>)}
403
394
 
404
- {/* ── JSON Tree View ────────────────────────────────────────────────── */}
395
+
405
396
  {activeViewTab === 'tree' && (<react_native_1.View style={detailStyles.jsonContainer}>
406
397
  <JsonViewer_1.default data={fullJsonData} defaultExpandDepth={1} mode="pretty" fullHeight/>
407
398
  </react_native_1.View>)}
408
399
 
409
- {/* ── Raw Payload View ──────────────────────────────────────────────── */}
400
+
410
401
  {activeViewTab === 'raw' && (<react_native_1.View style={detailStyles.jsonContainer}>
411
402
  <JsonViewer_1.default data={fullJsonData} mode="raw" fullHeight/>
412
403
  </react_native_1.View>)}
@@ -45,7 +45,6 @@ const i18n_1 = require("../i18n");
45
45
  const HighlightText_1 = __importDefault(require("./HighlightText"));
46
46
  const TouchableScale_1 = __importDefault(require("./TouchableScale"));
47
47
  const NetworkIcons_1 = require("./NetworkIcons");
48
- // ─── Component ────────────────────────────────────────────────────────────────
49
48
  const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ event, onPress, isNew = false, searchStr = '', msSincePrev, computedScreenName, }) {
50
49
  const { t } = (0, i18n_1.useTranslation)();
51
50
  const color = (0, helpers_1.getEventColor)(event.name);
@@ -55,7 +54,6 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
55
54
  : 0;
56
55
  const catKey = (0, helpers_1.getEventCategory)(event.name);
57
56
  const tagColors = (0, helpers_1.getCategoryColors)(catKey);
58
- // Flash animation for newly logged events
59
57
  const flashOpacity = (0, react_1.useRef)(new react_native_1.Animated.Value(isNew ? 1 : 0)).current;
60
58
  (0, react_1.useEffect)(() => {
61
59
  if (isNew) {
@@ -75,7 +73,7 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
75
73
  ? t('analytics.systemCategory')
76
74
  : t('analytics.customCategory');
77
75
  return (<react_native_1.View style={cardStyles.container}>
78
- {/* ── Gap Indicator ─────────────────────────────────────────────────── */}
76
+
79
77
  {showGap && (<react_native_1.View style={cardStyles.gapContainer}>
80
78
  <react_native_1.View style={cardStyles.gapLine}/>
81
79
  <react_native_1.Text style={[cardStyles.gapText, { color: AppColors_1.AppColors.grayTextWeak }]}>
@@ -84,7 +82,7 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
84
82
  <react_native_1.View style={cardStyles.gapLine}/>
85
83
  </react_native_1.View>)}
86
84
 
87
- {/* ── Main Card ─────────────────────────────────────────────────────── */}
85
+
88
86
  <TouchableScale_1.default onPress={onPress} style={[
89
87
  cardStyles.modernCard,
90
88
  {
@@ -103,10 +101,10 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
103
101
  },
104
102
  ]}/>
105
103
 
106
- {/* Top Row: Icon Badge, Event Name, Category Badge & Timestamp */}
104
+
107
105
  <react_native_1.View style={cardStyles.cardHeader}>
108
106
  <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 7, flex: 1 }}>
109
- {/* Category Icon Badge */}
107
+
110
108
  <react_native_1.View style={[
111
109
  cardStyles.iconBadge,
112
110
  { backgroundColor: tagColors.bg, borderColor: tagColors.border },
@@ -114,10 +112,10 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
114
112
  {catKey === 'ecommerce' ? (<NetworkIcons_1.CartIcon color={tagColors.text} size={12}/>) : catKey === 'page_view' ? (<NetworkIcons_1.GlobeIcon color={tagColors.text} size={12}/>) : catKey === 'system' ? (<NetworkIcons_1.BoltIcon color={tagColors.text} size={12}/>) : (<NetworkIcons_1.SparkleIcon color={tagColors.text} size={12}/>)}
115
113
  </react_native_1.View>
116
114
 
117
- {/* Event Name */}
115
+
118
116
  <HighlightText_1.default text={event.name} search={searchStr} style={[cardStyles.eventName, { color: AppColors_1.AppColors.primaryBlack }]} highlightStyle={cardStyles.highlight} numberOfLines={1}/>
119
117
 
120
- {/* Category Pill Tag */}
118
+
121
119
  <react_native_1.View style={[
122
120
  cardStyles.categoryBadge,
123
121
  { backgroundColor: tagColors.bg, borderColor: tagColors.border },
@@ -127,7 +125,7 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
127
125
  </react_native_1.Text>
128
126
  </react_native_1.View>
129
127
 
130
- {/* Duplicate Multiplier */}
128
+
131
129
  {event.count !== undefined && event.count > 0 ? (<react_native_1.View style={[
132
130
  cardStyles.duplicateBadge,
133
131
  event.count === 1 && {
@@ -144,7 +142,7 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
144
142
  </react_native_1.View>) : null}
145
143
  </react_native_1.View>
146
144
 
147
- {/* Timestamp */}
145
+
148
146
  <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center', gap: 3 }}>
149
147
  <NetworkIcons_1.ClockIcon color={AppColors_1.AppColors.grayTextWeak} size={10}/>
150
148
  <react_native_1.Text style={[cardStyles.timestamp, { color: AppColors_1.AppColors.grayTextWeak }]}>
@@ -153,7 +151,7 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
153
151
  </react_native_1.View>
154
152
  </react_native_1.View>
155
153
 
156
- {/* Bottom Row: Metadata Chips (Screen, Params, Value) */}
154
+
157
155
  <react_native_1.View style={cardStyles.cardBody}>
158
156
  <react_native_1.View style={cardStyles.chipsRow}>
159
157
  {(() => {
@@ -268,7 +266,6 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
268
266
  </TouchableScale_1.default>
269
267
  </react_native_1.View>);
270
268
  });
271
- // ─── Styles ───────────────────────────────────────────────────────────────────
272
269
  const cardStyles = react_native_1.StyleSheet.create({
273
270
  container: {
274
271
  paddingHorizontal: 10,
@@ -45,10 +45,8 @@ const BAR_HEIGHT = 24;
45
45
  const PADDING_Y = 12;
46
46
  const AnalyticsGraph = ({ event, accentColor }) => {
47
47
  const params = event.params || {};
48
- // 1. Check for E-commerce items array
49
48
  const itemsArray = Array.isArray(params.items) ? params.items : null;
50
49
  const filteredItems = itemsArray?.filter((item) => typeof item.price === 'number') || [];
51
- // 2. Discover root-level numeric fields (exclude ids)
52
50
  const rootNumericKeys = [];
53
51
  Object.entries(params).forEach(([k, v]) => {
54
52
  if (typeof v === 'number' &&
@@ -57,7 +55,6 @@ const AnalyticsGraph = ({ event, accentColor }) => {
57
55
  rootNumericKeys.push({ key: k, value: v });
58
56
  }
59
57
  });
60
- // 3. Discover dates (YYYY-MM-DD format commonly used in booking/flights)
61
58
  const dateKeys = [];
62
59
  Object.entries(params).forEach(([k, v]) => {
63
60
  if (typeof v === 'string' &&
@@ -69,7 +66,6 @@ const AnalyticsGraph = ({ event, accentColor }) => {
69
66
  }
70
67
  }
71
68
  });
72
- // 4. Calculate parameter types
73
69
  const paramTypes = { string: 0, number: 0, boolean: 0, object: 0 };
74
70
  const strings = [];
75
71
  Object.entries(params).forEach(([k, v]) => {
@@ -91,7 +87,7 @@ const AnalyticsGraph = ({ event, accentColor }) => {
91
87
  const typeData = [
92
88
  { label: 'Strings', value: paramTypes.string, color: AppColors_1.AppColors.purple },
93
89
  { label: 'Numbers', value: paramTypes.number, color: AppColors_1.AppColors.skyBlue },
94
- { label: 'Booleans', value: paramTypes.boolean, color: AppColors_1.AppColors.amber500 }, // Amber
90
+ { label: 'Booleans', value: paramTypes.boolean, color: AppColors_1.AppColors.amber500 },
95
91
  { label: 'Objects', value: paramTypes.object, color: AppColors_1.AppColors.greenColor },
96
92
  ].filter(d => d.value > 0);
97
93
  strings.sort((a, b) => b.value - a.value);
@@ -101,8 +97,8 @@ const AnalyticsGraph = ({ event, accentColor }) => {
101
97
  const hasDatesChart = dateKeys.length > 0;
102
98
  const hasStringsChart = topStrings.length > 0;
103
99
  const hasTypeData = typeData.length > 0;
104
- const screenWidth = react_native_1.Dimensions.get('window').width - 60; // Padding adjustments
105
- const rightMargin = 40; // Space for labels at the end of the bar
100
+ const screenWidth = react_native_1.Dimensions.get('window').width - 60;
101
+ const rightMargin = 40;
106
102
  const maxBarWidth = screenWidth - rightMargin;
107
103
  return (<react_native_1.View style={graphStyles.container}>
108
104
  <react_native_1.Text style={graphStyles.headerTitle}>Data Visualization</react_native_1.Text>
@@ -136,7 +132,6 @@ const AnalyticsGraph = ({ event, accentColor }) => {
136
132
  </react_native_1.View>)}
137
133
  </react_native_1.View>);
138
134
  };
139
- // --- Donut Chart Helpers ---
140
135
  const polarToCartesian = (centerX, centerY, radius, angleInDegrees) => {
141
136
  const angleInRadians = ((angleInDegrees - 90) * Math.PI) / 180.0;
142
137
  return {
@@ -221,7 +216,7 @@ const GaugeChart = ({ data, accentColor, }) => {
221
216
  }}>
222
217
  {data.map(d => {
223
218
  const fillPct = Math.min(Math.abs(d.value) / maxVal, 1);
224
- const strokeDashoffset = Math.max(circumference - fillPct * circumference, 0.001); // avoid exact 0
219
+ const strokeDashoffset = Math.max(circumference - fillPct * circumference, 0.001);
225
220
  return (<react_native_1.View key={d.label} style={{ alignItems: 'center', width: 70 }}>
226
221
  <react_native_svg_1.default width="60" height="60" viewBox="0 0 60 60">
227
222
  <react_native_svg_1.Circle cx="30" cy="30" r={radius} stroke={AppColors_1.AppColors.grayBorderSecondary} strokeWidth={stroke} fill="none"/>
@@ -297,7 +292,7 @@ const CalendarChart = ({ data, accentColor, }) => {
297
292
  shadowOffset: { width: 0, height: 2 },
298
293
  elevation: 2,
299
294
  }}>
300
- {/* Calendar Header with Accent Color */}
295
+
301
296
  <react_native_1.View style={{
302
297
  backgroundColor: accentColor,
303
298
  height: 18,
@@ -314,7 +309,7 @@ const CalendarChart = ({ data, accentColor, }) => {
314
309
  {monthText} {yearText}
315
310
  </react_native_1.Text>
316
311
  </react_native_1.View>
317
- {/* Calendar Body */}
312
+
318
313
  <react_native_1.View style={{
319
314
  flex: 1,
320
315
  justifyContent: 'center',
@@ -359,18 +354,18 @@ const BarChart = ({ data, accentColor, maxBarWidth, isGradient = false, }) => {
359
354
  const y = i * (BAR_HEIGHT + PADDING_Y);
360
355
  const barWidth = Math.max((d.value / maxVal) * maxBarWidth, 2);
361
356
  return (<react_1.default.Fragment key={d.label}>
362
- {/* Label above bar */}
357
+
363
358
  <react_native_svg_1.Text x={0} y={y + 12} fill={AppColors_1.AppColors.grayTextStrong} fontSize="11" fontFamily={AppFonts_1.AppFonts.interMedium}>
364
359
  {d.label}
365
360
  </react_native_svg_1.Text>
366
361
 
367
- {/* Background trace line */}
362
+
368
363
  <react_native_svg_1.Line x1={0} y1={y + 24} x2={maxBarWidth} y2={y + 24} stroke={AppColors_1.AppColors.grayBorderSecondary} strokeDasharray="4"/>
369
364
 
370
- {/* The actual Bar */}
365
+
371
366
  <react_native_svg_1.Rect x={0} y={y + 16} width={barWidth} height={14} fill={isGradient ? 'url(#barGrad)' : accentColor} rx={4} opacity={0.85}/>
372
367
 
373
- {/* Value Text at the end of the bar */}
368
+
374
369
  <react_native_svg_1.Text x={barWidth + 6} y={y + 26} fill={AppColors_1.AppColors.primaryBlack} fontSize="11" fontFamily={AppFonts_1.AppFonts.interBold}>
375
370
  {d.value}
376
371
  </react_native_svg_1.Text>
@@ -42,7 +42,6 @@ const react_native_1 = require("react-native");
42
42
  const BrandSquareIcon_1 = __importDefault(require("./BrandSquareIcon"));
43
43
  const AppHeaderLogo = ({ size = 46, customIcon, }) => {
44
44
  const [loadError, setLoadError] = (0, react_1.useState)(false);
45
- // 1. If customIcon is explicitly provided, render it directly edge-to-edge
46
45
  if (customIcon) {
47
46
  if (react_1.default.isValidElement(customIcon)) {
48
47
  const clonedIcon = react_1.default.cloneElement(customIcon, {
@@ -72,7 +71,6 @@ const AppHeaderLogo = ({ size = 46, customIcon, }) => {
72
71
  <react_native_1.Image source={customIcon} style={logoStyles.image} resizeMode="cover"/>
73
72
  </react_native_1.View>);
74
73
  }
75
- // 2. Dynamically query installed native app icon (AppIcon on iOS, ic_launcher on Android)
76
74
  if (!loadError && react_native_1.Platform.OS !== 'web') {
77
75
  const nativeSource = react_native_1.Platform.select({
78
76
  ios: { uri: 'AppIcon' },
@@ -90,7 +88,6 @@ const AppHeaderLogo = ({ size = 46, customIcon, }) => {
90
88
  <react_native_1.Image source={nativeSource} style={logoStyles.image} resizeMode="cover" onError={() => setLoadError(true)}/>
91
89
  </react_native_1.View>);
92
90
  }
93
- // 3. Fallback: Inspector's Signature Owl Brand Logo
94
91
  return (<react_native_1.View style={[
95
92
  logoStyles.svgContainer,
96
93
  {
@@ -98,18 +98,18 @@ const BrandCircleIcon = ({ size = 56 }) => {
98
98
  <react_native_svg_1.Circle cx="128" cy="128" r="121.4" fill="none" stroke="url(#edge)" strokeOpacity={0.7} strokeWidth={1.4}/>
99
99
  <react_native_svg_1.Circle cx="128" cy="128" r="100" fill="url(#halo)"/>
100
100
  <react_native_svg_1.G transform="translate(128 132) scale(1.05) translate(-128 -134)">
101
- {/* wing 1 */}
101
+
102
102
  <react_native_svg_1.Path d="M74 124 C58 154 60 190 86 204 C79 176 77 148 88 126 Z" fill="url(#wing)" stroke="url(#beam)" strokeWidth={2.5} strokeOpacity={0.45}/>
103
- {/* wing 2 */}
103
+
104
104
  <react_native_svg_1.Path d="M182 124 C198 154 196 190 170 204 C177 176 179 148 168 126 Z" fill="url(#wing)" stroke="url(#beam)" strokeWidth={2.5} strokeOpacity={0.45}/>
105
- {/* body */}
105
+
106
106
  <react_native_svg_1.Path d="M62 150 C58 104 70 70 90 58 L98 42 L116 62 Q128 57 140 62 L158 42 L166 58 C186 70 198 104 194 150 C198 180 184 204 152 212 C140 216 116 216 104 212 C72 204 58 180 62 150 Z" fill="url(#owlbody)" stroke="url(#beam)" strokeWidth={4} strokeLinejoin="round"/>
107
107
 
108
- {/* inner-ear shadows */}
108
+
109
109
  <react_native_svg_1.Path d="M99 48 L114 62 L104 63 L98 55 Z" fill="#080F22" opacity={0.5}/>
110
110
  <react_native_svg_1.Path d="M157 48 L142 62 L152 63 L158 55 Z" fill="#080F22" opacity={0.5}/>
111
111
 
112
- {/* wing feather lines */}
112
+
113
113
  <react_native_svg_1.G stroke="#22325A" strokeWidth={2.2} fill="none" strokeLinecap="round" opacity={0.75}>
114
114
  <react_native_svg_1.Path d="M80 138 q-5 26 3 50"/>
115
115
  <react_native_svg_1.Path d="M90 134 q-4 26 3 48"/>
@@ -117,10 +117,10 @@ const BrandCircleIcon = ({ size = 56 }) => {
117
117
  <react_native_svg_1.Path d="M166 134 q4 26 -3 48"/>
118
118
  </react_native_svg_1.G>
119
119
 
120
- {/* belly plate */}
120
+
121
121
  <react_native_svg_1.Path d="M128 126 C151 126 164 148 162 174 C160 198 146 212 128 212 C110 212 96 198 94 174 C92 148 105 126 128 126 Z" fill="url(#belly)"/>
122
122
 
123
- {/* belly feather scallops */}
123
+
124
124
  <react_native_svg_1.G stroke="#3E588C" strokeWidth={2.3} fill="none" strokeLinecap="round" opacity={0.4}>
125
125
  <react_native_svg_1.Path d="M110 154 Q118 162 126 154"/>
126
126
  <react_native_svg_1.Path d="M126 154 Q134 162 142 154"/>
@@ -131,7 +131,7 @@ const BrandCircleIcon = ({ size = 56 }) => {
131
131
  <react_native_svg_1.Path d="M128 190 Q136 198 144 190"/>
132
132
  </react_native_svg_1.G>
133
133
 
134
- {/* developer chest screen + code emblem */}
134
+
135
135
  <react_native_svg_1.Rect x={107} y={161} width={42} height={32} rx={9} fill="#0C1426" stroke="url(#beam)" strokeWidth={2} strokeOpacity={0.7}/>
136
136
  <react_native_svg_1.G stroke="#8FD0EC" strokeWidth={3} strokeLinecap="round" strokeLinejoin="round" fill="none">
137
137
  <react_native_svg_1.Path d="M122 170 L115 177 L122 184"/>
@@ -139,27 +139,27 @@ const BrandCircleIcon = ({ size = 56 }) => {
139
139
  <react_native_svg_1.Path d="M130 168 L126 186"/>
140
140
  </react_native_svg_1.G>
141
141
 
142
- {/* facial disc */}
142
+
143
143
  <react_native_svg_1.Path d="M128 92 C148 70 186 78 186 108 C186 134 160 152 128 152 C96 152 70 134 70 108 C70 78 108 70 128 92 Z" fill="url(#faceplate)" stroke="#52709E" strokeWidth={2.6} strokeOpacity={0.7}/>
144
- {/* facial-disc centre ridge */}
144
+
145
145
  <react_native_svg_1.Path d="M128 96 L128 120" stroke="#52709E" strokeWidth={2} strokeLinecap="round" strokeOpacity={0.45}/>
146
146
 
147
- {/* feet */}
147
+
148
148
  <react_native_svg_1.G stroke="url(#beak)" strokeWidth={5} strokeLinecap="round" fill="none">
149
149
  <react_native_svg_1.Path d="M111 209 L105 224 M111 209 L111 226 M111 209 L117 224"/>
150
150
  <react_native_svg_1.Path d="M145 209 L139 224 M145 209 L145 226 M145 209 L151 224"/>
151
151
  </react_native_svg_1.G>
152
152
 
153
- {/* normal eye: big cute yellow iris, dark pupil, sparkles */}
153
+
154
154
  <react_native_svg_1.Circle cx={153} cy={107} r={17} fill="url(#iris)" stroke="#1A1205" strokeWidth={2.2}/>
155
155
  <react_native_svg_1.Circle cx={153} cy={108} r={8.2} fill="#0A0E18"/>
156
156
  <react_native_svg_1.Circle cx={156.2} cy={104} r={3.1} fill="#ffffff" opacity={0.95}/>
157
157
  <react_native_svg_1.Circle cx={149.6} cy={111} r={1.6} fill="#ffffff" opacity={0.7}/>
158
158
 
159
- {/* beak */}
159
+
160
160
  <react_native_svg_1.Path d="M123.5 123 Q128 121 132.5 123 Q131 132 128 134.5 Q125 132 123.5 123 Z" fill="url(#beak)"/>
161
161
 
162
- {/* magnifier held to the big (debug) eye */}
162
+
163
163
  <react_native_svg_1.Circle cx={95} cy={103} r={20} fill="url(#iris)" stroke="#1A1205" strokeWidth={2.6}/>
164
164
  <react_native_svg_1.Circle cx={95} cy={104} r={10} fill="#0A0E18"/>
165
165
  <react_native_svg_1.Circle cx={98.6} cy={100} r={3.4} fill="#ffffff" opacity={0.95}/>
@@ -170,7 +170,7 @@ const BrandCircleIcon = ({ size = 56 }) => {
170
170
  <react_native_svg_1.Line x1={75} y1={123} x2={54} y2={147} stroke="url(#beam)" strokeWidth={8.5} strokeLinecap="round"/>
171
171
  <react_native_svg_1.Circle cx={95} cy={103} r={28} fill="none" stroke="url(#beam)" strokeWidth={7}/>
172
172
 
173
- {/* rosy cheeks */}
173
+
174
174
  <react_native_svg_1.Ellipse cx={83} cy={127} rx={9} ry={6} fill="url(#blush)"/>
175
175
  <react_native_svg_1.Ellipse cx={167} cy={122} rx={9} ry={6} fill="url(#blush)"/>
176
176
  </react_native_svg_1.G>