react-native-inapp-inspector 1.0.8 → 1.0.10

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 (52) hide show
  1. package/README.md +5 -6
  2. package/assets/social_preview.png +0 -0
  3. package/dist/commonjs/components/AnalyticsDetail.js +28 -23
  4. package/dist/commonjs/components/AnalyticsEventCard.js +9 -9
  5. package/dist/commonjs/components/BrandCircleIcon.d.ts +5 -0
  6. package/dist/commonjs/components/BrandCircleIcon.js +180 -0
  7. package/dist/commonjs/components/BrandSquareIcon.d.ts +5 -0
  8. package/dist/commonjs/components/BrandSquareIcon.js +180 -0
  9. package/dist/commonjs/components/CodeSnippet.js +32 -24
  10. package/dist/commonjs/components/ConsoleLogCard.js +127 -70
  11. package/dist/commonjs/components/JsonViewer.d.ts +2 -1
  12. package/dist/commonjs/components/JsonViewer.js +2 -2
  13. package/dist/commonjs/components/MetaAccordion.d.ts +1 -1
  14. package/dist/commonjs/components/MetaAccordion.js +45 -2
  15. package/dist/commonjs/components/NetworkIcons.d.ts +8 -0
  16. package/dist/commonjs/components/NetworkIcons.js +44 -1
  17. package/dist/commonjs/components/ReduxTreeView.d.ts +6 -0
  18. package/dist/commonjs/components/ReduxTreeView.js +403 -0
  19. package/dist/commonjs/components/TouchableScale.js +15 -1
  20. package/dist/commonjs/components/TreeNode.js +3 -3
  21. package/dist/commonjs/customHooks/reduxLogger.d.ts +4 -0
  22. package/dist/commonjs/customHooks/reduxLogger.js +48 -2
  23. package/dist/commonjs/index.js +1520 -506
  24. package/dist/commonjs/styles/index.d.ts +11 -1
  25. package/dist/commonjs/styles/index.js +19 -9
  26. package/dist/commonjs/types/index.d.ts +4 -0
  27. package/dist/esm/components/AnalyticsDetail.js +28 -23
  28. package/dist/esm/components/AnalyticsEventCard.js +9 -9
  29. package/dist/esm/components/BrandCircleIcon.d.ts +5 -0
  30. package/dist/esm/components/BrandCircleIcon.js +140 -0
  31. package/dist/esm/components/BrandSquareIcon.d.ts +5 -0
  32. package/dist/esm/components/BrandSquareIcon.js +140 -0
  33. package/dist/esm/components/CodeSnippet.js +32 -24
  34. package/dist/esm/components/ConsoleLogCard.js +127 -70
  35. package/dist/esm/components/JsonViewer.d.ts +2 -1
  36. package/dist/esm/components/JsonViewer.js +2 -2
  37. package/dist/esm/components/MetaAccordion.d.ts +1 -1
  38. package/dist/esm/components/MetaAccordion.js +46 -3
  39. package/dist/esm/components/NetworkIcons.d.ts +8 -0
  40. package/dist/esm/components/NetworkIcons.js +35 -0
  41. package/dist/esm/components/ReduxTreeView.d.ts +6 -0
  42. package/dist/esm/components/ReduxTreeView.js +366 -0
  43. package/dist/esm/components/TouchableScale.js +16 -2
  44. package/dist/esm/components/TreeNode.js +3 -3
  45. package/dist/esm/customHooks/reduxLogger.d.ts +4 -0
  46. package/dist/esm/customHooks/reduxLogger.js +43 -1
  47. package/dist/esm/index.js +1523 -509
  48. package/dist/esm/styles/index.d.ts +11 -1
  49. package/dist/esm/styles/index.js +19 -9
  50. package/dist/esm/types/index.d.ts +4 -0
  51. package/example/App.tsx +46 -0
  52. package/package.json +7 -5
