[사이드 프로젝트 후기] 하이퍼에듀 - 학원 리뷰 서비스 개발
자주 사용하는 스타일 셋을 tailwind config에 정의했습니다. 특히 메인컬러를 main-xxx
로 저장해둔 덕분에 중간에 메인컬러가 변경 되었음에도, tailwind config만 변경하면 됐기 때문에 상당히 편리했어요!
// tailwind.config.js
const toSizeObject = (array) =>
array.reduce(
(obj, v) => {
obj[v] = `${v}px`
return obj
},
{ 0: '0' }
)
const favoriteSizes = toSizeObject([10, 12, 16, 20, 24, 32, 40, 48, 64, 80])
module.exports = {
...
theme: {
extend: {
colors: {
...colors,
main: '#e60f45',
'main-100': '#e60f451a',
'main-200': '#fff2f4',
'main-300': '#ab03301a',
'main-hover': '#d94369',
'main-active': '#ab0330',
},
},
height: {
...theme.height,
auto: 'auto',
full: '100%',
screen: '100vh',
...favoriteSizes,
},
...
}
...
}
input
, button
, textarea
등 여러 곳에서 반복적으로 사용되는 element의 스타일을 전역 스타일시트에 정의했어요. 규모가 큰 프로젝트가 아니고, element 기본으로 제공하는 기능들로 충분했기 때문에 스타일 컴포넌트로 제작하지는 않았습니다. ( 하지만 Input은 규모가 작더라도 스타일 컴포넌트를 만드는게, 스타일 관리하기가 편리했을 것 같아요 😅)
<!-- component.vue -->
<button :disabled="isLoading" color="white"> 시작하기 </button>
/** index.scss **/
button {
@apply flex;
@apply items-center;
@apply justify-center;
@apply border-2 border-main;
@apply bg-main;
@apply py-10 px-20;
@apply text-white;
@apply rounded-6;
@apply duration-300;
min-height: 48px;
&:hover {
@apply border-main-hover;
@apply bg-main-hover;
}
&:active {
@apply border-main-active;
@apply bg-main-active;
}
&[disabled] {
@apply border-gray-300;
@apply text-gray-600;
@apply bg-gray-300;
}
&[color='white'] {
@apply bg-slate-50;
@apply text-main;
@apply border-2 border-main;
border: 2px solid #e60f45;
&:hover {
background-color: #fff2f4;
}
&:active {
background-color: #fff2f4;
}
}
&[no-outline] {
@apply border-none;
}
}
공유하기 버튼
랜딩페이지의 [ 공유하기 ] 버튼 - 도메인 복사
리포트 페이지의 [ 리뷰 공유하기 ] 버튼 - 리포트 정보를 담은 query와 함께 리포트 페이지 url 복사
위의 두 버튼은 클립보드에 복사한다(로직)와 버튼(UI) 형태 라는 공통점이 있어요. 하지만, 서로 다른 url을 복사한다는 것과 [리뷰 공유하기] 로 링크를 복사할 경우, 만료기간을 지정할 수 있어야 한다는 차이점이 있습니다.
저는 로직이 반복되고 UI가 유사할 경우 컴포넌트로 변경할 수 있는지 고민해봐요! 두 버튼은 베이스 로직이 같고 UI가 동일하기 때문에 share-button 이라는 컴포넌트로 분리했습니다. 복사할 url과 “만료기간"같은 디테일한 설정은 props로 설정 가능하게 했습니다. 버튼 text는 기존 button의 사용 방식을 유지하기 위해 props가 아닌 default slot으로 전달받았어요.
랜딩 페이지의 [공유하기] 버튼
<share-button color="white"></share-button>
리포트 페이지의 [리뷰 공유하기] 버튼
<share-button
:query="shareToken"
:duration="3"
path="report"
no-outline
>
리뷰 공유하기
</share-button>