@kalyx/core 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.
@@ -0,0 +1,256 @@
1
+ /**
2
+ * @kalyx/core 타입 정의
3
+ *
4
+ * 모든 날짜 값은 ISO 8601 UTC string으로 표현한다.
5
+ * native Date 객체는 사용하지 않는다.
6
+ */
7
+ /** ISO 8601 UTC 날짜 문자열. 예: "2026-01-15T00:00:00.000Z" */
8
+ type ISODateString = string;
9
+ /**
10
+ * 날짜 비활성화 규칙. 여러 규칙을 배열로 조합할 수 있다.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const rules: DisabledRule[] = [
15
+ * { before: '2026-01-01T00:00:00.000Z' }, // 1월 1일 이전 비활성화
16
+ * { after: '2026-12-31T00:00:00.000Z' }, // 12월 31일 이후 비활성화
17
+ * { date: '2026-06-15T00:00:00.000Z' }, // 특정 날짜 비활성화
18
+ * { dayOfWeek: [0, 6] }, // 주말 비활성화
19
+ * ];
20
+ * ```
21
+ */
22
+ type DisabledRule = {
23
+ date: ISODateString;
24
+ } | {
25
+ before: ISODateString;
26
+ } | {
27
+ after: ISODateString;
28
+ } | {
29
+ dayOfWeek: number[];
30
+ };
31
+ /** 날짜 범위 (RangePicker) */
32
+ interface DateRange {
33
+ start: ISODateString | null;
34
+ end: ISODateString | null;
35
+ }
36
+ /** 캘린더 그리드의 하루를 표현하는 타입 */
37
+ interface CalendarDay {
38
+ /** ISO 8601 UTC string */
39
+ isoString: ISODateString;
40
+ /** 날짜 숫자 (1-31) */
41
+ dayNumber: number;
42
+ /** 현재 표시 중인 달에 속하는지 */
43
+ isCurrentMonth: boolean;
44
+ /** 오늘인지 */
45
+ isToday: boolean;
46
+ /** 선택된 날짜인지 (단일 선택) */
47
+ isSelected: boolean;
48
+ /** 비활성화 상태인지 */
49
+ isDisabled: boolean;
50
+ /** 포커스된 날짜인지 */
51
+ isFocused: boolean;
52
+ /** 범위의 시작일인지 */
53
+ isRangeStart: boolean;
54
+ /** 범위의 종료일인지 */
55
+ isRangeEnd: boolean;
56
+ /** 범위 내부 (시작과 종료 사이)인지 */
57
+ isInRange: boolean;
58
+ }
59
+ /** 캘린더 그리드: 주(week) 배열 → 일(day) 배열 */
60
+ type CalendarWeek = CalendarDay[];
61
+ type CalendarGrid = CalendarWeek[];
62
+ /**
63
+ * 날짜 라이브러리 어댑터 인터페이스.
64
+ * 모든 날짜 연산을 추상화하여 다른 라이브러리(Temporal API 등)로 교체 가능.
65
+ * 기본 구현체: {@link DateFnsAdapter}
66
+ */
67
+ interface DateAdapter {
68
+ /** 어떤 형식이든 → ISO 8601 UTC string */
69
+ parse(value: string, format?: string): string;
70
+ /** ISO string → 화면 표시용 string */
71
+ format(iso: string, formatStr: string, timezone?: string): string;
72
+ addDays(iso: string, n: number): string;
73
+ addMonths(iso: string, n: number): string;
74
+ addYears(iso: string, n: number): string;
75
+ isBefore(a: string, b: string): boolean;
76
+ isAfter(a: string, b: string): boolean;
77
+ isSameDay(a: string, b: string, timezone?: string): boolean;
78
+ isSameMonth(a: string, b: string): boolean;
79
+ startOfDay(iso: string, timezone?: string): string;
80
+ startOfMonth(iso: string): string;
81
+ endOfMonth(iso: string): string;
82
+ startOfWeek(iso: string, weekStartsOn?: 0 | 1): string;
83
+ endOfWeek(iso: string, weekStartsOn?: 0 | 1): string;
84
+ now(): string;
85
+ today(timezone?: string): string;
86
+ isValid(value: string): boolean;
87
+ getYear(iso: string): number;
88
+ getMonth(iso: string): number;
89
+ getDate(iso: string): number;
90
+ getDay(iso: string): number;
91
+ }
92
+ /** 주 시작 요일 */
93
+ type WeekStartsOn = 0 | 1;
94
+ /** 캘린더 그리드 생성 옵션 */
95
+ interface CalendarOptions {
96
+ weekStartsOn?: WeekStartsOn;
97
+ today?: ISODateString;
98
+ selected?: ISODateString | null;
99
+ focusedDate?: ISODateString;
100
+ disabled?: DisabledRule[];
101
+ /** 선택된 범위 (RangePicker) */
102
+ range?: DateRange | null;
103
+ /** 호버 중인 날짜 (RangePicker 미리보기용) */
104
+ rangeHover?: ISODateString | null;
105
+ }
106
+
107
+ /**
108
+ * date-fns 기반 DateAdapter 구현체.
109
+ * 모든 연산은 UTC 기준으로 동작하여 timezone 간섭을 방지한다.
110
+ *
111
+ * @example
112
+ * ```ts
113
+ * import { DateFnsAdapter } from '@kalyx/core';
114
+ *
115
+ * DateFnsAdapter.format('2026-01-15T00:00:00.000Z', 'yyyy-MM-dd'); // "2026-01-15"
116
+ * DateFnsAdapter.addDays('2026-01-15T00:00:00.000Z', 7); // "2026-01-22T..."
117
+ * DateFnsAdapter.isSameDay('2026-01-15T00:00:00.000Z', '2026-01-15T23:59:59.000Z'); // true
118
+ * ```
119
+ */
120
+ declare const DateFnsAdapter: DateAdapter;
121
+
122
+ /**
123
+ * 특정 월의 캘린더 그리드를 생성한다.
124
+ * 주(week) 단위로 구분된 2차원 배열(`CalendarGrid`)을 반환한다.
125
+ *
126
+ * @param monthISO - 표시할 월을 포함하는 ISO datetime
127
+ * @param adapter - 날짜 연산 어댑터 ({@link DateFnsAdapter})
128
+ * @param options - 주 시작 요일, 선택된 날짜, 비활성화 규칙, 범위 등
129
+ * @returns 4~6주의 캘린더 그리드. 각 주는 7개의 {@link CalendarDay} 배열.
130
+ *
131
+ * @example
132
+ * ```ts
133
+ * const grid = getCalendarDays('2026-01-01T00:00:00.000Z', DateFnsAdapter, {
134
+ * weekStartsOn: 0,
135
+ * selected: '2026-01-15T00:00:00.000Z',
136
+ * disabled: [{ dayOfWeek: [0, 6] }],
137
+ * });
138
+ * // grid[0] = 첫째 주 (CalendarDay[7])
139
+ * // grid[0][0].dayNumber = 28 (이전 달)
140
+ * ```
141
+ */
142
+ declare function getCalendarDays(monthISO: string, adapter: DateAdapter, options?: CalendarOptions): CalendarGrid;
143
+ /**
144
+ * 주어진 날짜가 비활성화 규칙에 해당하는지 검사한다.
145
+ */
146
+ declare function isDateDisabled(iso: string, rules: DisabledRule[], adapter: DateAdapter): boolean;
147
+ /**
148
+ * 두 날짜 중 더 이른 것을 반환한다.
149
+ */
150
+ declare function minDate(a: ISODateString, b: ISODateString, adapter: DateAdapter): ISODateString;
151
+ /**
152
+ * 두 날짜 중 더 늦은 것을 반환한다.
153
+ */
154
+ declare function maxDate(a: ISODateString, b: ISODateString, adapter: DateAdapter): ISODateString;
155
+
156
+ /**
157
+ * 날짜 문자열을 ISO 8601 UTC 형식으로 정규화한다.
158
+ * "2026-01-15" → "2026-01-15T00:00:00.000Z"
159
+ */
160
+ declare function normalizeISO(value: string): string;
161
+ /**
162
+ * 사용자 입력 텍스트를 ISO string으로 파싱한다.
163
+ * 실패 시 null을 반환한다.
164
+ */
165
+ declare function parseInputValue(input: string, format: string, adapter: DateAdapter): string | null;
166
+
167
+ /** 시간 표현 (24시간제 기준) */
168
+ interface TimeValue {
169
+ hours: number;
170
+ minutes: number;
171
+ seconds: number;
172
+ }
173
+ /**
174
+ * ISO datetime의 시간 부분을 변경한다.
175
+ * UTC 기준으로 동작한다.
176
+ */
177
+ declare function setTime(iso: ISODateString, time: Partial<TimeValue>): ISODateString;
178
+ /**
179
+ * ISO datetime에서 시간 부분만 추출한다.
180
+ */
181
+ declare function getTime(iso: ISODateString): TimeValue;
182
+ /**
183
+ * "HH:MM" 또는 "HH:MM:SS" 문자열을 TimeValue로 파싱한다.
184
+ * 잘못된 형식이면 null 반환.
185
+ */
186
+ declare function parseTimeString(input: string): TimeValue | null;
187
+ /**
188
+ * TimeValue를 "HH:MM" 또는 "HH:MM:SS" 문자열로 포맷팅한다.
189
+ */
190
+ declare function formatTimeString(time: TimeValue, withSeconds?: boolean): string;
191
+ /**
192
+ * 24시간제 → 12시간제 변환.
193
+ * 0시 → 12 AM, 12시 → 12 PM
194
+ */
195
+ declare function to12Hour(hours24: number): {
196
+ hours12: number;
197
+ period: 'AM' | 'PM';
198
+ };
199
+ /**
200
+ * 12시간제 → 24시간제 변환.
201
+ */
202
+ declare function to24Hour(hours12: number, period: 'AM' | 'PM'): number;
203
+ /**
204
+ * 시 리스트 생성 (0-23 또는 1-12)
205
+ */
206
+ declare function generateHours(format?: '12h' | '24h'): number[];
207
+ /**
208
+ * 분 리스트 생성 (step 단위)
209
+ * step=1 → [0, 1, 2, ..., 59]
210
+ * step=15 → [0, 15, 30, 45]
211
+ * step=5 → [0, 5, 10, ..., 55]
212
+ */
213
+ declare function generateMinutes(step?: number): number[];
214
+ /**
215
+ * 두 TimeValue가 동일한지 비교 (시·분·초 모두).
216
+ */
217
+ declare function isSameTime(a: TimeValue, b: TimeValue): boolean;
218
+ /**
219
+ * ISO datetime을 시간 문자열로 포맷팅 (UTC 기준).
220
+ * 어댑터를 받아서 일관성 유지.
221
+ */
222
+ declare function formatTimeFromISO(iso: ISODateString, format: 'HH:mm' | 'HH:mm:ss' | 'h:mm a' | 'h:mm:ss a', _adapter?: DateAdapter): string;
223
+
224
+ interface WeekdayInfo {
225
+ /** 짧은 이름 (예: "Su", "일") */
226
+ short: string;
227
+ /** 전체 이름 (예: "Sunday", "일요일") */
228
+ full: string;
229
+ }
230
+ /**
231
+ * Intl.DateTimeFormat으로 월 이름을 반환한다.
232
+ * @param month 0-indexed (0 = January)
233
+ * @param year 표시에만 사용 (일부 locale은 년 포함)
234
+ * @param locale BCP 47 locale string (예: "en-US", "ko-KR", "ja-JP")
235
+ */
236
+ declare function getMonthName(month: number, locale?: string): string;
237
+ /**
238
+ * "2026년 1월" 또는 "January 2026" 같은 월+년 문자열을 반환한다.
239
+ */
240
+ declare function formatMonthYear(year: number, month: number, locale?: string): string;
241
+ /**
242
+ * Intl.DateTimeFormat으로 주의 요일 이름 배열을 반환한다.
243
+ * weekStartsOn에 맞춰 정렬.
244
+ *
245
+ * @param locale BCP 47 locale string
246
+ * @param weekStartsOn 0 = Sunday, 1 = Monday
247
+ * @returns 7개의 WeekdayInfo 배열
248
+ */
249
+ declare function getWeekdayNames(locale?: string, weekStartsOn?: WeekStartsOn): WeekdayInfo[];
250
+ /**
251
+ * Intl.DateTimeFormat으로 날짜의 전체 텍스트를 반환한다 (스크린리더용).
252
+ * 예: "2026년 1월 15일 목요일"
253
+ */
254
+ declare function formatFullDate(iso: string, locale?: string): string;
255
+
256
+ export { type CalendarDay, type CalendarGrid, type CalendarOptions, type CalendarWeek, type DateAdapter, DateFnsAdapter, type DateRange, type DisabledRule, type ISODateString, type TimeValue, type WeekStartsOn, type WeekdayInfo, formatFullDate, formatMonthYear, formatTimeFromISO, formatTimeString, generateHours, generateMinutes, getCalendarDays, getMonthName, getTime, getWeekdayNames, isDateDisabled, isSameTime, maxDate, minDate, normalizeISO, parseInputValue, parseTimeString, setTime, to12Hour, to24Hour };
@@ -0,0 +1,9 @@
1
+ export type { ISODateString, DisabledRule, DateRange, CalendarDay, CalendarWeek, CalendarGrid, CalendarOptions, DateAdapter, WeekStartsOn, } from './types.js';
2
+ export { DateFnsAdapter } from './adapters/date-fns.js';
3
+ export { getCalendarDays, isDateDisabled, minDate, maxDate } from './utils/calendar.js';
4
+ export { normalizeISO, parseInputValue } from './utils/date.js';
5
+ export { setTime, getTime, parseTimeString, formatTimeString, formatTimeFromISO, to12Hour, to24Hour, generateHours, generateMinutes, isSameTime, } from './utils/time.js';
6
+ export type { TimeValue } from './utils/time.js';
7
+ export { getMonthName, formatMonthYear, getWeekdayNames, formatFullDate, } from './utils/locale.js';
8
+ export type { WeekdayInfo } from './utils/locale.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,aAAa,EACb,YAAY,EACZ,SAAS,EACT,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EACL,OAAO,EACP,OAAO,EACP,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,eAAe,EACf,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ // @kalyx/core — 플랫폼 독립 날짜 로직
2
+ // 어댑터
3
+ export { DateFnsAdapter } from './adapters/date-fns.js';
4
+ // 유틸
5
+ export { getCalendarDays, isDateDisabled, minDate, maxDate } from './utils/calendar.js';
6
+ export { normalizeISO, parseInputValue } from './utils/date.js';
7
+ export { setTime, getTime, parseTimeString, formatTimeString, formatTimeFromISO, to12Hour, to24Hour, generateHours, generateMinutes, isSameTime, } from './utils/time.js';
8
+ export { getMonthName, formatMonthYear, getWeekdayNames, formatFullDate, } from './utils/locale.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAe7B,MAAM;AACN,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,KAAK;AACL,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EACL,OAAO,EACP,OAAO,EACP,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,eAAe,EACf,UAAU,GACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,cAAc,GACf,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * @kalyx/core 타입 정의
3
+ *
4
+ * 모든 날짜 값은 ISO 8601 UTC string으로 표현한다.
5
+ * native Date 객체는 사용하지 않는다.
6
+ */
7
+ /** ISO 8601 UTC 날짜 문자열. 예: "2026-01-15T00:00:00.000Z" */
8
+ export type ISODateString = string;
9
+ /**
10
+ * 날짜 비활성화 규칙. 여러 규칙을 배열로 조합할 수 있다.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const rules: DisabledRule[] = [
15
+ * { before: '2026-01-01T00:00:00.000Z' }, // 1월 1일 이전 비활성화
16
+ * { after: '2026-12-31T00:00:00.000Z' }, // 12월 31일 이후 비활성화
17
+ * { date: '2026-06-15T00:00:00.000Z' }, // 특정 날짜 비활성화
18
+ * { dayOfWeek: [0, 6] }, // 주말 비활성화
19
+ * ];
20
+ * ```
21
+ */
22
+ export type DisabledRule = {
23
+ date: ISODateString;
24
+ } | {
25
+ before: ISODateString;
26
+ } | {
27
+ after: ISODateString;
28
+ } | {
29
+ dayOfWeek: number[];
30
+ };
31
+ /** 날짜 범위 (RangePicker) */
32
+ export interface DateRange {
33
+ start: ISODateString | null;
34
+ end: ISODateString | null;
35
+ }
36
+ /** 캘린더 그리드의 하루를 표현하는 타입 */
37
+ export interface CalendarDay {
38
+ /** ISO 8601 UTC string */
39
+ isoString: ISODateString;
40
+ /** 날짜 숫자 (1-31) */
41
+ dayNumber: number;
42
+ /** 현재 표시 중인 달에 속하는지 */
43
+ isCurrentMonth: boolean;
44
+ /** 오늘인지 */
45
+ isToday: boolean;
46
+ /** 선택된 날짜인지 (단일 선택) */
47
+ isSelected: boolean;
48
+ /** 비활성화 상태인지 */
49
+ isDisabled: boolean;
50
+ /** 포커스된 날짜인지 */
51
+ isFocused: boolean;
52
+ /** 범위의 시작일인지 */
53
+ isRangeStart: boolean;
54
+ /** 범위의 종료일인지 */
55
+ isRangeEnd: boolean;
56
+ /** 범위 내부 (시작과 종료 사이)인지 */
57
+ isInRange: boolean;
58
+ }
59
+ /** 캘린더 그리드: 주(week) 배열 → 일(day) 배열 */
60
+ export type CalendarWeek = CalendarDay[];
61
+ export type CalendarGrid = CalendarWeek[];
62
+ /**
63
+ * 날짜 라이브러리 어댑터 인터페이스.
64
+ * 모든 날짜 연산을 추상화하여 다른 라이브러리(Temporal API 등)로 교체 가능.
65
+ * 기본 구현체: {@link DateFnsAdapter}
66
+ */
67
+ export interface DateAdapter {
68
+ /** 어떤 형식이든 → ISO 8601 UTC string */
69
+ parse(value: string, format?: string): string;
70
+ /** ISO string → 화면 표시용 string */
71
+ format(iso: string, formatStr: string, timezone?: string): string;
72
+ addDays(iso: string, n: number): string;
73
+ addMonths(iso: string, n: number): string;
74
+ addYears(iso: string, n: number): string;
75
+ isBefore(a: string, b: string): boolean;
76
+ isAfter(a: string, b: string): boolean;
77
+ isSameDay(a: string, b: string, timezone?: string): boolean;
78
+ isSameMonth(a: string, b: string): boolean;
79
+ startOfDay(iso: string, timezone?: string): string;
80
+ startOfMonth(iso: string): string;
81
+ endOfMonth(iso: string): string;
82
+ startOfWeek(iso: string, weekStartsOn?: 0 | 1): string;
83
+ endOfWeek(iso: string, weekStartsOn?: 0 | 1): string;
84
+ now(): string;
85
+ today(timezone?: string): string;
86
+ isValid(value: string): boolean;
87
+ getYear(iso: string): number;
88
+ getMonth(iso: string): number;
89
+ getDate(iso: string): number;
90
+ getDay(iso: string): number;
91
+ }
92
+ /** 주 시작 요일 */
93
+ export type WeekStartsOn = 0 | 1;
94
+ /** 캘린더 그리드 생성 옵션 */
95
+ export interface CalendarOptions {
96
+ weekStartsOn?: WeekStartsOn;
97
+ today?: ISODateString;
98
+ selected?: ISODateString | null;
99
+ focusedDate?: ISODateString;
100
+ disabled?: DisabledRule[];
101
+ /** 선택된 범위 (RangePicker) */
102
+ range?: DateRange | null;
103
+ /** 호버 중인 날짜 (RangePicker 미리보기용) */
104
+ rangeHover?: ISODateString | null;
105
+ }
106
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @kalyx/core 타입 정의
3
+ *
4
+ * 모든 날짜 값은 ISO 8601 UTC string으로 표현한다.
5
+ * native Date 객체는 사용하지 않는다.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,35 @@
1
+ import type { CalendarGrid, CalendarOptions, DateAdapter, DisabledRule, ISODateString } from '../types.js';
2
+ /**
3
+ * 특정 월의 캘린더 그리드를 생성한다.
4
+ * 주(week) 단위로 구분된 2차원 배열(`CalendarGrid`)을 반환한다.
5
+ *
6
+ * @param monthISO - 표시할 월을 포함하는 ISO datetime
7
+ * @param adapter - 날짜 연산 어댑터 ({@link DateFnsAdapter})
8
+ * @param options - 주 시작 요일, 선택된 날짜, 비활성화 규칙, 범위 등
9
+ * @returns 4~6주의 캘린더 그리드. 각 주는 7개의 {@link CalendarDay} 배열.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const grid = getCalendarDays('2026-01-01T00:00:00.000Z', DateFnsAdapter, {
14
+ * weekStartsOn: 0,
15
+ * selected: '2026-01-15T00:00:00.000Z',
16
+ * disabled: [{ dayOfWeek: [0, 6] }],
17
+ * });
18
+ * // grid[0] = 첫째 주 (CalendarDay[7])
19
+ * // grid[0][0].dayNumber = 28 (이전 달)
20
+ * ```
21
+ */
22
+ export declare function getCalendarDays(monthISO: string, adapter: DateAdapter, options?: CalendarOptions): CalendarGrid;
23
+ /**
24
+ * 주어진 날짜가 비활성화 규칙에 해당하는지 검사한다.
25
+ */
26
+ export declare function isDateDisabled(iso: string, rules: DisabledRule[], adapter: DateAdapter): boolean;
27
+ /**
28
+ * 두 날짜 중 더 이른 것을 반환한다.
29
+ */
30
+ export declare function minDate(a: ISODateString, b: ISODateString, adapter: DateAdapter): ISODateString;
31
+ /**
32
+ * 두 날짜 중 더 늦은 것을 반환한다.
33
+ */
34
+ export declare function maxDate(a: ISODateString, b: ISODateString, adapter: DateAdapter): ISODateString;
35
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/utils/calendar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,YAAY,EACZ,eAAe,EACf,WAAW,EAEX,YAAY,EACZ,aAAa,EACd,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,eAAoB,GAC5B,YAAY,CA2Dd;AAwED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,EAAE,WAAW,GACnB,OAAO,CAaT;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,CAAC,EAAE,aAAa,EAChB,CAAC,EAAE,aAAa,EAChB,OAAO,EAAE,WAAW,GACnB,aAAa,CAEf;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,CAAC,EAAE,aAAa,EAChB,CAAC,EAAE,aAAa,EAChB,OAAO,EAAE,WAAW,GACnB,aAAa,CAEf"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * 특정 월의 캘린더 그리드를 생성한다.
3
+ * 주(week) 단위로 구분된 2차원 배열(`CalendarGrid`)을 반환한다.
4
+ *
5
+ * @param monthISO - 표시할 월을 포함하는 ISO datetime
6
+ * @param adapter - 날짜 연산 어댑터 ({@link DateFnsAdapter})
7
+ * @param options - 주 시작 요일, 선택된 날짜, 비활성화 규칙, 범위 등
8
+ * @returns 4~6주의 캘린더 그리드. 각 주는 7개의 {@link CalendarDay} 배열.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const grid = getCalendarDays('2026-01-01T00:00:00.000Z', DateFnsAdapter, {
13
+ * weekStartsOn: 0,
14
+ * selected: '2026-01-15T00:00:00.000Z',
15
+ * disabled: [{ dayOfWeek: [0, 6] }],
16
+ * });
17
+ * // grid[0] = 첫째 주 (CalendarDay[7])
18
+ * // grid[0][0].dayNumber = 28 (이전 달)
19
+ * ```
20
+ */
21
+ export function getCalendarDays(monthISO, adapter, options = {}) {
22
+ const { weekStartsOn = 0, today, selected, focusedDate, disabled = [], range, rangeHover, } = options;
23
+ const todayISO = today ?? adapter.today();
24
+ const monthStart = adapter.startOfMonth(monthISO);
25
+ // 캘린더 그리드의 시작: 해당 월 첫째 날이 속한 주의 시작
26
+ const gridStart = adapter.startOfWeek(monthStart, weekStartsOn);
27
+ // 범위 계산용 정규화 (start <= end 보장)
28
+ const normalizedRange = normalizeRangeForDisplay(range, rangeHover, adapter);
29
+ const weeks = [];
30
+ let current = gridStart;
31
+ // 최대 6주 (42일)
32
+ for (let week = 0; week < 6; week++) {
33
+ const days = [];
34
+ for (let day = 0; day < 7; day++) {
35
+ const isCurrentMonth = adapter.isSameMonth(current, monthISO);
36
+ const isTodayDate = adapter.isSameDay(current, todayISO);
37
+ const isSelected_ = selected ? adapter.isSameDay(current, selected) : false;
38
+ const isFocused_ = focusedDate ? adapter.isSameDay(current, focusedDate) : false;
39
+ const isDisabled_ = isDateDisabled(current, disabled, adapter);
40
+ const rangeFlags = computeRangeFlags(current, normalizedRange, adapter);
41
+ days.push({
42
+ isoString: current,
43
+ dayNumber: adapter.getDate(current),
44
+ isCurrentMonth,
45
+ isToday: isTodayDate,
46
+ isSelected: isSelected_,
47
+ isDisabled: isDisabled_,
48
+ isFocused: isFocused_,
49
+ ...rangeFlags,
50
+ });
51
+ current = adapter.addDays(current, 1);
52
+ }
53
+ weeks.push(days);
54
+ // 다음 주의 시작이 이미 다음 달이면 그리드 종료
55
+ if (!adapter.isSameMonth(current, monthISO) && week >= 3) {
56
+ break;
57
+ }
58
+ }
59
+ return weeks;
60
+ }
61
+ /**
62
+ * Range가 한 쪽만 선택된 경우 hover 날짜로 임시 범위를 만들어 표시한다.
63
+ * start > end인 경우 정렬한다.
64
+ */
65
+ function normalizeRangeForDisplay(range, hover, adapter) {
66
+ if (!range)
67
+ return { start: null, end: null };
68
+ const { start, end } = range;
69
+ // 둘 다 선택됨 → 정렬해서 반환
70
+ if (start && end) {
71
+ if (adapter.isAfter(start, end)) {
72
+ return { start: end, end: start };
73
+ }
74
+ return { start, end };
75
+ }
76
+ // 시작만 선택됨 + hover 있음 → hover까지 미리보기
77
+ if (start && !end && hover) {
78
+ if (adapter.isAfter(start, hover)) {
79
+ return { start: hover, end: start };
80
+ }
81
+ return { start, end: hover };
82
+ }
83
+ // 시작만 선택됨, hover 없음
84
+ if (start && !end) {
85
+ return { start, end: null };
86
+ }
87
+ return { start: null, end: null };
88
+ }
89
+ function computeRangeFlags(iso, range, adapter) {
90
+ const { start, end } = range;
91
+ if (!start) {
92
+ return { isRangeStart: false, isRangeEnd: false, isInRange: false };
93
+ }
94
+ const isRangeStart = adapter.isSameDay(iso, start);
95
+ if (!end) {
96
+ return { isRangeStart, isRangeEnd: false, isInRange: false };
97
+ }
98
+ const isRangeEnd = adapter.isSameDay(iso, end);
99
+ const isInRange = !isRangeStart &&
100
+ !isRangeEnd &&
101
+ adapter.isAfter(iso, start) &&
102
+ adapter.isBefore(iso, end);
103
+ return { isRangeStart, isRangeEnd, isInRange };
104
+ }
105
+ /**
106
+ * 주어진 날짜가 비활성화 규칙에 해당하는지 검사한다.
107
+ */
108
+ export function isDateDisabled(iso, rules, adapter) {
109
+ for (const rule of rules) {
110
+ if ('date' in rule) {
111
+ if (adapter.isSameDay(iso, rule.date))
112
+ return true;
113
+ }
114
+ else if ('before' in rule) {
115
+ if (adapter.isBefore(iso, rule.before))
116
+ return true;
117
+ }
118
+ else if ('after' in rule) {
119
+ if (adapter.isAfter(iso, rule.after))
120
+ return true;
121
+ }
122
+ else if ('dayOfWeek' in rule) {
123
+ if (rule.dayOfWeek.includes(adapter.getDay(iso)))
124
+ return true;
125
+ }
126
+ }
127
+ return false;
128
+ }
129
+ /**
130
+ * 두 날짜 중 더 이른 것을 반환한다.
131
+ */
132
+ export function minDate(a, b, adapter) {
133
+ return adapter.isBefore(a, b) ? a : b;
134
+ }
135
+ /**
136
+ * 두 날짜 중 더 늦은 것을 반환한다.
137
+ */
138
+ export function maxDate(a, b, adapter) {
139
+ return adapter.isAfter(a, b) ? a : b;
140
+ }
141
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../src/utils/calendar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { DateAdapter } from '../types.js';
2
+ /**
3
+ * 날짜 문자열을 ISO 8601 UTC 형식으로 정규화한다.
4
+ * "2026-01-15" → "2026-01-15T00:00:00.000Z"
5
+ */
6
+ export declare function normalizeISO(value: string): string;
7
+ /**
8
+ * 사용자 입력 텍스트를 ISO string으로 파싱한다.
9
+ * 실패 시 null을 반환한다.
10
+ */
11
+ export declare function parseInputValue(input: string, format: string, adapter: DateAdapter): string | null;
12
+ /** 주어진 달의 이름을 반환한다 (기본 영어) */
13
+ export declare const WEEKDAY_LABELS: {
14
+ short: readonly ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
15
+ full: readonly ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
16
+ };
17
+ /** 주 시작 요일에 맞춰 요일 배열을 정렬한다 */
18
+ export declare function getOrderedWeekdays(weekStartsOn?: 0 | 1): {
19
+ short: "Su" | "Mo" | "Tu" | "We" | "Th" | "Fr" | "Sa";
20
+ full: "Sunday" | "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday" | "Saturday";
21
+ }[];
22
+ //# sourceMappingURL=date.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/utils/date.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,GACnB,MAAM,GAAG,IAAI,CAuBf;AAED,8BAA8B;AAC9B,eAAO,MAAM,cAAc;;;CAW1B,CAAC;AAEF,8BAA8B;AAC9B,wBAAgB,kBAAkB,CAAC,YAAY,GAAE,CAAC,GAAG,CAAK;;;IAYzD"}