# Menu Sheet
URL: /react/components/menu-sheet
Source: https://github.com/daangn/seed-design/blob/dev/docs/content/react/components/(deprecated)/menu-sheet.mdx
사용자의 작업과 관련된 선택지를 제공하는 시트 형태의 컴포넌트입니다.
더 이상 사용되지 않습니다. [Swipeable Menu Sheet](/react/components/swipeable-menu-sheet)을 사용하세요.
## Preview
```tsx
import { IconEyeSlashLine } from "@karrotmarket/react-monochrome-icon";
import { ActionButton } from "seed-design/ui/action-button";
import {
MenuSheetContent,
MenuSheetGroup,
MenuSheetItem,
MenuSheetRoot,
MenuSheetTrigger,
} from "seed-design/ui/menu-sheet";
const MenuSheetPreview = () => {
return (
Open
}
/>
} />
} />
} />
} tone="critical" />
);
};
export default MenuSheetPreview;
```
Stackflow와 Menu Sheet를 함께 사용하는 방법에 대해 알아보세요.
## Installation
- npm: npx @seed-design/cli@latest add ui:menu-sheet
- pnpm: pnpm dlx @seed-design/cli@latest add ui:menu-sheet
- yarn: yarn dlx @seed-design/cli@latest add ui:menu-sheet
- bun: bun x @seed-design/cli@latest add ui:menu-sheet
## Props
### `MenuSheetRoot`
### `MenuSheetTrigger`
### `MenuSheetContent`
### `MenuSheetGroup`
### `MenuSheetItem`
## Examples
### Trigger
``는 `aria-haspopup="dialog"` 속성을 설정하고, MenuSheet의 `open` 상태에 따라 `aria-expanded` 속성을 자동으로 설정합니다. 이 속성은 스크린 리더와 같은 보조 기술에 유용합니다.
## Preview
```tsx
import { IconEyeSlashLine } from "@karrotmarket/react-monochrome-icon";
import { ActionButton } from "seed-design/ui/action-button";
import {
MenuSheetContent,
MenuSheetGroup,
MenuSheetItem,
MenuSheetRoot,
MenuSheetTrigger,
} from "seed-design/ui/menu-sheet";
const MenuSheetPreview = () => {
return (
Open
}
/>
} />
} />
} />
} tone="critical" />
);
};
export default MenuSheetPreview;
```
### With Title
`MenuSheetContent`의 `title` prop을 사용하여 시트 헤더에 제목을 표시합니다.
```tsx
import { IconEyeSlashLine } from "@karrotmarket/react-monochrome-icon";
import { ActionButton } from "seed-design/ui/action-button";
import {
MenuSheetContent,
MenuSheetGroup,
MenuSheetItem,
MenuSheetRoot,
MenuSheetTrigger,
} from "seed-design/ui/menu-sheet";
const MenuSheetWithTitle = () => {
return (
Open
} />
}
description="Ut nulla et id dolor labore ullamco irure est id occaecat."
/>
}
description="Ut nulla et id dolor labore ullamco irure est id occaecat."
/>
} />
} tone="critical" />
);
};
export default MenuSheetWithTitle;
```
### With Title and Description
`MenuSheetContent`의 `description` prop을 사용하여 제목 아래에 부가 설명을 추가합니다.
```tsx
import { IconEyeSlashLine } from "@karrotmarket/react-monochrome-icon";
import { ActionButton } from "seed-design/ui/action-button";
import {
MenuSheetContent,
MenuSheetGroup,
MenuSheetItem,
MenuSheetRoot,
MenuSheetTrigger,
} from "seed-design/ui/menu-sheet";
export default function MenuSheetWithTitleAndDescription() {
return (
Open
} />
}
description="Ut nulla et id dolor labore ullamco irure est id occaecat."
/>
}
description="Ut nulla et id dolor labore ullamco irure est id occaecat."
/>
} />
} tone="critical" />
);
}
```
### Label Align
`MenuSheetContent`의 `labelAlign` prop으로 메뉴 항목의 레이블 정렬을 설정합니다.
#### `labelAlign="left"` (with `PrefixIcon`)
레이블을 왼쪽 정렬합니다.
```tsx
import { IconEyeSlashLine } from "@karrotmarket/react-monochrome-icon";
import { ActionButton } from "seed-design/ui/action-button";
import {
MenuSheetContent,
MenuSheetGroup,
MenuSheetItem,
MenuSheetRoot,
MenuSheetTrigger,
} from "seed-design/ui/menu-sheet";
const MenuSheetWithPrefixIcon = () => {
return (
Open
} />
} />
} />
} />
} tone="critical" />
);
};
export default MenuSheetWithPrefixIcon;
```
#### `labelAlign="center"` (without `PrefixIcon`)
레이블을 중앙 정렬합니다. (일반적으로, `prefixIcon` 없는 경우)
```tsx
import { ActionButton } from "seed-design/ui/action-button";
import {
MenuSheetContent,
MenuSheetGroup,
MenuSheetItem,
MenuSheetRoot,
MenuSheetTrigger,
} from "seed-design/ui/menu-sheet";
const MenuSheetWithoutPrefixIcon = () => {
return (
Open
);
};
export default MenuSheetWithoutPrefixIcon;
```
#### Overriding `labelAlign`
필요한 경우 `MenuSheetContent`에 지정한 `labelAlign`을 `MenuSheetGroup` 또는 `MenuSheetItem`에 지정한 `labelAlign`으로 덮어쓸 수 있습니다.
```tsx
import { ActionButton } from "seed-design/ui/action-button";
import {
MenuSheetContent,
MenuSheetGroup,
MenuSheetItem,
MenuSheetRoot,
MenuSheetTrigger,
} from "seed-design/ui/menu-sheet";
const MenuSheetOverridingLabelAlign = () => {
return (
Open
);
};
export default MenuSheetOverridingLabelAlign;
```
### `onOpenChange` Details
`onOpenChange` 두 번째 인자로 `details`가 제공됩니다.
#### `reason`
**열릴 때** (`open: true`)
- `"trigger"`: `MenuSheetTrigger` (`MenuSheet.Trigger`)로 열림
**닫힐 때** (`open: false`)
- `"closeButton"`: `MenuSheet.CloseButton`으로 닫힘
- `"escapeKeyDown"`: ESC 키 사용
- `"interactOutside"`: 외부 영역 클릭
```tsx
import { IconEyeSlashLine } from "@karrotmarket/react-monochrome-icon";
import { HStack, Text, VStack } from "@seed-design/react";
import { useState } from "react";
import { ActionButton } from "seed-design/ui/action-button";
import {
MenuSheetContent,
MenuSheetGroup,
MenuSheetItem,
MenuSheetRoot,
MenuSheetTrigger,
} from "seed-design/ui/menu-sheet";
export default function MenuSheetOnOpenChangeReason() {
const [open, setOpen] = useState(false);
const [openReason, setOpenReason] = useState(null);
const [closeReason, setCloseReason] = useState(null);
return (
{
setOpen(open);
(open ? setOpenReason : setCloseReason)(details?.reason ?? null);
}}
>
열기
} />
} />
} />
마지막 열림 이유: {openReason ?? "-"}
마지막 닫힘 이유: {closeReason ?? "-"}
);
}
```
### Skip Animation
`skipAnimation` prop을 사용하여 MenuSheet의 enter/exit 애니메이션을 건너뛸 수 있습니다.
```tsx
import { IconEyeSlashLine } from "@karrotmarket/react-monochrome-icon";
import { ActionButton } from "seed-design/ui/action-button";
import {
MenuSheetContent,
MenuSheetGroup,
MenuSheetItem,
MenuSheetRoot,
MenuSheetTrigger,
} from "seed-design/ui/menu-sheet";
const MenuSheetSkipAnimation = () => {
return (
Open
} />
} />
} />
);
};
export default MenuSheetSkipAnimation;
```