제 코드가 어디선가 유출되고 있나 봅니다. 똑같군요.
1. 문제의 발단
디자이너님과 함께 정형화되지 않았던 스타일 가이드를 다시 고치고, 공용 스타일로 사용되지 않던 컴포넌트들을 다시 통일시키고 있다.
스타일도 통일 시키고, 그에 따라 필요한 인자들을 넘겨주어 정형화되고 완벽한 어디에도 사용할 수 있는 컴포넌트를 만드는 과정에서 깨달은 것들을 적어본다.
2. Button Size
width는 fit, height를 3가지 종류로 나눴다.
const Button = styled('button', {
base: css`
${apply`border-1 rounded-[4px] px-4 bg-[#2ecc71] border-2 text-white bg-cyan-500 shadow-lg shadow-cyan-500/50`};
`,
variants: {
size: {
small: `h-[33px]`,
medium: `h-[41px]`,
large: `h-[49px]`,
},
},
defaults: {
size: 'large',
},
});
export default function Projects() {
return (
<div className={tw`flex justify-center items-center gap-2 mt-[50vh]`}>
<Button size='small'>Small</Button>
<Button size='medium'>Medium</Button>
<Button>Default Large</Button>
</div>
);
}
가장 기본적인 스타일만을 넣은 버튼이다.
대부분 2 ~ 3개 정도의 버튼 스타일을 쓴다.
3. outlined
import { styled } from '@twind/react';
import { apply, tw } from 'twind';
import { css } from 'twind/css';
const Button = styled('button', {
base: css`
${apply`border-1 rounded-[4px] px-4 bg-[#2ecc71] border-2 text-white bg-cyan-500 shadow-lg shadow-cyan-500/50`};
`,
variants: {
size: {
small: `h-[33px]`,
medium: `h-[41px]`,
large: `h-[49px]`,
},
variant: {
normal: ``,
outlined: `border-[#2ecc71] text-[#2ecc71] bg-white`,
},
},
defaults: {
variant: 'normal',
size: 'large',
},
});
export default function Projects() {
return (
<div className={tw`flex justify-center items-center gap-2 mt-[50vh]`}>
<Button>Normal</Button>
<Button variant='outlined'>Outlined</Button>
</div>
);
}
색상 반전의 느낌으로 스타일링을 바꾼다.
기본값을 잘 넘겨줘야 한다.
4. hover
import { styled } from '@twind/react';
import { apply, tw } from 'twind';
import { css } from 'twind/css';
const Button = styled('button', {
base: css`
${apply`border-1 rounded-[4px] px-4 bg-[#2ecc71] border-2 text-white bg-cyan-500 shadow-lg shadow-cyan-500/50`};
`,
variants: {
size: {
small: `h-[33px]`,
medium: `h-[41px]`,
large: `h-[49px]`,
},
variant: {
normal: ``,
outlined: `border-[#2ecc71] text-[#2ecc71] bg-white`,
hover: `transition duration-150 ease-out hover:(ease-in bg-red-500)`,
},
},
defaults: {
variant: 'normal',
size: 'large',
},
});
export default function Projects() {
return (
<div className={tw`flex justify-center items-center gap-2 mt-[50vh]`}>
<Button>Normal</Button>
<Button variant='hover'>Hover</Button>
</div>
);
}
hover를 넣어주고 똑같이 만들어 준다.
outline에 hover도 가능하다.
import { styled } from '@twind/react';
import { apply, tw } from 'twind';
import { css } from 'twind/css';
const Button = styled('button', {
base: css`
${apply`border-1 rounded-[4px] px-4 bg-[#2ecc71] border-2 text-white bg-cyan-500 shadow-lg shadow-cyan-500/50`};
`,
variants: {
size: {
small: `h-[33px]`,
medium: `h-[41px]`,
large: `h-[49px]`,
},
variant: {
normal: ``,
outlined: `border-[#2ecc71] text-[#2ecc71] bg-white`,
},
isHover: {
normal: ``,
true: `transition duration-150 ease-out hover:(ease-in bg-red-500)`,
},
},
defaults: {
variant: 'normal',
size: 'large',
},
});
export default function Projects() {
return (
<div className={tw`flex justify-center items-center gap-2 mt-[50vh]`}>
<Button>Normal</Button>
<Button variant='outlined' isHover>
Hover
</Button>
</div>
);
}
props 종류를 2개로 찢은 다음에 2개 다 넣어준다.
5. 소감
생각해 보니 button에 스타일 제외, 다른 속성과 이벤트를 넣을 것이 없다..! (onClick이 전부 아닌가...?)
이후에 모달, 팝업, warring 등에는 다양한 인자를 props로 넘겨 사용할 수 있을 것이다.