@kalyx/react 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +21 -0
  3. package/README.md +88 -0
  4. package/dist/components/DatePicker/Calendar.d.ts +23 -0
  5. package/dist/components/DatePicker/Calendar.d.ts.map +1 -0
  6. package/dist/components/DatePicker/Calendar.js +127 -0
  7. package/dist/components/DatePicker/Calendar.js.map +1 -0
  8. package/dist/components/DatePicker/Input.d.ts +7 -0
  9. package/dist/components/DatePicker/Input.d.ts.map +1 -0
  10. package/dist/components/DatePicker/Input.js +73 -0
  11. package/dist/components/DatePicker/Input.js.map +1 -0
  12. package/dist/components/DatePicker/MonthGrid.d.ts +34 -0
  13. package/dist/components/DatePicker/MonthGrid.d.ts.map +1 -0
  14. package/dist/components/DatePicker/MonthGrid.js +54 -0
  15. package/dist/components/DatePicker/MonthGrid.js.map +1 -0
  16. package/dist/components/DatePicker/Popover.d.ts +6 -0
  17. package/dist/components/DatePicker/Popover.d.ts.map +1 -0
  18. package/dist/components/DatePicker/Popover.js +72 -0
  19. package/dist/components/DatePicker/Popover.js.map +1 -0
  20. package/dist/components/DatePicker/Root.d.ts +46 -0
  21. package/dist/components/DatePicker/Root.d.ts.map +1 -0
  22. package/dist/components/DatePicker/Root.js +90 -0
  23. package/dist/components/DatePicker/Root.js.map +1 -0
  24. package/dist/components/DatePicker/Trigger.d.ts +6 -0
  25. package/dist/components/DatePicker/Trigger.d.ts.map +1 -0
  26. package/dist/components/DatePicker/Trigger.js +21 -0
  27. package/dist/components/DatePicker/Trigger.js.map +1 -0
  28. package/dist/components/DatePicker/YearGrid.d.ts +29 -0
  29. package/dist/components/DatePicker/YearGrid.d.ts.map +1 -0
  30. package/dist/components/DatePicker/YearGrid.js +53 -0
  31. package/dist/components/DatePicker/YearGrid.js.map +1 -0
  32. package/dist/components/DatePicker/index.d.ts +48 -0
  33. package/dist/components/DatePicker/index.d.ts.map +1 -0
  34. package/dist/components/DatePicker/index.js +42 -0
  35. package/dist/components/DatePicker/index.js.map +1 -0
  36. package/dist/components/DateTimePicker/Input.d.ts +12 -0
  37. package/dist/components/DateTimePicker/Input.d.ts.map +1 -0
  38. package/dist/components/DateTimePicker/Input.js +41 -0
  39. package/dist/components/DateTimePicker/Input.js.map +1 -0
  40. package/dist/components/DateTimePicker/Root.d.ts +60 -0
  41. package/dist/components/DateTimePicker/Root.d.ts.map +1 -0
  42. package/dist/components/DateTimePicker/Root.js +140 -0
  43. package/dist/components/DateTimePicker/Root.js.map +1 -0
  44. package/dist/components/DateTimePicker/index.d.ts +55 -0
  45. package/dist/components/DateTimePicker/index.d.ts.map +1 -0
  46. package/dist/components/DateTimePicker/index.js +55 -0
  47. package/dist/components/DateTimePicker/index.js.map +1 -0
  48. package/dist/components/RangePicker/Calendar.d.ts +24 -0
  49. package/dist/components/RangePicker/Calendar.d.ts.map +1 -0
  50. package/dist/components/RangePicker/Calendar.js +134 -0
  51. package/dist/components/RangePicker/Calendar.js.map +1 -0
  52. package/dist/components/RangePicker/Input.d.ts +14 -0
  53. package/dist/components/RangePicker/Input.d.ts.map +1 -0
  54. package/dist/components/RangePicker/Input.js +38 -0
  55. package/dist/components/RangePicker/Input.js.map +1 -0
  56. package/dist/components/RangePicker/Popover.d.ts +6 -0
  57. package/dist/components/RangePicker/Popover.d.ts.map +1 -0
  58. package/dist/components/RangePicker/Popover.js +71 -0
  59. package/dist/components/RangePicker/Popover.js.map +1 -0
  60. package/dist/components/RangePicker/Presets.d.ts +49 -0
  61. package/dist/components/RangePicker/Presets.d.ts.map +1 -0
  62. package/dist/components/RangePicker/Presets.js +117 -0
  63. package/dist/components/RangePicker/Presets.js.map +1 -0
  64. package/dist/components/RangePicker/Root.d.ts +40 -0
  65. package/dist/components/RangePicker/Root.d.ts.map +1 -0
  66. package/dist/components/RangePicker/Root.js +138 -0
  67. package/dist/components/RangePicker/Root.js.map +1 -0
  68. package/dist/components/RangePicker/index.d.ts +48 -0
  69. package/dist/components/RangePicker/index.d.ts.map +1 -0
  70. package/dist/components/RangePicker/index.js +43 -0
  71. package/dist/components/RangePicker/index.js.map +1 -0
  72. package/dist/components/TimePicker/AmPmToggle.d.ts +15 -0
  73. package/dist/components/TimePicker/AmPmToggle.d.ts.map +1 -0
  74. package/dist/components/TimePicker/AmPmToggle.js +29 -0
  75. package/dist/components/TimePicker/AmPmToggle.js.map +1 -0
  76. package/dist/components/TimePicker/HourList.d.ts +18 -0
  77. package/dist/components/TimePicker/HourList.d.ts.map +1 -0
  78. package/dist/components/TimePicker/HourList.js +71 -0
  79. package/dist/components/TimePicker/HourList.js.map +1 -0
  80. package/dist/components/TimePicker/Input.d.ts +9 -0
  81. package/dist/components/TimePicker/Input.d.ts.map +1 -0
  82. package/dist/components/TimePicker/Input.js +37 -0
  83. package/dist/components/TimePicker/Input.js.map +1 -0
  84. package/dist/components/TimePicker/MinuteList.d.ts +15 -0
  85. package/dist/components/TimePicker/MinuteList.d.ts.map +1 -0
  86. package/dist/components/TimePicker/MinuteList.js +62 -0
  87. package/dist/components/TimePicker/MinuteList.js.map +1 -0
  88. package/dist/components/TimePicker/Root.d.ts +38 -0
  89. package/dist/components/TimePicker/Root.d.ts.map +1 -0
  90. package/dist/components/TimePicker/Root.js +40 -0
  91. package/dist/components/TimePicker/Root.js.map +1 -0
  92. package/dist/components/TimePicker/index.d.ts +32 -0
  93. package/dist/components/TimePicker/index.d.ts.map +1 -0
  94. package/dist/components/TimePicker/index.js +27 -0
  95. package/dist/components/TimePicker/index.js.map +1 -0
  96. package/dist/context/DatePickerContext.d.ts +49 -0
  97. package/dist/context/DatePickerContext.d.ts.map +1 -0
  98. package/dist/context/DatePickerContext.js +18 -0
  99. package/dist/context/DatePickerContext.js.map +1 -0
  100. package/dist/context/RangePickerContext.d.ts +53 -0
  101. package/dist/context/RangePickerContext.d.ts.map +1 -0
  102. package/dist/context/RangePickerContext.js +18 -0
  103. package/dist/context/RangePickerContext.js.map +1 -0
  104. package/dist/context/TimePickerContext.d.ts +29 -0
  105. package/dist/context/TimePickerContext.d.ts.map +1 -0
  106. package/dist/context/TimePickerContext.js +18 -0
  107. package/dist/context/TimePickerContext.js.map +1 -0
  108. package/dist/hooks/useDatePicker.d.ts +63 -0
  109. package/dist/hooks/useDatePicker.d.ts.map +1 -0
  110. package/dist/hooks/useDatePicker.js +82 -0
  111. package/dist/hooks/useDatePicker.js.map +1 -0
  112. package/dist/hooks/useRangePicker.d.ts +67 -0
  113. package/dist/hooks/useRangePicker.d.ts.map +1 -0
  114. package/dist/hooks/useRangePicker.js +116 -0
  115. package/dist/hooks/useRangePicker.js.map +1 -0
  116. package/dist/hooks/useTimePicker.d.ts +63 -0
  117. package/dist/hooks/useTimePicker.d.ts.map +1 -0
  118. package/dist/hooks/useTimePicker.js +69 -0
  119. package/dist/hooks/useTimePicker.js.map +1 -0
  120. package/dist/index.cjs +2150 -0
  121. package/dist/index.cjs.map +1 -0
  122. package/dist/index.d.cts +744 -0
  123. package/dist/index.d.ts +17 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +13 -0
  126. package/dist/index.js.map +1 -0
  127. package/package.json +67 -0
