React

Side Panel

화면 좌측 또는 우측 가장자리에서 슬라이드하여 나타나는 패널 컴포넌트입니다. 데스크탑 환경에서 추가 콘텐츠나 네비게이션을 제공할 때 사용됩니다.

Installation

Default

좌/우 가장자리에서 슬라이드되는 기본 Side Panel 컴포넌트를 포함합니다.

npx @seed-design/cli@latest add ui:side-panel

Responsive

뷰포트에 따라 Bottom Sheet로 자동 전환되는 반응형 변형입니다. dependency로 ui:bottom-sheetui:side-panel이 함께 설치됩니다.

npx @seed-design/cli@latest add ui:responsive-side-panel

Props

SidePanelRoot

Prop

Type

children?React.ReactNode
open?boolean | undefined
onOpenChange?((open: boolean, details?: DrawerChangeDetails) => void) | undefined

SidePanelTrigger

Prop

Type

SidePanelContent

Prop

Type

title?React.ReactNode
description?React.ReactNode
layerIndex?number | undefined
width?ResponsiveValue<(string & {}) | Dimension | "spacingX.betweenChips" | "spacingX.globalGutter" | "spacingY.componentDefault" | "spacingY.navToTitle" | "spacingY.screenBottom" | "spacingY.betweenText" | "full"> | undefined
maxWidth?ResponsiveValue<(string & {}) | Dimension | "spacingX.betweenChips" | "spacingX.globalGutter" | "spacingY.componentDefault" | "spacingY.navToTitle" | "spacingY.screenBottom" | "spacingY.betweenText" | "full"> | undefined

SidePanelBody

Prop

Type

paddingX?ResponsiveValue<0 | (string & {}) | Dimension | "spacingX.betweenChips" | "spacingX.globalGutter" | "spacingY.componentDefault" | "spacingY.navToTitle" | "spacingY.screenBottom" | "spacingY.betweenText"> | undefined
height?ResponsiveValue<(string & {}) | Dimension | "spacingX.betweenChips" | "spacingX.globalGutter" | "spacingY.componentDefault" | "spacingY.navToTitle" | "spacingY.screenBottom" | "spacingY.betweenText" | "full"> | undefined
maxHeight?ResponsiveValue<(string & {}) | Dimension | "spacingX.betweenChips" | "spacingX.globalGutter" | "spacingY.componentDefault" | "spacingY.navToTitle" | "spacingY.screenBottom" | "spacingY.betweenText" | "full"> | undefined
minHeight?ResponsiveValue<(string & {}) | Dimension | "spacingX.betweenChips" | "spacingX.globalGutter" | "spacingY.componentDefault" | "spacingY.navToTitle" | "spacingY.screenBottom" | "spacingY.betweenText" | "full"> | undefined
justifyContent?"flex-start" | "flex-end" | "center" | "space-between" | "space-around" | undefined
alignItems?"flex-start" | "flex-end" | "center" | "stretch" | undefined

SidePanelFooter

Prop

Type

ResponsiveSidePanelRoot

Prop

Type

children?React.ReactNode
open?boolean | undefined
defaultOpen?boolean | undefined
onOpenChange?((open: boolean) => void) | undefined

Examples

Trigger

<SidePanelTrigger>asChild 패턴을 사용해 자식 요소가 Side Panel을 열 수 있도록 합니다.

Controlled

Trigger 외의 방식으로 Side Panel을 열고 닫을 수 있습니다. 이 경우 open prop을 사용하여 Side Panel의 상태를 제어합니다.

Direction

<SidePanelRoot>direction prop을 설정하여 Side Panel이 열리는 방향을 변경할 수 있습니다. "left" 또는 "right"를 지원하며, 기본값은 "right"입니다.

Size

<SidePanelRoot>size prop을 설정하여 Side Panel의 너비를 변경할 수 있습니다. "small" (480px), "medium" (720px, 기본값), "large" (960px)를 지원합니다.

SidePanelFooter는 flex 레이아웃만 제공하며, 버튼 배치는 VStack, HStack 등으로 직접 구성합니다. 좁은 패널에서는 VStack으로 세로로 쌓고, 넓은 패널에서는 HStack으로 가로로 정렬할 수 있습니다.

Custom Size

<SidePanelContent>width, maxWidth prop을 전달하여 너비를 직접 제어할 수 있습니다. 프리셋 size 대신 뷰포트 기반의 유동적인 너비가 필요할 때 사용합니다.

Show Close Button

<SidePanelContent>showCloseButton prop을 전달하여 닫기 버튼을 표시할 수 있습니다. 기본 값은 true입니다.

Dismissible

dismissible prop을 false로 설정하면 Escape 키, 외부 클릭으로 닫을 수 없습니다. 의도적으로 Side Panel을 닫을 수 없게 하고 싶을 때 사용합니다.

Non-modal

modal prop을 false로 설정하면 배경과 상호작용이 가능합니다. Backdrop이 표시되지 않으며, 포커스 트랩이 비활성화됩니다. Trigger를 다시 눌러 닫아야 하는 경우에는 open prop으로 상태를 직접 제어합니다.

Responsive

ResponsiveSidePanel을 사용하면 md 이상에서는 Side Panel, sm 이하에서는 Bottom Sheet로 자동 전환됩니다. 뷰포트를 줄여서 전환 동작을 확인해보세요. onOpenChange는 열림 상태만 전달하며, Side Panel 또는 Bottom Sheet에만 적용되는 Root 옵션은 sidePanelRootProps, bottomSheetRootProps로 전달합니다.

Keyboard Interactions

KeyBehavior
Escapedismissible=true일 때 Side Panel을 닫습니다.
Tabmodal=true일 때 Side Panel 내부 요소들 사이로 포커스를 순환합니다.
Shift + Tabmodal=true일 때 역방향으로 포커스를 순환합니다.

Last updated on

On this page