ngxsmk-datepicker 2.2.12 → 2.2.13

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,2433 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, ElementRef, AfterViewInit, OnDestroy, TemplateRef, InjectionToken, EffectRef, Signal, OnInit, OnChanges, SimpleChanges } from '@angular/core';
3
+ import { ControlValueAccessor, NgControl } from '@angular/forms';
4
+ import { Subject } from 'rxjs';
5
+
6
+ declare function getStartOfDay(d: Date): Date;
7
+ declare function getEndOfDay(d: Date): Date;
8
+ declare function addMonths(d: Date, months: number): Date;
9
+ declare function subtractDays(d: Date, days: number): Date;
10
+ declare function getStartOfMonth(d: Date): Date;
11
+ declare function getEndOfMonth(d: Date): Date;
12
+ declare function isSameDay(d1: Date | null, d2: Date | null): boolean;
13
+ declare function normalizeDate(date: DateInput | null): Date | null;
14
+ type DateInput = Date | string | {
15
+ toDate: () => Date;
16
+ _isAMomentObject?: boolean;
17
+ $d?: Date;
18
+ };
19
+
20
+ interface HolidayProvider {
21
+ isHoliday(date: Date): boolean;
22
+ getHolidayLabel?(date: Date): string | null;
23
+ }
24
+ interface DateRange {
25
+ [key: string]: [DateInput, DateInput];
26
+ }
27
+ type DatepickerValue = Date | {
28
+ start: Date | null;
29
+ end: Date | null;
30
+ } | Date[] | null;
31
+ declare function generateMonthOptions(locale: string, year: number): {
32
+ label: string;
33
+ value: number;
34
+ }[];
35
+ /**
36
+ * Format a number using locale-aware number formatting.
37
+ * Uses Intl.NumberFormat for proper localization of numeric separators and decimals.
38
+ *
39
+ * @param value - The number to format
40
+ * @param locale - The locale to use for formatting (e.g., 'en-US', 'de-DE', 'fr-FR')
41
+ * @param options - Optional Intl.NumberFormatOptions for customization
42
+ * @returns Formatted number string
43
+ */
44
+ declare function formatLocaleNumber(value: number, locale: string, options?: Intl.NumberFormatOptions): string;
45
+ declare function generateYearOptions(currentYear: number, range?: number): {
46
+ label: string;
47
+ value: number;
48
+ }[];
49
+ declare function generateTimeOptions(minuteInterval?: number, secondInterval?: number, includeSeconds?: boolean, use24Hour?: boolean): {
50
+ hourOptions: {
51
+ label: string;
52
+ value: number;
53
+ }[];
54
+ minuteOptions: {
55
+ label: string;
56
+ value: number;
57
+ }[];
58
+ secondOptions?: {
59
+ label: string;
60
+ value: number;
61
+ }[];
62
+ };
63
+ declare function generateWeekDays(locale: string, firstDayOfWeek?: number): string[];
64
+ declare function getFirstDayOfWeek(locale: string): number;
65
+ declare function get24Hour(displayHour: number, isPm: boolean): number;
66
+ declare function update12HourState(fullHour: number): {
67
+ isPm: boolean;
68
+ displayHour: number;
69
+ };
70
+ declare function processDateRanges(ranges: DateRange | null): {
71
+ [key: string]: [Date, Date];
72
+ } | null;
73
+ declare function generateYearGrid(currentYear: number): number[];
74
+ declare function generateDecadeGrid(currentDecade: number): number[];
75
+
76
+ interface DatepickerClasses {
77
+ wrapper?: string;
78
+ inputGroup?: string;
79
+ input?: string;
80
+ clearBtn?: string;
81
+ calendarBtn?: string;
82
+ popover?: string;
83
+ container?: string;
84
+ calendar?: string;
85
+ header?: string;
86
+ navPrev?: string;
87
+ navNext?: string;
88
+ dayCell?: string;
89
+ footer?: string;
90
+ closeBtn?: string;
91
+ }
92
+
93
+ declare class NgxsmkDatepickerInputComponent {
94
+ isNative: boolean;
95
+ disabled: boolean;
96
+ classes: DatepickerClasses | undefined;
97
+ nativeInputType: string;
98
+ formattedValue: string;
99
+ placeholder: string;
100
+ id: string;
101
+ name: string;
102
+ autocomplete: string;
103
+ required: boolean;
104
+ minDateNative: string | null;
105
+ maxDateNative: string | null;
106
+ ariaLabel: string;
107
+ ariaDescribedBy: string;
108
+ errorState: boolean;
109
+ clearAriaLabel: string;
110
+ clearLabel: string;
111
+ isCalendarOpen: boolean;
112
+ allowTyping: boolean;
113
+ typedInputValue: string;
114
+ displayValue: string;
115
+ showCalendarButton: boolean;
116
+ calendarAriaLabel: string;
117
+ validationErrorMessage: string | null;
118
+ nativeInputChange: EventEmitter<Event>;
119
+ inputBlur: EventEmitter<FocusEvent>;
120
+ clearValue: EventEmitter<MouseEvent>;
121
+ toggleCalendar: EventEmitter<Event>;
122
+ pointerDown: EventEmitter<PointerEvent>;
123
+ pointerUp: EventEmitter<PointerEvent>;
124
+ inputGroupFocus: EventEmitter<void>;
125
+ inputKeyDown: EventEmitter<Event>;
126
+ inputChange: EventEmitter<Event>;
127
+ inputFocus: EventEmitter<FocusEvent>;
128
+ nativeInput?: ElementRef<HTMLInputElement>;
129
+ customInput?: ElementRef<HTMLInputElement>;
130
+ focus(): void;
131
+ onNativeInputChange(event: Event): void;
132
+ onInputBlur(event: FocusEvent): void;
133
+ onClearValue(event: MouseEvent): void;
134
+ onToggleCalendar(event: Event): void;
135
+ onPointerDown(event: PointerEvent): void;
136
+ onPointerUp(event: PointerEvent): void;
137
+ onInputGroupFocus(): void;
138
+ onInputKeyDown(event: Event): void;
139
+ onInputChange(event: Event): void;
140
+ onInputFocus(event: FocusEvent): void;
141
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxsmkDatepickerInputComponent, never>;
142
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgxsmkDatepickerInputComponent, "ngxsmk-datepicker-input", never, { "isNative": { "alias": "isNative"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "classes": { "alias": "classes"; "required": false; }; "nativeInputType": { "alias": "nativeInputType"; "required": false; }; "formattedValue": { "alias": "formattedValue"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "id": { "alias": "id"; "required": false; }; "name": { "alias": "name"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; "required": { "alias": "required"; "required": false; }; "minDateNative": { "alias": "minDateNative"; "required": false; }; "maxDateNative": { "alias": "maxDateNative"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; }; "errorState": { "alias": "errorState"; "required": false; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; }; "clearLabel": { "alias": "clearLabel"; "required": false; }; "isCalendarOpen": { "alias": "isCalendarOpen"; "required": false; }; "allowTyping": { "alias": "allowTyping"; "required": false; }; "typedInputValue": { "alias": "typedInputValue"; "required": false; }; "displayValue": { "alias": "displayValue"; "required": false; }; "showCalendarButton": { "alias": "showCalendarButton"; "required": false; }; "calendarAriaLabel": { "alias": "calendarAriaLabel"; "required": false; }; "validationErrorMessage": { "alias": "validationErrorMessage"; "required": false; }; }, { "nativeInputChange": "nativeInputChange"; "inputBlur": "inputBlur"; "clearValue": "clearValue"; "toggleCalendar": "toggleCalendar"; "pointerDown": "pointerDown"; "pointerUp": "pointerUp"; "inputGroupFocus": "inputGroupFocus"; "inputKeyDown": "inputKeyDown"; "inputChange": "inputChange"; "inputFocus": "inputFocus"; }, never, never, true, never>;
143
+ }
144
+
145
+ declare class CustomSelectComponent implements AfterViewInit, OnDestroy {
146
+ options: {
147
+ label: string;
148
+ value: unknown;
149
+ }[];
150
+ value: unknown;
151
+ disabled: boolean;
152
+ valueChange: EventEmitter<unknown>;
153
+ container: ElementRef<HTMLDivElement>;
154
+ button: ElementRef<HTMLButtonElement>;
155
+ panel: ElementRef<HTMLDivElement>;
156
+ isOpen: boolean;
157
+ private readonly elementRef;
158
+ private readonly platformId;
159
+ private readonly document;
160
+ private readonly isBrowser;
161
+ private resizeObserver;
162
+ private scrollListener;
163
+ ngAfterViewInit(): void;
164
+ ngOnDestroy(): void;
165
+ private setupResizeObserver;
166
+ private setupScrollListener;
167
+ private updatePanelPosition;
168
+ onDocumentClick(event: MouseEvent | TouchEvent): void;
169
+ onDocumentTouchStart(event: TouchEvent): void;
170
+ get displayValue(): string;
171
+ toggleDropdown(): void;
172
+ private scrollToSelected;
173
+ selectOption(option: {
174
+ label: string;
175
+ value: unknown;
176
+ }): void;
177
+ static ɵfac: i0.ɵɵFactoryDeclaration<CustomSelectComponent, never>;
178
+ static ɵcmp: i0.ɵɵComponentDeclaration<CustomSelectComponent, "ngxsmk-custom-select", never, { "options": { "alias": "options"; "required": false; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
179
+ }
180
+
181
+ declare class CalendarHeaderComponent {
182
+ monthSelect?: CustomSelectComponent;
183
+ yearSelect?: CustomSelectComponent;
184
+ monthOptions: {
185
+ label: string;
186
+ value: number;
187
+ }[];
188
+ yearOptions: {
189
+ label: string;
190
+ value: number;
191
+ }[];
192
+ currentMonth: number;
193
+ currentYear: number;
194
+ disabled: boolean;
195
+ isBackArrowDisabled: boolean;
196
+ prevMonthAriaLabel: string;
197
+ nextMonthAriaLabel: string;
198
+ headerClass?: string;
199
+ navPrevClass?: string;
200
+ navNextClass?: string;
201
+ currentYearChange: EventEmitter<number>;
202
+ currentMonthChange: EventEmitter<number>;
203
+ previousMonth: EventEmitter<void>;
204
+ nextMonth: EventEmitter<void>;
205
+ onMonthSelect(value: unknown): void;
206
+ onYearSelect(value: unknown): void;
207
+ static ɵfac: i0.ɵɵFactoryDeclaration<CalendarHeaderComponent, never>;
208
+ static ɵcmp: i0.ɵɵComponentDeclaration<CalendarHeaderComponent, "ngxsmk-calendar-header", never, { "monthOptions": { "alias": "monthOptions"; "required": false; }; "yearOptions": { "alias": "yearOptions"; "required": false; }; "currentMonth": { "alias": "currentMonth"; "required": false; }; "currentYear": { "alias": "currentYear"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "isBackArrowDisabled": { "alias": "isBackArrowDisabled"; "required": false; }; "prevMonthAriaLabel": { "alias": "prevMonthAriaLabel"; "required": false; }; "nextMonthAriaLabel": { "alias": "nextMonthAriaLabel"; "required": false; }; "headerClass": { "alias": "headerClass"; "required": false; }; "navPrevClass": { "alias": "navPrevClass"; "required": false; }; "navNextClass": { "alias": "navNextClass"; "required": false; }; }, { "currentYearChange": "currentYearChange"; "currentMonthChange": "currentMonthChange"; "previousMonth": "previousMonth"; "nextMonth": "nextMonth"; }, never, never, true, never>;
209
+ }
210
+
211
+ /**
212
+ * Complete translations interface for the datepicker component
213
+ */
214
+ interface DatepickerTranslations {
215
+ selectDate: string;
216
+ selectTime: string;
217
+ clear: string;
218
+ close: string;
219
+ today: string;
220
+ selectEndDate: string;
221
+ day: string;
222
+ days: string;
223
+ previousMonth: string;
224
+ nextMonth: string;
225
+ previousYear: string;
226
+ nextYear: string;
227
+ previousYears: string;
228
+ nextYears: string;
229
+ previousDecade: string;
230
+ nextDecade: string;
231
+ clearSelection: string;
232
+ closeCalendar: string;
233
+ closeCalendarOverlay: string;
234
+ calendarFor: string;
235
+ selectYear: string;
236
+ selectDecade: string;
237
+ datesSelected: string;
238
+ timesSelected: string;
239
+ time: string;
240
+ startTime: string;
241
+ endTime: string;
242
+ from: string;
243
+ to: string;
244
+ holiday: string;
245
+ month: string;
246
+ year: string;
247
+ decade: string;
248
+ timeline: string;
249
+ timeSlider: string;
250
+ calendarOpened: string;
251
+ calendarClosed: string;
252
+ dateSelected: string;
253
+ rangeSelected: string;
254
+ monthChanged: string;
255
+ yearChanged: string;
256
+ calendarLoading: string;
257
+ calendarReady: string;
258
+ keyboardShortcuts: string;
259
+ invalidDateFormat: string;
260
+ dateBeforeMin: string;
261
+ dateAfterMax: string;
262
+ invalidDate: string;
263
+ }
264
+ /**
265
+ * Partial translations - allows overriding only specific keys
266
+ */
267
+ type PartialDatepickerTranslations = Partial<DatepickerTranslations>;
268
+
269
+ declare class NgxsmkDatepickerContentComponent {
270
+ isCalendarVisible: boolean;
271
+ isCalendarOpen: boolean;
272
+ isInlineMode: boolean;
273
+ shouldAppendToBody: boolean;
274
+ theme: string;
275
+ popoverId: string;
276
+ classes: DatepickerClasses | undefined;
277
+ timeOnly: boolean;
278
+ showTime: boolean;
279
+ isMobile: boolean;
280
+ mobileModalStyle: string;
281
+ align: string;
282
+ ariaLabel: string;
283
+ isCalendarOpening: boolean;
284
+ loadingMessage: string;
285
+ showRanges: boolean;
286
+ rangesArray: {
287
+ key: string;
288
+ value: [Date, Date];
289
+ }[];
290
+ mode: 'single' | 'range' | 'multiple' | 'week' | 'month' | 'quarter' | 'year' | 'timeRange';
291
+ disabled: boolean;
292
+ calendarCount: number;
293
+ calendarLayout: string;
294
+ syncScrollEnabled: boolean;
295
+ calendarMonths: {
296
+ month: number;
297
+ year: number;
298
+ days: (Date | null)[];
299
+ }[];
300
+ weekDays: string[];
301
+ selectedDate: Date | null;
302
+ startDate: Date | null;
303
+ endDate: Date | null;
304
+ focusedDate: Date | null;
305
+ today: Date;
306
+ dateTemplate: TemplateRef<unknown> | null;
307
+ calendarViewMode: string;
308
+ monthOptions: {
309
+ label: string;
310
+ value: number;
311
+ }[];
312
+ currentMonth: number;
313
+ yearOptions: {
314
+ label: string;
315
+ value: number;
316
+ }[];
317
+ currentYear: number;
318
+ isBackArrowDisabled: boolean;
319
+ prevMonthAriaLabel: string;
320
+ nextMonthAriaLabel: string;
321
+ yearGrid: number[];
322
+ currentDecade: number;
323
+ decadeGrid: number[];
324
+ timelineStartDate: Date | null;
325
+ timelineEndDate: Date | null;
326
+ timelineMonths: Date[];
327
+ minuteInterval: number;
328
+ startTimeSlider: number;
329
+ endTimeSlider: number;
330
+ timeRangeMode: boolean;
331
+ hourOptions: {
332
+ label: string;
333
+ value: number;
334
+ }[];
335
+ minuteOptions: {
336
+ label: string;
337
+ value: number;
338
+ }[];
339
+ secondOptions: {
340
+ label: string;
341
+ value: number;
342
+ }[];
343
+ ampmOptions: {
344
+ label: string;
345
+ value: boolean;
346
+ }[];
347
+ currentDisplayHour: number;
348
+ currentMinute: number;
349
+ currentSecond: number;
350
+ isPm: boolean;
351
+ showSeconds: boolean;
352
+ use24Hour: boolean;
353
+ startDisplayHour: number;
354
+ startMinute: number;
355
+ startSecond: number;
356
+ startIsPm: boolean;
357
+ endDisplayHour: number;
358
+ endMinute: number;
359
+ endSecond: number;
360
+ endIsPm: boolean;
361
+ clearAriaLabel: string;
362
+ clearLabel: string;
363
+ closeAriaLabel: string;
364
+ closeLabel: string;
365
+ translations: DatepickerTranslations | null;
366
+ boundIsDateDisabled: (date: Date | null) => boolean;
367
+ boundIsSameDay: (date1: Date | null, date2: Date | null) => boolean;
368
+ boundIsHoliday: (date: Date | null) => boolean;
369
+ boundIsMultipleSelected: (date: Date | null) => boolean;
370
+ boundIsInRange: (date: Date | null) => boolean;
371
+ boundIsPreviewInRange: (date: Date | null) => boolean;
372
+ boundGetAriaLabel: (date: Date | null) => string;
373
+ boundGetDayCellCustomClasses: (date: Date | null) => string | string[] | Set<string> | {
374
+ [klass: string]: unknown;
375
+ };
376
+ boundGetDayCellTooltip: (date: Date | null) => string | null;
377
+ boundFormatDayNumber: (date: Date | null) => string;
378
+ getMonthYearLabel: (month: number, year: number) => string;
379
+ getCalendarAriaLabelForMonth: (month: number, year: number) => string;
380
+ isTimelineMonthSelected: (date: Date) => boolean;
381
+ formatTimeSliderValue: (value: number) => string;
382
+ backdropClick: EventEmitter<Event>;
383
+ touchStartContainer: EventEmitter<TouchEvent>;
384
+ touchMoveContainer: EventEmitter<TouchEvent>;
385
+ touchEndContainer: EventEmitter<TouchEvent>;
386
+ rangeSelect: EventEmitter<[Date, Date]>;
387
+ previousMonth: EventEmitter<void>;
388
+ nextMonth: EventEmitter<void>;
389
+ currentMonthChange: EventEmitter<number>;
390
+ currentYearChange: EventEmitter<number>;
391
+ dateClick: EventEmitter<Date>;
392
+ dateHover: EventEmitter<Date | null>;
393
+ dateFocus: EventEmitter<Date>;
394
+ swipeStart: EventEmitter<TouchEvent>;
395
+ swipeMove: EventEmitter<TouchEvent>;
396
+ swipeEnd: EventEmitter<TouchEvent>;
397
+ touchStart: EventEmitter<{
398
+ event: TouchEvent;
399
+ day: Date | null;
400
+ }>;
401
+ touchMove: EventEmitter<TouchEvent>;
402
+ touchEnd: EventEmitter<{
403
+ event: TouchEvent;
404
+ day: Date | null;
405
+ }>;
406
+ viewModeChange: EventEmitter<"year" | "month" | "decade" | "timeline" | "time-slider">;
407
+ changeYear: EventEmitter<number>;
408
+ yearClick: EventEmitter<number>;
409
+ changeDecade: EventEmitter<number>;
410
+ decadeClick: EventEmitter<number>;
411
+ timelineZoomOut: EventEmitter<void>;
412
+ timelineZoomIn: EventEmitter<void>;
413
+ timelineMonthClick: EventEmitter<Date>;
414
+ startTimeSliderChange: EventEmitter<number>;
415
+ endTimeSliderChange: EventEmitter<number>;
416
+ currentDisplayHourChange: EventEmitter<number>;
417
+ currentMinuteChange: EventEmitter<number>;
418
+ currentSecondChange: EventEmitter<number>;
419
+ isPmChange: EventEmitter<boolean>;
420
+ timeChange: EventEmitter<void>;
421
+ startDisplayHourChange: EventEmitter<number>;
422
+ startMinuteChange: EventEmitter<number>;
423
+ startSecondChange: EventEmitter<number>;
424
+ startIsPmChange: EventEmitter<boolean>;
425
+ endDisplayHourChange: EventEmitter<number>;
426
+ endMinuteChange: EventEmitter<number>;
427
+ endSecondChange: EventEmitter<number>;
428
+ endIsPmChange: EventEmitter<boolean>;
429
+ timeRangeChange: EventEmitter<void>;
430
+ clearValue: EventEmitter<MouseEvent>;
431
+ closeCalendar: EventEmitter<void>;
432
+ escapeKey: EventEmitter<Event>;
433
+ header?: CalendarHeaderComponent;
434
+ popoverContainer?: ElementRef<HTMLElement>;
435
+ timelineContainer?: ElementRef<HTMLElement>;
436
+ closeAllSelects(): void;
437
+ onTimelineMonthClick(month: Date, event: MouseEvent): void;
438
+ onTimelineMonthSpace(month: Date, event: Event): void;
439
+ onPopoverEscape(event: Event): void;
440
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxsmkDatepickerContentComponent, never>;
441
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgxsmkDatepickerContentComponent, "ngxsmk-datepicker-content", never, { "isCalendarVisible": { "alias": "isCalendarVisible"; "required": false; }; "isCalendarOpen": { "alias": "isCalendarOpen"; "required": false; }; "isInlineMode": { "alias": "isInlineMode"; "required": false; }; "shouldAppendToBody": { "alias": "shouldAppendToBody"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "popoverId": { "alias": "popoverId"; "required": false; }; "classes": { "alias": "classes"; "required": false; }; "timeOnly": { "alias": "timeOnly"; "required": false; }; "showTime": { "alias": "showTime"; "required": false; }; "isMobile": { "alias": "isMobile"; "required": false; }; "mobileModalStyle": { "alias": "mobileModalStyle"; "required": false; }; "align": { "alias": "align"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "isCalendarOpening": { "alias": "isCalendarOpening"; "required": false; }; "loadingMessage": { "alias": "loadingMessage"; "required": false; }; "showRanges": { "alias": "showRanges"; "required": false; }; "rangesArray": { "alias": "rangesArray"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "calendarCount": { "alias": "calendarCount"; "required": false; }; "calendarLayout": { "alias": "calendarLayout"; "required": false; }; "syncScrollEnabled": { "alias": "syncScrollEnabled"; "required": false; }; "calendarMonths": { "alias": "calendarMonths"; "required": false; }; "weekDays": { "alias": "weekDays"; "required": false; }; "selectedDate": { "alias": "selectedDate"; "required": false; }; "startDate": { "alias": "startDate"; "required": false; }; "endDate": { "alias": "endDate"; "required": false; }; "focusedDate": { "alias": "focusedDate"; "required": false; }; "today": { "alias": "today"; "required": false; }; "dateTemplate": { "alias": "dateTemplate"; "required": false; }; "calendarViewMode": { "alias": "calendarViewMode"; "required": false; }; "monthOptions": { "alias": "monthOptions"; "required": false; }; "currentMonth": { "alias": "currentMonth"; "required": false; }; "yearOptions": { "alias": "yearOptions"; "required": false; }; "currentYear": { "alias": "currentYear"; "required": false; }; "isBackArrowDisabled": { "alias": "isBackArrowDisabled"; "required": false; }; "prevMonthAriaLabel": { "alias": "prevMonthAriaLabel"; "required": false; }; "nextMonthAriaLabel": { "alias": "nextMonthAriaLabel"; "required": false; }; "yearGrid": { "alias": "yearGrid"; "required": false; }; "currentDecade": { "alias": "currentDecade"; "required": false; }; "decadeGrid": { "alias": "decadeGrid"; "required": false; }; "timelineStartDate": { "alias": "timelineStartDate"; "required": false; }; "timelineEndDate": { "alias": "timelineEndDate"; "required": false; }; "timelineMonths": { "alias": "timelineMonths"; "required": false; }; "minuteInterval": { "alias": "minuteInterval"; "required": false; }; "startTimeSlider": { "alias": "startTimeSlider"; "required": false; }; "endTimeSlider": { "alias": "endTimeSlider"; "required": false; }; "timeRangeMode": { "alias": "timeRangeMode"; "required": false; }; "hourOptions": { "alias": "hourOptions"; "required": false; }; "minuteOptions": { "alias": "minuteOptions"; "required": false; }; "secondOptions": { "alias": "secondOptions"; "required": false; }; "ampmOptions": { "alias": "ampmOptions"; "required": false; }; "currentDisplayHour": { "alias": "currentDisplayHour"; "required": false; }; "currentMinute": { "alias": "currentMinute"; "required": false; }; "currentSecond": { "alias": "currentSecond"; "required": false; }; "isPm": { "alias": "isPm"; "required": false; }; "showSeconds": { "alias": "showSeconds"; "required": false; }; "use24Hour": { "alias": "use24Hour"; "required": false; }; "startDisplayHour": { "alias": "startDisplayHour"; "required": false; }; "startMinute": { "alias": "startMinute"; "required": false; }; "startSecond": { "alias": "startSecond"; "required": false; }; "startIsPm": { "alias": "startIsPm"; "required": false; }; "endDisplayHour": { "alias": "endDisplayHour"; "required": false; }; "endMinute": { "alias": "endMinute"; "required": false; }; "endSecond": { "alias": "endSecond"; "required": false; }; "endIsPm": { "alias": "endIsPm"; "required": false; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; }; "clearLabel": { "alias": "clearLabel"; "required": false; }; "closeAriaLabel": { "alias": "closeAriaLabel"; "required": false; }; "closeLabel": { "alias": "closeLabel"; "required": false; }; "translations": { "alias": "translations"; "required": false; }; "boundIsDateDisabled": { "alias": "boundIsDateDisabled"; "required": false; }; "boundIsSameDay": { "alias": "boundIsSameDay"; "required": false; }; "boundIsHoliday": { "alias": "boundIsHoliday"; "required": false; }; "boundIsMultipleSelected": { "alias": "boundIsMultipleSelected"; "required": false; }; "boundIsInRange": { "alias": "boundIsInRange"; "required": false; }; "boundIsPreviewInRange": { "alias": "boundIsPreviewInRange"; "required": false; }; "boundGetAriaLabel": { "alias": "boundGetAriaLabel"; "required": false; }; "boundGetDayCellCustomClasses": { "alias": "boundGetDayCellCustomClasses"; "required": false; }; "boundGetDayCellTooltip": { "alias": "boundGetDayCellTooltip"; "required": false; }; "boundFormatDayNumber": { "alias": "boundFormatDayNumber"; "required": false; }; "getMonthYearLabel": { "alias": "getMonthYearLabel"; "required": false; }; "getCalendarAriaLabelForMonth": { "alias": "getCalendarAriaLabelForMonth"; "required": false; }; "isTimelineMonthSelected": { "alias": "isTimelineMonthSelected"; "required": false; }; "formatTimeSliderValue": { "alias": "formatTimeSliderValue"; "required": false; }; }, { "backdropClick": "backdropClick"; "touchStartContainer": "touchStartContainer"; "touchMoveContainer": "touchMoveContainer"; "touchEndContainer": "touchEndContainer"; "rangeSelect": "rangeSelect"; "previousMonth": "previousMonth"; "nextMonth": "nextMonth"; "currentMonthChange": "currentMonthChange"; "currentYearChange": "currentYearChange"; "dateClick": "dateClick"; "dateHover": "dateHover"; "dateFocus": "dateFocus"; "swipeStart": "swipeStart"; "swipeMove": "swipeMove"; "swipeEnd": "swipeEnd"; "touchStart": "touchStart"; "touchMove": "touchMove"; "touchEnd": "touchEnd"; "viewModeChange": "viewModeChange"; "changeYear": "changeYear"; "yearClick": "yearClick"; "changeDecade": "changeDecade"; "decadeClick": "decadeClick"; "timelineZoomOut": "timelineZoomOut"; "timelineZoomIn": "timelineZoomIn"; "timelineMonthClick": "timelineMonthClick"; "startTimeSliderChange": "startTimeSliderChange"; "endTimeSliderChange": "endTimeSliderChange"; "currentDisplayHourChange": "currentDisplayHourChange"; "currentMinuteChange": "currentMinuteChange"; "currentSecondChange": "currentSecondChange"; "isPmChange": "isPmChange"; "timeChange": "timeChange"; "startDisplayHourChange": "startDisplayHourChange"; "startMinuteChange": "startMinuteChange"; "startSecondChange": "startSecondChange"; "startIsPmChange": "startIsPmChange"; "endDisplayHourChange": "endDisplayHourChange"; "endMinuteChange": "endMinuteChange"; "endSecondChange": "endSecondChange"; "endIsPmChange": "endIsPmChange"; "timeRangeChange": "timeRangeChange"; "clearValue": "clearValue"; "closeCalendar": "closeCalendar"; "escapeKey": "escapeKey"; }, never, never, true, never>;
442
+ }
443
+
444
+ interface DayCellRenderHook {
445
+ getDayCellClasses?(date: Date, isSelected: boolean, isDisabled: boolean, isToday: boolean, isHoliday: boolean): string[];
446
+ getDayCellTooltip?(date: Date, holidayLabel: string | null): string | null;
447
+ formatDayNumber?(date: Date): string;
448
+ }
449
+ interface ValidationHook {
450
+ validateDate?(date: Date, currentValue: DatepickerValue, mode: 'single' | 'range' | 'multiple' | 'week' | 'month' | 'quarter' | 'year' | 'timeRange'): boolean;
451
+ validateRange?(startDate: Date, endDate: Date): boolean;
452
+ getValidationError?(date: Date): string | null;
453
+ }
454
+ interface KeyboardShortcutHook {
455
+ handleShortcut?(event: KeyboardEvent, context: KeyboardShortcutContext): boolean;
456
+ getShortcutHelp?(): KeyboardShortcutHelp[];
457
+ }
458
+ interface KeyboardShortcutContext {
459
+ currentDate: Date;
460
+ selectedDate: Date | null;
461
+ startDate: Date | null;
462
+ endDate: Date | null;
463
+ selectedDates: Date[];
464
+ mode: 'single' | 'range' | 'multiple' | 'week' | 'month' | 'quarter' | 'year' | 'timeRange';
465
+ focusedDate: Date | null;
466
+ isCalendarOpen: boolean;
467
+ }
468
+ interface KeyboardShortcutHelp {
469
+ key: string;
470
+ description: string;
471
+ modifiers?: string[];
472
+ }
473
+ interface DateFormatHook {
474
+ formatDisplayValue?(value: DatepickerValue, mode: 'single' | 'range' | 'multiple' | 'week' | 'month' | 'quarter' | 'year' | 'timeRange'): string;
475
+ formatAriaLabel?(date: Date): string;
476
+ }
477
+ interface EventHook {
478
+ beforeDateSelect?(date: Date, currentValue: DatepickerValue): boolean;
479
+ afterDateSelect?(date: Date, newValue: DatepickerValue): void;
480
+ onCalendarOpen?(): void;
481
+ onCalendarClose?(): void;
482
+ }
483
+ interface DatepickerHooks extends DayCellRenderHook, ValidationHook, KeyboardShortcutHook, DateFormatHook, EventHook {
484
+ }
485
+
486
+ /**
487
+ * Date Adapter Interface
488
+ *
489
+ * Allows consumers to swap formatting/parsing logic with external date libraries
490
+ * like date-fns, dayjs, or Luxon.
491
+ */
492
+ interface DateAdapter {
493
+ /**
494
+ * Parse a date from a string or value
495
+ * @param value - The value to parse (string, Date, or library-specific type)
496
+ * @param onError - Optional callback for error handling. Called when parsing fails.
497
+ * @returns A Date object or null if parsing fails
498
+ */
499
+ parse(value: string | Date | number | unknown, onError?: (error: Error) => void): Date | null;
500
+ /**
501
+ * Format a date to a string
502
+ * @param date - The date to format
503
+ * @param format - Format string (library-specific)
504
+ * @param locale - Locale string (e.g., 'en-US')
505
+ * @returns Formatted date string
506
+ */
507
+ format(date: Date, format?: string, locale?: string): string;
508
+ /**
509
+ * Check if a value is a valid date
510
+ * @param value - The value to check
511
+ * @returns True if the value is a valid date
512
+ */
513
+ isValid(value: string | Date | number | unknown): boolean;
514
+ /**
515
+ * Get the start of day for a date
516
+ * @param date - The date
517
+ * @returns Date at start of day
518
+ */
519
+ startOfDay(date: Date): Date;
520
+ /**
521
+ * Get the end of day for a date
522
+ * @param date - The date
523
+ * @returns Date at end of day
524
+ */
525
+ endOfDay(date: Date): Date;
526
+ /**
527
+ * Add months to a date
528
+ * @param date - The date
529
+ * @param months - Number of months to add
530
+ * @returns New date with months added
531
+ */
532
+ addMonths(date: Date, months: number): Date;
533
+ /**
534
+ * Add days to a date
535
+ * @param date - The date
536
+ * @param days - Number of days to add
537
+ * @returns New date with days added
538
+ */
539
+ addDays(date: Date, days: number): Date;
540
+ /**
541
+ * Check if two dates are the same day
542
+ * @param date1 - First date
543
+ * @param date2 - Second date
544
+ * @returns True if dates are the same day
545
+ */
546
+ isSameDay(date1: Date | null, date2: Date | null): boolean;
547
+ }
548
+ /**
549
+ * Default Date Adapter using native JavaScript Date
550
+ */
551
+ declare class NativeDateAdapter implements DateAdapter {
552
+ parse(value: string | Date | number | unknown, onError?: (error: Error) => void): Date | null;
553
+ format(date: Date, _format?: string, locale?: string): string;
554
+ isValid(value: string | Date | number | unknown): boolean;
555
+ startOfDay(date: Date): Date;
556
+ endOfDay(date: Date): Date;
557
+ addMonths(date: Date, months: number): Date;
558
+ addDays(date: Date, days: number): Date;
559
+ isSameDay(date1: Date | null, date2: Date | null): boolean;
560
+ }
561
+
562
+ interface DatepickerConfig {
563
+ weekStart?: number | null;
564
+ minuteInterval?: number;
565
+ holidayProvider?: HolidayProvider | null;
566
+ yearRange?: number;
567
+ locale?: string;
568
+ timezone?: string;
569
+ minDate?: Date | string | null;
570
+ maxDate?: Date | string | null;
571
+ dateAdapter?: DateAdapter;
572
+ animations?: AnimationConfig;
573
+ autoDetectMobile?: boolean;
574
+ mobileModalStyle?: 'bottom-sheet' | 'center' | 'fullscreen';
575
+ }
576
+ interface AnimationConfig {
577
+ enabled?: boolean;
578
+ duration?: number;
579
+ easing?: string;
580
+ property?: string;
581
+ respectReducedMotion?: boolean;
582
+ }
583
+ declare const DEFAULT_ANIMATION_CONFIG: Required<AnimationConfig>;
584
+ declare const DATEPICKER_CONFIG: InjectionToken<DatepickerConfig>;
585
+ declare const DEFAULT_DATEPICKER_CONFIG: DatepickerConfig;
586
+ declare function provideDatepickerConfig(config: DatepickerConfig): {
587
+ provide: InjectionToken<DatepickerConfig>;
588
+ useValue: {
589
+ weekStart?: number | null;
590
+ minuteInterval?: number;
591
+ holidayProvider?: HolidayProvider | null;
592
+ yearRange?: number;
593
+ locale?: string;
594
+ timezone?: string;
595
+ minDate?: Date | string | null;
596
+ maxDate?: Date | string | null;
597
+ dateAdapter?: DateAdapter;
598
+ animations?: AnimationConfig;
599
+ autoDetectMobile?: boolean;
600
+ mobileModalStyle?: "bottom-sheet" | "center" | "fullscreen";
601
+ };
602
+ };
603
+
604
+ interface ValidationError {
605
+ kind: string;
606
+ message?: string;
607
+ }
608
+ type SignalFormFieldConfig = {
609
+ value?: DatepickerValue | string | (() => DatepickerValue | string) | {
610
+ (): DatepickerValue | string;
611
+ } | Signal<DatepickerValue | string>;
612
+ disabled?: boolean | (() => boolean) | {
613
+ (): boolean;
614
+ } | Signal<boolean>;
615
+ required?: boolean | (() => boolean) | {
616
+ (): boolean;
617
+ } | Signal<boolean>;
618
+ errors?: ValidationError[] | (() => ValidationError[]) | {
619
+ (): ValidationError[];
620
+ } | Signal<ValidationError[]>;
621
+ valid?: boolean | (() => boolean) | {
622
+ (): boolean;
623
+ } | Signal<boolean>;
624
+ invalid?: boolean | (() => boolean) | {
625
+ (): boolean;
626
+ } | Signal<boolean>;
627
+ touched?: boolean | (() => boolean) | {
628
+ (): boolean;
629
+ } | Signal<boolean>;
630
+ setValue?: (value: DatepickerValue | string) => void;
631
+ updateValue?: (updater: () => DatepickerValue | string) => void;
632
+ markAsDirty?: () => void;
633
+ markAsTouched?: () => void;
634
+ };
635
+ type SignalFormField = unknown;
636
+ interface FieldSyncCallbacks {
637
+ onValueChanged: (value: DatepickerValue) => void;
638
+ onDisabledChanged: (disabled: boolean) => void;
639
+ onRequiredChanged?: (required: boolean) => void;
640
+ onErrorStateChanged?: (hasError: boolean) => void;
641
+ onSyncError: (error: unknown) => void;
642
+ normalizeValue: (value: unknown) => DatepickerValue;
643
+ isValueEqual: (val1: DatepickerValue, val2: DatepickerValue) => boolean;
644
+ onCalendarGenerated?: () => void;
645
+ onStateChanged?: () => void;
646
+ }
647
+ declare class FieldSyncService {
648
+ private _fieldEffectRef;
649
+ private _lastKnownFieldValue;
650
+ private _isUpdatingFromInternal;
651
+ private readonly injector;
652
+ private readFieldValue;
653
+ private readDisabledState;
654
+ private readFieldErrors;
655
+ private readRequiredState;
656
+ private hasValidationErrors;
657
+ private resolveField;
658
+ setupFieldSync(fieldInput: SignalFormField, callbacks: FieldSyncCallbacks): EffectRef | null;
659
+ syncFieldValue(fieldInput: SignalFormField | Signal<SignalFormField> | (() => unknown) | unknown, callbacks: FieldSyncCallbacks): boolean;
660
+ updateFieldFromInternal(value: DatepickerValue, fieldInput: SignalFormField | Signal<SignalFormField> | (() => unknown) | unknown): void;
661
+ getLastKnownValue(): DatepickerValue | undefined;
662
+ markAsTouched(fieldInput: SignalFormField | Signal<SignalFormField> | (() => unknown) | unknown): void;
663
+ cleanup(): void;
664
+ static ɵfac: i0.ɵɵFactoryDeclaration<FieldSyncService, never>;
665
+ static ɵprov: i0.ɵɵInjectableDeclaration<FieldSyncService>;
666
+ }
667
+
668
+ interface TranslationService {
669
+ translate(key: string, params?: Record<string, string | number>): string;
670
+ getCurrentLocale(): string;
671
+ }
672
+ declare class DefaultTranslationService implements TranslationService {
673
+ private translations;
674
+ private locale;
675
+ private readonly translationRegistry;
676
+ constructor();
677
+ initialize(translations: DatepickerTranslations, locale?: string): void;
678
+ initializeFromLocale(locale: string): void;
679
+ translate(key: string, params?: Record<string, string | number>): string;
680
+ getCurrentLocale(): string;
681
+ static ɵfac: i0.ɵɵFactoryDeclaration<DefaultTranslationService, never>;
682
+ static ɵprov: i0.ɵɵInjectableDeclaration<DefaultTranslationService>;
683
+ }
684
+
685
+ interface TouchGestureState {
686
+ touchStartTime: number;
687
+ touchStartElement: EventTarget | null;
688
+ dateCellTouchStartTime: number;
689
+ dateCellTouchStartDate: Date | null;
690
+ dateCellTouchStartX: number;
691
+ dateCellTouchStartY: number;
692
+ isDateCellTouching: boolean;
693
+ lastDateCellTouchDate: Date | null;
694
+ dateCellTouchHandled: boolean;
695
+ calendarSwipeStartX: number;
696
+ calendarSwipeStartY: number;
697
+ calendarSwipeStartTime: number;
698
+ isCalendarSwiping: boolean;
699
+ hoveredDate: Date | null;
700
+ }
701
+
702
+ /** Recurring date pattern configuration for disabled dates. */
703
+ type RecurringPatternInput = {
704
+ pattern: 'daily' | 'weekly' | 'monthly' | 'yearly' | 'weekdays' | 'weekends';
705
+ startDate: Date;
706
+ endDate?: Date;
707
+ dayOfWeek?: number;
708
+ dayOfMonth?: number;
709
+ interval?: number;
710
+ } | null;
711
+ /**
712
+ * Interface for Angular Material Form Field Control compatibility.
713
+ * We define it here to avoid a direct dependency on @angular/material.
714
+ */
715
+ interface MatFormFieldControlMock<T> {
716
+ value: T | null;
717
+ stateChanges: Subject<void>;
718
+ id: string;
719
+ placeholder: string;
720
+ ngControl: NgControl | null;
721
+ focused: boolean;
722
+ empty: boolean;
723
+ shouldLabelFloat: boolean;
724
+ required: boolean;
725
+ disabled: boolean;
726
+ errorState: boolean;
727
+ controlType?: string;
728
+ autofilled?: boolean;
729
+ userAriaDescribedBy?: string;
730
+ setDescribedByIds(ids: string[]): void;
731
+ onContainerClick(event: MouseEvent): void;
732
+ }
733
+ declare class NgxsmkDatepickerComponent implements OnInit, OnChanges, OnDestroy, AfterViewInit, ControlValueAccessor, MatFormFieldControlMock<DatepickerValue> {
734
+ private static _idCounter;
735
+ private static readonly _allInstances;
736
+ private static _materialSupportRegistered;
737
+ private static _patchMetadataArrays;
738
+ static withMaterialSupport(matFormFieldControlToken: any, targetCmp?: any): void;
739
+ _uniqueId: string;
740
+ mode: 'single' | 'range' | 'multiple' | 'week' | 'month' | 'quarter' | 'year' | 'timeRange';
741
+ calendarViewMode: 'month' | 'year' | 'decade' | 'timeline' | 'time-slider';
742
+ isInvalidDate: (date: Date) => boolean;
743
+ showRanges: boolean;
744
+ showTime: boolean;
745
+ timeOnly: boolean;
746
+ timeRangeMode: boolean;
747
+ showCalendarButton: boolean;
748
+ minuteInterval: number;
749
+ use24Hour: boolean;
750
+ secondInterval: number;
751
+ showSeconds: boolean;
752
+ holidayProvider: HolidayProvider | null;
753
+ disableHolidays: boolean;
754
+ disabledDates: (string | Date)[];
755
+ disabledRanges: Array<{
756
+ start: Date | string;
757
+ end: Date | string;
758
+ }>;
759
+ recurringPattern?: RecurringPatternInput;
760
+ dateTemplate: TemplateRef<unknown> | null;
761
+ private _placeholder;
762
+ set placeholder(value: string | null);
763
+ get placeholder(): string;
764
+ inline: boolean | 'always' | 'auto';
765
+ private _inputId;
766
+ set inputId(value: string);
767
+ get inputId(): string;
768
+ private _name;
769
+ set name(value: string);
770
+ get name(): string;
771
+ private _autocomplete;
772
+ set autocomplete(value: string);
773
+ get autocomplete(): string;
774
+ translations?: PartialDatepickerTranslations;
775
+ translationService?: TranslationService;
776
+ clearLabel: string;
777
+ closeLabel: string;
778
+ prevMonthAriaLabel: string;
779
+ nextMonthAriaLabel: string;
780
+ clearAriaLabel: string;
781
+ closeAriaLabel: string;
782
+ get _clearLabel(): string;
783
+ get _closeLabel(): string;
784
+ get _prevMonthAriaLabel(): string;
785
+ get _nextMonthAriaLabel(): string;
786
+ get _clearAriaLabel(): string;
787
+ get _closeAriaLabel(): string;
788
+ weekStart: number | null;
789
+ private readonly _yearRange;
790
+ set yearRange(value: number);
791
+ get yearRange(): number;
792
+ timezone?: string;
793
+ hooks: DatepickerHooks | null;
794
+ enableKeyboardShortcuts: boolean;
795
+ customShortcuts: {
796
+ [key: string]: (context: KeyboardShortcutContext) => boolean;
797
+ } | null;
798
+ autoApplyClose: boolean;
799
+ /**
800
+ * Range mode only: allow a one-day range by clicking the same date twice, or by closing the popover
801
+ * with only a start date selected (start and end will both be that day).
802
+ */
803
+ allowSameDay: boolean;
804
+ displayFormat?: string;
805
+ allowTyping: boolean;
806
+ private _calendarCount;
807
+ set calendarCount(value: number);
808
+ get calendarCount(): number;
809
+ calendarLayout: 'horizontal' | 'vertical' | 'auto';
810
+ defaultMonthOffset: number;
811
+ /**
812
+ * Configuration for synchronous scrolling in multi-calendar mode.
813
+ * Keeps calendars in sync by enforcing consistent month offsets across visible calendars.
814
+ *
815
+ * @example
816
+ * ```typescript
817
+ * // Keep calendars exactly 1 month apart
818
+ * <ngxsmk-datepicker
819
+ * [calendarCount]="2"
820
+ * [syncScroll]="{ enabled: true, monthGap: 1 }">
821
+ * </ngxsmk-datepicker>
822
+ *
823
+ * // Disable sync scroll (independent navigation)
824
+ * <ngxsmk-datepicker
825
+ * [calendarCount]="3"
826
+ * [syncScroll]="{ enabled: false }">
827
+ * </ngxsmk-datepicker>
828
+ * ```
829
+ */
830
+ syncScroll: {
831
+ enabled?: boolean;
832
+ monthGap?: number;
833
+ };
834
+ align: 'left' | 'right' | 'center';
835
+ useNativePicker: boolean;
836
+ enableHapticFeedback: boolean;
837
+ mobileModalStyle: 'bottom-sheet' | 'center' | 'fullscreen';
838
+ mobileTimePickerStyle: 'wheel' | 'slider' | 'native';
839
+ enablePullToRefresh: boolean;
840
+ mobileTheme: 'compact' | 'comfortable' | 'spacious';
841
+ enableVoiceInput: boolean;
842
+ autoDetectMobile: boolean;
843
+ disableFocusTrap: boolean;
844
+ appendToBody: boolean;
845
+ private readonly appRef;
846
+ private readonly document;
847
+ portalTemplate: TemplateRef<unknown>;
848
+ private portalViewRef;
849
+ get _shouldAppendToBody(): boolean;
850
+ /**
851
+ * Detects if the datepicker is rendered inside a modal/dialog so the calendar
852
+ * can be appended to body and positioned above the modal.
853
+ */
854
+ private isInsideModal;
855
+ private readonly _isCalendarOpen;
856
+ get isCalendarOpen(): boolean;
857
+ set isCalendarOpen(value: boolean);
858
+ private isOpeningCalendar;
859
+ /** Public getter for template: true while calendar is opening/generating (loading state). */
860
+ get isCalendarOpening(): boolean;
861
+ /** Returns translated "Loading calendar..." for template and ARIA. */
862
+ getCalendarLoadingMessage(): string;
863
+ private openCalendarTimeoutId;
864
+ private lastToggleTime;
865
+ private touchStartTime;
866
+ private touchStartElement;
867
+ private pointerDownTime;
868
+ private isPointerEvent;
869
+ private previousFocusElement;
870
+ private _value;
871
+ set value(val: DatepickerValue);
872
+ get value(): DatepickerValue;
873
+ private _field;
874
+ private _fieldEffectRef;
875
+ set field(field: SignalFormField);
876
+ get field(): SignalFormField;
877
+ private syncFieldValue;
878
+ private _startAtDate;
879
+ set startAt(value: DateInput | null);
880
+ private _locale;
881
+ set locale(value: string);
882
+ get locale(): string;
883
+ theme: 'light' | 'dark';
884
+ get isDarkMode(): boolean;
885
+ private _dateFormatPattern;
886
+ private customDateFormatService;
887
+ set dateFormatPattern(value: string | null);
888
+ get dateFormatPattern(): string | null;
889
+ private _animationConfig;
890
+ /**
891
+ * Animation configuration allowing customization of animation duration, easing, and reduction.
892
+ * Supports prefers-reduced-motion accessibility preference automatically.
893
+ *
894
+ * @example
895
+ * ```typescript
896
+ * // Disable all animations
897
+ * <ngxsmk-datepicker [animationConfig]="{ enabled: false }"></ngxsmk-datepicker>
898
+ *
899
+ * // Custom animation duration and easing
900
+ * <ngxsmk-datepicker [animationConfig]="{ duration: 300, easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)' }"></ngxsmk-datepicker>
901
+ *
902
+ * // Disable specific animation properties
903
+ * <ngxsmk-datepicker [animationConfig]="{ property: 'opacity' }"></ngxsmk-datepicker>
904
+ * ```
905
+ */
906
+ set animationConfig(value: AnimationConfig | null);
907
+ get animationConfig(): AnimationConfig | null;
908
+ private _rtl;
909
+ set rtl(value: boolean | null);
910
+ get rtl(): boolean | null;
911
+ get isRtl(): boolean;
912
+ get rtlClass(): boolean;
913
+ classes?: DatepickerClasses | undefined;
914
+ private onChange;
915
+ private onTouched;
916
+ disabled: boolean;
917
+ set disabledState(isDisabled: boolean);
918
+ /**
919
+ * Subject used for Material Form Field integration.
920
+ * Emits when the component's state changes (disabled, required, error state, etc.)
921
+ *
922
+ * @remarks
923
+ * This Subject is required for Angular Material's form field control interface.
924
+ * It allows Material form fields to track state changes and update their appearance
925
+ * accordingly (e.g., showing error states, floating labels, etc.).
926
+ *
927
+ * The Subject is properly cleaned up in ngOnDestroy() to prevent memory leaks.
928
+ * It's marked as readonly to prevent external code from reassigning it.
929
+ */
930
+ readonly stateChanges: Subject<void>;
931
+ private _focused;
932
+ private _required;
933
+ private _errorState;
934
+ get focused(): boolean;
935
+ get empty(): boolean;
936
+ get shouldLabelFloat(): boolean;
937
+ get required(): boolean;
938
+ set required(value: boolean);
939
+ get errorState(): boolean;
940
+ set errorState(value: boolean);
941
+ get controlType(): string;
942
+ get autofilled(): boolean;
943
+ get id(): string;
944
+ get describedBy(): string;
945
+ /**
946
+ * Aria describedby ID provided by the user or the parent form field.
947
+ * Required for Angular Material form field control interface.
948
+ */
949
+ userAriaDescribedBy: string;
950
+ setDescribedByIds(ids: string[]): void;
951
+ onContainerClick(_event: MouseEvent): void;
952
+ valueChange: EventEmitter<DatepickerValue>;
953
+ action: EventEmitter<{
954
+ type: string;
955
+ payload?: unknown;
956
+ }>;
957
+ /** Emitted when validation fails (e.g. invalid typed date, date before min, after max). Message is translated. */
958
+ validationError: EventEmitter<{
959
+ code: string;
960
+ message: string;
961
+ }>;
962
+ private _validationErrorMessage;
963
+ /** User-facing validation error message when set (e.g. from typed input or min/max). */
964
+ get validationErrorMessage(): string | null;
965
+ private setValidationError;
966
+ private clearValidationError;
967
+ private _minDate;
968
+ set minDate(value: DateInput | null);
969
+ get minDate(): DateInput | null;
970
+ private _maxDate;
971
+ set maxDate(value: DateInput | null);
972
+ get maxDate(): DateInput | null;
973
+ private _ranges;
974
+ set ranges(value: DateRange | null);
975
+ currentDate: Date;
976
+ daysInMonth: (Date | null)[];
977
+ multiCalendarMonths: Array<{
978
+ month: number;
979
+ year: number;
980
+ days: (Date | null)[];
981
+ }>;
982
+ /**
983
+ * LRU (Least Recently Used) cache for calendar month generation.
984
+ * Caches generated month arrays to avoid recalculating the same months.
985
+ *
986
+ * @remarks
987
+ * Performance characteristics:
988
+ * - Calendar generation: O(1) per month when cached
989
+ * - Cache lookup: O(1) average case
990
+ * - Cache eviction: O(n) where n = cache size (only when cache is full)
991
+ *
992
+ * The cache automatically evicts the least recently used entry when it reaches
993
+ * MAX_CACHE_SIZE to prevent unbounded memory growth. This is especially important
994
+ * for applications with many datepicker instances or long-running sessions.
995
+ */
996
+ /**
997
+ * Maximum number of months to cache before evicting LRU entries.
998
+ * Now managed by CalendarGenerationService.
999
+ */
1000
+ weekDays: string[];
1001
+ today: Date;
1002
+ selectedDate: Date | null;
1003
+ selectedDates: Date[];
1004
+ startDate: Date | null;
1005
+ endDate: Date | null;
1006
+ hoveredDate: Date | null;
1007
+ rangesArray: {
1008
+ key: string;
1009
+ value: [Date, Date];
1010
+ }[];
1011
+ protected touchState: TouchGestureState;
1012
+ private dateCellTouchHandledTime;
1013
+ private touchHandledTimeout;
1014
+ private readonly activeTimeouts;
1015
+ private readonly activeAnimationFrames;
1016
+ private fieldSyncTimeoutId;
1017
+ private readonly touchListenersSetup;
1018
+ private readonly touchListenersAttached;
1019
+ private bottomSheetSwipeStartY;
1020
+ private bottomSheetSwipeCurrentY;
1021
+ private isBottomSheetSwiping;
1022
+ private readonly bottomSheetSwipeThreshold;
1023
+ private readonly SWIPE_THRESHOLD;
1024
+ private readonly SWIPE_TIME_THRESHOLD;
1025
+ private _currentMonth;
1026
+ _currentYear: number;
1027
+ _currentDecade: number;
1028
+ monthOptions: i0.Signal<{
1029
+ label: string;
1030
+ value: number;
1031
+ }[]>;
1032
+ yearOptions: i0.Signal<{
1033
+ label: string;
1034
+ value: number;
1035
+ }[]>;
1036
+ decadeOptions: {
1037
+ label: string;
1038
+ value: number;
1039
+ }[];
1040
+ yearGrid: number[];
1041
+ hourOptions: {
1042
+ label: string;
1043
+ value: number;
1044
+ }[];
1045
+ minuteOptions: {
1046
+ label: string;
1047
+ value: number;
1048
+ }[];
1049
+ secondOptions: {
1050
+ label: string;
1051
+ value: number;
1052
+ }[];
1053
+ decadeGrid: number[];
1054
+ private firstDayOfWeek;
1055
+ currentHour: number;
1056
+ currentMinute: number;
1057
+ currentSecond: number;
1058
+ currentDisplayHour: number;
1059
+ isPm: boolean;
1060
+ startHour: number;
1061
+ startMinute: number;
1062
+ startSecond: number;
1063
+ startDisplayHour: number;
1064
+ startIsPm: boolean;
1065
+ endHour: number;
1066
+ endMinute: number;
1067
+ endSecond: number;
1068
+ endDisplayHour: number;
1069
+ endIsPm: boolean;
1070
+ ampmOptions: {
1071
+ label: string;
1072
+ value: boolean;
1073
+ }[];
1074
+ timelineMonths: Date[];
1075
+ timelineStartDate: Date;
1076
+ timelineEndDate: Date;
1077
+ private timelineZoomLevel;
1078
+ startTimeSlider: number;
1079
+ endTimeSlider: number;
1080
+ private readonly elementRef;
1081
+ private readonly cdr;
1082
+ private readonly platformId;
1083
+ private readonly globalConfig;
1084
+ private readonly fieldSyncService;
1085
+ private readonly localeRegistry;
1086
+ private readonly translationRegistry;
1087
+ private readonly focusTrapService;
1088
+ private readonly ariaLiveService;
1089
+ private readonly hapticFeedbackService;
1090
+ private readonly calendarGenerationService;
1091
+ private readonly parsingService;
1092
+ private readonly touchService;
1093
+ private readonly popoverPositioningService;
1094
+ readonly ngControl: NgControl | null;
1095
+ private readonly isBrowser;
1096
+ private readonly dateComparator;
1097
+ constructor();
1098
+ typedInputValue: string;
1099
+ private isTyping;
1100
+ popoverContainer?: ElementRef<HTMLElement>;
1101
+ readonly popoverId: string;
1102
+ datepickerInput?: NgxsmkDatepickerInputComponent;
1103
+ datepickerContent?: NgxsmkDatepickerContentComponent;
1104
+ private focusTrapCleanup;
1105
+ _translations: DatepickerTranslations | null;
1106
+ private _translationService;
1107
+ private _changeDetectionScheduled;
1108
+ /**
1109
+ * Schedules change detection to run in the next microtask.
1110
+ * Prevents multiple change detection cycles from being scheduled simultaneously.
1111
+ *
1112
+ * @remarks
1113
+ * This method is essential for zoneless compatibility. When Zone.js is not present,
1114
+ * Angular's automatic change detection doesn't run, so components using OnPush
1115
+ * strategy must manually trigger change detection when state changes.
1116
+ *
1117
+ * The debouncing mechanism prevents excessive change detection cycles when multiple
1118
+ * state changes occur in rapid succession (e.g., during user interactions or async
1119
+ * operations). Only one change detection cycle is scheduled per microtask queue.
1120
+ *
1121
+ * This pattern is compatible with both Zone.js and zoneless Angular applications.
1122
+ */
1123
+ private scheduleChangeDetection;
1124
+ /**
1125
+ * Creates a tracked setTimeout that is automatically cleaned up on component destroy.
1126
+ * All timeouts created through this method are stored in activeTimeouts for proper cleanup.
1127
+ *
1128
+ * @param callback - Function to execute after delay
1129
+ * @param delay - Delay in milliseconds
1130
+ * @returns Timeout ID that can be used with clearTimeout
1131
+ */
1132
+ private trackedSetTimeout;
1133
+ /**
1134
+ * Creates a tracked requestAnimationFrame that is automatically cancelled on component destroy.
1135
+ * All animation frames created through this method are stored in activeAnimationFrames for proper cleanup.
1136
+ *
1137
+ * @param callback - Function to execute on next animation frame
1138
+ * @returns Animation frame ID that can be used with cancelAnimationFrame
1139
+ */
1140
+ private trackedRequestAnimationFrame;
1141
+ /**
1142
+ * Executes a callback after two animation frames, ensuring DOM updates are complete.
1143
+ * Useful for operations that need to run after Angular's change detection and browser rendering.
1144
+ *
1145
+ * @param callback - Function to execute after double animation frame
1146
+ */
1147
+ private trackedDoubleRequestAnimationFrame;
1148
+ /**
1149
+ * Clears all active timeouts. Used when locale or weekStart changes
1150
+ * to cancel any pending operations that might be invalidated by the change.
1151
+ */
1152
+ private clearActiveTimeouts;
1153
+ /**
1154
+ * Debounces field synchronization to prevent race conditions from rapid updates.
1155
+ * Cancels any pending sync operation before scheduling a new one.
1156
+ *
1157
+ * @param delay - Debounce delay in milliseconds (default: 100ms)
1158
+ */
1159
+ private debouncedFieldSync;
1160
+ private readonly _currentMonthSignal;
1161
+ private readonly _currentYearSignal;
1162
+ private readonly _localeSignal;
1163
+ private readonly _holidayProviderSignal;
1164
+ private readonly _disabledStateSignal;
1165
+ /**
1166
+ * Effect that automatically triggers change detection when key signals change.
1167
+ * This reduces the need for manual markForCheck() calls throughout the codebase.
1168
+ */
1169
+ private readonly _changeDetectionEffect;
1170
+ /**
1171
+ * Signal tracking which calendar month indices are currently visible in the viewport.
1172
+ * Used for lazy rendering of multi-calendar layouts to improve performance.
1173
+ */
1174
+ private readonly _visibleCalendarIndicesSignal;
1175
+ /** Bumped when `multiCalendarMonths` is regenerated so `renderedCalendars` invalidates (plain array is not a signal). */
1176
+ private readonly _multiCalendarDataRevision;
1177
+ /**
1178
+ * Computed signal for rendered calendars - only includes visible calendars + buffer.
1179
+ * This dramatically reduces DOM nodes for multi-calendar layouts.
1180
+ */
1181
+ renderedCalendars: i0.Signal<{
1182
+ month: number;
1183
+ year: number;
1184
+ days: (Date | null)[];
1185
+ }[]>;
1186
+ private _cachedIsCurrentMonthMemo;
1187
+ private _cachedIsDateDisabledMemo;
1188
+ private _cachedIsSameDayMemo;
1189
+ private _cachedIsHolidayMemo;
1190
+ private _cachedGetHolidayLabelMemo;
1191
+ private _memoDependencies;
1192
+ private _updateMemoSignals;
1193
+ private passiveTouchListeners;
1194
+ get isInlineMode(): boolean;
1195
+ private clearTouchHandledFlag;
1196
+ private closeMonthYearDropdowns;
1197
+ private setTouchHandledFlag;
1198
+ isMobileDevice(): boolean;
1199
+ shouldUseNativePicker(): boolean;
1200
+ getNativeInputType(): string;
1201
+ formatValueForNativeInput(value: DatepickerValue): string;
1202
+ formatDateForNativeInput(date: Date): string;
1203
+ getMinDateForNativeInput(): string | null;
1204
+ getMaxDateForNativeInput(): string | null;
1205
+ parseNativeInputValue(value: string): DatepickerValue;
1206
+ onNativeInputChange(event: Event): void;
1207
+ onBottomSheetTouchStart(event: TouchEvent): void;
1208
+ onBottomSheetTouchMove(event: TouchEvent): void;
1209
+ onBottomSheetTouchEnd(event: TouchEvent): void;
1210
+ readonly boundIsDateDisabled: (d: Date | null) => boolean;
1211
+ readonly boundIsSameDay: (d1: Date | null, d2: Date | null) => boolean;
1212
+ readonly boundIsHoliday: (d: Date | null) => boolean;
1213
+ readonly boundIsMultipleSelected: (d: Date | null) => boolean;
1214
+ readonly boundIsInRange: (d: Date | null) => boolean;
1215
+ readonly boundIsPreviewInRange: (d: Date | null) => boolean;
1216
+ readonly boundGetAriaLabel: (d: Date | null) => string;
1217
+ readonly boundGetDayCellCustomClasses: (d: Date | null) => string[];
1218
+ readonly boundGetDayCellTooltip: (d: Date | null) => string | null;
1219
+ readonly boundFormatDayNumber: (d: Date | null) => string;
1220
+ readonly boundGetMonthYearLabel: (m: number, y: number) => string;
1221
+ readonly boundGetCalendarAriaLabelForMonth: (m: number, y: number) => string;
1222
+ readonly boundIsTimelineMonthSelected: (d: Date) => boolean;
1223
+ readonly boundFormatTimeSliderValue: (v: number) => string;
1224
+ get isCalendarVisible(): boolean;
1225
+ get displayValue(): string;
1226
+ private syncTypedInputIfNotTyping;
1227
+ private getDisplayValueTimeOnly;
1228
+ private getDisplayValueDateDefault;
1229
+ private formatWithCustomFormat;
1230
+ private formatWithAdapter;
1231
+ private formatWithParsingServiceFallback;
1232
+ /**
1233
+ * Format dates using a custom date format pattern
1234
+ * Supports YYYY, MM, DD, HH, mm, ss, etc.
1235
+ */
1236
+ private formatWithCustomPattern;
1237
+ get isBackArrowDisabled(): boolean;
1238
+ private _invalidateMemoCache;
1239
+ get isCurrentMonthMemo(): (day: Date | null) => boolean;
1240
+ /**
1241
+ * Memoized function for checking if a date is disabled.
1242
+ * Returns a cached function that checks date constraints efficiently.
1243
+ *
1244
+ * @returns A function that checks if a date is disabled
1245
+ *
1246
+ * @remarks
1247
+ * This getter implements memoization to avoid recreating the validation function
1248
+ * on every calendar render. The function is regenerated only when:
1249
+ * - Disabled state constraints change (minDate, maxDate, disabledDates, disabledRanges)
1250
+ * - Current month/year changes
1251
+ *
1252
+ * Performance: O(1) to get the memoized function, O(n) to execute where n = constraints
1253
+ * The memoization significantly improves performance when rendering calendar grids
1254
+ * with many date cells (e.g., multiple calendar months).
1255
+ */
1256
+ get isDateDisabledMemo(): (day: Date | null) => boolean;
1257
+ /**
1258
+ * Memoized function for comparing if two dates are the same day.
1259
+ * Uses an optimized date comparator for efficient day-level comparisons.
1260
+ *
1261
+ * @returns A function that compares two dates for same-day equality
1262
+ *
1263
+ * @remarks
1264
+ * The date comparator normalizes times to start of day before comparison,
1265
+ * ensuring accurate day-level equality checks regardless of time components.
1266
+ *
1267
+ * Performance: O(1) - Simple date field comparisons after normalization
1268
+ */
1269
+ get isSameDayMemo(): (d1: Date | null, d2: Date | null) => boolean;
1270
+ /**
1271
+ * Memoized function for checking if a date is a holiday.
1272
+ * Returns a cached function that uses the current holiday provider.
1273
+ *
1274
+ * @returns A function that checks if a date is a holiday
1275
+ *
1276
+ * @remarks
1277
+ * The function is regenerated when the holidayProvider changes.
1278
+ * This ensures the memoized function always uses the current provider
1279
+ * while avoiding recreation on every calendar render.
1280
+ *
1281
+ * Performance: O(1) to get memoized function, O(1) to execute (depends on provider implementation)
1282
+ */
1283
+ get isHolidayMemo(): (day: Date | null) => boolean;
1284
+ get getHolidayLabelMemo(): (day: Date | null) => string | null;
1285
+ /**
1286
+ * TrackBy function for calendar day cells in *ngFor loops.
1287
+ * Provides stable identity for Angular's change detection optimization.
1288
+ *
1289
+ * @param index - Array index of the day
1290
+ * @param day - The date object (or null for empty cells)
1291
+ * @returns Unique identifier for the day cell
1292
+ *
1293
+ * @remarks
1294
+ * Using timestamp ensures stable identity even when Date objects are recreated.
1295
+ * This significantly improves *ngFor performance by allowing Angular to track
1296
+ * which items have changed, moved, or been removed.
1297
+ */
1298
+ trackByDay(index: number, day: Date | null): string;
1299
+ /**
1300
+ * TrackBy function for calendar month containers in multi-calendar views.
1301
+ * Provides stable identity for efficient change detection.
1302
+ *
1303
+ * @param _index - Array index (unused, using year-month for identity)
1304
+ * @param calendarMonth - The calendar month object
1305
+ * @returns Unique identifier combining year and month
1306
+ */
1307
+ /**
1308
+ * Checks if a DOM node is contained within this datepicker instance,
1309
+ * including its input group and any portaled popover content.
1310
+ *
1311
+ * @param target - The node to check
1312
+ * @returns True if the node is inside this datepicker's DOM tree
1313
+ */
1314
+ containsNode(target: Node | null): boolean;
1315
+ /** Shared logic for closing calendar when user interacts outside (click or touch). */
1316
+ private tryCloseCalendarOnOutsideInteraction;
1317
+ onDocumentClick(event: MouseEvent | TouchEvent): void;
1318
+ onDocumentTouchStart(event: TouchEvent): void;
1319
+ private handleDocumentOutsideInteraction;
1320
+ onTouchStart(event: TouchEvent): void;
1321
+ onInputGroupFocus(): void;
1322
+ private focusInput;
1323
+ onTouchEnd(event: TouchEvent): void;
1324
+ private closeOtherCalendarInstances;
1325
+ private applyCalendarOpenStateFromTouch;
1326
+ onPointerDown(event: PointerEvent): void;
1327
+ onPointerUp(event: PointerEvent): void;
1328
+ private clearPointerTouchState;
1329
+ private applyCalendarCloseState;
1330
+ private applyCalendarOpenStateFromPointer;
1331
+ onKeyDown(event: KeyboardEvent): void;
1332
+ private handleKeyboardNavigation;
1333
+ private tryCustomShortcuts;
1334
+ private tryHooksHandleShortcut;
1335
+ private handleShortcutKey;
1336
+ private handleShortcutNavigationKeys;
1337
+ private handleShortcutArrowKeys;
1338
+ private handleShortcutPageHomeEndKeys;
1339
+ private handleShortcutLetterAndSpecialKeys;
1340
+ isKeyboardHelpOpen: boolean;
1341
+ toggleKeyboardHelp(): void;
1342
+ private getShortcutKey;
1343
+ focusedDate: Date | null;
1344
+ private navigateDate;
1345
+ private navigateToFirstDay;
1346
+ private navigateToLastDay;
1347
+ private selectToday;
1348
+ private selectYesterday;
1349
+ private selectTomorrow;
1350
+ private selectNextWeek;
1351
+ onDateFocus(day: Date | null): void;
1352
+ private isDateValid;
1353
+ getDayCellCustomClasses(day: Date | null): string[];
1354
+ getDayCellTooltip(day: Date | null): string | null;
1355
+ formatDayNumber(day: Date | null): string;
1356
+ /**
1357
+ * Generates an accessible label for a date cell.
1358
+ * Provides screen readers with a descriptive label for each selectable date.
1359
+ *
1360
+ * @param day - The date to generate a label for
1361
+ * @returns Localized date label (e.g., "Monday, January 15, 2024")
1362
+ *
1363
+ * @remarks
1364
+ * The label includes weekday, month, day, and year for full context.
1365
+ * Custom formatting can be provided via the formatAriaLabel hook.
1366
+ * This ensures screen reader users have complete information about each date.
1367
+ */
1368
+ getAriaLabel(day: Date | null): string;
1369
+ /**
1370
+ * ControlValueAccessor implementation: Writes a new value to the form control.
1371
+ * Called by Angular Forms when the form control value changes programmatically.
1372
+ *
1373
+ * @param val - The new value from the form control
1374
+ *
1375
+ * @remarks
1376
+ * This method:
1377
+ * - Normalizes the incoming value to ensure consistent format
1378
+ * - Initializes component state from the value
1379
+ * - Updates memoized signals for change detection
1380
+ * - Regenerates calendar to reflect the new value
1381
+ * - Notifies Material Form Field of state changes
1382
+ * - Syncs with Signal Form field if field input is used
1383
+ *
1384
+ * This is part of the ControlValueAccessor interface, enabling two-way binding
1385
+ * with both Reactive Forms and Template-driven Forms.
1386
+ */
1387
+ writeValue(val: DatepickerValue): void;
1388
+ /**
1389
+ * ControlValueAccessor implementation: Registers a callback for value changes.
1390
+ * Called by Angular Forms to receive notifications when the user changes the value.
1391
+ *
1392
+ * @param fn - Callback function to call when value changes
1393
+ */
1394
+ registerOnChange(fn: (value: DatepickerValue) => void): void;
1395
+ /**
1396
+ * ControlValueAccessor implementation: Registers a callback for touched state.
1397
+ * Called by Angular Forms to receive notifications when the user interacts with the control.
1398
+ *
1399
+ * @param fn - Callback function to call when control is touched
1400
+ */
1401
+ registerOnTouched(fn: () => void): void;
1402
+ setDisabledState(isDisabled: boolean): void;
1403
+ /**
1404
+ * Emits a value change event and updates the internal state.
1405
+ * Handles normalization, form field synchronization, and calendar auto-close behavior.
1406
+ *
1407
+ * @param val - The new datepicker value (Date, Date range, or array of dates)
1408
+ *
1409
+ * @remarks
1410
+ * This method is the central point for value updates and ensures:
1411
+ * - Value normalization for consistent internal representation
1412
+ * - Signal Form field synchronization (if field input is used)
1413
+ * - Event emission for two-way binding
1414
+ * - Touch state tracking for form validation
1415
+ * - Automatic calendar closing for single date and complete range selections
1416
+ *
1417
+ * The calendar auto-closes when:
1418
+ * - Single date mode: After any date selection
1419
+ * - Range mode: After both start and end dates are selected
1420
+ * - Not in inline mode
1421
+ * - Not in time-only mode
1422
+ */
1423
+ private emitValue;
1424
+ /**
1425
+ * Toggles the calendar popover open/closed state.
1426
+ * Handles focus management, accessibility announcements, and prevents rapid toggling.
1427
+ *
1428
+ * @param event - Optional event that triggered the toggle (used to prevent toggle on clear button clicks)
1429
+ *
1430
+ * @remarks
1431
+ * This method implements several important behaviors:
1432
+ * - Debouncing: Prevents rapid toggling within 300ms
1433
+ * - Focus management: Stores previous focus element for restoration
1434
+ * - Accessibility: Announces calendar state changes to screen readers
1435
+ * - Touch optimization: Sets up passive touch listeners for mobile devices
1436
+ *
1437
+ * When opening:
1438
+ * - Stores the currently focused element for restoration
1439
+ * - Sets up focus trap for keyboard navigation
1440
+ * - Announces calendar opening with current month/year
1441
+ *
1442
+ * When closing:
1443
+ * - Removes focus trap
1444
+ * - Restores focus to previous element
1445
+ * - Announces calendar closing
1446
+ */
1447
+ toggleCalendar(event?: Event): void;
1448
+ private applyToggleWithNoEvent;
1449
+ private shouldSkipClickToggle;
1450
+ private applyDefaultMonthForOpen;
1451
+ private applySmartViewModeForOpen;
1452
+ private announceAfterOpen;
1453
+ private announceAfterClose;
1454
+ private announceCalendarOpened;
1455
+ private announceCalendarClosed;
1456
+ onBackdropInteract(event: Event): void;
1457
+ onPopoverEscape(event: Event): void;
1458
+ private scrollDebounceTimer;
1459
+ private readonly updatePositionOnScroll;
1460
+ private _startOpeningState;
1461
+ private _startClosingState;
1462
+ private renderInBody;
1463
+ /** Hides the body-appended popover so loading/calendar are not visible at wrong position. */
1464
+ private hideBodyPopoverUntilPositioned;
1465
+ /** Shows the body-appended popover after positioning has been applied. */
1466
+ private revealBodyPopover;
1467
+ private destroyBodyView;
1468
+ private closeCalendar;
1469
+ private shouldAutoClose;
1470
+ /**
1471
+ * Clears the selected date value(s) and resets the component state.
1472
+ * Emits null value and closes calendar if open.
1473
+ *
1474
+ * @param event - Optional event that triggered the clear action
1475
+ *
1476
+ * @remarks
1477
+ * This method:
1478
+ * - Clears all selected dates (single, range, multiple modes)
1479
+ * - Emits null value to form controls
1480
+ * - Closes calendar if open
1481
+ * - Provides haptic feedback on mobile if enabled
1482
+ * - Resets touch gesture state
1483
+ * - Announces clearing to screen readers
1484
+ *
1485
+ * Used by the clear button and can be called programmatically.
1486
+ */
1487
+ clearValue(event?: MouseEvent | TouchEvent): void;
1488
+ get currentMonth(): number;
1489
+ set currentMonth(month: number);
1490
+ get currentYear(): number;
1491
+ set currentYear(year: number);
1492
+ private _updateToday;
1493
+ ngOnInit(): void;
1494
+ private initializeTimeFromNowIfNeeded;
1495
+ private resolveInitialValue;
1496
+ private resolveInitialValueFromField;
1497
+ ngAfterViewInit(): void;
1498
+ private setupInputGroupPassiveListeners;
1499
+ private _touchListenersSetupTimeout;
1500
+ /**
1501
+ * Sets up passive touch event listeners on calendar day cells for improved mobile performance.
1502
+ * Implements retry logic to handle cases where DOM elements aren't immediately available.
1503
+ * All listeners are tracked for proper cleanup on component destroy.
1504
+ */
1505
+ private setupPassiveTouchListeners;
1506
+ private attachTouchListenersToCells;
1507
+ ngOnChanges(changes: SimpleChanges): void;
1508
+ private handleChangesShowTimeInlineAndLayout;
1509
+ private handleChangesLocaleRtl;
1510
+ private handleChangesWeekStartAndRelated;
1511
+ private applyChangesMinuteAnd24Hour;
1512
+ private handleChangesField;
1513
+ private handleChangesTimeAndMode;
1514
+ private handleChangesDisabledStates;
1515
+ private handleChangesTranslations;
1516
+ private handleChangesMaxDate;
1517
+ private handleChangesValue;
1518
+ private handleChangesStartAt;
1519
+ private handleChangesMinDate;
1520
+ private handleChangesCalendarViewMode;
1521
+ /**
1522
+ * Validates component inputs for conflicts and invalid combinations.
1523
+ * Logs warnings in development mode when invalid configurations are detected.
1524
+ *
1525
+ * @param changes - The SimpleChanges object from ngOnChanges
1526
+ */
1527
+ private validateInputs;
1528
+ private validateInputsMinMaxDate;
1529
+ private validateInputsTimeOnly;
1530
+ private validateInputsIntervals;
1531
+ private validateInputsYearRange;
1532
+ private initializeTimeSliders;
1533
+ private get24Hour;
1534
+ private update12HourState;
1535
+ private applyCurrentTime;
1536
+ private applyTimeIfNeeded;
1537
+ /**
1538
+ * Initializes the component's internal state from a DatepickerValue.
1539
+ * Sets up selected dates, calendar view position, and time values based on the provided value.
1540
+ *
1541
+ * @param value - The datepicker value to initialize from (Date, range, array, or null)
1542
+ *
1543
+ * @remarks
1544
+ * This method handles initialization for all selection modes:
1545
+ * - Single mode: Sets selectedDate
1546
+ * - Range mode: Sets startDate and endDate
1547
+ * - Multiple mode: Sets selectedDates array
1548
+ *
1549
+ * The method also:
1550
+ * - Determines the calendar view center date (uses value, startAt, or minDate as fallback)
1551
+ * - Extracts and sets time values if the date includes time information
1552
+ * - Normalizes all dates to ensure consistent internal representation
1553
+ *
1554
+ * Performance: O(1) for single/range, O(n) for multiple mode where n = array length
1555
+ */
1556
+ private initializeValue;
1557
+ private applyValueToSelection;
1558
+ private resolveViewCenterDate;
1559
+ private _normalizeDate;
1560
+ /**
1561
+ * Normalizes various date input formats into a consistent DatepickerValue type.
1562
+ * Handles Date objects, Moment.js objects, date ranges, arrays, and strings.
1563
+ *
1564
+ * @param val - The value to normalize (can be Date, Moment, range object, array, or string)
1565
+ * @returns Normalized DatepickerValue (Date, range object, array, or null)
1566
+ *
1567
+ * @remarks
1568
+ * This method provides flexible input handling to support:
1569
+ * - Native JavaScript Date objects
1570
+ * - Moment.js objects (with timezone preservation)
1571
+ * - Date range objects: { start: Date, end: Date }
1572
+ * - Arrays of dates for multiple selection mode
1573
+ * - String dates with custom format parsing
1574
+ *
1575
+ * Invalid or unparseable values are normalized to null.
1576
+ * This ensures type safety and consistent internal state representation.
1577
+ */
1578
+ private _normalizeValue;
1579
+ private _normalizeRangeValue;
1580
+ private _normalizeArrayValue;
1581
+ /**
1582
+ * Check if the provided value is a Moment.js object
1583
+ */
1584
+ private isMomentObject;
1585
+ /**
1586
+ * Convert a Moment.js object to a Date, preserving timezone offset
1587
+ */
1588
+ private momentToDate;
1589
+ /**
1590
+ * Compares two DatepickerValue objects for equality.
1591
+ * Handles Date objects, range objects, and arrays with proper date comparison.
1592
+ *
1593
+ * @param val1 - First value to compare
1594
+ * @param val2 - Second value to compare
1595
+ * @returns true if values represent the same date(s), false otherwise
1596
+ *
1597
+ * @remarks
1598
+ * This method performs deep equality checks:
1599
+ * - For Date objects: Compares using date comparator (handles time normalization)
1600
+ * - For range objects: Compares both start and end dates
1601
+ * - For arrays: Compares lengths and all elements
1602
+ * - Handles null/undefined values correctly
1603
+ *
1604
+ * Uses the dateComparator utility for efficient date comparisons that
1605
+ * normalize times to start of day for accurate day-level equality.
1606
+ */
1607
+ private isValueEqual;
1608
+ /**
1609
+ * Parses a date string, optionally using the configured date adapter with error callback.
1610
+ * Falls back to native Date parsing if no adapter is configured.
1611
+ *
1612
+ * @param dateString - The date string to parse
1613
+ * @returns Parsed Date object or null if parsing fails
1614
+ *
1615
+ * @remarks
1616
+ * If a date adapter is configured via globalConfig, it will be used for parsing
1617
+ * with error callbacks. Otherwise, native Date parsing is used.
1618
+ * Error callbacks allow consumers to handle parsing failures gracefully.
1619
+ */
1620
+ onInputFocus(event: FocusEvent): void;
1621
+ /**
1622
+ * Sanitizes user input to prevent XSS attacks.
1623
+ * Removes potentially dangerous characters while preserving valid date/time input.
1624
+ *
1625
+ * @param input - Raw user input string
1626
+ * @returns Sanitized string safe for template interpolation
1627
+ *
1628
+ * @remarks
1629
+ * This method provides basic XSS protection by removing:
1630
+ * - HTML tag delimiters (< and >)
1631
+ * - Script event handlers (onerror, onclick, etc.)
1632
+ * - JavaScript protocol (javascript:)
1633
+ * - Data URIs that could contain scripts
1634
+ *
1635
+ * Note: Angular's template interpolation provides additional protection,
1636
+ * but this sanitization adds an extra layer of defense for user-provided strings.
1637
+ * For comprehensive sanitization, Angular's DomSanitizer should be used for
1638
+ * any HTML content, but for date/time strings, this level of sanitization is sufficient.
1639
+ */
1640
+ private sanitizeInput;
1641
+ onInputChange(event: Event): void;
1642
+ onInputBlur(event: FocusEvent): void;
1643
+ private applyValidationErrorForBlur;
1644
+ onInputKeyDown(event: Event): void;
1645
+ private applyInputMask;
1646
+ private isValidDate;
1647
+ private applyTypedDate;
1648
+ private generateTimeOptions;
1649
+ private generateLocaleData;
1650
+ private updateRangesArray;
1651
+ selectRange(range: [Date, Date]): void;
1652
+ isHoliday(date: Date | null): boolean;
1653
+ getHolidayLabel(date: Date | null): string | null;
1654
+ /**
1655
+ * Checks if a date is disabled based on all configured constraints.
1656
+ *
1657
+ * @param date - The date to check
1658
+ * @returns true if the date is disabled, false if it can be selected
1659
+ *
1660
+ * @remarks
1661
+ * A date is considered disabled if it matches any of these conditions:
1662
+ * - Falls before minDate
1663
+ * - Falls after maxDate
1664
+ * - Is in the disabledDates array
1665
+ * - Falls within a disabledRanges entry
1666
+ * - Fails the isInvalidDate custom validation function
1667
+ * - Is a holiday and disableHolidays is true
1668
+ *
1669
+ * Performance: O(n) where n = disabledDates.length + disabledRanges.length
1670
+ * For large constraint lists (>1000), consider optimizing with Set or DateRange tree.
1671
+ */
1672
+ isDateDisabled(date: Date | null): boolean;
1673
+ private _isInDisabledDates;
1674
+ private _isInDisabledRanges;
1675
+ private _isOutOfMinMaxBounds;
1676
+ /**
1677
+ * Checks if a date is selected in multiple selection mode.
1678
+ *
1679
+ * @param d - The date to check
1680
+ * @returns true if the date is in the selectedDates array
1681
+ *
1682
+ * @remarks
1683
+ * Performance: O(n) where n = selectedDates.length
1684
+ * Uses day-level comparison (ignores time) for accurate matching.
1685
+ */
1686
+ isMultipleSelected(d: Date | null): boolean;
1687
+ /**
1688
+ * Handles time value changes from time selection controls.
1689
+ * Updates the selected date(s) with the new time values.
1690
+ *
1691
+ * @remarks
1692
+ * This method:
1693
+ * - Applies time changes to selected dates based on current mode
1694
+ * - Emits value changes for form integration
1695
+ * - Handles time-only mode by creating a date with current time
1696
+ * - Updates all selected dates in multiple mode
1697
+ * - Ensures startDate <= endDate in range mode
1698
+ */
1699
+ timeChange(): void;
1700
+ /**
1701
+ * Handles time range changes in timeRangeMode.
1702
+ * Updates the internal time range state and emits the time range to listeners.
1703
+ * Only creates/updates time-only dates (no calendar dates).
1704
+ */
1705
+ timeRangeChange(): void;
1706
+ /**
1707
+ * Handles date cell click/tap events.
1708
+ * Processes date selection based on the current mode (single, range, multiple, etc.)
1709
+ * and handles touch gesture debouncing to prevent accidental double selections.
1710
+ *
1711
+ * @param day - The date that was clicked (null for empty cells)
1712
+ *
1713
+ * @remarks
1714
+ * This method implements several important behaviors:
1715
+ * - Touch gesture handling: Debounces rapid touch events to prevent double-clicks
1716
+ * - Date validation: Checks if the date is disabled before processing
1717
+ * - Hook integration: Calls beforeDateSelect hook if provided
1718
+ * - Mode-specific logic: Handles single, range, multiple, week, month, quarter, and year modes
1719
+ * - Calendar navigation: Automatically navigates to different month if date is outside current view
1720
+ * - Accessibility: Announces date selection to screen readers
1721
+ * - Auto-close: Closes calendar after selection in single mode or complete range
1722
+ *
1723
+ * Performance considerations:
1724
+ * - Touch debouncing prevents excessive event processing
1725
+ * - Date normalization happens once per selection
1726
+ * - Calendar regeneration is optimized with caching
1727
+ */
1728
+ onDateClick(day: Date | null): void;
1729
+ /**
1730
+ * Returns true (and cleans up touch state) when the click event should be
1731
+ * ignored because it was already handled by the touch handler within the
1732
+ * deduplication window (250 ms).
1733
+ */
1734
+ private _shouldSkipDueToTouchGuard;
1735
+ private _navigateToMonthOfDay;
1736
+ private _handleSingleModeClick;
1737
+ private _handleRangeModeClick;
1738
+ private _handleRangeEndSelection;
1739
+ /** Completes range with end equal to start when `allowSameDay` is enabled. */
1740
+ private _tryCompleteSameDayRange;
1741
+ private _announceRangeSelected;
1742
+ private _finalizeSameDayRangeOnClose;
1743
+ private _handlePeriodModeClick;
1744
+ private _handleMultipleModeClick;
1745
+ private _applyRecurringPattern;
1746
+ private _syncTimeAfterDateClick;
1747
+ onDateHover(day: Date | null): void;
1748
+ onDateCellTouchStart(event: TouchEvent, day: Date | null): void;
1749
+ onDateCellTouchMove(event: TouchEvent): void;
1750
+ onDateCellTouchEnd(event: TouchEvent, day: Date | null): void;
1751
+ isPreviewInRange(day: Date | null): boolean;
1752
+ private buildCalendarMonths;
1753
+ /**
1754
+ * Generates the calendar view for the current month(s).
1755
+ * Uses LRU caching to optimize performance for frequently accessed months.
1756
+ *
1757
+ * @remarks
1758
+ * Performance characteristics:
1759
+ * - First generation: O(n) where n = number of days in month(s)
1760
+ * - Cached generation: O(1) lookup + O(1) cache access update
1761
+ * - Cache eviction: O(m) where m = cache size (only when cache is full)
1762
+ *
1763
+ * This method:
1764
+ * 1. Generates dropdown options for month/year selection
1765
+ * 2. Generates calendar days for each month in calendarCount
1766
+ * 3. Uses LRU cache to avoid regenerating recently accessed months
1767
+ * 4. Handles month/year rollover when displaying multiple calendars
1768
+ * 5. Updates memoized dependencies for change detection optimization
1769
+ * 6. Supports synchronous scrolling to keep calendars in sync (when enabled)
1770
+ *
1771
+ * The cache key format is `${year}-${month}` to ensure unique identification
1772
+ * of calendar months across different years.
1773
+ *
1774
+ * When syncScroll is enabled, calendars are kept synchronized:
1775
+ * - Calendar 0: currentDate month + (0 * monthGap)
1776
+ * - Calendar 1: currentDate month + (1 * monthGap)
1777
+ * - Calendar 2: currentDate month + (2 * monthGap)
1778
+ */
1779
+ generateCalendar(): void;
1780
+ /**
1781
+ * Preloads adjacent months (previous and next) into the cache for smoother navigation.
1782
+ * Implements lazy loading optimization to improve performance when users navigate between months.
1783
+ *
1784
+ * @param currentYear - Current calendar year
1785
+ * @param currentMonth - Current calendar month (0-11)
1786
+ */
1787
+ private preloadAdjacentMonths;
1788
+ private generateDropdownOptions;
1789
+ private generateYearGrid;
1790
+ private generateDecadeGrid;
1791
+ onYearClick(year: number): void;
1792
+ onDecadeClick(decade: number): void;
1793
+ /**
1794
+ * Changes the displayed decade by the specified delta.
1795
+ * Used in decade view mode for navigating between decades.
1796
+ *
1797
+ * @param delta - Number of decades to change (positive for future, negative for past)
1798
+ *
1799
+ * @remarks
1800
+ * Each delta unit represents 10 years. The method updates the decade grid
1801
+ * to show the new range of decades available for selection.
1802
+ */
1803
+ changeDecade(delta: number): void;
1804
+ /**
1805
+ * Changes the displayed calendar year by the specified delta.
1806
+ * Updates year grid and calendar view, and announces the change to screen readers.
1807
+ *
1808
+ * @param delta - Number of years to change (positive for future, negative for past)
1809
+ *
1810
+ * @remarks
1811
+ * This method:
1812
+ * - Updates currentYear and currentDate
1813
+ * - Regenerates year grid and calendar view
1814
+ * - Announces year change to screen readers for accessibility
1815
+ * - Handles touch listener setup for mobile devices
1816
+ *
1817
+ * Performance: O(1) for year change, O(n) for grid/calendar generation
1818
+ */
1819
+ changeYear(delta: number): void;
1820
+ onViewModeChange(mode: 'month' | 'year' | 'decade' | 'timeline' | 'time-slider'): void;
1821
+ onYearSelectChange(year: unknown): void;
1822
+ private generateTimeline;
1823
+ timelineZoomIn(): void;
1824
+ timelineZoomOut(): void;
1825
+ isTimelineMonthSelected(month: Date): boolean;
1826
+ onTimelineMonthClick(month: Date): void;
1827
+ formatTimeSliderValue(minutes: number): string;
1828
+ onStartTimeSliderChange(minutes: number): void;
1829
+ onEndTimeSliderChange(minutes: number): void;
1830
+ onCalendarSwipeStart(event: TouchEvent): void;
1831
+ onCalendarSwipeMove(event: TouchEvent): void;
1832
+ onCalendarSwipeEnd(event: TouchEvent): void;
1833
+ changeMonth(delta: number): void;
1834
+ isSameDay(d1: Date | null, d2: Date | null): boolean;
1835
+ isCurrentMonth(day: Date | null): boolean;
1836
+ isInRange(d: Date | null): boolean;
1837
+ private applyGlobalConfig;
1838
+ private applyGlobalConfigDefaults;
1839
+ private applyGlobalConfigLocaleAndDates;
1840
+ private applyGlobalConfigMobile;
1841
+ /**
1842
+ * Apply animation configuration from global config
1843
+ */
1844
+ private applyAnimationConfig;
1845
+ /**
1846
+ * Initialize translations from service or registry
1847
+ */
1848
+ private initializeTranslations;
1849
+ /**
1850
+ * Generates an accessible label for the calendar dialog.
1851
+ * Provides screen readers with context about which month/year is being displayed.
1852
+ *
1853
+ * @returns Localized calendar label (e.g., "Calendar for January 2024")
1854
+ */
1855
+ getCalendarAriaLabel(): string;
1856
+ /**
1857
+ * Generates an accessible label for a specific calendar month in multi-calendar views.
1858
+ *
1859
+ * @param month - Month index (0-11)
1860
+ * @param year - Year number
1861
+ * @returns Localized calendar label for the specified month/year
1862
+ */
1863
+ getCalendarAriaLabelForMonth(month: number, year: number): string;
1864
+ /**
1865
+ * Sets up IntersectionObserver for lazy loading multi-calendar months.
1866
+ * Only initializes if multi-calendar is enabled (calendarCount > 1).
1867
+ *
1868
+ * @remarks
1869
+ * Uses IntersectionObserver to track which calendar month elements are visible
1870
+ * in the viewport. Updates the visible indices signal to enable/disable rendering.
1871
+ */
1872
+ private setupLazyLoadingObserver;
1873
+ /**
1874
+ * Formats a month and year into a display label.
1875
+ *
1876
+ * @param month - Month index (0-11)
1877
+ * @param year - Year number
1878
+ * @returns Formatted string like "January 2024"
1879
+ */
1880
+ getMonthYearLabel(month: number, year: number): string;
1881
+ isCurrentMonthForCalendar(day: Date | null, targetMonth: number, targetYear: number): boolean;
1882
+ getTranslation(key: keyof DatepickerTranslations, fallbackKey?: keyof DatepickerTranslations, params?: Record<string, string | number>): string;
1883
+ /**
1884
+ * Closes the calendar and restores focus to the previously focused element.
1885
+ * This improves accessibility by returning focus to the trigger element.
1886
+ */
1887
+ closeCalendarWithFocusRestore(): void;
1888
+ private updateRtlState;
1889
+ /**
1890
+ * Component lifecycle hook: Cleanup all resources, subscriptions, and event listeners.
1891
+ * Ensures no memory leaks by:
1892
+ * - Removing instance from static registry
1893
+ * - Cleaning up field sync service
1894
+ * - Completing stateChanges subject
1895
+ * - Clearing all tracked timeouts and animation frames
1896
+ * - Removing touch event listeners
1897
+ * - Invalidating month cache
1898
+ */
1899
+ ngOnDestroy(): void;
1900
+ private getActualPopoverContainer;
1901
+ private setupFocusTrap;
1902
+ /**
1903
+ * Positions the popover relative to the input element dynamically.
1904
+ * - Prioritizes layout below the input.
1905
+ * - Falls back to positioning above if required.
1906
+ * - Defaults to CSS-centered positioning if space is insufficient.
1907
+ *
1908
+ * @remarks
1909
+ * This logic primarily targets mobile/tablet viewports; desktop layout (≥1024px)
1910
+ * is handled via CSS absolute positioning.
1911
+ */
1912
+ private positionPopoverRelativeToInput;
1913
+ /**
1914
+ * Determines if the component is operating within an Ionic environment.
1915
+ * This detection disables features that may conflict with Ionic's overlay system.
1916
+ */
1917
+ private isIonicEnvironment;
1918
+ private removeFocusTrap;
1919
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxsmkDatepickerComponent, never>;
1920
+ static ɵcmp: i0.ɵɵComponentDeclaration<NgxsmkDatepickerComponent, "ngxsmk-datepicker", never, { "mode": { "alias": "mode"; "required": false; }; "calendarViewMode": { "alias": "calendarViewMode"; "required": false; }; "isInvalidDate": { "alias": "isInvalidDate"; "required": false; }; "showRanges": { "alias": "showRanges"; "required": false; }; "showTime": { "alias": "showTime"; "required": false; }; "timeOnly": { "alias": "timeOnly"; "required": false; }; "timeRangeMode": { "alias": "timeRangeMode"; "required": false; }; "showCalendarButton": { "alias": "showCalendarButton"; "required": false; }; "minuteInterval": { "alias": "minuteInterval"; "required": false; }; "use24Hour": { "alias": "use24Hour"; "required": false; }; "secondInterval": { "alias": "secondInterval"; "required": false; }; "showSeconds": { "alias": "showSeconds"; "required": false; }; "holidayProvider": { "alias": "holidayProvider"; "required": false; }; "disableHolidays": { "alias": "disableHolidays"; "required": false; }; "disabledDates": { "alias": "disabledDates"; "required": false; }; "disabledRanges": { "alias": "disabledRanges"; "required": false; }; "recurringPattern": { "alias": "recurringPattern"; "required": false; }; "dateTemplate": { "alias": "dateTemplate"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "name": { "alias": "name"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; "translations": { "alias": "translations"; "required": false; }; "translationService": { "alias": "translationService"; "required": false; }; "clearLabel": { "alias": "clearLabel"; "required": false; }; "closeLabel": { "alias": "closeLabel"; "required": false; }; "prevMonthAriaLabel": { "alias": "prevMonthAriaLabel"; "required": false; }; "nextMonthAriaLabel": { "alias": "nextMonthAriaLabel"; "required": false; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; }; "closeAriaLabel": { "alias": "closeAriaLabel"; "required": false; }; "weekStart": { "alias": "weekStart"; "required": false; }; "yearRange": { "alias": "yearRange"; "required": false; }; "timezone": { "alias": "timezone"; "required": false; }; "hooks": { "alias": "hooks"; "required": false; }; "enableKeyboardShortcuts": { "alias": "enableKeyboardShortcuts"; "required": false; }; "customShortcuts": { "alias": "customShortcuts"; "required": false; }; "autoApplyClose": { "alias": "autoApplyClose"; "required": false; }; "allowSameDay": { "alias": "allowSameDay"; "required": false; }; "displayFormat": { "alias": "displayFormat"; "required": false; }; "allowTyping": { "alias": "allowTyping"; "required": false; }; "calendarCount": { "alias": "calendarCount"; "required": false; }; "calendarLayout": { "alias": "calendarLayout"; "required": false; }; "defaultMonthOffset": { "alias": "defaultMonthOffset"; "required": false; }; "syncScroll": { "alias": "syncScroll"; "required": false; }; "align": { "alias": "align"; "required": false; }; "useNativePicker": { "alias": "useNativePicker"; "required": false; }; "enableHapticFeedback": { "alias": "enableHapticFeedback"; "required": false; }; "mobileModalStyle": { "alias": "mobileModalStyle"; "required": false; }; "mobileTimePickerStyle": { "alias": "mobileTimePickerStyle"; "required": false; }; "enablePullToRefresh": { "alias": "enablePullToRefresh"; "required": false; }; "mobileTheme": { "alias": "mobileTheme"; "required": false; }; "enableVoiceInput": { "alias": "enableVoiceInput"; "required": false; }; "autoDetectMobile": { "alias": "autoDetectMobile"; "required": false; }; "disableFocusTrap": { "alias": "disableFocusTrap"; "required": false; }; "appendToBody": { "alias": "appendToBody"; "required": false; }; "value": { "alias": "value"; "required": false; }; "field": { "alias": "field"; "required": false; }; "startAt": { "alias": "startAt"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "dateFormatPattern": { "alias": "dateFormatPattern"; "required": false; }; "animationConfig": { "alias": "animationConfig"; "required": false; }; "rtl": { "alias": "rtl"; "required": false; }; "classes": { "alias": "classes"; "required": false; }; "disabledState": { "alias": "disabledState"; "required": false; }; "required": { "alias": "required"; "required": false; }; "errorState": { "alias": "errorState"; "required": false; }; "userAriaDescribedBy": { "alias": "userAriaDescribedBy"; "required": false; }; "minDate": { "alias": "minDate"; "required": false; }; "maxDate": { "alias": "maxDate"; "required": false; }; "ranges": { "alias": "ranges"; "required": false; }; }, { "valueChange": "valueChange"; "action": "action"; "validationError": "validationError"; }, never, never, true, never>;
1921
+ }
1922
+
1923
+ /**
1924
+ * Wrapper NgModule for the standalone datepicker component.
1925
+ * Use this in your `imports` array if you see NG1010 ("imports must be an array...
1926
+ * Value could not be determined statically") when using the Angular compiler plugin
1927
+ * or in strict AOT builds.
1928
+ *
1929
+ * @example
1930
+ * ```typescript
1931
+ * import { NgxsmkDatepickerModule } from 'ngxsmk-datepicker';
1932
+ *
1933
+ * @Component({
1934
+ * standalone: true,
1935
+ * imports: [NgxsmkDatepickerModule], // single static reference
1936
+ * template: '<ngxsmk-datepicker></ngxsmk-datepicker>'
1937
+ * })
1938
+ * export class MyComponent {}
1939
+ * ```
1940
+ *
1941
+ * For NgModule-based apps:
1942
+ * ```typescript
1943
+ * @NgModule({
1944
+ * imports: [NgxsmkDatepickerModule],
1945
+ * exports: [NgxsmkDatepickerModule]
1946
+ * })
1947
+ * export class MyFeatureModule {}
1948
+ * ```
1949
+ */
1950
+ declare class NgxsmkDatepickerModule {
1951
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgxsmkDatepickerModule, never>;
1952
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NgxsmkDatepickerModule, never, [typeof NgxsmkDatepickerComponent], [typeof NgxsmkDatepickerComponent]>;
1953
+ static ɵinj: i0.ɵɵInjectorDeclaration<NgxsmkDatepickerModule>;
1954
+ }
1955
+
1956
+ interface ExportOptions {
1957
+ includeTime?: boolean;
1958
+ dateFormat?: string;
1959
+ timezone?: string;
1960
+ csvHeaders?: string[];
1961
+ }
1962
+ declare function exportToJson(value: DatepickerValue, options?: ExportOptions): string;
1963
+ declare function importFromJson(jsonString: string): DatepickerValue;
1964
+ declare function exportToCsv(value: DatepickerValue, options?: ExportOptions): string;
1965
+ declare function importFromCsv(csvString: string): DatepickerValue;
1966
+ declare function exportToIcs(value: DatepickerValue, options?: ExportOptions & {
1967
+ summary?: string;
1968
+ description?: string;
1969
+ location?: string;
1970
+ }): string;
1971
+ declare function importFromIcs(icsString: string): DatepickerValue;
1972
+
1973
+ /**
1974
+ * Format a date with timezone support
1975
+ * @param date The date to format
1976
+ * @param locale The locale for formatting
1977
+ * @param options Intl.DateTimeFormatOptions
1978
+ * @param timezone Optional timezone (IANA timezone name, e.g., 'America/New_York', 'UTC', 'Europe/London')
1979
+ * @returns Formatted date string
1980
+ */
1981
+ declare function formatDateWithTimezone(date: Date, locale: string, options: Intl.DateTimeFormatOptions, timezone?: string): string;
1982
+ /**
1983
+ * Parse a date string with timezone awareness
1984
+ * @param dateString The date string to parse
1985
+ * @param timezone Optional timezone for parsing (IANA timezone name)
1986
+ * @returns Date object (always in UTC internally)
1987
+ */
1988
+ declare function parseDateWithTimezone(dateString: string, timezone?: string): Date | null;
1989
+ /**
1990
+ * Convert a date from one timezone to another
1991
+ * @param date The date to convert
1992
+ * @param fromTimezone Source timezone (IANA name)
1993
+ * @param _toTimezone Target timezone (IANA name) - currently unused in simplified implementation
1994
+ * @returns New Date object (still UTC internally, but represents the time in target timezone)
1995
+ */
1996
+ declare function convertTimezone(date: Date, fromTimezone: string, _toTimezone: string): Date;
1997
+ /**
1998
+ * Get the current timezone offset in minutes for a given timezone
1999
+ * @param timezone IANA timezone name
2000
+ * @param date Optional date to check offset for (defaults to now)
2001
+ * @returns Offset in minutes from UTC
2002
+ */
2003
+ declare function getTimezoneOffset(timezone: string, date?: Date): number;
2004
+ /**
2005
+ * Check if a timezone string is valid
2006
+ * @param timezone IANA timezone name
2007
+ * @returns true if valid, false otherwise
2008
+ */
2009
+ declare function isValidTimezone(timezone: string): boolean;
2010
+
2011
+ /**
2012
+ * Calendar system types supported by the datepicker
2013
+ */
2014
+ type CalendarSystem = 'gregorian' | 'islamic' | 'buddhist' | 'japanese' | 'hebrew' | 'persian';
2015
+ /**
2016
+ * Locale data structure for datepicker localization
2017
+ */
2018
+ interface LocaleData {
2019
+ /** Calendar system used by this locale */
2020
+ calendar: CalendarSystem;
2021
+ /** First day of the week (0 = Sunday, 1 = Monday, etc.) */
2022
+ firstDayOfWeek: number;
2023
+ /** Default date format string (e.g., 'MM/DD/YYYY', 'DD/MM/YYYY') */
2024
+ dateFormat: string;
2025
+ /** Full month names (12 elements) */
2026
+ monthNames: string[];
2027
+ /** Short month names (12 elements) */
2028
+ monthNamesShort: string[];
2029
+ /** Full weekday names (7 elements, starting with Sunday) */
2030
+ weekdayNames: string[];
2031
+ /** Short weekday names (7 elements, starting with Sunday) */
2032
+ weekdayNamesShort: string[];
2033
+ /** Whether this locale uses RTL (right-to-left) text direction */
2034
+ isRtl: boolean;
2035
+ /** Fallback locale if this one is not fully supported */
2036
+ fallbackLocale?: string;
2037
+ /** Locale-specific date format options */
2038
+ dateFormatOptions?: {
2039
+ year?: 'numeric' | '2-digit';
2040
+ month?: 'numeric' | '2-digit' | 'long' | 'short' | 'narrow';
2041
+ day?: 'numeric' | '2-digit';
2042
+ hour?: 'numeric' | '2-digit';
2043
+ minute?: 'numeric' | '2-digit';
2044
+ hour12?: boolean;
2045
+ };
2046
+ }
2047
+ /**
2048
+ * Service for managing locale data and providing fallback mechanisms
2049
+ * Supports multiple calendar systems and provides locale-specific formatting
2050
+ */
2051
+ declare class LocaleRegistryService {
2052
+ private localeData;
2053
+ private readonly defaultLocale;
2054
+ constructor();
2055
+ /**
2056
+ * Register locale data for a specific locale
2057
+ */
2058
+ register(locale: string, data: LocaleData): void;
2059
+ /**
2060
+ * Get locale data for a specific locale, with fallback support
2061
+ */
2062
+ getLocaleData(locale: string): LocaleData;
2063
+ /**
2064
+ * Get fallback locale for an unsupported locale
2065
+ */
2066
+ getFallbackLocale(unsupportedLocale: string): string | null;
2067
+ /**
2068
+ * Check if a locale is RTL
2069
+ */
2070
+ isRtlLocale(locale: string): boolean;
2071
+ /**
2072
+ * Get calendar system for a locale
2073
+ */
2074
+ getCalendarSystem(locale: string): CalendarSystem;
2075
+ /**
2076
+ * Register default locale data for common locales
2077
+ */
2078
+ private registerDefaultLocales;
2079
+ /**
2080
+ * Get default locale data (English US)
2081
+ */
2082
+ private getDefaultLocaleData;
2083
+ static ɵfac: i0.ɵɵFactoryDeclaration<LocaleRegistryService, never>;
2084
+ static ɵprov: i0.ɵɵInjectableDeclaration<LocaleRegistryService>;
2085
+ }
2086
+
2087
+ /**
2088
+ * Service for managing datepicker translations
2089
+ * Provides default translations for major languages
2090
+ */
2091
+ declare class TranslationRegistryService {
2092
+ private translations;
2093
+ constructor();
2094
+ /**
2095
+ * Register translations for a locale
2096
+ */
2097
+ register(locale: string, translations: DatepickerTranslations): void;
2098
+ /**
2099
+ * Get translations for a locale with fallback support
2100
+ */
2101
+ getTranslations(locale: string): DatepickerTranslations;
2102
+ /**
2103
+ * Register default translations for major languages
2104
+ */
2105
+ private registerDefaultTranslations;
2106
+ /**
2107
+ * Get English translations (default)
2108
+ */
2109
+ private getEnglishTranslations;
2110
+ static ɵfac: i0.ɵɵFactoryDeclaration<TranslationRegistryService, never>;
2111
+ static ɵprov: i0.ɵɵInjectableDeclaration<TranslationRegistryService>;
2112
+ }
2113
+
2114
+ /**
2115
+ * Service for custom date formatting patterns.
2116
+ * Supports custom patterns beyond standard Angular DatePipe formats.
2117
+ *
2118
+ * @remarks
2119
+ * Supports the following pattern tokens:
2120
+ * - YYYY: 4-digit year (e.g., 2025)
2121
+ * - YY: 2-digit year (e.g., 25)
2122
+ * - MMMM: Full month name (e.g., January)
2123
+ * - MMM: Abbreviated month name (e.g., Jan)
2124
+ * - MM: 2-digit month (e.g., 01)
2125
+ * - M: 1 or 2-digit month (e.g., 1)
2126
+ * - DDDD: Full weekday name (e.g., Monday)
2127
+ * - DDD: Abbreviated weekday name (e.g., Mon)
2128
+ * - DD: 2-digit day (e.g., 05)
2129
+ * - D: 1 or 2-digit day (e.g., 5)
2130
+ * - HH: 2-digit hour (24-hour format, e.g., 14)
2131
+ * - H: 1 or 2-digit hour (24-hour format, e.g., 14)
2132
+ * - hh: 2-digit hour (12-hour format, e.g., 02)
2133
+ * - h: 1 or 2-digit hour (12-hour format, e.g., 2)
2134
+ * - mm: 2-digit minutes (e.g., 05)
2135
+ * - m: 1 or 2-digit minutes (e.g., 5)
2136
+ * - ss: 2-digit seconds (e.g., 09)
2137
+ * - s: 1 or 2-digit seconds (e.g., 9)
2138
+ * - A/a: AM/PM or am/pm
2139
+ */
2140
+ declare class CustomDateFormatService {
2141
+ private locale;
2142
+ private readonly monthNames;
2143
+ private readonly weekdayNames;
2144
+ constructor(locale?: string);
2145
+ /**
2146
+ * Set the locale for formatting
2147
+ */
2148
+ setLocale(locale: string): void;
2149
+ /**
2150
+ * Format a date using a custom pattern
2151
+ *
2152
+ * @param date - The date to format
2153
+ * @param pattern - The custom format pattern
2154
+ * @returns Formatted date string
2155
+ */
2156
+ format(date: Date, pattern: string): string;
2157
+ /**
2158
+ * Parse a formatted date string back to a Date object
2159
+ * Note: This is a best-effort implementation and may not work for all patterns
2160
+ *
2161
+ * @param dateString - The date string to parse
2162
+ * @param pattern - The format pattern used
2163
+ * @returns Parsed Date object, or null if parsing fails
2164
+ */
2165
+ parse(dateString: string, _pattern: string): Date | null;
2166
+ private getMonthNames;
2167
+ private initializeLocaleData;
2168
+ private getWeekdayNames;
2169
+ }
2170
+
2171
+ /**
2172
+ * Theme builder service for generating CSS-in-JS styles and managing themes
2173
+ */
2174
+ declare class ThemeBuilderService implements OnDestroy {
2175
+ private readonly platformId;
2176
+ private styleElement;
2177
+ private scopedStyleElements;
2178
+ /**
2179
+ * Map theme color keys to actual CSS variable names
2180
+ */
2181
+ private mapColorKey;
2182
+ /**
2183
+ * Map typography keys to actual CSS variable names
2184
+ */
2185
+ private mapTypographyKey;
2186
+ /**
2187
+ * Generate CSS variables from a theme object
2188
+ */
2189
+ generateTheme(theme: DatepickerTheme): string;
2190
+ /**
2191
+ * Apply theme to a specific element or globally
2192
+ * @param theme The theme to apply
2193
+ * @param targetElement Optional specific element to apply theme to. If not provided, applies globally.
2194
+ */
2195
+ applyTheme(theme: DatepickerTheme, targetElement?: HTMLElement): void;
2196
+ /**
2197
+ * Apply theme variables directly to all datepicker elements (for global theme)
2198
+ * Optimized version with batch DOM operations
2199
+ */
2200
+ private applyToElements;
2201
+ /**
2202
+ * Generate CSS-in-JS style object (for styled-components, emotion, etc.)
2203
+ */
2204
+ generateStyleObject(theme: DatepickerTheme): Record<string, string>;
2205
+ /**
2206
+ * Remove applied theme
2207
+ * @param targetElement Optional specific element to remove theme from. If not provided, removes from all.
2208
+ */
2209
+ removeTheme(targetElement?: HTMLElement): void;
2210
+ /**
2211
+ * Get current theme from CSS variables
2212
+ */
2213
+ getCurrentTheme(selector?: string): Partial<DatepickerTheme>;
2214
+ /**
2215
+ * Clean up all themes and resources when service is destroyed
2216
+ */
2217
+ cleanupAllThemes(): void;
2218
+ ngOnDestroy(): void;
2219
+ static ɵfac: i0.ɵɵFactoryDeclaration<ThemeBuilderService, never>;
2220
+ static ɵprov: i0.ɵɵInjectableDeclaration<ThemeBuilderService>;
2221
+ }
2222
+ /**
2223
+ * Datepicker theme interface
2224
+ */
2225
+ interface DatepickerTheme {
2226
+ colors?: {
2227
+ primary?: string;
2228
+ secondary?: string;
2229
+ background?: string;
2230
+ surface?: string;
2231
+ text?: string;
2232
+ textSecondary?: string;
2233
+ border?: string;
2234
+ hover?: string;
2235
+ active?: string;
2236
+ disabled?: string;
2237
+ error?: string;
2238
+ [key: string]: string | undefined;
2239
+ };
2240
+ spacing?: {
2241
+ xs?: string;
2242
+ sm?: string;
2243
+ md?: string;
2244
+ lg?: string;
2245
+ xl?: string;
2246
+ [key: string]: string | undefined;
2247
+ };
2248
+ typography?: {
2249
+ fontFamily?: string;
2250
+ fontSize?: string;
2251
+ fontWeight?: string;
2252
+ lineHeight?: string;
2253
+ [key: string]: string | undefined;
2254
+ };
2255
+ borderRadius?: {
2256
+ sm?: string;
2257
+ md?: string;
2258
+ lg?: string;
2259
+ full?: string;
2260
+ [key: string]: string | undefined;
2261
+ };
2262
+ shadows?: {
2263
+ sm?: string;
2264
+ md?: string;
2265
+ lg?: string;
2266
+ /** Focus ring (e.g. input focus). Use a color-mix or rgba for 15% opacity. Example: 0 0 0 3px color-mix(in srgb, var(--datepicker-primary-color) 15%, transparent) */
2267
+ focus?: string;
2268
+ [key: string]: string | undefined;
2269
+ };
2270
+ }
2271
+
2272
+ /**
2273
+ * Date preset interface
2274
+ */
2275
+ interface DatePreset {
2276
+ id: string;
2277
+ name: string;
2278
+ value: DatepickerValue;
2279
+ createdAt: Date;
2280
+ updatedAt: Date;
2281
+ category?: string;
2282
+ description?: string;
2283
+ }
2284
+ /**
2285
+ * Service for managing date presets with localStorage persistence
2286
+ */
2287
+ declare class DatePresetsService {
2288
+ private readonly platformId;
2289
+ private readonly storageKey;
2290
+ private presets;
2291
+ constructor();
2292
+ /**
2293
+ * Save a date preset
2294
+ */
2295
+ savePreset(preset: Omit<DatePreset, 'id' | 'createdAt' | 'updatedAt'>): DatePreset;
2296
+ /**
2297
+ * Update an existing preset
2298
+ */
2299
+ updatePreset(id: string, updates: Partial<Omit<DatePreset, 'id' | 'createdAt'>>): DatePreset | null;
2300
+ /**
2301
+ * Get a preset by ID
2302
+ */
2303
+ getPreset(id: string): DatePreset | null;
2304
+ /**
2305
+ * Get all presets
2306
+ */
2307
+ getAllPresets(): DatePreset[];
2308
+ /**
2309
+ * Get presets by category
2310
+ */
2311
+ getPresetsByCategory(category: string): DatePreset[];
2312
+ /**
2313
+ * Get all categories
2314
+ */
2315
+ getCategories(): string[];
2316
+ /**
2317
+ * Delete a preset
2318
+ */
2319
+ deletePreset(id: string): boolean;
2320
+ /**
2321
+ * Clear all presets
2322
+ */
2323
+ clearPresets(): void;
2324
+ /**
2325
+ * Apply a preset value (returns the value, not the preset object)
2326
+ */
2327
+ applyPreset(id: string): DatepickerValue | null;
2328
+ /**
2329
+ * Check if a preset exists
2330
+ */
2331
+ hasPreset(id: string): boolean;
2332
+ /**
2333
+ * Get preset count
2334
+ */
2335
+ getPresetCount(): number;
2336
+ /**
2337
+ * Export presets to JSON
2338
+ */
2339
+ exportPresets(): string;
2340
+ /**
2341
+ * Import presets from JSON
2342
+ */
2343
+ importPresets(jsonString: string, merge?: boolean): {
2344
+ imported: number;
2345
+ errors: number;
2346
+ };
2347
+ private loadPresets;
2348
+ private persistPresets;
2349
+ private generateId;
2350
+ private cloneValue;
2351
+ private deserializeValue;
2352
+ static ɵfac: i0.ɵɵFactoryDeclaration<DatePresetsService, never>;
2353
+ static ɵprov: i0.ɵɵInjectableDeclaration<DatePresetsService>;
2354
+ }
2355
+
2356
+ declare class AriaLiveService implements OnDestroy {
2357
+ private readonly platformId;
2358
+ private readonly isBrowser;
2359
+ private politeRegion;
2360
+ private assertiveRegion;
2361
+ private politeClearTimeoutId;
2362
+ private assertiveClearTimeoutId;
2363
+ private debounceTimeoutId;
2364
+ private announcementQueue;
2365
+ private readonly DEBOUNCE_DELAY;
2366
+ private readonly CLEAR_DELAY;
2367
+ constructor();
2368
+ /**
2369
+ * Announce a message to screen readers with improved timing and queue management
2370
+ */
2371
+ announce(message: string, priority?: 'polite' | 'assertive'): void;
2372
+ /**
2373
+ * Process queued announcements, keeping only the most recent for each priority
2374
+ */
2375
+ private processAnnouncementQueue;
2376
+ /**
2377
+ * Announce to a specific live region
2378
+ */
2379
+ private announceToRegion;
2380
+ /**
2381
+ * Set announcement text and schedule cleanup
2382
+ */
2383
+ private setAnnouncement;
2384
+ /**
2385
+ * Create a live region for announcements
2386
+ */
2387
+ private createLiveRegion;
2388
+ ngOnDestroy(): void;
2389
+ destroy(): void;
2390
+ static ɵfac: i0.ɵɵFactoryDeclaration<AriaLiveService, never>;
2391
+ static ɵprov: i0.ɵɵInjectableDeclaration<AriaLiveService>;
2392
+ }
2393
+
2394
+ declare class FocusTrapService implements OnDestroy {
2395
+ private activeTraps;
2396
+ private focusableSelectors;
2397
+ /**
2398
+ * Trap focus within an element and restore focus on cleanup
2399
+ */
2400
+ trapFocus(elementRef: ElementRef<HTMLElement>): () => void;
2401
+ /**
2402
+ * Remove focus trap and restore previous focus
2403
+ */
2404
+ private removeFocusTrap;
2405
+ private getFirstFocusable;
2406
+ private getLastFocusable;
2407
+ ngOnDestroy(): void;
2408
+ static ɵfac: i0.ɵɵFactoryDeclaration<FocusTrapService, never>;
2409
+ static ɵprov: i0.ɵɵInjectableDeclaration<FocusTrapService>;
2410
+ }
2411
+
2412
+ declare class HapticFeedbackService {
2413
+ private readonly platformId;
2414
+ private readonly isBrowser;
2415
+ private readonly isSupported;
2416
+ /**
2417
+ * Trigger light haptic feedback (short vibration)
2418
+ */
2419
+ light(): void;
2420
+ selection(): void;
2421
+ medium(): void;
2422
+ heavy(): void;
2423
+ /**
2424
+ * Trigger custom vibration pattern
2425
+ * @param pattern Vibration pattern in milliseconds
2426
+ */
2427
+ custom(pattern: number | number[]): void;
2428
+ static ɵfac: i0.ɵɵFactoryDeclaration<HapticFeedbackService, never>;
2429
+ static ɵprov: i0.ɵɵInjectableDeclaration<HapticFeedbackService>;
2430
+ }
2431
+
2432
+ export { AriaLiveService, CustomDateFormatService, CustomSelectComponent, DATEPICKER_CONFIG, DEFAULT_ANIMATION_CONFIG, DEFAULT_DATEPICKER_CONFIG, DatePresetsService, DefaultTranslationService, FieldSyncService, FocusTrapService, HapticFeedbackService, LocaleRegistryService, NativeDateAdapter, NgxsmkDatepickerComponent, NgxsmkDatepickerModule, ThemeBuilderService, TranslationRegistryService, addMonths, convertTimezone, exportToCsv, exportToIcs, exportToJson, formatDateWithTimezone, formatLocaleNumber, generateDecadeGrid, generateMonthOptions, generateTimeOptions, generateWeekDays, generateYearGrid, generateYearOptions, get24Hour, getEndOfDay, getEndOfMonth, getFirstDayOfWeek, getStartOfDay, getStartOfMonth, getTimezoneOffset, importFromCsv, importFromIcs, importFromJson, isSameDay, isValidTimezone, normalizeDate, parseDateWithTimezone, processDateRanges, provideDatepickerConfig, subtractDays, update12HourState };
2433
+ export type { AnimationConfig, CalendarSystem, DateAdapter, DateFormatHook, DateInput, DatePreset, DateRange, DatepickerConfig, DatepickerHooks, DatepickerTheme, DatepickerTranslations, DatepickerValue, DayCellRenderHook, EventHook, ExportOptions, HolidayProvider, KeyboardShortcutContext, KeyboardShortcutHelp, KeyboardShortcutHook, LocaleData, PartialDatepickerTranslations, SignalFormField, SignalFormFieldConfig, TranslationService, ValidationHook };