ngxsmk-datepicker 1.6.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,10 +4,6 @@ import * as i1 from '@angular/common';
4
4
  import { CommonModule, DatePipe } from '@angular/common';
5
5
  import { FormsModule, ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
6
6
 
7
- /**
8
- * Date utility functions for ngxsmk-datepicker
9
- * Extracted to improve tree-shaking and reduce bundle size
10
- */
11
7
  function getStartOfDay(d) {
12
8
  return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0, 0);
13
9
  }
@@ -46,10 +42,6 @@ function normalizeDate(date) {
46
42
  return d;
47
43
  }
48
44
 
49
- /**
50
- * Calendar utility functions for ngxsmk-datepicker
51
- * Optimized for performance and tree-shaking
52
- */
53
45
  /**
54
46
  * Generate month options for dropdown
55
47
  */
@@ -230,13 +222,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0-rc.1", ng
230
222
  args: ['document:click', ['$event']]
231
223
  }] } });
232
224
 
233
- /**
234
- * Performance utilities for ngxsmk-datepicker
235
- * Optimized for better runtime performance
236
- */
237
- /**
238
- * Memoization decorator for expensive computations
239
- */
240
225
  function memoize(fn, keyGenerator) {
241
226
  const cache = new Map();
242
227
  return ((...args) => {
@@ -249,9 +234,6 @@ function memoize(fn, keyGenerator) {
249
234
  return result;
250
235
  });
251
236
  }
252
- /**
253
- * Debounce function for performance optimization
254
- */
255
237
  function debounce(func, wait) {
256
238
  let timeout = null;
257
239
  return (...args) => {
@@ -263,9 +245,6 @@ function debounce(func, wait) {
263
245
  }, wait);
264
246
  };
265
247
  }
266
- /**
267
- * Throttle function for performance optimization
268
- */
269
248
  function throttle(func, limit) {
270
249
  let inThrottle = false;
271
250
  return (...args) => {
@@ -276,9 +255,6 @@ function throttle(func, limit) {
276
255
  }
277
256
  };
278
257
  }
279
- /**
280
- * Create a shallow comparison function for objects
281
- */
282
258
  function shallowEqual(a, b) {
283
259
  const keysA = Object.keys(a);
284
260
  const keysB = Object.keys(b);
@@ -292,12 +268,9 @@ function shallowEqual(a, b) {
292
268
  }
293
269
  return true;
294
270
  }
