@umituz/react-native-settings 4.19.5 → 4.20.0

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 (37) hide show
  1. package/package.json +24 -22
  2. package/src/domains/about/presentation/components/AboutContent.tsx +2 -2
  3. package/src/domains/about/presentation/components/AboutHeader.tsx +2 -2
  4. package/src/domains/about/presentation/components/AboutSettingItem.tsx +2 -2
  5. package/src/domains/about/presentation/screens/AboutScreen.tsx +2 -2
  6. package/src/domains/appearance/presentation/components/ColorPicker.tsx +3 -3
  7. package/src/domains/appearance/presentation/components/ThemeOption.tsx +3 -3
  8. package/src/domains/appearance/presentation/screens/AppearanceScreen.tsx +3 -3
  9. package/src/domains/faqs/domain/entities/FAQEntity.ts +7 -0
  10. package/src/domains/faqs/domain/services/FAQSearchService.ts +33 -10
  11. package/src/domains/faqs/presentation/components/FAQCategory.tsx +17 -8
  12. package/src/domains/faqs/presentation/components/FAQEmptyState.tsx +2 -2
  13. package/src/domains/faqs/presentation/components/FAQItem.tsx +36 -21
  14. package/src/domains/faqs/presentation/components/FAQSearchBar.tsx +12 -11
  15. package/src/domains/faqs/presentation/screens/FAQScreen.tsx +37 -27
  16. package/src/domains/feedback/presentation/components/FeedbackForm.tsx +2 -2
  17. package/src/domains/feedback/presentation/components/FeedbackModal.tsx +2 -2
  18. package/src/domains/legal/presentation/screens/LegalScreen.tsx +2 -2
  19. package/src/domains/legal/presentation/screens/PrivacyPolicyScreen.tsx +2 -2
  20. package/src/domains/legal/presentation/screens/TermsOfServiceScreen.tsx +2 -2
  21. package/src/domains/video-tutorials/index.ts +8 -0
  22. package/src/domains/video-tutorials/infrastructure/services/video-tutorial.service.ts +117 -0
  23. package/src/domains/video-tutorials/presentation/components/VideoTutorialCard.tsx +191 -0
  24. package/src/domains/video-tutorials/presentation/hooks/index.ts +36 -0
  25. package/src/domains/video-tutorials/presentation/screens/VideoTutorialsScreen.tsx +198 -0
  26. package/src/domains/video-tutorials/types/index.ts +36 -0
  27. package/src/index.ts +4 -1
  28. package/src/presentation/components/DevSettingsSection.tsx +2 -2
  29. package/src/presentation/components/SettingItem.tsx +2 -2
  30. package/src/presentation/components/SettingsErrorBoundary.tsx +2 -2
  31. package/src/presentation/components/SettingsFooter.tsx +2 -2
  32. package/src/presentation/components/SettingsItemCard.tsx +2 -2
  33. package/src/presentation/components/SettingsSection.tsx +2 -2
  34. package/src/presentation/navigation/SettingsStackNavigator.tsx +2 -2
  35. package/src/presentation/screens/SettingsScreen.tsx +2 -2
  36. package/src/presentation/screens/components/SettingsContent.tsx +2 -2
  37. package/src/presentation/screens/components/SettingsHeader.tsx +2 -2
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@umituz/react-native-settings",
3
- "version": "4.19.5",
3
+ "version": "4.20.0",
4
4
  "description": "Complete settings hub for React Native apps - consolidated package with settings, about, legal, appearance, feedback, FAQs, and rating",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
