ngxsmk-datepicker 1.3.6 → 1.3.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ngxsmk-datepicker.mjs","sources":["../../../projects/ngxsmk-datepicker/src/lib/ngxsmk-datepicker.ts","../../../projects/ngxsmk-datepicker/src/public-api.ts","../../../projects/ngxsmk-datepicker/src/ngxsmk-datepicker.ts"],"sourcesContent":["import {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n forwardRef,\r\n HostBinding,\r\n HostListener,\r\n inject,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport {CommonModule, DatePipe, JsonPipe} from '@angular/common';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NG_VALUE_ACCESSOR,\r\n ReactiveFormsModule,\r\n FormControl,\r\n FormGroup,\r\n} from '@angular/forms';\r\n\r\nfunction getStartOfDay(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0, 0);\r\n}\r\nfunction getEndOfDay(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59, 999);\r\n}\r\nfunction 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\nfunction 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\nfunction getStartOfMonth(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth(), 1);\r\n}\r\nfunction getEndOfMonth(d: Date): Date {\r\n return new Date(d.getFullYear(), d.getMonth() + 1, 0);\r\n}\r\n\r\nexport type DateInput = Date | string | { toDate: () => Date; _isAMomentObject?: boolean; $d?: Date };\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// NEW INTERFACE for Holiday Provider\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\n\r\n@Component({\r\n selector: 'app-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@Component({\r\n selector: 'ngxsmk-datepicker',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, CustomSelectComponent, DatePipe, ReactiveFormsModule],\r\n providers: [{\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NgxsmkDatepickerComponent),\r\n multi: true\r\n }],\r\n template: `\r\n <div class=\"ngxsmk-datepicker-wrapper\" [class.ngxsmk-inline-mode]=\"isInlineMode\">\r\n @if (!isInlineMode) {\r\n <div class=\"ngxsmk-input-group\" (click)=\"toggleCalendar()\" [class.disabled]=\"disabled\">\r\n <input type=\"text\" \r\n [value]=\"displayValue\" \r\n [placeholder]=\"placeholder\" \r\n readonly \r\n [disabled]=\"disabled\"\r\n class=\"ngxsmk-display-input\">\r\n <button type=\"button\" class=\"ngxsmk-clear-button\" (click)=\"clearValue($event)\" [disabled]=\"disabled\" *ngIf=\"displayValue\">\r\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>\r\n </button>\r\n </div>\r\n }\r\n\r\n @if (isCalendarVisible) {\r\n <div class=\"ngxsmk-popover-container\" [class.ngxsmk-inline-container]=\"isInlineMode\">\r\n <div class=\"ngxsmk-datepicker-container\">\r\n @if (showRanges && rangesArray.length > 0 && mode === 'range') {\r\n <div class=\"ngxsmk-ranges-container\">\r\n <ul>\r\n @for (range of rangesArray; track range.key) {\r\n <li (click)=\"selectRange(range.value)\" [class.disabled]=\"disabled\">{{ range.key }}</li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n <div class=\"ngxsmk-calendar-container\">\r\n <div class=\"ngxsmk-header\">\r\n <div class=\"ngxsmk-month-year-selects\">\r\n <app-custom-select class=\"month-select\" [options]=\"monthOptions\"\r\n [(value)]=\"currentMonth\" [disabled]=\"disabled\"></app-custom-select>\r\n <app-custom-select class=\"year-select\" [options]=\"yearOptions\" [(value)]=\"currentYear\" [disabled]=\"disabled\"></app-custom-select>\r\n </div>\r\n <div class=\"ngxsmk-nav-buttons\">\r\n <button type=\"button\" class=\"ngxsmk-nav-button\" (click)=\"changeMonth(-1)\" [disabled]=\"disabled\">\r\n <svg 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=\"M328 112L184 256l144 144\"/>\r\n </svg>\r\n </button>\r\n <button type=\"button\" class=\"ngxsmk-nav-button\" (click)=\"changeMonth(1)\" [disabled]=\"disabled\">\r\n <svg 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=\"M184 112l144 144-144 144\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"ngxsmk-days-grid-wrapper\">\r\n <div class=\"ngxsmk-days-grid\"\r\n [class.animate-forward]=\"animateForward\" \r\n [class.animate-backward]=\"animateBackward\">\r\n @for (day of weekDays; track day) {\r\n <div class=\"ngxsmk-day-name\">{{ day }}</div>\r\n }\r\n @for (day of daysInMonth; track $index) {\r\n <div class=\"ngxsmk-day-cell\"\r\n [class.empty]=\"!day\" [class.disabled]=\"isDateDisabled(day)\" \r\n [class.today]=\"isSameDay(day, today)\"\r\n [class.holiday]=\"isHoliday(day)\"\r\n [class.selected]=\"mode === 'single' && isSameDay(day, selectedDate)\"\r\n [class.multiple-selected]=\"mode === 'multiple' && isMultipleSelected(day)\"\r\n [class.start-date]=\"mode === 'range' && isSameDay(day, startDate)\"\r\n [class.end-date]=\"mode === 'range' && isSameDay(day, endDate)\"\r\n [class.in-range]=\"mode === 'range' && isInRange(day)\"\r\n [class.preview-range]=\"isPreviewInRange(day)\"\r\n (click)=\"onDateClick(day)\" (mouseenter)=\"onDateHover(day)\">\r\n @if (day) {\r\n <div class=\"ngxsmk-day-number\" [attr.title]=\"getHolidayLabel(day)\">{{ day | date : 'd' }}</div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (showTime) {\r\n <div class=\"ngxsmk-time-selection\">\r\n <span class=\"ngxsmk-time-label\">Time:</span>\r\n <app-custom-select\r\n class=\"hour-select\"\r\n [options]=\"hourOptions\"\r\n [(value)]=\"currentDisplayHour\"\r\n (valueChange)=\"onTimeChange()\"\r\n [disabled]=\"disabled\"\r\n ></app-custom-select>\r\n <span class=\"ngxsmk-time-separator\">:</span>\r\n <app-custom-select\r\n class=\"minute-select\"\r\n [options]=\"minuteOptions\"\r\n [(value)]=\"currentMinute\"\r\n (valueChange)=\"onTimeChange()\"\r\n [disabled]=\"disabled\"\r\n ></app-custom-select>\r\n <app-custom-select\r\n class=\"ampm-select\"\r\n [options]=\"ampmOptions\"\r\n [(value)]=\"isPm\"\r\n (valueChange)=\"onTimeChange()\"\r\n [disabled]=\"disabled\"\r\n ></app-custom-select>\r\n </div>\r\n }\r\n \r\n <div class=\"ngxsmk-footer\" *ngIf=\"!isInlineMode\">\r\n <button type=\"button\" class=\"ngxsmk-clear-button-footer\" (click)=\"clearValue($event)\" [disabled]=\"disabled\">\r\n Clear\r\n </button>\r\n <button type=\"button\" class=\"ngxsmk-close-button\" (click)=\"isCalendarOpen = false\" [disabled]=\"disabled\">\r\n Close\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n :host {\r\n --datepicker-primary-color: #6d28d9; --datepicker-primary-contrast: #ffffff;\r\n --datepicker-range-background: #f5f3ff; --datepicker-background: #ffffff;\r\n --datepicker-text-color: #222428; --datepicker-subtle-text-color: #9ca3af;\r\n --datepicker-border-color: #e9e9e9; --datepicker-hover-background: #f0f0f0;\r\n display: inline-block;\r\n position: relative; /* Host must be relative for popover */\r\n }\r\n :host(.dark-theme) {\r\n --datepicker-range-background: rgba(139, 92, 246, 0.2); --datepicker-background: #1f2937;\r\n --datepicker-text-color: #d1d5db; --datepicker-subtle-text-color: #6b7280;\r\n --datepicker-border-color: #4b5563; --datepicker-hover-background: #374151;\r\n }\r\n\r\n /* Input/Popover Mode Styles */\r\n .ngxsmk-datepicker-wrapper { position: relative; }\r\n .ngxsmk-input-group {\r\n display: flex; align-items: center; cursor: pointer;\r\n width: 100%; min-width: 150px; border: 1px solid var(--datepicker-border-color, #ccc);\r\n border-radius: 4px; background: var(--datepicker-background);\r\n transition: border-color 0.15s ease;\r\n }\r\n .ngxsmk-input-group:hover:not(.disabled) { border-color: var(--datepicker-primary-color); }\r\n .ngxsmk-input-group.disabled { cursor: not-allowed; opacity: 0.7; }\r\n \r\n .ngxsmk-display-input {\r\n flex-grow: 1; padding: 6px 8px; font-size: 14px;\r\n color: var(--datepicker-text-color, #333); background: transparent;\r\n border: none; outline: none; cursor: pointer;\r\n }\r\n .ngxsmk-display-input:disabled { background: var(--datepicker-hover-background, #f0f0f0); cursor: not-allowed; }\r\n\r\n .ngxsmk-clear-button {\r\n background: none; border: none; padding: 0 8px; cursor: pointer;\r\n color: var(--datepicker-subtle-text-color); line-height: 1;\r\n }\r\n .ngxsmk-clear-button svg { width: 14px; height: 14px; }\r\n .ngxsmk-clear-button:hover { color: var(--datepicker-text-color); }\r\n\r\n .ngxsmk-popover-container {\r\n position: absolute; top: 100%; left: 0;\r\n z-index: 10000; margin-top: 8px;\r\n }\r\n .ngxsmk-popover-container.ngxsmk-inline-container {\r\n position: static; margin-top: 0;\r\n }\r\n .ngxsmk-datepicker-wrapper.ngxsmk-inline-mode { display: block; }\r\n .ngxsmk-datepicker-wrapper.ngxsmk-inline-mode .ngxsmk-datepicker-container {\r\n box-shadow: none; border: 1px solid var(--datepicker-border-color);\r\n }\r\n \r\n .ngxsmk-footer {\r\n display: flex; justify-content: flex-end; gap: 8px;\r\n margin-top: 12px; padding-top: 8px;\r\n border-top: 1px solid var(--datepicker-border-color);\r\n }\r\n .ngxsmk-clear-button-footer, .ngxsmk-close-button {\r\n padding: 6px 12px; border-radius: 6px; font-size: 0.9rem; cursor: pointer;\r\n transition: background-color 0.2s;\r\n border: 1px solid var(--datepicker-border-color);\r\n }\r\n .ngxsmk-clear-button-footer {\r\n background: none;\r\n color: var(--datepicker-subtle-text-color);\r\n }\r\n .ngxsmk-close-button {\r\n background-color: var(--datepicker-primary-color);\r\n color: var(--datepicker-primary-contrast);\r\n border-color: var(--datepicker-primary-color);\r\n }\r\n .ngxsmk-close-button:hover:not(:disabled) {\r\n opacity: 0.9;\r\n }\r\n .ngxsmk-clear-button-footer:hover:not(:disabled) {\r\n background-color: var(--datepicker-hover-background);\r\n }\r\n /* End Input/Popover Mode Styles */\r\n\r\n .ngxsmk-datepicker-container { display: flex; flex-direction: column; width: 100%; }\r\n .ngxsmk-calendar-container {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\r\n border-radius: 10px; padding: 12px; background: var(--datepicker-background);\r\n box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);\r\n width: 100%;\r\n }\r\n .ngxsmk-ranges-container {\r\n width: 100%;\r\n padding: 12px;\r\n border-right: none;\r\n border-bottom: 1px solid var(--datepicker-border-color);\r\n background: var(--datepicker-hover-background);\r\n border-radius: 10px 10px 0 0;\r\n }\r\n .ngxsmk-ranges-container ul {\r\n display: flex;\r\n flex-wrap: wrap;\r\n justify-content: center;\r\n gap: 8px;\r\n list-style: none; padding: 0; margin: 0;\r\n }\r\n .ngxsmk-ranges-container li {\r\n padding: 6px 10px;\r\n margin-bottom: 0;\r\n font-size: 0.85rem;\r\n border: 1px solid var(--datepicker-border-color);\r\n border-radius: 6px;\r\n cursor: pointer;\r\n transition: background-color 0.15s ease;\r\n flex-shrink: 0;\r\n }\r\n .ngxsmk-ranges-container li:hover { background-color: var(--datepicker-hover-background); }\r\n .ngxsmk-ranges-container li.disabled { cursor: not-allowed; opacity: 0.5; background-color: transparent !important; color: var(--datepicker-subtle-text-color, #9ca3af); }\r\n\r\n\r\n .ngxsmk-header {\r\n display: flex; justify-content: space-between; align-items: center;\r\n margin-bottom: 8px; position: relative; z-index: 2; gap: 4px;\r\n }\r\n .ngxsmk-month-year-selects { display: flex; gap: 4px; }\r\n .ngxsmk-month-year-selects app-custom-select.month-select { --custom-select-width: 100px; }\r\n .ngxsmk-month-year-selects app-custom-select.year-select { --custom-select-width: 75px; }\r\n .ngxsmk-nav-buttons { display: flex; }\r\n .ngxsmk-nav-button {\r\n padding: 6px;\r\n background: none; border: none; cursor: pointer; border-radius: 50%;\r\n display: inline-flex; align-items: center; justify-content: center; color: var(--datepicker-text-color);\r\n }\r\n .ngxsmk-nav-button:hover:not(:disabled) { background-color: var(--datepicker-hover-background); }\r\n .ngxsmk-nav-button:disabled { cursor: not-allowed; opacity: 0.5; }\r\n .ngxsmk-nav-button svg { width: 16px; height: 16px; }\r\n\r\n /* Animation Styles */\r\n .ngxsmk-days-grid-wrapper {\r\n overflow-x: hidden;\r\n }\r\n .ngxsmk-days-grid {\r\n display: grid; grid-template-columns: repeat(7, 1fr); text-align: center; gap: 0;\r\n /* Smooth transition for the slide effect (transform) and fade (opacity) */\r\n transition: transform 0.3s ease-out, opacity 0.15s ease-out 0.15s;\r\n }\r\n\r\n .ngxsmk-days-grid.animate-forward {\r\n transform: translateX(-100%);\r\n opacity: 0;\r\n }\r\n\r\n .ngxsmk-days-grid.animate-backward {\r\n transform: translateX(100%);\r\n opacity: 0;\r\n }\r\n /* End Animation Styles */\r\n\r\n .ngxsmk-day-name {\r\n font-size: 0.75rem;\r\n padding: 6px 0;\r\n color: var(--datepicker-subtle-text-color);\r\n font-weight: 600;\r\n }\r\n .ngxsmk-day-cell {\r\n height: 32px;\r\n position: relative; display: flex; justify-content: center;\r\n align-items: center; cursor: pointer; border-radius: 0;\r\n }\r\n .ngxsmk-day-cell.holiday .ngxsmk-day-number {\r\n /* Example style for a holiday */\r\n color: var(--datepicker-primary-color);\r\n text-decoration: underline dotted;\r\n }\r\n \r\n .ngxsmk-day-number {\r\n width: 30px; height: 30px;\r\n display: flex; justify-content: center;\r\n align-items: center; border-radius: 50%; color: var(--datepicker-text-color);\r\n font-size: 0.9rem;\r\n position: relative; z-index: 1;\r\n }\r\n\r\n .ngxsmk-time-selection {\r\n display: flex;\r\n align-items: center;\r\n gap: 5px;\r\n flex-wrap: wrap;\r\n margin-top: 12px; padding-top: 8px;\r\n border-top: 1px solid var(--datepicker-border-color);\r\n }\r\n .ngxsmk-time-label { font-size: 0.9rem; color: var(--datepicker-subtle-text-color); margin-right: 4px; }\r\n .ngxsmk-time-separator { font-weight: 600; color: var(--datepicker-text-color); }\r\n .ngxsmk-time-selection app-custom-select { --custom-select-width: 55px; height: 28px; }\r\n .ngxsmk-time-selection app-custom-select.ampm-select { --custom-select-width: 65px; }\r\n\r\n .ngxsmk-day-cell:not(.disabled):hover .ngxsmk-day-number {\r\n background-color: var(--datepicker-hover-background); color: var(--datepicker-primary-color);\r\n }\r\n .ngxsmk-day-cell.start-date .ngxsmk-day-number,\r\n .ngxsmk-day-cell.end-date .ngxsmk-day-number,\r\n .ngxsmk-day-cell.selected .ngxsmk-day-number,\r\n .ngxsmk-day-cell.multiple-selected .ngxsmk-day-number {\r\n background-color: var(--datepicker-primary-color); color: var(--datepicker-primary-contrast);\r\n }\r\n .ngxsmk-day-cell.multiple-selected .ngxsmk-day-number {\r\n border: 1px dashed var(--datepicker-primary-contrast);\r\n }\r\n .ngxsmk-day-cell.multiple-selected:hover .ngxsmk-day-number {\r\n background-color: var(--datepicker-primary-color);\r\n color: var(--datepicker-primary-contrast);\r\n }\r\n .ngxsmk-day-cell.in-range, .ngxsmk-day-cell.start-date,\r\n .ngxsmk-day-cell.end-date, .ngxsmk-day-cell.preview-range {\r\n background-color: var(--datepicker-range-background);\r\n }\r\n .ngxsmk-day-cell.start-date { border-top-left-radius: 100%; border-bottom-left-radius: 100%; }\r\n .ngxsmk-day-cell.end-date { border-top-right-radius: 100%; border-bottom-right-radius: 100%; }\r\n .ngxsmk-day-cell.start-date.end-date { border-radius: 50px; }\r\n .ngxsmk-day-cell.disabled {\r\n background-color: transparent !important; color: #4b5563;\r\n cursor: not-allowed; pointer-events: none; opacity: 0.5;\r\n }\r\n .ngxsmk-day-cell.today .ngxsmk-day-number { border: 1px solid var(--datepicker-primary-color); }\r\n\r\n @media (min-width: 600px) {\r\n .ngxsmk-datepicker-container { display: flex; flex-direction: row; }\r\n .ngxsmk-calendar-container {\r\n padding: 16px;\r\n box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);\r\n width: auto;\r\n border-radius: 0 10px 10px 0;\r\n }\r\n .ngxsmk-ranges-container {\r\n width: 180px;\r\n padding: 16px;\r\n border-right: 1px solid var(--datepicker-border-color);\r\n border-bottom: none;\r\n background: var(--datepicker-background);\r\n border-radius: 10px 0 0 10px;\r\n }\r\n .ngxsmk-ranges-container ul {\r\n flex-direction: column;\r\n justify-content: flex-start;\r\n gap: 0;\r\n }\r\n .ngxsmk-ranges-container li {\r\n padding: 10px;\r\n margin-bottom: 8px;\r\n border: none;\r\n font-size: 1rem;\r\n }\r\n\r\n .ngxsmk-header { margin-bottom: 12px; gap: 5px; }\r\n .ngxsmk-month-year-selects app-custom-select.month-select { --custom-select-width: 120px; }\r\n .ngxsmk-month-year-selects app-custom-select.year-select { --custom-select-width: 90px; }\r\n .ngxsmk-nav-button { padding: 8px; }\r\n .ngxsmk-nav-button svg { width: 18px; height: 18px; }\r\n .ngxsmk-day-name { font-size: 0.8rem; padding: 8px 0; }\r\n .ngxsmk-day-cell { height: 38px; }\r\n .ngxsmk-day-number { width: 36px; height: 36px; font-size: 1rem; }\r\n .ngxsmk-time-selection { margin-top: 16px; padding-top: 12px; }\r\n .ngxsmk-time-selection app-custom-select { --custom-select-width: 60px; height: 30px; }\r\n .ngxsmk-time-selection app-custom-select.ampm-select { --custom-select-width: 70px; }\r\n }\r\n `],\r\n})\r\nexport class NgxsmkDatepickerComponent implements OnInit, OnChanges, ControlValueAccessor {\r\n @Input() mode: 'single' | 'range' | 'multiple' = 'single';\r\n @Input() isInvalidDate: (date: Date) => boolean = () => false;\r\n @Input() showRanges: boolean = true;\r\n @Input() showTime: boolean = false;\r\n @Input() minuteInterval: number = 1;\r\n \r\n // NEW: Holiday Provider Inputs\r\n @Input() holidayProvider: HolidayProvider | null = null;\r\n @Input() disableHolidays: boolean = false;\r\n \r\n // Popover/Input Mode\r\n @Input() placeholder: string = 'Select Date';\r\n @Input() inline: boolean | 'always' | 'auto' = false;\r\n public isCalendarOpen: boolean = false;\r\n\r\n public _internalValue: DatepickerValue = null;\r\n\r\n private _startAtDate: Date | null = null;\r\n @Input() set startAt(value: DateInput | null) { this._startAtDate = this._normalizeDate(value); }\r\n\r\n private _locale: string = 'en-US';\r\n @Input() set locale(value: string) { this._locale = value; }\r\n get locale(): string { return this._locale; }\r\n\r\n @Input() theme: 'light' | 'dark' = 'light';\r\n @HostBinding('class.dark-theme') get isDarkMode() { return this.theme === 'dark'; }\r\n\r\n private onChange = (_: any) => {};\r\n private onTouched = () => {};\r\n public disabled = false;\r\n @Input() set disabledState(isDisabled: boolean) { this.disabled = isDisabled; }\r\n\r\n @Output() valueChange = new EventEmitter<DatepickerValue>();\r\n @Output() action = new EventEmitter<{ type: string; payload?: any }>();\r\n\r\n private _minDate: Date | null = null;\r\n @Input() set minDate(value: DateInput | null) { this._minDate = this._normalizeDate(value); }\r\n\r\n private _maxDate: Date | null = null;\r\n @Input() set maxDate(value: DateInput | null) { this._maxDate = this._normalizeDate(value); }\r\n\r\n private _ranges: { [key: string]: [Date, Date] } | null = null;\r\n @Input() set ranges(value: DateRange | null) {\r\n if (!value) {\r\n this._ranges = null;\r\n } else {\r\n this._ranges = Object.entries(value).reduce((acc, [key, dates]) => {\r\n const start = this._normalizeDate(dates[0]);\r\n const end = this._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 this.updateRangesArray();\r\n }\r\n\r\n public currentDate: Date = new Date();\r\n public daysInMonth: (Date | null)[] = [];\r\n public weekDays: string[] = [];\r\n public readonly today: Date = getStartOfDay(new Date());\r\n public selectedDate: Date | null = null;\r\n public selectedDates: Date[] = [];\r\n public startDate: Date | null = null;\r\n public endDate: Date | null = null;\r\n public hoveredDate: Date | null = null;\r\n public rangesArray: { key: string; value: [Date, Date] }[] = [];\r\n\r\n private _currentMonth: number = this.currentDate.getMonth();\r\n private _currentYear: number = this.currentDate.getFullYear();\r\n\r\n public monthOptions: { label: string; value: number }[] = [];\r\n public yearOptions: { label: string; value: number }[] = [];\r\n private firstDayOfWeek: number = 0;\r\n\r\n public currentHour: number = 0;\r\n public currentMinute: number = 0;\r\n public currentDisplayHour: number = 12;\r\n public isPm: boolean = false;\r\n\r\n public hourOptions: { label: string; value: number }[] = [];\r\n public minuteOptions: { label: string; value: number }[] = [];\r\n public ampmOptions: { label: string; value: boolean }[] = [\r\n {label: 'AM', value: false},\r\n {label: 'PM', value: true}\r\n ];\r\n\r\n // Animation state properties\r\n public animateForward: boolean = false;\r\n public animateBackward: boolean = false;\r\n \r\n private readonly elementRef: ElementRef = inject(ElementRef);\r\n \r\n get isInlineMode(): boolean {\r\n return this.inline === true || this.inline === 'always' || \r\n (this.inline === 'auto' && typeof window !== 'undefined' && window.matchMedia('(min-width: 768px)').matches);\r\n }\r\n\r\n get isCalendarVisible(): boolean {\r\n return this.isInlineMode || this.isCalendarOpen;\r\n }\r\n \r\n get displayValue(): string {\r\n if (this.mode === 'single' && this.selectedDate) {\r\n return this.selectedDate.toLocaleString(this.locale, { \r\n year: 'numeric', month: 'short', day: '2-digit', \r\n hour: this.showTime ? '2-digit' : undefined, \r\n minute: this.showTime ? '2-digit' : undefined \r\n });\r\n } else if (this.mode === 'range' && this.startDate && this.endDate) {\r\n const start = this.startDate.toLocaleString(this.locale, { year: 'numeric', month: 'short', day: '2-digit' });\r\n const end = this.endDate.toLocaleString(this.locale, { year: 'numeric', month: 'short', day: '2-digit' });\r\n return `${start} - ${end}`;\r\n } else if (this.mode === 'multiple' && this.selectedDates.length > 0) {\r\n return `${this.selectedDates.length} dates selected`;\r\n }\r\n return '';\r\n }\r\n \r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (!this.isInlineMode && this.isCalendarOpen && !this.elementRef.nativeElement.contains(event.target)) {\r\n this.isCalendarOpen = false;\r\n }\r\n }\r\n\r\n\r\n writeValue(val: DatepickerValue): void {\r\n this._internalValue = val;\r\n this.initializeValue(val);\r\n this.generateCalendar();\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n private emitValue(val: DatepickerValue) {\r\n this._internalValue = val;\r\n this.valueChange.emit(val);\r\n this.onChange(val);\r\n this.onTouched();\r\n \r\n // Auto-close popover when a selection is complete\r\n if (!this.isInlineMode && val !== null) {\r\n if (this.mode === 'single' || (this.mode === 'range' && this.startDate && this.endDate)) {\r\n this.isCalendarOpen = false;\r\n }\r\n }\r\n }\r\n \r\n public toggleCalendar(): void {\r\n if (this.disabled || this.isInlineMode) return;\r\n this.isCalendarOpen = !this.isCalendarOpen;\r\n }\r\n \r\n public clearValue(event?: MouseEvent): void {\r\n if (event) event.stopPropagation();\r\n if (this.disabled) return;\r\n \r\n this.selectedDate = null;\r\n this.selectedDates = [];\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.hoveredDate = null;\r\n this.isCalendarOpen = false;\r\n \r\n this.emitValue(null);\r\n this.action.emit({type: 'clear', payload: null});\r\n \r\n // Reset view to today after clearing\r\n this.currentDate = new Date();\r\n this._currentMonth = this.currentDate.getMonth();\r\n this._currentYear = this.currentDate.getFullYear();\r\n this.generateCalendar();\r\n }\r\n\r\n get currentMonth(): number { return this._currentMonth; }\r\n\r\n set currentMonth(month: number) {\r\n if (this.disabled) return;\r\n if (this._currentMonth !== month) {\r\n this._currentMonth = month;\r\n this.currentDate.setMonth(month);\r\n this.generateCalendar(true);\r\n }\r\n }\r\n\r\n get currentYear(): number { return this._currentYear; }\r\n\r\n set currentYear(year: number) {\r\n if (this.disabled) return;\r\n if (this._currentYear !== year) {\r\n this._currentYear = year;\r\n this.currentDate.setFullYear(year);\r\n this.generateCalendar(true);\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this._locale === 'en-US' && typeof navigator !== 'undefined') {\r\n this._locale = navigator.language;\r\n }\r\n\r\n this.today.setHours(0, 0, 0, 0);\r\n this.generateLocaleData();\r\n this.generateTimeOptions();\r\n\r\n if (this.showTime && !this._internalValue) {\r\n const now = new Date();\r\n this.currentHour = now.getHours();\r\n this.currentMinute = Math.floor(now.getMinutes() / this.minuteInterval) * this.minuteInterval;\r\n\r\n if (this.currentMinute === 60) {\r\n this.currentMinute = 0;\r\n this.currentHour = (this.currentHour + 1) % 24;\r\n }\r\n this.update12HourState(this.currentHour);\r\n }\r\n\r\n if (this._internalValue) {\r\n this.initializeValue(this._internalValue);\r\n } else if (this._startAtDate) {\r\n this.initializeValue(null);\r\n }\r\n this.generateCalendar();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['locale']) {\r\n this.generateLocaleData();\r\n this.generateCalendar();\r\n }\r\n\r\n if (changes['minuteInterval']) {\r\n this.generateTimeOptions();\r\n this.currentMinute = Math.floor(this.currentMinute / this.minuteInterval) * this.minuteInterval;\r\n this.onTimeChange();\r\n }\r\n\r\n if (changes['value'] && changes['value'].currentValue !== changes['value'].previousValue) {\r\n this.writeValue(changes['value'].currentValue);\r\n }\r\n \r\n // Rerun calendar generation if provider changes to refresh disabled states\r\n if (changes['holidayProvider'] || changes['disableHolidays']) {\r\n this.generateCalendar();\r\n }\r\n\r\n if (changes['startAt']) {\r\n if (!this._internalValue && this._startAtDate) {\r\n this.currentDate = new Date(this._startAtDate);\r\n this._currentMonth = this.currentDate.getMonth();\r\n this._currentYear = this.currentDate.getFullYear();\r\n this.generateCalendar();\r\n }\r\n }\r\n }\r\n\r\n private 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 private update12HourState(fullHour: number): void {\r\n this.isPm = fullHour >= 12;\r\n this.currentDisplayHour = fullHour % 12 || 12;\r\n }\r\n\r\n private applyCurrentTime(date: Date): Date {\r\n this.currentHour = this.get24Hour(this.currentDisplayHour, this.isPm);\r\n date.setHours(this.currentHour, this.currentMinute, 0, 0);\r\n return date;\r\n }\r\n\r\n private initializeValue(value: DatepickerValue): void {\r\n let initialDate: Date | null = null;\r\n\r\n this.selectedDate = null;\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.selectedDates = [];\r\n\r\n if (value) {\r\n if (this.mode === 'single' && value instanceof Date) {\r\n this.selectedDate = this._normalizeDate(value);\r\n initialDate = this.selectedDate;\r\n } else if (this.mode === 'range' && typeof value === 'object' && 'start' in value && 'end' in value) {\r\n this.startDate = this._normalizeDate((value as {start: Date, end: Date}).start);\r\n this.endDate = this._normalizeDate((value as {start: Date, end: Date}).end);\r\n initialDate = this.startDate;\r\n } else if (this.mode === 'multiple' && Array.isArray(value)) {\r\n this.selectedDates = (value as Date[]).map(d => this._normalizeDate(d)).filter((d): d is Date => d !== null);\r\n initialDate = this.selectedDates.length > 0 ? this.selectedDates[this.selectedDates.length - 1] : null;\r\n }\r\n }\r\n\r\n const viewCenterDate = initialDate || this._startAtDate || new Date();\r\n\r\n if (viewCenterDate) {\r\n this.currentDate = new Date(viewCenterDate);\r\n this._currentMonth = viewCenterDate.getMonth();\r\n this._currentYear = viewCenterDate.getFullYear();\r\n this.currentHour = viewCenterDate.getHours();\r\n this.currentMinute = viewCenterDate.getMinutes();\r\n this.update12HourState(this.currentHour);\r\n this.currentMinute = Math.floor(this.currentMinute / this.minuteInterval) * this.minuteInterval;\r\n }\r\n }\r\n\r\n private _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\n private generateTimeOptions(): void {\r\n this.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 this.minuteOptions = [];\r\n for (let i = 0; i < 60; i += this.minuteInterval) {\r\n this.minuteOptions.push({\r\n label: i.toString().padStart(2, '0'),\r\n value: i,\r\n });\r\n }\r\n }\r\n\r\n private generateLocaleData(): void {\r\n const year = new Date().getFullYear();\r\n this.monthOptions = Array.from({length: 12}).map((_, i) => ({\r\n label: new Date(year, i, 1).toLocaleDateString(this.locale, {month: 'long'}),\r\n value: i,\r\n }));\r\n\r\n try {\r\n this.firstDayOfWeek = ((new Intl.Locale(this.locale) as any).weekInfo?.firstDay || 0) % 7;\r\n } catch (e) {\r\n this.firstDayOfWeek = 0;\r\n }\r\n\r\n const day = new Date(year, 0, 7 + this.firstDayOfWeek);\r\n this.weekDays = Array.from({length: 7}).map(() => {\r\n const weekDay = new Date(day).toLocaleDateString(this.locale, {weekday: 'short'});\r\n day.setDate(day.getDate() + 1);\r\n return weekDay;\r\n });\r\n }\r\n\r\n private updateRangesArray(): void {\r\n this.rangesArray = this._ranges ? Object.entries(this._ranges).map(([key, value]) => ({key, value})) : [];\r\n }\r\n\r\n public selectRange(range: [Date, Date]): void {\r\n if (this.disabled) return;\r\n this.startDate = this.applyCurrentTime(range[0]);\r\n this.endDate = this.applyCurrentTime(range[1]);\r\n\r\n if (this.startDate && this.endDate) {\r\n this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\r\n }\r\n\r\n this.currentDate = new Date(this.startDate);\r\n this.initializeValue({start: this.startDate, end: this.endDate});\r\n this.generateCalendar();\r\n this.action.emit({type: 'rangeSelected', payload: {start: this.startDate, end: this.endDate, key: this.rangesArray.find(r => r.value === range)?.key}});\r\n }\r\n \r\n // NEW: Check if a date is a holiday\r\n public isHoliday(date: Date | null): boolean {\r\n if (!date || !this.holidayProvider) return false;\r\n const dateOnly = getStartOfDay(date);\r\n return this.holidayProvider.isHoliday(dateOnly);\r\n }\r\n \r\n // NEW: Get holiday label\r\n public getHolidayLabel(date: Date | null): string | null {\r\n if (!date || !this.holidayProvider || !this.isHoliday(date)) return null;\r\n return this.holidayProvider.getHolidayLabel ? this.holidayProvider.getHolidayLabel(getStartOfDay(date)) : 'Holiday';\r\n }\r\n\r\n public isDateDisabled(date: Date | null): boolean {\r\n if (!date) return false;\r\n\r\n const dateOnly = getStartOfDay(date);\r\n\r\n // 1. Check holiday provider for disabling\r\n if (this.holidayProvider && this.disableHolidays && this.holidayProvider.isHoliday(dateOnly)) {\r\n return true;\r\n }\r\n\r\n // 2. Check min/max date\r\n if (this._minDate) {\r\n const minDateOnly = getStartOfDay(this._minDate);\r\n if (dateOnly.getTime() < minDateOnly.getTime()) return true;\r\n }\r\n if (this._maxDate) {\r\n const maxDateOnly = getStartOfDay(this._maxDate);\r\n if (dateOnly.getTime() > maxDateOnly.getTime()) return true;\r\n }\r\n \r\n // 3. Check custom invalid date function\r\n return this.isInvalidDate(date);\r\n }\r\n\r\n public isMultipleSelected(d: Date | null): boolean {\r\n if (!d || this.mode !== 'multiple') return false;\r\n const dTime = getStartOfDay(d).getTime();\r\n return this.selectedDates.some(selected => getStartOfDay(selected).getTime() === dTime);\r\n }\r\n\r\n public onTimeChange(): void {\r\n if (this.disabled) return;\r\n if (this.mode === 'single' && this.selectedDate) {\r\n this.selectedDate = this.applyCurrentTime(this.selectedDate);\r\n this.emitValue(this.selectedDate);\r\n } else if (this.mode === 'range' && this.startDate && this.endDate) {\r\n this.startDate = this.applyCurrentTime(this.startDate);\r\n this.endDate = this.applyCurrentTime(this.endDate);\r\n this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\r\n } else if (this.mode === 'range' && this.startDate && !this.endDate) {\r\n this.startDate = this.applyCurrentTime(this.startDate);\r\n } else if (this.mode === 'multiple') {\r\n this.selectedDates = this.selectedDates.map(date => {\r\n const newDate = getStartOfDay(date);\r\n return this.applyCurrentTime(newDate);\r\n });\r\n this.emitValue([...this.selectedDates]);\r\n }\r\n\r\n this.action.emit({type: 'timeChanged', payload: {hour: this.currentHour, minute: this.currentMinute}});\r\n }\r\n\r\n public onDateClick(day: Date | null): void {\r\n if (!day || this.isDateDisabled(day) || this.disabled) return;\r\n\r\n const dateToToggle = getStartOfDay(day);\r\n\r\n if (this.mode === 'single') {\r\n this.selectedDate = this.applyCurrentTime(day);\r\n this.emitValue(this.selectedDate);\r\n } else if (this.mode === 'range') {\r\n if (!this.startDate || (this.startDate && this.endDate)) {\r\n this.startDate = this.applyCurrentTime(day);\r\n this.endDate = null;\r\n } else if (day >= this.startDate) {\r\n this.endDate = this.applyCurrentTime(day);\r\n this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\r\n } else {\r\n this.startDate = this.applyCurrentTime(day);\r\n this.endDate = null;\r\n }\r\n this.hoveredDate = null;\r\n } else if (this.mode === 'multiple') {\r\n const existingIndex = this.selectedDates.findIndex(d => this.isSameDay(d, dateToToggle));\r\n\r\n if (existingIndex > -1) {\r\n this.selectedDates.splice(existingIndex, 1);\r\n } else {\r\n const dateWithTime = this.applyCurrentTime(dateToToggle);\r\n this.selectedDates.push(dateWithTime);\r\n this.selectedDates.sort((a, b) => a.getTime() - b.getTime());\r\n }\r\n this.emitValue([...this.selectedDates]);\r\n }\r\n\r\n const dateToSync = this.mode === 'single' ? this.selectedDate :\r\n this.mode === 'range' ? this.startDate :\r\n this.mode === 'multiple' && this.selectedDates.length > 0 ? this.selectedDates[this.selectedDates.length - 1] : null;\r\n\r\n if (dateToSync) {\r\n this.update12HourState(dateToSync.getHours());\r\n this.currentMinute = dateToSync.getMinutes();\r\n }\r\n\r\n this.action.emit({\r\n type: 'dateSelected',\r\n payload: {\r\n mode: this.mode,\r\n value: this._internalValue,\r\n date: day\r\n }\r\n });\r\n }\r\n\r\n public onDateHover(day: Date | null): void {\r\n if (this.mode === 'range' && this.startDate && !this.endDate && day) {\r\n this.hoveredDate = day;\r\n }\r\n }\r\n\r\n public isPreviewInRange(day: Date | null): boolean {\r\n if (this.mode !== 'range' || !this.startDate || this.endDate || !this.hoveredDate || !day) return false;\r\n const start = getStartOfDay(this.startDate).getTime();\r\n const end = getStartOfDay(this.hoveredDate).getTime();\r\n const time = getStartOfDay(day).getTime();\r\n return time > Math.min(start, end) && time < Math.max(start, end);\r\n }\r\n\r\n public generateCalendar(resetAnimation: boolean = true): void {\r\n this.daysInMonth = [];\r\n const year = this.currentDate.getFullYear();\r\n const month = this.currentDate.getMonth();\r\n this._currentMonth = month;\r\n this._currentYear = year;\r\n this.generateDropdownOptions();\r\n const firstDayOfMonth = new Date(year, month, 1);\r\n const lastDayOfMonth = new Date(year, month + 1, 0);\r\n const startDayOfWeek = firstDayOfMonth.getDay();\r\n const emptyCellCount = (startDayOfWeek - this.firstDayOfWeek + 7) % 7;\r\n\r\n for (let i = 0; i < emptyCellCount; i++) {\r\n this.daysInMonth.push(null);\r\n }\r\n for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {\r\n this.daysInMonth.push(this._normalizeDate(new Date(year, month, i)));\r\n }\r\n\r\n if (resetAnimation) {\r\n this.animateForward = false;\r\n this.animateBackward = false;\r\n }\r\n\r\n this.action.emit({\r\n type: 'calendarGenerated',\r\n payload: {\r\n month: month,\r\n year: year,\r\n days: this.daysInMonth.filter(d => d !== null)\r\n }\r\n });\r\n }\r\n\r\n private generateDropdownOptions(): void {\r\n const startYear = this._currentYear - 10;\r\n const endYear = this._currentYear + 10;\r\n this.yearOptions = [];\r\n for (let i = startYear; i <= endYear; i++) {\r\n this.yearOptions.push({label: `${i}`, value: i});\r\n }\r\n }\r\n\r\n public changeMonth(delta: number): void {\r\n if (this.disabled) return;\r\n\r\n // 1. Set the animation class (triggers slide-out)\r\n if (delta > 0) {\r\n this.animateForward = true;\r\n this.animateBackward = false;\r\n } else {\r\n this.animateBackward = true;\r\n this.animateForward = false;\r\n }\r\n\r\n const newDate = addMonths(this.currentDate, delta);\r\n\r\n // 2. Wait for the slide-out transition to complete (300ms)\r\n setTimeout(() => {\r\n // 3. Update the data\r\n this.currentDate = newDate;\r\n this._currentMonth = newDate.getMonth();\r\n this._currentYear = newDate.getFullYear();\r\n\r\n // Generate new calendar view but tell it *not* to reset animation flags yet.\r\n this.generateCalendar(false);\r\n\r\n // 4. Reset the animation flags to false (triggers slide-in of the new content)\r\n this.animateForward = false;\r\n this.animateBackward = false;\r\n\r\n }, 300); // Wait time should match the CSS transition duration (0.3s)\r\n\r\n this.action.emit({type: 'monthChanged', payload: { delta: delta }});\r\n }\r\n\r\n public 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\n public isInRange(d: Date | null): boolean {\r\n if (!d || !this.startDate || !this.endDate) return false;\r\n\r\n const dTime = getStartOfDay(d).getTime();\r\n const startDayTime = getStartOfDay(this.startDate).getTime();\r\n const endDayTime = getStartOfDay(this.endDate).getTime();\r\n\r\n const startTime = Math.min(startDayTime, endDayTime);\r\n const endTime = Math.max(startDayTime, endDayTime);\r\n\r\n return dTime > startTime && dTime < endTime;\r\n }\r\n}","/*\r\n * Public API Surface of ngxsmk-datepicker\r\n */\r\n\r\nexport * from './lib/ngxsmk-datepicker';\r\nexport {DatepickerValue, DateRange} from './lib/ngxsmk-datepicker';","/**\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 {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n forwardRef,\r\n HostBinding,\r\n HostListener,\r\n inject,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n ChangeDetectionStrategy,\r\n OnDestroy,\r\n} from '@angular/core';\r\nimport {CommonModule, DatePipe} from '@angular/common';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NG_VALUE_ACCESSOR,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport {\r\n getStartOfDay,\r\n addMonths,\r\n normalizeDate,\r\n DateInput,\r\n} from './utils/date.utils';\r\nimport {\r\n HolidayProvider,\r\n DateRange,\r\n DatepickerValue,\r\n generateMonthOptions,\r\n generateYearOptions,\r\n generateTimeOptions,\r\n generateWeekDays,\r\n getFirstDayOfWeek,\r\n get24Hour,\r\n update12HourState,\r\n processDateRanges,\r\n} from './utils/calendar.utils';\r\nimport { CustomSelectComponent } from './components/custom-select.component';\r\nimport { createDateComparator } from './utils/performance.utils';\r\n\r\n\r\n@Component({\r\n selector: 'ngxsmk-datepicker',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, CustomSelectComponent, DatePipe, ReactiveFormsModule],\r\n providers: [{\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NgxsmkDatepickerComponent),\r\n multi: true\r\n }],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./styles/datepicker.css'],\r\n template: `\r\n <div class=\"ngxsmk-datepicker-wrapper\" [class.ngxsmk-inline-mode]=\"isInlineMode\">\r\n @if (!isInlineMode) {\r\n <div class=\"ngxsmk-input-group\" (click)=\"toggleCalendar()\" [class.disabled]=\"disabled\">\r\n <input type=\"text\" \r\n [value]=\"displayValue\" \r\n [placeholder]=\"placeholder\" \r\n readonly \r\n [disabled]=\"disabled\"\r\n class=\"ngxsmk-display-input\">\r\n <button type=\"button\" class=\"ngxsmk-clear-button\" (click)=\"clearValue($event)\" [disabled]=\"disabled\" *ngIf=\"displayValue\">\r\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>\r\n </button>\r\n </div>\r\n }\r\n\r\n @if (isCalendarVisible) {\r\n <div class=\"ngxsmk-popover-container\" [class.ngxsmk-inline-container]=\"isInlineMode\">\r\n <div class=\"ngxsmk-datepicker-container\">\r\n @if (showRanges && rangesArray.length > 0 && mode === 'range') {\r\n <div class=\"ngxsmk-ranges-container\">\r\n <ul>\r\n @for (range of rangesArray; track range.key) {\r\n <li (click)=\"selectRange(range.value)\" [class.disabled]=\"disabled\">{{ range.key }}</li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n <div class=\"ngxsmk-calendar-container\">\r\n <div class=\"ngxsmk-header\">\r\n <div class=\"ngxsmk-month-year-selects\">\r\n <ngxsmk-custom-select class=\"month-select\" [options]=\"monthOptions\"\r\n [(value)]=\"currentMonth\" [disabled]=\"disabled\"></ngxsmk-custom-select>\r\n <ngxsmk-custom-select class=\"year-select\" [options]=\"yearOptions\" [(value)]=\"currentYear\" [disabled]=\"disabled\"></ngxsmk-custom-select>\r\n </div>\r\n <div class=\"ngxsmk-nav-buttons\">\r\n <button type=\"button\" class=\"ngxsmk-nav-button\" (click)=\"changeMonth(-1)\" [disabled]=\"disabled\">\r\n <svg 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=\"M328 112L184 256l144 144\"/>\r\n </svg>\r\n </button>\r\n <button type=\"button\" class=\"ngxsmk-nav-button\" (click)=\"changeMonth(1)\" [disabled]=\"disabled\">\r\n <svg 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=\"M184 112l144 144-144 144\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"ngxsmk-days-grid-wrapper\">\r\n <div class=\"ngxsmk-days-grid\"\r\n [class.animate-forward]=\"animateForward\" \r\n [class.animate-backward]=\"animateBackward\">\r\n @for (day of weekDays; track day) {\r\n <div class=\"ngxsmk-day-name\">{{ day }}</div>\r\n }\r\n @for (day of daysInMonth; track $index) {\r\n <div class=\"ngxsmk-day-cell\"\r\n [class.empty]=\"!day\" [class.disabled]=\"isDateDisabled(day)\" \r\n [class.today]=\"isSameDay(day, today)\"\r\n [class.holiday]=\"isHoliday(day)\"\r\n [class.selected]=\"mode === 'single' && isSameDay(day, selectedDate)\"\r\n [class.multiple-selected]=\"mode === 'multiple' && isMultipleSelected(day)\"\r\n [class.start-date]=\"mode === 'range' && isSameDay(day, startDate)\"\r\n [class.end-date]=\"mode === 'range' && isSameDay(day, endDate)\"\r\n [class.in-range]=\"mode === 'range' && isInRange(day)\"\r\n [class.preview-range]=\"isPreviewInRange(day)\"\r\n (click)=\"onDateClick(day)\" (mouseenter)=\"onDateHover(day)\">\r\n @if (day) {\r\n <div class=\"ngxsmk-day-number\" [attr.title]=\"getHolidayLabel(day)\">{{ day | date : 'd' }}</div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (showTime) {\r\n <div class=\"ngxsmk-time-selection\">\r\n <span class=\"ngxsmk-time-label\">Time:</span>\r\n <ngxsmk-custom-select\r\n class=\"hour-select\"\r\n [options]=\"hourOptions\"\r\n [(value)]=\"currentDisplayHour\"\r\n (valueChange)=\"onTimeChange()\"\r\n [disabled]=\"disabled\"\r\n ></ngxsmk-custom-select>\r\n <span class=\"ngxsmk-time-separator\">:</span>\r\n <ngxsmk-custom-select\r\n class=\"minute-select\"\r\n [options]=\"minuteOptions\"\r\n [(value)]=\"currentMinute\"\r\n (valueChange)=\"onTimeChange()\"\r\n [disabled]=\"disabled\"\r\n ></ngxsmk-custom-select>\r\n <ngxsmk-custom-select\r\n class=\"ampm-select\"\r\n [options]=\"ampmOptions\"\r\n [(value)]=\"isPm\"\r\n (valueChange)=\"onTimeChange()\"\r\n [disabled]=\"disabled\"\r\n ></ngxsmk-custom-select>\r\n </div>\r\n }\r\n \r\n <div class=\"ngxsmk-footer\" *ngIf=\"!isInlineMode\">\r\n <button type=\"button\" class=\"ngxsmk-clear-button-footer\" (click)=\"clearValue($event)\" [disabled]=\"disabled\">\r\n Clear\r\n </button>\r\n <button type=\"button\" class=\"ngxsmk-close-button\" (click)=\"isCalendarOpen = false\" [disabled]=\"disabled\">\r\n Close\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class NgxsmkDatepickerComponent implements OnInit, OnChanges, OnDestroy, ControlValueAccessor {\r\n @Input() mode: 'single' | 'range' | 'multiple' = 'single';\r\n @Input() isInvalidDate: (date: Date) => boolean = () => false;\r\n @Input() showRanges: boolean = true;\r\n @Input() showTime: boolean = false;\r\n @Input() minuteInterval: number = 1;\r\n \r\n // NEW: Holiday Provider Inputs\r\n @Input() holidayProvider: HolidayProvider | null = null;\r\n @Input() disableHolidays: boolean = false;\r\n \r\n // Popover/Input Mode\r\n @Input() placeholder: string = 'Select Date';\r\n @Input() inline: boolean | 'always' | 'auto' = false;\r\n public isCalendarOpen: boolean = false;\r\n\r\n public _internalValue: DatepickerValue = null;\r\n\r\n private _startAtDate: Date | null = null;\r\n @Input() set startAt(value: DateInput | null) { this._startAtDate = this._normalizeDate(value); }\r\n\r\n private _locale: string = 'en-US';\r\n @Input() set locale(value: string) { this._locale = value; }\r\n get locale(): string { return this._locale; }\r\n\r\n @Input() theme: 'light' | 'dark' = 'light';\r\n @HostBinding('class.dark-theme') get isDarkMode() { return this.theme === 'dark'; }\r\n\r\n private onChange = (_: any) => {};\r\n private onTouched = () => {};\r\n public disabled = false;\r\n @Input() set disabledState(isDisabled: boolean) { this.disabled = isDisabled; }\r\n\r\n @Output() valueChange = new EventEmitter<DatepickerValue>();\r\n @Output() action = new EventEmitter<{ type: string; payload?: any }>();\r\n\r\n private _minDate: Date | null = null;\r\n @Input() set minDate(value: DateInput | null) { this._minDate = this._normalizeDate(value); }\r\n\r\n private _maxDate: Date | null = null;\r\n @Input() set maxDate(value: DateInput | null) { this._maxDate = this._normalizeDate(value); }\r\n\r\n private _ranges: { [key: string]: [Date, Date] } | null = null;\r\n @Input() set ranges(value: DateRange | null) {\r\n this._ranges = processDateRanges(value);\r\n this.updateRangesArray();\r\n }\r\n\r\n public currentDate: Date = new Date();\r\n public daysInMonth: (Date | null)[] = [];\r\n public weekDays: string[] = [];\r\n public readonly today: Date = getStartOfDay(new Date());\r\n public selectedDate: Date | null = null;\r\n public selectedDates: Date[] = [];\r\n public startDate: Date | null = null;\r\n public endDate: Date | null = null;\r\n public hoveredDate: Date | null = null;\r\n public rangesArray: { key: string; value: [Date, Date] }[] = [];\r\n\r\n private _currentMonth: number = this.currentDate.getMonth();\r\n private _currentYear: number = this.currentDate.getFullYear();\r\n\r\n public monthOptions: { label: string; value: number }[] = [];\r\n public yearOptions: { label: string; value: number }[] = [];\r\n private firstDayOfWeek: number = 0;\r\n\r\n public currentHour: number = 0;\r\n public currentMinute: number = 0;\r\n public currentDisplayHour: number = 12;\r\n public isPm: boolean = false;\r\n\r\n public hourOptions: { label: string; value: number }[] = [];\r\n public minuteOptions: { label: string; value: number }[] = [];\r\n public ampmOptions: { label: string; value: boolean }[] = [\r\n {label: 'AM', value: false},\r\n {label: 'PM', value: true}\r\n ];\r\n\r\n // Animation state properties\r\n public animateForward: boolean = false;\r\n public animateBackward: boolean = false;\r\n \r\n private readonly elementRef: ElementRef = inject(ElementRef);\r\n private readonly dateComparator = createDateComparator();\r\n \r\n get isInlineMode(): boolean {\r\n return this.inline === true || this.inline === 'always' || \r\n (this.inline === 'auto' && typeof window !== 'undefined' && window.matchMedia('(min-width: 768px)').matches);\r\n }\r\n\r\n get isCalendarVisible(): boolean {\r\n return this.isInlineMode || this.isCalendarOpen;\r\n }\r\n \r\n get displayValue(): string {\r\n if (this.mode === 'single' && this.selectedDate) {\r\n return this.selectedDate.toLocaleString(this.locale, { \r\n year: 'numeric', month: 'short', day: '2-digit', \r\n hour: this.showTime ? '2-digit' : undefined, \r\n minute: this.showTime ? '2-digit' : undefined \r\n });\r\n } else if (this.mode === 'range' && this.startDate && this.endDate) {\r\n const start = this.startDate.toLocaleString(this.locale, { year: 'numeric', month: 'short', day: '2-digit' });\r\n const end = this.endDate.toLocaleString(this.locale, { year: 'numeric', month: 'short', day: '2-digit' });\r\n return `${start} - ${end}`;\r\n } else if (this.mode === 'multiple' && this.selectedDates.length > 0) {\r\n return `${this.selectedDates.length} dates selected`;\r\n }\r\n return '';\r\n }\r\n \r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (!this.isInlineMode && this.isCalendarOpen && !this.elementRef.nativeElement.contains(event.target)) {\r\n this.isCalendarOpen = false;\r\n }\r\n }\r\n\r\n\r\n writeValue(val: DatepickerValue): void {\r\n this._internalValue = val;\r\n this.initializeValue(val);\r\n this.generateCalendar();\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n private emitValue(val: DatepickerValue) {\r\n this._internalValue = val;\r\n this.valueChange.emit(val);\r\n this.onChange(val);\r\n this.onTouched();\r\n \r\n // Auto-close popover when a selection is complete\r\n if (!this.isInlineMode && val !== null) {\r\n if (this.mode === 'single' || (this.mode === 'range' && this.startDate && this.endDate)) {\r\n this.isCalendarOpen = false;\r\n }\r\n }\r\n }\r\n \r\n public toggleCalendar(): void {\r\n if (this.disabled || this.isInlineMode) return;\r\n this.isCalendarOpen = !this.isCalendarOpen;\r\n }\r\n \r\n public clearValue(event?: MouseEvent): void {\r\n if (event) event.stopPropagation();\r\n if (this.disabled) return;\r\n \r\n this.selectedDate = null;\r\n this.selectedDates = [];\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.hoveredDate = null;\r\n this.isCalendarOpen = false;\r\n \r\n this.emitValue(null);\r\n this.action.emit({type: 'clear', payload: null});\r\n \r\n // Reset view to today after clearing\r\n this.currentDate = new Date();\r\n this._currentMonth = this.currentDate.getMonth();\r\n this._currentYear = this.currentDate.getFullYear();\r\n this.generateCalendar();\r\n }\r\n\r\n get currentMonth(): number { return this._currentMonth; }\r\n\r\n set currentMonth(month: number) {\r\n if (this.disabled) return;\r\n if (this._currentMonth !== month) {\r\n this._currentMonth = month;\r\n this.currentDate.setMonth(month);\r\n this.generateCalendar(true);\r\n }\r\n }\r\n\r\n get currentYear(): number { return this._currentYear; }\r\n\r\n set currentYear(year: number) {\r\n if (this.disabled) return;\r\n if (this._currentYear !== year) {\r\n this._currentYear = year;\r\n this.currentDate.setFullYear(year);\r\n this.generateCalendar(true);\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this._locale === 'en-US' && typeof navigator !== 'undefined') {\r\n this._locale = navigator.language;\r\n }\r\n\r\n this.today.setHours(0, 0, 0, 0);\r\n this.generateLocaleData();\r\n this.generateTimeOptions();\r\n\r\n if (this.showTime && !this._internalValue) {\r\n const now = new Date();\r\n this.currentHour = now.getHours();\r\n this.currentMinute = Math.floor(now.getMinutes() / this.minuteInterval) * this.minuteInterval;\r\n\r\n if (this.currentMinute === 60) {\r\n this.currentMinute = 0;\r\n this.currentHour = (this.currentHour + 1) % 24;\r\n }\r\n this.update12HourState(this.currentHour);\r\n }\r\n\r\n if (this._internalValue) {\r\n this.initializeValue(this._internalValue);\r\n } else if (this._startAtDate) {\r\n this.initializeValue(null);\r\n }\r\n this.generateCalendar();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['locale']) {\r\n this.generateLocaleData();\r\n this.generateCalendar();\r\n }\r\n\r\n if (changes['minuteInterval']) {\r\n this.generateTimeOptions();\r\n this.currentMinute = Math.floor(this.currentMinute / this.minuteInterval) * this.minuteInterval;\r\n this.onTimeChange();\r\n }\r\n\r\n if (changes['value'] && changes['value'].currentValue !== changes['value'].previousValue) {\r\n this.writeValue(changes['value'].currentValue);\r\n }\r\n \r\n // Rerun calendar generation if provider changes to refresh disabled states\r\n if (changes['holidayProvider'] || changes['disableHolidays']) {\r\n this.generateCalendar();\r\n }\r\n\r\n if (changes['startAt']) {\r\n if (!this._internalValue && this._startAtDate) {\r\n this.currentDate = new Date(this._startAtDate);\r\n this._currentMonth = this.currentDate.getMonth();\r\n this._currentYear = this.currentDate.getFullYear();\r\n this.generateCalendar();\r\n }\r\n }\r\n }\r\n\r\n private get24Hour(displayHour: number, isPm: boolean): number {\r\n return get24Hour(displayHour, isPm);\r\n }\r\n\r\n private update12HourState(fullHour: number): void {\r\n const state = update12HourState(fullHour);\r\n this.isPm = state.isPm;\r\n this.currentDisplayHour = state.displayHour;\r\n }\r\n\r\n private applyCurrentTime(date: Date): Date {\r\n this.currentHour = this.get24Hour(this.currentDisplayHour, this.isPm);\r\n date.setHours(this.currentHour, this.currentMinute, 0, 0);\r\n return date;\r\n }\r\n\r\n private initializeValue(value: DatepickerValue): void {\r\n let initialDate: Date | null = null;\r\n\r\n this.selectedDate = null;\r\n this.startDate = null;\r\n this.endDate = null;\r\n this.selectedDates = [];\r\n\r\n if (value) {\r\n if (this.mode === 'single' && value instanceof Date) {\r\n this.selectedDate = this._normalizeDate(value);\r\n initialDate = this.selectedDate;\r\n } else if (this.mode === 'range' && typeof value === 'object' && 'start' in value && 'end' in value) {\r\n this.startDate = this._normalizeDate((value as {start: Date, end: Date}).start);\r\n this.endDate = this._normalizeDate((value as {start: Date, end: Date}).end);\r\n initialDate = this.startDate;\r\n } else if (this.mode === 'multiple' && Array.isArray(value)) {\r\n this.selectedDates = (value as Date[]).map(d => this._normalizeDate(d)).filter((d): d is Date => d !== null);\r\n initialDate = this.selectedDates.length > 0 ? this.selectedDates[this.selectedDates.length - 1]! : null;\r\n }\r\n }\r\n\r\n const viewCenterDate = initialDate || this._startAtDate || new Date();\r\n\r\n if (viewCenterDate) {\r\n this.currentDate = new Date(viewCenterDate);\r\n this._currentMonth = viewCenterDate.getMonth();\r\n this._currentYear = viewCenterDate.getFullYear();\r\n this.currentHour = viewCenterDate.getHours();\r\n this.currentMinute = viewCenterDate.getMinutes();\r\n this.update12HourState(this.currentHour);\r\n this.currentMinute = Math.floor(this.currentMinute / this.minuteInterval) * this.minuteInterval;\r\n }\r\n }\r\n\r\n private _normalizeDate(date: DateInput | null): Date | null {\r\n return normalizeDate(date);\r\n }\r\n\r\n private generateTimeOptions(): void {\r\n const { hourOptions, minuteOptions } = generateTimeOptions(this.minuteInterval);\r\n this.hourOptions = hourOptions;\r\n this.minuteOptions = minuteOptions;\r\n }\r\n\r\n private generateLocaleData(): void {\r\n const year = new Date().getFullYear();\r\n this.monthOptions = generateMonthOptions(this.locale, year);\r\n this.firstDayOfWeek = getFirstDayOfWeek(this.locale);\r\n this.weekDays = generateWeekDays(this.locale, this.firstDayOfWeek);\r\n }\r\n\r\n private updateRangesArray(): void {\r\n this.rangesArray = this._ranges ? Object.entries(this._ranges).map(([key, value]) => ({key, value})) : [];\r\n }\r\n\r\n public selectRange(range: [Date, Date]): void {\r\n if (this.disabled) return;\r\n this.startDate = this.applyCurrentTime(range[0]);\r\n this.endDate = this.applyCurrentTime(range[1]);\r\n\r\n if (this.startDate && this.endDate) {\r\n this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\r\n }\r\n\r\n this.currentDate = new Date(this.startDate);\r\n this.initializeValue({start: this.startDate, end: this.endDate});\r\n this.generateCalendar();\r\n this.action.emit({type: 'rangeSelected', payload: {start: this.startDate, end: this.endDate, key: this.rangesArray.find(r => r.value === range)?.key}});\r\n }\r\n \r\n // NEW: Check if a date is a holiday\r\n public isHoliday(date: Date | null): boolean {\r\n if (!date || !this.holidayProvider) return false;\r\n const dateOnly = getStartOfDay(date);\r\n return this.holidayProvider.isHoliday(dateOnly);\r\n }\r\n \r\n // NEW: Get holiday label\r\n public getHolidayLabel(date: Date | null): string | null {\r\n if (!date || !this.holidayProvider || !this.isHoliday(date)) return null;\r\n return this.holidayProvider.getHolidayLabel ? this.holidayProvider.getHolidayLabel(getStartOfDay(date)) : 'Holiday';\r\n }\r\n\r\n public isDateDisabled(date: Date | null): boolean {\r\n if (!date) return false;\r\n\r\n const dateOnly = getStartOfDay(date);\r\n\r\n // 1. Check holiday provider for disabling\r\n if (this.holidayProvider && this.disableHolidays && this.holidayProvider.isHoliday(dateOnly)) {\r\n return true;\r\n }\r\n\r\n // 2. Check min/max date\r\n if (this._minDate) {\r\n const minDateOnly = getStartOfDay(this._minDate);\r\n if (dateOnly.getTime() < minDateOnly.getTime()) return true;\r\n }\r\n if (this._maxDate) {\r\n const maxDateOnly = getStartOfDay(this._maxDate);\r\n if (dateOnly.getTime() > maxDateOnly.getTime()) return true;\r\n }\r\n \r\n // 3. Check custom invalid date function\r\n return this.isInvalidDate(date);\r\n }\r\n\r\n public isMultipleSelected(d: Date | null): boolean {\r\n if (!d || this.mode !== 'multiple') return false;\r\n const dTime = getStartOfDay(d).getTime();\r\n return this.selectedDates.some(selected => getStartOfDay(selected).getTime() === dTime);\r\n }\r\n\r\n public onTimeChange(): void {\r\n if (this.disabled) return;\r\n if (this.mode === 'single' && this.selectedDate) {\r\n this.selectedDate = this.applyCurrentTime(this.selectedDate);\r\n this.emitValue(this.selectedDate);\r\n } else if (this.mode === 'range' && this.startDate && this.endDate) {\r\n this.startDate = this.applyCurrentTime(this.startDate);\r\n this.endDate = this.applyCurrentTime(this.endDate);\r\n this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\r\n } else if (this.mode === 'range' && this.startDate && !this.endDate) {\r\n this.startDate = this.applyCurrentTime(this.startDate);\r\n } else if (this.mode === 'multiple') {\r\n this.selectedDates = this.selectedDates.map(date => {\r\n const newDate = getStartOfDay(date);\r\n return this.applyCurrentTime(newDate);\r\n });\r\n this.emitValue([...this.selectedDates]);\r\n }\r\n\r\n this.action.emit({type: 'timeChanged', payload: {hour: this.currentHour, minute: this.currentMinute}});\r\n }\r\n\r\n public onDateClick(day: Date | null): void {\r\n if (!day || this.isDateDisabled(day) || this.disabled) return;\r\n\r\n const dateToToggle = getStartOfDay(day);\r\n\r\n if (this.mode === 'single') {\r\n this.selectedDate = this.applyCurrentTime(day);\r\n this.emitValue(this.selectedDate);\r\n } else if (this.mode === 'range') {\r\n if (!this.startDate || (this.startDate && this.endDate)) {\r\n this.startDate = this.applyCurrentTime(day);\r\n this.endDate = null;\r\n } else if (day >= this.startDate) {\r\n this.endDate = this.applyCurrentTime(day);\r\n this.emitValue({start: this.startDate as Date, end: this.endDate as Date});\r\n } else {\r\n this.startDate = this.applyCurrentTime(day);\r\n this.endDate = null;\r\n }\r\n this.hoveredDate = null;\r\n } else if (this.mode === 'multiple') {\r\n const existingIndex = this.selectedDates.findIndex(d => this.isSameDay(d, dateToToggle));\r\n\r\n if (existingIndex > -1) {\r\n this.selectedDates.splice(existingIndex, 1);\r\n } else {\r\n const dateWithTime = this.applyCurrentTime(dateToToggle);\r\n this.selectedDates.push(dateWithTime);\r\n this.selectedDates.sort((a, b) => a.getTime() - b.getTime());\r\n }\r\n this.emitValue([...this.selectedDates]);\r\n }\r\n\r\n const dateToSync = this.mode === 'single' ? this.selectedDate :\r\n this.mode === 'range' ? this.startDate :\r\n this.mode === 'multiple' && this.selectedDates.length > 0 ? this.selectedDates[this.selectedDates.length - 1] : null;\r\n\r\n if (dateToSync) {\r\n this.update12HourState(dateToSync.getHours());\r\n this.currentMinute = dateToSync.getMinutes();\r\n }\r\n\r\n this.action.emit({\r\n type: 'dateSelected',\r\n payload: {\r\n mode: this.mode,\r\n value: this._internalValue,\r\n date: day\r\n }\r\n });\r\n }\r\n\r\n public onDateHover(day: Date | null): void {\r\n if (this.mode === 'range' && this.startDate && !this.endDate && day) {\r\n this.hoveredDate = day;\r\n }\r\n }\r\n\r\n public isPreviewInRange(day: Date | null): boolean {\r\n if (this.mode !== 'range' || !this.startDate || this.endDate || !this.hoveredDate || !day) return false;\r\n const start = getStartOfDay(this.startDate).getTime();\r\n const end = getStartOfDay(this.hoveredDate).getTime();\r\n const time = getStartOfDay(day).getTime();\r\n return time > Math.min(start, end) && time < Math.max(start, end);\r\n }\r\n\r\n public generateCalendar(resetAnimation: boolean = true): void {\r\n this.daysInMonth = [];\r\n const year = this.currentDate.getFullYear();\r\n const month = this.currentDate.getMonth();\r\n this._currentMonth = month;\r\n this._currentYear = year;\r\n this.generateDropdownOptions();\r\n const firstDayOfMonth = new Date(year, month, 1);\r\n const lastDayOfMonth = new Date(year, month + 1, 0);\r\n const startDayOfWeek = firstDayOfMonth.getDay();\r\n const emptyCellCount = (startDayOfWeek - this.firstDayOfWeek + 7) % 7;\r\n\r\n for (let i = 0; i < emptyCellCount; i++) {\r\n this.daysInMonth.push(null);\r\n }\r\n for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {\r\n this.daysInMonth.push(this._normalizeDate(new Date(year, month, i)));\r\n }\r\n\r\n if (resetAnimation) {\r\n this.animateForward = false;\r\n this.animateBackward = false;\r\n }\r\n\r\n this.action.emit({\r\n type: 'calendarGenerated',\r\n payload: {\r\n month: month,\r\n year: year,\r\n days: this.daysInMonth.filter(d => d !== null)\r\n }\r\n });\r\n }\r\n\r\n private generateDropdownOptions(): void {\r\n this.yearOptions = generateYearOptions(this._currentYear);\r\n }\r\n\r\n public changeMonth(delta: number): void {\r\n if (this.disabled) return;\r\n\r\n // 1. Set the animation class (triggers slide-out)\r\n if (delta > 0) {\r\n this.animateForward = true;\r\n this.animateBackward = false;\r\n } else {\r\n this.animateBackward = true;\r\n this.animateForward = false;\r\n }\r\n\r\n const newDate = addMonths(this.currentDate, delta);\r\n\r\n // 2. Wait for the slide-out transition to complete (300ms)\r\n setTimeout(() => {\r\n // 3. Update the data\r\n this.currentDate = newDate;\r\n this._currentMonth = newDate.getMonth();\r\n this._currentYear = newDate.getFullYear();\r\n\r\n // Generate new calendar view but tell it *not* to reset animation flags yet.\r\n this.generateCalendar(false);\r\n\r\n // 4. Reset the animation flags to false (triggers slide-in of the new content)\r\n this.animateForward = false;\r\n this.animateBackward = false;\r\n\r\n }, 300); // Wait time should match the CSS transition duration (0.3s)\r\n\r\n this.action.emit({type: 'monthChanged', payload: { delta: delta }});\r\n }\r\n\r\n public isSameDay(d1: Date | null, d2: Date | null): boolean {\r\n return this.dateComparator(d1, d2);\r\n }\r\n\r\n public isInRange(d: Date | null): boolean {\r\n if (!d || !this.startDate || !this.endDate) return false;\r\n\r\n const dTime = getStartOfDay(d).getTime();\r\n const startDayTime = getStartOfDay(this.startDate).getTime();\r\n const endDayTime = getStartOfDay(this.endDate).getTime();\r\n\r\n const startTime = Math.min(startDayTime, endDayTime);\r\n const endTime = Math.max(startDayTime, endDayTime);\r\n\r\n return dTime > startTime && dTime < endTime;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Clean up any subscriptions or timers if needed\r\n // Currently no cleanup required, but method is here for future optimizations\r\n }\r\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
@@ -1,19 +1,30 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';
2
+ import { OnInit, OnChanges, OnDestroy, EventEmitter, SimpleChanges } from '@angular/core';
3
3
  import { ControlValueAccessor } from '@angular/forms';
