@umituz/react-native-design-system 1.0.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.
- package/LICENSE +21 -0
- package/README.md +157 -0
- package/package.json +43 -0
- package/src/index.ts +345 -0
- package/src/presentation/atoms/AtomicAvatar.tsx +157 -0
- package/src/presentation/atoms/AtomicAvatarGroup.tsx +169 -0
- package/src/presentation/atoms/AtomicBadge.tsx +232 -0
- package/src/presentation/atoms/AtomicButton.tsx +124 -0
- package/src/presentation/atoms/AtomicCard.tsx +112 -0
- package/src/presentation/atoms/AtomicChip.tsx +223 -0
- package/src/presentation/atoms/AtomicDatePicker.tsx +347 -0
- package/src/presentation/atoms/AtomicDivider.tsx +114 -0
- package/src/presentation/atoms/AtomicFab.tsx +104 -0
- package/src/presentation/atoms/AtomicFilter.tsx +154 -0
- package/src/presentation/atoms/AtomicFormError.tsx +105 -0
- package/src/presentation/atoms/AtomicIcon.tsx +29 -0
- package/src/presentation/atoms/AtomicImage.tsx +149 -0
- package/src/presentation/atoms/AtomicInput.tsx +232 -0
- package/src/presentation/atoms/AtomicNumberInput.tsx +182 -0
- package/src/presentation/atoms/AtomicPicker.tsx +458 -0
- package/src/presentation/atoms/AtomicProgress.tsx +143 -0
- package/src/presentation/atoms/AtomicSearchBar.tsx +114 -0
- package/src/presentation/atoms/AtomicSkeleton.tsx +146 -0
- package/src/presentation/atoms/AtomicSort.tsx +145 -0
- package/src/presentation/atoms/AtomicSwitch.tsx +166 -0
- package/src/presentation/atoms/AtomicText.tsx +50 -0
- package/src/presentation/atoms/AtomicTextArea.tsx +198 -0
- package/src/presentation/atoms/AtomicTouchable.tsx +233 -0
- package/src/presentation/atoms/fab/styles/fabStyles.ts +69 -0
- package/src/presentation/atoms/fab/types/index.ts +88 -0
- package/src/presentation/atoms/filter/styles/filterStyles.ts +32 -0
- package/src/presentation/atoms/filter/types/index.ts +89 -0
- package/src/presentation/atoms/index.ts +378 -0
- package/src/presentation/atoms/input/hooks/useInputState.ts +15 -0
- package/src/presentation/atoms/input/styles/inputStyles.ts +66 -0
- package/src/presentation/atoms/input/types/index.ts +25 -0
- package/src/presentation/atoms/picker/styles/pickerStyles.ts +200 -0
- package/src/presentation/atoms/picker/types/index.ts +40 -0
- package/src/presentation/atoms/touchable/styles/touchableStyles.ts +71 -0
- package/src/presentation/atoms/touchable/types/index.ts +162 -0
- package/src/presentation/hooks/useAppDesignTokens.ts +78 -0
- package/src/presentation/hooks/useResponsive.ts +180 -0
- package/src/presentation/loading/index.ts +40 -0
- package/src/presentation/loading/presentation/components/LoadingSpinner.tsx +116 -0
- package/src/presentation/loading/presentation/components/LoadingState.tsx +200 -0
- package/src/presentation/loading/presentation/hooks/useLoading.ts +100 -0
- package/src/presentation/molecules/AtomicConfirmationModal.tsx +263 -0
- package/src/presentation/molecules/EmptyState.tsx +130 -0
- package/src/presentation/molecules/FormField.tsx +128 -0
- package/src/presentation/molecules/GridContainer.tsx +124 -0
- package/src/presentation/molecules/IconContainer.tsx +94 -0
- package/src/presentation/molecules/LanguageSwitcher.tsx +42 -0
- package/src/presentation/molecules/ListItem.tsx +36 -0
- package/src/presentation/molecules/ScreenHeader.tsx +140 -0
- package/src/presentation/molecules/SearchBar.tsx +85 -0
- package/src/presentation/molecules/SectionCard.tsx +74 -0
- package/src/presentation/molecules/SectionContainer.tsx +106 -0
- package/src/presentation/molecules/SectionHeader.tsx +125 -0
- package/src/presentation/molecules/confirmation-modal/styles/confirmationModalStyles.ts +133 -0
- package/src/presentation/molecules/confirmation-modal/types/index.ts +107 -0
- package/src/presentation/molecules/index.ts +42 -0
- package/src/presentation/molecules/languageswitcher/config/languageSwitcherConfig.ts +5 -0
- package/src/presentation/molecules/languageswitcher/hooks/useLanguageNavigation.ts +15 -0
- package/src/presentation/molecules/listitem/styles/listItemStyles.ts +19 -0
- package/src/presentation/molecules/listitem/types/index.ts +17 -0
- package/src/presentation/organisms/AppHeader.tsx +136 -0
- package/src/presentation/organisms/FormContainer.tsx +180 -0
- package/src/presentation/organisms/ScreenLayout.tsx +209 -0
- package/src/presentation/organisms/index.ts +25 -0
- package/src/presentation/tokens/AppDesignTokens.ts +57 -0
- package/src/presentation/tokens/commonStyles.ts +253 -0
- package/src/presentation/tokens/core/BaseTokens.ts +394 -0
- package/src/presentation/tokens/core/ColorPalette.ts +398 -0
- package/src/presentation/tokens/core/TokenFactory.ts +120 -0
- package/src/presentation/utils/platformConstants.ts +124 -0
- package/src/presentation/utils/responsive.ts +516 -0
- package/src/presentation/utils/variants/compound.ts +29 -0
- package/src/presentation/utils/variants/core.ts +39 -0
- package/src/presentation/utils/variants/helpers.ts +13 -0
- package/src/presentation/utils/variants.ts +3 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common Styles - Reusable Style Patterns
|
|
3
|
+
*
|
|
4
|
+
* Centralized style utilities to reduce duplication across screens.
|
|
5
|
+
* These styles are composable and follow DRY principles.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { useCommonStyles } from '@domains/design-system/commonStyles';
|
|
10
|
+
*
|
|
11
|
+
* const MyComponent = () => {
|
|
12
|
+
* const commonStyles = useCommonStyles();
|
|
13
|
+
* return <View style={commonStyles.screenContainer}>...</View>;
|
|
14
|
+
* };
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { ViewStyle, TextStyle } from 'react-native';
|
|
19
|
+
import { useAppDesignTokens } from '../hooks/useAppDesignTokens';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Hook to get common styles with dynamic theme support
|
|
23
|
+
*/
|
|
24
|
+
export const useCommonStyles = () => {
|
|
25
|
+
const tokens = useAppDesignTokens();
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
// ========================================================================
|
|
29
|
+
// SCREEN CONTAINERS
|
|
30
|
+
// ========================================================================
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Standard full-screen container
|
|
34
|
+
* Most common pattern: flex: 1 with background color
|
|
35
|
+
*/
|
|
36
|
+
screenContainer: {
|
|
37
|
+
flex: 1,
|
|
38
|
+
backgroundColor: tokens.colors.backgroundPrimary,
|
|
39
|
+
} as ViewStyle,
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Basic flex container without background
|
|
43
|
+
* Use when background is set elsewhere or not needed
|
|
44
|
+
*/
|
|
45
|
+
flexContainer: {
|
|
46
|
+
flex: 1,
|
|
47
|
+
} as ViewStyle,
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Screen container with secondary background
|
|
51
|
+
*/
|
|
52
|
+
screenContainerSecondary: {
|
|
53
|
+
flex: 1,
|
|
54
|
+
backgroundColor: tokens.colors.backgroundSecondary,
|
|
55
|
+
} as ViewStyle,
|
|
56
|
+
|
|
57
|
+
// ========================================================================
|
|
58
|
+
// SCROLL CONTAINERS
|
|
59
|
+
// ========================================================================
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Standard ScrollView wrapper
|
|
63
|
+
*/
|
|
64
|
+
scrollView: {
|
|
65
|
+
flex: 1,
|
|
66
|
+
} as ViewStyle,
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* ScrollView content container with standard padding
|
|
70
|
+
*/
|
|
71
|
+
scrollContent: {
|
|
72
|
+
paddingHorizontal: tokens.spacing.lg,
|
|
73
|
+
paddingBottom: tokens.spacing.xl,
|
|
74
|
+
} as ViewStyle,
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* ScrollView content that grows to fill available space
|
|
78
|
+
*/
|
|
79
|
+
scrollContentGrow: {
|
|
80
|
+
flexGrow: 1,
|
|
81
|
+
padding: tokens.spacing.lg,
|
|
82
|
+
} as ViewStyle,
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Centered scroll content (for forms, onboarding screens)
|
|
86
|
+
*/
|
|
87
|
+
scrollContentCentered: {
|
|
88
|
+
flexGrow: 1,
|
|
89
|
+
padding: tokens.spacing.lg,
|
|
90
|
+
justifyContent: 'center' as const,
|
|
91
|
+
} as ViewStyle,
|
|
92
|
+
|
|
93
|
+
// ========================================================================
|
|
94
|
+
// LAYOUT UTILITIES
|
|
95
|
+
// ========================================================================
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Centered container - both horizontal and vertical
|
|
99
|
+
* Perfect for empty states, loading screens, splash screens
|
|
100
|
+
*/
|
|
101
|
+
centerContainer: {
|
|
102
|
+
flex: 1,
|
|
103
|
+
justifyContent: 'center' as const,
|
|
104
|
+
alignItems: 'center' as const,
|
|
105
|
+
} as ViewStyle,
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Centered container with padding
|
|
109
|
+
*/
|
|
110
|
+
centerContainerPadded: {
|
|
111
|
+
flex: 1,
|
|
112
|
+
justifyContent: 'center' as const,
|
|
113
|
+
alignItems: 'center' as const,
|
|
114
|
+
paddingHorizontal: tokens.spacing.xl,
|
|
115
|
+
} as ViewStyle,
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Horizontal row layout
|
|
119
|
+
*/
|
|
120
|
+
row: {
|
|
121
|
+
flexDirection: 'row' as const,
|
|
122
|
+
alignItems: 'center' as const,
|
|
123
|
+
} as ViewStyle,
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Horizontal row with space between
|
|
127
|
+
*/
|
|
128
|
+
rowBetween: {
|
|
129
|
+
flexDirection: 'row' as const,
|
|
130
|
+
alignItems: 'center' as const,
|
|
131
|
+
justifyContent: 'space-between' as const,
|
|
132
|
+
} as ViewStyle,
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Horizontal row centered
|
|
136
|
+
*/
|
|
137
|
+
rowCenter: {
|
|
138
|
+
flexDirection: 'row' as const,
|
|
139
|
+
alignItems: 'center' as const,
|
|
140
|
+
justifyContent: 'center' as const,
|
|
141
|
+
} as ViewStyle,
|
|
142
|
+
|
|
143
|
+
// ========================================================================
|
|
144
|
+
// PADDING UTILITIES
|
|
145
|
+
// ========================================================================
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Standard horizontal padding
|
|
149
|
+
*/
|
|
150
|
+
paddedHorizontal: {
|
|
151
|
+
paddingHorizontal: tokens.spacing.lg,
|
|
152
|
+
} as ViewStyle,
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Standard vertical padding
|
|
156
|
+
*/
|
|
157
|
+
paddedVertical: {
|
|
158
|
+
paddingVertical: tokens.spacing.lg,
|
|
159
|
+
} as ViewStyle,
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Standard padding all sides
|
|
163
|
+
*/
|
|
164
|
+
padded: {
|
|
165
|
+
padding: tokens.spacing.lg,
|
|
166
|
+
} as ViewStyle,
|
|
167
|
+
|
|
168
|
+
// ========================================================================
|
|
169
|
+
// SECTION STYLES
|
|
170
|
+
// ========================================================================
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Standard section container
|
|
174
|
+
*/
|
|
175
|
+
section: {
|
|
176
|
+
marginBottom: tokens.spacing.xl,
|
|
177
|
+
} as ViewStyle,
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Section with padding
|
|
181
|
+
*/
|
|
182
|
+
sectionPadded: {
|
|
183
|
+
marginBottom: tokens.spacing.xl,
|
|
184
|
+
paddingHorizontal: tokens.spacing.lg,
|
|
185
|
+
} as ViewStyle,
|
|
186
|
+
|
|
187
|
+
// ========================================================================
|
|
188
|
+
// TEXT STYLES
|
|
189
|
+
// ========================================================================
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Screen title - primary heading
|
|
193
|
+
*/
|
|
194
|
+
screenTitle: {
|
|
195
|
+
...tokens.typography.headingLarge,
|
|
196
|
+
color: tokens.colors.textPrimary,
|
|
197
|
+
marginBottom: tokens.spacing.sm,
|
|
198
|
+
} as TextStyle,
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Section title
|
|
202
|
+
*/
|
|
203
|
+
sectionTitle: {
|
|
204
|
+
...tokens.typography.headingMedium,
|
|
205
|
+
color: tokens.colors.textPrimary,
|
|
206
|
+
marginBottom: tokens.spacing.md,
|
|
207
|
+
} as TextStyle,
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Subtitle/description text
|
|
211
|
+
*/
|
|
212
|
+
subtitle: {
|
|
213
|
+
...tokens.typography.bodyMedium,
|
|
214
|
+
color: tokens.colors.textSecondary,
|
|
215
|
+
textAlign: 'center' as const,
|
|
216
|
+
} as TextStyle,
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Body text
|
|
220
|
+
*/
|
|
221
|
+
bodyText: {
|
|
222
|
+
...tokens.typography.bodyMedium,
|
|
223
|
+
color: tokens.colors.textPrimary,
|
|
224
|
+
} as TextStyle,
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Secondary text (muted)
|
|
228
|
+
*/
|
|
229
|
+
secondaryText: {
|
|
230
|
+
...tokens.typography.bodySmall,
|
|
231
|
+
color: tokens.colors.textSecondary,
|
|
232
|
+
} as TextStyle,
|
|
233
|
+
|
|
234
|
+
// ========================================================================
|
|
235
|
+
// FORM STYLES
|
|
236
|
+
// ========================================================================
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Form container
|
|
240
|
+
*/
|
|
241
|
+
form: {
|
|
242
|
+
width: '100%',
|
|
243
|
+
} as ViewStyle,
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Form header section
|
|
247
|
+
*/
|
|
248
|
+
formHeader: {
|
|
249
|
+
alignItems: 'center' as const,
|
|
250
|
+
marginBottom: tokens.spacing.xl,
|
|
251
|
+
} as ViewStyle,
|
|
252
|
+
};
|
|
253
|
+
};
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BASE DESIGN TOKENS - SINGLE SOURCE OF TRUTH
|
|
3
|
+
*
|
|
4
|
+
* ✅ STATIC tokens that don't change with theme
|
|
5
|
+
* ✅ DRY Principle - Each value defined ONCE
|
|
6
|
+
* ✅ Type-safe with full TypeScript support
|
|
7
|
+
* ✅ Factory-first design for 100+ generated apps
|
|
8
|
+
*
|
|
9
|
+
* @module BaseTokens
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { TextStyle } from 'react-native';
|
|
13
|
+
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// SPACING TOKENS
|
|
16
|
+
// =============================================================================
|
|
17
|
+
|
|
18
|
+
export const spacing = {
|
|
19
|
+
// Base spacing scale
|
|
20
|
+
xs: 4,
|
|
21
|
+
sm: 8,
|
|
22
|
+
md: 16,
|
|
23
|
+
lg: 24,
|
|
24
|
+
xl: 32,
|
|
25
|
+
xxl: 48,
|
|
26
|
+
xxxl: 64,
|
|
27
|
+
|
|
28
|
+
// Component-specific spacing
|
|
29
|
+
screenPadding: 20,
|
|
30
|
+
cardPadding: 16,
|
|
31
|
+
buttonPadding: 16,
|
|
32
|
+
inputPadding: 8,
|
|
33
|
+
sectionSpacing: 24,
|
|
34
|
+
|
|
35
|
+
// Icon sizes
|
|
36
|
+
iconSizeSmall: 16,
|
|
37
|
+
iconSizeMedium: 20,
|
|
38
|
+
iconSizeLarge: 24,
|
|
39
|
+
iconSizeXLarge: 32,
|
|
40
|
+
iconSizeHero: 64,
|
|
41
|
+
|
|
42
|
+
// Component heights
|
|
43
|
+
buttonHeight: 48,
|
|
44
|
+
inputHeight: 48,
|
|
45
|
+
appBarHeight: 56,
|
|
46
|
+
tabBarHeight: 60,
|
|
47
|
+
} as const;
|
|
48
|
+
|
|
49
|
+
// =============================================================================
|
|
50
|
+
// TYPOGRAPHY TOKENS
|
|
51
|
+
// =============================================================================
|
|
52
|
+
|
|
53
|
+
export const typography = {
|
|
54
|
+
// Font families
|
|
55
|
+
fontPrimary: 'System',
|
|
56
|
+
fontSecondary: 'System',
|
|
57
|
+
fontMono: 'Courier New',
|
|
58
|
+
|
|
59
|
+
// Font sizes
|
|
60
|
+
xs: 12,
|
|
61
|
+
sm: 14,
|
|
62
|
+
md: 16,
|
|
63
|
+
lg: 18,
|
|
64
|
+
xl: 20,
|
|
65
|
+
xxl: 24,
|
|
66
|
+
xxxl: 32,
|
|
67
|
+
|
|
68
|
+
// Font weights
|
|
69
|
+
light: '300' as const,
|
|
70
|
+
regular: '400' as const,
|
|
71
|
+
medium: '500' as const,
|
|
72
|
+
semibold: '600' as const,
|
|
73
|
+
bold: '700' as const,
|
|
74
|
+
|
|
75
|
+
// Line heights
|
|
76
|
+
lineHeightTight: 1.2,
|
|
77
|
+
lineHeightNormal: 1.5,
|
|
78
|
+
lineHeightRelaxed: 1.7,
|
|
79
|
+
|
|
80
|
+
// =============================================================================
|
|
81
|
+
// MATERIAL DESIGN 3 TYPE SCALE
|
|
82
|
+
// =============================================================================
|
|
83
|
+
|
|
84
|
+
// Display styles (largest)
|
|
85
|
+
displayLarge: {
|
|
86
|
+
fontSize: 57,
|
|
87
|
+
fontWeight: '400' as const,
|
|
88
|
+
lineHeight: 64,
|
|
89
|
+
} as TextStyle,
|
|
90
|
+
|
|
91
|
+
displayMedium: {
|
|
92
|
+
fontSize: 45,
|
|
93
|
+
fontWeight: '400' as const,
|
|
94
|
+
lineHeight: 52,
|
|
95
|
+
} as TextStyle,
|
|
96
|
+
|
|
97
|
+
displaySmall: {
|
|
98
|
+
fontSize: 36,
|
|
99
|
+
fontWeight: '400' as const,
|
|
100
|
+
lineHeight: 44,
|
|
101
|
+
} as TextStyle,
|
|
102
|
+
|
|
103
|
+
// Headline styles
|
|
104
|
+
headlineLarge: {
|
|
105
|
+
fontSize: 32,
|
|
106
|
+
fontWeight: '400' as const,
|
|
107
|
+
lineHeight: 40,
|
|
108
|
+
} as TextStyle,
|
|
109
|
+
|
|
110
|
+
headlineMedium: {
|
|
111
|
+
fontSize: 28,
|
|
112
|
+
fontWeight: '400' as const,
|
|
113
|
+
lineHeight: 36,
|
|
114
|
+
} as TextStyle,
|
|
115
|
+
|
|
116
|
+
headlineSmall: {
|
|
117
|
+
fontSize: 24,
|
|
118
|
+
fontWeight: '400' as const,
|
|
119
|
+
lineHeight: 32,
|
|
120
|
+
} as TextStyle,
|
|
121
|
+
|
|
122
|
+
// Title styles
|
|
123
|
+
titleLarge: {
|
|
124
|
+
fontSize: 22,
|
|
125
|
+
fontWeight: '400' as const,
|
|
126
|
+
lineHeight: 28,
|
|
127
|
+
} as TextStyle,
|
|
128
|
+
|
|
129
|
+
titleMedium: {
|
|
130
|
+
fontSize: 16,
|
|
131
|
+
fontWeight: '500' as const,
|
|
132
|
+
lineHeight: 24,
|
|
133
|
+
} as TextStyle,
|
|
134
|
+
|
|
135
|
+
titleSmall: {
|
|
136
|
+
fontSize: 14,
|
|
137
|
+
fontWeight: '500' as const,
|
|
138
|
+
lineHeight: 20,
|
|
139
|
+
} as TextStyle,
|
|
140
|
+
|
|
141
|
+
// Body styles
|
|
142
|
+
bodyLarge: {
|
|
143
|
+
fontSize: 18,
|
|
144
|
+
fontWeight: '400' as const,
|
|
145
|
+
lineHeight: 27,
|
|
146
|
+
} as TextStyle,
|
|
147
|
+
|
|
148
|
+
bodyMedium: {
|
|
149
|
+
fontSize: 16,
|
|
150
|
+
fontWeight: '400' as const,
|
|
151
|
+
lineHeight: 24,
|
|
152
|
+
} as TextStyle,
|
|
153
|
+
|
|
154
|
+
bodySmall: {
|
|
155
|
+
fontSize: 14,
|
|
156
|
+
fontWeight: '400' as const,
|
|
157
|
+
lineHeight: 21,
|
|
158
|
+
} as TextStyle,
|
|
159
|
+
|
|
160
|
+
// Label styles
|
|
161
|
+
labelLarge: {
|
|
162
|
+
fontSize: 16,
|
|
163
|
+
fontWeight: '500' as const,
|
|
164
|
+
lineHeight: 19.2,
|
|
165
|
+
} as TextStyle,
|
|
166
|
+
|
|
167
|
+
labelMedium: {
|
|
168
|
+
fontSize: 14,
|
|
169
|
+
fontWeight: '500' as const,
|
|
170
|
+
lineHeight: 16.8,
|
|
171
|
+
} as TextStyle,
|
|
172
|
+
|
|
173
|
+
labelSmall: {
|
|
174
|
+
fontSize: 12,
|
|
175
|
+
fontWeight: '500' as const,
|
|
176
|
+
lineHeight: 14.4,
|
|
177
|
+
} as TextStyle,
|
|
178
|
+
|
|
179
|
+
// =============================================================================
|
|
180
|
+
// LEGACY SUPPORT (backwards compatibility)
|
|
181
|
+
// =============================================================================
|
|
182
|
+
|
|
183
|
+
headingLarge: {
|
|
184
|
+
fontSize: 32,
|
|
185
|
+
fontWeight: '700' as const,
|
|
186
|
+
lineHeight: 38.4,
|
|
187
|
+
} as TextStyle,
|
|
188
|
+
|
|
189
|
+
headingMedium: {
|
|
190
|
+
fontSize: 24,
|
|
191
|
+
fontWeight: '600' as const,
|
|
192
|
+
lineHeight: 28.8,
|
|
193
|
+
} as TextStyle,
|
|
194
|
+
|
|
195
|
+
headingSmall: {
|
|
196
|
+
fontSize: 20,
|
|
197
|
+
fontWeight: '600' as const,
|
|
198
|
+
lineHeight: 24,
|
|
199
|
+
} as TextStyle,
|
|
200
|
+
|
|
201
|
+
button: {
|
|
202
|
+
fontSize: 16,
|
|
203
|
+
fontWeight: '600' as const,
|
|
204
|
+
lineHeight: 19.2,
|
|
205
|
+
} as TextStyle,
|
|
206
|
+
|
|
207
|
+
caption: {
|
|
208
|
+
fontSize: 12,
|
|
209
|
+
fontWeight: '400' as const,
|
|
210
|
+
lineHeight: 18,
|
|
211
|
+
} as TextStyle,
|
|
212
|
+
|
|
213
|
+
overline: {
|
|
214
|
+
fontSize: 12,
|
|
215
|
+
fontWeight: '500' as const,
|
|
216
|
+
lineHeight: 18,
|
|
217
|
+
textTransform: 'uppercase' as const,
|
|
218
|
+
letterSpacing: 1,
|
|
219
|
+
} as TextStyle,
|
|
220
|
+
} as const;
|
|
221
|
+
|
|
222
|
+
// =============================================================================
|
|
223
|
+
// ANIMATION TOKENS
|
|
224
|
+
// =============================================================================
|
|
225
|
+
|
|
226
|
+
export const animations = {
|
|
227
|
+
// Duration scale (milliseconds)
|
|
228
|
+
fastest: 150,
|
|
229
|
+
fast: 150,
|
|
230
|
+
normal: 300,
|
|
231
|
+
slow: 500,
|
|
232
|
+
slower: 750,
|
|
233
|
+
slowest: 1000,
|
|
234
|
+
|
|
235
|
+
// Easing functions
|
|
236
|
+
easeInOut: 'ease-in-out' as const,
|
|
237
|
+
easeIn: 'ease-in' as const,
|
|
238
|
+
easeOut: 'ease-out' as const,
|
|
239
|
+
linear: 'linear' as const,
|
|
240
|
+
} as const;
|
|
241
|
+
|
|
242
|
+
// =============================================================================
|
|
243
|
+
// OPACITY TOKENS
|
|
244
|
+
// =============================================================================
|
|
245
|
+
|
|
246
|
+
export const opacity = {
|
|
247
|
+
disabled: 0.6,
|
|
248
|
+
subtle: 0.8,
|
|
249
|
+
medium: 0.5,
|
|
250
|
+
light: 0.3,
|
|
251
|
+
veryLight: 0.1,
|
|
252
|
+
} as const;
|
|
253
|
+
|
|
254
|
+
// =============================================================================
|
|
255
|
+
// BORDER TOKENS
|
|
256
|
+
// =============================================================================
|
|
257
|
+
|
|
258
|
+
export const borders = {
|
|
259
|
+
// Radius scale
|
|
260
|
+
radius: {
|
|
261
|
+
none: 0,
|
|
262
|
+
xs: 2,
|
|
263
|
+
sm: 4,
|
|
264
|
+
md: 8,
|
|
265
|
+
lg: 12,
|
|
266
|
+
xl: 16,
|
|
267
|
+
xxl: 24,
|
|
268
|
+
full: 9999,
|
|
269
|
+
},
|
|
270
|
+
|
|
271
|
+
// Width scale
|
|
272
|
+
width: {
|
|
273
|
+
none: 0,
|
|
274
|
+
thin: 1,
|
|
275
|
+
medium: 2,
|
|
276
|
+
thick: 4,
|
|
277
|
+
},
|
|
278
|
+
|
|
279
|
+
// Component-specific borders (without colors - colors injected by TokenFactory)
|
|
280
|
+
button: {
|
|
281
|
+
borderRadius: 8,
|
|
282
|
+
borderWidth: 0,
|
|
283
|
+
},
|
|
284
|
+
|
|
285
|
+
card: {
|
|
286
|
+
borderRadius: 12,
|
|
287
|
+
borderWidth: 1,
|
|
288
|
+
},
|
|
289
|
+
|
|
290
|
+
input: {
|
|
291
|
+
borderRadius: 8,
|
|
292
|
+
borderWidth: 1,
|
|
293
|
+
},
|
|
294
|
+
|
|
295
|
+
pill: {
|
|
296
|
+
borderRadius: 9999,
|
|
297
|
+
borderWidth: 0,
|
|
298
|
+
},
|
|
299
|
+
} as const;
|
|
300
|
+
|
|
301
|
+
// =============================================================================
|
|
302
|
+
// COMPONENT SIZES (Touch Targets, Buttons, UI Elements)
|
|
303
|
+
// =============================================================================
|
|
304
|
+
|
|
305
|
+
export const sizes = {
|
|
306
|
+
// Touch targets (Apple HIG minimum: 44x44)
|
|
307
|
+
touchTarget: 44,
|
|
308
|
+
touchTargetSmall: 36,
|
|
309
|
+
touchTargetLarge: 56,
|
|
310
|
+
|
|
311
|
+
// Button heights
|
|
312
|
+
buttonHeight: {
|
|
313
|
+
sm: 40,
|
|
314
|
+
md: 48,
|
|
315
|
+
lg: 56,
|
|
316
|
+
xl: 64,
|
|
317
|
+
},
|
|
318
|
+
|
|
319
|
+
// Pagination dots (onboarding, carousels)
|
|
320
|
+
dot: {
|
|
321
|
+
inactive: 8,
|
|
322
|
+
active: 24,
|
|
323
|
+
},
|
|
324
|
+
|
|
325
|
+
// Progress bars
|
|
326
|
+
progressBar: {
|
|
327
|
+
thin: 2,
|
|
328
|
+
normal: 4,
|
|
329
|
+
thick: 6,
|
|
330
|
+
},
|
|
331
|
+
|
|
332
|
+
// Common UI element sizes
|
|
333
|
+
divider: 1,
|
|
334
|
+
separator: 2,
|
|
335
|
+
} as const;
|
|
336
|
+
|
|
337
|
+
// =============================================================================
|
|
338
|
+
// ICON SIZES
|
|
339
|
+
// =============================================================================
|
|
340
|
+
|
|
341
|
+
export const iconSizes = {
|
|
342
|
+
xs: 12,
|
|
343
|
+
sm: 16,
|
|
344
|
+
md: 20,
|
|
345
|
+
lg: 24,
|
|
346
|
+
xl: 32,
|
|
347
|
+
xxl: 40,
|
|
348
|
+
} as const;
|
|
349
|
+
|
|
350
|
+
// =============================================================================
|
|
351
|
+
// AVATAR SIZES
|
|
352
|
+
// =============================================================================
|
|
353
|
+
|
|
354
|
+
export const avatarSizes = {
|
|
355
|
+
xs: 24,
|
|
356
|
+
sm: 32,
|
|
357
|
+
md: 40,
|
|
358
|
+
lg: 48,
|
|
359
|
+
xl: 64,
|
|
360
|
+
xxl: 80,
|
|
361
|
+
} as const;
|
|
362
|
+
|
|
363
|
+
// =============================================================================
|
|
364
|
+
// CONSOLIDATED STATIC TOKENS
|
|
365
|
+
// =============================================================================
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* All static design tokens in one place
|
|
369
|
+
* These values DON'T change with theme (light/dark)
|
|
370
|
+
*/
|
|
371
|
+
export const BASE_TOKENS = {
|
|
372
|
+
spacing,
|
|
373
|
+
typography,
|
|
374
|
+
animations,
|
|
375
|
+
opacity,
|
|
376
|
+
borders,
|
|
377
|
+
sizes,
|
|
378
|
+
iconSizes,
|
|
379
|
+
avatarSizes,
|
|
380
|
+
} as const;
|
|
381
|
+
|
|
382
|
+
// =============================================================================
|
|
383
|
+
// TYPE EXPORTS
|
|
384
|
+
// =============================================================================
|
|
385
|
+
|
|
386
|
+
export type Spacing = typeof spacing;
|
|
387
|
+
export type Typography = typeof typography;
|
|
388
|
+
export type Animations = typeof animations;
|
|
389
|
+
export type Opacity = typeof opacity;
|
|
390
|
+
export type Borders = typeof borders;
|
|
391
|
+
export type Sizes = typeof sizes;
|
|
392
|
+
export type IconSizes = typeof iconSizes;
|
|
393
|
+
export type AvatarSizes = typeof avatarSizes;
|
|
394
|
+
export type BaseTokens = typeof BASE_TOKENS;
|