react-native-elearn-ui 0.1.5 → 0.1.6
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/lib/module/components/Icon.js +97 -0
- package/lib/module/components/Icon.js.map +1 -1
- package/lib/module/screens/QbankScreen.js +251 -99
- package/lib/module/screens/QbankScreen.js.map +1 -1
- package/lib/module/screens/QuestionScreen.js +219 -179
- package/lib/module/screens/QuestionScreen.js.map +1 -1
- package/lib/module/screens/QuizStartScreen.js +134 -131
- package/lib/module/screens/QuizStartScreen.js.map +1 -1
- package/lib/module/screens/TopicListScreen.js +284 -135
- package/lib/module/screens/TopicListScreen.js.map +1 -1
- package/lib/typescript/src/components/Icon.d.ts +1 -1
- package/lib/typescript/src/components/Icon.d.ts.map +1 -1
- package/lib/typescript/src/screens/QbankScreen.d.ts.map +1 -1
- package/lib/typescript/src/screens/QuestionScreen.d.ts.map +1 -1
- package/lib/typescript/src/screens/QuizStartScreen.d.ts.map +1 -1
- package/lib/typescript/src/screens/TopicListScreen.d.ts.map +1 -1
- package/lib/typescript/src/types/index.d.ts +4 -0
- package/lib/typescript/src/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/Icon.tsx +125 -1
- package/src/screens/QbankScreen.tsx +192 -68
- package/src/screens/QuestionScreen.tsx +179 -176
- package/src/screens/QuizStartScreen.tsx +118 -112
- package/src/screens/TopicListScreen.tsx +262 -111
- package/src/types/index.ts +4 -0
package/src/components/Icon.tsx
CHANGED
|
@@ -26,7 +26,14 @@ export type IconName =
|
|
|
26
26
|
| 'bookmark'
|
|
27
27
|
| 'file-text'
|
|
28
28
|
| 'download'
|
|
29
|
-
| 'share'
|
|
29
|
+
| 'share'
|
|
30
|
+
| 'lock'
|
|
31
|
+
| 'activity'
|
|
32
|
+
| 'eye'
|
|
33
|
+
| 'clipboard'
|
|
34
|
+
| 'whatsapp'
|
|
35
|
+
| 'alert-circle'
|
|
36
|
+
| 'pause-circle';
|
|
30
37
|
|
|
31
38
|
interface IconProps {
|
|
32
39
|
name: IconName;
|
|
@@ -407,6 +414,123 @@ export const Icon: React.FC<IconProps> = ({
|
|
|
407
414
|
fill="none"
|
|
408
415
|
/>
|
|
409
416
|
);
|
|
417
|
+
case 'lock':
|
|
418
|
+
return (
|
|
419
|
+
<G>
|
|
420
|
+
<Path
|
|
421
|
+
d="M3 11v11a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V11a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2z"
|
|
422
|
+
stroke={iconColor}
|
|
423
|
+
strokeWidth={strokeWidth}
|
|
424
|
+
fill="none"
|
|
425
|
+
/>
|
|
426
|
+
<Path
|
|
427
|
+
d="M7 9V5a5 5 0 0 1 10 0v4"
|
|
428
|
+
stroke={iconColor}
|
|
429
|
+
strokeWidth={strokeWidth}
|
|
430
|
+
fill="none"
|
|
431
|
+
/>
|
|
432
|
+
</G>
|
|
433
|
+
);
|
|
434
|
+
case 'activity':
|
|
435
|
+
return (
|
|
436
|
+
<Path
|
|
437
|
+
d="M22 12h-4l-3 9L9 3l-3 9H2"
|
|
438
|
+
stroke={iconColor}
|
|
439
|
+
strokeWidth={strokeWidth}
|
|
440
|
+
fill="none"
|
|
441
|
+
strokeLinecap="round"
|
|
442
|
+
strokeLinejoin="round"
|
|
443
|
+
/>
|
|
444
|
+
);
|
|
445
|
+
case 'eye':
|
|
446
|
+
return (
|
|
447
|
+
<G>
|
|
448
|
+
<Path
|
|
449
|
+
d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"
|
|
450
|
+
stroke={iconColor}
|
|
451
|
+
strokeWidth={strokeWidth}
|
|
452
|
+
fill="none"
|
|
453
|
+
/>
|
|
454
|
+
<Circle
|
|
455
|
+
cx="12"
|
|
456
|
+
cy="12"
|
|
457
|
+
r="3"
|
|
458
|
+
stroke={iconColor}
|
|
459
|
+
strokeWidth={strokeWidth}
|
|
460
|
+
fill="none"
|
|
461
|
+
/>
|
|
462
|
+
</G>
|
|
463
|
+
);
|
|
464
|
+
case 'clipboard':
|
|
465
|
+
return (
|
|
466
|
+
<G>
|
|
467
|
+
<Path
|
|
468
|
+
d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"
|
|
469
|
+
stroke={iconColor}
|
|
470
|
+
strokeWidth={strokeWidth}
|
|
471
|
+
fill="none"
|
|
472
|
+
/>
|
|
473
|
+
<Path
|
|
474
|
+
d="M8 2h8v4H8z"
|
|
475
|
+
stroke={iconColor}
|
|
476
|
+
strokeWidth={strokeWidth}
|
|
477
|
+
fill="none"
|
|
478
|
+
/>
|
|
479
|
+
</G>
|
|
480
|
+
);
|
|
481
|
+
case 'whatsapp':
|
|
482
|
+
return (
|
|
483
|
+
<Path
|
|
484
|
+
d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"
|
|
485
|
+
stroke={iconColor}
|
|
486
|
+
strokeWidth={strokeWidth}
|
|
487
|
+
fill="none"
|
|
488
|
+
/>
|
|
489
|
+
);
|
|
490
|
+
case 'alert-circle':
|
|
491
|
+
return (
|
|
492
|
+
<G>
|
|
493
|
+
<Circle
|
|
494
|
+
cx="12"
|
|
495
|
+
cy="12"
|
|
496
|
+
r="10"
|
|
497
|
+
stroke={iconColor}
|
|
498
|
+
strokeWidth={strokeWidth}
|
|
499
|
+
fill="none"
|
|
500
|
+
/>
|
|
501
|
+
<Path
|
|
502
|
+
d="M12 8v4"
|
|
503
|
+
stroke={iconColor}
|
|
504
|
+
strokeWidth={strokeWidth}
|
|
505
|
+
strokeLinecap="round"
|
|
506
|
+
/>
|
|
507
|
+
<Circle
|
|
508
|
+
cx="12"
|
|
509
|
+
cy="16"
|
|
510
|
+
r="0.5"
|
|
511
|
+
fill={iconColor}
|
|
512
|
+
/>
|
|
513
|
+
</G>
|
|
514
|
+
);
|
|
515
|
+
case 'pause-circle':
|
|
516
|
+
return (
|
|
517
|
+
<G>
|
|
518
|
+
<Circle
|
|
519
|
+
cx="12"
|
|
520
|
+
cy="12"
|
|
521
|
+
r="10"
|
|
522
|
+
stroke={iconColor}
|
|
523
|
+
strokeWidth={strokeWidth}
|
|
524
|
+
fill="none"
|
|
525
|
+
/>
|
|
526
|
+
<Path
|
|
527
|
+
d="M10 15V9M14 15V9"
|
|
528
|
+
stroke={iconColor}
|
|
529
|
+
strokeWidth={strokeWidth}
|
|
530
|
+
strokeLinecap="round"
|
|
531
|
+
/>
|
|
532
|
+
</G>
|
|
533
|
+
);
|
|
410
534
|
default:
|
|
411
535
|
return null;
|
|
412
536
|
}
|
|
@@ -6,17 +6,19 @@ import {
|
|
|
6
6
|
TouchableOpacity,
|
|
7
7
|
SafeAreaView,
|
|
8
8
|
StatusBar,
|
|
9
|
+
Image,
|
|
9
10
|
} from 'react-native';
|
|
10
11
|
import { useElearnConfig } from '../context/ElearnConfigContext';
|
|
11
12
|
import { useTheme } from '../context/ThemeContext';
|
|
12
13
|
import { Typography, Card, ProgressBar, Icon } from '../components';
|
|
14
|
+
import type { IconName } from '../components';
|
|
13
15
|
|
|
14
16
|
interface QbankScreenProps {
|
|
15
17
|
hideHeader?: boolean;
|
|
16
18
|
}
|
|
17
19
|
|
|
18
20
|
export const QbankScreen: React.FC<QbankScreenProps> = ({ hideHeader = false }) => {
|
|
19
|
-
const { config, callbacks
|
|
21
|
+
const { config, callbacks } = useElearnConfig();
|
|
20
22
|
const theme = useTheme();
|
|
21
23
|
|
|
22
24
|
const courses = config.courses || [];
|
|
@@ -35,20 +37,67 @@ export const QbankScreen: React.FC<QbankScreenProps> = ({ hideHeader = false })
|
|
|
35
37
|
<Icon name="arrow-left" size={20} color={theme.textPrimary} />
|
|
36
38
|
</TouchableOpacity>
|
|
37
39
|
<Typography variant="h2" bold style={styles.headerTitle}>
|
|
38
|
-
|
|
40
|
+
QBank
|
|
39
41
|
</Typography>
|
|
40
|
-
<
|
|
42
|
+
<TouchableOpacity style={styles.searchButton}>
|
|
43
|
+
<Icon name="search" size={20} color={theme.textPrimary} />
|
|
44
|
+
</TouchableOpacity>
|
|
41
45
|
</View>
|
|
42
46
|
)}
|
|
43
47
|
|
|
44
48
|
<ScrollView contentContainerStyle={styles.scrollContent} showsVerticalScrollIndicator={false}>
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
|
|
50
|
+
{/* Promoted Premium Card */}
|
|
51
|
+
<Card style={styles.premiumCard}>
|
|
52
|
+
<View style={styles.premiumTextContainer}>
|
|
53
|
+
<Typography variant="h2" bold color={theme.textPrimary} style={styles.premiumTitle}>
|
|
54
|
+
More than 100+ Courses in premium
|
|
55
|
+
</Typography>
|
|
56
|
+
<Typography variant="caption" color={theme.textSecondary} style={styles.premiumSub}>
|
|
57
|
+
Advance your skills with top-rated, expert-led courses anytime
|
|
58
|
+
</Typography>
|
|
59
|
+
<TouchableOpacity style={[styles.premiumBtn, { backgroundColor: theme.primary }]}>
|
|
60
|
+
<Typography variant="caption" bold color="#FFFFFF">
|
|
61
|
+
Get Premium
|
|
62
|
+
</Typography>
|
|
63
|
+
</TouchableOpacity>
|
|
64
|
+
</View>
|
|
65
|
+
<View style={styles.premiumImageContainer}>
|
|
66
|
+
<Image
|
|
67
|
+
source={{ uri: 'https://images.unsplash.com/photo-1559839734-2b71ea197ec2?q=80&w=200&auto=format&fit=crop' }}
|
|
68
|
+
style={styles.premiumImage}
|
|
69
|
+
/>
|
|
70
|
+
</View>
|
|
71
|
+
</Card>
|
|
72
|
+
|
|
73
|
+
{/* Quick Options */}
|
|
74
|
+
<View style={styles.optionsRow}>
|
|
75
|
+
<TouchableOpacity style={styles.optionBtn}>
|
|
76
|
+
<View style={[styles.optionIconContainer, { backgroundColor: 'rgba(59, 130, 246, 0.1)' }]}>
|
|
77
|
+
<Icon name="bookmark" size={18} color="#3B82F6" />
|
|
78
|
+
</View>
|
|
79
|
+
<Typography variant="caption" bold color={theme.textPrimary} style={styles.optionLabel}>
|
|
80
|
+
Bookmark
|
|
81
|
+
</Typography>
|
|
82
|
+
</TouchableOpacity>
|
|
83
|
+
|
|
84
|
+
<TouchableOpacity style={styles.optionBtn}>
|
|
85
|
+
<View style={[styles.optionIconContainer, { backgroundColor: 'rgba(16, 185, 129, 0.1)' }]}>
|
|
86
|
+
<Icon name="clipboard" size={18} color="#10B981" strokeWidth={1.5} />
|
|
87
|
+
</View>
|
|
88
|
+
<Typography variant="caption" bold color={theme.textPrimary} style={styles.optionLabel}>
|
|
89
|
+
Costume module
|
|
90
|
+
</Typography>
|
|
91
|
+
</TouchableOpacity>
|
|
92
|
+
|
|
93
|
+
<TouchableOpacity style={styles.optionBtn}>
|
|
94
|
+
<View style={[styles.optionIconContainer, { backgroundColor: 'rgba(168, 85, 247, 0.1)' }]}>
|
|
95
|
+
<Icon name="activity" size={18} color="#A855F7" />
|
|
96
|
+
</View>
|
|
97
|
+
<Typography variant="caption" bold color={theme.textPrimary} style={styles.optionLabel}>
|
|
98
|
+
Track Qbank
|
|
99
|
+
</Typography>
|
|
100
|
+
</TouchableOpacity>
|
|
52
101
|
</View>
|
|
53
102
|
|
|
54
103
|
{/* Subjects List */}
|
|
@@ -56,6 +105,42 @@ export const QbankScreen: React.FC<QbankScreenProps> = ({ hideHeader = false })
|
|
|
56
105
|
{courses.map((course) => {
|
|
57
106
|
const pct = Math.round(course.progress * 100);
|
|
58
107
|
|
|
108
|
+
// Map course icon name or fall back to diamond
|
|
109
|
+
let iconName: IconName = 'diamond';
|
|
110
|
+
let iconBg = 'rgba(249, 115, 22, 0.1)';
|
|
111
|
+
let iconColor = '#F97316';
|
|
112
|
+
|
|
113
|
+
const titleLower = course.title.toLowerCase();
|
|
114
|
+
if (titleLower.includes('anatomy')) {
|
|
115
|
+
iconName = 'diamond';
|
|
116
|
+
iconBg = 'rgba(251, 146, 60, 0.1)';
|
|
117
|
+
iconColor = '#EA580C';
|
|
118
|
+
} else if (titleLower.includes('biochem')) {
|
|
119
|
+
iconName = 'dna';
|
|
120
|
+
iconBg = 'rgba(168, 85, 247, 0.1)';
|
|
121
|
+
iconColor = '#A855F7';
|
|
122
|
+
} else if (titleLower.includes('physio')) {
|
|
123
|
+
iconName = 'user';
|
|
124
|
+
iconBg = 'rgba(239, 68, 68, 0.1)';
|
|
125
|
+
iconColor = '#EF4444';
|
|
126
|
+
} else if (titleLower.includes('ophthalmology')) {
|
|
127
|
+
iconName = 'eye';
|
|
128
|
+
iconBg = 'rgba(59, 130, 246, 0.1)';
|
|
129
|
+
iconColor = '#3B82F6';
|
|
130
|
+
} else if (titleLower.includes('pharmacology')) {
|
|
131
|
+
iconName = 'award';
|
|
132
|
+
iconBg = 'rgba(245, 158, 11, 0.1)';
|
|
133
|
+
iconColor = '#D97706';
|
|
134
|
+
} else if (titleLower.includes('microbiology')) {
|
|
135
|
+
iconName = 'atom';
|
|
136
|
+
iconBg = 'rgba(236, 72, 153, 0.1)';
|
|
137
|
+
iconColor = '#DB2777';
|
|
138
|
+
} else if (titleLower.includes('pathology')) {
|
|
139
|
+
iconName = 'flask';
|
|
140
|
+
iconBg = 'rgba(20, 184, 166, 0.1)';
|
|
141
|
+
iconColor = '#0D9488';
|
|
142
|
+
}
|
|
143
|
+
|
|
59
144
|
return (
|
|
60
145
|
<Card
|
|
61
146
|
key={course.id}
|
|
@@ -63,36 +148,29 @@ export const QbankScreen: React.FC<QbankScreenProps> = ({ hideHeader = false })
|
|
|
63
148
|
onPress={() => callbacks.onSelectCourse?.(course)}
|
|
64
149
|
style={styles.subjectCard}
|
|
65
150
|
>
|
|
66
|
-
<View style={styles.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
151
|
+
<View style={styles.subjectRow}>
|
|
152
|
+
{/* Left Icon Container */}
|
|
153
|
+
<View style={[styles.subjectIconBox, { backgroundColor: iconBg }]}>
|
|
154
|
+
<Icon name={iconName} size={22} color={iconColor} />
|
|
155
|
+
</View>
|
|
156
|
+
|
|
157
|
+
{/* Right Content */}
|
|
158
|
+
<View style={styles.subjectInfo}>
|
|
159
|
+
<Typography variant="h3" bold color={theme.textPrimary} style={styles.subjectTitle}>
|
|
160
|
+
{course.title}
|
|
161
|
+
</Typography>
|
|
162
|
+
|
|
163
|
+
<ProgressBar progress={course.progress} height={6} style={styles.subjectProgressBar} />
|
|
164
|
+
|
|
165
|
+
<View style={styles.subjectStatsRow}>
|
|
75
166
|
<Typography variant="caption" color={theme.textSecondary}>
|
|
76
|
-
{course.
|
|
167
|
+
{course.completedQuestions} / {course.totalQuestions} Modules
|
|
168
|
+
</Typography>
|
|
169
|
+
<Typography variant="caption" bold color={theme.textPrimary}>
|
|
170
|
+
{pct}%
|
|
77
171
|
</Typography>
|
|
78
172
|
</View>
|
|
79
173
|
</View>
|
|
80
|
-
<Typography variant="h3" bold color={theme.primary}>
|
|
81
|
-
{pct}%
|
|
82
|
-
</Typography>
|
|
83
|
-
</View>
|
|
84
|
-
|
|
85
|
-
{/* Progress Details */}
|
|
86
|
-
<View style={styles.progressSection}>
|
|
87
|
-
<ProgressBar progress={course.progress} style={styles.progressBar} />
|
|
88
|
-
<View style={styles.progressTextRow}>
|
|
89
|
-
<Typography variant="caption" color={theme.textSecondary}>
|
|
90
|
-
{getString('questionsCountLabel')}
|
|
91
|
-
</Typography>
|
|
92
|
-
<Typography variant="caption" bold color={theme.textPrimary}>
|
|
93
|
-
{course.completedQuestions}/{course.totalQuestions}
|
|
94
|
-
</Typography>
|
|
95
|
-
</View>
|
|
96
174
|
</View>
|
|
97
175
|
</Card>
|
|
98
176
|
);
|
|
@@ -112,71 +190,117 @@ const styles = StyleSheet.create({
|
|
|
112
190
|
flexDirection: 'row',
|
|
113
191
|
justifyContent: 'space-between',
|
|
114
192
|
alignItems: 'center',
|
|
115
|
-
paddingHorizontal:
|
|
193
|
+
paddingHorizontal: 16,
|
|
116
194
|
paddingVertical: 12,
|
|
117
195
|
},
|
|
118
196
|
backButton: {
|
|
119
|
-
|
|
120
|
-
height: 40,
|
|
121
|
-
borderRadius: 20,
|
|
122
|
-
borderWidth: 1,
|
|
123
|
-
justifyContent: 'center',
|
|
124
|
-
alignItems: 'center',
|
|
197
|
+
padding: 6,
|
|
125
198
|
},
|
|
126
199
|
headerTitle: {
|
|
127
200
|
fontSize: 18,
|
|
201
|
+
fontWeight: '700',
|
|
128
202
|
},
|
|
129
|
-
|
|
130
|
-
|
|
203
|
+
searchButton: {
|
|
204
|
+
padding: 6,
|
|
131
205
|
},
|
|
132
206
|
scrollContent: {
|
|
133
|
-
paddingHorizontal:
|
|
207
|
+
paddingHorizontal: 16,
|
|
134
208
|
paddingBottom: 24,
|
|
135
209
|
},
|
|
136
|
-
|
|
137
|
-
|
|
210
|
+
premiumCard: {
|
|
211
|
+
flexDirection: 'row',
|
|
212
|
+
backgroundColor: '#FFFFFF',
|
|
213
|
+
borderRadius: 16,
|
|
214
|
+
padding: 16,
|
|
215
|
+
marginTop: 12,
|
|
216
|
+
borderWidth: 1,
|
|
217
|
+
borderColor: '#E2E8F0',
|
|
138
218
|
},
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
219
|
+
premiumTextContainer: {
|
|
220
|
+
flex: 1.3,
|
|
221
|
+
justifyContent: 'center',
|
|
142
222
|
},
|
|
143
|
-
|
|
144
|
-
|
|
223
|
+
premiumTitle: {
|
|
224
|
+
fontSize: 15,
|
|
225
|
+
lineHeight: 19,
|
|
226
|
+
marginBottom: 4,
|
|
145
227
|
},
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
228
|
+
premiumSub: {
|
|
229
|
+
fontSize: 11,
|
|
230
|
+
lineHeight: 14,
|
|
231
|
+
marginBottom: 10,
|
|
149
232
|
},
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
233
|
+
premiumBtn: {
|
|
234
|
+
alignSelf: 'flex-start',
|
|
235
|
+
paddingHorizontal: 12,
|
|
236
|
+
paddingVertical: 6,
|
|
237
|
+
borderRadius: 8,
|
|
238
|
+
},
|
|
239
|
+
premiumImageContainer: {
|
|
240
|
+
flex: 0.7,
|
|
241
|
+
justifyContent: 'center',
|
|
153
242
|
alignItems: 'center',
|
|
154
243
|
},
|
|
155
|
-
|
|
244
|
+
premiumImage: {
|
|
245
|
+
width: 70,
|
|
246
|
+
height: 70,
|
|
247
|
+
borderRadius: 35,
|
|
248
|
+
backgroundColor: '#E9D5FF', // Light purple
|
|
249
|
+
},
|
|
250
|
+
optionsRow: {
|
|
156
251
|
flexDirection: 'row',
|
|
157
|
-
|
|
252
|
+
justifyContent: 'space-between',
|
|
253
|
+
marginVertical: 16,
|
|
254
|
+
},
|
|
255
|
+
optionBtn: {
|
|
158
256
|
flex: 1,
|
|
257
|
+
alignItems: 'center',
|
|
159
258
|
},
|
|
160
|
-
|
|
259
|
+
optionIconContainer: {
|
|
161
260
|
width: 44,
|
|
162
261
|
height: 44,
|
|
262
|
+
borderRadius: 22,
|
|
263
|
+
justifyContent: 'center',
|
|
264
|
+
alignItems: 'center',
|
|
265
|
+
marginBottom: 6,
|
|
266
|
+
},
|
|
267
|
+
optionLabel: {
|
|
268
|
+
fontSize: 12,
|
|
269
|
+
},
|
|
270
|
+
listContainer: {
|
|
271
|
+
marginTop: 4,
|
|
272
|
+
},
|
|
273
|
+
subjectCard: {
|
|
274
|
+
padding: 14,
|
|
275
|
+
marginBottom: 10,
|
|
276
|
+
borderRadius: 16,
|
|
277
|
+
},
|
|
278
|
+
subjectRow: {
|
|
279
|
+
flexDirection: 'row',
|
|
280
|
+
alignItems: 'center',
|
|
281
|
+
},
|
|
282
|
+
subjectIconBox: {
|
|
283
|
+
width: 48,
|
|
284
|
+
height: 48,
|
|
163
285
|
borderRadius: 12,
|
|
164
286
|
justifyContent: 'center',
|
|
165
287
|
alignItems: 'center',
|
|
166
|
-
marginRight:
|
|
288
|
+
marginRight: 14,
|
|
167
289
|
},
|
|
168
290
|
subjectInfo: {
|
|
169
291
|
flex: 1,
|
|
170
292
|
},
|
|
171
|
-
|
|
172
|
-
|
|
293
|
+
subjectTitle: {
|
|
294
|
+
fontSize: 15,
|
|
295
|
+
marginBottom: 4,
|
|
173
296
|
},
|
|
174
|
-
|
|
175
|
-
|
|
297
|
+
subjectProgressBar: {
|
|
298
|
+
marginVertical: 4,
|
|
176
299
|
},
|
|
177
|
-
|
|
300
|
+
subjectStatsRow: {
|
|
178
301
|
flexDirection: 'row',
|
|
179
302
|
justifyContent: 'space-between',
|
|
180
303
|
alignItems: 'center',
|
|
304
|
+
marginTop: 2,
|
|
181
305
|
},
|
|
182
306
|
});
|