ngxsmk-datepicker 1.4.13 → 1.4.14
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.
- package/README.md +57 -1
- package/fesm2022/ngxsmk-datepicker.mjs +37 -5
- package/fesm2022/ngxsmk-datepicker.mjs.map +1 -1
- package/index.d.ts +3 -1
- package/package.json +8 -1
package/README.md
CHANGED
|
@@ -37,6 +37,8 @@ This library has been optimized for maximum performance:
|
|
|
37
37
|
- **Inline and Popover Display**: Can be rendered inline or as a popover with automatic mode detection
|
|
38
38
|
- **Light and Dark Themes**: Includes built-in support for light and dark modes
|
|
39
39
|
- **Holiday Marking**: Automatically mark and disable holidays using a custom `HolidayProvider`
|
|
40
|
+
- **Holiday Tooltips**: Hover over holiday dates to see holiday names as tooltips
|
|
41
|
+
- **Disabled Dates**: Disable specific dates by passing an array of date strings or Date objects
|
|
40
42
|
- **Date & Time Selection**: Supports optional time inputs with configurable minute intervals
|
|
41
43
|
- **12h/24h Time Support**: Uses internal 24-hour timekeeping but displays a user-friendly 12-hour clock with AM/PM toggle
|
|
42
44
|
- **Predefined Date Ranges**: Offers quick selection of common ranges (e.g., "Last 7 Days")
|
|
@@ -105,7 +107,55 @@ export class AppComponent {
|
|
|
105
107
|
</ngxsmk-datepicker>
|
|
106
108
|
```
|
|
107
109
|
|
|
108
|
-
### 3.
|
|
110
|
+
### 3. Disabled Dates Example
|
|
111
|
+
|
|
112
|
+
Disable specific dates by passing an array of date strings or Date objects:
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
// In your component
|
|
116
|
+
disabledDates = ['10/21/2025', '08/21/2025', '10/15/2025', '10/8/2025', '10/3/2025'];
|
|
117
|
+
|
|
118
|
+
// In your template
|
|
119
|
+
<ngxsmk-datepicker
|
|
120
|
+
[mode]="'single'"
|
|
121
|
+
[disabledDates]="disabledDates"
|
|
122
|
+
placeholder="Select a date">
|
|
123
|
+
</ngxsmk-datepicker>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 4. Holiday Tooltips Example
|
|
127
|
+
|
|
128
|
+
Holiday dates automatically show tooltips when you hover over them:
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
// Holiday provider with tooltips
|
|
132
|
+
class MyHolidayProvider implements HolidayProvider {
|
|
133
|
+
private holidays: { [key: string]: string } = {
|
|
134
|
+
'2025-01-01': 'New Year\'s Day',
|
|
135
|
+
'2025-07-04': 'Independence Day',
|
|
136
|
+
'2025-12-25': 'Christmas Day',
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
isHoliday(date: Date): boolean {
|
|
140
|
+
const key = this.formatDateKey(date);
|
|
141
|
+
return !!this.holidays[key];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
getHolidayLabel(date: Date): string | null {
|
|
145
|
+
const key = this.formatDateKey(date);
|
|
146
|
+
return this.holidays[key] || null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// In your template
|
|
151
|
+
<ngxsmk-datepicker
|
|
152
|
+
[holidayProvider]="holidayProvider"
|
|
153
|
+
[disableHolidays]="false"
|
|
154
|
+
placeholder="Hover over holidays to see tooltips">
|
|
155
|
+
</ngxsmk-datepicker>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 5. Smart Initial View with Future minDate
|
|
109
159
|
|
|
110
160
|
When you set a `minDate` that is in the future, the datepicker will automatically open to that month:
|
|
111
161
|
|
|
@@ -143,6 +193,7 @@ const futureMaxDate = new Date(2025, 11, 21); // December 21, 2025
|
|
|
143
193
|
| `startAt` | `DateInput` | `null` | The date to initially center the calendar view on |
|
|
144
194
|
| `holidayProvider` | `HolidayProvider` | `null` | An object that provides holiday information |
|
|
145
195
|
| `disableHolidays` | `boolean` | `false` | If true, disables holiday dates from being selected |
|
|
196
|
+
| `disabledDates` | `(string \| Date)[]` | `[]` | Array of dates to disable. Supports both string dates (MM/DD/YYYY) and Date objects |
|
|
146
197
|
|
|
147
198
|
### Outputs
|
|
148
199
|
|
|
@@ -245,6 +296,11 @@ We welcome and appreciate contributions from the community! Please see our [Cont
|
|
|
245
296
|
## 📄 Changelog
|
|
246
297
|
|
|
247
298
|
### v1.4.13 (Latest)
|
|
299
|
+
- 🚫 **Disabled Dates**: New `disabledDates` input property to disable specific dates
|
|
300
|
+
- 🎯 **Date String Support**: Supports both string dates (MM/DD/YYYY) and Date objects
|
|
301
|
+
- 💡 **Holiday Tooltips**: Hover over holiday dates to see holiday names as tooltips
|
|
302
|
+
- 🎨 **Enhanced UX**: Better visual feedback for disabled dates
|
|
303
|
+
- 📦 **Improved API**: More flexible date disabling options
|
|
248
304
|
- 🎯 **Smart Initial View**: Datepicker now automatically opens to minDate's month when minDate is set to a future date
|
|
249
305
|
- 🚀 **Enhanced UX**: No more scrolling through months to reach future date ranges
|
|
250
306
|
- 📅 **Intelligent Defaults**: Automatically centers the calendar view on the earliest available date
|
|
@@ -335,6 +335,8 @@ class NgxsmkDatepickerComponent {
|
|
|
335
335
|
// NEW: Holiday Provider Inputs
|
|
336
336
|
this.holidayProvider = null;
|
|
337
337
|
this.disableHolidays = false;
|
|
338
|
+
// NEW: Disabled Dates Input
|
|
339
|
+
this.disabledDates = [];
|
|
338
340
|
// Popover/Input Mode
|
|
339
341
|
this.placeholder = 'Select Date';
|
|
340
342
|
this.inline = false;
|
|
@@ -538,7 +540,7 @@ class NgxsmkDatepickerComponent {
|
|
|
538
540
|
this.writeValue(changes['value'].currentValue);
|
|
539
541
|
}
|
|
540
542
|
// Rerun calendar generation if provider changes to refresh disabled states
|
|
541
|
-
if (changes['holidayProvider'] || changes['disableHolidays']) {
|
|
543
|
+
if (changes['holidayProvider'] || changes['disableHolidays'] || changes['disabledDates']) {
|
|
542
544
|
this.generateCalendar();
|
|
543
545
|
}
|
|
544
546
|
if (changes['startAt']) {
|
|
@@ -629,6 +631,19 @@ class NgxsmkDatepickerComponent {
|
|
|
629
631
|
_normalizeDate(date) {
|
|
630
632
|
return normalizeDate(date);
|
|
631
633
|
}
|
|
634
|
+
parseDateString(dateString) {
|
|
635
|
+
try {
|
|
636
|
+
// Handle MM/DD/YYYY format
|
|
637
|
+
const date = new Date(dateString);
|
|
638
|
+
if (isNaN(date.getTime())) {
|
|
639
|
+
return null;
|
|
640
|
+
}
|
|
641
|
+
return getStartOfDay(date);
|
|
642
|
+
}
|
|
643
|
+
catch (error) {
|
|
644
|
+
return null;
|
|
645
|
+
}
|
|
646
|
+
}
|
|
632
647
|
generateTimeOptions() {
|
|
633
648
|
const { hourOptions, minuteOptions } = generateTimeOptions(this.minuteInterval);
|
|
634
649
|
this.hourOptions = hourOptions;
|
|
@@ -673,11 +688,26 @@ class NgxsmkDatepickerComponent {
|
|
|
673
688
|
if (!date)
|
|
674
689
|
return false;
|
|
675
690
|
const dateOnly = getStartOfDay(date);
|
|
676
|
-
// 1. Check
|
|
691
|
+
// 1. Check disabled dates array
|
|
692
|
+
if (this.disabledDates.length > 0) {
|
|
693
|
+
for (const disabledDate of this.disabledDates) {
|
|
694
|
+
let parsedDate;
|
|
695
|
+
if (typeof disabledDate === 'string') {
|
|
696
|
+
parsedDate = this.parseDateString(disabledDate);
|
|
697
|
+
}
|
|
698
|
+
else {
|
|
699
|
+
parsedDate = getStartOfDay(disabledDate);
|
|
700
|
+
}
|
|
701
|
+
if (parsedDate && dateOnly.getTime() === parsedDate.getTime()) {
|
|
702
|
+
return true;
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
// 2. Check holiday provider for disabling
|
|
677
707
|
if (this.holidayProvider && this.disableHolidays && this.holidayProvider.isHoliday(dateOnly)) {
|
|
678
708
|
return true;
|
|
679
709
|
}
|
|
680
|
-
//
|
|
710
|
+
// 3. Check min/max date
|
|
681
711
|
if (this._minDate) {
|
|
682
712
|
const minDateOnly = getStartOfDay(this._minDate);
|
|
683
713
|
if (dateOnly.getTime() < minDateOnly.getTime())
|
|
@@ -688,7 +718,7 @@ class NgxsmkDatepickerComponent {
|
|
|
688
718
|
if (dateOnly.getTime() > maxDateOnly.getTime())
|
|
689
719
|
return true;
|
|
690
720
|
}
|
|
691
|
-
//
|
|
721
|
+
// 4. Check custom invalid date function
|
|
692
722
|
return this.isInvalidDate(date);
|
|
693
723
|
}
|
|
694
724
|
isMultipleSelected(d) {
|
|
@@ -860,7 +890,7 @@ class NgxsmkDatepickerComponent {
|
|
|
860
890
|
// Currently no cleanup required, but method is here for future optimizations
|
|
861
891
|
}
|
|
862
892
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: NgxsmkDatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
863
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.6", type: NgxsmkDatepickerComponent, isStandalone: true, selector: "ngxsmk-datepicker", inputs: { mode: "mode", isInvalidDate: "isInvalidDate", showRanges: "showRanges", showTime: "showTime", minuteInterval: "minuteInterval", holidayProvider: "holidayProvider", disableHolidays: "disableHolidays", placeholder: "placeholder", inline: "inline", startAt: "startAt", locale: "locale", theme: "theme", disabledState: "disabledState", minDate: "minDate", maxDate: "maxDate", ranges: "ranges" }, outputs: { valueChange: "valueChange", action: "action" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, properties: { "class.dark-theme": "this.isDarkMode" } }, providers: [{
|
|
893
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.6", type: NgxsmkDatepickerComponent, isStandalone: true, selector: "ngxsmk-datepicker", inputs: { mode: "mode", isInvalidDate: "isInvalidDate", showRanges: "showRanges", showTime: "showTime", minuteInterval: "minuteInterval", holidayProvider: "holidayProvider", disableHolidays: "disableHolidays", disabledDates: "disabledDates", placeholder: "placeholder", inline: "inline", startAt: "startAt", locale: "locale", theme: "theme", disabledState: "disabledState", minDate: "minDate", maxDate: "maxDate", ranges: "ranges" }, outputs: { valueChange: "valueChange", action: "action" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, properties: { "class.dark-theme": "this.isDarkMode" } }, providers: [{
|
|
864
894
|
provide: NG_VALUE_ACCESSOR,
|
|
865
895
|
useExisting: forwardRef(() => NgxsmkDatepickerComponent),
|
|
866
896
|
multi: true
|
|
@@ -1119,6 +1149,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImpor
|
|
|
1119
1149
|
type: Input
|
|
1120
1150
|
}], disableHolidays: [{
|
|
1121
1151
|
type: Input
|
|
1152
|
+
}], disabledDates: [{
|
|
1153
|
+
type: Input
|
|
1122
1154
|
}], placeholder: [{
|
|
1123
1155
|
type: Input
|
|
1124
1156
|
}], inline: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngxsmk-datepicker.mjs","sources":["../../../projects/ngxsmk-datepicker/src/lib/utils/date.utils.ts","../../../projects/ngxsmk-datepicker/src/lib/utils/calendar.utils.ts","../../../projects/ngxsmk-datepicker/src/lib/components/custom-select.component.ts","../../../projects/ngxsmk-datepicker/src/lib/utils/performance.utils.ts","../../../projects/ngxsmk-datepicker/src/lib/ngxsmk-datepicker.ts","../../../projects/ngxsmk-datepicker/src/public-api.ts","../../../projects/ngxsmk-datepicker/src/ngxsmk-datepicker.ts"],"sourcesContent":["/**\r\n * Date utility functions for ngxsmk-datepicker\r\n * Extracted to improve tree-shaking and reduce bundle size\r\n */\r\n\r\nexport function getStartOfDay(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0, 0);\r\n}\r\n\r\nexport function getEndOfDay(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59, 999);\r\n}\r\n\r\nexport function addMonths(d: Date, months: number): Date {\r\n const newDate = new Date(d);\r\n newDate.setMonth(d.getMonth() + months);\r\n return newDate;\r\n}\r\n\r\nexport function subtractDays(d: Date, days: number): Date {\r\n const newDate = new Date(d);\r\n newDate.setDate(d.getDate() - days);\r\n return newDate;\r\n}\r\n\r\nexport function getStartOfMonth(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth(), 1);\r\n}\r\n\r\nexport function getEndOfMonth(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth() + 1, 0);\r\n}\r\n\r\nexport function isSameDay(d1: Date | null, d2: Date | null): boolean {\r\n if (!d1 || !d2) return false;\r\n return (\r\n d1.getFullYear() === d2.getFullYear() &&\r\n d1.getMonth() === d2.getMonth() &&\r\n d1.getDate() === d2.getDate()\r\n );\r\n}\r\n\r\nexport function normalizeDate(date: DateInput | null): Date | null {\r\n if (!date) return null;\r\n const d = (date instanceof Date) ? new Date(date.getTime()) : new Date((date as any).toDate ? (date as any).toDate() : date as any);\r\n if (isNaN(d.getTime())) return null;\r\n return d;\r\n}\r\n\r\nexport type DateInput = Date | string | { toDate: () => Date; _isAMomentObject?: boolean; $d?: Date };\r\n\r\n\r\n","/**\r\n * Calendar utility functions for ngxsmk-datepicker\r\n * Optimized for performance and tree-shaking\r\n */\r\n\r\nimport { DateInput, normalizeDate } from './date.utils';\r\n\r\nexport interface HolidayProvider {\r\n /**\r\n * Returns true if the given date is a holiday.\r\n * The date passed will be at the start of the day (00:00:00).\r\n */\r\n isHoliday(date: Date): boolean;\r\n \r\n /**\r\n * Optional: Returns a label or reason for the holiday.\r\n */\r\n getHolidayLabel?(date: Date): string | null;\r\n}\r\n\r\nexport interface DateRange {\r\n [key: string]: [DateInput, DateInput];\r\n}\r\n\r\nexport type DatepickerValue = Date | { start: Date, end: Date } | Date[] | null;\r\n\r\n/**\r\n * Generate month options for dropdown\r\n */\r\nexport function generateMonthOptions(locale: string, year: number): { label: string; value: number }[] {\r\n return Array.from({length: 12}).map((_, i) => ({\r\n label: new Date(year, i, 1).toLocaleDateString(locale, {month: 'long'}),\r\n value: i,\r\n }));\r\n}\r\n\r\n/**\r\n * Generate year options for dropdown\r\n */\r\nexport function generateYearOptions(currentYear: number, range: number = 10): { label: string; value: number }[] {\r\n const startYear = currentYear - range;\r\n const endYear = currentYear + range;\r\n const options: { label: string; value: number }[] = [];\r\n \r\n for (let i = startYear; i <= endYear; i++) {\r\n options.push({label: `${i}`, value: i});\r\n }\r\n \r\n return options;\r\n}\r\n\r\n/**\r\n * Generate time options for hour/minute dropdowns\r\n */\r\nexport function generateTimeOptions(minuteInterval: number = 1): {\r\n hourOptions: { label: string; value: number }[];\r\n minuteOptions: { label: string; value: number }[];\r\n} {\r\n const hourOptions = Array.from({length: 12}).map((_, i) => ({\r\n label: (i + 1).toString().padStart(2, '0'),\r\n value: i + 1,\r\n }));\r\n\r\n const minuteOptions: { label: string; value: number }[] = [];\r\n for (let i = 0; i < 60; i += minuteInterval) {\r\n minuteOptions.push({\r\n label: i.toString().padStart(2, '0'),\r\n value: i,\r\n });\r\n }\r\n\r\n return { hourOptions, minuteOptions };\r\n}\r\n\r\n/**\r\n * Generate week days for calendar header\r\n */\r\nexport function generateWeekDays(locale: string, firstDayOfWeek: number = 0): string[] {\r\n const day = new Date(2024, 0, 7 + firstDayOfWeek);\r\n return Array.from({length: 7}).map(() => {\r\n const weekDay = new Date(day).toLocaleDateString(locale, {weekday: 'short'});\r\n day.setDate(day.getDate() + 1);\r\n return weekDay;\r\n });\r\n}\r\n\r\n/**\r\n * Get first day of week for locale\r\n */\r\nexport function getFirstDayOfWeek(locale: string): number {\r\n try {\r\n return ((new Intl.Locale(locale) as any).weekInfo?.firstDay || 0) % 7;\r\n } catch (e) {\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Convert 12-hour to 24-hour format\r\n */\r\nexport function get24Hour(displayHour: number, isPm: boolean): number {\r\n if (isPm) { return displayHour === 12 ? 12 : displayHour + 12; }\r\n return displayHour === 12 ? 0 : displayHour;\r\n}\r\n\r\n/**\r\n * Convert 24-hour to 12-hour format\r\n */\r\nexport function update12HourState(fullHour: number): { isPm: boolean; displayHour: number } {\r\n return {\r\n isPm: fullHour >= 12,\r\n displayHour: fullHour % 12 || 12\r\n };\r\n}\r\n\r\n/**\r\n * Process date ranges input\r\n */\r\nexport function processDateRanges(ranges: DateRange | null): { [key: string]: [Date, Date] } | null {\r\n if (!ranges) return null;\r\n \r\n return Object.entries(ranges).reduce((acc, [key, dates]) => {\r\n const start = normalizeDate(dates[0]);\r\n const end = normalizeDate(dates[1]);\r\n if (start && end) acc[key] = [start, end];\r\n return acc;\r\n }, {} as { [key: string]: [Date, Date] });\r\n}\r\n\r\n\r\n","import { Component, ElementRef, EventEmitter, HostListener, inject, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'ngxsmk-custom-select',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div class=\"ngxsmk-select-container\" (click)=\"toggleDropdown()\">\r\n <button type=\"button\" class=\"ngxsmk-select-display\" [disabled]=\"disabled\">\r\n <span>{{ displayValue }}</span>\r\n <svg class=\"ngxsmk-arrow-icon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\r\n <path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"48\"\r\n d=\"M112 184l144 144 144-144\"/>\r\n </svg>\r\n </button>\r\n @if (isOpen) {\r\n <div class=\"ngxsmk-options-panel\">\r\n <ul>\r\n @for (option of options; track option.value) {\r\n <li [class.selected]=\"option.value === value\" (click)=\"selectOption(option); $event.stopPropagation()\">\r\n {{ option.label }}\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n :host { position: relative; display: inline-block; }\r\n .ngxsmk-select-container { cursor: pointer; }\r\n .ngxsmk-select-display {\r\n display: flex; align-items: center; justify-content: space-between;\r\n width: var(--custom-select-width, 115px); background: var(--datepicker-background, #fff);\r\n border: 1px solid var(--datepicker-border-color, #ccc); color: var(--datepicker-text-color, #333);\r\n border-radius: 4px; padding: 4px 8px; font-size: 14px; text-align: left; height: 30px;\r\n }\r\n .ngxsmk-select-display:disabled {\r\n background-color: var(--datepicker-hover-background, #f0f0f0);\r\n cursor: not-allowed;\r\n opacity: 0.7;\r\n }\r\n .ngxsmk-arrow-icon { width: 12px; height: 12px; margin-left: 8px; }\r\n .ngxsmk-options-panel {\r\n position: absolute; top: 110%; left: 0; width: 100%;\r\n background: var(--datepicker-background, #fff); border: 1px solid var(--datepicker-border-color, #ccc);\r\n color: var(--datepicker-text-color, #333); border-radius: 4px;\r\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); max-height: 200px; overflow-y: auto; z-index: 9999;\r\n }\r\n .ngxsmk-options-panel ul { list-style: none; padding: 4px; margin: 0; }\r\n .ngxsmk-options-panel li { padding: 8px 12px; border-radius: 4px; cursor: pointer; }\r\n .ngxsmk-options-panel li:hover { background-color: var(--datepicker-hover-background, #f0f0f0); }\r\n .ngxsmk-options-panel li.selected {\r\n background-color: var(--datepicker-primary-color, #3880ff); color: var(--datepicker-primary-contrast, #fff);\r\n }\r\n `],\r\n})\r\nexport class CustomSelectComponent {\r\n @Input() options: { label: string; value: any }[] = [];\r\n @Input() value: any;\r\n @Input() disabled: boolean = false;\r\n @Output() valueChange = new EventEmitter<any>();\r\n public isOpen = false;\r\n\r\n private readonly elementRef: ElementRef = inject(ElementRef);\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (!this.elementRef.nativeElement.contains(event.target)) this.isOpen = false;\r\n }\r\n\r\n get displayValue(): string {\r\n const selectedOption = this.options.find((opt) => opt.value === this.value);\r\n return selectedOption ? selectedOption.label : '';\r\n }\r\n\r\n toggleDropdown(): void {\r\n if (this.disabled) return;\r\n this.isOpen = !this.isOpen;\r\n }\r\n\r\n selectOption(option: { label: string; value: any }): void {\r\n this.value = option.value;\r\n this.valueChange.emit(this.value);\r\n this.isOpen = false;\r\n }\r\n}\r\n\r\n\r\n","/**\r\n * Performance utilities for ngxsmk-datepicker\r\n * Optimized for better runtime performance\r\n */\r\n\r\n/**\r\n * Memoization decorator for expensive computations\r\n */\r\nexport function memoize<T extends (...args: any[]) => any>(\r\n fn: T,\r\n keyGenerator?: (...args: Parameters<T>) => string\r\n): T {\r\n const cache = new Map<string, ReturnType<T>>();\r\n \r\n return ((...args: Parameters<T>) => {\r\n const key = keyGenerator ? keyGenerator(...args) : JSON.stringify(args);\r\n \r\n if (cache.has(key)) {\r\n return cache.get(key)!;\r\n }\r\n \r\n const result = fn(...args);\r\n cache.set(key, result);\r\n return result;\r\n }) as T;\r\n}\r\n\r\n/**\r\n * Debounce function for performance optimization\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n func: T,\r\n wait: number\r\n): (...args: Parameters<T>) => void {\r\n let timeout: number | null = null;\r\n \r\n return (...args: Parameters<T>) => {\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n }\r\n \r\n timeout = window.setTimeout(() => {\r\n func(...args);\r\n }, wait);\r\n };\r\n}\r\n\r\n/**\r\n * Throttle function for performance optimization\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n func: T,\r\n limit: number\r\n): (...args: Parameters<T>) => void {\r\n let inThrottle: boolean = false;\r\n \r\n return (...args: Parameters<T>) => {\r\n if (!inThrottle) {\r\n func(...args);\r\n inThrottle = true;\r\n window.setTimeout(() => (inThrottle = false), limit);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Create a shallow comparison function for objects\r\n */\r\nexport function shallowEqual<T extends Record<string, any>>(a: T, b: T): boolean {\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n \r\n if (keysA.length !== keysB.length) {\r\n return false;\r\n }\r\n \r\n for (const key of keysA) {\r\n if (a[key] !== b[key]) {\r\n return false;\r\n }\r\n }\r\n \r\n return true;\r\n}\r\n\r\n/**\r\n * Optimized date comparison for calendar rendering\r\n */\r\nexport function createDateComparator() {\r\n const cache = new Map<string, boolean>();\r\n \r\n return (date1: Date | null, date2: Date | null): boolean => {\r\n if (!date1 || !date2) return date1 === date2;\r\n \r\n const key = `${date1.getTime()}-${date2.getTime()}`;\r\n if (cache.has(key)) {\r\n return cache.get(key)!;\r\n }\r\n \r\n const result = (\r\n date1.getFullYear() === date2.getFullYear() &&\r\n date1.getMonth() === date2.getMonth() &&\r\n date1.getDate() === date2.getDate()\r\n );\r\n \r\n cache.set(key, result);\r\n return result;\r\n };\r\n}\r\n\r\n/**\r\n * Optimized array filtering with caching\r\n */\r\nexport function createFilteredArray<T>(\r\n source: T[],\r\n filterFn: (item: T) => boolean,\r\n cacheKey?: string\r\n): T[] {\r\n const cache = new Map<string, T[]>();\r\n const key = cacheKey || JSON.stringify(source);\r\n \r\n if (cache.has(key)) {\r\n return cache.get(key)!;\r\n }\r\n \r\n const result = source.filter(filterFn);\r\n cache.set(key, result);\r\n return result;\r\n}\r\n\r\n\r\n","import {\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n HostListener,\n inject,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n ChangeDetectionStrategy,\n OnDestroy,\n} from '@angular/core';\nimport {CommonModule, DatePipe} from '@angular/common';\nimport {\n ControlValueAccessor,\n FormsModule,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport {\n getStartOfDay,\n addMonths,\n normalizeDate,\n DateInput,\n} from './utils/date.utils';\nimport {\n HolidayProvider,\n DateRange,\n DatepickerValue,\n generateMonthOptions,\n generateYearOptions,\n generateTimeOptions,\n generateWeekDays,\n getFirstDayOfWeek,\n get24Hour,\n update12HourState,\n processDateRanges,\n} from './utils/calendar.utils';\nimport { CustomSelectComponent } from './components/custom-select.component';\nimport { createDateComparator } from './utils/performance.utils';\n\n\n@Component({\n selector: 'ngxsmk-datepicker',\n standalone: true,\n imports: [CommonModule, FormsModule, CustomSelectComponent, DatePipe, ReactiveFormsModule],\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxsmkDatepickerComponent),\n multi: true\n }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./styles/datepicker.css'],\n template: `\n <div class=\"ngxsmk-datepicker-wrapper\" [class.ngxsmk-inline-mode]=\"isInlineMode\">\n @if (!isInlineMode) {\n <div class=\"ngxsmk-input-group\" (click)=\"toggleCalendar()\" [class.disabled]=\"disabled\">\n <input type=\"text\" \n [value]=\"displayValue\" \n [placeholder]=\"placeholder\" \n readonly \n [disabled]=\"disabled\"\n class=\"ngxsmk-display-input\">\n <button type=\"button\" class=\"ngxsmk-clear-button\" (click)=\"clearValue($event)\" [disabled]=\"disabled\" *ngIf=\"displayValue\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"32\" d=\"M368 368L144 144M368 144L144 368\"/></svg>\n </button>\n </div>\n }\n\n @if (isCalendarVisible) {\n <div class=\"ngxsmk-popover-container\" [class.ngxsmk-inline-container]=\"isInlineMode\">\n <div class=\"ngxsmk-datepicker-container\">\n @if (showRanges && rangesArray.length > 0 && mode === 'range') {\n <div class=\"ngxsmk-ranges-container\">\n <ul>\n @for (range of rangesArray; track range.key) {\n <li (click)=\"selectRange(range.value)\" [class.disabled]=\"disabled\">{{ range.key }}</li>\n }\n </ul>\n </div>\n }\n <div class=\"ngxsmk-calendar-container\">\n <div class=\"ngxsmk-header\">\n <div class=\"ngxsmk-month-year-selects\">\n <ngxsmk-custom-select class=\"month-select\" [options]=\"monthOptions\"\n [(value)]=\"currentMonth\" [disabled]=\"disabled\"></ngxsmk-custom-select>\n <ngxsmk-custom-select class=\"year-select\" [options]=\"yearOptions\" [(value)]=\"currentYear\" [disabled]=\"disabled\"></ngxsmk-custom-select>\n </div>\n <div class=\"ngxsmk-nav-buttons\">\n <button type=\"button\" class=\"ngxsmk-nav-button\" (click)=\"changeMonth(-1)\" [disabled]=\"disabled || isBackArrowDisabled\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"48\"\n d=\"M328 112L184 256l144 144\"/>\n </svg>\n </button>\n <button type=\"button\" class=\"ngxsmk-nav-button\" (click)=\"changeMonth(1)\" [disabled]=\"disabled\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"48\"\n d=\"M184 112l144 144-144 144\"/>\n </svg>\n </button>\n </div>\n </div>\n <div class=\"ngxsmk-days-grid-wrapper\">\n <div class=\"ngxsmk-days-grid\">\n @for (day of weekDays; track day) {\n <div class=\"ngxsmk-day-name\">{{ day }}</div>\n }\n @for (day of daysInMonth; track $index) {\n <div class=\"ngxsmk-day-cell\"\n [class.empty]=\"!isCurrentMonth(day)\" [class.disabled]=\"isDateDisabled(day)\" \n [class.today]=\"isSameDay(day, today)\"\n [class.holiday]=\"isHoliday(day)\"\n [class.selected]=\"mode === 'single' && isSameDay(day, selectedDate)\"\n [class.multiple-selected]=\"mode === 'multiple' && isMultipleSelected(day)\"\n [class.start-date]=\"mode === 'range' && isSameDay(day, startDate)\"\n [class.end-date]=\"mode === 'range' && isSameDay(day, endDate)\"\n [class.in-range]=\"mode === 'range' && isInRange(day)\"\n [class.preview-range]=\"isPreviewInRange(day)\"\n (click)=\"onDateClick(day)\" (mouseenter)=\"onDateHover(day)\">\n @if (day) {\n <div class=\"ngxsmk-day-number\" [attr.title]=\"getHolidayLabel(day)\">{{ day | date : 'd' }}</div>\n }\n </div>\n }\n </div>\n </div>\n\n @if (showTime) {\n <div class=\"ngxsmk-time-selection\">\n <span class=\"ngxsmk-time-label\">Time:</span>\n <ngxsmk-custom-select\n class=\"hour-select\"\n [options]=\"hourOptions\"\n [(value)]=\"currentDisplayHour\"\n (valueChange)=\"onTimeChange()\"\n [disabled]=\"disabled\"\n ></ngxsmk-custom-select>\n <span class=\"ngxsmk-time-separator\">:</span>\n <ngxsmk-custom-select\n class=\"minute-select\"\n [options]=\"minuteOptions\"\n [(value)]=\"currentMinute\"\n (valueChange)=\"onTimeChange()\"\n [disabled]=\"disabled\"\n ></ngxsmk-custom-select>\n <ngxsmk-custom-select\n class=\"ampm-select\"\n [options]=\"ampmOptions\"\n [(value)]=\"isPm\"\n (valueChange)=\"onTimeChange()\"\n [disabled]=\"disabled\"\n ></ngxsmk-custom-select>\n </div>\n }\n \n <div class=\"ngxsmk-footer\" *ngIf=\"!isInlineMode\">\n <button type=\"button\" class=\"ngxsmk-clear-button-footer\" (click)=\"clearValue($event)\" [disabled]=\"disabled\">\n Clear\n </button>\n <button type=\"button\" class=\"ngxsmk-close-button\" (click)=\"isCalendarOpen = false\" [disabled]=\"disabled\">\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n})\nexport class NgxsmkDatepickerComponent implements OnInit, OnChanges, OnDestroy, ControlValueAccessor {\n @Input() mode: 'single' | 'range' | 'multiple' = 'single';\n @Input() isInvalidDate: (date: Date) => boolean = () => false;\n @Input() showRanges: boolean = true;\n @Input() showTime: boolean = false;\n @Input() minuteInterval: number = 1;\n \n // NEW: Holiday Provider Inputs\n @Input() holidayProvider: HolidayProvider | null = null;\n @Input() disableHolidays: boolean = false;\n \n // Popover/Input Mode\n @Input() placeholder: string = 'Select Date';\n @Input() inline: boolean | 'always' | 'auto' = false;\n public isCalendarOpen: boolean = false;\n\n public _internalValue: DatepickerValue = null;\n\n private _startAtDate: Date | null = null;\n @Input() set startAt(value: DateInput | null) { this._startAtDate = this._normalizeDate(value); }\n\n private _locale: string = 'en-US';\n @Input() set locale(value: string) { this._locale = value; }\n get locale(): string { return this._locale; }\n\n @Input() theme: 'light' | 'dark' = 'light';\n @HostBinding('class.dark-theme') get isDarkMode() { return this.theme === 'dark'; }\n\n private onChange = (_: any) => {};\n private onTouched = () => {};\n public disabled = false;\n @Input() set disabledState(isDisabled: boolean) { this.disabled = isDisabled; }\n\n @Output() valueChange = new EventEmitter<DatepickerValue>();\n @Output() action = new EventEmitter<{ type: string; payload?: any }>();\n\n private _minDate: Date | null = null;\n @Input() set minDate(value: DateInput | null) { this._minDate = this._normalizeDate(value); }\n\n private _maxDate: Date | null = null;\n @Input() set maxDate(value: DateInput | null) { this._maxDate = this._normalizeDate(value); }\n\n private _ranges: { [key: string]: [Date, Date] } | null = null;\n @Input() set ranges(value: DateRange | null) {\n this._ranges = processDateRanges(value);\n this.updateRangesArray();\n }\n\n public currentDate: Date = new Date();\n public daysInMonth: (Date | null)[] = [];\n public weekDays: string[] = [];\n public readonly today: Date = getStartOfDay(new Date());\n public selectedDate: Date | null = null;\n public selectedDates: Date[] = [];\n public startDate: Date | null = null;\n public endDate: Date | null = null;\n public hoveredDate: Date | null = null;\n public rangesArray: { key: string; value: [Date, Date] }[] = [];\n\n private _currentMonth: number = this.currentDate.getMonth();\n private _currentYear: number = this.currentDate.getFullYear();\n\n public monthOptions: { label: string; value: number }[] = [];\n public yearOptions: { label: string; value: number }[] = [];\n private firstDayOfWeek: number = 0;\n\n public currentHour: number = 0;\n public currentMinute: number = 0;\n public currentDisplayHour: number = 12;\n public isPm: boolean = false;\n\n public hourOptions: { label: string; value: number }[] = [];\n public minuteOptions: { label: string; value: number }[] = [];\n public ampmOptions: { label: string; value: boolean }[] = [\n {label: 'AM', value: false},\n {label: 'PM', value: true}\n ];\n\n // Animation state properties\n \n private readonly elementRef: ElementRef = inject(ElementRef);\n private readonly dateComparator = createDateComparator();\n \n get isInlineMode(): boolean {\n return this.inline === true || this.inline === 'always' || \n (this.inline === 'auto' && typeof window !== 'undefined' && window.matchMedia('(min-width: 768px)').matches);\n }\n\n get isCalendarVisible(): boolean {\n return this.isInlineMode || this.isCalendarOpen;\n }\n \n get displayValue(): string {\n if (this.mode === 'single' && this.selectedDate) {\n return this.selectedDate.toLocaleString(this.locale, { \n year: 'numeric', month: 'short', day: '2-digit', \n hour: this.showTime ? '2-digit' : undefined, \n minute: this.showTime ? '2-digit' : undefined \n });\n } else if (this.mode === 'range' && this.startDate && this.endDate) {\n const start = this.startDate.toLocaleString(this.locale, { year: 'numeric', month: 'short', day: '2-digit' });\n const end = this.endDate.toLocaleString(this.locale, { year: 'numeric', month: 'short', day: '2-digit' });\n return `${start} - ${end}`;\n } else if (this.mode === 'multiple' && this.selectedDates.length > 0) {\n return `${this.selectedDates.length} dates selected`;\n }\n return '';\n }\n\n get isBackArrowDisabled(): boolean {\n if (!this._minDate) return false;\n \n // Get the first day of the current month\n const firstDayOfCurrentMonth = new Date(this.currentYear, this.currentMonth, 1);\n \n // Check if the first day of current month is before or equal to minDate\n return firstDayOfCurrentMonth <= this._minDate;\n }\n \n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.isInlineMode && this.isCalendarOpen && !this.elementRef.nativeElement.contains(event.target)) {\n this.isCalendarOpen = false;\n }\n }\n\n\n writeValue(val: DatepickerValue): void {\n this._internalValue = val;\n this.initializeValue(val);\n this.generateCalendar();\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n private emitValue(val: DatepickerValue) {\n this._internalValue = val;\n this.valueChange.emit(val);\n this.onChange(val);\n this.onTouched();\n \n // Auto-close popover when a selection is complete\n if (!this.isInlineMode && val !== null) {\n if (this.mode === 'single' || (this.mode === 'range' && this.startDate && this.endDate)) {\n this.isCalendarOpen = false;\n }\n }\n }\n \n public toggleCalendar(): void {\n if (this.disabled || this.isInlineMode) return;\n this.isCalendarOpen = !this.isCalendarOpen;\n }\n \n public clearValue(event?: MouseEvent): void {\n if (event) event.stopPropagation();\n if (this.disabled) return;\n \n this.selectedDate = null;\n this.selectedDates = [];\n this.startDate = null;\n this.endDate = null;\n this.hoveredDate = null;\n this.isCalendarOpen = false;\n \n this.emitValue(null);\n this.action.emit({type: 'clear', payload: null});\n \n // Reset view to today after clearing\n this.currentDate = new Date();\n this._currentMonth = this.currentDate.getMonth();\n this._currentYear = this.currentDate.getFullYear();\n this.generateCalendar();\n }\n\n get currentMonth(): number { return this._currentMonth; }\n\n set currentMonth(month: number) {\n if (this.disabled) return;\n if (this._currentMonth !== month) {\n this._currentMonth = month;\n this.currentDate.setMonth(month);\n this.generateCalendar();\n }\n }\n\n get currentYear(): number { return this._currentYear; }\n\n set currentYear(year: number) {\n if (this.disabled) return;\n if (this._currentYear !== year) {\n this._currentYear = year;\n this.currentDate.setFullYear(year);\n this.generateCalendar();\n }\n }\n\n ngOnInit(): void {\n if (this._locale === 'en-US' && typeof navigator !== 'undefined') {\n this._locale = navigator.language;\n }\n\n this.today.setHours(0, 0, 0, 0);\n this.generateLocaleData();\n this.generateTimeOptions();\n\n if (this.showTime && !this._internalValue) {\n const now = new Date();\n this.currentHour = now.getHours();\n this.currentMinute = Math.floor(now.getMinutes() / this.minuteInterval) * this.minuteInterval;\n\n if (this.currentMinute === 60) {\n this.currentMinute = 0;\n this.currentHour = (this.currentHour + 1) % 24;\n }\n this.update12HourState(this.currentHour);\n }\n\n if (this._internalValue) {\n this.initializeValue(this._internalValue);\n } else {\n this.initializeValue(null);\n }\n this.generateCalendar();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['locale']) {\n this.generateLocaleData();\n this.generateCalendar();\n }\n\n if (changes['minuteInterval']) {\n this.generateTimeOptions();\n this.currentMinute = Math.floor(this.currentMinute / this.minuteInterval) * this.minuteInterval;\n this.onTimeChange();\n }\n\n if (changes['value'] && changes['value'].currentValue !== changes['value'].previousValue) {\n this.writeValue(changes['value'].currentValue);\n }\n \n // Rerun calendar generation if provider changes to refresh disabled states\n if (changes['holidayProvider'] || changes['disableHolidays']) {\n this.generateCalendar();\n }\n\n if (changes['startAt']) {\n if (!this._internalValue && this._startAtDate) {\n this.currentDate = new Date(this._startAtDate);\n this._currentMonth = this.currentDate.getMonth();\n this._currentYear = this.currentDate.getFullYear();\n this.generateCalendar();\n }\n }\n\n // Handle minDate changes - if minDate is set and is in the future, \n // and we don't have a current value, update the view to show minDate's month\n if (changes['minDate'] && !this._internalValue) {\n if (this._minDate) {\n const today = new Date();\n const minDateOnly = getStartOfDay(this._minDate);\n const todayOnly = getStartOfDay(today);\n \n // If minDate is in the future, update the view to show minDate's month\n if (minDateOnly.getTime() > todayOnly.getTime()) {\n this.currentDate = new Date(this._minDate);\n this._currentMonth = this.currentDate.getMonth();\n this._currentYear = this.currentDate.getFullYear();\n this.generateCalendar();\n }\n }\n }\n }\n\n private get24Hour(displayHour: number, isPm: boolean): number {\n return get24Hour(displayHour, isPm);\n }\n\n private update12HourState(fullHour: number): void {\n const state = update12HourState(fullHour);\n this.isPm = state.isPm;\n this.currentDisplayHour = state.displayHour;\n }\n\n private applyCurrentTime(date: Date): Date {\n this.currentHour = this.get24Hour(this.currentDisplayHour, this.isPm);\n date.setHours(this.currentHour, this.currentMinute, 0, 0);\n return date;\n }\n\n private initializeValue(value: DatepickerValue): void {\n let initialDate: Date | null = null;\n\n this.selectedDate = null;\n this.startDate = null;\n this.endDate = null;\n this.selectedDates = [];\n\n if (value) {\n if (this.mode === 'single' && value instanceof Date) {\n this.selectedDate = this._normalizeDate(value);\n initialDate = this.selectedDate;\n } else if (this.mode === 'range' && typeof value === 'object' && 'start' in value && 'end' in value) {\n this.startDate = this._normalizeDate((value as {start: Date, end: Date}).start);\n this.endDate = this._normalizeDate((value as {start: Date, end: Date}).end);\n initialDate = this.startDate;\n } else if (this.mode === 'multiple' && Array.isArray(value)) {\n this.selectedDates = (value as Date[]).map(d => this._normalizeDate(d)).filter((d): d is Date => d !== null);\n initialDate = this.selectedDates.length > 0 ? this.selectedDates[this.selectedDates.length - 1]! : null;\n }\n }\n\n // Determine the initial view date\n let viewCenterDate = initialDate || this._startAtDate;\n \n // If no specific date is set and minDate is in the future, use minDate's month\n if (!viewCenterDate && this._minDate) {\n const today = new Date();\n const minDateOnly = getStartOfDay(this._minDate);\n const todayOnly = getStartOfDay(today);\n \n // If minDate is in the future, use minDate as the initial view\n if (minDateOnly.getTime() > todayOnly.getTime()) {\n viewCenterDate = this._minDate;\n }\n }\n \n // Fallback to current date if no other date is determined\n if (!viewCenterDate) {\n viewCenterDate = new Date();\n }\n\n if (viewCenterDate) {\n this.currentDate = new Date(viewCenterDate);\n this._currentMonth = viewCenterDate.getMonth();\n this._currentYear = viewCenterDate.getFullYear();\n this.currentHour = viewCenterDate.getHours();\n this.currentMinute = viewCenterDate.getMinutes();\n this.update12HourState(this.currentHour);\n this.currentMinute = Math.floor(this.currentMinute / this.minuteInterval) * this.minuteInterval;\n }\n }\n\n private _normalizeDate(date: DateInput | null): Date | null {\n return normalizeDate(date);\n }\n\n private generateTimeOptions(): void {\n const { hourOptions, minuteOptions } = generateTimeOptions(this.minuteInterval);\n this.hourOptions = hourOptions;\n this.minuteOptions = minuteOptions;\n }\n\n private generateLocaleData(): void {\n const year = new Date().getFullYear();\n this.monthOptions = generateMonthOptions(this.locale, year);\n this.firstDayOfWeek = getFirstDayOfWeek(this.locale);\n this.weekDays = generateWeekDays(this.locale, this.firstDayOfWeek);\n }\n\n private updateRangesArray(): void {\n this.rangesArray = this._ranges ? Object.entries(this._ranges).map(([key, value]) => ({key, value})) : [];\n }\n\n public selectRange(range: [Date, Date]): void {\n if (this.disabled) return;\n this.startDate = this.applyCurrentTime(range[0]);\n this.endDate = this.applyCurrentTime(range[1]);\n\n if (this.startDate && this.endDate) {\n this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\n }\n\n this.currentDate = new Date(this.startDate);\n this.initializeValue({start: this.startDate, end: this.endDate});\n this.generateCalendar();\n this.action.emit({type: 'rangeSelected', payload: {start: this.startDate, end: this.endDate, key: this.rangesArray.find(r => r.value === range)?.key}});\n }\n \n // NEW: Check if a date is a holiday\n public isHoliday(date: Date | null): boolean {\n if (!date || !this.holidayProvider) return false;\n const dateOnly = getStartOfDay(date);\n return this.holidayProvider.isHoliday(dateOnly);\n }\n \n // NEW: Get holiday label\n public getHolidayLabel(date: Date | null): string | null {\n if (!date || !this.holidayProvider || !this.isHoliday(date)) return null;\n return this.holidayProvider.getHolidayLabel ? this.holidayProvider.getHolidayLabel(getStartOfDay(date)) : 'Holiday';\n }\n\n public isDateDisabled(date: Date | null): boolean {\n if (!date) return false;\n\n const dateOnly = getStartOfDay(date);\n\n // 1. Check holiday provider for disabling\n if (this.holidayProvider && this.disableHolidays && this.holidayProvider.isHoliday(dateOnly)) {\n return true;\n }\n\n // 2. Check min/max date\n if (this._minDate) {\n const minDateOnly = getStartOfDay(this._minDate);\n if (dateOnly.getTime() < minDateOnly.getTime()) return true;\n }\n if (this._maxDate) {\n const maxDateOnly = getStartOfDay(this._maxDate);\n if (dateOnly.getTime() > maxDateOnly.getTime()) return true;\n }\n \n // 3. Check custom invalid date function\n return this.isInvalidDate(date);\n }\n\n public isMultipleSelected(d: Date | null): boolean {\n if (!d || this.mode !== 'multiple') return false;\n const dTime = getStartOfDay(d).getTime();\n return this.selectedDates.some(selected => getStartOfDay(selected).getTime() === dTime);\n }\n\n public onTimeChange(): void {\n if (this.disabled) return;\n if (this.mode === 'single' && this.selectedDate) {\n this.selectedDate = this.applyCurrentTime(this.selectedDate);\n this.emitValue(this.selectedDate);\n } else if (this.mode === 'range' && this.startDate && this.endDate) {\n this.startDate = this.applyCurrentTime(this.startDate);\n this.endDate = this.applyCurrentTime(this.endDate);\n this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\n } else if (this.mode === 'range' && this.startDate && !this.endDate) {\n this.startDate = this.applyCurrentTime(this.startDate);\n } else if (this.mode === 'multiple') {\n this.selectedDates = this.selectedDates.map(date => {\n const newDate = getStartOfDay(date);\n return this.applyCurrentTime(newDate);\n });\n this.emitValue([...this.selectedDates]);\n }\n\n this.action.emit({type: 'timeChanged', payload: {hour: this.currentHour, minute: this.currentMinute}});\n }\n\n public onDateClick(day: Date | null): void {\n if (!day || this.disabled) return;\n \n // Only check isDateDisabled for current month days\n if (this.isCurrentMonth(day) && this.isDateDisabled(day)) return;\n\n const dateToToggle = getStartOfDay(day);\n\n if (this.mode === 'single') {\n this.selectedDate = this.applyCurrentTime(day);\n this.emitValue(this.selectedDate);\n } else if (this.mode === 'range') {\n if (!this.startDate || (this.startDate && this.endDate)) {\n this.startDate = this.applyCurrentTime(day);\n this.endDate = null;\n } else if (day >= this.startDate) {\n this.endDate = this.applyCurrentTime(day);\n this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\n } else {\n this.startDate = this.applyCurrentTime(day);\n this.endDate = null;\n }\n this.hoveredDate = null;\n } else if (this.mode === 'multiple') {\n const existingIndex = this.selectedDates.findIndex(d => this.isSameDay(d, dateToToggle));\n\n if (existingIndex > -1) {\n this.selectedDates.splice(existingIndex, 1);\n } else {\n const dateWithTime = this.applyCurrentTime(dateToToggle);\n this.selectedDates.push(dateWithTime);\n this.selectedDates.sort((a, b) => a.getTime() - b.getTime());\n }\n this.emitValue([...this.selectedDates]);\n }\n\n const dateToSync = this.mode === 'single' ? this.selectedDate :\n this.mode === 'range' ? this.startDate :\n this.mode === 'multiple' && this.selectedDates.length > 0 ? this.selectedDates[this.selectedDates.length - 1] : null;\n\n if (dateToSync) {\n this.update12HourState(dateToSync.getHours());\n this.currentMinute = dateToSync.getMinutes();\n }\n\n this.action.emit({\n type: 'dateSelected',\n payload: {\n mode: this.mode,\n value: this._internalValue,\n date: day\n }\n });\n }\n\n public onDateHover(day: Date | null): void {\n if (this.mode === 'range' && this.startDate && !this.endDate && day) {\n this.hoveredDate = day;\n }\n }\n\n public isPreviewInRange(day: Date | null): boolean {\n if (this.mode !== 'range' || !this.startDate || this.endDate || !this.hoveredDate || !day) return false;\n const start = getStartOfDay(this.startDate).getTime();\n const end = getStartOfDay(this.hoveredDate).getTime();\n const time = getStartOfDay(day).getTime();\n return time > Math.min(start, end) && time < Math.max(start, end);\n }\n\n public generateCalendar(): void {\n this.daysInMonth = [];\n const year = this.currentDate.getFullYear();\n const month = this.currentDate.getMonth();\n this._currentMonth = month;\n this._currentYear = year;\n this.generateDropdownOptions();\n const firstDayOfMonth = new Date(year, month, 1);\n const lastDayOfMonth = new Date(year, month + 1, 0);\n const startDayOfWeek = firstDayOfMonth.getDay();\n const emptyCellCount = (startDayOfWeek - this.firstDayOfWeek + 7) % 7;\n\n // Add previous month's days instead of null values\n const previousMonth = month === 0 ? 11 : month - 1;\n const previousYear = month === 0 ? year - 1 : year;\n const lastDayOfPreviousMonth = new Date(previousYear, previousMonth + 1, 0);\n \n for (let i = 0; i < emptyCellCount; i++) {\n const dayNumber = lastDayOfPreviousMonth.getDate() - emptyCellCount + i + 1;\n this.daysInMonth.push(this._normalizeDate(new Date(previousYear, previousMonth, dayNumber)));\n }\n for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {\n this.daysInMonth.push(this._normalizeDate(new Date(year, month, i)));\n }\n\n\n this.action.emit({\n type: 'calendarGenerated',\n payload: {\n month: month,\n year: year,\n days: this.daysInMonth.filter(d => d !== null)\n }\n });\n }\n\n private generateDropdownOptions(): void {\n this.yearOptions = generateYearOptions(this._currentYear);\n }\n\n public changeMonth(delta: number): void {\n if (this.disabled) return;\n\n // Check if going back is disabled due to minDate constraint\n if (delta < 0 && this.isBackArrowDisabled) return;\n\n const newDate = addMonths(this.currentDate, delta);\n\n // Update the data immediately (no animation)\n this.currentDate = newDate;\n this._currentMonth = newDate.getMonth();\n this._currentYear = newDate.getFullYear();\n\n // Generate new calendar view\n this.generateCalendar();\n\n this.action.emit({type: 'monthChanged', payload: { delta: delta }});\n }\n\n public isSameDay(d1: Date | null, d2: Date | null): boolean {\n return this.dateComparator(d1, d2);\n }\n\n public isCurrentMonth(day: Date | null): boolean {\n if (!day) return false;\n return day.getMonth() === this._currentMonth && day.getFullYear() === this._currentYear;\n }\n\n public isInRange(d: Date | null): boolean {\n if (!d || !this.startDate || !this.endDate) return false;\n\n const dTime = getStartOfDay(d).getTime();\n const startDayTime = getStartOfDay(this.startDate).getTime();\n const endDayTime = getStartOfDay(this.endDate).getTime();\n\n const startTime = Math.min(startDayTime, endDayTime);\n const endTime = Math.max(startDayTime, endDayTime);\n\n return dTime > startTime && dTime < endTime;\n }\n\n ngOnDestroy(): void {\n // Clean up any subscriptions or timers if needed\n // Currently no cleanup required, but method is here for future optimizations\n }\n}","/*\n * Public API Surface of ngxsmk-datepicker\n */\n\nexport * from './lib/ngxsmk-datepicker';\nexport * from './lib/components/custom-select.component';\nexport * from './lib/utils/date.utils';\nexport * from './lib/utils/calendar.utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngxsmk-datepicker.mjs","sources":["../../../projects/ngxsmk-datepicker/src/lib/utils/date.utils.ts","../../../projects/ngxsmk-datepicker/src/lib/utils/calendar.utils.ts","../../../projects/ngxsmk-datepicker/src/lib/components/custom-select.component.ts","../../../projects/ngxsmk-datepicker/src/lib/utils/performance.utils.ts","../../../projects/ngxsmk-datepicker/src/lib/ngxsmk-datepicker.ts","../../../projects/ngxsmk-datepicker/src/public-api.ts","../../../projects/ngxsmk-datepicker/src/ngxsmk-datepicker.ts"],"sourcesContent":["/**\r\n * Date utility functions for ngxsmk-datepicker\r\n * Extracted to improve tree-shaking and reduce bundle size\r\n */\r\n\r\nexport function getStartOfDay(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0, 0);\r\n}\r\n\r\nexport function getEndOfDay(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59, 999);\r\n}\r\n\r\nexport function addMonths(d: Date, months: number): Date {\r\n const newDate = new Date(d);\r\n newDate.setMonth(d.getMonth() + months);\r\n return newDate;\r\n}\r\n\r\nexport function subtractDays(d: Date, days: number): Date {\r\n const newDate = new Date(d);\r\n newDate.setDate(d.getDate() - days);\r\n return newDate;\r\n}\r\n\r\nexport function getStartOfMonth(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth(), 1);\r\n}\r\n\r\nexport function getEndOfMonth(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth() + 1, 0);\r\n}\r\n\r\nexport function isSameDay(d1: Date | null, d2: Date | null): boolean {\r\n if (!d1 || !d2) return false;\r\n return (\r\n d1.getFullYear() === d2.getFullYear() &&\r\n d1.getMonth() === d2.getMonth() &&\r\n d1.getDate() === d2.getDate()\r\n );\r\n}\r\n\r\nexport function normalizeDate(date: DateInput | null): Date | null {\r\n if (!date) return null;\r\n const d = (date instanceof Date) ? new Date(date.getTime()) : new Date((date as any).toDate ? (date as any).toDate() : date as any);\r\n if (isNaN(d.getTime())) return null;\r\n return d;\r\n}\r\n\r\nexport type DateInput = Date | string | { toDate: () => Date; _isAMomentObject?: boolean; $d?: Date };\r\n\r\n\r\n","/**\r\n * Calendar utility functions for ngxsmk-datepicker\r\n * Optimized for performance and tree-shaking\r\n */\r\n\r\nimport { DateInput, normalizeDate } from './date.utils';\r\n\r\nexport interface HolidayProvider {\r\n /**\r\n * Returns true if the given date is a holiday.\r\n * The date passed will be at the start of the day (00:00:00).\r\n */\r\n isHoliday(date: Date): boolean;\r\n \r\n /**\r\n * Optional: Returns a label or reason for the holiday.\r\n */\r\n getHolidayLabel?(date: Date): string | null;\r\n}\r\n\r\nexport interface DateRange {\r\n [key: string]: [DateInput, DateInput];\r\n}\r\n\r\nexport type DatepickerValue = Date | { start: Date, end: Date } | Date[] | null;\r\n\r\n/**\r\n * Generate month options for dropdown\r\n */\r\nexport function generateMonthOptions(locale: string, year: number): { label: string; value: number }[] {\r\n return Array.from({length: 12}).map((_, i) => ({\r\n label: new Date(year, i, 1).toLocaleDateString(locale, {month: 'long'}),\r\n value: i,\r\n }));\r\n}\r\n\r\n/**\r\n * Generate year options for dropdown\r\n */\r\nexport function generateYearOptions(currentYear: number, range: number = 10): { label: string; value: number }[] {\r\n const startYear = currentYear - range;\r\n const endYear = currentYear + range;\r\n const options: { label: string; value: number }[] = [];\r\n \r\n for (let i = startYear; i <= endYear; i++) {\r\n options.push({label: `${i}`, value: i});\r\n }\r\n \r\n return options;\r\n}\r\n\r\n/**\r\n * Generate time options for hour/minute dropdowns\r\n */\r\nexport function generateTimeOptions(minuteInterval: number = 1): {\r\n hourOptions: { label: string; value: number }[];\r\n minuteOptions: { label: string; value: number }[];\r\n} {\r\n const hourOptions = Array.from({length: 12}).map((_, i) => ({\r\n label: (i + 1).toString().padStart(2, '0'),\r\n value: i + 1,\r\n }));\r\n\r\n const minuteOptions: { label: string; value: number }[] = [];\r\n for (let i = 0; i < 60; i += minuteInterval) {\r\n minuteOptions.push({\r\n label: i.toString().padStart(2, '0'),\r\n value: i,\r\n });\r\n }\r\n\r\n return { hourOptions, minuteOptions };\r\n}\r\n\r\n/**\r\n * Generate week days for calendar header\r\n */\r\nexport function generateWeekDays(locale: string, firstDayOfWeek: number = 0): string[] {\r\n const day = new Date(2024, 0, 7 + firstDayOfWeek);\r\n return Array.from({length: 7}).map(() => {\r\n const weekDay = new Date(day).toLocaleDateString(locale, {weekday: 'short'});\r\n day.setDate(day.getDate() + 1);\r\n return weekDay;\r\n });\r\n}\r\n\r\n/**\r\n * Get first day of week for locale\r\n */\r\nexport function getFirstDayOfWeek(locale: string): number {\r\n try {\r\n return ((new Intl.Locale(locale) as any).weekInfo?.firstDay || 0) % 7;\r\n } catch (e) {\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Convert 12-hour to 24-hour format\r\n */\r\nexport function get24Hour(displayHour: number, isPm: boolean): number {\r\n if (isPm) { return displayHour === 12 ? 12 : displayHour + 12; }\r\n return displayHour === 12 ? 0 : displayHour;\r\n}\r\n\r\n/**\r\n * Convert 24-hour to 12-hour format\r\n */\r\nexport function update12HourState(fullHour: number): { isPm: boolean; displayHour: number } {\r\n return {\r\n isPm: fullHour >= 12,\r\n displayHour: fullHour % 12 || 12\r\n };\r\n}\r\n\r\n/**\r\n * Process date ranges input\r\n */\r\nexport function processDateRanges(ranges: DateRange | null): { [key: string]: [Date, Date] } | null {\r\n if (!ranges) return null;\r\n \r\n return Object.entries(ranges).reduce((acc, [key, dates]) => {\r\n const start = normalizeDate(dates[0]);\r\n const end = normalizeDate(dates[1]);\r\n if (start && end) acc[key] = [start, end];\r\n return acc;\r\n }, {} as { [key: string]: [Date, Date] });\r\n}\r\n\r\n\r\n","import { Component, ElementRef, EventEmitter, HostListener, inject, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'ngxsmk-custom-select',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div class=\"ngxsmk-select-container\" (click)=\"toggleDropdown()\">\r\n <button type=\"button\" class=\"ngxsmk-select-display\" [disabled]=\"disabled\">\r\n <span>{{ displayValue }}</span>\r\n <svg class=\"ngxsmk-arrow-icon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\r\n <path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"48\"\r\n d=\"M112 184l144 144 144-144\"/>\r\n </svg>\r\n </button>\r\n @if (isOpen) {\r\n <div class=\"ngxsmk-options-panel\">\r\n <ul>\r\n @for (option of options; track option.value) {\r\n <li [class.selected]=\"option.value === value\" (click)=\"selectOption(option); $event.stopPropagation()\">\r\n {{ option.label }}\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n :host { position: relative; display: inline-block; }\r\n .ngxsmk-select-container { cursor: pointer; }\r\n .ngxsmk-select-display {\r\n display: flex; align-items: center; justify-content: space-between;\r\n width: var(--custom-select-width, 115px); background: var(--datepicker-background, #fff);\r\n border: 1px solid var(--datepicker-border-color, #ccc); color: var(--datepicker-text-color, #333);\r\n border-radius: 4px; padding: 4px 8px; font-size: 14px; text-align: left; height: 30px;\r\n }\r\n .ngxsmk-select-display:disabled {\r\n background-color: var(--datepicker-hover-background, #f0f0f0);\r\n cursor: not-allowed;\r\n opacity: 0.7;\r\n }\r\n .ngxsmk-arrow-icon { width: 12px; height: 12px; margin-left: 8px; }\r\n .ngxsmk-options-panel {\r\n position: absolute; top: 110%; left: 0; width: 100%;\r\n background: var(--datepicker-background, #fff); border: 1px solid var(--datepicker-border-color, #ccc);\r\n color: var(--datepicker-text-color, #333); border-radius: 4px;\r\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); max-height: 200px; overflow-y: auto; z-index: 9999;\r\n }\r\n .ngxsmk-options-panel ul { list-style: none; padding: 4px; margin: 0; }\r\n .ngxsmk-options-panel li { padding: 8px 12px; border-radius: 4px; cursor: pointer; }\r\n .ngxsmk-options-panel li:hover { background-color: var(--datepicker-hover-background, #f0f0f0); }\r\n .ngxsmk-options-panel li.selected {\r\n background-color: var(--datepicker-primary-color, #3880ff); color: var(--datepicker-primary-contrast, #fff);\r\n }\r\n `],\r\n})\r\nexport class CustomSelectComponent {\r\n @Input() options: { label: string; value: any }[] = [];\r\n @Input() value: any;\r\n @Input() disabled: boolean = false;\r\n @Output() valueChange = new EventEmitter<any>();\r\n public isOpen = false;\r\n\r\n private readonly elementRef: ElementRef = inject(ElementRef);\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (!this.elementRef.nativeElement.contains(event.target)) this.isOpen = false;\r\n }\r\n\r\n get displayValue(): string {\r\n const selectedOption = this.options.find((opt) => opt.value === this.value);\r\n return selectedOption ? selectedOption.label : '';\r\n }\r\n\r\n toggleDropdown(): void {\r\n if (this.disabled) return;\r\n this.isOpen = !this.isOpen;\r\n }\r\n\r\n selectOption(option: { label: string; value: any }): void {\r\n this.value = option.value;\r\n this.valueChange.emit(this.value);\r\n this.isOpen = false;\r\n }\r\n}\r\n\r\n\r\n","/**\r\n * Performance utilities for ngxsmk-datepicker\r\n * Optimized for better runtime performance\r\n */\r\n\r\n/**\r\n * Memoization decorator for expensive computations\r\n */\r\nexport function memoize<T extends (...args: any[]) => any>(\r\n fn: T,\r\n keyGenerator?: (...args: Parameters<T>) => string\r\n): T {\r\n const cache = new Map<string, ReturnType<T>>();\r\n \r\n return ((...args: Parameters<T>) => {\r\n const key = keyGenerator ? keyGenerator(...args) : JSON.stringify(args);\r\n \r\n if (cache.has(key)) {\r\n return cache.get(key)!;\r\n }\r\n \r\n const result = fn(...args);\r\n cache.set(key, result);\r\n return result;\r\n }) as T;\r\n}\r\n\r\n/**\r\n * Debounce function for performance optimization\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n func: T,\r\n wait: number\r\n): (...args: Parameters<T>) => void {\r\n let timeout: number | null = null;\r\n \r\n return (...args: Parameters<T>) => {\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n }\r\n \r\n timeout = window.setTimeout(() => {\r\n func(...args);\r\n }, wait);\r\n };\r\n}\r\n\r\n/**\r\n * Throttle function for performance optimization\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n func: T,\r\n limit: number\r\n): (...args: Parameters<T>) => void {\r\n let inThrottle: boolean = false;\r\n \r\n return (...args: Parameters<T>) => {\r\n if (!inThrottle) {\r\n func(...args);\r\n inThrottle = true;\r\n window.setTimeout(() => (inThrottle = false), limit);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Create a shallow comparison function for objects\r\n */\r\nexport function shallowEqual<T extends Record<string, any>>(a: T, b: T): boolean {\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n \r\n if (keysA.length !== keysB.length) {\r\n return false;\r\n }\r\n \r\n for (const key of keysA) {\r\n if (a[key] !== b[key]) {\r\n return false;\r\n }\r\n }\r\n \r\n return true;\r\n}\r\n\r\n/**\r\n * Optimized date comparison for calendar rendering\r\n */\r\nexport function createDateComparator() {\r\n const cache = new Map<string, boolean>();\r\n \r\n return (date1: Date | null, date2: Date | null): boolean => {\r\n if (!date1 || !date2) return date1 === date2;\r\n \r\n const key = `${date1.getTime()}-${date2.getTime()}`;\r\n if (cache.has(key)) {\r\n return cache.get(key)!;\r\n }\r\n \r\n const result = (\r\n date1.getFullYear() === date2.getFullYear() &&\r\n date1.getMonth() === date2.getMonth() &&\r\n date1.getDate() === date2.getDate()\r\n );\r\n \r\n cache.set(key, result);\r\n return result;\r\n };\r\n}\r\n\r\n/**\r\n * Optimized array filtering with caching\r\n */\r\nexport function createFilteredArray<T>(\r\n source: T[],\r\n filterFn: (item: T) => boolean,\r\n cacheKey?: string\r\n): T[] {\r\n const cache = new Map<string, T[]>();\r\n const key = cacheKey || JSON.stringify(source);\r\n \r\n if (cache.has(key)) {\r\n return cache.get(key)!;\r\n }\r\n \r\n const result = source.filter(filterFn);\r\n cache.set(key, result);\r\n return result;\r\n}\r\n\r\n\r\n","import {\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n HostListener,\n inject,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n ChangeDetectionStrategy,\n OnDestroy,\n} from '@angular/core';\nimport {CommonModule, DatePipe} from '@angular/common';\nimport {\n ControlValueAccessor,\n FormsModule,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport {\n getStartOfDay,\n addMonths,\n normalizeDate,\n DateInput,\n} from './utils/date.utils';\nimport {\n HolidayProvider,\n DateRange,\n DatepickerValue,\n generateMonthOptions,\n generateYearOptions,\n generateTimeOptions,\n generateWeekDays,\n getFirstDayOfWeek,\n get24Hour,\n update12HourState,\n processDateRanges,\n} from './utils/calendar.utils';\nimport { CustomSelectComponent } from './components/custom-select.component';\nimport { createDateComparator } from './utils/performance.utils';\n\n\n@Component({\n selector: 'ngxsmk-datepicker',\n standalone: true,\n imports: [CommonModule, FormsModule, CustomSelectComponent, DatePipe, ReactiveFormsModule],\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxsmkDatepickerComponent),\n multi: true\n }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./styles/datepicker.css'],\n template: `\n <div class=\"ngxsmk-datepicker-wrapper\" [class.ngxsmk-inline-mode]=\"isInlineMode\">\n @if (!isInlineMode) {\n <div class=\"ngxsmk-input-group\" (click)=\"toggleCalendar()\" [class.disabled]=\"disabled\">\n <input type=\"text\" \n [value]=\"displayValue\" \n [placeholder]=\"placeholder\" \n readonly \n [disabled]=\"disabled\"\n class=\"ngxsmk-display-input\">\n <button type=\"button\" class=\"ngxsmk-clear-button\" (click)=\"clearValue($event)\" [disabled]=\"disabled\" *ngIf=\"displayValue\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"32\" d=\"M368 368L144 144M368 144L144 368\"/></svg>\n </button>\n </div>\n }\n\n @if (isCalendarVisible) {\n <div class=\"ngxsmk-popover-container\" [class.ngxsmk-inline-container]=\"isInlineMode\">\n <div class=\"ngxsmk-datepicker-container\">\n @if (showRanges && rangesArray.length > 0 && mode === 'range') {\n <div class=\"ngxsmk-ranges-container\">\n <ul>\n @for (range of rangesArray; track range.key) {\n <li (click)=\"selectRange(range.value)\" [class.disabled]=\"disabled\">{{ range.key }}</li>\n }\n </ul>\n </div>\n }\n <div class=\"ngxsmk-calendar-container\">\n <div class=\"ngxsmk-header\">\n <div class=\"ngxsmk-month-year-selects\">\n <ngxsmk-custom-select class=\"month-select\" [options]=\"monthOptions\"\n [(value)]=\"currentMonth\" [disabled]=\"disabled\"></ngxsmk-custom-select>\n <ngxsmk-custom-select class=\"year-select\" [options]=\"yearOptions\" [(value)]=\"currentYear\" [disabled]=\"disabled\"></ngxsmk-custom-select>\n </div>\n <div class=\"ngxsmk-nav-buttons\">\n <button type=\"button\" class=\"ngxsmk-nav-button\" (click)=\"changeMonth(-1)\" [disabled]=\"disabled || isBackArrowDisabled\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"48\"\n d=\"M328 112L184 256l144 144\"/>\n </svg>\n </button>\n <button type=\"button\" class=\"ngxsmk-nav-button\" (click)=\"changeMonth(1)\" [disabled]=\"disabled\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"48\"\n d=\"M184 112l144 144-144 144\"/>\n </svg>\n </button>\n </div>\n </div>\n <div class=\"ngxsmk-days-grid-wrapper\">\n <div class=\"ngxsmk-days-grid\">\n @for (day of weekDays; track day) {\n <div class=\"ngxsmk-day-name\">{{ day }}</div>\n }\n @for (day of daysInMonth; track $index) {\n <div class=\"ngxsmk-day-cell\"\n [class.empty]=\"!isCurrentMonth(day)\" [class.disabled]=\"isDateDisabled(day)\" \n [class.today]=\"isSameDay(day, today)\"\n [class.holiday]=\"isHoliday(day)\"\n [class.selected]=\"mode === 'single' && isSameDay(day, selectedDate)\"\n [class.multiple-selected]=\"mode === 'multiple' && isMultipleSelected(day)\"\n [class.start-date]=\"mode === 'range' && isSameDay(day, startDate)\"\n [class.end-date]=\"mode === 'range' && isSameDay(day, endDate)\"\n [class.in-range]=\"mode === 'range' && isInRange(day)\"\n [class.preview-range]=\"isPreviewInRange(day)\"\n (click)=\"onDateClick(day)\" (mouseenter)=\"onDateHover(day)\">\n @if (day) {\n <div class=\"ngxsmk-day-number\" [attr.title]=\"getHolidayLabel(day)\">{{ day | date : 'd' }}</div>\n }\n </div>\n }\n </div>\n </div>\n\n @if (showTime) {\n <div class=\"ngxsmk-time-selection\">\n <span class=\"ngxsmk-time-label\">Time:</span>\n <ngxsmk-custom-select\n class=\"hour-select\"\n [options]=\"hourOptions\"\n [(value)]=\"currentDisplayHour\"\n (valueChange)=\"onTimeChange()\"\n [disabled]=\"disabled\"\n ></ngxsmk-custom-select>\n <span class=\"ngxsmk-time-separator\">:</span>\n <ngxsmk-custom-select\n class=\"minute-select\"\n [options]=\"minuteOptions\"\n [(value)]=\"currentMinute\"\n (valueChange)=\"onTimeChange()\"\n [disabled]=\"disabled\"\n ></ngxsmk-custom-select>\n <ngxsmk-custom-select\n class=\"ampm-select\"\n [options]=\"ampmOptions\"\n [(value)]=\"isPm\"\n (valueChange)=\"onTimeChange()\"\n [disabled]=\"disabled\"\n ></ngxsmk-custom-select>\n </div>\n }\n \n <div class=\"ngxsmk-footer\" *ngIf=\"!isInlineMode\">\n <button type=\"button\" class=\"ngxsmk-clear-button-footer\" (click)=\"clearValue($event)\" [disabled]=\"disabled\">\n Clear\n </button>\n <button type=\"button\" class=\"ngxsmk-close-button\" (click)=\"isCalendarOpen = false\" [disabled]=\"disabled\">\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n})\nexport class NgxsmkDatepickerComponent implements OnInit, OnChanges, OnDestroy, ControlValueAccessor {\n @Input() mode: 'single' | 'range' | 'multiple' = 'single';\n @Input() isInvalidDate: (date: Date) => boolean = () => false;\n @Input() showRanges: boolean = true;\n @Input() showTime: boolean = false;\n @Input() minuteInterval: number = 1;\n \n // NEW: Holiday Provider Inputs\n @Input() holidayProvider: HolidayProvider | null = null;\n @Input() disableHolidays: boolean = false;\n \n // NEW: Disabled Dates Input\n @Input() disabledDates: (string | Date)[] = [];\n \n // Popover/Input Mode\n @Input() placeholder: string = 'Select Date';\n @Input() inline: boolean | 'always' | 'auto' = false;\n public isCalendarOpen: boolean = false;\n\n public _internalValue: DatepickerValue = null;\n\n private _startAtDate: Date | null = null;\n @Input() set startAt(value: DateInput | null) { this._startAtDate = this._normalizeDate(value); }\n\n private _locale: string = 'en-US';\n @Input() set locale(value: string) { this._locale = value; }\n get locale(): string { return this._locale; }\n\n @Input() theme: 'light' | 'dark' = 'light';\n @HostBinding('class.dark-theme') get isDarkMode() { return this.theme === 'dark'; }\n\n private onChange = (_: any) => {};\n private onTouched = () => {};\n public disabled = false;\n @Input() set disabledState(isDisabled: boolean) { this.disabled = isDisabled; }\n\n @Output() valueChange = new EventEmitter<DatepickerValue>();\n @Output() action = new EventEmitter<{ type: string; payload?: any }>();\n\n private _minDate: Date | null = null;\n @Input() set minDate(value: DateInput | null) { this._minDate = this._normalizeDate(value); }\n\n private _maxDate: Date | null = null;\n @Input() set maxDate(value: DateInput | null) { this._maxDate = this._normalizeDate(value); }\n\n private _ranges: { [key: string]: [Date, Date] } | null = null;\n @Input() set ranges(value: DateRange | null) {\n this._ranges = processDateRanges(value);\n this.updateRangesArray();\n }\n\n public currentDate: Date = new Date();\n public daysInMonth: (Date | null)[] = [];\n public weekDays: string[] = [];\n public readonly today: Date = getStartOfDay(new Date());\n public selectedDate: Date | null = null;\n public selectedDates: Date[] = [];\n public startDate: Date | null = null;\n public endDate: Date | null = null;\n public hoveredDate: Date | null = null;\n public rangesArray: { key: string; value: [Date, Date] }[] = [];\n\n private _currentMonth: number = this.currentDate.getMonth();\n private _currentYear: number = this.currentDate.getFullYear();\n\n public monthOptions: { label: string; value: number }[] = [];\n public yearOptions: { label: string; value: number }[] = [];\n private firstDayOfWeek: number = 0;\n\n public currentHour: number = 0;\n public currentMinute: number = 0;\n public currentDisplayHour: number = 12;\n public isPm: boolean = false;\n\n public hourOptions: { label: string; value: number }[] = [];\n public minuteOptions: { label: string; value: number }[] = [];\n public ampmOptions: { label: string; value: boolean }[] = [\n {label: 'AM', value: false},\n {label: 'PM', value: true}\n ];\n\n // Animation state properties\n \n private readonly elementRef: ElementRef = inject(ElementRef);\n private readonly dateComparator = createDateComparator();\n \n get isInlineMode(): boolean {\n return this.inline === true || this.inline === 'always' || \n (this.inline === 'auto' && typeof window !== 'undefined' && window.matchMedia('(min-width: 768px)').matches);\n }\n\n get isCalendarVisible(): boolean {\n return this.isInlineMode || this.isCalendarOpen;\n }\n \n get displayValue(): string {\n if (this.mode === 'single' && this.selectedDate) {\n return this.selectedDate.toLocaleString(this.locale, { \n year: 'numeric', month: 'short', day: '2-digit', \n hour: this.showTime ? '2-digit' : undefined, \n minute: this.showTime ? '2-digit' : undefined \n });\n } else if (this.mode === 'range' && this.startDate && this.endDate) {\n const start = this.startDate.toLocaleString(this.locale, { year: 'numeric', month: 'short', day: '2-digit' });\n const end = this.endDate.toLocaleString(this.locale, { year: 'numeric', month: 'short', day: '2-digit' });\n return `${start} - ${end}`;\n } else if (this.mode === 'multiple' && this.selectedDates.length > 0) {\n return `${this.selectedDates.length} dates selected`;\n }\n return '';\n }\n\n get isBackArrowDisabled(): boolean {\n if (!this._minDate) return false;\n \n // Get the first day of the current month\n const firstDayOfCurrentMonth = new Date(this.currentYear, this.currentMonth, 1);\n \n // Check if the first day of current month is before or equal to minDate\n return firstDayOfCurrentMonth <= this._minDate;\n }\n \n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.isInlineMode && this.isCalendarOpen && !this.elementRef.nativeElement.contains(event.target)) {\n this.isCalendarOpen = false;\n }\n }\n\n\n writeValue(val: DatepickerValue): void {\n this._internalValue = val;\n this.initializeValue(val);\n this.generateCalendar();\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n private emitValue(val: DatepickerValue) {\n this._internalValue = val;\n this.valueChange.emit(val);\n this.onChange(val);\n this.onTouched();\n \n // Auto-close popover when a selection is complete\n if (!this.isInlineMode && val !== null) {\n if (this.mode === 'single' || (this.mode === 'range' && this.startDate && this.endDate)) {\n this.isCalendarOpen = false;\n }\n }\n }\n \n public toggleCalendar(): void {\n if (this.disabled || this.isInlineMode) return;\n this.isCalendarOpen = !this.isCalendarOpen;\n }\n \n public clearValue(event?: MouseEvent): void {\n if (event) event.stopPropagation();\n if (this.disabled) return;\n \n this.selectedDate = null;\n this.selectedDates = [];\n this.startDate = null;\n this.endDate = null;\n this.hoveredDate = null;\n this.isCalendarOpen = false;\n \n this.emitValue(null);\n this.action.emit({type: 'clear', payload: null});\n \n // Reset view to today after clearing\n this.currentDate = new Date();\n this._currentMonth = this.currentDate.getMonth();\n this._currentYear = this.currentDate.getFullYear();\n this.generateCalendar();\n }\n\n get currentMonth(): number { return this._currentMonth; }\n\n set currentMonth(month: number) {\n if (this.disabled) return;\n if (this._currentMonth !== month) {\n this._currentMonth = month;\n this.currentDate.setMonth(month);\n this.generateCalendar();\n }\n }\n\n get currentYear(): number { return this._currentYear; }\n\n set currentYear(year: number) {\n if (this.disabled) return;\n if (this._currentYear !== year) {\n this._currentYear = year;\n this.currentDate.setFullYear(year);\n this.generateCalendar();\n }\n }\n\n ngOnInit(): void {\n if (this._locale === 'en-US' && typeof navigator !== 'undefined') {\n this._locale = navigator.language;\n }\n\n this.today.setHours(0, 0, 0, 0);\n this.generateLocaleData();\n this.generateTimeOptions();\n\n if (this.showTime && !this._internalValue) {\n const now = new Date();\n this.currentHour = now.getHours();\n this.currentMinute = Math.floor(now.getMinutes() / this.minuteInterval) * this.minuteInterval;\n\n if (this.currentMinute === 60) {\n this.currentMinute = 0;\n this.currentHour = (this.currentHour + 1) % 24;\n }\n this.update12HourState(this.currentHour);\n }\n\n if (this._internalValue) {\n this.initializeValue(this._internalValue);\n } else {\n this.initializeValue(null);\n }\n this.generateCalendar();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['locale']) {\n this.generateLocaleData();\n this.generateCalendar();\n }\n\n if (changes['minuteInterval']) {\n this.generateTimeOptions();\n this.currentMinute = Math.floor(this.currentMinute / this.minuteInterval) * this.minuteInterval;\n this.onTimeChange();\n }\n\n if (changes['value'] && changes['value'].currentValue !== changes['value'].previousValue) {\n this.writeValue(changes['value'].currentValue);\n }\n \n // Rerun calendar generation if provider changes to refresh disabled states\n if (changes['holidayProvider'] || changes['disableHolidays'] || changes['disabledDates']) {\n this.generateCalendar();\n }\n\n if (changes['startAt']) {\n if (!this._internalValue && this._startAtDate) {\n this.currentDate = new Date(this._startAtDate);\n this._currentMonth = this.currentDate.getMonth();\n this._currentYear = this.currentDate.getFullYear();\n this.generateCalendar();\n }\n }\n\n // Handle minDate changes - if minDate is set and is in the future, \n // and we don't have a current value, update the view to show minDate's month\n if (changes['minDate'] && !this._internalValue) {\n if (this._minDate) {\n const today = new Date();\n const minDateOnly = getStartOfDay(this._minDate);\n const todayOnly = getStartOfDay(today);\n \n // If minDate is in the future, update the view to show minDate's month\n if (minDateOnly.getTime() > todayOnly.getTime()) {\n this.currentDate = new Date(this._minDate);\n this._currentMonth = this.currentDate.getMonth();\n this._currentYear = this.currentDate.getFullYear();\n this.generateCalendar();\n }\n }\n }\n }\n\n private get24Hour(displayHour: number, isPm: boolean): number {\n return get24Hour(displayHour, isPm);\n }\n\n private update12HourState(fullHour: number): void {\n const state = update12HourState(fullHour);\n this.isPm = state.isPm;\n this.currentDisplayHour = state.displayHour;\n }\n\n private applyCurrentTime(date: Date): Date {\n this.currentHour = this.get24Hour(this.currentDisplayHour, this.isPm);\n date.setHours(this.currentHour, this.currentMinute, 0, 0);\n return date;\n }\n\n private initializeValue(value: DatepickerValue): void {\n let initialDate: Date | null = null;\n\n this.selectedDate = null;\n this.startDate = null;\n this.endDate = null;\n this.selectedDates = [];\n\n if (value) {\n if (this.mode === 'single' && value instanceof Date) {\n this.selectedDate = this._normalizeDate(value);\n initialDate = this.selectedDate;\n } else if (this.mode === 'range' && typeof value === 'object' && 'start' in value && 'end' in value) {\n this.startDate = this._normalizeDate((value as {start: Date, end: Date}).start);\n this.endDate = this._normalizeDate((value as {start: Date, end: Date}).end);\n initialDate = this.startDate;\n } else if (this.mode === 'multiple' && Array.isArray(value)) {\n this.selectedDates = (value as Date[]).map(d => this._normalizeDate(d)).filter((d): d is Date => d !== null);\n initialDate = this.selectedDates.length > 0 ? this.selectedDates[this.selectedDates.length - 1]! : null;\n }\n }\n\n // Determine the initial view date\n let viewCenterDate = initialDate || this._startAtDate;\n \n // If no specific date is set and minDate is in the future, use minDate's month\n if (!viewCenterDate && this._minDate) {\n const today = new Date();\n const minDateOnly = getStartOfDay(this._minDate);\n const todayOnly = getStartOfDay(today);\n \n // If minDate is in the future, use minDate as the initial view\n if (minDateOnly.getTime() > todayOnly.getTime()) {\n viewCenterDate = this._minDate;\n }\n }\n \n // Fallback to current date if no other date is determined\n if (!viewCenterDate) {\n viewCenterDate = new Date();\n }\n\n if (viewCenterDate) {\n this.currentDate = new Date(viewCenterDate);\n this._currentMonth = viewCenterDate.getMonth();\n this._currentYear = viewCenterDate.getFullYear();\n this.currentHour = viewCenterDate.getHours();\n this.currentMinute = viewCenterDate.getMinutes();\n this.update12HourState(this.currentHour);\n this.currentMinute = Math.floor(this.currentMinute / this.minuteInterval) * this.minuteInterval;\n }\n }\n\n private _normalizeDate(date: DateInput | null): Date | null {\n return normalizeDate(date);\n }\n\n private parseDateString(dateString: string): Date | null {\n try {\n // Handle MM/DD/YYYY format\n const date = new Date(dateString);\n if (isNaN(date.getTime())) {\n return null;\n }\n return getStartOfDay(date);\n } catch (error) {\n return null;\n }\n }\n\n private generateTimeOptions(): void {\n const { hourOptions, minuteOptions } = generateTimeOptions(this.minuteInterval);\n this.hourOptions = hourOptions;\n this.minuteOptions = minuteOptions;\n }\n\n private generateLocaleData(): void {\n const year = new Date().getFullYear();\n this.monthOptions = generateMonthOptions(this.locale, year);\n this.firstDayOfWeek = getFirstDayOfWeek(this.locale);\n this.weekDays = generateWeekDays(this.locale, this.firstDayOfWeek);\n }\n\n private updateRangesArray(): void {\n this.rangesArray = this._ranges ? Object.entries(this._ranges).map(([key, value]) => ({key, value})) : [];\n }\n\n public selectRange(range: [Date, Date]): void {\n if (this.disabled) return;\n this.startDate = this.applyCurrentTime(range[0]);\n this.endDate = this.applyCurrentTime(range[1]);\n\n if (this.startDate && this.endDate) {\n this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\n }\n\n this.currentDate = new Date(this.startDate);\n this.initializeValue({start: this.startDate, end: this.endDate});\n this.generateCalendar();\n this.action.emit({type: 'rangeSelected', payload: {start: this.startDate, end: this.endDate, key: this.rangesArray.find(r => r.value === range)?.key}});\n }\n \n // NEW: Check if a date is a holiday\n public isHoliday(date: Date | null): boolean {\n if (!date || !this.holidayProvider) return false;\n const dateOnly = getStartOfDay(date);\n return this.holidayProvider.isHoliday(dateOnly);\n }\n \n // NEW: Get holiday label\n public getHolidayLabel(date: Date | null): string | null {\n if (!date || !this.holidayProvider || !this.isHoliday(date)) return null;\n return this.holidayProvider.getHolidayLabel ? this.holidayProvider.getHolidayLabel(getStartOfDay(date)) : 'Holiday';\n }\n\n public isDateDisabled(date: Date | null): boolean {\n if (!date) return false;\n\n const dateOnly = getStartOfDay(date);\n\n // 1. Check disabled dates array\n if (this.disabledDates.length > 0) {\n for (const disabledDate of this.disabledDates) {\n let parsedDate: Date | null;\n \n if (typeof disabledDate === 'string') {\n parsedDate = this.parseDateString(disabledDate);\n } else {\n parsedDate = getStartOfDay(disabledDate);\n }\n \n if (parsedDate && dateOnly.getTime() === parsedDate.getTime()) {\n return true;\n }\n }\n }\n\n // 2. Check holiday provider for disabling\n if (this.holidayProvider && this.disableHolidays && this.holidayProvider.isHoliday(dateOnly)) {\n return true;\n }\n\n // 3. Check min/max date\n if (this._minDate) {\n const minDateOnly = getStartOfDay(this._minDate);\n if (dateOnly.getTime() < minDateOnly.getTime()) return true;\n }\n if (this._maxDate) {\n const maxDateOnly = getStartOfDay(this._maxDate);\n if (dateOnly.getTime() > maxDateOnly.getTime()) return true;\n }\n \n // 4. Check custom invalid date function\n return this.isInvalidDate(date);\n }\n\n public isMultipleSelected(d: Date | null): boolean {\n if (!d || this.mode !== 'multiple') return false;\n const dTime = getStartOfDay(d).getTime();\n return this.selectedDates.some(selected => getStartOfDay(selected).getTime() === dTime);\n }\n\n public onTimeChange(): void {\n if (this.disabled) return;\n if (this.mode === 'single' && this.selectedDate) {\n this.selectedDate = this.applyCurrentTime(this.selectedDate);\n this.emitValue(this.selectedDate);\n } else if (this.mode === 'range' && this.startDate && this.endDate) {\n this.startDate = this.applyCurrentTime(this.startDate);\n this.endDate = this.applyCurrentTime(this.endDate);\n this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\n } else if (this.mode === 'range' && this.startDate && !this.endDate) {\n this.startDate = this.applyCurrentTime(this.startDate);\n } else if (this.mode === 'multiple') {\n this.selectedDates = this.selectedDates.map(date => {\n const newDate = getStartOfDay(date);\n return this.applyCurrentTime(newDate);\n });\n this.emitValue([...this.selectedDates]);\n }\n\n this.action.emit({type: 'timeChanged', payload: {hour: this.currentHour, minute: this.currentMinute}});\n }\n\n public onDateClick(day: Date | null): void {\n if (!day || this.disabled) return;\n \n // Only check isDateDisabled for current month days\n if (this.isCurrentMonth(day) && this.isDateDisabled(day)) return;\n\n const dateToToggle = getStartOfDay(day);\n\n if (this.mode === 'single') {\n this.selectedDate = this.applyCurrentTime(day);\n this.emitValue(this.selectedDate);\n } else if (this.mode === 'range') {\n if (!this.startDate || (this.startDate && this.endDate)) {\n this.startDate = this.applyCurrentTime(day);\n this.endDate = null;\n } else if (day >= this.startDate) {\n this.endDate = this.applyCurrentTime(day);\n this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\n } else {\n this.startDate = this.applyCurrentTime(day);\n this.endDate = null;\n }\n this.hoveredDate = null;\n } else if (this.mode === 'multiple') {\n const existingIndex = this.selectedDates.findIndex(d => this.isSameDay(d, dateToToggle));\n\n if (existingIndex > -1) {\n this.selectedDates.splice(existingIndex, 1);\n } else {\n const dateWithTime = this.applyCurrentTime(dateToToggle);\n this.selectedDates.push(dateWithTime);\n this.selectedDates.sort((a, b) => a.getTime() - b.getTime());\n }\n this.emitValue([...this.selectedDates]);\n }\n\n const dateToSync = this.mode === 'single' ? this.selectedDate :\n this.mode === 'range' ? this.startDate :\n this.mode === 'multiple' && this.selectedDates.length > 0 ? this.selectedDates[this.selectedDates.length - 1] : null;\n\n if (dateToSync) {\n this.update12HourState(dateToSync.getHours());\n this.currentMinute = dateToSync.getMinutes();\n }\n\n this.action.emit({\n type: 'dateSelected',\n payload: {\n mode: this.mode,\n value: this._internalValue,\n date: day\n }\n });\n }\n\n public onDateHover(day: Date | null): void {\n if (this.mode === 'range' && this.startDate && !this.endDate && day) {\n this.hoveredDate = day;\n }\n }\n\n public isPreviewInRange(day: Date | null): boolean {\n if (this.mode !== 'range' || !this.startDate || this.endDate || !this.hoveredDate || !day) return false;\n const start = getStartOfDay(this.startDate).getTime();\n const end = getStartOfDay(this.hoveredDate).getTime();\n const time = getStartOfDay(day).getTime();\n return time > Math.min(start, end) && time < Math.max(start, end);\n }\n\n public generateCalendar(): void {\n this.daysInMonth = [];\n const year = this.currentDate.getFullYear();\n const month = this.currentDate.getMonth();\n this._currentMonth = month;\n this._currentYear = year;\n this.generateDropdownOptions();\n const firstDayOfMonth = new Date(year, month, 1);\n const lastDayOfMonth = new Date(year, month + 1, 0);\n const startDayOfWeek = firstDayOfMonth.getDay();\n const emptyCellCount = (startDayOfWeek - this.firstDayOfWeek + 7) % 7;\n\n // Add previous month's days instead of null values\n const previousMonth = month === 0 ? 11 : month - 1;\n const previousYear = month === 0 ? year - 1 : year;\n const lastDayOfPreviousMonth = new Date(previousYear, previousMonth + 1, 0);\n \n for (let i = 0; i < emptyCellCount; i++) {\n const dayNumber = lastDayOfPreviousMonth.getDate() - emptyCellCount + i + 1;\n this.daysInMonth.push(this._normalizeDate(new Date(previousYear, previousMonth, dayNumber)));\n }\n for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {\n this.daysInMonth.push(this._normalizeDate(new Date(year, month, i)));\n }\n\n\n this.action.emit({\n type: 'calendarGenerated',\n payload: {\n month: month,\n year: year,\n days: this.daysInMonth.filter(d => d !== null)\n }\n });\n }\n\n private generateDropdownOptions(): void {\n this.yearOptions = generateYearOptions(this._currentYear);\n }\n\n public changeMonth(delta: number): void {\n if (this.disabled) return;\n\n // Check if going back is disabled due to minDate constraint\n if (delta < 0 && this.isBackArrowDisabled) return;\n\n const newDate = addMonths(this.currentDate, delta);\n\n // Update the data immediately (no animation)\n this.currentDate = newDate;\n this._currentMonth = newDate.getMonth();\n this._currentYear = newDate.getFullYear();\n\n // Generate new calendar view\n this.generateCalendar();\n\n this.action.emit({type: 'monthChanged', payload: { delta: delta }});\n }\n\n public isSameDay(d1: Date | null, d2: Date | null): boolean {\n return this.dateComparator(d1, d2);\n }\n\n public isCurrentMonth(day: Date | null): boolean {\n if (!day) return false;\n return day.getMonth() === this._currentMonth && day.getFullYear() === this._currentYear;\n }\n\n public isInRange(d: Date | null): boolean {\n if (!d || !this.startDate || !this.endDate) return false;\n\n const dTime = getStartOfDay(d).getTime();\n const startDayTime = getStartOfDay(this.startDate).getTime();\n const endDayTime = getStartOfDay(this.endDate).getTime();\n\n const startTime = Math.min(startDayTime, endDayTime);\n const endTime = Math.max(startDayTime, endDayTime);\n\n return dTime > startTime && dTime < endTime;\n }\n\n ngOnDestroy(): void {\n // Clean up any subscriptions or timers if needed\n // Currently no cleanup required, but method is here for future optimizations\n }\n}","/*\n * Public API Surface of ngxsmk-datepicker\n */\n\nexport * from './lib/ngxsmk-datepicker';\nexport * from './lib/components/custom-select.component';\nexport * from './lib/utils/date.utils';\nexport * from './lib/utils/calendar.utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -104,6 +104,7 @@ declare class NgxsmkDatepickerComponent implements OnInit, OnChanges, OnDestroy,
|
|
|
104
104
|
minuteInterval: number;
|
|
105
105
|
holidayProvider: HolidayProvider | null;
|
|
106
106
|
disableHolidays: boolean;
|
|
107
|
+
disabledDates: (string | Date)[];
|
|
107
108
|
placeholder: string;
|
|
108
109
|
inline: boolean | 'always' | 'auto';
|
|
109
110
|
isCalendarOpen: boolean;
|
|
@@ -195,6 +196,7 @@ declare class NgxsmkDatepickerComponent implements OnInit, OnChanges, OnDestroy,
|
|
|
195
196
|
private applyCurrentTime;
|
|
196
197
|
private initializeValue;
|
|
197
198
|
private _normalizeDate;
|
|
199
|
+
private parseDateString;
|
|
198
200
|
private generateTimeOptions;
|
|
199
201
|
private generateLocaleData;
|
|
200
202
|
private updateRangesArray;
|
|
@@ -215,7 +217,7 @@ declare class NgxsmkDatepickerComponent implements OnInit, OnChanges, OnDestroy,
|
|
|
215
217
|
isInRange(d: Date | null): boolean;
|
|
216
218
|
ngOnDestroy(): void;
|
|
217
219
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgxsmkDatepickerComponent, never>;
|
|
218
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgxsmkDatepickerComponent, "ngxsmk-datepicker", never, { "mode": { "alias": "mode"; "required": false; }; "isInvalidDate": { "alias": "isInvalidDate"; "required": false; }; "showRanges": { "alias": "showRanges"; "required": false; }; "showTime": { "alias": "showTime"; "required": false; }; "minuteInterval": { "alias": "minuteInterval"; "required": false; }; "holidayProvider": { "alias": "holidayProvider"; "required": false; }; "disableHolidays": { "alias": "disableHolidays"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "startAt": { "alias": "startAt"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "disabledState": { "alias": "disabledState"; "required": false; }; "minDate": { "alias": "minDate"; "required": false; }; "maxDate": { "alias": "maxDate"; "required": false; }; "ranges": { "alias": "ranges"; "required": false; }; }, { "valueChange": "valueChange"; "action": "action"; }, never, never, true, never>;
|
|
220
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgxsmkDatepickerComponent, "ngxsmk-datepicker", never, { "mode": { "alias": "mode"; "required": false; }; "isInvalidDate": { "alias": "isInvalidDate"; "required": false; }; "showRanges": { "alias": "showRanges"; "required": false; }; "showTime": { "alias": "showTime"; "required": false; }; "minuteInterval": { "alias": "minuteInterval"; "required": false; }; "holidayProvider": { "alias": "holidayProvider"; "required": false; }; "disableHolidays": { "alias": "disableHolidays"; "required": false; }; "disabledDates": { "alias": "disabledDates"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "startAt": { "alias": "startAt"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "disabledState": { "alias": "disabledState"; "required": false; }; "minDate": { "alias": "minDate"; "required": false; }; "maxDate": { "alias": "maxDate"; "required": false; }; "ranges": { "alias": "ranges"; "required": false; }; }, { "valueChange": "valueChange"; "action": "action"; }, never, never, true, never>;
|
|
219
221
|
}
|
|
220
222
|
|
|
221
223
|
declare class CustomSelectComponent {
|
package/package.json
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ngxsmk-datepicker",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.14",
|
|
4
|
+
"author": {
|
|
5
|
+
"name": "Sachin Dilshan",
|
|
6
|
+
"url": "https://www.linkedin.com/in/sachindilshan/"
|
|
7
|
+
},
|
|
4
8
|
"peerDependencies": {
|
|
5
9
|
"@angular/common": ">=17.0.0",
|
|
6
10
|
"@angular/core": ">=17.0.0",
|
|
@@ -20,6 +24,9 @@
|
|
|
20
24
|
"type": "git",
|
|
21
25
|
"url": "git+https://github.com/toozuuu/ngxsmk-datepicker.git"
|
|
22
26
|
},
|
|
27
|
+
"bugs": {
|
|
28
|
+
"url": "https://github.com/toozuuu/ngxsmk-datepicker/issues"
|
|
29
|
+
},
|
|
23
30
|
"sideEffects": false,
|
|
24
31
|
"files": [
|
|
25
32
|
"fesm2022/",
|