Skip to content

Commit 8b443b0

Browse files
authored
Feat(design-system): 카테고리 칩 컴포넌트 (#34)
* feat: 카테고리 색상 분기 * feat: 스토리북 코드 연결 * fix: 타입 지정 수정 * feat: 카테고리명 필수화 * feat: 스토리북 가운데 정렬 설정 * feat: 변수 네이밍 수정정 * chore: 머지 충돌에러 해결
1 parent af64dee commit 8b443b0

File tree

3 files changed

+132
-0
lines changed

3 files changed

+132
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import type { Meta, StoryObj } from '@storybook/react-vite';
2+
import Chip from './Chip';
3+
4+
const meta: Meta<typeof Chip> = {
5+
title: 'Components/Chip',
6+
component: Chip,
7+
tags: ['autodocs'],
8+
args: {
9+
category: 'Frontend',
10+
color: 'red',
11+
},
12+
argTypes: {
13+
category: {
14+
control: 'text',
15+
description: '칩에 표시할 텍스트',
16+
},
17+
color: {
18+
control: { type: 'select' },
19+
options: [
20+
'red',
21+
'purple',
22+
'navyblue',
23+
'skyblue',
24+
'emerald',
25+
'navygreen',
26+
'khaki',
27+
'orange',
28+
'amber',
29+
'maroon',
30+
],
31+
description: '카테고리 색상',
32+
},
33+
},
34+
parameters: {
35+
layout: 'centered',
36+
docs: {
37+
description: {
38+
component:
39+
'카테고리를 색상별로 표시하는 Chip 컴포넌트. cva로 색상 variants를 스위칭합니다.',
40+
},
41+
},
42+
},
43+
};
44+
45+
export default meta;
46+
type Story = StoryObj<typeof Chip>;
47+
48+
export const Default: Story = {};
49+
50+
export const AllColors: Story = {
51+
args: { category: 'Category' },
52+
render: (args) => {
53+
const colors = [
54+
'red',
55+
'purple',
56+
'navyblue',
57+
'skyblue',
58+
'emerald',
59+
'navygreen',
60+
'khaki',
61+
'orange',
62+
'amber',
63+
'maroon',
64+
] as const;
65+
66+
return (
67+
<div style={{ display: 'grid', gap: '8px' }}>
68+
{colors.map((color) => (
69+
<div
70+
key={color}
71+
style={{ display: 'flex', alignItems: 'center', gap: 8 }}
72+
>
73+
<Chip {...args} color={color} />
74+
<code style={{ fontSize: 12 }}>{color}</code>
75+
</div>
76+
))}
77+
</div>
78+
);
79+
},
80+
parameters: {
81+
docs: {
82+
description: { story: '팔레트 뷰: 모든 색상 변형을 한 번에 미리보기' },
83+
},
84+
},
85+
};
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { cva } from 'class-variance-authority';
2+
type ChipColor =
3+
| 'red'
4+
| 'purple'
5+
| 'navyblue'
6+
| 'skyblue'
7+
| 'emerald'
8+
| 'navygreen'
9+
| 'khaki'
10+
| 'orange'
11+
| 'amber'
12+
| 'maroon';
13+
14+
interface ChipProps {
15+
color: ChipColor;
16+
category: string;
17+
}
18+
const ChipColorVariants = cva(
19+
'caption2-sb rounded-[0.4rem] px-[0.8rem] py-[0.39rem]',
20+
{
21+
variants: {
22+
color: {
23+
red: 'bg-category-red-bg text-category-red-text',
24+
purple: 'bg-category-purple-bg text-category-purple-text',
25+
navyblue: 'bg-category-navyblue-bg text-category-navyblue-text',
26+
skyblue: 'bg-category-skyblue-bg text-category-skyblue-text',
27+
emerald: 'bg-category-emerald-bg text-category-emerald-text',
28+
navygreen: 'bg-category-navygreen-bg text-category-navygreen-text',
29+
khaki: 'bg-category-khaki-bg text-category-khaki-text',
30+
orange: 'bg-category-orange-bg text-category-orange-text',
31+
amber: 'bg-category-amber-bg text-category-amber-text',
32+
maroon: 'bg-category-maroon-bg text-category-maroon-text',
33+
},
34+
},
35+
defaultVariants: {
36+
color: 'red',
37+
},
38+
}
39+
);
40+
const Chip = ({ color, category }: ChipProps) => {
41+
return (
42+
<span className={ChipColorVariants({ color: color })}>{category}</span>
43+
);
44+
};
45+
46+
export default Chip;

packages/design-system/src/components/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export { default as Button } from './button/Button';
22
export { Switch } from './switch/Switch';
33
export { default as Badge } from './badge/Badge';
44
export { default as Input } from './input/Input';
5+
export { default as Chip } from './chip/Chip';
56
export { default as Level } from './level/Level';
67
export { Textarea } from './textarea/Textarea';
78
export { Progress } from './progress/Progress';

0 commit comments

Comments
 (0)