📅

@lani.ground/react-picker

React Component Library

NPM Version
Production Ready
TypeScript
🎯

Custom Picker 구성 컴포넌트 Props 및 Preview

Calendar Props

NameTypeRequiredDescription
type'date' | 'range'Optional달력 타입 (기본값: 'date')
dateDate | nullOptional선택된 날짜 (단일 날짜 모드)
onDateChange(date: Date | null) => voidOptional날짜 변경 콜백 (단일 날짜 모드)
range[Date | null, Date | null]Optional선택된 날짜 범위 (범위 모드)
onRangeChange(range: [Date | null, Date | null]) => voidOptional범위 변경 콜백 (범위 모드)
calendarType'default' | 'multiple' | 'scroll'Optional달력 표시 형태 (기본값: 'default')
minDateDateOptional선택 가능한 최소 날짜
maxDateDateOptional선택 가능한 최대 날짜
weekDaysstring[]Optional요일 표시 형태 (기본값: ['일', '월', '화', '수', '목', '금', '토'])
weekendColorstringOptional주말 날짜 색상
holidayColorstringOptional휴일 날짜 색상
holidaysDate[]Optional휴일 날짜 목록
quickSelectOptions{ label: string; days: number }[]Optional빠른 선택 옵션 목록
enableResetbooleanOptional범위 초기화 버튼 표시 여부
classNamestringOptional추가 CSS 클래스명

TimePicker Props

NameTypeRequiredDescription
valueDate | nullRequired선택된 시간
onChange(value: Date | null) => voidRequired시간 변경 콜백
isOpenbooleanRequired시간 선택기 열림/닫힘 상태
onOpenChange(isOpen: boolean) => voidRequired시간 선택기 열림/닫힘 상태 변경 콜백
mode'default' | 'panel'Optional시간 선택기 모드 (기본값: 'default')
timeUnits('hour' | 'minute' | 'second' | 'ampm')[]Optional표시할 시간 단위 (기본값: ['hour', 'minute', 'second'])
enableSnapbooleanOptional스냅 기능 활성화 여부
minuteStep1 | 5 | 10 | 15 | 30Optional분 단위 스텝 (기본값: 1)
secondStep1 | 5 | 10 | 15 | 30Optional초 단위 스텝 (기본값: 1)
disabledbooleanOptional비활성화 여부 (기본값: false)
classNamestringOptional추가 CSS 클래스명

Usage

1import { dateKit } from '@lani.ground/kits';
2import { Calendar, TimePicker } from '@lani.ground/react-picker';
3import '@lani.ground/react-picker/styles/Calendar.css';
4
5
6const { formatDate } = dateKit;
7const [range, setRange] = useState<[Date | null, Date | null]>(range);
8const [timePickerOpen, setTimePickerOpen] = useState(false);
9const [editingDateType, setEditingDateType] = useState<'start' | 'end' | null>(null);
10
11const handleTimePickerOpen = (type: 'start' | 'end') => {
12  setEditingDateType(type);
13  setTimePickerOpen(true);
14};
15
16const handleTimeChange = (value: Date | null) => {
17  const updatedRange = {
18    start: [value, localRange[1]] as [Date | null, Date | null],
19    end: [localRange[0], value] as [Date | null, Date | null],
20  };
21
22  if (editingDateType && updatedRange[editingDateType]) {
23    setLocalRange(updatedRange[editingDateType]);
24  }
25};
26
27const getCurrentTimeValue = () => {
28  const valueMap = {
29    start: localRange[0],
30    end: localRange[1],
31  };
32
33  return editingDateType ? valueMap[editingDateType] : null;
34};
35
36<div>
37  <Calendar
38    type="range"
39    range={range}
40    onRangeChange={(newRange: [Date | null, Date | null]) => {
41      setRange(newRange);
42    }}
43    calendarType="scroll"
44    weekendColor="#6B8EFF"
45    holidayColor="#FF8B8B"
46    quickSelectOptions={[
47      { label: '7일', days: 7 },
48      { label: '14일', days: 14 },
49      { label: '28일', days: 28 },
50    ]}
51    enableReset
52  />
53
54  <div>
55    <p>시작 날짜</p>
56    {range[0] ? (
57      <>
58        <p>
59          {formatDate(range[0], 'MM월 DD일')}
60        </p>
61        <button
62          type="button"
63          onClick={() => handleTimePickerOpen('start')}
64        >
65          {formatDate(range[0], 'HH시 mm분')}
66        </button>
67      </>
68    ) : (
69      <p>날짜를 선택해주세요</p>
70    )}
71  </div>
72  <div>
73    <p>종료 날짜</p>
74    {range[1] ? (
75      <>
76        <p>{formatDate(range[1], 'MM월 DD일')}</p>
77        <button
78          type="button"
79          onClick={() => handleTimePickerOpen('end')}
80        >
81          {formatDate(range[1], 'HH시 mm분')}
82        </button>
83      </>
84    ) : (
85      <p>날짜를 선택해주세요</p>
86    )}
87  </div>
88
89  <TimePicker
90    mode="panel"
91    value={getCurrentTimeValue()}
92    onChange={handleTimeChange}
93    isOpen={timePickerOpen}
94    timeUnits={['hour', 'minute']}
95    onOpenChange={setTimePickerOpen}
96    enableSnap
97  />
98</div>
🎯

Custom Picker Examples

🎨

Custom Picker

Calendar와 TimePicker를 조합한 커스텀 picker 예시입니다. 모달 형태로 제공되며 날짜와 시간 범위를 함께 선택할 수 있습니다.

선택된 범위:

주요 기능

  • Calendar + TimePicker 조합
  • 모달 형태의 UI
  • 날짜 + 시간 범위 선택
  • 커스텀 UI 구성 예제
  • 애니메이션 효과