# Snackbar
URL: /react/components/snackbar
Source: https://github.com/daangn/seed-design/blob/dev/docs/content/react/components/snackbar.mdx
화면 하단에 일시적으로 나타나 상태나 결과를 안내하는 컴포넌트입니다.
사용 가능 버전: @seed-design/react@0.0.1, @seed-design/css@0.0.1
## Preview
```tsx
import { ActionButton } from "seed-design/ui/action-button";
import { Snackbar, SnackbarProvider, useSnackbarAdapter } from "seed-design/ui/snackbar";
function Component() {
const adapter = useSnackbarAdapter();
return (
adapter.create({
onClose: () => {},
render: () => {}} />,
})
}
>
실행
);
}
export default function SnackbarPreview() {
return (
);
}
```
## Installation
- npm: npx @seed-design/cli@latest add ui:snackbar
- pnpm: pnpm dlx @seed-design/cli@latest add ui:snackbar
- yarn: yarn dlx @seed-design/cli@latest add ui:snackbar
- bun: bun x @seed-design/cli@latest add ui:snackbar
## Props
### `Snackbar`
### `SnackbarAdapter.create` Parameters (`CreateSnackbarOptions`)
### `SnackbarProvider`
## Examples
### Variants
#### Positive
```tsx
import { ActionButton } from "seed-design/ui/action-button";
import { Snackbar, SnackbarProvider, useSnackbarAdapter } from "seed-design/ui/snackbar";
function Component() {
const adapter = useSnackbarAdapter();
return (
adapter.create({
onClose: () => {},
render: () => (
{}}
/>
),
})
}
>
실행
);
}
export default function SnackbarPositive() {
return (
);
}
```
#### Critical
```tsx
import { ActionButton } from "seed-design/ui/action-button";
import { Snackbar, SnackbarProvider, useSnackbarAdapter } from "seed-design/ui/snackbar";
function Component() {
const adapter = useSnackbarAdapter();
return (
adapter.create({
timeout: 50000000,
onClose: () => {},
render: () => (
{}}
/>
),
})
}
>
실행
);
}
export default function SnackbarNegative() {
return (
);
}
```
### Pause on Interaction
사용자가 Snackbar와 상호작용(hover 및 active) 하는 동안 Snackbar가 timeout으로 인해 dismiss되지 않도록 하려면 `SnackbarProvider`의 `pauseOnInteraction`을 `true`로 설정합니다.
- `@seed-design/react@0.1.14`까지: `false`: 명시하지 않는 경우, 상호작용 여부와 관계없이 timeout이 지나면 dismiss됩니다.
- 이후 버전: `true`: 명시하지 않는 경우, 사용자가 상호작용하는 동안 timeout이 멈춥니다.
```tsx
import { VStack } from "@seed-design/react";
import { ActionButton } from "seed-design/ui/action-button";
import { Snackbar, SnackbarProvider, useSnackbarAdapter } from "seed-design/ui/snackbar";
import { SegmentedControl, SegmentedControlItem } from "seed-design/ui/segmented-control";
import { useState } from "react";
function Component() {
const adapter = useSnackbarAdapter();
return (
adapter.create({
onClose: () => {},
render: () => {}} />,
})
}
>
실행
);
}
export default function SnackbarPauseOnInteraction() {
const [pauseOnInteraction, setPauseOnInteraction] = useState(true);
return (
setPauseOnInteraction(value === "true")}
>
false
true
);
}
```
### Strategy
Snackbar가 이미 표시 중일 때 새로운 Snackbar를 생성하면, 기본적으로 기존 Snackbar를 즉시 교체합니다 (`immediate`).
큐에 넣고 순차적으로 보여주려면 `strategy: "queued"`를 사용합니다.
`strategy`는 `SnackbarProvider`에서 기본값을 설정하거나, `create()` 호출 시 개별적으로 지정할 수 있습니다.
```tsx
import { ActionButton } from "seed-design/ui/action-button";
import { Snackbar, SnackbarProvider, useSnackbarAdapter } from "seed-design/ui/snackbar";
function Component() {
const adapter = useSnackbarAdapter();
return (
adapter.create({
render: () => ,
})
}
>
Immediate (positive)
adapter.create({
strategy: "queued",
render: () => ,
})
}
>
Queued (critical)
);
}
export default function SnackbarStrategy() {
return (
);
}
```
### Avoid Overlap
`` 컴포넌트를 사용하여 스낵바가 겹치지 않아야 하는 영역을 지정할 수 있습니다.
``의 자식 컴포넌트는 forwardRef(~React 18) 혹은 ref prop(React 19~)으로 ref를 전달받아야 합니다.
offset은 다음 상황에서 갱신됩니다.
- SnackbarAvoidOverlap의 자식 컴포넌트가 mount될 때
- SnackbarAvoidOverlap의 자식 컴포넌트가 unmount될 때
- SnackbarAvoidOverlap의 자식 컴포넌트의 높이가 변경될 때
- SnackbarRegion의 높이가 변경될 때
```tsx
import { Flex, VStack } from "@seed-design/react";
import { ActionButton } from "seed-design/ui/action-button";
import {
Snackbar,
SnackbarAvoidOverlap,
SnackbarProvider,
useSnackbarAdapter,
} from "seed-design/ui/snackbar";
function Component() {
const adapter = useSnackbarAdapter();
return (
adapter.create({
onClose: () => {},
render: () => {}} />,
})
}
>
실행
Snackbar가 이 영역과 겹치지 않게 조정됩니다. 스크롤은 무시합니다.
);
}
export default function SnackbarPreview() {
return (
);
}
```