@umituz/react-native-design-system 1.5.36 → 1.5.38

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 (62) hide show
  1. package/README.md +2 -2
  2. package/package.json +7 -5
  3. package/src/index.ts +29 -221
  4. package/src/presentation/organisms/AppHeader.tsx +3 -5
  5. package/src/presentation/tokens/commonStyles.ts +1 -1
  6. package/src/presentation/atoms/AtomicAvatar.tsx +0 -157
  7. package/src/presentation/atoms/AtomicAvatarGroup.tsx +0 -169
  8. package/src/presentation/atoms/AtomicBadge.tsx +0 -232
  9. package/src/presentation/atoms/AtomicButton.tsx +0 -236
  10. package/src/presentation/atoms/AtomicCard.tsx +0 -107
  11. package/src/presentation/atoms/AtomicChip.tsx +0 -223
  12. package/src/presentation/atoms/AtomicDatePicker.tsx +0 -347
  13. package/src/presentation/atoms/AtomicDivider.tsx +0 -114
  14. package/src/presentation/atoms/AtomicFab.tsx +0 -98
  15. package/src/presentation/atoms/AtomicFilter.tsx +0 -154
  16. package/src/presentation/atoms/AtomicFormError.tsx +0 -105
  17. package/src/presentation/atoms/AtomicIcon.tsx +0 -40
  18. package/src/presentation/atoms/AtomicImage.tsx +0 -149
  19. package/src/presentation/atoms/AtomicInput.tsx +0 -363
  20. package/src/presentation/atoms/AtomicNumberInput.tsx +0 -182
  21. package/src/presentation/atoms/AtomicPicker.tsx +0 -458
  22. package/src/presentation/atoms/AtomicProgress.tsx +0 -139
  23. package/src/presentation/atoms/AtomicSearchBar.tsx +0 -114
  24. package/src/presentation/atoms/AtomicSort.tsx +0 -145
  25. package/src/presentation/atoms/AtomicSwitch.tsx +0 -166
  26. package/src/presentation/atoms/AtomicText.tsx +0 -55
  27. package/src/presentation/atoms/AtomicTextArea.tsx +0 -313
  28. package/src/presentation/atoms/AtomicTouchable.tsx +0 -209
  29. package/src/presentation/atoms/fab/styles/fabStyles.ts +0 -69
  30. package/src/presentation/atoms/fab/types/index.ts +0 -82
  31. package/src/presentation/atoms/filter/styles/filterStyles.ts +0 -32
  32. package/src/presentation/atoms/filter/types/index.ts +0 -89
  33. package/src/presentation/atoms/index.ts +0 -366
  34. package/src/presentation/atoms/input/hooks/useInputState.ts +0 -15
  35. package/src/presentation/atoms/input/styles/inputStyles.ts +0 -66
  36. package/src/presentation/atoms/input/types/index.ts +0 -25
  37. package/src/presentation/atoms/picker/styles/pickerStyles.ts +0 -207
  38. package/src/presentation/atoms/picker/types/index.ts +0 -40
  39. package/src/presentation/atoms/touchable/styles/touchableStyles.ts +0 -62
  40. package/src/presentation/atoms/touchable/types/index.ts +0 -155
  41. package/src/presentation/hooks/useResponsive.ts +0 -180
  42. package/src/presentation/molecules/AtomicConfirmationModal.tsx +0 -243
  43. package/src/presentation/molecules/EmptyState.tsx +0 -130
  44. package/src/presentation/molecules/FormField.tsx +0 -128
  45. package/src/presentation/molecules/GridContainer.tsx +0 -124
  46. package/src/presentation/molecules/IconContainer.tsx +0 -94
  47. package/src/presentation/molecules/ListItem.tsx +0 -36
  48. package/src/presentation/molecules/ScreenHeader.tsx +0 -140
  49. package/src/presentation/molecules/SearchBar.tsx +0 -85
  50. package/src/presentation/molecules/SectionCard.tsx +0 -74
  51. package/src/presentation/molecules/SectionContainer.tsx +0 -106
  52. package/src/presentation/molecules/SectionHeader.tsx +0 -125
  53. package/src/presentation/molecules/confirmation-modal/styles/confirmationModalStyles.ts +0 -133
  54. package/src/presentation/molecules/confirmation-modal/types/index.ts +0 -105
  55. package/src/presentation/molecules/index.ts +0 -41
  56. package/src/presentation/molecules/listitem/styles/listItemStyles.ts +0 -19
  57. package/src/presentation/molecules/listitem/types/index.ts +0 -17
  58. package/src/presentation/organisms/FormContainer.tsx +0 -180
  59. package/src/presentation/organisms/ScreenLayout.tsx +0 -171
  60. package/src/presentation/organisms/index.ts +0 -25
  61. package/src/presentation/utils/platformConstants.ts +0 -124
  62. package/src/presentation/utils/responsive.ts +0 -516
