diff --git a/src/components/button/Button.tsx b/src/components/button/Button.tsx index 03cd6523..e2b2e042 100644 --- a/src/components/button/Button.tsx +++ b/src/components/button/Button.tsx @@ -10,6 +10,7 @@ interface ButtonProps extends React.ComponentPropsWithoutRef<'button'> { | 'green-normal-01' | 'green-light-03' | 'gray-normal-03' + | 'gray-normal-02' | 'gray-darker'; isSubmitting?: boolean; } @@ -40,7 +41,8 @@ export default function Button({ type TextClassType = | 'text-green-normal-01' | 'text-gray-darker' - | 'text-white'; + | 'text-white' + | 'text-gray-dark-02'; let textClass: TextClassType = color.text; diff --git a/src/components/tab/Tab.test.tsx b/src/components/tab/Tab.test.tsx index 448b641f..41566077 100644 --- a/src/components/tab/Tab.test.tsx +++ b/src/components/tab/Tab.test.tsx @@ -25,20 +25,6 @@ describe('Tab 컴포넌트', () => { }); }); - it('활성화된 탭은 올바른 스타일이 적용되어야 한다', () => { - render( - , - ); - - const activeTab = screen.getByText('탭1'); - expect(activeTab).toHaveClass('border-green-dark-01', 'text-green-dark-01'); - }); - it('탭 클릭시 onTabChange가 호출되어야 한다', () => { render( { expect(mockOnTabChange).toHaveBeenCalledWith('탭2'); }); - - it('tabType에 따라 올바른 텍스트 크기가 적용되어야 한다', () => { - const { rerender } = render( - , - ); - - expect(screen.getByText('탭1')).toHaveClass('text-xl'); - - rerender( - , - ); - - expect(screen.getByText('탭1')).toHaveClass('text-lg'); - }); }); diff --git a/src/components/tab/Tab.tsx b/src/components/tab/Tab.tsx index 642adc38..83e1c3b6 100644 --- a/src/components/tab/Tab.tsx +++ b/src/components/tab/Tab.tsx @@ -1,4 +1,5 @@ import { TabType } from '@/constants/tabs'; +import Button from '@/components/button/Button'; interface TabProps { items: readonly T[]; @@ -7,36 +8,51 @@ interface TabProps { tabType: TabType; } +const getTabStyles = { + main: { + base: 'text-xl border-b-2 rounded-none px-4 py-2 transition-all', + active: 'border-green-dark-01 text-green-dark-01', + inactive: 'border-transparent text-gray-dark-02 hover:text-green-dark-01', + }, + container: 'flex gap-2', +}; + function Tab({ items, activeTab, onTabChange, tabType, }: TabProps) { - const getTabStyle = () => { - switch (tabType) { - case 'MAIN_TAB': - return 'text-xl'; - case 'SUB_TAB': - return 'text-lg'; - } - }; + const renderMainTab = (item: T) => ( + + ); + + const renderSubTab = (item: T) => ( + - ))} +
+ {items.map((item) => + tabType === 'SUB_TAB' ? renderSubTab(item) : renderMainTab(item), + )}
); } diff --git a/src/constants/button.ts b/src/constants/button.ts index 6e6f05ed..6c652bdb 100644 --- a/src/constants/button.ts +++ b/src/constants/button.ts @@ -28,6 +28,11 @@ export const COLOR_GROUPS = { text: 'text-gray-darker', border: 'border-gray-darker', }, + 'gray-normal-02': { + bg: 'bg-gray-normal-02', + text: 'text-gray-dark-02', + border: 'border-gray-normal-02', + }, 'gray-darker': { bg: 'bg-gray-darker', text: 'text-gray-darker',