Get StartedFoundationsComponentsPatternsRulesDevelopAI & ToolsUpdates

Snackbar

화면 하단에 일시적으로 나타나 상태나 결과를 안내하는 컴포넌트예요.

설치

pnpm dlx shadcn@latest add https://rebar.conmarket-landing.workers.dev/r/snackbar.json

사용법

앱 최상단을 SnackbarProvider 로 감싸고, 그 안에서 useSnackbar() 훅의 create() 로 스낵바를 띄워요.

import { SnackbarProvider, useSnackbar } from '@/components/ui/snackbar';

function SaveButton() {
  const snackbar = useSnackbar();
  return (
    <button onClick={() => snackbar.create({ variant: 'positive', message: '게시글을 저장했어요' })}>
      저장
    </button>
  );
}

export function App() {
  return (
    <SnackbarProvider>
      <SaveButton />
    </SnackbarProvider>
  );
}

Anatomy

Snackbar는 텍스트(Message)와 컨테이너(Container)로 구성되며, 필요에 따라 Prefix Icon과 Action을 표시할 수 있어요.

Properties

Variant

기본적인 메시지 전달을 위한 Default, 완료나 성공 메시지를 표현하는 Positive, 오류나 실패 메시지를 표현하는 Critical 총 세 가지 타입을 제공해요. Positive와 Critical에는 상태를 나타내는 Prefix Icon이 함께 표시돼요.

Action

텍스트로 구성된 보조 Action을 하나 표시할 수 있어요. 액션을 누르면 onAction 이 호출되고 스낵바가 닫혀요.

Strategy

이미 스낵바가 표시 중일 때 새 스낵바를 만들면, 기본적으로 기존 스낵바를 즉시 교체해요(immediate). 큐에 넣고 순서대로 보여주려면 strategy: 'queued' 를 써요. SnackbarProvider 에서 기본값을 정하거나 create() 호출마다 따로 지정할 수 있어요.

Duration

기본 표시 시간은 4초예요. 메시지가 길면 duration 으로 표시 시간을 늘려요. dismiss() 로 바로 닫을 수도 있어요.

Guidelines

Snackbar 사용하기

Snackbar는 텍스트로 간결한 피드백을 제공하는 컴포넌트예요. 저장·업로드·동기화 같은 백그라운드 작업 완료 알림이나, 사용자가 방금 수행한 액션에 대한 안내에 사용해요. '되돌리기'처럼 짧은 시간 동안만 유효한 보조 액션도 제공할 수 있어요.

Snackbar는 낮은 심각도의 상태를 공유하는 용도로만 사용하고, 다음 상황에서는 사용을 피해요.

사용을 피해야 할 상황대안
사용자의 결정이 필요한 중요한 선택Bottom Sheet, Alert Dialog
지속적으로 표시되어야 하는 경고Page Banner, Callout
여러 단계 안내나 긴 텍스트Help Bubble, Callout

위치와 레이아웃

Snackbar는 기본적으로 화면 하단 중앙에 배치되며, 컴포넌트 자체에 여백을 포함해요. OS의 세이프 에어리어를 고려해 배치해요.

화면에 Floating Action Button이나 하단 고정 버튼이 있으면, Snackbar는 항상 그 위에 표시돼요. SnackbarProvider 의 offset 으로 하단 거리를 지정해요.

텍스트가 길어 줄바꿈이 생기면 아이콘과 보조 버튼은 세로 중앙에 정렬돼요. Snackbar에는 최대 너비(464px)가 있어서, 화면이 더 넓으면 화면 중앙에 배치돼요.

내용 작성하기

간결하게 작성하기

메시지는 핵심만 짧게 작성해요. 명사+동사 형식으로 사용자 액션의 결과를 먼저 보여주면 한눈에 이해할 수 있어요.

게시글을 저장했어요
Do· 짧고 분명하게

결과를 짧고 분명하게 전달해요.

게시글 저장 처리가 완료되었습니다
Don't· 길고 시스템 관점

길고 시스템 관점의 표현이라 한눈에 들어오지 않아요.

마침표는 문장 수에 따라

한 문장이면 마침표를 생략하고, 두 문장 이상이면 모든 문장 끝에 마침표를 붙여요.

주문을 취소했어요. 환불은 3일 안에 처리돼요.
Do· 두 문장이면 마침표

두 문장 이상이면 모든 문장에 마침표를 붙여요.

주문을 취소했어요 환불은 3일 안에 처리돼요
Don't· 마침표 없음

문장이 둘인데 마침표가 없어 읽기 어려워요.

긍정문으로 표현하기

"실패하지 않았어요" 같은 이중 부정보다 "업로드를 완료했어요"처럼 직접적으로 표현해 혼란을 막아요.

업로드를 완료했어요
Do· 직접적인 표현

무엇이 됐는지 바로 알 수 있어요.

업로드에 실패하지 않았어요
Don't· 이중 부정

결과를 한 번 더 해석해야 해요.

동작

Snackbar는 기본적으로 4초 동안 표시돼요. 메시지가 길면 사용자가 충분히 인지할 수 있도록 표시 시간을 늘려 주세요.

사용자가 Snackbar에 마우스를 올리거나 포커스를 두는 동안에는 타이머가 일시정지돼요. 아래로 밀어서 닫을 수도 있어요.

화면에는 한 번에 1개의 Snackbar만 표시해요. 한 번에 여러 개의 Snackbar를 쌓아서 보여주지 않아요.

액션 사용하기

최대 1개의 보조 액션 버튼을 표시할 수 있어요. 사용자가 빠르게 인지할 수 있도록 1~2단어로 간결하게 작성해요.

액션 라벨에는 '취소', '확인' 같은 모호한 단어보다 '되돌리기', '목록보기'처럼 구체적인 액션을 담은 단어를 써요. 내용 추가나 삭제처럼 중요한 변경이 생겼을 때는 쉽게 되돌릴 수 있도록 '되돌리기' 옵션을 함께 보여주면 좋아요.

상품을 삭제했어요되돌리기
Do· 구체적인 액션

무엇이 일어날지 라벨만 보고 알 수 있어요.

상품을 삭제했어요확인
Don't· 모호한 액션

'확인'은 누르면 무엇이 되는지 알 수 없어요.

Props

Snackbar Provider

Prop

Type

useSnackbar().create(options)

Prop

Type

useSnackbar() 는 create(options) 와 현재 스낵바를 닫는 dismiss() 를 돌려줘요.

On this page