@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,55 @@
1
+ import { DateTimePickerRoot } from './Root.js';
2
+ import { DatePickerPopover } from '../DatePicker/Popover.js';
3
+ import { DatePickerCalendar } from '../DatePicker/Calendar.js';
4
+ import { DatePickerMonthGrid } from '../DatePicker/MonthGrid.js';
5
+ import { DatePickerYearGrid } from '../DatePicker/YearGrid.js';
6
+ import { TimePickerHourList } from '../TimePicker/HourList.js';
7
+ import { TimePickerMinuteList } from '../TimePicker/MinuteList.js';
8
+ import { TimePickerAmPmToggle } from '../TimePicker/AmPmToggle.js';
9
+ import type { DateTimePickerRootProps } from './Root.js';
10
+ import type { DateTimePickerInputProps } from './Input.js';
11
+ /**
12
+ * DateTimePicker — 날짜와 시간을 함께 선택하는 통합 컴포넌트.
13
+ *
14
+ * 단일 ISO datetime을 source of truth로 관리하며, 내부적으로
15
+ * DatePickerContext와 TimePickerContext를 동시에 제공한다.
16
+ * 따라서 DatePicker.Calendar, TimePicker.HourList 등 기존 컴포넌트가
17
+ * 그대로 동작한다.
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * <DateTimePicker value={dt} onChange={setDt} format="24h" step={15}>
22
+ * <DateTimePicker.Input />
23
+ * <DateTimePicker.Popover>
24
+ * <DateTimePicker.Calendar />
25
+ * <DateTimePicker.HourList />
26
+ * <DateTimePicker.MinuteList />
27
+ * </DateTimePicker.Popover>
28
+ * </DateTimePicker>
29
+ * ```
30
+ *
31
+ * @example 12시간제 모드
32
+ * ```tsx
33
+ * <DateTimePicker value={dt} onChange={setDt} format="12h" step={15}>
34
+ * <DateTimePicker.Input />
35
+ * <DateTimePicker.Popover>
36
+ * <DateTimePicker.Calendar />
37
+ * <DateTimePicker.HourList />
38
+ * <DateTimePicker.MinuteList />
39
+ * <DateTimePicker.AmPmToggle />
40
+ * </DateTimePicker.Popover>
41
+ * </DateTimePicker>
42
+ * ```
43
+ */
44
+ export declare const DateTimePicker: typeof DateTimePickerRoot & {
45
+ Input: import("react").ForwardRefExoticComponent<DateTimePickerInputProps & import("react").RefAttributes<HTMLInputElement>>;
46
+ Popover: typeof DatePickerPopover;
47
+ Calendar: typeof DatePickerCalendar;
48
+ MonthGrid: typeof DatePickerMonthGrid;
49
+ YearGrid: typeof DatePickerYearGrid;
50
+ HourList: typeof TimePickerHourList;
51
+ MinuteList: typeof TimePickerMinuteList;
52
+ AmPmToggle: typeof TimePickerAmPmToggle;
53
+ };
54
+ export type { DateTimePickerRootProps, DateTimePickerInputProps };
55
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DateTimePicker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAI/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,cAAc;;;;;;;;;CASzB,CAAC;AAEH,YAAY,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { DateTimePickerRoot } from './Root.js';
2
+ import { DateTimePickerInput } from './Input.js';
3
+ // 재사용: DatePicker 하위 컴포넌트 (DatePickerContext 소비)
4
+ import { DatePickerPopover } from '../DatePicker/Popover.js';
5
+ import { DatePickerCalendar } from '../DatePicker/Calendar.js';
6
+ import { DatePickerMonthGrid } from '../DatePicker/MonthGrid.js';
7
+ import { DatePickerYearGrid } from '../DatePicker/YearGrid.js';
8
+ // 재사용: TimePicker 하위 컴포넌트 (TimePickerContext 소비)
9
+ import { TimePickerHourList } from '../TimePicker/HourList.js';
10
+ import { TimePickerMinuteList } from '../TimePicker/MinuteList.js';
11
+ import { TimePickerAmPmToggle } from '../TimePicker/AmPmToggle.js';
12
+ /**
13
+ * DateTimePicker — 날짜와 시간을 함께 선택하는 통합 컴포넌트.
14
+ *
15
+ * 단일 ISO datetime을 source of truth로 관리하며, 내부적으로
16
+ * DatePickerContext와 TimePickerContext를 동시에 제공한다.
17
+ * 따라서 DatePicker.Calendar, TimePicker.HourList 등 기존 컴포넌트가
18
+ * 그대로 동작한다.
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * <DateTimePicker value={dt} onChange={setDt} format="24h" step={15}>
23
+ * <DateTimePicker.Input />
24
+ * <DateTimePicker.Popover>
25
+ * <DateTimePicker.Calendar />
26
+ * <DateTimePicker.HourList />
27
+ * <DateTimePicker.MinuteList />
28
+ * </DateTimePicker.Popover>
29
+ * </DateTimePicker>
30
+ * ```
31
+ *
32
+ * @example 12시간제 모드
33
+ * ```tsx
34
+ * <DateTimePicker value={dt} onChange={setDt} format="12h" step={15}>
35
+ * <DateTimePicker.Input />
36
+ * <DateTimePicker.Popover>
37
+ * <DateTimePicker.Calendar />
38
+ * <DateTimePicker.HourList />
39
+ * <DateTimePicker.MinuteList />
40
+ * <DateTimePicker.AmPmToggle />
41
+ * </DateTimePicker.Popover>
42
+ * </DateTimePicker>
43
+ * ```
44
+ */
45
+ export const DateTimePicker = Object.assign(DateTimePickerRoot, {
46
+ Input: DateTimePickerInput,
47
+ Popover: DatePickerPopover,
48
+ Calendar: DatePickerCalendar,
49
+ MonthGrid: DatePickerMonthGrid,
50
+ YearGrid: DatePickerYearGrid,
51
+ HourList: TimePickerHourList,
52
+ MinuteList: TimePickerMinuteList,
53
+ AmPmToggle: TimePickerAmPmToggle,
54
+ });
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/DateTimePicker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,iDAAiD;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,iDAAiD;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAKnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE;IAC9D,KAAK,EAAE,mBAAmB;IAC1B,OAAO,EAAE,iBAAiB;IAC1B,QAAQ,EAAE,kBAAkB;IAC5B,SAAS,EAAE,mBAAmB;IAC9B,QAAQ,EAAE,kBAAkB;IAC5B,QAAQ,EAAE,kBAAkB;IAC5B,UAAU,EAAE,oBAAoB;IAChC,UAAU,EAAE,oBAAoB;CACjC,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export interface RangePickerCalendarClassNames {
3
+ root?: string;
4
+ header?: string;
5
+ title?: string;
6
+ navButton?: string;
7
+ grid?: string;
8
+ gridRow?: string;
9
+ gridCell?: string;
10
+ day?: string;
11
+ daySelected?: string;
12
+ dayToday?: string;
13
+ dayDisabled?: string;
14
+ dayOutsideMonth?: string;
15
+ dayRangeStart?: string;
16
+ dayRangeEnd?: string;
17
+ dayInRange?: string;
18
+ weekdayHeader?: string;
19
+ }
20
+ export interface RangePickerCalendarProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {
21
+ classNames?: RangePickerCalendarClassNames;
22
+ }
23
+ export declare function RangePickerCalendar({ classNames, ...props }: RangePickerCalendarProps): import("react/jsx-runtime").JSX.Element;
24
+ //# sourceMappingURL=Calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../src/components/RangePicker/Calendar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAK5C,MAAM,WAAW,6BAA6B;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAC5F,UAAU,CAAC,EAAE,6BAA6B,CAAC;CAC5C;AAcD,wBAAgB,mBAAmB,CAAC,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,EAAE,wBAAwB,2CAkPrF"}
@@ -0,0 +1,134 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef, useState } from 'react';
3
+ import { getCalendarDays, isDateDisabled, getWeekdayNames, formatMonthYear, formatFullDate } from '@kalyx/core';
4
+ import { useRangePickerContext } from '../../context/RangePickerContext.js';
5
+ const srOnly = {
6
+ position: 'absolute',
7
+ width: '1px',
8
+ height: '1px',
9
+ padding: 0,
10
+ margin: '-1px',
11
+ overflow: 'hidden',
12
+ clip: 'rect(0, 0, 0, 0)',
13
+ whiteSpace: 'nowrap',
14
+ border: 0,
15
+ };
16
+ export function RangePickerCalendar({ classNames, ...props }) {
17
+ const ctx = useRangePickerContext('RangePicker.Calendar');
18
+ const gridRef = useRef(null);
19
+ const [announcement, setAnnouncement] = useState('');
20
+ const { adapter, viewMonth, focusedDate, weekStartsOn, disabled, value, hoverDate, selectingTarget, } = ctx;
21
+ const { locale } = ctx;
22
+ const weekdays = getWeekdayNames(locale, weekStartsOn);
23
+ const weeks = getCalendarDays(viewMonth, adapter, {
24
+ weekStartsOn,
25
+ focusedDate,
26
+ disabled,
27
+ range: value,
28
+ rangeHover: hoverDate,
29
+ });
30
+ const year = adapter.getYear(viewMonth);
31
+ const month = adapter.getMonth(viewMonth);
32
+ const title = formatMonthYear(year, month, locale);
33
+ // 포커스된 날짜 셀에 포커스 이동
34
+ useEffect(() => {
35
+ if (!ctx.isOpen || !gridRef.current)
36
+ return;
37
+ const focusedButton = gridRef.current.querySelector('[data-focused="true"]');
38
+ focusedButton?.focus();
39
+ }, [focusedDate, ctx.isOpen]);
40
+ const navigateMonth = useCallback((direction) => {
41
+ const newMonth = adapter.addMonths(viewMonth, direction);
42
+ ctx.setViewMonth(newMonth);
43
+ ctx.setFocusedDate(adapter.startOfMonth(newMonth));
44
+ const y = adapter.getYear(newMonth);
45
+ const m = adapter.getMonth(newMonth);
46
+ setAnnouncement(formatMonthYear(y, m, locale));
47
+ }, [adapter, viewMonth, ctx, locale]);
48
+ const handleDayClick = useCallback((day) => {
49
+ if (day.isDisabled)
50
+ return;
51
+ ctx.selectDate(day.isoString);
52
+ setAnnouncement(formatFullDate(day.isoString, locale));
53
+ }, [ctx, locale]);
54
+ const handleDayMouseEnter = useCallback((day) => {
55
+ if (selectingTarget === 'end' && value.start && !day.isDisabled) {
56
+ ctx.setHoverDate(day.isoString);
57
+ }
58
+ }, [selectingTarget, value.start, ctx]);
59
+ const handleMouseLeave = useCallback(() => {
60
+ ctx.setHoverDate(null);
61
+ }, [ctx]);
62
+ const handleKeyDown = useCallback((e) => {
63
+ let newFocused = null;
64
+ switch (e.key) {
65
+ case 'ArrowLeft':
66
+ newFocused = adapter.addDays(focusedDate, -1);
67
+ break;
68
+ case 'ArrowRight':
69
+ newFocused = adapter.addDays(focusedDate, 1);
70
+ break;
71
+ case 'ArrowUp':
72
+ newFocused = adapter.addDays(focusedDate, -7);
73
+ break;
74
+ case 'ArrowDown':
75
+ newFocused = adapter.addDays(focusedDate, 7);
76
+ break;
77
+ case 'PageUp':
78
+ newFocused = e.shiftKey
79
+ ? adapter.addYears(focusedDate, -1)
80
+ : adapter.addMonths(focusedDate, -1);
81
+ break;
82
+ case 'PageDown':
83
+ newFocused = e.shiftKey
84
+ ? adapter.addYears(focusedDate, 1)
85
+ : adapter.addMonths(focusedDate, 1);
86
+ break;
87
+ case 'Home':
88
+ newFocused = adapter.startOfWeek(focusedDate, weekStartsOn);
89
+ break;
90
+ case 'End':
91
+ newFocused = adapter.startOfDay(adapter.endOfWeek(focusedDate, weekStartsOn));
92
+ break;
93
+ case 'Enter':
94
+ case ' ':
95
+ e.preventDefault();
96
+ if (!isDateDisabled(focusedDate, disabled, adapter)) {
97
+ ctx.selectDate(focusedDate);
98
+ }
99
+ return;
100
+ case 'Escape':
101
+ ctx.close();
102
+ return;
103
+ default:
104
+ return;
105
+ }
106
+ if (newFocused) {
107
+ e.preventDefault();
108
+ ctx.setFocusedDate(newFocused);
109
+ if (!adapter.isSameMonth(newFocused, viewMonth)) {
110
+ ctx.setViewMonth(newFocused);
111
+ }
112
+ // 키보드로 이동 중에도 hover 미리보기를 유지
113
+ if (selectingTarget === 'end' && value.start) {
114
+ ctx.setHoverDate(newFocused);
115
+ }
116
+ }
117
+ }, [adapter, focusedDate, viewMonth, weekStartsOn, disabled, ctx, selectingTarget, value.start]);
118
+ return (_jsxs("div", { className: classNames?.root, ...props, onMouseLeave: handleMouseLeave, children: [_jsxs("div", { className: classNames?.header, children: [_jsx("button", { type: "button", className: classNames?.navButton, onClick: () => navigateMonth(-1), "aria-label": "\uC774\uC804 \uB2EC", children: "<" }), _jsx("span", { className: classNames?.title, "aria-live": "polite", children: title }), _jsx("button", { type: "button", className: classNames?.navButton, onClick: () => navigateMonth(1), "aria-label": "\uB2E4\uC74C \uB2EC", children: ">" })] }), _jsxs("table", { ref: gridRef, role: "grid", "aria-label": title, "aria-multiselectable": "true", className: classNames?.grid, onKeyDown: handleKeyDown, children: [_jsx("thead", { children: _jsx("tr", { role: "row", children: weekdays.map((day) => (_jsx("th", { role: "columnheader", abbr: day.full, scope: "col", className: classNames?.weekdayHeader, children: day.short }, day.short))) }) }), _jsx("tbody", { children: weeks.map((week, weekIndex) => (_jsx("tr", { role: "row", className: classNames?.gridRow, children: week.map((day) => {
119
+ const dayClasses = [
120
+ classNames?.day,
121
+ day.isRangeStart && classNames?.dayRangeStart,
122
+ day.isRangeEnd && classNames?.dayRangeEnd,
123
+ day.isInRange && classNames?.dayInRange,
124
+ day.isToday && classNames?.dayToday,
125
+ day.isDisabled && classNames?.dayDisabled,
126
+ !day.isCurrentMonth && classNames?.dayOutsideMonth,
127
+ ]
128
+ .filter(Boolean)
129
+ .join(' ') || undefined;
130
+ const isSelected = day.isRangeStart || day.isRangeEnd;
131
+ return (_jsx("td", { role: "gridcell", "aria-selected": isSelected || undefined, "aria-disabled": day.isDisabled || undefined, "aria-current": day.isToday ? 'date' : undefined, className: classNames?.gridCell, children: _jsx("button", { type: "button", tabIndex: day.isFocused ? 0 : -1, disabled: day.isDisabled, "data-focused": day.isFocused || undefined, "data-range-start": day.isRangeStart || undefined, "data-range-end": day.isRangeEnd || undefined, "data-in-range": day.isInRange || undefined, "data-today": day.isToday || undefined, "data-outside-month": !day.isCurrentMonth || undefined, className: dayClasses, onClick: () => handleDayClick(day), onMouseEnter: () => handleDayMouseEnter(day), "aria-label": formatFullDate(day.isoString, locale), children: day.dayNumber }) }, day.isoString));
132
+ }) }, weekIndex))) })] }), _jsx("div", { role: "status", "aria-live": "polite", "aria-atomic": "true", style: srOnly, children: announcement })] }));
133
+ }
134
+ //# sourceMappingURL=Calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Calendar.js","sourceRoot":"","sources":["../../../src/components/RangePicker/Calendar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { InputHTMLAttributes } from 'react';
2
+ export type RangeInputPart = 'start' | 'end';
3
+ export interface RangePickerInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'> {
4
+ /** 어떤 부분의 입력인지 (start | end) */
5
+ part: RangeInputPart;
6
+ /** 날짜 표시 포맷 (기본: 부모의 displayFormat) */
7
+ format?: string;
8
+ }
9
+ /**
10
+ * RangePicker.Input — 시작일/종료일을 위한 별도 input.
11
+ * `part="start"`와 `part="end"` 두 개를 함께 사용한다.
12
+ */
13
+ export declare const RangePickerInput: import("react").ForwardRefExoticComponent<RangePickerInputProps & import("react").RefAttributes<HTMLInputElement>>;
14
+ //# sourceMappingURL=Input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/components/RangePicker/Input.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAGjD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,KAAK,CAAC;AAE7C,MAAM,WAAW,qBACf,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IAClF,gCAAgC;IAChC,IAAI,EAAE,cAAc,CAAC;IACrB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,oHAyD5B,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef, useCallback } from 'react';
3
+ import { useRangePickerContext } from '../../context/RangePickerContext.js';
4
+ /**
5
+ * RangePicker.Input — 시작일/종료일을 위한 별도 input.
6
+ * `part="start"`와 `part="end"` 두 개를 함께 사용한다.
7
+ */
8
+ export const RangePickerInput = forwardRef(function RangePickerInput({ part, format: formatProp, onFocus, onKeyDown, ...props }, ref) {
9
+ const ctx = useRangePickerContext('RangePicker.Input');
10
+ const displayFormat = formatProp ?? ctx.displayFormat;
11
+ const value = ctx.value[part];
12
+ const displayValue = value ? ctx.adapter.format(value, displayFormat) : '';
13
+ const handleFocus = useCallback((e) => {
14
+ ctx.open();
15
+ onFocus?.(e);
16
+ }, [ctx, onFocus]);
17
+ const handleKeyDown = useCallback((e) => {
18
+ if (e.key === 'Escape') {
19
+ ctx.close();
20
+ }
21
+ else if (e.key === 'ArrowDown' && !ctx.isOpen) {
22
+ e.preventDefault();
23
+ ctx.open();
24
+ }
25
+ onKeyDown?.(e);
26
+ }, [ctx, onKeyDown]);
27
+ const calendarId = `${ctx.pickerId}-calendar`;
28
+ return (_jsx("input", { ref: (node) => {
29
+ // 첫 번째 Input(start)을 reference로 사용
30
+ if (part === 'start' && node)
31
+ ctx.referenceRef.current = node;
32
+ if (typeof ref === 'function')
33
+ ref(node);
34
+ else if (ref)
35
+ ref.current = node;
36
+ }, type: "text", role: "combobox", readOnly: true, "aria-expanded": ctx.isOpen, "aria-haspopup": "dialog", "aria-controls": ctx.isOpen ? calendarId : undefined, "aria-autocomplete": "none", "aria-label": part === 'start' ? '시작일' : '종료일', autoComplete: "off", value: displayValue, disabled: ctx.isDisabled || props.disabled, onFocus: handleFocus, onKeyDown: handleKeyDown, "data-part": part, ...props }));
37
+ });
38
+ //# sourceMappingURL=Input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Input.js","sourceRoot":"","sources":["../../../src/components/RangePicker/Input.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAY5E;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CACxC,SAAS,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG;IACvF,MAAM,GAAG,GAAG,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,UAAU,IAAI,GAAG,CAAC,aAAa,CAAC;IAEtD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3E,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,CAAqC,EAAE,EAAE;QACxC,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACf,CAAC,EACD,CAAC,GAAG,EAAE,OAAO,CAAC,CACf,CAAC;IAEF,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,CAAwC,EAAE,EAAE;QAC3C,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACvB,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,CAAC;aAAM,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChD,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,CAAC;QACD,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,EACD,CAAC,GAAG,EAAE,SAAS,CAAC,CACjB,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,GAAG,CAAC,QAAQ,WAAW,CAAC;IAE9C,OAAO,CACL,gBACE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YACZ,mCAAmC;YACnC,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI;gBAAE,GAAG,CAAC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;YAC9D,IAAI,OAAO,GAAG,KAAK,UAAU;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC;iBACpC,IAAI,GAAG;gBAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;QACnC,CAAC,EACD,IAAI,EAAC,MAAM,EACX,IAAI,EAAC,UAAU,EACf,QAAQ,yBACO,GAAG,CAAC,MAAM,mBACX,QAAQ,mBACP,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,uBAChC,MAAM,gBACZ,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAC5C,YAAY,EAAC,KAAK,EAClB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,GAAG,CAAC,UAAU,IAAI,KAAK,CAAC,QAAQ,EAC1C,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,aAAa,eACb,IAAI,KACX,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ export interface RangePickerPopoverProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {
3
+ children?: ReactNode;
4
+ }
5
+ export declare function RangePickerPopover({ children, ...props }: RangePickerPopoverProps): import("react/jsx-runtime").JSX.Element | null;
6
+ //# sourceMappingURL=Popover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../../src/components/RangePicker/Popover.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUvD,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAC3F,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,uBAAuB,kDAsFjF"}
@@ -0,0 +1,71 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from 'react';
3
+ import { useFloating, autoUpdate, offset, flip, shift, } from '@floating-ui/react';
4
+ import { useRangePickerContext } from '../../context/RangePickerContext.js';
5
+ export function RangePickerPopover({ children, ...props }) {
6
+ const ctx = useRangePickerContext('RangePicker.Popover');
7
+ const calendarId = `${ctx.pickerId}-calendar`;
8
+ const floatingRef = useRef(null);
9
+ const { refs, floatingStyles } = useFloating({
10
+ open: ctx.isOpen,
11
+ placement: 'bottom-start',
12
+ middleware: [offset(4), flip(), shift({ padding: 8 })],
13
+ whileElementsMounted: autoUpdate,
14
+ });
15
+ // Context의 referenceRef를 Floating UI에 연결
16
+ useEffect(() => {
17
+ if (ctx.referenceRef.current) {
18
+ refs.setReference(ctx.referenceRef.current);
19
+ }
20
+ }, [ctx.referenceRef, refs, ctx.isOpen]);
21
+ // 포커스 복원
22
+ const previousFocusRef = useRef(null);
23
+ useEffect(() => {
24
+ if (ctx.isOpen) {
25
+ previousFocusRef.current = document.activeElement;
26
+ }
27
+ else if (previousFocusRef.current) {
28
+ previousFocusRef.current.focus();
29
+ previousFocusRef.current = null;
30
+ }
31
+ }, [ctx.isOpen]);
32
+ // 바깥 클릭 감지
33
+ useEffect(() => {
34
+ if (!ctx.isOpen)
35
+ return;
36
+ function handleClickOutside(e) {
37
+ const floating = floatingRef.current;
38
+ const reference = ctx.referenceRef.current;
39
+ const target = e.target;
40
+ if (floating && !floating.contains(target) && (!reference || !reference.contains(target))) {
41
+ ctx.close();
42
+ }
43
+ }
44
+ const timer = setTimeout(() => {
45
+ document.addEventListener('mousedown', handleClickOutside);
46
+ }, 0);
47
+ return () => {
48
+ clearTimeout(timer);
49
+ document.removeEventListener('mousedown', handleClickOutside);
50
+ };
51
+ }, [ctx.isOpen, ctx]);
52
+ // Escape 키
53
+ useEffect(() => {
54
+ if (!ctx.isOpen)
55
+ return;
56
+ function handleKeyDown(e) {
57
+ if (e.key === 'Escape') {
58
+ ctx.close();
59
+ }
60
+ }
61
+ document.addEventListener('keydown', handleKeyDown);
62
+ return () => document.removeEventListener('keydown', handleKeyDown);
63
+ }, [ctx.isOpen, ctx]);
64
+ if (!ctx.isOpen)
65
+ return null;
66
+ return (_jsx("div", { ref: (node) => {
67
+ floatingRef.current = node;
68
+ refs.setFloating(node);
69
+ }, id: calendarId, role: "dialog", "aria-label": "\uB0A0\uC9DC \uBC94\uC704 \uC120\uD0DD", "aria-modal": "false", style: floatingStyles, ...props, children: children }));
70
+ }
71
+ //# sourceMappingURL=Popover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popover.js","sourceRoot":"","sources":["../../../src/components/RangePicker/Popover.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EACL,WAAW,EACX,UAAU,EACV,MAAM,EACN,IAAI,EACJ,KAAK,GACN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAM5E,MAAM,UAAU,kBAAkB,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAA2B;IAChF,MAAM,GAAG,GAAG,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,GAAG,GAAG,CAAC,QAAQ,WAAW,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAExD,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,WAAW,CAAC;QAC3C,IAAI,EAAE,GAAG,CAAC,MAAM;QAChB,SAAS,EAAE,cAAc;QACzB,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACtD,oBAAoB,EAAE,UAAU;KACjC,CAAC,CAAC;IAEH,yCAAyC;IACzC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzC,SAAS;IACT,MAAM,gBAAgB,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IAE1D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,gBAAgB,CAAC,OAAO,GAAG,QAAQ,CAAC,aAA4B,CAAC;QACnE,CAAC;aAAM,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;YACpC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;QAClC,CAAC;IACH,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjB,WAAW;IACX,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO;QAExB,SAAS,kBAAkB,CAAC,CAAa;YACvC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC;YACrC,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC;YAC3C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAc,CAAC;YAChC,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC1F,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC7D,CAAC,EAAE,CAAC,CAAC,CAAC;QAEN,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAChE,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAEtB,WAAW;IACX,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO;QAExB,SAAS,aAAa,CAAC,CAAgB;YACrC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvB,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACpD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACtE,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAEtB,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAE7B,OAAO,CACL,cACE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YACZ,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,EACD,EAAE,EAAE,UAAU,EACd,IAAI,EAAC,QAAQ,gBACF,wCAAU,gBACV,OAAO,EAClB,KAAK,EAAE,cAAc,KACjB,KAAK,YAER,QAAQ,GACL,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ import type { DateRange } from '@kalyx/core';
3
+ /** 미리 정의된 프리셋 키. 커스텀 범위도 가능. */
4
+ export type PresetKey = 'today' | 'yesterday' | 'last7days' | 'last30days' | 'thisWeek' | 'lastWeek' | 'thisMonth' | 'lastMonth' | 'thisYear';
5
+ export interface RangePickerPresetsClassNames {
6
+ root?: string;
7
+ preset?: string;
8
+ presetActive?: string;
9
+ }
10
+ export interface RangePickerPresetsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {
11
+ classNames?: RangePickerPresetsClassNames;
12
+ children?: ReactNode;
13
+ }
14
+ /**
15
+ * RangePicker.Presets — 프리셋 버튼들을 감싸는 컨테이너.
16
+ * 내부에 `RangePicker.Preset` 버튼들을 배치한다.
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * <RangePicker.Presets>
21
+ * <RangePicker.Preset value="last7days">Last 7 days</RangePicker.Preset>
22
+ * <RangePicker.Preset value="thisMonth">This month</RangePicker.Preset>
23
+ * </RangePicker.Presets>
24
+ * ```
25
+ */
26
+ export declare function RangePickerPresets({ classNames, children, ...props }: RangePickerPresetsProps): import("react/jsx-runtime").JSX.Element;
27
+ export interface RangePickerPresetProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'value'> {
28
+ /** 미리 정의된 프리셋 키 또는 직접 range 전달 시 생략 */
29
+ value?: PresetKey;
30
+ /** 직접 범위를 지정할 때 사용 (value 대신) */
31
+ range?: DateRange;
32
+ children: ReactNode;
33
+ className?: string;
34
+ }
35
+ /**
36
+ * RangePicker.Preset — 한 클릭으로 날짜 범위를 선택하는 프리셋 버튼.
37
+ *
38
+ * `value` (프리셋 키) 또는 `range` (직접 범위)를 전달한다.
39
+ *
40
+ * @example
41
+ * ```tsx
42
+ * <RangePicker.Preset value="last7days">Last 7 days</RangePicker.Preset>
43
+ * <RangePicker.Preset range={{ start: "2026-01-01T...", end: "2026-03-31T..." }}>
44
+ * Q1 2026
45
+ * </RangePicker.Preset>
46
+ * ```
47
+ */
48
+ export declare function RangePickerPreset({ value: presetKey, range: directRange, children, onClick, ...props }: RangePickerPresetProps): import("react/jsx-runtime").JSX.Element;
49
+ //# sourceMappingURL=Presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Presets.d.ts","sourceRoot":"","sources":["../../../src/components/RangePicker/Presets.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,aAAa,CAAC;AAG5D,gCAAgC;AAChC,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,WAAW,GACX,WAAW,GACX,YAAY,GACZ,UAAU,GACV,UAAU,GACV,WAAW,GACX,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,WAAW,4BAA4B;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAC3F,UAAU,CAAC,EAAE,4BAA4B,CAAC;IAC1C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,uBAAuB,2CAM7F;AAED,MAAM,WAAW,sBACf,SAAQ,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACxD,uCAAuC;IACvC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,iCAAiC;IACjC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkDD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,WAAW,EAClB,QAAQ,EACR,OAAO,EACP,GAAG,KAAK,EACT,EAAE,sBAAsB,2CAuDxB"}
@@ -0,0 +1,117 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback } from 'react';
3
+ import { useRangePickerContext } from '../../context/RangePickerContext.js';
4
+ /**
5
+ * RangePicker.Presets — 프리셋 버튼들을 감싸는 컨테이너.
6
+ * 내부에 `RangePicker.Preset` 버튼들을 배치한다.
7
+ *
8
+ * @example
9
+ * ```tsx
10
+ * <RangePicker.Presets>
11
+ * <RangePicker.Preset value="last7days">Last 7 days</RangePicker.Preset>
12
+ * <RangePicker.Preset value="thisMonth">This month</RangePicker.Preset>
13
+ * </RangePicker.Presets>
14
+ * ```
15
+ */
16
+ export function RangePickerPresets({ classNames, children, ...props }) {
17
+ return (_jsx("div", { role: "group", "aria-label": "\uB0A0\uC9DC \uBC94\uC704 \uD504\uB9AC\uC14B", className: classNames?.root, ...props, children: children }));
18
+ }
19
+ /**
20
+ * 미리 정의된 프리셋 키를 실제 DateRange로 변환한다.
21
+ */
22
+ function resolvePreset(key, today, adapter) {
23
+ switch (key) {
24
+ case 'today':
25
+ return { start: today, end: today };
26
+ case 'yesterday': {
27
+ const yesterday = adapter.addDays(today, -1);
28
+ return { start: yesterday, end: yesterday };
29
+ }
30
+ case 'last7days':
31
+ return { start: adapter.addDays(today, -6), end: today };
32
+ case 'last30days':
33
+ return { start: adapter.addDays(today, -29), end: today };
34
+ case 'thisWeek':
35
+ return {
36
+ start: adapter.startOfDay(adapter.startOfWeek(today)),
37
+ end: adapter.startOfDay(adapter.endOfWeek(today)),
38
+ };
39
+ case 'lastWeek': {
40
+ const prevWeek = adapter.addDays(today, -7);
41
+ return {
42
+ start: adapter.startOfDay(adapter.startOfWeek(prevWeek)),
43
+ end: adapter.startOfDay(adapter.endOfWeek(prevWeek)),
44
+ };
45
+ }
46
+ case 'thisMonth':
47
+ return {
48
+ start: adapter.startOfMonth(today),
49
+ end: adapter.startOfDay(adapter.endOfMonth(today)),
50
+ };
51
+ case 'lastMonth': {
52
+ const prevMonth = adapter.addMonths(today, -1);
53
+ return {
54
+ start: adapter.startOfMonth(prevMonth),
55
+ end: adapter.startOfDay(adapter.endOfMonth(prevMonth)),
56
+ };
57
+ }
58
+ case 'thisYear': {
59
+ const yearStart = adapter.startOfMonth(adapter.addMonths(today, -(new Date(today).getUTCMonth())));
60
+ return { start: yearStart, end: today };
61
+ }
62
+ }
63
+ }
64
+ /**
65
+ * RangePicker.Preset — 한 클릭으로 날짜 범위를 선택하는 프리셋 버튼.
66
+ *
67
+ * `value` (프리셋 키) 또는 `range` (직접 범위)를 전달한다.
68
+ *
69
+ * @example
70
+ * ```tsx
71
+ * <RangePicker.Preset value="last7days">Last 7 days</RangePicker.Preset>
72
+ * <RangePicker.Preset range={{ start: "2026-01-01T...", end: "2026-03-31T..." }}>
73
+ * Q1 2026
74
+ * </RangePicker.Preset>
75
+ * ```
76
+ */
77
+ export function RangePickerPreset({ value: presetKey, range: directRange, children, onClick, ...props }) {
78
+ const ctx = useRangePickerContext('RangePicker.Preset');
79
+ const handleClick = useCallback((e) => {
80
+ if (ctx.isDisabled || ctx.isReadOnly)
81
+ return;
82
+ let resolved;
83
+ if (directRange) {
84
+ resolved = directRange;
85
+ }
86
+ else if (presetKey) {
87
+ resolved = resolvePreset(presetKey, ctx.adapter.today(), ctx.adapter);
88
+ }
89
+ else {
90
+ return;
91
+ }
92
+ ctx.setRange(resolved);
93
+ ctx.close();
94
+ onClick?.(e);
95
+ }, [ctx, presetKey, directRange, onClick]);
96
+ // 현재 선택된 범위와 프리셋이 일치하는지 확인
97
+ const isActive = (() => {
98
+ if (!ctx.value.start || !ctx.value.end)
99
+ return false;
100
+ let target;
101
+ if (directRange) {
102
+ target = directRange;
103
+ }
104
+ else if (presetKey) {
105
+ target = resolvePreset(presetKey, ctx.adapter.today(), ctx.adapter);
106
+ }
107
+ else {
108
+ return false;
109
+ }
110
+ return (target.start !== null &&
111
+ target.end !== null &&
112
+ ctx.adapter.isSameDay(ctx.value.start, target.start) &&
113
+ ctx.adapter.isSameDay(ctx.value.end, target.end));
114
+ })();
115
+ return (_jsx("button", { type: "button", role: "option", "aria-selected": isActive, "data-active": isActive || undefined, disabled: ctx.isDisabled, onClick: handleClick, ...props, children: children }));
116
+ }
117
+ //# sourceMappingURL=Presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Presets.js","sourceRoot":"","sources":["../../../src/components/RangePicker/Presets.tsx"],"names":[],"mappings":"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"}