ngx-kit 6.1.0 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +3 -3
  2. package/angle-selector/README.md +34 -34
  3. package/box-shadow/README.md +33 -33
  4. package/color-picker/README.md +49 -49
  5. package/data-table/README.md +113 -113
  6. package/date-picker/README.md +69 -69
  7. package/dialog/README.md +92 -92
  8. package/drawer-menu/README.md +110 -62
  9. package/dropzone/README.md +422 -422
  10. package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
  11. package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
  12. package/fesm2022/ngx-kit-box-shadow.mjs +2 -2
  13. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  14. package/fesm2022/ngx-kit-color-picker.mjs +4 -4
  15. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  16. package/fesm2022/ngx-kit-data-table.mjs +2 -2
  17. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  18. package/fesm2022/ngx-kit-date-picker.mjs +1324 -200
  19. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  20. package/fesm2022/ngx-kit-dialog.mjs +2 -2
  21. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  22. package/fesm2022/ngx-kit-drawer-menu.mjs +302 -140
  23. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
  24. package/fesm2022/ngx-kit-dropzone.mjs +2 -2
  25. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  26. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  27. package/fesm2022/ngx-kit-gallery.mjs +2 -2
  28. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  29. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  30. package/fesm2022/ngx-kit-image-editor.mjs +75 -11
  31. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
  32. package/fesm2022/ngx-kit-menu.mjs +8 -8
  33. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  34. package/fesm2022/ngx-kit-message.mjs +2 -2
  35. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  36. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  37. package/fesm2022/ngx-kit-shared.mjs +2 -2
  38. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  39. package/fesm2022/ngx-kit-time-picker.mjs +2 -2
  40. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
  41. package/gallery/README.md +71 -71
  42. package/gradient-picker/README.md +41 -41
  43. package/menu/README.md +85 -85
  44. package/message/README.md +70 -70
  45. package/notify/README.md +58 -58
  46. package/package.json +1 -1
  47. package/shared/README.md +117 -117
  48. package/time-picker/README.md +95 -95
  49. package/types/ngx-kit-date-picker.d.ts +303 -36
  50. package/types/ngx-kit-drawer-menu.d.ts +97 -86
  51. package/types/ngx-kit-dropzone.d.ts +5 -5
  52. package/types/ngx-kit-image-editor.d.ts +29 -4
