ngxsmk-datepicker 1.5.0 → 1.7.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 {
@@ -354,6 +318,7 @@ class NgxsmkDatepickerComponent {
354
318
  this.inline = false;
355
319
  this.isCalendarOpen = false;
356
320
  this._internalValue = null;
321
+ this._value = null;
357
322
  this._startAtDate = null;
358
323
  this._locale = 'en-US';
359
324
  this.theme = 'light';
@@ -394,6 +359,12 @@ class NgxsmkDatepickerComponent {
394
359
  this.cdr = inject(ChangeDetectorRef);
395
360
  this.dateComparator = createDateComparator();
396
361
  }
362
+ set value(val) {
363
+ this._value = val;
364
+ }
365
+ get value() {
366
+ return this._internalValue;
367
+ }
397
368
  set startAt(value) { this._startAtDate = this._normalizeDate(value); }
398
369
  set locale(value) { this._locale = value; }
399
370
  get locale() { return this._locale; }
@@ -494,6 +465,7 @@ class NgxsmkDatepickerComponent {
494
465
  this._internalValue = val;
495
466
  this.initializeValue(val);
496
467
  this.generateCalendar();
468
+ this.cdr.markForCheck();
497
469
  }
498
470
  registerOnChange(fn) {
499
471
  this.onChange = fn;
@@ -579,8 +551,10 @@ class NgxsmkDatepickerComponent {
579
551
  }
580
552
  this.update12HourState(this.currentHour);
581
553
  }
582
- if (this._internalValue) {
583
- this.initializeValue(this._internalValue);
554
+ const initialValue = this._value !== null ? this._value : this._internalValue;
555
+ if (initialValue) {
556
+ this.initializeValue(initialValue);
557
+ this._internalValue = initialValue;
584
558
  }
585
559
  else {
586
560
  this.initializeValue(null);
@@ -591,18 +565,25 @@ class NgxsmkDatepickerComponent {
591
565
  if (changes['locale']) {
592
566
  this.generateLocaleData();
593
567
  this.generateCalendar();
568
+ this.cdr.markForCheck();
594
569
  }
595
570
  if (changes['minuteInterval']) {
596
571
  this.generateTimeOptions();
597
572
  this.currentMinute = Math.floor(this.currentMinute / this.minuteInterval) * this.minuteInterval;
598
573
  this.onTimeChange();
599
574
  }
600
- if (changes['value'] && changes['value'].currentValue !== changes['value'].previousValue) {
601
- this.writeValue(changes['value'].currentValue);
575
+ if (changes['value']) {
576
+ const newValue = changes['value'].currentValue;
577
+ if (!this.isValueEqual(newValue, this._internalValue)) {
578
+ this._internalValue = newValue;
579
+ this.initializeValue(newValue);
580
+ this.generateCalendar();
581
+ this.cdr.markForCheck();
582
+ }
602
583
  }
603
- // Rerun calendar generation if provider changes to refresh disabled states
604
584
  if (changes['holidayProvider'] || changes['disableHolidays'] || changes['disabledDates']) {
605
585
  this.generateCalendar();
586
+ this.cdr.markForCheck();
606
587
  }
607
588
  if (changes['startAt']) {
608
589
  if (!this._internalValue && this._startAtDate) {
@@ -610,24 +591,29 @@ class NgxsmkDatepickerComponent {
610
591
  this._currentMonth = this.currentDate.getMonth();
611
592
  this._currentYear = this.currentDate.getFullYear();
612
593
  this.generateCalendar();
594
+ this.cdr.markForCheck();
613
595
  }
614
596
  }
615
- // Handle minDate changes - if minDate is set and is in the future,
616
- // and we don't have a current value, update the view to show minDate's month
617
- if (changes['minDate'] && !this._internalValue) {
618
- if (this._minDate) {
597
+ if (changes['minDate']) {
598
+ this.generateCalendar();
599
+ this.cdr.markForCheck();
600
+ if (!this._internalValue && this._minDate) {
619
601
  const today = new Date();
620
602
  const minDateOnly = getStartOfDay(this._minDate);
621
603
  const todayOnly = getStartOfDay(today);
622
- // If minDate is in the future, update the view to show minDate's month
623
604
  if (minDateOnly.getTime() > todayOnly.getTime()) {
624
605
  this.currentDate = new Date(this._minDate);
625
606
  this._currentMonth = this.currentDate.getMonth();
626
607
  this._currentYear = this.currentDate.getFullYear();
627
608
  this.generateCalendar();
609
+ this.cdr.markForCheck();
628
610
  }
629
611
  }
630
612
  }
613
+ if (changes['maxDate']) {
614
+ this.generateCalendar();
615
+ this.cdr.markForCheck();
616
+ }
631
617
  }
632
618
  get24Hour(displayHour, isPm) {
633
619
  return get24Hour(displayHour, isPm);
@@ -663,19 +649,15 @@ class NgxsmkDatepickerComponent {
663
649
  initialDate = this.selectedDates.length > 0 ? this.selectedDates[this.selectedDates.length - 1] : null;
664
650
  }
665
651
  }
666
- // Determine the initial view date
667
652
  let viewCenterDate = initialDate || this._startAtDate;
668
- // If no specific date is set and minDate is in the future, use minDate's month
669
653
  if (!viewCenterDate && this._minDate) {
670
654
  const today = new Date();
671
655
  const minDateOnly = getStartOfDay(this._minDate);
672
656
  const todayOnly = getStartOfDay(today);
673
- // If minDate is in the future, use minDate as the initial view
674
657
  if (minDateOnly.getTime() > todayOnly.getTime()) {
675
658
  viewCenterDate = this._minDate;
676
659
  }
677
660
  }
678
- // Fallback to current date if no other date is determined
679
661
  if (!viewCenterDate) {
680
662
  viewCenterDate = new Date();
681
663
  }
@@ -692,9 +674,33 @@ class NgxsmkDatepickerComponent {
692
674
  _normalizeDate(date) {
693
675
  return normalizeDate(date);
694
676
  }
677
+ isValueEqual(val1, val2) {
678
+ if (val1 === val2)
679
+ return true;
680
+ if (val1 === null || val2 === null)
681
+ return val1 === val2;
682
+ if (val1 instanceof Date && val2 instanceof Date) {
683
+ return val1.getTime() === val2.getTime();
684
+ }
685
+ if (typeof val1 === 'object' && typeof val2 === 'object' &&
686
+ 'start' in val1 && 'end' in val1 && 'start' in val2 && 'end' in val2) {
687
+ const r1 = val1;
688
+ const r2 = val2;
689
+ return r1.start.getTime() === r2.start.getTime() &&
690
+ r1.end.getTime() === r2.end.getTime();
691
+ }
692
+ if (Array.isArray(val1) && Array.isArray(val2)) {
693
+ if (val1.length !== val2.length)
694
+ return false;
695
+ return val1.every((d1, i) => {
696
+ const d2 = val2[i];
697
+ return d1 && d2 && d1.getTime() === d2.getTime();
698
+ });
699
+ }
700
+ return false;
701
+ }
695
702
  parseDateString(dateString) {
696
703
  try {
697
- // Handle MM/DD/YYYY format
698
704
  const date = new Date(dateString);
699
705
  if (isNaN(date.getTime())) {
700
706
  return null;
@@ -733,14 +739,12 @@ class NgxsmkDatepickerComponent {
733
739
  this.action.emit({ type: 'rangeSelected', payload: { start: this.startDate, end: this.endDate, key: this.rangesArray.find(r => r.value === range)?.key } });
734
740
  this.cdr.markForCheck();
735
741
  }
736
- // NEW: Check if a date is a holiday
737
742
  isHoliday(date) {
738
743
  if (!date || !this.holidayProvider)
739
744
  return false;
740
745
  const dateOnly = getStartOfDay(date);
741
746
  return this.holidayProvider.isHoliday(dateOnly);
742
747
  }
743
- // NEW: Get holiday label
744
748
  getHolidayLabel(date) {
745
749
  if (!date || !this.holidayProvider || !this.isHoliday(date))
746
750
  return null;
@@ -750,7 +754,6 @@ class NgxsmkDatepickerComponent {
750
754
  if (!date)
751
755
  return false;
752
756
  const dateOnly = getStartOfDay(date);
753
- // 1. Check disabled dates array
754
757
  if (this.disabledDates.length > 0) {
755
758
  for (const disabledDate of this.disabledDates) {
756
759
  let parsedDate;
@@ -765,11 +768,9 @@ class NgxsmkDatepickerComponent {
765
768
  }
766
769
  }
767
770
  }
768
- // 2. Check holiday provider for disabling
769
771
  if (this.holidayProvider && this.disableHolidays && this.holidayProvider.isHoliday(dateOnly)) {
770
772
  return true;
771
773
  }
772
- // 3. Check min/max date
773
774
  if (this._minDate) {
774
775
  const minDateOnly = getStartOfDay(this._minDate);
775
776
  if (dateOnly.getTime() < minDateOnly.getTime())
@@ -780,7 +781,6 @@ class NgxsmkDatepickerComponent {
780
781
  if (dateOnly.getTime() > maxDateOnly.getTime())
781
782
  return true;
782
783
  }
783
- // 4. Check custom invalid date function
784
784
  return this.isInvalidDate(date);
785
785
  }
786
786
  isMultipleSelected(d) {
@@ -817,7 +817,6 @@ class NgxsmkDatepickerComponent {
817
817
  onDateClick(day) {
818
818
  if (!day || this.disabled)
819
819
  return;
820
- // Only check isDateDisabled for current month days
821
820
  if (this.isCurrentMonth(day) && this.isDateDisabled(day))
822
821
  return;
823
822
  const dateToToggle = getStartOfDay(day);
@@ -894,7 +893,6 @@ class NgxsmkDatepickerComponent {
894
893
  const lastDayOfMonth = new Date(year, month + 1, 0);
895
894
  const startDayOfWeek = firstDayOfMonth.getDay();
896
895
  const emptyCellCount = (startDayOfWeek - this.firstDayOfWeek + 7) % 7;
897
- // Add previous month's days instead of null values
898
896
  const previousMonth = month === 0 ? 11 : month - 1;
899
897
  const previousYear = month === 0 ? year - 1 : year;
900
898
  const lastDayOfPreviousMonth = new Date(previousYear, previousMonth + 1, 0);
@@ -921,15 +919,12 @@ class NgxsmkDatepickerComponent {
921
919
  changeMonth(delta) {
922
920
  if (this.disabled)
923
921
  return;
924
- // Check if going back is disabled due to minDate constraint
925
922
  if (delta < 0 && this.isBackArrowDisabled)
926
923
  return;
927
924
  const newDate = addMonths(this.currentDate, delta);
928
- // Update the data immediately (no animation)
929
925
  this.currentDate = newDate;
930
926
  this._currentMonth = newDate.getMonth();
931
927
  this._currentYear = newDate.getFullYear();
932
- // Generate new calendar view
933
928
  this.generateCalendar();
934
929
  this.action.emit({ type: 'monthChanged', payload: { delta: delta } });
935
930
  this.cdr.markForCheck();
@@ -953,139 +948,134 @@ class NgxsmkDatepickerComponent {
953
948
  return dTime > startTime && dTime < endTime;
954
949
  }
955
950
  ngOnDestroy() {
956
- // Clean up any subscriptions or timers if needed
957
951
  this.selectedDate = null;
958
952
  this.selectedDates = [];
959
953
  this.startDate = null;
960
954
  this.endDate = null;
961
955
  this.hoveredDate = null;
962
956
  this._internalValue = null;
963
- // Clear any cached data
964
- if (this.dateComparator && typeof this.dateComparator === 'function') {
965
- // Clear any internal caches if they exist
966
- }
967
957
  }
968
958
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0-rc.1", ngImport: i0, type: NgxsmkDatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
969
- 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", 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: [{
959
+ 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: [{
970
960
  provide: NG_VALUE_ACCESSOR,
971
961
  useExisting: forwardRef(() => NgxsmkDatepickerComponent),
972
962
  multi: true
973
- }], usesOnChanges: true, ngImport: i0, template: `
974
- <div class="ngxsmk-datepicker-wrapper" [class.ngxsmk-inline-mode]="isInlineMode">
975
- @if (!isInlineMode) {
976
- <div class="ngxsmk-input-group" (click)="toggleCalendar()" [class.disabled]="disabled">
977
- <input type="text"
978
- [value]="displayValue"
979
- [placeholder]="placeholder"
980
- readonly
981
- [disabled]="disabled"
982
- class="ngxsmk-display-input">
983
- <button type="button" class="ngxsmk-clear-button" (click)="clearValue($event)" [disabled]="disabled" *ngIf="displayValue">
984
- <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>
985
- </button>
986
- </div>
987
- }
988
-
989
- @if (isCalendarVisible) {
990
- <div class="ngxsmk-popover-container" [class.ngxsmk-inline-container]="isInlineMode">
991
- <div class="ngxsmk-datepicker-container">
992
- @if (showRanges && rangesArray.length > 0 && mode === 'range') {
993
- <div class="ngxsmk-ranges-container">
994
- <ul>
995
- @for (range of rangesArray; track trackByRange($index, range)) {
996
- <li (click)="selectRange(range.value)" [class.disabled]="disabled">{{ range.key }}</li>
997
- }
998
- </ul>
999
- </div>
1000
- }
1001
- <div class="ngxsmk-calendar-container">
1002
- <div class="ngxsmk-header">
1003
- <div class="ngxsmk-month-year-selects">
1004
- <ngxsmk-custom-select class="month-select" [options]="monthOptions"
1005
- [(value)]="currentMonth" [disabled]="disabled"></ngxsmk-custom-select>
1006
- <ngxsmk-custom-select class="year-select" [options]="yearOptions" [(value)]="currentYear" [disabled]="disabled"></ngxsmk-custom-select>
1007
- </div>
1008
- <div class="ngxsmk-nav-buttons">
1009
- <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(-1)" [disabled]="disabled || isBackArrowDisabled">
1010
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
1011
- <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48"
1012
- d="M328 112L184 256l144 144"/>
1013
- </svg>
1014
- </button>
1015
- <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(1)" [disabled]="disabled">
1016
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
1017
- <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48"
1018
- d="M184 112l144 144-144 144"/>
1019
- </svg>
1020
- </button>
1021
- </div>
1022
- </div>
1023
- <div class="ngxsmk-days-grid-wrapper">
1024
- <div class="ngxsmk-days-grid">
1025
- @for (day of weekDays; track day) {
1026
- <div class="ngxsmk-day-name">{{ day }}</div>
1027
- }
1028
- @for (day of daysInMonth; track trackByDay($index, day)) {
1029
- <div class="ngxsmk-day-cell"
1030
- [class.empty]="!isCurrentMonthMemo(day)" [class.disabled]="isDateDisabledMemo(day)"
1031
- [class.today]="isSameDayMemo(day, today)"
1032
- [class.holiday]="isHolidayMemo(day)"
1033
- [class.selected]="mode === 'single' && isSameDayMemo(day, selectedDate)"
1034
- [class.multiple-selected]="mode === 'multiple' && isMultipleSelected(day)"
1035
- [class.start-date]="mode === 'range' && isSameDayMemo(day, startDate)"
1036
- [class.end-date]="mode === 'range' && isSameDayMemo(day, endDate)"
1037
- [class.in-range]="mode === 'range' && isInRange(day)"
1038
- [class.preview-range]="isPreviewInRange(day)"
1039
- (click)="onDateClick(day)" (mouseenter)="onDateHover(day)">
1040
- @if (day) {
1041
- <div class="ngxsmk-day-number" [attr.title]="getHolidayLabelMemo(day)">{{ day | date : 'd' }}</div>
1042
- }
1043
- </div>
1044
- }
1045
- </div>
1046
- </div>
1047
-
1048
- @if (showTime) {
1049
- <div class="ngxsmk-time-selection">
1050
- <span class="ngxsmk-time-label">Time:</span>
1051
- <ngxsmk-custom-select
1052
- class="hour-select"
1053
- [options]="hourOptions"
1054
- [(value)]="currentDisplayHour"
1055
- (valueChange)="onTimeChange()"
1056
- [disabled]="disabled"
1057
- ></ngxsmk-custom-select>
1058
- <span class="ngxsmk-time-separator">:</span>
1059
- <ngxsmk-custom-select
1060
- class="minute-select"
1061
- [options]="minuteOptions"
1062
- [(value)]="currentMinute"
1063
- (valueChange)="onTimeChange()"
1064
- [disabled]="disabled"
1065
- ></ngxsmk-custom-select>
1066
- <ngxsmk-custom-select
1067
- class="ampm-select"
1068
- [options]="ampmOptions"
1069
- [(value)]="isPm"
1070
- (valueChange)="onTimeChange()"
1071
- [disabled]="disabled"
1072
- ></ngxsmk-custom-select>
1073
- </div>
1074
- }
1075
-
1076
- <div class="ngxsmk-footer" *ngIf="!isInlineMode">
1077
- <button type="button" class="ngxsmk-clear-button-footer" (click)="clearValue($event)" [disabled]="disabled">
1078
- Clear
1079
- </button>
1080
- <button type="button" class="ngxsmk-close-button" (click)="isCalendarOpen = false" [disabled]="disabled">
1081
- Close
1082
- </button>
1083
- </div>
1084
- </div>
1085
- </div>
1086
- </div>
1087
- }
1088
- </div>
963
+ }], usesOnChanges: true, ngImport: i0, template: `
964
+ <div class="ngxsmk-datepicker-wrapper" [class.ngxsmk-inline-mode]="isInlineMode">
965
+ @if (!isInlineMode) {
966
+ <div class="ngxsmk-input-group" (click)="toggleCalendar()" [class.disabled]="disabled">
967
+ <input type="text"
968
+ [value]="displayValue"
969
+ [placeholder]="placeholder"
970
+ readonly
971
+ [disabled]="disabled"
972
+ class="ngxsmk-display-input">
973
+ <button type="button" class="ngxsmk-clear-button" (click)="clearValue($event)" [disabled]="disabled" *ngIf="displayValue">
974
+ <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>
975
+ </button>
976
+ </div>
977
+ }
978
+
979
+ @if (isCalendarVisible) {
980
+ <div class="ngxsmk-popover-container" [class.ngxsmk-inline-container]="isInlineMode">
981
+ <div class="ngxsmk-datepicker-container">
982
+ @if (showRanges && rangesArray.length > 0 && mode === 'range') {
983
+ <div class="ngxsmk-ranges-container">
984
+ <ul>
985
+ @for (range of rangesArray; track trackByRange($index, range)) {
986
+ <li (click)="selectRange(range.value)" [class.disabled]="disabled">{{ range.key }}</li>
987
+ }
988
+ </ul>
989
+ </div>
990
+ }
991
+ <div class="ngxsmk-calendar-container">
992
+ <div class="ngxsmk-header">
993
+ <div class="ngxsmk-month-year-selects">
994
+ <ngxsmk-custom-select class="month-select" [options]="monthOptions"
995
+ [(value)]="currentMonth" [disabled]="disabled"></ngxsmk-custom-select>
996
+ <ngxsmk-custom-select class="year-select" [options]="yearOptions" [(value)]="currentYear" [disabled]="disabled"></ngxsmk-custom-select>
997
+ </div>
998
+ <div class="ngxsmk-nav-buttons">
999
+ <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(-1)" [disabled]="disabled || isBackArrowDisabled">
1000
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
1001
+ <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48"
1002
+ d="M328 112L184 256l144 144"/>
1003
+ </svg>
1004
+ </button>
1005
+ <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(1)" [disabled]="disabled">
1006
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
1007
+ <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48"
1008
+ d="M184 112l144 144-144 144"/>
1009
+ </svg>
1010
+ </button>
1011
+ </div>
1012
+ </div>
1013
+ <div class="ngxsmk-days-grid-wrapper">
1014
+ <div class="ngxsmk-days-grid">
1015
+ @for (day of weekDays; track day) {
1016
+ <div class="ngxsmk-day-name">{{ day }}</div>
1017
+ }
1018
+ @for (day of daysInMonth; track trackByDay($index, day)) {
1019
+ <div class="ngxsmk-day-cell"
1020
+ [class.empty]="!isCurrentMonthMemo(day)" [class.disabled]="isDateDisabledMemo(day)"
1021
+ [class.today]="isSameDayMemo(day, today)"
1022
+ [class.holiday]="isHolidayMemo(day)"
1023
+ [class.selected]="mode === 'single' && isSameDayMemo(day, selectedDate)"
1024
+ [class.multiple-selected]="mode === 'multiple' && isMultipleSelected(day)"
1025
+ [class.start-date]="mode === 'range' && isSameDayMemo(day, startDate)"
1026
+ [class.end-date]="mode === 'range' && isSameDayMemo(day, endDate)"
1027
+ [class.in-range]="mode === 'range' && isInRange(day)"
1028
+ [class.preview-range]="isPreviewInRange(day)"
1029
+ (click)="onDateClick(day)" (mouseenter)="onDateHover(day)">
1030
+ @if (day) {
1031
+ <div class="ngxsmk-day-number" [attr.title]="getHolidayLabelMemo(day)">{{ day | date : 'd' }}</div>
1032
+ }
1033
+ </div>
1034
+ }
1035
+ </div>
1036
+ </div>
1037
+
1038
+ @if (showTime) {
1039
+ <div class="ngxsmk-time-selection">
1040
+ <span class="ngxsmk-time-label">Time:</span>
1041
+ <ngxsmk-custom-select
1042
+ class="hour-select"
1043
+ [options]="hourOptions"
1044
+ [(value)]="currentDisplayHour"
1045
+ (valueChange)="onTimeChange()"
1046
+ [disabled]="disabled"
1047
+ ></ngxsmk-custom-select>
1048
+ <span class="ngxsmk-time-separator">:</span>
1049
+ <ngxsmk-custom-select
1050
+ class="minute-select"
1051
+ [options]="minuteOptions"
1052
+ [(value)]="currentMinute"
1053
+ (valueChange)="onTimeChange()"
1054
+ [disabled]="disabled"
1055
+ ></ngxsmk-custom-select>
1056
+ <ngxsmk-custom-select
1057
+ class="ampm-select"
1058
+ [options]="ampmOptions"
1059
+ [(value)]="isPm"
1060
+ (valueChange)="onTimeChange()"
1061
+ [disabled]="disabled"
1062
+ ></ngxsmk-custom-select>
1063
+ </div>
1064
+ }
1065
+
1066
+ <div class="ngxsmk-footer" *ngIf="!isInlineMode">
1067
+ <button type="button" class="ngxsmk-clear-button-footer" (click)="clearValue($event)" [disabled]="disabled">
1068
+ Clear
1069
+ </button>
1070
+ <button type="button" class="ngxsmk-close-button" (click)="isCalendarOpen = false" [disabled]="disabled">
1071
+ Close
1072
+ </button>
1073
+ </div>
1074
+ </div>
1075
+ </div>
1076
+ </div>
1077
+ }
1078
+ </div>
1089
1079
  `, 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 }); }
1090
1080
  }
1091
1081
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0-rc.1", ngImport: i0, type: NgxsmkDatepickerComponent, decorators: [{
@@ -1094,122 +1084,122 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0-rc.1", ng
1094
1084
  provide: NG_VALUE_ACCESSOR,
1095
1085
  useExisting: forwardRef(() => NgxsmkDatepickerComponent),
1096
1086
  multi: true
1097
- }], changeDetection: ChangeDetectionStrategy.OnPush, template: `
1098
- <div class="ngxsmk-datepicker-wrapper" [class.ngxsmk-inline-mode]="isInlineMode">
1099
- @if (!isInlineMode) {
1100
- <div class="ngxsmk-input-group" (click)="toggleCalendar()" [class.disabled]="disabled">
1101
- <input type="text"
1102
- [value]="displayValue"
1103
- [placeholder]="placeholder"
1104
- readonly
1105
- [disabled]="disabled"
1106
- class="ngxsmk-display-input">
1107
- <button type="button" class="ngxsmk-clear-button" (click)="clearValue($event)" [disabled]="disabled" *ngIf="displayValue">
1108
- <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>
1109
- </button>
1110
- </div>
1111
- }
1112
-
1113
- @if (isCalendarVisible) {
1114
- <div class="ngxsmk-popover-container" [class.ngxsmk-inline-container]="isInlineMode">
1115
- <div class="ngxsmk-datepicker-container">
1116
- @if (showRanges && rangesArray.length > 0 && mode === 'range') {
1117
- <div class="ngxsmk-ranges-container">
1118
- <ul>
1119
- @for (range of rangesArray; track trackByRange($index, range)) {
1120
- <li (click)="selectRange(range.value)" [class.disabled]="disabled">{{ range.key }}</li>
1121
- }
1122
- </ul>
1123
- </div>
1124
- }
1125
- <div class="ngxsmk-calendar-container">
1126
- <div class="ngxsmk-header">
1127
- <div class="ngxsmk-month-year-selects">
1128
- <ngxsmk-custom-select class="month-select" [options]="monthOptions"
1129
- [(value)]="currentMonth" [disabled]="disabled"></ngxsmk-custom-select>
1130
- <ngxsmk-custom-select class="year-select" [options]="yearOptions" [(value)]="currentYear" [disabled]="disabled"></ngxsmk-custom-select>
1131
- </div>
1132
- <div class="ngxsmk-nav-buttons">
1133
- <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(-1)" [disabled]="disabled || isBackArrowDisabled">
1134
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
1135
- <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48"
1136
- d="M328 112L184 256l144 144"/>
1137
- </svg>
1138
- </button>
1139
- <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(1)" [disabled]="disabled">
1140
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
1141
- <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48"
1142
- d="M184 112l144 144-144 144"/>
1143
- </svg>
1144
- </button>
1145
- </div>
1146
- </div>
1147
- <div class="ngxsmk-days-grid-wrapper">
1148
- <div class="ngxsmk-days-grid">
1149
- @for (day of weekDays; track day) {
1150
- <div class="ngxsmk-day-name">{{ day }}</div>
1151
- }
1152
- @for (day of daysInMonth; track trackByDay($index, day)) {
1153
- <div class="ngxsmk-day-cell"
1154
- [class.empty]="!isCurrentMonthMemo(day)" [class.disabled]="isDateDisabledMemo(day)"
1155
- [class.today]="isSameDayMemo(day, today)"
1156
- [class.holiday]="isHolidayMemo(day)"
1157
- [class.selected]="mode === 'single' && isSameDayMemo(day, selectedDate)"
1158
- [class.multiple-selected]="mode === 'multiple' && isMultipleSelected(day)"
1159
- [class.start-date]="mode === 'range' && isSameDayMemo(day, startDate)"
1160
- [class.end-date]="mode === 'range' && isSameDayMemo(day, endDate)"
1161
- [class.in-range]="mode === 'range' && isInRange(day)"
1162
- [class.preview-range]="isPreviewInRange(day)"
1163
- (click)="onDateClick(day)" (mouseenter)="onDateHover(day)">
1164
- @if (day) {
1165
- <div class="ngxsmk-day-number" [attr.title]="getHolidayLabelMemo(day)">{{ day | date : 'd' }}</div>
1166
- }
1167
- </div>
1168
- }
1169
- </div>
1170
- </div>
1171
-
1172
- @if (showTime) {
1173
- <div class="ngxsmk-time-selection">
1174
- <span class="ngxsmk-time-label">Time:</span>
1175
- <ngxsmk-custom-select
1176
- class="hour-select"
1177
- [options]="hourOptions"
1178
- [(value)]="currentDisplayHour"
1179
- (valueChange)="onTimeChange()"
1180
- [disabled]="disabled"
1181
- ></ngxsmk-custom-select>
1182
- <span class="ngxsmk-time-separator">:</span>
1183
- <ngxsmk-custom-select
1184
- class="minute-select"
1185
- [options]="minuteOptions"
1186
- [(value)]="currentMinute"
1187
- (valueChange)="onTimeChange()"
1188
- [disabled]="disabled"
1189
- ></ngxsmk-custom-select>
1190
- <ngxsmk-custom-select
1191
- class="ampm-select"
1192
- [options]="ampmOptions"
1193
- [(value)]="isPm"
1194
- (valueChange)="onTimeChange()"
1195
- [disabled]="disabled"
1196
- ></ngxsmk-custom-select>
1197
- </div>
1198
- }
1199
-
1200
- <div class="ngxsmk-footer" *ngIf="!isInlineMode">
1201
- <button type="button" class="ngxsmk-clear-button-footer" (click)="clearValue($event)" [disabled]="disabled">
1202
- Clear
1203
- </button>
1204
- <button type="button" class="ngxsmk-close-button" (click)="isCalendarOpen = false" [disabled]="disabled">
1205
- Close
1206
- </button>
1207
- </div>
1208
- </div>
1209
- </div>
1210
- </div>
1211
- }
1212
- </div>
1087
+ }], changeDetection: ChangeDetectionStrategy.OnPush, template: `
1088
+ <div class="ngxsmk-datepicker-wrapper" [class.ngxsmk-inline-mode]="isInlineMode">
1089
+ @if (!isInlineMode) {
1090
+ <div class="ngxsmk-input-group" (click)="toggleCalendar()" [class.disabled]="disabled">
1091
+ <input type="text"
1092
+ [value]="displayValue"
1093
+ [placeholder]="placeholder"
1094
+ readonly
1095
+ [disabled]="disabled"
1096
+ class="ngxsmk-display-input">
1097
+ <button type="button" class="ngxsmk-clear-button" (click)="clearValue($event)" [disabled]="disabled" *ngIf="displayValue">
1098
+ <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>
1099
+ </button>
1100
+ </div>
1101
+ }
1102
+
1103
+ @if (isCalendarVisible) {
1104
+ <div class="ngxsmk-popover-container" [class.ngxsmk-inline-container]="isInlineMode">
1105
+ <div class="ngxsmk-datepicker-container">
1106
+ @if (showRanges && rangesArray.length > 0 && mode === 'range') {
1107
+ <div class="ngxsmk-ranges-container">
1108
+ <ul>
1109
+ @for (range of rangesArray; track trackByRange($index, range)) {
1110
+ <li (click)="selectRange(range.value)" [class.disabled]="disabled">{{ range.key }}</li>
1111
+ }
1112
+ </ul>
1113
+ </div>
1114
+ }
1115
+ <div class="ngxsmk-calendar-container">
1116
+ <div class="ngxsmk-header">
1117
+ <div class="ngxsmk-month-year-selects">
1118
+ <ngxsmk-custom-select class="month-select" [options]="monthOptions"
1119
+ [(value)]="currentMonth" [disabled]="disabled"></ngxsmk-custom-select>
1120
+ <ngxsmk-custom-select class="year-select" [options]="yearOptions" [(value)]="currentYear" [disabled]="disabled"></ngxsmk-custom-select>
1121
+ </div>
1122
+ <div class="ngxsmk-nav-buttons">
1123
+ <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(-1)" [disabled]="disabled || isBackArrowDisabled">
1124
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
1125
+ <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48"
1126
+ d="M328 112L184 256l144 144"/>
1127
+ </svg>
1128
+ </button>
1129
+ <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(1)" [disabled]="disabled">
1130
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
1131
+ <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="48"
1132
+ d="M184 112l144 144-144 144"/>
1133
+ </svg>
1134
+ </button>
1135
+ </div>
1136
+ </div>
1137
+ <div class="ngxsmk-days-grid-wrapper">
1138
+ <div class="ngxsmk-days-grid">
1139
+ @for (day of weekDays; track day) {
1140
+ <div class="ngxsmk-day-name">{{ day }}</div>
1141
+ }
1142
+ @for (day of daysInMonth; track trackByDay($index, day)) {
1143
+ <div class="ngxsmk-day-cell"
1144
+ [class.empty]="!isCurrentMonthMemo(day)" [class.disabled]="isDateDisabledMemo(day)"
1145
+ [class.today]="isSameDayMemo(day, today)"
1146
+ [class.holiday]="isHolidayMemo(day)"
1147
+ [class.selected]="mode === 'single' && isSameDayMemo(day, selectedDate)"
1148
+ [class.multiple-selected]="mode === 'multiple' && isMultipleSelected(day)"
1149
+ [class.start-date]="mode === 'range' && isSameDayMemo(day, startDate)"
1150
+ [class.end-date]="mode === 'range' && isSameDayMemo(day, endDate)"
1151
+ [class.in-range]="mode === 'range' && isInRange(day)"
1152
+ [class.preview-range]="isPreviewInRange(day)"
1153
+ (click)="onDateClick(day)" (mouseenter)="onDateHover(day)">
1154
+ @if (day) {
1155
+ <div class="ngxsmk-day-number" [attr.title]="getHolidayLabelMemo(day)">{{ day | date : 'd' }}</div>
1156
+ }
1157
+ </div>
1158
+ }
1159
+ </div>
1160
+ </div>
1161
+
1162
+ @if (showTime) {
1163
+ <div class="ngxsmk-time-selection">
1164
+ <span class="ngxsmk-time-label">Time:</span>
1165
+ <ngxsmk-custom-select
1166
+ class="hour-select"
1167
+ [options]="hourOptions"
1168
+ [(value)]="currentDisplayHour"
1169
+ (valueChange)="onTimeChange()"
1170
+ [disabled]="disabled"
1171
+ ></ngxsmk-custom-select>
1172
+ <span class="ngxsmk-time-separator">:</span>
1173
+ <ngxsmk-custom-select
1174
+ class="minute-select"
1175
+ [options]="minuteOptions"
1176
+ [(value)]="currentMinute"
1177
+ (valueChange)="onTimeChange()"
1178
+ [disabled]="disabled"
1179
+ ></ngxsmk-custom-select>
1180
+ <ngxsmk-custom-select
1181
+ class="ampm-select"
1182
+ [options]="ampmOptions"
1183
+ [(value)]="isPm"
1184
+ (valueChange)="onTimeChange()"
1185
+ [disabled]="disabled"
1186
+ ></ngxsmk-custom-select>
1187
+ </div>
1188
+ }
1189
+
1190
+ <div class="ngxsmk-footer" *ngIf="!isInlineMode">
1191
+ <button type="button" class="ngxsmk-clear-button-footer" (click)="clearValue($event)" [disabled]="disabled">
1192
+ Clear
1193
+ </button>
1194
+ <button type="button" class="ngxsmk-close-button" (click)="isCalendarOpen = false" [disabled]="disabled">
1195
+ Close
1196
+ </button>
1197
+ </div>
1198
+ </div>
1199
+ </div>
1200
+ </div>
1201
+ }
1202
+ </div>
1213
1203
  `, 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"] }]
1214
1204
  }], propDecorators: { mode: [{
1215
1205
  type: Input
@@ -1231,6 +1221,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0-rc.1", ng
1231
1221
  type: Input
1232
1222
  }], inline: [{
1233
1223
  type: Input
1224
+ }], value: [{
1225
+ type: Input
1234
1226
  }], startAt: [{
1235
1227
  type: Input
1236
1228
  }], locale: [{