@idealyst/cli 1.2.29 → 1.2.31
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.
- package/dist/constants.js +1 -1
- package/dist/generators/core/mobile.js +21 -19
- package/dist/generators/core/mobile.js.map +1 -1
- package/dist/generators/core/shared.js +21 -12
- package/dist/generators/core/shared.js.map +1 -1
- package/dist/generators/core/web.js +69 -12
- package/dist/generators/core/web.js.map +1 -1
- package/dist/templates/copier.js +6 -4
- package/dist/templates/copier.js.map +1 -1
- package/dist/templates/core/mobile/src/App.tsx +8 -0
- package/dist/templates/core/mobile/src/utils/trpc.ts +7 -0
- package/dist/templates/core/shared/src/components/App.tsx +13 -0
- package/dist/templates/core/shared/src/components/index.ts +1 -0
- package/dist/templates/core/shared/src/index.ts +10 -0
- package/dist/templates/core/shared/src/layouts/AppLayout.tsx +218 -0
- package/dist/templates/core/shared/src/navigation/AppRouter.tsx +103 -0
- package/dist/templates/core/shared/src/navigation/index.ts +1 -0
- package/dist/templates/core/shared/src/screens/ExploreScreen.tsx +240 -0
- package/dist/templates/core/shared/src/screens/HomeScreen.tsx +151 -0
- package/dist/templates/core/shared/src/screens/ProfileScreen.tsx +222 -0
- package/dist/templates/core/shared/src/screens/SettingsScreen.tsx +218 -0
- package/dist/templates/core/shared/src/screens/index.ts +4 -0
- package/dist/templates/core/shared/src/styles.ts +45 -0
- package/dist/templates/core/web/index.html +25 -0
- package/dist/templates/core/web/public/vite.svg +10 -0
- package/dist/templates/core/web/src/App.tsx +12 -0
- package/dist/templates/core/web/src/main.tsx +16 -0
- package/dist/templates/core/workspace/gitignore.template +78 -0
- package/dist/templates/core/workspace/package.json +24 -0
- package/dist/templates/core/workspace/react-native.config.js +19 -0
- package/dist/templates/core/workspace/tsconfig.json +17 -0
- package/dist/templates/core/workspace/yarnrc.yml.template +6 -0
- package/dist/types/constants.d.ts +5 -5
- package/package.json +3 -2
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Icon } from '@idealyst/components';
|
|
3
|
+
import type { NavigatorParam, TabBarScreenOptions } from '@idealyst/navigation';
|
|
4
|
+
|
|
5
|
+
// Screens
|
|
6
|
+
import { HomeScreen } from '../screens/HomeScreen';
|
|
7
|
+
import { ExploreScreen } from '../screens/ExploreScreen';
|
|
8
|
+
import { ProfileScreen } from '../screens/ProfileScreen';
|
|
9
|
+
import { SettingsScreen } from '../screens/SettingsScreen';
|
|
10
|
+
|
|
11
|
+
// Custom Layouts
|
|
12
|
+
import { AppTabLayout, AppStackLayout } from '../layouts/AppLayout';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Tab Navigator - Contains 3 main tabs: Home, Explore, Profile
|
|
16
|
+
*/
|
|
17
|
+
const MainTabNavigator: NavigatorParam = {
|
|
18
|
+
path: '',
|
|
19
|
+
type: 'navigator',
|
|
20
|
+
layout: 'tab',
|
|
21
|
+
layoutComponent: AppTabLayout,
|
|
22
|
+
routes: [
|
|
23
|
+
{
|
|
24
|
+
path: '',
|
|
25
|
+
type: 'screen',
|
|
26
|
+
component: HomeScreen,
|
|
27
|
+
options: {
|
|
28
|
+
title: 'Home',
|
|
29
|
+
tabBarLabel: 'Home',
|
|
30
|
+
tabBarIcon: ({ focused, color, size }) => (
|
|
31
|
+
<Icon
|
|
32
|
+
name={focused ? 'home' : 'home-outline'}
|
|
33
|
+
color={color}
|
|
34
|
+
size={size}
|
|
35
|
+
/>
|
|
36
|
+
),
|
|
37
|
+
} as TabBarScreenOptions,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
path: 'explore',
|
|
41
|
+
type: 'screen',
|
|
42
|
+
component: ExploreScreen,
|
|
43
|
+
options: {
|
|
44
|
+
title: 'Explore',
|
|
45
|
+
tabBarLabel: 'Explore',
|
|
46
|
+
tabBarIcon: ({ focused, color, size }) => (
|
|
47
|
+
<Icon
|
|
48
|
+
name={focused ? 'compass' : 'compass-outline'}
|
|
49
|
+
color={color}
|
|
50
|
+
size={size}
|
|
51
|
+
/>
|
|
52
|
+
),
|
|
53
|
+
} as TabBarScreenOptions,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
path: 'profile',
|
|
57
|
+
type: 'screen',
|
|
58
|
+
component: ProfileScreen,
|
|
59
|
+
options: {
|
|
60
|
+
title: 'Profile',
|
|
61
|
+
tabBarLabel: 'Profile',
|
|
62
|
+
tabBarIcon: ({ focused, color, size }) => (
|
|
63
|
+
<Icon
|
|
64
|
+
name={focused ? 'account' : 'account-outline'}
|
|
65
|
+
color={color}
|
|
66
|
+
size={size}
|
|
67
|
+
/>
|
|
68
|
+
),
|
|
69
|
+
} as TabBarScreenOptions,
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Root Stack Navigator - Wraps tabs and adds Settings screen
|
|
76
|
+
* Structure:
|
|
77
|
+
* - Stack (root)
|
|
78
|
+
* - Tab Navigator (main tabs)
|
|
79
|
+
* - Home
|
|
80
|
+
* - Explore
|
|
81
|
+
* - Profile
|
|
82
|
+
* - Settings (modal-style screen on top of tabs)
|
|
83
|
+
*/
|
|
84
|
+
export const AppRouter: NavigatorParam = {
|
|
85
|
+
path: '/',
|
|
86
|
+
type: 'navigator',
|
|
87
|
+
layout: 'stack',
|
|
88
|
+
layoutComponent: AppStackLayout,
|
|
89
|
+
routes: [
|
|
90
|
+
MainTabNavigator,
|
|
91
|
+
{
|
|
92
|
+
path: 'settings',
|
|
93
|
+
type: 'screen',
|
|
94
|
+
component: SettingsScreen,
|
|
95
|
+
options: {
|
|
96
|
+
title: 'Settings',
|
|
97
|
+
headerShown: true,
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export default AppRouter;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AppRouter, default } from './AppRouter';
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Screen,
|
|
4
|
+
View,
|
|
5
|
+
Text,
|
|
6
|
+
Card,
|
|
7
|
+
Button,
|
|
8
|
+
Icon,
|
|
9
|
+
TextInput,
|
|
10
|
+
Select,
|
|
11
|
+
Switch,
|
|
12
|
+
Slider,
|
|
13
|
+
Progress,
|
|
14
|
+
Alert,
|
|
15
|
+
Divider,
|
|
16
|
+
List,
|
|
17
|
+
ListItem,
|
|
18
|
+
} from '@idealyst/components';
|
|
19
|
+
|
|
20
|
+
const selectOptions = [
|
|
21
|
+
{ label: 'Option 1', value: '1' },
|
|
22
|
+
{ label: 'Option 2', value: '2' },
|
|
23
|
+
{ label: 'Option 3', value: '3' },
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
export const ExploreScreen: React.FC = () => {
|
|
27
|
+
const [inputValue, setInputValue] = useState('');
|
|
28
|
+
const [selectValue, setSelectValue] = useState('1');
|
|
29
|
+
const [switchValue, setSwitchValue] = useState(false);
|
|
30
|
+
const [sliderValue, setSliderValue] = useState(50);
|
|
31
|
+
const [progressValue, setProgressValue] = useState(65);
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<Screen background="primary" padding="lg" scrollable>
|
|
35
|
+
<View gap="xl">
|
|
36
|
+
{/* Header */}
|
|
37
|
+
<View gap="sm">
|
|
38
|
+
<Text typography="h3">Component Explorer</Text>
|
|
39
|
+
<Text color="secondary">Interactive demos of Idealyst components</Text>
|
|
40
|
+
</View>
|
|
41
|
+
|
|
42
|
+
{/* Buttons Section */}
|
|
43
|
+
<View gap="md">
|
|
44
|
+
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
|
|
45
|
+
<Icon name="gesture-tap-button" size={24} intent="primary" />
|
|
46
|
+
<Text typography="subtitle1">Buttons</Text>
|
|
47
|
+
</View>
|
|
48
|
+
<Card type="outlined" padding="md" gap="md">
|
|
49
|
+
<Text typography="caption" color="secondary">
|
|
50
|
+
Buttons with different intents and types
|
|
51
|
+
</Text>
|
|
52
|
+
<View style={{ flexDirection: 'row', gap: 8, flexWrap: 'wrap' }}>
|
|
53
|
+
<Button intent="primary" size="sm">
|
|
54
|
+
Primary
|
|
55
|
+
</Button>
|
|
56
|
+
<Button intent="success" size="sm">
|
|
57
|
+
Success
|
|
58
|
+
</Button>
|
|
59
|
+
<Button intent="danger" size="sm">
|
|
60
|
+
Danger
|
|
61
|
+
</Button>
|
|
62
|
+
<Button intent="warning" size="sm">
|
|
63
|
+
Warning
|
|
64
|
+
</Button>
|
|
65
|
+
</View>
|
|
66
|
+
<View style={{ flexDirection: 'row', gap: 8, flexWrap: 'wrap' }}>
|
|
67
|
+
<Button type="outlined" intent="primary" size="sm">
|
|
68
|
+
Outlined
|
|
69
|
+
</Button>
|
|
70
|
+
<Button type="text" intent="primary" size="sm">
|
|
71
|
+
Ghost
|
|
72
|
+
</Button>
|
|
73
|
+
<Button type="outlined" intent="primary" size="sm">
|
|
74
|
+
Soft
|
|
75
|
+
</Button>
|
|
76
|
+
</View>
|
|
77
|
+
<View style={{ flexDirection: 'row', gap: 8, flexWrap: 'wrap' }}>
|
|
78
|
+
<Button
|
|
79
|
+
intent="primary"
|
|
80
|
+
size="sm"
|
|
81
|
+
leftIcon={<Icon name="plus" size={16} textColor='inverse' />}
|
|
82
|
+
>
|
|
83
|
+
With Icon
|
|
84
|
+
</Button>
|
|
85
|
+
<Button intent="neutral" size="sm" disabled>
|
|
86
|
+
Disabled
|
|
87
|
+
</Button>
|
|
88
|
+
</View>
|
|
89
|
+
</Card>
|
|
90
|
+
</View>
|
|
91
|
+
|
|
92
|
+
{/* Form Controls Section */}
|
|
93
|
+
<View gap="md">
|
|
94
|
+
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
|
|
95
|
+
<Icon name="form-textbox" size={24} intent="primary" />
|
|
96
|
+
<Text typography="subtitle1">Form Controls</Text>
|
|
97
|
+
</View>
|
|
98
|
+
<Card type="outlined" padding="md" gap="md">
|
|
99
|
+
<TextInput
|
|
100
|
+
placeholder="Enter some text..."
|
|
101
|
+
value={inputValue}
|
|
102
|
+
onChangeText={setInputValue}
|
|
103
|
+
leftIcon={<Icon name="magnify" size={20} />}
|
|
104
|
+
/>
|
|
105
|
+
|
|
106
|
+
<Select
|
|
107
|
+
label="Select"
|
|
108
|
+
value={selectValue}
|
|
109
|
+
onChange={setSelectValue}
|
|
110
|
+
options={selectOptions}
|
|
111
|
+
/>
|
|
112
|
+
|
|
113
|
+
<View
|
|
114
|
+
style={{
|
|
115
|
+
flexDirection: 'row',
|
|
116
|
+
alignItems: 'center',
|
|
117
|
+
justifyContent: 'space-between',
|
|
118
|
+
paddingVertical: 8,
|
|
119
|
+
}}
|
|
120
|
+
>
|
|
121
|
+
<View>
|
|
122
|
+
<Text weight="medium">Enable Feature</Text>
|
|
123
|
+
<Text typography="caption" color="secondary">
|
|
124
|
+
Toggle this setting on or off
|
|
125
|
+
</Text>
|
|
126
|
+
</View>
|
|
127
|
+
<Switch
|
|
128
|
+
checked={switchValue}
|
|
129
|
+
onChange={setSwitchValue}
|
|
130
|
+
intent="primary"
|
|
131
|
+
/>
|
|
132
|
+
</View>
|
|
133
|
+
|
|
134
|
+
<View gap="xs">
|
|
135
|
+
<View
|
|
136
|
+
style={{
|
|
137
|
+
flexDirection: 'row',
|
|
138
|
+
justifyContent: 'space-between',
|
|
139
|
+
}}
|
|
140
|
+
>
|
|
141
|
+
<Text weight="medium">Volume</Text>
|
|
142
|
+
<Text color="secondary">{sliderValue}%</Text>
|
|
143
|
+
</View>
|
|
144
|
+
<Slider
|
|
145
|
+
value={sliderValue}
|
|
146
|
+
onChange={setSliderValue}
|
|
147
|
+
min={0}
|
|
148
|
+
max={100}
|
|
149
|
+
intent="primary"
|
|
150
|
+
/>
|
|
151
|
+
</View>
|
|
152
|
+
</Card>
|
|
153
|
+
</View>
|
|
154
|
+
|
|
155
|
+
{/* Feedback Section */}
|
|
156
|
+
<View gap="md">
|
|
157
|
+
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
|
|
158
|
+
<Icon name="message-alert-outline" size={24} intent="primary" />
|
|
159
|
+
<Text typography="subtitle1">Feedback</Text>
|
|
160
|
+
</View>
|
|
161
|
+
<Card type="outlined" padding="md" gap="md">
|
|
162
|
+
<Alert intent="info" title="Info Alert">
|
|
163
|
+
This is an informational message for the user.
|
|
164
|
+
</Alert>
|
|
165
|
+
<Alert intent="success" title="Success!">
|
|
166
|
+
Your changes have been saved successfully.
|
|
167
|
+
</Alert>
|
|
168
|
+
<Alert intent="warning" title="Warning">
|
|
169
|
+
Please review your input before continuing.
|
|
170
|
+
</Alert>
|
|
171
|
+
|
|
172
|
+
<Divider />
|
|
173
|
+
|
|
174
|
+
<View gap="xs">
|
|
175
|
+
<View
|
|
176
|
+
style={{
|
|
177
|
+
flexDirection: 'row',
|
|
178
|
+
justifyContent: 'space-between',
|
|
179
|
+
}}
|
|
180
|
+
>
|
|
181
|
+
<Text weight="medium">Upload Progress</Text>
|
|
182
|
+
<Text color="secondary">{progressValue}%</Text>
|
|
183
|
+
</View>
|
|
184
|
+
<Progress value={progressValue} intent="primary" />
|
|
185
|
+
</View>
|
|
186
|
+
|
|
187
|
+
<View style={{ flexDirection: 'row', gap: 8, flexWrap: 'wrap' }}>
|
|
188
|
+
<Button
|
|
189
|
+
size="sm"
|
|
190
|
+
type="outlined"
|
|
191
|
+
onPress={() => setProgressValue(Math.max(0, progressValue - 10))}
|
|
192
|
+
>
|
|
193
|
+
-10%
|
|
194
|
+
</Button>
|
|
195
|
+
<Button
|
|
196
|
+
size="sm"
|
|
197
|
+
type="outlined"
|
|
198
|
+
onPress={() => setProgressValue(Math.min(100, progressValue + 10))}
|
|
199
|
+
>
|
|
200
|
+
+10%
|
|
201
|
+
</Button>
|
|
202
|
+
<Button size="sm" intent="success" onPress={() => setProgressValue(100)}>
|
|
203
|
+
Complete
|
|
204
|
+
</Button>
|
|
205
|
+
</View>
|
|
206
|
+
</Card>
|
|
207
|
+
</View>
|
|
208
|
+
|
|
209
|
+
{/* List Section */}
|
|
210
|
+
<View gap="md">
|
|
211
|
+
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
|
|
212
|
+
<Icon name="format-list-bulleted" size={24} intent="primary" />
|
|
213
|
+
<Text typography="subtitle1">Lists</Text>
|
|
214
|
+
</View>
|
|
215
|
+
<Card type="outlined" padding="md">
|
|
216
|
+
<List>
|
|
217
|
+
<ListItem
|
|
218
|
+
label="Notifications"
|
|
219
|
+
leading={<Icon name="bell-outline" size={24} />}
|
|
220
|
+
trailing={<Icon name="chevron-right" size={20} />}
|
|
221
|
+
/>
|
|
222
|
+
<ListItem
|
|
223
|
+
label="Privacy"
|
|
224
|
+
leading={<Icon name="shield-outline" size={24} />}
|
|
225
|
+
trailing={<Icon name="chevron-right" size={20} />}
|
|
226
|
+
/>
|
|
227
|
+
<ListItem
|
|
228
|
+
label="Storage"
|
|
229
|
+
leading={<Icon name="folder-outline" size={24} />}
|
|
230
|
+
trailing={<Icon name="chevron-right" size={20} />}
|
|
231
|
+
/>
|
|
232
|
+
</List>
|
|
233
|
+
</Card>
|
|
234
|
+
</View>
|
|
235
|
+
</View>
|
|
236
|
+
</Screen>
|
|
237
|
+
);
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
export default ExploreScreen;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Screen,
|
|
4
|
+
View,
|
|
5
|
+
Text,
|
|
6
|
+
Card,
|
|
7
|
+
Button,
|
|
8
|
+
Icon,
|
|
9
|
+
Badge,
|
|
10
|
+
Chip,
|
|
11
|
+
} from '@idealyst/components';
|
|
12
|
+
import { useNavigator } from '@idealyst/navigation';
|
|
13
|
+
|
|
14
|
+
export const HomeScreen: React.FC = () => {
|
|
15
|
+
const { navigate } = useNavigator();
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<Screen background="primary" padding="lg" scrollable>
|
|
19
|
+
<View gap="lg">
|
|
20
|
+
{/* Header */}
|
|
21
|
+
<View gap="sm">
|
|
22
|
+
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
|
|
23
|
+
<Text typography="h3">Welcome back</Text>
|
|
24
|
+
<Badge intent="success" size="sm">
|
|
25
|
+
Pro
|
|
26
|
+
</Badge>
|
|
27
|
+
</View>
|
|
28
|
+
<Text color="secondary">Explore the Idealyst component library</Text>
|
|
29
|
+
</View>
|
|
30
|
+
|
|
31
|
+
{/* Stats */}
|
|
32
|
+
<View style={{ flexDirection: 'row', gap: 12 }}>
|
|
33
|
+
<Card type="elevated" padding="md" style={{ flex: 1, alignItems: 'center' }}>
|
|
34
|
+
<Icon name="widgets-outline" size={28} intent="primary" />
|
|
35
|
+
<Text typography="h4">37+</Text>
|
|
36
|
+
<Text typography="caption" color="secondary">
|
|
37
|
+
Components
|
|
38
|
+
</Text>
|
|
39
|
+
</Card>
|
|
40
|
+
<Card type="elevated" padding="md" style={{ flex: 1, alignItems: 'center' }}>
|
|
41
|
+
<Icon name="palette-outline" size={28} intent="success" />
|
|
42
|
+
<Text typography="h4">2</Text>
|
|
43
|
+
<Text typography="caption" color="secondary">
|
|
44
|
+
Themes
|
|
45
|
+
</Text>
|
|
46
|
+
</Card>
|
|
47
|
+
<Card type="elevated" padding="md" style={{ flex: 1, alignItems: 'center' }}>
|
|
48
|
+
<Icon name="cellphone-link" size={28} intent="warning" />
|
|
49
|
+
<Text typography="h4">3</Text>
|
|
50
|
+
<Text typography="caption" color="secondary">
|
|
51
|
+
Platforms
|
|
52
|
+
</Text>
|
|
53
|
+
</Card>
|
|
54
|
+
</View>
|
|
55
|
+
|
|
56
|
+
{/* Quick Actions */}
|
|
57
|
+
<View gap="md">
|
|
58
|
+
<Text typography="subtitle1">Quick Actions</Text>
|
|
59
|
+
<View style={{ flexDirection: 'row', gap: 12 }}>
|
|
60
|
+
<Button
|
|
61
|
+
style={{ flex: 1 }}
|
|
62
|
+
intent="primary"
|
|
63
|
+
// Use direct icon name (retains theme colors)
|
|
64
|
+
leftIcon={'compass-outline'}
|
|
65
|
+
onPress={() => navigate({ path: '/explore' })}
|
|
66
|
+
>
|
|
67
|
+
Explore
|
|
68
|
+
</Button>
|
|
69
|
+
<Button
|
|
70
|
+
style={{ flex: 1 }}
|
|
71
|
+
type="outlined"
|
|
72
|
+
intent="neutral"
|
|
73
|
+
// or specify your own Icon component
|
|
74
|
+
leftIcon={<Icon name="cog-outline" size={18} color='orange' />}
|
|
75
|
+
onPress={() => navigate({ path: '/settings' })}
|
|
76
|
+
>
|
|
77
|
+
Settings
|
|
78
|
+
</Button>
|
|
79
|
+
</View>
|
|
80
|
+
</View>
|
|
81
|
+
|
|
82
|
+
{/* Feature Highlights */}
|
|
83
|
+
<View gap="md">
|
|
84
|
+
<Text typography="subtitle1">Highlights</Text>
|
|
85
|
+
|
|
86
|
+
<Card type="outlined" padding="md" clickable>
|
|
87
|
+
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>
|
|
88
|
+
<View
|
|
89
|
+
background="secondary"
|
|
90
|
+
radius="md"
|
|
91
|
+
style={{
|
|
92
|
+
width: 48,
|
|
93
|
+
height: 48,
|
|
94
|
+
alignItems: 'center',
|
|
95
|
+
justifyContent: 'center',
|
|
96
|
+
}}
|
|
97
|
+
>
|
|
98
|
+
<Icon name="theme-light-dark" size={24} intent="primary" />
|
|
99
|
+
</View>
|
|
100
|
+
<View style={{ flex: 1 }}>
|
|
101
|
+
<Text weight="semibold">Dark Mode Support</Text>
|
|
102
|
+
<Text typography="caption" color="secondary">
|
|
103
|
+
Seamlessly switch between light and dark themes
|
|
104
|
+
</Text>
|
|
105
|
+
</View>
|
|
106
|
+
<Icon name="chevron-right" size={24} textColor="secondary" />
|
|
107
|
+
</View>
|
|
108
|
+
</Card>
|
|
109
|
+
|
|
110
|
+
<Card type="outlined" padding="md" clickable>
|
|
111
|
+
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>
|
|
112
|
+
<View
|
|
113
|
+
background="secondary"
|
|
114
|
+
radius="md"
|
|
115
|
+
style={{
|
|
116
|
+
width: 48,
|
|
117
|
+
height: 48,
|
|
118
|
+
alignItems: 'center',
|
|
119
|
+
justifyContent: 'center',
|
|
120
|
+
}}
|
|
121
|
+
>
|
|
122
|
+
<Icon name="navigation-outline" size={24} intent="primary" />
|
|
123
|
+
</View>
|
|
124
|
+
<View style={{ flex: 1 }}>
|
|
125
|
+
<Text weight="semibold">Nested Navigation</Text>
|
|
126
|
+
<Text typography="caption" color="secondary">
|
|
127
|
+
Stack and Tab navigators working together
|
|
128
|
+
</Text>
|
|
129
|
+
</View>
|
|
130
|
+
<Icon name="chevron-right" size={24} textColor="secondary" />
|
|
131
|
+
</View>
|
|
132
|
+
</Card>
|
|
133
|
+
</View>
|
|
134
|
+
|
|
135
|
+
{/* Tags */}
|
|
136
|
+
<View gap="sm">
|
|
137
|
+
<Text typography="subtitle1">Technologies</Text>
|
|
138
|
+
<View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 8 }}>
|
|
139
|
+
<Chip intent="primary" label='React 19' />
|
|
140
|
+
<Chip intent="success" label='React Native' />
|
|
141
|
+
<Chip intent="warning" label='Unistyles' />
|
|
142
|
+
<Chip intent="info" label='TypeScript' />
|
|
143
|
+
<Chip intent="neutral" label='Cross-Platform' />
|
|
144
|
+
</View>
|
|
145
|
+
</View>
|
|
146
|
+
</View>
|
|
147
|
+
</Screen>
|
|
148
|
+
);
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
export default HomeScreen;
|