토스트

토스트 알림 컴포넌트

기본 사용법

토스트는 .toast 클래스를 사용하여 만들 수 있습니다. 아이콘, 헤더, 본문, 닫기 버튼을 포함할 수 있습니다.

실제 예제:
Header
Lorem ipsum dolor sit amet
HTML
<div class="toast">
  <i class="icon-info"></i>
  <div class="toast-content">
    <div class="toast-header">Header</div>
    <div class="toast-body">Lorem ipsum dolor sit amet</div>
  </div>
  <button aria-label="닫기"></button>
</div>

스타일 속성

토스트는 border와 long 속성을 조합하여 다양한 스타일을 제공합니다:

Border 속성

  • border=false (기본): 4px 두꺼운 강조 색상 테두리
  • border=true (.border): 1px 전체 외곽선만 (강조 색상 테두리 없음)

Long 속성

  • long=false (기본): 세로 레이아웃, border=false일 때 상단에 4px 강조 테두리
  • long=true (.long): 가로 레이아웃, border=false일 때 왼쪽에 4px 강조 테두리

border=false - 강조 색상 테두리

기본 스타일은 상단에 4px 두꺼운 강조 색상 테두리가 표시됩니다.

실제 예제:
Header
Lorem ipsum dolor sit amet
HTML
<!-- border=false (4px 강조 색상 테두리) -->
<div class="toast info">
  <i class="icon-info"></i>
  <div class="toast-content">
    <div class="toast-header">Header</div>
    <div class="toast-body">Lorem ipsum dolor sit amet</div>
  </div>
  <button aria-label="닫기"></button>
</div>

border=true - 전체 외곽선

.border 클래스를 추가하면 1px 전체 외곽선만 표시됩니다 (강조 색상 테두리 없음).

실제 예제:
Header
Lorem ipsum dolor sit amet
HTML
<!-- border=true (1px 전체 외곽선만) -->
<div class="toast border info">
  <i class="icon-info"></i>
  <div class="toast-content">
    <div class="toast-header">Header</div>
    <div class="toast-body">Lorem ipsum dolor sit amet</div>
  </div>
  <button aria-label="닫기"></button>
</div>

Long 스타일

.long 클래스를 추가하면 가로 레이아웃으로 변경되며, 테두리 위치가 상단에서 왼쪽으로 바뀝니다. 좁은 공간에 토스트를 표시할 때 유용합니다.

long=true, border=false

왼쪽에 4px 두꺼운 강조 색상 테두리가 표시됩니다.

실제 예제:
Lorem ipsum dolor sit amet
HTML
<!-- long=true, border=false (왼쪽에 4px 강조 테두리) -->
<div class="toast long info">
  <i class="icon-info"></i>
  <div class="toast-content">
    <div class="toast-body">Lorem ipsum dolor sit amet</div>
  </div>
  <button aria-label="닫기"></button>
</div>

long=true, border=true

1px 전체 외곽선만 표시됩니다 (강조 색상 테두리 없음).

실제 예제:
파일이 성공적으로 업로드되었습니다
HTML
<!-- long=true, border=true (1px 전체 외곽선만) -->
<div class="toast long border success">
  <i class="icon-check"></i>
  <div class="toast-content">
    <div class="toast-body">파일이 성공적으로 업로드되었습니다</div>
  </div>
  <button aria-label="닫기"></button>
</div>

색상 변형

6가지 색상 변형을 사용하여 다양한 메시지를 전달할 수 있습니다:

Default

기본 알림

Default
border=false (4px 강조 테두리)
Default
border=true (1px 외곽선)
long=true, border=false
long=true, border=true

Primary

주요 알림

Primary
border=false (4px 강조 테두리)
Primary
border=true (1px 외곽선)
long=true, border=false
long=true, border=true

Info

정보성 알림

Info
border=false (4px 강조 테두리)
Info
border=true (1px 외곽선)
long=true, border=false
long=true, border=true

Success

성공 알림

Success
border=false (4px 강조 테두리)
Success
border=true (1px 외곽선)
long=true, border=false
long=true, border=true

Warning

경고 알림

Warning
border=false (4px 강조 테두리)
Warning
border=true (1px 외곽선)
long=true, border=false
long=true, border=true

Danger

위험 알림

Danger
border=false (4px 강조 테두리)
Danger
border=true (1px 외곽선)
long=true, border=false
long=true, border=true
HTML
<!-- Default -->
<div class="toast default">...</div>

<!-- Info -->
<div class="toast info">...</div>

<!-- Success -->
<div class="toast success">...</div>

<!-- Warning -->
<div class="toast warning">...</div>

<!-- Danger -->
<div class="toast danger">...</div>

조합 예제

