Snackbar

사용자의 행동에 대한 간결한 피드백을 제공하는 일시적인 알림입니다. 주로 화면 하단에 나타나 사용자의 작업 흐름을 방해하지 않으며, 실행 취소 같은 단순한 상호작용 버튼을 포함할 수 있습니다.

Basic snackbar

간단한 메시지와 상호작용을 안내할 때 사용합니다.

useSnackbar 훅을 사용하면 더 간편하게 사용할 수 있습니다.

RegionConfig 컴포넌트를 활용하여 노출되는 위치를 조정할 수 있습니다.

Heading

Description

import { Snackbar, SnackbarContent, SnackbarHeading, SnackbarDescription, SnackbarAction } from '@wanteddev/wds';

const Demo = () => {
  return (
    <Snackbar open disablePortal disableAnimation>
      <SnackbarContent>
        <SnackbarHeading>Heading</SnackbarHeading>
        <SnackbarDescription>Description</SnackbarDescription>
      </SnackbarContent>

      <SnackbarAction>Action</SnackbarAction>
    </Snackbar>
  )
}

export default Demo;

Anatomy

Snackbar 는 여러 컴포넌트를 조합해서 사용합니다.

기본 구성은 아래와 같습니다.

<Snackbar>
  <SnackbarContent extraContent={<SnackbarExtraContent />}>
    <SnackbarHeading />
    <SnackbarDescription />
  </SnackbarContent>

  <SnackbarAction />

  <SnackbarCloseButton />
</Snackbar>

With extra content

SnackbarContentextraContent 속성으로 컨텐츠를 추가할 수 있습니다.

Heading

Description

import { Snackbar, SnackbarContent, SnackbarHeading, SnackbarDescription, SnackbarExtraContent, SnackbarAction } from '@wanteddev/wds';
import { IconBlank } from '@wanteddev/wds-icon';

const Demo = () => {
  return (
    <Snackbar open disablePortal disableAnimation>
      <SnackbarContent
        extraContent={(
          <SnackbarExtraContent>
            <IconBlank />
          </SnackbarExtraContent>
        )}
      >
        <SnackbarHeading>Heading</SnackbarHeading>
        <SnackbarDescription>Description</SnackbarDescription>
      </SnackbarContent>

      <SnackbarAction>Action</SnackbarAction>
    </Snackbar>
  )
}

export default Demo;

With close button

SnackbarCloseButton 을 사용하여 닫기 버튼을 추가할 수 있습니다.

Heading

Description

import { Snackbar, SnackbarContent, SnackbarHeading, SnackbarDescription, SnackbarAction, SnackbarCloseButton } from '@wanteddev/wds';

const Demo = () => {
  return (
    <Snackbar open disablePortal disableAnimation>
      <SnackbarContent>
        <SnackbarHeading>Heading</SnackbarHeading>
        <SnackbarDescription>Description</SnackbarDescription>
      </SnackbarContent>

      <SnackbarAction>Action</SnackbarAction>

      <SnackbarCloseButton />
    </Snackbar>
  )
}

export default Demo;

Duration

duration 옵션을 통해 노출 시간을 조정할 수 있습니다.

  • Infinity로 설정하면 무한히 노출됩니다.
  • short, long 의 시멘틱 값을 사용할 수 있습니다.
import { Button, Snackbar, SnackbarContent, SnackbarHeading, SnackbarDescription, SnackbarAction } from '@wanteddev/wds';
import { useState } from 'react';

const Demo = () => {
  const [open, setOpen] = useState(false);

  return (
    <>
      <Snackbar open={open} onOpenChange={setOpen} duration="short">
        <SnackbarContent>
          <SnackbarHeading>Heading</SnackbarHeading>
          <SnackbarDescription>Description</SnackbarDescription>
        </SnackbarContent>
      </Snackbar>

      <Button onClick={() => setOpen(true)}>Click me</Button>
    </>
  )
}

export default Demo;

API

Snackbar

NameTypesdefaultValue
as
ElementType
-
onAnimationEnd
(type: "show" | "hide") => void
-
variant
"normal"
"normal"
duration
number | "short" | "long"
"short"
defaultOpen
boolean
-
open
boolean
-
onOpenChange
(open: boolean) => void
-
container
null | Element | DocumentFragment
-
disablePortal
boolean
-
children
ReactNode
-
disableAnimation
boolean
-
forceMount
boolean
false
sx
SxProp
-

SnackbarContent