4
4
 
5
+ /**
6
+ * Date utility functions for ngxsmk-datepicker
7
+ * Extracted to improve tree-shaking and reduce bundle size
8
+ */
9
+ declare function getStartOfDay(d: Date): Date;
10
+ declare function getEndOfDay(d: Date): Date;
11
+ declare function addMonths(d: Date, months: number): Date;
12
+ declare function subtractDays(d: Date, days: number): Date;
13
+ declare function getStartOfMonth(d: Date): Date;
14
+ declare function getEndOfMonth(d: Date): Date;
15
+ declare function isSameDay(d1: Date | null, d2: Date | null): boolean;
16
+ declare function normalizeDate(date: DateInput | null): Date | null;
5
17
  type DateInput = Date | string | {
6
18
  toDate: () => Date;
7
19
  _isAMomentObject?: boolean;
8
20
  $d?: Date;
9
21
  };
10
- interface DateRange {
11
- [key: string]: [DateInput, DateInput];
12
- }
13
- type DatepickerValue = Date | {
14
- start: Date;
15
- end: Date;
16
- } | Date[] | null;
22
+
23
+ /**
24
+ * Calendar utility functions for ngxsmk-datepicker
25
+ * Optimized for performance and tree-shaking
26
+ */
27
+
17
28
  interface HolidayProvider {
18
29
  /**
19
30
  * Returns true if the given date is a holiday.
@@ -25,27 +36,67 @@ interface HolidayProvider {
25
36
  */
26
37
  getHolidayLabel?(date: Date): string | null;
27
38
  }