.long 클래스를 추가하면 가로 레이아웃으로 변경되며 한 줄로 표시됩니다. 좁은 공간에 토스트를 표시할 때 유용합니다.

실제 예제:
Lorem ipsum dolor sit amet
파일이 성공적으로 업로드되었습니다
HTML
<div class="toast long info">
  <i class="icon-info"></i>
  <div class="toast-content">
    <div class="toast-body">Lorem ipsum dolor sit amet</div>
  </div>
  <button aria-label="닫기"></button>
</div>

<!-- Long + Border -->
<div class="toast long border success">
  <i class="icon-check"></i>
  <div class="toast-content">
    <div class="toast-body">파일이 성공적으로 업로드되었습니다</div>
  </div>
  <button aria-label="닫기"></button>
</div>

간단한 메시지

헤더 없이 본문만 표시할 수도 있습니다:

실제 예제:
Lorem ipsum dolor sit amet
파일이 성공적으로 업로드되었습니다
HTML
<div class="toast info">
  <i class="icon-info"></i>
  <div class="toast-content">
    <div class="toast-body">Lorem ipsum dolor sit amet</div>
  </div>
  <button aria-label="닫기"></button>
</div>

React 컴포넌트 예제

버튼을 클릭하여 다양한 Toast 스타일을 확인해보세요:

React에서 사용하기

React 애플리케이션에서 Toast 컴포넌트를 사용할 수 있습니다.

1. ToastProvider 설정

먼저 애플리케이션의 최상위에 ToastProvider를 추가합니다:

app/layout.tsx
import { ToastProvider } from 'podo-ui';

export default function RootLayout({ children }) {
  return (
    <html>
      <body>
        <ToastProvider>
          {children}
        </ToastProvider>
      </body>
    </html>
  );
}

2. useToast Hook 사용

컴포넌트에서 useToast hook을 사용하여 토스트를 표시합니다:

component.tsx
import { useToast } from 'podo-ui';

function MyComponent() {
  const { showToast } = useToast();

  const handleClick = () => {
    showToast({
      message: '저장되었습니다!',
      header: 'Success',
      theme: 'success',
      border: false,
      position: 'top-right',
      duration: 3000,
    });
  };

  return <button onClick={handleClick}>저장</button>;
}

3. Toast 옵션

TypeScript
interface ToastOptions {
  message: string;           // 필수: 토스트 메시지
  header?: string;           // 선택: 헤더 텍스트 (long일 때는 표시 안됨)
  theme?: 'default' | 'primary' | 'info' | 'success' | 'warning' | 'danger';
  border?: boolean;          // true: 1px 전체 외곽선, false: 4px 강조 테두리 (기본)
  long?: boolean;            // true: 가로 레이아웃
  duration?: number;         // 자동 닫힘 시간(ms), 0이면 자동으로 닫히지 않음
  width?: string | number;   // 너비 (기본: auto)
  position?: 'top-left' | 'top-center' | 'top-right'
           | 'center-left' | 'center' | 'center-right'
           | 'bottom-left' | 'bottom-center' | 'bottom-right';
}

4. 사용 예제

TypeScript
// border=false (4px 강조 테두리)
showToast({
  message: '파일이 업로드되었습니다',
  theme: 'success',
  position: 'top-right',
});

// border=true (1px 전체 외곽선)
showToast({
  header: '알림',
  message: '새로운 메시지가 있습니다',
  theme: 'info',
  border: true,
  position: 'bottom-center',
});

// Long 스타일
showToast({
  message: '저장 완료',
  theme: 'success',
  long: true,
  position: 'bottom-right',
  duration: 2000,
});

// 너비 지정
showToast({
  message: '이것은 넓은 토스트입니다',
  width: 400,
  position: 'top-center',
});

// 자동으로 닫히지 않음
showToast({
  header: '중요 알림',
  message: '이 메시지는 수동으로 닫아야 합니다',
  theme: 'warning',
  duration: 0,
  position: 'center',
});

SCSS에서 사용하기

SCSS 모듈에서 토스트 스타일을 커스터마이징할 수 있습니다:

component.module.scss
@use 'podo-ui/mixin' as *;

.customToast {
  display: flex;
  align-items: flex-start;
  gap: s(3);
  padding: s(4);
  border-radius: r(2);
  background-color: color('bg-elevation-1');
  border: 1px solid color('border');
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);

  .icon {
    color: color('info');
  }

  .content {
    flex: 1;
  }

  .header {
    font-weight: 600;
    color: color('text-body');
    margin-bottom: s(1);
  }

  .body {
    color: color('text-body');
  }

  .close {
    cursor: pointer;
    color: color('text-action');

    &:hover {
      color: color('text-action-hover');
    }
  }
}