@umituz/react-native-settings 4.20.0 → 4.20.1
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/package.json +21 -21
- package/src/domains/about/presentation/components/AboutContent.tsx +10 -7
- package/src/domains/about/presentation/components/AboutHeader.tsx +10 -9
- package/src/domains/about/presentation/components/AboutSettingItem.tsx +16 -15
- package/src/domains/about/presentation/screens/AboutScreen.tsx +11 -10
- package/src/domains/appearance/presentation/components/AppearanceHeader.tsx +2 -2
- package/src/domains/appearance/presentation/components/AppearancePreview.tsx +11 -11
- package/src/domains/appearance/presentation/components/CustomColorsSection.tsx +4 -4
- package/src/domains/appearance/presentation/components/ThemeModeSection.tsx +3 -3
- package/src/domains/appearance/presentation/components/ThemeOption.tsx +17 -17
- package/src/domains/appearance/presentation/screens/AppearanceScreen.tsx +2 -2
- package/src/domains/disclaimer/presentation/components/DisclaimerCard.tsx +15 -15
- package/src/domains/disclaimer/presentation/components/DisclaimerModal.tsx +5 -5
- package/src/domains/disclaimer/presentation/screens/DisclaimerScreen.tsx +9 -9
- package/src/domains/faqs/presentation/components/FAQCategory.tsx +4 -4
- package/src/domains/faqs/presentation/components/FAQItem.tsx +11 -11
- package/src/domains/faqs/presentation/components/FAQSearchBar.tsx +6 -6
- package/src/domains/faqs/presentation/screens/FAQScreen.tsx +4 -4
- package/src/domains/feedback/presentation/components/FeedbackForm.tsx +19 -17
- package/src/domains/feedback/presentation/components/FeedbackModal.tsx +9 -7
- package/src/domains/legal/presentation/screens/LegalScreen.tsx +6 -6
- package/src/domains/legal/presentation/screens/PrivacyPolicyScreen.tsx +13 -10
- package/src/domains/legal/presentation/screens/TermsOfServiceScreen.tsx +13 -10
- package/src/domains/rating/presentation/components/StarRating.tsx +9 -4
- package/src/domains/video-tutorials/index.ts +1 -0
- package/src/domains/video-tutorials/presentation/components/VideoTutorialCard.tsx +35 -31
- package/src/domains/video-tutorials/presentation/screens/VideoTutorialsScreen.tsx +11 -9
|
@@ -38,9 +38,9 @@ export const FAQItemComponent: React.FC<FAQItemProps> = ({
|
|
|
38
38
|
() =>
|
|
39
39
|
StyleSheet.create({
|
|
40
40
|
container: {
|
|
41
|
-
marginHorizontal: tokens.spacing.md,
|
|
42
|
-
marginBottom: tokens.spacing.sm,
|
|
43
|
-
borderRadius: 20,
|
|
41
|
+
marginHorizontal: tokens.spacing.md * tokens.spacingMultiplier,
|
|
42
|
+
marginBottom: tokens.spacing.sm * tokens.spacingMultiplier,
|
|
43
|
+
borderRadius: 20 * tokens.spacingMultiplier,
|
|
44
44
|
backgroundColor: tokens.colors.surface,
|
|
45
45
|
borderWidth: 1,
|
|
46
46
|
borderColor: isExpanded ? tokens.colors.primary : tokens.colors.border,
|
|
@@ -49,26 +49,26 @@ export const FAQItemComponent: React.FC<FAQItemProps> = ({
|
|
|
49
49
|
header: {
|
|
50
50
|
flexDirection: 'row',
|
|
51
51
|
alignItems: 'center',
|
|
52
|
-
padding: tokens.spacing.lg,
|
|
52
|
+
padding: tokens.spacing.lg * tokens.spacingMultiplier,
|
|
53
53
|
},
|
|
54
54
|
content: {
|
|
55
55
|
flex: 1,
|
|
56
|
-
marginRight: tokens.spacing.md,
|
|
56
|
+
marginRight: tokens.spacing.md * tokens.spacingMultiplier,
|
|
57
57
|
},
|
|
58
58
|
questionText: {
|
|
59
59
|
fontWeight: '700',
|
|
60
60
|
},
|
|
61
61
|
answerContainer: {
|
|
62
|
-
paddingHorizontal: tokens.spacing.lg,
|
|
63
|
-
paddingBottom: tokens.spacing.lg,
|
|
62
|
+
paddingHorizontal: tokens.spacing.lg * tokens.spacingMultiplier,
|
|
63
|
+
paddingBottom: tokens.spacing.lg * tokens.spacingMultiplier,
|
|
64
64
|
borderTopWidth: 1,
|
|
65
65
|
borderTopColor: tokens.colors.borderLight,
|
|
66
66
|
backgroundColor: tokens.colors.surfaceSecondary || tokens.colors.backgroundSecondary,
|
|
67
67
|
},
|
|
68
68
|
iconContainer: {
|
|
69
|
-
width: 36,
|
|
70
|
-
height: 36,
|
|
71
|
-
borderRadius: 18,
|
|
69
|
+
width: 36 * tokens.spacingMultiplier,
|
|
70
|
+
height: 36 * tokens.spacingMultiplier,
|
|
71
|
+
borderRadius: 18 * tokens.spacingMultiplier,
|
|
72
72
|
backgroundColor: isExpanded ? tokens.colors.primary : tokens.colors.surfaceSecondary || tokens.colors.backgroundSecondary,
|
|
73
73
|
alignItems: 'center',
|
|
74
74
|
justifyContent: 'center',
|
|
@@ -107,7 +107,7 @@ export const FAQItemComponent: React.FC<FAQItemProps> = ({
|
|
|
107
107
|
<AtomicText
|
|
108
108
|
type="bodyMedium"
|
|
109
109
|
color="textSecondary"
|
|
110
|
-
style={[{ lineHeight: 22 }, customStyles?.answerStyle]}
|
|
110
|
+
style={[{ lineHeight: 22 * tokens.spacingMultiplier }, customStyles?.answerStyle]}
|
|
111
111
|
>
|
|
112
112
|
{item.answer}
|
|
113
113
|
</AtomicText>
|
|
@@ -35,19 +35,19 @@ export const FAQSearchBar: React.FC<FAQSearchBarProps> = ({
|
|
|
35
35
|
flexDirection: 'row',
|
|
36
36
|
alignItems: 'center',
|
|
37
37
|
backgroundColor: tokens.colors.surfaceSecondary || tokens.colors.backgroundSecondary,
|
|
38
|
-
borderRadius: 16,
|
|
39
|
-
paddingHorizontal: tokens.spacing.md,
|
|
38
|
+
borderRadius: 16 * tokens.spacingMultiplier,
|
|
39
|
+
paddingHorizontal: tokens.spacing.md * tokens.spacingMultiplier,
|
|
40
40
|
borderWidth: 1,
|
|
41
41
|
borderColor: tokens.colors.borderLight,
|
|
42
|
-
height: 48,
|
|
42
|
+
height: 48 * tokens.spacingMultiplier,
|
|
43
43
|
},
|
|
44
44
|
iconContainer: {
|
|
45
|
-
marginRight: tokens.spacing.sm,
|
|
45
|
+
marginRight: tokens.spacing.sm * tokens.spacingMultiplier,
|
|
46
46
|
},
|
|
47
47
|
input: {
|
|
48
48
|
flex: 1,
|
|
49
49
|
height: '100%',
|
|
50
|
-
fontSize:
|
|
50
|
+
fontSize: tokens.typography.bodyMedium.responsiveFontSize,
|
|
51
51
|
color: tokens.colors.textPrimary,
|
|
52
52
|
},
|
|
53
53
|
}),
|
|
@@ -57,7 +57,7 @@ export const FAQSearchBar: React.FC<FAQSearchBarProps> = ({
|
|
|
57
57
|
return (
|
|
58
58
|
<View style={[styles.container, customStyles?.container]}>
|
|
59
59
|
<View style={styles.iconContainer}>
|
|
60
|
-
<AtomicIcon name="search" size=
|
|
60
|
+
<AtomicIcon name="search" size="md" color="textSecondary" />
|
|
61
61
|
</View>
|
|
62
62
|
<TextInput
|
|
63
63
|
style={[styles.input, customStyles?.input]}
|
|
@@ -58,7 +58,7 @@ export const FAQScreen: React.FC<FAQScreenProps> = ({
|
|
|
58
58
|
flex: 1,
|
|
59
59
|
},
|
|
60
60
|
header: {
|
|
61
|
-
padding: tokens.spacing.md,
|
|
61
|
+
padding: tokens.spacing.md * tokens.spacingMultiplier,
|
|
62
62
|
},
|
|
63
63
|
content: {
|
|
64
64
|
flex: 1,
|
|
@@ -84,7 +84,7 @@ export const FAQScreen: React.FC<FAQScreenProps> = ({
|
|
|
84
84
|
<AtomicText
|
|
85
85
|
type="headlineMedium"
|
|
86
86
|
color="textPrimary"
|
|
87
|
-
style={{ marginBottom: tokens.spacing.md, fontWeight: '700' }}
|
|
87
|
+
style={{ marginBottom: tokens.spacing.md * tokens.spacingMultiplier, fontWeight: '700' }}
|
|
88
88
|
>
|
|
89
89
|
{headerTitle}
|
|
90
90
|
</AtomicText>
|
|
@@ -98,7 +98,7 @@ export const FAQScreen: React.FC<FAQScreenProps> = ({
|
|
|
98
98
|
|
|
99
99
|
<ScrollView
|
|
100
100
|
style={[styles.content, customStyles?.content]}
|
|
101
|
-
contentContainerStyle={{ paddingVertical: tokens.spacing.md }}
|
|
101
|
+
contentContainerStyle={{ paddingVertical: tokens.spacing.md * tokens.spacingMultiplier }}
|
|
102
102
|
showsVerticalScrollIndicator={false}
|
|
103
103
|
>
|
|
104
104
|
{filteredCategories.map((category) => (
|
|
@@ -110,7 +110,7 @@ export const FAQScreen: React.FC<FAQScreenProps> = ({
|
|
|
110
110
|
styles={customStyles?.category}
|
|
111
111
|
/>
|
|
112
112
|
))}
|
|
113
|
-
<View style={{ height: tokens.spacing.xl * 2 }} />
|
|
113
|
+
<View style={{ height: tokens.spacing.xl * 2 * tokens.spacingMultiplier }} />
|
|
114
114
|
</ScrollView>
|
|
115
115
|
</View>
|
|
116
116
|
);
|
|
@@ -30,6 +30,7 @@ export const FeedbackForm: React.FC<FeedbackFormProps> = ({
|
|
|
30
30
|
isSubmitting = false,
|
|
31
31
|
}) => {
|
|
32
32
|
const tokens = useAppDesignTokens();
|
|
33
|
+
const styles = getStyles(tokens);
|
|
33
34
|
const [selectedType, setSelectedType] = useState<FeedbackType>(initialType || texts.feedbackTypes[0].type);
|
|
34
35
|
const [rating, setRating] = useState<FeedbackRating>(5);
|
|
35
36
|
const [description, setDescription] = useState("");
|
|
@@ -48,7 +49,7 @@ export const FeedbackForm: React.FC<FeedbackFormProps> = ({
|
|
|
48
49
|
|
|
49
50
|
const renderRating = () => (
|
|
50
51
|
<View style={styles.ratingContainer}>
|
|
51
|
-
<AtomicText type="bodyMedium" style={{ marginBottom: 8, color: tokens.colors.textSecondary }}>
|
|
52
|
+
<AtomicText type="bodyMedium" style={{ marginBottom: 8 * tokens.spacingMultiplier, color: tokens.colors.textSecondary }}>
|
|
52
53
|
{texts.ratingLabel}
|
|
53
54
|
</AtomicText>
|
|
54
55
|
<View style={styles.stars}>
|
|
@@ -60,7 +61,7 @@ export const FeedbackForm: React.FC<FeedbackFormProps> = ({
|
|
|
60
61
|
>
|
|
61
62
|
<AtomicIcon
|
|
62
63
|
name={star <= rating ? "star" : "star-outline"}
|
|
63
|
-
customSize={32}
|
|
64
|
+
customSize={32 * tokens.spacingMultiplier}
|
|
64
65
|
customColor={star <= rating ? tokens.colors.warning : tokens.colors.border}
|
|
65
66
|
/>
|
|
66
67
|
</TouchableOpacity>
|
|
@@ -142,46 +143,47 @@ export const FeedbackForm: React.FC<FeedbackFormProps> = ({
|
|
|
142
143
|
);
|
|
143
144
|
};
|
|
144
145
|
|
|
145
|
-
const
|
|
146
|
+
const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) =>
|
|
147
|
+
StyleSheet.create({
|
|
146
148
|
container: {
|
|
147
149
|
width: "100%",
|
|
148
150
|
},
|
|
149
151
|
typeContainer: {
|
|
150
|
-
marginBottom: 24,
|
|
152
|
+
marginBottom: 24 * tokens.spacingMultiplier,
|
|
151
153
|
},
|
|
152
154
|
typeScroll: {
|
|
153
|
-
gap: 8,
|
|
155
|
+
gap: 8 * tokens.spacingMultiplier,
|
|
154
156
|
},
|
|
155
157
|
typeButton: {
|
|
156
158
|
flexDirection: "row",
|
|
157
159
|
alignItems: "center",
|
|
158
|
-
paddingHorizontal: 16,
|
|
159
|
-
paddingVertical: 8,
|
|
160
|
-
borderRadius: 20,
|
|
160
|
+
paddingHorizontal: 16 * tokens.spacingMultiplier,
|
|
161
|
+
paddingVertical: 8 * tokens.spacingMultiplier,
|
|
162
|
+
borderRadius: 20 * tokens.spacingMultiplier,
|
|
161
163
|
borderWidth: 1,
|
|
162
|
-
gap: 6,
|
|
164
|
+
gap: 6 * tokens.spacingMultiplier,
|
|
163
165
|
},
|
|
164
166
|
ratingContainer: {
|
|
165
167
|
alignItems: "center",
|
|
166
|
-
marginBottom: 24,
|
|
168
|
+
marginBottom: 24 * tokens.spacingMultiplier,
|
|
167
169
|
},
|
|
168
170
|
stars: {
|
|
169
171
|
flexDirection: "row",
|
|
170
|
-
gap: 8,
|
|
172
|
+
gap: 8 * tokens.spacingMultiplier,
|
|
171
173
|
},
|
|
172
174
|
starButton: {
|
|
173
|
-
padding: 4,
|
|
175
|
+
padding: 4 * tokens.spacingMultiplier,
|
|
174
176
|
},
|
|
175
177
|
inputContainer: {
|
|
176
|
-
marginBottom: 24,
|
|
178
|
+
marginBottom: 24 * tokens.spacingMultiplier,
|
|
177
179
|
},
|
|
178
180
|
textArea: {
|
|
179
181
|
textAlignVertical: "top",
|
|
180
|
-
minHeight: 120,
|
|
182
|
+
minHeight: 120 * tokens.spacingMultiplier,
|
|
181
183
|
borderWidth: 1,
|
|
182
|
-
borderRadius: 8,
|
|
183
|
-
padding: 12,
|
|
184
|
-
fontSize:
|
|
184
|
+
borderRadius: 8 * tokens.spacingMultiplier,
|
|
185
|
+
padding: 12 * tokens.spacingMultiplier,
|
|
186
|
+
fontSize: tokens.typography.bodyMedium.responsiveFontSize,
|
|
185
187
|
},
|
|
186
188
|
submitButton: {
|
|
187
189
|
width: "100%",
|
|
@@ -32,6 +32,7 @@ export const FeedbackModal: React.FC<FeedbackModalProps> = ({
|
|
|
32
32
|
texts,
|
|
33
33
|
}) => {
|
|
34
34
|
const tokens = useAppDesignTokens();
|
|
35
|
+
const styles = getStyles(tokens);
|
|
35
36
|
|
|
36
37
|
return (
|
|
37
38
|
<BaseModal visible={visible} onClose={onClose}>
|
|
@@ -46,7 +47,7 @@ export const FeedbackModal: React.FC<FeedbackModalProps> = ({
|
|
|
46
47
|
{title}
|
|
47
48
|
</AtomicText>
|
|
48
49
|
{subtitle && (
|
|
49
|
-
<AtomicText type="bodySmall" color="textSecondary" style={{ marginTop: 4 }}>
|
|
50
|
+
<AtomicText type="bodySmall" color="textSecondary" style={{ marginTop: 4 * tokens.spacingMultiplier }}>
|
|
50
51
|
{subtitle}
|
|
51
52
|
</AtomicText>
|
|
52
53
|
)}
|
|
@@ -77,7 +78,8 @@ export const FeedbackModal: React.FC<FeedbackModalProps> = ({
|
|
|
77
78
|
};
|
|
78
79
|
|
|
79
80
|
|
|
80
|
-
const
|
|
81
|
+
const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) =>
|
|
82
|
+
StyleSheet.create({
|
|
81
83
|
safeArea: {
|
|
82
84
|
flex: 1,
|
|
83
85
|
},
|
|
@@ -88,20 +90,20 @@ const styles = StyleSheet.create({
|
|
|
88
90
|
flexDirection: "row",
|
|
89
91
|
justifyContent: "space-between",
|
|
90
92
|
alignItems: "center",
|
|
91
|
-
padding: 16,
|
|
93
|
+
padding: 16 * tokens.spacingMultiplier,
|
|
92
94
|
borderBottomWidth: 1,
|
|
93
95
|
},
|
|
94
96
|
headerText: {
|
|
95
97
|
flex: 1,
|
|
96
98
|
},
|
|
97
99
|
closeButton: {
|
|
98
|
-
width: 36,
|
|
99
|
-
height: 36,
|
|
100
|
-
borderRadius: 18,
|
|
100
|
+
width: 36 * tokens.spacingMultiplier,
|
|
101
|
+
height: 36 * tokens.spacingMultiplier,
|
|
102
|
+
borderRadius: 18 * tokens.spacingMultiplier,
|
|
101
103
|
justifyContent: "center",
|
|
102
104
|
alignItems: "center",
|
|
103
105
|
},
|
|
104
106
|
content: {
|
|
105
|
-
padding: 20,
|
|
107
|
+
padding: 20 * tokens.spacingMultiplier,
|
|
106
108
|
},
|
|
107
109
|
});
|
|
@@ -220,18 +220,18 @@ export const LegalScreen: React.FC<LegalScreenProps> = React.memo(({
|
|
|
220
220
|
const createLegalScreenStyles = (tokens: DesignTokens) => {
|
|
221
221
|
return StyleSheet.create({
|
|
222
222
|
header: {
|
|
223
|
-
paddingBottom: tokens.spacing.lg,
|
|
224
|
-
paddingTop: tokens.spacing.md,
|
|
223
|
+
paddingBottom: tokens.spacing.lg * tokens.spacingMultiplier,
|
|
224
|
+
paddingTop: tokens.spacing.md * tokens.spacingMultiplier,
|
|
225
225
|
},
|
|
226
226
|
headerSubtitle: {
|
|
227
|
-
marginTop: tokens.spacing.xs,
|
|
227
|
+
marginTop: tokens.spacing.xs * tokens.spacingMultiplier,
|
|
228
228
|
},
|
|
229
229
|
section: {
|
|
230
|
-
marginTop: tokens.spacing.md,
|
|
230
|
+
marginTop: tokens.spacing.md * tokens.spacingMultiplier,
|
|
231
231
|
},
|
|
232
232
|
sectionHeader: {
|
|
233
|
-
marginBottom: tokens.spacing.sm,
|
|
234
|
-
paddingHorizontal: tokens.spacing.md,
|
|
233
|
+
marginBottom: tokens.spacing.sm * tokens.spacingMultiplier,
|
|
234
|
+
paddingHorizontal: tokens.spacing.md * tokens.spacingMultiplier,
|
|
235
235
|
},
|
|
236
236
|
});
|
|
237
237
|
};
|
|
@@ -71,12 +71,13 @@ export const PrivacyPolicyScreen: React.FC<PrivacyPolicyScreenProps> = React.mem
|
|
|
71
71
|
|
|
72
72
|
// Use cached styles
|
|
73
73
|
const styles = React.useMemo(() => {
|
|
74
|
+
const cacheKey = StyleCacheService.createTokenCacheKey(tokens);
|
|
74
75
|
return StyleCacheService.getCachedStyles(
|
|
75
76
|
'PrivacyPolicyScreen',
|
|
76
|
-
|
|
77
|
-
createPrivacyPolicyStyles
|
|
77
|
+
cacheKey,
|
|
78
|
+
() => createPrivacyPolicyStyles(tokens)
|
|
78
79
|
);
|
|
79
|
-
}, []);
|
|
80
|
+
}, [tokens]);
|
|
80
81
|
|
|
81
82
|
// Memoize URL press handler to prevent child re-renders
|
|
82
83
|
const handleUrlPress = React.useCallback(async () => {
|
|
@@ -170,34 +171,36 @@ export const PrivacyPolicyScreen: React.FC<PrivacyPolicyScreenProps> = React.mem
|
|
|
170
171
|
);
|
|
171
172
|
});
|
|
172
173
|
|
|
173
|
-
const createPrivacyPolicyStyles = () => {
|
|
174
|
+
const createPrivacyPolicyStyles = (tokens: any) => {
|
|
174
175
|
return StyleSheet.create({
|
|
175
176
|
container: {
|
|
176
177
|
flex: 1,
|
|
177
178
|
},
|
|
178
179
|
scrollContent: {
|
|
179
180
|
flexGrow: 1,
|
|
180
|
-
padding: 20,
|
|
181
|
+
padding: 20 * tokens.spacingMultiplier,
|
|
181
182
|
},
|
|
182
183
|
content: {
|
|
183
184
|
flex: 1,
|
|
184
185
|
},
|
|
185
186
|
title: {
|
|
186
|
-
marginBottom: 24,
|
|
187
|
+
marginBottom: 24 * tokens.spacingMultiplier,
|
|
187
188
|
},
|
|
188
189
|
text: {
|
|
189
|
-
lineHeight: 24,
|
|
190
|
+
lineHeight: 24 * tokens.spacingMultiplier,
|
|
191
|
+
fontSize: tokens.typography.bodyMedium.responsiveFontSize,
|
|
190
192
|
},
|
|
191
193
|
urlContainer: {
|
|
192
|
-
marginTop: 32,
|
|
194
|
+
marginTop: 32 * tokens.spacingMultiplier,
|
|
193
195
|
alignItems: "center",
|
|
194
196
|
},
|
|
195
197
|
urlText: {
|
|
196
|
-
marginBottom: 16,
|
|
198
|
+
marginBottom: 16 * tokens.spacingMultiplier,
|
|
197
199
|
textAlign: "center",
|
|
200
|
+
fontSize: tokens.typography.bodyMedium.responsiveFontSize,
|
|
198
201
|
},
|
|
199
202
|
urlButton: {
|
|
200
|
-
marginTop: 8,
|
|
203
|
+
marginTop: 8 * tokens.spacingMultiplier,
|
|
201
204
|
},
|
|
202
205
|
});
|
|
203
206
|
};
|
|
@@ -71,12 +71,13 @@ export const TermsOfServiceScreen: React.FC<TermsOfServiceScreenProps> = React.m
|
|
|
71
71
|
|
|
72
72
|
// Use cached styles
|
|
73
73
|
const styles = React.useMemo(() => {
|
|
74
|
+
const cacheKey = StyleCacheService.createTokenCacheKey(tokens);
|
|
74
75
|
return StyleCacheService.getCachedStyles(
|
|
75
76
|
'TermsOfServiceScreen',
|
|
76
|
-
|
|
77
|
-
createTermsOfServiceStyles
|
|
77
|
+
cacheKey,
|
|
78
|
+
() => createTermsOfServiceStyles(tokens)
|
|
78
79
|
);
|
|
79
|
-
}, []);
|
|
80
|
+
}, [tokens]);
|
|
80
81
|
|
|
81
82
|
// Memoize URL press handler to prevent child re-renders
|
|
82
83
|
const handleUrlPress = React.useCallback(async () => {
|
|
@@ -170,34 +171,36 @@ export const TermsOfServiceScreen: React.FC<TermsOfServiceScreenProps> = React.m
|
|
|
170
171
|
);
|
|
171
172
|
});
|
|
172
173
|
|
|
173
|
-
const createTermsOfServiceStyles = () => {
|
|
174
|
+
const createTermsOfServiceStyles = (tokens: any) => {
|
|
174
175
|
return StyleSheet.create({
|
|
175
176
|
container: {
|
|
176
177
|
flex: 1,
|
|
177
178
|
},
|
|
178
179
|
scrollContent: {
|
|
179
180
|
flexGrow: 1,
|
|
180
|
-
padding: 20,
|
|
181
|
+
padding: 20 * tokens.spacingMultiplier,
|
|
181
182
|
},
|
|
182
183
|
content: {
|
|
183
184
|
flex: 1,
|
|
184
185
|
},
|
|
185
186
|
title: {
|
|
186
|
-
marginBottom: 24,
|
|
187
|
+
marginBottom: 24 * tokens.spacingMultiplier,
|
|
187
188
|
},
|
|
188
189
|
text: {
|
|
189
|
-
lineHeight: 24,
|
|
190
|
+
lineHeight: 24 * tokens.spacingMultiplier,
|
|
191
|
+
fontSize: tokens.typography.bodyMedium.responsiveFontSize,
|
|
190
192
|
},
|
|
191
193
|
urlContainer: {
|
|
192
|
-
marginTop: 32,
|
|
194
|
+
marginTop: 32 * tokens.spacingMultiplier,
|
|
193
195
|
alignItems: "center",
|
|
194
196
|
},
|
|
195
197
|
urlText: {
|
|
196
|
-
marginBottom: 16,
|
|
198
|
+
marginBottom: 16 * tokens.spacingMultiplier,
|
|
197
199
|
textAlign: "center",
|
|
200
|
+
fontSize: tokens.typography.bodyMedium.responsiveFontSize,
|
|
198
201
|
},
|
|
199
202
|
urlButton: {
|
|
200
|
-
marginTop: 8,
|
|
203
|
+
marginTop: 8 * tokens.spacingMultiplier,
|
|
201
204
|
},
|
|
202
205
|
});
|
|
203
206
|
};
|
|
@@ -24,10 +24,14 @@ export const StarRating: React.FC<StarRatingProps> = ({
|
|
|
24
24
|
style,
|
|
25
25
|
}) => {
|
|
26
26
|
const tokens = useAppDesignTokens();
|
|
27
|
+
const styles = getStyles(tokens);
|
|
27
28
|
const [internalRating, setInternalRating] = useState(rating);
|
|
28
29
|
|
|
29
30
|
const filledColor = activeColor || tokens.colors.warning || "#FFD700";
|
|
30
31
|
const emptyColor = inactiveColor || tokens.colors.border || "#E0E0E0";
|
|
32
|
+
|
|
33
|
+
// Scale the size
|
|
34
|
+
const responsiveSize = size * tokens.spacingMultiplier;
|
|
31
35
|
|
|
32
36
|
const handlePress = (index: number) => {
|
|
33
37
|
if (disabled) return;
|
|
@@ -48,7 +52,7 @@ export const StarRating: React.FC<StarRatingProps> = ({
|
|
|
48
52
|
>
|
|
49
53
|
<AtomicIcon
|
|
50
54
|
name={index < (onRatingChange ? internalRating : rating) ? "star" : "star-outline"}
|
|
51
|
-
customSize={
|
|
55
|
+
customSize={responsiveSize}
|
|
52
56
|
customColor={index < (onRatingChange ? internalRating : rating) ? filledColor : emptyColor}
|
|
53
57
|
/>
|
|
54
58
|
</TouchableOpacity>
|
|
@@ -57,13 +61,14 @@ export const StarRating: React.FC<StarRatingProps> = ({
|
|
|
57
61
|
);
|
|
58
62
|
};
|
|
59
63
|
|
|
60
|
-
const
|
|
64
|
+
const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) =>
|
|
65
|
+
StyleSheet.create({
|
|
61
66
|
container: {
|
|
62
67
|
flexDirection: "row",
|
|
63
68
|
alignItems: "center",
|
|
64
|
-
gap: 4,
|
|
69
|
+
gap: 4 * tokens.spacingMultiplier,
|
|
65
70
|
},
|
|
66
71
|
starContainer: {
|
|
67
|
-
padding: 4,
|
|
72
|
+
padding: 4 * tokens.spacingMultiplier,
|
|
68
73
|
},
|
|
69
74
|
});
|
|
@@ -20,6 +20,7 @@ export const VideoTutorialCard: React.FC<VideoTutorialCardProps> = ({
|
|
|
20
20
|
horizontal = false,
|
|
21
21
|
}) => {
|
|
22
22
|
const tokens = useAppDesignTokens();
|
|
23
|
+
const styles = getStyles(tokens);
|
|
23
24
|
|
|
24
25
|
const formatDuration = (seconds: number): string => {
|
|
25
26
|
const minutes = Math.floor(seconds / 60);
|
|
@@ -107,16 +108,17 @@ export const VideoTutorialCard: React.FC<VideoTutorialCardProps> = ({
|
|
|
107
108
|
);
|
|
108
109
|
};
|
|
109
110
|
|
|
110
|
-
const
|
|
111
|
+
const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) =>
|
|
112
|
+
StyleSheet.create({
|
|
111
113
|
container: {
|
|
112
|
-
borderRadius: 12,
|
|
114
|
+
borderRadius: 12 * tokens.spacingMultiplier,
|
|
113
115
|
borderWidth: 1,
|
|
114
|
-
marginBottom: 12,
|
|
116
|
+
marginBottom: 12 * tokens.spacingMultiplier,
|
|
115
117
|
overflow: "hidden",
|
|
116
118
|
},
|
|
117
119
|
horizontalContainer: {
|
|
118
|
-
width: 280,
|
|
119
|
-
marginRight: 12,
|
|
120
|
+
width: 280 * tokens.spacingMultiplier,
|
|
121
|
+
marginRight: 12 * tokens.spacingMultiplier,
|
|
120
122
|
marginBottom: 0,
|
|
121
123
|
},
|
|
122
124
|
imageContainer: {
|
|
@@ -124,56 +126,56 @@ const styles = StyleSheet.create({
|
|
|
124
126
|
},
|
|
125
127
|
thumbnail: {
|
|
126
128
|
width: "100%",
|
|
127
|
-
height: 180,
|
|
129
|
+
height: 180 * tokens.spacingMultiplier,
|
|
128
130
|
},
|
|
129
131
|
horizontalThumbnail: {
|
|
130
|
-
height: 140,
|
|
132
|
+
height: 140 * tokens.spacingMultiplier,
|
|
131
133
|
},
|
|
132
134
|
durationBadge: {
|
|
133
135
|
position: "absolute",
|
|
134
|
-
bottom: 8,
|
|
135
|
-
right: 8,
|
|
136
|
-
paddingHorizontal: 6,
|
|
137
|
-
paddingVertical: 2,
|
|
138
|
-
borderRadius: 4,
|
|
136
|
+
bottom: 8 * tokens.spacingMultiplier,
|
|
137
|
+
right: 8 * tokens.spacingMultiplier,
|
|
138
|
+
paddingHorizontal: 6 * tokens.spacingMultiplier,
|
|
139
|
+
paddingVertical: 2 * tokens.spacingMultiplier,
|
|
140
|
+
borderRadius: 4 * tokens.spacingMultiplier,
|
|
139
141
|
},
|
|
140
142
|
durationText: {
|
|
141
143
|
color: "white",
|
|
142
|
-
fontSize: 12,
|
|
144
|
+
fontSize: 12 * tokens.spacingMultiplier,
|
|
143
145
|
fontWeight: "500",
|
|
144
146
|
},
|
|
145
147
|
featuredBadge: {
|
|
146
148
|
position: "absolute",
|
|
147
|
-
top: 8,
|
|
148
|
-
left: 8,
|
|
149
|
-
paddingHorizontal: 8,
|
|
150
|
-
paddingVertical: 4,
|
|
151
|
-
borderRadius: 4,
|
|
149
|
+
top: 8 * tokens.spacingMultiplier,
|
|
150
|
+
left: 8 * tokens.spacingMultiplier,
|
|
151
|
+
paddingHorizontal: 8 * tokens.spacingMultiplier,
|
|
152
|
+
paddingVertical: 4 * tokens.spacingMultiplier,
|
|
153
|
+
borderRadius: 4 * tokens.spacingMultiplier,
|
|
152
154
|
},
|
|
153
155
|
featuredText: {
|
|
154
|
-
fontSize: 11,
|
|
156
|
+
fontSize: 11 * tokens.spacingMultiplier,
|
|
155
157
|
fontWeight: "600",
|
|
156
158
|
},
|
|
157
159
|
content: {
|
|
158
|
-
padding: 12,
|
|
160
|
+
padding: 12 * tokens.spacingMultiplier,
|
|
159
161
|
},
|
|
160
162
|
title: {
|
|
161
|
-
fontSize:
|
|
163
|
+
fontSize: tokens.typography.titleMedium.responsiveFontSize,
|
|
162
164
|
fontWeight: "600",
|
|
163
|
-
marginBottom: 6,
|
|
165
|
+
marginBottom: 6 * tokens.spacingMultiplier,
|
|
164
166
|
},
|
|
165
167
|
horizontalTitle: {
|
|
166
|
-
fontSize:
|
|
168
|
+
fontSize: tokens.typography.bodyLarge.responsiveFontSize,
|
|
167
169
|
},
|
|
168
170
|
description: {
|
|
169
|
-
fontSize:
|
|
170
|
-
lineHeight: 20,
|
|
171
|
-
marginBottom: 8,
|
|
171
|
+
fontSize: tokens.typography.bodyMedium.responsiveFontSize,
|
|
172
|
+
lineHeight: 20 * tokens.spacingMultiplier,
|
|
173
|
+
marginBottom: 8 * tokens.spacingMultiplier,
|
|
172
174
|
},
|
|
173
175
|
horizontalDescription: {
|
|
174
|
-
fontSize:
|
|
175
|
-
lineHeight: 16,
|
|
176
|
-
marginBottom: 6,
|
|
176
|
+
fontSize: tokens.typography.bodySmall.responsiveFontSize,
|
|
177
|
+
lineHeight: 16 * tokens.spacingMultiplier,
|
|
178
|
+
marginBottom: 6 * tokens.spacingMultiplier,
|
|
177
179
|
},
|
|
178
180
|
metadata: {
|
|
179
181
|
flexDirection: "row",
|
|
@@ -181,11 +183,13 @@ const styles = StyleSheet.create({
|
|
|
181
183
|
alignItems: "center",
|
|
182
184
|
},
|
|
183
185
|
category: {
|
|
184
|
-
fontSize: 12,
|
|
186
|
+
fontSize: 12 * tokens.spacingMultiplier,
|
|
185
187
|
textTransform: "capitalize",
|
|
188
|
+
fontWeight: "500",
|
|
186
189
|
},
|
|
187
190
|
difficulty: {
|
|
188
|
-
fontSize: 12,
|
|
191
|
+
fontSize: 12 * tokens.spacingMultiplier,
|
|
189
192
|
textTransform: "capitalize",
|
|
193
|
+
fontWeight: "500",
|
|
190
194
|
},
|
|
191
195
|
});
|
|
@@ -68,6 +68,7 @@ export const VideoTutorialsScreen: React.FC<VideoTutorialsScreenProps> =
|
|
|
68
68
|
customFeaturedTutorials,
|
|
69
69
|
}) => {
|
|
70
70
|
const tokens = useAppDesignTokens();
|
|
71
|
+
const styles = getStyles(tokens);
|
|
71
72
|
|
|
72
73
|
const featuredQuery = useFeaturedTutorials(maxFeaturedCount);
|
|
73
74
|
const allQuery = useVideoTutorials();
|
|
@@ -169,30 +170,31 @@ export const VideoTutorialsScreen: React.FC<VideoTutorialsScreenProps> =
|
|
|
169
170
|
},
|
|
170
171
|
);
|
|
171
172
|
|
|
172
|
-
const
|
|
173
|
+
const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) =>
|
|
174
|
+
StyleSheet.create({
|
|
173
175
|
title: {
|
|
174
|
-
fontSize:
|
|
176
|
+
fontSize: tokens.typography.headlineLarge.responsiveFontSize,
|
|
175
177
|
fontWeight: "600",
|
|
176
|
-
marginBottom: 24,
|
|
178
|
+
marginBottom: 24 * tokens.spacingMultiplier,
|
|
177
179
|
},
|
|
178
180
|
section: {
|
|
179
|
-
marginBottom: 24,
|
|
181
|
+
marginBottom: 24 * tokens.spacingMultiplier,
|
|
180
182
|
},
|
|
181
183
|
sectionTitle: {
|
|
182
|
-
fontSize:
|
|
184
|
+
fontSize: tokens.typography.titleLarge.responsiveFontSize,
|
|
183
185
|
fontWeight: "500",
|
|
184
|
-
marginBottom: 12,
|
|
186
|
+
marginBottom: 12 * tokens.spacingMultiplier,
|
|
185
187
|
},
|
|
186
188
|
horizontalList: {
|
|
187
|
-
paddingRight: 16,
|
|
189
|
+
paddingRight: 16 * tokens.spacingMultiplier,
|
|
188
190
|
},
|
|
189
191
|
verticalList: {
|
|
190
|
-
paddingBottom: 16,
|
|
192
|
+
paddingBottom: 16 * tokens.spacingMultiplier,
|
|
191
193
|
},
|
|
192
194
|
errorContainer: {
|
|
193
195
|
flex: 1,
|
|
194
196
|
justifyContent: "center",
|
|
195
197
|
alignItems: "center",
|
|
196
|
-
padding: 20,
|
|
198
|
+
padding: 20 * tokens.spacingMultiplier,
|
|
197
199
|
},
|
|
198
200
|
});
|