diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 910ef84..125340d 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -3,8 +3,8 @@ import type { Metadata } from 'next' import localFont from 'next/font/local' import ViewportAdjuster from '@/components/common/ViewportAdjuster' import '@/styles/globals.css' -import Header from '@/components/common/layout/Header' -import Footer from '@/components/common/layout/Footer' +import Header from '@/components/layout/Header' +import Footer from '@/components/layout/Footer' export const metadata: Metadata = { title: '지혜 | Ji-hye', diff --git a/src/app/page.tsx b/src/app/page.tsx index 94830fd..d67fc2c 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,6 +1,7 @@ 'use client' import Pagination from '@/components/common/pagination/Pagination' import BreakpointTest from '@/components/design-system/BreakpointTest' +import ButtonTest from '@/components/design-system/ButtonTest' import ColorPalette from '@/components/design-system/ColorPalette' import TypoSystem from '@/components/design-system/TypoSystem' import { useState } from 'react' @@ -24,12 +25,16 @@ export default function Home() { + + + + ) } diff --git a/src/components/common/button/Button.tsx b/src/components/common/button/Button.tsx new file mode 100644 index 0000000..eb67721 --- /dev/null +++ b/src/components/common/button/Button.tsx @@ -0,0 +1,55 @@ +import * as React from 'react' +import { Slot } from '@radix-ui/react-slot' +import { cva, type VariantProps } from 'class-variance-authority' + +import { cn } from '@/lib/utils' + +const buttonVariants = cva( + 'w-full inline-flex items-center justify-center whitespace-nowrap transition-colors disabled:pointer-events-none outline-none cursor-pointer', + { + variants: { + variant: { + primary: + 'bg-primary text-white hover:bg-primary-hover disabled:bg-disabled-fill disabled:text-assistive', + secondary: + 'bg-secondary text-white hover:bg-secondary-hover disabled:bg-disabled-fill disabled:text-assistive', + tertiary: + 'bg-tertiary text-secondary hover:bg-tertiary-hover disabled:bg-disabled-fill disabled:text-assistive', + outline: + 'bg-white text-secondary border border-secondary hover:bg-outline-hover hover:text-white disabled:border-alter-line disabled:text-disabled', + }, + size: { + sm: 'p-1 typo-caption2 rounded-sm gap-0.5', + md: 'px-3.5 py-3 typo-button1 rounded-md gap-1.5', + lg: 'px-4 py-3.5 typo-h3 rounded-md gap-1.5', + }, + }, + defaultVariants: { + variant: 'secondary', + size: 'lg', + }, + }, +) + +const Button = ({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<'button'> & + VariantProps & { + asChild?: boolean + }) => { + const Comp = asChild ? Slot : 'button' + + return ( + + ) +} + +export { Button } diff --git a/src/components/design-system/ButtonTest.tsx b/src/components/design-system/ButtonTest.tsx new file mode 100644 index 0000000..690accf --- /dev/null +++ b/src/components/design-system/ButtonTest.tsx @@ -0,0 +1,31 @@ +import React from 'react' +import { Button } from '../common/Button/Button' + +const ButtonTest = () => { + const variants = ['primary', 'secondary', 'tertiary', 'outline'] + const sizes = ['lg', 'md', 'sm'] + return ( + + 기본 버튼 + {variants.map((variant) => ( + + {variant} + + {sizes.map((s) => ( + <> + + 버튼입니다 + + + 버튼입니다 + + > + ))} + + + ))} + + ) +} + +export default ButtonTest diff --git a/src/components/common/layout/Footer.tsx b/src/components/layout/Footer.tsx similarity index 100% rename from src/components/common/layout/Footer.tsx rename to src/components/layout/Footer.tsx diff --git a/src/components/common/layout/Header.tsx b/src/components/layout/Header.tsx similarity index 100% rename from src/components/common/layout/Header.tsx rename to src/components/layout/Header.tsx diff --git a/tailwind.config.ts b/tailwind.config.ts index 007f2d3..45f3bde 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -19,66 +19,6 @@ export default { lg: '80rem', }, }, - extend: { - colors: { - // Primitive Colors - Grayscale - gray: { - 50: 'var(--color-gray-50)', - 100: 'var(--color-gray-100)', - 200: 'var(--color-gray-200)', - 300: 'var(--color-gray-300)', - 400: 'var(--color-gray-400)', - 500: 'var(--color-gray-500)', - 600: 'var(--color-gray-600)', - 700: 'var(--color-gray-700)', - 800: 'var(--color-gray-800)', - 900: 'var(--color-gray-900)', - 950: 'var(--color-gray-950)', - }, - // Primitive Colors - Orangescale - orange: { - 50: 'var(--color-orange-50)', - 100: 'var(--color-orange-100)', - 200: 'var(--color-orange-200)', - 300: 'var(--color-orange-300)', - 400: 'var(--color-orange-400)', - 500: 'var(--color-orange-500)', - 600: 'var(--color-orange-600)', - 700: 'var(--color-orange-700)', - 800: 'var(--color-orange-800)', - 900: 'var(--color-orange-900)', - }, - // Semantic Colors - Brand - primary: 'var(--color-primary)', - secondary: 'var(--color-secondary)', - tertiary: 'var(--color-tertiary)', - white: 'var(--color-white)', - - // Semantic Colors - Status - error: 'var(--color-error)', - success: 'var(--color-success)', - warning: 'var(--color-warning)', - positive: 'var(--color-positive)', - - // Semantic Colors - Text - text: { - normal: 'var(--color-normal)', - alternative: 'var(--color-alternative)', - assistive: 'var(--color-assistive)', - disable: 'var(--color-disable)', - }, - - // Border Colors - border: 'var(--color-border)', - 'border-alter': 'var(--color-border-alter)', - 'border-assist': 'var(--color-border-assist)', - }, - borderRadius: { - lg: 'var(--radius-lg)', - md: 'var(--radius-md)', - sm: 'var(--radius-sm)', - }, - }, }, plugins: [tailwindAnimate], } satisfies Config
{variant}