@@ -0,0 +1,744 @@
1
+ import * as react from 'react';
2
+ import { ReactNode, HTMLAttributes, InputHTMLAttributes, ButtonHTMLAttributes } from 'react';
3
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
+ import { ISODateString, DisabledRule, WeekStartsOn, DateAdapter, DateRange, CalendarGrid, TimeValue } from '@kalyx/core';
5
+ export { CalendarDay, DateAdapter, DateFnsAdapter, DateRange, DisabledRule, ISODateString, TimeValue } from '@kalyx/core';
6
+
7
+ /**
8
+ * DatePicker의 Root 컴포넌트 props.
9
+ *
10
+ * @example 제어 모드
11
+ * ```tsx
12
+ * <DatePicker value={date} onChange={setDate}>
13
+ * <DatePicker.Input />
14
+ * <DatePicker.Popover>
15
+ * <DatePicker.Calendar />
16
+ * </DatePicker.Popover>
17
+ * </DatePicker>
18
+ * ```
19
+ *
20
+ * @example 비제어 모드
21
+ * ```tsx
22
+ * <DatePicker defaultValue="2026-01-15T00:00:00.000Z">
23
+ * <DatePicker.Input />
24
+ * </DatePicker>
25
+ * ```
26
+ */
27
+ interface DatePickerRootProps {
28
+ /** 선택된 날짜 (제어 모드, ISO 8601 UTC). `null`이면 빈 상태. */
29
+ value?: ISODateString | null;
30
+ /** 초기 날짜 (비제어 모드) */
31
+ defaultValue?: ISODateString;
32
+ /** 날짜 변경 콜백 */
33
+ onChange?: (value: ISODateString | null) => void;
34
+ /** 비활성화 규칙 */
35
+ disabled?: DisabledRule[] | boolean;
36
+ /** 읽기 전용 */
37
+ readOnly?: boolean;
38
+ /** 주 시작 요일 */
39
+ weekStartsOn?: WeekStartsOn;
40
+ /** 날짜 표시 포맷 */
41
+ displayFormat?: string;
42
+ /** BCP 47 locale (예: "en-US", "ko-KR", "ja-JP") */
43
+ locale?: string;
44
+ /** 날짜 어댑터 */
45
+ adapter?: DateAdapter;
46
+ /** 자식 컴포넌트 */
47
+ children: ReactNode;
48
+ }
49
+ declare function DatePickerRoot({ value: controlledValue, defaultValue, onChange, disabled, readOnly, weekStartsOn, displayFormat, locale, adapter, children, }: DatePickerRootProps): react_jsx_runtime.JSX.Element;
50
+
51
+ interface DatePickerPopoverProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {
52
+ children?: ReactNode;
53
+ }
54
+ declare function DatePickerPopover({ children, ...props }: DatePickerPopoverProps): react_jsx_runtime.JSX.Element | null;
55
+
56
+ interface DatePickerCalendarClassNames {
57
+ root?: string;
58
+ header?: string;
59
+ title?: string;
60
+ navButton?: string;
61
+ grid?: string;
62
+ gridRow?: string;
63
+ gridCell?: string;
64
+ day?: string;
65
+ daySelected?: string;
66
+ dayToday?: string;
67
+ dayDisabled?: string;
68
+ dayOutsideMonth?: string;
69
+ weekdayHeader?: string;
70
+ }
71
+ interface DatePickerCalendarProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {
72
+ classNames?: DatePickerCalendarClassNames;
73
+ /** 타이틀("January 2026") 클릭 시 콜백. Month/Year 뷰 전환에 사용. */
74
+ onTitleClick?: () => void;
75
+ }
76
+ declare function DatePickerCalendar({ classNames, onTitleClick, ...props }: DatePickerCalendarProps): react_jsx_runtime.JSX.Element;
77
+
78
+ interface DatePickerMonthGridClassNames {
79
+ root?: string;
80
+ header?: string;
81
+ title?: string;
82
+ navButton?: string;
83
+ grid?: string;
84
+ month?: string;
85
+ monthSelected?: string;
86
+ monthCurrent?: string;
87
+ }
88
+ interface DatePickerMonthGridProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {
89
+ classNames?: DatePickerMonthGridClassNames;
90
+ /** 월 선택 시 콜백. 일반적으로 day 뷰로 전환한다. */
91
+ onSelect?: () => void;
92
+ /** 타이틀(년도) 클릭 시 콜백. Year 뷰로 전환할 때 사용. */
93
+ onTitleClick?: () => void;
94
+ }
95
+ /**
96
+ * DatePicker.MonthGrid — 12개월 그리드에서 월을 빠르게 선택.
97
+ * Calendar 타이틀 클릭 → MonthGrid 표시 → 월 클릭 → Calendar로 복귀.
98
+ *
99
+ * @example
100
+ * ```tsx
101
+ * {view === 'months' && (
102
+ * <DatePicker.MonthGrid
103
+ * onSelect={() => setView('days')}
104
+ * onTitleClick={() => setView('years')}
105
+ * />
106
+ * )}
107
+ * ```
108
+ */
109
+ declare function DatePickerMonthGrid({ classNames, onSelect, onTitleClick, ...props }: DatePickerMonthGridProps): react_jsx_runtime.JSX.Element;
110
+
111
+ interface DatePickerYearGridClassNames {
112
+ root?: string;
113
+ header?: string;
114
+ title?: string;
115
+ navButton?: string;
116
+ grid?: string;
117
+ year?: string;
118
+ yearSelected?: string;
119
+ yearCurrent?: string;
120
+ }
121
+ interface DatePickerYearGridProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {
122
+ classNames?: DatePickerYearGridClassNames;
123
+ /** 년 선택 시 콜백. 일반적으로 month 뷰로 전환한다. */
124
+ onSelect?: () => void;
125
+ }
126
+ /**
127
+ * DatePicker.YearGrid — 12년 단위 그리드에서 년도를 빠르게 선택.
128
+ * MonthGrid 타이틀 클릭 → YearGrid 표시 → 년 클릭 → MonthGrid로 복귀.
129
+ *
130
+ * @example
131
+ * ```tsx
132
+ * {view === 'years' && (
133
+ * <DatePicker.YearGrid onSelect={() => setView('months')} />
134
+ * )}
135
+ * ```
136
+ */
137
+ declare function DatePickerYearGrid({ classNames, onSelect, ...props }: DatePickerYearGridProps): react_jsx_runtime.JSX.Element;
138
+
139
+ interface DatePickerInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'> {
140
+ /** 날짜 표시 포맷 (기본: 부모의 displayFormat) */
141
+ format?: string;
142
+ }
143
+
144
+ interface DatePickerTriggerProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {
145
+ children?: ReactNode;
146
+ }
147
+
148
+ /**
149
+ * DatePicker — Headless, SSR-safe React DatePicker
150
+ *
151
+ * @example 기본
152
+ * ```tsx
153
+ * <DatePicker value={date} onChange={setDate}>
154
+ * <DatePicker.Input placeholder="날짜 선택" />
155
+ * <DatePicker.Popover>
156
+ * <DatePicker.Calendar />
157
+ * </DatePicker.Popover>
158
+ * </DatePicker>
159
+ * ```
160
+ *
161
+ * @example Month/Year 빠른 네비게이션
162
+ * ```tsx
163
+ * const [view, setView] = useState('days');
164
+ * <DatePicker value={date} onChange={setDate}>
165
+ * <DatePicker.Input />
166
+ * <DatePicker.Popover>
167
+ * {view === 'days' && <DatePicker.Calendar onTitleClick={() => setView('months')} />}
168
+ * {view === 'months' && <DatePicker.MonthGrid onSelect={() => setView('days')} onTitleClick={() => setView('years')} />}
169
+ * {view === 'years' && <DatePicker.YearGrid onSelect={() => setView('months')} />}
170
+ * </DatePicker.Popover>
171
+ * </DatePicker>
172
+ * ```
173
+ */
174
+ declare const DatePicker: typeof DatePickerRoot & {
175
+ Input: react.ForwardRefExoticComponent<DatePickerInputProps & react.RefAttributes<HTMLInputElement>>;
176
+ Trigger: react.ForwardRefExoticComponent<DatePickerTriggerProps & react.RefAttributes<HTMLButtonElement>>;
177
+ Popover: typeof DatePickerPopover;
178
+ Calendar: typeof DatePickerCalendar;
179
+ MonthGrid: typeof DatePickerMonthGrid;
180
+ YearGrid: typeof DatePickerYearGrid;
181
+ };
182
+
183
+ /**
184
+ * RangePicker의 Root 컴포넌트 props.
185
+ *
186
+ * @example
187
+ * ```tsx
188
+ * <RangePicker value={range} onChange={setRange}>
189
+ * <RangePicker.Input part="start" />
190
+ * <RangePicker.Input part="end" />
191
+ * <RangePicker.Popover>
192
+ * <RangePicker.Calendar />
193
+ * </RangePicker.Popover>
194
+ * </RangePicker>
195
+ * ```
196
+ */
197
+ interface RangePickerRootProps {
198
+ /** 선택된 범위 (제어 모드). `{ start, end }` 형태의 ISO string 또는 null. */
199
+ value?: DateRange;
200
+ /** 초기 범위 (비제어 모드) */
201
+ defaultValue?: DateRange;
202
+ /** 범위 변경 콜백 */
203
+ onChange?: (range: DateRange) => void;
204
+ /** 비활성화 규칙 */
205
+ disabled?: DisabledRule[] | boolean;
206
+ /** 읽기 전용 */
207
+ readOnly?: boolean;
208
+ /** 주 시작 요일 */
209
+ weekStartsOn?: WeekStartsOn;
210
+ /** 날짜 표시 포맷 */
211
+ displayFormat?: string;
212
+ /** BCP 47 locale */
213
+ locale?: string;
214
+ /** 날짜 어댑터 */
215
+ adapter?: DateAdapter;
216
+ /** 자식 컴포넌트 */
217
+ children: ReactNode;
218
+ }
219
+ declare function RangePickerRoot({ value: controlledValue, defaultValue, onChange, disabled, readOnly, weekStartsOn, displayFormat, locale, adapter, children, }: RangePickerRootProps): react_jsx_runtime.JSX.Element;
220
+
221
+ interface RangePickerPopoverProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {
222
+ children?: ReactNode;
223
+ }
224
+ declare function RangePickerPopover({ children, ...props }: RangePickerPopoverProps): react_jsx_runtime.JSX.Element | null;
225
+
226
+ interface RangePickerCalendarClassNames {
227
+ root?: string;
228
+ header?: string;
229
+ title?: string;
230
+ navButton?: string;
231
+ grid?: string;
232
+ gridRow?: string;
233
+ gridCell?: string;
234
+ day?: string;
235
+ daySelected?: string;
236
+ dayToday?: string;
237
+ dayDisabled?: string;
238
+ dayOutsideMonth?: string;
239
+ dayRangeStart?: string;
240
+ dayRangeEnd?: string;
241
+ dayInRange?: string;
242
+ weekdayHeader?: string;
243
+ }
244
+ interface RangePickerCalendarProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {
245
+ classNames?: RangePickerCalendarClassNames;
246
+ }
247
+ declare function RangePickerCalendar({ classNames, ...props }: RangePickerCalendarProps): react_jsx_runtime.JSX.Element;
248
+
249
+ /** 미리 정의된 프리셋 키. 커스텀 범위도 가능. */
250
+ type PresetKey = 'today' | 'yesterday' | 'last7days' | 'last30days' | 'thisWeek' | 'lastWeek' | 'thisMonth' | 'lastMonth' | 'thisYear';
251
+ interface RangePickerPresetsClassNames {
252
+ root?: string;
253
+ preset?: string;
254
+ presetActive?: string;
255
+ }
256
+ interface RangePickerPresetsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {
257
+ classNames?: RangePickerPresetsClassNames;
258
+ children?: ReactNode;
259
+ }
260
+ /**
261
+ * RangePicker.Presets — 프리셋 버튼들을 감싸는 컨테이너.
262
+ * 내부에 `RangePicker.Preset` 버튼들을 배치한다.
263
+ *
264
+ * @example
265
+ * ```tsx
266
+ * <RangePicker.Presets>
267
+ * <RangePicker.Preset value="last7days">Last 7 days</RangePicker.Preset>
268
+ * <RangePicker.Preset value="thisMonth">This month</RangePicker.Preset>
269
+ * </RangePicker.Presets>
270
+ * ```
271
+ */
272
+ declare function RangePickerPresets({ classNames, children, ...props }: RangePickerPresetsProps): react_jsx_runtime.JSX.Element;
273
+ interface RangePickerPresetProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'value'> {
274
+ /** 미리 정의된 프리셋 키 또는 직접 range 전달 시 생략 */
275
+ value?: PresetKey;
276
+ /** 직접 범위를 지정할 때 사용 (value 대신) */
277
+ range?: DateRange;
278
+ children: ReactNode;
279
+ className?: string;
280
+ }
281
+ /**
282
+ * RangePicker.Preset — 한 클릭으로 날짜 범위를 선택하는 프리셋 버튼.
283
+ *
284
+ * `value` (프리셋 키) 또는 `range` (직접 범위)를 전달한다.
285
+ *
286
+ * @example
287
+ * ```tsx
288
+ * <RangePicker.Preset value="last7days">Last 7 days</RangePicker.Preset>
289
+ * <RangePicker.Preset range={{ start: "2026-01-01T...", end: "2026-03-31T..." }}>
290
+ * Q1 2026
291
+ * </RangePicker.Preset>
292
+ * ```
293
+ */
294
+ declare function RangePickerPreset({ value: presetKey, range: directRange, children, onClick, ...props }: RangePickerPresetProps): react_jsx_runtime.JSX.Element;
295
+
296
+ type RangeInputPart = 'start' | 'end';
297
+ interface RangePickerInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'> {
298
+ /** 어떤 부분의 입력인지 (start | end) */
299
+ part: RangeInputPart;
300
+ /** 날짜 표시 포맷 (기본: 부모의 displayFormat) */
301
+ format?: string;
302
+ }
303
+
304
+ /**
305
+ * RangePicker — Headless 날짜 범위 선택 컴포넌트
306
+ *
307
+ * @example 기본
308
+ * ```tsx
309
+ * <RangePicker value={range} onChange={setRange}>
310
+ * <RangePicker.Input part="start" />
311
+ * <RangePicker.Input part="end" />
312
+ * <RangePicker.Popover>
313
+ * <RangePicker.Calendar />
314
+ * </RangePicker.Popover>
315
+ * </RangePicker>
316
+ * ```
317
+ *
318
+ * @example Presets (대시보드)
319
+ * ```tsx
320
+ * <RangePicker value={range} onChange={setRange}>
321
+ * <RangePicker.Input part="start" />
322
+ * <RangePicker.Input part="end" />
323
+ * <RangePicker.Popover>
324
+ * <RangePicker.Presets>
325
+ * <RangePicker.Preset value="last7days">Last 7 days</RangePicker.Preset>
326
+ * <RangePicker.Preset value="last30days">Last 30 days</RangePicker.Preset>
327
+ * <RangePicker.Preset value="thisMonth">This month</RangePicker.Preset>
328
+ * </RangePicker.Presets>
329
+ * <RangePicker.Calendar />
330
+ * </RangePicker.Popover>
331
+ * </RangePicker>
332
+ * ```
333
+ */
334
+ declare const RangePicker: typeof RangePickerRoot & {
335
+ Input: react.ForwardRefExoticComponent<RangePickerInputProps & react.RefAttributes<HTMLInputElement>>;
336
+ Popover: typeof RangePickerPopover;
337
+ Calendar: typeof RangePickerCalendar;
338
+ Presets: typeof RangePickerPresets;
339
+ Preset: typeof RangePickerPreset;
340
+ };
341
+
342
+ type TimePickerFormat = '12h' | '24h';
343
+
344
+ /**
345
+ * TimePicker의 Root 컴포넌트 props.
346
+ *
347
+ * @example
348
+ * ```tsx
349
+ * <TimePicker value={time} onChange={setTime} format="24h" step={15}>
350
+ * <TimePicker.Input />
351
+ * <TimePicker.HourList />
352
+ * <TimePicker.MinuteList />
353
+ * <TimePicker.AmPmToggle />
354
+ * </TimePicker>
355
+ * ```
356
+ */
357
+ interface TimePickerRootProps {
358
+ /** 선택된 시간 (제어 모드, ISO 8601 UTC). 날짜 부분은 무시되고 시간만 사용. */
359
+ value?: ISODateString | null;
360
+ /** 초기 시간 (비제어 모드) */
361
+ defaultValue?: ISODateString;
362
+ /** 시간 변경 콜백 */
363
+ onChange?: (value: ISODateString | null) => void;
364
+ /** 12시간제 또는 24시간제 */
365
+ format?: TimePickerFormat;
366
+ /** 분 step (1, 5, 10, 15, 30 등) */
367
+ step?: number;
368
+ /** 초 표시 여부 */
369
+ withSeconds?: boolean;
370
+ /** 전체 비활성화 */
371
+ disabled?: boolean;
372
+ /** 읽기 전용 */
373
+ readOnly?: boolean;
374
+ /** 자식 컴포넌트 */
375
+ children: ReactNode;
376
+ }
377
+ declare function TimePickerRoot({ value: controlledValue, defaultValue, onChange, format, step, withSeconds, disabled, readOnly, children, }: TimePickerRootProps): react_jsx_runtime.JSX.Element;
378
+
379
+ interface TimePickerHourListClassNames {
380
+ root?: string;
381
+ option?: string;
382
+ optionSelected?: string;
383
+ }
384
+ interface TimePickerHourListProps extends Omit<HTMLAttributes<HTMLUListElement>, 'role' | 'children'> {
385
+ classNames?: TimePickerHourListClassNames;
386
+ }
387
+ /**
388
+ * TimePicker.HourList — `role="listbox"` 패턴의 시간 선택 리스트.
389
+ * 12h/24h 모드에 따라 다르게 렌더링.
390
+ *
391
+ * ARIA 표준 listbox: <li role="option">이 직접 인터랙티브 요소.
392
+ * 키보드: ↑/↓로 이동, Enter/Space로 선택.
393
+ */
394
+ declare function TimePickerHourList({ classNames, ...props }: TimePickerHourListProps): react_jsx_runtime.JSX.Element;
395
+
396
+ interface TimePickerMinuteListClassNames {
397
+ root?: string;
398
+ option?: string;
399
+ optionSelected?: string;
400
+ }
401
+ interface TimePickerMinuteListProps extends Omit<HTMLAttributes<HTMLUListElement>, 'role' | 'children'> {
402
+ classNames?: TimePickerMinuteListClassNames;
403
+ }
404
+ /**
405
+ * TimePicker.MinuteList — `role="listbox"` 패턴의 분 선택 리스트.
406
+ * step prop에 따라 표시되는 분이 결정된다 (예: step=15 → [0, 15, 30, 45]).
407
+ */
408
+ declare function TimePickerMinuteList({ classNames, ...props }: TimePickerMinuteListProps): react_jsx_runtime.JSX.Element;
409
+
410
+ interface TimePickerAmPmToggleClassNames {
411
+ root?: string;
412
+ option?: string;
413
+ optionSelected?: string;
414
+ }
415
+ interface TimePickerAmPmToggleProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'children'> {
416
+ classNames?: TimePickerAmPmToggleClassNames;
417
+ }
418
+ /**
419
+ * TimePicker.AmPmToggle — 12시간제 모드에서만 표시되는 AM/PM 전환 버튼.
420
+ * 24시간제에서는 null을 반환한다.
421
+ */
422
+ declare function TimePickerAmPmToggle({ classNames, ...props }: TimePickerAmPmToggleProps): react_jsx_runtime.JSX.Element | null;
423
+
424
+ interface TimePickerInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'> {
425
+ }
426
+
427
+ /**
428
+ * TimePicker — Headless 시간 선택 컴포넌트
429
+ *
430
+ * @example
431
+ * ```tsx
432
+ * <TimePicker value={time} onChange={setTime} format="24h" step={15}>
433
+ * <TimePicker.Input />
434
+ * <div>
435
+ * <TimePicker.HourList />
436
+ * <TimePicker.MinuteList />
437
+ * <TimePicker.AmPmToggle />
438
+ * </div>
439
+ * </TimePicker>
440
+ * ```
441
+ */
442
+ declare const TimePicker: typeof TimePickerRoot & {
443
+ Input: react.ForwardRefExoticComponent<TimePickerInputProps & react.RefAttributes<HTMLInputElement>>;
444
+ HourList: typeof TimePickerHourList;
445
+ MinuteList: typeof TimePickerMinuteList;
446
+ AmPmToggle: typeof TimePickerAmPmToggle;
447
+ };
448
+
449
+ /**
450
+ * DateTimePicker의 Root 컴포넌트 props.
451
+ * 내부적으로 DatePickerContext + TimePickerContext를 동시에 제공 (Context Bridging).
452
+ *
453
+ * @example
454
+ * ```tsx
455
+ * <DateTimePicker value={dt} onChange={setDt} format="24h" step={15}>
456
+ * <DateTimePicker.Input />
457
+ * <DateTimePicker.Popover>
458
+ * <DateTimePicker.Calendar />
459
+ * <DateTimePicker.HourList />
460
+ * <DateTimePicker.MinuteList />
461
+ * </DateTimePicker.Popover>
462
+ * </DateTimePicker>
463
+ * ```
464
+ */
465
+ interface DateTimePickerRootProps {
466
+ /** 선택된 datetime (제어 모드, ISO 8601 UTC). 날짜+시간 모두 포함. */
467
+ value?: ISODateString | null;
468
+ /** 초기 datetime (비제어 모드) */
469
+ defaultValue?: ISODateString;
470
+ /** datetime 변경 콜백 */
471
+ onChange?: (value: ISODateString | null) => void;
472
+ /** 12/24시간제 */
473
+ format?: TimePickerFormat;
474
+ /** 분 step (1, 5, 15, 30 등) */
475
+ step?: number;
476
+ /** 비활성화 규칙 (날짜) */
477
+ disabled?: DisabledRule[] | boolean;
478
+ /** 읽기 전용 */
479
+ readOnly?: boolean;
480
+ /** 주 시작 요일 */
481
+ weekStartsOn?: WeekStartsOn;
482
+ /** 날짜·시간 표시 포맷 (Input용) */
483
+ displayFormat?: string;
484
+ /** BCP 47 locale */
485
+ locale?: string;
486
+ /** 날짜 어댑터 */
487
+ adapter?: DateAdapter;
488
+ /** 자식 컴포넌트 */
489
+ children: ReactNode;
490
+ }
491
+ /**
492
+ * DateTimePicker.Root — DatePicker + TimePicker 통합 컴포넌트.
493
+ *
494
+ * 단일 ISO datetime을 source of truth로 관리하고, 내부적으로
495
+ * DatePickerContext와 TimePickerContext를 동시에 제공한다.
496
+ * 따라서 DatePicker.Calendar, TimePicker.HourList 등 기존 컴포넌트를
497
+ * 그대로 재사용할 수 있다.
498
+ *
499
+ * 핵심 동작:
500
+ * - Calendar에서 날짜 클릭 → 날짜 부분만 변경, 시간 부분 보존, 팝오버 유지
501
+ * - TimePicker에서 시간 변경 → 시간 부분만 변경, 날짜 부분 보존
502
+ * - Escape / 바깥 클릭 → 팝오버 닫기 (확정)
503
+ */
504
+ declare function DateTimePickerRoot({ value: controlledValue, defaultValue, onChange, format, step, disabled, readOnly, weekStartsOn, displayFormat, locale, adapter, children, }: DateTimePickerRootProps): react_jsx_runtime.JSX.Element;
505
+
506
+ interface DateTimePickerInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'> {
507
+ }
508
+
509
+ /**
510
+ * DateTimePicker — 날짜와 시간을 함께 선택하는 통합 컴포넌트.
511
+ *
512
+ * 단일 ISO datetime을 source of truth로 관리하며, 내부적으로
513
+ * DatePickerContext와 TimePickerContext를 동시에 제공한다.
514
+ * 따라서 DatePicker.Calendar, TimePicker.HourList 등 기존 컴포넌트가
515
+ * 그대로 동작한다.
516
+ *
517
+ * @example
518
+ * ```tsx
519
+ * <DateTimePicker value={dt} onChange={setDt} format="24h" step={15}>
520
+ * <DateTimePicker.Input />
521
+ * <DateTimePicker.Popover>
522
+ * <DateTimePicker.Calendar />
523
+ * <DateTimePicker.HourList />
524
+ * <DateTimePicker.MinuteList />
525
+ * </DateTimePicker.Popover>
526
+ * </DateTimePicker>
527
+ * ```
528
+ *
529
+ * @example 12시간제 모드
530
+ * ```tsx
531
+ * <DateTimePicker value={dt} onChange={setDt} format="12h" step={15}>
532
+ * <DateTimePicker.Input />
533
+ * <DateTimePicker.Popover>
534
+ * <DateTimePicker.Calendar />
535
+ * <DateTimePicker.HourList />
536
+ * <DateTimePicker.MinuteList />
537
+ * <DateTimePicker.AmPmToggle />
538
+ * </DateTimePicker.Popover>
539
+ * </DateTimePicker>
540
+ * ```
541
+ */
542
+ declare const DateTimePicker: typeof DateTimePickerRoot & {
543
+ Input: react.ForwardRefExoticComponent<DateTimePickerInputProps & react.RefAttributes<HTMLInputElement>>;
544
+ Popover: typeof DatePickerPopover;
545
+ Calendar: typeof DatePickerCalendar;
546
+ MonthGrid: typeof DatePickerMonthGrid;
547
+ YearGrid: typeof DatePickerYearGrid;
548
+ HourList: typeof TimePickerHourList;
549
+ MinuteList: typeof TimePickerMinuteList;
550
+ AmPmToggle: typeof TimePickerAmPmToggle;
551
+ };
552
+
553
+ interface UseDatePickerOptions {
554
+ /** 선택된 날짜 (제어 모드) */
555
+ value?: ISODateString | null;
556
+ /** 초기 날짜 (비제어 모드) */
557
+ defaultValue?: ISODateString;
558
+ /** 날짜 변경 콜백 */
559
+ onChange?: (value: ISODateString | null) => void;
560
+ /** 비활성화 규칙 */
561
+ disabled?: DisabledRule[];
562
+ /** 주 시작 요일 */
563
+ weekStartsOn?: WeekStartsOn;
564
+ /** 날짜 어댑터 */
565
+ adapter?: DateAdapter;
566
+ }
567
+ interface UseDatePickerReturn {
568
+ /** 현재 선택된 날짜 (ISO string) */
569
+ value: ISODateString | null;
570
+ /** 팝오버 열림 상태 */
571
+ isOpen: boolean;
572
+ /** 팝오버 열기 */
573
+ open: () => void;
574
+ /** 팝오버 닫기 */
575
+ close: () => void;
576
+ /** 팝오버 토글 */
577
+ toggle: () => void;
578
+ /** 날짜 선택 */
579
+ selectDate: (iso: ISODateString | null) => void;
580
+ /** 현재 표시 중인 월 (ISO string) */
581
+ viewMonth: ISODateString;
582
+ /** 표시 월 변경 */
583
+ setViewMonth: (iso: ISODateString) => void;
584
+ /** 캘린더 그리드 데이터 */
585
+ calendar: CalendarGrid;
586
+ /** 포커스된 날짜 */
587
+ focusedDate: ISODateString;
588
+ /** 포커스 날짜 변경 */
589
+ setFocusedDate: (iso: ISODateString) => void;
590
+ /** 이전 달로 이동 */
591
+ previousMonth: () => void;
592
+ /** 다음 달로 이동 */
593
+ nextMonth: () => void;
594
+ /** 고유 ID */
595
+ pickerId: string;
596
+ /** 날짜 어댑터 */
597
+ adapter: DateAdapter;
598
+ }
599
+ /**
600
+ * DatePicker의 상태를 관리하는 Hook.
601
+ * 컴포넌트를 사용하지 않고 완전 커스텀 UI를 구현할 때 사용한다.
602
+ *
603
+ * @example
604
+ * ```tsx
605
+ * function MyDatePicker() {
606
+ * const { value, isOpen, calendar, open, selectDate } = useDatePicker({
607
+ * onChange: (iso) => console.log(iso),
608
+ * });
609
+ * // ... 커스텀 렌더링
610
+ * }
611
+ * ```
612
+ */
613
+ declare function useDatePicker(options?: UseDatePickerOptions): UseDatePickerReturn;
614
+
615
+ /** 다음에 선택할 부분 (start | end) */
616
+ type RangeSelectingTarget = 'start' | 'end';
617
+
618
+ interface UseRangePickerOptions {
619
+ /** 선택된 범위 (제어 모드) */
620
+ value?: DateRange;
621
+ /** 초기 범위 (비제어 모드) */
622
+ defaultValue?: DateRange;
623
+ /** 범위 변경 콜백 */
624
+ onChange?: (range: DateRange) => void;
625
+ /** 비활성화 규칙 */
626
+ disabled?: DisabledRule[];
627
+ /** 주 시작 요일 */
628
+ weekStartsOn?: WeekStartsOn;
629
+ /** 날짜 어댑터 */
630
+ adapter?: DateAdapter;
631
+ }
632
+ interface UseRangePickerReturn {
633
+ /** 현재 선택된 범위 */
634
+ value: DateRange;
635
+ /** 다음에 선택될 부분 */
636
+ selectingTarget: RangeSelectingTarget;
637
+ /** 단일 날짜 클릭 핸들러 */
638
+ selectDate: (iso: ISODateString) => void;
639
+ /** 범위 직접 설정 */
640
+ setRange: (range: DateRange) => void;
641
+ /** 팝오버 열림 상태 */
642
+ isOpen: boolean;
643
+ open: () => void;
644
+ close: () => void;
645
+ toggle: () => void;
646
+ /** hover 날짜 (미리보기용) */
647
+ hoverDate: ISODateString | null;
648
+ setHoverDate: (iso: ISODateString | null) => void;
649
+ /** 현재 표시 중인 월 */
650
+ viewMonth: ISODateString;
651
+ setViewMonth: (iso: ISODateString) => void;
652
+ /** 캘린더 그리드 */
653
+ calendar: CalendarGrid;
654
+ /** 포커스된 날짜 */
655
+ focusedDate: ISODateString;
656
+ setFocusedDate: (iso: ISODateString) => void;
657
+ /** 이전 달로 이동 */
658
+ previousMonth: () => void;
659
+ /** 다음 달로 이동 */
660
+ nextMonth: () => void;
661
+ /** 고유 ID */
662
+ pickerId: string;
663
+ /** 어댑터 */
664
+ adapter: DateAdapter;
665
+ }
666
+ /**
667
+ * RangePicker 상태 관리 Hook.
668
+ * 컴포넌트 없이 완전 커스텀 UI를 만들 때 사용한다.
669
+ *
670
+ * @example
671
+ * ```tsx
672
+ * function MyRangePicker() {
673
+ * const { value, calendar, selectDate, selectingTarget } = useRangePicker({
674
+ * onChange: (range) => console.log(range.start, range.end),
675
+ * });
676
+ * // selectingTarget === 'start' → 시작일 선택 대기
677
+ * // selectingTarget === 'end' → 종료일 선택 대기
678
+ * }
679
+ * ```
680
+ */
681
+ declare function useRangePicker(options?: UseRangePickerOptions): UseRangePickerReturn;
682
+
683
+ interface UseTimePickerOptions {
684
+ /** 선택된 시간 (제어 모드) */
685
+ value?: ISODateString | null;
686
+ /** 초기 시간 (비제어 모드) */
687
+ defaultValue?: ISODateString;
688
+ /** 시간 변경 콜백 */
689
+ onChange?: (value: ISODateString | null) => void;
690
+ /** 12/24시간제 */
691
+ format?: TimePickerFormat;
692
+ /** 분 step */
693
+ step?: number;
694
+ /** 초 표시 */
695
+ withSeconds?: boolean;
696
+ }
697
+ interface UseTimePickerReturn {
698
+ /** 현재 ISO datetime 값 */
699
+ value: ISODateString | null;
700
+ /** 현재 시간 (TimeValue) */
701
+ currentTime: TimeValue;
702
+ /** 시간 부분 변경 */
703
+ setTime: (partial: Partial<TimeValue>) => void;
704
+ /** 시(hour) 직접 설정 (12h 모드면 1-12, 24h 모드면 0-23) */
705
+ setHour: (hour: number) => void;
706
+ /** 분 설정 */
707
+ setMinute: (minute: number) => void;
708
+ /** 초 설정 */
709
+ setSecond: (second: number) => void;
710
+ /** AM/PM 변경 (12h 모드 전용) */
711
+ setPeriod: (period: 'AM' | 'PM') => void;
712
+ /** 사용 가능한 시 리스트 */
713
+ availableHours: number[];
714
+ /** 사용 가능한 분 리스트 (step 적용) */
715
+ availableMinutes: number[];
716
+ /** 12/24h 모드 */
717
+ format: TimePickerFormat;
718
+ /** 현재 표시용 시 (12h 모드면 1-12) */
719
+ displayHour: number;
720
+ /** 현재 AM/PM (12h 모드 전용, 24h면 null) */
721
+ period: 'AM' | 'PM' | null;
722
+ /** 고유 ID */
723
+ pickerId: string;
724
+ }
725
+ /**
726
+ * TimePicker 상태 관리 Hook.
727
+ * 컴포넌트 없이 완전 커스텀 UI를 구현할 때 사용한다.
728
+ *
729
+ * @example
730
+ * ```tsx
731
+ * function MyTimePicker() {
732
+ * const {
733
+ * currentTime, displayHour, period,
734
+ * availableHours, availableMinutes,
735
+ * setHour, setMinute, setPeriod,
736
+ * } = useTimePicker({ format: '12h', step: 15 });
737
+ * // displayHour = 1-12, period = "AM" | "PM"
738
+ * // availableMinutes = [0, 15, 30, 45]
739
+ * }
740
+ * ```
741
+ */
742
+ declare function useTimePicker(options?: UseTimePickerOptions): UseTimePickerReturn;
743
+
744
+ export { DatePicker, type DatePickerCalendarClassNames, type DatePickerCalendarProps, type DatePickerInputProps, type DatePickerMonthGridClassNames, type DatePickerMonthGridProps, type DatePickerPopoverProps, type DatePickerRootProps, type DatePickerTriggerProps, type DatePickerYearGridClassNames, type DatePickerYearGridProps, DateTimePicker, type DateTimePickerInputProps, type DateTimePickerRootProps, type PresetKey, type RangeInputPart, RangePicker, type RangePickerCalendarClassNames, type RangePickerCalendarProps, type RangePickerInputProps, type RangePickerPopoverProps, type RangePickerPresetProps, type RangePickerPresetsClassNames, type RangePickerPresetsProps, type RangePickerRootProps, TimePicker, type TimePickerAmPmToggleClassNames, type TimePickerAmPmToggleProps, type TimePickerHourListClassNames, type TimePickerHourListProps, type TimePickerInputProps, type TimePickerMinuteListClassNames, type TimePickerMinuteListProps, type TimePickerRootProps, type UseDatePickerOptions, type UseDatePickerReturn, type UseRangePickerOptions, type UseRangePickerReturn, type UseTimePickerOptions, type UseTimePickerReturn, useDatePicker, useRangePicker, useTimePicker };