@kukkim/react-native-ui 0.1.3 → 0.1.5

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 (126) hide show
  1. package/lib/module/assets/icons/apple.svg +1 -0
  2. package/lib/module/assets/icons/facebook.svg +1 -0
  3. package/lib/module/assets/icons/google.svg +1 -0
  4. package/lib/module/assets/icons/kakaotalk.svg +1 -0
  5. package/lib/module/assets/icons/loader-circle.svg +1 -0
  6. package/lib/module/assets/icons/naver.svg +1 -0
  7. package/lib/module/components/badge/commonBadge.js +18 -16
  8. package/lib/module/components/badge/commonBadge.js.map +1 -1
  9. package/lib/module/components/badge/numberBadge.js +47 -0
  10. package/lib/module/components/badge/numberBadge.js.map +1 -0
  11. package/lib/module/components/button/index.js +2 -1
  12. package/lib/module/components/button/index.js.map +1 -1
  13. package/lib/module/components/button/socialLoginButton.js +48 -0
  14. package/lib/module/components/button/socialLoginButton.js.map +1 -0
  15. package/lib/module/components/card/foldableCard.js +9 -18
  16. package/lib/module/components/card/foldableCard.js.map +1 -1
  17. package/lib/module/components/icon/Apple.js +18 -0
  18. package/lib/module/components/icon/Apple.js.map +1 -0
  19. package/lib/module/components/icon/Facebook.js +18 -0
  20. package/lib/module/components/icon/Facebook.js.map +1 -0
  21. package/lib/module/components/icon/Google.js +18 -0
  22. package/lib/module/components/icon/Google.js.map +1 -0
  23. package/lib/module/components/icon/Kakaotalk.js +18 -0
  24. package/lib/module/components/icon/Kakaotalk.js.map +1 -0
  25. package/lib/module/components/icon/LoaderCircle.js +24 -0
  26. package/lib/module/components/icon/LoaderCircle.js.map +1 -0
  27. package/lib/module/components/icon/Naver.js +18 -0
  28. package/lib/module/components/icon/Naver.js.map +1 -0
  29. package/lib/module/components/icon/index.js +15 -2
  30. package/lib/module/components/icon/index.js.map +1 -1
  31. package/lib/module/components/index.js +4 -1
  32. package/lib/module/components/index.js.map +1 -1
  33. package/lib/module/components/select/commonSelect.js +135 -0
  34. package/lib/module/components/select/commonSelect.js.map +1 -0
  35. package/lib/module/components/select/index.js +5 -0
  36. package/lib/module/components/select/index.js.map +1 -0
  37. package/lib/module/components/select/types.js +4 -0
  38. package/lib/module/components/select/types.js.map +1 -0
  39. package/lib/module/components/slider/index.js +103 -1
  40. package/lib/module/components/slider/index.js.map +1 -1
  41. package/lib/module/components/slider/types.js +2 -0
  42. package/lib/module/components/spinner/commonSpinner.js +49 -0
  43. package/lib/module/components/spinner/commonSpinner.js.map +1 -0
  44. package/lib/module/components/spinner/index.js +3 -1
  45. package/lib/module/components/spinner/index.js.map +1 -1
  46. package/lib/module/components/spinner/types.js +2 -0
  47. package/lib/module/index.js +1 -1
  48. package/lib/module/index.js.map +1 -1
  49. package/lib/typescript/src/components/badge/commonBadge.d.ts +1 -1
  50. package/lib/typescript/src/components/badge/commonBadge.d.ts.map +1 -1
  51. package/lib/typescript/src/components/badge/numberBadge.d.ts +4 -0
  52. package/lib/typescript/src/components/badge/numberBadge.d.ts.map +1 -0
  53. package/lib/typescript/src/components/button/index.d.ts +2 -1
  54. package/lib/typescript/src/components/button/index.d.ts.map +1 -1
  55. package/lib/typescript/src/components/button/socialLoginButton.d.ts +4 -0
  56. package/lib/typescript/src/components/button/socialLoginButton.d.ts.map +1 -0
  57. package/lib/typescript/src/components/button/types.d.ts +3 -0
  58. package/lib/typescript/src/components/button/types.d.ts.map +1 -1
  59. package/lib/typescript/src/components/card/foldableCard.d.ts.map +1 -1
  60. package/lib/typescript/src/components/icon/Apple.d.ts +4 -0
  61. package/lib/typescript/src/components/icon/Apple.d.ts.map +1 -0
  62. package/lib/typescript/src/components/icon/Facebook.d.ts +4 -0
  63. package/lib/typescript/src/components/icon/Facebook.d.ts.map +1 -0
  64. package/lib/typescript/src/components/icon/Google.d.ts +4 -0
  65. package/lib/typescript/src/components/icon/Google.d.ts.map +1 -0
  66. package/lib/typescript/src/components/icon/Kakaotalk.d.ts +4 -0
  67. package/lib/typescript/src/components/icon/Kakaotalk.d.ts.map +1 -0
  68. package/lib/typescript/src/components/icon/LoaderCircle.d.ts +4 -0
  69. package/lib/typescript/src/components/icon/LoaderCircle.d.ts.map +1 -0
  70. package/lib/typescript/src/components/icon/Naver.d.ts +4 -0
  71. package/lib/typescript/src/components/icon/Naver.d.ts.map +1 -0
  72. package/lib/typescript/src/components/icon/index.d.ts.map +1 -1
  73. package/lib/typescript/src/components/icon/types.d.ts +1 -1
  74. package/lib/typescript/src/components/icon/types.d.ts.map +1 -1
  75. package/lib/typescript/src/components/index.d.ts +4 -1
  76. package/lib/typescript/src/components/index.d.ts.map +1 -1
  77. package/lib/typescript/src/components/select/commonSelect.d.ts +5 -0
  78. package/lib/typescript/src/components/select/commonSelect.d.ts.map +1 -0
  79. package/lib/typescript/src/components/select/index.d.ts +3 -0
  80. package/lib/typescript/src/components/select/index.d.ts.map +1 -0
  81. package/lib/typescript/src/components/select/types.d.ts +16 -0
  82. package/lib/typescript/src/components/select/types.d.ts.map +1 -0
  83. package/lib/typescript/src/components/slider/index.d.ts +2 -0
  84. package/lib/typescript/src/components/slider/index.d.ts.map +1 -1
  85. package/lib/typescript/src/components/slider/types.d.ts +9 -0
  86. package/lib/typescript/src/components/slider/types.d.ts.map +1 -1
  87. package/lib/typescript/src/components/spinner/commonSpinner.d.ts +4 -0
  88. package/lib/typescript/src/components/spinner/commonSpinner.d.ts.map +1 -0
  89. package/lib/typescript/src/components/spinner/index.d.ts +2 -0
  90. package/lib/typescript/src/components/spinner/index.d.ts.map +1 -1
  91. package/lib/typescript/src/components/spinner/types.d.ts +8 -0
  92. package/lib/typescript/src/components/spinner/types.d.ts.map +1 -1
  93. package/lib/typescript/src/index.d.ts +1 -1
  94. package/lib/typescript/src/index.d.ts.map +1 -1
  95. package/package.json +3 -1
  96. package/src/assets/icons/apple.svg +1 -0
  97. package/src/assets/icons/facebook.svg +1 -0
  98. package/src/assets/icons/google.svg +1 -0
  99. package/src/assets/icons/kakaotalk.svg +1 -0
  100. package/src/assets/icons/loader-circle.svg +1 -0
  101. package/src/assets/icons/naver.svg +1 -0
  102. package/src/components/badge/commonBadge.tsx +23 -26
  103. package/src/components/badge/numberBadge.tsx +49 -0
  104. package/src/components/button/index.ts +2 -1
  105. package/src/components/button/socialLoginButton.tsx +49 -0
  106. package/src/components/button/types.ts +4 -0
  107. package/src/components/card/foldableCard.tsx +14 -18
  108. package/src/components/icon/Apple.tsx +15 -0
  109. package/src/components/icon/Facebook.tsx +15 -0
  110. package/src/components/icon/Google.tsx +15 -0
  111. package/src/components/icon/Kakaotalk.tsx +15 -0
  112. package/src/components/icon/LoaderCircle.tsx +20 -0
  113. package/src/components/icon/Naver.tsx +15 -0
  114. package/src/components/icon/index.tsx +14 -1
  115. package/src/components/icon/types.ts +7 -3
  116. package/src/components/index.ts +4 -1
  117. package/src/components/select/commonSelect.tsx +170 -0
  118. package/src/components/select/index.ts +3 -0
  119. package/src/components/select/types.ts +18 -0
  120. package/src/components/slider/index.tsx +118 -1
  121. package/src/components/slider/types.ts +10 -0
  122. package/src/components/spinner/commonSpinner.tsx +48 -0
  123. package/src/components/spinner/index.ts +3 -0
  124. package/src/components/spinner/types.ts +9 -0
  125. package/src/index.tsx +5 -0
  126. package/src/components/spinner/index.tsx +0 -1