@@ -161,7 +161,7 @@ export declare const getRawStyles: (colors: typeof AppColors) => {
161
161
  iconBtnMinimal: {
162
162
  padding: number;
163
163
  };
164
- closeButtonCircle: {
164
+ closeButtonSquare: {
165
165
  width: number;
166
166
  height: number;
167
167
  borderRadius: number;
@@ -198,6 +198,16 @@ export declare const getRawStyles: (colors: typeof AppColors) => {
198
198
  shadowOpacity: number;
199
199
  shadowRadius: number;
200
200
  };
201
+ fabIconContainer: {
202
+ backgroundColor: string;
203
+ borderRadius: number;
204
+ width: number;
205
+ height: number;
206
+ borderWidth: number;
207
+ borderColor: string;
208
+ alignItems: string;
209
+ justifyContent: string;
210
+ };
201
211
  fabPulseRing: {
202
212
  position: string;
203
213
  width: number;
@@ -42,16 +42,16 @@ const getRawStyles = (colors) => ({
42
42
  flexDirection: 'row',
43
43
  alignItems: 'center',
44
44
  paddingHorizontal: 12,
45
- paddingVertical: 8,
45
+ paddingVertical: 10,
46
46
  zIndex: 10,
47
- minHeight: 48,
47
+ minHeight: 64,
48
48
  shadowColor: '#000000',
49
49
  shadowOffset: { width: 0, height: 2 },
50
50
  shadowOpacity: 0.08,
51
51
  shadowRadius: 4,
52
52
  elevation: 4,
53
53
  },
54
- headerLeft: { flex: 1, alignItems: 'flex-start' },
54
+ headerLeft: { flex: 2, alignItems: 'flex-start' },
55
55
  headerCenter: { flex: 3, alignItems: 'center' },
56
56
  headerRight: {
57
57
  flex: 1,
@@ -176,10 +176,10 @@ const getRawStyles = (colors) => ({
176
176
  letterSpacing: 0.2,
177
177
  },
178
178
  iconBtnMinimal: { padding: 6 },
179
- closeButtonCircle: {
179
+ closeButtonSquare: {
180
180
  width: 32,
181
181
  height: 32,
182
- borderRadius: 16,
182
+ borderRadius: 8,
183
183
  backgroundColor: 'rgba(255, 255, 255, 0.15)',
184
184
  alignItems: 'center',
185
185
  justifyContent: 'center',
@@ -202,6 +202,16 @@ const getRawStyles = (colors) => ({
202
202
  shadowOpacity: 0.4,
203
203
  shadowRadius: 12,
204
204
  },
205
+ fabIconContainer: {
206
+ backgroundColor: '#FFFFFF',
207
+ borderRadius: 28,
208
+ width: 56,
209
+ height: 56,
210
+ borderWidth: 1.5,
211
+ borderColor: colors.purple,
212
+ alignItems: 'center',
213
+ justifyContent: 'center',
214
+ },
205
215
  fabPulseRing: {
206
216
  position: 'absolute',
207
217
  width: 60,
@@ -1447,10 +1457,10 @@ const getRawStyles = (colors) => ({
1447
1457
  gap: 10,
1448
1458
  },
1449
1459
  dashboardModuleCard: {
1450
- backgroundColor: '#FFFFFF',
1460
+ backgroundColor: colors.primaryLight,
1451
1461
  borderRadius: 10,
1452
1462
  borderWidth: 1,
1453
- borderColor: '#EFEFEF',
1463
+ borderColor: colors.grayBorderSecondary,
1454
1464
  padding: 12,
1455
1465
  shadowColor: '#000000',
1456
1466
  shadowOpacity: 0.03,
@@ -1464,7 +1474,7 @@ const getRawStyles = (colors) => ({
1464
1474
  alignItems: 'center',
1465
1475
  marginBottom: 10,
1466
1476
  borderBottomWidth: 1,
1467
- borderBottomColor: '#F3F4F6',
1477
+ borderBottomColor: colors.dividerColor,
1468
1478
  paddingBottom: 8,
1469
1479
  },
1470
1480
  dashboardModuleTitle: {
@@ -1486,7 +1496,7 @@ const getRawStyles = (colors) => ({
1486
1496
  dashboardGridItem: {
1487
1497
  flex: 1,
1488
1498
  minWidth: '22%',
1489
- backgroundColor: '#F8FAFC',
1499
+ backgroundColor: colors.grayBackground,
1490
1500
  borderRadius: 8,
1491
1501
  paddingVertical: 8,
1492
1502
  paddingHorizontal: 4,
@@ -92,6 +92,7 @@ export interface TreeNodeProps {
92
92
  level?: number;
93
93
  search?: string;
94
94
  forceOpen?: boolean;
95
+ defaultExpandDepth?: number;
95
96
  }
96
97
  export interface LogCardProps {
97
98
  item: NetworkLog;
@@ -109,6 +110,9 @@ export interface MetaAccordionProps {
109
110
  duration: number | null;
110
111
  size: string;
111
112
  triggeredAt: string;
113
+ method?: string;
114
+ contentType?: string;
115
+ url?: string;
112
116
  }
113
117
  export interface HeadersSectionProps {
114
118
  title: string;
@@ -20,20 +20,20 @@ const ParamRowItem = ({ paramKey, value, }) => {
20
20
  const valStr = isObject ? JSON.stringify(value, null, 2) : String(value);
21
21
  const [expanded, setExpanded] = useState(false);
22
22
  const isLong = valStr.length > 80 || valStr.includes('\n') || isObject;
23
- return (<View style={detailStyles.dataBox}>
23
+ return (<View style={[detailStyles.dataBox, { backgroundColor: AppColors.primaryLight, borderColor: AppColors.grayBorderSecondary }]}>
24
24
  <View style={detailStyles.dataBoxHeader}>
25
- <Text style={detailStyles.dataBoxKey} numberOfLines={1}>
25
+ <Text style={[detailStyles.dataBoxKey, { color: AppColors.primaryBlack }]} numberOfLines={1}>
26
26
  {paramKey}
27
27
  </Text>
28
28
  <CopyButton value={valStr} label={paramKey}/>
29
29
  </View>
30
- {expanded && isObject ? (<View style={detailStyles.jsonBlock}>
30
+ {expanded && isObject ? (<View style={[detailStyles.jsonBlock, { backgroundColor: AppColors.grayBackground, borderColor: AppColors.grayBorderSecondary }]}>
31
31
  <JsonViewer data={value}/>
32
- </View>) : (<Text style={detailStyles.dataBoxVal} selectable numberOfLines={expanded ? undefined : 2}>
32
+ </View>) : (<Text style={[detailStyles.dataBoxVal, { color: AppColors.primaryBlack }]} selectable numberOfLines={expanded ? undefined : 2}>
33
33
  {valStr}
34
34
  </Text>)}
35
- {isLong && (<Pressable onPress={() => setExpanded(!expanded)} style={detailStyles.showMoreBtn}>
36
- <Text style={detailStyles.showMoreText}>
35
+ {isLong && (<Pressable onPress={() => setExpanded(!expanded)} style={[detailStyles.showMoreBtn, { backgroundColor: AppColors.grayBackground }]}>
36
+ <Text style={[detailStyles.showMoreText, { color: AppColors.grayTextStrong }]}>
37
37
  {expanded ? 'Show Less' : 'Show More'}
38
38
  </Text>
39
39
  </Pressable>)}
@@ -45,8 +45,8 @@ const ParamTable = ({ data, emptyLabel, }) => {
45
45
  value: data[key],
46
46
  }));
47
47
  if (entries.length === 0) {
48
- return (<View style={detailStyles.emptyParams}>
49
- <Text style={detailStyles.emptyParamsText}>
48
+ return (<View style={[detailStyles.emptyParams, { backgroundColor: AppColors.primaryLight, borderColor: AppColors.grayBorderSecondary }]}>
49
+ <Text style={[detailStyles.emptyParamsText, { color: AppColors.grayTextWeak }]}>
50
50
  {emptyLabel ?? 'No parameters'}
51
51
  </Text>
52
52
  </View>);
@@ -61,14 +61,14 @@ const SectionCard = ({ title, children, count, accentColor = AppColors.purple, }
61
61
  {children}
62
62
  </View>);
63
63
  }
64
- return (<View style={detailStyles.sectionCard}>
64
+ return (<View style={[detailStyles.sectionCard, { backgroundColor: AppColors.primaryLight, borderColor: AppColors.grayBorderSecondary }]}>
65
65
  <View style={detailStyles.sectionHeader}>
66
66
  <View style={detailStyles.sectionTitleRow}>
67
67
  <View style={[
68
68
  detailStyles.sectionAccentDot,
69
69
  { backgroundColor: accentColor },
70
70
  ]}/>
71
- <Text style={detailStyles.sectionTitle}>{title.toUpperCase()}</Text>
71
+ <Text style={[detailStyles.sectionTitle, { color: AppColors.primaryBlack }]}>{title.toUpperCase()}</Text>
72
72
  </View>
73
73
  {typeof count === 'number' && (<View style={[
74
74
  detailStyles.countBadge,
@@ -167,7 +167,7 @@ const AnalyticsDetail = ({ event, }) => {
167
167
  value: event.source,
168
168
  color: sourceColor,
169
169
  });
170
- return (<ScrollView style={detailStyles.scroll} contentContainerStyle={detailStyles.content} showsVerticalScrollIndicator contentInsetAdjustmentBehavior="never" automaticallyAdjustContentInsets={false}>
170
+ return (<ScrollView style={[detailStyles.scroll, { backgroundColor: AppColors.grayBackground }]} contentContainerStyle={detailStyles.content} showsVerticalScrollIndicator contentInsetAdjustmentBehavior="never" automaticallyAdjustContentInsets={false}>
171
171
  <LinearGradient colors={[
172
172
  `${eventColor}18`,
173
173
  `${eventColor}06`,
@@ -213,9 +213,12 @@ const AnalyticsDetail = ({ event, }) => {
213
213
  {topMetrics.length > 0 && (<ScrollView horizontal showsHorizontalScrollIndicator={false} style={detailStyles.metricsScroll} contentContainerStyle={detailStyles.metricsGrid}>
214
214
  {topMetrics.map((item, idx) => (<View key={idx} style={[
215
215
  detailStyles.metricCard,
216
- { borderLeftColor: item.color },
216
+ {
217
+ borderLeftColor: item.color,
218
+ backgroundColor: AppColors.primaryLight,
219
+ },
217
220
  ]}>
218
- <Text style={detailStyles.metricLabel}>{item.key}</Text>
221
+ <Text style={[detailStyles.metricLabel, { color: AppColors.grayTextWeak }]}>{item.key}</Text>
219
222
  <Text style={[detailStyles.metricValue, { color: item.color }]} numberOfLines={1}>
220
223
  {item.value}
221
224
  </Text>
@@ -223,25 +226,27 @@ const AnalyticsDetail = ({ event, }) => {
223
226
  </ScrollView>)}
224
227
  </LinearGradient>
225
228
 
226
- <View style={detailStyles.tabRow}>
229
+ <View style={[detailStyles.tabRow, { backgroundColor: AppColors.grayBackground }]}>
227
230
  <Pressable style={[
228
231
  detailStyles.tabButton,
229
- activeTab === 'unformatted' && detailStyles.tabActive,
232
+ activeTab === 'unformatted' && [detailStyles.tabActive, { backgroundColor: AppColors.primaryLight }],
230
233
  ]} onPress={() => setActiveTab('unformatted')}>
231
234
  <Text style={[
232
235
  detailStyles.tabText,
233
- activeTab === 'unformatted' && detailStyles.tabTextActive,
236
+ { color: AppColors.grayTextWeak },
237
+ activeTab === 'unformatted' && [detailStyles.tabTextActive, { color: AppColors.primaryBlack }],
234
238
  ]}>
235
239
  JSON Viewer
236
240
  </Text>
237
241
  </Pressable>
238
242
  <Pressable style={[
239
243
  detailStyles.tabButton,
240
- activeTab === 'formatted' && detailStyles.tabActive,
244
+ activeTab === 'formatted' && [detailStyles.tabActive, { backgroundColor: AppColors.primaryLight }],
241
245
  ]} onPress={() => setActiveTab('formatted')}>
242
246
  <Text style={[
243
247
  detailStyles.tabText,
244
- activeTab === 'formatted' && detailStyles.tabTextActive,
248
+ { color: AppColors.grayTextWeak },
249
+ activeTab === 'formatted' && [detailStyles.tabTextActive, { color: AppColors.primaryBlack }],
245
250
  ]}>
246
251
  Tabular View
247
252
  </Text>
@@ -249,8 +254,8 @@ const AnalyticsDetail = ({ event, }) => {
249
254
  </View>
250
255
 
251
256
  {activeTab === 'unformatted' && (<View style={detailStyles.searchRow}>
252
- <View style={styles.detailSearchBox}>
253
- <TextInput placeholder="Search JSON data..." placeholderTextColor={AppColors.grayTextWeak} value={search} onChangeText={setSearch} style={styles.detailSearchInput} autoCorrect={false} autoCapitalize="none"/>
257
+ <View style={[styles.detailSearchBox, { backgroundColor: AppColors.primaryLight, borderColor: AppColors.grayBorderSecondary }]}>
258
+ <TextInput placeholder="Search JSON data..." placeholderTextColor={AppColors.grayTextWeak} value={search} onChangeText={setSearch} style={[styles.detailSearchInput, { color: AppColors.primaryBlack }]} autoCorrect={false} autoCapitalize="none"/>
254
259
  {search.length > 0 && (<Pressable onPress={() => setSearch('')} hitSlop={10} style={{ padding: 8 }}>
255
260
  <ClearIcon color={AppColors.grayTextWeak} size={14}/>
256
261
  </Pressable>)}
@@ -268,7 +273,7 @@ const AnalyticsDetail = ({ event, }) => {
268
273
  </View>)}
269
274
 
270
275
  {activeTab === 'unformatted' && (<SectionCard accentColor={AppColors.purple}>
271
- <View style={[detailStyles.jsonBlock, { marginLeft: 0, marginTop: 0 }]}>
276
+ <View style={[detailStyles.jsonBlock, { marginLeft: 0, marginTop: 0, backgroundColor: AppColors.grayBackground, borderColor: AppColors.grayBorderSecondary }]}>
272
277
  <JsonViewer data={{
273
278
  name: event.name,
274
279
  params: params,
@@ -282,8 +287,8 @@ const AnalyticsDetail = ({ event, }) => {
282
287
  </SectionCard>)}
283
288
 
284
289
  {/* Empty state */}
285
- {paramCount === 0 && upCount === 0 && activeTab !== 'unformatted' && (<View style={detailStyles.emptyParams}>
286
- <Text style={detailStyles.emptyParamsText}>
290
+ {paramCount === 0 && upCount === 0 && activeTab !== 'unformatted' && (<View style={[detailStyles.emptyParams, { backgroundColor: AppColors.primaryLight, borderColor: AppColors.grayBorderSecondary }]}>
291
+ <Text style={[detailStyles.emptyParamsText, { color: AppColors.grayTextWeak }]}>
287
292
  No parameters recorded for this event
288
293
  </Text>
289
294
  </View>)}
@@ -63,11 +63,11 @@ const AnalyticsEventCard = React.memo(function AnalyticsEventCard({ event, onPre
63
63
  return (<View style={cardStyles.container}>
64
64
  {/* ── Gap Indicator ─────────────────────────────────────────────────── */}
65
65
  {showGap && (<View style={cardStyles.gapContainer}>
66
- <Text style={cardStyles.gapText}>{formatGap(msSincePrev)}</Text>
66
+ <Text style={[cardStyles.gapText, { color: AppColors.grayTextWeak }]}>{formatGap(msSincePrev)}</Text>
67
67
  </View>)}
68
68
 
69
69
  {/* ── Main Card ─────────────────────────────────────────────────────── */}
70
- <TouchableScale onPress={onPress} style={cardStyles.modernCard}>
70
+ <TouchableScale onPress={onPress} style={[cardStyles.modernCard, { backgroundColor: AppColors.primaryLight, borderColor: AppColors.grayBorderSecondary }]}>
71
71
  <Animated.View style={[
72
72
  StyleSheet.absoluteFill,
73
73
  {
@@ -104,7 +104,7 @@ const AnalyticsEventCard = React.memo(function AnalyticsEventCard({ event, onPre
104
104
  </Text>
105
105
  </View>) : null}
106
106
  </View>
107
- <Text style={cardStyles.timestamp}>
107
+ <Text style={[cardStyles.timestamp, { color: AppColors.grayTextWeak }]}>
108
108
  {formatTime(event.timestamp)}
109
109
  </Text>
110
110
  </View>
@@ -116,9 +116,9 @@ const AnalyticsEventCard = React.memo(function AnalyticsEventCard({ event, onPre
116
116
  event.screenName ||
117
117
  event.params?.firebase_screen ||
118
118
  event.params?.screen_name ||
119
- event.params?.firebase_screen_class ? (<View style={cardStyles.chip}>
119
+ event.params?.firebase_screen_class ? (<View style={[cardStyles.chip, { backgroundColor: AppColors.grayBackground, borderColor: AppColors.grayBorderSecondary }]}>
120
120
  <View style={[cardStyles.screenDot, { backgroundColor: color }]}/>
121
- <Text style={cardStyles.chipText} numberOfLines={1}>
121
+ <Text style={[cardStyles.chipText, { color: AppColors.grayText }]} numberOfLines={1}>
122
122
  {computedScreenName ||
123
123
  event.screenName ||
124
124
  event.params?.firebase_screen ||
@@ -127,14 +127,14 @@ const AnalyticsEventCard = React.memo(function AnalyticsEventCard({ event, onPre
127
127
  </Text>
128
128
  </View>) : null}
129
129
 
130
- <View style={cardStyles.chip}>
131
- <Text style={cardStyles.chipText}>
130
+ <View style={[cardStyles.chip, { backgroundColor: AppColors.grayBackground, borderColor: AppColors.grayBorderSecondary }]}>
131
+ <Text style={[cardStyles.chipText, { color: AppColors.grayText }]}>
132
132
  {'{} '} {paramCount} params
133
133
  </Text>
134
134
  </View>
135
135
 
136
- {userPropCount > 0 && (<View style={cardStyles.chip}>
137
- <Text style={cardStyles.chipText}>★ {userPropCount} props</Text>
136
+ {userPropCount > 0 && (<View style={[cardStyles.chip, { backgroundColor: AppColors.grayBackground, borderColor: AppColors.grayBorderSecondary }]}>
137
+ <Text style={[cardStyles.chipText, { color: AppColors.grayText }]}>★ {userPropCount} props</Text>
138
138
  </View>)}
139
139
  </View>
140
140
 
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export declare const BrandCircleIcon: ({ size }: {
3
+ size?: number;
4
+ }) => React.JSX.Element;
5
+ export default BrandCircleIcon;
@@ -0,0 +1,140 @@
1
+ import React from 'react';
2
+ import Svg, { Circle, Path, G, Defs, LinearGradient, RadialGradient, Stop, Rect, Ellipse, Line } from 'react-native-svg';
3
+ export const BrandCircleIcon = ({ size = 56 }) => {
4
+ return (<Svg width={size} height={size} viewBox="0 0 256 256" fill="none">
5
+ <Defs>
6
+ <LinearGradient id="tile" x1="30" y1="30" x2="210" y2="222" gradientUnits="userSpaceOnUse">
7
+ <Stop offset="0" stopColor="#141B33"/>
8
+ <Stop offset="1" stopColor="#0A0E1C"/>
9
+ </LinearGradient>
10
+ <LinearGradient id="edge" x1="14" y1="22" x2="220" y2="228" gradientUnits="userSpaceOnUse">
11
+ <Stop offset="0" stopColor="#3A4E7A"/>
12
+ <Stop offset="1" stopColor="#1A2238"/>
13
+ </LinearGradient>
14
+ <LinearGradient id="beam" x1="70" y1="74" x2="194" y2="187" gradientUnits="userSpaceOnUse">
15
+ <Stop offset="0" stopColor="#5EEAD4"/>
16
+ <Stop offset="0.5" stopColor="#38BDF8"/>
17
+ <Stop offset="1" stopColor="#A78BFA"/>
18
+ </LinearGradient>
19
+ <RadialGradient id="halo" cx="0.5" cy="0.45" r="0.55">
20
+ <Stop offset="0" stopColor="#38BDF8" stopOpacity={0.12}/>
21
+ <Stop offset="1" stopColor="#38BDF8" stopOpacity={0}/>
22
+ </RadialGradient>
23
+ <LinearGradient id="owlbody" x1="78" y1="60" x2="178" y2="186" gradientUnits="userSpaceOnUse">
24
+ <Stop offset="0" stopColor="#202E55"/>
25
+ <Stop offset="1" stopColor="#10182F"/>
26
+ </LinearGradient>
27
+ <LinearGradient id="beak" x1="120" y1="151" x2="136" y2="168" gradientUnits="userSpaceOnUse">
28
+ <Stop offset="0" stopColor="#FCD34D"/>
29
+ <Stop offset="1" stopColor="#FB923C"/>
30
+ </LinearGradient>
31
+ <RadialGradient id="iris" cx="0.42" cy="0.38" r="0.72">
32
+ <Stop offset="0" stopColor="#FDE68A"/>
33
+ <Stop offset="0.5" stopColor="#FBBF24"/>
34
+ <Stop offset="1" stopColor="#F59E0B"/>
35
+ </RadialGradient>
36
+ <RadialGradient id="blush" cx="0.5" cy="0.5" r="0.5">
37
+ <Stop offset="0" stopColor="#FB7185" stopOpacity={0.5}/>
38
+ <Stop offset="1" stopColor="#FB7185" stopOpacity={0}/>
39
+ </RadialGradient>
40
+ <LinearGradient id="wing" x1="70" y1="120" x2="190" y2="206" gradientUnits="userSpaceOnUse">
41
+ <Stop offset="0" stopColor="#1A2545"/>
42
+ <Stop offset="1" stopColor="#0E1530"/>
43
+ </LinearGradient>
44
+ <LinearGradient id="faceplate" x1="70" y1="72" x2="186" y2="152" gradientUnits="userSpaceOnUse">
45
+ <Stop offset="0" stopColor="#35497E"/>
46
+ <Stop offset="1" stopColor="#1E2D4D"/>
47
+ </LinearGradient>
48
+ <RadialGradient id="lensglass" cx="0.4" cy="0.32" r="0.75">
49
+ <Stop offset="0" stopColor="#7DE8FF" stopOpacity={0.22}/>
50
+ <Stop offset="0.7" stopColor="#7DE8FF" stopOpacity={0.05}/>
51
+ <Stop offset="1" stopColor="#7DE8FF" stopOpacity={0}/>
52
+ </RadialGradient>
53
+ <LinearGradient id="belly" x1="94" y1="126" x2="162" y2="212" gradientUnits="userSpaceOnUse">
54
+ <Stop offset="0" stopColor="#33477A"/>
55
+ <Stop offset="1" stopColor="#1D2B53"/>
56
+ </LinearGradient>
57
+ </Defs>
58
+ <Circle cx="128" cy="128" r="122" fill="url(#tile)"/>
59
+ <Circle cx="128" cy="128" r="121.4" fill="none" stroke="url(#edge)" strokeOpacity={0.7} strokeWidth={1.4}/>
60
+ <Circle cx="128" cy="128" r="100" fill="url(#halo)"/>
61
+ <G transform="translate(128 132) scale(1.05) translate(-128 -134)">
62
+ {/* wing 1 */}
63
+ <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}/>
64
+ {/* wing 2 */}
65
+ <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}/>
66
+ {/* body */}
67
+ <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"/>
68
+
69
+ {/* inner-ear shadows */}
70
+ <Path d="M99 48 L114 62 L104 63 L98 55 Z" fill="#080F22" opacity={0.5}/>
71
+ <Path d="M157 48 L142 62 L152 63 L158 55 Z" fill="#080F22" opacity={0.5}/>
72
+
73
+ {/* wing feather lines */}
74
+ <G stroke="#22325A" strokeWidth={2.2} fill="none" strokeLinecap="round" opacity={0.75}>
75
+ <Path d="M80 138 q-5 26 3 50"/>
76
+ <Path d="M90 134 q-4 26 3 48"/>
77
+ <Path d="M176 138 q5 26 -3 50"/>
78
+ <Path d="M166 134 q4 26 -3 48"/>
79
+ </G>
80
+
81
+ {/* belly plate */}
82
+ <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)"/>
83
+
84
+ {/* belly feather scallops */}
85
+ <G stroke="#3E588C" strokeWidth={2.3} fill="none" strokeLinecap="round" opacity={0.4}>
86
+ <Path d="M110 154 Q118 162 126 154"/>
87
+ <Path d="M126 154 Q134 162 142 154"/>
88
+ <Path d="M142 154 Q150 162 158 154"/>
89
+ <Path d="M102 172 Q110 180 118 172"/>
90
+ <Path d="M150 172 Q158 180 166 172"/>
91
+ <Path d="M112 190 Q120 198 128 190"/>
92
+ <Path d="M128 190 Q136 198 144 190"/>
93
+ </G>
94
+
95
+ {/* developer chest screen + code emblem */}
96
+ <Rect x={107} y={161} width={42} height={32} rx={9} fill="#0C1426" stroke="url(#beam)" strokeWidth={2} strokeOpacity={0.7}/>
97
+ <G stroke="#8FD0EC" strokeWidth={3} strokeLinecap="round" strokeLinejoin="round" fill="none">
98
+ <Path d="M122 170 L115 177 L122 184"/>
99
+ <Path d="M134 170 L141 177 L134 184"/>
100
+ <Path d="M130 168 L126 186"/>
101
+ </G>
102
+
103
+ {/* facial disc */}
104
+ <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}/>
105
+ {/* facial-disc centre ridge */}
106
+ <Path d="M128 96 L128 120" stroke="#52709E" strokeWidth={2} strokeLinecap="round" strokeOpacity={0.45}/>
107
+
108
+ {/* feet */}
109
+ <G stroke="url(#beak)" strokeWidth={5} strokeLinecap="round" fill="none">
110
+ <Path d="M111 209 L105 224 M111 209 L111 226 M111 209 L117 224"/>
111
+ <Path d="M145 209 L139 224 M145 209 L145 226 M145 209 L151 224"/>
112
+ </G>
113
+
114
+ {/* normal eye: big cute yellow iris, dark pupil, sparkles */}
115
+ <Circle cx={153} cy={107} r={17} fill="url(#iris)" stroke="#1A1205" strokeWidth={2.2}/>
116
+ <Circle cx={153} cy={108} r={8.2} fill="#0A0E18"/>
117
+ <Circle cx={156.2} cy={104} r={3.1} fill="#ffffff" opacity={0.95}/>
118
+ <Circle cx={149.6} cy={111} r={1.6} fill="#ffffff" opacity={0.7}/>
119
+
120
+ {/* beak */}
121
+ <Path d="M123.5 123 Q128 121 132.5 123 Q131 132 128 134.5 Q125 132 123.5 123 Z" fill="url(#beak)"/>
122
+
123
+ {/* magnifier held to the big (debug) eye */}
124
+ <Circle cx={95} cy={103} r={20} fill="url(#iris)" stroke="#1A1205" strokeWidth={2.6}/>
125
+ <Circle cx={95} cy={104} r={10} fill="#0A0E18"/>
126
+ <Circle cx={98.6} cy={100} r={3.4} fill="#ffffff" opacity={0.95}/>
127
+ <Circle cx={91} cy={107} r={1.8} fill="#ffffff" opacity={0.7}/>
128
+ <Circle cx={95} cy={103} r={28} fill="url(#lensglass)"/>
129
+ <Path d="M77 87 A28 28 0 0 1 106 79" fill="none" stroke="#ffffff" strokeWidth={4} strokeLinecap="round" strokeOpacity={0.5}/>
130
+ <Line x1={75} y1={123} x2={54} y2={147} stroke="#0A0F1C" strokeWidth={14} strokeLinecap="round"/>
131
+ <Line x1={75} y1={123} x2={54} y2={147} stroke="url(#beam)" strokeWidth={8.5} strokeLinecap="round"/>
132
+ <Circle cx={95} cy={103} r={28} fill="none" stroke="url(#beam)" strokeWidth={7}/>
133
+
134
+ {/* rosy cheeks */}
135
+ <Ellipse cx={83} cy={127} rx={9} ry={6} fill="url(#blush)"/>
136
+ <Ellipse cx={167} cy={122} rx={9} ry={6} fill="url(#blush)"/>
137
+ </G>
138
+ </Svg>);
139
+ };
140
+ export default BrandCircleIcon;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export declare const BrandSquareIcon: ({ size }: {
3
+ size?: number;
4
+ }) => React.JSX.Element;
5
+ export default BrandSquareIcon;
@@ -0,0 +1,140 @@
1
+ import React from 'react';
2
+ import Svg, { Circle, Path, G, Defs, LinearGradient, RadialGradient, Stop, Rect, Ellipse, Line } from 'react-native-svg';
3
+ export const BrandSquareIcon = ({ size = 56 }) => {
4
+ return (<Svg width={size} height={size} viewBox="0 0 256 256" fill="none">
5
+ <Defs>
6
+ <LinearGradient id="tileSquare" x1="30" y1="30" x2="210" y2="222" gradientUnits="userSpaceOnUse">
7
+ <Stop offset="0" stopColor="#141B33"/>
8
+ <Stop offset="1" stopColor="#0A0E1C"/>
9
+ </LinearGradient>
10
+ <LinearGradient id="edgeSquare" x1="14" y1="22" x2="220" y2="228" gradientUnits="userSpaceOnUse">
11
+ <Stop offset="0" stopColor="#3A4E7A"/>
12
+ <Stop offset="1" stopColor="#1A2238"/>
13
+ </LinearGradient>
14
+ <LinearGradient id="beamSquare" x1="70" y1="74" x2="194" y2="187" gradientUnits="userSpaceOnUse">
15
+ <Stop offset="0" stopColor="#5EEAD4"/>
16
+ <Stop offset="0.5" stopColor="#38BDF8"/>
17
+ <Stop offset="1" stopColor="#A78BFA"/>
18
+ </LinearGradient>
19
+ <RadialGradient id="haloSquare" cx="0.5" cy="0.45" r="0.55">
20
+ <Stop offset="0" stopColor="#38BDF8" stopOpacity={0.12}/>
21
+ <Stop offset="1" stopColor="#38BDF8" stopOpacity={0}/>
22
+ </RadialGradient>
23
+ <LinearGradient id="owlbodySquare" x1="78" y1="60" x2="178" y2="186" gradientUnits="userSpaceOnUse">
24
+ <Stop offset="0" stopColor="#202E55"/>
25
+ <Stop offset="1" stopColor="#10182F"/>
26
+ </LinearGradient>
27
+ <LinearGradient id="beakSquare" x1="120" y1="151" x2="136" y2="168" gradientUnits="userSpaceOnUse">
28
+ <Stop offset="0" stopColor="#FCD34D"/>
29
+ <Stop offset="1" stopColor="#FB923C"/>
30
+ </LinearGradient>
31
+ <RadialGradient id="irisSquare" cx="0.42" cy="0.38" r="0.72">
32
+ <Stop offset="0" stopColor="#FDE68A"/>
33
+ <Stop offset="0.5" stopColor="#FBBF24"/>
34
+ <Stop offset="1" stopColor="#F59E0B"/>
35
+ </RadialGradient>
36
+ <RadialGradient id="blushSquare" cx="0.5" cy="0.5" r="0.5">
37
+ <Stop offset="0" stopColor="#FB7185" stopOpacity={0.5}/>
38
+ <Stop offset="1" stopColor="#FB7185" stopOpacity={0}/>
39
+ </RadialGradient>
40
+ <LinearGradient id="wingSquare" x1="70" y1="120" x2="190" y2="206" gradientUnits="userSpaceOnUse">
41
+ <Stop offset="0" stopColor="#1A2545"/>
42
+ <Stop offset="1" stopColor="#0E1530"/>
43
+ </LinearGradient>
44
+ <LinearGradient id="faceplateSquare" x1="70" y1="72" x2="186" y2="152" gradientUnits="userSpaceOnUse">
45
+ <Stop offset="0" stopColor="#35497E"/>
46
+ <Stop offset="1" stopColor="#1E2D4D"/>
47
+ </LinearGradient>
48
+ <RadialGradient id="lensglassSquare" cx="0.4" cy="0.32" r="0.75">
49
+ <Stop offset="0" stopColor="#7DE8FF" stopOpacity={0.22}/>
50
+ <Stop offset="0.7" stopColor="#7DE8FF" stopOpacity={0.05}/>
51
+ <Stop offset="1" stopColor="#7DE8FF" stopOpacity={0}/>
52
+ </RadialGradient>
53
+ <LinearGradient id="bellySquare" x1="94" y1="126" x2="162" y2="212" gradientUnits="userSpaceOnUse">
54
+ <Stop offset="0" stopColor="#33477A"/>
55
+ <Stop offset="1" stopColor="#1D2B53"/>
56
+ </LinearGradient>
57
+ </Defs>
58
+ <Rect x={8} y={8} width={240} height={240} rx={58} fill="url(#tileSquare)"/>
59
+ <Rect x={8.6} y={8.6} width={238.8} height={238.8} rx={57.4} fill="none" stroke="url(#edgeSquare)" strokeOpacity={0.6} strokeWidth={1.2}/>
60
+ <Circle cx={128} cy={128} r={104} fill="url(#haloSquare)"/>
61
+ <G transform="translate(128 128) scale(1.16) translate(-128 -134)">
62
+ {/* wing 1 */}
63
+ <Path d="M74 124 C58 154 60 190 86 204 C79 176 77 148 88 126 Z" fill="url(#wingSquare)" stroke="url(#beamSquare)" strokeWidth={2.5} strokeOpacity={0.45}/>
64
+ {/* wing 2 */}
65
+ <Path d="M182 124 C198 154 196 190 170 204 C177 176 179 148 168 126 Z" fill="url(#wingSquare)" stroke="url(#beamSquare)" strokeWidth={2.5} strokeOpacity={0.45}/>
66
+ {/* body */}
67
+ <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(#owlbodySquare)" stroke="url(#beamSquare)" strokeWidth={4} strokeLinejoin="round"/>
68
+
69
+ {/* inner-ear shadows */}
70
+ <Path d="M99 48 L114 62 L104 63 L98 55 Z" fill="#080F22" opacity={0.5}/>
71
+ <Path d="M157 48 L142 62 L152 63 L158 55 Z" fill="#080F22" opacity={0.5}/>
72
+
73
+ {/* wing feather lines */}
74
+ <G stroke="#22325A" strokeWidth={2.2} fill="none" strokeLinecap="round" opacity={0.75}>
75
+ <Path d="M80 138 q-5 26 3 50"/>
76
+ <Path d="M90 134 q-4 26 3 48"/>
77
+ <Path d="M176 138 q5 26 -3 50"/>
78
+ <Path d="M166 134 q4 26 -3 48"/>
79
+ </G>
80
+
81
+ {/* belly plate */}
82
+ <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(#bellySquare)"/>
83
+
84
+ {/* belly feather scallops */}
85
+ <G stroke="#3E588C" strokeWidth={2.3} fill="none" strokeLinecap="round" opacity={0.4}>
86
+ <Path d="M110 154 Q118 162 126 154"/>
87
+ <Path d="M126 154 Q134 162 142 154"/>
88
+ <Path d="M142 154 Q150 162 158 154"/>
89
+ <Path d="M102 172 Q110 180 118 172"/>
90
+ <Path d="M150 172 Q158 180 166 172"/>
91
+ <Path d="M112 190 Q120 198 128 190"/>
92
+ <Path d="M128 190 Q136 198 144 190"/>
93
+ </G>
94
+
95
+ {/* developer chest screen + code emblem */}
96
+ <Rect x={107} y={161} width={42} height={32} rx={9} fill="#0C1426" stroke="url(#beamSquare)" strokeWidth={2} strokeOpacity={0.7}/>
97
+ <G stroke="#8FD0EC" strokeWidth={3} strokeLinecap="round" strokeLinejoin="round" fill="none">
98
+ <Path d="M122 170 L115 177 L122 184"/>
99
+ <Path d="M134 170 L141 177 L134 184"/>
100
+ <Path d="M130 168 L126 186"/>
101
+ </G>
102
+
103
+ {/* facial disc */}
104
+ <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(#faceplateSquare)" stroke="#52709E" strokeWidth={2.6} strokeOpacity={0.7}/>
105
+ {/* facial-disc centre ridge */}
106
+ <Path d="M128 96 L128 120" stroke="#52709E" strokeWidth={2} strokeLinecap="round" strokeOpacity={0.45}/>
107
+
108
+ {/* feet */}
109
+ <G stroke="url(#beakSquare)" strokeWidth={5} strokeLinecap="round" fill="none">
110
+ <Path d="M111 209 L105 224 M111 209 L111 226 M111 209 L117 224"/>
111
+ <Path d="M145 209 L139 224 M145 209 L145 226 M145 209 L151 224"/>
112
+ </G>
113
+
114
+ {/* normal eye: big cute yellow iris, dark pupil, sparkles */}
115
+ <Circle cx={153} cy={107} r={17} fill="url(#irisSquare)" stroke="#1A1205" strokeWidth={2.2}/>
116
+ <Circle cx={153} cy={108} r={8.2} fill="#0A0E18"/>
117
+ <Circle cx={156.2} cy={104} r={3.1} fill="#ffffff" opacity={0.95}/>
118
+ <Circle cx={149.6} cy={111} r={1.6} fill="#ffffff" opacity={0.7}/>
119
+
120
+ {/* beak */}
121
+ <Path d="M123.5 123 Q128 121 132.5 123 Q131 132 128 134.5 Q125 132 123.5 123 Z" fill="url(#beakSquare)"/>
122
+
123
+ {/* magnifier held to the big (debug) eye */}
124
+ <Circle cx={95} cy={103} r={20} fill="url(#irisSquare)" stroke="#1A1205" strokeWidth={2.6}/>
125
+ <Circle cx={95} cy={104} r={10} fill="#0A0E18"/>
126
+ <Circle cx={98.6} cy={100} r={3.4} fill="#ffffff" opacity={0.95}/>
127
+ <Circle cx={91} cy={107} r={1.8} fill="#ffffff" opacity={0.7}/>
128
+ <Circle cx={95} cy={103} r={28} fill="url(#lensglassSquare)"/>
129
+ <Path d="M77 87 A28 28 0 0 1 106 79" fill="none" stroke="#ffffff" strokeWidth={4} strokeLinecap="round" strokeOpacity={0.5}/>
130
+ <Line x1={75} y1={123} x2={54} y2={147} stroke="#0A0F1C" strokeWidth={14} strokeLinecap="round"/>
131
+ <Line x1={75} y1={123} x2={54} y2={147} stroke="url(#beamSquare)" strokeWidth={8.5} strokeLinecap="round"/>
132
+ <Circle cx={95} cy={103} r={28} fill="none" stroke="url(#beamSquare)" strokeWidth={7}/>
133
+
134
+ {/* rosy cheeks */}
135
+ <Ellipse cx={83} cy={127} rx={9} ry={6} fill="url(#blushSquare)"/>
136
+ <Ellipse cx={167} cy={122} rx={9} ry={6} fill="url(#blushSquare)"/>
137
+ </G>
138
+ </Svg>);
139
+ };
140
+ export default BrandSquareIcon;