버튼으로 정수 단위의 수량을 한 단계씩 늘리거나 줄입니다. 최소·최대 범위와 삭제 가능한 상태를 표현하고 Form 값으로 제출할 수 있습니다. @seed-design/[email protected], @seed-design/[email protected]부터 제공합니다.
주요 기능
최소·최대 수량을 정하고 controlled 또는 uncontrolled 방식으로 값을 관리할 수 있습니다.
최소 수량에서 감소 버튼을 삭제 버튼으로 바꾸고, 삭제 후 되돌리기 같은 흐름을 만들 수 있습니다.
값 텍스트와 버튼 배치를 바꾸거나 로딩 상태를 표시할 수 있습니다.
숨겨진 input을 통해 네이티브 Form 값으로 제출할 수 있습니다.
기본 사용
import { QuantityPicker } from "seed-design/ui/quantity-picker";export default function QuantityPickerPreview() { return <QuantityPicker min={1} max={99} defaultValue={1} aria-label="상품 수량" />;}
달력에서 하나의 날짜, 날짜 범위 또는 여러 날짜를 선택합니다. 한 달과 두 달 레이아웃을 제공해 화면 크기와 선택 맥락에 맞게 구성할 수 있습니다. @seed-design/[email protected], @seed-design/[email protected]부터 제공합니다.
주요 기능
단일 날짜, 날짜 범위, 여러 날짜 선택 방식을 제공합니다.
한 달·두 달·한 주·연속 스크롤 레이아웃으로 화면과 탐색 맥락에 맞게 구성합니다.
최소·최대 기간과 예약 완료일 같은 선택 제약 조건을 조합할 수 있습니다.
날짜 셀에 가격이나 예약 상태를 더하고, Time Picker와 날짜·시간 선택 흐름을 만들 수 있습니다.
Select는 트리거를 눌러 연 목록에서 하나 또는 여러 값을 선택합니다. 항목을 그룹으로 나누거나 설명과 아이콘을 더할 수 있고, 선택값을 Form으로 제출할 수 있습니다. @seed-design/[email protected], @seed-design/[email protected]부터 제공합니다.
주요 기능
하나 또는 여러 값을 선택하고 선택된 값을 원하는 형식으로 표시할 수 있습니다.
항목을 그룹으로 나누고 설명, 아이콘, 커스텀 레이블을 더할 수 있습니다.
긴 목록의 스크롤, 팝오버 위치, 크기와 비활성 상태를 설정할 수 있습니다.
Field, 네이티브 Form, React Hook Form과 연결하고 열림 상태와 변경 이유를 제어할 수 있습니다.
Dialog는 화면 중앙에서 사용자의 주의를 모으고, 제목·본문·푸터에 폼이나 스크롤되는 콘텐츠를 담습니다. ResponsiveDialog를 사용하면 넓은 화면에서는 Dialog, 작은 화면에서는 Bottom Sheet로 자동 전환됩니다. @seed-design/[email protected], @seed-design/[email protected]부터 제공합니다.
주요 기능
크기, 닫기 버튼, 본문 높이와 패딩, 푸터 액션 배치를 콘텐츠에 맞게 구성할 수 있습니다.
controlled 상태와 Portal을 사용해 열림 상태와 렌더링 위치를 관리할 수 있습니다.
바깥 클릭이나 ESC 입력을 막고, 닫기 이유에 따라 확인 Dialog를 한 번 더 보여줄 수 있습니다.
ResponsiveDialog는 넓은 화면의 Dialog와 작은 화면의 Bottom Sheet를 자동으로 전환합니다.
기본 사용
import { HStack, Text } from "@seed-design/react";import { DialogAction, DialogBody, DialogContent, DialogFooter, DialogRoot, DialogTrigger,} from "seed-design/ui/dialog";import { ActionButton } from "seed-design/ui/action-button";const DialogPreview = () => { return ( <DialogRoot> <DialogTrigger asChild> <ActionButton variant="neutralSolid">Open Dialog</ActionButton> </DialogTrigger> <DialogContent title="제목" description="설명을 작성할 수 있어요"> <DialogBody> <Text textStyle="articleBody"> 본문에는 사용자가 확인해야 할 내용이나 추가 입력 폼을 배치할 수 있습니다. </Text> </DialogBody> <DialogFooter> <HStack gap="x2" justify="flex-end"> <DialogAction variant="neutralWeak">취소</DialogAction> <DialogAction variant="neutralSolid">확인</DialogAction> </HStack> </DialogFooter> </DialogContent> </DialogRoot> );};export default DialogPreview;
화면 크기에 맞춰 Dialog와 Bottom Sheet 전환하기
import { HStack, Text, useResponsiveDialogContext } from "@seed-design/react";import { forwardRef } from "react";import { ActionButton } from "seed-design/ui/action-button";import { ResponsiveDialogAction, ResponsiveDialogBody, ResponsiveDialogContent, ResponsiveDialogFooter, ResponsiveDialogRoot, ResponsiveDialogTrigger, type ResponsiveDialogFooterProps,} from "seed-design/ui/responsive-dialog";const Footer = forwardRef<HTMLDivElement, ResponsiveDialogFooterProps>((props, ref) => { const { shouldUseBottomSheet } = useResponsiveDialogContext(); return ( <ResponsiveDialogFooter ref={ref} {...props}> <HStack gap="x2" justify="flex-end"> <ResponsiveDialogAction variant="neutralWeak" flexGrow={shouldUseBottomSheet ? 1 : undefined} > 취소 </ResponsiveDialogAction> <ResponsiveDialogAction variant="neutralSolid" flexGrow={shouldUseBottomSheet ? 1 : undefined} > 확인 </ResponsiveDialogAction> </HStack> </ResponsiveDialogFooter> );});const DialogResponsive = () => { return ( <ResponsiveDialogRoot> <ResponsiveDialogTrigger asChild> <ActionButton variant="neutralSolid">Open</ActionButton> </ResponsiveDialogTrigger> <ResponsiveDialogContent title="반응형 다이얼로그" description="화면 크기에 따라 적합한 컴포넌트로 자동 전환됩니다." > <ResponsiveDialogBody> <Text textStyle="articleBody"> md 이상에서는 화면 중앙의 Dialog로, sm 이하에서는 화면 하단에서 슬라이드되는 Bottom Sheet로 표시됩니다. </Text> </ResponsiveDialogBody> <Footer /> </ResponsiveDialogContent> </ResponsiveDialogRoot> );};export default DialogResponsive;