28
- declare class CustomSelectComponent {
29
- options: {
39
+ interface DateRange {
40
+ [key: string]: [DateInput, DateInput];
41
+ }
42
+ type DatepickerValue = Date | {
43
+ start: Date;
44
+ end: Date;
45
+ } | Date[] | null;
46
+ /**
47
+ * Generate month options for dropdown
48
+ */
49
+ declare function generateMonthOptions(locale: string, year: number): {
50
+ label: string;
51
+ value: number;
52
+ }[];
53
+ /**
54
+ * Generate year options for dropdown
55
+ */
56
+ declare function generateYearOptions(currentYear: number, range?: number): {
57
+ label: string;
58
+ value: number;
59
+ }[];
60
+ /**
61
+ * Generate time options for hour/minute dropdowns
62
+ */
63
+ declare function generateTimeOptions(minuteInterval?: number): {
64
+ hourOptions: {
30
65
  label: string;
31
- value: any;
66
+ value: number;
32
67
  }[];
33
- value: any;
34
- disabled: boolean;
35
- valueChange: EventEmitter<any>;
36
- isOpen: boolean;
37
- private readonly elementRef;
38
- onDocumentClick(event: MouseEvent): void;
39
- get displayValue(): string;
40
- toggleDropdown(): void;
41
- selectOption(option: {
68
+ minuteOptions: {
42
69
  label: string;
43
- value: any;
44
- }): void;
45
- static ɵfac: i0.ɵɵFactoryDeclaration<CustomSelectComponent, never>;
46
- static ɵcmp: i0.ɵɵComponentDeclaration<CustomSelectComponent, "app-custom-select", never, { "options": { "alias": "options"; "required": false; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
47
- }
48
- declare class NgxsmkDatepickerComponent implements OnInit, OnChanges, ControlValueAccessor {
70
+ value: number;
71
+ }[];
72
+ };
73
+ /**
74
+ * Generate week days for calendar header
75
+ */
76
+ declare function generateWeekDays(locale: string, firstDayOfWeek?: number): string[];
77
+ /**
78
+ * Get first day of week for locale
79
+ */
80
+ declare function getFirstDayOfWeek(locale: string): number;
81
+ /**
82
+ * Convert 12-hour to 24-hour format
83
+ */
84
+ declare function get24Hour(displayHour: number, isPm: boolean): number;
85
+ /**
86
+ * Convert 24-hour to 12-hour format
87
+ */
88
+ declare function update12HourState(fullHour: number): {
89
+ isPm: boolean;
90
+ displayHour: number;
91
+ };
92
+ /**
93
+ * Process date ranges input
94
+ */
95
+ declare function processDateRanges(ranges: DateRange | null): {
96
+ [key: string]: [Date, Date];
97
+ } | null;
98
+
99
+ declare class NgxsmkDatepickerComponent implements OnInit, OnChanges, OnDestroy, ControlValueAccessor {
49
100
  mode: 'single' | 'range' | 'multiple';
50
101
  isInvalidDate: (date: Date) => boolean;
51
102
  showRanges: boolean;
@@ -122,6 +173,7 @@ declare class NgxsmkDatepickerComponent implements OnInit, OnChanges, ControlVal
122
173
  animateForward: boolean;
123
174
  animateBackward: boolean;
124
175
  private readonly elementRef;
176
+ private readonly dateComparator;
125
177
  get isInlineMode(): boolean;
126
178
  get isCalendarVisible(): boolean;
127
179
  get displayValue(): string;
@@ -161,9 +213,31 @@ declare class NgxsmkDatepickerComponent implements OnInit, OnChanges, ControlVal
161
213
  changeMonth(delta: number): void;
162
214
  isSameDay(d1: Date | null, d2: Date | null): boolean;
163
215
  isInRange(d: Date | null): boolean;
216
+ ngOnDestroy(): void;
164
217
  static ɵfac: i0.ɵɵFactoryDeclaration<NgxsmkDatepickerComponent, never>;
165
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>;
166
219
  }
167
220
 
168
- export { CustomSelectComponent, NgxsmkDatepickerComponent };
221
+ declare class CustomSelectComponent {
222
+ options: {
223
+ label: string;
224
+ value: any;
225
+ }[];
226
+ value: any;
227
+ disabled: boolean;
228
+ valueChange: EventEmitter<any>;
229
+ isOpen: boolean;
230
+ private readonly elementRef;
231
+ onDocumentClick(event: MouseEvent): void;
232
+ get displayValue(): string;
233
+ toggleDropdown(): void;
234
+ selectOption(option: {
235
+ label: string;
236
+ value: any;
237
+ }): void;
238
+ static ɵfac: i0.ɵɵFactoryDeclaration<CustomSelectComponent, never>;
239
+ static ɵcmp: i0.ɵɵComponentDeclaration<CustomSelectComponent, "ngxsmk-custom-select", never, { "options": { "alias": "options"; "required": false; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
240
+ }
241
+
242
+ export { CustomSelectComponent, NgxsmkDatepickerComponent, addMonths, generateMonthOptions, generateTimeOptions, generateWeekDays, generateYearOptions, get24Hour, getEndOfDay, getEndOfMonth, getFirstDayOfWeek, getStartOfDay, getStartOfMonth, isSameDay, normalizeDate, processDateRanges, subtractDays, update12HourState };
169
243
  export type { DateInput, DateRange, DatepickerValue, HolidayProvider };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngxsmk-datepicker",
3
- "version": "1.3.6",
3
+ "version": "1.3.8",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=17.0.0",
6
6
  "@angular/core": ">=17.0.0",
@@ -43,12 +43,19 @@
43
43
  "localization"
44
44
  ],
45
45
  "exports": {
46
- "./package.json": {
47
- "default": "./package.json"
48
- },
49
46
  ".": {
47
+ "import": "./fesm2022/ngxsmk-datepicker.mjs",
48
+ "require": "./fesm2020/ngxsmk-datepicker.mjs",
50
49
  "types": "./index.d.ts",
51
50
  "default": "./fesm2022/ngxsmk-datepicker.mjs"
51
+ },
52
+ "./package.json": {
53
+ "default": "./package.json"
52
54
  }
55
+ },
56
+ "optimization": {
57
+ "treeShaking": true,
58
+ "sideEffects": false,
59
+ "usedExports": true
53
60
  }
54
61
  }