Skip to content

Commit 01ad4b1

Browse files
authored
Merge pull request #13 from DevKor-github/feat/#12/chip
feat: chip 구현구현
2 parents b4a88f3 + 432276f commit 01ad4b1

6 files changed

Lines changed: 131 additions & 1 deletion

File tree

src/assets/icons/Arrow.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const Arrow = () => {
2+
return (
3+
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="13" viewBox="0 0 12 13" fill="none">
4+
<path
5+
d="M10.0152 4.24986C9.89675 4.13147 9.73615 4.06496 9.5687 4.06496C9.40125 4.06496 9.24065 4.13147 9.12222 4.24986L5.99626 7.37582L2.8703 4.24986C2.75119 4.13482 2.59167 4.07117 2.42609 4.07261C2.26051 4.07405 2.10212 4.14046 1.98504 4.25755C1.86795 4.37464 1.80154 4.53303 1.8001 4.69861C1.79866 4.86419 1.86231 5.02371 1.97734 5.14281L5.54978 8.71525C5.66821 8.83364 5.82881 8.90015 5.99626 8.90015C6.16371 8.90015 6.32431 8.83364 6.44274 8.71525L10.0152 5.14281C10.1336 5.02438 10.2001 4.86379 10.2001 4.69633C10.2001 4.52888 10.1336 4.36828 10.0152 4.24986Z"
6+
fill="currentColor"
7+
/>
8+
</svg>
9+
);
10+
};
11+
export default Arrow;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import type { PropsWithChildren } from 'react';
2+
import * as s from './style.css';
3+
4+
interface Props extends PropsWithChildren {
5+
color?: 'gray' | 'main';
6+
onClick?: () => void;
7+
}
8+
const Chip = ({ children, color = 'gray', onClick }: Props) => {
9+
return (
10+
<div className={s.Container({ color })} onClick={onClick}>
11+
{children}
12+
</div>
13+
);
14+
};
15+
export default Chip;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { cva } from '@styled-system/css';
2+
3+
export const Container = cva({
4+
base: {
5+
padding: '0.5rem 0.75rem',
6+
display: 'flex',
7+
alignItems: 'center',
8+
justifyContent: 'center',
9+
gap: '0.25rem',
10+
rounded: 'full',
11+
width: 'fit-content',
12+
fontSize: '0.875rem',
13+
fontWeight: 400,
14+
cursor: 'pointer',
15+
},
16+
variants: {
17+
color: {
18+
main: {
19+
backgroundColor: 'main-26',
20+
border: '1px solid',
21+
borderColor: 'main-54',
22+
color: '100',
23+
},
24+
gray: {
25+
backgroundColor: 'systemGray5',
26+
color: '80',
27+
},
28+
},
29+
},
30+
});
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import type { PropsWithChildren } from 'react';
2+
3+
import * as s from './style.css';
4+
import Arrow from '@/assets/icons/Arrow';
5+
6+
interface Props extends PropsWithChildren {
7+
active: boolean;
8+
onClick?: () => void;
9+
}
10+
11+
const SelectButton = ({ children, active, onClick }: Props) => {
12+
// TODO: 자연스럽게 바뀌게 애니메이션 추가
13+
return (
14+
<button className={s.Container({ color: active ? 'main' : 'gray' })} onClick={onClick}>
15+
{children}
16+
<div className={s.Icon({ direction: active ? 'up' : 'down' })}>
17+
<Arrow />
18+
</div>
19+
</button>
20+
);
21+
};
22+
export default SelectButton;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { cva } from '@styled-system/css';
2+
3+
export const Container = cva({
4+
base: {
5+
borderRadius: 'full',
6+
padding: '0.375rem 0.375rem 0.375rem 0.625rem',
7+
display: 'flex',
8+
alignItems: 'center',
9+
justifyContent: 'center',
10+
gap: '0.25rem',
11+
fontSize: '0.75rem',
12+
fontWeight: 500,
13+
cursor: 'pointer',
14+
color: '100',
15+
},
16+
variants: {
17+
color: {
18+
main: {
19+
border: '1px solid',
20+
borderColor: 'main-54',
21+
bgColor: 'main-26',
22+
},
23+
gray: {
24+
bgColor: 'systemGray5',
25+
},
26+
},
27+
},
28+
});
29+
30+
export const Icon = cva({
31+
base: {
32+
color: '54',
33+
},
34+
variants: {
35+
direction: {
36+
up: {
37+
transform: 'rotate(180deg)',
38+
},
39+
down: {
40+
transform: 'rotate(0deg)',
41+
},
42+
},
43+
},
44+
});

src/pages/HomePage/index.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
1-
import { useFlow } from '@/libs/routes/stack';
1+
import { useState } from 'react';
22
import type { ActivityComponentType } from '@stackflow/react';
3+
import { useFlow } from '@/libs/routes/stack';
34

45
// CSS 사용하는 컴포넌트에서는 이런 식으로 불러오기
56
import * as s from './style.css';
67

78
import AppScreenWithSafeArea from '@/common/components/AppScreenWithSafeArea';
9+
import Chip from '@/common/components/Chip';
10+
import SelectButton from '@/common/components/SelectButton';
811
import TestAPIButton from '@/common/components/TestAPIButton';
912

1013
const HomePage: ActivityComponentType = () => {
1114
const { push } = useFlow();
15+
const [active, setActive] = useState(false);
1216
return (
1317
<AppScreenWithSafeArea>
1418
<h1 className={s.Title}>리피카 짱</h1>
@@ -20,6 +24,10 @@ const HomePage: ActivityComponentType = () => {
2024
<TestAPIButton />
2125
<button onClick={() => push('PostPage', {})}>이동</button>
2226
</div>
27+
<Chip color="main">축구</Chip>
28+
<SelectButton active={active} onClick={() => setActive(!active)}>
29+
종목
30+
</SelectButton>
2331
</AppScreenWithSafeArea>
2432
);
2533
};

0 commit comments

Comments
 (0)