nexheal-lib 0.0.58 → 0.0.60

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.
@@ -423,10 +423,6 @@ class CalendarControl {
423
423
  errorMessage = "";
424
424
  hourFormat = "24";
425
425
  selectionMode = "single";
426
- /** `week` = Sun–Sat calendar week. `sevenDays` = clicked date through +6 days. */
427
- get isWeekLikeMode() {
428
- return this.selectionMode === "week" || this.selectionMode === "sevenDays";
429
- }
430
426
  timeOnly = false;
431
427
  dateFormat = "dd/MM/yyyy";
432
428
  placeholder = "";
@@ -454,9 +450,9 @@ class CalendarControl {
454
450
  selectionCleared = new EventEmitter();
455
451
  blurEvent = new EventEmitter();
456
452
  dateSelected = new EventEmitter();
457
- /** Emitted in `selectionMode="week"` (Sun–Sat) and `"sevenDays"` (clicked date through +6 days). */
453
+ /** Emitted in `selectionMode="week"` with the selected week's start/end (or null when cleared). */
458
454
  weekSelected = new EventEmitter();
459
- /** Emitted in `selectionMode="range"` with the selected start/end (or null when cleared). */
455
+ /** Emitted in `selectionMode="range"` with the selected range's start/end (or null when cleared). */
460
456
  rangeSelected = new EventEmitter();
461
457
  _defaultDate;
462
458
  get defaultDate() {
@@ -509,11 +505,12 @@ class CalendarControl {
509
505
  selectedWeekEnd = null;
510
506
  hoverWeekStart = null;
511
507
  hoverWeekEnd = null;
508
+ // ── range mode state ──
512
509
  rangeStart = null;
513
510
  rangeEnd = null;
514
- hoverDate = null;
515
- committedRangeStart = null;
516
- committedRangeEnd = null;
511
+ rangeHoverEnd = null;
512
+ /** Tracks whether the user is picking the end date (true) or the start date (false). */
513
+ rangePicking = 'start';
517
514
  today = new Date();
518
515
  todayYear = this.today.getFullYear();
519
516
  todayMonth = this.today.getMonth();
@@ -554,13 +551,38 @@ class CalendarControl {
554
551
  this.selectedDate = null;
555
552
  this.selectedWeekStart = null;
556
553
  this.selectedWeekEnd = null;
557
- this.applyDateRange(null, null, false);
554
+ this.rangeStart = null;
555
+ this.rangeEnd = null;
556
+ this.rangePicking = 'start';
558
557
  this.inputControl.setValue("", { emitEvent: false });
559
558
  return;
560
559
  }
561
- // Week mode: value is a "start - end" range string
562
- if (this.isWeekLikeMode) {
563
- const parsed = this.parseWeekAnchor(value);
560
+ // Range mode: delegate to separate handler
561
+ if (this.selectionMode === "range") {
562
+ this.writeValueRange(value);
563
+ return;
564
+ }
565
+ // Week mode: value is a "start - end" range string, a single date, or ISO string
566
+ if (this.selectionMode === "week") {
567
+ const raw = String(value);
568
+ const parts = raw.split(" - ");
569
+ // If we got a proper "start - end" range string, use both dates directly
570
+ // instead of recalculating via getWeekRange (which always does Sun–Sat)
571
+ if (parts.length === 2) {
572
+ const s = this.parseDate(parts[0].trim());
573
+ const e = this.parseDate(parts[1].trim());
574
+ if (s && e) {
575
+ this.selectedWeekStart = s;
576
+ this.selectedWeekEnd = e;
577
+ this.selectedDate = s;
578
+ this.displayMonth = s.getMonth();
579
+ this.displayYear = s.getFullYear();
580
+ this.inputControl.setValue(this.formatWeek(s, e), { emitEvent: false });
581
+ return;
582
+ }
583
+ }
584
+ // Single date: compute week range via getWeekRange (Sun–Sat default)
585
+ const parsed = this.parseDate(parts[0]?.trim()) || this.parseDate(raw);
564
586
  if (!parsed) {
565
587
  this.selectedWeekStart = null;
566
588
  this.selectedWeekEnd = null;
@@ -577,20 +599,6 @@ class CalendarControl {
577
599
  this.inputControl.setValue(this.formatWeek(start, end), { emitEvent: false });
578
600
  return;
579
601
  }
580
- if (this.selectionMode === "range") {
581
- const parsedRange = this.parseIncomingRange(value);
582
- if (!parsedRange) {
583
- this.applyDateRange(null, null, false);
584
- this.selectedDate = null;
585
- this.inputControl.setValue("", { emitEvent: false });
586
- return;
587
- }
588
- this.applyDateRange(parsedRange.start, parsedRange.end, false);
589
- this.selectedDate = parsedRange.start;
590
- this.displayMonth = parsedRange.start.getMonth();
591
- this.displayYear = parsedRange.start.getFullYear();
592
- return;
593
- }
594
602
  if (this.timeOnly) {
595
603
  let hours, mins;
596
604
  if (typeof value === "string") {
@@ -719,9 +727,14 @@ class CalendarControl {
719
727
  // events
720
728
  onBlur() {
721
729
  this.onTouchedFn();
730
+ // Range mode: delegate to separate handler
731
+ if (this.selectionMode === "range") {
732
+ this.onBlurRange();
733
+ return;
734
+ }
722
735
  // Week mode keeps a "start - end" range string; the single-date parsing
723
736
  // below would fail to parse it and wipe the selection, so handle it here.
724
- if (this.isWeekLikeMode) {
737
+ if (this.selectionMode === "week") {
725
738
  const rawWeek = (this.inputControl.value || "").trim();
726
739
  const current = this.selectedWeekStart && this.selectedWeekEnd
727
740
  ? this.formatWeek(this.selectedWeekStart, this.selectedWeekEnd)
@@ -742,14 +755,35 @@ class CalendarControl {
742
755
  this.blurEvent.emit();
743
756
  return;
744
757
  }
745
- // typed a different value -> recompute the week, else revert
746
- const parsed = this.parseWeekAnchor(rawWeek);
747
- if (!parsed) {
748
- this.inputControl.setValue(current, { emitEvent: false });
749
- this.blurEvent.emit();
750
- return;
758
+ // typed a different value -> try to use both dates from range, else recompute
759
+ const blurParts = rawWeek.split(" - ");
760
+ let start;
761
+ let end;
762
+ if (blurParts.length === 2) {
763
+ const s = this.parseDate(blurParts[0].trim());
764
+ const e = this.parseDate(blurParts[1].trim());
765
+ if (s && e) {
766
+ start = s;
767
+ end = e;
768
+ }
769
+ else if (s) {
770
+ ({ start, end } = this.getWeekRange(s));
771
+ }
772
+ else {
773
+ this.inputControl.setValue(current, { emitEvent: false });
774
+ this.blurEvent.emit();
775
+ return;
776
+ }
777
+ }
778
+ else {
779
+ const parsed = this.parseDate(rawWeek);
780
+ if (!parsed) {
781
+ this.inputControl.setValue(current, { emitEvent: false });
782
+ this.blurEvent.emit();
783
+ return;
784
+ }
785
+ ({ start, end } = this.getWeekRange(parsed));
751
786
  }
752
- const { start, end } = this.getWeekRange(parsed);
753
787
  this.selectedWeekStart = start;
754
788
  this.selectedWeekEnd = end;
755
789
  this.selectedDate = start;
@@ -763,10 +797,6 @@ class CalendarControl {
763
797
  this.blurEvent.emit();
764
798
  return;
765
799
  }
766
- if (this.selectionMode === "range") {
767
- this.onRangeBlur();
768
- return;
769
- }
770
800
  const raw = (this.inputControl.value || "");
771
801
  let currentFormatted = "";
772
802
  if (this.selectedDate) {
@@ -908,10 +938,7 @@ class CalendarControl {
908
938
  this.toggleCalendar();
909
939
  break;
910
940
  case "Escape":
911
- if (this.selectionMode === "range")
912
- this.closeCalendar();
913
- else
914
- this.isOpen = false;
941
+ this.isOpen = false;
915
942
  break;
916
943
  case " ":
917
944
  case "Spacebar":
@@ -919,10 +946,7 @@ class CalendarControl {
919
946
  this.toggleCalendar();
920
947
  break;
921
948
  case "Tab":
922
- if (this.selectionMode === "range")
923
- this.closeCalendar();
924
- else
925
- this.isOpen = false;
949
+ this.isOpen = false;
926
950
  break;
927
951
  }
928
952
  }
@@ -931,8 +955,13 @@ class CalendarControl {
931
955
  if (!cell || cell.disabled)
932
956
  return;
933
957
  const base = cell.date;
934
- // Week / sevenDays: select a 7-day span from the clicked date
935
- if (this.isWeekLikeMode) {
958
+ // Range mode: delegate to separate handler
959
+ if (this.selectionMode === "range") {
960
+ this.selectDayRange(cell);
961
+ return;
962
+ }
963
+ // Week mode: select the whole week containing the clicked day
964
+ if (this.selectionMode === "week") {
936
965
  const { start, end } = this.getWeekRange(base);
937
966
  this.selectedWeekStart = start;
938
967
  this.selectedWeekEnd = end;
@@ -946,10 +975,6 @@ class CalendarControl {
946
975
  this.isOpen = false;
947
976
  return;
948
977
  }
949
- if (this.selectionMode === "range") {
950
- this.selectRangeDay(cell);
951
- return;
952
- }
953
978
  const picked = this.showTime
954
979
  ? new Date(base.getFullYear(), base.getMonth(), base.getDate(), this.selectedHour, this.selectedMinute)
955
980
  : new Date(base.getFullYear(), base.getMonth(), base.getDate());
@@ -973,20 +998,36 @@ class CalendarControl {
973
998
  start.setDate(1 - firstOfMonth.getDay());
974
999
  const end = new Date(lastOfMonth);
975
1000
  end.setDate(lastOfMonth.getDate() + (6 - lastOfMonth.getDay()));
1001
+ const isRange = this.selectionMode === "range";
976
1002
  const cells = [];
977
1003
  const cursor = new Date(start);
978
1004
  while (cursor <= end) {
979
1005
  const date = new Date(cursor.getFullYear(), cursor.getMonth(), cursor.getDate());
980
- cells.push({
1006
+ const cell = {
981
1007
  date,
982
1008
  day: date.getDate(),
983
1009
  otherMonth: date.getMonth() !== this.displayMonth,
984
1010
  disabled: this.isDateDisabled(date),
985
- selected: this.isCellSelected(date),
1011
+ selected: isRange
1012
+ ? this.isRangeEdge(date)
1013
+ : this.selectionMode === "week"
1014
+ ? this.isWithin(date, this.selectedWeekStart, this.selectedWeekEnd)
1015
+ : !!this.selectedDate &&
1016
+ this.selectedDate.getFullYear() === date.getFullYear() &&
1017
+ this.selectedDate.getMonth() === date.getMonth() &&
1018
+ this.selectedDate.getDate() === date.getDate(),
986
1019
  today: this.todayYear === date.getFullYear() &&
987
1020
  this.todayMonth === date.getMonth() &&
988
1021
  this.todayDate === date.getDate(),
989
- });
1022
+ };
1023
+ // Populate range-specific flags
1024
+ if (isRange) {
1025
+ cell.isRangeStart = this.isSameDay(date, this.rangeStart);
1026
+ cell.isRangeEnd = this.isSameDay(date, this.rangeEnd);
1027
+ cell.isInRange = this.isInFinalRange(date);
1028
+ cell.isInHoverRange = this.isInHoverRange(date);
1029
+ }
1030
+ cells.push(cell);
990
1031
  cursor.setDate(cursor.getDate() + 1);
991
1032
  }
992
1033
  return cells;
@@ -1007,11 +1048,6 @@ class CalendarControl {
1007
1048
  const d = +m[1], mo = +m[2] - 1, y = +m[3];
1008
1049
  return new Date(y, mo, d);
1009
1050
  }
1010
- // Date-only ISO must be local; `new Date("yyyy-MM-dd")` is UTC and shifts the day in IST.
1011
- const isoDateOnly = val.match(/^(\d{4})-(\d{2})-(\d{2})$/);
1012
- if (isoDateOnly) {
1013
- return new Date(+isoDateOnly[1], +isoDateOnly[2] - 1, +isoDateOnly[3]);
1014
- }
1015
1051
  }
1016
1052
  // fallback
1017
1053
  const date = new Date(val);
@@ -1051,292 +1087,221 @@ class CalendarControl {
1051
1087
  this.isDateDisabled(new Date(this.displayYear, this.displayMonth, day)));
1052
1088
  }
1053
1089
  // week
1054
- /**
1055
- * `week`: Sun–Sat containing `date`.
1056
- * `sevenDays`: `date` through the next 6 days.
1057
- */
1090
+ /** The Sun–Sat range for the week containing `date`. */
1058
1091
  getWeekRange(date) {
1059
- const day = this.startOfDay(date);
1060
- if (this.selectionMode === "sevenDays") {
1061
- const start = day;
1062
- const end = new Date(start.getFullYear(), start.getMonth(), start.getDate() + 6, 23, 59, 59, 999);
1063
- return { start, end };
1064
- }
1065
- const start = new Date(day.getFullYear(), day.getMonth(), day.getDate() - day.getDay());
1066
- const end = new Date(start.getFullYear(), start.getMonth(), start.getDate() + 6, 23, 59, 59, 999);
1092
+ const start = new Date(date);
1093
+ start.setHours(0, 0, 0, 0);
1094
+ start.setDate(start.getDate() - start.getDay()); // back to Sunday
1095
+ const end = new Date(start);
1096
+ end.setDate(start.getDate() + 6); // Saturday
1097
+ end.setHours(23, 59, 59, 999);
1067
1098
  return { start, end };
1068
1099
  }
1069
- /**
1070
- * `sevenDays` anchors on the start date (clicked day).
1071
- * `week` (Sun–Sat) prefers the end date when both are present so Sunday 00:00 IST
1072
- * does not snap the previous UTC day back a calendar week.
1073
- */
1074
- parseWeekAnchor(value) {
1075
- if (value instanceof Date && !isNaN(value.getTime())) {
1076
- return this.startOfDay(value);
1077
- }
1078
- if (Array.isArray(value) && value.length) {
1079
- if (this.selectionMode === "week" && value[1] != null) {
1080
- const end = this.parseDate(value[1]);
1081
- if (end)
1082
- return end;
1083
- }
1084
- return this.parseWeekAnchor(value[0]);
1085
- }
1086
- if (value && typeof value === "object" && !(value instanceof Date) && (value.start || value.end)) {
1087
- if (this.selectionMode === "week" && value.end) {
1088
- const end = this.parseDate(value.end);
1089
- if (end)
1090
- return end;
1091
- }
1092
- return this.parseWeekAnchor(value.start);
1093
- }
1094
- const raw = String(value ?? "").trim();
1095
- if (!raw)
1096
- return null;
1097
- const parts = raw.split(/\s+[-–—]\s+/).map((part) => part.trim()).filter(Boolean);
1098
- if (this.selectionMode === "week" && parts.length >= 2) {
1099
- const end = this.parseDate(parts[1]);
1100
- if (end)
1101
- return end;
1102
- }
1103
- if (parts.length >= 1) {
1104
- const start = this.parseDate(parts[0]);
1105
- if (start)
1106
- return start;
1107
- }
1108
- return this.parseDate(raw);
1109
- }
1110
1100
  formatWeek(start, end) {
1111
1101
  return `${this.datePipe.transform(start, this.dateFormat)} - ${this.datePipe.transform(end, this.dateFormat)}`;
1112
1102
  }
1113
1103
  isWithin(date, start, end) {
1114
1104
  if (!start || !end)
1115
1105
  return false;
1116
- return this.isWithinDayRange(date, start, end);
1106
+ return date >= start && date <= end;
1117
1107
  }
1118
1108
  isInHoverWeek(date) {
1119
- if (!this.isWeekLikeMode)
1109
+ if (this.selectionMode !== "week")
1120
1110
  return false;
1121
1111
  return this.isWithin(date, this.hoverWeekStart, this.hoverWeekEnd);
1122
1112
  }
1123
1113
  onDayHover(cell) {
1124
- if (this.isWeekLikeMode) {
1125
- const { start, end } = this.getWeekRange(cell.date);
1126
- this.hoverWeekStart = start;
1127
- this.hoverWeekEnd = end;
1128
- return;
1129
- }
1130
1114
  if (this.selectionMode === "range") {
1131
- if (!this.rangeStart || this.rangeEnd)
1132
- return;
1133
- this.hoverDate = cell.date;
1115
+ this.onDayHoverRange(cell);
1116
+ return;
1134
1117
  }
1118
+ if (this.selectionMode !== "week")
1119
+ return;
1120
+ const { start, end } = this.getWeekRange(cell.date);
1121
+ this.hoverWeekStart = start;
1122
+ this.hoverWeekEnd = end;
1135
1123
  }
1136
1124
  onDayLeave() {
1137
1125
  this.hoverWeekStart = null;
1138
1126
  this.hoverWeekEnd = null;
1139
- this.hoverDate = null;
1127
+ this.rangeHoverEnd = null;
1140
1128
  }
1141
1129
  /** Stable identity for day cells so they aren't re-created every change-detection. */
1142
1130
  trackByDate = (_, cell) => cell.date.getTime();
1143
- isCellSelected(date) {
1144
- if (this.isWeekLikeMode) {
1145
- return this.isWithin(date, this.selectedWeekStart, this.selectedWeekEnd);
1146
- }
1147
- if (this.selectionMode === "range") {
1148
- return this.isRangeStart(date) || this.isRangeEnd(date);
1131
+ // ══════════════════════════════════════════════════════════════════════
1132
+ // ── Range Mode Methods (selectionMode === 'range') ──────────────────
1133
+ // ══════════════════════════════════════════════════════════════════════
1134
+ /** Handle day click in range mode. First click = start, second click = end. */
1135
+ selectDayRange(cell) {
1136
+ if (!cell || cell.disabled)
1137
+ return;
1138
+ const clicked = new Date(cell.date.getFullYear(), cell.date.getMonth(), cell.date.getDate());
1139
+ if (this.rangePicking === 'start' || (this.rangeStart && this.rangeEnd)) {
1140
+ // Starting a new range (or restarting after a complete range)
1141
+ this.rangeStart = clicked;
1142
+ this.rangeEnd = null;
1143
+ this.rangePicking = 'end';
1144
+ // Follow click into adjacent month
1145
+ this.displayMonth = clicked.getMonth();
1146
+ this.displayYear = clicked.getFullYear();
1147
+ return; // keep the picker open for the end date
1148
+ }
1149
+ // Picking the end date
1150
+ let start = this.rangeStart;
1151
+ let end = clicked;
1152
+ // Auto-swap if end < start
1153
+ if (end < start) {
1154
+ const tmp = start;
1155
+ start = end;
1156
+ end = tmp;
1149
1157
  }
1150
- return (!!this.selectedDate &&
1151
- this.selectedDate.getFullYear() === date.getFullYear() &&
1152
- this.selectedDate.getMonth() === date.getMonth() &&
1153
- this.selectedDate.getDate() === date.getDate());
1154
- }
1155
- isRangeStart(date) {
1156
- if (this.selectionMode !== "range" || !this.rangeStart)
1157
- return false;
1158
- return this.isSameDay(date, this.rangeStart);
1159
- }
1160
- isRangeEnd(date) {
1161
- if (this.selectionMode !== "range")
1162
- return false;
1163
- if (this.rangeEnd)
1164
- return this.isSameDay(date, this.rangeEnd);
1165
- return !!this.rangeStart && !!this.hoverDate && this.isSameDay(date, this.hoverDate);
1158
+ this.rangeStart = start;
1159
+ this.rangeEnd = end;
1160
+ this.rangePicking = 'start';
1161
+ this.rangeHoverEnd = null;
1162
+ this.selectedDate = start; // keep selectedDate in sync for the clear button
1163
+ const out = this.formatRange(start, end);
1164
+ this.inputControl.setValue(out, { emitEvent: false });
1165
+ this.onChangeFn(out);
1166
+ this.onTouchedFn();
1167
+ this.rangeSelected.emit({ start, end });
1168
+ this.dateSelected.emit(start);
1169
+ this.isOpen = false;
1166
1170
  }
1167
- isInSelectedRange(date) {
1168
- if (this.selectionMode !== "range" || !this.rangeStart || !this.rangeEnd)
1169
- return false;
1170
- return this.isWithinDayRange(date, this.rangeStart, this.rangeEnd);
1171
+ /** Hover handler for range mode — shows preview band while picking end date. */
1172
+ onDayHoverRange(cell) {
1173
+ if (this.rangePicking === 'end' && this.rangeStart) {
1174
+ this.rangeHoverEnd = cell.date;
1175
+ }
1171
1176
  }
1172
- isInHoverRange(date) {
1173
- if (this.selectionMode !== "range" || !this.rangeStart || this.rangeEnd || !this.hoverDate)
1174
- return false;
1175
- const ordered = this.orderDateRange(this.rangeStart, this.hoverDate);
1176
- return this.isWithinDayRange(date, ordered.start, ordered.end);
1177
+ /** Format a range as "start - end" using the configured dateFormat. */
1178
+ formatRange(start, end) {
1179
+ return `${this.datePipe.transform(start, this.dateFormat)} - ${this.datePipe.transform(end, this.dateFormat)}`;
1177
1180
  }
1178
- selectRangeDay(cell) {
1179
- const picked = this.startOfDay(cell.date);
1180
- if (!this.rangeStart || this.rangeEnd) {
1181
- this.rangeStart = picked;
1182
- this.rangeEnd = null;
1183
- this.hoverDate = null;
1184
- this.selectedDate = picked;
1185
- this.displayMonth = picked.getMonth();
1186
- this.displayYear = picked.getFullYear();
1187
- this.inputControl.setValue(this.formatInProgressRange(picked), { emitEvent: false });
1181
+ /** writeValue delegate for range mode. */
1182
+ writeValueRange(value) {
1183
+ // Handle { start: Date, end: Date } objects directly (e.g. from parent patchValue)
1184
+ if (typeof value === 'object' && value !== null && value.start instanceof Date && value.end instanceof Date) {
1185
+ this.rangeStart = value.start;
1186
+ this.rangeEnd = value.end;
1187
+ this.selectedDate = value.start;
1188
+ this.rangePicking = 'start';
1189
+ this.displayMonth = value.start.getMonth();
1190
+ this.displayYear = value.start.getFullYear();
1191
+ this.inputControl.setValue(this.formatRange(value.start, value.end), { emitEvent: false });
1188
1192
  return;
1189
1193
  }
1190
- const ordered = this.orderDateRange(this.rangeStart, picked);
1191
- this.applyDateRange(ordered.start, ordered.end, true);
1192
- this.selectedDate = ordered.start;
1193
- this.displayMonth = ordered.start.getMonth();
1194
- this.displayYear = ordered.start.getFullYear();
1195
- this.onTouchedFn();
1196
- this.rangeSelected.emit({ start: ordered.start, end: ordered.end });
1197
- this.dateSelected.emit(ordered.start);
1198
- this.closeCalendar();
1194
+ const raw = String(value);
1195
+ const parts = raw.split(" - ");
1196
+ if (parts.length === 2) {
1197
+ const s = this.parseDate(parts[0].trim());
1198
+ const e = this.parseDate(parts[1].trim());
1199
+ if (s && e) {
1200
+ this.rangeStart = s;
1201
+ this.rangeEnd = e;
1202
+ this.selectedDate = s;
1203
+ this.rangePicking = 'start';
1204
+ this.displayMonth = s.getMonth();
1205
+ this.displayYear = s.getFullYear();
1206
+ this.inputControl.setValue(this.formatRange(s, e), { emitEvent: false });
1207
+ return;
1208
+ }
1209
+ }
1210
+ // single date fallback — treat as rangeStart only
1211
+ const parsed = this.parseDate(raw);
1212
+ if (parsed) {
1213
+ this.rangeStart = parsed;
1214
+ this.rangeEnd = null;
1215
+ this.selectedDate = parsed;
1216
+ this.rangePicking = 'end';
1217
+ this.displayMonth = parsed.getMonth();
1218
+ this.displayYear = parsed.getFullYear();
1219
+ this.inputControl.setValue(this.datePipe.transform(parsed, this.dateFormat), { emitEvent: false });
1220
+ }
1221
+ else {
1222
+ this.rangeStart = null;
1223
+ this.rangeEnd = null;
1224
+ this.selectedDate = null;
1225
+ this.rangePicking = 'start';
1226
+ this.inputControl.setValue("", { emitEvent: false });
1227
+ }
1199
1228
  }
1200
- onRangeBlur() {
1229
+ /** onBlur delegate for range mode. */
1230
+ onBlurRange() {
1201
1231
  const raw = (this.inputControl.value || "").trim();
1202
- const current = this.formatCommittedRangeInput();
1232
+ const current = this.rangeStart && this.rangeEnd
1233
+ ? this.formatRange(this.rangeStart, this.rangeEnd)
1234
+ : "";
1235
+ // Unchanged — keep selection
1203
1236
  if (raw === current) {
1204
1237
  this.blurEvent.emit();
1205
1238
  return;
1206
1239
  }
1240
+ // Cleared by user
1207
1241
  if (!raw) {
1208
- this.applyDateRange(null, null, true);
1242
+ this.rangeStart = null;
1243
+ this.rangeEnd = null;
1209
1244
  this.selectedDate = null;
1245
+ this.rangePicking = 'start';
1246
+ this.onChangeFn(null);
1210
1247
  this.rangeSelected.emit(null);
1211
1248
  this.dateSelected.emit(null);
1212
1249
  this.blurEvent.emit();
1213
1250
  return;
1214
1251
  }
1215
- const parsed = this.parseIncomingRange(raw);
1216
- if (parsed) {
1217
- this.applyDateRange(parsed.start, parsed.end, true);
1218
- this.selectedDate = parsed.start;
1219
- this.displayMonth = parsed.start.getMonth();
1220
- this.displayYear = parsed.start.getFullYear();
1221
- this.rangeSelected.emit({ start: parsed.start, end: parsed.end });
1222
- this.dateSelected.emit(parsed.start);
1223
- this.blurEvent.emit();
1224
- return;
1225
- }
1226
- const startOnly = this.parseDate(raw.replace(/\s*-\s*$/, "").trim());
1227
- if (startOnly && !this.rangeEnd) {
1228
- this.rangeStart = this.startOfDay(startOnly);
1229
- this.selectedDate = this.rangeStart;
1230
- this.inputControl.setValue(this.formatInProgressRange(this.rangeStart), { emitEvent: false });
1231
- this.blurEvent.emit();
1232
- return;
1252
+ // Try to parse what the user typed
1253
+ const parts = raw.split(" - ");
1254
+ if (parts.length === 2) {
1255
+ const s = this.parseDate(parts[0].trim());
1256
+ const e = this.parseDate(parts[1].trim());
1257
+ if (s && e) {
1258
+ const start = s < e ? s : e;
1259
+ const end = s < e ? e : s;
1260
+ this.rangeStart = start;
1261
+ this.rangeEnd = end;
1262
+ this.selectedDate = start;
1263
+ this.rangePicking = 'start';
1264
+ this.displayMonth = start.getMonth();
1265
+ this.displayYear = start.getFullYear();
1266
+ const out = this.formatRange(start, end);
1267
+ this.inputControl.setValue(out, { emitEvent: false });
1268
+ this.onChangeFn(out);
1269
+ this.rangeSelected.emit({ start, end });
1270
+ this.dateSelected.emit(start);
1271
+ this.blurEvent.emit();
1272
+ return;
1273
+ }
1233
1274
  }
1275
+ // Invalid — revert
1234
1276
  this.inputControl.setValue(current, { emitEvent: false });
1235
- this.rangeStart = this.committedRangeStart;
1236
- this.rangeEnd = this.committedRangeEnd;
1237
- this.selectedDate = this.rangeStart;
1238
1277
  this.blurEvent.emit();
1239
1278
  }
1240
- applyDateRange(start, end, emit) {
1241
- this.rangeStart = start;
1242
- this.rangeEnd = end;
1243
- this.hoverDate = null;
1244
- this.committedRangeStart = start;
1245
- this.committedRangeEnd = end;
1246
- const out = start && end ? this.formatWeek(start, end) : "";
1247
- this.inputControl.setValue(out, { emitEvent: false });
1248
- if (emit) {
1249
- this.onChangeFn(out || null);
1250
- }
1251
- }
1252
- formatInProgressRange(start) {
1253
- return `${this.datePipe.transform(start, this.dateFormat)} - `;
1279
+ // ── Range helper predicates ──
1280
+ /** True when `date` matches either rangeStart or rangeEnd (day-level). */
1281
+ isRangeEdge(date) {
1282
+ return this.isSameDay(date, this.rangeStart) || this.isSameDay(date, this.rangeEnd);
1254
1283
  }
1255
- formatCommittedRangeInput() {
1256
- if (this.committedRangeStart && this.committedRangeEnd) {
1257
- return this.formatWeek(this.committedRangeStart, this.committedRangeEnd);
1258
- }
1259
- if (this.rangeStart && !this.rangeEnd) {
1260
- return this.formatInProgressRange(this.rangeStart);
1261
- }
1262
- return "";
1263
- }
1264
- parseIncomingRange(value) {
1265
- if (Array.isArray(value) && value.length >= 2) {
1266
- const start = this.parseDate(value[0]);
1267
- const end = this.parseDate(value[1]);
1268
- if (start && end)
1269
- return this.orderDateRange(start, end);
1270
- return null;
1271
- }
1272
- if (value && typeof value === "object" && !(value instanceof Date) && value.start && value.end) {
1273
- const start = this.parseDate(value.start);
1274
- const end = this.parseDate(value.end);
1275
- if (start && end)
1276
- return this.orderDateRange(start, end);
1277
- return null;
1278
- }
1279
- if (typeof value === "string") {
1280
- const parts = value.split(" - ").map((part) => part.trim()).filter(Boolean);
1281
- if (parts.length === 2) {
1282
- const start = this.parseDate(parts[0]);
1283
- const end = this.parseDate(parts[1]);
1284
- if (start && end)
1285
- return this.orderDateRange(start, end);
1286
- }
1287
- }
1288
- return null;
1289
- }
1290
- orderDateRange(a, b) {
1291
- const start = this.startOfDay(a);
1292
- const end = this.startOfDay(b);
1293
- if (this.toDayKey(end) < this.toDayKey(start)) {
1294
- return { start: end, end: start };
1295
- }
1296
- return { start, end };
1297
- }
1298
- startOfDay(d) {
1299
- return new Date(d.getFullYear(), d.getMonth(), d.getDate());
1284
+ /** True when `date` falls strictly between the finalised rangeStart and rangeEnd. */
1285
+ isInFinalRange(date) {
1286
+ if (!this.rangeStart || !this.rangeEnd)
1287
+ return false;
1288
+ return date > this.rangeStart && date < this.rangeEnd;
1300
1289
  }
1301
- toDayKey(d) {
1302
- return d.getFullYear() * 10000 + d.getMonth() * 100 + d.getDate();
1290
+ /** True during the "pick end" phase, for hover preview highlighting. */
1291
+ isInHoverRange(date) {
1292
+ if (this.rangePicking !== 'end' || !this.rangeStart || !this.rangeHoverEnd)
1293
+ return false;
1294
+ const lo = this.rangeStart < this.rangeHoverEnd ? this.rangeStart : this.rangeHoverEnd;
1295
+ const hi = this.rangeStart < this.rangeHoverEnd ? this.rangeHoverEnd : this.rangeStart;
1296
+ return date >= lo && date <= hi;
1303
1297
  }
1298
+ /** Day-level equality check (ignores time). */
1304
1299
  isSameDay(a, b) {
1305
- return this.toDayKey(a) === this.toDayKey(b);
1306
- }
1307
- isWithinDayRange(date, start, end) {
1308
- const key = this.toDayKey(date);
1309
- return key >= this.toDayKey(start) && key <= this.toDayKey(end);
1310
- }
1311
- rangeCoversMonth(year, monthIndex) {
1312
- if (!this.rangeStart)
1300
+ if (!b)
1313
1301
  return false;
1314
- const start = this.rangeStart;
1315
- const end = this.rangeEnd || this.rangeStart;
1316
- const monthStart = new Date(year, monthIndex, 1);
1317
- const monthEnd = new Date(year, monthIndex + 1, 0);
1318
- return this.toDayKey(start) <= this.toDayKey(monthEnd) && this.toDayKey(end) >= this.toDayKey(monthStart);
1319
- }
1320
- rangeCoversYear(year) {
1321
- if (!this.rangeStart)
1322
- return false;
1323
- const startYear = this.rangeStart.getFullYear();
1324
- const endYear = (this.rangeEnd || this.rangeStart).getFullYear();
1325
- return year >= startYear && year <= endYear;
1326
- }
1327
- restoreIncompleteRange() {
1328
- if (this.selectionMode !== "range")
1329
- return;
1330
- if (!this.rangeStart || this.rangeEnd)
1331
- return;
1332
- this.rangeStart = this.committedRangeStart;
1333
- this.rangeEnd = this.committedRangeEnd;
1334
- this.hoverDate = null;
1335
- this.selectedDate = this.rangeStart;
1336
- const out = this.committedRangeStart && this.committedRangeEnd
1337
- ? this.formatWeek(this.committedRangeStart, this.committedRangeEnd)
1338
- : "";
1339
- this.inputControl.setValue(out, { emitEvent: false });
1302
+ return a.getFullYear() === b.getFullYear() &&
1303
+ a.getMonth() === b.getMonth() &&
1304
+ a.getDate() === b.getDate();
1340
1305
  }
1341
1306
  // month
1342
1307
  goToMonthView() {
@@ -1378,9 +1343,6 @@ class CalendarControl {
1378
1343
  return this.months[this.displayMonth];
1379
1344
  }
1380
1345
  isMonthSelected(monthIndex) {
1381
- if (this.selectionMode === "range") {
1382
- return this.rangeCoversMonth(this.displayYear, monthIndex);
1383
- }
1384
1346
  return (!!this.selectedDate &&
1385
1347
  this.selectedDate.getFullYear() === this.displayYear &&
1386
1348
  this.selectedDate.getMonth() === monthIndex);
@@ -1389,9 +1351,6 @@ class CalendarControl {
1389
1351
  return this.todayYear === this.displayYear && this.todayMonth === monthIndex;
1390
1352
  }
1391
1353
  isYearSelected(year) {
1392
- if (this.selectionMode === "range") {
1393
- return this.rangeCoversYear(year);
1394
- }
1395
1354
  return !!this.selectedDate && this.selectedDate.getFullYear() === year;
1396
1355
  }
1397
1356
  isYearCurrent(year) {
@@ -1693,9 +1652,6 @@ class CalendarControl {
1693
1652
  }
1694
1653
  }
1695
1654
  else {
1696
- if (this.selectionMode === "range") {
1697
- this.restoreIncompleteRange();
1698
- }
1699
1655
  this.destroyPopper();
1700
1656
  }
1701
1657
  }
@@ -1706,18 +1662,10 @@ class CalendarControl {
1706
1662
  }
1707
1663
  clickOutside(event) {
1708
1664
  if (!this.rootElement.nativeElement.contains(event.target) && this.isOpen) {
1709
- if (this.selectionMode === "range") {
1710
- this.closeCalendar();
1711
- }
1712
- else {
1713
- this.isOpen = false;
1714
- }
1665
+ this.isOpen = false;
1715
1666
  }
1716
1667
  }
1717
1668
  closeCalendar() {
1718
- if (this.selectionMode === "range") {
1719
- this.restoreIncompleteRange();
1720
- }
1721
1669
  this.destroyPopper();
1722
1670
  this.isOpen = false;
1723
1671
  if (CalendarControl._currentlyOpen === this) {
@@ -1730,7 +1678,11 @@ class CalendarControl {
1730
1678
  this.selectedDate = null;
1731
1679
  this.selectedWeekStart = null;
1732
1680
  this.selectedWeekEnd = null;
1733
- this.applyDateRange(null, null, false);
1681
+ // Clear range state
1682
+ this.rangeStart = null;
1683
+ this.rangeEnd = null;
1684
+ this.rangeHoverEnd = null;
1685
+ this.rangePicking = 'start';
1734
1686
  if (this._minDate) {
1735
1687
  const parsed = new Date(this._minDate);
1736
1688
  if (!isNaN(parsed.getTime())) {
@@ -1753,7 +1705,7 @@ class CalendarControl {
1753
1705
  this.onChangeFn(null);
1754
1706
  this.onTouchedFn();
1755
1707
  this.dateSelected.emit(null);
1756
- if (this.isWeekLikeMode)
1708
+ if (this.selectionMode === "week")
1757
1709
  this.weekSelected.emit(null);
1758
1710
  if (this.selectionMode === "range")
1759
1711
  this.rangeSelected.emit(null);
@@ -1766,7 +1718,7 @@ class CalendarControl {
1766
1718
  useExisting: forwardRef(() => CalendarControl),
1767
1719
  multi: true,
1768
1720
  },
1769
- ], viewQueries: [{ propertyName: "rootElement", first: true, predicate: ["root"], descendants: true, static: true }, { propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, static: true }, { propertyName: "datePickerEl", first: true, predicate: ["datePicker"], descendants: true }], ngImport: i0, template: "<div class=\"form-group calendar\" [ngClass]=\"customClass\" [class.readonly]=\"readonly\" [class.disabled]=\"disabled\" #root\r\n (click)=\"openCalendar()\">\r\n <label class=\"inp-label\" [ngClass]=\"{'required' : required}\" *ngIf=\"title\">{{ title }}</label>\r\n <input type=\"text\" #inputEl [placeholder]=\"placeholder\" [formControl]=\"inputControl\" class=\"form-control\"\r\n [ngClass]=\"{ 'is-invalid': error }\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" [readonly]=\"readonly\"\r\n (click)=\"openCalendar(); $event.stopPropagation()\" (keydown)=\"onInputKeydown($event)\" />\r\n\r\n <span class=\"focus-border\" *ngIf=\"deFocus\"></span>\r\n @if(!inputLoader) {\r\n <span class=\"calendar-icon\">\r\n <i class=\"he\" [ngClass]=\"!timeOnly ? 'he-calendar-blank' : 'he-clock'\"></i>\r\n </span>\r\n }\r\n\r\n @if(!inputLoader &&(selectedDate && !disabled && !readonly) && clearVal) {\r\n <label class=\"clear\" (click)=\"clearDate($event)\">\r\n <i class=\"he he-close\"></i>\r\n </label>\r\n }\r\n\r\n @if(inputLoader) {\r\n <label class=\"loader input-loader\"></label>\r\n }\r\n @if(error) {\r\n <div class=\"val-msg\">{{ errorMessage }}</div>\r\n }\r\n\r\n <div class=\"datepicker-group\" #datePicker *ngIf=\"isOpen\" (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- time picker -->\r\n <ng-container *ngIf=\"timeOnly\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{ ((selectedHour % 12) || 12) | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">\r\n {{ selectedHour | number:'2.0' }}\r\n </div>\r\n </ng-template>\r\n\r\n <button (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <div class=\"time-value\">{{ selectedMinute | number:'2.0' }}</div>\r\n <button (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- day view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'day'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevMonth()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToMonthView()\">\r\n <div>{{ displayMonthName }}</div>\r\n <div>{{ displayYear }}</div>\r\n </div>\r\n <button class=\"calendar-arrow\" (click)=\"nextMonth()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"week-header\">\r\n <div>Sun</div>\r\n <div>Mon</div>\r\n <div>Tue</div>\r\n <div>Wed</div>\r\n <div>Thu</div>\r\n <div>Fri</div>\r\n <div>Sat</div>\r\n </div>\r\n <div class=\"days-grid\" [class.week-mode]=\"isWeekLikeMode\"\r\n [class.range-mode]=\"selectionMode === 'range'\" (mouseleave)=\"onDayLeave()\">\r\n <div class=\"day-cell\" *ngFor=\"let cell of daysInMonth; trackBy: trackByDate\" (click)=\"selectDay(cell)\"\r\n (mouseenter)=\"onDayHover(cell)\" (mouseleave)=\"onDayLeave()\"\r\n [class.other-month]=\"cell.otherMonth\"\r\n [class.disabled]=\"cell.disabled\"\r\n [class.selected]=\"cell.selected\"\r\n [class.week-hover]=\"isInHoverWeek(cell.date)\"\r\n [class.range-start]=\"isRangeStart(cell.date)\"\r\n [class.range-end]=\"isRangeEnd(cell.date)\"\r\n [class.in-range]=\"isInSelectedRange(cell.date)\"\r\n [class.range-hover]=\"isInHoverRange(cell.date)\"\r\n [class.today]=\"cell.today\">\r\n {{ cell.day }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showTime\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{\r\n selectedHour % 12 === 0\r\n ? 12\r\n : selectedHour % 12\r\n | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">{{ selectedHour | number:'2.0' }}</div>\r\n </ng-template>\r\n <button type=\"button\" (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <div class=\"time-value\">\r\n {{ selectedMinute < 10 ? '0' +selectedMinute : selectedMinute }} </div>\r\n <button type=\"button\" (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- month view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'month'\">\r\n <div class=\"header\" *ngIf=\"viewMode !== 'month'\">\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear - 1\"><i\r\n class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToYearRangeView()\">{{ displayYear }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear + 1\"><i\r\n class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"month-grid\">\r\n <div class=\"month-cell\" *ngFor=\"let m of months; index as i\" (click)=\"selectMonth(i)\"\r\n [class.selected]=\"isMonthSelected(i)\" [class.today]=\"isMonthCurrent(i)\">{{ m }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- year range view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'yearRange'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevYearRange()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\">{{ yearRange[0] }} ~ {{ yearRange[yearRangeSize-1] }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"nextYearRange()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"year-grid\">\r\n <div class=\"year-cell\" *ngFor=\"let y of yearRange\" (click)=\"selectYear(y)\"\r\n [class.selected]=\"isYearSelected(y)\" [class.today]=\"isYearCurrent(y)\">{{ y }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n</div>", styles: [".form-group.calendar{position:relative}.form-group.calendar .datepicker-group{left:0;width:100%;z-index:1000;padding:.5rem;color:#495057;min-width:240px;max-width:260px;border-radius:3px;background:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.form-group.calendar .datepicker-group .header{display:flex;font-weight:600;padding:5px;align-items:center;justify-content:space-between;border-bottom:1px solid #dee2e6}.form-group.calendar .datepicker-group .header .title{gap:8px;display:flex;font-size:15px;cursor:pointer;font-weight:600}.form-group.calendar .datepicker-group .header .calendar-arrow{width:28px;height:28px;border:none;line-height:1;cursor:pointer;background:none}.form-group.calendar .datepicker-group .header .calendar-arrow i{font-size:14px}.form-group.calendar .datepicker-group .header .calendar-arrow:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .week-header{display:grid;padding:8px 0;font-size:13px;font-weight:700;text-align:center;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid,.form-group.calendar .datepicker-group .month-grid,.form-group.calendar .datepicker-group .year-grid{gap:3px;padding:5px;display:grid;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{display:flex;font-size:14px;cursor:pointer;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .days-grid .day-cell.today,.form-group.calendar .datepicker-group .days-grid .month-cell.today,.form-group.calendar .datepicker-group .days-grid .year-cell.today,.form-group.calendar .datepicker-group .month-grid .day-cell.today,.form-group.calendar .datepicker-group .month-grid .month-cell.today,.form-group.calendar .datepicker-group .month-grid .year-cell.today,.form-group.calendar .datepicker-group .year-grid .day-cell.today,.form-group.calendar .datepicker-group .year-grid .month-cell.today,.form-group.calendar .datepicker-group .year-grid .year-cell.today{color:#37c0b3;font-weight:700;border:1px solid #37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.selected,.form-group.calendar .datepicker-group .days-grid .day-cell:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.selected,.form-group.calendar .datepicker-group .days-grid .month-cell:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.selected,.form-group.calendar .datepicker-group .days-grid .year-cell:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.selected,.form-group.calendar .datepicker-group .month-grid .day-cell:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.selected,.form-group.calendar .datepicker-group .month-grid .month-cell:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.selected,.form-group.calendar .datepicker-group .month-grid .year-cell:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.selected,.form-group.calendar .datepicker-group .year-grid .day-cell:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.selected,.form-group.calendar .datepicker-group .year-grid .month-cell:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.selected,.form-group.calendar .datepicker-group .year-grid .year-cell:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled{color:#e0e0e0;background:none;-webkit-user-select:none;user-select:none;cursor:not-allowed}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today{color:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled:hover{color:#e0e0e0;background:transparent}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .day-cell{padding:5px 2px;border-radius:50%}.form-group.calendar .datepicker-group .days-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .month-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .year-grid .day-cell.other-month:not(.selected):not(:hover){color:#c5c5c5}.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{padding:8px 2px;border-radius:3px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell{border-radius:4px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell.week-hover:not(.selected){color:#0d6f7d;background:#e6f5f3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell{border-radius:4px}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.in-range:not(.range-start):not(.range-end),.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-hover:not(.range-start):not(.range-end){color:#0d6f7d;background:#e6f5f3;border-radius:0}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.other-month.in-range:not(.range-start):not(.range-end),.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.other-month.range-hover:not(.range-start):not(.range-end){color:#0d6f7d}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start,.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-end,.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.selected{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start:not(.range-end){border-radius:4px 0 0 4px}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-end:not(.range-start){border-radius:0 4px 4px 0}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell:hover:not(.disabled):not(.range-start):not(.range-end){color:#0d6f7d;background:#e6f5f3}.form-group.calendar .datepicker-group .month-grid{grid-template-columns:repeat(3,1fr)}.form-group.calendar .datepicker-group .year-grid{grid-template-columns:repeat(4,1fr)}.form-group.calendar .datepicker-group .time-picker{display:flex;-webkit-user-select:none;user-select:none;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle{gap:6px;display:flex;margin-left:1rem;flex-direction:column;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button{cursor:pointer;padding:3px 8px;font-size:.75rem;background:#fff;border:1px solid #cccccc}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button.active{color:#fff;border-color:#37c0b3;background-color:#37c0b3}.form-group.calendar .datepicker-group .time-picker .time-select{display:flex;margin:0 .75rem;align-items:center;flex-direction:column}.form-group.calendar .datepicker-group .time-picker .time-select button{border:none;cursor:pointer;padding:4px 8px;background:transparent}.form-group.calendar .datepicker-group .time-picker .time-select button i{font-size:1rem}.form-group.calendar .datepicker-group .time-picker .time-select button:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .time-picker .time-select .time-value{width:2rem;font-size:1rem;text-align:center;margin:2px 3px 4px}.form-group.calendar .datepicker-group .time-picker .time-separator{line-height:1;font-size:1rem}.form-group.calendar .clear{right:35px}.form-group.calendar.group-sm .clear{top:7px;right:35px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
1721
+ ], viewQueries: [{ propertyName: "rootElement", first: true, predicate: ["root"], descendants: true, static: true }, { propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, static: true }, { propertyName: "datePickerEl", first: true, predicate: ["datePicker"], descendants: true }], ngImport: i0, template: "<div class=\"form-group calendar\" [ngClass]=\"customClass\" [class.readonly]=\"readonly\" [class.disabled]=\"disabled\" #root\r\n (click)=\"openCalendar()\">\r\n <label class=\"inp-label\" [ngClass]=\"{'required' : required}\" *ngIf=\"title\">{{ title }}</label>\r\n <input type=\"text\" #inputEl [placeholder]=\"placeholder\" [formControl]=\"inputControl\" class=\"form-control\"\r\n [ngClass]=\"{ 'is-invalid': error }\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" [readonly]=\"readonly\"\r\n (click)=\"openCalendar(); $event.stopPropagation()\" (keydown)=\"onInputKeydown($event)\" />\r\n\r\n <span class=\"focus-border\" *ngIf=\"deFocus\"></span>\r\n @if(!inputLoader) {\r\n <span class=\"calendar-icon\">\r\n <i class=\"he\" [ngClass]=\"!timeOnly ? 'he-calendar-blank' : 'he-clock'\"></i>\r\n </span>\r\n }\r\n\r\n @if(!inputLoader &&((selectedDate || rangeStart) && !disabled && !readonly) && clearVal) {\r\n <label class=\"clear\" (click)=\"clearDate($event)\">\r\n <i class=\"he he-close\"></i>\r\n </label>\r\n }\r\n\r\n @if(inputLoader) {\r\n <label class=\"loader input-loader\"></label>\r\n }\r\n @if(error) {\r\n <div class=\"val-msg\">{{ errorMessage }}</div>\r\n }\r\n\r\n <div class=\"datepicker-group\" #datePicker *ngIf=\"isOpen\" (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- time picker -->\r\n <ng-container *ngIf=\"timeOnly\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{ ((selectedHour % 12) || 12) | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">\r\n {{ selectedHour | number:'2.0' }}\r\n </div>\r\n </ng-template>\r\n\r\n <button (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <div class=\"time-value\">{{ selectedMinute | number:'2.0' }}</div>\r\n <button (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- day view (single / week modes) -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'day' && selectionMode !== 'range'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevMonth()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToMonthView()\">\r\n <div>{{ displayMonthName }}</div>\r\n <div>{{ displayYear }}</div>\r\n </div>\r\n <button class=\"calendar-arrow\" (click)=\"nextMonth()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"week-header\">\r\n <div>Sun</div>\r\n <div>Mon</div>\r\n <div>Tue</div>\r\n <div>Wed</div>\r\n <div>Thu</div>\r\n <div>Fri</div>\r\n <div>Sat</div>\r\n </div>\r\n <div class=\"days-grid\" [class.week-mode]=\"selectionMode === 'week'\">\r\n <div class=\"day-cell\" *ngFor=\"let cell of daysInMonth; trackBy: trackByDate\" (click)=\"selectDay(cell)\"\r\n (mouseenter)=\"onDayHover(cell)\" (mouseleave)=\"onDayLeave()\"\r\n [class.other-month]=\"cell.otherMonth\"\r\n [class.disabled]=\"cell.disabled\"\r\n [class.selected]=\"cell.selected\"\r\n [class.week-hover]=\"isInHoverWeek(cell.date)\"\r\n [class.today]=\"cell.today\">\r\n {{ cell.day }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showTime\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{\r\n selectedHour % 12 === 0\r\n ? 12\r\n : selectedHour % 12\r\n | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">{{ selectedHour | number:'2.0' }}</div>\r\n </ng-template>\r\n <button type=\"button\" (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <div class=\"time-value\">\r\n {{ selectedMinute < 10 ? '0' +selectedMinute : selectedMinute }} </div>\r\n <button type=\"button\" (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- day view (range mode) -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'day' && selectionMode === 'range'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevMonth()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToMonthView()\">\r\n <div>{{ displayMonthName }}</div>\r\n <div>{{ displayYear }}</div>\r\n </div>\r\n <button class=\"calendar-arrow\" (click)=\"nextMonth()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"week-header\">\r\n <div>Sun</div>\r\n <div>Mon</div>\r\n <div>Tue</div>\r\n <div>Wed</div>\r\n <div>Thu</div>\r\n <div>Fri</div>\r\n <div>Sat</div>\r\n </div>\r\n <div class=\"days-grid range-mode\">\r\n <div class=\"day-cell\" *ngFor=\"let cell of daysInMonth; trackBy: trackByDate\" (click)=\"selectDay(cell)\"\r\n (mouseenter)=\"onDayHover(cell)\" (mouseleave)=\"onDayLeave()\"\r\n [class.other-month]=\"cell.otherMonth\"\r\n [class.disabled]=\"cell.disabled\"\r\n [class.selected]=\"cell.selected\"\r\n [class.range-start]=\"cell.isRangeStart\"\r\n [class.range-end]=\"cell.isRangeEnd\"\r\n [class.in-range]=\"cell.isInRange\"\r\n [class.range-hover]=\"cell.isInHoverRange\"\r\n [class.today]=\"cell.today\">\r\n {{ cell.day }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- month view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'month'\">\r\n <div class=\"header\" *ngIf=\"viewMode !== 'month'\">\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear - 1\"><i\r\n class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToYearRangeView()\">{{ displayYear }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear + 1\"><i\r\n class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"month-grid\">\r\n <div class=\"month-cell\" *ngFor=\"let m of months; index as i\" (click)=\"selectMonth(i)\"\r\n [class.selected]=\"isMonthSelected(i)\" [class.today]=\"isMonthCurrent(i)\">{{ m }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- year range view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'yearRange'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevYearRange()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\">{{ yearRange[0] }} ~ {{ yearRange[yearRangeSize-1] }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"nextYearRange()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"year-grid\">\r\n <div class=\"year-cell\" *ngFor=\"let y of yearRange\" (click)=\"selectYear(y)\"\r\n [class.selected]=\"isYearSelected(y)\" [class.today]=\"isYearCurrent(y)\">{{ y }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n</div>", styles: [".form-group.calendar{position:relative}.form-group.calendar .datepicker-group{left:0;width:100%;z-index:1000;padding:.5rem;color:#495057;min-width:240px;max-width:260px;border-radius:3px;background:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.form-group.calendar .datepicker-group .header{display:flex;font-weight:600;padding:5px;align-items:center;justify-content:space-between;border-bottom:1px solid #dee2e6}.form-group.calendar .datepicker-group .header .title{gap:8px;display:flex;font-size:15px;cursor:pointer;font-weight:600}.form-group.calendar .datepicker-group .header .calendar-arrow{width:28px;height:28px;border:none;line-height:1;cursor:pointer;background:none}.form-group.calendar .datepicker-group .header .calendar-arrow i{font-size:14px}.form-group.calendar .datepicker-group .header .calendar-arrow:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .week-header{display:grid;padding:8px 0;font-size:13px;font-weight:700;text-align:center;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid,.form-group.calendar .datepicker-group .month-grid,.form-group.calendar .datepicker-group .year-grid{gap:3px;padding:5px;display:grid;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{display:flex;font-size:14px;cursor:pointer;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .days-grid .day-cell.today,.form-group.calendar .datepicker-group .days-grid .month-cell.today,.form-group.calendar .datepicker-group .days-grid .year-cell.today,.form-group.calendar .datepicker-group .month-grid .day-cell.today,.form-group.calendar .datepicker-group .month-grid .month-cell.today,.form-group.calendar .datepicker-group .month-grid .year-cell.today,.form-group.calendar .datepicker-group .year-grid .day-cell.today,.form-group.calendar .datepicker-group .year-grid .month-cell.today,.form-group.calendar .datepicker-group .year-grid .year-cell.today{color:#37c0b3;font-weight:700;border:1px solid #37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.selected,.form-group.calendar .datepicker-group .days-grid .day-cell:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.selected,.form-group.calendar .datepicker-group .days-grid .month-cell:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.selected,.form-group.calendar .datepicker-group .days-grid .year-cell:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.selected,.form-group.calendar .datepicker-group .month-grid .day-cell:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.selected,.form-group.calendar .datepicker-group .month-grid .month-cell:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.selected,.form-group.calendar .datepicker-group .month-grid .year-cell:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.selected,.form-group.calendar .datepicker-group .year-grid .day-cell:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.selected,.form-group.calendar .datepicker-group .year-grid .month-cell:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.selected,.form-group.calendar .datepicker-group .year-grid .year-cell:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled{color:#e0e0e0;background:none;-webkit-user-select:none;user-select:none;cursor:not-allowed}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today{color:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled:hover{color:#e0e0e0;background:transparent}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .day-cell{padding:5px 2px;border-radius:50%}.form-group.calendar .datepicker-group .days-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .month-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .year-grid .day-cell.other-month:not(.selected):not(:hover){color:#c5c5c5}.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{padding:8px 2px;border-radius:3px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell{border-radius:4px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell.week-hover:not(.selected){color:#0d6f7d;background:#e6f5f3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell{border-radius:0}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start{border-radius:50% 0 0 50%;color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-end{border-radius:0 50% 50% 0;color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start.range-end{border-radius:50%}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.in-range:not(.range-start):not(.range-end){background:#e6f5f3;color:#0d6f7d}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-hover:not(.in-range):not(.range-start):not(.range-end):not(.selected){background:#f0faf9;color:#0d6f7d}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.selected:not(.range-start):not(.range-end):not(.in-range){color:#fff;background:#37c0b3;border-radius:50%}.form-group.calendar .datepicker-group .month-grid{grid-template-columns:repeat(3,1fr)}.form-group.calendar .datepicker-group .year-grid{grid-template-columns:repeat(4,1fr)}.form-group.calendar .datepicker-group .time-picker{display:flex;-webkit-user-select:none;user-select:none;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle{gap:6px;display:flex;margin-left:1rem;flex-direction:column;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button{cursor:pointer;padding:3px 8px;font-size:.75rem;background:#fff;border:1px solid #cccccc}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button.active{color:#fff;border-color:#37c0b3;background-color:#37c0b3}.form-group.calendar .datepicker-group .time-picker .time-select{display:flex;margin:0 .75rem;align-items:center;flex-direction:column}.form-group.calendar .datepicker-group .time-picker .time-select button{border:none;cursor:pointer;padding:4px 8px;background:transparent}.form-group.calendar .datepicker-group .time-picker .time-select button i{font-size:1rem}.form-group.calendar .datepicker-group .time-picker .time-select button:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .time-picker .time-select .time-value{width:2rem;font-size:1rem;text-align:center;margin:2px 3px 4px}.form-group.calendar .datepicker-group .time-picker .time-separator{line-height:1;font-size:1rem}.form-group.calendar .clear{right:35px}.form-group.calendar.group-sm .clear{top:7px;right:35px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
1770
1722
  }
1771
1723
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: CalendarControl, decorators: [{
1772
1724
  type: Component,
@@ -1781,7 +1733,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
1781
1733
  useExisting: forwardRef(() => CalendarControl),
1782
1734
  multi: true,
1783
1735
  },
1784
- ], template: "<div class=\"form-group calendar\" [ngClass]=\"customClass\" [class.readonly]=\"readonly\" [class.disabled]=\"disabled\" #root\r\n (click)=\"openCalendar()\">\r\n <label class=\"inp-label\" [ngClass]=\"{'required' : required}\" *ngIf=\"title\">{{ title }}</label>\r\n <input type=\"text\" #inputEl [placeholder]=\"placeholder\" [formControl]=\"inputControl\" class=\"form-control\"\r\n [ngClass]=\"{ 'is-invalid': error }\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" [readonly]=\"readonly\"\r\n (click)=\"openCalendar(); $event.stopPropagation()\" (keydown)=\"onInputKeydown($event)\" />\r\n\r\n <span class=\"focus-border\" *ngIf=\"deFocus\"></span>\r\n @if(!inputLoader) {\r\n <span class=\"calendar-icon\">\r\n <i class=\"he\" [ngClass]=\"!timeOnly ? 'he-calendar-blank' : 'he-clock'\"></i>\r\n </span>\r\n }\r\n\r\n @if(!inputLoader &&(selectedDate && !disabled && !readonly) && clearVal) {\r\n <label class=\"clear\" (click)=\"clearDate($event)\">\r\n <i class=\"he he-close\"></i>\r\n </label>\r\n }\r\n\r\n @if(inputLoader) {\r\n <label class=\"loader input-loader\"></label>\r\n }\r\n @if(error) {\r\n <div class=\"val-msg\">{{ errorMessage }}</div>\r\n }\r\n\r\n <div class=\"datepicker-group\" #datePicker *ngIf=\"isOpen\" (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- time picker -->\r\n <ng-container *ngIf=\"timeOnly\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{ ((selectedHour % 12) || 12) | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">\r\n {{ selectedHour | number:'2.0' }}\r\n </div>\r\n </ng-template>\r\n\r\n <button (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <div class=\"time-value\">{{ selectedMinute | number:'2.0' }}</div>\r\n <button (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- day view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'day'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevMonth()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToMonthView()\">\r\n <div>{{ displayMonthName }}</div>\r\n <div>{{ displayYear }}</div>\r\n </div>\r\n <button class=\"calendar-arrow\" (click)=\"nextMonth()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"week-header\">\r\n <div>Sun</div>\r\n <div>Mon</div>\r\n <div>Tue</div>\r\n <div>Wed</div>\r\n <div>Thu</div>\r\n <div>Fri</div>\r\n <div>Sat</div>\r\n </div>\r\n <div class=\"days-grid\" [class.week-mode]=\"isWeekLikeMode\"\r\n [class.range-mode]=\"selectionMode === 'range'\" (mouseleave)=\"onDayLeave()\">\r\n <div class=\"day-cell\" *ngFor=\"let cell of daysInMonth; trackBy: trackByDate\" (click)=\"selectDay(cell)\"\r\n (mouseenter)=\"onDayHover(cell)\" (mouseleave)=\"onDayLeave()\"\r\n [class.other-month]=\"cell.otherMonth\"\r\n [class.disabled]=\"cell.disabled\"\r\n [class.selected]=\"cell.selected\"\r\n [class.week-hover]=\"isInHoverWeek(cell.date)\"\r\n [class.range-start]=\"isRangeStart(cell.date)\"\r\n [class.range-end]=\"isRangeEnd(cell.date)\"\r\n [class.in-range]=\"isInSelectedRange(cell.date)\"\r\n [class.range-hover]=\"isInHoverRange(cell.date)\"\r\n [class.today]=\"cell.today\">\r\n {{ cell.day }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showTime\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{\r\n selectedHour % 12 === 0\r\n ? 12\r\n : selectedHour % 12\r\n | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">{{ selectedHour | number:'2.0' }}</div>\r\n </ng-template>\r\n <button type=\"button\" (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <div class=\"time-value\">\r\n {{ selectedMinute < 10 ? '0' +selectedMinute : selectedMinute }} </div>\r\n <button type=\"button\" (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- month view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'month'\">\r\n <div class=\"header\" *ngIf=\"viewMode !== 'month'\">\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear - 1\"><i\r\n class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToYearRangeView()\">{{ displayYear }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear + 1\"><i\r\n class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"month-grid\">\r\n <div class=\"month-cell\" *ngFor=\"let m of months; index as i\" (click)=\"selectMonth(i)\"\r\n [class.selected]=\"isMonthSelected(i)\" [class.today]=\"isMonthCurrent(i)\">{{ m }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- year range view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'yearRange'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevYearRange()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\">{{ yearRange[0] }} ~ {{ yearRange[yearRangeSize-1] }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"nextYearRange()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"year-grid\">\r\n <div class=\"year-cell\" *ngFor=\"let y of yearRange\" (click)=\"selectYear(y)\"\r\n [class.selected]=\"isYearSelected(y)\" [class.today]=\"isYearCurrent(y)\">{{ y }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n</div>", styles: [".form-group.calendar{position:relative}.form-group.calendar .datepicker-group{left:0;width:100%;z-index:1000;padding:.5rem;color:#495057;min-width:240px;max-width:260px;border-radius:3px;background:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.form-group.calendar .datepicker-group .header{display:flex;font-weight:600;padding:5px;align-items:center;justify-content:space-between;border-bottom:1px solid #dee2e6}.form-group.calendar .datepicker-group .header .title{gap:8px;display:flex;font-size:15px;cursor:pointer;font-weight:600}.form-group.calendar .datepicker-group .header .calendar-arrow{width:28px;height:28px;border:none;line-height:1;cursor:pointer;background:none}.form-group.calendar .datepicker-group .header .calendar-arrow i{font-size:14px}.form-group.calendar .datepicker-group .header .calendar-arrow:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .week-header{display:grid;padding:8px 0;font-size:13px;font-weight:700;text-align:center;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid,.form-group.calendar .datepicker-group .month-grid,.form-group.calendar .datepicker-group .year-grid{gap:3px;padding:5px;display:grid;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{display:flex;font-size:14px;cursor:pointer;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .days-grid .day-cell.today,.form-group.calendar .datepicker-group .days-grid .month-cell.today,.form-group.calendar .datepicker-group .days-grid .year-cell.today,.form-group.calendar .datepicker-group .month-grid .day-cell.today,.form-group.calendar .datepicker-group .month-grid .month-cell.today,.form-group.calendar .datepicker-group .month-grid .year-cell.today,.form-group.calendar .datepicker-group .year-grid .day-cell.today,.form-group.calendar .datepicker-group .year-grid .month-cell.today,.form-group.calendar .datepicker-group .year-grid .year-cell.today{color:#37c0b3;font-weight:700;border:1px solid #37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.selected,.form-group.calendar .datepicker-group .days-grid .day-cell:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.selected,.form-group.calendar .datepicker-group .days-grid .month-cell:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.selected,.form-group.calendar .datepicker-group .days-grid .year-cell:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.selected,.form-group.calendar .datepicker-group .month-grid .day-cell:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.selected,.form-group.calendar .datepicker-group .month-grid .month-cell:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.selected,.form-group.calendar .datepicker-group .month-grid .year-cell:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.selected,.form-group.calendar .datepicker-group .year-grid .day-cell:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.selected,.form-group.calendar .datepicker-group .year-grid .month-cell:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.selected,.form-group.calendar .datepicker-group .year-grid .year-cell:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled{color:#e0e0e0;background:none;-webkit-user-select:none;user-select:none;cursor:not-allowed}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today{color:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled:hover{color:#e0e0e0;background:transparent}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .day-cell{padding:5px 2px;border-radius:50%}.form-group.calendar .datepicker-group .days-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .month-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .year-grid .day-cell.other-month:not(.selected):not(:hover){color:#c5c5c5}.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{padding:8px 2px;border-radius:3px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell{border-radius:4px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell.week-hover:not(.selected){color:#0d6f7d;background:#e6f5f3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell{border-radius:4px}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.in-range:not(.range-start):not(.range-end),.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-hover:not(.range-start):not(.range-end){color:#0d6f7d;background:#e6f5f3;border-radius:0}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.other-month.in-range:not(.range-start):not(.range-end),.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.other-month.range-hover:not(.range-start):not(.range-end){color:#0d6f7d}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start,.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-end,.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.selected{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start:not(.range-end){border-radius:4px 0 0 4px}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-end:not(.range-start){border-radius:0 4px 4px 0}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell:hover:not(.disabled):not(.range-start):not(.range-end){color:#0d6f7d;background:#e6f5f3}.form-group.calendar .datepicker-group .month-grid{grid-template-columns:repeat(3,1fr)}.form-group.calendar .datepicker-group .year-grid{grid-template-columns:repeat(4,1fr)}.form-group.calendar .datepicker-group .time-picker{display:flex;-webkit-user-select:none;user-select:none;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle{gap:6px;display:flex;margin-left:1rem;flex-direction:column;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button{cursor:pointer;padding:3px 8px;font-size:.75rem;background:#fff;border:1px solid #cccccc}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button.active{color:#fff;border-color:#37c0b3;background-color:#37c0b3}.form-group.calendar .datepicker-group .time-picker .time-select{display:flex;margin:0 .75rem;align-items:center;flex-direction:column}.form-group.calendar .datepicker-group .time-picker .time-select button{border:none;cursor:pointer;padding:4px 8px;background:transparent}.form-group.calendar .datepicker-group .time-picker .time-select button i{font-size:1rem}.form-group.calendar .datepicker-group .time-picker .time-select button:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .time-picker .time-select .time-value{width:2rem;font-size:1rem;text-align:center;margin:2px 3px 4px}.form-group.calendar .datepicker-group .time-picker .time-separator{line-height:1;font-size:1rem}.form-group.calendar .clear{right:35px}.form-group.calendar.group-sm .clear{top:7px;right:35px}\n"] }]
1736
+ ], template: "<div class=\"form-group calendar\" [ngClass]=\"customClass\" [class.readonly]=\"readonly\" [class.disabled]=\"disabled\" #root\r\n (click)=\"openCalendar()\">\r\n <label class=\"inp-label\" [ngClass]=\"{'required' : required}\" *ngIf=\"title\">{{ title }}</label>\r\n <input type=\"text\" #inputEl [placeholder]=\"placeholder\" [formControl]=\"inputControl\" class=\"form-control\"\r\n [ngClass]=\"{ 'is-invalid': error }\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" [readonly]=\"readonly\"\r\n (click)=\"openCalendar(); $event.stopPropagation()\" (keydown)=\"onInputKeydown($event)\" />\r\n\r\n <span class=\"focus-border\" *ngIf=\"deFocus\"></span>\r\n @if(!inputLoader) {\r\n <span class=\"calendar-icon\">\r\n <i class=\"he\" [ngClass]=\"!timeOnly ? 'he-calendar-blank' : 'he-clock'\"></i>\r\n </span>\r\n }\r\n\r\n @if(!inputLoader &&((selectedDate || rangeStart) && !disabled && !readonly) && clearVal) {\r\n <label class=\"clear\" (click)=\"clearDate($event)\">\r\n <i class=\"he he-close\"></i>\r\n </label>\r\n }\r\n\r\n @if(inputLoader) {\r\n <label class=\"loader input-loader\"></label>\r\n }\r\n @if(error) {\r\n <div class=\"val-msg\">{{ errorMessage }}</div>\r\n }\r\n\r\n <div class=\"datepicker-group\" #datePicker *ngIf=\"isOpen\" (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- time picker -->\r\n <ng-container *ngIf=\"timeOnly\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{ ((selectedHour % 12) || 12) | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">\r\n {{ selectedHour | number:'2.0' }}\r\n </div>\r\n </ng-template>\r\n\r\n <button (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <div class=\"time-value\">{{ selectedMinute | number:'2.0' }}</div>\r\n <button (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- day view (single / week modes) -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'day' && selectionMode !== 'range'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevMonth()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToMonthView()\">\r\n <div>{{ displayMonthName }}</div>\r\n <div>{{ displayYear }}</div>\r\n </div>\r\n <button class=\"calendar-arrow\" (click)=\"nextMonth()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"week-header\">\r\n <div>Sun</div>\r\n <div>Mon</div>\r\n <div>Tue</div>\r\n <div>Wed</div>\r\n <div>Thu</div>\r\n <div>Fri</div>\r\n <div>Sat</div>\r\n </div>\r\n <div class=\"days-grid\" [class.week-mode]=\"selectionMode === 'week'\">\r\n <div class=\"day-cell\" *ngFor=\"let cell of daysInMonth; trackBy: trackByDate\" (click)=\"selectDay(cell)\"\r\n (mouseenter)=\"onDayHover(cell)\" (mouseleave)=\"onDayLeave()\"\r\n [class.other-month]=\"cell.otherMonth\"\r\n [class.disabled]=\"cell.disabled\"\r\n [class.selected]=\"cell.selected\"\r\n [class.week-hover]=\"isInHoverWeek(cell.date)\"\r\n [class.today]=\"cell.today\">\r\n {{ cell.day }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showTime\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{\r\n selectedHour % 12 === 0\r\n ? 12\r\n : selectedHour % 12\r\n | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">{{ selectedHour | number:'2.0' }}</div>\r\n </ng-template>\r\n <button type=\"button\" (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <div class=\"time-value\">\r\n {{ selectedMinute < 10 ? '0' +selectedMinute : selectedMinute }} </div>\r\n <button type=\"button\" (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- day view (range mode) -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'day' && selectionMode === 'range'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevMonth()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToMonthView()\">\r\n <div>{{ displayMonthName }}</div>\r\n <div>{{ displayYear }}</div>\r\n </div>\r\n <button class=\"calendar-arrow\" (click)=\"nextMonth()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"week-header\">\r\n <div>Sun</div>\r\n <div>Mon</div>\r\n <div>Tue</div>\r\n <div>Wed</div>\r\n <div>Thu</div>\r\n <div>Fri</div>\r\n <div>Sat</div>\r\n </div>\r\n <div class=\"days-grid range-mode\">\r\n <div class=\"day-cell\" *ngFor=\"let cell of daysInMonth; trackBy: trackByDate\" (click)=\"selectDay(cell)\"\r\n (mouseenter)=\"onDayHover(cell)\" (mouseleave)=\"onDayLeave()\"\r\n [class.other-month]=\"cell.otherMonth\"\r\n [class.disabled]=\"cell.disabled\"\r\n [class.selected]=\"cell.selected\"\r\n [class.range-start]=\"cell.isRangeStart\"\r\n [class.range-end]=\"cell.isRangeEnd\"\r\n [class.in-range]=\"cell.isInRange\"\r\n [class.range-hover]=\"cell.isInHoverRange\"\r\n [class.today]=\"cell.today\">\r\n {{ cell.day }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- month view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'month'\">\r\n <div class=\"header\" *ngIf=\"viewMode !== 'month'\">\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear - 1\"><i\r\n class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToYearRangeView()\">{{ displayYear }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear + 1\"><i\r\n class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"month-grid\">\r\n <div class=\"month-cell\" *ngFor=\"let m of months; index as i\" (click)=\"selectMonth(i)\"\r\n [class.selected]=\"isMonthSelected(i)\" [class.today]=\"isMonthCurrent(i)\">{{ m }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- year range view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'yearRange'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevYearRange()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\">{{ yearRange[0] }} ~ {{ yearRange[yearRangeSize-1] }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"nextYearRange()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"year-grid\">\r\n <div class=\"year-cell\" *ngFor=\"let y of yearRange\" (click)=\"selectYear(y)\"\r\n [class.selected]=\"isYearSelected(y)\" [class.today]=\"isYearCurrent(y)\">{{ y }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n</div>", styles: [".form-group.calendar{position:relative}.form-group.calendar .datepicker-group{left:0;width:100%;z-index:1000;padding:.5rem;color:#495057;min-width:240px;max-width:260px;border-radius:3px;background:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.form-group.calendar .datepicker-group .header{display:flex;font-weight:600;padding:5px;align-items:center;justify-content:space-between;border-bottom:1px solid #dee2e6}.form-group.calendar .datepicker-group .header .title{gap:8px;display:flex;font-size:15px;cursor:pointer;font-weight:600}.form-group.calendar .datepicker-group .header .calendar-arrow{width:28px;height:28px;border:none;line-height:1;cursor:pointer;background:none}.form-group.calendar .datepicker-group .header .calendar-arrow i{font-size:14px}.form-group.calendar .datepicker-group .header .calendar-arrow:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .week-header{display:grid;padding:8px 0;font-size:13px;font-weight:700;text-align:center;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid,.form-group.calendar .datepicker-group .month-grid,.form-group.calendar .datepicker-group .year-grid{gap:3px;padding:5px;display:grid;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{display:flex;font-size:14px;cursor:pointer;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .days-grid .day-cell.today,.form-group.calendar .datepicker-group .days-grid .month-cell.today,.form-group.calendar .datepicker-group .days-grid .year-cell.today,.form-group.calendar .datepicker-group .month-grid .day-cell.today,.form-group.calendar .datepicker-group .month-grid .month-cell.today,.form-group.calendar .datepicker-group .month-grid .year-cell.today,.form-group.calendar .datepicker-group .year-grid .day-cell.today,.form-group.calendar .datepicker-group .year-grid .month-cell.today,.form-group.calendar .datepicker-group .year-grid .year-cell.today{color:#37c0b3;font-weight:700;border:1px solid #37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.selected,.form-group.calendar .datepicker-group .days-grid .day-cell:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.selected,.form-group.calendar .datepicker-group .days-grid .month-cell:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.selected,.form-group.calendar .datepicker-group .days-grid .year-cell:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.selected,.form-group.calendar .datepicker-group .month-grid .day-cell:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.selected,.form-group.calendar .datepicker-group .month-grid .month-cell:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.selected,.form-group.calendar .datepicker-group .month-grid .year-cell:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.selected,.form-group.calendar .datepicker-group .year-grid .day-cell:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.selected,.form-group.calendar .datepicker-group .year-grid .month-cell:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.selected,.form-group.calendar .datepicker-group .year-grid .year-cell:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled{color:#e0e0e0;background:none;-webkit-user-select:none;user-select:none;cursor:not-allowed}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today{color:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled:hover{color:#e0e0e0;background:transparent}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .day-cell{padding:5px 2px;border-radius:50%}.form-group.calendar .datepicker-group .days-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .month-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .year-grid .day-cell.other-month:not(.selected):not(:hover){color:#c5c5c5}.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{padding:8px 2px;border-radius:3px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell{border-radius:4px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell.week-hover:not(.selected){color:#0d6f7d;background:#e6f5f3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell{border-radius:0}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start{border-radius:50% 0 0 50%;color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-end{border-radius:0 50% 50% 0;color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start.range-end{border-radius:50%}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.in-range:not(.range-start):not(.range-end){background:#e6f5f3;color:#0d6f7d}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-hover:not(.in-range):not(.range-start):not(.range-end):not(.selected){background:#f0faf9;color:#0d6f7d}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.selected:not(.range-start):not(.range-end):not(.in-range){color:#fff;background:#37c0b3;border-radius:50%}.form-group.calendar .datepicker-group .month-grid{grid-template-columns:repeat(3,1fr)}.form-group.calendar .datepicker-group .year-grid{grid-template-columns:repeat(4,1fr)}.form-group.calendar .datepicker-group .time-picker{display:flex;-webkit-user-select:none;user-select:none;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle{gap:6px;display:flex;margin-left:1rem;flex-direction:column;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button{cursor:pointer;padding:3px 8px;font-size:.75rem;background:#fff;border:1px solid #cccccc}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button.active{color:#fff;border-color:#37c0b3;background-color:#37c0b3}.form-group.calendar .datepicker-group .time-picker .time-select{display:flex;margin:0 .75rem;align-items:center;flex-direction:column}.form-group.calendar .datepicker-group .time-picker .time-select button{border:none;cursor:pointer;padding:4px 8px;background:transparent}.form-group.calendar .datepicker-group .time-picker .time-select button i{font-size:1rem}.form-group.calendar .datepicker-group .time-picker .time-select button:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .time-picker .time-select .time-value{width:2rem;font-size:1rem;text-align:center;margin:2px 3px 4px}.form-group.calendar .datepicker-group .time-picker .time-separator{line-height:1;font-size:1rem}.form-group.calendar .clear{right:35px}.form-group.calendar.group-sm .clear{top:7px;right:35px}\n"] }]
1785
1737
  }], ctorParameters: () => [{ type: i1.DatePipe }], propDecorators: { title: [{
1786
1738
  type: Input
1787
1739
  }], required: [{
@@ -2702,6 +2654,8 @@ class MultiselectControl {
2702
2654
  });
2703
2655
  // Initialize filteredOptions to match all options
2704
2656
  this.filteredOptions = [...this.options];
2657
+ // Sync the input display in case selectedItems was set before init
2658
+ this._updateSelectedItemList();
2705
2659
  }
2706
2660
  ngAfterViewChecked() {
2707
2661
  if (this.isDropdownOpen && !this.dropdownInitialized) {
@@ -3011,6 +2965,9 @@ class MultiselectControl {
3011
2965
  .map((item) => item[this.optionDisplayProperty])
3012
2966
  .join(", ");
3013
2967
  }
2968
+ // Sync the form control value so the input displays the selected items
2969
+ // (formControl binding overrides [value], so we must set it explicitly)
2970
+ this.inputControl.setValue(this.selectedItemList, { emitEvent: false });
3014
2971
  }
3015
2972
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: MultiselectControl, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
3016
2973
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: MultiselectControl, isStandalone: true, selector: "multiselect-control", inputs: { title: "title", selectedItems: "selectedItems", required: "required", placeholder: "placeholder", customClass: "customClass", clearVal: "clearVal", deFocus: "deFocus", optionValueProperty: "optionValueProperty", inputLoader: "inputLoader", error: "error", errorMessage: "errorMessage", autocomplete: "autocomplete", showSearch: "showSearch", optionDisplayProperty: "optionDisplayProperty", options: "options", readonly: "readonly", disabled: "disabled" }, outputs: { optionsSelected: "optionsSelected", selectionCleared: "selectionCleared", blurEvent: "blurEvent" }, host: { listeners: { "window:keydown": "handleWindowKeydown($event)" } }, providers: [