Toast

사용자의 행동에 대한 간단한 피드백을 제공하는 알림 창입니다. 화면 하단에 나타나 사용자의 현재 작업을 방해하지 않으며, 일정 시간이 지나면 자동으로 사라집니다.

Basic toast

상태에 대한 메시지를 안내할 때 사용합니다.

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

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

Content

import { Toast, ToastContainer, ToastContent, ToastIcon } from '@wanteddev/wds';

const Demo = () => {
  return (
    <Toast open disablePortal disableAnimation variant="positive">
      <ToastContainer>
        <ToastIcon />
        <ToastContent>Content</ToastContent>
      </ToastContainer>
    </Toast>
  )
}

export default Demo;

Anatomy

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

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

<Toast>
  <ToastContainer>
    <ToastIcon />

    <ToastContent />
  </ToastContainer>
</Toast>

Variants

4가지 variant를 제공합니다.

  • normal (default)
  • positive
  • cautionary
  • negative

Normal

Positive

import { FlexBox, Toast, ToastContainer, ToastContent, ToastIcon } from '@wanteddev/wds';
import { IconBlank } from '@wanteddev/wds-icon';

const Demo = () => {
  return (
    <FlexBox alignItems="center" flexDirection="column" gap="16px">
      <Toast open disablePortal disableAnimation variant="normal">
        <ToastContainer>
          <ToastIcon>
            <IconBlank />
          </ToastIcon>

          <ToastContent>Normal</ToastContent>
        </ToastContainer>
      </Toast>

      <Toast open disablePortal disableAnimation variant="positive">
        <ToastContainer>
          <ToastIcon />
          <ToastContent>Positive</ToastContent>
        </ToastContainer>
      </Toast>

      <Toast open disablePortal disableAnimation variant="cautionary">
        <ToastContainer>
          <ToastIcon />
          <ToastContent>Cautionary</ToastContent>
        </ToastContainer>
      </Toast>

      <Toast open disablePortal disableAnimation variant="negative">
        <ToastContainer>
          <ToastIcon />
          <ToastContent>Negative</ToastContent>
        </ToastContainer>
      </Toast>
    </FlexBox>
  )
}

export default Demo;

Duration

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

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

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

  return (
    <>
      <Toast open={open} onOpenChange={setOpen} duration="short">
        <ToastContainer>
          <ToastIcon />
          <ToastContent>Content</ToastContent>
        </ToastContainer>
      </Toast>

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

export default Demo;

With custom icon

ToastIcon 의 children 으로 아이콘을 커스텀할 수 있습니다.

Content

import { FlexBox, Toast, ToastContainer, ToastContent, ToastIcon } from '@wanteddev/wds';
import { IconBlank } from '@wanteddev/wds-icon';

const Demo = () => {
  return (
    <FlexBox justifyContent="center">
      <Toast open disablePortal disableAnimation variant="positive">
        <ToastContainer>
          <ToastIcon>
            <IconBlank />
          </ToastIcon>

          <ToastContent>Content</ToastContent>
        </ToastContainer>
      </Toast>
    </FlexBox>
  )
}

export default Demo;

API

Toast

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

ToastContainer

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
-

ToastIcon

NameTypesdefaultValue
children
ReactNode
-

ToastContent

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
-

© 2026 Wanted Lab, Inc.