@@ -0,0 +1,170 @@
1
+ import React, { type ReactElement, useState } from 'react';
2
+ import { Pressable, StyleSheet, View } from 'react-native';
3
+ import { useTheme } from '../../hooks/useTheme';
4
+ import { CommonIcon } from '../icon';
5
+ import { CommonText } from '../text';
6
+ import { type CommonSelectItemProps, type CommonSelectProps } from './types';
7
+ import Animated, {
8
+ useAnimatedStyle,
9
+ useSharedValue,
10
+ withTiming,
11
+ } from 'react-native-reanimated';
12
+
13
+ export const SelectItem = (_props: CommonSelectItemProps) => {
14
+ return null;
15
+ };
16
+ export const CommonSelect = ({
17
+ children,
18
+ placeholder = 'Select',
19
+ value,
20
+ // defaultValue,
21
+ onChange,
22
+ style,
23
+ }: CommonSelectProps) => {
24
+ const { theme } = useTheme();
25
+ const [open, setOpen] = useState(false);
26
+ const [internalValue, setInternalValue] = useState<string | undefined>(
27
+ // defaultValue
28
+ ''
29
+ );
30
+
31
+ const selectedValue = value ?? internalValue;
32
+
33
+ const items = React.Children.toArray(children).filter(
34
+ React.isValidElement
35
+ ) as ReactElement<CommonSelectItemProps>[];
36
+
37
+ const selectedItem = items.find((item) => item.props.value === selectedValue);
38
+
39
+ const handleSelect = (nextValue: string) => {
40
+ if (value === undefined) {
41
+ setInternalValue(nextValue);
42
+ }
43
+
44
+ onChange?.(nextValue);
45
+ setOpen(false);
46
+ };
47
+
48
+ const rotate = useSharedValue(0);
49
+ const arrowAnimatedStyle = useAnimatedStyle(() => {
50
+ return {
51
+ transform: [
52
+ {
53
+ rotate: `${rotate.value}deg`,
54
+ },
55
+ ],
56
+ };
57
+ });
58
+
59
+ return (
60
+ <View style={[styles.container, style]}>
61
+ <Pressable
62
+ style={[
63
+ styles.trigger,
64
+ {
65
+ borderColor: theme.colors.border,
66
+ backgroundColor: theme.colors.background,
67
+ },
68
+ ]}
69
+ onPress={() => {
70
+ const nextOpen = !open;
71
+
72
+ rotate.value = withTiming(nextOpen ? 180 : 0, {
73
+ duration: 200,
74
+ });
75
+
76
+ setOpen(nextOpen);
77
+ }}
78
+ >
79
+ <CommonText
80
+ size="m"
81
+ style={[!selectedItem && { color: theme.colors.disabled }]}
82
+ >
83
+ {selectedItem?.props.label ?? placeholder}
84
+ </CommonText>
85
+ <Animated.View style={arrowAnimatedStyle}>
86
+ <CommonIcon iconType="down" />
87
+ </Animated.View>
88
+ </Pressable>
89
+
90
+ {open && (
91
+ <View
92
+ style={[
93
+ {
94
+ borderColor: theme.colors.border,
95
+ backgroundColor: theme.colors.background,
96
+ },
97
+ styles.dropdown,
98
+ ]}
99
+ >
100
+ {items.map((item) => {
101
+ const isSelected = item.props.value === selectedValue;
102
+
103
+ return (
104
+ <Pressable
105
+ key={String(item.props.value)}
106
+ style={[styles.option, isSelected && styles.selectedOption]}
107
+ onPress={() => handleSelect(item.props.value)}
108
+ >
109
+ <CommonText
110
+ style={[
111
+ styles.optionText,
112
+ isSelected && styles.selectedOptionText,
113
+ ]}
114
+ >
115
+ {item.props.label}
116
+ </CommonText>
117
+ </Pressable>
118
+ );
119
+ })}
120
+ </View>
121
+ )}
122
+ </View>
123
+ );
124
+ };
125
+
126
+ const styles = StyleSheet.create({
127
+ container: {
128
+ position: 'relative',
129
+ width: '100%',
130
+ zIndex: 999,
131
+ },
132
+ trigger: {
133
+ minHeight: 44,
134
+ borderWidth: 1,
135
+ borderRadius: 8,
136
+ paddingHorizontal: 10,
137
+ flexDirection: 'row',
138
+ alignItems: 'center',
139
+ justifyContent: 'space-between',
140
+ },
141
+ arrow: {
142
+ fontSize: 12,
143
+ color: '#667085',
144
+ },
145
+ dropdown: {
146
+ position: 'absolute',
147
+ top: 46,
148
+ left: 0,
149
+ right: 0,
150
+
151
+ borderWidth: 1,
152
+ borderRadius: 8,
153
+ zIndex: 999,
154
+ elevation: 10,
155
+ },
156
+ option: {
157
+ paddingVertical: 12,
158
+ paddingHorizontal: 12,
159
+ },
160
+ selectedOption: {
161
+ backgroundColor: '#F2F4F7',
162
+ },
163
+ optionText: {
164
+ fontSize: 14,
165
+ color: '#101828',
166
+ },
167
+ selectedOptionText: {
168
+ fontWeight: '600',
169
+ },
170
+ });
@@ -0,0 +1,3 @@
1
+ import { CommonSelect, SelectItem } from './commonSelect';
2
+
3
+ export { CommonSelect, SelectItem };
@@ -0,0 +1,18 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type ViewProps } from 'react-native';
3
+
4
+ // type Variant = 'primary' | 'secondary';
5
+ type SizeVariant = 's' | 'm' | 'l';
6
+
7
+ export interface CommonSelectProps extends ViewProps {
8
+ size?: SizeVariant;
9
+ value?: string;
10
+ placeholder?: string;
11
+ onChange?: (value: string) => void;
12
+ children: ReactNode;
13
+ }
14
+
15
+ export interface CommonSelectItemProps extends ViewProps {
16
+ label: string;
17
+ value: string;
18
+ }
@@ -1 +1,118 @@
1
- // TODO: slider 구현 필요
1
+ import { View, StyleSheet } from 'react-native';
2
+ import { Gesture, GestureDetector } from 'react-native-gesture-handler';
3
+ import Animated, {
4
+ useAnimatedStyle,
5
+ useSharedValue,
6
+ } from 'react-native-reanimated';
7
+ import { CommonText } from '../text';
8
+ import { type SliderProps } from './types';
9
+ import { useTheme } from '../../hooks/useTheme';
10
+
11
+ // TODO: Thumb가 범위 바깥으로 넘어가는 것 수정 필요.
12
+ export const CommonSlider = ({ labels = [] }: SliderProps) => {
13
+ const { theme } = useTheme();
14
+ const position = useSharedValue(0);
15
+ const startPosition = useSharedValue(0);
16
+
17
+ const panGesture = Gesture.Pan()
18
+ .onBegin(() => {
19
+ startPosition.value = position.value;
20
+ })
21
+ .onUpdate((event) => {
22
+ const nextValue = startPosition.value + event.translationX;
23
+ if (nextValue < 0) {
24
+ position.value = 0;
25
+ } else {
26
+ position.value = nextValue;
27
+ }
28
+ });
29
+ const animatedStyle = useAnimatedStyle(() => ({
30
+ transform: [{ translateX: position.value }],
31
+ }));
32
+ const activeTrackStyle = useAnimatedStyle(() => ({
33
+ width: position.value + 15,
34
+ }));
35
+
36
+ return (
37
+ <View style={styles.container}>
38
+ <View
39
+ style={[styles.sliderBar, { backgroundColor: theme.colors.secondary }]}
40
+ >
41
+ <Animated.View
42
+ style={[
43
+ {
44
+ backgroundColor: theme.colors.primary,
45
+ },
46
+ styles.filledSliderBar,
47
+ activeTrackStyle,
48
+ ]}
49
+ />
50
+ <GestureDetector gesture={panGesture}>
51
+ <Animated.View
52
+ style={[
53
+ animatedStyle,
54
+ {
55
+ backgroundColor: theme.colors.text,
56
+ },
57
+ styles.thumb,
58
+ ]}
59
+ />
60
+ </GestureDetector>
61
+ </View>
62
+
63
+ <View style={styles.labelBar}>
64
+ {labels.map((label, index) => {
65
+ const percent = labels.length === 1 ? 0 : index / (labels.length - 1);
66
+ return (
67
+ <CommonText
68
+ size="s"
69
+ key={`${label}-${index}`}
70
+ style={[
71
+ styles.labelText,
72
+ {
73
+ color: theme.colors.text,
74
+ left: `${percent * 100}%`,
75
+ },
76
+ ]}
77
+ >
78
+ {label}
79
+ </CommonText>
80
+ );
81
+ })}
82
+ </View>
83
+ </View>
84
+ );
85
+ };
86
+
87
+ const styles = StyleSheet.create({
88
+ container: {
89
+ padding: 20,
90
+ width: '100%',
91
+ },
92
+ sliderBar: {
93
+ width: '100%',
94
+ height: 10,
95
+ },
96
+ filledSliderBar: {
97
+ position: 'absolute',
98
+ left: 0,
99
+ top: 0,
100
+ height: 10,
101
+ borderRadius: 5,
102
+ },
103
+ labelBar: {
104
+ position: 'relative',
105
+ height: 24,
106
+ marginTop: 12,
107
+ },
108
+ labelText: {
109
+ position: 'absolute',
110
+ transform: [{ translateX: -8 }],
111
+ },
112
+ thumb: {
113
+ bottom: 10,
114
+ width: 30,
115
+ height: 30,
116
+ borderRadius: 15,
117
+ },
118
+ });
@@ -0,0 +1,10 @@
1
+ import { type ViewProps } from 'react-native';
2
+
3
+ type Variant = 'primary' | 'secondary';
4
+ type SizeVariant = 's' | 'm' | 'l';
5
+
6
+ export interface SliderProps extends ViewProps {
7
+ type?: Variant;
8
+ size?: SizeVariant;
9
+ labels?: (string | number)[];
10
+ }
@@ -0,0 +1,48 @@
1
+ import { useEffect } from 'react';
2
+ import { StyleSheet, View } from 'react-native';
3
+ import Animated, {
4
+ Easing,
5
+ useAnimatedStyle,
6
+ useSharedValue,
7
+ withRepeat,
8
+ withTiming,
9
+ } from 'react-native-reanimated';
10
+ import { CommonIcon } from '../icon';
11
+ import { type SpinnerProps } from './types';
12
+ import { useTheme } from '../../hooks/useTheme';
13
+
14
+ const CommonSpinner = ({ type = 'primary', ...props }: SpinnerProps) => {
15
+ const { theme } = useTheme();
16
+ const rotateValue = useSharedValue(0);
17
+ const animatedStyles = useAnimatedStyle(() => ({
18
+ transform: [{ rotate: `${rotateValue.value}deg` }],
19
+ }));
20
+
21
+ useEffect(() => {
22
+ rotateValue.value = withRepeat(
23
+ withTiming(360, {
24
+ duration: 1000,
25
+ easing: Easing.linear,
26
+ }),
27
+ -1, // infinite
28
+ false
29
+ );
30
+ });
31
+
32
+ return (
33
+ <View style={styles.container} {...props}>
34
+ <Animated.View style={[animatedStyles]}>
35
+ <CommonIcon color={theme.colors[type]} iconType="loaderCircle" />
36
+ </Animated.View>
37
+ </View>
38
+ );
39
+ };
40
+
41
+ const styles = StyleSheet.create({
42
+ container: {
43
+ width: 24,
44
+ height: 24,
45
+ },
46
+ });
47
+
48
+ export default CommonSpinner;
@@ -0,0 +1,3 @@
1
+ import CommonSpinner from './commonSpinner';
2
+
3
+ export { CommonSpinner };
@@ -0,0 +1,9 @@
1
+ import { type ViewProps } from 'react-native';
2
+
3
+ type Variant = 'primary' | 'secondary';
4
+ type SizeVariant = 's' | 'm' | 'l';
5
+
6
+ export interface SpinnerProps extends ViewProps {
7
+ type?: Variant;
8
+ size?: SizeVariant;
9
+ }
package/src/index.tsx CHANGED
@@ -17,5 +17,10 @@ export {
17
17
  CommonInput,
18
18
  CommonPopOver,
19
19
  CommonSwitch,
20
+ SocialLoginButton,
21
+ CommonSpinner,
22
+ CommonSlider,
23
+ CommonSelect,
24
+ SelectItem,
20
25
  } from './components';
21
26
  export { ThemeProvider } from './theme/themeProvider';
@@ -1 +0,0 @@
1
- // TODO: spinner 구현 필요