@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.
- package/README.md +2 -2
- package/package.json +7 -5
- package/src/index.ts +29 -221
- package/src/presentation/organisms/AppHeader.tsx +3 -5
- package/src/presentation/tokens/commonStyles.ts +1 -1
- package/src/presentation/atoms/AtomicAvatar.tsx +0 -157
- package/src/presentation/atoms/AtomicAvatarGroup.tsx +0 -169
- package/src/presentation/atoms/AtomicBadge.tsx +0 -232
- package/src/presentation/atoms/AtomicButton.tsx +0 -236
- package/src/presentation/atoms/AtomicCard.tsx +0 -107
- package/src/presentation/atoms/AtomicChip.tsx +0 -223
- package/src/presentation/atoms/AtomicDatePicker.tsx +0 -347
- package/src/presentation/atoms/AtomicDivider.tsx +0 -114
- package/src/presentation/atoms/AtomicFab.tsx +0 -98
- package/src/presentation/atoms/AtomicFilter.tsx +0 -154
- package/src/presentation/atoms/AtomicFormError.tsx +0 -105
- package/src/presentation/atoms/AtomicIcon.tsx +0 -40
- package/src/presentation/atoms/AtomicImage.tsx +0 -149
- package/src/presentation/atoms/AtomicInput.tsx +0 -363
- package/src/presentation/atoms/AtomicNumberInput.tsx +0 -182
- package/src/presentation/atoms/AtomicPicker.tsx +0 -458
- package/src/presentation/atoms/AtomicProgress.tsx +0 -139
- package/src/presentation/atoms/AtomicSearchBar.tsx +0 -114
- package/src/presentation/atoms/AtomicSort.tsx +0 -145
- package/src/presentation/atoms/AtomicSwitch.tsx +0 -166
- package/src/presentation/atoms/AtomicText.tsx +0 -55
- package/src/presentation/atoms/AtomicTextArea.tsx +0 -313
- package/src/presentation/atoms/AtomicTouchable.tsx +0 -209
- package/src/presentation/atoms/fab/styles/fabStyles.ts +0 -69
- package/src/presentation/atoms/fab/types/index.ts +0 -82
- package/src/presentation/atoms/filter/styles/filterStyles.ts +0 -32
- package/src/presentation/atoms/filter/types/index.ts +0 -89
- package/src/presentation/atoms/index.ts +0 -366
- package/src/presentation/atoms/input/hooks/useInputState.ts +0 -15
- package/src/presentation/atoms/input/styles/inputStyles.ts +0 -66
- package/src/presentation/atoms/input/types/index.ts +0 -25
- package/src/presentation/atoms/picker/styles/pickerStyles.ts +0 -207
- package/src/presentation/atoms/picker/types/index.ts +0 -40
- package/src/presentation/atoms/touchable/styles/touchableStyles.ts +0 -62
- package/src/presentation/atoms/touchable/types/index.ts +0 -155
- package/src/presentation/hooks/useResponsive.ts +0 -180
- package/src/presentation/molecules/AtomicConfirmationModal.tsx +0 -243
- package/src/presentation/molecules/EmptyState.tsx +0 -130
- package/src/presentation/molecules/FormField.tsx +0 -128
- package/src/presentation/molecules/GridContainer.tsx +0 -124
- package/src/presentation/molecules/IconContainer.tsx +0 -94
- package/src/presentation/molecules/ListItem.tsx +0 -36
- package/src/presentation/molecules/ScreenHeader.tsx +0 -140
- package/src/presentation/molecules/SearchBar.tsx +0 -85
- package/src/presentation/molecules/SectionCard.tsx +0 -74
- package/src/presentation/molecules/SectionContainer.tsx +0 -106
- package/src/presentation/molecules/SectionHeader.tsx +0 -125
- package/src/presentation/molecules/confirmation-modal/styles/confirmationModalStyles.ts +0 -133
- package/src/presentation/molecules/confirmation-modal/types/index.ts +0 -105
- package/src/presentation/molecules/index.ts +0 -41
- package/src/presentation/molecules/listitem/styles/listItemStyles.ts +0 -19
- package/src/presentation/molecules/listitem/types/index.ts +0 -17
- package/src/presentation/organisms/FormContainer.tsx +0 -180
- package/src/presentation/organisms/ScreenLayout.tsx +0 -171
- package/src/presentation/organisms/index.ts +0 -25
- package/src/presentation/utils/platformConstants.ts +0 -124
- 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
|
-
});
|