@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,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SearchBar Molecule - Search Input with Icon and Clear Button
|
|
3
|
-
*
|
|
4
|
-
* Combines AtomicInput + AtomicIcon + AtomicButton
|
|
5
|
-
* Theme: {{THEME_NAME}} ({{CATEGORY}} category)
|
|
6
|
-
*
|
|
7
|
-
* Atomic Design Level: MOLECULE
|
|
8
|
-
* Composition: AtomicInput + AtomicIcon + TouchableOpacity
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import React from 'react';
|
|
12
|
-
import { View, TouchableOpacity, ViewStyle } from 'react-native';
|
|
13
|
-
import { useAppDesignTokens } from '@umituz/react-native-theme';
|
|
14
|
-
import { AtomicInput, AtomicInputProps } from '../atoms/AtomicInput';
|
|
15
|
-
import { AtomicIcon } from '../atoms/AtomicIcon';
|
|
16
|
-
|
|
17
|
-
// =============================================================================
|
|
18
|
-
// TYPE DEFINITIONS
|
|
19
|
-
// =============================================================================
|
|
20
|
-
|
|
21
|
-
export interface SearchBarProps extends Omit<AtomicInputProps, 'leftIcon' | 'rightIcon'> {
|
|
22
|
-
onClear?: () => void;
|
|
23
|
-
containerStyle?: ViewStyle;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// =============================================================================
|
|
27
|
-
// COMPONENT IMPLEMENTATION
|
|
28
|
-
// =============================================================================
|
|
29
|
-
|
|
30
|
-
export const SearchBar: React.FC<SearchBarProps> = ({
|
|
31
|
-
value,
|
|
32
|
-
onChangeText,
|
|
33
|
-
onClear,
|
|
34
|
-
placeholder = 'Search...',
|
|
35
|
-
containerStyle,
|
|
36
|
-
...inputProps
|
|
37
|
-
}) => {
|
|
38
|
-
const tokens = useAppDesignTokens();
|
|
39
|
-
|
|
40
|
-
const handleClear = () => {
|
|
41
|
-
if (onChangeText) {
|
|
42
|
-
onChangeText('');
|
|
43
|
-
}
|
|
44
|
-
if (onClear) {
|
|
45
|
-
onClear();
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const styles = getStyles(tokens);
|
|
50
|
-
|
|
51
|
-
return (
|
|
52
|
-
<View style={[styles.container, containerStyle]}>
|
|
53
|
-
<AtomicInput
|
|
54
|
-
{...inputProps}
|
|
55
|
-
value={value}
|
|
56
|
-
onChangeText={onChangeText}
|
|
57
|
-
placeholder={placeholder}
|
|
58
|
-
variant="filled"
|
|
59
|
-
style={styles.input}
|
|
60
|
-
leadingIcon="Search"
|
|
61
|
-
trailingIcon={value && value.length > 0 ? "X" : undefined}
|
|
62
|
-
onTrailingIconPress={value && value.length > 0 ? handleClear : undefined}
|
|
63
|
-
/>
|
|
64
|
-
</View>
|
|
65
|
-
);
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
// =============================================================================
|
|
69
|
-
// STYLES
|
|
70
|
-
// =============================================================================
|
|
71
|
-
|
|
72
|
-
const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) => ({
|
|
73
|
-
container: {
|
|
74
|
-
width: '100%',
|
|
75
|
-
marginVertical: tokens.spacing.sm,
|
|
76
|
-
} as ViewStyle,
|
|
77
|
-
input: {
|
|
78
|
-
backgroundColor: tokens.colors.surfaceVariant,
|
|
79
|
-
} as ViewStyle,
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
// =============================================================================
|
|
83
|
-
// EXPORTS
|
|
84
|
-
// =============================================================================
|
|
85
|
-
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SectionCard Molecule Component
|
|
3
|
-
*
|
|
4
|
-
* Reusable section card with title and content area.
|
|
5
|
-
* Used throughout settings screens for consistent grouping.
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Automatic theme-aware styling
|
|
9
|
-
* - Uppercase section titles with proper spacing
|
|
10
|
-
* - Built on AtomicCard for consistency
|
|
11
|
-
* - Flexible content area
|
|
12
|
-
*
|
|
13
|
-
* Atomic Design: Molecule (Card + Text)
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import React from 'react';
|
|
17
|
-
import { View, StyleSheet } from 'react-native';
|
|
18
|
-
import { useAppDesignTokens } from '@umituz/react-native-theme';
|
|
19
|
-
import { AtomicCard } from '../atoms/AtomicCard';
|
|
20
|
-
import { AtomicText } from '../atoms/AtomicText';
|
|
21
|
-
|
|
22
|
-
interface SectionCardProps {
|
|
23
|
-
title: string;
|
|
24
|
-
children: React.ReactNode;
|
|
25
|
-
style?: object;
|
|
26
|
-
contentStyle?: object;
|
|
27
|
-
testID?: string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export const SectionCard: React.FC<SectionCardProps> = ({
|
|
31
|
-
title,
|
|
32
|
-
children,
|
|
33
|
-
style,
|
|
34
|
-
contentStyle,
|
|
35
|
-
testID,
|
|
36
|
-
}) => {
|
|
37
|
-
const tokens = useAppDesignTokens();
|
|
38
|
-
const styles = getStyles(tokens);
|
|
39
|
-
|
|
40
|
-
return (
|
|
41
|
-
<AtomicCard
|
|
42
|
-
variant="outlined"
|
|
43
|
-
style={StyleSheet.flatten([styles.card, style])}
|
|
44
|
-
testID={testID}
|
|
45
|
-
>
|
|
46
|
-
<AtomicText
|
|
47
|
-
type="labelLarge"
|
|
48
|
-
color={tokens.colors.textSecondary}
|
|
49
|
-
style={styles.title}
|
|
50
|
-
>
|
|
51
|
-
{title.toUpperCase()}
|
|
52
|
-
</AtomicText>
|
|
53
|
-
<View style={contentStyle}>
|
|
54
|
-
{children}
|
|
55
|
-
</View>
|
|
56
|
-
</AtomicCard>
|
|
57
|
-
);
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) => StyleSheet.create({
|
|
61
|
-
card: {
|
|
62
|
-
paddingVertical: tokens.spacing.md,
|
|
63
|
-
paddingHorizontal: 0,
|
|
64
|
-
marginHorizontal: tokens.spacing.md,
|
|
65
|
-
marginBottom: tokens.spacing.lg,
|
|
66
|
-
},
|
|
67
|
-
title: {
|
|
68
|
-
fontSize: tokens.typography.labelLarge.fontSize,
|
|
69
|
-
fontWeight: tokens.typography.labelLarge.fontWeight,
|
|
70
|
-
letterSpacing: 0.5,
|
|
71
|
-
paddingHorizontal: tokens.spacing.md,
|
|
72
|
-
marginBottom: tokens.spacing.sm,
|
|
73
|
-
},
|
|
74
|
-
});
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SectionContainer Molecule - Universal Section Wrapper
|
|
3
|
-
*
|
|
4
|
-
* Provides consistent section layout with optional title
|
|
5
|
-
* Theme: {{THEME_NAME}} ({{CATEGORY}} category)
|
|
6
|
-
*
|
|
7
|
-
* Atomic Design Level: MOLECULE
|
|
8
|
-
* Composition: View + AtomicText + Layout
|
|
9
|
-
*
|
|
10
|
-
* Usage:
|
|
11
|
-
* - Home screen sections
|
|
12
|
-
* - Dashboard sections
|
|
13
|
-
* - Settings groups
|
|
14
|
-
* - Content sections
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import React from 'react';
|
|
18
|
-
import { View, StyleSheet, ViewStyle, TextStyle } from 'react-native';
|
|
19
|
-
import { AtomicText } from '../atoms/AtomicText';
|
|
20
|
-
import { useAppDesignTokens } from '@umituz/react-native-theme';
|
|
21
|
-
|
|
22
|
-
// =============================================================================
|
|
23
|
-
// TYPE DEFINITIONS
|
|
24
|
-
// =============================================================================
|
|
25
|
-
|
|
26
|
-
export interface SectionContainerProps {
|
|
27
|
-
/** Section title (optional) */
|
|
28
|
-
title?: string;
|
|
29
|
-
/** Section title color (default: textPrimary) */
|
|
30
|
-
titleColor?: string;
|
|
31
|
-
/** Section title style override */
|
|
32
|
-
titleStyle?: TextStyle;
|
|
33
|
-
/** Container style override */
|
|
34
|
-
style?: ViewStyle;
|
|
35
|
-
/** Content to render inside section */
|
|
36
|
-
children: React.ReactNode;
|
|
37
|
-
/** Right action element (e.g., "See All" link) */
|
|
38
|
-
rightAction?: React.ReactNode;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// =============================================================================
|
|
42
|
-
// COMPONENT IMPLEMENTATION
|
|
43
|
-
// =============================================================================
|
|
44
|
-
|
|
45
|
-
export const SectionContainer: React.FC<SectionContainerProps> = ({
|
|
46
|
-
title,
|
|
47
|
-
titleColor,
|
|
48
|
-
titleStyle,
|
|
49
|
-
style,
|
|
50
|
-
children,
|
|
51
|
-
rightAction,
|
|
52
|
-
}) => {
|
|
53
|
-
const tokens = useAppDesignTokens();
|
|
54
|
-
const styles = getStyles(tokens);
|
|
55
|
-
|
|
56
|
-
return (
|
|
57
|
-
<View style={[styles.section, style]}>
|
|
58
|
-
{title && (
|
|
59
|
-
<View style={styles.header}>
|
|
60
|
-
<AtomicText
|
|
61
|
-
type="titleLarge"
|
|
62
|
-
color={titleColor || "primary"}
|
|
63
|
-
style={StyleSheet.flatten([
|
|
64
|
-
styles.sectionTitle,
|
|
65
|
-
titleStyle,
|
|
66
|
-
])}
|
|
67
|
-
>
|
|
68
|
-
{title}
|
|
69
|
-
</AtomicText>
|
|
70
|
-
{rightAction && <View style={styles.rightAction}>{rightAction}</View>}
|
|
71
|
-
</View>
|
|
72
|
-
)}
|
|
73
|
-
{children}
|
|
74
|
-
</View>
|
|
75
|
-
);
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
// =============================================================================
|
|
79
|
-
// STYLES
|
|
80
|
-
// =============================================================================
|
|
81
|
-
|
|
82
|
-
const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) =>
|
|
83
|
-
StyleSheet.create({
|
|
84
|
-
section: {
|
|
85
|
-
marginBottom: tokens.spacing.lg,
|
|
86
|
-
paddingHorizontal: tokens.spacing.md,
|
|
87
|
-
},
|
|
88
|
-
header: {
|
|
89
|
-
flexDirection: 'row',
|
|
90
|
-
justifyContent: 'space-between',
|
|
91
|
-
alignItems: 'center',
|
|
92
|
-
marginBottom: tokens.spacing.md,
|
|
93
|
-
},
|
|
94
|
-
sectionTitle: {
|
|
95
|
-
fontSize: tokens.typography.titleLarge.fontSize,
|
|
96
|
-
fontWeight: tokens.typography.titleLarge.fontWeight,
|
|
97
|
-
},
|
|
98
|
-
rightAction: {
|
|
99
|
-
marginLeft: tokens.spacing.sm,
|
|
100
|
-
},
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
// =============================================================================
|
|
104
|
-
// EXPORTS
|
|
105
|
-
// =============================================================================
|
|
106
|
-
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SectionHeader Molecule - Universal Section Header
|
|
3
|
-
*
|
|
4
|
-
* Displays section title with optional subtitle
|
|
5
|
-
* Theme: {{THEME_NAME}} ({{CATEGORY}} category)
|
|
6
|
-
*
|
|
7
|
-
* Atomic Design Level: MOLECULE
|
|
8
|
-
* Composition: AtomicText + Layout
|
|
9
|
-
*
|
|
10
|
-
* Usage:
|
|
11
|
-
* - List headers
|
|
12
|
-
* - Grid headers
|
|
13
|
-
* - Section dividers
|
|
14
|
-
* - Screen headers
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import React from 'react';
|
|
18
|
-
import { View, StyleSheet, ViewStyle, TextStyle } from 'react-native';
|
|
19
|
-
import { AtomicText } from '../atoms/AtomicText';
|
|
20
|
-
import { useAppDesignTokens } from '@umituz/react-native-theme';
|
|
21
|
-
|
|
22
|
-
// =============================================================================
|
|
23
|
-
// TYPE DEFINITIONS
|
|
24
|
-
// =============================================================================
|
|
25
|
-
|
|
26
|
-
export interface SectionHeaderProps {
|
|
27
|
-
/** Main heading text */
|
|
28
|
-
title: string;
|
|
29
|
-
/** Optional subtitle text */
|
|
30
|
-
subtitle?: string;
|
|
31
|
-
/** Custom title color (default: textPrimary) */
|
|
32
|
-
titleColor?: string;
|
|
33
|
-
/** Custom subtitle color (default: textSecondary) */
|
|
34
|
-
subtitleColor?: string;
|
|
35
|
-
/** Container style override */
|
|
36
|
-
style?: ViewStyle;
|
|
37
|
-
/** Title style override */
|
|
38
|
-
titleStyle?: TextStyle;
|
|
39
|
-
/** Subtitle style override */
|
|
40
|
-
subtitleStyle?: TextStyle;
|
|
41
|
-
/** Right action element (e.g., button, icon) */
|
|
42
|
-
rightAction?: React.ReactNode;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// =============================================================================
|
|
46
|
-
// COMPONENT IMPLEMENTATION
|
|
47
|
-
// =============================================================================
|
|
48
|
-
|
|
49
|
-
export const SectionHeader: React.FC<SectionHeaderProps> = ({
|
|
50
|
-
title,
|
|
51
|
-
subtitle,
|
|
52
|
-
titleColor,
|
|
53
|
-
subtitleColor,
|
|
54
|
-
style,
|
|
55
|
-
titleStyle,
|
|
56
|
-
subtitleStyle,
|
|
57
|
-
rightAction,
|
|
58
|
-
}) => {
|
|
59
|
-
const tokens = useAppDesignTokens();
|
|
60
|
-
const styles = getStyles(tokens);
|
|
61
|
-
|
|
62
|
-
return (
|
|
63
|
-
<View style={[styles.container, style]}>
|
|
64
|
-
<View style={styles.textContainer}>
|
|
65
|
-
<AtomicText
|
|
66
|
-
type="headlineLarge"
|
|
67
|
-
color={titleColor || "primary"}
|
|
68
|
-
style={StyleSheet.flatten([
|
|
69
|
-
styles.title,
|
|
70
|
-
titleStyle,
|
|
71
|
-
])}
|
|
72
|
-
>
|
|
73
|
-
{title}
|
|
74
|
-
</AtomicText>
|
|
75
|
-
{subtitle && (
|
|
76
|
-
<AtomicText
|
|
77
|
-
type="bodyMedium"
|
|
78
|
-
color={subtitleColor || "secondary"}
|
|
79
|
-
style={StyleSheet.flatten([
|
|
80
|
-
styles.subtitle,
|
|
81
|
-
subtitleStyle,
|
|
82
|
-
])}
|
|
83
|
-
>
|
|
84
|
-
{subtitle}
|
|
85
|
-
</AtomicText>
|
|
86
|
-
)}
|
|
87
|
-
</View>
|
|
88
|
-
{rightAction && <View style={styles.rightAction}>{rightAction}</View>}
|
|
89
|
-
</View>
|
|
90
|
-
);
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
// =============================================================================
|
|
94
|
-
// STYLES
|
|
95
|
-
// =============================================================================
|
|
96
|
-
|
|
97
|
-
const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) =>
|
|
98
|
-
StyleSheet.create({
|
|
99
|
-
container: {
|
|
100
|
-
flexDirection: 'row',
|
|
101
|
-
justifyContent: 'space-between',
|
|
102
|
-
alignItems: 'center',
|
|
103
|
-
paddingHorizontal: tokens.spacing.md,
|
|
104
|
-
paddingVertical: tokens.spacing.sm,
|
|
105
|
-
},
|
|
106
|
-
textContainer: {
|
|
107
|
-
flex: 1,
|
|
108
|
-
},
|
|
109
|
-
title: {
|
|
110
|
-
fontSize: tokens.typography.headlineLarge.fontSize,
|
|
111
|
-
fontWeight: tokens.typography.headlineLarge.fontWeight,
|
|
112
|
-
marginBottom: tokens.spacing.xs,
|
|
113
|
-
},
|
|
114
|
-
subtitle: {
|
|
115
|
-
fontSize: tokens.typography.bodyMedium.fontSize,
|
|
116
|
-
},
|
|
117
|
-
rightAction: {
|
|
118
|
-
marginLeft: tokens.spacing.sm,
|
|
119
|
-
},
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
// =============================================================================
|
|
123
|
-
// EXPORTS
|
|
124
|
-
// =============================================================================
|
|
125
|
-
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AtomicConfirmationModal Style Utilities
|
|
3
|
-
*
|
|
4
|
-
* Styling functions for confirmation modal component
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { ViewStyle } from 'react-native';
|
|
8
|
-
import { ConfirmationModalVariant, ConfirmationModalVariantConfig } from '../types';
|
|
9
|
-
import type { DesignTokens } from '@umituz/react-native-theme';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Get variant configuration (icon and color only)
|
|
13
|
-
* Note: Confirm text is handled in component with translations
|
|
14
|
-
*/
|
|
15
|
-
export const getVariantConfig = (
|
|
16
|
-
variant: ConfirmationModalVariant,
|
|
17
|
-
tokens: DesignTokens
|
|
18
|
-
): Omit<ConfirmationModalVariantConfig, 'confirmText'> => {
|
|
19
|
-
switch (variant) {
|
|
20
|
-
case 'destructive':
|
|
21
|
-
return {
|
|
22
|
-
icon: 'warning',
|
|
23
|
-
iconColor: 'error',
|
|
24
|
-
};
|
|
25
|
-
case 'warning':
|
|
26
|
-
return {
|
|
27
|
-
icon: 'warning',
|
|
28
|
-
iconColor: 'warning',
|
|
29
|
-
};
|
|
30
|
-
case 'success':
|
|
31
|
-
return {
|
|
32
|
-
icon: 'check-circle',
|
|
33
|
-
iconColor: 'success',
|
|
34
|
-
};
|
|
35
|
-
case 'default':
|
|
36
|
-
default:
|
|
37
|
-
return {
|
|
38
|
-
icon: 'help-circle',
|
|
39
|
-
iconColor: 'primary',
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Get modal overlay style
|
|
46
|
-
*/
|
|
47
|
-
export const getModalOverlayStyle = (tokens: DesignTokens): ViewStyle => ({
|
|
48
|
-
flex: 1,
|
|
49
|
-
justifyContent: 'center',
|
|
50
|
-
alignItems: 'center',
|
|
51
|
-
backgroundColor: 'rgba(0, 0, 0, 0.5)',
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Get backdrop style (invisible layer for dismissing)
|
|
56
|
-
*/
|
|
57
|
-
export const getBackdropStyle = (): ViewStyle => ({
|
|
58
|
-
position: 'absolute',
|
|
59
|
-
top: 0,
|
|
60
|
-
left: 0,
|
|
61
|
-
right: 0,
|
|
62
|
-
bottom: 0,
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Get modal container style
|
|
67
|
-
*/
|
|
68
|
-
export const getModalContainerStyle = (tokens: DesignTokens): ViewStyle => ({
|
|
69
|
-
width: '85%',
|
|
70
|
-
maxWidth: 400,
|
|
71
|
-
backgroundColor: tokens.colors.surface,
|
|
72
|
-
borderRadius: 16,
|
|
73
|
-
padding: 24,
|
|
74
|
-
alignItems: 'center',
|
|
75
|
-
borderWidth: 1,
|
|
76
|
-
borderColor: tokens.colors.outline,
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Get icon container style
|
|
81
|
-
*/
|
|
82
|
-
export const getIconContainerStyle = (tokens: DesignTokens): ViewStyle => ({
|
|
83
|
-
marginBottom: 16,
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Get title container style
|
|
88
|
-
*/
|
|
89
|
-
export const getTitleContainerStyle = (tokens: DesignTokens): ViewStyle => ({
|
|
90
|
-
marginBottom: 8,
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Get message container style
|
|
95
|
-
*/
|
|
96
|
-
export const getMessageContainerStyle = (tokens: DesignTokens): ViewStyle => ({
|
|
97
|
-
marginBottom: 24,
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Get button container style
|
|
102
|
-
*/
|
|
103
|
-
export const getButtonContainerStyle = (tokens: DesignTokens): ViewStyle => ({
|
|
104
|
-
flexDirection: 'row',
|
|
105
|
-
gap: 12,
|
|
106
|
-
width: '100%',
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Get button style
|
|
111
|
-
*/
|
|
112
|
-
export const getButtonStyle = (): ViewStyle => ({
|
|
113
|
-
flex: 1,
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Get confirm button variant based on modal variant
|
|
118
|
-
*/
|
|
119
|
-
export const getConfirmButtonVariant = (
|
|
120
|
-
variant: ConfirmationModalVariant
|
|
121
|
-
): 'primary' | 'secondary' | 'tertiary' | 'outline' | 'ghost' => {
|
|
122
|
-
switch (variant) {
|
|
123
|
-
case 'destructive':
|
|
124
|
-
return 'primary'; // Will use error color
|
|
125
|
-
case 'warning':
|
|
126
|
-
return 'primary'; // Will use warning color
|
|
127
|
-
case 'success':
|
|
128
|
-
return 'primary'; // Will use success color
|
|
129
|
-
case 'default':
|
|
130
|
-
default:
|
|
131
|
-
return 'primary';
|
|
132
|
-
}
|
|
133
|
-
};
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AtomicConfirmationModal Type Definitions
|
|
3
|
-
*
|
|
4
|
-
* Type-safe interfaces for confirmation modal component
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { StyleProp, ViewStyle } from 'react-native';
|
|
8
|
-
import type { AtomicIconColor } from '../../../atoms/AtomicIcon';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Confirmation modal variant
|
|
12
|
-
* Determines the visual style and default behavior
|
|
13
|
-
*/
|
|
14
|
-
export type ConfirmationModalVariant =
|
|
15
|
-
| 'default' // Generic confirmation (blue/primary)
|
|
16
|
-
| 'destructive' // Delete/remove actions (red/error)
|
|
17
|
-
| 'warning' // Warning/caution (orange/warning)
|
|
18
|
-
| 'success'; // Success confirmation (green/success)
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Props for AtomicConfirmationModal component
|
|
22
|
-
*/
|
|
23
|
-
export interface AtomicConfirmationModalProps {
|
|
24
|
-
/**
|
|
25
|
-
* Whether the modal is visible
|
|
26
|
-
*/
|
|
27
|
-
visible: boolean;
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Modal title (required)
|
|
31
|
-
* e.g., "Delete Item?", "Confirm Action", "Are you sure?"
|
|
32
|
-
*/
|
|
33
|
-
title: string;
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Modal message/description (required)
|
|
37
|
-
* e.g., "This action cannot be undone."
|
|
38
|
-
*/
|
|
39
|
-
message: string;
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Variant determines visual style
|
|
43
|
-
* @default 'default'
|
|
44
|
-
*/
|
|
45
|
-
variant?: ConfirmationModalVariant;
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Confirm button text (required)
|
|
49
|
-
*/
|
|
50
|
-
confirmText: string;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Cancel button text (required)
|
|
54
|
-
*/
|
|
55
|
-
cancelText: string;
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Icon name to display at top (MaterialIcons name)
|
|
59
|
-
* If not provided, uses variant-specific default icon
|
|
60
|
-
* @see https://fonts.google.com/icons
|
|
61
|
-
*/
|
|
62
|
-
icon?: string;
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Callback when user confirms
|
|
66
|
-
*/
|
|
67
|
-
onConfirm: () => void;
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Callback when user cancels or dismisses
|
|
71
|
-
*/
|
|
72
|
-
onCancel: () => void;
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Whether to show backdrop (tap outside to close)
|
|
76
|
-
* @default true
|
|
77
|
-
*/
|
|
78
|
-
showBackdrop?: boolean;
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Whether backdrop is dismissible
|
|
82
|
-
* @default true
|
|
83
|
-
*/
|
|
84
|
-
backdropDismissible?: boolean;
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Custom style for modal container
|
|
88
|
-
*/
|
|
89
|
-
style?: StyleProp<ViewStyle>;
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Test ID for testing
|
|
93
|
-
*/
|
|
94
|
-
testID?: string;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Variant configuration
|
|
99
|
-
* Maps variant to icon, colors, and default text
|
|
100
|
-
*/
|
|
101
|
-
export interface ConfirmationModalVariantConfig {
|
|
102
|
-
icon: string; // MaterialIcons name
|
|
103
|
-
confirmText: string;
|
|
104
|
-
iconColor: AtomicIconColor;
|
|
105
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Molecule Components Export Index
|
|
3
|
-
*
|
|
4
|
-
* Molecules are combinations of atoms that form more complex UI components
|
|
5
|
-
* Theme: {{THEME_NAME}} ({{CATEGORY}} category)
|
|
6
|
-
*
|
|
7
|
-
* Atomic Design Level: MOLECULES
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
// Component exports
|
|
11
|
-
export { FormField } from './FormField';
|
|
12
|
-
export { ListItem } from './ListItem';
|
|
13
|
-
export { SearchBar } from './SearchBar';
|
|
14
|
-
export { SectionCard } from './SectionCard';
|
|
15
|
-
export { IconContainer } from './IconContainer';
|
|
16
|
-
export { ScreenHeader } from './ScreenHeader';
|
|
17
|
-
export { AtomicConfirmationModal, useConfirmationModal } from './AtomicConfirmationModal';
|
|
18
|
-
|
|
19
|
-
// SettingItem moved to @domains/settings/presentation/components/SettingItem
|
|
20
|
-
// Import directly: import { SettingItem } from '@domains/settings/presentation/components/SettingItem';
|
|
21
|
-
|
|
22
|
-
// Type exports
|
|
23
|
-
export type { FormFieldProps } from './FormField';
|
|
24
|
-
export type { ListItemProps } from './ListItem';
|
|
25
|
-
export type { SearchBarProps } from './SearchBar';
|
|
26
|
-
export type { ScreenHeaderProps } from './ScreenHeader';
|
|
27
|
-
export type { AtomicConfirmationModalProps, ConfirmationModalVariant } from './AtomicConfirmationModal';
|
|
28
|
-
|
|
29
|
-
// Union type for all molecule props (used for type narrowing)
|
|
30
|
-
import type { FormFieldProps } from './FormField';
|
|
31
|
-
import type { ListItemProps } from './ListItem';
|
|
32
|
-
import type { SearchBarProps } from './SearchBar';
|
|
33
|
-
import type { ScreenHeaderProps } from './ScreenHeader';
|
|
34
|
-
import type { AtomicConfirmationModalProps } from './AtomicConfirmationModal';
|
|
35
|
-
|
|
36
|
-
export type MoleculeComponentProps =
|
|
37
|
-
| FormFieldProps
|
|
38
|
-
| ListItemProps
|
|
39
|
-
| SearchBarProps
|
|
40
|
-
| ScreenHeaderProps
|
|
41
|
-
| AtomicConfirmationModalProps;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { ViewStyle } from 'react-native';
|
|
2
|
-
import { useAppDesignTokens } from '@umituz/react-native-theme';
|
|
3
|
-
|
|
4
|
-
type DesignTokens = ReturnType<typeof useAppDesignTokens>;
|
|
5
|
-
|
|
6
|
-
export const getListItemStyles = (tokens: DesignTokens) => ({
|
|
7
|
-
container: {
|
|
8
|
-
flexDirection: 'row' as const,
|
|
9
|
-
alignItems: 'center' as const,
|
|
10
|
-
padding: tokens.spacing.md,
|
|
11
|
-
backgroundColor: tokens.colors.surface,
|
|
12
|
-
borderRadius: tokens.borders.radius.lg,
|
|
13
|
-
marginBottom: tokens.spacing.sm,
|
|
14
|
-
} as ViewStyle,
|
|
15
|
-
disabled: { opacity: 0.6 } as ViewStyle,
|
|
16
|
-
iconContainer: { marginHorizontal: tokens.spacing.sm } as ViewStyle,
|
|
17
|
-
content: { flex: 1 } as ViewStyle,
|
|
18
|
-
subtitle: { marginTop: tokens.spacing.xs } as ViewStyle,
|
|
19
|
-
});
|