@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,209 +0,0 @@
1
- import React from 'react';
2
- import { Pressable } from 'react-native';
3
- import { useAppDesignTokens } from '@umituz/react-native-theme';
4
- import { AtomicTouchableProps, TouchableFeedback, FeedbackStrength } from './touchable/types';
5
- import {
6
- getOpacityValue,
7
- getTouchableContainerStyle,
8
- getDisabledStyle,
9
- normalizeHitSlop,
10
- } from './touchable/styles/touchableStyles';
11
-
12
- export type {
13
- AtomicTouchableProps,
14
- TouchableFeedback,
15
- FeedbackStrength,
16
- HitSlop,
17
- } from './touchable/types';
18
-
19
- export {
20
- getOpacityValue,
21
- getTouchableContainerStyle,
22
- getDisabledStyle,
23
- normalizeHitSlop,
24
- } from './touchable/styles/touchableStyles';
25
-
26
- /**
27
- * AtomicTouchable - Unified Touchable Component
28
- *
29
- * A modern, accessible touchable wrapper using React Native's Pressable API.
30
- * Provides consistent behavior across iOS, Android, and Web.
31
- *
32
- * Features:
33
- * - Multiple feedback variants (opacity, highlight, ripple, none)
34
- * - Configurable feedback strength (subtle, normal, strong)
35
- * - Disabled state with visual feedback
36
- * - Hit slop customization for small touch targets
37
- * - Minimum 48x48 touch target (iOS HIG compliance)
38
- * - Full accessibility support
39
- * - Theme-aware ripple colors
40
- *
41
- * @example
42
- * ```tsx
43
- * // Basic usage with opacity feedback
44
- * <AtomicTouchable onPress={handlePress}>
45
- * <AtomicText>Press Me</AtomicText>
46
- * </AtomicTouchable>
47
- *
48
- * // With custom hit slop (extends touch area)
49
- * <AtomicTouchable
50
- * onPress={handlePress}
51
- * hitSlop={8}
52
- * feedback="ripple"
53
- * >
54
- * <AtomicIcon name="X" size="sm" />
55
- * </AtomicTouchable>
56
- * ```
57
- */
58
- export const AtomicTouchable: React.FC<AtomicTouchableProps> = ({
59
- children,
60
- onPress,
61
- onPressIn,
62
- onPressOut,
63
- onLongPress,
64
- feedback = 'opacity',
65
- strength = 'normal',
66
- disabled = false,
67
- hitSlop,
68
- style,
69
- pressedStyle,
70
- disabledStyle,
71
- accessibilityLabel,
72
- accessibilityHint,
73
- accessibilityRole = 'button',
74
- testID,
75
- delayLongPress = 500,
76
- rippleColor,
77
- rippleRadius = 0,
78
- }) => {
79
- const tokens = useAppDesignTokens();
80
-
81
- // Determine if touchable should be disabled
82
- const isDisabled = disabled;
83
-
84
- // Get opacity value based on strength
85
- const opacityValue = getOpacityValue(strength as 'subtle' | 'normal' | 'strong');
86
-
87
- // Normalize hit slop
88
- const normalizedHitSlop = normalizeHitSlop(hitSlop);
89
-
90
- // Default ripple color (theme primary with alpha)
91
- const defaultRippleColor = tokens.colors.primary + '40'; // 40 = 25% opacity in hex
92
-
93
- /**
94
- * Get style based on pressed state
95
- */
96
- const getPressedStyle = ({ pressed }: { pressed: boolean }) => {
97
- const baseStyle = [
98
- getTouchableContainerStyle(),
99
- style,
100
- ];
101
-
102
- if (isDisabled) {
103
- return [...baseStyle, getDisabledStyle(), disabledStyle];
104
- }
105
-
106
- if (pressed) {
107
- // Apply feedback based on variant
108
- switch (feedback) {
109
- case 'opacity':
110
- return [...baseStyle, { opacity: opacityValue }, pressedStyle];
111
- case 'highlight':
112
- return [
113
- ...baseStyle,
114
- { backgroundColor: tokens.colors.surfaceVariant },
115
- pressedStyle,
116
- ];
117
- case 'none':
118
- return [...baseStyle, pressedStyle];
119
- case 'ripple':
120
- // Ripple is handled by android_ripple prop
121
- return [...baseStyle, pressedStyle];
122
- default:
123
- return [...baseStyle, pressedStyle];
124
- }
125
- }
126
-
127
- return baseStyle;
128
- };
129
-
130
- /**
131
- * Android ripple configuration
132
- * Used when feedback='ripple'
133
- * Pressable automatically ignores this prop on iOS/Web
134
- */
135
- const androidRippleConfig = feedback === 'ripple'
136
- ? {
137
- color: rippleColor || defaultRippleColor,
138
- borderless: false,
139
- radius: rippleRadius,
140
- }
141
- : undefined;
142
-
143
- return (
144
- <Pressable
145
- onPress={isDisabled ? undefined : onPress}
146
- onPressIn={isDisabled ? undefined : onPressIn}
147
- onPressOut={isDisabled ? undefined : onPressOut}
148
- onLongPress={isDisabled ? undefined : onLongPress}
149
- delayLongPress={delayLongPress}
150
- disabled={isDisabled}
151
- hitSlop={normalizedHitSlop}
152
- style={getPressedStyle}
153
- android_ripple={androidRippleConfig}
154
- accessibilityLabel={accessibilityLabel}
155
- accessibilityHint={accessibilityHint}
156
- accessibilityRole={accessibilityRole}
157
- accessibilityState={{
158
- disabled: isDisabled,
159
- }}
160
- testID={testID}
161
- >
162
- {children}
163
- </Pressable>
164
- );
165
- };
166
-
167
- /**
168
- * Preset touchable configurations for common use cases
169
- */
170
- export const TouchablePresets = {
171
- /**
172
- * iOS-style opacity feedback (default)
173
- */
174
- ios: {
175
- feedback: 'opacity' as TouchableFeedback,
176
- strength: 'normal' as FeedbackStrength,
177
- },
178
-
179
- /**
180
- * Android-style ripple feedback
181
- */
182
- android: {
183
- feedback: 'ripple' as TouchableFeedback,
184
- strength: 'normal' as FeedbackStrength,
185
- },
186
-
187
- /**
188
- * Subtle feedback for secondary actions
189
- */
190
- subtle: {
191
- feedback: 'opacity' as TouchableFeedback,
192
- strength: 'subtle' as FeedbackStrength,
193
- },
194
-
195
- /**
196
- * Strong feedback for primary actions
197
- */
198
- strong: {
199
- feedback: 'opacity' as TouchableFeedback,
200
- strength: 'strong' as FeedbackStrength,
201
- },
202
-
203
- /**
204
- * No visual feedback (use sparingly)
205
- */
206
- none: {
207
- feedback: 'none' as TouchableFeedback,
208
- },
209
- };
@@ -1,69 +0,0 @@
1
- import { ViewStyle } from 'react-native';
2
- import { FabVariant, FabSize, FabVariantConfig, FabSizeConfig } from '../types';
3
- import type { DesignTokens } from '@umituz/react-native-theme';
4
-
5
- /**
6
- * Material Design 3 FAB size configurations
7
- */
8
- export const FAB_SIZES: Record<FabSize, FabSizeConfig> = {
9
- sm: {
10
- width: 40,
11
- height: 40,
12
- borderRadius: 20, // Perfect circle
13
- },
14
- md: {
15
- width: 56,
16
- height: 56,
17
- borderRadius: 28, // Perfect circle (Material Design 3 standard)
18
- },
19
- lg: {
20
- width: 72,
21
- height: 72,
22
- borderRadius: 36, // Perfect circle
23
- },
24
- };
25
-
26
- /**
27
- * Get FAB variant styles based on design tokens
28
- * Note: Icon colors are handled via customColor in AtomicIcon
29
- */
30
- export const getFabVariants = (tokens: DesignTokens): Record<FabVariant, FabVariantConfig> => ({
31
- primary: {
32
- backgroundColor: tokens.colors.primary,
33
- iconColor: tokens.colors.onPrimary,
34
- },
35
- secondary: {
36
- backgroundColor: tokens.colors.secondary,
37
- iconColor: tokens.colors.onSecondary,
38
- },
39
- surface: {
40
- backgroundColor: tokens.colors.surface,
41
- iconColor: tokens.colors.onSurface,
42
- },
43
- });
44
-
45
- /**
46
- * Get icon size based on FAB size
47
- * Returns AtomicIconSize type ('sm', 'md', 'lg')
48
- */
49
- export const getFabIconSize = (size: FabSize): 'sm' | 'md' | 'lg' => {
50
- switch (size) {
51
- case 'sm':
52
- return 'sm';
53
- case 'md':
54
- return 'md';
55
- case 'lg':
56
- return 'lg';
57
- default:
58
- return 'md';
59
- }
60
- };
61
-
62
- /**
63
- * Get FAB border for depth (shadows removed per CLAUDE.md)
64
- * Subtle border provides visual elevation without shadow issues
65
- */
66
- export const getFabBorder = (tokens: DesignTokens): ViewStyle => ({
67
- borderWidth: 1,
68
- borderColor: tokens.colors.outline,
69
- });
@@ -1,82 +0,0 @@
1
- import { StyleProp, ViewStyle } from 'react-native';
2
-
3
- /**
4
- * FAB (Floating Action Button) size variants
5
- * Based on Material Design 3 standards
6
- */
7
- export type FabSize = 'sm' | 'md' | 'lg';
8
-
9
- /**
10
- * FAB variant types
11
- * - primary: Main action (uses primary color)
12
- * - secondary: Secondary action (uses secondary color)
13
- * - surface: Neutral action (uses surface color with border)
14
- */
15
- export type FabVariant = 'primary' | 'secondary' | 'surface';
16
-
17
- /**
18
- * FAB configuration for variant styling
19
- */
20
- export interface FabVariantConfig {
21
- backgroundColor: string;
22
- iconColor: string;
23
- }
24
-
25
- /**
26
- * FAB configuration for size styling
27
- */
28
- export interface FabSizeConfig {
29
- width: number;
30
- height: number;
31
- borderRadius: number;
32
- }
33
-
34
- /**
35
- * AtomicFab component props
36
- */
37
- export interface AtomicFabProps {
38
- /**
39
- * Icon name to display (required)
40
- * Any MaterialIcons name (see https://fonts.google.com/icons)
41
- * Examples: 'add', 'edit', 'camera', etc.
42
- */
43
- icon: string;
44
-
45
- /**
46
- * Callback when FAB is pressed
47
- */
48
- onPress: () => void;
49
-
50
- /**
51
- * Visual variant of the FAB
52
- * @default 'primary'
53
- */
54
- variant?: FabVariant;
55
-
56
- /**
57
- * Size of the FAB
58
- * @default 'md'
59
- */
60
- size?: FabSize;
61
-
62
- /**
63
- * Whether the FAB is disabled
64
- * @default false
65
- */
66
- disabled?: boolean;
67
-
68
- /**
69
- * Custom style for the FAB container
70
- */
71
- style?: StyleProp<ViewStyle>;
72
-
73
- /**
74
- * Test ID for testing
75
- */
76
- testID?: string;
77
-
78
- /**
79
- * Accessibility label
80
- */
81
- accessibilityLabel?: string;
82
- }
@@ -1,32 +0,0 @@
1
- import { ViewStyle } from 'react-native';
2
-
3
- /**
4
- * Filter container styles
5
- * Horizontal scrollable filter chip list
6
- */
7
- export const getFilterContainerStyle = (): ViewStyle => ({
8
- flexDirection: 'row',
9
- paddingHorizontal: 16,
10
- paddingVertical: 12,
11
- gap: 8, // Space between chips
12
- });
13
-
14
- /**
15
- * Clear all button container styles
16
- */
17
- export const getClearAllContainerStyle = (): ViewStyle => ({
18
- marginLeft: 8,
19
- paddingHorizontal: 12,
20
- paddingVertical: 6,
21
- borderRadius: 16,
22
- justifyContent: 'center',
23
- alignItems: 'center',
24
- });
25
-
26
- /**
27
- * ScrollView content container style
28
- */
29
- export const getScrollContentContainerStyle = (): ViewStyle => ({
30
- alignItems: 'center',
31
- gap: 8,
32
- });
@@ -1,89 +0,0 @@
1
- import { StyleProp, ViewStyle } from 'react-native';
2
-
3
- /**
4
- * Filter option interface
5
- * Represents a single filterable option
6
- */
7
- export interface FilterOption {
8
- /**
9
- * Unique identifier for the filter option
10
- */
11
- id: string;
12
-
13
- /**
14
- * Display label for the filter
15
- */
16
- label: string;
17
-
18
- /**
19
- * Optional value associated with the filter
20
- * Can be used for backend filtering
21
- */
22
- value?: unknown;
23
-
24
- /**
25
- * Optional icon name to display
26
- */
27
- icon?: string;
28
- }
29
-
30
- /**
31
- * AtomicFilter component props
32
- */
33
- export interface AtomicFilterProps {
34
- /**
35
- * Array of filter options to display
36
- */
37
- options: FilterOption[];
38
-
39
- /**
40
- * Array of currently selected filter IDs
41
- */
42
- selectedIds: string[];
43
-
44
- /**
45
- * Callback when selection changes
46
- * @param selectedIds - New array of selected IDs
47
- */
48
- onSelectionChange: (selectedIds: string[]) => void;
49
-
50
- /**
51
- * Enable multi-select mode
52
- * @default true
53
- */
54
- multiSelect?: boolean;
55
-
56
- /**
57
- * Show "Clear All" button when filters are active
58
- * @default true
59
- */
60
- showClearAll?: boolean;
61
-
62
- /**
63
- * Chip variant style
64
- * @default 'outlined'
65
- */
66
- variant?: 'filled' | 'outlined' | 'soft';
67
-
68
- /**
69
- * Chip color theme
70
- * @default 'primary'
71
- */
72
- color?: 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info';
73
-
74
- /**
75
- * Chip size
76
- * @default 'md'
77
- */
78
- size?: 'sm' | 'md' | 'lg';
79
-
80
- /**
81
- * Custom style for the container
82
- */
83
- style?: StyleProp<ViewStyle>;
84
-
85
- /**
86
- * Test ID for testing
87
- */
88
- testID?: string;
89
- }