Get StartedFoundationsComponentsPatternsRulesDevelopAI & ToolsUpdates

Date Picker

캘린더에서 하루·기간·여러 날짜를 선택할 때 사용하는 컴포넌트예요.

설치

pnpm dlx shadcn@latest add https://rebar.conmarket-landing.workers.dev/r/date-picker.json

Anatomy

Date Picker는 캘린더에서 날짜를 직접 골라 입력받는 컴포넌트예요. 날짜 그리드를 핵심으로, Layout에 따라 화면에 바로 펼쳐지거나(Inline) 트리거를 눌러 Popover·Sheet로 떠올라요. 시간(시·분) 입력은 포함하지 않아요. 날짜와 시간을 함께 받을 때는 Time Picker 를 나란히 배치해요.

  • Header: Month Year Label(현재 연·월, 누르면 월·연도 휠이 열려요)과 Prev · Next Button으로 구성돼요.
  • Weekday Row: 주 시작 요일부터 요일 이름 7개를 표시해요. 시작 요일은 locale과 weekStartsOn 을 따르며, 한국에서는 일요일이 기본이에요.
  • Date Grid: 한 달의 날짜를 요일에 맞춰 배치한 그리드예요. 각 칸이 Date Cell이며, 달의 앞뒤 빈 자리는 비워 둬요.
<DatePicker defaultValue={{ year: 2026, month: 10, day: 30 }} />

월·연도 전환

Month Year Label을 누르면 캘린더 그리드 자리에 연·월 휠이 떠올라요. 가운데 강조된 행이 현재 선택된 연·월이에요. 휠을 굴려 선택을 바꾸고, Label을 다시 누르면 캘린더 그리드로 돌아와요. Label의 chevron은 휠이 닫혀 있을 때 ▼, 열려 있을 때 ▲로 방향을 바꿔 상태를 알려줘요. Prev · Next Button은 한 달씩 이동하며, 멀리 떨어진 월·연도로 갈 때는 휠을 써요.

Properties

Selection

날짜를 어떤 방식으로 선택할지 정해요. selectionMode 의 기본값은 single 이에요.

  • Single: 하루를 선택해요. 입주 가능일·방문 약속일에 써요.
  • Range: 시작일과 종료일로 기간을 선택해요. 첫 탭에서 시작일을 지정하고, 두 번째 탭에서 시작일 이후면 종료일로 지정돼 사이가 연결된 띠로 이어져요. 시작일 이전을 누르면 그 날짜가 새 시작일이 되고, 범위가 정해진 뒤 다시 누르면 새로 시작해요. 광고 기간·여행 일정에 써요.
  • Multiple: 여러 날짜를 따로따로 선택해요. 누를 때마다 선택이 토글되며, 값은 항상 오름차순 배열이에요. 모임 후보일에 써요.

Visible Range

캘린더가 한 번에 보여주는 날짜 범위예요. visibleRange 또는 레이아웃별 컴포넌트(TwoMonthDatePicker, WeekDatePicker, ContinuousDatePicker)로 정해요. Date Picker는 고정 폭 없이 부모 너비를 채우므로, 적절한 너비의 컨테이너로 감싸요.

Value범위대표 사용처
Month (기본)한 달의 날짜 그리드 전체입주 가능일·광고 기간 등 대부분
Two Months두 달을 가로로 나란히데스크탑에서 Range를 선택할 때
Continuous여러 달을 세로로 이어 붙여 스크롤모바일 Sheet에서 Range를 선택할 때
Week한 주(7칸)만 가로로날짜로 콘텐츠를 탐색하는 일정 캘린더

Two Months

두 달을 나란히 보여주고, Prev · Next Button은 한 달씩 이동해요.

Week

한 주만 보여주고 Prev · Next Button은 한 주씩 이동해요. 대체할 그리드가 한 주뿐이라 월·연도 휠은 Label에 anchor된 Popover 안에 작은(Small) 크기로 떠올라요. 바깥을 누르거나 Escape 를 누르면 고른 월로 이동하며 닫혀요.

Continuous

Header 대신 스크롤이 이동을 담당해요. Weekday Row는 상단에 고정되고, 각 달은 연·월 라벨과 Date Grid 묶음으로 반복돼요. monthRange 로 노출할 월을 제한하고(생략하면 표시 기준 월부터 12개월), 높이는 className 이나 style 로 지정해요.

Date Cell

Date Grid의 각 칸이 가지는 상태예요. 고를 수 있는 날짜와 이미 고른 날짜를 한눈에 알 수 있게 해요.

State설명
Enabled선택할 수 있는 기본 상태예요.
Pressed칸을 누르고 있는 동안의 상태예요.
Today오늘 날짜예요. 옅은 배경으로 표시해요.
Selected선택된 날짜예요(Single·Multiple). 채운 배경으로 표시해요.
Range Start / End기간의 시작·종료 날짜예요(Range). 채운 배경으로 표시해요.
In Range기간 사이의 날짜예요(Range). 시작·종료를 잇는 연결된 띠로 표시해요.
Disabled선택할 수 없는 날짜예요. 지난 날짜나 예약 불가일에 사용하고, 취소선으로 표시해요.
Read Only이미 확정되어 바꿀 수 없는 값이에요. 채움 배경을 유지하되 톤을 낮춰요.