@@ -1,366 +0,0 @@
1
- /**
2
- * Atomic Components Export Index
3
- *
4
- * Centralized export file for all atomic design components
5
- * Following atomic design principles with React Native implementation
6
- *
7
- * Generated for {{APP_NAME}} - {{CATEGORY}} category
8
- * Theme: {{THEME_NAME}}
9
- *
10
- * Usage:
11
- * ```typescript
12
- * import { AtomicButton, AtomicText, AtomicCard } from '@domains/design-system';
13
- *
14
- * // Or individual imports
15
- * import { AtomicButton } from '@domains/design-system';
16
- * ```
17
- */
18
-
19
- // STEP 1: Import all components first (required for default export)
20
- import {
21
- AtomicButton,
22
- type AtomicButtonProps,
23
- } from './AtomicButton';
24
-
25
- import {
26
- AtomicText,
27
- type AtomicTextProps,
28
- } from './AtomicText';
29
-
30
- import {
31
- AtomicCard,
32
- type AtomicCardProps,
33
- type AtomicCardVariant,
34
- type AtomicCardPadding,
35
- } from './AtomicCard';
36
-
37
- import {
38
- AtomicInput,
39
- type AtomicInputProps,
40
- type AtomicInputVariant,
41
- type AtomicInputState,
42
- type AtomicInputSize,
43
- } from './AtomicInput';
44
-
45
- import {
46
- AtomicIcon,
47
- type AtomicIconProps,
48
- type AtomicIconSize,
49
- type AtomicIconColor,
50
- } from './AtomicIcon';
51
-
52
- import {
53
- AtomicImage,
54
- type AtomicImageProps,
55
- } from './AtomicImage';
56
-
57
- import {
58
- AtomicSwitch,
59
- type AtomicSwitchProps,
60
- } from './AtomicSwitch';
61
-
62
- import {
63
- AtomicBadge,
64
- type AtomicBadgeProps,
65
- } from './AtomicBadge';
66
-
67
- import {
68
- AtomicFormError,
69
- type AtomicFormErrorProps,
70
- } from './AtomicFormError';
71
-
72
- import {
73
- AtomicAvatar,
74
- type AtomicAvatarProps,
75
- } from './AtomicAvatar';
76
-
77
- import {
78
- AtomicChip,
79
- type AtomicChipProps,
80
- } from './AtomicChip';
81
-
82
- import {
83
- AtomicDivider,
84
- type AtomicDividerProps,
85
- } from './AtomicDivider';
86
-
87
- import {
88
- AtomicProgress,
89
- type AtomicProgressProps,
90
- } from './AtomicProgress';
91
-
92
- import {
93
- AtomicAvatarGroup,
94
- type AtomicAvatarGroupProps,
95
- type AvatarData,
96
- } from './AtomicAvatarGroup';
97
-
98
- import {
99
- AtomicFab,
100
- type AtomicFabProps,
101
- type FabSize,
102
- type FabVariant,
103
- getFabVariants,
104
- } from './AtomicFab';
105
-
106
- import {
107
- AtomicFilter,
108
- type AtomicFilterProps,
109
- type FilterOption,
110
- getFilterContainerStyle,
111
- getClearAllContainerStyle,
112
- getScrollContentContainerStyle,
113
- } from './AtomicFilter';
114
-
115
- import {
116
- AtomicTouchable,
117
- type AtomicTouchableProps,
118
- type TouchableFeedback,
119
- type FeedbackStrength,
120
- type HitSlop,
121
- TouchablePresets,
122
- getOpacityValue,
123
- normalizeHitSlop,
124
- } from './AtomicTouchable';
125
-
126
- // STEP 2: Re-export all components (for named imports)
127
- export {
128
- AtomicButton,
129
- type AtomicButtonProps,
130
- };
131
-
132
- // Helper types extracted from ButtonVariantConfig
133
-
134
- export {
135
- AtomicText,
136
- type AtomicTextProps,
137
- };
138
-
139
- export {
140
- AtomicCard,
141
- type AtomicCardProps,
142
- type AtomicCardVariant,
143
- type AtomicCardPadding,
144
- };
145
-
146
- export {
147
- AtomicInput,
148
- type AtomicInputProps,
149
- type AtomicInputVariant,
150
- type AtomicInputState,
151
- type AtomicInputSize,
152
- };
153
-
154
- export {
155
- AtomicIcon,
156
- type AtomicIconProps,
157
- type AtomicIconSize,
158
- type AtomicIconColor,
159
- };
160
-
161
- export {
162
- AtomicImage,
163
- type AtomicImageProps,
164
- };
165
-
166
- export {
167
- AtomicSwitch,
168
- type AtomicSwitchProps,
169
- };
170
-
171
- export {
172
- AtomicBadge,
173
- type AtomicBadgeProps,
174
- };
175
-
176
- export {
177
- AtomicFormError,
178
- type AtomicFormErrorProps,
179
- };
180
-
181
- export {
182
- AtomicAvatar,
183
- type AtomicAvatarProps,
184
- };
185
-
186
- export {
187
- AtomicChip,
188
- type AtomicChipProps,
189
- };
190
-
191
- export {
192
- AtomicDivider,
193
- type AtomicDividerProps,
194
- };
195
-
196
- export {
197
- AtomicProgress,
198
- type AtomicProgressProps,
199
- };
200
-
201
- export {
202
- AtomicAvatarGroup,
203
- type AtomicAvatarGroupProps,
204
- type AvatarData,
205
- };
206
-
207
- export {
208
- AtomicFab,
209
- type AtomicFabProps,
210
- type FabSize,
211
- type FabVariant,
212
- getFabVariants,
213
- };
214
-
215
- export {
216
- AtomicFilter,
217
- type AtomicFilterProps,
218
- type FilterOption,
219
- getFilterContainerStyle,
220
- getClearAllContainerStyle,
221
- getScrollContentContainerStyle,
222
- };
223
-
224
- export {
225
- AtomicTouchable,
226
- type AtomicTouchableProps,
227
- type TouchableFeedback,
228
- type FeedbackStrength,
229
- type HitSlop,
230
- TouchablePresets,
231
- getOpacityValue,
232
- normalizeHitSlop,
233
- };
234
-
235
- /**
236
- * Convenience re-exports for common patterns
237
- */
238
-
239
- // All atomic component types
240
- export type AtomicComponentProps =
241
- | AtomicButtonProps
242
- | AtomicTextProps
243
- | AtomicCardProps
244
- | AtomicInputProps
245
- | AtomicIconProps
246
- | AtomicImageProps
247
- | AtomicSwitchProps
248
- | AtomicBadgeProps
249
- | AtomicFormErrorProps
250
- | AtomicAvatarProps
251
- | AtomicChipProps
252
- | AtomicDividerProps
253
- | AtomicProgressProps
254
- | AtomicAvatarGroupProps
255
- | AtomicFabProps
256
- | AtomicFilterProps
257
- | AtomicTouchableProps;
258
-
259
- // All variant types for theme consistency
260
- export type AtomicVariants = {
261
- card: AtomicCardVariant;
262
- input: AtomicInputVariant;
263
- icon: AtomicIconSize;
264
- };
265
-
266
- // All color types for design system consistency
267
- export type AtomicColors = AtomicIconColor;
268
-
269
- /**
270
- * Atomic component utilities
271
- */
272
- export const AtomicUtils = {
273
- /**
274
- * Get recommended component combinations for common UI patterns
275
- */
276
- getRecommendedCombinations: () => ({
277
- // Card with header
278
- cardWithHeader: {
279
- card: { variant: 'elevated' as const, padding: 'lg' as const },
280
- title: { variant: 'titleLarge' as const, color: 'primary' as const },
281
- description: { variant: 'bodyMedium' as const, color: 'secondary' as const },
282
- },
283
-
284
- // Form field
285
- formField: {
286
- input: { variant: 'outlined' as const, size: 'md' as const },
287
- label: { variant: 'labelMedium' as const, color: 'primary' as const },
288
- helper: { variant: 'bodySmall' as const, color: 'secondary' as const },
289
- },
290
-
291
- // Action button
292
- primaryAction: {
293
- button: { variant: 'primary' as const, size: 'lg' as const },
294
- text: { variant: 'labelLarge' as const, color: 'onPrimary' as const },
295
- icon: { size: 'md' as const, color: 'onPrimary' as const },
296
- },
297
-
298
- // Secondary action
299
- secondaryAction: {
300
- button: { variant: 'outline' as const, size: 'md' as const },
301
- text: { variant: 'labelMedium' as const, color: 'primary' as const },
302
- icon: { size: 'sm' as const, color: 'primary' as const },
303
- },
304
- }),
305
-
306
- /**
307
- * Validate component prop combinations
308
- */
309
- validatePropCombination: (componentType: keyof AtomicVariants, props: any): boolean => {
310
- // Add validation logic here for prop combinations
311
- // This helps catch design system violations early
312
- return true;
313
- },
314
-
315
- /**
316
- * Get accessibility guidelines for component combinations
317
- */
318
- getAccessibilityGuidelines: () => ({
319
- button: {
320
- minimumTouchTarget: 48,
321
- requiresAccessibilityLabel: true,
322
- supportsAccessibilityHint: true,
323
- },
324
- input: {
325
- requiresLabel: true,
326
- supportsHelperText: true,
327
- requiresAccessibilityLabel: true,
328
- },
329
- card: {
330
- supportsAccessibilityRole: true,
331
- canBeAccessibilityContainer: true,
332
- },
333
- text: {
334
- supportsAccessibilityLabel: true,
335
- respectsSystemTextSize: true,
336
- },
337
- icon: {
338
- requiresAccessibilityLabel: true,
339
- supportsAccessibilityHint: false,
340
- },
341
- }),
342
- };
343
-
344
- // STEP 3: Default export (now all components are available in scope)
345
- const defaultExport = {
346
- AtomicButton,
347
- AtomicText,
348
- AtomicCard,
349
- AtomicInput,
350
- AtomicIcon,
351
- AtomicImage,
352
- AtomicSwitch,
353
- AtomicBadge,
354
- AtomicFormError,
355
- AtomicAvatar,
356
- AtomicChip,
357
- AtomicDivider,
358
- AtomicProgress,
359
- AtomicAvatarGroup,
360
- AtomicFab,
361
- AtomicFilter,
362
- AtomicTouchable,
363
- AtomicUtils,
364
- };
365
-
366
- export default defaultExport;
@@ -1,15 +0,0 @@
1
- import { useState } from 'react';
2
-
3
- export const useInputState = (secureTextEntry: boolean = false) => {
4
- const [isFocused, setIsFocused] = useState(false);
5
- const [isPasswordVisible, setIsPasswordVisible] = useState(!secureTextEntry);
6
-
7
- const togglePasswordVisibility = () => setIsPasswordVisible(!isPasswordVisible);
8
-
9
- return {
10
- isFocused,
11
- setIsFocused,
12
- isPasswordVisible,
13
- togglePasswordVisibility,
14
- };
15
- };
@@ -1,66 +0,0 @@
1
- import { ViewStyle, TextStyle } from 'react-native';
2
- import { useAppDesignTokens } from '@umituz/react-native-theme';
3
- import { AtomicInputVariant, AtomicInputSize, AtomicInputState } from '../types';
4
-
5
- type DesignTokens = ReturnType<typeof useAppDesignTokens>;
6
-
7
- export const getContainerVariantStyles = (tokens: DesignTokens): Record<AtomicInputVariant, ViewStyle> => ({
8
- outlined: {
9
- borderWidth: 1,
10
- borderRadius: 12,
11
- borderColor: tokens.colors.outline,
12
- },
13
- filled: {
14
- backgroundColor: tokens.colors.surfaceVariant,
15
- borderRadius: 12,
16
- borderBottomWidth: 2,
17
- borderBottomColor: tokens.colors.outline,
18
- },
19
- underlined: {
20
- borderBottomWidth: 1,
21
- borderBottomColor: tokens.colors.outline,
22
- backgroundColor: 'transparent',
23
- },
24
- });
25
-
26
- export const containerSizeStyles: Record<AtomicInputSize, ViewStyle> = {
27
- sm: { height: 40, paddingHorizontal: 12, paddingVertical: 8 },
28
- md: { height: 56, paddingHorizontal: 16, paddingVertical: 16 },
29
- lg: { height: 64, paddingHorizontal: 24, paddingVertical: 20 },
30
- };
31
-
32
- export const getInputSizeStyles = (tokens: DesignTokens): Record<AtomicInputSize, TextStyle> => ({
33
- sm: { fontSize: tokens.typography.bodyMedium.fontSize },
34
- md: { fontSize: tokens.typography.bodyLarge.fontSize },
35
- lg: { fontSize: tokens.typography.bodyLarge.fontSize },
36
- });
37
-
38
- export const getLabelSizeStyles = (tokens: DesignTokens): Record<AtomicInputSize, TextStyle> => ({
39
- sm: { fontSize: tokens.typography.bodySmall.fontSize },
40
- md: { fontSize: tokens.typography.bodyMedium.fontSize },
41
- lg: { fontSize: tokens.typography.bodyLarge.fontSize },
42
- });
43
-
44
- export const getStateStyles = (tokens: DesignTokens): Record<AtomicInputState, ViewStyle> => ({
45
- default: {},
46
- error: { borderColor: tokens.colors.error },
47
- success: { borderColor: tokens.colors.success },
48
- disabled: {
49
- backgroundColor: tokens.colors.surfaceDisabled,
50
- borderColor: tokens.colors.outlineDisabled,
51
- },
52
- });
53
-
54
- export const getFocusStyles = (tokens: DesignTokens): Record<AtomicInputVariant, ViewStyle> => ({
55
- outlined: { borderColor: tokens.colors.primary, borderWidth: 2 },
56
- filled: { borderBottomColor: tokens.colors.primary, borderBottomWidth: 2 },
57
- underlined: { borderBottomColor: tokens.colors.primary, borderBottomWidth: 2 },
58
- });
59
-
60
- export const getStateColor = (tokens: DesignTokens, state: AtomicInputState, isFocused: boolean, isDisabled: boolean): string => {
61
- if (isDisabled) return tokens.colors.onSurfaceDisabled;
62
- if (state === 'error') return tokens.colors.error;
63
- if (state === 'success') return tokens.colors.success;
64
- if (isFocused) return tokens.colors.primary;
65
- return tokens.colors.surfaceVariant;
66
- };
@@ -1,25 +0,0 @@
1
- import { TextInputProps, ViewStyle, TextStyle } from 'react-native';
2
-
3
- export type AtomicInputVariant = 'outlined' | 'filled' | 'underlined';
4
- export type AtomicInputState = 'default' | 'error' | 'success' | 'disabled';
5
- export type AtomicInputSize = 'sm' | 'md' | 'lg';
6
-
7
- export interface AtomicInputProps extends Omit<TextInputProps, 'style'> {
8
- variant?: AtomicInputVariant;
9
- state?: AtomicInputState;
10
- size?: AtomicInputSize;
11
- label: string; // Required per CLAUDE.md Rule 16
12
- helperText?: string;
13
- leadingIcon?: React.ReactNode;
14
- trailingIcon?: React.ReactNode;
15
- showPasswordToggle?: boolean;
16
- maxLength?: number;
17
- showCharacterCount?: boolean;
18
- disabled?: boolean;
19
- style?: ViewStyle | ViewStyle[];
20
- containerStyle?: ViewStyle | ViewStyle[];
21
- inputStyle?: TextStyle | TextStyle[];
22
- labelStyle?: TextStyle | TextStyle[];
23
- helperTextStyle?: TextStyle | TextStyle[];
24
- testID?: string;
25
- }
@@ -1,207 +0,0 @@
1
- import { ViewStyle, TextStyle } from 'react-native';
2
- import { useAppDesignTokens, type DesignTokens } from '@umituz/react-native-theme';
3
- import { PickerSize } from '../types';
4
- import { IOS_HIG, getMinTouchTarget } from '../../../utils/platformConstants';
5
-
6
- /**
7
- * Picker container styles with iOS HIG compliance
8
- *
9
- * All picker sizes meet Apple's minimum touch target requirement of 44pt.
10
- * @see https://developer.apple.com/design/human-interface-guidelines/layout
11
- */
12
- export const getPickerContainerStyles = (tokens: DesignTokens) => ({
13
- base: {
14
- flexDirection: 'row' as const,
15
- alignItems: 'center' as const,
16
- justifyContent: 'space-between' as const,
17
- borderWidth: tokens.borders.width.thin,
18
- borderColor: tokens.colors.border,
19
- backgroundColor: tokens.colors.surface,
20
- },
21
- size: {
22
- // ✅ iOS HIG Compliant: All sizes >= 44pt minimum touch target
23
- sm: {
24
- height: IOS_HIG.MIN_TOUCH_TARGET, // 44pt - iOS minimum
25
- paddingHorizontal: tokens.spacing.sm,
26
- borderRadius: tokens.borders.radius.sm,
27
- },
28
- md: {
29
- height: getMinTouchTarget('input'), // 48pt - Recommended
30
- paddingHorizontal: tokens.spacing.md,
31
- borderRadius: tokens.borders.radius.md,
32
- },
33
- lg: {
34
- height: 56, // 56pt - Large touch target
35
- paddingHorizontal: tokens.spacing.lg,
36
- borderRadius: tokens.borders.radius.md,
37
- },
38
- },
39
- state: {
40
- error: {
41
- borderColor: tokens.colors.error,
42
- borderWidth: tokens.borders.width.medium,
43
- },
44
- disabled: {
45
- backgroundColor: tokens.colors.surfaceDisabled,
46
- opacity: 0.6,
47
- },
48
- },
49
- });
50
-
51
- export const getPickerLabelStyles = (tokens: DesignTokens): {
52
- base: TextStyle;
53
- size: { sm: TextStyle; md: TextStyle; lg: TextStyle };
54
- } => ({
55
- base: {
56
- marginBottom: tokens.spacing.xs,
57
- color: tokens.colors.textPrimary,
58
- fontWeight: '600' as const,
59
- },
60
- size: {
61
- sm: tokens.typography.bodySmall,
62
- md: tokens.typography.bodyMedium,
63
- lg: tokens.typography.bodyLarge,
64
- },
65
- });
66
-
67
- export const getPickerPlaceholderStyles = (tokens: DesignTokens): {
68
- base: TextStyle;
69
- size: { sm: TextStyle; md: TextStyle; lg: TextStyle };
70
- } => ({
71
- base: {
72
- color: tokens.colors.textSecondary,
73
- },
74
- size: {
75
- sm: tokens.typography.bodySmall,
76
- md: tokens.typography.bodyMedium,
77
- lg: tokens.typography.bodyLarge,
78
- },
79
- });
80
-
81
- export const getPickerValueStyles = (tokens: DesignTokens): {
82
- base: TextStyle;
83
- size: { sm: TextStyle; md: TextStyle; lg: TextStyle };
84
- } => ({
85
- base: {
86
- flex: 1,
87
- color: tokens.colors.textPrimary,
88
- },
89
- size: {
90
- sm: tokens.typography.bodySmall,
91
- md: tokens.typography.bodyMedium,
92
- lg: tokens.typography.bodyLarge,
93
- },
94
- });
95
-
96
- export const getPickerErrorStyles = (tokens: DesignTokens): TextStyle => ({
97
- marginTop: tokens.spacing.xs,
98
- color: tokens.colors.error,
99
- ...tokens.typography.bodySmall,
100
- });
101
-
102
- export const getModalOverlayStyles = (tokens: DesignTokens): ViewStyle => ({
103
- flex: 1,
104
- backgroundColor: tokens.colors.overlayMedium,
105
- justifyContent: 'flex-end',
106
- });
107
-
108
- export const getModalContainerStyles = (tokens: DesignTokens, maxHeight: number): ViewStyle => ({
109
- backgroundColor: tokens.colors.backgroundPrimary,
110
- borderTopLeftRadius: tokens.borders.radius.lg,
111
- borderTopRightRadius: tokens.borders.radius.lg,
112
- maxHeight: maxHeight,
113
- paddingBottom: tokens.spacing.lg,
114
- });
115
-
116
- export const getModalHeaderStyles = (tokens: DesignTokens): ViewStyle => ({
117
- flexDirection: 'row',
118
- alignItems: 'center',
119
- justifyContent: 'space-between',
120
- paddingHorizontal: tokens.spacing.lg,
121
- paddingVertical: tokens.spacing.md,
122
- borderBottomWidth: tokens.borders.width.thin,
123
- borderBottomColor: tokens.colors.border,
124
- });
125
-
126
- export const getModalTitleStyles = (tokens: DesignTokens): TextStyle => ({
127
- ...tokens.typography.titleLarge,
128
- color: tokens.colors.textPrimary,
129
- fontWeight: '600',
130
- });
131
-
132
- export const getSearchContainerStyles = (tokens: DesignTokens): ViewStyle => ({
133
- flexDirection: 'row',
134
- alignItems: 'center',
135
- backgroundColor: tokens.colors.surfaceVariant,
136
- paddingHorizontal: tokens.spacing.md,
137
- paddingVertical: tokens.spacing.sm,
138
- marginHorizontal: tokens.spacing.lg,
139
- marginTop: tokens.spacing.md,
140
- borderRadius: tokens.borders.radius.md,
141
- });
142
-
143
- export const getSearchInputStyles = (tokens: DesignTokens): TextStyle => ({
144
- flex: 1,
145
- marginLeft: tokens.spacing.sm,
146
- ...tokens.typography.bodyMedium,
147
- color: tokens.colors.textPrimary,
148
- });
149
-
150
- export const getOptionContainerStyles = (tokens: DesignTokens, isSelected: boolean, isDisabled: boolean): ViewStyle => ({
151
- flexDirection: 'row',
152
- alignItems: 'center',
153
- paddingHorizontal: tokens.spacing.lg,
154
- paddingVertical: tokens.spacing.md,
155
- backgroundColor: isSelected ? tokens.colors.primaryContainer : 'transparent',
156
- opacity: isDisabled ? 0.5 : 1,
157
- });
158
-
159
- export const getOptionTextStyles = (tokens: DesignTokens, isSelected: boolean): TextStyle => ({
160
- flex: 1,
161
- marginLeft: tokens.spacing.sm,
162
- ...tokens.typography.bodyLarge,
163
- color: isSelected ? tokens.colors.primary : tokens.colors.textPrimary,
164
- fontWeight: isSelected ? '600' : '400',
165
- });
166
-
167
- export const getOptionDescriptionStyles = (tokens: DesignTokens): TextStyle => ({
168
- ...tokens.typography.bodySmall,
169
- color: tokens.colors.textSecondary,
170
- marginLeft: tokens.spacing.sm,
171
- marginTop: tokens.spacing.xs,
172
- });
173
-
174
- export const getEmptyStateStyles = (tokens: DesignTokens): ViewStyle => ({
175
- alignItems: 'center',
176
- justifyContent: 'center',
177
- paddingVertical: tokens.spacing.xxl,
178
- });
179
-
180
- export const getEmptyStateTextStyles = (tokens: DesignTokens): TextStyle => ({
181
- ...tokens.typography.bodyLarge,
182
- color: tokens.colors.textSecondary,
183
- textAlign: 'center',
184
- marginTop: tokens.spacing.md,
185
- });
186
-
187
- export const getChipContainerStyles = (tokens: DesignTokens): ViewStyle => ({
188
- flexDirection: 'row',
189
- flexWrap: 'wrap',
190
- gap: tokens.spacing.xs,
191
- marginTop: tokens.spacing.xs,
192
- });
193
-
194
- export const getChipStyles = (tokens: DesignTokens): ViewStyle => ({
195
- flexDirection: 'row',
196
- alignItems: 'center',
197
- backgroundColor: tokens.colors.primaryContainer,
198
- paddingHorizontal: tokens.spacing.sm,
199
- paddingVertical: tokens.spacing.xs,
200
- borderRadius: tokens.borders.radius.sm,
201
- });
202
-
203
- export const getChipTextStyles = (tokens: DesignTokens): TextStyle => ({
204
- ...tokens.typography.bodySmall,
205
- color: tokens.colors.primary,
206
- marginRight: tokens.spacing.xs,
207
- });