7
7
  "scripts": {
8
8
  "typecheck": "tsc --noEmit",
9
- "lint": "eslint src --ext .ts,.tsx --max-warnings 0",
10
- "lint:fix": "eslint src --ext .ts,.tsx --fix",
9
+ "lint": "eslint src",
10
+ "lint:fix": "eslint src --fix",
11
11
  "version:patch": "npm version patch -m 'chore: release v%s'",
12
12
  "version:minor": "npm version minor -m 'chore: release v%s'",
13
13
  "version:major": "npm version major -m 'chore: release v%s'"
@@ -39,14 +39,14 @@
39
39
  "@react-navigation/native": ">=6.0.0",
40
40
  "@react-navigation/stack": ">=6.0.0",
41
41
  "@tanstack/react-query": ">=5.0.0",
42
- "@umituz/react-native-auth": "latest",
43
- "@umituz/react-native-design-system": "latest",
44
- "@umituz/react-native-localization": "latest",
45
- "@umituz/react-native-notifications": "latest",
46
- "@umituz/react-native-onboarding": "latest",
47
- "@umituz/react-native-sentry": "latest",
48
- "@umituz/react-native-storage": "latest",
49
- "@umituz/react-native-tanstack": "latest",
42
+ "@umituz/react-native-auth": "*",
43
+ "@umituz/react-native-design-system": "*",
44
+ "@umituz/react-native-localization": "*",
45
+ "@umituz/react-native-notifications": "*",
46
+ "@umituz/react-native-onboarding": "*",
47
+ "@umituz/react-native-sentry": "*",
48
+ "@umituz/react-native-storage": "*",
49
+ "@umituz/react-native-tanstack": "*",
50
50
  "react": ">=19.0.0",
51
51
  "react-native": ">=0.81.0",
52
52
  "react-native-safe-area-context": ">=4.0.0",
@@ -58,28 +58,30 @@
58
58
  "@gorhom/bottom-sheet": "^5.2.8",
59
59
  "@react-native-community/datetimepicker": "^8.5.1",
60
60
  "@react-navigation/bottom-tabs": "^7.9.0",
61
- "@react-navigation/native": "^6.1.18",
62
- "@react-navigation/stack": "^6.4.1",
61
+ "@react-navigation/native": "^7.1.26",
62
+ "@react-navigation/stack": "^7.6.13",
63
63
  "@sentry/react-native": "^7.8.0",
64
64
  "@sentry/types": "^10.32.1",
65
65
  "@tanstack/react-query": "^5.0.0",
66
66
  "@types/jest": "^29.5.14",
67
67
  "@types/react": "~19.1.10",
68
- "@typescript-eslint/eslint-plugin": "^7.0.0",
69
- "@typescript-eslint/parser": "^7.0.0",
70
- "@umituz/react-native-auth": "latest",
71
- "@umituz/react-native-design-system": "latest",
68
+ "@typescript-eslint/eslint-plugin": "^7.18.0",
69
+ "@typescript-eslint/parser": "^7.18.0",
70
+ "@umituz/react-native-auth": "^3.2.0",
71
+ "@umituz/react-native-design-system": "^2.5.1",
72
72
  "@umituz/react-native-filesystem": "^2.1.7",
73
73
  "@umituz/react-native-firebase": "^1.13.28",
74
74
  "@umituz/react-native-haptics": "^1.0.3",
75
- "@umituz/react-native-localization": "latest",
76
- "@umituz/react-native-notifications": "latest",
77
- "@umituz/react-native-onboarding": "latest",
75
+ "@umituz/react-native-localization": "*",
76
+ "@umituz/react-native-notifications": "*",
77
+ "@umituz/react-native-onboarding": "*",
78
78
  "@umituz/react-native-sentry": "^1.4.2",
79
- "@umituz/react-native-storage": "latest",
80
- "@umituz/react-native-tanstack": "latest",
79
+ "@umituz/react-native-storage": "*",
80
+ "@umituz/react-native-tanstack": "*",
81
81
  "@umituz/react-native-uuid": "^1.2.2",
82
82
  "eslint": "^8.57.0",
83
+ "eslint-plugin-react": "^7.37.5",
84
+ "eslint-plugin-react-native": "^5.0.0",
83
85
  "expo-apple-authentication": "^8.0.8",
84
86
  "expo-application": "^7.0.8",
85
87
  "expo-clipboard": "^8.0.8",
@@ -8,7 +8,7 @@ import { AboutSettingItem } from './AboutSettingItem';
8
8
  import { AppInfo } from '../../domain/entities/AppInfo';
9
9
  import { AboutConfig } from '../../domain/entities/AppInfo';
10
10
 
11
- import { useResponsiveDesignTokens } from '@umituz/react-native-design-system';
11
+ import { useAppDesignTokens } from '@umituz/react-native-design-system';
12
12
 
13
13
  export interface AboutContentProps {
14
14
  /** App information to display */
@@ -18,7 +18,7 @@ export interface AboutContentProps {
18
18
  }
19
19
 
20
20
  const AboutSectionHeader: React.FC<{ title: string }> = ({ title }) => {
21
- const tokens = useResponsiveDesignTokens();
21
+ const tokens = useAppDesignTokens();
22
22
  const colors = tokens.colors;
23
23
 
24
24
  return (
@@ -26,7 +26,7 @@ export interface AboutHeaderProps {
26
26
  testID?: string;
27
27
  }
28
28
 
29
- import { useResponsiveDesignTokens } from '@umituz/react-native-design-system';
29
+ import { useAppDesignTokens } from '@umituz/react-native-design-system';
30
30
 
31
31
  export const AboutHeader: React.FC<AboutHeaderProps> = ({
32
32
  appInfo,
@@ -37,7 +37,7 @@ export const AboutHeader: React.FC<AboutHeaderProps> = ({
37
37
  versionPrefix = "Version",
38
38
  testID,
39
39
  }) => {
40
- const tokens = useResponsiveDesignTokens();
40
+ const tokens = useAppDesignTokens();
41
41
  const colors = tokens.colors;
42
42
 
43
43
  return (
@@ -45,7 +45,7 @@ export interface AboutSettingItemProps {
45
45
  chevronColor?: string;
46
46
  }
47
47
 
48
- import { useResponsiveDesignTokens } from '@umituz/react-native-design-system';
48
+ import { useAppDesignTokens } from '@umituz/react-native-design-system';
49
49
 
50
50
  export const AboutSettingItem: React.FC<AboutSettingItemProps> = ({
51
51
  icon,
@@ -63,7 +63,7 @@ export const AboutSettingItem: React.FC<AboutSettingItemProps> = ({
63
63
  testID,
64
64
  chevronColor,
65
65
  }) => {
66
- const tokens = useResponsiveDesignTokens();
66
+ const tokens = useAppDesignTokens();
67
67
  const colors = tokens.colors;
68
68
 
69
69
  // Memoize container type to prevent unnecessary re-renders
@@ -38,7 +38,7 @@ export interface AboutScreenProps {
38
38
  }
39
39
 
40
40
  import { useAboutInfo } from '../hooks/useAboutInfo';
41
- import { useResponsiveDesignTokens, AtomicText } from '@umituz/react-native-design-system';
41
+ import { useAppDesignTokens, AtomicText } from '@umituz/react-native-design-system';
42
42
 
43
43
  export const AboutScreen: React.FC<AboutScreenProps> = ({
44
44
  config,
@@ -51,7 +51,7 @@ export const AboutScreen: React.FC<AboutScreenProps> = ({
51
51
  footerComponent,
52
52
  testID,
53
53
  }) => {
54
- const tokens = useResponsiveDesignTokens();
54
+ const tokens = useAppDesignTokens();
55
55
  const colors = tokens.colors;
56
56
 
57
57
  const { appInfo, loading, error } = useAboutInfo({
@@ -10,7 +10,7 @@ import { View, TouchableOpacity, StyleSheet } from "react-native";
10
10
  import {
11
11
  AtomicIcon,
12
12
  AtomicText,
13
- useResponsiveDesignTokens,
13
+ useAppDesignTokens,
14
14
  } from "@umituz/react-native-design-system";
15
15
 
16
16
  interface ColorPickerProps {
@@ -26,7 +26,7 @@ export const ColorPicker: React.FC<ColorPickerProps> = ({
26
26
  onValueChange,
27
27
  colors,
28
28
  }) => {
29
- const tokens = useResponsiveDesignTokens();
29
+ const tokens = useAppDesignTokens();
30
30
 
31
31
  // Memoize styles to prevent unnecessary re-creation
32
32
  const styles = useMemo(() => getStyles(tokens), [tokens]);
@@ -84,7 +84,7 @@ export const ColorPicker: React.FC<ColorPickerProps> = ({
84
84
  );
85
85
  };
86
86
 
87
- const getStyles = (tokens: ReturnType<typeof useResponsiveDesignTokens>) =>
87
+ const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) =>
88
88
  StyleSheet.create({
89
89
  container: {
90
90
  marginBottom: 16,
@@ -8,7 +8,7 @@
8
8
  import React from "react";
9
9
  import { View, TouchableOpacity, StyleSheet } from "react-native";
10
10
  import { AtomicText, AtomicIcon } from "@umituz/react-native-design-system";
11
- import { useResponsiveDesignTokens } from "@umituz/react-native-design-system";
11
+ import { useAppDesignTokens } from "@umituz/react-native-design-system";
12
12
  import type { ThemeMode } from "../../types";
13
13
 
14
14
  interface ThemeOptionProps {
@@ -30,7 +30,7 @@ export const ThemeOption: React.FC<ThemeOptionProps> = ({
30
30
  isSelected,
31
31
  onSelect,
32
32
  }) => {
33
- const tokens = useResponsiveDesignTokens();
33
+ const tokens = useAppDesignTokens();
34
34
  const styles = getStyles(tokens);
35
35
  const iconName = mode === "dark" ? "moon-outline" : mode === "light" ? "sunny-outline" : "desktop-outline";
36
36
 
@@ -89,7 +89,7 @@ export const ThemeOption: React.FC<ThemeOptionProps> = ({
89
89
  );
90
90
  };
91
91
 
92
- const getStyles = (tokens: ReturnType<typeof useResponsiveDesignTokens>) =>
92
+ const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) =>
93
93
  StyleSheet.create({
94
94
  container: {
95
95
  backgroundColor: tokens.colors.surface,
@@ -7,7 +7,7 @@
7
7
 
8
8
  import React, { useMemo, useCallback } from "react";
9
9
  import { ScrollView, StyleSheet, View } from "react-native";
10
- import { useResponsiveDesignTokens } from "@umituz/react-native-design-system";
10
+ import { useAppDesignTokens } from "@umituz/react-native-design-system";
11
11
  import { useAppearance, useAppearanceActions } from "../../hooks";
12
12
  import {
13
13
  AppearanceHeader,
@@ -63,7 +63,7 @@ export const AppearanceScreen: React.FC<AppearanceScreenProps> = ({
63
63
  containerStyle,
64
64
  contentContainerStyle,
65
65
  }) => {
66
- const tokens = useResponsiveDesignTokens();
66
+ const tokens = useAppDesignTokens();
67
67
  const { themeMode } = useAppearance();
68
68
  const {
69
69
  localCustomColors,
@@ -211,7 +211,7 @@ export const AppearanceScreen: React.FC<AppearanceScreenProps> = ({
211
211
  );
212
212
  };
213
213
 
214
- const getStyles = (tokens: ReturnType<typeof useResponsiveDesignTokens>) =>
214
+ const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) =>
215
215
  StyleSheet.create({
216
216
  container: {
217
217
  flex: 1,
@@ -7,10 +7,17 @@ export interface FAQItem {
7
7
  question: string;
8
8
  answer: string;
9
9
  categoryId?: string;
10
+ tags?: readonly string[];
11
+ featured?: boolean;
12
+ order?: number;
13
+ metadata?: Record<string, unknown>;
10
14
  }
11
15
 
12
16
  export interface FAQCategory {
13
17
  id: string;
14
18
  title: string;
15
19
  items: FAQItem[];
20
+ description?: string;
21
+ icon?: string;
22
+ order?: number;
16
23
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * FAQ Search Service
3
- * Handles searching FAQ items
3
+ * Handles searching FAQ items with advanced features
4
4
  */
5
5
 
6
6
  import { FAQItem, FAQCategory } from "../entities/FAQEntity";
@@ -11,10 +11,15 @@ export class FAQSearchService {
11
11
 
12
12
  const normalizedQuery = query.toLowerCase().trim();
13
13
 
14
- return items.filter(item =>
15
- item.question.toLowerCase().includes(normalizedQuery) ||
16
- item.answer.toLowerCase().includes(normalizedQuery)
17
- );
14
+ return items.filter(item => {
15
+ const questionMatch = item.question.toLowerCase().includes(normalizedQuery);
16
+ const answerMatch = item.answer.toLowerCase().includes(normalizedQuery);
17
+ const tagMatch = item.tags?.some(tag =>
18
+ tag.toLowerCase().includes(normalizedQuery)
19
+ ) || false;
20
+
21
+ return questionMatch || answerMatch || tagMatch;
22
+ });
18
23
  }
19
24
 
20
25
  static searchCategories(query: string, categories: FAQCategory[]): FAQCategory[] {
@@ -25,12 +30,30 @@ export class FAQSearchService {
25
30
  return categories
26
31
  .map(category => ({
27
32
  ...category,
28
- items: category.items.filter(item =>
29
- item.question.toLowerCase().includes(normalizedQuery) ||
30
- item.answer.toLowerCase().includes(normalizedQuery) ||
31
- category.title.toLowerCase().includes(normalizedQuery)
32
- )
33
+ items: category.items.filter(item => {
34
+ const questionMatch = item.question.toLowerCase().includes(normalizedQuery);
35
+ const answerMatch = item.answer.toLowerCase().includes(normalizedQuery);
36
+ const categoryMatch = category.title.toLowerCase().includes(normalizedQuery);
37
+ const categoryDescMatch = category.description?.toLowerCase().includes(normalizedQuery) || false;
38
+ const tagMatch = item.tags?.some(tag =>
39
+ tag.toLowerCase().includes(normalizedQuery)
40
+ ) || false;
41
+
42
+ return questionMatch || answerMatch || categoryMatch || categoryDescMatch || tagMatch;
43
+ })
33
44
  }))
34
45
  .filter(category => category.items.length > 0);
35
46
  }
47
+
48
+ static getFeaturedItems(items: FAQItem[]): FAQItem[] {
49
+ return items.filter(item => item.featured === true);
50
+ }
51
+
52
+ static sortByOrder(items: FAQItem[]): FAQItem[] {
53
+ return [...items].sort((a, b) => (a.order || 0) - (b.order || 0));
54
+ }
55
+
56
+ static sortCategoriesByOrder(categories: FAQCategory[]): FAQCategory[] {
57
+ return [...categories].sort((a, b) => (a.order || 0) - (b.order || 0));
58
+ }
36
59
  }
@@ -6,7 +6,7 @@
6
6
 
7
7
  import React, { useMemo } from 'react';
8
8
  import { View, StyleSheet, ViewStyle } from 'react-native';
9
- import { useResponsiveDesignTokens, AtomicText } from '@umituz/react-native-design-system';
9
+ import { useAppDesignTokens, AtomicText } from '@umituz/react-native-design-system';
10
10
  import { FAQCategory as FAQCategoryType } from '../../domain/entities/FAQEntity';
11
11
  import { FAQItemComponent, FAQItemStyles } from './FAQItem';
12
12
 
@@ -29,18 +29,26 @@ export const FAQCategoryComponent: React.FC<FAQCategoryProps> = ({
29
29
  onToggleItem,
30
30
  styles: customStyles,
31
31
  }) => {
32
- const tokens = useResponsiveDesignTokens();
32
+ const tokens = useAppDesignTokens();
33
33
 
34
34
  const styles = useMemo(
35
35
  () =>
36
36
  StyleSheet.create({
37
37
  container: {
38
- marginBottom: tokens.spacing.lg,
38
+ marginBottom: tokens.spacing.xl,
39
39
  },
40
40
  titleContainer: {
41
- marginBottom: tokens.spacing.md,
42
- paddingHorizontal: tokens.spacing.md,
41
+ marginBottom: tokens.spacing.sm,
42
+ paddingHorizontal: tokens.spacing.lg,
43
+ flexDirection: 'row',
44
+ alignItems: 'center',
43
45
  },
46
+ titleLine: {
47
+ flex: 1,
48
+ height: 1,
49
+ backgroundColor: tokens.colors.border,
50
+ marginLeft: tokens.spacing.md,
51
+ }
44
52
  }),
45
53
  [tokens]
46
54
  );
@@ -49,12 +57,13 @@ export const FAQCategoryComponent: React.FC<FAQCategoryProps> = ({
49
57
  <View style={[styles.container, customStyles?.container]}>
50
58
  <View style={styles.titleContainer}>
51
59
  <AtomicText
52
- type="headlineSmall"
53
- color="textPrimary"
54
- style={customStyles?.titleStyle}
60
+ type="labelLarge"
61
+ color="textSecondary"
62
+ style={[{ textTransform: 'uppercase', letterSpacing: 1, fontWeight: '700' }, customStyles?.titleStyle]}
55
63
  >
56
64
  {category.title}
57
65
  </AtomicText>
66
+ <View style={styles.titleLine} />
58
67
  </View>
59
68
  {category.items.map((item, index) => (
60
69
  <FAQItemComponent
@@ -6,7 +6,7 @@
6
6
 
7
7
  import React, { useMemo } from 'react';
8
8
  import { View, Text, StyleSheet, ViewStyle, TextStyle } from 'react-native';
9
- import { useResponsiveDesignTokens, AtomicText } from '@umituz/react-native-design-system';
9
+ import { useAppDesignTokens, AtomicText } from '@umituz/react-native-design-system';
10
10
 
11
11
  export interface FAQEmptyStateStyles {
12
12
  container?: ViewStyle;
@@ -28,7 +28,7 @@ export const FAQEmptyState: React.FC<FAQEmptyStateProps> = ({
28
28
  icon = '❓',
29
29
  styles: customStyles,
30
30
  }) => {
31
- const tokens = useResponsiveDesignTokens();
31
+ const tokens = useAppDesignTokens();
32
32
 
33
33
  const styles = useMemo(
34
34
  () =>
@@ -6,7 +6,7 @@
6
6
 
7
7
  import React, { useMemo } from 'react';
8
8
  import { View, TouchableOpacity, StyleSheet, ViewStyle } from 'react-native';
9
- import { useResponsiveDesignTokens, AtomicText, AtomicIcon } from '@umituz/react-native-design-system';
9
+ import { useAppDesignTokens, AtomicText, AtomicIcon } from '@umituz/react-native-design-system';
10
10
  import { FAQItem as FAQItemType } from '../../domain/entities/FAQEntity';
11
11
 
12
12
  export interface FAQItemStyles {
@@ -32,36 +32,49 @@ export const FAQItemComponent: React.FC<FAQItemProps> = ({
32
32
  onToggle,
33
33
  styles: customStyles,
34
34
  }) => {
35
- const tokens = useResponsiveDesignTokens();
35
+ const tokens = useAppDesignTokens();
36
36
 
37
37
  const styles = useMemo(
38
38
  () =>
39
39
  StyleSheet.create({
40
40
  container: {
41
41
  marginHorizontal: tokens.spacing.md,
42
- marginBottom: tokens.spacing.xs,
43
- borderRadius: 12,
42
+ marginBottom: tokens.spacing.sm,
43
+ borderRadius: 20,
44
44
  backgroundColor: tokens.colors.surface,
45
45
  borderWidth: 1,
46
- borderColor: tokens.colors.border,
46
+ borderColor: isExpanded ? tokens.colors.primary : tokens.colors.border,
47
+ overflow: 'hidden',
47
48
  },
48
49
  header: {
49
- flexDirection: 'row' as const,
50
- alignItems: 'center' as const,
51
- padding: tokens.spacing.md,
50
+ flexDirection: 'row',
51
+ alignItems: 'center',
52
+ padding: tokens.spacing.lg,
52
53
  },
53
54
  content: {
54
55
  flex: 1,
55
- marginRight: tokens.spacing.xs,
56
+ marginRight: tokens.spacing.md,
57
+ },
58
+ questionText: {
59
+ fontWeight: '700',
56
60
  },
57
61
  answerContainer: {
58
- paddingHorizontal: tokens.spacing.md,
59
- paddingBottom: tokens.spacing.md,
62
+ paddingHorizontal: tokens.spacing.lg,
63
+ paddingBottom: tokens.spacing.lg,
60
64
  borderTopWidth: 1,
61
65
  borderTopColor: tokens.colors.borderLight,
66
+ backgroundColor: tokens.colors.surfaceSecondary || tokens.colors.backgroundSecondary,
67
+ },
68
+ iconContainer: {
69
+ width: 36,
70
+ height: 36,
71
+ borderRadius: 18,
72
+ backgroundColor: isExpanded ? tokens.colors.primary : tokens.colors.surfaceSecondary || tokens.colors.backgroundSecondary,
73
+ alignItems: 'center',
74
+ justifyContent: 'center',
62
75
  },
63
76
  }),
64
- [tokens]
77
+ [tokens, isExpanded]
65
78
  );
66
79
 
67
80
  return (
@@ -69,22 +82,24 @@ export const FAQItemComponent: React.FC<FAQItemProps> = ({
69
82
  <TouchableOpacity
70
83
  onPress={onToggle}
71
84
  style={[styles.header, customStyles?.header]}
72
- activeOpacity={0.7}
85
+ activeOpacity={0.8}
73
86
  >
74
87
  <View style={[styles.content, customStyles?.content]}>
75
88
  <AtomicText
76
89
  type="bodyLarge"
77
- color="textPrimary"
78
- style={customStyles?.questionStyle}
79
- numberOfLines={isExpanded ? undefined : 2}
90
+ color={isExpanded ? "primary" : "textPrimary"}
91
+ style={[styles.questionText, customStyles?.questionStyle]}
80
92
  >
81
93
  {item.question}
82
94
  </AtomicText>
83
95
  </View>
84
- <AtomicIcon
85
- name={isExpanded ? 'chevron-up' : 'chevron-down'}
86
- size={20}
87
- />
96
+ <View style={styles.iconContainer}>
97
+ <AtomicIcon
98
+ name={isExpanded ? 'chevron-up' : 'chevron-down'}
99
+ size={20}
100
+ color={isExpanded ? "onPrimary" : "textSecondary"}
101
+ />
102
+ </View>
88
103
  </TouchableOpacity>
89
104
 
90
105
  {isExpanded && (
@@ -92,7 +107,7 @@ export const FAQItemComponent: React.FC<FAQItemProps> = ({
92
107
  <AtomicText
93
108
  type="bodyMedium"
94
109
  color="textSecondary"
95
- style={customStyles?.answerStyle}
110
+ style={[{ lineHeight: 22 }, customStyles?.answerStyle]}
96
111
  >
97
112
  {item.answer}
98
113
  </AtomicText>
@@ -6,7 +6,7 @@
6
6
 
7
7
  import React, { useMemo } from 'react';
8
8
  import { View, TextInput, StyleSheet, ViewStyle, TextStyle } from 'react-native';
9
- import { useResponsiveDesignTokens, AtomicIcon } from '@umituz/react-native-design-system';
9
+ import { useAppDesignTokens, AtomicIcon } from '@umituz/react-native-design-system';
10
10
 
11
11
  export interface FAQSearchBarStyles {
12
12
  container?: ViewStyle;
@@ -26,26 +26,27 @@ export const FAQSearchBar: React.FC<FAQSearchBarProps> = ({
26
26
  placeholder,
27
27
  styles: customStyles,
28
28
  }) => {
29
- const tokens = useResponsiveDesignTokens();
29
+ const tokens = useAppDesignTokens();
30
30
 
31
31
  const styles = useMemo(
32
32
  () =>
33
33
  StyleSheet.create({
34
34
  container: {
35
- flexDirection: 'row' as const,
36
- alignItems: 'center' as const,
37
- backgroundColor: tokens.colors.surface,
38
- borderRadius: 12,
39
- paddingHorizontal: tokens.spacing.sm,
35
+ flexDirection: 'row',
36
+ alignItems: 'center',
37
+ backgroundColor: tokens.colors.surfaceSecondary || tokens.colors.backgroundSecondary,
38
+ borderRadius: 16,
39
+ paddingHorizontal: tokens.spacing.md,
40
40
  borderWidth: 1,
41
- borderColor: tokens.colors.border,
41
+ borderColor: tokens.colors.borderLight,
42
+ height: 48,
42
43
  },
43
44
  iconContainer: {
44
- marginRight: tokens.spacing.xs,
45
+ marginRight: tokens.spacing.sm,
45
46
  },
46
47
  input: {
47
48
  flex: 1,
48
- paddingVertical: tokens.spacing.sm,
49
+ height: '100%',
49
50
  fontSize: 16,
50
51
  color: tokens.colors.textPrimary,
51
52
  },
@@ -56,7 +57,7 @@ export const FAQSearchBar: React.FC<FAQSearchBarProps> = ({
56
57
  return (
57
58
  <View style={[styles.container, customStyles?.container]}>
58
59
  <View style={styles.iconContainer}>
59
- <AtomicIcon name="search" size={18} />
60
+ <AtomicIcon name="search" size={18} color="textSecondary" />
60
61
  </View>
61
62
  <TextInput
62
63
  style={[styles.input, customStyles?.input]}