@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.
Files changed (34) hide show
  1. package/dist/constants.js +1 -1
  2. package/dist/generators/core/mobile.js +21 -19
  3. package/dist/generators/core/mobile.js.map +1 -1
  4. package/dist/generators/core/shared.js +21 -12
  5. package/dist/generators/core/shared.js.map +1 -1
  6. package/dist/generators/core/web.js +69 -12
  7. package/dist/generators/core/web.js.map +1 -1
  8. package/dist/templates/copier.js +6 -4
  9. package/dist/templates/copier.js.map +1 -1
  10. package/dist/templates/core/mobile/src/App.tsx +8 -0
  11. package/dist/templates/core/mobile/src/utils/trpc.ts +7 -0
  12. package/dist/templates/core/shared/src/components/App.tsx +13 -0
  13. package/dist/templates/core/shared/src/components/index.ts +1 -0
  14. package/dist/templates/core/shared/src/index.ts +10 -0
  15. package/dist/templates/core/shared/src/layouts/AppLayout.tsx +218 -0
  16. package/dist/templates/core/shared/src/navigation/AppRouter.tsx +103 -0
  17. package/dist/templates/core/shared/src/navigation/index.ts +1 -0
  18. package/dist/templates/core/shared/src/screens/ExploreScreen.tsx +240 -0
  19. package/dist/templates/core/shared/src/screens/HomeScreen.tsx +151 -0
  20. package/dist/templates/core/shared/src/screens/ProfileScreen.tsx +222 -0
  21. package/dist/templates/core/shared/src/screens/SettingsScreen.tsx +218 -0
  22. package/dist/templates/core/shared/src/screens/index.ts +4 -0
  23. package/dist/templates/core/shared/src/styles.ts +45 -0
  24. package/dist/templates/core/web/index.html +25 -0
  25. package/dist/templates/core/web/public/vite.svg +10 -0
  26. package/dist/templates/core/web/src/App.tsx +12 -0
  27. package/dist/templates/core/web/src/main.tsx +16 -0
  28. package/dist/templates/core/workspace/gitignore.template +78 -0
  29. package/dist/templates/core/workspace/package.json +24 -0
  30. package/dist/templates/core/workspace/react-native.config.js +19 -0
  31. package/dist/templates/core/workspace/tsconfig.json +17 -0
  32. package/dist/templates/core/workspace/yarnrc.yml.template +6 -0
  33. package/dist/types/constants.d.ts +5 -5
  34. 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;