NameTypesdefaultValue
extraContent
ReactNode
-
children
ReactNode
-
sx
SxProp
-
xl
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
flexDirection
Property.FlexDirection | undefined
-
flexWrap
Property.FlexWrap | undefined
-
justifyContent
Property.JustifyContent | undefined
-
alignItems
Property.AlignItems | undefined
-
alignContent
Property.AlignContent | undefined
-
order
Property.Order | undefined
-
flex
Property.Flex<string | number> | undefined
-
flexGrow
Property.FlexGrow | undefined
-
flexShrink
Property.FlexShrink | undefined
-
flexBasis
Property.FlexBasis<string | number> | undefined
-
alignSelf
Property.AlignSelf | undefined
-
gap
Property.Gap<string | number> | undefined
-
rowGap
Property.RowGap<string | number> | undefined
-
columnGap
Property.ColumnGap<string | number> | undefined
-

SnackbarHeading

NameTypesdefaultValue
xl
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
color
ThemeColorsToken
-
children
ReactNode
-
sx
SxProp
-
variant
"display1" | "display2" | "display3" | "title1" | "title2" | "title3" | "heading1" | "heading2" | "headline1" | "headline2" | "body1" | "body1-reading" | "body2" | "body2-reading" | "label1" | "label1-reading" | "label2" | "caption1" | "caption2"
-
weight
"medium" | "regular" | "bold"
-
align
Property.TextAlign | undefined
-
noWrap
boolean
-
display
Property.Display | undefined
-

SnackbarDescription

NameTypesdefaultValue
xl
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Pick<TypographyDefaultProps, "variant" | "weight" | "align">, { sx?: CSSInterpolation; }> | undefined
-
color
ThemeColorsToken
-
children
ReactNode
-
sx
SxProp
-
variant
"display1" | "display2" | "display3" | "title1" | "title2" | "title3" | "heading1" | "heading2" | "headline1" | "headline2" | "body1" | "body1-reading" | "body2" | "body2-reading" | "label1" | "label1-reading" | "label2" | "caption1" | "caption2"
-
weight
"medium" | "regular" | "bold"
-
align
Property.TextAlign | undefined
-
noWrap
boolean
-
display
Property.Display | undefined
-

SnackbarAction

NameTypesdefaultValue
as
"button"
-
color
"primary" | "assistive"
-
children
ReactNode
-
disabled
boolean
-
sx
SxProp
-
disableInteraction
boolean
-
leadingContent
ReactNode
-
trailingContent
ReactNode
-
loading
boolean
-
disableLoadingPreventEvents
boolean
-

SnackbarExtraContent

NameTypesdefaultValue
flexDirection
Property.FlexDirection | undefined
-
flexWrap
Property.FlexWrap | undefined
-
justifyContent
Property.JustifyContent | undefined
-
alignItems
Property.AlignItems | undefined
-
alignContent
Property.AlignContent | undefined
-
order
Property.Order | undefined
-
flex
Property.Flex<string | number> | undefined
-
flexGrow
Property.FlexGrow | undefined
-
flexShrink
Property.FlexShrink | undefined
-
flexBasis
Property.FlexBasis<string | number> | undefined
-
alignSelf
Property.AlignSelf | undefined
-
gap
Property.Gap<string | number> | undefined
-
rowGap
Property.RowGap<string | number> | undefined
-
columnGap
Property.ColumnGap<string | number> | undefined
-
children
ReactNode
-
sx
SxProp
-
xl
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Omit<FlexBoxDefaultProps, "children" | "sx">, { sx?: CSSInterpolation; }> | undefined
-

SnackbarCloseButton

NameTypesdefaultValue
as
"button"
-
variant
"normal" | "background" | "solid" | "outlined"
-
disabled
boolean
-
disableInteraction
boolean
-
size
number | "small" | "medium"
-
color
ThemeColorsToken
-
interactionColor
ThemeColorsToken
-
alternative
boolean
-
children
ReactNode
-
sx
SxProp
-
xl
Merge<Pick<IconButtonDefaultProps, "size">, { sx?: CSSInterpolation; }> | undefined
-
lg
Merge<Pick<IconButtonDefaultProps, "size">, { sx?: CSSInterpolation; }> | undefined
-
md
Merge<Pick<IconButtonDefaultProps, "size">, { sx?: CSSInterpolation; }> | undefined
-
sm
Merge<Pick<IconButtonDefaultProps, "size">, { sx?: CSSInterpolation; }> | undefined
-
xs
Merge<Pick<IconButtonDefaultProps, "size">, { sx?: CSSInterpolation; }> | undefined
-

© 2026 Wanted Lab, Inc.