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.
- package/LICENSE +21 -0
- package/README.md +36 -7
- package/fesm2022/ngxsmk-datepicker.mjs +293 -301
- package/fesm2022/ngxsmk-datepicker.mjs.map +1 -1
- package/package.json +5 -5
- package/types/ngxsmk-datepicker.d.ts +5 -10
|
@@ -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;
|
|
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
|
-
|
|
583
|
-
|
|
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']
|
|
601
|
-
|
|
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
|
-
|
|
616
|
-
|
|
617
|
-
|
|
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: [{
|