ngxsmk-datepicker 1.3.6 → 1.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, inject, ElementRef, HostListener, Output, Input, Component, forwardRef, HostBinding } from '@angular/core';
2
+ import { EventEmitter, inject, ElementRef, HostListener, Output, Input, Component, forwardRef, HostBinding, ChangeDetectionStrategy } from '@angular/core';
3
3
  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
+ */
7
11
  function getStartOfDay(d) {
8
12
  return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0, 0);
9
13
  }
@@ -26,6 +30,119 @@ function getStartOfMonth(d) {
26
30
  function getEndOfMonth(d) {
27
31
  return new Date(d.getFullYear(), d.getMonth() + 1, 0);
28
32
  }
33
+ function isSameDay(d1, d2) {
34
+ if (!d1 || !d2)
35
+ return false;
36
+ return (d1.getFullYear() === d2.getFullYear() &&
37
+ d1.getMonth() === d2.getMonth() &&
38
+ d1.getDate() === d2.getDate());
39
+ }
40
+ function normalizeDate(date) {
41
+ if (!date)
42
+ return null;
43
+ const d = (date instanceof Date) ? new Date(date.getTime()) : new Date(date.toDate ? date.toDate() : date);
44
+ if (isNaN(d.getTime()))
45
+ return null;
46
+ return d;
47
+ }
48
+
49
+ /**
50
+ * Calendar utility functions for ngxsmk-datepicker
51
+ * Optimized for performance and tree-shaking
52
+ */
53
+ /**
54
+ * Generate month options for dropdown
55
+ */
56
+ function generateMonthOptions(locale, year) {
57
+ return Array.from({ length: 12 }).map((_, i) => ({
58
+ label: new Date(year, i, 1).toLocaleDateString(locale, { month: 'long' }),
59
+ value: i,
60
+ }));
61
+ }
62
+ /**
63
+ * Generate year options for dropdown
64
+ */
65
+ function generateYearOptions(currentYear, range = 10) {
66
+ const startYear = currentYear - range;
67
+ const endYear = currentYear + range;
68
+ const options = [];
69
+ for (let i = startYear; i <= endYear; i++) {
70
+ options.push({ label: `${i}`, value: i });
71
+ }
72
+ return options;
73
+ }
74
+ /**
75
+ * Generate time options for hour/minute dropdowns
76
+ */
77
+ function generateTimeOptions(minuteInterval = 1) {
78
+ const hourOptions = Array.from({ length: 12 }).map((_, i) => ({
79
+ label: (i + 1).toString().padStart(2, '0'),
80
+ value: i + 1,
81
+ }));
82
+ const minuteOptions = [];
83
+ for (let i = 0; i < 60; i += minuteInterval) {
84
+ minuteOptions.push({
85
+ label: i.toString().padStart(2, '0'),
86
+ value: i,
87
+ });
88
+ }
89
+ return { hourOptions, minuteOptions };
90
+ }
91
+ /**
92
+ * Generate week days for calendar header
93
+ */
94
+ function generateWeekDays(locale, firstDayOfWeek = 0) {
95
+ const day = new Date(2024, 0, 7 + firstDayOfWeek);
96
+ return Array.from({ length: 7 }).map(() => {
97
+ const weekDay = new Date(day).toLocaleDateString(locale, { weekday: 'short' });
98
+ day.setDate(day.getDate() + 1);
99
+ return weekDay;
100
+ });
101
+ }
102
+ /**
103
+ * Get first day of week for locale
104
+ */
105
+ function getFirstDayOfWeek(locale) {
106
+ try {
107
+ return (new Intl.Locale(locale).weekInfo?.firstDay || 0) % 7;
108
+ }
109
+ catch (e) {
110
+ return 0;
111
+ }
112
+ }
113
+ /**
114
+ * Convert 12-hour to 24-hour format
115
+ */
116
+ function get24Hour(displayHour, isPm) {
117
+ if (isPm) {
118
+ return displayHour === 12 ? 12 : displayHour + 12;
119
+ }
120
+ return displayHour === 12 ? 0 : displayHour;
121
+ }
122
+ /**
123
+ * Convert 24-hour to 12-hour format
124
+ */
125
+ function update12HourState(fullHour) {
126
+ return {
127
+ isPm: fullHour >= 12,
128
+ displayHour: fullHour % 12 || 12
129
+ };
130
+ }
131
+ /**
132
+ * Process date ranges input
133
+ */
134
+ function processDateRanges(ranges) {
135
+ if (!ranges)
136
+ return null;
137
+ return Object.entries(ranges).reduce((acc, [key, dates]) => {
138
+ const start = normalizeDate(dates[0]);
139
+ const end = normalizeDate(dates[1]);
140
+ if (start && end)
141
+ acc[key] = [start, end];
142
+ return acc;
143
+ }, {});
144
+ }
145
+
29
146
  class CustomSelectComponent {
30
147
  constructor() {
31
148
  this.options = [];
@@ -53,7 +170,7 @@ class CustomSelectComponent {
53
170
  this.isOpen = false;
54
171
  }
55
172
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: CustomSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
56
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: CustomSelectComponent, isStandalone: true, selector: "app-custom-select", inputs: { options: "options", value: "value", disabled: "disabled" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, ngImport: i0, template: `
173
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: CustomSelectComponent, isStandalone: true, selector: "ngxsmk-custom-select", inputs: { options: "options", value: "value", disabled: "disabled" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, ngImport: i0, template: `
57
174
  <div class="ngxsmk-select-container" (click)="toggleDropdown()">
58
175
  <button type="button" class="ngxsmk-select-display" [disabled]="disabled">
59
176
  <span>{{ displayValue }}</span>
@@ -78,7 +195,7 @@ class CustomSelectComponent {
78
195
  }
79
196
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: CustomSelectComponent, decorators: [{
80
197
  type: Component,
81
- args: [{ selector: 'app-custom-select', standalone: true, imports: [CommonModule], template: `
198
+ args: [{ selector: 'ngxsmk-custom-select', standalone: true, imports: [CommonModule], template: `
82
199
  <div class="ngxsmk-select-container" (click)="toggleDropdown()">
83
200
  <button type="button" class="ngxsmk-select-display" [disabled]="disabled">
84
201
  <span>{{ displayValue }}</span>
@@ -112,6 +229,102 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
112
229
  type: HostListener,
113
230
  args: ['document:click', ['$event']]
114
231
  }] } });
232
+
233
+ /**
234
+ * Performance utilities for ngxsmk-datepicker
235
+ * Optimized for better runtime performance
236
+ */
237
+ /**
238
+ * Memoization decorator for expensive computations
239
+ */
240
+ function memoize(fn, keyGenerator) {
241
+ const cache = new Map();
242
+ return ((...args) => {
243
+ const key = keyGenerator ? keyGenerator(...args) : JSON.stringify(args);
244
+ if (cache.has(key)) {
245
+ return cache.get(key);
246
+ }
247
+ const result = fn(...args);
248
+ cache.set(key, result);
249
+ return result;
250
+ });
251
+ }
252
+ /**
253
+ * Debounce function for performance optimization
254
+ */
255
+ function debounce(func, wait) {
256
+ let timeout = null;
257
+ return (...args) => {
258
+ if (timeout) {
259
+ clearTimeout(timeout);
260
+ }
261
+ timeout = window.setTimeout(() => {
262
+ func(...args);
263
+ }, wait);
264
+ };
265
+ }
266
+ /**
267
+ * Throttle function for performance optimization
268
+ */
269
+ function throttle(func, limit) {
270
+ let inThrottle = false;
271
+ return (...args) => {
272
+ if (!inThrottle) {
273
+ func(...args);
274
+ inThrottle = true;
275
+ window.setTimeout(() => (inThrottle = false), limit);
276
+ }
277
+ };
278
+ }
279
+ /**
280
+ * Create a shallow comparison function for objects
281
+ */
282
+ function shallowEqual(a, b) {
283
+ const keysA = Object.keys(a);
284
+ const keysB = Object.keys(b);
285
+ if (keysA.length !== keysB.length) {
286
+ return false;
287
+ }
288
+ for (const key of keysA) {
289
+ if (a[key] !== b[key]) {
290
+ return false;
291
+ }
292
+ }
293
+ return true;
294
+ }
295
+ /**
296
+ * Optimized date comparison for calendar rendering
297
+ */
298
+ function createDateComparator() {
299
+ const cache = new Map();
300
+ return (date1, date2) => {
301
+ if (!date1 || !date2)
302
+ return date1 === date2;
303
+ const key = `${date1.getTime()}-${date2.getTime()}`;
304
+ if (cache.has(key)) {
305
+ return cache.get(key);
306
+ }
307
+ const result = (date1.getFullYear() === date2.getFullYear() &&
308
+ date1.getMonth() === date2.getMonth() &&
309
+ date1.getDate() === date2.getDate());
310
+ cache.set(key, result);
311
+ return result;
312
+ };
313
+ }
314
+ /**
315
+ * Optimized array filtering with caching
316
+ */
317
+ function createFilteredArray(source, filterFn, cacheKey) {
318
+ const cache = new Map();
319
+ const key = cacheKey || JSON.stringify(source);
320
+ if (cache.has(key)) {
321
+ return cache.get(key);
322
+ }
323
+ const result = source.filter(filterFn);
324
+ cache.set(key, result);
325
+ return result;
326
+ }
327
+
115
328
  class NgxsmkDatepickerComponent {
116
329
  constructor() {
117
330
  this.mode = 'single';
@@ -167,6 +380,7 @@ class NgxsmkDatepickerComponent {
167
380
  this.animateForward = false;
168
381
  this.animateBackward = false;
169
382
  this.elementRef = inject(ElementRef);
383
+ this.dateComparator = createDateComparator();
170
384
  }
171
385
  set startAt(value) { this._startAtDate = this._normalizeDate(value); }
172
386
  set locale(value) { this._locale = value; }
@@ -176,18 +390,7 @@ class NgxsmkDatepickerComponent {
176
390
  set minDate(value) { this._minDate = this._normalizeDate(value); }
177
391
  set maxDate(value) { this._maxDate = this._normalizeDate(value); }
178
392
  set ranges(value) {
179
- if (!value) {
180
- this._ranges = null;
181
- }
182
- else {
183
- this._ranges = Object.entries(value).reduce((acc, [key, dates]) => {
184
- const start = this._normalizeDate(dates[0]);
185
- const end = this._normalizeDate(dates[1]);
186
- if (start && end)
187
- acc[key] = [start, end];
188
- return acc;
189
- }, {});
190
- }
393
+ this._ranges = processDateRanges(value);
191
394
  this.updateRangesArray();
192
395
  }
193
396
  get isInlineMode() {
@@ -342,14 +545,12 @@ class NgxsmkDatepickerComponent {
342
545
  }
343
546
  }
344
547
  get24Hour(displayHour, isPm) {
345
- if (isPm) {
346
- return displayHour === 12 ? 12 : displayHour + 12;
347
- }
348
- return displayHour === 12 ? 0 : displayHour;
548
+ return get24Hour(displayHour, isPm);
349
549
  }
350
550
  update12HourState(fullHour) {
351
- this.isPm = fullHour >= 12;
352
- this.currentDisplayHour = fullHour % 12 || 12;
551
+ const state = update12HourState(fullHour);
552
+ this.isPm = state.isPm;
553
+ this.currentDisplayHour = state.displayHour;
353
554
  }
354
555
  applyCurrentTime(date) {
355
556
  this.currentHour = this.get24Hour(this.currentDisplayHour, this.isPm);
@@ -389,44 +590,18 @@ class NgxsmkDatepickerComponent {
389
590
  }
390
591
  }
391
592
  _normalizeDate(date) {
392
- if (!date)
393
- return null;
394
- const d = (date instanceof Date) ? new Date(date.getTime()) : new Date(date.toDate ? date.toDate() : date);
395
- if (isNaN(d.getTime()))
396
- return null;
397
- return d;
593
+ return normalizeDate(date);
398
594
  }
399
595
  generateTimeOptions() {
400
- this.hourOptions = Array.from({ length: 12 }).map((_, i) => ({
401
- label: (i + 1).toString().padStart(2, '0'),
402
- value: i + 1,
403
- }));
404
- this.minuteOptions = [];
405
- for (let i = 0; i < 60; i += this.minuteInterval) {
406
- this.minuteOptions.push({
407
- label: i.toString().padStart(2, '0'),
408
- value: i,
409
- });
410
- }
596
+ const { hourOptions, minuteOptions } = generateTimeOptions(this.minuteInterval);
597
+ this.hourOptions = hourOptions;
598
+ this.minuteOptions = minuteOptions;
411
599
  }
412
600
  generateLocaleData() {
413
601
  const year = new Date().getFullYear();
414
- this.monthOptions = Array.from({ length: 12 }).map((_, i) => ({
415
- label: new Date(year, i, 1).toLocaleDateString(this.locale, { month: 'long' }),
416
- value: i,
417
- }));
418
- try {
419
- this.firstDayOfWeek = (new Intl.Locale(this.locale).weekInfo?.firstDay || 0) % 7;
420
- }
421
- catch (e) {
422
- this.firstDayOfWeek = 0;
423
- }
424
- const day = new Date(year, 0, 7 + this.firstDayOfWeek);
425
- this.weekDays = Array.from({ length: 7 }).map(() => {
426
- const weekDay = new Date(day).toLocaleDateString(this.locale, { weekday: 'short' });
427
- day.setDate(day.getDate() + 1);
428
- return weekDay;
429
- });
602
+ this.monthOptions = generateMonthOptions(this.locale, year);
603
+ this.firstDayOfWeek = getFirstDayOfWeek(this.locale);
604
+ this.weekDays = generateWeekDays(this.locale, this.firstDayOfWeek);
430
605
  }
431
606
  updateRangesArray() {
432
607
  this.rangesArray = this._ranges ? Object.entries(this._ranges).map(([key, value]) => ({ key, value })) : [];
@@ -604,12 +779,7 @@ class NgxsmkDatepickerComponent {
604
779
  });
605
780
  }
606
781
  generateDropdownOptions() {
607
- const startYear = this._currentYear - 10;
608
- const endYear = this._currentYear + 10;
609
- this.yearOptions = [];
610
- for (let i = startYear; i <= endYear; i++) {
611
- this.yearOptions.push({ label: `${i}`, value: i });
612
- }
782
+ this.yearOptions = generateYearOptions(this._currentYear);
613
783
  }
614
784
  changeMonth(delta) {
615
785
  if (this.disabled)
@@ -639,11 +809,7 @@ class NgxsmkDatepickerComponent {
639
809
  this.action.emit({ type: 'monthChanged', payload: { delta: delta } });
640
810
  }
641
811
  isSameDay(d1, d2) {
642
- if (!d1 || !d2)
643
- return false;
644
- return (d1.getFullYear() === d2.getFullYear() &&
645
- d1.getMonth() === d2.getMonth() &&
646
- d1.getDate() === d2.getDate());
812
+ return this.dateComparator(d1, d2);
647
813
  }
648
814
  isInRange(d) {
649
815
  if (!d || !this.startDate || !this.endDate)
@@ -655,6 +821,10 @@ class NgxsmkDatepickerComponent {
655
821
  const endTime = Math.max(startDayTime, endDayTime);
656
822
  return dTime > startTime && dTime < endTime;
657
823
  }
824
+ ngOnDestroy() {
825
+ // Clean up any subscriptions or timers if needed
826
+ // Currently no cleanup required, but method is here for future optimizations
827
+ }
658
828
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: NgxsmkDatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
659
829
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: NgxsmkDatepickerComponent, isStandalone: true, selector: "ngxsmk-datepicker", inputs: { mode: "mode", isInvalidDate: "isInvalidDate", showRanges: "showRanges", showTime: "showTime", minuteInterval: "minuteInterval", holidayProvider: "holidayProvider", disableHolidays: "disableHolidays", placeholder: "placeholder", inline: "inline", startAt: "startAt", locale: "locale", theme: "theme", disabledState: "disabledState", minDate: "minDate", maxDate: "maxDate", ranges: "ranges" }, outputs: { valueChange: "valueChange", action: "action" }, host: { listeners: { "document:click": "onDocumentClick($event)" }, properties: { "class.dark-theme": "this.isDarkMode" } }, providers: [{
660
830
  provide: NG_VALUE_ACCESSOR,
@@ -691,9 +861,9 @@ class NgxsmkDatepickerComponent {
691
861
  <div class="ngxsmk-calendar-container">
692
862
  <div class="ngxsmk-header">
693
863
  <div class="ngxsmk-month-year-selects">
694
- <app-custom-select class="month-select" [options]="monthOptions"
695
- [(value)]="currentMonth" [disabled]="disabled"></app-custom-select>
696
- <app-custom-select class="year-select" [options]="yearOptions" [(value)]="currentYear" [disabled]="disabled"></app-custom-select>
864
+ <ngxsmk-custom-select class="month-select" [options]="monthOptions"
865
+ [(value)]="currentMonth" [disabled]="disabled"></ngxsmk-custom-select>
866
+ <ngxsmk-custom-select class="year-select" [options]="yearOptions" [(value)]="currentYear" [disabled]="disabled"></ngxsmk-custom-select>
697
867
  </div>
698
868
  <div class="ngxsmk-nav-buttons">
699
869
  <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(-1)" [disabled]="disabled">
@@ -740,28 +910,28 @@ class NgxsmkDatepickerComponent {
740
910
  @if (showTime) {
741
911
  <div class="ngxsmk-time-selection">
742
912
  <span class="ngxsmk-time-label">Time:</span>
743
- <app-custom-select
913
+ <ngxsmk-custom-select
744
914
  class="hour-select"
745
915
  [options]="hourOptions"
746
916
  [(value)]="currentDisplayHour"
747
917
  (valueChange)="onTimeChange()"
748
918
  [disabled]="disabled"
749
- ></app-custom-select>
919
+ ></ngxsmk-custom-select>
750
920
  <span class="ngxsmk-time-separator">:</span>
751
- <app-custom-select
921
+ <ngxsmk-custom-select
752
922
  class="minute-select"
753
923
  [options]="minuteOptions"
754
924
  [(value)]="currentMinute"
755
925
  (valueChange)="onTimeChange()"
756
926
  [disabled]="disabled"
757
- ></app-custom-select>
758
- <app-custom-select
927
+ ></ngxsmk-custom-select>
928
+ <ngxsmk-custom-select
759
929
  class="ampm-select"
760
930
  [options]="ampmOptions"
761
931
  [(value)]="isPm"
762
932
  (valueChange)="onTimeChange()"
763
933
  [disabled]="disabled"
764
- ></app-custom-select>
934
+ ></ngxsmk-custom-select>
765
935
  </div>
766
936
  }
767
937
 
@@ -778,7 +948,7 @@ class NgxsmkDatepickerComponent {
778
948
  </div>
779
949
  }
780
950
  </div>
781
- `, 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;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:border-color .15s ease}.ngxsmk-input-group:hover:not(.disabled){border-color:var(--datepicker-primary-color)}.ngxsmk-input-group.disabled{cursor:not-allowed;opacity:.7}.ngxsmk-display-input{flex-grow:1;padding:6px 8px;font-size:14px;color:var(--datepicker-text-color, #333);background:transparent;border:none;outline:none;cursor:pointer}.ngxsmk-display-input:disabled{background:var(--datepicker-hover-background, #f0f0f0);cursor:not-allowed}.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;border:1px solid var(--datepicker-border-color)}.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:6px 12px;border-radius:6px;font-size:.9rem;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;border-radius:10px;padding:12px;background:var(--datepicker-background);box-shadow:0 4px 10px #0000001a;width:100%}.ngxsmk-ranges-container{width:100%;padding:12px;border-right:none;border-bottom:1px solid var(--datepicker-border-color);background:var(--datepicker-hover-background);border-radius:10px 10px 0 0}.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:6px 10px;margin-bottom:0;font-size:.85rem;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-wrapper{overflow-x:hidden}.ngxsmk-days-grid{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;gap:0;transition:transform .3s ease-out,opacity .15s ease-out .15s}.ngxsmk-days-grid.animate-forward{transform:translate(-100%);opacity:0}.ngxsmk-days-grid.animate-backward{transform:translate(100%);opacity:0}.ngxsmk-day-name{font-size:.75rem;padding:6px 0;color:var(--datepicker-subtle-text-color);font-weight:600}.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:.9rem;position:relative;z-index:1}.ngxsmk-time-selection{display:flex;align-items:center;gap:5px;flex-wrap:wrap;margin-top:12px;padding-top:8px;border-top:1px solid var(--datepicker-border-color)}.ngxsmk-time-label{font-size:.9rem;color:var(--datepicker-subtle-text-color);margin-right:4px}.ngxsmk-time-separator{font-weight:600;color:var(--datepicker-text-color)}.ngxsmk-time-selection app-custom-select{--custom-select-width: 55px;height:28px}.ngxsmk-time-selection app-custom-select.ampm-select{--custom-select-width: 65px}.ngxsmk-day-cell:not(.disabled):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.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:16px;box-shadow:0 4px 10px #0000001a;width:auto;border-radius:0 10px 10px 0}.ngxsmk-ranges-container{width:180px;padding:16px;border-right:1px solid var(--datepicker-border-color);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:10px;margin-bottom:8px;border:none;font-size:1rem}.ngxsmk-header{margin-bottom:12px;gap:5px}.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:8px}.ngxsmk-nav-button svg{width:18px;height:18px}.ngxsmk-day-name{font-size:.8rem;padding:8px 0}.ngxsmk-day-cell{height:38px}.ngxsmk-day-number{width:36px;height:36px;font-size:1rem}.ngxsmk-time-selection{margin-top:16px;padding-top:12px}.ngxsmk-time-selection app-custom-select{--custom-select-width: 60px;height:30px}.ngxsmk-time-selection app-custom-select.ampm-select{--custom-select-width: 70px}}\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: "app-custom-select", inputs: ["options", "value", "disabled"], outputs: ["valueChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "pipe", type: i1.DatePipe, name: "date" }] }); }
951
+ `, 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;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:border-color .15s ease}.ngxsmk-input-group:hover:not(.disabled){border-color:var(--datepicker-primary-color)}.ngxsmk-input-group.disabled{cursor:not-allowed;opacity:.7}.ngxsmk-display-input{flex-grow:1;padding:6px 8px;font-size:14px;color:var(--datepicker-text-color, #333);background:transparent;border:none;outline:none;cursor:pointer}.ngxsmk-display-input:disabled{background:var(--datepicker-hover-background, #f0f0f0);cursor:not-allowed}.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;border:1px solid var(--datepicker-border-color)}.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:6px 12px;border-radius:6px;font-size:.9rem;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;border-radius:10px;padding:12px;background:var(--datepicker-background);box-shadow:0 4px 10px #0000001a;width:100%}.ngxsmk-ranges-container{width:100%;padding:12px;border-right:none;border-bottom:1px solid var(--datepicker-border-color);background:var(--datepicker-hover-background);border-radius:10px 10px 0 0}.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:6px 10px;margin-bottom:0;font-size:.85rem;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-wrapper{overflow-x:hidden}.ngxsmk-days-grid{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;gap:0;transition:transform .3s ease-out,opacity .15s ease-out .15s}.ngxsmk-days-grid.animate-forward{transform:translate(-100%);opacity:0}.ngxsmk-days-grid.animate-backward{transform:translate(100%);opacity:0}.ngxsmk-day-name{font-size:.75rem;padding:6px 0;color:var(--datepicker-subtle-text-color);font-weight:600}.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:.9rem;position:relative;z-index:1}.ngxsmk-time-selection{display:flex;align-items:center;gap:5px;flex-wrap:wrap;margin-top:12px;padding-top:8px;border-top:1px solid var(--datepicker-border-color)}.ngxsmk-time-label{font-size:.9rem;color:var(--datepicker-subtle-text-color);margin-right:4px}.ngxsmk-time-separator{font-weight:600;color:var(--datepicker-text-color)}.ngxsmk-time-selection app-custom-select{--custom-select-width: 55px;height:28px}.ngxsmk-time-selection app-custom-select.ampm-select{--custom-select-width: 65px}.ngxsmk-day-cell:not(.disabled):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.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:16px;box-shadow:0 4px 10px #0000001a;width:auto;border-radius:0 10px 10px 0}.ngxsmk-ranges-container{width:180px;padding:16px;border-right:1px solid var(--datepicker-border-color);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:10px;margin-bottom:8px;border:none;font-size:1rem}.ngxsmk-header{margin-bottom:12px;gap:5px}.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:8px}.ngxsmk-nav-button svg{width:18px;height:18px}.ngxsmk-day-name{font-size:.8rem;padding:8px 0}.ngxsmk-day-cell{height:38px}.ngxsmk-day-number{width:36px;height:36px;font-size:1rem}.ngxsmk-time-selection{margin-top:16px;padding-top:12px}.ngxsmk-time-selection app-custom-select{--custom-select-width: 60px;height:30px}.ngxsmk-time-selection app-custom-select.ampm-select{--custom-select-width: 70px}}\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 }); }
782
952
  }
783
953
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: NgxsmkDatepickerComponent, decorators: [{
784
954
  type: Component,
@@ -786,7 +956,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
786
956
  provide: NG_VALUE_ACCESSOR,
787
957
  useExisting: forwardRef(() => NgxsmkDatepickerComponent),
788
958
  multi: true
789
- }], template: `
959
+ }], changeDetection: ChangeDetectionStrategy.OnPush, template: `
790
960
  <div class="ngxsmk-datepicker-wrapper" [class.ngxsmk-inline-mode]="isInlineMode">
791
961
  @if (!isInlineMode) {
792
962
  <div class="ngxsmk-input-group" (click)="toggleCalendar()" [class.disabled]="disabled">
@@ -817,9 +987,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
817
987
  <div class="ngxsmk-calendar-container">
818
988
  <div class="ngxsmk-header">
819
989
  <div class="ngxsmk-month-year-selects">
820
- <app-custom-select class="month-select" [options]="monthOptions"
821
- [(value)]="currentMonth" [disabled]="disabled"></app-custom-select>
822
- <app-custom-select class="year-select" [options]="yearOptions" [(value)]="currentYear" [disabled]="disabled"></app-custom-select>
990
+ <ngxsmk-custom-select class="month-select" [options]="monthOptions"
991
+ [(value)]="currentMonth" [disabled]="disabled"></ngxsmk-custom-select>
992
+ <ngxsmk-custom-select class="year-select" [options]="yearOptions" [(value)]="currentYear" [disabled]="disabled"></ngxsmk-custom-select>
823
993
  </div>
824
994
  <div class="ngxsmk-nav-buttons">
825
995
  <button type="button" class="ngxsmk-nav-button" (click)="changeMonth(-1)" [disabled]="disabled">
@@ -866,28 +1036,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
866
1036
  @if (showTime) {
867
1037
  <div class="ngxsmk-time-selection">
868
1038
  <span class="ngxsmk-time-label">Time:</span>
869
- <app-custom-select
1039
+ <ngxsmk-custom-select
870
1040
  class="hour-select"
871
1041
  [options]="hourOptions"
872
1042
  [(value)]="currentDisplayHour"
873
1043
  (valueChange)="onTimeChange()"
874
1044
  [disabled]="disabled"
875
- ></app-custom-select>
1045
+ ></ngxsmk-custom-select>
876
1046
  <span class="ngxsmk-time-separator">:</span>
877
- <app-custom-select
1047
+ <ngxsmk-custom-select
878
1048
  class="minute-select"
879
1049
  [options]="minuteOptions"
880
1050
  [(value)]="currentMinute"
881
1051
  (valueChange)="onTimeChange()"
882
1052
  [disabled]="disabled"
883
- ></app-custom-select>
884
- <app-custom-select
1053
+ ></ngxsmk-custom-select>
1054
+ <ngxsmk-custom-select
885
1055
  class="ampm-select"
886
1056
  [options]="ampmOptions"
887
1057
  [(value)]="isPm"
888
1058
  (valueChange)="onTimeChange()"
889
1059
  [disabled]="disabled"
890
- ></app-custom-select>
1060
+ ></ngxsmk-custom-select>
891
1061
  </div>
892
1062
  }
893
1063
 
@@ -957,5 +1127,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
957
1127
  * Generated bundle index. Do not edit.
958
1128
  */
959
1129
 
960
- export { CustomSelectComponent, NgxsmkDatepickerComponent };
1130
+ export { CustomSelectComponent, NgxsmkDatepickerComponent, addMonths, generateMonthOptions, generateTimeOptions, generateWeekDays, generateYearOptions, get24Hour, getEndOfDay, getEndOfMonth, getFirstDayOfWeek, getStartOfDay, getStartOfMonth, isSameDay, normalizeDate, processDateRanges, subtractDays, update12HourState };
961
1131
  //# sourceMappingURL=ngxsmk-datepicker.mjs.map