@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.
Files changed (27) hide show
  1. package/package.json +21 -21
  2. package/src/domains/about/presentation/components/AboutContent.tsx +10 -7
  3. package/src/domains/about/presentation/components/AboutHeader.tsx +10 -9
  4. package/src/domains/about/presentation/components/AboutSettingItem.tsx +16 -15
  5. package/src/domains/about/presentation/screens/AboutScreen.tsx +11 -10
  6. package/src/domains/appearance/presentation/components/AppearanceHeader.tsx +2 -2
  7. package/src/domains/appearance/presentation/components/AppearancePreview.tsx +11 -11
  8. package/src/domains/appearance/presentation/components/CustomColorsSection.tsx +4 -4
  9. package/src/domains/appearance/presentation/components/ThemeModeSection.tsx +3 -3
  10. package/src/domains/appearance/presentation/components/ThemeOption.tsx +17 -17
  11. package/src/domains/appearance/presentation/screens/AppearanceScreen.tsx +2 -2
  12. package/src/domains/disclaimer/presentation/components/DisclaimerCard.tsx +15 -15
  13. package/src/domains/disclaimer/presentation/components/DisclaimerModal.tsx +5 -5
  14. package/src/domains/disclaimer/presentation/screens/DisclaimerScreen.tsx +9 -9
  15. package/src/domains/faqs/presentation/components/FAQCategory.tsx +4 -4
  16. package/src/domains/faqs/presentation/components/FAQItem.tsx +11 -11
  17. package/src/domains/faqs/presentation/components/FAQSearchBar.tsx +6 -6
  18. package/src/domains/faqs/presentation/screens/FAQScreen.tsx +4 -4
  19. package/src/domains/feedback/presentation/components/FeedbackForm.tsx +19 -17
  20. package/src/domains/feedback/presentation/components/FeedbackModal.tsx +9 -7
  21. package/src/domains/legal/presentation/screens/LegalScreen.tsx +6 -6
  22. package/src/domains/legal/presentation/screens/PrivacyPolicyScreen.tsx +13 -10
  23. package/src/domains/legal/presentation/screens/TermsOfServiceScreen.tsx +13 -10
  24. package/src/domains/rating/presentation/components/StarRating.tsx +9 -4
  25. package/src/domains/video-tutorials/index.ts +1 -0
  26. package/src/domains/video-tutorials/presentation/components/VideoTutorialCard.tsx +35 -31
  27. 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: 16,
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={18} color="textSecondary" />
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 styles = StyleSheet.create({
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: 16,
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 styles = StyleSheet.create({
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
- 'privacy-policy-styles',
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
- 'terms-of-service-styles',
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={size}
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 styles = StyleSheet.create({
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
  });
@@ -4,5 +4,6 @@
4
4
 
5
5
  export * from "./types";
6
6
  export * from "./presentation/screens/VideoTutorialsScreen";
7
+ export * from "./presentation/components/VideoTutorialCard";
7
8
  export * from "./presentation/hooks";
8
9
  export * from "./infrastructure/services/video-tutorial.service";
@@ -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 styles = StyleSheet.create({
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: 16,
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: 14,
168
+ fontSize: tokens.typography.bodyLarge.responsiveFontSize,
167
169
  },
168
170
  description: {
169
- fontSize: 14,
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: 12,
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 styles = StyleSheet.create({
173
+ const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) =>
174
+ StyleSheet.create({
173
175
  title: {
174
- fontSize: 24,
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: 18,
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
  });