@wzrdev/ngx-datepicker 0.1.1

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/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # NgxDatepicker
2
+
3
+ This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 19.2.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
8
+
9
+ ```bash
10
+ ng generate component component-name
11
+ ```
12
+
13
+ For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
14
+
15
+ ```bash
16
+ ng generate --help
17
+ ```
18
+
19
+ ## Building
20
+
21
+ To build the library, run:
22
+
23
+ ```bash
24
+ ng build ngx-datepicker
25
+ ```
26
+
27
+ This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
28
+
29
+ ### Publishing the Library
30
+
31
+ Once the project is built, you can publish your library by following these steps:
32
+
33
+ 1. Navigate to the `dist` directory:
34
+ ```bash
35
+ cd dist/ngx-datepicker
36
+ ```
37
+
38
+ 2. Run the `npm publish` command to publish your library to the npm registry:
39
+ ```bash
40
+ npm publish
41
+ ```
42
+
43
+ ## Running unit tests
44
+
45
+ To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
46
+
47
+ ```bash
48
+ ng test
49
+ ```
50
+
51
+ ## Running end-to-end tests
52
+
53
+ For end-to-end (e2e) testing, run:
54
+
55
+ ```bash
56
+ ng e2e
57
+ ```
58
+
59
+ Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
60
+
61
+ ## Additional Resources
62
+
63
+ For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
@@ -0,0 +1,524 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, inject, model, input, signal, output, linkedSignal, computed, ChangeDetectionStrategy, Component, Directive, ElementRef, effect, forwardRef } from '@angular/core';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import { clsx } from 'clsx';
5
+ import { extendTailwindMerge } from 'tailwind-merge';
6
+ import { DatePipe } from '@angular/common';
7
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
8
+
9
+ const currentYear$1 = new Date().getFullYear();
10
+ const FR_LOCALE = {
11
+ code: "fr",
12
+ months: [
13
+ "Janvier",
14
+ "Février",
15
+ "Mars",
16
+ "Avril",
17
+ "Mai",
18
+ "Juin",
19
+ "Juillet",
20
+ "Août",
21
+ "Septembre",
22
+ "Octobre",
23
+ "Novembre",
24
+ "Décembre",
25
+ ],
26
+ weekdays: ["Lu", "Ma", "Me", "Je", "Ve", "Sa", "Di"],
27
+ weekStartsOn: 1,
28
+ years: Array.from({ length: 200 }, (_, i) => currentYear$1 - 100 + i),
29
+ format: date => date.toLocaleDateString("fr-FR"),
30
+ };
31
+
32
+ const currentYear = new Date().getFullYear();
33
+ const EN_LOCALE = {
34
+ code: "en",
35
+ months: [
36
+ "January",
37
+ "February",
38
+ "March",
39
+ "April",
40
+ "May",
41
+ "June",
42
+ "July",
43
+ "August",
44
+ "September",
45
+ "October",
46
+ "November",
47
+ "December",
48
+ ],
49
+ weekdays: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
50
+ weekStartsOn: 0,
51
+ years: Array.from({ length: 200 }, (_, i) => currentYear - 100 + i),
52
+ format: date => date.toLocaleDateString("en-US"),
53
+ };
54
+
55
+ class DatePickerLocaleService {
56
+ locales = {
57
+ fr: FR_LOCALE,
58
+ en: EN_LOCALE,
59
+ };
60
+ locale$ = new BehaviorSubject(FR_LOCALE);
61
+ setLocale(code) {
62
+ this.locale$.next(this.locales[code] ?? FR_LOCALE);
63
+ }
64
+ get localeChanges$() {
65
+ return this.locale$.asObservable();
66
+ }
67
+ get current() {
68
+ return this.locale$.value;
69
+ }
70
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DatePickerLocaleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
71
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DatePickerLocaleService, providedIn: "root" });
72
+ }
73
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DatePickerLocaleService, decorators: [{
74
+ type: Injectable,
75
+ args: [{ providedIn: "root" }]
76
+ }] });
77
+
78
+ const customTwMerge = extendTailwindMerge({
79
+ extend: {
80
+ classGroups: {},
81
+ },
82
+ });
83
+ const cn = (...inputs) => {
84
+ return customTwMerge(clsx(inputs));
85
+ };
86
+
87
+ class CalendarService {
88
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: CalendarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
89
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: CalendarService });
90
+ }
91
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: CalendarService, decorators: [{
92
+ type: Injectable
93
+ }] });
94
+
95
+ class CalendarComponent {
96
+ locale = inject(DatePickerLocaleService);
97
+ startDate = model();
98
+ endDate = model();
99
+ minDate = input();
100
+ maxDate = input();
101
+ hoveredDate = signal(null);
102
+ enableRange = input(false);
103
+ selectedDate = output();
104
+ selectedDateRange = output();
105
+ selectedDaysCount = output();
106
+ hoverDate = output();
107
+ days = linkedSignal(() => {
108
+ const startDate = this.startDate();
109
+ const endDate = this.endDate();
110
+ const displayDate = this.displayDate();
111
+ const year = displayDate.getFullYear();
112
+ const month = displayDate.getMonth();
113
+ const today = new Date();
114
+ const first = new Date(year, month, 1);
115
+ const last = new Date(year, month + 1, 0);
116
+ const days = [];
117
+ for (let d = new Date(first); d <= last; d.setDate(d.getDate() + 1)) {
118
+ const day = {
119
+ date: new Date(d),
120
+ isDisabled: this.isDisabled(d),
121
+ isToday: this.isSame(d, today),
122
+ isSelected: this.isSame(d, startDate) || this.isSame(d, endDate),
123
+ isInRange: this.isInRange(d),
124
+ };
125
+ days.push(day);
126
+ }
127
+ return days;
128
+ });
129
+ daysInRange = computed(() => {
130
+ const days = this.days();
131
+ return days.filter(day => day.isInRange);
132
+ });
133
+ daysDisabled = computed(() => {
134
+ const days = this.days();
135
+ return days.filter(day => day.isDisabled);
136
+ });
137
+ latestDayInRange = computed(() => {
138
+ const rangeDays = this.daysInRange();
139
+ return rangeDays[rangeDays.length - 1];
140
+ });
141
+ latestDayDisabled = computed(() => {
142
+ const daysDisabled = this.daysDisabled();
143
+ return daysDisabled[daysDisabled.length - 1];
144
+ });
145
+ firstDayDisabled = computed(() => {
146
+ const daysDisabled = this.daysDisabled();
147
+ return daysDisabled[0];
148
+ });
149
+ displayDate = linkedSignal(() => {
150
+ const start = this.startDate();
151
+ return start ?? new Date();
152
+ });
153
+ focusedDate = linkedSignal(() => {
154
+ return new Date(this.displayDate());
155
+ });
156
+ cn = cn;
157
+ build() {
158
+ // keep the focusedDate in the current month
159
+ if (this.focusedDate().getMonth() !== this.displayDate().getMonth()) {
160
+ this.focusedDate.set(new Date(this.displayDate().getFullYear(), this.displayDate().getMonth(), 1));
161
+ }
162
+ }
163
+ prevMonth() {
164
+ this.displayDate.update((prevState) => {
165
+ return new Date(prevState.getFullYear(), prevState.getMonth() - 1, prevState.getDate());
166
+ });
167
+ }
168
+ nextMonth() {
169
+ this.displayDate.update((prevState) => {
170
+ return new Date(prevState.getFullYear(), prevState.getMonth() + 1, prevState.getDate());
171
+ });
172
+ }
173
+ isSame(a, b) {
174
+ if (!a || !b)
175
+ return false;
176
+ return a.toDateString() === b.toDateString();
177
+ }
178
+ isDisabled(date) {
179
+ const minDate = this.minDate();
180
+ const maxDate = this.maxDate();
181
+ const normalize = (d) => new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();
182
+ const current = normalize(date);
183
+ if (minDate && current < normalize(minDate)) {
184
+ return true;
185
+ }
186
+ return !!(maxDate && current > normalize(maxDate));
187
+ }
188
+ isInRange(d) {
189
+ const start = this.startDate();
190
+ const end = this.endDate();
191
+ const hover = this.hoveredDate();
192
+ if (!start || !d)
193
+ return false;
194
+ if (start && end)
195
+ return d >= start && d <= end;
196
+ if (start && hover) {
197
+ return d >= start && d <= hover;
198
+ }
199
+ return false;
200
+ }
201
+ ;
202
+ onDaySelect(date) {
203
+ const selectedDays = this.days().filter(day => day.isSelected);
204
+ const startDate = this.startDate();
205
+ const endDate = this.endDate();
206
+ if (this.enableRange()) {
207
+ if (selectedDays.length === 2
208
+ || startDate && date < startDate
209
+ || endDate && endDate <= date
210
+ || endDate && date <= endDate) {
211
+ this.resetStartDate(date);
212
+ }
213
+ if (!startDate) {
214
+ this.startDate.set(date);
215
+ }
216
+ else if (startDate && !endDate && startDate < date) {
217
+ this.endDate.set(date);
218
+ }
219
+ }
220
+ else {
221
+ this.resetStartDate(date);
222
+ }
223
+ if (this.enableRange()) {
224
+ this.selectedDateRange.emit({ startDate: this.startDate() ?? null, endDate: this.endDate() ?? null });
225
+ }
226
+ else {
227
+ this.selectedDate.emit(date);
228
+ }
229
+ this.selectedDaysCount.emit(this.daysInRange().length);
230
+ }
231
+ onDayMouseEnter(date) {
232
+ if (!this.enableRange() || (this.startDate() && this.endDate())) {
233
+ return;
234
+ }
235
+ this.hoveredDate.set(date);
236
+ }
237
+ handleKeyDown(event) {
238
+ if (!this.focusedDate)
239
+ return;
240
+ const newDate = new Date(this.focusedDate());
241
+ switch (event.key) {
242
+ case "ArrowRight":
243
+ newDate.setDate(newDate.getDate() + 1);
244
+ break;
245
+ case "ArrowLeft":
246
+ newDate.setDate(newDate.getDate() - 1);
247
+ break;
248
+ case "ArrowDown":
249
+ newDate.setDate(newDate.getDate() + 7);
250
+ break;
251
+ case "ArrowUp":
252
+ newDate.setDate(newDate.getDate() - 7);
253
+ break;
254
+ case "Enter":
255
+ case " ":
256
+ this.selectedDate.emit(this.focusedDate());
257
+ event.preventDefault();
258
+ return;
259
+ default:
260
+ return; // ignorer les autres touches
261
+ }
262
+ event.preventDefault();
263
+ this.focusedDate.set(newDate);
264
+ // si le focusedDate est hors du mois courant, changer le mois
265
+ if (this.focusedDate().getMonth() !== this.displayDate().getMonth() ||
266
+ this.focusedDate().getFullYear() !== this.displayDate().getFullYear()) {
267
+ this.displayDate.set(new Date(this.focusedDate().getFullYear(), this.focusedDate().getMonth(), 1));
268
+ this.build();
269
+ }
270
+ }
271
+ // Pour le template : savoir si la date est focusée pour appliquer style
272
+ isFocused(date) {
273
+ return this.focusedDate && this.isSame(date, this.focusedDate());
274
+ }
275
+ resetStartDate(date) {
276
+ console.log('reset');
277
+ this.startDate.set(date);
278
+ this.endDate.set(null);
279
+ this.hoveredDate.set(null);
280
+ }
281
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: CalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
282
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.18", type: CalendarComponent, isStandalone: true, selector: "ngx-calendar", inputs: { startDate: { classPropertyName: "startDate", publicName: "startDate", isSignal: true, isRequired: false, transformFunction: null }, endDate: { classPropertyName: "endDate", publicName: "endDate", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, enableRange: { classPropertyName: "enableRange", publicName: "enableRange", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { startDate: "startDateChange", endDate: "endDateChange", selectedDate: "selectedDate", selectedDateRange: "selectedDateRange", selectedDaysCount: "selectedDaysCount", hoverDate: "hoverDate" }, host: { listeners: { "keydown": "handleKeyDown($event)" } }, providers: [CalendarService], ngImport: i0, template: "<div\n class=\"ngx:w-65 ngx:bg-white ngx:rounded-md ngx:shadow-lg ngx:p-3\"\n id=\"calendar\"\n role=\"dialog\"\n aria-modal=\"true\">\n\n <div class=\"ngx:flex ngx:items-center ngx:mb-2\">\n <button\n class=\"ngx:cursor-pointer ngx:hover:bg-slate-100 ngx:focus:bg-slate-100 ngx:rounded-full ngx:flex ngx:w-10 ngx:h-10 ngx:justify-center ngx:items-center\"\n (click)=\"prevMonth()\" aria-label=\"Previous month\">\u2039\n </button>\n <p class=\"ngx:grow ngx:text-center ngx:font-medium ngx:text-inherit\">{{ displayDate() | date: 'MMMM yyyy' }}</p>\n <button\n class=\"ngx:cursor-pointer ngx:hover:bg-slate-100 ngx:focus:bg-slate-100 ngx:rounded-full ngx:flex ngx:w-10 ngx:h-10 ngx:justify-center ngx:items-center\"\n (click)=\"nextMonth()\" aria-label=\"Next month\">\u203A\n </button>\n </div>\n\n <!-- Weekdays -->\n <div class=\"ngx:grid ngx:grid-cols-7 ngx:gap-0.5\">\n @for (wd of locale.current.weekdays; track $index) {\n <span class=\"ngx:text-center ngx:py-1 ngx:text-sm ngx:font-medium ngx:text-inherit\">{{ wd }}</span>\n }\n </div>\n\n <div class=\"ngx:grid ngx:grid-cols-7 ngx:gap-y-0.5\">\n @for (day of days(); track $index) {\n <button\n [class]=\"cn(\n 'ngx:relative ngx:cursor-pointer ngx:py-1 ngx:overflow-hidden ngx:text-inherit',\n daysInRange().length < 2 && !day.isDisabled && 'ngx:rounded-full',\n (latestDayInRange() === day || latestDayDisabled() === day) && 'ngx:rounded-r-full',\n day.isDisabled && 'ngx:bg-slate-200 ngx:text-slate-400 ngx:cursor-not-allowed',\n day.isInRange && !day.isDisabled && 'ngx:bg-(--ngx-datepicker-range-color)',\n day.isSelected && !day.isDisabled && 'ngx:bg-(--ngx-datepicker-range-color) ngx:text-(--ngx-datepicker-accent-text-color) ngx:before:absolute ngx:before:top-0 ngx:before:left-0 ngx:before:block ngx:before:w-full ngx:before:h-full ngx:before:z-1 ngx:before:bg-(--ngx-datepicker-accent-color)',\n day.isToday && 'ngx:before:absolute ngx:before:top-0 ngx:before:left-0 ngx:before:block ngx:before:w-full ngx:before:h-full ngx:before:z-1 ngx:before:rounded-full ngx:before:border-2 ngx:before:border-(--ngx-datepicker-accent-color)',\n isSame(day.date, startDate()) && !day.isDisabled && 'ngx:rounded-l-full ngx:before:rounded-full',\n isSame(day.date, endDate()) && 'ngx:rounded-r-full ngx:before:rounded-full'\n )\"\n [attr.aria-selected]=\"isSame(day.date, startDate()) || isSame(day.date, endDate())\"\n [attr.aria-label]=\"locale.current.format(day.date)\"\n [disabled]=\"day.isDisabled\"\n (click)=\"onDaySelect(day.date)\"\n (mouseenter)=\"onDayMouseEnter(day.date)\">\n <span class=\"ngx:relative ngx:z-10\">{{ day.date.getDate() }}</span>\n </button>\n }\n </div>\n</div>\n", dependencies: [{ kind: "pipe", type: DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
283
+ }
284
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: CalendarComponent, decorators: [{
285
+ type: Component,
286
+ args: [{ selector: "ngx-calendar", changeDetection: ChangeDetectionStrategy.OnPush, imports: [
287
+ DatePipe
288
+ ], providers: [CalendarService], host: {
289
+ "(keydown)": "handleKeyDown($event)"
290
+ }, template: "<div\n class=\"ngx:w-65 ngx:bg-white ngx:rounded-md ngx:shadow-lg ngx:p-3\"\n id=\"calendar\"\n role=\"dialog\"\n aria-modal=\"true\">\n\n <div class=\"ngx:flex ngx:items-center ngx:mb-2\">\n <button\n class=\"ngx:cursor-pointer ngx:hover:bg-slate-100 ngx:focus:bg-slate-100 ngx:rounded-full ngx:flex ngx:w-10 ngx:h-10 ngx:justify-center ngx:items-center\"\n (click)=\"prevMonth()\" aria-label=\"Previous month\">\u2039\n </button>\n <p class=\"ngx:grow ngx:text-center ngx:font-medium ngx:text-inherit\">{{ displayDate() | date: 'MMMM yyyy' }}</p>\n <button\n class=\"ngx:cursor-pointer ngx:hover:bg-slate-100 ngx:focus:bg-slate-100 ngx:rounded-full ngx:flex ngx:w-10 ngx:h-10 ngx:justify-center ngx:items-center\"\n (click)=\"nextMonth()\" aria-label=\"Next month\">\u203A\n </button>\n </div>\n\n <!-- Weekdays -->\n <div class=\"ngx:grid ngx:grid-cols-7 ngx:gap-0.5\">\n @for (wd of locale.current.weekdays; track $index) {\n <span class=\"ngx:text-center ngx:py-1 ngx:text-sm ngx:font-medium ngx:text-inherit\">{{ wd }}</span>\n }\n </div>\n\n <div class=\"ngx:grid ngx:grid-cols-7 ngx:gap-y-0.5\">\n @for (day of days(); track $index) {\n <button\n [class]=\"cn(\n 'ngx:relative ngx:cursor-pointer ngx:py-1 ngx:overflow-hidden ngx:text-inherit',\n daysInRange().length < 2 && !day.isDisabled && 'ngx:rounded-full',\n (latestDayInRange() === day || latestDayDisabled() === day) && 'ngx:rounded-r-full',\n day.isDisabled && 'ngx:bg-slate-200 ngx:text-slate-400 ngx:cursor-not-allowed',\n day.isInRange && !day.isDisabled && 'ngx:bg-(--ngx-datepicker-range-color)',\n day.isSelected && !day.isDisabled && 'ngx:bg-(--ngx-datepicker-range-color) ngx:text-(--ngx-datepicker-accent-text-color) ngx:before:absolute ngx:before:top-0 ngx:before:left-0 ngx:before:block ngx:before:w-full ngx:before:h-full ngx:before:z-1 ngx:before:bg-(--ngx-datepicker-accent-color)',\n day.isToday && 'ngx:before:absolute ngx:before:top-0 ngx:before:left-0 ngx:before:block ngx:before:w-full ngx:before:h-full ngx:before:z-1 ngx:before:rounded-full ngx:before:border-2 ngx:before:border-(--ngx-datepicker-accent-color)',\n isSame(day.date, startDate()) && !day.isDisabled && 'ngx:rounded-l-full ngx:before:rounded-full',\n isSame(day.date, endDate()) && 'ngx:rounded-r-full ngx:before:rounded-full'\n )\"\n [attr.aria-selected]=\"isSame(day.date, startDate()) || isSame(day.date, endDate())\"\n [attr.aria-label]=\"locale.current.format(day.date)\"\n [disabled]=\"day.isDisabled\"\n (click)=\"onDaySelect(day.date)\"\n (mouseenter)=\"onDayMouseEnter(day.date)\">\n <span class=\"ngx:relative ngx:z-10\">{{ day.date.getDate() }}</span>\n </button>\n }\n </div>\n</div>\n" }]
291
+ }] });
292
+
293
+ class DatePickerWrapperComponent {
294
+ date = input();
295
+ endDate = input();
296
+ hoveredDate = input();
297
+ minDate = input();
298
+ maxDate = input();
299
+ label = input.required();
300
+ openCalendar = input();
301
+ enableRange = input.required();
302
+ selectedDate = output();
303
+ selectedDateRange = output();
304
+ hoverDate = output();
305
+ onSelectDate(date) {
306
+ this.selectedDate.emit(date);
307
+ }
308
+ onSelectDateRange(date) {
309
+ this.selectedDateRange.emit(date);
310
+ }
311
+ onHoverDate(date) {
312
+ this.hoverDate.emit(date);
313
+ }
314
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DatePickerWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
315
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.18", type: DatePickerWrapperComponent, isStandalone: true, selector: "ngx-date-picker-wrapper", inputs: { date: { classPropertyName: "date", publicName: "date", isSignal: true, isRequired: false, transformFunction: null }, endDate: { classPropertyName: "endDate", publicName: "endDate", isSignal: true, isRequired: false, transformFunction: null }, hoveredDate: { classPropertyName: "hoveredDate", publicName: "hoveredDate", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, openCalendar: { classPropertyName: "openCalendar", publicName: "openCalendar", isSignal: true, isRequired: false, transformFunction: null }, enableRange: { classPropertyName: "enableRange", publicName: "enableRange", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selectedDate: "selectedDate", selectedDateRange: "selectedDateRange", hoverDate: "hoverDate" }, ngImport: i0, template: "<div class=\"ngx:inline-block ngx:relative\">\n <div class=\"ngx:inline-flex ngx:flex-col\">\n <label [for]=\"label()\" class=\"ngx:inline-block ngx:text-left ngx:text-xs ngx:font-semibold ngx:mb-1 ngx:text-slate-900\" for=\"datepicker\">{{ label() }}</label>\n <div\n class=\"ngx:inline-flex ngx:w-auto ngx:items-stretch ngx:rounded-md ngx:bg-slate-100 ngx:focus-within:outline-2 ngx:focus-within:outline-(--ngx-datepicker-outline-color) ngx:focus-within:shadow ngx:overflow-hidden\">\n <ng-content></ng-content>\n </div>\n </div>\n <ngx-calendar\n class=\"ngx:absolute ngx:top-full ngx:left-0 ngx:mt-1 ngx:z-100\"\n [class.ngx:hidden]=\"!openCalendar()\"\n [startDate]=\"date()\"\n [endDate]=\"endDate()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [enableRange]=\"enableRange()\"\n (selectedDate)=\"onSelectDate($event)\"\n (selectedDateRange)=\"onSelectDateRange($event)\"\n (hoverDate)=\"onHoverDate($event)\">\n </ngx-calendar>\n</div>\n", dependencies: [{ kind: "component", type: CalendarComponent, selector: "ngx-calendar", inputs: ["startDate", "endDate", "minDate", "maxDate", "enableRange"], outputs: ["startDateChange", "endDateChange", "selectedDate", "selectedDateRange", "selectedDaysCount", "hoverDate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
316
+ }
317
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DatePickerWrapperComponent, decorators: [{
318
+ type: Component,
319
+ args: [{ selector: 'ngx-date-picker-wrapper', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CalendarComponent], template: "<div class=\"ngx:inline-block ngx:relative\">\n <div class=\"ngx:inline-flex ngx:flex-col\">\n <label [for]=\"label()\" class=\"ngx:inline-block ngx:text-left ngx:text-xs ngx:font-semibold ngx:mb-1 ngx:text-slate-900\" for=\"datepicker\">{{ label() }}</label>\n <div\n class=\"ngx:inline-flex ngx:w-auto ngx:items-stretch ngx:rounded-md ngx:bg-slate-100 ngx:focus-within:outline-2 ngx:focus-within:outline-(--ngx-datepicker-outline-color) ngx:focus-within:shadow ngx:overflow-hidden\">\n <ng-content></ng-content>\n </div>\n </div>\n <ngx-calendar\n class=\"ngx:absolute ngx:top-full ngx:left-0 ngx:mt-1 ngx:z-100\"\n [class.ngx:hidden]=\"!openCalendar()\"\n [startDate]=\"date()\"\n [endDate]=\"endDate()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [enableRange]=\"enableRange()\"\n (selectedDate)=\"onSelectDate($event)\"\n (selectedDateRange)=\"onSelectDateRange($event)\"\n (hoverDate)=\"onHoverDate($event)\">\n </ngx-calendar>\n</div>\n" }]
320
+ }] });
321
+
322
+ class InputDirective {
323
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: InputDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
324
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.18", type: InputDirective, isStandalone: true, selector: "[ngxInput]", host: { classAttribute: "ngx:block ngx:w-full ngx:font-medium ngx:bg-slate-100 ngx:pl-4 ngx:border-0 ngx:outline-0 ngx:appearance-none ngx:[&::-webkit-calendar-picker-indicator]:hidden" }, ngImport: i0 });
325
+ }
326
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: InputDirective, decorators: [{
327
+ type: Directive,
328
+ args: [{
329
+ selector: '[ngxInput]',
330
+ host: {
331
+ class: 'ngx:block ngx:w-full ngx:font-medium ngx:bg-slate-100 ngx:pl-4 ngx:border-0 ngx:outline-0 ngx:appearance-none ngx:[&::-webkit-calendar-picker-indicator]:hidden'
332
+ }
333
+ }]
334
+ }] });
335
+
336
+ function WithControlValueAccessor(Base) {
337
+ return class extends Base {
338
+ value;
339
+ disabled = false;
340
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
341
+ onChange = (_) => { };
342
+ onTouched = () => { };
343
+ writeValue(value) {
344
+ this.value = value;
345
+ }
346
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
347
+ registerOnChange(fn) {
348
+ this.onChange = fn;
349
+ }
350
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
351
+ registerOnTouched(fn) {
352
+ this.onTouched = fn;
353
+ }
354
+ setDisabledState(isDisabled) {
355
+ this.disabled = isDisabled;
356
+ }
357
+ onInput(value) {
358
+ this.value = value;
359
+ this.onChange(value);
360
+ }
361
+ onBlur() {
362
+ this.onTouched();
363
+ }
364
+ };
365
+ }
366
+
367
+ class DatepickerComponent extends WithControlValueAccessor(class {
368
+ }) {
369
+ id = model();
370
+ date = model();
371
+ dateTo = model();
372
+ minDate = input();
373
+ maxDate = input();
374
+ range = input(false);
375
+ isRangeEnd = input(false);
376
+ label = input.required();
377
+ openCalendar = model(false);
378
+ selectedDate = output();
379
+ selectedDateRange = output();
380
+ el = inject(ElementRef);
381
+ constructor() {
382
+ super();
383
+ effect(() => {
384
+ const date = this.date();
385
+ const dateTo = this.dateTo();
386
+ if (date) {
387
+ this.updateFormControl(this.isRangeEnd() && dateTo ? dateTo : date);
388
+ }
389
+ });
390
+ }
391
+ onSelectedDateChange(date) {
392
+ if (date) {
393
+ this.updateDate(date);
394
+ }
395
+ if (this.range()) {
396
+ return;
397
+ }
398
+ this.openCalendar.set(false);
399
+ }
400
+ onSelectedDateRangeChange(dateRange) {
401
+ this.selectedDateRange.emit(dateRange);
402
+ if (dateRange.startDate !== null && dateRange.endDate !== null) {
403
+ this.openCalendar.set(false);
404
+ }
405
+ }
406
+ onInputChange(e) {
407
+ const target = e.target;
408
+ const date = new Date(target.value);
409
+ this.updateDate(date);
410
+ }
411
+ onToggleCalendar() {
412
+ this.openCalendar.set(!this.openCalendar());
413
+ }
414
+ onClickOutside(e) {
415
+ const el = e.target;
416
+ if (!this.el.nativeElement.contains(el)) {
417
+ this.openCalendar.set(false);
418
+ }
419
+ }
420
+ updateDate(date) {
421
+ this.date.set(date);
422
+ this.selectedDate.emit(date);
423
+ this.updateFormControl(date);
424
+ }
425
+ updateFormControl(value) {
426
+ this.value = value;
427
+ this.onChange(value);
428
+ }
429
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
430
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.18", type: DatepickerComponent, isStandalone: true, selector: "ngx-datepicker", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, date: { classPropertyName: "date", publicName: "date", isSignal: true, isRequired: false, transformFunction: null }, dateTo: { classPropertyName: "dateTo", publicName: "dateTo", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, range: { classPropertyName: "range", publicName: "range", isSignal: true, isRequired: false, transformFunction: null }, isRangeEnd: { classPropertyName: "isRangeEnd", publicName: "isRangeEnd", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, openCalendar: { classPropertyName: "openCalendar", publicName: "openCalendar", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { id: "idChange", date: "dateChange", dateTo: "dateToChange", openCalendar: "openCalendarChange", selectedDate: "selectedDate", selectedDateRange: "selectedDateRange" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, providers: [
431
+ {
432
+ provide: NG_VALUE_ACCESSOR,
433
+ useExisting: forwardRef(() => DatepickerComponent),
434
+ multi: true,
435
+ },
436
+ ], usesInheritance: true, ngImport: i0, template: "<ngx-date-picker-wrapper\n [date]=\"date()\"\n [endDate]=\"dateTo()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [enableRange]=\"range()\"\n [label]=\"label()\"\n [openCalendar]=\"openCalendar()\"\n (selectedDate)=\"onSelectedDateChange($event)\"\n (selectedDateRange)=\"onSelectedDateRangeChange($event)\">\n <input\n ngxInput\n type=\"date\"\n placeholder=\"dd/mm/yyyy\"\n [attr.id]=\"label()\"\n [value]=\"value | date: 'yyyy-MM-dd'\"\n (blur)=\"onBlur()\"\n (change)=\"onInputChange($event)\">\n <button\n class=\"ngx:inline-flex ngx:items-center ngx:justify-center ngx:px-4 ngx:py-3 ngx:cursor-pointer ngx:hover:bg-slate-200 ngx:focus:bg-slate-200 ngx:outline-none\"\n (click)=\"onToggleCalendar()\">\n <svg class=\"ngx:text-slate-900 ngx:w-5 ngx:h-5\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\" />\n </svg>\n </button>\n\n</ngx-date-picker-wrapper>\n", dependencies: [{ kind: "component", type: DatePickerWrapperComponent, selector: "ngx-date-picker-wrapper", inputs: ["date", "endDate", "hoveredDate", "minDate", "maxDate", "label", "openCalendar", "enableRange"], outputs: ["selectedDate", "selectedDateRange", "hoverDate"] }, { kind: "directive", type: InputDirective, selector: "[ngxInput]" }, { kind: "pipe", type: DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
437
+ }
438
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DatepickerComponent, decorators: [{
439
+ type: Component,
440
+ args: [{ selector: 'ngx-datepicker', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
441
+ DatePickerWrapperComponent,
442
+ InputDirective,
443
+ DatePipe
444
+ ], host: {
445
+ '(document:click)': 'onClickOutside($event)',
446
+ }, providers: [
447
+ {
448
+ provide: NG_VALUE_ACCESSOR,
449
+ useExisting: forwardRef(() => DatepickerComponent),
450
+ multi: true,
451
+ },
452
+ ], template: "<ngx-date-picker-wrapper\n [date]=\"date()\"\n [endDate]=\"dateTo()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [enableRange]=\"range()\"\n [label]=\"label()\"\n [openCalendar]=\"openCalendar()\"\n (selectedDate)=\"onSelectedDateChange($event)\"\n (selectedDateRange)=\"onSelectedDateRangeChange($event)\">\n <input\n ngxInput\n type=\"date\"\n placeholder=\"dd/mm/yyyy\"\n [attr.id]=\"label()\"\n [value]=\"value | date: 'yyyy-MM-dd'\"\n (blur)=\"onBlur()\"\n (change)=\"onInputChange($event)\">\n <button\n class=\"ngx:inline-flex ngx:items-center ngx:justify-center ngx:px-4 ngx:py-3 ngx:cursor-pointer ngx:hover:bg-slate-200 ngx:focus:bg-slate-200 ngx:outline-none\"\n (click)=\"onToggleCalendar()\">\n <svg class=\"ngx:text-slate-900 ngx:w-5 ngx:h-5\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\" />\n </svg>\n </button>\n\n</ngx-date-picker-wrapper>\n" }]
453
+ }], ctorParameters: () => [] });
454
+
455
+ class DateRangePickerComponent {
456
+ startDate = model();
457
+ endDate = model();
458
+ minDate = input();
459
+ maxDate = input();
460
+ label = input.required();
461
+ hoveredDate = model(null);
462
+ openCalendar = model(false);
463
+ selectedDateRange = output();
464
+ el = inject(ElementRef);
465
+ locale = inject(DatePickerLocaleService);
466
+ close() {
467
+ this.openCalendar.set(false);
468
+ this.hoveredDate.set(null);
469
+ }
470
+ onEscape() {
471
+ this.close();
472
+ }
473
+ onSelectedDateChange(date) {
474
+ this.updateDateRange(date);
475
+ }
476
+ onHoverDateChange(date) {
477
+ this.hoveredDate.set(date);
478
+ }
479
+ onToggleCalendar() {
480
+ this.openCalendar.set(!this.openCalendar());
481
+ }
482
+ onCloseCalendar(e) {
483
+ const el = e.target;
484
+ if (!this.el.nativeElement.contains(el)) {
485
+ this.close();
486
+ }
487
+ }
488
+ updateDateRange(date) {
489
+ const startDate = this.startDate();
490
+ const endDate = this.endDate();
491
+ if (!startDate || endDate) {
492
+ this.startDate.set(date.startDate);
493
+ this.endDate.set(null);
494
+ }
495
+ else if (date.startDate && date.startDate >= startDate) {
496
+ this.endDate.set(date.endDate);
497
+ this.selectedDateRange.emit({ startDate, endDate: this.endDate() ?? null });
498
+ this.close();
499
+ }
500
+ else {
501
+ this.startDate.set(date.startDate);
502
+ }
503
+ }
504
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DateRangePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
505
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.18", type: DateRangePickerComponent, isStandalone: true, selector: "ngx-date-range-picker", inputs: { startDate: { classPropertyName: "startDate", publicName: "startDate", isSignal: true, isRequired: false, transformFunction: null }, endDate: { classPropertyName: "endDate", publicName: "endDate", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, hoveredDate: { classPropertyName: "hoveredDate", publicName: "hoveredDate", isSignal: true, isRequired: false, transformFunction: null }, openCalendar: { classPropertyName: "openCalendar", publicName: "openCalendar", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { startDate: "startDateChange", endDate: "endDateChange", hoveredDate: "hoveredDateChange", openCalendar: "openCalendarChange", selectedDateRange: "selectedDateRange" }, host: { listeners: { "document:click": "onCloseCalendar($event)", "keydown.escape": "onEscape()" } }, ngImport: i0, template: "<ngx-date-picker-wrapper\n [date]=\"startDate()\"\n [hoveredDate]=\"hoveredDate()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [label]=\"label()\"\n [enableRange]=\"true\"\n [openCalendar]=\"openCalendar()\"\n (selectedDateRange)=\"onSelectedDateChange($event)\"\n (hoverDate)=\"onHoverDateChange($event)\">\n <div class=\"ngx:flex ngx:items-center ngx:gap-x-1 ngx:min-w-54 ngx:pl-4\">\n <div class=\"ngx:grow ngx:relative ngx:overflow-hidden ngx:max-w-22.5\">\n <input\n class=\"ngx:font-medium ngx:w-full ngx:h-full ngx:outline-none ngx:p-0 ngx:m-0 ngx:appearance-none\"\n readonly\n type=\"text\"\n role=\"combobox\"\n placeholder=\"dd/mm/yyyy\"\n aria-controls=\"calendar\"\n aria-haspopup=\"dialog\"\n [attr.id]=\"label()\"\n [attr.aria-expanded]=\"openCalendar()\"\n [value]=\"startDate() | date: 'dd/MM/yyyy'\"\n />\n </div>\n <span>-</span>\n <div class=\"ngx:grow ngx:relative ngx:overflow-hidden ngx:max-w-22.5\">\n <input\n class=\"ngx:font-medium ngx:w-full ngx:h-full ngx:outline-none ngx:p-0 ngx:m-0 ngx:appearance-none\"\n readonly\n type=\"text\"\n role=\"combobox\"\n placeholder=\"dd/mm/yyyy\"\n aria-controls=\"calendar\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"openCalendar()\"\n [value]=\"endDate() | date: 'dd/MM/yyyy'\"\n />\n </div>\n </div>\n <button\n class=\"ngx:flex ngx:items-center ngx:justify-center ngx:px-4 ngx:py-3 ngx:cursor-pointer ngx:hover:bg-slate-200 ngx:focus:bg-slate-200 ngx:outline-none\"\n (click)=\"onToggleCalendar()\">\n <svg class=\"ngx:text-slate-900 ngx:w-5 ngx:h-5\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\" />\n </svg>\n </button>\n</ngx-date-picker-wrapper>\n", dependencies: [{ kind: "component", type: DatePickerWrapperComponent, selector: "ngx-date-picker-wrapper", inputs: ["date", "endDate", "hoveredDate", "minDate", "maxDate", "label", "openCalendar", "enableRange"], outputs: ["selectedDate", "selectedDateRange", "hoverDate"] }, { kind: "pipe", type: DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
506
+ }
507
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DateRangePickerComponent, decorators: [{
508
+ type: Component,
509
+ args: [{ selector: "ngx-date-range-picker", changeDetection: ChangeDetectionStrategy.OnPush, imports: [DatePickerWrapperComponent, DatePipe], host: {
510
+ "(document:click)": "onCloseCalendar($event)",
511
+ "(keydown.escape)": "onEscape()",
512
+ }, template: "<ngx-date-picker-wrapper\n [date]=\"startDate()\"\n [hoveredDate]=\"hoveredDate()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [label]=\"label()\"\n [enableRange]=\"true\"\n [openCalendar]=\"openCalendar()\"\n (selectedDateRange)=\"onSelectedDateChange($event)\"\n (hoverDate)=\"onHoverDateChange($event)\">\n <div class=\"ngx:flex ngx:items-center ngx:gap-x-1 ngx:min-w-54 ngx:pl-4\">\n <div class=\"ngx:grow ngx:relative ngx:overflow-hidden ngx:max-w-22.5\">\n <input\n class=\"ngx:font-medium ngx:w-full ngx:h-full ngx:outline-none ngx:p-0 ngx:m-0 ngx:appearance-none\"\n readonly\n type=\"text\"\n role=\"combobox\"\n placeholder=\"dd/mm/yyyy\"\n aria-controls=\"calendar\"\n aria-haspopup=\"dialog\"\n [attr.id]=\"label()\"\n [attr.aria-expanded]=\"openCalendar()\"\n [value]=\"startDate() | date: 'dd/MM/yyyy'\"\n />\n </div>\n <span>-</span>\n <div class=\"ngx:grow ngx:relative ngx:overflow-hidden ngx:max-w-22.5\">\n <input\n class=\"ngx:font-medium ngx:w-full ngx:h-full ngx:outline-none ngx:p-0 ngx:m-0 ngx:appearance-none\"\n readonly\n type=\"text\"\n role=\"combobox\"\n placeholder=\"dd/mm/yyyy\"\n aria-controls=\"calendar\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"openCalendar()\"\n [value]=\"endDate() | date: 'dd/MM/yyyy'\"\n />\n </div>\n </div>\n <button\n class=\"ngx:flex ngx:items-center ngx:justify-center ngx:px-4 ngx:py-3 ngx:cursor-pointer ngx:hover:bg-slate-200 ngx:focus:bg-slate-200 ngx:outline-none\"\n (click)=\"onToggleCalendar()\">\n <svg class=\"ngx:text-slate-900 ngx:w-5 ngx:h-5\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\" />\n </svg>\n </button>\n</ngx-date-picker-wrapper>\n" }]
513
+ }] });
514
+
515
+ /*
516
+ * Public API Surface of ngx-datepicker
517
+ */
518
+
519
+ /**
520
+ * Generated bundle index. Do not edit.
521
+ */
522
+
523
+ export { DateRangePickerComponent, DatepickerComponent };
524
+ //# sourceMappingURL=wzrdev-ngx-datepicker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wzrdev-ngx-datepicker.mjs","sources":["../../../projects/ngx-datepicker/src/lib/locale/fr.ts","../../../projects/ngx-datepicker/src/lib/locale/en.ts","../../../projects/ngx-datepicker/src/lib/locale/locale.service.ts","../../../projects/ngx-datepicker/src/lib/utils/cn.ts","../../../projects/ngx-datepicker/src/lib/calendar/calendar.service.ts","../../../projects/ngx-datepicker/src/lib/calendar/calendar.component.ts","../../../projects/ngx-datepicker/src/lib/calendar/calendar.component.html","../../../projects/ngx-datepicker/src/lib/date-picker-wrapper/date-picker-wrapper.component.ts","../../../projects/ngx-datepicker/src/lib/date-picker-wrapper/date-picker-wrapper.component.html","../../../projects/ngx-datepicker/src/lib/shared/directives/input.directive.ts","../../../projects/ngx-datepicker/src/lib/shared/mixins/with-control-value-accessor.ts","../../../projects/ngx-datepicker/src/lib/datepicker/datepicker.component.ts","../../../projects/ngx-datepicker/src/lib/datepicker/datepicker.component.html","../../../projects/ngx-datepicker/src/lib/date-range-picker/date-range-picker.component.ts","../../../projects/ngx-datepicker/src/lib/date-range-picker/date-range-picker.component.html","../../../projects/ngx-datepicker/src/public-api.ts","../../../projects/ngx-datepicker/src/wzrdev-ngx-datepicker.ts"],"sourcesContent":["import { DatePickerLocale } from \"./locale.model\";\n\nconst currentYear = new Date().getFullYear();\n\nexport const FR_LOCALE: DatePickerLocale = {\n code: \"fr\",\n months: [\n \"Janvier\",\n \"Février\",\n \"Mars\",\n \"Avril\",\n \"Mai\",\n \"Juin\",\n \"Juillet\",\n \"Août\",\n \"Septembre\",\n \"Octobre\",\n \"Novembre\",\n \"Décembre\",\n ],\n weekdays: [\"Lu\", \"Ma\", \"Me\", \"Je\", \"Ve\", \"Sa\", \"Di\"],\n weekStartsOn: 1,\n years: Array.from({ length: 200 }, (_, i) => currentYear - 100 + i),\n format: date => date.toLocaleDateString(\"fr-FR\"),\n};\n","import { DatePickerLocale } from \"./locale.model\";\n\nconst currentYear = new Date().getFullYear();\n\nexport const EN_LOCALE: DatePickerLocale = {\n code: \"en\",\n months: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n weekdays: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n weekStartsOn: 0,\n years: Array.from({ length: 200 }, (_, i) => currentYear - 100 + i),\n format: date => date.toLocaleDateString(\"en-US\"),\n};\n","import { Injectable } from \"@angular/core\";\nimport { BehaviorSubject } from \"rxjs\";\nimport { DatePickerLocale } from \"./locale.model\";\nimport { FR_LOCALE } from \"./fr\";\nimport { EN_LOCALE } from \"./en\";\n\n@Injectable({ providedIn: \"root\" })\nexport class DatePickerLocaleService {\n private readonly locales: Record<string, DatePickerLocale> = {\n fr: FR_LOCALE,\n en: EN_LOCALE,\n };\n\n private locale$ = new BehaviorSubject<DatePickerLocale>(FR_LOCALE);\n\n public setLocale(code: string) {\n this.locale$.next(this.locales[code] ?? FR_LOCALE);\n }\n\n public get localeChanges$() {\n return this.locale$.asObservable();\n }\n\n public get current() {\n return this.locale$.value;\n }\n}\n","import { ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst customTwMerge = extendTailwindMerge({\n extend: {\n classGroups: {},\n },\n});\n\nexport const cn = (...inputs: ClassValue[]) => {\n return customTwMerge(clsx(inputs));\n};\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class CalendarService {}\n","import {\n Component,\n inject,\n output,\n input,\n linkedSignal, ChangeDetectionStrategy, computed, signal, model\n} from \"@angular/core\";\nimport { DatePickerLocaleService } from \"../locale/locale.service\";\nimport { cn } from '../utils/cn';\nimport { DatePipe } from '@angular/common';\nimport { DateRange } from '../shared/models/daterange';\nimport { CalendarService } from './calendar.service';\n\ninterface Day {\n date: Date;\n isToday: boolean;\n isDisabled: boolean;\n isSelected: boolean;\n isInRange: boolean;\n}\n\n@Component({\n selector: \"ngx-calendar\",\n templateUrl: \"./calendar.component.html\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n DatePipe\n ],\n providers: [CalendarService],\n host: {\n \"(keydown)\": \"handleKeyDown($event)\"\n },\n})\nexport class CalendarComponent {\n public readonly locale = inject(DatePickerLocaleService);\n\n public readonly startDate = model<Date | null>();\n public readonly endDate = model<Date | null>();\n public readonly minDate = input<Date | null>();\n public readonly maxDate = input<Date | null>();\n\n public readonly hoveredDate = signal<Date | null>(null);\n public readonly enableRange = input<boolean>(false);\n\n public readonly selectedDate = output<Date>();\n public readonly selectedDateRange = output<DateRange>();\n public readonly selectedDaysCount = output<number>();\n public readonly hoverDate = output<Date>();\n\n public readonly days = linkedSignal(() => {\n const startDate = this.startDate();\n const endDate = this.endDate();\n const displayDate = this.displayDate();\n\n const year = displayDate.getFullYear();\n const month = displayDate.getMonth();\n\n const today = new Date();\n const first = new Date(year, month, 1);\n const last = new Date(year, month + 1, 0);\n\n const days: Day[] = [];\n for (let d = new Date(first); d <= last; d.setDate(d.getDate() + 1)) {\n const day = {\n date: new Date(d),\n isDisabled: this.isDisabled(d),\n isToday: this.isSame(d, today),\n isSelected: this.isSame(d, startDate) || this.isSame(d, endDate),\n isInRange: this.isInRange(d),\n } as Day;\n days.push(day);\n }\n return days;\n });\n\n public daysInRange = computed(() => {\n const days = this.days();\n return days.filter(day => day.isInRange);\n });\n\n public daysDisabled = computed(() => {\n const days = this.days();\n return days.filter(day => day.isDisabled);\n });\n\n public latestDayInRange = computed(() => {\n const rangeDays = this.daysInRange();\n return rangeDays[rangeDays.length - 1];\n });\n\n public latestDayDisabled = computed(() => {\n const daysDisabled = this.daysDisabled();\n return daysDisabled[daysDisabled.length - 1];\n });\n\n public firstDayDisabled = computed(() => {\n const daysDisabled = this.daysDisabled();\n return daysDisabled[0];\n });\n\n public readonly displayDate = linkedSignal(() => {\n const start = this.startDate();\n return start ?? new Date();\n });\n\n public readonly focusedDate = linkedSignal(() => {\n return new Date(this.displayDate());\n });\n\n protected readonly cn = cn;\n\n build() {\n // keep the focusedDate in the current month\n if (this.focusedDate().getMonth() !== this.displayDate().getMonth()) {\n this.focusedDate.set(new Date(this.displayDate().getFullYear(), this.displayDate().getMonth(), 1));\n }\n }\n\n public prevMonth(): void {\n this.displayDate.update((prevState) => {\n return new Date(prevState.getFullYear(), prevState.getMonth() - 1, prevState.getDate());\n })\n }\n\n public nextMonth(): void {\n this.displayDate.update((prevState) => {\n return new Date(prevState.getFullYear(), prevState.getMonth() + 1, prevState.getDate());\n })\n }\n\n public isSame(a?: Date | null, b?: Date | null): boolean {\n if (!a || !b) return false;\n return a.toDateString() === b.toDateString();\n }\n\n public isDisabled(date: Date): boolean {\n const minDate = this.minDate();\n const maxDate = this.maxDate();\n\n const normalize = (d: Date) =>\n new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n\n const current = normalize(date);\n\n if (minDate && current < normalize(minDate)) {\n return true;\n }\n\n return !!(maxDate && current > normalize(maxDate));\n\n\n }\n\n public isInRange(d: Date): boolean {\n const start = this.startDate();\n const end = this.endDate();\n const hover = this.hoveredDate();\n\n if (!start || !d) return false;\n if (start && end) return d >= start && d <= end;\n if (start && hover) {\n return d >= start && d <= hover;\n }\n\n return false;\n };\n\n public onDaySelect(date: Date): void {\n const selectedDays = this.days().filter(day => day.isSelected);\n const startDate = this.startDate();\n const endDate = this.endDate();\n\n\n if (this.enableRange()) {\n\n if (selectedDays.length === 2\n || startDate && date < startDate\n || endDate && endDate <= date\n || endDate && date <= endDate) {\n this.resetStartDate(date);\n }\n\n if (!startDate) {\n this.startDate.set(date);\n } else if (startDate && !endDate && startDate < date) {\n this.endDate.set(date);\n }\n\n } else {\n this.resetStartDate(date);\n }\n\n if (this.enableRange()) {\n this.selectedDateRange.emit({ startDate: this.startDate() ?? null, endDate: this.endDate() ?? null });\n } else {\n this.selectedDate.emit(date);\n }\n this.selectedDaysCount.emit(this.daysInRange().length);\n }\n\n public onDayMouseEnter(date: Date): void {\n if (!this.enableRange() || (this.startDate() && this.endDate())) {\n return;\n }\n this.hoveredDate.set(date);\n }\n\n public handleKeyDown(event: KeyboardEvent): void {\n if (!this.focusedDate) return;\n\n const newDate = new Date(this.focusedDate());\n\n switch (event.key) {\n case \"ArrowRight\":\n newDate.setDate(newDate.getDate() + 1);\n break;\n case \"ArrowLeft\":\n newDate.setDate(newDate.getDate() - 1);\n break;\n case \"ArrowDown\":\n newDate.setDate(newDate.getDate() + 7);\n break;\n case \"ArrowUp\":\n newDate.setDate(newDate.getDate() - 7);\n break;\n case \"Enter\":\n case \" \":\n this.selectedDate.emit(this.focusedDate());\n event.preventDefault();\n return;\n default:\n return; // ignorer les autres touches\n }\n\n event.preventDefault();\n this.focusedDate.set(newDate);\n\n // si le focusedDate est hors du mois courant, changer le mois\n if (\n this.focusedDate().getMonth() !== this.displayDate().getMonth() ||\n this.focusedDate().getFullYear() !== this.displayDate().getFullYear()\n ) {\n this.displayDate.set(new Date(this.focusedDate().getFullYear(), this.focusedDate().getMonth(), 1));\n this.build();\n }\n }\n\n // Pour le template : savoir si la date est focusée pour appliquer style\n isFocused(date: Date) {\n return this.focusedDate && this.isSame(date, this.focusedDate());\n }\n\n private resetStartDate(date: Date): void {\n console.log('reset');\n this.startDate.set(date);\n this.endDate.set(null);\n this.hoveredDate.set(null);\n }\n}\n","<div\n class=\"ngx:w-65 ngx:bg-white ngx:rounded-md ngx:shadow-lg ngx:p-3\"\n id=\"calendar\"\n role=\"dialog\"\n aria-modal=\"true\">\n\n <div class=\"ngx:flex ngx:items-center ngx:mb-2\">\n <button\n class=\"ngx:cursor-pointer ngx:hover:bg-slate-100 ngx:focus:bg-slate-100 ngx:rounded-full ngx:flex ngx:w-10 ngx:h-10 ngx:justify-center ngx:items-center\"\n (click)=\"prevMonth()\" aria-label=\"Previous month\">‹\n </button>\n <p class=\"ngx:grow ngx:text-center ngx:font-medium ngx:text-inherit\">{{ displayDate() | date: 'MMMM yyyy' }}</p>\n <button\n class=\"ngx:cursor-pointer ngx:hover:bg-slate-100 ngx:focus:bg-slate-100 ngx:rounded-full ngx:flex ngx:w-10 ngx:h-10 ngx:justify-center ngx:items-center\"\n (click)=\"nextMonth()\" aria-label=\"Next month\">›\n </button>\n </div>\n\n <!-- Weekdays -->\n <div class=\"ngx:grid ngx:grid-cols-7 ngx:gap-0.5\">\n @for (wd of locale.current.weekdays; track $index) {\n <span class=\"ngx:text-center ngx:py-1 ngx:text-sm ngx:font-medium ngx:text-inherit\">{{ wd }}</span>\n }\n </div>\n\n <div class=\"ngx:grid ngx:grid-cols-7 ngx:gap-y-0.5\">\n @for (day of days(); track $index) {\n <button\n [class]=\"cn(\n 'ngx:relative ngx:cursor-pointer ngx:py-1 ngx:overflow-hidden ngx:text-inherit',\n daysInRange().length < 2 && !day.isDisabled && 'ngx:rounded-full',\n (latestDayInRange() === day || latestDayDisabled() === day) && 'ngx:rounded-r-full',\n day.isDisabled && 'ngx:bg-slate-200 ngx:text-slate-400 ngx:cursor-not-allowed',\n day.isInRange && !day.isDisabled && 'ngx:bg-(--ngx-datepicker-range-color)',\n day.isSelected && !day.isDisabled && 'ngx:bg-(--ngx-datepicker-range-color) ngx:text-(--ngx-datepicker-accent-text-color) ngx:before:absolute ngx:before:top-0 ngx:before:left-0 ngx:before:block ngx:before:w-full ngx:before:h-full ngx:before:z-1 ngx:before:bg-(--ngx-datepicker-accent-color)',\n day.isToday && 'ngx:before:absolute ngx:before:top-0 ngx:before:left-0 ngx:before:block ngx:before:w-full ngx:before:h-full ngx:before:z-1 ngx:before:rounded-full ngx:before:border-2 ngx:before:border-(--ngx-datepicker-accent-color)',\n isSame(day.date, startDate()) && !day.isDisabled && 'ngx:rounded-l-full ngx:before:rounded-full',\n isSame(day.date, endDate()) && 'ngx:rounded-r-full ngx:before:rounded-full'\n )\"\n [attr.aria-selected]=\"isSame(day.date, startDate()) || isSame(day.date, endDate())\"\n [attr.aria-label]=\"locale.current.format(day.date)\"\n [disabled]=\"day.isDisabled\"\n (click)=\"onDaySelect(day.date)\"\n (mouseenter)=\"onDayMouseEnter(day.date)\">\n <span class=\"ngx:relative ngx:z-10\">{{ day.date.getDate() }}</span>\n </button>\n }\n </div>\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { CalendarComponent } from '../calendar/calendar.component';\nimport { DateRange } from '../shared/models/daterange';\n\n@Component({\n selector: 'ngx-date-picker-wrapper',\n templateUrl: './date-picker-wrapper.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CalendarComponent]\n})\nexport class DatePickerWrapperComponent {\n public readonly date = input<Date | null>();\n public readonly endDate = input<Date | null>();\n public readonly hoveredDate = input<Date | null>();\n public readonly minDate = input<Date | null>();\n public readonly maxDate = input<Date | null>();\n\n public readonly label = input.required<string>();\n public readonly openCalendar = input<boolean>();\n public readonly enableRange = input.required<boolean>();\n\n public readonly selectedDate = output<Date | null>();\n public readonly selectedDateRange = output<DateRange>();\n public readonly hoverDate = output<Date>();\n\n public onSelectDate(date: Date | null): void {\n this.selectedDate.emit(date);\n }\n\n public onSelectDateRange(date: DateRange): void {\n this.selectedDateRange.emit(date);\n }\n\n\n public onHoverDate(date: Date): void {\n this.hoverDate.emit(date);\n }\n}\n","<div class=\"ngx:inline-block ngx:relative\">\n <div class=\"ngx:inline-flex ngx:flex-col\">\n <label [for]=\"label()\" class=\"ngx:inline-block ngx:text-left ngx:text-xs ngx:font-semibold ngx:mb-1 ngx:text-slate-900\" for=\"datepicker\">{{ label() }}</label>\n <div\n class=\"ngx:inline-flex ngx:w-auto ngx:items-stretch ngx:rounded-md ngx:bg-slate-100 ngx:focus-within:outline-2 ngx:focus-within:outline-(--ngx-datepicker-outline-color) ngx:focus-within:shadow ngx:overflow-hidden\">\n <ng-content></ng-content>\n </div>\n </div>\n <ngx-calendar\n class=\"ngx:absolute ngx:top-full ngx:left-0 ngx:mt-1 ngx:z-100\"\n [class.ngx:hidden]=\"!openCalendar()\"\n [startDate]=\"date()\"\n [endDate]=\"endDate()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [enableRange]=\"enableRange()\"\n (selectedDate)=\"onSelectDate($event)\"\n (selectedDateRange)=\"onSelectDateRange($event)\"\n (hoverDate)=\"onHoverDate($event)\">\n </ngx-calendar>\n</div>\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[ngxInput]',\n host: {\n class: 'ngx:block ngx:w-full ngx:font-medium ngx:bg-slate-100 ngx:pl-4 ngx:border-0 ngx:outline-0 ngx:appearance-none ngx:[&::-webkit-calendar-picker-indicator]:hidden'\n }\n})\nexport class InputDirective {}\n","import { ControlValueAccessor } from '@angular/forms';\nimport { Constructor } from '../models/constructor';\n\nexport function WithControlValueAccessor<TValue, TBase extends Constructor>(Base: TBase) {\n return class extends Base implements ControlValueAccessor {\n public value!: TValue;\n public disabled = false;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public onChange = (_: TValue) => { /* empty */ };\n public onTouched = () => { /* empty */ };\n\n public writeValue(value: TValue) {\n this.value = value;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public registerOnChange(fn: any) {\n this.onChange = fn;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public registerOnTouched(fn: any) {\n this.onTouched = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n public onInput(value: TValue) {\n this.value = value;\n this.onChange(value);\n }\n\n public onBlur() {\n this.onTouched();\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component, effect, ElementRef, forwardRef, inject, input, InputSignal,\n model,\n ModelSignal,\n output,\n OutputEmitterRef,\n} from '@angular/core';\nimport { DatePickerWrapperComponent } from '../date-picker-wrapper/date-picker-wrapper.component';\nimport { InputDirective } from '../shared/directives/input.directive';\nimport { DatePipe } from '@angular/common';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { WithControlValueAccessor } from '../shared/mixins/with-control-value-accessor';\nimport { DateRange } from '../shared/models/daterange';\n\ninterface DatepickerOption {\n id: InputSignal<string | undefined>;\n date: ModelSignal<Date | null | undefined>;\n openCalendar: ModelSignal<boolean>;\n selectedDate: OutputEmitterRef<Date | null>;\n}\n\n@Component({\n selector: 'ngx-datepicker',\n templateUrl: './datepicker.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n DatePickerWrapperComponent,\n InputDirective,\n DatePipe\n ],\n host: {\n '(document:click)': 'onClickOutside($event)',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DatepickerComponent),\n multi: true,\n },\n ],\n})\nexport class DatepickerComponent extends WithControlValueAccessor<Date, new () => object>(class {}) implements DatepickerOption {\n public readonly id = model<string>();\n public readonly date = model<Date | null>();\n public readonly dateTo = model<Date | null>();\n public readonly minDate = input<Date | null>();\n public readonly maxDate = input<Date | null>();\n public readonly range = input<boolean>(false);\n public readonly isRangeEnd = input<boolean>(false);\n public readonly label = input.required<string>();\n public readonly openCalendar = model<boolean>(false);\n public readonly selectedDate = output<Date | null>();\n public readonly selectedDateRange = output<DateRange | null>();\n\n private readonly el = inject(ElementRef);\n\n constructor() {\n super();\n effect(() => {\n const date = this.date();\n const dateTo = this.dateTo();\n\n if (date) {\n this.updateFormControl(this.isRangeEnd() && dateTo ? dateTo : date);\n }\n });\n }\n\n public onSelectedDateChange(date: Date | null): void {\n if (date) {\n this.updateDate(date);\n }\n if (this.range()) {\n return;\n }\n this.openCalendar.set(false);\n }\n\n public onSelectedDateRangeChange(dateRange: DateRange): void {\n this.selectedDateRange.emit(dateRange);\n if (dateRange.startDate !== null && dateRange.endDate !== null) {\n this.openCalendar.set(false);\n }\n }\n\n public onInputChange(e: Event): void {\n const target = e.target as HTMLInputElement;\n const date = new Date(target.value);\n this.updateDate(date);\n }\n\n public onToggleCalendar(): void {\n this.openCalendar.set(!this.openCalendar());\n }\n\n public onClickOutside(e: Event): void {\n const el = e.target as HTMLElement;\n if (!this.el.nativeElement.contains(el)) {\n this.openCalendar.set(false);\n }\n }\n\n private updateDate(date: Date): void {\n this.date.set(date);\n this.selectedDate.emit(date);\n this.updateFormControl(date);\n }\n\n private updateFormControl(value: Date): void {\n this.value = value;\n this.onChange(value);\n }\n}\n","<ngx-date-picker-wrapper\n [date]=\"date()\"\n [endDate]=\"dateTo()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [enableRange]=\"range()\"\n [label]=\"label()\"\n [openCalendar]=\"openCalendar()\"\n (selectedDate)=\"onSelectedDateChange($event)\"\n (selectedDateRange)=\"onSelectedDateRangeChange($event)\">\n <input\n ngxInput\n type=\"date\"\n placeholder=\"dd/mm/yyyy\"\n [attr.id]=\"label()\"\n [value]=\"value | date: 'yyyy-MM-dd'\"\n (blur)=\"onBlur()\"\n (change)=\"onInputChange($event)\">\n <button\n class=\"ngx:inline-flex ngx:items-center ngx:justify-center ngx:px-4 ngx:py-3 ngx:cursor-pointer ngx:hover:bg-slate-200 ngx:focus:bg-slate-200 ngx:outline-none\"\n (click)=\"onToggleCalendar()\">\n <svg class=\"ngx:text-slate-900 ngx:w-5 ngx:h-5\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\" />\n </svg>\n </button>\n\n</ngx-date-picker-wrapper>\n","import {\n ChangeDetectionStrategy,\n Component, ElementRef,\n inject, input,\n model,\n output,\n} from \"@angular/core\";\nimport { DatePickerLocaleService } from \"../locale/locale.service\";\nimport { DatePickerWrapperComponent } from '../date-picker-wrapper/date-picker-wrapper.component';\nimport { DatePipe } from '@angular/common';\n\nexport interface DateRange {\n startDate: Date | null;\n endDate: Date | null;\n}\n\n@Component({\n selector: \"ngx-date-range-picker\",\n templateUrl: \"./date-range-picker.component.html\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [DatePickerWrapperComponent, DatePipe],\n host: {\n \"(document:click)\": \"onCloseCalendar($event)\",\n \"(keydown.escape)\": \"onEscape()\",\n },\n})\nexport class DateRangePickerComponent {\n public readonly startDate = model<Date | null>();\n public readonly endDate = model<Date | null>();\n public readonly minDate = input<Date | null>();\n public readonly maxDate = input<Date | null>();\n public readonly label = input.required<string>();\n public readonly hoveredDate = model<Date | null>(null);\n public readonly openCalendar = model<boolean>(false);\n public readonly selectedDateRange = output<DateRange | null>();\n\n private readonly el = inject(ElementRef);\n private readonly locale = inject(DatePickerLocaleService);\n\n public close() {\n this.openCalendar.set(false);\n this.hoveredDate.set(null);\n }\n\n public onEscape() {\n this.close();\n }\n\n public onSelectedDateChange(date: DateRange): void {\n this.updateDateRange(date);\n }\n\n public onHoverDateChange(date: Date): void {\n this.hoveredDate.set(date);\n }\n\n public onToggleCalendar(): void {\n this.openCalendar.set(!this.openCalendar());\n }\n\n public onCloseCalendar(e: Event): void {\n const el = e.target as HTMLElement;\n if (!this.el.nativeElement.contains(el)) {\n this.close();\n }\n }\n\n private updateDateRange(date: DateRange): void {\n const startDate = this.startDate();\n const endDate = this.endDate();\n\n if (!startDate || endDate) {\n\n this.startDate.set(date.startDate);\n this.endDate.set(null);\n\n } else if (date.startDate && date.startDate >= startDate) {\n this.endDate.set(date.endDate);\n this.selectedDateRange.emit({ startDate, endDate: this.endDate() ?? null })\n this.close();\n } else {\n this.startDate.set(date.startDate);\n }\n }\n}\n","<ngx-date-picker-wrapper\n [date]=\"startDate()\"\n [hoveredDate]=\"hoveredDate()\"\n [minDate]=\"minDate()\"\n [maxDate]=\"maxDate()\"\n [label]=\"label()\"\n [enableRange]=\"true\"\n [openCalendar]=\"openCalendar()\"\n (selectedDateRange)=\"onSelectedDateChange($event)\"\n (hoverDate)=\"onHoverDateChange($event)\">\n <div class=\"ngx:flex ngx:items-center ngx:gap-x-1 ngx:min-w-54 ngx:pl-4\">\n <div class=\"ngx:grow ngx:relative ngx:overflow-hidden ngx:max-w-22.5\">\n <input\n class=\"ngx:font-medium ngx:w-full ngx:h-full ngx:outline-none ngx:p-0 ngx:m-0 ngx:appearance-none\"\n readonly\n type=\"text\"\n role=\"combobox\"\n placeholder=\"dd/mm/yyyy\"\n aria-controls=\"calendar\"\n aria-haspopup=\"dialog\"\n [attr.id]=\"label()\"\n [attr.aria-expanded]=\"openCalendar()\"\n [value]=\"startDate() | date: 'dd/MM/yyyy'\"\n />\n </div>\n <span>-</span>\n <div class=\"ngx:grow ngx:relative ngx:overflow-hidden ngx:max-w-22.5\">\n <input\n class=\"ngx:font-medium ngx:w-full ngx:h-full ngx:outline-none ngx:p-0 ngx:m-0 ngx:appearance-none\"\n readonly\n type=\"text\"\n role=\"combobox\"\n placeholder=\"dd/mm/yyyy\"\n aria-controls=\"calendar\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"openCalendar()\"\n [value]=\"endDate() | date: 'dd/MM/yyyy'\"\n />\n </div>\n </div>\n <button\n class=\"ngx:flex ngx:items-center ngx:justify-center ngx:px-4 ngx:py-3 ngx:cursor-pointer ngx:hover:bg-slate-200 ngx:focus:bg-slate-200 ngx:outline-none\"\n (click)=\"onToggleCalendar()\">\n <svg class=\"ngx:text-slate-900 ngx:w-5 ngx:h-5\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\" />\n </svg>\n </button>\n</ngx-date-picker-wrapper>\n","/*\n * Public API Surface of ngx-datepicker\n */\n\nexport * from './lib/datepicker/datepicker.component';\nexport * from './lib/date-range-picker/date-range-picker.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["currentYear"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@wzrdev/ngx-datepicker" />
5
+ export * from './public-api';
@@ -0,0 +1,46 @@
1
+ import { DatePickerLocaleService } from "../locale/locale.service";
2
+ import { DateRange } from '../shared/models/daterange';
3
+ import * as i0 from "@angular/core";
4
+ interface Day {
5
+ date: Date;
6
+ isToday: boolean;
7
+ isDisabled: boolean;
8
+ isSelected: boolean;
9
+ isInRange: boolean;
10
+ }
11
+ export declare class CalendarComponent {
12
+ readonly locale: DatePickerLocaleService;
13
+ readonly startDate: import("@angular/core").ModelSignal<Date | null | undefined>;
14
+ readonly endDate: import("@angular/core").ModelSignal<Date | null | undefined>;
15
+ readonly minDate: import("@angular/core").InputSignal<Date | null | undefined>;
16
+ readonly maxDate: import("@angular/core").InputSignal<Date | null | undefined>;
17
+ readonly hoveredDate: import("@angular/core").WritableSignal<Date | null>;
18
+ readonly enableRange: import("@angular/core").InputSignal<boolean>;
19
+ readonly selectedDate: import("@angular/core").OutputEmitterRef<Date>;
20
+ readonly selectedDateRange: import("@angular/core").OutputEmitterRef<DateRange>;
21
+ readonly selectedDaysCount: import("@angular/core").OutputEmitterRef<number>;
22
+ readonly hoverDate: import("@angular/core").OutputEmitterRef<Date>;
23
+ readonly days: import("@angular/core").WritableSignal<Day[]>;
24
+ daysInRange: import("@angular/core").Signal<Day[]>;
25
+ daysDisabled: import("@angular/core").Signal<Day[]>;
26
+ latestDayInRange: import("@angular/core").Signal<Day>;
27
+ latestDayDisabled: import("@angular/core").Signal<Day>;
28
+ firstDayDisabled: import("@angular/core").Signal<Day>;
29
+ readonly displayDate: import("@angular/core").WritableSignal<Date>;
30
+ readonly focusedDate: import("@angular/core").WritableSignal<Date>;
31
+ protected readonly cn: (...inputs: import("clsx").ClassValue[]) => string;
32
+ build(): void;
33
+ prevMonth(): void;
34
+ nextMonth(): void;
35
+ isSame(a?: Date | null, b?: Date | null): boolean;
36
+ isDisabled(date: Date): boolean;
37
+ isInRange(d: Date): boolean;
38
+ onDaySelect(date: Date): void;
39
+ onDayMouseEnter(date: Date): void;
40
+ handleKeyDown(event: KeyboardEvent): void;
41
+ isFocused(date: Date): boolean;
42
+ private resetStartDate;
43
+ static ɵfac: i0.ɵɵFactoryDeclaration<CalendarComponent, never>;
44
+ static ɵcmp: i0.ɵɵComponentDeclaration<CalendarComponent, "ngx-calendar", never, { "startDate": { "alias": "startDate"; "required": false; "isSignal": true; }; "endDate": { "alias": "endDate"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "enableRange": { "alias": "enableRange"; "required": false; "isSignal": true; }; }, { "startDate": "startDateChange"; "endDate": "endDateChange"; "selectedDate": "selectedDate"; "selectedDateRange": "selectedDateRange"; "selectedDaysCount": "selectedDaysCount"; "hoverDate": "hoverDate"; }, never, never, true, never>;
45
+ }
46
+ export {};
@@ -0,0 +1,5 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class CalendarService {
3
+ static ɵfac: i0.ɵɵFactoryDeclaration<CalendarService, never>;
4
+ static ɵprov: i0.ɵɵInjectableDeclaration<CalendarService>;
5
+ }
@@ -0,0 +1,20 @@
1
+ import { DateRange } from '../shared/models/daterange';
2
+ import * as i0 from "@angular/core";
3
+ export declare class DatePickerWrapperComponent {
4
+ readonly date: import("@angular/core").InputSignal<Date | null | undefined>;
5
+ readonly endDate: import("@angular/core").InputSignal<Date | null | undefined>;
6
+ readonly hoveredDate: import("@angular/core").InputSignal<Date | null | undefined>;
7
+ readonly minDate: import("@angular/core").InputSignal<Date | null | undefined>;
8
+ readonly maxDate: import("@angular/core").InputSignal<Date | null | undefined>;
9
+ readonly label: import("@angular/core").InputSignal<string>;
10
+ readonly openCalendar: import("@angular/core").InputSignal<boolean | undefined>;
11
+ readonly enableRange: import("@angular/core").InputSignal<boolean>;
12
+ readonly selectedDate: import("@angular/core").OutputEmitterRef<Date | null>;
13
+ readonly selectedDateRange: import("@angular/core").OutputEmitterRef<DateRange>;
14
+ readonly hoverDate: import("@angular/core").OutputEmitterRef<Date>;
15
+ onSelectDate(date: Date | null): void;
16
+ onSelectDateRange(date: DateRange): void;
17
+ onHoverDate(date: Date): void;
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<DatePickerWrapperComponent, never>;
19
+ static ɵcmp: i0.ɵɵComponentDeclaration<DatePickerWrapperComponent, "ngx-date-picker-wrapper", never, { "date": { "alias": "date"; "required": false; "isSignal": true; }; "endDate": { "alias": "endDate"; "required": false; "isSignal": true; }; "hoveredDate": { "alias": "hoveredDate"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "openCalendar": { "alias": "openCalendar"; "required": false; "isSignal": true; }; "enableRange": { "alias": "enableRange"; "required": true; "isSignal": true; }; }, { "selectedDate": "selectedDate"; "selectedDateRange": "selectedDateRange"; "hoverDate": "hoverDate"; }, never, ["*"], true, never>;
20
+ }
@@ -0,0 +1,26 @@
1
+ import * as i0 from "@angular/core";
2
+ export interface DateRange {
3
+ startDate: Date | null;
4
+ endDate: Date | null;
5
+ }
6
+ export declare class DateRangePickerComponent {
7
+ readonly startDate: import("@angular/core").ModelSignal<Date | null | undefined>;
8
+ readonly endDate: import("@angular/core").ModelSignal<Date | null | undefined>;
9
+ readonly minDate: import("@angular/core").InputSignal<Date | null | undefined>;
10
+ readonly maxDate: import("@angular/core").InputSignal<Date | null | undefined>;
11
+ readonly label: import("@angular/core").InputSignal<string>;
12
+ readonly hoveredDate: import("@angular/core").ModelSignal<Date | null>;
13
+ readonly openCalendar: import("@angular/core").ModelSignal<boolean>;
14
+ readonly selectedDateRange: import("@angular/core").OutputEmitterRef<DateRange | null>;
15
+ private readonly el;
16
+ private readonly locale;
17
+ close(): void;
18
+ onEscape(): void;
19
+ onSelectedDateChange(date: DateRange): void;
20
+ onHoverDateChange(date: Date): void;
21
+ onToggleCalendar(): void;
22
+ onCloseCalendar(e: Event): void;
23
+ private updateDateRange;
24
+ static ɵfac: i0.ɵɵFactoryDeclaration<DateRangePickerComponent, never>;
25
+ static ɵcmp: i0.ɵɵComponentDeclaration<DateRangePickerComponent, "ngx-date-range-picker", never, { "startDate": { "alias": "startDate"; "required": false; "isSignal": true; }; "endDate": { "alias": "endDate"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "hoveredDate": { "alias": "hoveredDate"; "required": false; "isSignal": true; }; "openCalendar": { "alias": "openCalendar"; "required": false; "isSignal": true; }; }, { "startDate": "startDateChange"; "endDate": "endDateChange"; "hoveredDate": "hoveredDateChange"; "openCalendar": "openCalendarChange"; "selectedDateRange": "selectedDateRange"; }, never, never, true, never>;
26
+ }
@@ -0,0 +1,48 @@
1
+ import { InputSignal, ModelSignal, OutputEmitterRef } from '@angular/core';
2
+ import { DateRange } from '../shared/models/daterange';
3
+ import * as i0 from "@angular/core";
4
+ interface DatepickerOption {
5
+ id: InputSignal<string | undefined>;
6
+ date: ModelSignal<Date | null | undefined>;
7
+ openCalendar: ModelSignal<boolean>;
8
+ selectedDate: OutputEmitterRef<Date | null>;
9
+ }
10
+ declare const DatepickerComponent_base: {
11
+ new (...args: any[]): {
12
+ value: Date;
13
+ disabled: boolean;
14
+ onChange: (_: Date) => void;
15
+ onTouched: () => void;
16
+ writeValue(value: Date): void;
17
+ registerOnChange(fn: any): void;
18
+ registerOnTouched(fn: any): void;
19
+ setDisabledState(isDisabled: boolean): void;
20
+ onInput(value: Date): void;
21
+ onBlur(): void;
22
+ };
23
+ } & (new () => object);
24
+ export declare class DatepickerComponent extends DatepickerComponent_base implements DatepickerOption {
25
+ readonly id: ModelSignal<string | undefined>;
26
+ readonly date: ModelSignal<Date | null | undefined>;
27
+ readonly dateTo: ModelSignal<Date | null | undefined>;
28
+ readonly minDate: InputSignal<Date | null | undefined>;
29
+ readonly maxDate: InputSignal<Date | null | undefined>;
30
+ readonly range: InputSignal<boolean>;
31
+ readonly isRangeEnd: InputSignal<boolean>;
32
+ readonly label: InputSignal<string>;
33
+ readonly openCalendar: ModelSignal<boolean>;
34
+ readonly selectedDate: OutputEmitterRef<Date | null>;
35
+ readonly selectedDateRange: OutputEmitterRef<DateRange | null>;
36
+ private readonly el;
37
+ constructor();
38
+ onSelectedDateChange(date: Date | null): void;
39
+ onSelectedDateRangeChange(dateRange: DateRange): void;
40
+ onInputChange(e: Event): void;
41
+ onToggleCalendar(): void;
42
+ onClickOutside(e: Event): void;
43
+ private updateDate;
44
+ private updateFormControl;
45
+ static ɵfac: i0.ɵɵFactoryDeclaration<DatepickerComponent, never>;
46
+ static ɵcmp: i0.ɵɵComponentDeclaration<DatepickerComponent, "ngx-datepicker", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": false; "isSignal": true; }; "dateTo": { "alias": "dateTo"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "range": { "alias": "range"; "required": false; "isSignal": true; }; "isRangeEnd": { "alias": "isRangeEnd"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "openCalendar": { "alias": "openCalendar"; "required": false; "isSignal": true; }; }, { "id": "idChange"; "date": "dateChange"; "dateTo": "dateToChange"; "openCalendar": "openCalendarChange"; "selectedDate": "selectedDate"; "selectedDateRange": "selectedDateRange"; }, never, never, true, never>;
47
+ }
48
+ export {};
@@ -0,0 +1,2 @@
1
+ import { DatePickerLocale } from "./locale.model";
2
+ export declare const EN_LOCALE: DatePickerLocale;
@@ -0,0 +1,2 @@
1
+ import { DatePickerLocale } from "./locale.model";
2
+ export declare const FR_LOCALE: DatePickerLocale;
@@ -0,0 +1,8 @@
1
+ export interface DatePickerLocale {
2
+ code: string;
3
+ months: string[];
4
+ weekdays: string[];
5
+ weekStartsOn: 0 | 1;
6
+ format(date: Date): string;
7
+ years: number[];
8
+ }
@@ -0,0 +1,11 @@
1
+ import { DatePickerLocale } from "./locale.model";
2
+ import * as i0 from "@angular/core";
3
+ export declare class DatePickerLocaleService {
4
+ private readonly locales;
5
+ private locale$;
6
+ setLocale(code: string): void;
7
+ get localeChanges$(): import("rxjs").Observable<DatePickerLocale>;
8
+ get current(): DatePickerLocale;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<DatePickerLocaleService, never>;
10
+ static ɵprov: i0.ɵɵInjectableDeclaration<DatePickerLocaleService>;
11
+ }
@@ -0,0 +1,5 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class InputDirective {
3
+ static ɵfac: i0.ɵɵFactoryDeclaration<InputDirective, never>;
4
+ static ɵdir: i0.ɵɵDirectiveDeclaration<InputDirective, "[ngxInput]", never, {}, {}, never, never, true, never>;
5
+ }
@@ -0,0 +1,15 @@
1
+ import { Constructor } from '../models/constructor';
2
+ export declare function WithControlValueAccessor<TValue, TBase extends Constructor>(Base: TBase): {
3
+ new (...args: any[]): {
4
+ value: TValue;
5
+ disabled: boolean;
6
+ onChange: (_: TValue) => void;
7
+ onTouched: () => void;
8
+ writeValue(value: TValue): void;
9
+ registerOnChange(fn: any): void;
10
+ registerOnTouched(fn: any): void;
11
+ setDisabledState(isDisabled: boolean): void;
12
+ onInput(value: TValue): void;
13
+ onBlur(): void;
14
+ };
15
+ } & TBase;
@@ -0,0 +1 @@
1
+ export type Constructor<T = object> = new (...args: any[]) => T;
@@ -0,0 +1,4 @@
1
+ export interface DateRange {
2
+ startDate: Date | null;
3
+ endDate: Date | null;
4
+ }
@@ -0,0 +1,2 @@
1
+ import { ClassValue } from "clsx";
2
+ export declare const cn: (...inputs: ClassValue[]) => string;
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@wzrdev/ngx-datepicker",
3
+ "version": "0.1.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^19.2.0",
6
+ "@angular/core": "^19.2.0"
7
+ },
8
+ "dependencies": {
9
+ "tslib": "^2.3.0"
10
+ },
11
+ "sideEffects": false,
12
+ "module": "fesm2022/wzrdev-ngx-datepicker.mjs",
13
+ "typings": "index.d.ts",
14
+ "exports": {
15
+ "./package.json": {
16
+ "default": "./package.json"
17
+ },
18
+ ".": {
19
+ "types": "./index.d.ts",
20
+ "default": "./fesm2022/wzrdev-ngx-datepicker.mjs"
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,2 @@
1
+ export * from './lib/datepicker/datepicker.component';
2
+ export * from './lib/date-range-picker/date-range-picker.component';
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
2
+ @import "https://fonts.googleapis.com/css2?family=Montserrat+Alternates:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap";@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-content:""}}}@layer theme{:root,:host{--ngx-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--ngx-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ngx-color-slate-100:oklch(96.8% .007 247.896);--ngx-color-slate-200:oklch(92.9% .013 255.508);--ngx-color-slate-400:oklch(70.4% .04 256.788);--ngx-color-slate-900:oklch(20.8% .042 265.755);--ngx-color-white:#fff;--ngx-spacing:.25rem;--ngx-text-xs:.75rem;--ngx-text-xs--line-height:calc(1/.75);--ngx-text-sm:.875rem;--ngx-text-sm--line-height:calc(1.25/.875);--ngx-font-weight-medium:500;--ngx-font-weight-semibold:600;--ngx-radius-md:.375rem;--ngx-default-font-family:var(--ngx-font-sans);--ngx-default-mono-font-family:var(--ngx-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--ngx-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--ngx-default-font-feature-settings,normal);font-variation-settings:var(--ngx-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--ngx-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--ngx-default-mono-font-feature-settings,normal);font-variation-settings:var(--ngx-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.ngx\:absolute{position:absolute}.ngx\:relative{position:relative}.ngx\:top-full{top:100%}.ngx\:left-0{left:calc(var(--ngx-spacing)*0)}.ngx\:z-10{z-index:10}.ngx\:z-100{z-index:100}.ngx\:m-0{margin:calc(var(--ngx-spacing)*0)}.ngx\:mx-auto{margin-inline:auto}.ngx\:mt-1{margin-top:calc(var(--ngx-spacing)*1)}.ngx\:mt-2{margin-top:calc(var(--ngx-spacing)*2)}.ngx\:mb-1{margin-bottom:calc(var(--ngx-spacing)*1)}.ngx\:mb-2{margin-bottom:calc(var(--ngx-spacing)*2)}.ngx\:block{display:block}.ngx\:flex{display:flex}.ngx\:grid{display:grid}.ngx\:hidden{display:none}.ngx\:inline-block{display:inline-block}.ngx\:inline-flex{display:inline-flex}.ngx\:h-5{height:calc(var(--ngx-spacing)*5)}.ngx\:h-10{height:calc(var(--ngx-spacing)*10)}.ngx\:h-full{height:100%}.ngx\:w-5{width:calc(var(--ngx-spacing)*5)}.ngx\:w-10{width:calc(var(--ngx-spacing)*10)}.ngx\:w-65{width:calc(var(--ngx-spacing)*65)}.ngx\:w-auto{width:auto}.ngx\:w-full{width:100%}.ngx\:max-w-22\.5{max-width:calc(var(--ngx-spacing)*22.5)}.ngx\:max-w-300{max-width:calc(var(--ngx-spacing)*300)}.ngx\:min-w-54{min-width:calc(var(--ngx-spacing)*54)}.ngx\:grow{flex-grow:1}.ngx\:cursor-not-allowed{cursor:not-allowed}.ngx\:cursor-pointer{cursor:pointer}.ngx\:appearance-none{appearance:none}.ngx\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.ngx\:flex-col{flex-direction:column}.ngx\:items-center{align-items:center}.ngx\:items-stretch{align-items:stretch}.ngx\:justify-center{justify-content:center}.ngx\:gap-0\.5{gap:calc(var(--ngx-spacing)*.5)}.ngx\:gap-4{gap:calc(var(--ngx-spacing)*4)}.ngx\:gap-x-1{column-gap:calc(var(--ngx-spacing)*1)}.ngx\:gap-x-2{column-gap:calc(var(--ngx-spacing)*2)}.ngx\:gap-x-4{column-gap:calc(var(--ngx-spacing)*4)}.ngx\:gap-y-0\.5{row-gap:calc(var(--ngx-spacing)*.5)}.ngx\:overflow-hidden{overflow:hidden}.ngx\:rounded-full{border-radius:3.40282e38px}.ngx\:rounded-md{border-radius:var(--ngx-radius-md)}.ngx\:rounded-l-full{border-top-left-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.ngx\:rounded-r-full{border-top-right-radius:3.40282e38px;border-bottom-right-radius:3.40282e38px}.ngx\:border{border-style:var(--tw-border-style);border-width:1px}.ngx\:border-0{border-style:var(--tw-border-style);border-width:0}.ngx\:border-slate-200{border-color:var(--ngx-color-slate-200)}.ngx\:bg-\(--ngx-datepicker-range-color\){background-color:var(--ngx-datepicker-range-color)}.ngx\:bg-slate-100{background-color:var(--ngx-color-slate-100)}.ngx\:bg-slate-200{background-color:var(--ngx-color-slate-200)}.ngx\:bg-white{background-color:var(--ngx-color-white)}.ngx\:p-0{padding:calc(var(--ngx-spacing)*0)}.ngx\:p-3{padding:calc(var(--ngx-spacing)*3)}.ngx\:p-4{padding:calc(var(--ngx-spacing)*4)}.ngx\:px-4{padding-inline:calc(var(--ngx-spacing)*4)}.ngx\:px-5{padding-inline:calc(var(--ngx-spacing)*5)}.ngx\:py-1{padding-block:calc(var(--ngx-spacing)*1)}.ngx\:py-3{padding-block:calc(var(--ngx-spacing)*3)}.ngx\:pl-4{padding-left:calc(var(--ngx-spacing)*4)}.ngx\:text-center{text-align:center}.ngx\:text-left{text-align:left}.ngx\:text-sm{font-size:var(--ngx-text-sm);line-height:var(--tw-leading,var(--ngx-text-sm--line-height))}.ngx\:text-xs{font-size:var(--ngx-text-xs);line-height:var(--tw-leading,var(--ngx-text-xs--line-height))}.ngx\:font-medium{--tw-font-weight:var(--ngx-font-weight-medium);font-weight:var(--ngx-font-weight-medium)}.ngx\:font-semibold{--tw-font-weight:var(--ngx-font-weight-semibold);font-weight:var(--ngx-font-weight-semibold)}.ngx\:text-\(--ngx-datepicker-accent-text-color\){color:var(--ngx-datepicker-accent-text-color)}.ngx\:text-inherit{color:inherit}.ngx\:text-slate-400{color:var(--ngx-color-slate-400)}.ngx\:text-slate-900{color:var(--ngx-color-slate-900)}.ngx\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ngx\:outline-0{outline-style:var(--tw-outline-style);outline-width:0}.ngx\:outline-none{--tw-outline-style:none;outline-style:none}.ngx\:before\:absolute:before{content:var(--tw-content);position:absolute}.ngx\:before\:top-0:before{content:var(--tw-content);top:calc(var(--ngx-spacing)*0)}.ngx\:before\:left-0:before{content:var(--tw-content);left:calc(var(--ngx-spacing)*0)}.ngx\:before\:z-1:before{content:var(--tw-content);z-index:1}.ngx\:before\:block:before{content:var(--tw-content);display:block}.ngx\:before\:h-full:before{content:var(--tw-content);height:100%}.ngx\:before\:w-full:before{content:var(--tw-content);width:100%}.ngx\:before\:rounded-full:before{content:var(--tw-content);border-radius:3.40282e38px}.ngx\:before\:border-2:before{content:var(--tw-content);border-style:var(--tw-border-style);border-width:2px}.ngx\:before\:border-\(--ngx-datepicker-accent-color\):before{content:var(--tw-content);border-color:var(--ngx-datepicker-accent-color)}.ngx\:before\:bg-\(--ngx-datepicker-accent-color\):before{content:var(--tw-content);background-color:var(--ngx-datepicker-accent-color)}.ngx\:focus-within\:shadow:focus-within{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ngx\:focus-within\:outline-2:focus-within{outline-style:var(--tw-outline-style);outline-width:2px}.ngx\:focus-within\:outline-\(--ngx-datepicker-outline-color\):focus-within{outline-color:var(--ngx-datepicker-outline-color)}@media (hover:hover){.ngx\:hover\:bg-slate-100:hover{background-color:var(--ngx-color-slate-100)}.ngx\:hover\:bg-slate-200:hover{background-color:var(--ngx-color-slate-200)}}.ngx\:focus\:bg-slate-100:focus{background-color:var(--ngx-color-slate-100)}.ngx\:focus\:bg-slate-200:focus{background-color:var(--ngx-color-slate-200)}.ngx\:\[\&\:\:-webkit-calendar-picker-indicator\]\:hidden::-webkit-calendar-picker-indicator{display:none}}.gh-dark-code{color:#c9d1d9;background:#0d1117;border:1px solid #30363d;border-radius:8px;padding:16px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:13px;line-height:1.5;display:block;overflow-x:auto}.gh-dark-code pre{flex-direction:column;gap:6px;margin:0;display:flex}.gh-dark-code span{color:#79c0ff}.gh-dark-code strong{color:#ffa657;font-weight:600}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Montserrat Alternates,serif}:root{--ngx-datepicker-outline-color:oklch(54.6% .245 262.881);--ngx-datepicker-accent-color:oklch(54.6% .245 262.881);--ngx-datepicker-accent-text-color:#fff;--ngx-datepicker-range-color:oklch(88.2% .059 254.128)}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-content{syntax:"*";inherits:false;initial-value:""}