Constraints

constraints 는 후보 날짜를 선택할 수 있는지 판단하는 함수 배열이에요. 모든 함수가 true 를 반환해야 선택할 수 있어요. 직접 함수를 작성하거나 다음 helper를 조합해요.

  • dateOnOrAfter, dateOnOrBefore: 양끝을 포함해 선택 가능한 날짜를 제한해요.
  • excludeDates: 예약 완료일, 휴무일을 제외해요. Range에서는 시작일부터 후보 종료일까지 전체 구간을 검사해요.
  • rangeDayCountAtLeast, rangeDayCountAtMost: 시작일과 종료일을 모두 포함한 날짜 수를 제한해요.
  • maxSelectionCount: Multiple에서 선택 가능한 최대 개수를 제한해요. 이미 선택한 날짜의 해제는 허용해요.

Read Only Range Start

진행 중인 기간을 수정할 때는 selectionMode="range" 와 rangeStartReadOnly 를 함께 사용해요. 기존 시작일은 Read Only로 고정되고, 시작일보다 늦은 날짜만 새 종료일로 선택할 수 있어요.

Date Cell Supplement

날짜 숫자는 유지하면서 가격, 예약 가능 여부 같은 정보를 더할 때는 renderDateCellSupplement 를 사용해요. 날짜와 선택·오늘·범위·사용 불가 상태가 전달돼요. 버튼이나 링크를 만들지 말고 콘텐츠만 반환해요. 좁은 화면에서는 말줄임을 직접 적용해요.

Guidelines

Layout 선택하기

날짜 선택이 화면에서 차지하는 비중과 플랫폼에 따라 Layout을 정해요.

  • Inline: 날짜 선택이 화면의 핵심 작업이거나 글쓰기·설정 플로우의 한 단계일 때 사용해요. 확정은 화면의 액션 영역(다음·완료 등)이 담당해요.
  • Sheet: 모바일 폼에서 입력 필드를 눌러 날짜를 고를 때 사용해요. 시트 안의 확인 버튼으로 선택을 확정해요.
  • Popover: 데스크탑 폼에서 입력 필드에 anchor된 패널로 캘린더를 띄울 때 사용해요. 화면 공간이 부족하면 위쪽으로 자동 전환돼요.

Popover는 DatePickerPopover · DatePickerPopoverTrigger · DatePickerPopoverContent 를 조합해 만들어요. 확인 버튼을 누르기 전까지는 임시 값을 관리해요.

진입 시 보여줄 월

캘린더를 처음 열면 오늘이 포함된 월을 보여줘요. 이미 선택된 날짜가 있으면 그 날짜가 속한 월을 먼저 보여주고, Range는 시작일, Multiple은 가장 이른 선택일이 기준이에요.

기간·여러 날짜 선택 안내

Range에 최소·최대 기간 제약이 있으면 Callout으로 미리 안내해요. 사용자가 선택을 마친 뒤 에러를 마주하기 전에 제약을 알 수 있어요. 시작일만 찍힌 미완성 범위에서는 확인 버튼을 활성화하지 않아요. Multiple의 최소·최대 개수 제약도 Callout으로 안내하고, 남은 개수를 알려주면 좋아요.

최대 14일까지 선택할 수 있어요.345
Do· 제약을 미리 안내

선택하기 전에 기간 제약을 알 수 있게 해요.

3420기간이 너무 길어요.
Don't· 선택 후 에러

선택을 마친 뒤에야 제약을 알려주지 않아요.

수정할 수 없는 날짜 다루기

수정할 수 없는 날짜는 두 가지로 구분해요. 이미 확정된 값은 Read Only로, 고를 수 없는 날짜는 Disabled로 표시해요. Read Only는 톤을 낮추되 채움 배경을 남겨 값이 있다는 것을 알 수 있게 하고, Disabled는 배경 없이 흐리게만 표시해요. 캘린더 전체가 보기 전용인 화면이라면 셀마다 지정하지 않고 readOnly 로 캘린더 전체를 Read Only로 둬요.

Date Picker와 Time Picker 함께 쓰기

Date Picker는 시간과 시간대를 해석하지 않는 달력 날짜 { year, month, day } 를 사용해요. Time Picker의 값과 따로 상태를 관리한 뒤, 서버 요청이나 도메인 모델 경계에서 두 값을 합쳐요.

Accessibility

WAI-ARIA Grid 패턴을 따라요. 하나의 날짜만 Tab 순서에 들어가며 방향키로 날짜를 이동해요. 조건을 만족하지 않는 날짜는 포커스할 수 있지만 aria-disabled 상태이며 선택할 수 없어요.

키동작
ArrowLeft / ArrowRight하루 전·후 (RTL에서는 반대)
ArrowUp / ArrowDown일주일 전·후
Home / End현재 주의 시작·끝
PageUp / PageDown현재 표시 단위(월·주)의 이전·다음
Shift + PageUp / Shift + PageDown일 년 전·후
Enter / Space포커스한 날짜 선택

Props

DatePicker

Prop

Type

DatePickerPopoverContent

Prop

Type

On this page