@@ -1,9 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, Injectable, EventEmitter, forwardRef, Output, Input, Component, input, ViewContainerRef, Renderer2, HostListener, Directive, viewChild } from '@angular/core';
2
+ import { InjectionToken, inject, Injectable, input, EventEmitter, forwardRef, Output, Input, Component, ViewContainerRef, Renderer2, HostListener, Directive, viewChild, ChangeDetectionStrategy } from '@angular/core';
3
3
  import { NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
4
4
  import * as i1 from '@angular/common';
5
5
  import { CommonModule } from '@angular/common';
6
- import { BrowserService, OverlayService } from 'ngx-kit/shared';
6
+ import { OverlayService } from 'ngx-kit/shared';
7
7
 
8
8
  class NgxDatePickerConfig {
9
9
  previousButtonTemplate;
@@ -11,8 +11,6 @@ class NgxDatePickerConfig {
11
11
  caretDownIconTemplate;
12
12
  todayButton = true;
13
13
  clearButton = true;
14
- clearButtonText = 'Clear';
15
- todayButtonText = 'Today';
16
14
  }
17
15
 
18
16
  /**
@@ -185,6 +183,7 @@ function twoDigitPad(num) {
185
183
 
186
184
  class GregorianAdapter {
187
185
  startOfWeek = 0;
186
+ weekStartDay = 0;
188
187
  get longMonths() {
189
188
  return [
190
189
  'January',
@@ -299,13 +298,26 @@ class GregorianAdapter {
299
298
  // return new Date(date).toLocaleDateString('en-US', option);
300
299
  return genFormatDate(date, format, this.longMonths, this.longDays);
301
300
  }
301
+ getStartOfWeek(date) {
302
+ const d = new Date(date);
303
+ d.setHours(0, 0, 0, 0);
304
+ const delta = (d.getDay() - this.weekStartDay + 7) % 7;
305
+ d.setDate(d.getDate() - delta);
306
+ return d;
307
+ }
308
+ getEndOfWeek(date) {
309
+ const d = this.getStartOfWeek(date);
310
+ d.setDate(d.getDate() + 6);
311
+ d.setHours(23, 59, 59, 999);
312
+ return d;
313
+ }
302
314
  getStartOf(date, t) {
303
315
  if (!date) {
304
316
  return date;
305
317
  }
306
318
  switch (t) {
307
319
  case 'year':
308
- return new Date(date.getFullYear(), 1, 1);
320
+ return new Date(date.getFullYear(), 0, 1);
309
321
  case 'month':
310
322
  return new Date(date.getFullYear(), date.getMonth(), 1);
311
323
  case 'day':
@@ -615,6 +627,7 @@ var Jalali;
615
627
  class JalaliAdapter {
616
628
  // shanbeh
617
629
  startOfWeek = 1;
630
+ weekStartDay = 6;
618
631
  dariMonth = false;
619
632
  get longMonths() {
620
633
  return [
@@ -654,7 +667,7 @@ class JalaliAdapter {
654
667
  minutes: date.getMinutes(),
655
668
  seconds: date.getSeconds(),
656
669
  milliseconds: date.getMilliseconds(),
657
- dayOfWeek: date.getDay() + this.startOfWeek,
670
+ dayOfWeek: (date.getDay() + this.startOfWeek) % 7,
658
671
  };
659
672
  }
660
673
  today() {
@@ -763,6 +776,19 @@ class JalaliAdapter {
763
776
  return genFormatDate(date, format, this.longMonths, this.longDays);
764
777
  }
765
778
  // _______________________________________________________________________________________
779
+ getStartOfWeek(date) {
780
+ const d = new Date(date);
781
+ d.setHours(0, 0, 0, 0);
782
+ const delta = (d.getDay() - this.weekStartDay + 7) % 7;
783
+ d.setDate(d.getDate() - delta);
784
+ return d;
785
+ }
786
+ getEndOfWeek(date) {
787
+ const d = this.getStartOfWeek(date);
788
+ d.setDate(d.getDate() + 6);
789
+ d.setHours(23, 59, 59, 999);
790
+ return d;
791
+ }
766
792
  getStartOf(date, t) {
767
793
  if (!date) {
768
794
  return date;
@@ -925,6 +951,7 @@ var HijriConverter;
925
951
  class HijriAdapter {
926
952
  /** یکشنبه = 0 (هم‌خوان با تقویم میلادی برای سادگی) */
927
953
  startOfWeek = 0;
954
+ weekStartDay = 0;
928
955
  get longMonths() {
929
956
  return [
930
957
  'محرم',
@@ -1010,6 +1037,19 @@ class HijriAdapter {
1010
1037
  }
1011
1038
  return new Intl.DateTimeFormat('ar-SA-u-ca-islamic-umalqura', options).format(jsDate);
1012
1039
  }
1040
+ getStartOfWeek(date) {
1041
+ const d = new Date(date);
1042
+ d.setHours(0, 0, 0, 0);
1043
+ const delta = (d.getDay() - this.weekStartDay + 7) % 7;
1044
+ d.setDate(d.getDate() - delta);
1045
+ return d;
1046
+ }
1047
+ getEndOfWeek(date) {
1048
+ const d = this.getStartOfWeek(date);
1049
+ d.setDate(d.getDate() + 6);
1050
+ d.setHours(23, 59, 59, 999);
1051
+ return d;
1052
+ }
1013
1053
  getStartOf(date, t) {
1014
1054
  if (!date)
1015
1055
  return date;
@@ -1252,6 +1292,7 @@ var ChineseConverter;
1252
1292
  class ChineseAdapter {
1253
1293
  /** یکشنبه = 0 */
1254
1294
  startOfWeek = 0;
1295
+ weekStartDay = 0;
1255
1296
  get longMonths() {
1256
1297
  return [
1257
1298
  '正月',
@@ -1342,6 +1383,19 @@ class ChineseAdapter {
1342
1383
  }
1343
1384
  return new Intl.DateTimeFormat('zh-CN-u-ca-chinese', options).format(jsDate);
1344
1385
  }
1386
+ getStartOfWeek(date) {
1387
+ const d = new Date(date);
1388
+ d.setHours(0, 0, 0, 0);
1389
+ const delta = (d.getDay() - this.weekStartDay + 7) % 7;
1390
+ d.setDate(d.getDate() - delta);
1391
+ return d;
1392
+ }
1393
+ getEndOfWeek(date) {
1394
+ const d = this.getStartOfWeek(date);
1395
+ d.setDate(d.getDate() + 6);
1396
+ d.setHours(23, 59, 59, 999);
1397
+ return d;
1398
+ }
1345
1399
  getStartOf(date, t) {
1346
1400
  if (!date)
1347
1401
  return date;
@@ -1440,6 +1494,22 @@ class NgxDatePickerBase {
1440
1494
  minDate = null;
1441
1495
  maxDate = null;
1442
1496
  renderCalendar(view, selected, events, callback) {
1497
+ switch (view) {
1498
+ case 'month':
1499
+ this.renderDay(selected, events);
1500
+ break;
1501
+ case 'week':
1502
+ this.renderWeek();
1503
+ break;
1504
+ case 'day':
1505
+ this.renderWeek();
1506
+ break;
1507
+ }
1508
+ this.displayMonth = this.months[this.currMonth] ?? '';
1509
+ if (callback)
1510
+ callback();
1511
+ }
1512
+ renderِDatePicker(view, selected, events, callback) {
1443
1513
  switch (view) {
1444
1514
  case 'day':
1445
1515
  this.renderDay(selected, events);
@@ -1450,14 +1520,10 @@ class NgxDatePickerBase {
1450
1520
  case 'year':
1451
1521
  this.renderYear();
1452
1522
  break;
1453
- case 'week':
1454
- this.renderWeek();
1455
- break;
1456
1523
  }
1457
- this.displayMonth = this.months[this.currMonth];
1458
- if (callback) {
1524
+ this.displayMonth = this.months[this.currMonth] ?? '';
1525
+ if (callback)
1459
1526
  callback();
1460
- }
1461
1527
  }
1462
1528
  renderYear() {
1463
1529
  this.viewYears = [];
@@ -1482,10 +1548,9 @@ class NgxDatePickerBase {
1482
1548
  });
1483
1549
  }
1484
1550
  }
1485
- /** only in calendar view */
1486
- renderWeek() {
1551
+ renderWeek(anchorDate) {
1487
1552
  this.viewWeeks = [];
1488
- for (let t = 0; t <= 24; t = t + 0.5) {
1553
+ for (let t = 0; t < 24; t += 0.5) {
1489
1554
  this.viewWeeks.push({
1490
1555
  time: t,
1491
1556
  displayTime: convertNumberToTime(t),
@@ -1495,134 +1560,172 @@ class NgxDatePickerBase {
1495
1560
  });
1496
1561
  }
1497
1562
  }
1498
- renderDay(selected, _events) {
1563
+ /** Returns the seven real dates belonging to the locale's week. */
1564
+ getWeekDates(anchor) {
1565
+ const start = this.adapter.getStartOfWeek(anchor);
1566
+ return Array.from({ length: 7 }, (_, index) => {
1567
+ const d = new Date(start);
1568
+ d.setDate(start.getDate() + index);
1569
+ d.setHours(0, 0, 0, 0);
1570
+ return d;
1571
+ });
1572
+ }
1573
+ getEventsForDate(date, events) {
1574
+ return this.getEvents(date, events);
1575
+ }
1576
+ normalizeEvent(event) {
1577
+ const start = event.start instanceof Date ? new Date(event.start) : new Date(event.start);
1578
+ const rawEnd = event.end
1579
+ ? event.end instanceof Date
1580
+ ? new Date(event.end)
1581
+ : new Date(event.end)
1582
+ : new Date(start);
1583
+ if (Number.isNaN(start.getTime()))
1584
+ return { event, start: new Date(NaN), end: new Date(NaN) };
1585
+ // Day-calendar events use an inclusive end date. For timed events, the actual
1586
+ // end instant is respected. An omitted end means a one-day event.
1587
+ const end = Number.isNaN(rawEnd.getTime()) ? new Date(start) : rawEnd;
1588
+ return { event, start, end: end < start ? new Date(start) : end };
1589
+ }
1590
+ /**
1591
+ * Renders a 6-row month grid and attaches events to every visible day.
1592
+ *
1593
+ * The event list is normalized to MsEventViewer so the template can draw
1594
+ * continuation edges similar to FullCalendar's month view.
1595
+ */
1596
+ renderDay(selected, events) {
1499
1597
  this.viewDays = [];
1500
- let firstDayofMonth = this.adapter.firstDayofMonth(this.currYear, this.currMonth);
1501
- let lastDateofMonth = this.adapter.lastDateofMonth(this.currYear, this.currMonth);
1502
- let lastDayofMonth = this.adapter.lastDayofMonth(this.currYear, this.currMonth);
1503
- let lastDateofLastMonth = this.adapter.lastDateofLastMonth(this.currYear, this.currMonth);
1504
- for (let i = firstDayofMonth; i > 0; i--) {
1505
- const d = lastDateofLastMonth - i + 1;
1598
+ const firstDayOfMonth = this.adapter.firstDayofMonth(this.currYear, this.currMonth);
1599
+ const lastDateOfMonth = this.adapter.lastDateofMonth(this.currYear, this.currMonth);
1600
+ const lastDayOfMonth = this.adapter.lastDayofMonth(this.currYear, this.currMonth);
1601
+ const lastDateOfLastMonth = this.adapter.lastDateofLastMonth(this.currYear, this.currMonth);
1602
+ for (let i = firstDayOfMonth; i > 0; i--) {
1603
+ const day = lastDateOfLastMonth - i + 1;
1506
1604
  const date = this.adapter.getDate({
1507
1605
  locale: this._locale,
1508
1606
  year: this.currYear,
1509
1607
  month: this.currMonth - 1,
1510
- day: d,
1608
+ day,
1511
1609
  });
1512
1610
  this.viewDays.push({
1513
- day: d,
1611
+ day,
1514
1612
  active: false,
1515
1613
  isToday: false,
1516
1614
  selected: false,
1517
1615
  date,
1616
+ events: this.getEvents(date, events),
1518
1617
  });
1519
1618
  }
1520
- // console.log('selected', this.selected);
1521
- for (let i = 1; i <= lastDateofMonth; i++) {
1522
- let today = this.adapter.today();
1523
- let isToday = i === today.day && this.currMonth === today.month && this.currYear === today.year;
1619
+ for (let day = 1; day <= lastDateOfMonth; day++) {
1620
+ const today = this.adapter.today();
1621
+ const isToday = day === today.day && this.currMonth === today.month && this.currYear === today.year;
1524
1622
  const date = this.adapter.getDate({
1525
1623
  locale: this._locale,
1526
1624
  year: this.currYear,
1527
1625
  month: this.currMonth,
1528
- day: i,
1626
+ day,
1529
1627
  });
1530
- const events = this.getEvents(date, _events);
1531
1628
  this.viewDays.push({
1532
- day: i,
1629
+ day,
1533
1630
  active: this.checkActiveDate(date),
1534
- isToday: isToday,
1535
- selected: i === selected?.day &&
1631
+ isToday,
1632
+ selected: day === selected?.day &&
1536
1633
  selected.month === this.currMonth &&
1537
1634
  selected.year === this.currYear,
1538
1635
  date,
1539
- events,
1636
+ events: this.getEvents(date, events),
1540
1637
  });
1541
1638
  }
1542
- for (let i = lastDayofMonth; i < 6; i++) {
1543
- const d = i - lastDayofMonth + 1;
1639
+ for (let i = lastDayOfMonth; i < 6; i++) {
1640
+ const day = i - lastDayOfMonth + 1;
1544
1641
  const date = this.adapter.getDate({
1545
1642
  locale: this._locale,
1546
1643
  year: this.currYear,
1547
1644
  month: this.currMonth + 1,
1548
- day: d,
1645
+ day,
1549
1646
  });
1550
1647
  this.viewDays.push({
1551
- day: d,
1648
+ day,
1552
1649
  active: false,
1553
1650
  isToday: false,
1554
1651
  selected: false,
1555
1652
  date,
1653
+ events: this.getEvents(date, events),
1556
1654
  });
1557
1655
  }
1558
1656
  }
1559
1657
  checkActiveDate(date) {
1560
- let c = clampDate(date, this.minDate, this.maxDate);
1561
- if (c < 0) {
1562
- return false;
1563
- }
1564
- else if (c > 0) {
1565
- return false;
1566
- }
1567
- return true;
1658
+ const c = clampDate(date, this.minDate, this.maxDate);
1659
+ return c === 0;
1568
1660
  }
1569
1661
  checkActiveMonth(year, month) {
1570
- let fd = this.adapter.getDate({ locale: this._locale, year, month, day: 1 });
1571
- let ld = this.adapter.getDate({
1662
+ const fd = this.adapter.getDate({ locale: this._locale, year, month, day: 1 });
1663
+ const ld = this.adapter.getDate({
1572
1664
  locale: this._locale,
1573
1665
  year,
1574
1666
  month,
1575
1667
  day: this.adapter.lastDateofMonth(year, month),
1576
1668
  });
1577
- let min = this.adapter.getStartOf(this.minDate, 'month');
1578
- let max = this.adapter.getLastOf(this.maxDate, 'month');
1669
+ const min = this.adapter.getStartOf(this.minDate, 'month');
1670
+ const max = this.adapter.getLastOf(this.maxDate, 'month');
1579
1671
  return clampMonth(fd, min, max) === 0 && clampMonth(ld, min, max) === 0;
1580
1672
  }
1581
- // g(d: Date | null) {
1582
- // if (d)
1583
- // return d.getFullYear() + '/' + d.getMonth() + '/' + d.getDate();
1584
- // else return '';
1585
- // }
1586
1673
  checkActiveYear(year) {
1587
1674
  const d = this.adapter.getDate({ locale: this._locale, year, month: 1, day: 1 });
1588
- let c = clampYear(d, this.minDate, this.maxDate);
1589
- if (c < 0) {
1590
- return false;
1591
- }
1592
- else if (c > 0) {
1593
- return false;
1594
- }
1595
- return true;
1675
+ return clampYear(d, this.minDate, this.maxDate) === 0;
1596
1676
  }
1597
1677
  getEvents(date, events) {
1598
- if (!events || events.length == 0)
1678
+ if (!events?.length)
1599
1679
  return [];
1600
- let eventList = [];
1601
- eventList = events.filter((x) => {
1602
- let s = compareDate(date, x.start);
1603
- let e = x.end ? compareDate(date, x.end) : s;
1604
- // console.info('compare', date, '<=>', x.start, 's', s, e);
1605
- if (s >= 0 && e <= 0)
1606
- return true;
1607
- else
1608
- return false;
1680
+ return events
1681
+ .filter((event) => {
1682
+ const start = event.start instanceof Date ? event.start : new Date(event.start);
1683
+ const end = event.end
1684
+ ? event.end instanceof Date
1685
+ ? event.end
1686
+ : new Date(event.end)
1687
+ : start;
1688
+ return compareDate(date, start) >= 0 && compareDate(date, end) <= 0;
1689
+ })
1690
+ .map((event) => {
1691
+ const start = event.start instanceof Date ? event.start : new Date(event.start);
1692
+ const end = event.end
1693
+ ? event.end instanceof Date
1694
+ ? event.end
1695
+ : new Date(event.end)
1696
+ : start;
1697
+ return {
1698
+ ...event,
1699
+ continuesBefore: compareDate(start, date) < 0,
1700
+ continuesAfter: compareDate(end, date) > 0,
1701
+ isStart: compareDate(start, date) === 0,
1702
+ isEnd: compareDate(end, date) === 0,
1703
+ };
1609
1704
  });
1610
- // console.log('event', date, eventList);
1611
- return eventList;
1612
1705
  }
1613
1706
  }
1614
1707
 
1708
+ const NGX_CALENDAR_LOCALIZATION = new InjectionToken('ngx-calendar-localization', {
1709
+ factory: () => DEFAULT_NGX_CALENDAR_LOCALIZATION,
1710
+ });
1711
+ class NgxCalendarLocalization {
1712
+ clear = 'Clear';
1713
+ today = 'Today';
1714
+ /** Range picker labels. */
1715
+ rangeStart = 'Start date';
1716
+ rangeEnd = 'End date';
1717
+ day = 'Day';
1718
+ month = 'Month';
1719
+ week = 'Week';
1720
+ year = 'Year';
1721
+ event = 'Event';
1722
+ }
1723
+ const DEFAULT_NGX_CALENDAR_LOCALIZATION = new NgxCalendarLocalization();
1724
+
1615
1725
  class NgxInputDatePickerComponent extends NgxDatePickerBase {
1616
- browserService = inject(BrowserService);
1617
- theme = this.browserService.prefersDarkMode ? 'dark' : 'light';
1618
- set setTheme(val) {
1619
- if (!val || val == 'auto') {
1620
- this.theme = this.browserService.prefersDarkMode ? 'dark' : 'light';
1621
- }
1622
- else {
1623
- this.theme = val;
1624
- }
1625
- }
1726
+ defaultLocalization = inject(NGX_CALENDAR_LOCALIZATION);
1727
+ localize = input(this.defaultLocalization, /* @ts-ignore */
1728
+ ...(ngDevMode ? [{ debugName: "localize" }] : /* istanbul ignore next */ []));
1626
1729
  config = new NgxDatePickerConfig();
1627
1730
  set setConfig(val) {
1628
1731
  this.config = { ...new NgxDatePickerConfig(), ...val };
@@ -1652,7 +1755,6 @@ class NgxInputDatePickerComponent extends NgxDatePickerBase {
1652
1755
  }
1653
1756
  view = 'day';
1654
1757
  change = new EventEmitter();
1655
- wrapperWidth = 40 * 7 + 20;
1656
1758
  selected;
1657
1759
  calendarHeader = '';
1658
1760
  isDisabled = false;
@@ -1681,7 +1783,7 @@ class NgxInputDatePickerComponent extends NgxDatePickerBase {
1681
1783
  let l = this.adapter.toLocale(this.selected.date);
1682
1784
  this.currYear = l.year;
1683
1785
  this.currMonth = l.month ?? 1;
1684
- this.renderCalendar(this.view);
1786
+ this.renderِDatePicker(this.view);
1685
1787
  }
1686
1788
  }
1687
1789
  writeValue(value) {
@@ -1729,8 +1831,8 @@ class NgxInputDatePickerComponent extends NgxDatePickerBase {
1729
1831
  setDisabledState(disabled) {
1730
1832
  this.isDisabled = disabled;
1731
1833
  }
1732
- renderCalendar(view) {
1733
- super.renderCalendar(view, this.selected, [], () => {
1834
+ renderِDatePicker(view) {
1835
+ super.renderِDatePicker(view, this.selected, [], () => {
1734
1836
  let d = this.selected?.date;
1735
1837
  this.calendarHeader =
1736
1838
  (d && this.adapter.formatDate(this.adapter.toLocale(d), 'EEEE - d MMMM, yyyy')) ?? '';
@@ -1746,7 +1848,7 @@ class NgxInputDatePickerComponent extends NgxDatePickerBase {
1746
1848
  }
1747
1849
  changeView(v) {
1748
1850
  this.view = v;
1749
- this.renderCalendar(this.view);
1851
+ this.renderِDatePicker(this.view);
1750
1852
  }
1751
1853
  next() {
1752
1854
  if (this.view === 'year') {
@@ -1763,7 +1865,7 @@ class NgxInputDatePickerComponent extends NgxDatePickerBase {
1763
1865
  this.currYear = date.getFullYear();
1764
1866
  this.currMonth = date.getMonth();
1765
1867
  }
1766
- this.renderCalendar(this.view);
1868
+ this.renderِDatePicker(this.view);
1767
1869
  }
1768
1870
  previous() {
1769
1871
  if (this.view === 'year') {
@@ -1780,7 +1882,7 @@ class NgxInputDatePickerComponent extends NgxDatePickerBase {
1780
1882
  this.currYear = date.getFullYear();
1781
1883
  this.currMonth = date.getMonth();
1782
1884
  }
1783
- this.renderCalendar(this.view);
1885
+ this.renderِDatePicker(this.view);
1784
1886
  }
1785
1887
  selectDay(ev, item) {
1786
1888
  ev.stopPropagation();
@@ -1817,7 +1919,7 @@ class NgxInputDatePickerComponent extends NgxDatePickerBase {
1817
1919
  ev.stopPropagation();
1818
1920
  }
1819
1921
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInputDatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1820
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxInputDatePickerComponent, isStandalone: true, selector: "ngx-date-picker", inputs: { setTheme: ["theme", "setTheme"], setConfig: ["config", "setConfig"], locale: "locale", setMin: ["min", "setMin"], setMax: ["max", "setMax"], view: "view" }, outputs: { change: "change" }, host: { properties: { "class.dark": "theme==\"dark\"" } }, providers: [
1922
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxInputDatePickerComponent, isStandalone: true, selector: "ngx-date-picker", inputs: { localize: { classPropertyName: "localize", publicName: "localize", isSignal: true, isRequired: false, transformFunction: null }, setConfig: { classPropertyName: "setConfig", publicName: "config", isSignal: false, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: false, isRequired: false, transformFunction: null }, setMin: { classPropertyName: "setMin", publicName: "min", isSignal: false, isRequired: false, transformFunction: null }, setMax: { classPropertyName: "setMax", publicName: "max", isSignal: false, isRequired: false, transformFunction: null }, view: { classPropertyName: "view", publicName: "view", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { change: "change" }, providers: [
1821
1923
  DateAdapterRegistry,
1822
1924
  {
1823
1925
  provide: NG_VALUE_ACCESSOR,
@@ -1829,7 +1931,7 @@ class NgxInputDatePickerComponent extends NgxDatePickerBase {
1829
1931
  useExisting: forwardRef(() => NgxInputDatePickerComponent),
1830
1932
  multi: true,
1831
1933
  },
1832
- ], usesInheritance: true, ngImport: i0, template: "<div\r\n class=\"wrapper\"\r\n #datepickerWrapper\r\n [style.width.px]=\"wrapperWidth\"\r\n (click)=\"stopPagination($event)\">\r\n <div class=\"header\">\r\n {{ calendarHeader }}\r\n </div>\r\n <div class=\"sub-header\">\r\n <div class=\"icons\">\r\n <span id=\"prev\" class=\"material-symbols-rounded\" (click)=\"previous()\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"\r\n config.previousButtonTemplate || defaultPreviousBTNTemplate\r\n \"></ng-template>\r\n </span>\r\n </div>\r\n <span class=\"current-date\">\r\n <span (click)=\"changeView('year')\">\r\n {{ currYear }}\r\n <ng-template\r\n [ngTemplateOutlet]=\"config.caretDownIconTemplate || defaultCaretDownIcon\"></ng-template>\r\n </span>\r\n <span (click)=\"changeView('month')\">\r\n {{ displayMonth }}\r\n <ng-template\r\n [ngTemplateOutlet]=\"config.caretDownIconTemplate || defaultCaretDownIcon\"></ng-template>\r\n </span>\r\n </span>\r\n <div class=\"icons\">\r\n <span id=\"next\" class=\"material-symbols-rounded\" (click)=\"next()\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"config.nextButtonTemplate || defaultNextBTNTemplate\"></ng-template>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"calendar\">\r\n @if (view === 'day') {\r\n <ul class=\"weeks\">\r\n @for (w of weekDays; track $index) {\r\n <li [title]=\"w.name\">\r\n {{ w.min }}\r\n </li>\r\n }\r\n </ul>\r\n <ul class=\"days\">\r\n @for (item of viewDays; track $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectDay($event, item)\">\r\n {{ item.day }}\r\n </li>\r\n }\r\n </ul>\r\n } @else if (view === 'month') {\r\n <ul class=\"months\">\r\n @for (item of viewMonths; track $index; let i = $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectMonth($event, item)\">\r\n {{ i + 1 }}.{{ item.displayMonth }}\r\n </li>\r\n }\r\n </ul>\r\n } @else if (view === 'year') {\r\n <ul class=\"years\">\r\n @for (item of viewYears; track $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectYear($event, item)\">\r\n {{ item.year }}\r\n </li>\r\n }\r\n </ul>\r\n }\r\n <!-- <pre>\r\n currYear={{currYear}}\r\n currMonth={{currMonth}}\r\n {{selected|json}}\r\n </pre> -->\r\n <div class=\"calendar-footer\">\r\n @if (config.clearButton) {\r\n <button (click)=\"clear()\">\r\n {{ config.clearButtonText }}\r\n </button>\r\n }\r\n @if (config.todayButton) {\r\n <button (click)=\"gotoToday()\">\r\n {{ config.todayButtonText }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #defaultPreviousBTNTemplate>\r\n <svg width=\"15px\" height=\"40px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n class=\"fa-secondary\"\r\n d=\"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z\" />\r\n </svg>\r\n</ng-template>\r\n\r\n<ng-template #defaultNextBTNTemplate>\r\n <svg width=\"15px\" height=\"40px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n class=\"fa-secondary\"\r\n d=\"M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z\" />\r\n </svg>\r\n</ng-template>\r\n\r\n<ng-template #defaultCaretDownIcon>\r\n <svg width=\"10px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n class=\"fa-secondary\"\r\n d=\"M310.6 246.6l-127.1 128C176.4 380.9 168.2 384 160 384s-16.38-3.125-22.63-9.375l-127.1-128C.2244 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75S319.8 237.5 310.6 246.6z\" />\r\n </svg>\r\n</ng-template>\r\n", styles: [":host{--ngx-color-bg: #fff;--ngx-color-text: #000;--ngx-border-color: #c0c0c0;--ngx-datepicker-header-bg: #6200ee;--ngx-datepicker-header-text: #fff;--ngx-datepicker-subheader-bg: #e0d5ef;--ngx-datepicker-subheader-text: #272727}:host-context(.dark){--ngx-color-bg: #222;--ngx-color-text: #fff;--ngx-border-color: #c0c0c0;--ngx-datepicker-header-bg: #6200ee;--ngx-datepicker-header-text: #fff;--ngx-datepicker-subheader-bg: #8e819e;--ngx-datepicker-subheader-text: #272727}.wrapper{background:var(--ngx-color-bg);box-shadow:0 15px 40px #0000001f;color:var(--ngx-color-text);border-radius:6px;overflow:hidden}.wrapper .header{display:block;padding:15px 15px 10px;background-color:var(--ngx-datepicker-header-bg);color:var(--ngx-datepicker-header-text);font-size:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.wrapper .sub-header{display:flex;align-items:center;padding:5px 10px;background-color:var(--ngx-datepicker-subheader-bg);color:var(--ngx-datepicker-subheader-text)}.wrapper .sub-header .current-date{font-size:1rem;font-weight:800;flex:auto;display:flex;align-items:center}.wrapper .sub-header .current-date span{flex:auto;text-align:center}.wrapper .sub-header .icons{display:flex}.wrapper .sub-header .icons span{height:38px;width:38px;margin:0 1px;cursor:pointer;color:#878787;text-align:center;line-height:38px;font-size:1.9rem;-webkit-user-select:none;user-select:none;border-radius:50%}.wrapper .sub-header .icons span:hover{background:#f2f2f272}.wrapper .calendar-footer{display:flex;justify-content:space-between;gap:5px}.wrapper .calendar-footer button{outline:none;background:none;color:inherit;border:none;border-radius:4px;padding:8px 15px;box-shadow:none;transition:all .3s}.wrapper .calendar-footer button:not([disabled]):hover{cursor:pointer;background:#816ef175}.calendar{padding:10px}.calendar ul{display:flex;flex-wrap:wrap;list-style:none;text-align:center;padding:0;margin:0}.calendar .days{margin-bottom:20px}.calendar .days li{height:40px;width:40px}.calendar .months{margin-bottom:20px}.calendar .months li{height:40px;width:33%}.calendar .years{margin-bottom:20px}.calendar .years li{height:40px;width:25%}.calendar li{z-index:1;cursor:pointer;position:relative;color:#333;font-size:12px;border-radius:50px;display:flex;align-items:center;justify-content:center;border:1px transparent solid;transition:all .3s;color:inherit}.calendar li:not(.active):hover{background:#dfdfdf68}.calendar li.de-active{opacity:.2}.calendar li.selected{border:1px #1216fa solid}.calendar li.today{background-color:#9b59b6}.calendar .weeks{border-bottom:1px rgba(231,231,231,.3450980392) solid;margin-bottom:10px;padding-bottom:5px}.calendar .weeks li{font-weight:500;cursor:default;flex:auto;flex-wrap:nowrap}.calendar .weeks li:hover{background:none}::ng-deep body[dir=rtl] .wrapper .sub-header .icons #next,::ng-deep body[dir=rtl] .wrapper .sub-header .icons #prev,::ng-deep html[dir=rtl] .wrapper .sub-header .icons #next,::ng-deep html[dir=rtl] .wrapper .sub-header .icons #prev{transform:rotate(180deg)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
1934
+ ], usesInheritance: true, ngImport: i0, template: "<div class=\"wrapper\" #datepickerWrapper (click)=\"stopPagination($event)\">\r\n <div class=\"header\">\r\n <svg\r\n class=\"calendar-icon\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M16 2V6M8 2V6\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M13 4H11C7.22876 4 5.34315 4 4.17157 5.17157C3 6.34315 3 8.22876 3 12V14C3 17.7712 3 19.6569 4.17157 20.8284C5.34315 22 7.22876 22 11 22H13C16.7712 22 18.6569 22 19.8284 20.8284C21 19.6569 21 17.7712 21 14V12C21 8.22876 21 6.34315 19.8284 5.17157C18.6569 4 16.7712 4 13 4Z\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M3 10H21\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11.9955 14H12.0045M11.9955 18H12.0045M15.991 14H16M8 14H8.00897M8 18H8.00897\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n {{ calendarHeader }}\r\n </div>\r\n <div class=\"sub-header\">\r\n <div class=\"icons\">\r\n <span id=\"prev\" (click)=\"previous()\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"\r\n config.previousButtonTemplate || defaultPreviousBTNTemplate\r\n \"></ng-template>\r\n </span>\r\n </div>\r\n <span class=\"current-date\">\r\n <span (click)=\"changeView('year')\">\r\n {{ currYear }}\r\n <ng-template\r\n [ngTemplateOutlet]=\"config.caretDownIconTemplate || defaultCaretDownIcon\"></ng-template>\r\n </span>\r\n <span (click)=\"changeView('month')\">\r\n {{ displayMonth }}\r\n <ng-template\r\n [ngTemplateOutlet]=\"config.caretDownIconTemplate || defaultCaretDownIcon\"></ng-template>\r\n </span>\r\n </span>\r\n <div class=\"icons\">\r\n <span id=\"next\" (click)=\"next()\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"config.nextButtonTemplate || defaultNextBTNTemplate\"></ng-template>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"calendar\">\r\n @if (view === 'day') {\r\n <ul class=\"weeks\">\r\n @for (w of weekDays; track $index) {\r\n <li [title]=\"w.name\">\r\n {{ w.min }}\r\n </li>\r\n }\r\n </ul>\r\n <ul class=\"days\">\r\n @for (item of viewDays; track $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectDay($event, item)\">\r\n {{ item.day }}\r\n </li>\r\n }\r\n </ul>\r\n } @else if (view === 'month') {\r\n <ul class=\"months\">\r\n @for (item of viewMonths; track $index; let i = $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectMonth($event, item)\">\r\n {{ i + 1 }}.{{ item.displayMonth }}\r\n </li>\r\n }\r\n </ul>\r\n } @else if (view === 'year') {\r\n <ul class=\"years\">\r\n @for (item of viewYears; track $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectYear($event, item)\">\r\n {{ item.year }}\r\n </li>\r\n }\r\n </ul>\r\n }\r\n <!-- <pre>\r\n currYear={{currYear}}\r\n currMonth={{currMonth}}\r\n {{selected|json}}\r\n </pre> -->\r\n <div class=\"calendar-footer\">\r\n @if (config.clearButton) {\r\n <button (click)=\"clear()\">\r\n {{ localize().clear }}\r\n </button>\r\n }\r\n @if (config.todayButton) {\r\n <button (click)=\"gotoToday()\">\r\n {{ localize().today }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #defaultPreviousBTNTemplate>\r\n <svg width=\"15px\" height=\"40px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z\" />\r\n </svg>\r\n</ng-template>\r\n\r\n<ng-template #defaultNextBTNTemplate>\r\n <svg width=\"15px\" height=\"40px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z\" />\r\n </svg>\r\n</ng-template>\r\n\r\n<ng-template #defaultCaretDownIcon>\r\n <svg width=\"10px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M310.6 246.6l-127.1 128C176.4 380.9 168.2 384 160 384s-16.38-3.125-22.63-9.375l-127.1-128C.2244 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75S319.8 237.5 310.6 246.6z\" />\r\n </svg>\r\n</ng-template>\r\n", styles: [":host{--ngx-color-bg: light-dark(#fff, #0e1428);--ngx-color-text: light-dark(#000, #fff);--ngx-border-color: light-dark(#c0c0c0, #c0c0c0);--ngx-datepicker-header-bg: light-dark( linear-gradient(to right, #643edf, #865bf3), linear-gradient(to right, #34158c, #441ba8) );--ngx-datepicker-header-text: light-dark(#fff, #fff);--ngx-datepicker-subheader-bg: light-dark(#e0d5ef, #0f1529);--ngx-datepicker-subheader-text: light-dark(#272727, #d2b9f9);--ngx-datepicker-font-size: 12px;--ngx-datepicker-active-bg: light-dark( linear-gradient(to bottom, #8753ff, #5325c9), linear-gradient(to bottom, #8753ff, #5325c9) );--ngx-datepicker-active-text: light-dark(#fff, #fff);--ngx-datepicker-today-color: light-dark(#5325c9, #5325c9)}.wrapper{background:var(--ngx-color-bg);box-shadow:0 15px 40px #0000001f;color:var(--ngx-color-text);border-radius:6px;overflow:hidden;font-size:var(--ngx-datepicker-font-size);width:330px}.wrapper .header{display:flex;align-items:center;justify-content:center;text-align:center;padding:15px 15px 10px;background:var(--ngx-datepicker-header-bg);color:var(--ngx-datepicker-header-text);font-size:1.5em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wrapper .calendar-icon{background-color:#f3f3f33f;border-radius:29px;padding:6px;width:40px;height:40px;corner-shape:squircle;margin:0 6px}.wrapper .sub-header{display:flex;align-items:center;padding:5px 10px;background-color:var(--ngx-datepicker-subheader-bg);color:var(--ngx-datepicker-subheader-text)}.wrapper .sub-header .current-date{font-size:1.5em;flex:auto;display:flex;align-items:center}.wrapper .sub-header .current-date span{flex:auto;text-align:center}.wrapper .sub-header .icons{display:flex}.wrapper .sub-header .icons span{height:38px;width:38px;margin:0 1px;cursor:pointer;color:#878787;text-align:center;line-height:38px;font-size:1.9rem;-webkit-user-select:none;user-select:none;border:1px rgba(176,176,176,.0901960784) solid;border-radius:5px}.wrapper .sub-header .icons span:hover{background:#f2f2f225}.wrapper .calendar-footer{display:flex;justify-content:space-between;gap:5px}.wrapper .calendar-footer button{outline:none;background:none;color:inherit;border:none;border-radius:4px;padding:8px 15px;box-shadow:none;transition:all .3s;border:1px rgba(168,168,168,.1411764706) solid}.wrapper .calendar-footer button:not([disabled]):hover{cursor:pointer;background:#816ef175}.calendar{padding:10px}.calendar ul{display:flex;flex-wrap:wrap;list-style:none;text-align:center;padding:0;margin:0}.calendar .days{margin-bottom:20px}.calendar .days li{width:14.2857142857%;aspect-ratio:1/1}.calendar .months{margin-bottom:20px}.calendar .months li{width:33.3333333333%;height:44px}.calendar .years{margin-bottom:20px}.calendar .years li{width:25%;height:44px}.calendar li{z-index:1;cursor:pointer;position:relative;color:#333;font-size:1.2em;border-radius:50px;display:flex;align-items:center;justify-content:center;border:1px transparent solid;transition:all .3s;color:inherit}.calendar li:not(.active):hover{background:#dfdfdf68}.calendar li.de-active{opacity:.2}.calendar li.selected{background:var(--ngx-datepicker-active-bg)!important;color:var(--ngx-datepicker-active-text)}.calendar li.today{border:1px var(--ngx-datepicker-today-color) solid!important}.calendar .weeks{border-bottom:1px rgba(231,231,231,.3450980392) solid;margin-bottom:10px;padding-bottom:5px}.calendar .weeks li{font-weight:500;cursor:default;flex:auto;flex-wrap:nowrap}.calendar .weeks li:hover{background:none}::ng-deep body[dir=rtl] .wrapper .sub-header .icons #next,::ng-deep body[dir=rtl] .wrapper .sub-header .icons #prev,::ng-deep html[dir=rtl] .wrapper .sub-header .icons #next,::ng-deep html[dir=rtl] .wrapper .sub-header .icons #prev{transform:rotate(180deg)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
1833
1935
  }
1834
1936
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInputDatePickerComponent, decorators: [{
1835
1937
  type: Component,
@@ -1845,13 +1947,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
1845
1947
  useExisting: forwardRef(() => NgxInputDatePickerComponent),
1846
1948
  multi: true,
1847
1949
  },
1848
- ], host: {
1849
- '[class.dark]': 'theme=="dark"',
1850
- }, template: "<div\r\n class=\"wrapper\"\r\n #datepickerWrapper\r\n [style.width.px]=\"wrapperWidth\"\r\n (click)=\"stopPagination($event)\">\r\n <div class=\"header\">\r\n {{ calendarHeader }}\r\n </div>\r\n <div class=\"sub-header\">\r\n <div class=\"icons\">\r\n <span id=\"prev\" class=\"material-symbols-rounded\" (click)=\"previous()\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"\r\n config.previousButtonTemplate || defaultPreviousBTNTemplate\r\n \"></ng-template>\r\n </span>\r\n </div>\r\n <span class=\"current-date\">\r\n <span (click)=\"changeView('year')\">\r\n {{ currYear }}\r\n <ng-template\r\n [ngTemplateOutlet]=\"config.caretDownIconTemplate || defaultCaretDownIcon\"></ng-template>\r\n </span>\r\n <span (click)=\"changeView('month')\">\r\n {{ displayMonth }}\r\n <ng-template\r\n [ngTemplateOutlet]=\"config.caretDownIconTemplate || defaultCaretDownIcon\"></ng-template>\r\n </span>\r\n </span>\r\n <div class=\"icons\">\r\n <span id=\"next\" class=\"material-symbols-rounded\" (click)=\"next()\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"config.nextButtonTemplate || defaultNextBTNTemplate\"></ng-template>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"calendar\">\r\n @if (view === 'day') {\r\n <ul class=\"weeks\">\r\n @for (w of weekDays; track $index) {\r\n <li [title]=\"w.name\">\r\n {{ w.min }}\r\n </li>\r\n }\r\n </ul>\r\n <ul class=\"days\">\r\n @for (item of viewDays; track $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectDay($event, item)\">\r\n {{ item.day }}\r\n </li>\r\n }\r\n </ul>\r\n } @else if (view === 'month') {\r\n <ul class=\"months\">\r\n @for (item of viewMonths; track $index; let i = $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectMonth($event, item)\">\r\n {{ i + 1 }}.{{ item.displayMonth }}\r\n </li>\r\n }\r\n </ul>\r\n } @else if (view === 'year') {\r\n <ul class=\"years\">\r\n @for (item of viewYears; track $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectYear($event, item)\">\r\n {{ item.year }}\r\n </li>\r\n }\r\n </ul>\r\n }\r\n <!-- <pre>\r\n currYear={{currYear}}\r\n currMonth={{currMonth}}\r\n {{selected|json}}\r\n </pre> -->\r\n <div class=\"calendar-footer\">\r\n @if (config.clearButton) {\r\n <button (click)=\"clear()\">\r\n {{ config.clearButtonText }}\r\n </button>\r\n }\r\n @if (config.todayButton) {\r\n <button (click)=\"gotoToday()\">\r\n {{ config.todayButtonText }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #defaultPreviousBTNTemplate>\r\n <svg width=\"15px\" height=\"40px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n class=\"fa-secondary\"\r\n d=\"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z\" />\r\n </svg>\r\n</ng-template>\r\n\r\n<ng-template #defaultNextBTNTemplate>\r\n <svg width=\"15px\" height=\"40px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n class=\"fa-secondary\"\r\n d=\"M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z\" />\r\n </svg>\r\n</ng-template>\r\n\r\n<ng-template #defaultCaretDownIcon>\r\n <svg width=\"10px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n class=\"fa-secondary\"\r\n d=\"M310.6 246.6l-127.1 128C176.4 380.9 168.2 384 160 384s-16.38-3.125-22.63-9.375l-127.1-128C.2244 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75S319.8 237.5 310.6 246.6z\" />\r\n </svg>\r\n</ng-template>\r\n", styles: [":host{--ngx-color-bg: #fff;--ngx-color-text: #000;--ngx-border-color: #c0c0c0;--ngx-datepicker-header-bg: #6200ee;--ngx-datepicker-header-text: #fff;--ngx-datepicker-subheader-bg: #e0d5ef;--ngx-datepicker-subheader-text: #272727}:host-context(.dark){--ngx-color-bg: #222;--ngx-color-text: #fff;--ngx-border-color: #c0c0c0;--ngx-datepicker-header-bg: #6200ee;--ngx-datepicker-header-text: #fff;--ngx-datepicker-subheader-bg: #8e819e;--ngx-datepicker-subheader-text: #272727}.wrapper{background:var(--ngx-color-bg);box-shadow:0 15px 40px #0000001f;color:var(--ngx-color-text);border-radius:6px;overflow:hidden}.wrapper .header{display:block;padding:15px 15px 10px;background-color:var(--ngx-datepicker-header-bg);color:var(--ngx-datepicker-header-text);font-size:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.wrapper .sub-header{display:flex;align-items:center;padding:5px 10px;background-color:var(--ngx-datepicker-subheader-bg);color:var(--ngx-datepicker-subheader-text)}.wrapper .sub-header .current-date{font-size:1rem;font-weight:800;flex:auto;display:flex;align-items:center}.wrapper .sub-header .current-date span{flex:auto;text-align:center}.wrapper .sub-header .icons{display:flex}.wrapper .sub-header .icons span{height:38px;width:38px;margin:0 1px;cursor:pointer;color:#878787;text-align:center;line-height:38px;font-size:1.9rem;-webkit-user-select:none;user-select:none;border-radius:50%}.wrapper .sub-header .icons span:hover{background:#f2f2f272}.wrapper .calendar-footer{display:flex;justify-content:space-between;gap:5px}.wrapper .calendar-footer button{outline:none;background:none;color:inherit;border:none;border-radius:4px;padding:8px 15px;box-shadow:none;transition:all .3s}.wrapper .calendar-footer button:not([disabled]):hover{cursor:pointer;background:#816ef175}.calendar{padding:10px}.calendar ul{display:flex;flex-wrap:wrap;list-style:none;text-align:center;padding:0;margin:0}.calendar .days{margin-bottom:20px}.calendar .days li{height:40px;width:40px}.calendar .months{margin-bottom:20px}.calendar .months li{height:40px;width:33%}.calendar .years{margin-bottom:20px}.calendar .years li{height:40px;width:25%}.calendar li{z-index:1;cursor:pointer;position:relative;color:#333;font-size:12px;border-radius:50px;display:flex;align-items:center;justify-content:center;border:1px transparent solid;transition:all .3s;color:inherit}.calendar li:not(.active):hover{background:#dfdfdf68}.calendar li.de-active{opacity:.2}.calendar li.selected{border:1px #1216fa solid}.calendar li.today{background-color:#9b59b6}.calendar .weeks{border-bottom:1px rgba(231,231,231,.3450980392) solid;margin-bottom:10px;padding-bottom:5px}.calendar .weeks li{font-weight:500;cursor:default;flex:auto;flex-wrap:nowrap}.calendar .weeks li:hover{background:none}::ng-deep body[dir=rtl] .wrapper .sub-header .icons #next,::ng-deep body[dir=rtl] .wrapper .sub-header .icons #prev,::ng-deep html[dir=rtl] .wrapper .sub-header .icons #next,::ng-deep html[dir=rtl] .wrapper .sub-header .icons #prev{transform:rotate(180deg)}\n"] }]
1851
- }], ctorParameters: () => [], propDecorators: { setTheme: [{
1852
- type: Input,
1853
- args: ['theme']
1854
- }], setConfig: [{
1950
+ ], template: "<div class=\"wrapper\" #datepickerWrapper (click)=\"stopPagination($event)\">\r\n <div class=\"header\">\r\n <svg\r\n class=\"calendar-icon\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M16 2V6M8 2V6\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M13 4H11C7.22876 4 5.34315 4 4.17157 5.17157C3 6.34315 3 8.22876 3 12V14C3 17.7712 3 19.6569 4.17157 20.8284C5.34315 22 7.22876 22 11 22H13C16.7712 22 18.6569 22 19.8284 20.8284C21 19.6569 21 17.7712 21 14V12C21 8.22876 21 6.34315 19.8284 5.17157C18.6569 4 16.7712 4 13 4Z\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M3 10H21\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11.9955 14H12.0045M11.9955 18H12.0045M15.991 14H16M8 14H8.00897M8 18H8.00897\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n {{ calendarHeader }}\r\n </div>\r\n <div class=\"sub-header\">\r\n <div class=\"icons\">\r\n <span id=\"prev\" (click)=\"previous()\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"\r\n config.previousButtonTemplate || defaultPreviousBTNTemplate\r\n \"></ng-template>\r\n </span>\r\n </div>\r\n <span class=\"current-date\">\r\n <span (click)=\"changeView('year')\">\r\n {{ currYear }}\r\n <ng-template\r\n [ngTemplateOutlet]=\"config.caretDownIconTemplate || defaultCaretDownIcon\"></ng-template>\r\n </span>\r\n <span (click)=\"changeView('month')\">\r\n {{ displayMonth }}\r\n <ng-template\r\n [ngTemplateOutlet]=\"config.caretDownIconTemplate || defaultCaretDownIcon\"></ng-template>\r\n </span>\r\n </span>\r\n <div class=\"icons\">\r\n <span id=\"next\" (click)=\"next()\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"config.nextButtonTemplate || defaultNextBTNTemplate\"></ng-template>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"calendar\">\r\n @if (view === 'day') {\r\n <ul class=\"weeks\">\r\n @for (w of weekDays; track $index) {\r\n <li [title]=\"w.name\">\r\n {{ w.min }}\r\n </li>\r\n }\r\n </ul>\r\n <ul class=\"days\">\r\n @for (item of viewDays; track $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectDay($event, item)\">\r\n {{ item.day }}\r\n </li>\r\n }\r\n </ul>\r\n } @else if (view === 'month') {\r\n <ul class=\"months\">\r\n @for (item of viewMonths; track $index; let i = $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectMonth($event, item)\">\r\n {{ i + 1 }}.{{ item.displayMonth }}\r\n </li>\r\n }\r\n </ul>\r\n } @else if (view === 'year') {\r\n <ul class=\"years\">\r\n @for (item of viewYears; track $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectYear($event, item)\">\r\n {{ item.year }}\r\n </li>\r\n }\r\n </ul>\r\n }\r\n <!-- <pre>\r\n currYear={{currYear}}\r\n currMonth={{currMonth}}\r\n {{selected|json}}\r\n </pre> -->\r\n <div class=\"calendar-footer\">\r\n @if (config.clearButton) {\r\n <button (click)=\"clear()\">\r\n {{ localize().clear }}\r\n </button>\r\n }\r\n @if (config.todayButton) {\r\n <button (click)=\"gotoToday()\">\r\n {{ localize().today }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #defaultPreviousBTNTemplate>\r\n <svg width=\"15px\" height=\"40px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z\" />\r\n </svg>\r\n</ng-template>\r\n\r\n<ng-template #defaultNextBTNTemplate>\r\n <svg width=\"15px\" height=\"40px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z\" />\r\n </svg>\r\n</ng-template>\r\n\r\n<ng-template #defaultCaretDownIcon>\r\n <svg width=\"10px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M310.6 246.6l-127.1 128C176.4 380.9 168.2 384 160 384s-16.38-3.125-22.63-9.375l-127.1-128C.2244 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75S319.8 237.5 310.6 246.6z\" />\r\n </svg>\r\n</ng-template>\r\n", styles: [":host{--ngx-color-bg: light-dark(#fff, #0e1428);--ngx-color-text: light-dark(#000, #fff);--ngx-border-color: light-dark(#c0c0c0, #c0c0c0);--ngx-datepicker-header-bg: light-dark( linear-gradient(to right, #643edf, #865bf3), linear-gradient(to right, #34158c, #441ba8) );--ngx-datepicker-header-text: light-dark(#fff, #fff);--ngx-datepicker-subheader-bg: light-dark(#e0d5ef, #0f1529);--ngx-datepicker-subheader-text: light-dark(#272727, #d2b9f9);--ngx-datepicker-font-size: 12px;--ngx-datepicker-active-bg: light-dark( linear-gradient(to bottom, #8753ff, #5325c9), linear-gradient(to bottom, #8753ff, #5325c9) );--ngx-datepicker-active-text: light-dark(#fff, #fff);--ngx-datepicker-today-color: light-dark(#5325c9, #5325c9)}.wrapper{background:var(--ngx-color-bg);box-shadow:0 15px 40px #0000001f;color:var(--ngx-color-text);border-radius:6px;overflow:hidden;font-size:var(--ngx-datepicker-font-size);width:330px}.wrapper .header{display:flex;align-items:center;justify-content:center;text-align:center;padding:15px 15px 10px;background:var(--ngx-datepicker-header-bg);color:var(--ngx-datepicker-header-text);font-size:1.5em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wrapper .calendar-icon{background-color:#f3f3f33f;border-radius:29px;padding:6px;width:40px;height:40px;corner-shape:squircle;margin:0 6px}.wrapper .sub-header{display:flex;align-items:center;padding:5px 10px;background-color:var(--ngx-datepicker-subheader-bg);color:var(--ngx-datepicker-subheader-text)}.wrapper .sub-header .current-date{font-size:1.5em;flex:auto;display:flex;align-items:center}.wrapper .sub-header .current-date span{flex:auto;text-align:center}.wrapper .sub-header .icons{display:flex}.wrapper .sub-header .icons span{height:38px;width:38px;margin:0 1px;cursor:pointer;color:#878787;text-align:center;line-height:38px;font-size:1.9rem;-webkit-user-select:none;user-select:none;border:1px rgba(176,176,176,.0901960784) solid;border-radius:5px}.wrapper .sub-header .icons span:hover{background:#f2f2f225}.wrapper .calendar-footer{display:flex;justify-content:space-between;gap:5px}.wrapper .calendar-footer button{outline:none;background:none;color:inherit;border:none;border-radius:4px;padding:8px 15px;box-shadow:none;transition:all .3s;border:1px rgba(168,168,168,.1411764706) solid}.wrapper .calendar-footer button:not([disabled]):hover{cursor:pointer;background:#816ef175}.calendar{padding:10px}.calendar ul{display:flex;flex-wrap:wrap;list-style:none;text-align:center;padding:0;margin:0}.calendar .days{margin-bottom:20px}.calendar .days li{width:14.2857142857%;aspect-ratio:1/1}.calendar .months{margin-bottom:20px}.calendar .months li{width:33.3333333333%;height:44px}.calendar .years{margin-bottom:20px}.calendar .years li{width:25%;height:44px}.calendar li{z-index:1;cursor:pointer;position:relative;color:#333;font-size:1.2em;border-radius:50px;display:flex;align-items:center;justify-content:center;border:1px transparent solid;transition:all .3s;color:inherit}.calendar li:not(.active):hover{background:#dfdfdf68}.calendar li.de-active{opacity:.2}.calendar li.selected{background:var(--ngx-datepicker-active-bg)!important;color:var(--ngx-datepicker-active-text)}.calendar li.today{border:1px var(--ngx-datepicker-today-color) solid!important}.calendar .weeks{border-bottom:1px rgba(231,231,231,.3450980392) solid;margin-bottom:10px;padding-bottom:5px}.calendar .weeks li{font-weight:500;cursor:default;flex:auto;flex-wrap:nowrap}.calendar .weeks li:hover{background:none}::ng-deep body[dir=rtl] .wrapper .sub-header .icons #next,::ng-deep body[dir=rtl] .wrapper .sub-header .icons #prev,::ng-deep html[dir=rtl] .wrapper .sub-header .icons #next,::ng-deep html[dir=rtl] .wrapper .sub-header .icons #prev{transform:rotate(180deg)}\n"] }]
1951
+ }], ctorParameters: () => [], propDecorators: { localize: [{ type: i0.Input, args: [{ isSignal: true, alias: "localize", required: false }] }], setConfig: [{
1855
1952
  type: Input,
1856
1953
  args: ['config']
1857
1954
  }], locale: [{
@@ -1871,7 +1968,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
1871
1968
  class NgxInputDatePicker {
1872
1969
  el;
1873
1970
  dateAdapterRegistry = inject(DateAdapterRegistry);
1874
- theme = 'auto';
1875
1971
  openOnCLick = input(true, /* @ts-ignore */
1876
1972
  ...(ngDevMode ? [{ debugName: "openOnCLick" }] : /* istanbul ignore next */ []));
1877
1973
  change = new EventEmitter();
@@ -1984,7 +2080,6 @@ class NgxInputDatePicker {
1984
2080
  instance.locale = this._locale;
1985
2081
  instance.minDate = this.min;
1986
2082
  instance.maxDate = this.max;
1987
- instance.setTheme = this.theme;
1988
2083
  instance.updateConfig(this.config);
1989
2084
  instance.writeValue(this.value);
1990
2085
  instance.change.subscribe((c) => {
@@ -2045,7 +2140,7 @@ class NgxInputDatePicker {
2045
2140
  }
2046
2141
  }
2047
2142
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInputDatePicker, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
2048
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.4", type: NgxInputDatePicker, isStandalone: true, selector: "[ngxInputDatePicker]", inputs: { theme: { classPropertyName: "theme", publicName: "theme", isSignal: false, isRequired: false, transformFunction: null }, openOnCLick: { classPropertyName: "openOnCLick", publicName: "openOnCLick", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: false, isRequired: false, transformFunction: null }, displayFormat: { classPropertyName: "displayFormat", publicName: "displayFormat", isSignal: false, isRequired: false, transformFunction: null }, setMin: { classPropertyName: "setMin", publicName: "min", isSignal: false, isRequired: false, transformFunction: null }, setMax: { classPropertyName: "setMax", publicName: "max", isSignal: false, isRequired: false, transformFunction: null }, setConfig: { classPropertyName: "setConfig", publicName: "config", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { change: "change" }, host: { listeners: { "click": "onClick($event)", "input": "onInput($event)", "blur": "onBlur()" }, properties: { "attr.readOnly": "true" }, classAttribute: "ngx-datepicker-input" }, providers: [
2143
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.4", type: NgxInputDatePicker, isStandalone: true, selector: "[ngxInputDatePicker]", inputs: { openOnCLick: { classPropertyName: "openOnCLick", publicName: "openOnCLick", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: false, isRequired: false, transformFunction: null }, displayFormat: { classPropertyName: "displayFormat", publicName: "displayFormat", isSignal: false, isRequired: false, transformFunction: null }, setMin: { classPropertyName: "setMin", publicName: "min", isSignal: false, isRequired: false, transformFunction: null }, setMax: { classPropertyName: "setMax", publicName: "max", isSignal: false, isRequired: false, transformFunction: null }, setConfig: { classPropertyName: "setConfig", publicName: "config", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { change: "change" }, host: { listeners: { "click": "onClick($event)", "input": "onInput($event)", "blur": "onBlur()" }, properties: { "attr.readOnly": "true" }, classAttribute: "ngx-datepicker-input" }, providers: [
2049
2144
  DateAdapterRegistry,
2050
2145
  {
2051
2146
  provide: NG_VALUE_ACCESSOR,
@@ -2082,9 +2177,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
2082
2177
  },
2083
2178
  ],
2084
2179
  }]
2085
- }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { theme: [{
2086
- type: Input
2087
- }], openOnCLick: [{ type: i0.Input, args: [{ isSignal: true, alias: "openOnCLick", required: false }] }], change: [{
2180
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { openOnCLick: [{ type: i0.Input, args: [{ isSignal: true, alias: "openOnCLick", required: false }] }], change: [{
2088
2181
  type: Output
2089
2182
  }], locale: [{
2090
2183
  type: Input
@@ -2110,17 +2203,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
2110
2203
  args: ['blur']
2111
2204
  }] } });
2112
2205
 
2206
+ const HOUR_HEIGHT = 64;
2207
+ const HALF_HOUR_HEIGHT = HOUR_HEIGHT / 2;
2208
+ const MIN_EVENT_MINUTES = 30;
2209
+ const MONTH_ROW_COUNT = 6;
2210
+ const MONTH_COLUMN_COUNT = 7;
2113
2211
  class NgxCalendarComponent extends NgxDatePickerBase {
2114
- browserService = inject(BrowserService);
2115
- theme = this.browserService.prefersDarkMode ? 'dark' : 'light';
2116
- set setTheme(val) {
2117
- if (!val || val == 'auto') {
2118
- this.theme = this.browserService.prefersDarkMode ? 'dark' : 'light';
2119
- }
2120
- else {
2121
- this.theme = val;
2122
- }
2123
- }
2212
+ defaultLocalization = inject(NGX_CALENDAR_LOCALIZATION);
2213
+ localize = input(this.defaultLocalization, /* @ts-ignore */
2214
+ ...(ngDevMode ? [{ debugName: "localize" }] : /* istanbul ignore next */ []));
2215
+ resizeAndMovable = input(false, /* @ts-ignore */
2216
+ ...(ngDevMode ? [{ debugName: "resizeAndMovable" }] : /* istanbul ignore next */ []));
2124
2217
  _config = new NgxDatePickerConfig();
2125
2218
  set config(val) {
2126
2219
  this._config = { ...new NgxDatePickerConfig(), ...val };
@@ -2128,150 +2221,626 @@ class NgxCalendarComponent extends NgxDatePickerBase {
2128
2221
  set locale(val) {
2129
2222
  this._locale = val;
2130
2223
  this.adapter = this.dateAdapterRegistry.resolve(this._locale);
2131
- this.ngOnInit();
2224
+ if (this.currYear !== undefined)
2225
+ this.syncAnchorToLocale();
2226
+ this.renderCalendar(this.view);
2132
2227
  }
2133
- /** The minimum valid date. */
2134
2228
  set setMin(value) {
2135
2229
  const validValue = deserialize(value);
2136
2230
  if (!sameDate(validValue, this.minDate)) {
2137
2231
  this.minDate = validValue;
2232
+ this.renderCalendar(this.view);
2138
2233
  }
2139
2234
  }
2140
- /** The maximum valid date. */
2141
2235
  set setMax(value) {
2142
2236
  const validValue = deserialize(value);
2143
2237
  if (!sameDate(validValue, this.maxDate)) {
2144
2238
  this.maxDate = validValue;
2239
+ this.renderCalendar(this.view);
2145
2240
  }
2146
2241
  }
2147
- view = 'day';
2242
+ view = 'month';
2148
2243
  _events = [];
2149
2244
  set events(val) {
2150
- if (val && Array.isArray(val)) {
2151
- this._events = val;
2152
- }
2245
+ this._events = Array.isArray(val) ? val : [];
2246
+ if (this.anchorDate)
2247
+ this.renderCalendar(this.view);
2248
+ }
2249
+ get events() {
2250
+ return this._events;
2153
2251
  }
2154
2252
  dateChange = new EventEmitter();
2155
2253
  selectEvent = new EventEmitter();
2156
- defaultHeight = 600;
2157
- minHeight = this.defaultHeight;
2254
+ eventChange = new EventEmitter();
2255
+ eventsChange = new EventEmitter();
2158
2256
  selected;
2257
+ anchorDate;
2258
+ eventViewItems = [];
2259
+ monthEventSegments = [];
2260
+ monthEventRows = Array.from({ length: MONTH_ROW_COUNT }, () => []);
2261
+ weekDays = [];
2262
+ allDayByColumn = [];
2263
+ timeSlots = Array.from({ length: 48 }, (_, i) => i * 30);
2264
+ hourHeight = HOUR_HEIGHT;
2265
+ timeColumnWidth = 64;
2159
2266
  calendarWrapper = viewChild('calendarWrapper', /* @ts-ignore */
2160
2267
  ...(ngDevMode ? [{ debugName: "calendarWrapper" }] : /* istanbul ignore next */ []));
2268
+ interaction = null;
2161
2269
  constructor() {
2162
2270
  super();
2163
2271
  }
2164
2272
  ngOnInit() {
2165
2273
  this.months = this.adapter.longMonths;
2166
2274
  this.weeks = this.adapter.longDays;
2167
- if (this.selected) {
2168
- let converted = this.adapter.toLocale(this.selected);
2169
- this.currYear = converted.year;
2170
- this.currMonth = converted.month;
2171
- this.renderCalendar(this.view);
2172
- }
2173
- else {
2174
- this.gotoToday();
2175
- }
2275
+ this.anchorDate = this.selected
2276
+ ? new Date(this.selected)
2277
+ : this.adapter.getDate(this.adapter.today());
2278
+ this.syncAnchorToLocale();
2279
+ this.renderCalendar(this.view);
2176
2280
  }
2177
- ngAfterViewInit() {
2281
+ onResize() {
2178
2282
  this.calcCellSize();
2179
2283
  }
2180
- onResize(ev) {
2181
- this.calcCellSize();
2284
+ onDocumentPointerMove(event) {
2285
+ if (!this.interaction || event.pointerId !== this.interaction.pointerId)
2286
+ return;
2287
+ this.updateEventInteraction(event);
2288
+ }
2289
+ onDocumentPointerUp(event) {
2290
+ if (!this.interaction || event.pointerId !== this.interaction.pointerId)
2291
+ return;
2292
+ this.finishEventInteraction(event, false);
2293
+ }
2294
+ onDocumentPointerCancel(event) {
2295
+ if (!this.interaction || event.pointerId !== this.interaction.pointerId)
2296
+ return;
2297
+ this.finishEventInteraction(event, true);
2182
2298
  }
2183
2299
  calcCellSize() {
2184
2300
  const fullWidth = this.calendarWrapper()?.nativeElement?.clientWidth ?? 0;
2185
- const cellHeight = fullWidth / 6;
2186
- this.minHeight = fullWidth > this.defaultHeight ? this.defaultHeight : fullWidth;
2187
- if (fullWidth <= 500) {
2188
- this.weeks = this.adapter.shortDays;
2301
+ this.minHeight = fullWidth > this.defaultHeight ? this.defaultHeight : Math.max(fullWidth, 320);
2302
+ this.weeks = fullWidth <= 500 ? this.adapter.shortDays : this.adapter.longDays;
2303
+ }
2304
+ renderCalendar(view) {
2305
+ if (!this.anchorDate)
2306
+ return;
2307
+ this.syncAnchorToLocale();
2308
+ switch (view) {
2309
+ case 'month':
2310
+ super.renderCalendar('month', undefined, this.renderEvents);
2311
+ this.buildMonthEventSegments();
2312
+ break;
2313
+ case 'week':
2314
+ case 'day':
2315
+ this.renderTimedView();
2316
+ break;
2317
+ case 'event':
2318
+ this.renderEventView();
2319
+ break;
2320
+ }
2321
+ this.displayMonth = this.months[this.currMonth] ?? '';
2322
+ queueMicrotask(() => this.calcCellSize());
2323
+ }
2324
+ get renderEvents() {
2325
+ return this._events;
2326
+ }
2327
+ syncAnchorToLocale() {
2328
+ const localeDate = this.adapter.toLocale(this.anchorDate);
2329
+ this.currYear = localeDate.year;
2330
+ this.currMonth = localeDate.month ?? 0;
2331
+ this.months = this.adapter.longMonths;
2332
+ this.weeks = this.adapter.longDays;
2333
+ }
2334
+ renderTimedView() {
2335
+ const dates = this.getWeekDates(this.anchorDate);
2336
+ const visibleDates = this.view === 'day' ? [new Date(this.startOfDay(this.anchorDate))] : dates;
2337
+ this.weekDays = visibleDates.map((date, column) => ({
2338
+ date,
2339
+ label: this.adapter.formatDate(this.adapter.toLocale(date), 'full') ?? '',
2340
+ dayNumber: String(this.adapter.toLocale(date).day),
2341
+ isToday: sameDate(date, this.adapter.getDate(this.adapter.today())),
2342
+ events: this.buildTimedEventsForDay(date, column, visibleDates.length),
2343
+ }));
2344
+ this.allDayByColumn = this.weekDays.map((day, column) => this.buildAllDayEventsForDay(day.date, column));
2345
+ this.viewWeeks = this.timeSlots.map((minutes) => ({
2346
+ time: minutes / 60,
2347
+ displayTime: this.formatTime(minutes),
2348
+ weeks: visibleDates.map(() => ''),
2349
+ active: true,
2350
+ selected: false,
2351
+ }));
2352
+ }
2353
+ /**
2354
+ * Builds a collision layout per overlap cluster. Each cluster gets its own
2355
+ * column count, which prevents a short 09:00 event from being unnecessarily
2356
+ * squeezed because another event overlaps at 15:00.
2357
+ */
2358
+ buildTimedEventsForDay(date, column, columnCount) {
2359
+ const dayStart = this.startOfDay(date);
2360
+ const dayEnd = this.endOfDay(date);
2361
+ const candidates = this.normalizedEvents()
2362
+ .filter(({ start, end, source }) => !source.allDay &&
2363
+ !Number.isNaN(start.getTime()) &&
2364
+ end.getTime() >= dayStart.getTime() &&
2365
+ start.getTime() <= dayEnd.getTime())
2366
+ .map(({ source, start, end }) => {
2367
+ const segmentStart = new Date(Math.max(start.getTime(), dayStart.getTime()));
2368
+ const segmentEnd = new Date(Math.min(end.getTime(), dayEnd.getTime()));
2369
+ return {
2370
+ ...source,
2371
+ start,
2372
+ end,
2373
+ segmentStart,
2374
+ segmentEnd,
2375
+ allDay: false,
2376
+ continuesBefore: start.getTime() < dayStart.getTime(),
2377
+ continuesAfter: end.getTime() > dayEnd.getTime(),
2378
+ isStart: start.getTime() >= dayStart.getTime() && start.getTime() <= dayEnd.getTime(),
2379
+ isEnd: end.getTime() >= dayStart.getTime() && end.getTime() <= dayEnd.getTime(),
2380
+ column,
2381
+ columnCount,
2382
+ };
2383
+ })
2384
+ .sort((a, b) => a.segmentStart.getTime() - b.segmentStart.getTime() ||
2385
+ b.segmentEnd.getTime() - a.segmentEnd.getTime());
2386
+ const result = [];
2387
+ let cluster = [];
2388
+ let clusterLanes = [];
2389
+ let clusterEnd = -Infinity;
2390
+ const flushCluster = () => {
2391
+ if (!cluster.length)
2392
+ return;
2393
+ const laneCount = clusterLanes.length;
2394
+ for (const item of cluster) {
2395
+ item.columnCount = laneCount;
2396
+ }
2397
+ result.push(...cluster);
2398
+ cluster = [];
2399
+ clusterLanes = [];
2400
+ clusterEnd = -Infinity;
2401
+ };
2402
+ for (const e of candidates) {
2403
+ const start = e.segmentStart.getTime();
2404
+ if (cluster.length && start > clusterEnd)
2405
+ flushCluster();
2406
+ let lane = clusterLanes.findIndex((items) => {
2407
+ const last = items[items.length - 1];
2408
+ return last.segmentEnd.getTime() <= start;
2409
+ });
2410
+ if (lane < 0) {
2411
+ lane = clusterLanes.length;
2412
+ clusterLanes.push([]);
2413
+ }
2414
+ const positioned = { ...e, lane, column: lane };
2415
+ clusterLanes[lane].push(positioned);
2416
+ cluster.push(positioned);
2417
+ clusterEnd = Math.max(clusterEnd, e.segmentEnd.getTime());
2418
+ const startMinutes = e.segmentStart.getHours() * 60 + e.segmentStart.getMinutes();
2419
+ const endMinutes = e.segmentEnd.getHours() * 60 + e.segmentEnd.getMinutes();
2420
+ const effectiveEnd = Math.max(endMinutes, startMinutes + MIN_EVENT_MINUTES);
2421
+ positioned.top = (startMinutes / 60) * HOUR_HEIGHT;
2422
+ positioned.height = Math.max(((effectiveEnd - startMinutes) / 60) * HOUR_HEIGHT, 28);
2423
+ }
2424
+ flushCluster();
2425
+ return result
2426
+ .concat(cluster)
2427
+ .map(({ lane, segmentStart, segmentEnd, ...event }) => event);
2428
+ }
2429
+ buildAllDayEventsForDay(date, column) {
2430
+ const dayStart = this.startOfDay(date);
2431
+ const dayEnd = this.endOfDay(date);
2432
+ return this.normalizedEvents()
2433
+ .filter(({ source, start, end }) => !!source.allDay &&
2434
+ !Number.isNaN(start.getTime()) &&
2435
+ end.getTime() >= dayStart.getTime() &&
2436
+ start.getTime() <= dayEnd.getTime())
2437
+ .map(({ source, start, end }) => ({
2438
+ ...source,
2439
+ start,
2440
+ end,
2441
+ top: 0,
2442
+ height: 24,
2443
+ allDay: true,
2444
+ column,
2445
+ columnCount: 1,
2446
+ continuesBefore: start.getTime() < dayStart.getTime(),
2447
+ continuesAfter: end.getTime() > dayEnd.getTime(),
2448
+ isStart: start.getTime() >= dayStart.getTime() && start.getTime() <= dayEnd.getTime(),
2449
+ isEnd: end.getTime() >= dayStart.getTime() && end.getTime() <= dayEnd.getTime(),
2450
+ }));
2451
+ }
2452
+ /** Creates FullCalendar-style horizontal segments for the six visible month rows. */
2453
+ buildMonthEventSegments() {
2454
+ const visibleDays = this.viewDays;
2455
+ if (!visibleDays.length) {
2456
+ this.monthEventSegments = [];
2457
+ this.monthEventRows = Array.from({ length: MONTH_ROW_COUNT }, () => []);
2458
+ return;
2189
2459
  }
2190
- else if (fullWidth > 500) {
2191
- this.weeks = this.adapter.longDays;
2460
+ const gridStart = this.startOfDay(visibleDays[0].date);
2461
+ const gridEnd = this.endOfDay(visibleDays[visibleDays.length - 1].date);
2462
+ const segments = [];
2463
+ for (const { source, start, end } of this.normalizedEvents()) {
2464
+ if (Number.isNaN(start.getTime()) ||
2465
+ end.getTime() < gridStart.getTime() ||
2466
+ start.getTime() > gridEnd.getTime())
2467
+ continue;
2468
+ const clippedStart = new Date(Math.max(start.getTime(), gridStart.getTime()));
2469
+ const clippedEnd = new Date(Math.min(end.getTime(), gridEnd.getTime()));
2470
+ const firstIndex = this.dayIndexInMonthGrid(clippedStart, gridStart);
2471
+ const lastIndex = this.dayIndexInMonthGrid(clippedEnd, gridStart);
2472
+ for (let index = Math.max(0, firstIndex); index <= Math.min(visibleDays.length - 1, lastIndex);) {
2473
+ const row = Math.floor(index / MONTH_COLUMN_COUNT);
2474
+ const rowEndIndex = Math.min((row + 1) * MONTH_COLUMN_COUNT - 1, lastIndex);
2475
+ const startColumn = index % MONTH_COLUMN_COUNT;
2476
+ const endColumn = rowEndIndex % MONTH_COLUMN_COUNT;
2477
+ const segmentStart = new Date(visibleDays[index].date);
2478
+ const segmentEnd = this.endOfDay(visibleDays[rowEndIndex].date);
2479
+ segments.push({
2480
+ ...source,
2481
+ start,
2482
+ end,
2483
+ row,
2484
+ startColumn,
2485
+ endColumn,
2486
+ continuesBefore: start.getTime() < segmentStart.getTime(),
2487
+ continuesAfter: end.getTime() > segmentEnd.getTime(),
2488
+ isStart: start.getTime() >= segmentStart.getTime() && start.getTime() <= segmentEnd.getTime(),
2489
+ isEnd: end.getTime() >= segmentStart.getTime() && end.getTime() <= segmentEnd.getTime(),
2490
+ lane: 0,
2491
+ });
2492
+ index = rowEndIndex + 1;
2493
+ }
2192
2494
  }
2495
+ // Stable ordering makes the same events keep the same visual lane while navigating.
2496
+ segments.sort((a, b) => a.row - b.row ||
2497
+ a.startColumn - b.startColumn ||
2498
+ a.start.getTime() - b.start.getTime() ||
2499
+ String(a.title ?? '').localeCompare(String(b.title ?? '')));
2500
+ // Assign lanes independently inside every week row.
2501
+ const lanesByRow = new Map();
2502
+ for (const segment of segments) {
2503
+ const lanes = lanesByRow.get(segment.row) ?? [];
2504
+ let lane = lanes.findIndex((items) => items.every((item) => item.endColumn < segment.startColumn));
2505
+ if (lane < 0) {
2506
+ lane = lanes.length;
2507
+ lanes.push([]);
2508
+ }
2509
+ segment.lane = lane;
2510
+ lanes[lane].push(segment);
2511
+ lanesByRow.set(segment.row, lanes);
2512
+ }
2513
+ this.monthEventSegments = segments;
2514
+ this.monthEventRows = Array.from({ length: MONTH_ROW_COUNT }, () => []);
2515
+ for (const segment of segments)
2516
+ this.monthEventRows[segment.row].push(segment);
2517
+ }
2518
+ dayIndexInMonthGrid(date, gridStart) {
2519
+ const a = this.startOfDay(date);
2520
+ const b = this.startOfDay(gridStart);
2521
+ const aUtc = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
2522
+ const bUtc = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());
2523
+ return Math.round((aUtc - bUtc) / 86_400_000);
2524
+ }
2525
+ normalizedEvents() {
2526
+ return this.renderEventSources().map((source) => {
2527
+ const normalized = this.normalizeEvent(source);
2528
+ return { source, start: normalized.start, end: normalized.end };
2529
+ });
2193
2530
  }
2194
- renderCalendar(view) {
2195
- // console.log('_events', this._events);
2196
- super.renderCalendar(view, undefined, this._events, () => { });
2531
+ renderEventSources() {
2532
+ if (!this.interaction?.active)
2533
+ return this._events;
2534
+ return this._events.map((event) => this.sameEvent(event, this.interaction.source) ? this.interaction.preview : event);
2535
+ }
2536
+ renderEventView() {
2537
+ const monthStart = this.adapter.getDate({
2538
+ locale: this._locale,
2539
+ year: this.currYear,
2540
+ month: this.currMonth,
2541
+ day: 1,
2542
+ });
2543
+ const monthEnd = this.adapter.getDate({
2544
+ locale: this._locale,
2545
+ year: this.currYear,
2546
+ month: this.currMonth,
2547
+ day: this.adapter.lastDateofMonth(this.currYear, this.currMonth),
2548
+ });
2549
+ this.eventViewItems = this.renderEventSources()
2550
+ .map((event) => {
2551
+ const n = this.normalizeEvent(event);
2552
+ return { event: event, start: n.start, end: n.end };
2553
+ })
2554
+ .filter(({ start, end }) => compareDate(end, monthStart) >= 0 && compareDate(start, monthEnd) <= 0)
2555
+ .sort((a, b) => a.start.getTime() - b.start.getTime());
2556
+ }
2557
+ get headerText() {
2558
+ if (!this.anchorDate)
2559
+ return '';
2560
+ if (this.view === 'day') {
2561
+ return this.adapter.formatDate(this.adapter.toLocale(this.anchorDate), 'full') ?? '';
2562
+ }
2563
+ if (this.view === 'week') {
2564
+ const days = this.getWeekDates(this.anchorDate);
2565
+ return this.formatDateRange(days[0], days[6]);
2566
+ }
2567
+ return `${this.displayMonth} ${this.currYear}`;
2568
+ }
2569
+ formatDateRange(start, end) {
2570
+ const s = this.adapter.toLocale(start);
2571
+ const e = this.adapter.toLocale(end);
2572
+ const startText = this.adapter.formatDate(s, 'd MMMM') ?? '';
2573
+ const endText = this.adapter.formatDate(e, 'd MMMM') ?? '';
2574
+ return s.year === e.year
2575
+ ? `${startText} – ${endText}, ${s.year}`
2576
+ : `${startText}, ${s.year} – ${endText}, ${e.year}`;
2577
+ }
2578
+ formatEventDate(date) {
2579
+ return this.adapter.formatDate(this.adapter.toLocale(date), 'd MMMM, yyyy') ?? '';
2580
+ }
2581
+ formatTime(minutes) {
2582
+ return `${String(Math.floor(minutes / 60)).padStart(2, '0')}:${String(minutes % 60).padStart(2, '0')}`;
2197
2583
  }
2198
2584
  changeView(v) {
2585
+ this.cancelEventInteraction();
2199
2586
  this.view = v;
2200
- this.renderCalendar(this.view);
2587
+ this.renderCalendar(v);
2201
2588
  }
2202
2589
  gotoToday() {
2203
- let today = this.adapter.today();
2204
- this.selected = this.adapter.getDate(today);
2205
- this.currYear = today.year;
2206
- this.currMonth = today.month ?? 1;
2207
- this.changeView(this.view);
2590
+ this.cancelEventInteraction();
2591
+ this.anchorDate = this.adapter.getDate(this.adapter.today());
2592
+ this.selected = new Date(this.anchorDate);
2593
+ this.syncAnchorToLocale();
2594
+ this.renderCalendar(this.view);
2208
2595
  }
2209
2596
  selectDay(ev, item) {
2210
2597
  ev.stopPropagation();
2211
2598
  if (item.active) {
2599
+ this.selected = item.date;
2600
+ this.anchorDate = new Date(item.date);
2212
2601
  this.dateChange.emit(item);
2602
+ this.renderCalendar(this.view);
2213
2603
  }
2214
2604
  }
2215
- selectMonth(ev, item) {
2216
- ev.stopPropagation();
2217
- if (item.active) {
2218
- this.currMonth = item.month;
2219
- this.changeView('day');
2220
- }
2605
+ next() {
2606
+ this.navigate(1);
2221
2607
  }
2222
- selectYear(ev, item) {
2223
- ev.stopPropagation();
2224
- if (item.active) {
2225
- this.currYear = item.year;
2226
- this.changeView('month');
2227
- }
2608
+ previous() {
2609
+ this.navigate(-1);
2228
2610
  }
2229
- next() {
2230
- if (this.view === 'month' || this.view == 'event') {
2231
- this.currMonth++;
2232
- }
2233
- else if (this.view == 'day' || this.view == 'week') {
2234
- this.currentWeek++;
2611
+ navigate(direction) {
2612
+ const d = new Date(this.anchorDate);
2613
+ if (this.view === 'month' || this.view === 'event') {
2614
+ const locale = this.adapter.toLocale(d);
2615
+ this.anchorDate = this.adapter.getDate({
2616
+ locale: this._locale,
2617
+ year: locale.year,
2618
+ month: locale.month + direction,
2619
+ day: 1,
2620
+ });
2235
2621
  }
2236
- if (this.currMonth < 0 || this.currMonth > 11) {
2237
- let date = new Date(this.currYear, this.currMonth);
2238
- this.currYear = date.getFullYear();
2239
- this.currMonth = date.getMonth();
2622
+ else {
2623
+ d.setDate(d.getDate() + direction * (this.view === 'week' ? 7 : 1));
2624
+ this.anchorDate = d;
2240
2625
  }
2626
+ this.syncAnchorToLocale();
2241
2627
  this.renderCalendar(this.view);
2242
2628
  }
2243
- previous() {
2244
- if (this.view === 'month' || this.view == 'event') {
2245
- this.currMonth--;
2246
- }
2247
- else if (this.view == 'day' || this.view == 'week') {
2248
- this.currentWeek--;
2249
- }
2250
- if (this.currMonth < 0 || this.currMonth > 11) {
2251
- let date = new Date(this.currYear, this.currMonth);
2252
- this.currYear = date.getFullYear();
2253
- this.currMonth = date.getMonth();
2629
+ onclickEvent(ev, item, event) {
2630
+ ev.stopPropagation();
2631
+ this.selectEvent.emit({ date: item.date, event });
2632
+ }
2633
+ onTimedEventClick(ev, event, date) {
2634
+ ev.stopPropagation();
2635
+ if (this.interaction?.active)
2636
+ return;
2637
+ this.selectEvent.emit({ date, event });
2638
+ }
2639
+ startMonthEventInteraction(ev, segment, type = 'move') {
2640
+ if (ev.button !== 0 || !this.resizeAndMovable())
2641
+ return;
2642
+ ev.preventDefault();
2643
+ ev.stopPropagation();
2644
+ this.beginInteraction(ev, segment, type, 'month');
2645
+ }
2646
+ startTimedEventInteraction(ev, event, type = 'move') {
2647
+ if (ev.button !== 0 || !this.resizeAndMovable())
2648
+ return;
2649
+ ev.preventDefault();
2650
+ ev.stopPropagation();
2651
+ this.beginInteraction(ev, event, type, event.allDay ? 'all-day' : 'timed');
2652
+ }
2653
+ beginInteraction(ev, event, type, _surface) {
2654
+ const source = this._events.find((candidate) => this.sameEvent(candidate, event));
2655
+ if (!source)
2656
+ return;
2657
+ this.interaction = {
2658
+ type,
2659
+ source,
2660
+ previousEvent: { ...source },
2661
+ pointerId: ev.pointerId,
2662
+ startX: ev.clientX,
2663
+ startY: ev.clientY,
2664
+ originColumn: 0,
2665
+ originRow: 0,
2666
+ preview: { ...source },
2667
+ deltaDays: 0,
2668
+ deltaMinutes: 0,
2669
+ active: true,
2670
+ surface: _surface,
2671
+ };
2672
+ }
2673
+ updateEventInteraction(ev) {
2674
+ const state = this.interaction;
2675
+ if (!state)
2676
+ return;
2677
+ const monthMetrics = state.surface === 'month' ? this.monthPointerDelta(ev) : null;
2678
+ const timedMetrics = state.surface === 'timed' ? this.timedPointerDelta(ev) : null;
2679
+ const allDayMetrics = state.surface === 'all-day' ? this.allDayPointerDelta(ev) : null;
2680
+ let deltaDays = monthMetrics?.days ?? timedMetrics?.days ?? allDayMetrics?.days ?? 0;
2681
+ let deltaMinutes = timedMetrics?.minutes ?? 0;
2682
+ const preview = this.applyEventDelta(state.source, state.type, deltaDays, deltaMinutes);
2683
+ if (!this.isWithinBounds(preview))
2684
+ return;
2685
+ state.preview = preview;
2686
+ state.deltaDays = deltaDays;
2687
+ state.deltaMinutes = deltaMinutes;
2688
+ this.renderCalendar(this.view);
2689
+ }
2690
+ finishEventInteraction(ev, cancelled) {
2691
+ const state = this.interaction;
2692
+ if (!state)
2693
+ return;
2694
+ if (!cancelled)
2695
+ this.updateEventInteraction(ev);
2696
+ const changed = !this.sameEventValue(state.source, state.preview);
2697
+ this.interaction = null;
2698
+ if (!cancelled && changed) {
2699
+ const updated = this._events.map((event) => this.sameEvent(event, state.source) ? state.preview : event);
2700
+ this._events = updated;
2701
+ this.eventChange.emit({
2702
+ event: state.preview,
2703
+ previousEvent: state.previousEvent,
2704
+ interaction: state.type,
2705
+ deltaDays: state.deltaDays,
2706
+ deltaMinutes: state.deltaMinutes,
2707
+ });
2708
+ this.eventsChange.emit(updated);
2254
2709
  }
2255
2710
  this.renderCalendar(this.view);
2256
2711
  }
2257
- onclickEvent(item, event) {
2258
- this.selectEvent.emit({
2259
- date: item.date,
2260
- event: event,
2712
+ cancelEventInteraction() {
2713
+ if (!this.interaction)
2714
+ return;
2715
+ this.interaction = null;
2716
+ }
2717
+ monthPointerDelta(ev) {
2718
+ if (!this.interaction || this.view !== 'month')
2719
+ return null;
2720
+ const root = this.calendarWrapper()?.nativeElement.querySelector('.month-grid');
2721
+ if (!root)
2722
+ return null;
2723
+ const rect = root.getBoundingClientRect();
2724
+ const cellWidth = rect.width / MONTH_COLUMN_COUNT;
2725
+ const cellHeight = rect.height / MONTH_ROW_COUNT;
2726
+ const startColumn = Math.max(0, Math.min(MONTH_COLUMN_COUNT - 1, Math.floor((this.interaction.startX - rect.left) / cellWidth)));
2727
+ const currentColumn = Math.max(0, Math.min(MONTH_COLUMN_COUNT - 1, Math.floor((ev.clientX - rect.left) / cellWidth)));
2728
+ const startRow = Math.max(0, Math.min(MONTH_ROW_COUNT - 1, Math.floor((this.interaction.startY - rect.top) / cellHeight)));
2729
+ const currentRow = Math.max(0, Math.min(MONTH_ROW_COUNT - 1, Math.floor((ev.clientY - rect.top) / cellHeight)));
2730
+ return { days: (currentRow - startRow) * 7 + (currentColumn - startColumn) };
2731
+ }
2732
+ allDayPointerDelta(ev) {
2733
+ if (!this.interaction || this.view === 'month' || this.view === 'event')
2734
+ return null;
2735
+ const root = this.calendarWrapper()?.nativeElement.querySelector('.all-day-row');
2736
+ if (!root)
2737
+ return null;
2738
+ const columns = Array.from(root.querySelectorAll('.all-day-cell'));
2739
+ if (!columns.length)
2740
+ return null;
2741
+ const indexAt = (x) => {
2742
+ const index = columns.findIndex((column) => {
2743
+ const rect = column.getBoundingClientRect();
2744
+ return x >= rect.left && x <= rect.right;
2745
+ });
2746
+ return index < 0 ? 0 : index;
2747
+ };
2748
+ return { days: indexAt(ev.clientX) - indexAt(this.interaction.startX) };
2749
+ }
2750
+ timedPointerDelta(ev) {
2751
+ if (!this.interaction || (this.view !== 'day' && this.view !== 'week'))
2752
+ return null;
2753
+ const root = this.calendarWrapper()?.nativeElement.querySelector('.time-grid');
2754
+ if (!root)
2755
+ return null;
2756
+ const columns = Array.from(root.querySelectorAll('.day-column'));
2757
+ if (!columns.length)
2758
+ return null;
2759
+ const startColumn = this.columnAtPoint(columns, this.interaction.startX, this.interaction.startY);
2760
+ const currentColumn = this.columnAtPoint(columns, ev.clientX, ev.clientY);
2761
+ const startIndex = startColumn ?? 0;
2762
+ const currentIndex = currentColumn ?? startIndex;
2763
+ const rect = (columns[currentIndex] ?? columns[0]).getBoundingClientRect();
2764
+ const startRect = (columns[startIndex] ?? columns[0]).getBoundingClientRect();
2765
+ const startMinute = this.snapMinutes(((this.interaction.startY - startRect.top) / HALF_HOUR_HEIGHT) * 30);
2766
+ const currentMinute = this.snapMinutes(((ev.clientY - rect.top) / HALF_HOUR_HEIGHT) * 30);
2767
+ return { days: currentIndex - startIndex, minutes: currentMinute - startMinute };
2768
+ }
2769
+ columnAtPoint(columns, x, y) {
2770
+ const index = columns.findIndex((column) => {
2771
+ const rect = column.getBoundingClientRect();
2772
+ return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;
2261
2773
  });
2774
+ return index < 0 ? null : index;
2775
+ }
2776
+ snapMinutes(minutes) {
2777
+ return Math.max(0, Math.min(24 * 60, Math.round(minutes / 30) * 30));
2778
+ }
2779
+ applyEventDelta(source, type, deltaDays, deltaMinutes) {
2780
+ const normalized = this.normalizeEvent(source);
2781
+ let start = new Date(normalized.start);
2782
+ let end = new Date(normalized.end);
2783
+ if (type === 'move') {
2784
+ start = this.addMinutes(this.addDays(start, deltaDays), deltaMinutes);
2785
+ end = this.addMinutes(this.addDays(end, deltaDays), deltaMinutes);
2786
+ }
2787
+ else if (type === 'resize-start') {
2788
+ start = this.addMinutes(this.addDays(start, deltaDays), deltaMinutes);
2789
+ if (start.getTime() > end.getTime() - MIN_EVENT_MINUTES * 60_000) {
2790
+ start = new Date(end.getTime() - MIN_EVENT_MINUTES * 60_000);
2791
+ }
2792
+ }
2793
+ else {
2794
+ end = this.addMinutes(this.addDays(end, deltaDays), deltaMinutes);
2795
+ if (end.getTime() < start.getTime() + MIN_EVENT_MINUTES * 60_000) {
2796
+ end = new Date(start.getTime() + MIN_EVENT_MINUTES * 60_000);
2797
+ }
2798
+ }
2799
+ return { ...source, start, end };
2800
+ }
2801
+ addDays(date, days) {
2802
+ const d = new Date(date);
2803
+ d.setDate(d.getDate() + days);
2804
+ return d;
2805
+ }
2806
+ addMinutes(date, minutes) {
2807
+ return new Date(date.getTime() + minutes * 60_000);
2808
+ }
2809
+ isWithinBounds(event) {
2810
+ const n = this.normalizeEvent(event);
2811
+ if (this.minDate && compareDate(n.start, this.minDate) < 0)
2812
+ return false;
2813
+ if (this.maxDate && compareDate(n.end, this.maxDate) > 0)
2814
+ return false;
2815
+ return true;
2816
+ }
2817
+ sameEvent(a, b) {
2818
+ return a.id != null && b.id != null ? a.id === b.id : a === b;
2819
+ }
2820
+ sameEventValue(a, b) {
2821
+ const aa = this.normalizeEvent(a);
2822
+ const bb = this.normalizeEvent(b);
2823
+ return aa.start.getTime() === bb.start.getTime() && aa.end.getTime() === bb.end.getTime();
2824
+ }
2825
+ startOfDay(date) {
2826
+ const d = new Date(date);
2827
+ d.setHours(0, 0, 0, 0);
2828
+ return d;
2829
+ }
2830
+ endOfDay(date) {
2831
+ const d = new Date(date);
2832
+ d.setHours(23, 59, 59, 999);
2833
+ return d;
2262
2834
  }
2835
+ defaultHeight = 600;
2836
+ minHeight = this.defaultHeight;
2263
2837
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxCalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2264
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxCalendarComponent, isStandalone: true, selector: "ngx-calendar", inputs: { setTheme: ["theme", "setTheme"], config: "config", locale: "locale", setMin: ["min", "setMin"], setMax: ["max", "setMax"], view: "view", events: "events" }, outputs: { dateChange: "dateChange", selectEvent: "selectEvent" }, host: { listeners: { "window:resize": "onResize($event)" }, properties: { "class.dark": "theme==\"dark\"" } }, providers: [DateAdapterRegistry], viewQueries: [{ propertyName: "calendarWrapper", first: true, predicate: ["calendarWrapper"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"wrapper\" #datepickerWrapper>\n <div class=\"header\">\n <div class=\"nxt-prv-buttons\">\n <button id=\"prev\" class=\"previous dtp-btn\" (click)=\"previous()\" title=\"Previous\">\n <ng-template\n [ngTemplateOutlet]=\"\n _config.previousButtonTemplate || defaultPreviousBTNTemplate\n \"></ng-template>\n </button>\n @if (_config.todayButton) {\n <button class=\"today dtp-btn\" (click)=\"gotoToday()\">\n {{ _config.todayButtonText }}\n </button>\n }\n <button id=\"next\" class=\"next dtp-btn\" (click)=\"next()\" title=\"Next\">\n <ng-template\n [ngTemplateOutlet]=\"_config.nextButtonTemplate || defaultNextBTNTemplate\"></ng-template>\n </button>\n </div>\n <div class=\"current-date\">\n <span>\n {{ currYear }}\n </span>\n <span>\n {{ displayMonth }}\n </span>\n </div>\n <div class=\"view-mode\">\n {{ view }}\n <button\n class=\"dayview dtp-btn\"\n (click)=\"changeView('day')\"\n [class.active]=\"view == 'day'\"\n title=\"Month View\">\n Month\n </button>\n <button\n class=\"dayview dtp-btn\"\n (click)=\"changeView('week')\"\n [class.active]=\"view == 'week'\"\n title=\"Week View\">\n Week\n </button>\n <button\n class=\"dayview dtp-btn\"\n (click)=\"changeView('day')\"\n [class.active]=\"view == 'day'\"\n title=\"Day View\">\n Day\n </button>\n <button\n class=\"dayview dtp-btn\"\n (click)=\"changeView('event')\"\n [class.active]=\"view == 'event'\"\n title=\"Day View\">\n Event\n </button>\n </div>\n </div>\n <div class=\"calendar\" #calendarWrapper>\n @if (view === 'day') {\n <ul class=\"weeks\">\n @for (w of weeks; track $index) {\n <li>\n {{ w }}\n </li>\n }\n </ul>\n <ul class=\"days\" [style.minHeight.px]=\"minHeight\">\n @for (item of viewDays; track $index) {\n <li\n [class.de-active]=\"!item.active\"\n [class.today]=\"item.isToday\"\n [class.selected]=\"item.selected\"\n (click)=\"selectDay($event, item)\">\n <div>{{ item.day }}</div>\n @if (item.events) {\n <div class=\"ms-day-events\">\n @for (event of item.events; track $index) {\n <a\n tabindex=\"0\"\n class=\"ms-day-event\"\n [title]=\"event.title\"\n (click)=\"onclickEvent(item, event)\">\n {{ event.title }}\n </a>\n }\n </div>\n }\n </li>\n }\n </ul>\n } @else if (view == 'week' || view == 'month') {\n <table>\n <thead>\n <tr>\n <th></th>\n @for (w of weeks; track $index) {\n <th>{{ w }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (item of viewWeeks; track $index; let i = $index) {\n <tr>\n <td [title]=\"item.displayTime\">{{ item.time % 1 == 0 ? item.time : '' }}</td>\n @for (w of item.weeks; track $index) {\n <td></td>\n }\n </tr>\n }\n </tbody>\n </table>\n } @else if (view == 'event') {\n not implemented\n }\n </div>\n</div>\n\n<ng-template #defaultPreviousBTNTemplate>\n <svg width=\"15px\" height=\"30px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n class=\"fa-secondary\"\n d=\"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z\" />\n </svg>\n</ng-template>\n\n<ng-template #defaultNextBTNTemplate>\n <svg width=\"15px\" height=\"30px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n class=\"fa-secondary\"\n d=\"M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z\" />\n </svg>\n</ng-template>\n\n<ng-template #defaultCaretDownIcon>\n <svg width=\"10px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n class=\"fa-secondary\"\n d=\"M310.6 246.6l-127.1 128C176.4 380.9 168.2 384 160 384s-16.38-3.125-22.63-9.375l-127.1-128C.2244 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75S319.8 237.5 310.6 246.6z\" />\n </svg>\n</ng-template>\n", styles: [":host{--ngx-color-bg: #fff;--ngx-color-text: #000;--ngx-border-color: #c0c0c0}:host-context(.dark){--ngx-color-bg: #222;--ngx-color-text: #fff;--ngx-border-color: #c0c0c0}.wrapper{background-color:var(--ngx-color-bg);color:var(--ngx-color-text);border-radius:5px}.wrapper .dtp-btn{background:none;border:none;color:inherit;border-radius:3px;padding:3px 15px;box-shadow:0 0 4px #0003;transition:all .3s;display:inline-flex;align-items:center}.wrapper .dtp-btn:not([disabled]):hover{cursor:pointer;background:#87879e}.wrapper .dtp-btn.active{background:#87879e}.wrapper .dtp-btn svg{fill:var(--ngx-color-text)}.wrapper .header{display:flex;align-items:center;justify-content:space-between;padding:10px 10px 0}.wrapper .header .current-date{text-align:center;flex:auto}.wrapper .nxt-prv-buttons{display:flex;align-items:center}.wrapper .nxt-prv-buttons .dtp-btn{border-radius:0}.wrapper .nxt-prv-buttons .dtp-btn:first-child{border-radius:5px 0 0 5px}.wrapper .nxt-prv-buttons .dtp-btn:last-child{border-radius:0 5px 5px 0}.calendar{padding:10px}.calendar ul{display:flex;flex-wrap:wrap;list-style:none;padding:0;margin:0;border:1px var(--ngx-border-color) solid;border-bottom:none}.calendar .days{margin-bottom:20px}.calendar .days li{width:14.2857142857%;text-align:end;max-height:300px;overflow:auto}.calendar .months{margin-bottom:20px}.calendar .months li{height:40px;width:33%}.calendar .years{margin-bottom:20px}.calendar .years li{height:40px;width:25%}.calendar li{position:relative;border-right:1px var(--ngx-border-color) solid;border-bottom:1px var(--ngx-border-color) solid;padding:4px}.calendar li.de-active{color:#cbcbcb}.calendar li.selected{border:1px #1216fa solid}.calendar li.today{background-color:#ff9d0130}.calendar .weeks li{cursor:default;width:14.2857142857%;text-align:center;font-weight:700}.calendar .weeks li:hover{background:none}.ms-day-events .ms-day-event{color:#3f51b5;background:var(--ngx-color-bg);border:1px rgba(63,81,181,.1215686275) solid;border-radius:4px;min-height:25px;padding:4px;margin:4px 0;text-decoration:none;display:block}::ng-deep html[dir=rtl] .wrapper .nxt-prv-buttons .dtp-btn:first-child,::ng-deep body[dir=rtl] .wrapper .nxt-prv-buttons .dtp-btn:first-child{border-radius:0 5px 5px 0!important}::ng-deep html[dir=rtl] .wrapper .nxt-prv-buttons .dtp-btn:last-child,::ng-deep body[dir=rtl] .wrapper .nxt-prv-buttons .dtp-btn:last-child{border-radius:5px 0 0 5px!important}::ng-deep html[dir=rtl] .wrapper .wrapper .dtp-btn.next,::ng-deep html[dir=rtl] .wrapper .wrapper .dtp-btn.previous,::ng-deep body[dir=rtl] .wrapper .wrapper .dtp-btn.next,::ng-deep body[dir=rtl] .wrapper .wrapper .dtp-btn.previous{transform:rotate(180deg)}table{width:100%;border-collapse:collapse}table td,table th{border:1px rgb(158,158,158) solid;padding:5px;height:1.5em}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
2838
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxCalendarComponent, isStandalone: true, selector: "ngx-calendar", inputs: { localize: { classPropertyName: "localize", publicName: "localize", isSignal: true, isRequired: false, transformFunction: null }, resizeAndMovable: { classPropertyName: "resizeAndMovable", publicName: "resizeAndMovable", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: false, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: false, isRequired: false, transformFunction: null }, setMin: { classPropertyName: "setMin", publicName: "min", isSignal: false, isRequired: false, transformFunction: null }, setMax: { classPropertyName: "setMax", publicName: "max", isSignal: false, isRequired: false, transformFunction: null }, view: { classPropertyName: "view", publicName: "view", isSignal: false, isRequired: false, transformFunction: null }, events: { classPropertyName: "events", publicName: "events", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { dateChange: "dateChange", selectEvent: "selectEvent", eventChange: "eventChange", eventsChange: "eventsChange" }, host: { listeners: { "window:resize": "onResize()", "document:pointermove": "onDocumentPointerMove($event)", "document:pointerup": "onDocumentPointerUp($event)", "document:pointercancel": "onDocumentPointerCancel($event)" } }, providers: [DateAdapterRegistry], viewQueries: [{ propertyName: "calendarWrapper", first: true, predicate: ["calendarWrapper"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"wrapper\" [class.is-interacting]=\"!!interaction\">\r\n <div class=\"header\">\r\n <div class=\"nxt-prv-buttons\">\r\n <button type=\"button\" class=\"previous dtp-btn\" (click)=\"previous()\" title=\"Previous\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"\r\n _config.previousButtonTemplate || defaultPreviousBTNTemplate\r\n \"></ng-template>\r\n </button>\r\n @if (_config.todayButton) {\r\n <button type=\"button\" class=\"today dtp-btn\" (click)=\"gotoToday()\">\r\n {{ localize().today }}\r\n </button>\r\n }\r\n <button type=\"button\" class=\"next dtp-btn\" (click)=\"next()\" title=\"Next\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"_config.nextButtonTemplate || defaultNextBTNTemplate\"></ng-template>\r\n </button>\r\n </div>\r\n\r\n <div class=\"current-date\" aria-live=\"polite\">{{ headerText }}</div>\r\n\r\n <div class=\"view-mode\">\r\n <button\r\n type=\"button\"\r\n class=\"dtp-btn\"\r\n (click)=\"changeView('month')\"\r\n [class.active]=\"view === 'month'\">\r\n {{ localize().month }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"dtp-btn\"\r\n (click)=\"changeView('week')\"\r\n [class.active]=\"view === 'week'\">\r\n {{ localize().week }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"dtp-btn\"\r\n (click)=\"changeView('day')\"\r\n [class.active]=\"view === 'day'\">\r\n {{ localize().day }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"dtp-btn\"\r\n (click)=\"changeView('event')\"\r\n [class.active]=\"view === 'event'\">\r\n {{ localize().event }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"calendar\" #calendarWrapper>\r\n @switch (view) {\r\n @case ('month') {\r\n <ul class=\"weeks\">\r\n @for (w of weeks; track $index) {\r\n <li>{{ w }}</li>\r\n }\r\n </ul>\r\n\r\n <div class=\"month-grid\" [style.minHeight.px]=\"minHeight\">\r\n @for (row of monthEventRows; track $index; let rowIndex = $index) {\r\n <div class=\"month-row\">\r\n @for (\r\n item of viewDays.slice(rowIndex * 7, rowIndex * 7 + 7);\r\n track item.date?.getTime() ?? $index\r\n ) {\r\n <button\r\n type=\"button\"\r\n class=\"month-day\"\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectDay($event, item)\">\r\n <span class=\"day-number\">{{ item.day }}</span>\r\n </button>\r\n }\r\n\r\n <div class=\"month-event-layer\" aria-live=\"polite\">\r\n @for (event of row; track event.id ?? event.start.getTime() ?? $index) {\r\n <button\r\n type=\"button\"\r\n class=\"month-event\"\r\n [class.continues-before]=\"event.continuesBefore\"\r\n [class.continues-after]=\"event.continuesAfter\"\r\n [class.event-start]=\"event.isStart\"\r\n [class.event-end]=\"event.isEnd\"\r\n [class.is-dragging]=\"\r\n interaction?.source === event ||\r\n (interaction?.source?.id != null && interaction?.source?.id === event.id)\r\n \"\r\n [style.gridColumn]=\"event.startColumn + 1 + ' / ' + (event.endColumn + 2)\"\r\n [style.gridRow]=\"event.lane + 1\"\r\n [style.background]=\"event.backgroundColor || event.color || null\"\r\n [style.borderColor]=\"event.borderColor || event.color || null\"\r\n [style.color]=\"event.textColor || null\"\r\n [title]=\"event.title || ''\"\r\n (pointerdown)=\"startMonthEventInteraction($event, event)\"\r\n (click)=\"\r\n onclickEvent($event, { date: event.start, day: 0, active: true }, event)\r\n \">\r\n @if (event.isStart) {\r\n <span class=\"event-title\">{{ event.title || 'Untitled event' }}</span>\r\n } @else {\r\n <span class=\"event-title continuation-title\">{{ event.title || '' }}</span>\r\n }\r\n @if (resizeAndMovable()) {\r\n @if (event.isStart) {\r\n <span\r\n class=\"resize-handle resize-handle-h resize-start\"\r\n title=\"Resize start\"\r\n (pointerdown)=\"\r\n startMonthEventInteraction($event, event, 'resize-start')\r\n \"></span>\r\n }\r\n @if (event.isEnd) {\r\n <span\r\n class=\"resize-handle resize-handle-h resize-end\"\r\n title=\"Resize end\"\r\n (pointerdown)=\"\r\n startMonthEventInteraction($event, event, 'resize-end')\r\n \"></span>\r\n }\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @case ('week') {\r\n <ng-container [ngTemplateOutlet]=\"timedCalendar\"></ng-container>\r\n }\r\n\r\n @case ('day') {\r\n <ng-container [ngTemplateOutlet]=\"timedCalendar\"></ng-container>\r\n }\r\n\r\n @case ('event') {\r\n <div class=\"event-list\">\r\n @if (eventViewItems.length) {\r\n @for (item of eventViewItems; track item.event.id ?? item.start.getTime()) {\r\n <button\r\n type=\"button\"\r\n class=\"event-list-item\"\r\n (click)=\"\r\n onclickEvent($event, { date: item.start, day: 0, active: true }, item.event)\r\n \">\r\n <span\r\n class=\"event-dot\"\r\n [style.background]=\"\r\n item.event.backgroundColor || item.event.color || null\r\n \"></span>\r\n <span class=\"event-copy\">\r\n <strong>{{ item.event.title || 'Untitled event' }}</strong>\r\n <small>\r\n {{ formatEventDate(item.start) }}\r\n @if (item.end.getTime() !== item.start.getTime()) {\r\n \u2013 {{ formatEventDate(item.end) }}\r\n }\r\n </small>\r\n </span>\r\n </button>\r\n }\r\n } @else {\r\n <div class=\"empty-events\">No events for this month.</div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n<ng-template #timedCalendar>\r\n <div class=\"timed-calendar\">\r\n <div\r\n class=\"timed-header\"\r\n [style.gridTemplateColumns]=\"'64px repeat(' + weekDays.length + ', minmax(0, 1fr))'\">\r\n <div class=\"corner\"></div>\r\n @for (day of weekDays; track day.date.getTime()) {\r\n <button\r\n type=\"button\"\r\n class=\"day-header\"\r\n [class.today]=\"day.isToday\"\r\n (click)=\"selectDay($event, { date: day.date, day: 0, active: true })\">\r\n <span>{{ day.label }}</span>\r\n <strong>{{ day.dayNumber }}</strong>\r\n </button>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"all-day-row\"\r\n [style.gridTemplateColumns]=\"'64px repeat(' + weekDays.length + ', minmax(0, 1fr))'\">\r\n <div class=\"all-day-label\">All day</div>\r\n @for (day of weekDays; track day.date.getTime(); let i = $index) {\r\n <div class=\"all-day-cell\">\r\n @for (\r\n event of allDayByColumn[i];\r\n track event.id ?? event.title ?? event.start.getTime()\r\n ) {\r\n <button\r\n type=\"button\"\r\n class=\"timed-event all-day-event\"\r\n [class.continues-before]=\"event.continuesBefore\"\r\n [class.continues-after]=\"event.continuesAfter\"\r\n [style.background]=\"event.backgroundColor || event.color || null\"\r\n [style.borderColor]=\"event.borderColor || event.color || null\"\r\n [style.color]=\"event.textColor || null\"\r\n [title]=\"event.title || ''\"\r\n (pointerdown)=\"startTimedEventInteraction($event, event)\"\r\n (click)=\"onTimedEventClick($event, event, day.date)\">\r\n <span>{{ event.title || 'Untitled event' }}</span>\r\n @if (resizeAndMovable()) {\r\n @if (event.isStart) {\r\n <span\r\n class=\"resize-handle resize-handle-h resize-start\"\r\n title=\"Resize start\"\r\n (pointerdown)=\"\r\n startTimedEventInteraction($event, event, 'resize-start')\r\n \"></span>\r\n }\r\n @if (event.isEnd) {\r\n <span\r\n class=\"resize-handle resize-handle-h resize-end\"\r\n title=\"Resize end\"\r\n (pointerdown)=\"startTimedEventInteraction($event, event, 'resize-end')\"></span>\r\n }\r\n }\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"time-grid\"\r\n [style.gridTemplateColumns]=\"'64px repeat(' + weekDays.length + ', minmax(0, 1fr))'\">\r\n <div class=\"time-axis\">\r\n @for (minutes of timeSlots; track minutes) {\r\n <div class=\"time-label\" [style.top.px]=\"(minutes / 60) * hourHeight\">\r\n @if (minutes % 60 === 0) {\r\n {{ formatTime(minutes) }}\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @for (day of weekDays; track day.date.getTime()) {\r\n <div class=\"day-column\">\r\n @for (minutes of timeSlots; track minutes) {\r\n <div class=\"time-slot\" [class.hour]=\"minutes % 60 === 0\"></div>\r\n }\r\n\r\n @for (event of day.events; track event.id ?? event.title ?? event.start.getTime()) {\r\n <button\r\n type=\"button\"\r\n class=\"timed-event\"\r\n [class.continues-before]=\"event.continuesBefore\"\r\n [class.continues-after]=\"event.continuesAfter\"\r\n [style.top.px]=\"event.top\"\r\n [style.height.px]=\"event.height\"\r\n [style.insetInlineStart.%]=\"event.column * (100 / event.columnCount)\"\r\n [style.width.%]=\"100 / event.columnCount - 1\"\r\n [style.background]=\"event.backgroundColor || event.color || null\"\r\n [style.borderColor]=\"event.borderColor || event.color || null\"\r\n [style.color]=\"event.textColor || null\"\r\n [title]=\"event.title || ''\"\r\n (pointerdown)=\"startTimedEventInteraction($event, event)\"\r\n (click)=\"onTimedEventClick($event, event, day.date)\">\r\n <strong>{{ event.title || 'Untitled event' }}</strong>\r\n @if (event.height >= 42) {\r\n <small>\r\n {{ formatTime(event.start.getHours() * 60 + event.start.getMinutes()) }}\r\n </small>\r\n }\r\n @if (resizeAndMovable()) {\r\n @if (event.isStart) {\r\n <span\r\n class=\"resize-handle resize-handle-v resize-start\"\r\n title=\"Resize start\"\r\n (pointerdown)=\"\r\n startTimedEventInteraction($event, event, 'resize-start')\r\n \"></span>\r\n }\r\n @if (event.isEnd) {\r\n <span\r\n class=\"resize-handle resize-handle-v resize-end\"\r\n title=\"Resize end\"\r\n (pointerdown)=\"startTimedEventInteraction($event, event, 'resize-end')\"></span>\r\n }\r\n }\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultPreviousBTNTemplate>\r\n <svg width=\"15px\" height=\"30px\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z\" />\r\n </svg>\r\n</ng-template>\r\n\r\n<ng-template #defaultNextBTNTemplate>\r\n <svg width=\"15px\" height=\"30px\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z\" />\r\n </svg>\r\n</ng-template>\r\n", styles: [":host{--ngx-color-bg: light-dark(#fff, #171a24);--ngx-color-text: light-dark(#16181d, #f7f7f8);--ngx-border-color: light-dark(#e1e4ea, #303541);--ngx-muted: color-mix(in srgb, var(--ngx-color-text) 55%, transparent);--ngx-event-bg: light-dark(#eef0ff, #2f3150);--ngx-event-text: light-dark(#3547a4, #dce1ff);--ngx-today: #3f51b5}.wrapper{background:var(--ngx-color-bg);color:var(--ngx-color-text);border:1px solid var(--ngx-border-color);border-radius:10px;overflow:hidden}.wrapper .dtp-btn{background:none;border:none;color:inherit;border-radius:6px;padding:5px 12px;box-shadow:0 0 4px #0000001f;transition:background .16s ease,transform .16s ease;display:inline-flex;align-items:center;justify-content:center}.wrapper .dtp-btn:not([disabled]):hover{cursor:pointer;background:#7f7fa02e}.wrapper .dtp-btn.active{background:#7f7fa03d}.wrapper .dtp-btn svg{fill:currentColor}.wrapper .header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px;border-bottom:1px solid var(--ngx-border-color)}.wrapper .header .current-date{text-align:center;flex:1;min-width:0;font-weight:700}.wrapper .nxt-prv-buttons,.wrapper .view-mode{display:flex;align-items:center;gap:4px}.calendar{padding:10px;min-width:0}.weeks{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));list-style:none;padding:0;margin:0 0 8px;border-inline-start:1px solid var(--ngx-border-color)}.weeks li{padding:7px 4px;text-align:center;color:var(--ngx-muted);font-size:11px;font-weight:700;border-inline-end:1px solid var(--ngx-border-color)}.month-grid{display:grid;grid-template-rows:repeat(6,minmax(92px,1fr));border-inline-start:1px solid var(--ngx-border-color);border-top:1px solid var(--ngx-border-color);position:relative}.month-row{position:relative;display:grid;grid-template-columns:repeat(7,minmax(0,1fr));min-height:92px;border-bottom:1px solid var(--ngx-border-color)}.month-day{position:relative;min-width:0;min-height:92px;overflow:hidden;padding:4px;border:0;border-inline-end:1px solid var(--ngx-border-color);background:transparent;color:inherit;font:inherit;text-align:start;cursor:pointer;transition:background .15s ease}.month-day:hover{background:#7f7fa00d}.month-day.de-active{opacity:.48}.month-day.selected{outline:2px solid rgba(63,81,181,.3);outline-offset:-2px}.month-day.today .day-number{background:#3f51b51a;color:var(--ngx-today);font-weight:800}.day-number{width:27px;height:27px;display:grid;place-items:center;margin-inline-start:auto;border-radius:50%;font-size:12px;font-weight:600}.month-event-layer{position:absolute;inset:0;display:grid;grid-template-columns:repeat(7,minmax(0,1fr));grid-template-rows:repeat(4,26px);pointer-events:none;padding-top:34px}.month-event{position:relative;z-index:3;min-width:0;height:22px;margin-inline:2px;padding:2px 7px;border:1px solid transparent;border-radius:5px;overflow:hidden;background:var(--ngx-event-bg);color:var(--ngx-event-text);font:inherit;font-size:11px;font-weight:600;line-height:17px;text-align:start;white-space:nowrap;text-overflow:ellipsis;pointer-events:auto;cursor:grab;touch-action:none;box-sizing:border-box}.month-event:active{cursor:grabbing}.month-event:hover{filter:brightness(.97);box-shadow:0 2px 7px #00000024}.month-event.is-dragging{opacity:.78;box-shadow:0 5px 14px #0003}.month-event.continues-before{border-start-start-radius:2px;border-end-start-radius:2px;margin-inline-start:0}.month-event.continues-after{border-start-end-radius:2px;border-end-end-radius:2px;margin-inline-end:0}.event-title{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.continuation-title{opacity:.85}.resize-handle{position:absolute;z-index:5;touch-action:none;background:transparent}.resize-handle-h{top:0;bottom:0;width:11px;cursor:ew-resize}.resize-handle-h:after{content:\"\";position:absolute;top:5px;bottom:5px;inset-inline-start:4px;width:2px;border-radius:2px;background:currentColor;opacity:.45}.resize-handle-h.resize-start{inset-inline-start:-2px}.resize-handle-h.resize-end{inset-inline-end:-2px}.resize-handle-v{inset-inline:0;height:8px;cursor:ns-resize}.resize-handle-v:after{content:\"\";position:absolute;inset-inline:5px;height:2px;border-radius:2px;background:currentColor;opacity:.45}.resize-handle-v.resize-start{top:-2px}.resize-handle-v.resize-start:after{top:4px}.resize-handle-v.resize-end{bottom:-2px}.resize-handle-v.resize-end:after{bottom:4px}.timed-calendar{min-width:0;border:1px solid var(--ngx-border-color);border-radius:8px;overflow:auto}.timed-header,.all-day-row,.time-grid{display:grid;min-width:620px}.timed-header{position:sticky;top:0;z-index:5;background:var(--ngx-color-bg);border-bottom:1px solid var(--ngx-border-color)}.corner{border-inline-end:1px solid var(--ngx-border-color)}.day-header{min-width:0;height:58px;padding:6px;border:0;border-inline-end:1px solid var(--ngx-border-color);background:transparent;color:inherit;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px}.day-header span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;color:var(--ngx-muted)}.day-header strong{width:30px;height:30px;display:grid;place-items:center;border-radius:50%;font-size:14px}.day-header.today strong{background:var(--ngx-today);color:#fff}.day-header:hover{background:#7f7fa012}.all-day-row{min-height:34px;border-bottom:1px solid var(--ngx-border-color);background:color-mix(in srgb,var(--ngx-color-bg) 94%,currentColor)}.all-day-row .all-day-label{padding:8px 5px;color:var(--ngx-muted);font-size:10px;border-inline-end:1px solid var(--ngx-border-color);text-align:center}.all-day-row .all-day-cell{min-width:0;padding:4px;border-inline-end:1px solid var(--ngx-border-color);display:flex;flex-direction:column;gap:3px}.time-grid{position:relative;align-items:stretch;min-height:1536px}.time-axis{position:relative;border-inline-end:1px solid var(--ngx-border-color);background:var(--ngx-color-bg)}.time-label{position:absolute;inset-inline:0 5px;transform:translateY(-50%);text-align:end;color:var(--ngx-muted);font-size:10px;pointer-events:none}.day-column{position:relative;min-width:0;height:1536px;border-inline-end:1px solid var(--ngx-border-color);background:repeating-linear-gradient(to bottom,transparent 0,transparent 31px,var(--ngx-border-color) 32px,transparent 33px,transparent 63px,var(--ngx-border-color) 64px)}.time-slot{height:32px;pointer-events:none;border-bottom:1px dashed color-mix(in srgb,var(--ngx-border-color) 55%,transparent)}.time-slot.hour{border-bottom-style:solid;border-bottom-color:var(--ngx-border-color)}.timed-event{position:absolute;z-index:2;min-width:24px;padding:4px 7px;border:1px solid transparent;border-radius:5px;overflow:hidden;background:var(--ngx-event-bg);color:var(--ngx-event-text);font:inherit;font-size:11px;line-height:15px;text-align:start;cursor:grab;box-sizing:border-box;touch-action:none;transition:filter .12s ease,box-shadow .12s ease}.timed-event:hover{filter:brightness(.97);box-shadow:0 2px 7px #00000024;z-index:4}.timed-event strong,.timed-event small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timed-event small{opacity:.72;font-size:10px}.timed-event.continues-before{border-start-start-radius:2px;border-end-start-radius:2px}.timed-event.continues-after{border-start-end-radius:2px;border-end-end-radius:2px}.timed-event.all-day-event{cursor:grab;position:relative;inset:auto!important;width:100%!important;min-height:24px;height:24px;padding-block:2px}.event-list{display:flex;flex-direction:column;gap:6px}.event-list-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;border:1px solid var(--ngx-border-color);border-radius:8px;background:transparent;color:inherit;text-align:start;cursor:pointer}.event-list-item:hover{background:#7f7fa014}.event-list-item .event-dot{width:8px;height:8px;flex:0 0 8px;border-radius:50%;background:var(--ngx-today)}.event-list-item .event-copy{min-width:0;display:flex;flex-direction:column;gap:2px}.event-list-item .event-copy strong,.event-list-item .event-copy small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.event-list-item .event-copy small{opacity:.58}.empty-events{padding:30px;text-align:center;opacity:.55}:host-context([dir=rtl]) .nxt-prv-buttons .previous svg{transform:rotate(180deg)}:host-context([dir=rtl]) .nxt-prv-buttons .next svg{transform:rotate(180deg)}@media(max-width:700px){.wrapper .header{flex-wrap:wrap}.wrapper .header .current-date{order:-1;flex-basis:100%}.view-mode{width:100%;justify-content:center}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2265
2839
  }
2266
2840
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxCalendarComponent, decorators: [{
2267
2841
  type: Component,
2268
- args: [{ selector: 'ngx-calendar', imports: [CommonModule], providers: [DateAdapterRegistry], host: {
2269
- '[class.dark]': 'theme=="dark"',
2270
- }, template: "<div class=\"wrapper\" #datepickerWrapper>\n <div class=\"header\">\n <div class=\"nxt-prv-buttons\">\n <button id=\"prev\" class=\"previous dtp-btn\" (click)=\"previous()\" title=\"Previous\">\n <ng-template\n [ngTemplateOutlet]=\"\n _config.previousButtonTemplate || defaultPreviousBTNTemplate\n \"></ng-template>\n </button>\n @if (_config.todayButton) {\n <button class=\"today dtp-btn\" (click)=\"gotoToday()\">\n {{ _config.todayButtonText }}\n </button>\n }\n <button id=\"next\" class=\"next dtp-btn\" (click)=\"next()\" title=\"Next\">\n <ng-template\n [ngTemplateOutlet]=\"_config.nextButtonTemplate || defaultNextBTNTemplate\"></ng-template>\n </button>\n </div>\n <div class=\"current-date\">\n <span>\n {{ currYear }}\n </span>\n <span>\n {{ displayMonth }}\n </span>\n </div>\n <div class=\"view-mode\">\n {{ view }}\n <button\n class=\"dayview dtp-btn\"\n (click)=\"changeView('day')\"\n [class.active]=\"view == 'day'\"\n title=\"Month View\">\n Month\n </button>\n <button\n class=\"dayview dtp-btn\"\n (click)=\"changeView('week')\"\n [class.active]=\"view == 'week'\"\n title=\"Week View\">\n Week\n </button>\n <button\n class=\"dayview dtp-btn\"\n (click)=\"changeView('day')\"\n [class.active]=\"view == 'day'\"\n title=\"Day View\">\n Day\n </button>\n <button\n class=\"dayview dtp-btn\"\n (click)=\"changeView('event')\"\n [class.active]=\"view == 'event'\"\n title=\"Day View\">\n Event\n </button>\n </div>\n </div>\n <div class=\"calendar\" #calendarWrapper>\n @if (view === 'day') {\n <ul class=\"weeks\">\n @for (w of weeks; track $index) {\n <li>\n {{ w }}\n </li>\n }\n </ul>\n <ul class=\"days\" [style.minHeight.px]=\"minHeight\">\n @for (item of viewDays; track $index) {\n <li\n [class.de-active]=\"!item.active\"\n [class.today]=\"item.isToday\"\n [class.selected]=\"item.selected\"\n (click)=\"selectDay($event, item)\">\n <div>{{ item.day }}</div>\n @if (item.events) {\n <div class=\"ms-day-events\">\n @for (event of item.events; track $index) {\n <a\n tabindex=\"0\"\n class=\"ms-day-event\"\n [title]=\"event.title\"\n (click)=\"onclickEvent(item, event)\">\n {{ event.title }}\n </a>\n }\n </div>\n }\n </li>\n }\n </ul>\n } @else if (view == 'week' || view == 'month') {\n <table>\n <thead>\n <tr>\n <th></th>\n @for (w of weeks; track $index) {\n <th>{{ w }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (item of viewWeeks; track $index; let i = $index) {\n <tr>\n <td [title]=\"item.displayTime\">{{ item.time % 1 == 0 ? item.time : '' }}</td>\n @for (w of item.weeks; track $index) {\n <td></td>\n }\n </tr>\n }\n </tbody>\n </table>\n } @else if (view == 'event') {\n not implemented\n }\n </div>\n</div>\n\n<ng-template #defaultPreviousBTNTemplate>\n <svg width=\"15px\" height=\"30px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n class=\"fa-secondary\"\n d=\"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z\" />\n </svg>\n</ng-template>\n\n<ng-template #defaultNextBTNTemplate>\n <svg width=\"15px\" height=\"30px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n class=\"fa-secondary\"\n d=\"M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z\" />\n </svg>\n</ng-template>\n\n<ng-template #defaultCaretDownIcon>\n <svg width=\"10px\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n class=\"fa-secondary\"\n d=\"M310.6 246.6l-127.1 128C176.4 380.9 168.2 384 160 384s-16.38-3.125-22.63-9.375l-127.1-128C.2244 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75S319.8 237.5 310.6 246.6z\" />\n </svg>\n</ng-template>\n", styles: [":host{--ngx-color-bg: #fff;--ngx-color-text: #000;--ngx-border-color: #c0c0c0}:host-context(.dark){--ngx-color-bg: #222;--ngx-color-text: #fff;--ngx-border-color: #c0c0c0}.wrapper{background-color:var(--ngx-color-bg);color:var(--ngx-color-text);border-radius:5px}.wrapper .dtp-btn{background:none;border:none;color:inherit;border-radius:3px;padding:3px 15px;box-shadow:0 0 4px #0003;transition:all .3s;display:inline-flex;align-items:center}.wrapper .dtp-btn:not([disabled]):hover{cursor:pointer;background:#87879e}.wrapper .dtp-btn.active{background:#87879e}.wrapper .dtp-btn svg{fill:var(--ngx-color-text)}.wrapper .header{display:flex;align-items:center;justify-content:space-between;padding:10px 10px 0}.wrapper .header .current-date{text-align:center;flex:auto}.wrapper .nxt-prv-buttons{display:flex;align-items:center}.wrapper .nxt-prv-buttons .dtp-btn{border-radius:0}.wrapper .nxt-prv-buttons .dtp-btn:first-child{border-radius:5px 0 0 5px}.wrapper .nxt-prv-buttons .dtp-btn:last-child{border-radius:0 5px 5px 0}.calendar{padding:10px}.calendar ul{display:flex;flex-wrap:wrap;list-style:none;padding:0;margin:0;border:1px var(--ngx-border-color) solid;border-bottom:none}.calendar .days{margin-bottom:20px}.calendar .days li{width:14.2857142857%;text-align:end;max-height:300px;overflow:auto}.calendar .months{margin-bottom:20px}.calendar .months li{height:40px;width:33%}.calendar .years{margin-bottom:20px}.calendar .years li{height:40px;width:25%}.calendar li{position:relative;border-right:1px var(--ngx-border-color) solid;border-bottom:1px var(--ngx-border-color) solid;padding:4px}.calendar li.de-active{color:#cbcbcb}.calendar li.selected{border:1px #1216fa solid}.calendar li.today{background-color:#ff9d0130}.calendar .weeks li{cursor:default;width:14.2857142857%;text-align:center;font-weight:700}.calendar .weeks li:hover{background:none}.ms-day-events .ms-day-event{color:#3f51b5;background:var(--ngx-color-bg);border:1px rgba(63,81,181,.1215686275) solid;border-radius:4px;min-height:25px;padding:4px;margin:4px 0;text-decoration:none;display:block}::ng-deep html[dir=rtl] .wrapper .nxt-prv-buttons .dtp-btn:first-child,::ng-deep body[dir=rtl] .wrapper .nxt-prv-buttons .dtp-btn:first-child{border-radius:0 5px 5px 0!important}::ng-deep html[dir=rtl] .wrapper .nxt-prv-buttons .dtp-btn:last-child,::ng-deep body[dir=rtl] .wrapper .nxt-prv-buttons .dtp-btn:last-child{border-radius:5px 0 0 5px!important}::ng-deep html[dir=rtl] .wrapper .wrapper .dtp-btn.next,::ng-deep html[dir=rtl] .wrapper .wrapper .dtp-btn.previous,::ng-deep body[dir=rtl] .wrapper .wrapper .dtp-btn.next,::ng-deep body[dir=rtl] .wrapper .wrapper .dtp-btn.previous{transform:rotate(180deg)}table{width:100%;border-collapse:collapse}table td,table th{border:1px rgb(158,158,158) solid;padding:5px;height:1.5em}\n"] }]
2271
- }], ctorParameters: () => [], propDecorators: { setTheme: [{
2272
- type: Input,
2273
- args: ['theme']
2274
- }], config: [{
2842
+ args: [{ selector: 'ngx-calendar', imports: [CommonModule], providers: [DateAdapterRegistry], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"wrapper\" [class.is-interacting]=\"!!interaction\">\r\n <div class=\"header\">\r\n <div class=\"nxt-prv-buttons\">\r\n <button type=\"button\" class=\"previous dtp-btn\" (click)=\"previous()\" title=\"Previous\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"\r\n _config.previousButtonTemplate || defaultPreviousBTNTemplate\r\n \"></ng-template>\r\n </button>\r\n @if (_config.todayButton) {\r\n <button type=\"button\" class=\"today dtp-btn\" (click)=\"gotoToday()\">\r\n {{ localize().today }}\r\n </button>\r\n }\r\n <button type=\"button\" class=\"next dtp-btn\" (click)=\"next()\" title=\"Next\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"_config.nextButtonTemplate || defaultNextBTNTemplate\"></ng-template>\r\n </button>\r\n </div>\r\n\r\n <div class=\"current-date\" aria-live=\"polite\">{{ headerText }}</div>\r\n\r\n <div class=\"view-mode\">\r\n <button\r\n type=\"button\"\r\n class=\"dtp-btn\"\r\n (click)=\"changeView('month')\"\r\n [class.active]=\"view === 'month'\">\r\n {{ localize().month }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"dtp-btn\"\r\n (click)=\"changeView('week')\"\r\n [class.active]=\"view === 'week'\">\r\n {{ localize().week }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"dtp-btn\"\r\n (click)=\"changeView('day')\"\r\n [class.active]=\"view === 'day'\">\r\n {{ localize().day }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"dtp-btn\"\r\n (click)=\"changeView('event')\"\r\n [class.active]=\"view === 'event'\">\r\n {{ localize().event }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"calendar\" #calendarWrapper>\r\n @switch (view) {\r\n @case ('month') {\r\n <ul class=\"weeks\">\r\n @for (w of weeks; track $index) {\r\n <li>{{ w }}</li>\r\n }\r\n </ul>\r\n\r\n <div class=\"month-grid\" [style.minHeight.px]=\"minHeight\">\r\n @for (row of monthEventRows; track $index; let rowIndex = $index) {\r\n <div class=\"month-row\">\r\n @for (\r\n item of viewDays.slice(rowIndex * 7, rowIndex * 7 + 7);\r\n track item.date?.getTime() ?? $index\r\n ) {\r\n <button\r\n type=\"button\"\r\n class=\"month-day\"\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectDay($event, item)\">\r\n <span class=\"day-number\">{{ item.day }}</span>\r\n </button>\r\n }\r\n\r\n <div class=\"month-event-layer\" aria-live=\"polite\">\r\n @for (event of row; track event.id ?? event.start.getTime() ?? $index) {\r\n <button\r\n type=\"button\"\r\n class=\"month-event\"\r\n [class.continues-before]=\"event.continuesBefore\"\r\n [class.continues-after]=\"event.continuesAfter\"\r\n [class.event-start]=\"event.isStart\"\r\n [class.event-end]=\"event.isEnd\"\r\n [class.is-dragging]=\"\r\n interaction?.source === event ||\r\n (interaction?.source?.id != null && interaction?.source?.id === event.id)\r\n \"\r\n [style.gridColumn]=\"event.startColumn + 1 + ' / ' + (event.endColumn + 2)\"\r\n [style.gridRow]=\"event.lane + 1\"\r\n [style.background]=\"event.backgroundColor || event.color || null\"\r\n [style.borderColor]=\"event.borderColor || event.color || null\"\r\n [style.color]=\"event.textColor || null\"\r\n [title]=\"event.title || ''\"\r\n (pointerdown)=\"startMonthEventInteraction($event, event)\"\r\n (click)=\"\r\n onclickEvent($event, { date: event.start, day: 0, active: true }, event)\r\n \">\r\n @if (event.isStart) {\r\n <span class=\"event-title\">{{ event.title || 'Untitled event' }}</span>\r\n } @else {\r\n <span class=\"event-title continuation-title\">{{ event.title || '' }}</span>\r\n }\r\n @if (resizeAndMovable()) {\r\n @if (event.isStart) {\r\n <span\r\n class=\"resize-handle resize-handle-h resize-start\"\r\n title=\"Resize start\"\r\n (pointerdown)=\"\r\n startMonthEventInteraction($event, event, 'resize-start')\r\n \"></span>\r\n }\r\n @if (event.isEnd) {\r\n <span\r\n class=\"resize-handle resize-handle-h resize-end\"\r\n title=\"Resize end\"\r\n (pointerdown)=\"\r\n startMonthEventInteraction($event, event, 'resize-end')\r\n \"></span>\r\n }\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @case ('week') {\r\n <ng-container [ngTemplateOutlet]=\"timedCalendar\"></ng-container>\r\n }\r\n\r\n @case ('day') {\r\n <ng-container [ngTemplateOutlet]=\"timedCalendar\"></ng-container>\r\n }\r\n\r\n @case ('event') {\r\n <div class=\"event-list\">\r\n @if (eventViewItems.length) {\r\n @for (item of eventViewItems; track item.event.id ?? item.start.getTime()) {\r\n <button\r\n type=\"button\"\r\n class=\"event-list-item\"\r\n (click)=\"\r\n onclickEvent($event, { date: item.start, day: 0, active: true }, item.event)\r\n \">\r\n <span\r\n class=\"event-dot\"\r\n [style.background]=\"\r\n item.event.backgroundColor || item.event.color || null\r\n \"></span>\r\n <span class=\"event-copy\">\r\n <strong>{{ item.event.title || 'Untitled event' }}</strong>\r\n <small>\r\n {{ formatEventDate(item.start) }}\r\n @if (item.end.getTime() !== item.start.getTime()) {\r\n \u2013 {{ formatEventDate(item.end) }}\r\n }\r\n </small>\r\n </span>\r\n </button>\r\n }\r\n } @else {\r\n <div class=\"empty-events\">No events for this month.</div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n<ng-template #timedCalendar>\r\n <div class=\"timed-calendar\">\r\n <div\r\n class=\"timed-header\"\r\n [style.gridTemplateColumns]=\"'64px repeat(' + weekDays.length + ', minmax(0, 1fr))'\">\r\n <div class=\"corner\"></div>\r\n @for (day of weekDays; track day.date.getTime()) {\r\n <button\r\n type=\"button\"\r\n class=\"day-header\"\r\n [class.today]=\"day.isToday\"\r\n (click)=\"selectDay($event, { date: day.date, day: 0, active: true })\">\r\n <span>{{ day.label }}</span>\r\n <strong>{{ day.dayNumber }}</strong>\r\n </button>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"all-day-row\"\r\n [style.gridTemplateColumns]=\"'64px repeat(' + weekDays.length + ', minmax(0, 1fr))'\">\r\n <div class=\"all-day-label\">All day</div>\r\n @for (day of weekDays; track day.date.getTime(); let i = $index) {\r\n <div class=\"all-day-cell\">\r\n @for (\r\n event of allDayByColumn[i];\r\n track event.id ?? event.title ?? event.start.getTime()\r\n ) {\r\n <button\r\n type=\"button\"\r\n class=\"timed-event all-day-event\"\r\n [class.continues-before]=\"event.continuesBefore\"\r\n [class.continues-after]=\"event.continuesAfter\"\r\n [style.background]=\"event.backgroundColor || event.color || null\"\r\n [style.borderColor]=\"event.borderColor || event.color || null\"\r\n [style.color]=\"event.textColor || null\"\r\n [title]=\"event.title || ''\"\r\n (pointerdown)=\"startTimedEventInteraction($event, event)\"\r\n (click)=\"onTimedEventClick($event, event, day.date)\">\r\n <span>{{ event.title || 'Untitled event' }}</span>\r\n @if (resizeAndMovable()) {\r\n @if (event.isStart) {\r\n <span\r\n class=\"resize-handle resize-handle-h resize-start\"\r\n title=\"Resize start\"\r\n (pointerdown)=\"\r\n startTimedEventInteraction($event, event, 'resize-start')\r\n \"></span>\r\n }\r\n @if (event.isEnd) {\r\n <span\r\n class=\"resize-handle resize-handle-h resize-end\"\r\n title=\"Resize end\"\r\n (pointerdown)=\"startTimedEventInteraction($event, event, 'resize-end')\"></span>\r\n }\r\n }\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"time-grid\"\r\n [style.gridTemplateColumns]=\"'64px repeat(' + weekDays.length + ', minmax(0, 1fr))'\">\r\n <div class=\"time-axis\">\r\n @for (minutes of timeSlots; track minutes) {\r\n <div class=\"time-label\" [style.top.px]=\"(minutes / 60) * hourHeight\">\r\n @if (minutes % 60 === 0) {\r\n {{ formatTime(minutes) }}\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @for (day of weekDays; track day.date.getTime()) {\r\n <div class=\"day-column\">\r\n @for (minutes of timeSlots; track minutes) {\r\n <div class=\"time-slot\" [class.hour]=\"minutes % 60 === 0\"></div>\r\n }\r\n\r\n @for (event of day.events; track event.id ?? event.title ?? event.start.getTime()) {\r\n <button\r\n type=\"button\"\r\n class=\"timed-event\"\r\n [class.continues-before]=\"event.continuesBefore\"\r\n [class.continues-after]=\"event.continuesAfter\"\r\n [style.top.px]=\"event.top\"\r\n [style.height.px]=\"event.height\"\r\n [style.insetInlineStart.%]=\"event.column * (100 / event.columnCount)\"\r\n [style.width.%]=\"100 / event.columnCount - 1\"\r\n [style.background]=\"event.backgroundColor || event.color || null\"\r\n [style.borderColor]=\"event.borderColor || event.color || null\"\r\n [style.color]=\"event.textColor || null\"\r\n [title]=\"event.title || ''\"\r\n (pointerdown)=\"startTimedEventInteraction($event, event)\"\r\n (click)=\"onTimedEventClick($event, event, day.date)\">\r\n <strong>{{ event.title || 'Untitled event' }}</strong>\r\n @if (event.height >= 42) {\r\n <small>\r\n {{ formatTime(event.start.getHours() * 60 + event.start.getMinutes()) }}\r\n </small>\r\n }\r\n @if (resizeAndMovable()) {\r\n @if (event.isStart) {\r\n <span\r\n class=\"resize-handle resize-handle-v resize-start\"\r\n title=\"Resize start\"\r\n (pointerdown)=\"\r\n startTimedEventInteraction($event, event, 'resize-start')\r\n \"></span>\r\n }\r\n @if (event.isEnd) {\r\n <span\r\n class=\"resize-handle resize-handle-v resize-end\"\r\n title=\"Resize end\"\r\n (pointerdown)=\"startTimedEventInteraction($event, event, 'resize-end')\"></span>\r\n }\r\n }\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultPreviousBTNTemplate>\r\n <svg width=\"15px\" height=\"30px\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z\" />\r\n </svg>\r\n</ng-template>\r\n\r\n<ng-template #defaultNextBTNTemplate>\r\n <svg width=\"15px\" height=\"30px\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z\" />\r\n </svg>\r\n</ng-template>\r\n", styles: [":host{--ngx-color-bg: light-dark(#fff, #171a24);--ngx-color-text: light-dark(#16181d, #f7f7f8);--ngx-border-color: light-dark(#e1e4ea, #303541);--ngx-muted: color-mix(in srgb, var(--ngx-color-text) 55%, transparent);--ngx-event-bg: light-dark(#eef0ff, #2f3150);--ngx-event-text: light-dark(#3547a4, #dce1ff);--ngx-today: #3f51b5}.wrapper{background:var(--ngx-color-bg);color:var(--ngx-color-text);border:1px solid var(--ngx-border-color);border-radius:10px;overflow:hidden}.wrapper .dtp-btn{background:none;border:none;color:inherit;border-radius:6px;padding:5px 12px;box-shadow:0 0 4px #0000001f;transition:background .16s ease,transform .16s ease;display:inline-flex;align-items:center;justify-content:center}.wrapper .dtp-btn:not([disabled]):hover{cursor:pointer;background:#7f7fa02e}.wrapper .dtp-btn.active{background:#7f7fa03d}.wrapper .dtp-btn svg{fill:currentColor}.wrapper .header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px;border-bottom:1px solid var(--ngx-border-color)}.wrapper .header .current-date{text-align:center;flex:1;min-width:0;font-weight:700}.wrapper .nxt-prv-buttons,.wrapper .view-mode{display:flex;align-items:center;gap:4px}.calendar{padding:10px;min-width:0}.weeks{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));list-style:none;padding:0;margin:0 0 8px;border-inline-start:1px solid var(--ngx-border-color)}.weeks li{padding:7px 4px;text-align:center;color:var(--ngx-muted);font-size:11px;font-weight:700;border-inline-end:1px solid var(--ngx-border-color)}.month-grid{display:grid;grid-template-rows:repeat(6,minmax(92px,1fr));border-inline-start:1px solid var(--ngx-border-color);border-top:1px solid var(--ngx-border-color);position:relative}.month-row{position:relative;display:grid;grid-template-columns:repeat(7,minmax(0,1fr));min-height:92px;border-bottom:1px solid var(--ngx-border-color)}.month-day{position:relative;min-width:0;min-height:92px;overflow:hidden;padding:4px;border:0;border-inline-end:1px solid var(--ngx-border-color);background:transparent;color:inherit;font:inherit;text-align:start;cursor:pointer;transition:background .15s ease}.month-day:hover{background:#7f7fa00d}.month-day.de-active{opacity:.48}.month-day.selected{outline:2px solid rgba(63,81,181,.3);outline-offset:-2px}.month-day.today .day-number{background:#3f51b51a;color:var(--ngx-today);font-weight:800}.day-number{width:27px;height:27px;display:grid;place-items:center;margin-inline-start:auto;border-radius:50%;font-size:12px;font-weight:600}.month-event-layer{position:absolute;inset:0;display:grid;grid-template-columns:repeat(7,minmax(0,1fr));grid-template-rows:repeat(4,26px);pointer-events:none;padding-top:34px}.month-event{position:relative;z-index:3;min-width:0;height:22px;margin-inline:2px;padding:2px 7px;border:1px solid transparent;border-radius:5px;overflow:hidden;background:var(--ngx-event-bg);color:var(--ngx-event-text);font:inherit;font-size:11px;font-weight:600;line-height:17px;text-align:start;white-space:nowrap;text-overflow:ellipsis;pointer-events:auto;cursor:grab;touch-action:none;box-sizing:border-box}.month-event:active{cursor:grabbing}.month-event:hover{filter:brightness(.97);box-shadow:0 2px 7px #00000024}.month-event.is-dragging{opacity:.78;box-shadow:0 5px 14px #0003}.month-event.continues-before{border-start-start-radius:2px;border-end-start-radius:2px;margin-inline-start:0}.month-event.continues-after{border-start-end-radius:2px;border-end-end-radius:2px;margin-inline-end:0}.event-title{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.continuation-title{opacity:.85}.resize-handle{position:absolute;z-index:5;touch-action:none;background:transparent}.resize-handle-h{top:0;bottom:0;width:11px;cursor:ew-resize}.resize-handle-h:after{content:\"\";position:absolute;top:5px;bottom:5px;inset-inline-start:4px;width:2px;border-radius:2px;background:currentColor;opacity:.45}.resize-handle-h.resize-start{inset-inline-start:-2px}.resize-handle-h.resize-end{inset-inline-end:-2px}.resize-handle-v{inset-inline:0;height:8px;cursor:ns-resize}.resize-handle-v:after{content:\"\";position:absolute;inset-inline:5px;height:2px;border-radius:2px;background:currentColor;opacity:.45}.resize-handle-v.resize-start{top:-2px}.resize-handle-v.resize-start:after{top:4px}.resize-handle-v.resize-end{bottom:-2px}.resize-handle-v.resize-end:after{bottom:4px}.timed-calendar{min-width:0;border:1px solid var(--ngx-border-color);border-radius:8px;overflow:auto}.timed-header,.all-day-row,.time-grid{display:grid;min-width:620px}.timed-header{position:sticky;top:0;z-index:5;background:var(--ngx-color-bg);border-bottom:1px solid var(--ngx-border-color)}.corner{border-inline-end:1px solid var(--ngx-border-color)}.day-header{min-width:0;height:58px;padding:6px;border:0;border-inline-end:1px solid var(--ngx-border-color);background:transparent;color:inherit;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px}.day-header span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;color:var(--ngx-muted)}.day-header strong{width:30px;height:30px;display:grid;place-items:center;border-radius:50%;font-size:14px}.day-header.today strong{background:var(--ngx-today);color:#fff}.day-header:hover{background:#7f7fa012}.all-day-row{min-height:34px;border-bottom:1px solid var(--ngx-border-color);background:color-mix(in srgb,var(--ngx-color-bg) 94%,currentColor)}.all-day-row .all-day-label{padding:8px 5px;color:var(--ngx-muted);font-size:10px;border-inline-end:1px solid var(--ngx-border-color);text-align:center}.all-day-row .all-day-cell{min-width:0;padding:4px;border-inline-end:1px solid var(--ngx-border-color);display:flex;flex-direction:column;gap:3px}.time-grid{position:relative;align-items:stretch;min-height:1536px}.time-axis{position:relative;border-inline-end:1px solid var(--ngx-border-color);background:var(--ngx-color-bg)}.time-label{position:absolute;inset-inline:0 5px;transform:translateY(-50%);text-align:end;color:var(--ngx-muted);font-size:10px;pointer-events:none}.day-column{position:relative;min-width:0;height:1536px;border-inline-end:1px solid var(--ngx-border-color);background:repeating-linear-gradient(to bottom,transparent 0,transparent 31px,var(--ngx-border-color) 32px,transparent 33px,transparent 63px,var(--ngx-border-color) 64px)}.time-slot{height:32px;pointer-events:none;border-bottom:1px dashed color-mix(in srgb,var(--ngx-border-color) 55%,transparent)}.time-slot.hour{border-bottom-style:solid;border-bottom-color:var(--ngx-border-color)}.timed-event{position:absolute;z-index:2;min-width:24px;padding:4px 7px;border:1px solid transparent;border-radius:5px;overflow:hidden;background:var(--ngx-event-bg);color:var(--ngx-event-text);font:inherit;font-size:11px;line-height:15px;text-align:start;cursor:grab;box-sizing:border-box;touch-action:none;transition:filter .12s ease,box-shadow .12s ease}.timed-event:hover{filter:brightness(.97);box-shadow:0 2px 7px #00000024;z-index:4}.timed-event strong,.timed-event small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timed-event small{opacity:.72;font-size:10px}.timed-event.continues-before{border-start-start-radius:2px;border-end-start-radius:2px}.timed-event.continues-after{border-start-end-radius:2px;border-end-end-radius:2px}.timed-event.all-day-event{cursor:grab;position:relative;inset:auto!important;width:100%!important;min-height:24px;height:24px;padding-block:2px}.event-list{display:flex;flex-direction:column;gap:6px}.event-list-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;border:1px solid var(--ngx-border-color);border-radius:8px;background:transparent;color:inherit;text-align:start;cursor:pointer}.event-list-item:hover{background:#7f7fa014}.event-list-item .event-dot{width:8px;height:8px;flex:0 0 8px;border-radius:50%;background:var(--ngx-today)}.event-list-item .event-copy{min-width:0;display:flex;flex-direction:column;gap:2px}.event-list-item .event-copy strong,.event-list-item .event-copy small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.event-list-item .event-copy small{opacity:.58}.empty-events{padding:30px;text-align:center;opacity:.55}:host-context([dir=rtl]) .nxt-prv-buttons .previous svg{transform:rotate(180deg)}:host-context([dir=rtl]) .nxt-prv-buttons .next svg{transform:rotate(180deg)}@media(max-width:700px){.wrapper .header{flex-wrap:wrap}.wrapper .header .current-date{order:-1;flex-basis:100%}.view-mode{width:100%;justify-content:center}}\n"] }]
2843
+ }], ctorParameters: () => [], propDecorators: { localize: [{ type: i0.Input, args: [{ isSignal: true, alias: "localize", required: false }] }], resizeAndMovable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizeAndMovable", required: false }] }], config: [{
2275
2844
  type: Input
2276
2845
  }], locale: [{
2277
2846
  type: Input
@@ -2289,9 +2858,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
2289
2858
  type: Output
2290
2859
  }], selectEvent: [{
2291
2860
  type: Output
2861
+ }], eventChange: [{
2862
+ type: Output
2863
+ }], eventsChange: [{
2864
+ type: Output
2292
2865
  }], calendarWrapper: [{ type: i0.ViewChild, args: ['calendarWrapper', { isSignal: true }] }], onResize: [{
2293
2866
  type: HostListener,
2294
- args: ['window:resize', ['$event']]
2867
+ args: ['window:resize']
2868
+ }], onDocumentPointerMove: [{
2869
+ type: HostListener,
2870
+ args: ['document:pointermove', ['$event']]
2871
+ }], onDocumentPointerUp: [{
2872
+ type: HostListener,
2873
+ args: ['document:pointerup', ['$event']]
2874
+ }], onDocumentPointerCancel: [{
2875
+ type: HostListener,
2876
+ args: ['document:pointercancel', ['$event']]
2295
2877
  }] } });
2296
2878
 
2297
2879
  function dedupeAdapters(adapters) {
@@ -2306,9 +2888,551 @@ function provideDateAdapters(...additional) {
2306
2888
  }));
2307
2889
  }
2308
2890
 
2891
+ function createDateRange(start = null, end = null) {
2892
+ return { start, end };
2893
+ }
2894
+
2895
+ class DateModel {
2896
+ date;
2897
+ active;
2898
+ isToday;
2899
+ selected;
2900
+ }
2901
+ class DateViewYear extends DateModel {
2902
+ year;
2903
+ }
2904
+ class DateViewMonth extends DateModel {
2905
+ month;
2906
+ displayMonth;
2907
+ }
2908
+ class DateViewDay extends DateModel {
2909
+ day;
2910
+ events;
2911
+ inRange;
2912
+ rangeStart;
2913
+ rangeEnd;
2914
+ inRangePreview;
2915
+ }
2916
+ class DateViewWeek extends DateModel {
2917
+ time;
2918
+ weeks = [];
2919
+ displayTime;
2920
+ }
2921
+
2922
+ function normalizeDateRange(value) {
2923
+ if (Array.isArray(value)) {
2924
+ return normalizeDateRange({ start: value[0], end: value[1] });
2925
+ }
2926
+ const start = deserialize(value?.start);
2927
+ const end = deserialize(value?.end);
2928
+ if (start && end && compareDate(start, end) > 0) {
2929
+ return { start: end, end: start };
2930
+ }
2931
+ return { start, end };
2932
+ }
2933
+ function isCompleteDateRange(range) {
2934
+ return !!range.start && !!range.end && isValid(range.start) && isValid(range.end);
2935
+ }
2936
+ function isDateInRange(date, range) {
2937
+ if (!range.start || !range.end)
2938
+ return false;
2939
+ return compareDate(date, range.start) >= 0 && compareDate(date, range.end) <= 0;
2940
+ }
2941
+ function isDateInPreviewRange(date, start, previewEnd) {
2942
+ if (!start || !previewEnd)
2943
+ return false;
2944
+ const from = compareDate(start, previewEnd) <= 0 ? start : previewEnd;
2945
+ const to = compareDate(start, previewEnd) <= 0 ? previewEnd : start;
2946
+ return compareDate(date, from) >= 0 && compareDate(date, to) <= 0;
2947
+ }
2948
+
2949
+ class NgxDateRangePickerComponent extends NgxDatePickerBase {
2950
+ defaultLocalization = inject(NGX_CALENDAR_LOCALIZATION);
2951
+ localize = input(this.defaultLocalization, /* @ts-ignore */
2952
+ ...(ngDevMode ? [{ debugName: "localize" }] : /* istanbul ignore next */ []));
2953
+ config = new NgxDatePickerConfig();
2954
+ set locale(value) {
2955
+ this._locale = value || 'en';
2956
+ this.adapter = this.dateAdapterRegistry.resolve(this._locale);
2957
+ this.init();
2958
+ }
2959
+ set min(value) {
2960
+ const next = deserialize(value);
2961
+ if (!sameDate(next, this.minDate)) {
2962
+ this.minDate = next;
2963
+ this._validatorOnChange();
2964
+ this.renderِDatePicker(this.view);
2965
+ }
2966
+ }
2967
+ set max(value) {
2968
+ const next = deserialize(value);
2969
+ if (!sameDate(next, this.maxDate)) {
2970
+ this.maxDate = next;
2971
+ this._validatorOnChange();
2972
+ this.renderِDatePicker(this.view);
2973
+ }
2974
+ }
2975
+ view = 'day';
2976
+ rangeChange = new EventEmitter();
2977
+ change = new EventEmitter();
2978
+ range = { start: null, end: null };
2979
+ hoverDate = null;
2980
+ weekDays = [];
2981
+ calendarHeader = '';
2982
+ _onChange = (_value) => { };
2983
+ _onTouched = () => { };
2984
+ _validatorOnChange = () => { };
2985
+ isDisabled = false;
2986
+ ngOnInit() {
2987
+ this.init();
2988
+ }
2989
+ updateConfig(value) {
2990
+ this.config = { ...new NgxDatePickerConfig(), ...value };
2991
+ }
2992
+ writeValue(value) {
2993
+ this.range = normalizeDateRange(value);
2994
+ this.init();
2995
+ }
2996
+ registerOnChange(fn) {
2997
+ this._onChange = fn;
2998
+ }
2999
+ registerOnTouched(fn) {
3000
+ this._onTouched = fn;
3001
+ }
3002
+ registerOnValidatorChange(fn) {
3003
+ this._validatorOnChange = fn;
3004
+ }
3005
+ setDisabledState(disabled) {
3006
+ this.isDisabled = disabled;
3007
+ }
3008
+ validate(_control) {
3009
+ const { start, end } = this.range;
3010
+ if (start && !isValid(start))
3011
+ return { invalid: true };
3012
+ if (end && !isValid(end))
3013
+ return { invalid: true };
3014
+ if (start && this.minDate && compareDate(start, this.minDate) < 0) {
3015
+ return { min: this.minDate };
3016
+ }
3017
+ if (start && this.maxDate && compareDate(start, this.maxDate) > 0) {
3018
+ return { max: this.maxDate };
3019
+ }
3020
+ if (end && this.minDate && compareDate(end, this.minDate) < 0) {
3021
+ return { min: this.minDate };
3022
+ }
3023
+ if (end && this.maxDate && compareDate(end, this.maxDate) > 0) {
3024
+ return { max: this.maxDate };
3025
+ }
3026
+ if (start && end && compareDate(start, end) > 0) {
3027
+ return { range: true };
3028
+ }
3029
+ return null;
3030
+ }
3031
+ renderِDatePicker(view) {
3032
+ super.renderِDatePicker(view, undefined, [], () => {
3033
+ this.applyRangeState();
3034
+ const start = this.range.start;
3035
+ const end = this.range.end;
3036
+ const startText = start
3037
+ ? this.adapter.formatDate(this.adapter.toLocale(start), 'EEEE, d MMMM, yyyy')
3038
+ : '';
3039
+ const endText = end
3040
+ ? this.adapter.formatDate(this.adapter.toLocale(end), 'EEEE, d MMMM, yyyy')
3041
+ : '';
3042
+ this.calendarHeader = endText
3043
+ ? `${startText} – ${endText}`
3044
+ : startText || 'Select date range';
3045
+ });
3046
+ }
3047
+ init() {
3048
+ this.months = this.adapter.longMonths;
3049
+ const shortDays = this.adapter.shortDays;
3050
+ const longDays = this.adapter.longDays;
3051
+ this.weekDays = shortDays.map((min, i) => ({ min, name: longDays[i] }));
3052
+ const anchor = this.range.end || this.range.start || this.adapter.getDate(this.adapter.today());
3053
+ const locale = this.adapter.toLocale(anchor);
3054
+ this.currYear = locale.year;
3055
+ this.currMonth = locale.month ?? 0;
3056
+ this.renderِDatePicker(this.view);
3057
+ }
3058
+ changeView(view) {
3059
+ this.view = view;
3060
+ this.renderِDatePicker(view);
3061
+ }
3062
+ gotoToday() {
3063
+ const today = this.adapter.today();
3064
+ const date = today.date ?? this.adapter.getDate(today);
3065
+ this.currYear = today.year;
3066
+ this.currMonth = today.month ?? 0;
3067
+ // Keep an existing completed range; today is only a navigation shortcut.
3068
+ if (!this.range.start || this.range.end) {
3069
+ this.range = { start: date, end: null };
3070
+ this.emitValue();
3071
+ }
3072
+ this.changeView('day');
3073
+ }
3074
+ next() {
3075
+ if (this.view === 'year') {
3076
+ this.currYear += 20;
3077
+ }
3078
+ else if (this.view === 'month') {
3079
+ this.currYear++;
3080
+ }
3081
+ else {
3082
+ this.currMonth++;
3083
+ }
3084
+ if (this.currMonth < 0 || this.currMonth > 11) {
3085
+ let date = new Date(this.currYear, this.currMonth);
3086
+ this.currYear = date.getFullYear();
3087
+ this.currMonth = date.getMonth();
3088
+ }
3089
+ this.renderِDatePicker(this.view);
3090
+ }
3091
+ previous() {
3092
+ if (this.view === 'year') {
3093
+ this.currYear -= 20;
3094
+ }
3095
+ else if (this.view === 'month') {
3096
+ this.currYear--;
3097
+ }
3098
+ else {
3099
+ this.currMonth--;
3100
+ }
3101
+ if (this.currMonth < 0 || this.currMonth > 11) {
3102
+ let date = new Date(this.currYear, this.currMonth);
3103
+ this.currYear = date.getFullYear();
3104
+ this.currMonth = date.getMonth();
3105
+ }
3106
+ this.renderِDatePicker(this.view);
3107
+ }
3108
+ selectDay(event, item) {
3109
+ event.stopPropagation();
3110
+ if (!item.active || !item.date || this.isDisabled)
3111
+ return;
3112
+ const date = item.date;
3113
+ if (!this.range.start || this.range.end) {
3114
+ this.range = { start: date, end: null };
3115
+ }
3116
+ else {
3117
+ this.range =
3118
+ compareDate(date, this.range.start) < 0
3119
+ ? { start: date, end: this.range.start }
3120
+ : { start: this.range.start, end: date };
3121
+ this.hoverDate = null;
3122
+ }
3123
+ this.applyRangeState();
3124
+ this.emitValue();
3125
+ if (isCompleteDateRange(this.range)) {
3126
+ this._onTouched();
3127
+ }
3128
+ }
3129
+ selectMonth(event, item) {
3130
+ event.stopPropagation();
3131
+ if (item.active) {
3132
+ this.currMonth = item.month;
3133
+ this.changeView('day');
3134
+ }
3135
+ }
3136
+ selectYear(event, item) {
3137
+ event.stopPropagation();
3138
+ if (item.active) {
3139
+ this.currYear = item.year;
3140
+ this.changeView('month');
3141
+ }
3142
+ }
3143
+ onDayEnter(item) {
3144
+ if (this.range.start && !this.range.end && item.active) {
3145
+ this.hoverDate = item.date ?? null;
3146
+ this.applyRangeState();
3147
+ }
3148
+ }
3149
+ onDayLeave() {
3150
+ if (this.hoverDate) {
3151
+ this.hoverDate = null;
3152
+ this.applyRangeState();
3153
+ }
3154
+ }
3155
+ clear() {
3156
+ this.range = { start: null, end: null };
3157
+ this.hoverDate = null;
3158
+ this.applyRangeState();
3159
+ this.emitValue();
3160
+ this._onTouched();
3161
+ }
3162
+ applyRangeState() {
3163
+ for (const item of this.viewDays) {
3164
+ if (!item.date)
3165
+ continue;
3166
+ item.rangeStart = !!this.range.start && sameDate(item.date, this.range.start);
3167
+ item.rangeEnd = !!this.range.end && sameDate(item.date, this.range.end);
3168
+ item.inRange = isDateInRange(item.date, this.range);
3169
+ item.inRangePreview =
3170
+ !this.range.end && isDateInPreviewRange(item.date, this.range.start, this.hoverDate);
3171
+ item.selected = !!item.rangeStart || !!item.rangeEnd;
3172
+ }
3173
+ }
3174
+ emitValue() {
3175
+ const value = { ...this.range };
3176
+ this._onChange(value);
3177
+ this.rangeChange.emit(value);
3178
+ this.change.emit(value);
3179
+ }
3180
+ stopPagination(event) {
3181
+ event.stopPropagation();
3182
+ }
3183
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDateRangePickerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
3184
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxDateRangePickerComponent, isStandalone: true, selector: "ngx-date-range-picker", inputs: { localize: { classPropertyName: "localize", publicName: "localize", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: false, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: false, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: false, isRequired: false, transformFunction: null }, view: { classPropertyName: "view", publicName: "view", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { rangeChange: "rangeChange", change: "change" }, providers: [
3185
+ DateAdapterRegistry,
3186
+ {
3187
+ provide: NG_VALUE_ACCESSOR,
3188
+ useExisting: forwardRef(() => NgxDateRangePickerComponent),
3189
+ multi: true,
3190
+ },
3191
+ {
3192
+ provide: NG_VALIDATORS,
3193
+ useExisting: forwardRef(() => NgxDateRangePickerComponent),
3194
+ multi: true,
3195
+ },
3196
+ ], usesInheritance: true, ngImport: i0, template: "<div class=\"wrapper\" (click)=\"stopPagination($event)\">\r\n <div class=\"header\">\r\n <div class=\"calendar-icon\" aria-hidden=\"true\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M16 2V6M8 2V6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\r\n <path\r\n d=\"M13 4H11C7.22876 4 5.34315 4 4.17157 5.17157C3 6.34315 3 8.22876 3 12V14C3 17.7712 3 19.6569 4.17157 20.8284C5 22 7.22876 22 11 22H13C16.7712 22 18.6569 22 19.8284 20.8284C21 17.7712 21 14V12C21 8.22876 19.8284 5.17157 19.8284 5.17157C4 4 13 4 13 4Z\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\" />\r\n <path d=\"M3 10H21\" stroke=\"currentColor\" stroke-width=\"1.5\" />\r\n </svg>\r\n </div>\r\n <div class=\"header-copy\">\r\n <div class=\"header-title\">Date range</div>\r\n <div class=\"header-value\">{{ calendarHeader }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sub-header\">\r\n <button type=\"button\" class=\"nav-button\" id=\"prev\" (click)=\"previous()\" aria-label=\"Previous\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"\r\n config.previousButtonTemplate || defaultPreviousBTNTemplate\r\n \"></ng-template>\r\n </button>\r\n\r\n <button type=\"button\" class=\"current-date\" (click)=\"changeView('month')\">\r\n <span>{{ displayMonth }}</span>\r\n <span>{{ currYear }}</span>\r\n </button>\r\n\r\n <button type=\"button\" class=\"nav-button\" id=\"next\" (click)=\"next()\" aria-label=\"Next\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"config.nextButtonTemplate || defaultNextBTNTemplate\"></ng-template>\r\n </button>\r\n </div>\r\n\r\n <div class=\"calendar\">\r\n @if (view === 'day') {\r\n <ul class=\"weeks\">\r\n @for (w of weekDays; track $index) {\r\n <li [title]=\"w.name\">{{ w.min }}</li>\r\n }\r\n </ul>\r\n\r\n <ul class=\"days\">\r\n @for (item of viewDays; track $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.in-range]=\"item.inRange\"\r\n [class.in-range-preview]=\"item.inRangePreview\"\r\n [class.range-start]=\"item.rangeStart\"\r\n [class.range-end]=\"item.rangeEnd\"\r\n [class.range-single]=\"item.rangeStart && item.rangeEnd\"\r\n (mouseenter)=\"onDayEnter(item)\"\r\n (mouseleave)=\"onDayLeave()\"\r\n (click)=\"selectDay($event, item)\"\r\n [attr.aria-selected]=\"\r\n item.rangeStart || item.rangeEnd || item.inRange || item.inRangePreview\r\n \">\r\n <span class=\"day-number\">{{ item.day }}</span>\r\n </li>\r\n }\r\n </ul>\r\n } @else if (view === 'month') {\r\n <ul class=\"months\">\r\n @for (item of viewMonths; track $index; let i = $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectMonth($event, item)\">\r\n {{ i + 1 }}.{{ item.displayMonth }}\r\n </li>\r\n }\r\n </ul>\r\n } @else {\r\n <ul class=\"years\">\r\n @for (item of viewYears; track $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectYear($event, item)\">\r\n {{ item.year }}\r\n </li>\r\n }\r\n </ul>\r\n }\r\n\r\n <div class=\"calendar-footer\">\r\n @if (config.clearButton) {\r\n <button type=\"button\" (click)=\"clear()\">{{ localize().clear }}</button>\r\n }\r\n @if (config.todayButton) {\r\n <button type=\"button\" (click)=\"gotoToday()\">{{ localize().today }}</button>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #defaultPreviousBTNTemplate>\r\n <svg width=\"14\" height=\"28\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z\" />\r\n </svg>\r\n</ng-template>\r\n\r\n<ng-template #defaultNextBTNTemplate>\r\n <svg width=\"14\" height=\"28\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M96 480c-8.188 0-16.38-3.125-22.62-9.375L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z\" />\r\n </svg>\r\n</ng-template>\r\n", styles: [":host{--ngx-range-bg: light-dark(#ffffff, #10162b);--ngx-range-text: light-dark(#171717, #f4f4f5);--ngx-range-muted: light-dark(#8a8f98, #72798a);--ngx-range-border: light-dark(#e6e8ee, #272d40);--ngx-range-accent: light-dark(#6544e8, #8d6cff);--ngx-range-accent-soft: light-dark(#eeeaff, #2b2252);--ngx-range-hover: light-dark(#f4f2ff, #211b38)}.wrapper{width:336px;overflow:hidden;border:1px solid var(--ngx-range-border);border-radius:14px;background:var(--ngx-range-bg);color:var(--ngx-range-text);box-shadow:0 18px 55px #0000002e;font-size:13px}.header{display:flex;gap:12px;padding:15px 16px;background:linear-gradient(135deg,#6747e9,#8b64f5);color:#fff}.header .calendar-icon{width:42px;height:42px;display:grid;place-items:center;border-radius:12px;background:#ffffff29}.header .header-copy{min-width:0;flex:1}.header .header-title{opacity:.75;font-size:11px;text-transform:uppercase;letter-spacing:.08em}.header .header-value{margin-top:3px;font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sub-header{display:grid;grid-template-columns:40px 1fr 40px;align-items:center;padding:8px 10px;border-bottom:1px solid var(--ngx-range-border)}.sub-header button{color:inherit;border:0;background:transparent;cursor:pointer}.sub-header .nav-button{width:36px;height:36px;display:grid;place-items:center;border-radius:9px}.sub-header .nav-button:hover{background:var(--ngx-range-hover)}.sub-header .current-date{display:flex;justify-content:center;gap:6px;font-weight:700;font-size:14px}.calendar{padding:10px 12px 12px}.calendar ul{display:flex;flex-wrap:wrap;list-style:none;padding:0;margin:0}.calendar .weeks li,.calendar .days li{width:14.2857142857%}.calendar .weeks{margin-bottom:4px}.calendar .weeks li{height:30px;display:grid;place-items:center;color:var(--ngx-range-muted);font-size:11px;font-weight:700}.calendar .days li{position:relative;height:40px;display:grid;place-items:center;cursor:pointer;-webkit-user-select:none;user-select:none}.calendar .days li:before{content:\"\";position:absolute;inset:4px 0;background:transparent;z-index:0}.calendar .days li .day-number{position:relative;z-index:2;width:32px;height:32px;display:grid;place-items:center;border-radius:50%;transition:transform .12s ease,background .12s ease}.calendar .days li:not(.de-active):hover .day-number{background:var(--ngx-range-hover)}.calendar .days li.de-active{color:var(--ngx-range-muted);opacity:.45;cursor:default}.calendar .days li.in-range:before,.calendar .days li.in-range-preview:before{background:var(--ngx-range-accent-soft)}.calendar .days li.range-start:before{border-radius:20px 0 0 20px}.calendar .days li.range-end:before{border-radius:0 20px 20px 0}.calendar .days li.range-start.range-end:before{border-radius:20px}.calendar .days li.range-start .day-number,.calendar .days li.range-end .day-number{background:var(--ngx-range-accent);color:#fff;font-weight:700;box-shadow:0 3px 10px #6544e847}.calendar .days li.range-single .day-number{box-shadow:none}.calendar .days li.today:not(.range-start):not(.range-end) .day-number{outline:1.5px solid var(--ngx-range-accent);outline-offset:-1px}.calendar .days li.in-range:not(.range-start):not(.range-end) .day-number{color:var(--ngx-range-text)}.calendar .months li,.calendar .years li{height:46px;width:33.333%;display:grid;place-items:center;border-radius:10px;cursor:pointer}.calendar .months li:hover,.calendar .years li:hover{background:var(--ngx-range-hover)}.calendar .months li.selected,.calendar .years li.selected{background:var(--ngx-range-accent);color:#fff}.calendar .months li.de-active,.calendar .years li.de-active{opacity:.4}.calendar .years li{width:25%}.calendar .calendar-footer{display:flex;justify-content:space-between;gap:8px;margin-top:10px;padding-top:10px;border-top:1px solid var(--ngx-range-border)}.calendar .calendar-footer button{min-height:34px;padding:0 13px;border:0;border-radius:8px;background:transparent;color:inherit;cursor:pointer;font-weight:600}.calendar .calendar-footer button:hover{background:var(--ngx-range-hover)}:host-context([dir=rtl]) .days li.range-start:before{border-radius:0 20px 20px 0}:host-context([dir=rtl]) .days li.range-end:before{border-radius:20px 0 0 20px}:host-context([dir=rtl]) .days li.range-start.range-end:before{border-radius:20px}:host-context([dir=rtl]) #prev,:host-context([dir=rtl]) #next{transform:rotate(180deg)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
3197
+ }
3198
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDateRangePickerComponent, decorators: [{
3199
+ type: Component,
3200
+ args: [{ selector: 'ngx-date-range-picker', standalone: true, imports: [CommonModule], providers: [
3201
+ DateAdapterRegistry,
3202
+ {
3203
+ provide: NG_VALUE_ACCESSOR,
3204
+ useExisting: forwardRef(() => NgxDateRangePickerComponent),
3205
+ multi: true,
3206
+ },
3207
+ {
3208
+ provide: NG_VALIDATORS,
3209
+ useExisting: forwardRef(() => NgxDateRangePickerComponent),
3210
+ multi: true,
3211
+ },
3212
+ ], template: "<div class=\"wrapper\" (click)=\"stopPagination($event)\">\r\n <div class=\"header\">\r\n <div class=\"calendar-icon\" aria-hidden=\"true\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M16 2V6M8 2V6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\r\n <path\r\n d=\"M13 4H11C7.22876 4 5.34315 4 4.17157 5.17157C3 6.34315 3 8.22876 3 12V14C3 17.7712 3 19.6569 4.17157 20.8284C5 22 7.22876 22 11 22H13C16.7712 22 18.6569 22 19.8284 20.8284C21 17.7712 21 14V12C21 8.22876 19.8284 5.17157 19.8284 5.17157C4 4 13 4 13 4Z\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\" />\r\n <path d=\"M3 10H21\" stroke=\"currentColor\" stroke-width=\"1.5\" />\r\n </svg>\r\n </div>\r\n <div class=\"header-copy\">\r\n <div class=\"header-title\">Date range</div>\r\n <div class=\"header-value\">{{ calendarHeader }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sub-header\">\r\n <button type=\"button\" class=\"nav-button\" id=\"prev\" (click)=\"previous()\" aria-label=\"Previous\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"\r\n config.previousButtonTemplate || defaultPreviousBTNTemplate\r\n \"></ng-template>\r\n </button>\r\n\r\n <button type=\"button\" class=\"current-date\" (click)=\"changeView('month')\">\r\n <span>{{ displayMonth }}</span>\r\n <span>{{ currYear }}</span>\r\n </button>\r\n\r\n <button type=\"button\" class=\"nav-button\" id=\"next\" (click)=\"next()\" aria-label=\"Next\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"config.nextButtonTemplate || defaultNextBTNTemplate\"></ng-template>\r\n </button>\r\n </div>\r\n\r\n <div class=\"calendar\">\r\n @if (view === 'day') {\r\n <ul class=\"weeks\">\r\n @for (w of weekDays; track $index) {\r\n <li [title]=\"w.name\">{{ w.min }}</li>\r\n }\r\n </ul>\r\n\r\n <ul class=\"days\">\r\n @for (item of viewDays; track $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.in-range]=\"item.inRange\"\r\n [class.in-range-preview]=\"item.inRangePreview\"\r\n [class.range-start]=\"item.rangeStart\"\r\n [class.range-end]=\"item.rangeEnd\"\r\n [class.range-single]=\"item.rangeStart && item.rangeEnd\"\r\n (mouseenter)=\"onDayEnter(item)\"\r\n (mouseleave)=\"onDayLeave()\"\r\n (click)=\"selectDay($event, item)\"\r\n [attr.aria-selected]=\"\r\n item.rangeStart || item.rangeEnd || item.inRange || item.inRangePreview\r\n \">\r\n <span class=\"day-number\">{{ item.day }}</span>\r\n </li>\r\n }\r\n </ul>\r\n } @else if (view === 'month') {\r\n <ul class=\"months\">\r\n @for (item of viewMonths; track $index; let i = $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectMonth($event, item)\">\r\n {{ i + 1 }}.{{ item.displayMonth }}\r\n </li>\r\n }\r\n </ul>\r\n } @else {\r\n <ul class=\"years\">\r\n @for (item of viewYears; track $index) {\r\n <li\r\n [class.de-active]=\"!item.active\"\r\n [class.today]=\"item.isToday\"\r\n [class.selected]=\"item.selected\"\r\n (click)=\"selectYear($event, item)\">\r\n {{ item.year }}\r\n </li>\r\n }\r\n </ul>\r\n }\r\n\r\n <div class=\"calendar-footer\">\r\n @if (config.clearButton) {\r\n <button type=\"button\" (click)=\"clear()\">{{ localize().clear }}</button>\r\n }\r\n @if (config.todayButton) {\r\n <button type=\"button\" (click)=\"gotoToday()\">{{ localize().today }}</button>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #defaultPreviousBTNTemplate>\r\n <svg width=\"14\" height=\"28\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M224 480c-8.188 0-16.38-3.125-22.62-9.375l-192-192c-12.5-12.5-12.5-32.75 0-45.25l192-192c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25L77.25 256l169.4 169.4c12.5 12.5 12.5 32.75 0 45.25C240.4 476.9 232.2 480 224 480z\" />\r\n </svg>\r\n</ng-template>\r\n\r\n<ng-template #defaultNextBTNTemplate>\r\n <svg width=\"14\" height=\"28\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M96 480c-8.188 0-16.38-3.125-22.62-9.375L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z\" />\r\n </svg>\r\n</ng-template>\r\n", styles: [":host{--ngx-range-bg: light-dark(#ffffff, #10162b);--ngx-range-text: light-dark(#171717, #f4f4f5);--ngx-range-muted: light-dark(#8a8f98, #72798a);--ngx-range-border: light-dark(#e6e8ee, #272d40);--ngx-range-accent: light-dark(#6544e8, #8d6cff);--ngx-range-accent-soft: light-dark(#eeeaff, #2b2252);--ngx-range-hover: light-dark(#f4f2ff, #211b38)}.wrapper{width:336px;overflow:hidden;border:1px solid var(--ngx-range-border);border-radius:14px;background:var(--ngx-range-bg);color:var(--ngx-range-text);box-shadow:0 18px 55px #0000002e;font-size:13px}.header{display:flex;gap:12px;padding:15px 16px;background:linear-gradient(135deg,#6747e9,#8b64f5);color:#fff}.header .calendar-icon{width:42px;height:42px;display:grid;place-items:center;border-radius:12px;background:#ffffff29}.header .header-copy{min-width:0;flex:1}.header .header-title{opacity:.75;font-size:11px;text-transform:uppercase;letter-spacing:.08em}.header .header-value{margin-top:3px;font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sub-header{display:grid;grid-template-columns:40px 1fr 40px;align-items:center;padding:8px 10px;border-bottom:1px solid var(--ngx-range-border)}.sub-header button{color:inherit;border:0;background:transparent;cursor:pointer}.sub-header .nav-button{width:36px;height:36px;display:grid;place-items:center;border-radius:9px}.sub-header .nav-button:hover{background:var(--ngx-range-hover)}.sub-header .current-date{display:flex;justify-content:center;gap:6px;font-weight:700;font-size:14px}.calendar{padding:10px 12px 12px}.calendar ul{display:flex;flex-wrap:wrap;list-style:none;padding:0;margin:0}.calendar .weeks li,.calendar .days li{width:14.2857142857%}.calendar .weeks{margin-bottom:4px}.calendar .weeks li{height:30px;display:grid;place-items:center;color:var(--ngx-range-muted);font-size:11px;font-weight:700}.calendar .days li{position:relative;height:40px;display:grid;place-items:center;cursor:pointer;-webkit-user-select:none;user-select:none}.calendar .days li:before{content:\"\";position:absolute;inset:4px 0;background:transparent;z-index:0}.calendar .days li .day-number{position:relative;z-index:2;width:32px;height:32px;display:grid;place-items:center;border-radius:50%;transition:transform .12s ease,background .12s ease}.calendar .days li:not(.de-active):hover .day-number{background:var(--ngx-range-hover)}.calendar .days li.de-active{color:var(--ngx-range-muted);opacity:.45;cursor:default}.calendar .days li.in-range:before,.calendar .days li.in-range-preview:before{background:var(--ngx-range-accent-soft)}.calendar .days li.range-start:before{border-radius:20px 0 0 20px}.calendar .days li.range-end:before{border-radius:0 20px 20px 0}.calendar .days li.range-start.range-end:before{border-radius:20px}.calendar .days li.range-start .day-number,.calendar .days li.range-end .day-number{background:var(--ngx-range-accent);color:#fff;font-weight:700;box-shadow:0 3px 10px #6544e847}.calendar .days li.range-single .day-number{box-shadow:none}.calendar .days li.today:not(.range-start):not(.range-end) .day-number{outline:1.5px solid var(--ngx-range-accent);outline-offset:-1px}.calendar .days li.in-range:not(.range-start):not(.range-end) .day-number{color:var(--ngx-range-text)}.calendar .months li,.calendar .years li{height:46px;width:33.333%;display:grid;place-items:center;border-radius:10px;cursor:pointer}.calendar .months li:hover,.calendar .years li:hover{background:var(--ngx-range-hover)}.calendar .months li.selected,.calendar .years li.selected{background:var(--ngx-range-accent);color:#fff}.calendar .months li.de-active,.calendar .years li.de-active{opacity:.4}.calendar .years li{width:25%}.calendar .calendar-footer{display:flex;justify-content:space-between;gap:8px;margin-top:10px;padding-top:10px;border-top:1px solid var(--ngx-range-border)}.calendar .calendar-footer button{min-height:34px;padding:0 13px;border:0;border-radius:8px;background:transparent;color:inherit;cursor:pointer;font-weight:600}.calendar .calendar-footer button:hover{background:var(--ngx-range-hover)}:host-context([dir=rtl]) .days li.range-start:before{border-radius:0 20px 20px 0}:host-context([dir=rtl]) .days li.range-end:before{border-radius:20px 0 0 20px}:host-context([dir=rtl]) .days li.range-start.range-end:before{border-radius:20px}:host-context([dir=rtl]) #prev,:host-context([dir=rtl]) #next{transform:rotate(180deg)}\n"] }]
3213
+ }], propDecorators: { localize: [{ type: i0.Input, args: [{ isSignal: true, alias: "localize", required: false }] }], locale: [{
3214
+ type: Input
3215
+ }], min: [{
3216
+ type: Input
3217
+ }], max: [{
3218
+ type: Input
3219
+ }], view: [{
3220
+ type: Input
3221
+ }], rangeChange: [{
3222
+ type: Output
3223
+ }], change: [{
3224
+ type: Output
3225
+ }] } });
3226
+
3227
+ class NgxInputDateRangePicker {
3228
+ el;
3229
+ dateAdapterRegistry = inject(DateAdapterRegistry);
3230
+ overlayService = inject(OverlayService);
3231
+ viewContainerRef = inject(ViewContainerRef);
3232
+ renderer = inject(Renderer2);
3233
+ openOnClick = true;
3234
+ displayFormat = 'yyyy/MM/dd';
3235
+ rangeSeparator = ' – ';
3236
+ _locale = 'en';
3237
+ set locale(value) {
3238
+ this._locale = value || 'en';
3239
+ this.adapter = this.dateAdapterRegistry.resolve(this._locale);
3240
+ this.formatValue();
3241
+ }
3242
+ get locale() {
3243
+ return this._locale;
3244
+ }
3245
+ set setMin(value) {
3246
+ this.min = deserialize(value);
3247
+ this._validatorOnChange();
3248
+ }
3249
+ set setMax(value) {
3250
+ this.max = deserialize(value);
3251
+ this._validatorOnChange();
3252
+ }
3253
+ config = new NgxDatePickerConfig();
3254
+ change = new EventEmitter();
3255
+ min = null;
3256
+ max = null;
3257
+ value = { start: null, end: null };
3258
+ pickerRef;
3259
+ isDisabled = false;
3260
+ adapter;
3261
+ _onChange = (_value) => { };
3262
+ _onTouched = () => { };
3263
+ _validatorOnChange = () => { };
3264
+ constructor(el) {
3265
+ this.el = el;
3266
+ this.adapter = this.dateAdapterRegistry.resolve(this.locale);
3267
+ }
3268
+ ngOnChanges() {
3269
+ this.adapter = this.dateAdapterRegistry.resolve(this.locale);
3270
+ this.formatValue();
3271
+ }
3272
+ onClick(event) {
3273
+ if (!this.openOnClick || this.isDisabled)
3274
+ return;
3275
+ event.preventDefault();
3276
+ event.stopPropagation();
3277
+ this.toggle();
3278
+ }
3279
+ onBlur() {
3280
+ this._onTouched();
3281
+ }
3282
+ writeValue(value) {
3283
+ this.value = normalizeDateRange(value);
3284
+ this.formatValue();
3285
+ }
3286
+ registerOnChange(fn) {
3287
+ this._onChange = fn;
3288
+ }
3289
+ registerOnTouched(fn) {
3290
+ this._onTouched = fn;
3291
+ }
3292
+ registerOnValidatorChange(fn) {
3293
+ this._validatorOnChange = fn;
3294
+ }
3295
+ setDisabledState(disabled) {
3296
+ this.isDisabled = disabled;
3297
+ this.renderer.setProperty(this.el.nativeElement, 'disabled', disabled);
3298
+ }
3299
+ toggle() {
3300
+ if (this.isDisabled)
3301
+ return;
3302
+ if (this.pickerRef) {
3303
+ this.destroyDatePicker();
3304
+ return;
3305
+ }
3306
+ this.adapter = this.dateAdapterRegistry.resolve(this.locale);
3307
+ this.pickerRef = this.overlayService.open({
3308
+ anchor: this.el.nativeElement,
3309
+ component: NgxDateRangePickerComponent,
3310
+ viewContainerRef: this.viewContainerRef,
3311
+ alignment: 'center',
3312
+ placement: 'bottom',
3313
+ margin: 4,
3314
+ configure: (instance) => {
3315
+ instance.locale = this.locale;
3316
+ instance.min = this.min;
3317
+ instance.max = this.max;
3318
+ instance.updateConfig(this.config);
3319
+ instance.writeValue(this.value);
3320
+ instance.rangeChange.subscribe((value) => {
3321
+ this.value = normalizeDateRange(value);
3322
+ this.formatValue();
3323
+ this._onChange(this.value);
3324
+ this.change.emit(this.value);
3325
+ if (this.value.start && this.value.end) {
3326
+ this._onTouched();
3327
+ this.destroyDatePicker();
3328
+ }
3329
+ });
3330
+ },
3331
+ onClosed: () => {
3332
+ this.pickerRef = undefined;
3333
+ },
3334
+ });
3335
+ }
3336
+ validate(_control) {
3337
+ const { start, end } = this.value;
3338
+ if (start && this.min && compareDate(start, this.min) < 0) {
3339
+ return { min: this.min };
3340
+ }
3341
+ if (end && this.max && compareDate(end, this.max) > 0) {
3342
+ return { max: this.max };
3343
+ }
3344
+ if (start && end && compareDate(start, end) > 0) {
3345
+ return { range: true };
3346
+ }
3347
+ return null;
3348
+ }
3349
+ formatValue() {
3350
+ const start = this.value.start;
3351
+ const end = this.value.end;
3352
+ const format = (value) => {
3353
+ if (!value)
3354
+ return '';
3355
+ const locale = this.adapter.toLocale(value);
3356
+ return this.adapter.formatDate(locale, this.displayFormat) ?? '';
3357
+ };
3358
+ const startText = format(start);
3359
+ const endText = format(end);
3360
+ const value = startText && endText
3361
+ ? `${startText}${this.rangeSeparator}${endText}`
3362
+ : startText;
3363
+ this.renderer.setProperty(this.el.nativeElement, 'value', value);
3364
+ }
3365
+ destroyDatePicker() {
3366
+ this.pickerRef?.close();
3367
+ this.pickerRef = undefined;
3368
+ }
3369
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInputDateRangePicker, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
3370
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.4", type: NgxInputDateRangePicker, isStandalone: true, selector: "input[ngxInputDateRangePicker]", inputs: { openOnClick: "openOnClick", displayFormat: "displayFormat", rangeSeparator: "rangeSeparator", locale: "locale", setMin: ["min", "setMin"], setMax: ["max", "setMax"], config: "config" }, outputs: { change: "change" }, host: { listeners: { "click": "onClick($event)", "blur": "onBlur()" }, properties: { "attr.readOnly": "true" }, classAttribute: "ngx-datepicker-input" }, providers: [
3371
+ DateAdapterRegistry,
3372
+ {
3373
+ provide: NG_VALUE_ACCESSOR,
3374
+ useExisting: forwardRef(() => NgxInputDateRangePicker),
3375
+ multi: true,
3376
+ },
3377
+ {
3378
+ provide: NG_VALIDATORS,
3379
+ useExisting: forwardRef(() => NgxInputDateRangePicker),
3380
+ multi: true,
3381
+ },
3382
+ ], exportAs: ["ngxInputDateRangePicker"], usesOnChanges: true, ngImport: i0 });
3383
+ }
3384
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInputDateRangePicker, decorators: [{
3385
+ type: Directive,
3386
+ args: [{
3387
+ selector: 'input[ngxInputDateRangePicker]',
3388
+ exportAs: 'ngxInputDateRangePicker',
3389
+ host: {
3390
+ class: 'ngx-datepicker-input',
3391
+ '[attr.readOnly]': 'true',
3392
+ },
3393
+ providers: [
3394
+ DateAdapterRegistry,
3395
+ {
3396
+ provide: NG_VALUE_ACCESSOR,
3397
+ useExisting: forwardRef(() => NgxInputDateRangePicker),
3398
+ multi: true,
3399
+ },
3400
+ {
3401
+ provide: NG_VALIDATORS,
3402
+ useExisting: forwardRef(() => NgxInputDateRangePicker),
3403
+ multi: true,
3404
+ },
3405
+ ],
3406
+ }]
3407
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { openOnClick: [{
3408
+ type: Input
3409
+ }], displayFormat: [{
3410
+ type: Input
3411
+ }], rangeSeparator: [{
3412
+ type: Input
3413
+ }], locale: [{
3414
+ type: Input
3415
+ }], setMin: [{
3416
+ type: Input,
3417
+ args: ['min']
3418
+ }], setMax: [{
3419
+ type: Input,
3420
+ args: ['max']
3421
+ }], config: [{
3422
+ type: Input
3423
+ }], change: [{
3424
+ type: Output
3425
+ }], onClick: [{
3426
+ type: HostListener,
3427
+ args: ['click', ['$event']]
3428
+ }], onBlur: [{
3429
+ type: HostListener,
3430
+ args: ['blur']
3431
+ }] } });
3432
+
2309
3433
  /**
2310
3434
  * Generated bundle index. Do not edit.
2311
3435
  */
2312
3436
 
2313
- export { DATE_ADAPTERS, DEFAULT_DATE_ADAPTERS, NgxCalendarComponent, NgxDatePickerConfig, NgxInputDatePicker, NgxInputDatePickerComponent, getLocals, provideDateAdapters };
3437
+ export { DATE_ADAPTERS, DEFAULT_DATE_ADAPTERS, DateModel, DateViewDay, DateViewMonth, DateViewWeek, DateViewYear, NgxCalendarComponent, NgxDatePickerConfig, NgxDateRangePickerComponent, NgxInputDatePicker, NgxInputDatePickerComponent, NgxInputDateRangePicker, createDateRange, getLocals, isCompleteDateRange, isDateInPreviewRange, isDateInRange, normalizeDateRange, provideDateAdapters };
2314
3438
  //# sourceMappingURL=ngx-kit-date-picker.mjs.map