295
- /**
296
- * Optimized date comparison for calendar rendering
297
- */
298
271
  function createDateComparator() {
299
272
  const cache = new Map();
300
- const MAX_CACHE_SIZE = 1000; // Prevent memory leaks
273
+ const MAX_CACHE_SIZE = 1000;
301
274
  return (date1, date2) => {
302
275
  if (!date1 || !date2)
303
276
  return date1 === date2;
@@ -308,7 +281,6 @@ function createDateComparator() {
308
281
  const result = (date1.getFullYear() === date2.getFullYear() &&
309
282
  date1.getMonth() === date2.getMonth() &&
310
283
  date1.getDate() === date2.getDate());
311
- // Prevent cache from growing too large
312
284
  if (cache.size >= MAX_CACHE_SIZE) {
313
285
  const firstKey = cache.keys().next().value;
314
286
  if (firstKey !== undefined) {
@@ -319,9 +291,6 @@ function createDateComparator() {
319
291
  return result;
320
292
  };
321
293
  }
322
- /**
323
- * Optimized array filtering with caching
324
- */
325
294
  function createFilteredArray(source, filterFn, cacheKey) {
326
295
  const cache = new Map();
327
296
  const key = cacheKey || JSON.stringify(source);
@@ -332,12 +301,7 @@ function createFilteredArray(source, filterFn, cacheKey) {
332
301
  cache.set(key, result);
333
302
  return result;
334
303
  }
335
- /**
336
- * Clear all caches to prevent memory leaks
337
- */
338
304
  function clearAllCaches() {
339
- // This would be called from the component's ngOnDestroy
340
- // Implementation depends on how caches are managed globally
341
305
  }
342
306
 
343
307
  class NgxsmkDatepickerComponent {
@@ -352,6 +316,17 @@ class NgxsmkDatepickerComponent {
352
316
  this.disabledDates = [];
353
317
  this.placeholder = 'Select Date';
354
318
  this.inline = false;
319
+ // Accessibility and customization
320
+ this.clearLabel = 'Clear';
321
+ this.closeLabel = 'Close';
322
+ this.prevMonthAriaLabel = 'Previous month';
323
+ this.nextMonthAriaLabel = 'Next month';
324
+ this.clearAriaLabel = 'Clear selection';
325
+ this.closeAriaLabel = 'Close calendar';
326
+ // Localization configurability
327
+ this.weekStart = null;
328
+ // Year dropdown configurability (range before/after current year)
329
+ this.yearRange = 10;
355
330
  this.isCalendarOpen = false;
356
331
  this._internalValue = null;
357
332
  this._value = null;
@@ -501,6 +476,7 @@ class NgxsmkDatepickerComponent {
501
476
  this._internalValue = val;
502
477
  this.initializeValue(val);
503
478
  this.generateCalendar();
479
+ this.cdr.markForCheck();
504
480
  }
505
481
  registerOnChange(fn) {
506
482
  this.onChange = fn;
@@ -600,21 +576,34 @@ class NgxsmkDatepickerComponent {
600
576
  if (changes['locale']) {
601
577
  this.generateLocaleData();
602
578
  this.generateCalendar();
579
+ this.cdr.markForCheck();
580
+ }
581
+ if (changes['weekStart']) {
582
+ this.generateLocaleData();
583
+ this.generateCalendar();
584
+ this.cdr.markForCheck();
603
585
  }
604
586
  if (changes['minuteInterval']) {
605
587
  this.generateTimeOptions();
606
588
  this.currentMinute = Math.floor(this.currentMinute / this.minuteInterval) * this.minuteInterval;
607
589
  this.onTimeChange();
608
590
  }
591
+ if (changes['yearRange']) {
592
+ this.generateDropdownOptions();
593
+ this.cdr.markForCheck();
594
+ }
609
595
  if (changes['value']) {
610
596
  const newValue = changes['value'].currentValue;
611
597
  if (!this.isValueEqual(newValue, this._internalValue)) {
612
- this.writeValue(newValue);
598
+ this._internalValue = newValue;
599
+ this.initializeValue(newValue);
600
+ this.generateCalendar();
601
+ this.cdr.markForCheck();
613
602
  }
614
603
  }
615
- // Rerun calendar generation if provider changes to refresh disabled states
616
604
  if (changes['holidayProvider'] || changes['disableHolidays'] || changes['disabledDates']) {
617
605
  this.generateCalendar();
606
+ this.cdr.markForCheck();
618
607
  }
619
608
  if (changes['startAt']) {
620
609
  if (!this._internalValue && this._startAtDate) {
@@ -622,24 +611,29 @@ class NgxsmkDatepickerComponent {
622
611
  this._currentMonth = this.currentDate.getMonth();
623
612
  this._currentYear = this.currentDate.getFullYear();
624
613
  this.generateCalendar();
614
+ this.cdr.markForCheck();
625
615
  }
626
616
  }
627
- // Handle minDate changes - if minDate is set and is in the future,
628
- // and we don't have a current value, update the view to show minDate's month
629
- if (changes['minDate'] && !this._internalValue) {
630
- if (this._minDate) {
617
+ if (changes['minDate']) {
618
+ this.generateCalendar();
619
+ this.cdr.markForCheck();
620
+ if (!this._internalValue && this._minDate) {
631
621
  const today = new Date();
632
622
  const minDateOnly = getStartOfDay(this._minDate);
633
623
  const todayOnly = getStartOfDay(today);
634
- // If minDate is in the future, update the view to show minDate's month
635
624
  if (minDateOnly.getTime() > todayOnly.getTime()) {
636
625
  this.currentDate = new Date(this._minDate);
637
626
  this._currentMonth = this.currentDate.getMonth();
638
627
  this._currentYear = this.currentDate.getFullYear();
639
628
  this.generateCalendar();
629
+ this.cdr.markForCheck();
640
630
  }
641
631
  }
642
632
  }
633
+ if (changes['maxDate']) {
634
+ this.generateCalendar();
635
+ this.cdr.markForCheck();
636
+ }
643
637
  }
644
638
  get24Hour(displayHour, isPm) {
645
639
  return get24Hour(displayHour, isPm);
@@ -675,19 +669,15 @@ class NgxsmkDatepickerComponent {
675
669
  initialDate = this.selectedDates.length > 0 ? this.selectedDates[this.selectedDates.length - 1] : null;
676
670
  }
677
671
  }
678
- // Determine the initial view date
679
672
  let viewCenterDate = initialDate || this._startAtDate;
680
- // If no specific date is set and minDate is in the future, use minDate's month
681
673
  if (!viewCenterDate && this._minDate) {
682
674
  const today = new Date();
683
675
  const minDateOnly = getStartOfDay(this._minDate);
684
676
  const todayOnly = getStartOfDay(today);
685
- // If minDate is in the future, use minDate as the initial view
686
677
  if (minDateOnly.getTime() > todayOnly.getTime()) {
687
678
  viewCenterDate = this._minDate;
688
679
  }
689
680
  }
690
- // Fallback to current date if no other date is determined
691
681
  if (!viewCenterDate) {
692
682
  viewCenterDate = new Date();
693
683
  }
@@ -731,7 +721,6 @@ class NgxsmkDatepickerComponent {
731
721
  }
732
722
  parseDateString(dateString) {
733
723
  try {
734
- // Handle MM/DD/YYYY format
735
724
  const date = new Date(dateString);
736
725
  if (isNaN(date.getTime())) {
737
726
  return null;
@@ -750,7 +739,10 @@ class NgxsmkDatepickerComponent {
750
739
  generateLocaleData() {
751
740
  const year = new Date().getFullYear();
752
741
  this.monthOptions = generateMonthOptions(this.locale, year);
753
- this.firstDayOfWeek = getFirstDayOfWeek(this.locale);
742
+ // If weekStart is provided, use it; otherwise derive from locale
743
+ this.firstDayOfWeek = this.weekStart !== null && this.weekStart !== undefined
744
+ ? this.weekStart
745
+ : getFirstDayOfWeek(this.locale);
754
746
  this.weekDays = generateWeekDays(this.locale, this.firstDayOfWeek);
755
747
  }
756
748
  updateRangesArray() {
@@ -785,7 +777,6 @@ class NgxsmkDatepickerComponent {
785
777
  if (!date)
786
778
  return false;
787
779
  const dateOnly = getStartOfDay(date);
788
- // 1. Check disabled dates array
789
780
  if (this.disabledDates.length > 0) {
790
781
  for (const disabledDate of this.disabledDates) {
791
782
  let parsedDate;
@@ -800,11 +791,9 @@ class NgxsmkDatepickerComponent {
800
791
  }
801
792
  }
802
793
  }
803
- // 2. Check holiday provider for disabling
804
794
  if (this.holidayProvider && this.disableHolidays && this.holidayProvider.isHoliday(dateOnly)) {
805
795
  return true;
806
796
  }
807
- // 3. Check min/max date
808
797
  if (this._minDate) {
809
798
  const minDateOnly = getStartOfDay(this._minDate);
810
799
  if (dateOnly.getTime() < minDateOnly.getTime())
@@ -815,7 +804,6 @@ class NgxsmkDatepickerComponent {
815
804
  if (dateOnly.getTime() > maxDateOnly.getTime())
816
805
  return true;
817
806
  }
818
- // 4. Check custom invalid date function
819
807
  return this.isInvalidDate(date);
820
808
  }
821
809
  isMultipleSelected(d) {
@@ -852,7 +840,6 @@ class NgxsmkDatepickerComponent {
852
840
  onDateClick(day) {
853
841
  if (!day || this.disabled)
854
842
  return;
855
- // Only check isDateDisabled for current month days
856
843
  if (this.isCurrentMonth(day) && this.isDateDisabled(day))
857
844
  return;
858
845
  const dateToToggle = getStartOfDay(day);
@@ -929,7 +916,6 @@ class NgxsmkDatepickerComponent {
929
916
  const lastDayOfMonth = new Date(year, month + 1, 0);
930
917
  const startDayOfWeek = firstDayOfMonth.getDay();
931
918
  const emptyCellCount = (startDayOfWeek - this.firstDayOfWeek + 7) % 7;
932
- // Add previous month's days instead of null values
933
919
  const previousMonth = month === 0 ? 11 : month - 1;
934
920
  const previousYear = month === 0 ? year - 1 : year;
935
921
  const lastDayOfPreviousMonth = new Date(previousYear, previousMonth + 1, 0);
@@ -951,20 +937,17 @@ class NgxsmkDatepickerComponent {
951
937
  });
952
938
  }
953
939
  generateDropdownOptions() {
954
- this.yearOptions = generateYearOptions(this._currentYear);
940
+ this.yearOptions = generateYearOptions(this._currentYear, this.yearRange);
955
941
  }
956
942
  changeMonth(delta) {
957
943
  if (this.disabled)
958
944
  return;
959
- // Check if going back is disabled due to minDate constraint
960
945
  if (delta < 0 && this.isBackArrowDisabled)
961
946
  return;
962
947
  const newDate = addMonths(this.currentDate, delta);
963
- // Update the data immediately (no animation)
964
948
  this.currentDate = newDate;
965
949
  this._currentMonth = newDate.getMonth();
966
950
  this._currentYear = newDate.getFullYear();
967
- // Generate new calendar view
968
951
  this.generateCalendar();
969
952
  this.action.emit({ type: 'monthChanged', payload: { delta: delta } });
970
953
  this.cdr.markForCheck();
@@ -988,42 +971,38 @@ class NgxsmkDatepickerComponent {
988
971
  return dTime > startTime && dTime < endTime;
989
972
  }
990
973
  ngOnDestroy() {
991
- // Clean up any subscriptions or timers if needed
992
974
  this.selectedDate = null;
993
975
  this.selectedDates = [];
994
976
  this.startDate = null;
995
977
  this.endDate = null;
996
978
  this.hoveredDate = null;
997
979
  this._internalValue = null;
998
- // Clear any cached data
999
- if (this.dateComparator && typeof this.dateComparator === 'function') {
1000
- // Clear any internal caches if they exist
1001
- }
1002
980
  }
1003
981
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0-rc.1", ngImport: i0, type: NgxsmkDatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1004
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0-rc.1", 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", value: "value", 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: [{
982
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0-rc.1", 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", clearLabel: "clearLabel", closeLabel: "closeLabel", prevMonthAriaLabel: "prevMonthAriaLabel", nextMonthAriaLabel: "nextMonthAriaLabel", clearAriaLabel: "clearAriaLabel", closeAriaLabel: "closeAriaLabel", weekStart: "weekStart", yearRange: "yearRange", value: "value", startAt: "startAt", locale: "locale", theme: "theme", classes: "classes", 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: [{
1005
983
  provide: NG_VALUE_ACCESSOR,
1006
984
  useExisting: forwardRef(() => NgxsmkDatepickerComponent),
1007
985
  multi: true
1008
986
  }], usesOnChanges: true, ngImport: i0, template: `
1009
- <div class="ngxsmk-datepicker-wrapper" [class.ngxsmk-inline-mode]="isInlineMode">
987
+ <div class="ngxsmk-datepicker-wrapper" [class.ngxsmk-inline-mode]="isInlineMode" [ngClass]="classes?.wrapper">
1010
988
  @if (!isInlineMode) {
1011
- <div class="ngxsmk-input-group" (click)="toggleCalendar()" [class.disabled]="disabled">
989
+ <div class="ngxsmk-input-group" (click)="toggleCalendar()" [class.disabled]="disabled" role="button" [attr.aria-disabled]="disabled" aria-haspopup="dialog" [ngClass]="classes?.inputGroup">
1012
990
  <input type="text"
1013
991
  [value]="displayValue"
1014
992
  [placeholder]="placeholder"
1015
993
  readonly
1016
994
  [disabled]="disabled"
1017
- class="ngxsmk-display-input">
1018
- <button type="button" class="ngxsmk-clear-button" (click)="clearValue($event)" [disabled]="disabled" *ngIf="displayValue">
995
+ class="ngxsmk-display-input"
996
+ [ngClass]="classes?.input">
997
+ <button type="button" class="ngxsmk-clear-button" (click)="clearValue($event)" [disabled]="disabled" *ngIf="displayValue" [attr.aria-label]="clearAriaLabel" [title]="clearLabel" [ngClass]="classes?.clearBtn">
1019
998
  <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>
1020
999
  </button>
1021
1000
  </div>
1022
1001
  }
1023
1002
 
1024
1003
  @if (isCalendarVisible) {
1025
- <div class="ngxsmk-popover-container" [class.ngxsmk-inline-container]="isInlineMode">
1026
- <div class="ngxsmk-datepicker-container">
1004
+ <div class="ngxsmk-popover-container" [class.ngxsmk-inline-container]="isInlineMode" [ngClass]="classes?.popover">
1005
+ <div class="ngxsmk-datepicker-container" [ngClass]="classes?.container">
1027
1006
  @if (showRanges && rangesArray.length > 0 && mode === 'range') {
1028
1007
  <div class="ngxsmk-ranges-container">
1029
1008
  <ul>
@@ -1033,21 +1012,21 @@ class NgxsmkDatepickerComponent {
1033
1012
  </ul>
1034
1013
  </div>
1035
1014
  }
1036
- <div class="ngxsmk-calendar-container">
1037
- <div class="ngxsmk-header">
1015
+ <div class="ngxsmk-calendar-container" [ngClass]="classes?.calendar">
1016
+ <div class="ngxsmk-header" [ngClass]="classes?.header">
1038
1017
  <div class="ngxsmk-month-year-selects">
1039
1018
  <ngxsmk-custom-select class="month-select" [options]="monthOptions"
1040
1019
  [(value)]="currentMonth" [disabled]="disabled"></ngxsmk-custom-select>
1041
1020
  <ngxsmk-custom-select class="year-select" [options]="yearOptions" [(value)]="currentYear" [disabled]="disabled"></ngxsmk-custom-select>
1042
1021
  </div>
1043
1022
  <div class="ngxsmk-nav-buttons">
1044
- <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(-1)" [disabled]="disabled || isBackArrowDisabled">
1023
+ <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(-1)" [disabled]="disabled || isBackArrowDisabled" [attr.aria-label]="prevMonthAriaLabel" [title]="prevMonthAriaLabel" [ngClass]="classes?.navPrev">
1045
1024
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
1046
1025
  <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48"
1047
1026
  d="M328 112L184 256l144 144"/>
1048
1027
  </svg>
1049
1028
  </button>
1050
- <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(1)" [disabled]="disabled">
1029
+ <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(1)" [disabled]="disabled" [attr.aria-label]="nextMonthAriaLabel" [title]="nextMonthAriaLabel" [ngClass]="classes?.navNext">
1051
1030
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
1052
1031
  <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48"
1053
1032
  d="M184 112l144 144-144 144"/>
@@ -1061,7 +1040,7 @@ class NgxsmkDatepickerComponent {
1061
1040
  <div class="ngxsmk-day-name">{{ day }}</div>
1062
1041
  }
1063
1042
  @for (day of daysInMonth; track trackByDay($index, day)) {
1064
- <div class="ngxsmk-day-cell"
1043
+ <div class="ngxsmk-day-cell" [ngClass]="classes?.dayCell"
1065
1044
  [class.empty]="!isCurrentMonthMemo(day)" [class.disabled]="isDateDisabledMemo(day)"
1066
1045
  [class.today]="isSameDayMemo(day, today)"
1067
1046
  [class.holiday]="isHolidayMemo(day)"
@@ -1108,12 +1087,12 @@ class NgxsmkDatepickerComponent {
1108
1087
  </div>
1109
1088
  }
1110
1089
 
1111
- <div class="ngxsmk-footer" *ngIf="!isInlineMode">
1112
- <button type="button" class="ngxsmk-clear-button-footer" (click)="clearValue($event)" [disabled]="disabled">
1113
- Clear
1090
+ <div class="ngxsmk-footer" *ngIf="!isInlineMode" [ngClass]="classes?.footer">
1091
+ <button type="button" class="ngxsmk-clear-button-footer" (click)="clearValue($event)" [disabled]="disabled" [attr.aria-label]="clearAriaLabel" [ngClass]="classes?.clearBtn">
1092
+ {{ clearLabel }}
1114
1093
  </button>
1115
- <button type="button" class="ngxsmk-close-button" (click)="isCalendarOpen = false" [disabled]="disabled">
1116
- Close
1094
+ <button type="button" class="ngxsmk-close-button" (click)="isCalendarOpen = false" [disabled]="disabled" [attr.aria-label]="closeAriaLabel" [ngClass]="classes?.closeBtn">
1095
+ {{ closeLabel }}
1117
1096
  </button>
1118
1097
  </div>
1119
1098
  </div>
@@ -1121,7 +1100,7 @@ class NgxsmkDatepickerComponent {
1121
1100
  </div>
1122
1101
  }
1123
1102
  </div>
1124
- `, isInline: true, styles: [":host{--datepicker-primary-color: #6d28d9;--datepicker-primary-contrast: #ffffff;--datepicker-range-background: #f5f3ff;--datepicker-background: #ffffff;--datepicker-text-color: #222428;--datepicker-subtle-text-color: #9ca3af;--datepicker-border-color: #e9e9e9;--datepicker-hover-background: #f0f0f0;--datepicker-font-size-base: 14px;--datepicker-font-size-sm: 12px;--datepicker-font-size-lg: 16px;--datepicker-font-size-xl: 18px;--datepicker-line-height: 1.4;--datepicker-spacing-xs: 4px;--datepicker-spacing-sm: 8px;--datepicker-spacing-md: 12px;--datepicker-spacing-lg: 16px;--datepicker-spacing-xl: 20px;display:inline-block;position:relative}:host(.dark-theme){--datepicker-range-background: rgba(139, 92, 246, .2);--datepicker-background: #1f2937;--datepicker-text-color: #d1d5db;--datepicker-subtle-text-color: #6b7280;--datepicker-border-color: #4b5563;--datepicker-hover-background: #374151}.ngxsmk-datepicker-wrapper{position:relative}.ngxsmk-input-group{display:flex;align-items:center;cursor:pointer;width:100%;min-width:150px;border:1px solid var(--datepicker-border-color, #ccc);border-radius:4px;background:var(--datepicker-background);transition:all .2s ease;position:relative;overflow:hidden}.ngxsmk-input-group:focus-within{border-color:var(--datepicker-primary-color);box-shadow:0 0 0 2px #6d28d91a}.ngxsmk-input-group:hover:not(.disabled){border-color:var(--datepicker-primary-color)}.ngxsmk-input-group.has-value{border-color:var(--datepicker-primary-color)}.ngxsmk-input-group.error{border-color:#dc2626;box-shadow:0 0 0 2px #dc26261a}.ngxsmk-input-group.success{border-color:#16a34a;box-shadow:0 0 0 2px #16a34a1a}.ngxsmk-input-group.disabled{cursor:not-allowed;opacity:.7}.ngxsmk-display-input{flex-grow:1;padding:var(--datepicker-spacing-sm) var(--datepicker-spacing-sm);font-size:var(--datepicker-font-size-base);line-height:var(--datepicker-line-height);color:var(--datepicker-text-color, #333);background:transparent;border:none;outline:none;cursor:pointer;transition:all .2s ease;min-height:20px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ngxsmk-display-input:disabled{background:var(--datepicker-hover-background, #f0f0f0);cursor:not-allowed;opacity:.6}.ngxsmk-display-input:focus{outline:2px solid var(--datepicker-primary-color);outline-offset:2px}.ngxsmk-display-input::placeholder{color:var(--datepicker-subtle-text-color);font-style:italic}.ngxsmk-input-group:focus-within .ngxsmk-display-input{color:var(--datepicker-primary-color)}.ngxsmk-input-group:hover:not(.disabled) .ngxsmk-display-input{color:var(--datepicker-text-color)}.ngxsmk-input-group.has-value .ngxsmk-display-input{font-weight:500;color:var(--datepicker-text-color)}.ngxsmk-input-group:not(.has-value) .ngxsmk-display-input{color:var(--datepicker-subtle-text-color)}.ngxsmk-input-group.error .ngxsmk-display-input{color:#dc2626;border-color:#dc2626}.ngxsmk-input-group.success .ngxsmk-display-input{color:#16a34a;border-color:#16a34a}.ngxsmk-input-group.compact{min-width:120px;padding:var(--datepicker-spacing-xs)}.ngxsmk-input-group.compact .ngxsmk-display-input{font-size:var(--datepicker-font-size-sm);padding:var(--datepicker-spacing-xs)}.ngxsmk-input-group.large{min-width:200px;padding:var(--datepicker-spacing-md)}.ngxsmk-input-group.large .ngxsmk-display-input{font-size:var(--datepicker-font-size-lg);padding:var(--datepicker-spacing-md)}.ngxsmk-input-group.with-icon .ngxsmk-display-input{padding-left:32px}.ngxsmk-input-group .ngxsmk-input-icon{position:absolute;left:var(--datepicker-spacing-sm);top:50%;transform:translateY(-50%);color:var(--datepicker-subtle-text-color);pointer-events:none}.ngxsmk-input-group.loading .ngxsmk-display-input{color:var(--datepicker-subtle-text-color);cursor:wait}.ngxsmk-input-group.loading:after{content:\"\";position:absolute;right:var(--datepicker-spacing-sm);top:50%;transform:translateY(-50%);width:16px;height:16px;border:2px solid var(--datepicker-border-color);border-top:2px solid var(--datepicker-primary-color);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{0%{transform:translateY(-50%) rotate(0)}to{transform:translateY(-50%) rotate(360deg)}}.ngxsmk-clear-button{background:none;border:none;padding:0 8px;cursor:pointer;color:var(--datepicker-subtle-text-color);line-height:1}.ngxsmk-clear-button svg{width:14px;height:14px}.ngxsmk-clear-button:hover{color:var(--datepicker-text-color)}.ngxsmk-popover-container{position:absolute;top:100%;left:0;z-index:10000;margin-top:8px}.ngxsmk-popover-container.ngxsmk-inline-container{position:static;margin-top:0}.ngxsmk-datepicker-wrapper.ngxsmk-inline-mode{display:block}.ngxsmk-datepicker-wrapper.ngxsmk-inline-mode .ngxsmk-datepicker-container{box-shadow:none}.ngxsmk-footer{display:flex;justify-content:flex-end;gap:8px;margin-top:12px;padding-top:8px;border-top:1px solid var(--datepicker-border-color)}.ngxsmk-clear-button-footer,.ngxsmk-close-button{padding:var(--datepicker-spacing-sm) var(--datepicker-spacing-md);border-radius:6px;font-size:var(--datepicker-font-size-sm);line-height:var(--datepicker-line-height);cursor:pointer;transition:background-color .2s;border:1px solid var(--datepicker-border-color)}.ngxsmk-clear-button-footer{background:none;color:var(--datepicker-subtle-text-color)}.ngxsmk-close-button{background-color:var(--datepicker-primary-color);color:var(--datepicker-primary-contrast);border-color:var(--datepicker-primary-color)}.ngxsmk-close-button:hover:not(:disabled){opacity:.9}.ngxsmk-clear-button-footer:hover:not(:disabled){background-color:var(--datepicker-hover-background)}.ngxsmk-datepicker-container{display:flex;flex-direction:column;width:100%}.ngxsmk-calendar-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:var(--datepicker-font-size-base);line-height:var(--datepicker-line-height);border-radius:10px;padding:var(--datepicker-spacing-md);background:var(--datepicker-background);box-shadow:0 4px 10px #0000001a}.ngxsmk-ranges-container{width:100%;padding:var(--datepicker-spacing-md);border-right:none;background:var(--datepicker-hover-background);border-radius:10px}.ngxsmk-ranges-container ul{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;list-style:none;padding:0;margin:0}.ngxsmk-ranges-container li{padding:var(--datepicker-spacing-sm) var(--datepicker-spacing-sm);margin-bottom:0;font-size:var(--datepicker-font-size-sm);line-height:var(--datepicker-line-height);border:1px solid var(--datepicker-border-color);border-radius:6px;cursor:pointer;transition:background-color .15s ease;flex-shrink:0}.ngxsmk-ranges-container li:hover{background-color:var(--datepicker-hover-background)}.ngxsmk-ranges-container li.disabled{cursor:not-allowed;opacity:.5;background-color:transparent!important;color:var(--datepicker-subtle-text-color, #9ca3af)}.ngxsmk-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;position:relative;z-index:2;gap:4px}.ngxsmk-month-year-selects{display:flex;gap:4px}.ngxsmk-month-year-selects app-custom-select.month-select{--custom-select-width: 100px}.ngxsmk-month-year-selects app-custom-select.year-select{--custom-select-width: 75px}.ngxsmk-nav-buttons{display:flex}.ngxsmk-nav-button{padding:6px;background:none;border:none;cursor:pointer;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;color:var(--datepicker-text-color)}.ngxsmk-nav-button:hover:not(:disabled){background-color:var(--datepicker-hover-background)}.ngxsmk-nav-button:disabled{cursor:not-allowed;opacity:.5}.ngxsmk-nav-button svg{width:16px;height:16px}.ngxsmk-days-grid{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;gap:0}.ngxsmk-day-name{font-size:var(--datepicker-font-size-sm);padding:var(--datepicker-spacing-sm) 0;color:var(--datepicker-subtle-text-color);font-weight:600;line-height:var(--datepicker-line-height)}.ngxsmk-day-cell{height:32px;position:relative;display:flex;justify-content:center;align-items:center;cursor:pointer;border-radius:0}.ngxsmk-day-cell.holiday .ngxsmk-day-number{color:var(--datepicker-primary-color);text-decoration:underline dotted}.ngxsmk-day-number{width:30px;height:30px;display:flex;justify-content:center;align-items:center;border-radius:50%;color:var(--datepicker-text-color);font-size:var(--datepicker-font-size-base);line-height:var(--datepicker-line-height);position:relative;z-index:1}.ngxsmk-time-selection{display:flex;align-items:center;gap:var(--datepicker-spacing-xs);flex-wrap:wrap;margin-top:var(--datepicker-spacing-md);padding-top:var(--datepicker-spacing-sm);border-top:1px solid var(--datepicker-border-color)}.ngxsmk-time-label{font-size:var(--datepicker-font-size-base);line-height:var(--datepicker-line-height);color:var(--datepicker-subtle-text-color);margin-right:var(--datepicker-spacing-xs)}.ngxsmk-time-separator{font-weight:600;color:var(--datepicker-text-color)}.ngxsmk-time-selection app-custom-select{--custom-select-width: 75px;height:28px}.ngxsmk-time-selection app-custom-select.ampm-select{--custom-select-width: 75px}.ngxsmk-time-selection .hour-select,.ngxsmk-time-selection .minute-select,.ngxsmk-time-selection .ampm-select{--custom-select-width: 75px;--custom-select-height: 28px}.ngxsmk-time-selection app-custom-select:hover{border-color:var(--datepicker-primary-color)}.ngxsmk-time-selection app-custom-select:focus-within{border-color:var(--datepicker-primary-color);box-shadow:0 0 0 2px #6d28d933}.ngxsmk-time-selection .time-select-compact{--custom-select-width: 60px;--custom-select-height: 24px;font-size:var(--datepicker-font-size-sm)}.ngxsmk-time-selection .time-select-large{--custom-select-width: 90px;--custom-select-height: 36px;font-size:var(--datepicker-font-size-lg)}.ngxsmk-time-selection .time-select-disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.ngxsmk-time-selection app-custom-select{transition:border-color .2s ease,box-shadow .2s ease}.ngxsmk-time-selection app-custom-select.ngxsmk-time-select-animated{transition:all .2s cubic-bezier(.4,0,.2,1)}.ngxsmk-day-cell:not(.disabled):not(.empty):hover .ngxsmk-day-number{background-color:var(--datepicker-hover-background);color:var(--datepicker-primary-color)}.ngxsmk-day-cell.start-date .ngxsmk-day-number,.ngxsmk-day-cell.end-date .ngxsmk-day-number,.ngxsmk-day-cell.selected .ngxsmk-day-number,.ngxsmk-day-cell.multiple-selected .ngxsmk-day-number{background-color:var(--datepicker-primary-color);color:var(--datepicker-primary-contrast)}.ngxsmk-day-cell.multiple-selected .ngxsmk-day-number{border:1px dashed var(--datepicker-primary-contrast)}.ngxsmk-day-cell.multiple-selected:hover .ngxsmk-day-number{background-color:var(--datepicker-primary-color);color:var(--datepicker-primary-contrast)}.ngxsmk-day-cell.in-range,.ngxsmk-day-cell.start-date,.ngxsmk-day-cell.end-date,.ngxsmk-day-cell.preview-range{background-color:var(--datepicker-range-background)}.ngxsmk-day-cell.start-date{border-top-left-radius:100%;border-bottom-left-radius:100%}.ngxsmk-day-cell.end-date{border-top-right-radius:100%;border-bottom-right-radius:100%}.ngxsmk-day-cell.start-date.end-date{border-radius:50px}.ngxsmk-day-cell.disabled{background-color:transparent!important;color:#4b5563;cursor:not-allowed;pointer-events:none;opacity:.5}.ngxsmk-day-cell.empty{opacity:1}.ngxsmk-day-cell.empty .ngxsmk-day-number{color:var(--datepicker-subtle-text-color)}:host(.dark-theme) .ngxsmk-day-cell.empty .ngxsmk-day-number{color:#6b7280}.ngxsmk-day-cell.today .ngxsmk-day-number{border:1px solid var(--datepicker-primary-color)}@media(min-width:600px){.ngxsmk-datepicker-container{display:flex;flex-direction:row}.ngxsmk-calendar-container{padding:var(--datepicker-spacing-lg);box-shadow:0 4px 10px #0000001a;width:auto;border-radius:10px;min-height:280px}.ngxsmk-ranges-container{width:180px;padding:var(--datepicker-spacing-lg);border-bottom:none;background:var(--datepicker-background);border-radius:10px 0 0 10px}.ngxsmk-ranges-container ul{flex-direction:column;justify-content:flex-start;gap:0}.ngxsmk-ranges-container li{padding:var(--datepicker-spacing-sm);margin-bottom:var(--datepicker-spacing-sm);border:none;font-size:var(--datepicker-font-size-lg)}.ngxsmk-header{margin-bottom:var(--datepicker-spacing-md);gap:var(--datepicker-spacing-xs)}.ngxsmk-month-year-selects app-custom-select.month-select{--custom-select-width: 120px}.ngxsmk-month-year-selects app-custom-select.year-select{--custom-select-width: 90px}.ngxsmk-nav-button{padding:var(--datepicker-spacing-sm)}.ngxsmk-nav-button svg{width:18px;height:18px}.ngxsmk-day-name{font-size:var(--datepicker-font-size-base);padding:var(--datepicker-spacing-sm) 0}.ngxsmk-day-cell{height:42px}.ngxsmk-day-number{width:38px;height:38px;font-size:var(--datepicker-font-size-lg)}.ngxsmk-time-selection{margin-top:var(--datepicker-spacing-lg);padding-top:var(--datepicker-spacing-md)}.ngxsmk-time-selection app-custom-select{--custom-select-width: 60px;height:30px}.ngxsmk-time-selection app-custom-select.ampm-select{--custom-select-width: 70px}.ngxsmk-time-selection .hour-select,.ngxsmk-time-selection .minute-select{--custom-select-width: 60px;--custom-select-height: 30px}.ngxsmk-time-selection .ampm-select{--custom-select-width: 70px;--custom-select-height: 30px}}@media(prefers-reduced-motion:reduce){.ngxsmk-days-grid{transition:none}.ngxsmk-days-grid.animate-forward,.ngxsmk-days-grid.animate-backward{transform:none;opacity:1}}@media(prefers-contrast:high){:host{--datepicker-border-color: #000000;--datepicker-text-color: #000000;--datepicker-subtle-text-color: #666666}.ngxsmk-day-cell.disabled{opacity:.3}}@media print{.ngxsmk-datepicker-wrapper{display:none}}.ngxsmk-day-cell:focus-visible .ngxsmk-day-number{outline:2px solid var(--datepicker-primary-color);outline-offset:2px}.ngxsmk-nav-button:focus-visible,.ngxsmk-clear-button:focus-visible,.ngxsmk-clear-button-footer:focus-visible,.ngxsmk-close-button:focus-visible{outline:2px solid var(--datepicker-primary-color);outline-offset:2px}.ngxsmk-day-cell,.ngxsmk-nav-button,.ngxsmk-clear-button{will-change:auto;transform:translateZ(0)}.ngxsmk-days-grid{contain:layout style paint;transform:translateZ(0)}.ngxsmk-day-cell{contain:layout style}.ngxsmk-day-number{contain:layout style paint}@media(max-width:480px){.ngxsmk-day-cell{height:28px}.ngxsmk-day-number{width:26px;height:26px;font-size:var(--datepicker-font-size-sm)}.ngxsmk-day-name{font-size:var(--datepicker-font-size-sm);padding:var(--datepicker-spacing-xs) 0}.ngxsmk-calendar-container{padding:var(--datepicker-spacing-sm)}.ngxsmk-header{margin-bottom:var(--datepicker-spacing-sm)}.ngxsmk-input-group{min-width:120px}.ngxsmk-display-input{font-size:var(--datepicker-font-size-sm);padding:var(--datepicker-spacing-xs)}.ngxsmk-clear-button{padding:0 var(--datepicker-spacing-xs)}.ngxsmk-clear-button svg{width:12px;height:12px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: CustomSelectComponent, selector: "ngxsmk-custom-select", inputs: ["options", "value", "disabled"], outputs: ["valueChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1103
+ `, isInline: true, styles: [":host{--datepicker-primary-color: #6d28d9;--datepicker-primary-contrast: #ffffff;--datepicker-range-background: #f5f3ff;--datepicker-background: #ffffff;--datepicker-text-color: #222428;--datepicker-subtle-text-color: #9ca3af;--datepicker-border-color: #e9e9e9;--datepicker-hover-background: #f0f0f0;--datepicker-font-size-base: 14px;--datepicker-font-size-sm: 12px;--datepicker-font-size-lg: 16px;--datepicker-font-size-xl: 18px;--datepicker-line-height: 1.4;--datepicker-spacing-xs: 4px;--datepicker-spacing-sm: 8px;--datepicker-spacing-md: 12px;--datepicker-spacing-lg: 16px;--datepicker-spacing-xl: 20px;display:inline-block;position:relative}:host(.dark-theme){--datepicker-range-background: rgba(139, 92, 246, .2);--datepicker-background: #1f2937;--datepicker-text-color: #d1d5db;--datepicker-subtle-text-color: #6b7280;--datepicker-border-color: #4b5563;--datepicker-hover-background: #374151}.ngxsmk-datepicker-wrapper{position:relative}.ngxsmk-input-group{display:flex;align-items:center;cursor:pointer;width:100%;min-width:150px;border:1px solid var(--datepicker-border-color, #ccc);border-radius:4px;background:var(--datepicker-background);transition:all .2s ease;position:relative;overflow:hidden}.ngxsmk-input-group:focus-within{border-color:var(--datepicker-primary-color);box-shadow:0 0 0 2px #6d28d91a}.ngxsmk-input-group:hover:not(.disabled){border-color:var(--datepicker-primary-color)}.ngxsmk-input-group.has-value{border-color:var(--datepicker-primary-color)}.ngxsmk-input-group.error{border-color:#dc2626;box-shadow:0 0 0 2px #dc26261a}.ngxsmk-input-group.success{border-color:#16a34a;box-shadow:0 0 0 2px #16a34a1a}.ngxsmk-input-group.disabled{cursor:not-allowed;opacity:.7}.ngxsmk-display-input{flex-grow:1;padding:var(--datepicker-spacing-sm) var(--datepicker-spacing-sm);font-size:var(--datepicker-font-size-base);line-height:var(--datepicker-line-height);color:var(--datepicker-text-color, #333);background:transparent;border:none;outline:none;cursor:pointer;transition:all .2s ease;min-height:20px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ngxsmk-display-input:disabled{background:var(--datepicker-hover-background, #f0f0f0);cursor:not-allowed;opacity:.6}.ngxsmk-display-input:focus{outline:2px solid var(--datepicker-primary-color);outline-offset:2px}.ngxsmk-display-input::placeholder{color:var(--datepicker-subtle-text-color);font-style:italic}.ngxsmk-input-group:focus-within .ngxsmk-display-input{color:var(--datepicker-primary-color)}.ngxsmk-input-group:hover:not(.disabled) .ngxsmk-display-input{color:var(--datepicker-text-color)}.ngxsmk-input-group.has-value .ngxsmk-display-input{font-weight:500;color:var(--datepicker-text-color)}.ngxsmk-input-group:not(.has-value) .ngxsmk-display-input{color:var(--datepicker-subtle-text-color)}.ngxsmk-input-group.error .ngxsmk-display-input{color:#dc2626;border-color:#dc2626}.ngxsmk-input-group.success .ngxsmk-display-input{color:#16a34a;border-color:#16a34a}.ngxsmk-input-group.compact{min-width:120px;padding:var(--datepicker-spacing-xs)}.ngxsmk-input-group.compact .ngxsmk-display-input{font-size:var(--datepicker-font-size-sm);padding:var(--datepicker-spacing-xs)}.ngxsmk-input-group.large{min-width:200px;padding:var(--datepicker-spacing-md)}.ngxsmk-input-group.large .ngxsmk-display-input{font-size:var(--datepicker-font-size-lg);padding:var(--datepicker-spacing-md)}.ngxsmk-input-group.with-icon .ngxsmk-display-input{padding-left:32px}.ngxsmk-input-group .ngxsmk-input-icon{position:absolute;left:var(--datepicker-spacing-sm);top:50%;transform:translateY(-50%);color:var(--datepicker-subtle-text-color);pointer-events:none}.ngxsmk-input-group.loading .ngxsmk-display-input{color:var(--datepicker-subtle-text-color);cursor:wait}.ngxsmk-input-group.loading:after{content:\"\";position:absolute;right:var(--datepicker-spacing-sm);top:50%;transform:translateY(-50%);width:16px;height:16px;border:2px solid var(--datepicker-border-color);border-top:2px solid var(--datepicker-primary-color);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{0%{transform:translateY(-50%) rotate(0)}to{transform:translateY(-50%) rotate(360deg)}}.ngxsmk-clear-button{background:none;border:none;padding:0 8px;cursor:pointer;color:var(--datepicker-subtle-text-color);line-height:1}.ngxsmk-clear-button svg{width:14px;height:14px}.ngxsmk-clear-button:hover{color:var(--datepicker-text-color)}.ngxsmk-popover-container{position:absolute;top:100%;left:0;z-index:10000;margin-top:8px}.ngxsmk-popover-container.ngxsmk-inline-container{position:static;margin-top:0}.ngxsmk-datepicker-wrapper.ngxsmk-inline-mode{display:block}.ngxsmk-datepicker-wrapper.ngxsmk-inline-mode .ngxsmk-datepicker-container{box-shadow:none}.ngxsmk-footer{display:flex;justify-content:flex-end;gap:8px;margin-top:12px;padding-top:8px;border-top:1px solid var(--datepicker-border-color)}.ngxsmk-clear-button-footer,.ngxsmk-close-button{padding:var(--datepicker-spacing-sm) var(--datepicker-spacing-md);border-radius:6px;font-size:var(--datepicker-font-size-sm);line-height:var(--datepicker-line-height);cursor:pointer;transition:background-color .2s;border:1px solid var(--datepicker-border-color)}.ngxsmk-clear-button-footer{background:none;color:var(--datepicker-subtle-text-color)}.ngxsmk-close-button{background-color:var(--datepicker-primary-color);color:var(--datepicker-primary-contrast);border-color:var(--datepicker-primary-color)}.ngxsmk-close-button:hover:not(:disabled){opacity:.9}.ngxsmk-clear-button-footer:hover:not(:disabled){background-color:var(--datepicker-hover-background)}.ngxsmk-datepicker-container{display:flex;flex-direction:column;width:100%}.ngxsmk-calendar-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:var(--datepicker-font-size-base);line-height:var(--datepicker-line-height);border-radius:10px;padding:var(--datepicker-spacing-md);background:var(--datepicker-background);box-shadow:0 4px 10px #0000001a}.ngxsmk-ranges-container{width:100%;padding:var(--datepicker-spacing-md);border-right:none;background:var(--datepicker-hover-background);border-radius:10px}.ngxsmk-ranges-container ul{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;list-style:none;padding:0;margin:0}.ngxsmk-ranges-container li{padding:var(--datepicker-spacing-sm) var(--datepicker-spacing-sm);margin-bottom:0;font-size:var(--datepicker-font-size-sm);line-height:var(--datepicker-line-height);border:1px solid var(--datepicker-border-color);border-radius:6px;cursor:pointer;transition:background-color .15s ease;flex-shrink:0}.ngxsmk-ranges-container li:hover{background-color:var(--datepicker-hover-background)}.ngxsmk-ranges-container li.disabled{cursor:not-allowed;opacity:.5;background-color:transparent!important;color:var(--datepicker-subtle-text-color, #9ca3af)}.ngxsmk-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;position:relative;z-index:2;gap:4px}.ngxsmk-month-year-selects{display:flex;gap:4px}.ngxsmk-month-year-selects app-custom-select.month-select{--custom-select-width: 100px}.ngxsmk-month-year-selects app-custom-select.year-select{--custom-select-width: 75px}.ngxsmk-nav-buttons{display:flex}.ngxsmk-nav-button{padding:6px;background:none;border:none;cursor:pointer;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;color:var(--datepicker-text-color)}.ngxsmk-nav-button:hover:not(:disabled){background-color:var(--datepicker-hover-background)}.ngxsmk-nav-button:disabled{cursor:not-allowed;opacity:.5}.ngxsmk-nav-button svg{width:16px;height:16px}.ngxsmk-days-grid{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;gap:0}.ngxsmk-day-name{font-size:var(--datepicker-font-size-sm);padding:var(--datepicker-spacing-sm) 0;color:var(--datepicker-subtle-text-color);font-weight:600;line-height:var(--datepicker-line-height)}.ngxsmk-day-cell{height:32px;position:relative;display:flex;justify-content:center;align-items:center;cursor:pointer;border-radius:0}.ngxsmk-day-cell.holiday .ngxsmk-day-number{color:var(--datepicker-primary-color);text-decoration:underline dotted}.ngxsmk-day-number{width:30px;height:30px;display:flex;justify-content:center;align-items:center;border-radius:50%;color:var(--datepicker-text-color);font-size:var(--datepicker-font-size-base);line-height:var(--datepicker-line-height);position:relative;z-index:1}.ngxsmk-time-selection{display:flex;align-items:center;gap:var(--datepicker-spacing-xs);flex-wrap:wrap;margin-top:var(--datepicker-spacing-md);padding-top:var(--datepicker-spacing-sm);border-top:1px solid var(--datepicker-border-color)}.ngxsmk-time-label{font-size:var(--datepicker-font-size-base);line-height:var(--datepicker-line-height);color:var(--datepicker-subtle-text-color);margin-right:var(--datepicker-spacing-xs)}.ngxsmk-time-separator{font-weight:600;color:var(--datepicker-text-color)}.ngxsmk-time-selection app-custom-select{--custom-select-width: 75px;height:28px}.ngxsmk-time-selection app-custom-select.ampm-select{--custom-select-width: 75px}.ngxsmk-time-selection .hour-select,.ngxsmk-time-selection .minute-select,.ngxsmk-time-selection .ampm-select{--custom-select-width: 75px;--custom-select-height: 28px}.ngxsmk-time-selection app-custom-select:hover{border-color:var(--datepicker-primary-color)}.ngxsmk-time-selection app-custom-select:focus-within{border-color:var(--datepicker-primary-color);box-shadow:0 0 0 2px #6d28d933}.ngxsmk-time-selection .time-select-compact{--custom-select-width: 60px;--custom-select-height: 24px;font-size:var(--datepicker-font-size-sm)}.ngxsmk-time-selection .time-select-large{--custom-select-width: 90px;--custom-select-height: 36px;font-size:var(--datepicker-font-size-lg)}.ngxsmk-time-selection .time-select-disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.ngxsmk-time-selection app-custom-select{transition:border-color .2s ease,box-shadow .2s ease}.ngxsmk-time-selection app-custom-select.ngxsmk-time-select-animated{transition:all .2s cubic-bezier(.4,0,.2,1)}.ngxsmk-day-cell:not(.disabled):not(.empty):hover .ngxsmk-day-number{background-color:var(--datepicker-hover-background);color:var(--datepicker-primary-color)}.ngxsmk-day-cell.start-date .ngxsmk-day-number,.ngxsmk-day-cell.end-date .ngxsmk-day-number,.ngxsmk-day-cell.selected .ngxsmk-day-number,.ngxsmk-day-cell.multiple-selected .ngxsmk-day-number{background-color:var(--datepicker-primary-color);color:var(--datepicker-primary-contrast)}.ngxsmk-day-cell.multiple-selected .ngxsmk-day-number{border:1px dashed var(--datepicker-primary-contrast)}.ngxsmk-day-cell.multiple-selected:hover .ngxsmk-day-number{background-color:var(--datepicker-primary-color);color:var(--datepicker-primary-contrast)}.ngxsmk-day-cell.in-range,.ngxsmk-day-cell.start-date,.ngxsmk-day-cell.end-date,.ngxsmk-day-cell.preview-range{background-color:var(--datepicker-range-background)}.ngxsmk-day-cell.start-date{border-top-left-radius:100%;border-bottom-left-radius:100%}.ngxsmk-day-cell.end-date{border-top-right-radius:100%;border-bottom-right-radius:100%}.ngxsmk-day-cell.start-date.end-date{border-radius:50px}.ngxsmk-day-cell.disabled{background-color:transparent!important;color:#4b5563;cursor:not-allowed;pointer-events:none;opacity:.5}.ngxsmk-day-cell.empty{opacity:1}.ngxsmk-day-cell.empty .ngxsmk-day-number{color:var(--datepicker-subtle-text-color)}:host(.dark-theme) .ngxsmk-day-cell.empty .ngxsmk-day-number{color:#6b7280}.ngxsmk-day-cell.today .ngxsmk-day-number{border:1px solid var(--datepicker-primary-color)}@media(min-width:600px){.ngxsmk-datepicker-container{display:flex;flex-direction:row}.ngxsmk-calendar-container{padding:var(--datepicker-spacing-lg);box-shadow:0 4px 10px #0000001a;width:auto;border-radius:10px;min-height:280px}.ngxsmk-ranges-container{width:180px;padding:var(--datepicker-spacing-lg);border-bottom:none;background:var(--datepicker-background);border-radius:10px 0 0 10px}.ngxsmk-ranges-container ul{flex-direction:column;justify-content:flex-start;gap:0}.ngxsmk-ranges-container li{padding:var(--datepicker-spacing-sm);margin-bottom:var(--datepicker-spacing-sm);border:none;font-size:var(--datepicker-font-size-lg)}.ngxsmk-header{margin-bottom:var(--datepicker-spacing-md);gap:var(--datepicker-spacing-xs)}.ngxsmk-month-year-selects app-custom-select.month-select{--custom-select-width: 120px}.ngxsmk-month-year-selects app-custom-select.year-select{--custom-select-width: 90px}.ngxsmk-nav-button{padding:var(--datepicker-spacing-sm)}.ngxsmk-nav-button svg{width:18px;height:18px}.ngxsmk-day-name{font-size:var(--datepicker-font-size-base);padding:var(--datepicker-spacing-sm) 0}.ngxsmk-day-cell{height:42px}.ngxsmk-day-number{width:38px;height:38px;font-size:var(--datepicker-font-size-lg)}.ngxsmk-time-selection{margin-top:var(--datepicker-spacing-lg);padding-top:var(--datepicker-spacing-md)}.ngxsmk-time-selection app-custom-select{--custom-select-width: 60px;height:30px}.ngxsmk-time-selection app-custom-select.ampm-select{--custom-select-width: 70px}.ngxsmk-time-selection .hour-select,.ngxsmk-time-selection .minute-select{--custom-select-width: 60px;--custom-select-height: 30px}.ngxsmk-time-selection .ampm-select{--custom-select-width: 70px;--custom-select-height: 30px}}@media(prefers-reduced-motion:reduce){.ngxsmk-days-grid{transition:none}.ngxsmk-days-grid.animate-forward,.ngxsmk-days-grid.animate-backward{transform:none;opacity:1}}@media(prefers-contrast:high){:host{--datepicker-border-color: #000000;--datepicker-text-color: #000000;--datepicker-subtle-text-color: #666666}.ngxsmk-day-cell.disabled{opacity:.3}}@media print{.ngxsmk-datepicker-wrapper{display:none}}.ngxsmk-day-cell:focus-visible .ngxsmk-day-number{outline:2px solid var(--datepicker-primary-color);outline-offset:2px}.ngxsmk-nav-button:focus-visible,.ngxsmk-clear-button:focus-visible,.ngxsmk-clear-button-footer:focus-visible,.ngxsmk-close-button:focus-visible{outline:2px solid var(--datepicker-primary-color);outline-offset:2px}.ngxsmk-day-cell,.ngxsmk-nav-button,.ngxsmk-clear-button{will-change:auto;transform:translateZ(0)}.ngxsmk-days-grid{contain:layout style paint;transform:translateZ(0)}.ngxsmk-day-cell{contain:layout style}.ngxsmk-day-number{contain:layout style paint}@media(max-width:480px){.ngxsmk-day-cell{height:28px}.ngxsmk-day-number{width:26px;height:26px;font-size:var(--datepicker-font-size-sm)}.ngxsmk-day-name{font-size:var(--datepicker-font-size-sm);padding:var(--datepicker-spacing-xs) 0}.ngxsmk-calendar-container{padding:var(--datepicker-spacing-sm)}.ngxsmk-header{margin-bottom:var(--datepicker-spacing-sm)}.ngxsmk-input-group{min-width:120px}.ngxsmk-display-input{font-size:var(--datepicker-font-size-sm);padding:var(--datepicker-spacing-xs)}.ngxsmk-clear-button{padding:0 var(--datepicker-spacing-xs)}.ngxsmk-clear-button svg{width:12px;height:12px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: CustomSelectComponent, selector: "ngxsmk-custom-select", inputs: ["options", "value", "disabled"], outputs: ["valueChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1125
1104
  }
1126
1105
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0-rc.1", ngImport: i0, type: NgxsmkDatepickerComponent, decorators: [{
1127
1106
  type: Component,
@@ -1130,24 +1109,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0-rc.1", ng
1130
1109
  useExisting: forwardRef(() => NgxsmkDatepickerComponent),
1131
1110
  multi: true
1132
1111
  }], changeDetection: ChangeDetectionStrategy.OnPush, template: `
1133
- <div class="ngxsmk-datepicker-wrapper" [class.ngxsmk-inline-mode]="isInlineMode">
1112
+ <div class="ngxsmk-datepicker-wrapper" [class.ngxsmk-inline-mode]="isInlineMode" [ngClass]="classes?.wrapper">
1134
1113
  @if (!isInlineMode) {
1135
- <div class="ngxsmk-input-group" (click)="toggleCalendar()" [class.disabled]="disabled">
1114
+ <div class="ngxsmk-input-group" (click)="toggleCalendar()" [class.disabled]="disabled" role="button" [attr.aria-disabled]="disabled" aria-haspopup="dialog" [ngClass]="classes?.inputGroup">
1136
1115
  <input type="text"
1137
1116
  [value]="displayValue"
1138
1117
  [placeholder]="placeholder"
1139
1118
  readonly
1140
1119
  [disabled]="disabled"
1141
- class="ngxsmk-display-input">
1142
- <button type="button" class="ngxsmk-clear-button" (click)="clearValue($event)" [disabled]="disabled" *ngIf="displayValue">
1120
+ class="ngxsmk-display-input"
1121
+ [ngClass]="classes?.input">
1122
+ <button type="button" class="ngxsmk-clear-button" (click)="clearValue($event)" [disabled]="disabled" *ngIf="displayValue" [attr.aria-label]="clearAriaLabel" [title]="clearLabel" [ngClass]="classes?.clearBtn">
1143
1123
  <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>
1144
1124
  </button>
1145
1125
  </div>
1146
1126
  }
1147
1127
 
1148
1128
  @if (isCalendarVisible) {
1149
- <div class="ngxsmk-popover-container" [class.ngxsmk-inline-container]="isInlineMode">
1150
- <div class="ngxsmk-datepicker-container">
1129
+ <div class="ngxsmk-popover-container" [class.ngxsmk-inline-container]="isInlineMode" [ngClass]="classes?.popover">
1130
+ <div class="ngxsmk-datepicker-container" [ngClass]="classes?.container">
1151
1131
  @if (showRanges && rangesArray.length > 0 && mode === 'range') {
1152
1132
  <div class="ngxsmk-ranges-container">
1153
1133
  <ul>
@@ -1157,21 +1137,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0-rc.1", ng
1157
1137
  </ul>
1158
1138
  </div>
1159
1139
  }
1160
- <div class="ngxsmk-calendar-container">
1161
- <div class="ngxsmk-header">
1140
+ <div class="ngxsmk-calendar-container" [ngClass]="classes?.calendar">
1141
+ <div class="ngxsmk-header" [ngClass]="classes?.header">
1162
1142
  <div class="ngxsmk-month-year-selects">
1163
1143
  <ngxsmk-custom-select class="month-select" [options]="monthOptions"
1164
1144
  [(value)]="currentMonth" [disabled]="disabled"></ngxsmk-custom-select>
1165
1145
  <ngxsmk-custom-select class="year-select" [options]="yearOptions" [(value)]="currentYear" [disabled]="disabled"></ngxsmk-custom-select>
1166
1146
  </div>
1167
1147
  <div class="ngxsmk-nav-buttons">
1168
- <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(-1)" [disabled]="disabled || isBackArrowDisabled">
1148
+ <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(-1)" [disabled]="disabled || isBackArrowDisabled" [attr.aria-label]="prevMonthAriaLabel" [title]="prevMonthAriaLabel" [ngClass]="classes?.navPrev">
1169
1149
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
1170
1150
  <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48"
1171
1151
  d="M328 112L184 256l144 144"/>
1172
1152
  </svg>
1173
1153
  </button>
1174
- <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(1)" [disabled]="disabled">
1154
+ <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(1)" [disabled]="disabled" [attr.aria-label]="nextMonthAriaLabel" [title]="nextMonthAriaLabel" [ngClass]="classes?.navNext">
1175
1155
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
1176
1156
  <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48"
1177
1157
  d="M184 112l144 144-144 144"/>
@@ -1185,7 +1165,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0-rc.1", ng
1185
1165
  <div class="ngxsmk-day-name">{{ day }}</div>
1186
1166
  }
1187
1167
  @for (day of daysInMonth; track trackByDay($index, day)) {
1188
- <div class="ngxsmk-day-cell"
1168
+ <div class="ngxsmk-day-cell" [ngClass]="classes?.dayCell"
1189
1169
  [class.empty]="!isCurrentMonthMemo(day)" [class.disabled]="isDateDisabledMemo(day)"
1190
1170
  [class.today]="isSameDayMemo(day, today)"
1191
1171
  [class.holiday]="isHolidayMemo(day)"
@@ -1232,12 +1212,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0-rc.1", ng
1232
1212
  </div>
1233
1213
  }
1234
1214
 
1235
- <div class="ngxsmk-footer" *ngIf="!isInlineMode">
1236
- <button type="button" class="ngxsmk-clear-button-footer" (click)="clearValue($event)" [disabled]="disabled">
1237
- Clear
1215
+ <div class="ngxsmk-footer" *ngIf="!isInlineMode" [ngClass]="classes?.footer">
1216
+ <button type="button" class="ngxsmk-clear-button-footer" (click)="clearValue($event)" [disabled]="disabled" [attr.aria-label]="clearAriaLabel" [ngClass]="classes?.clearBtn">
1217
+ {{ clearLabel }}
1238
1218
  </button>
1239
- <button type="button" class="ngxsmk-close-button" (click)="isCalendarOpen = false" [disabled]="disabled">
1240
- Close
1219
+ <button type="button" class="ngxsmk-close-button" (click)="isCalendarOpen = false" [disabled]="disabled" [attr.aria-label]="closeAriaLabel" [ngClass]="classes?.closeBtn">
1220
+ {{ closeLabel }}
1241
1221
  </button>
1242
1222
  </div>
1243
1223
  </div>
@@ -1266,6 +1246,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0-rc.1", ng
1266
1246
  type: Input
1267
1247
  }], inline: [{
1268
1248
  type: Input
1249
+ }], clearLabel: [{
1250
+ type: Input
1251
+ }], closeLabel: [{
1252
+ type: Input
1253
+ }], prevMonthAriaLabel: [{
1254
+ type: Input
1255
+ }], nextMonthAriaLabel: [{
1256
+ type: Input
1257
+ }], clearAriaLabel: [{
1258
+ type: Input
1259
+ }], closeAriaLabel: [{
1260
+ type: Input
1261
+ }], weekStart: [{
1262
+ type: Input
1263
+ }], yearRange: [{
1264
+ type: Input
1269
1265
  }], value: [{
1270
1266
  type: Input
1271
1267
  }], startAt: [{
@@ -1277,6 +1273,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0-rc.1", ng
1277
1273
  }], isDarkMode: [{
1278
1274
  type: HostBinding,
1279
1275
  args: ['class.dark-theme']
1276
+ }], classes: [{
1277
+ type: Input
1280
1278
  }], disabledState: [{
1281
1279
  type: Input
1282
1280
  }], valueChange: [{