@brickclay-org/ui 0.1.88 → 0.1.90

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.
@@ -4028,7 +4028,7 @@ class BkCustomCalendar {
4028
4028
  useExisting: forwardRef(() => BkCustomCalendar),
4029
4029
  multi: true,
4030
4030
  },
4031
- ], viewQueries: [{ propertyName: "inputWrapper", first: true, predicate: ["inputWrapper"], descendants: true }, { propertyName: "calendarPopupRef", first: true, predicate: ["calendarPopup"], descendants: true }, { propertyName: "calendarOverlay", first: true, predicate: ["calendarOverlay"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"calendar-container relative\" [class.open]=\"show\" [class.inline-mode]=\"inline\" [class.disabled]=\"disabled\">\r\n <!-- Input field + its CDK overlay share one *ngIf=\"!inline\" scope so the origin's template ref\r\n (#calendarOrigin) is visible to the overlay template below \u2014 a ref declared inside one *ngIf\r\n embedded view isn't visible from a different (even identically-conditioned) *ngIf. -->\r\n <ng-container *ngIf=\"!inline\">\r\n <div #inputWrapper cdkOverlayOrigin #calendarOrigin=\"cdkOverlayOrigin\" class=\"input-wrapper\">\r\n <input\r\n type=\"text\"\r\n (mousedown)=\"onTriggerMouseDown($event)\"\r\n (focus)=\"onTriggerFocus()\"\r\n (keydown.enter)=\"onTriggerKeydownOpen($event)\"\r\n (keydown.space)=\"onTriggerKeydownOpen($event)\"\r\n (keydown.arrowDown)=\"onTriggerKeydownOpen($event)\"\r\n (blur)=\"onTriggerBlur()\"\r\n readonly\r\n [value]=\"getDisplayValue()\"\r\n [placeholder]=\"placeholder\"\r\n [attr.disabled]=\"disabled ? true : null\"\r\n [class.hasError]=\"hasError\"\r\n class=\"calendar-input\">\r\n <!-- *ngIf=\"!getDisplayValue()\" -->\r\n\r\n <span class=\"calendar-icon\" >\r\n <img alt=\"calendar\" class=\"calendar-icon-img\" [src]='brickclayIcons.calenderIcon'/>\r\n </span>\r\n <button type=\"button\" class=\"clear-btn\" *ngIf=\"getDisplayValue() && isDisplayCrossIcon && !disabled\" (click)=\"clear(); $event.stopPropagation()\" title=\"Clear\">\u00D7</button>\r\n </div>\r\n\r\n <!-- Positioned via Angular CDK Overlay, portalled into the shared cdk-overlay-container so it\r\n escapes clipping/stacking inside dialogs and scroll containers regardless of the old\r\n appendToBody flag (see its @deprecated note in the component). -->\r\n <ng-template\r\n cdkConnectedOverlay\r\n #calendarOverlay=\"cdkConnectedOverlay\"\r\n [cdkConnectedOverlayOrigin]=\"calendarOrigin\"\r\n [cdkConnectedOverlayOpen]=\"show\"\r\n [cdkConnectedOverlayPositions]=\"calendarPositions\"\r\n [cdkConnectedOverlayPush]=\"true\"\r\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\r\n [cdkConnectedOverlayPanelClass]=\"panelClass\"\r\n [cdkConnectedOverlayFlexibleDimensions]=\"false\"\r\n (positionChange)=\"onPositionChange($event)\"\r\n (overlayOutsideClick)=\"onOverlayOutsideClick()\"\r\n (detach)=\"close()\">\r\n <div #calendarPopup\r\n class=\"calendar-popup\"\r\n tabindex=\"0\"\r\n (keydown)=\"onCalendarPopupKeydown($event)\"\r\n (wheel)=\"onCalendarPopupWheel($event)\"\r\n [ngClass]=\"{\r\n 'drop-up': popupPlacementAbove,\r\n 'has-ranges': showRanges && customRanges,\r\n 'dual-calendar-mode': dualCalendar,\r\n 'compact': compact\r\n }\">\r\n <ng-container *ngTemplateOutlet=\"popupContent\"></ng-container>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Popup content \u2014 written once, projected into whichever render path below is active -->\r\n <ng-template #popupContent>\r\n <!-- RANGES: date-range shortcuts don't apply once selection is restricted to a month/year. -->\r\n <div class=\"ranges\" *ngIf=\"showRanges && customRanges && pickerView === 'day'\" role=\"listbox\" aria-label=\"Date ranges\">\r\n <button\r\n type=\"button\"\r\n *ngFor=\"let rangeKey of rangeOrder\"\r\n (click)=\"chooseRange(rangeKey)\"\r\n (keydown)=\"onRangeButtonKeydown($event, rangeKey)\"\r\n [class.active]=\"activeRange === rangeKey\"\r\n [class.custom-range]=\"rangeKey === 'Custom Range'\"\r\n class=\"range-btn\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"activeRange === rangeKey\">\r\n {{ rangeKey }}\r\n </button>\r\n </div>\r\n<div class=\"\" [ngClass]=\"showRanges && pickerView === 'day' ? 'w-100 flex-grow-1 border-l border-[#eee]' : ''\">\r\n\r\n\r\n <!-- SINGLE CALENDAR -->\r\n <div *ngIf=\"!dualCalendar\" class=\"calendar-wrapper\">\r\n\r\n <!-- DAY GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"view === 'days'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevYear()\" [disabled]=\"isPrevYearDisabled(year)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <button class=\"nav-btn\" type=\"button\" (click)=\"prevMonth()\" title=\"Prev month\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openMonthView()\" [disabled]=\"disabled\">{{ getMonthName(month) }}</button>\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openYearView()\" [disabled]=\"disabled\">{{ year }}</button>\r\n </span>\r\n <button class=\"nav-btn\" type=\"button\" (click)=\"nextMonth()\" title=\"Next month\">\r\n <img alt=\"next\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextYear()\" [disabled]=\"isNextYearDisabled(year)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- MONTH GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"view === 'months'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevMonthGridYear()\" [disabled]=\"isPrevYearDisabled(year)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openYearView()\" [disabled]=\"disabled\">{{ year }}</button>\r\n </span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextMonthGridYear()\" [disabled]=\"isNextYearDisabled(year)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- YEAR GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"view === 'years'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevYearRange()\" title=\"Prev years\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">{{ yearRangeStart }} - {{ yearRangeStart + 11 }}</span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextYearRange()\" title=\"Next years\">\r\n <img alt=\"next\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <table class=\"calendar-table\" *ngIf=\"view === 'days'\" role=\"grid\" [attr.aria-label]=\"getMonthName(month) + ' ' + year\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of calendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(year, month, dayObj.day) && selectDate(dayObj.day)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(year, month, dayObj.day) && onDateHover(dayObj.day, false)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(year, month, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(year, month, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(year, month, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(year, month, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(year, month, dayObj.day)\"\r\n [class.calendar-day-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(year, month, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- MONTH GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"view === 'months'\">\r\n <div class=\"bk-month-grid\" role=\"listbox\" [attr.aria-label]=\"'Select month for ' + year\">\r\n <button\r\n *ngFor=\"let m of monthNamesShort; let i = index\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"i === month\"\r\n [class.active]=\"i === month\"\r\n [class.current]=\"isCurrentMonth(i, year)\"\r\n [disabled]=\"isMonthDisabled(i, year)\"\r\n (click)=\"selectMonthFromGrid(i)\"\r\n class=\"bk-month-cell\">\r\n {{ m }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- YEAR GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"view === 'years'\">\r\n <div class=\"bk-year-grid\" role=\"listbox\" aria-label=\"Select year\">\r\n <button\r\n *ngFor=\"let y of getYearGridYears(yearRangeStart)\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"y === year\"\r\n [class.active]=\"y === year\"\r\n [class.current]=\"isCurrentYear(y)\"\r\n [disabled]=\"isYearDisabled(y)\"\r\n (click)=\"selectYearFromGrid(y)\"\r\n class=\"bk-year-cell\">\r\n {{ y }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- Single Calendar Time Picker -->\r\n <div *ngIf=\"enableTimepicker && view === 'days'\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"single-time\"\r\n [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"singleTimeModel\"\r\n (ngModelChange)=\"onSingleTimePickerChange($event); singleTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('single-time')\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- DUAL CALENDAR -->\r\n <div class=\"dual-calendar\" *ngIf=\"dualCalendar\">\r\n <!-- LEFT CALENDAR -->\r\n <div class=\"calendar-left\">\r\n <div class=\"header\" *ngIf=\"leftView === 'days'\">\r\n <button (click)=\"prevLeftYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isPrevYearDisabled(leftYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <button (click)=\"prevLeftMonth()\" class=\"nav-btn\" type=\"button\" title=\"Prev month\">\r\n <img alt=\"arrow-left\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openLeftMonthView()\" [disabled]=\"disabled\">{{ getMonthName(leftMonth) }}</button>\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openLeftYearView()\" [disabled]=\"disabled\">{{ leftYear }}</button>\r\n </span>\r\n <button (click)=\"nextLeftMonth()\" class=\"nav-btn\" type=\"button\" title=\"Next month\">\r\n <img alt=\"arrow-right\" class=\"arrow-right\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n <button (click)=\"nextLeftYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isNextYearDisabled(leftYear)\" title=\"Next year\">\r\n <img alt=\"next year\" class=\"arrow-right\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- MONTH GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"leftView === 'months'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevLeftMonthGridYear()\" [disabled]=\"isPrevYearDisabled(leftYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openLeftYearView()\" [disabled]=\"disabled\">{{ leftYear }}</button>\r\n </span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextLeftMonthGridYear()\" [disabled]=\"isNextYearDisabled(leftYear)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- YEAR GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"leftView === 'years'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevLeftYearRange()\" title=\"Prev years\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">{{ leftYearRangeStart }} - {{ leftYearRangeStart + 11 }}</span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextLeftYearRange()\" title=\"Next years\">\r\n <img alt=\"next\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <table class=\"calendar-table\" *ngIf=\"leftView === 'days'\" role=\"grid\" [attr.aria-label]=\"getMonthName(leftMonth) + ' ' + leftYear\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of leftCalendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(leftYear, leftMonth, dayObj.day) && selectDate(dayObj.day, false)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(leftYear, leftMonth, dayObj.day) && onDateHover(dayObj.day, false)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(leftYear, leftMonth, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(leftYear, leftMonth, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(leftYear, leftMonth, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(leftYear, leftMonth, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(leftYear, leftMonth, dayObj.day)\"\r\n [class.calendar-day-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(leftYear, leftMonth, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- MONTH GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"leftView === 'months'\">\r\n <div class=\"bk-month-grid\" role=\"listbox\" [attr.aria-label]=\"'Select month for ' + leftYear\">\r\n <button\r\n *ngFor=\"let m of monthNamesShort; let i = index\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"i === leftMonth\"\r\n [class.active]=\"i === leftMonth\"\r\n [class.current]=\"isCurrentMonth(i, leftYear)\"\r\n [disabled]=\"isMonthDisabled(i, leftYear)\"\r\n (click)=\"selectLeftMonthFromGrid(i)\"\r\n class=\"bk-month-cell\">\r\n {{ m }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToLeftToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- YEAR GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"leftView === 'years'\">\r\n <div class=\"bk-year-grid\" role=\"listbox\" aria-label=\"Select year\">\r\n <button\r\n *ngFor=\"let y of getYearGridYears(leftYearRangeStart)\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"y === leftYear\"\r\n [class.active]=\"y === leftYear\"\r\n [class.current]=\"isCurrentYear(y)\"\r\n [disabled]=\"isYearDisabled(y)\"\r\n (click)=\"selectLeftYearFromGrid(y)\"\r\n class=\"bk-year-cell\">\r\n {{ y }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToLeftToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- Start Time Picker for Dual Calendar -->\r\n <div *ngIf=\"enableTimepicker && leftView === 'days'\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">Start Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"dual-start\"\r\n [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"startTimeModel\"\r\n (ngModelChange)=\"onDualTimePickerChange($event, true); startTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('dual-start')\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- RIGHT CALENDAR -->\r\n <div class=\"calendar-right\">\r\n <div class=\"header\" *ngIf=\"rightView === 'days'\">\r\n <button (click)=\"prevRightYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isPrevYearDisabled(rightYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <button (click)=\"prevRightMonth()\" class=\"nav-btn\" type=\"button\" title=\"Prev month\">\r\n <img alt=\"arrow-left\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openRightMonthView()\" [disabled]=\"disabled\">{{ getMonthName(rightMonth) }}</button>\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openRightYearView()\" [disabled]=\"disabled\">{{ rightYear }}</button>\r\n </span>\r\n <button (click)=\"nextRightMonth()\" class=\"nav-btn\" type=\"button\" title=\"Next month\">\r\n <img alt=\"arrow-right\" class=\"arrow-right\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n <button (click)=\"nextRightYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isNextYearDisabled(rightYear)\" title=\"Next year\">\r\n <img alt=\"next year\" class=\"arrow-right\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- MONTH GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"rightView === 'months'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevRightMonthGridYear()\" [disabled]=\"isPrevYearDisabled(rightYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openRightYearView()\" [disabled]=\"disabled\">{{ rightYear }}</button>\r\n </span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextRightMonthGridYear()\" [disabled]=\"isNextYearDisabled(rightYear)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- YEAR GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"rightView === 'years'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevRightYearRange()\" title=\"Prev years\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">{{ rightYearRangeStart }} - {{ rightYearRangeStart + 11 }}</span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextRightYearRange()\" title=\"Next years\">\r\n <img alt=\"next\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <table class=\"calendar-table\" *ngIf=\"rightView === 'days'\" role=\"grid\" [attr.aria-label]=\"getMonthName(rightMonth) + ' ' + rightYear\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of rightCalendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(rightYear, rightMonth, dayObj.day) && selectDate(dayObj.day, true)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(rightYear, rightMonth, dayObj.day) && onDateHover(dayObj.day, true)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(rightYear, rightMonth, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(rightYear, rightMonth, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(rightYear, rightMonth, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(rightYear, rightMonth, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(rightYear, rightMonth, dayObj.day)\"\r\n [class.calendar-day-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(rightYear, rightMonth, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- MONTH GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"rightView === 'months'\">\r\n <div class=\"bk-month-grid\" role=\"listbox\" [attr.aria-label]=\"'Select month for ' + rightYear\">\r\n <button\r\n *ngFor=\"let m of monthNamesShort; let i = index\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"i === rightMonth\"\r\n [class.active]=\"i === rightMonth\"\r\n [class.current]=\"isCurrentMonth(i, rightYear)\"\r\n [disabled]=\"isMonthDisabled(i, rightYear)\"\r\n (click)=\"selectRightMonthFromGrid(i)\"\r\n class=\"bk-month-cell\">\r\n {{ m }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToRightToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- YEAR GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"rightView === 'years'\">\r\n <div class=\"bk-year-grid\" role=\"listbox\" aria-label=\"Select year\">\r\n <button\r\n *ngFor=\"let y of getYearGridYears(rightYearRangeStart)\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"y === rightYear\"\r\n [class.active]=\"y === rightYear\"\r\n [class.current]=\"isCurrentYear(y)\"\r\n [disabled]=\"isYearDisabled(y)\"\r\n (click)=\"selectRightYearFromGrid(y)\"\r\n class=\"bk-year-cell\">\r\n {{ y }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToRightToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- End Time Picker for Dual Calendar -->\r\n <div *ngIf=\"enableTimepicker && rightView === 'days'\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">End Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"dual-end\"\r\n [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"endTimeModel\"\r\n (ngModelChange)=\"onDualTimePickerChange($event, false); endTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('dual-end')\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- FOOTER: month/year-only selection commits on click (like autoApply) \u2014 no Apply/Cancel to show. -->\r\n <div class=\"footer\" *ngIf=\"!inline && showCancelApply && pickerView === 'day'\">\r\n <button *ngIf=\"showCancel\" (click)=\"cancel()\" class=\"btn-cancel\" type=\"button\">Cancel</button>\r\n <button (click)=\"apply()\" class=\"btn-apply\" type=\"button\" [disabled]=\"disabled || isDualRangeApplyBlocked\">Apply</button>\r\n </div>\r\n\r\n </div>\r\n\r\n </ng-template>\r\n\r\n <!-- INLINE: rendered directly in normal flow, no overlay -->\r\n <div #calendarPopup\r\n *ngIf=\"inline\"\r\n class=\"calendar-popup inline-calendar\"\r\n tabindex=\"0\"\r\n (keydown)=\"onCalendarPopupKeydown($event)\"\r\n [ngClass]=\"{\r\n 'has-ranges': showRanges && customRanges,\r\n 'dual-calendar-mode': dualCalendar,\r\n 'compact': compact\r\n }\">\r\n <ng-container *ngTemplateOutlet=\"popupContent\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n@if (hasError){\r\n<p class=\"calender-error\">{{errorMessage}}</p>\r\n}\r\n", styles: [".calendar-container,.calendar-container *{font-family:Inter,sans-serif!important}.calendar-container{position:relative;display:inline-block;width:100%}.input-wrapper{position:relative;display:flex;align-items:center}.calendar-input{width:100%;padding:9px 14px 9px 40px;border:1px solid #ddd;border-radius:8px;font-size:14px;cursor:pointer;background:#fff;transition:all .2s}.calendar-input:hover{border-color:#999}.calendar-input:focus{outline:none;border-color:#999}.calendar-icon{position:absolute;left:12px;pointer-events:none;font-size:18px}.clear-btn{position:absolute;right:9px;background:none;border:none;font-size:20px;color:#999;cursor:pointer;padding:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;line-height:1;transition:color .2s;top:8px}.clear-btn:hover{color:#333}.calendar-popup{width:320px;background:#fff;border-radius:12px;box-shadow:0 10px 40px #00000026;z-index:1000;animation:slideDown .2s ease-out;font-family:Inter,sans-serif;scrollbar-width:thin;scrollbar-color:#c1c1c1 transparent}.calendar-popup::-webkit-scrollbar{width:6px}.calendar-popup::-webkit-scrollbar-track{background:transparent}.calendar-popup::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:3px}.calendar-popup::-webkit-scrollbar-thumb:hover{background:#a8a8a8}.calendar-popup:focus-visible{outline:0!important}.calendar-popup.inline-calendar{position:relative;top:0;left:0;width:100%;margin-top:0;animation:none;box-shadow:0 2px 8px #0000001a}.calendar-container.inline-mode{display:block;width:100%}.calendar-popup.dual-calendar-mode{width:600px}.calendar-popup.dual-calendar-mode.has-ranges{width:730px}.calendar-popup.has-ranges{width:450px}.calendar-popup.drop-up{animation:slideUp .2s ease-out}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.ranges{display:flex;flex-direction:column;gap:4px;margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid #eee;min-width:150px;padding-right:8px;scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}.range-btn{padding:7px 10px;border:1px solid transparent;background:transparent;border-radius:4px;cursor:pointer;text-align:left;font-size:14px;transition:all .2s;color:#838383;font-weight:500}.range-btn:hover{background:#f5f5f5;color:#000}.range-btn.active{background:#f0f0f0;color:#000;font-weight:500}.calendar-wrapper{padding:0 12px 12px}.header{display:flex;justify-content:space-between;align-items:center;padding:12px 0;min-height:54px;box-sizing:border-box}.month-year{font-size:15px;font-weight:500;color:#333;flex:1;display:flex;align-items:center;justify-content:center;text-align:center;text-transform:capitalize}.bk-month-year-btn{@apply bg-transparent border-0 rounded py-1 px-1 cursor-pointer transition-all duration-200;font:inherit;color:inherit;text-transform:inherit}.bk-month-year-btn:hover:not(:disabled){@apply text-black;}.bk-month-year-btn:disabled{@apply cursor-not-allowed text-[#ccc] opacity-50;}.nav-btn{background:none;border:none;font-size:24px;cursor:pointer;padding:11.5px 14px;color:#666;border-radius:4px;transition:all .2s;line-height:1;height:30px;width:30px;display:flex;justify-content:center;align-items:center}.nav-btn:hover{background:#f0f0f0;color:#000}.nav-btn img{max-width:none!important}.nav-btn:disabled{cursor:not-allowed;opacity:.35;pointer-events:none}.bk-grid-picker{@apply flex flex-col box-border h-[256px];}.bk-month-grid,.bk-year-grid{@apply grid grid-cols-3 auto-rows-min shrink-0 gap-[18px];}.bk-today-btn{@apply shrink-0 w-full p-2 mt-2 border border-[#eee] rounded-md bg-transparent text-[#333] text-[13px] font-medium cursor-pointer transition-all duration-200;}.bk-today-btn:hover:not(:disabled){@apply bg-[#efefef] text-black;}.bk-today-btn:disabled{@apply text-[#ddd] cursor-not-allowed opacity-50;}.bk-month-cell,.bk-year-cell{@apply flex items-center justify-center py-2.5 px-1 text-[13px] font-medium text-[#333] bg-transparent border-0 rounded-md cursor-pointer text-center transition-all duration-200;}.bk-month-cell:hover:not(:disabled):not(.active):not(.current),.bk-year-cell:hover:not(:disabled):not(.active):not(.current){@apply bg-[#efefef] text-black;}.bk-month-cell.active,.bk-year-cell.active{@apply bg-black text-white font-semibold;}.bk-month-cell.current:not(.active),.bk-year-cell.current:not(.active){@apply bg-[#e5e4e4] font-semibold;}.bk-month-cell:disabled,.bk-year-cell:disabled{@apply text-[#ddd] cursor-not-allowed opacity-50;}.calendar-table{width:100%;border-collapse:collapse;text-align:center}.weekday-header{font-size:12px;color:#7e7e7e;font-weight:600;padding:8px 4px;letter-spacing:.3px}.calendar-day{padding:8px 4px;font-size:14px;cursor:pointer;border-radius:6px;transition:all .2s;position:relative;color:#333;font-weight:500;line-height:1.5}.calendar-day:hover:not(.disabled):not(.other-month){background:#efefef;color:#000}.calendar-day.other-month{color:#ccc;cursor:default}.calendar-day.disabled{color:#ddd;cursor:not-allowed;opacity:.5}.calendar-day.active{background:#000!important;color:#fff!important;font-weight:600}.calendar-day.today{font-weight:600}.calendar-day.today:not(.active){background:#e5e4e4}.calendar-day.active:hover{background:#000!important}.calendar-day.today.disabled,.bk-month-cell.current:disabled,.bk-year-cell.current:disabled{color:#a9a9a9}.calendar-day.in-range{background:#f5f5f5;color:#333;border-radius:0;position:relative}.calendar-day.in-range:hover{background:#e8e8e8}.calendar-day.in-range:before{content:\"\";position:absolute;inset:0;background:#f5f5f5;z-index:-1}.calendar-day.in-range:hover:before{background:#e8e8e8}.calendar-day.multi-selected{background:#4caf50;color:#fff;font-weight:600;border-radius:6px}.calendar-day.multi-selected:hover{background:#45a049}.dual-calendar{display:flex;width:100%}.calendar-left,.calendar-right{flex:1;min-width:0;padding:0 12px 12px}.calendar-popup.has-ranges{display:flex;flex-direction:row}.calendar-popup.has-ranges .ranges{margin-bottom:0;border-bottom:none;padding:10px}.calendar-popup.has-ranges .dual-calendar,.calendar-popup.has-ranges .calendar-wrapper{flex:1}.calendar-right .header{justify-content:space-between}.calendar-right .header .month-year{text-align:center;flex:1}.timepicker-section{margin-top:12px;padding-top:12px;border-top:1px solid #eee}.timepicker-label{font-size:12px;font-weight:500;color:#000;margin-bottom:4px;letter-spacing:-.28px}.custom-time-picker{display:flex;flex-direction:column;gap:8px;align-items:start}.time-input-group{display:flex;align-items:center;justify-content:center;gap:8px;background:#f8f9fa;padding:12px;border-radius:8px;border:1px solid #e0e0e0}.time-control{display:flex;flex-direction:column;align-items:center}.time-btn{background:#fff;border:1px solid #ddd;width:28px;height:20px;cursor:pointer;font-size:10px;color:#666;border-radius:4px;transition:all .2s;display:flex;align-items:center;justify-content:center;padding:0;line-height:1}.time-btn:hover{background:#e4e4e4;color:#fff;border-color:#e4e4e4}.time-btn.up{border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom:none}.time-btn.down{border-top-left-radius:0;border-top-right-radius:0;border-top:none}.time-input{width:40px;height:32px;text-align:center;border:1px solid #ddd;border-radius:4px;font-size:16px;font-weight:600;background:#fff;color:#333}.time-separator{font-size:18px;font-weight:600;color:#666;margin:0 2px}.ampm-control{display:flex;flex-direction:column;gap:4px;margin-left:8px}.ampm-btn{padding:6px 12px;border:1px solid #ddd;background:#fff;border-radius:4px;cursor:pointer;font-size:12px;font-weight:600;color:#666;transition:all .2s;min-width:45px}.ampm-btn:hover{background:#f0f0f0}.ampm-btn.active{background:#000;color:#fff;border-color:#000}.html5-time-input{margin-top:8px;padding:8px;border:1px solid #ddd;border-radius:6px;font-size:14px;width:100%;max-width:120px}.footer{padding:12px;display:flex;justify-content:flex-end;gap:8px;border-top:1px solid #eee}.btn-cancel,.btn-apply{padding:8px 16px;border:none;border-radius:4px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s;min-width:80px}.btn-cancel{background:#fff;color:#666;border:1px solid #ddd}.btn-apply{background:#000;color:#fff}.btn-apply:active{transform:translateY(0)}@media (max-width: 576px){.calendar-popup.dual-calendar-mode{max-width:300px}}@media (max-width: 768px){.dual-calendar{flex-direction:column}}@media (min-width: 577px) and (max-width: 1024px){.calendar-popup.dual-calendar-mode{max-width:500px}}@media (max-width: 1024px){.calendar-popup{width:100%;max-width:320px;max-height:300px;overflow:auto}.calendar-popup.dual-calendar-mode{width:100%;max-width:100%}.calendar-popup.has-ranges{flex-direction:column}.calendar-popup.has-ranges .ranges{border-right:none;border-bottom:1px solid #eee;padding-right:0;margin-right:0;padding-bottom:16px;margin-bottom:16px}.time-input-group{flex-wrap:wrap;justify-content:center}}.ranges::-webkit-scrollbar{width:6px}.ranges::-webkit-scrollbar-track{background:#f1f1f1;border-radius:3px}.ranges::-webkit-scrollbar-thumb{background:#888;border-radius:3px}.ranges::-webkit-scrollbar-thumb:hover{background:#555}.w-100{width:100%}.flex-grow-1{flex-grow:1}.calendar-input.calendar-input-has-error{@apply border-[#d11e14];}.calendar-input:disabled{cursor:not-allowed;border-color:#e3e3e7;background-color:#f4f4f6;color:#a1a3ae}.btn-apply:disabled{cursor:not-allowed!important;opacity:.7}.calendar-day.calendar-day-keyboard-focus:not(.disabled):not(.other-month){outline:0px solid #000}.calendar-popup.compact{width:240px}.calendar-popup.compact.has-ranges{width:380px}.calendar-popup.compact.dual-calendar-mode{width:480px}.calendar-popup.compact.dual-calendar-mode.has-ranges{width:600px}.calendar-popup.compact .header{padding:8px 0;min-height:40px}.calendar-popup.compact .month-year{font-size:13px}.calendar-popup.compact .nav-btn{height:24px;width:24px;padding:6px 8px}.calendar-popup.compact .calendar-wrapper,.calendar-popup.compact .calendar-left,.calendar-popup.compact .calendar-right{padding:0 8px 8px}.calendar-popup.compact .weekday-header{font-size:11px;padding:4px 2px}.calendar-popup.compact .calendar-day{font-size:12px;padding:5px 2px;line-height:1.3}.calendar-popup.compact .ranges{min-width:120px;gap:2px;margin-bottom:8px;padding-bottom:8px}.calendar-popup.compact.has-ranges .ranges{padding:6px}.calendar-popup.compact .range-btn{font-size:12px;padding:5px 8px}.calendar-popup.compact .timepicker-section{margin-top:8px;padding-top:8px}.calendar-popup.compact .timepicker-label{font-size:11px}.calendar-popup.compact .footer{padding:8px;gap:6px}.calendar-popup.compact .btn-cancel,.calendar-popup.compact .btn-apply{font-size:11px;padding:6px 12px;min-width:64px}.calendar-popup.compact .bk-month-year-btn{@apply text-[13px] py-px px-1;}.calendar-popup.compact .nav-btn img{width:12px;height:8px}.calendar-popup.compact .bk-nav-btn-year img{width:12px;height:12px}.calendar-popup.compact .bk-grid-picker{@apply h-[178px];@apply justify-center;}.calendar-popup.compact .bk-month-grid,.calendar-popup.compact .bk-year-grid{@apply gap-1;}.calendar-popup.compact .bk-month-cell,.calendar-popup.compact .bk-year-cell{@apply text-[11px] py-1.5 px-0.5;}.calendar-popup.compact .bk-today-btn{@apply text-[11px] p-[5px];}\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: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: BkTimePicker, selector: "bk-time-picker", inputs: ["required", "value", "label", "placeholder", "clearable", "position", "variation", "pickerId", "closePicker", "timeFormat", "showSeconds", "autoPosition", "appendToBody", "viewportMargin", "panelClass", "disabled"], outputs: ["change", "timeChange", "pickerOpened", "pickerClosed"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i2.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i2.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }] });
4031
+ ], viewQueries: [{ propertyName: "inputWrapper", first: true, predicate: ["inputWrapper"], descendants: true }, { propertyName: "calendarPopupRef", first: true, predicate: ["calendarPopup"], descendants: true }, { propertyName: "calendarOverlay", first: true, predicate: ["calendarOverlay"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"calendar-container relative\" [class.open]=\"show\" [class.inline-mode]=\"inline\" [class.disabled]=\"disabled\">\r\n <!-- Input field + its CDK overlay share one *ngIf=\"!inline\" scope so the origin's template ref\r\n (#calendarOrigin) is visible to the overlay template below \u2014 a ref declared inside one *ngIf\r\n embedded view isn't visible from a different (even identically-conditioned) *ngIf. -->\r\n <ng-container *ngIf=\"!inline\">\r\n <div #inputWrapper cdkOverlayOrigin #calendarOrigin=\"cdkOverlayOrigin\" class=\"input-wrapper\">\r\n <input\r\n type=\"text\"\r\n (mousedown)=\"onTriggerMouseDown($event)\"\r\n (focus)=\"onTriggerFocus()\"\r\n (keydown.enter)=\"onTriggerKeydownOpen($event)\"\r\n (keydown.space)=\"onTriggerKeydownOpen($event)\"\r\n (keydown.arrowDown)=\"onTriggerKeydownOpen($event)\"\r\n (blur)=\"onTriggerBlur()\"\r\n readonly\r\n [value]=\"getDisplayValue()\"\r\n [placeholder]=\"placeholder\"\r\n [attr.disabled]=\"disabled ? true : null\"\r\n [class.hasError]=\"hasError\"\r\n class=\"calendar-input\">\r\n <!-- *ngIf=\"!getDisplayValue()\" -->\r\n\r\n <span class=\"calendar-icon\" >\r\n <img alt=\"calendar\" class=\"calendar-icon-img\" [src]='brickclayIcons.calenderIcon'/>\r\n </span>\r\n <button type=\"button\" class=\"clear-btn\" *ngIf=\"getDisplayValue() && isDisplayCrossIcon && !disabled\" (click)=\"clear(); $event.stopPropagation()\" title=\"Clear\">\u00D7</button>\r\n </div>\r\n\r\n <!-- Positioned via Angular CDK Overlay, portalled into the shared cdk-overlay-container so it\r\n escapes clipping/stacking inside dialogs and scroll containers regardless of the old\r\n appendToBody flag (see its @deprecated note in the component). -->\r\n <ng-template\r\n cdkConnectedOverlay\r\n #calendarOverlay=\"cdkConnectedOverlay\"\r\n [cdkConnectedOverlayOrigin]=\"calendarOrigin\"\r\n [cdkConnectedOverlayOpen]=\"show\"\r\n [cdkConnectedOverlayPositions]=\"calendarPositions\"\r\n [cdkConnectedOverlayPush]=\"true\"\r\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\r\n [cdkConnectedOverlayPanelClass]=\"panelClass\"\r\n [cdkConnectedOverlayFlexibleDimensions]=\"false\"\r\n (positionChange)=\"onPositionChange($event)\"\r\n (overlayOutsideClick)=\"onOverlayOutsideClick()\"\r\n (detach)=\"close()\">\r\n <div #calendarPopup\r\n class=\"calendar-popup\"\r\n tabindex=\"0\"\r\n (keydown)=\"onCalendarPopupKeydown($event)\"\r\n (wheel)=\"onCalendarPopupWheel($event)\"\r\n [ngClass]=\"{\r\n 'drop-up': popupPlacementAbove,\r\n 'has-ranges': showRanges && customRanges,\r\n 'dual-calendar-mode': dualCalendar,\r\n 'compact': compact\r\n }\">\r\n <ng-container *ngTemplateOutlet=\"popupContent\"></ng-container>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Popup content \u2014 written once, projected into whichever render path below is active -->\r\n <ng-template #popupContent>\r\n <!-- RANGES: date-range shortcuts don't apply once selection is restricted to a month/year. -->\r\n <div class=\"ranges\" *ngIf=\"showRanges && customRanges && pickerView === 'day'\" role=\"listbox\" aria-label=\"Date ranges\">\r\n <button\r\n type=\"button\"\r\n *ngFor=\"let rangeKey of rangeOrder\"\r\n (click)=\"chooseRange(rangeKey)\"\r\n (keydown)=\"onRangeButtonKeydown($event, rangeKey)\"\r\n [class.active]=\"activeRange === rangeKey\"\r\n [class.custom-range]=\"rangeKey === 'Custom Range'\"\r\n class=\"range-btn\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"activeRange === rangeKey\">\r\n {{ rangeKey }}\r\n </button>\r\n </div>\r\n<div class=\"\" [ngClass]=\"showRanges && pickerView === 'day' ? 'w-100 flex-grow-1 border-l border-[#eee]' : ''\">\r\n\r\n\r\n <!-- SINGLE CALENDAR -->\r\n <div *ngIf=\"!dualCalendar\" class=\"calendar-wrapper\">\r\n\r\n <!-- DAY GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"view === 'days'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevYear()\" [disabled]=\"isPrevYearDisabled(year)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <button class=\"nav-btn\" type=\"button\" (click)=\"prevMonth()\" title=\"Prev month\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openMonthView()\" [disabled]=\"disabled\">{{ getMonthName(month) }}</button>\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openYearView()\" [disabled]=\"disabled\">{{ year }}</button>\r\n </span>\r\n <button class=\"nav-btn\" type=\"button\" (click)=\"nextMonth()\" title=\"Next month\">\r\n <img alt=\"next\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextYear()\" [disabled]=\"isNextYearDisabled(year)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- MONTH GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"view === 'months'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevMonthGridYear()\" [disabled]=\"isPrevYearDisabled(year)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openYearView()\" [disabled]=\"disabled\">{{ year }}</button>\r\n </span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextMonthGridYear()\" [disabled]=\"isNextYearDisabled(year)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- YEAR GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"view === 'years'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevYearRange()\" title=\"Prev years\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">{{ yearRangeStart }} - {{ yearRangeStart + 11 }}</span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextYearRange()\" title=\"Next years\">\r\n <img alt=\"next\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <table class=\"calendar-table\" *ngIf=\"view === 'days'\" role=\"grid\" [attr.aria-label]=\"getMonthName(month) + ' ' + year\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of calendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(year, month, dayObj.day) && selectDate(dayObj.day)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(year, month, dayObj.day) && onDateHover(dayObj.day, false)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(year, month, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(year, month, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(year, month, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(year, month, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(year, month, dayObj.day)\"\r\n [class.calendar-day-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(year, month, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- MONTH GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"view === 'months'\">\r\n <div class=\"bk-month-grid\" role=\"listbox\" [attr.aria-label]=\"'Select month for ' + year\">\r\n <button\r\n *ngFor=\"let m of monthNamesShort; let i = index\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"i === month\"\r\n [class.active]=\"i === month\"\r\n [class.current]=\"isCurrentMonth(i, year)\"\r\n [disabled]=\"isMonthDisabled(i, year)\"\r\n (click)=\"selectMonthFromGrid(i)\"\r\n class=\"bk-month-cell\">\r\n {{ m }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- YEAR GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"view === 'years'\">\r\n <div class=\"bk-year-grid\" role=\"listbox\" aria-label=\"Select year\">\r\n <button\r\n *ngFor=\"let y of getYearGridYears(yearRangeStart)\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"y === year\"\r\n [class.active]=\"y === year\"\r\n [class.current]=\"isCurrentYear(y)\"\r\n [disabled]=\"isYearDisabled(y)\"\r\n (click)=\"selectYearFromGrid(y)\"\r\n class=\"bk-year-cell\">\r\n {{ y }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- Single Calendar Time Picker -->\r\n <div *ngIf=\"enableTimepicker && view === 'days'\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"single-time\"\r\n [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"singleTimeModel\"\r\n (ngModelChange)=\"onSingleTimePickerChange($event); singleTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('single-time')\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- DUAL CALENDAR -->\r\n <div class=\"dual-calendar\" *ngIf=\"dualCalendar\">\r\n <!-- LEFT CALENDAR -->\r\n <div class=\"calendar-left\">\r\n <div class=\"header\" *ngIf=\"leftView === 'days'\">\r\n <button (click)=\"prevLeftYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isPrevYearDisabled(leftYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <button (click)=\"prevLeftMonth()\" class=\"nav-btn\" type=\"button\" title=\"Prev month\">\r\n <img alt=\"arrow-left\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openLeftMonthView()\" [disabled]=\"disabled\">{{ getMonthName(leftMonth) }}</button>\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openLeftYearView()\" [disabled]=\"disabled\">{{ leftYear }}</button>\r\n </span>\r\n <button (click)=\"nextLeftMonth()\" class=\"nav-btn\" type=\"button\" title=\"Next month\">\r\n <img alt=\"arrow-right\" class=\"arrow-right\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n <button (click)=\"nextLeftYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isNextYearDisabled(leftYear)\" title=\"Next year\">\r\n <img alt=\"next year\" class=\"arrow-right\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- MONTH GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"leftView === 'months'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevLeftMonthGridYear()\" [disabled]=\"isPrevYearDisabled(leftYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openLeftYearView()\" [disabled]=\"disabled\">{{ leftYear }}</button>\r\n </span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextLeftMonthGridYear()\" [disabled]=\"isNextYearDisabled(leftYear)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- YEAR GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"leftView === 'years'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevLeftYearRange()\" title=\"Prev years\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">{{ leftYearRangeStart }} - {{ leftYearRangeStart + 11 }}</span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextLeftYearRange()\" title=\"Next years\">\r\n <img alt=\"next\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <table class=\"calendar-table\" *ngIf=\"leftView === 'days'\" role=\"grid\" [attr.aria-label]=\"getMonthName(leftMonth) + ' ' + leftYear\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of leftCalendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(leftYear, leftMonth, dayObj.day) && selectDate(dayObj.day, false)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(leftYear, leftMonth, dayObj.day) && onDateHover(dayObj.day, false)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(leftYear, leftMonth, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(leftYear, leftMonth, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(leftYear, leftMonth, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(leftYear, leftMonth, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(leftYear, leftMonth, dayObj.day)\"\r\n [class.calendar-day-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(leftYear, leftMonth, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- MONTH GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"leftView === 'months'\">\r\n <div class=\"bk-month-grid\" role=\"listbox\" [attr.aria-label]=\"'Select month for ' + leftYear\">\r\n <button\r\n *ngFor=\"let m of monthNamesShort; let i = index\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"i === leftMonth\"\r\n [class.active]=\"i === leftMonth\"\r\n [class.current]=\"isCurrentMonth(i, leftYear)\"\r\n [disabled]=\"isMonthDisabled(i, leftYear)\"\r\n (click)=\"selectLeftMonthFromGrid(i)\"\r\n class=\"bk-month-cell\">\r\n {{ m }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToLeftToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- YEAR GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"leftView === 'years'\">\r\n <div class=\"bk-year-grid\" role=\"listbox\" aria-label=\"Select year\">\r\n <button\r\n *ngFor=\"let y of getYearGridYears(leftYearRangeStart)\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"y === leftYear\"\r\n [class.active]=\"y === leftYear\"\r\n [class.current]=\"isCurrentYear(y)\"\r\n [disabled]=\"isYearDisabled(y)\"\r\n (click)=\"selectLeftYearFromGrid(y)\"\r\n class=\"bk-year-cell\">\r\n {{ y }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToLeftToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- Start Time Picker for Dual Calendar -->\r\n <div *ngIf=\"enableTimepicker && leftView === 'days'\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">Start Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"dual-start\"\r\n [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"startTimeModel\"\r\n (ngModelChange)=\"onDualTimePickerChange($event, true); startTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('dual-start')\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- RIGHT CALENDAR -->\r\n <div class=\"calendar-right\">\r\n <div class=\"header\" *ngIf=\"rightView === 'days'\">\r\n <button (click)=\"prevRightYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isPrevYearDisabled(rightYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <button (click)=\"prevRightMonth()\" class=\"nav-btn\" type=\"button\" title=\"Prev month\">\r\n <img alt=\"arrow-left\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openRightMonthView()\" [disabled]=\"disabled\">{{ getMonthName(rightMonth) }}</button>\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openRightYearView()\" [disabled]=\"disabled\">{{ rightYear }}</button>\r\n </span>\r\n <button (click)=\"nextRightMonth()\" class=\"nav-btn\" type=\"button\" title=\"Next month\">\r\n <img alt=\"arrow-right\" class=\"arrow-right\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n <button (click)=\"nextRightYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isNextYearDisabled(rightYear)\" title=\"Next year\">\r\n <img alt=\"next year\" class=\"arrow-right\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- MONTH GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"rightView === 'months'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevRightMonthGridYear()\" [disabled]=\"isPrevYearDisabled(rightYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openRightYearView()\" [disabled]=\"disabled\">{{ rightYear }}</button>\r\n </span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextRightMonthGridYear()\" [disabled]=\"isNextYearDisabled(rightYear)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- YEAR GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"rightView === 'years'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevRightYearRange()\" title=\"Prev years\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">{{ rightYearRangeStart }} - {{ rightYearRangeStart + 11 }}</span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextRightYearRange()\" title=\"Next years\">\r\n <img alt=\"next\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <table class=\"calendar-table\" *ngIf=\"rightView === 'days'\" role=\"grid\" [attr.aria-label]=\"getMonthName(rightMonth) + ' ' + rightYear\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of rightCalendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(rightYear, rightMonth, dayObj.day) && selectDate(dayObj.day, true)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(rightYear, rightMonth, dayObj.day) && onDateHover(dayObj.day, true)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(rightYear, rightMonth, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(rightYear, rightMonth, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(rightYear, rightMonth, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(rightYear, rightMonth, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(rightYear, rightMonth, dayObj.day)\"\r\n [class.calendar-day-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(rightYear, rightMonth, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- MONTH GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"rightView === 'months'\">\r\n <div class=\"bk-month-grid\" role=\"listbox\" [attr.aria-label]=\"'Select month for ' + rightYear\">\r\n <button\r\n *ngFor=\"let m of monthNamesShort; let i = index\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"i === rightMonth\"\r\n [class.active]=\"i === rightMonth\"\r\n [class.current]=\"isCurrentMonth(i, rightYear)\"\r\n [disabled]=\"isMonthDisabled(i, rightYear)\"\r\n (click)=\"selectRightMonthFromGrid(i)\"\r\n class=\"bk-month-cell\">\r\n {{ m }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToRightToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- YEAR GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"rightView === 'years'\">\r\n <div class=\"bk-year-grid\" role=\"listbox\" aria-label=\"Select year\">\r\n <button\r\n *ngFor=\"let y of getYearGridYears(rightYearRangeStart)\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"y === rightYear\"\r\n [class.active]=\"y === rightYear\"\r\n [class.current]=\"isCurrentYear(y)\"\r\n [disabled]=\"isYearDisabled(y)\"\r\n (click)=\"selectRightYearFromGrid(y)\"\r\n class=\"bk-year-cell\">\r\n {{ y }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToRightToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- End Time Picker for Dual Calendar -->\r\n <div *ngIf=\"enableTimepicker && rightView === 'days'\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">End Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"dual-end\"\r\n [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"endTimeModel\"\r\n (ngModelChange)=\"onDualTimePickerChange($event, false); endTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('dual-end')\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- FOOTER: month/year-only selection commits on click (like autoApply) \u2014 no Apply/Cancel to show. -->\r\n <div class=\"footer\" *ngIf=\"!inline && showCancelApply && pickerView === 'day'\">\r\n <button *ngIf=\"showCancel\" (click)=\"cancel()\" class=\"btn-cancel\" type=\"button\">Cancel</button>\r\n <button (click)=\"apply()\" class=\"btn-apply\" type=\"button\" [disabled]=\"disabled || isDualRangeApplyBlocked\">Apply</button>\r\n </div>\r\n\r\n </div>\r\n\r\n </ng-template>\r\n\r\n <!-- INLINE: rendered directly in normal flow, no overlay -->\r\n <div #calendarPopup\r\n *ngIf=\"inline\"\r\n class=\"calendar-popup inline-calendar\"\r\n tabindex=\"0\"\r\n (keydown)=\"onCalendarPopupKeydown($event)\"\r\n [ngClass]=\"{\r\n 'has-ranges': showRanges && customRanges,\r\n 'dual-calendar-mode': dualCalendar,\r\n 'compact': compact\r\n }\">\r\n <ng-container *ngTemplateOutlet=\"popupContent\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n@if (hasError){\r\n<p class=\"calender-error\">{{errorMessage}}</p>\r\n}\r\n", styles: [".calendar-container,.calendar-container *{font-family:Inter,sans-serif!important}.calendar-container{position:relative;display:inline-block;width:100%}.input-wrapper{position:relative;display:flex;align-items:center}.calendar-input{width:100%;padding:9px 14px 9px 40px;border:1px solid #ddd;border-radius:8px;font-size:14px;cursor:pointer;background:#fff;transition:all .2s}.calendar-input:hover{border-color:#999}.calendar-input:focus{outline:none;border-color:#999}.calendar-icon{position:absolute;left:12px;pointer-events:none;font-size:18px}.clear-btn{position:absolute;right:9px;background:none;border:none;font-size:20px;color:#999;cursor:pointer;padding:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;line-height:1;transition:color .2s;top:8px}.clear-btn:hover{color:#333}.calendar-popup{width:320px;background:#fff;border-radius:12px;box-shadow:0 10px 40px #00000026;z-index:1000;animation:slideDown .2s ease-out;font-family:Inter,sans-serif;scrollbar-width:thin;scrollbar-color:#c1c1c1 transparent}.calendar-popup::-webkit-scrollbar{width:6px}.calendar-popup::-webkit-scrollbar-track{background:transparent}.calendar-popup::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:3px}.calendar-popup::-webkit-scrollbar-thumb:hover{background:#a8a8a8}.calendar-popup:focus-visible{outline:0!important}.calendar-popup.inline-calendar{position:relative;top:0;left:0;width:100%;margin-top:0;animation:none;box-shadow:0 2px 8px #0000001a}.calendar-container.inline-mode{display:block;width:100%}.calendar-popup.dual-calendar-mode{width:600px}.calendar-popup.dual-calendar-mode.has-ranges{width:730px}.calendar-popup.has-ranges{width:450px}.calendar-popup.drop-up{animation:slideUp .2s ease-out}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.ranges{display:flex;flex-direction:column;gap:4px;margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid #eee;min-width:150px;padding-right:8px;scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}.range-btn{padding:7px 10px;border:1px solid transparent;background:transparent;border-radius:4px;cursor:pointer;text-align:left;font-size:14px;transition:all .2s;color:#838383;font-weight:500}.range-btn:hover{background:#f5f5f5;color:#000}.range-btn.active{background:#f0f0f0;color:#000;font-weight:500}.calendar-wrapper{padding:0 12px 12px}.header{display:flex;justify-content:space-between;align-items:center;padding:12px 0;min-height:54px;box-sizing:border-box}.month-year{font-size:15px;font-weight:500;color:#333;flex:1;display:flex;align-items:center;justify-content:center;text-align:center;text-transform:capitalize}.bk-month-year-btn{@apply bg-transparent border-0 rounded py-1 px-1 cursor-pointer transition-all duration-200;font:inherit;color:inherit;text-transform:inherit}.bk-month-year-btn:hover:not(:disabled){@apply text-black;}.bk-month-year-btn:disabled{@apply cursor-not-allowed text-[#ccc] opacity-50;}.nav-btn{background:none;border:none;font-size:24px;cursor:pointer;padding:11.5px 14px;color:#666;border-radius:4px;transition:all .2s;line-height:1;height:30px;width:30px;display:flex;justify-content:center;align-items:center}.nav-btn:hover{background:#f0f0f0;color:#000}.nav-btn img{max-width:none!important}.nav-btn:disabled{cursor:not-allowed;opacity:.35;pointer-events:none}.bk-grid-picker{@apply flex flex-col box-border h-[256px];}.bk-month-grid,.bk-year-grid{@apply grid grid-cols-3 auto-rows-min shrink-0 gap-[18px];}.bk-today-btn{@apply shrink-0 w-full p-2 mt-2 border border-[#eee] rounded-md bg-transparent text-[#333] text-[13px] font-medium cursor-pointer transition-all duration-200;}.bk-today-btn:hover:not(:disabled){@apply bg-[#efefef] text-black;}.bk-today-btn:disabled{@apply text-[#ddd] cursor-not-allowed opacity-50;}.bk-month-cell,.bk-year-cell{@apply flex items-center justify-center py-2.5 px-1 text-[13px] font-medium text-[#333] bg-transparent border-0 rounded-md cursor-pointer text-center transition-all duration-200;}.bk-month-cell:hover:not(:disabled):not(.active):not(.current),.bk-year-cell:hover:not(:disabled):not(.active):not(.current){@apply bg-[#efefef] text-black;}.bk-month-cell.active,.bk-year-cell.active{@apply bg-black text-white font-semibold;}.bk-month-cell.current:not(.active),.bk-year-cell.current:not(.active){@apply bg-[#e5e4e4] font-semibold;}.bk-month-cell:disabled,.bk-year-cell:disabled{@apply text-[#ddd] cursor-not-allowed opacity-50;}.calendar-table{width:100%;border-collapse:collapse;text-align:center}.weekday-header{font-size:12px;color:#7e7e7e;font-weight:600;padding:8px 4px;letter-spacing:.3px}.calendar-day{padding:8px 4px;font-size:14px;cursor:pointer;border-radius:6px;transition:all .2s;position:relative;color:#333;font-weight:500;line-height:1.5}.calendar-day:hover:not(.disabled):not(.other-month){background:#efefef;color:#000}.calendar-day.other-month{color:#ccc;cursor:default}.calendar-day.disabled{color:#ddd;cursor:not-allowed;opacity:.5}.calendar-day.active{background:#000!important;color:#fff!important;font-weight:600}.calendar-day.today{font-weight:600}.calendar-day.today:not(.active){background:#e5e4e4}.calendar-day.active:hover{background:#000!important}.calendar-day.today.disabled,.bk-month-cell.current:disabled,.bk-year-cell.current:disabled{color:#a9a9a9}.calendar-day.in-range{background:#f5f5f5;color:#333;border-radius:0;position:relative}.calendar-day.in-range:hover{background:#e8e8e8}.calendar-day.in-range:before{content:\"\";position:absolute;inset:0;background:#f5f5f5;z-index:-1}.calendar-day.in-range:hover:before{background:#e8e8e8}.calendar-day.multi-selected{background:#4caf50;color:#fff;font-weight:600;border-radius:6px}.calendar-day.multi-selected:hover{background:#45a049}.dual-calendar{display:flex;width:100%}.calendar-left,.calendar-right{flex:1;min-width:0;padding:0 12px 12px}.calendar-popup.has-ranges{display:flex;flex-direction:row}.calendar-popup.has-ranges .ranges{margin-bottom:0;border-bottom:none;padding:10px}.calendar-popup.has-ranges .dual-calendar,.calendar-popup.has-ranges .calendar-wrapper{flex:1}.calendar-right .header{justify-content:space-between}.calendar-right .header .month-year{text-align:center;flex:1}.timepicker-section{margin-top:12px;padding-top:12px;border-top:1px solid #eee}.timepicker-label{font-size:12px;font-weight:500;color:#000;margin-bottom:4px;letter-spacing:-.28px}.footer{padding:12px;display:flex;justify-content:flex-end;gap:8px;border-top:1px solid #eee}.btn-cancel,.btn-apply{padding:8px 16px;border:none;border-radius:4px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s;min-width:80px}.btn-cancel{background:#fff;color:#666;border:1px solid #ddd}.btn-apply{background:#000;color:#fff}.btn-apply:active{transform:translateY(0)}@media (max-width: 576px){.calendar-popup.dual-calendar-mode{max-width:300px}}@media (max-width: 768px){.dual-calendar{flex-direction:column}}@media (min-width: 577px) and (max-width: 1024px){.calendar-popup.dual-calendar-mode{max-width:500px}}@media (max-width: 1024px){.calendar-popup{width:100%;max-width:320px;max-height:300px;overflow:auto}.calendar-popup.dual-calendar-mode{width:100%;max-width:100%}.calendar-popup.has-ranges{flex-direction:column}.calendar-popup.has-ranges .ranges{border-right:none;border-bottom:1px solid #eee;padding-right:0;margin-right:0;padding-bottom:16px;margin-bottom:16px}}.ranges::-webkit-scrollbar{width:6px}.ranges::-webkit-scrollbar-track{background:#f1f1f1;border-radius:3px}.ranges::-webkit-scrollbar-thumb{background:#888;border-radius:3px}.ranges::-webkit-scrollbar-thumb:hover{background:#555}.w-100{width:100%}.flex-grow-1{flex-grow:1}.calendar-input.calendar-input-has-error{@apply border-[#d11e14];}.calendar-input:disabled{cursor:not-allowed;border-color:#e3e3e7;background-color:#f4f4f6;color:#a1a3ae}.btn-apply:disabled{cursor:not-allowed!important;opacity:.7}.calendar-day.calendar-day-keyboard-focus:not(.disabled):not(.other-month){outline:0px solid #000}.calendar-popup.compact{width:240px}.calendar-popup.compact.has-ranges{width:380px}.calendar-popup.compact.dual-calendar-mode{width:480px}.calendar-popup.compact.dual-calendar-mode.has-ranges{width:600px}.calendar-popup.compact .header{padding:8px 0;min-height:40px}.calendar-popup.compact .month-year{font-size:13px}.calendar-popup.compact .nav-btn{height:24px;width:24px;padding:6px 8px}.calendar-popup.compact .calendar-wrapper,.calendar-popup.compact .calendar-left,.calendar-popup.compact .calendar-right{padding:0 8px 8px}.calendar-popup.compact .weekday-header{font-size:11px;padding:4px 2px}.calendar-popup.compact .calendar-day{font-size:12px;padding:5px 2px;line-height:1.3}.calendar-popup.compact .ranges{min-width:120px;gap:2px;margin-bottom:8px;padding-bottom:8px}.calendar-popup.compact.has-ranges .ranges{padding:6px}.calendar-popup.compact .range-btn{font-size:12px;padding:5px 8px}.calendar-popup.compact .timepicker-section{margin-top:8px;padding-top:8px}.calendar-popup.compact .timepicker-label{font-size:11px}.calendar-popup.compact .footer{padding:8px;gap:6px}.calendar-popup.compact .btn-cancel,.calendar-popup.compact .btn-apply{font-size:11px;padding:6px 12px;min-width:64px}.calendar-popup.compact .bk-month-year-btn{@apply text-[13px] py-px px-1;}.calendar-popup.compact .nav-btn img{width:12px;height:8px}.calendar-popup.compact .bk-nav-btn-year img{width:12px;height:12px}.calendar-popup.compact .bk-grid-picker{@apply h-[178px];@apply justify-center;}.calendar-popup.compact .bk-month-grid,.calendar-popup.compact .bk-year-grid{@apply gap-1;}.calendar-popup.compact .bk-month-cell,.calendar-popup.compact .bk-year-cell{@apply text-[11px] py-1.5 px-0.5;}.calendar-popup.compact .bk-today-btn{@apply text-[11px] p-[5px];}\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: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: BkTimePicker, selector: "bk-time-picker", inputs: ["required", "value", "label", "placeholder", "clearable", "position", "variation", "pickerId", "closePicker", "timeFormat", "showSeconds", "autoPosition", "appendToBody", "viewportMargin", "panelClass", "disabled"], outputs: ["change", "timeChange", "pickerOpened", "pickerClosed"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i2.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i2.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }] });
4032
4032
  }
4033
4033
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BkCustomCalendar, decorators: [{
4034
4034
  type: Component,
@@ -4043,7 +4043,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
4043
4043
  useExisting: forwardRef(() => BkCustomCalendar),
4044
4044
  multi: true,
4045
4045
  },
4046
- ], template: "<div class=\"calendar-container relative\" [class.open]=\"show\" [class.inline-mode]=\"inline\" [class.disabled]=\"disabled\">\r\n <!-- Input field + its CDK overlay share one *ngIf=\"!inline\" scope so the origin's template ref\r\n (#calendarOrigin) is visible to the overlay template below \u2014 a ref declared inside one *ngIf\r\n embedded view isn't visible from a different (even identically-conditioned) *ngIf. -->\r\n <ng-container *ngIf=\"!inline\">\r\n <div #inputWrapper cdkOverlayOrigin #calendarOrigin=\"cdkOverlayOrigin\" class=\"input-wrapper\">\r\n <input\r\n type=\"text\"\r\n (mousedown)=\"onTriggerMouseDown($event)\"\r\n (focus)=\"onTriggerFocus()\"\r\n (keydown.enter)=\"onTriggerKeydownOpen($event)\"\r\n (keydown.space)=\"onTriggerKeydownOpen($event)\"\r\n (keydown.arrowDown)=\"onTriggerKeydownOpen($event)\"\r\n (blur)=\"onTriggerBlur()\"\r\n readonly\r\n [value]=\"getDisplayValue()\"\r\n [placeholder]=\"placeholder\"\r\n [attr.disabled]=\"disabled ? true : null\"\r\n [class.hasError]=\"hasError\"\r\n class=\"calendar-input\">\r\n <!-- *ngIf=\"!getDisplayValue()\" -->\r\n\r\n <span class=\"calendar-icon\" >\r\n <img alt=\"calendar\" class=\"calendar-icon-img\" [src]='brickclayIcons.calenderIcon'/>\r\n </span>\r\n <button type=\"button\" class=\"clear-btn\" *ngIf=\"getDisplayValue() && isDisplayCrossIcon && !disabled\" (click)=\"clear(); $event.stopPropagation()\" title=\"Clear\">\u00D7</button>\r\n </div>\r\n\r\n <!-- Positioned via Angular CDK Overlay, portalled into the shared cdk-overlay-container so it\r\n escapes clipping/stacking inside dialogs and scroll containers regardless of the old\r\n appendToBody flag (see its @deprecated note in the component). -->\r\n <ng-template\r\n cdkConnectedOverlay\r\n #calendarOverlay=\"cdkConnectedOverlay\"\r\n [cdkConnectedOverlayOrigin]=\"calendarOrigin\"\r\n [cdkConnectedOverlayOpen]=\"show\"\r\n [cdkConnectedOverlayPositions]=\"calendarPositions\"\r\n [cdkConnectedOverlayPush]=\"true\"\r\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\r\n [cdkConnectedOverlayPanelClass]=\"panelClass\"\r\n [cdkConnectedOverlayFlexibleDimensions]=\"false\"\r\n (positionChange)=\"onPositionChange($event)\"\r\n (overlayOutsideClick)=\"onOverlayOutsideClick()\"\r\n (detach)=\"close()\">\r\n <div #calendarPopup\r\n class=\"calendar-popup\"\r\n tabindex=\"0\"\r\n (keydown)=\"onCalendarPopupKeydown($event)\"\r\n (wheel)=\"onCalendarPopupWheel($event)\"\r\n [ngClass]=\"{\r\n 'drop-up': popupPlacementAbove,\r\n 'has-ranges': showRanges && customRanges,\r\n 'dual-calendar-mode': dualCalendar,\r\n 'compact': compact\r\n }\">\r\n <ng-container *ngTemplateOutlet=\"popupContent\"></ng-container>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Popup content \u2014 written once, projected into whichever render path below is active -->\r\n <ng-template #popupContent>\r\n <!-- RANGES: date-range shortcuts don't apply once selection is restricted to a month/year. -->\r\n <div class=\"ranges\" *ngIf=\"showRanges && customRanges && pickerView === 'day'\" role=\"listbox\" aria-label=\"Date ranges\">\r\n <button\r\n type=\"button\"\r\n *ngFor=\"let rangeKey of rangeOrder\"\r\n (click)=\"chooseRange(rangeKey)\"\r\n (keydown)=\"onRangeButtonKeydown($event, rangeKey)\"\r\n [class.active]=\"activeRange === rangeKey\"\r\n [class.custom-range]=\"rangeKey === 'Custom Range'\"\r\n class=\"range-btn\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"activeRange === rangeKey\">\r\n {{ rangeKey }}\r\n </button>\r\n </div>\r\n<div class=\"\" [ngClass]=\"showRanges && pickerView === 'day' ? 'w-100 flex-grow-1 border-l border-[#eee]' : ''\">\r\n\r\n\r\n <!-- SINGLE CALENDAR -->\r\n <div *ngIf=\"!dualCalendar\" class=\"calendar-wrapper\">\r\n\r\n <!-- DAY GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"view === 'days'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevYear()\" [disabled]=\"isPrevYearDisabled(year)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <button class=\"nav-btn\" type=\"button\" (click)=\"prevMonth()\" title=\"Prev month\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openMonthView()\" [disabled]=\"disabled\">{{ getMonthName(month) }}</button>\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openYearView()\" [disabled]=\"disabled\">{{ year }}</button>\r\n </span>\r\n <button class=\"nav-btn\" type=\"button\" (click)=\"nextMonth()\" title=\"Next month\">\r\n <img alt=\"next\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextYear()\" [disabled]=\"isNextYearDisabled(year)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- MONTH GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"view === 'months'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevMonthGridYear()\" [disabled]=\"isPrevYearDisabled(year)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openYearView()\" [disabled]=\"disabled\">{{ year }}</button>\r\n </span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextMonthGridYear()\" [disabled]=\"isNextYearDisabled(year)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- YEAR GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"view === 'years'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevYearRange()\" title=\"Prev years\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">{{ yearRangeStart }} - {{ yearRangeStart + 11 }}</span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextYearRange()\" title=\"Next years\">\r\n <img alt=\"next\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <table class=\"calendar-table\" *ngIf=\"view === 'days'\" role=\"grid\" [attr.aria-label]=\"getMonthName(month) + ' ' + year\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of calendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(year, month, dayObj.day) && selectDate(dayObj.day)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(year, month, dayObj.day) && onDateHover(dayObj.day, false)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(year, month, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(year, month, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(year, month, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(year, month, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(year, month, dayObj.day)\"\r\n [class.calendar-day-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(year, month, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- MONTH GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"view === 'months'\">\r\n <div class=\"bk-month-grid\" role=\"listbox\" [attr.aria-label]=\"'Select month for ' + year\">\r\n <button\r\n *ngFor=\"let m of monthNamesShort; let i = index\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"i === month\"\r\n [class.active]=\"i === month\"\r\n [class.current]=\"isCurrentMonth(i, year)\"\r\n [disabled]=\"isMonthDisabled(i, year)\"\r\n (click)=\"selectMonthFromGrid(i)\"\r\n class=\"bk-month-cell\">\r\n {{ m }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- YEAR GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"view === 'years'\">\r\n <div class=\"bk-year-grid\" role=\"listbox\" aria-label=\"Select year\">\r\n <button\r\n *ngFor=\"let y of getYearGridYears(yearRangeStart)\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"y === year\"\r\n [class.active]=\"y === year\"\r\n [class.current]=\"isCurrentYear(y)\"\r\n [disabled]=\"isYearDisabled(y)\"\r\n (click)=\"selectYearFromGrid(y)\"\r\n class=\"bk-year-cell\">\r\n {{ y }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- Single Calendar Time Picker -->\r\n <div *ngIf=\"enableTimepicker && view === 'days'\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"single-time\"\r\n [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"singleTimeModel\"\r\n (ngModelChange)=\"onSingleTimePickerChange($event); singleTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('single-time')\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- DUAL CALENDAR -->\r\n <div class=\"dual-calendar\" *ngIf=\"dualCalendar\">\r\n <!-- LEFT CALENDAR -->\r\n <div class=\"calendar-left\">\r\n <div class=\"header\" *ngIf=\"leftView === 'days'\">\r\n <button (click)=\"prevLeftYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isPrevYearDisabled(leftYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <button (click)=\"prevLeftMonth()\" class=\"nav-btn\" type=\"button\" title=\"Prev month\">\r\n <img alt=\"arrow-left\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openLeftMonthView()\" [disabled]=\"disabled\">{{ getMonthName(leftMonth) }}</button>\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openLeftYearView()\" [disabled]=\"disabled\">{{ leftYear }}</button>\r\n </span>\r\n <button (click)=\"nextLeftMonth()\" class=\"nav-btn\" type=\"button\" title=\"Next month\">\r\n <img alt=\"arrow-right\" class=\"arrow-right\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n <button (click)=\"nextLeftYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isNextYearDisabled(leftYear)\" title=\"Next year\">\r\n <img alt=\"next year\" class=\"arrow-right\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- MONTH GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"leftView === 'months'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevLeftMonthGridYear()\" [disabled]=\"isPrevYearDisabled(leftYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openLeftYearView()\" [disabled]=\"disabled\">{{ leftYear }}</button>\r\n </span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextLeftMonthGridYear()\" [disabled]=\"isNextYearDisabled(leftYear)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- YEAR GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"leftView === 'years'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevLeftYearRange()\" title=\"Prev years\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">{{ leftYearRangeStart }} - {{ leftYearRangeStart + 11 }}</span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextLeftYearRange()\" title=\"Next years\">\r\n <img alt=\"next\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <table class=\"calendar-table\" *ngIf=\"leftView === 'days'\" role=\"grid\" [attr.aria-label]=\"getMonthName(leftMonth) + ' ' + leftYear\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of leftCalendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(leftYear, leftMonth, dayObj.day) && selectDate(dayObj.day, false)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(leftYear, leftMonth, dayObj.day) && onDateHover(dayObj.day, false)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(leftYear, leftMonth, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(leftYear, leftMonth, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(leftYear, leftMonth, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(leftYear, leftMonth, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(leftYear, leftMonth, dayObj.day)\"\r\n [class.calendar-day-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(leftYear, leftMonth, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- MONTH GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"leftView === 'months'\">\r\n <div class=\"bk-month-grid\" role=\"listbox\" [attr.aria-label]=\"'Select month for ' + leftYear\">\r\n <button\r\n *ngFor=\"let m of monthNamesShort; let i = index\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"i === leftMonth\"\r\n [class.active]=\"i === leftMonth\"\r\n [class.current]=\"isCurrentMonth(i, leftYear)\"\r\n [disabled]=\"isMonthDisabled(i, leftYear)\"\r\n (click)=\"selectLeftMonthFromGrid(i)\"\r\n class=\"bk-month-cell\">\r\n {{ m }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToLeftToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- YEAR GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"leftView === 'years'\">\r\n <div class=\"bk-year-grid\" role=\"listbox\" aria-label=\"Select year\">\r\n <button\r\n *ngFor=\"let y of getYearGridYears(leftYearRangeStart)\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"y === leftYear\"\r\n [class.active]=\"y === leftYear\"\r\n [class.current]=\"isCurrentYear(y)\"\r\n [disabled]=\"isYearDisabled(y)\"\r\n (click)=\"selectLeftYearFromGrid(y)\"\r\n class=\"bk-year-cell\">\r\n {{ y }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToLeftToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- Start Time Picker for Dual Calendar -->\r\n <div *ngIf=\"enableTimepicker && leftView === 'days'\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">Start Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"dual-start\"\r\n [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"startTimeModel\"\r\n (ngModelChange)=\"onDualTimePickerChange($event, true); startTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('dual-start')\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- RIGHT CALENDAR -->\r\n <div class=\"calendar-right\">\r\n <div class=\"header\" *ngIf=\"rightView === 'days'\">\r\n <button (click)=\"prevRightYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isPrevYearDisabled(rightYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <button (click)=\"prevRightMonth()\" class=\"nav-btn\" type=\"button\" title=\"Prev month\">\r\n <img alt=\"arrow-left\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openRightMonthView()\" [disabled]=\"disabled\">{{ getMonthName(rightMonth) }}</button>\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openRightYearView()\" [disabled]=\"disabled\">{{ rightYear }}</button>\r\n </span>\r\n <button (click)=\"nextRightMonth()\" class=\"nav-btn\" type=\"button\" title=\"Next month\">\r\n <img alt=\"arrow-right\" class=\"arrow-right\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n <button (click)=\"nextRightYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isNextYearDisabled(rightYear)\" title=\"Next year\">\r\n <img alt=\"next year\" class=\"arrow-right\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- MONTH GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"rightView === 'months'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevRightMonthGridYear()\" [disabled]=\"isPrevYearDisabled(rightYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openRightYearView()\" [disabled]=\"disabled\">{{ rightYear }}</button>\r\n </span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextRightMonthGridYear()\" [disabled]=\"isNextYearDisabled(rightYear)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- YEAR GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"rightView === 'years'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevRightYearRange()\" title=\"Prev years\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">{{ rightYearRangeStart }} - {{ rightYearRangeStart + 11 }}</span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextRightYearRange()\" title=\"Next years\">\r\n <img alt=\"next\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <table class=\"calendar-table\" *ngIf=\"rightView === 'days'\" role=\"grid\" [attr.aria-label]=\"getMonthName(rightMonth) + ' ' + rightYear\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of rightCalendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(rightYear, rightMonth, dayObj.day) && selectDate(dayObj.day, true)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(rightYear, rightMonth, dayObj.day) && onDateHover(dayObj.day, true)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(rightYear, rightMonth, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(rightYear, rightMonth, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(rightYear, rightMonth, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(rightYear, rightMonth, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(rightYear, rightMonth, dayObj.day)\"\r\n [class.calendar-day-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(rightYear, rightMonth, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- MONTH GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"rightView === 'months'\">\r\n <div class=\"bk-month-grid\" role=\"listbox\" [attr.aria-label]=\"'Select month for ' + rightYear\">\r\n <button\r\n *ngFor=\"let m of monthNamesShort; let i = index\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"i === rightMonth\"\r\n [class.active]=\"i === rightMonth\"\r\n [class.current]=\"isCurrentMonth(i, rightYear)\"\r\n [disabled]=\"isMonthDisabled(i, rightYear)\"\r\n (click)=\"selectRightMonthFromGrid(i)\"\r\n class=\"bk-month-cell\">\r\n {{ m }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToRightToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- YEAR GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"rightView === 'years'\">\r\n <div class=\"bk-year-grid\" role=\"listbox\" aria-label=\"Select year\">\r\n <button\r\n *ngFor=\"let y of getYearGridYears(rightYearRangeStart)\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"y === rightYear\"\r\n [class.active]=\"y === rightYear\"\r\n [class.current]=\"isCurrentYear(y)\"\r\n [disabled]=\"isYearDisabled(y)\"\r\n (click)=\"selectRightYearFromGrid(y)\"\r\n class=\"bk-year-cell\">\r\n {{ y }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToRightToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- End Time Picker for Dual Calendar -->\r\n <div *ngIf=\"enableTimepicker && rightView === 'days'\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">End Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"dual-end\"\r\n [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"endTimeModel\"\r\n (ngModelChange)=\"onDualTimePickerChange($event, false); endTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('dual-end')\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- FOOTER: month/year-only selection commits on click (like autoApply) \u2014 no Apply/Cancel to show. -->\r\n <div class=\"footer\" *ngIf=\"!inline && showCancelApply && pickerView === 'day'\">\r\n <button *ngIf=\"showCancel\" (click)=\"cancel()\" class=\"btn-cancel\" type=\"button\">Cancel</button>\r\n <button (click)=\"apply()\" class=\"btn-apply\" type=\"button\" [disabled]=\"disabled || isDualRangeApplyBlocked\">Apply</button>\r\n </div>\r\n\r\n </div>\r\n\r\n </ng-template>\r\n\r\n <!-- INLINE: rendered directly in normal flow, no overlay -->\r\n <div #calendarPopup\r\n *ngIf=\"inline\"\r\n class=\"calendar-popup inline-calendar\"\r\n tabindex=\"0\"\r\n (keydown)=\"onCalendarPopupKeydown($event)\"\r\n [ngClass]=\"{\r\n 'has-ranges': showRanges && customRanges,\r\n 'dual-calendar-mode': dualCalendar,\r\n 'compact': compact\r\n }\">\r\n <ng-container *ngTemplateOutlet=\"popupContent\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n@if (hasError){\r\n<p class=\"calender-error\">{{errorMessage}}</p>\r\n}\r\n", styles: [".calendar-container,.calendar-container *{font-family:Inter,sans-serif!important}.calendar-container{position:relative;display:inline-block;width:100%}.input-wrapper{position:relative;display:flex;align-items:center}.calendar-input{width:100%;padding:9px 14px 9px 40px;border:1px solid #ddd;border-radius:8px;font-size:14px;cursor:pointer;background:#fff;transition:all .2s}.calendar-input:hover{border-color:#999}.calendar-input:focus{outline:none;border-color:#999}.calendar-icon{position:absolute;left:12px;pointer-events:none;font-size:18px}.clear-btn{position:absolute;right:9px;background:none;border:none;font-size:20px;color:#999;cursor:pointer;padding:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;line-height:1;transition:color .2s;top:8px}.clear-btn:hover{color:#333}.calendar-popup{width:320px;background:#fff;border-radius:12px;box-shadow:0 10px 40px #00000026;z-index:1000;animation:slideDown .2s ease-out;font-family:Inter,sans-serif;scrollbar-width:thin;scrollbar-color:#c1c1c1 transparent}.calendar-popup::-webkit-scrollbar{width:6px}.calendar-popup::-webkit-scrollbar-track{background:transparent}.calendar-popup::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:3px}.calendar-popup::-webkit-scrollbar-thumb:hover{background:#a8a8a8}.calendar-popup:focus-visible{outline:0!important}.calendar-popup.inline-calendar{position:relative;top:0;left:0;width:100%;margin-top:0;animation:none;box-shadow:0 2px 8px #0000001a}.calendar-container.inline-mode{display:block;width:100%}.calendar-popup.dual-calendar-mode{width:600px}.calendar-popup.dual-calendar-mode.has-ranges{width:730px}.calendar-popup.has-ranges{width:450px}.calendar-popup.drop-up{animation:slideUp .2s ease-out}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.ranges{display:flex;flex-direction:column;gap:4px;margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid #eee;min-width:150px;padding-right:8px;scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}.range-btn{padding:7px 10px;border:1px solid transparent;background:transparent;border-radius:4px;cursor:pointer;text-align:left;font-size:14px;transition:all .2s;color:#838383;font-weight:500}.range-btn:hover{background:#f5f5f5;color:#000}.range-btn.active{background:#f0f0f0;color:#000;font-weight:500}.calendar-wrapper{padding:0 12px 12px}.header{display:flex;justify-content:space-between;align-items:center;padding:12px 0;min-height:54px;box-sizing:border-box}.month-year{font-size:15px;font-weight:500;color:#333;flex:1;display:flex;align-items:center;justify-content:center;text-align:center;text-transform:capitalize}.bk-month-year-btn{@apply bg-transparent border-0 rounded py-1 px-1 cursor-pointer transition-all duration-200;font:inherit;color:inherit;text-transform:inherit}.bk-month-year-btn:hover:not(:disabled){@apply text-black;}.bk-month-year-btn:disabled{@apply cursor-not-allowed text-[#ccc] opacity-50;}.nav-btn{background:none;border:none;font-size:24px;cursor:pointer;padding:11.5px 14px;color:#666;border-radius:4px;transition:all .2s;line-height:1;height:30px;width:30px;display:flex;justify-content:center;align-items:center}.nav-btn:hover{background:#f0f0f0;color:#000}.nav-btn img{max-width:none!important}.nav-btn:disabled{cursor:not-allowed;opacity:.35;pointer-events:none}.bk-grid-picker{@apply flex flex-col box-border h-[256px];}.bk-month-grid,.bk-year-grid{@apply grid grid-cols-3 auto-rows-min shrink-0 gap-[18px];}.bk-today-btn{@apply shrink-0 w-full p-2 mt-2 border border-[#eee] rounded-md bg-transparent text-[#333] text-[13px] font-medium cursor-pointer transition-all duration-200;}.bk-today-btn:hover:not(:disabled){@apply bg-[#efefef] text-black;}.bk-today-btn:disabled{@apply text-[#ddd] cursor-not-allowed opacity-50;}.bk-month-cell,.bk-year-cell{@apply flex items-center justify-center py-2.5 px-1 text-[13px] font-medium text-[#333] bg-transparent border-0 rounded-md cursor-pointer text-center transition-all duration-200;}.bk-month-cell:hover:not(:disabled):not(.active):not(.current),.bk-year-cell:hover:not(:disabled):not(.active):not(.current){@apply bg-[#efefef] text-black;}.bk-month-cell.active,.bk-year-cell.active{@apply bg-black text-white font-semibold;}.bk-month-cell.current:not(.active),.bk-year-cell.current:not(.active){@apply bg-[#e5e4e4] font-semibold;}.bk-month-cell:disabled,.bk-year-cell:disabled{@apply text-[#ddd] cursor-not-allowed opacity-50;}.calendar-table{width:100%;border-collapse:collapse;text-align:center}.weekday-header{font-size:12px;color:#7e7e7e;font-weight:600;padding:8px 4px;letter-spacing:.3px}.calendar-day{padding:8px 4px;font-size:14px;cursor:pointer;border-radius:6px;transition:all .2s;position:relative;color:#333;font-weight:500;line-height:1.5}.calendar-day:hover:not(.disabled):not(.other-month){background:#efefef;color:#000}.calendar-day.other-month{color:#ccc;cursor:default}.calendar-day.disabled{color:#ddd;cursor:not-allowed;opacity:.5}.calendar-day.active{background:#000!important;color:#fff!important;font-weight:600}.calendar-day.today{font-weight:600}.calendar-day.today:not(.active){background:#e5e4e4}.calendar-day.active:hover{background:#000!important}.calendar-day.today.disabled,.bk-month-cell.current:disabled,.bk-year-cell.current:disabled{color:#a9a9a9}.calendar-day.in-range{background:#f5f5f5;color:#333;border-radius:0;position:relative}.calendar-day.in-range:hover{background:#e8e8e8}.calendar-day.in-range:before{content:\"\";position:absolute;inset:0;background:#f5f5f5;z-index:-1}.calendar-day.in-range:hover:before{background:#e8e8e8}.calendar-day.multi-selected{background:#4caf50;color:#fff;font-weight:600;border-radius:6px}.calendar-day.multi-selected:hover{background:#45a049}.dual-calendar{display:flex;width:100%}.calendar-left,.calendar-right{flex:1;min-width:0;padding:0 12px 12px}.calendar-popup.has-ranges{display:flex;flex-direction:row}.calendar-popup.has-ranges .ranges{margin-bottom:0;border-bottom:none;padding:10px}.calendar-popup.has-ranges .dual-calendar,.calendar-popup.has-ranges .calendar-wrapper{flex:1}.calendar-right .header{justify-content:space-between}.calendar-right .header .month-year{text-align:center;flex:1}.timepicker-section{margin-top:12px;padding-top:12px;border-top:1px solid #eee}.timepicker-label{font-size:12px;font-weight:500;color:#000;margin-bottom:4px;letter-spacing:-.28px}.custom-time-picker{display:flex;flex-direction:column;gap:8px;align-items:start}.time-input-group{display:flex;align-items:center;justify-content:center;gap:8px;background:#f8f9fa;padding:12px;border-radius:8px;border:1px solid #e0e0e0}.time-control{display:flex;flex-direction:column;align-items:center}.time-btn{background:#fff;border:1px solid #ddd;width:28px;height:20px;cursor:pointer;font-size:10px;color:#666;border-radius:4px;transition:all .2s;display:flex;align-items:center;justify-content:center;padding:0;line-height:1}.time-btn:hover{background:#e4e4e4;color:#fff;border-color:#e4e4e4}.time-btn.up{border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom:none}.time-btn.down{border-top-left-radius:0;border-top-right-radius:0;border-top:none}.time-input{width:40px;height:32px;text-align:center;border:1px solid #ddd;border-radius:4px;font-size:16px;font-weight:600;background:#fff;color:#333}.time-separator{font-size:18px;font-weight:600;color:#666;margin:0 2px}.ampm-control{display:flex;flex-direction:column;gap:4px;margin-left:8px}.ampm-btn{padding:6px 12px;border:1px solid #ddd;background:#fff;border-radius:4px;cursor:pointer;font-size:12px;font-weight:600;color:#666;transition:all .2s;min-width:45px}.ampm-btn:hover{background:#f0f0f0}.ampm-btn.active{background:#000;color:#fff;border-color:#000}.html5-time-input{margin-top:8px;padding:8px;border:1px solid #ddd;border-radius:6px;font-size:14px;width:100%;max-width:120px}.footer{padding:12px;display:flex;justify-content:flex-end;gap:8px;border-top:1px solid #eee}.btn-cancel,.btn-apply{padding:8px 16px;border:none;border-radius:4px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s;min-width:80px}.btn-cancel{background:#fff;color:#666;border:1px solid #ddd}.btn-apply{background:#000;color:#fff}.btn-apply:active{transform:translateY(0)}@media (max-width: 576px){.calendar-popup.dual-calendar-mode{max-width:300px}}@media (max-width: 768px){.dual-calendar{flex-direction:column}}@media (min-width: 577px) and (max-width: 1024px){.calendar-popup.dual-calendar-mode{max-width:500px}}@media (max-width: 1024px){.calendar-popup{width:100%;max-width:320px;max-height:300px;overflow:auto}.calendar-popup.dual-calendar-mode{width:100%;max-width:100%}.calendar-popup.has-ranges{flex-direction:column}.calendar-popup.has-ranges .ranges{border-right:none;border-bottom:1px solid #eee;padding-right:0;margin-right:0;padding-bottom:16px;margin-bottom:16px}.time-input-group{flex-wrap:wrap;justify-content:center}}.ranges::-webkit-scrollbar{width:6px}.ranges::-webkit-scrollbar-track{background:#f1f1f1;border-radius:3px}.ranges::-webkit-scrollbar-thumb{background:#888;border-radius:3px}.ranges::-webkit-scrollbar-thumb:hover{background:#555}.w-100{width:100%}.flex-grow-1{flex-grow:1}.calendar-input.calendar-input-has-error{@apply border-[#d11e14];}.calendar-input:disabled{cursor:not-allowed;border-color:#e3e3e7;background-color:#f4f4f6;color:#a1a3ae}.btn-apply:disabled{cursor:not-allowed!important;opacity:.7}.calendar-day.calendar-day-keyboard-focus:not(.disabled):not(.other-month){outline:0px solid #000}.calendar-popup.compact{width:240px}.calendar-popup.compact.has-ranges{width:380px}.calendar-popup.compact.dual-calendar-mode{width:480px}.calendar-popup.compact.dual-calendar-mode.has-ranges{width:600px}.calendar-popup.compact .header{padding:8px 0;min-height:40px}.calendar-popup.compact .month-year{font-size:13px}.calendar-popup.compact .nav-btn{height:24px;width:24px;padding:6px 8px}.calendar-popup.compact .calendar-wrapper,.calendar-popup.compact .calendar-left,.calendar-popup.compact .calendar-right{padding:0 8px 8px}.calendar-popup.compact .weekday-header{font-size:11px;padding:4px 2px}.calendar-popup.compact .calendar-day{font-size:12px;padding:5px 2px;line-height:1.3}.calendar-popup.compact .ranges{min-width:120px;gap:2px;margin-bottom:8px;padding-bottom:8px}.calendar-popup.compact.has-ranges .ranges{padding:6px}.calendar-popup.compact .range-btn{font-size:12px;padding:5px 8px}.calendar-popup.compact .timepicker-section{margin-top:8px;padding-top:8px}.calendar-popup.compact .timepicker-label{font-size:11px}.calendar-popup.compact .footer{padding:8px;gap:6px}.calendar-popup.compact .btn-cancel,.calendar-popup.compact .btn-apply{font-size:11px;padding:6px 12px;min-width:64px}.calendar-popup.compact .bk-month-year-btn{@apply text-[13px] py-px px-1;}.calendar-popup.compact .nav-btn img{width:12px;height:8px}.calendar-popup.compact .bk-nav-btn-year img{width:12px;height:12px}.calendar-popup.compact .bk-grid-picker{@apply h-[178px];@apply justify-center;}.calendar-popup.compact .bk-month-grid,.calendar-popup.compact .bk-year-grid{@apply gap-1;}.calendar-popup.compact .bk-month-cell,.calendar-popup.compact .bk-year-cell{@apply text-[11px] py-1.5 px-0.5;}.calendar-popup.compact .bk-today-btn{@apply text-[11px] p-[5px];}\n"] }]
4046
+ ], template: "<div class=\"calendar-container relative\" [class.open]=\"show\" [class.inline-mode]=\"inline\" [class.disabled]=\"disabled\">\r\n <!-- Input field + its CDK overlay share one *ngIf=\"!inline\" scope so the origin's template ref\r\n (#calendarOrigin) is visible to the overlay template below \u2014 a ref declared inside one *ngIf\r\n embedded view isn't visible from a different (even identically-conditioned) *ngIf. -->\r\n <ng-container *ngIf=\"!inline\">\r\n <div #inputWrapper cdkOverlayOrigin #calendarOrigin=\"cdkOverlayOrigin\" class=\"input-wrapper\">\r\n <input\r\n type=\"text\"\r\n (mousedown)=\"onTriggerMouseDown($event)\"\r\n (focus)=\"onTriggerFocus()\"\r\n (keydown.enter)=\"onTriggerKeydownOpen($event)\"\r\n (keydown.space)=\"onTriggerKeydownOpen($event)\"\r\n (keydown.arrowDown)=\"onTriggerKeydownOpen($event)\"\r\n (blur)=\"onTriggerBlur()\"\r\n readonly\r\n [value]=\"getDisplayValue()\"\r\n [placeholder]=\"placeholder\"\r\n [attr.disabled]=\"disabled ? true : null\"\r\n [class.hasError]=\"hasError\"\r\n class=\"calendar-input\">\r\n <!-- *ngIf=\"!getDisplayValue()\" -->\r\n\r\n <span class=\"calendar-icon\" >\r\n <img alt=\"calendar\" class=\"calendar-icon-img\" [src]='brickclayIcons.calenderIcon'/>\r\n </span>\r\n <button type=\"button\" class=\"clear-btn\" *ngIf=\"getDisplayValue() && isDisplayCrossIcon && !disabled\" (click)=\"clear(); $event.stopPropagation()\" title=\"Clear\">\u00D7</button>\r\n </div>\r\n\r\n <!-- Positioned via Angular CDK Overlay, portalled into the shared cdk-overlay-container so it\r\n escapes clipping/stacking inside dialogs and scroll containers regardless of the old\r\n appendToBody flag (see its @deprecated note in the component). -->\r\n <ng-template\r\n cdkConnectedOverlay\r\n #calendarOverlay=\"cdkConnectedOverlay\"\r\n [cdkConnectedOverlayOrigin]=\"calendarOrigin\"\r\n [cdkConnectedOverlayOpen]=\"show\"\r\n [cdkConnectedOverlayPositions]=\"calendarPositions\"\r\n [cdkConnectedOverlayPush]=\"true\"\r\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\r\n [cdkConnectedOverlayPanelClass]=\"panelClass\"\r\n [cdkConnectedOverlayFlexibleDimensions]=\"false\"\r\n (positionChange)=\"onPositionChange($event)\"\r\n (overlayOutsideClick)=\"onOverlayOutsideClick()\"\r\n (detach)=\"close()\">\r\n <div #calendarPopup\r\n class=\"calendar-popup\"\r\n tabindex=\"0\"\r\n (keydown)=\"onCalendarPopupKeydown($event)\"\r\n (wheel)=\"onCalendarPopupWheel($event)\"\r\n [ngClass]=\"{\r\n 'drop-up': popupPlacementAbove,\r\n 'has-ranges': showRanges && customRanges,\r\n 'dual-calendar-mode': dualCalendar,\r\n 'compact': compact\r\n }\">\r\n <ng-container *ngTemplateOutlet=\"popupContent\"></ng-container>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Popup content \u2014 written once, projected into whichever render path below is active -->\r\n <ng-template #popupContent>\r\n <!-- RANGES: date-range shortcuts don't apply once selection is restricted to a month/year. -->\r\n <div class=\"ranges\" *ngIf=\"showRanges && customRanges && pickerView === 'day'\" role=\"listbox\" aria-label=\"Date ranges\">\r\n <button\r\n type=\"button\"\r\n *ngFor=\"let rangeKey of rangeOrder\"\r\n (click)=\"chooseRange(rangeKey)\"\r\n (keydown)=\"onRangeButtonKeydown($event, rangeKey)\"\r\n [class.active]=\"activeRange === rangeKey\"\r\n [class.custom-range]=\"rangeKey === 'Custom Range'\"\r\n class=\"range-btn\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"activeRange === rangeKey\">\r\n {{ rangeKey }}\r\n </button>\r\n </div>\r\n<div class=\"\" [ngClass]=\"showRanges && pickerView === 'day' ? 'w-100 flex-grow-1 border-l border-[#eee]' : ''\">\r\n\r\n\r\n <!-- SINGLE CALENDAR -->\r\n <div *ngIf=\"!dualCalendar\" class=\"calendar-wrapper\">\r\n\r\n <!-- DAY GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"view === 'days'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevYear()\" [disabled]=\"isPrevYearDisabled(year)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <button class=\"nav-btn\" type=\"button\" (click)=\"prevMonth()\" title=\"Prev month\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openMonthView()\" [disabled]=\"disabled\">{{ getMonthName(month) }}</button>\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openYearView()\" [disabled]=\"disabled\">{{ year }}</button>\r\n </span>\r\n <button class=\"nav-btn\" type=\"button\" (click)=\"nextMonth()\" title=\"Next month\">\r\n <img alt=\"next\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextYear()\" [disabled]=\"isNextYearDisabled(year)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- MONTH GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"view === 'months'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevMonthGridYear()\" [disabled]=\"isPrevYearDisabled(year)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openYearView()\" [disabled]=\"disabled\">{{ year }}</button>\r\n </span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextMonthGridYear()\" [disabled]=\"isNextYearDisabled(year)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- YEAR GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"view === 'years'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevYearRange()\" title=\"Prev years\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">{{ yearRangeStart }} - {{ yearRangeStart + 11 }}</span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextYearRange()\" title=\"Next years\">\r\n <img alt=\"next\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <table class=\"calendar-table\" *ngIf=\"view === 'days'\" role=\"grid\" [attr.aria-label]=\"getMonthName(month) + ' ' + year\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of calendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(year, month, dayObj.day) && selectDate(dayObj.day)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(year, month, dayObj.day) && onDateHover(dayObj.day, false)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(year, month, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(year, month, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(year, month, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(year, month, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(year, month, dayObj.day)\"\r\n [class.calendar-day-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(year, month, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- MONTH GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"view === 'months'\">\r\n <div class=\"bk-month-grid\" role=\"listbox\" [attr.aria-label]=\"'Select month for ' + year\">\r\n <button\r\n *ngFor=\"let m of monthNamesShort; let i = index\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"i === month\"\r\n [class.active]=\"i === month\"\r\n [class.current]=\"isCurrentMonth(i, year)\"\r\n [disabled]=\"isMonthDisabled(i, year)\"\r\n (click)=\"selectMonthFromGrid(i)\"\r\n class=\"bk-month-cell\">\r\n {{ m }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- YEAR GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"view === 'years'\">\r\n <div class=\"bk-year-grid\" role=\"listbox\" aria-label=\"Select year\">\r\n <button\r\n *ngFor=\"let y of getYearGridYears(yearRangeStart)\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"y === year\"\r\n [class.active]=\"y === year\"\r\n [class.current]=\"isCurrentYear(y)\"\r\n [disabled]=\"isYearDisabled(y)\"\r\n (click)=\"selectYearFromGrid(y)\"\r\n class=\"bk-year-cell\">\r\n {{ y }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- Single Calendar Time Picker -->\r\n <div *ngIf=\"enableTimepicker && view === 'days'\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"single-time\"\r\n [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"singleTimeModel\"\r\n (ngModelChange)=\"onSingleTimePickerChange($event); singleTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('single-time')\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- DUAL CALENDAR -->\r\n <div class=\"dual-calendar\" *ngIf=\"dualCalendar\">\r\n <!-- LEFT CALENDAR -->\r\n <div class=\"calendar-left\">\r\n <div class=\"header\" *ngIf=\"leftView === 'days'\">\r\n <button (click)=\"prevLeftYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isPrevYearDisabled(leftYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <button (click)=\"prevLeftMonth()\" class=\"nav-btn\" type=\"button\" title=\"Prev month\">\r\n <img alt=\"arrow-left\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openLeftMonthView()\" [disabled]=\"disabled\">{{ getMonthName(leftMonth) }}</button>\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openLeftYearView()\" [disabled]=\"disabled\">{{ leftYear }}</button>\r\n </span>\r\n <button (click)=\"nextLeftMonth()\" class=\"nav-btn\" type=\"button\" title=\"Next month\">\r\n <img alt=\"arrow-right\" class=\"arrow-right\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n <button (click)=\"nextLeftYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isNextYearDisabled(leftYear)\" title=\"Next year\">\r\n <img alt=\"next year\" class=\"arrow-right\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- MONTH GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"leftView === 'months'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevLeftMonthGridYear()\" [disabled]=\"isPrevYearDisabled(leftYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openLeftYearView()\" [disabled]=\"disabled\">{{ leftYear }}</button>\r\n </span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextLeftMonthGridYear()\" [disabled]=\"isNextYearDisabled(leftYear)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- YEAR GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"leftView === 'years'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevLeftYearRange()\" title=\"Prev years\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">{{ leftYearRangeStart }} - {{ leftYearRangeStart + 11 }}</span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextLeftYearRange()\" title=\"Next years\">\r\n <img alt=\"next\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <table class=\"calendar-table\" *ngIf=\"leftView === 'days'\" role=\"grid\" [attr.aria-label]=\"getMonthName(leftMonth) + ' ' + leftYear\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of leftCalendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(leftYear, leftMonth, dayObj.day) && selectDate(dayObj.day, false)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(leftYear, leftMonth, dayObj.day) && onDateHover(dayObj.day, false)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(leftYear, leftMonth, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(leftYear, leftMonth, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(leftYear, leftMonth, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(leftYear, leftMonth, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(leftYear, leftMonth, dayObj.day)\"\r\n [class.calendar-day-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(leftYear, leftMonth, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- MONTH GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"leftView === 'months'\">\r\n <div class=\"bk-month-grid\" role=\"listbox\" [attr.aria-label]=\"'Select month for ' + leftYear\">\r\n <button\r\n *ngFor=\"let m of monthNamesShort; let i = index\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"i === leftMonth\"\r\n [class.active]=\"i === leftMonth\"\r\n [class.current]=\"isCurrentMonth(i, leftYear)\"\r\n [disabled]=\"isMonthDisabled(i, leftYear)\"\r\n (click)=\"selectLeftMonthFromGrid(i)\"\r\n class=\"bk-month-cell\">\r\n {{ m }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToLeftToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- YEAR GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"leftView === 'years'\">\r\n <div class=\"bk-year-grid\" role=\"listbox\" aria-label=\"Select year\">\r\n <button\r\n *ngFor=\"let y of getYearGridYears(leftYearRangeStart)\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"y === leftYear\"\r\n [class.active]=\"y === leftYear\"\r\n [class.current]=\"isCurrentYear(y)\"\r\n [disabled]=\"isYearDisabled(y)\"\r\n (click)=\"selectLeftYearFromGrid(y)\"\r\n class=\"bk-year-cell\">\r\n {{ y }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToLeftToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- Start Time Picker for Dual Calendar -->\r\n <div *ngIf=\"enableTimepicker && leftView === 'days'\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">Start Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"dual-start\"\r\n [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"startTimeModel\"\r\n (ngModelChange)=\"onDualTimePickerChange($event, true); startTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('dual-start')\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- RIGHT CALENDAR -->\r\n <div class=\"calendar-right\">\r\n <div class=\"header\" *ngIf=\"rightView === 'days'\">\r\n <button (click)=\"prevRightYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isPrevYearDisabled(rightYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <button (click)=\"prevRightMonth()\" class=\"nav-btn\" type=\"button\" title=\"Prev month\">\r\n <img alt=\"arrow-left\" class=\"arrow-left\" [src]=\"brickclayIcons.arrowleft\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openRightMonthView()\" [disabled]=\"disabled\">{{ getMonthName(rightMonth) }}</button>\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openRightYearView()\" [disabled]=\"disabled\">{{ rightYear }}</button>\r\n </span>\r\n <button (click)=\"nextRightMonth()\" class=\"nav-btn\" type=\"button\" title=\"Next month\">\r\n <img alt=\"arrow-right\" class=\"arrow-right\" [src]='brickclayIcons.arrowRight'/>\r\n </button>\r\n <button (click)=\"nextRightYear()\" class=\"nav-btn bk-nav-btn-year\" type=\"button\" [disabled]=\"isNextYearDisabled(rightYear)\" title=\"Next year\">\r\n <img alt=\"next year\" class=\"arrow-right\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- MONTH GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"rightView === 'months'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevRightMonthGridYear()\" [disabled]=\"isPrevYearDisabled(rightYear)\" title=\"Prev year\">\r\n <img alt=\"prev year\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">\r\n <button type=\"button\" class=\"bk-month-year-btn\" (click)=\"openRightYearView()\" [disabled]=\"disabled\">{{ rightYear }}</button>\r\n </span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextRightMonthGridYear()\" [disabled]=\"isNextYearDisabled(rightYear)\" title=\"Next year\">\r\n <img alt=\"next year\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <!-- YEAR GRID HEADER -->\r\n <div class=\"header\" *ngIf=\"rightView === 'years'\">\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"prevRightYearRange()\" title=\"Prev years\">\r\n <img alt=\"prev\" [src]=\"brickclayIcons.arrowLeftDouble\"/>\r\n </button>\r\n <span class=\"month-year\">{{ rightYearRangeStart }} - {{ rightYearRangeStart + 11 }}</span>\r\n <button class=\"nav-btn bk-nav-btn-year\" type=\"button\" (click)=\"nextRightYearRange()\" title=\"Next years\">\r\n <img alt=\"next\" [src]=\"brickclayIcons.arrowRightDouble\"/>\r\n </button>\r\n </div>\r\n\r\n <table class=\"calendar-table\" *ngIf=\"rightView === 'days'\" role=\"grid\" [attr.aria-label]=\"getMonthName(rightMonth) + ' ' + rightYear\">\r\n <thead>\r\n <tr role=\"row\">\r\n <th *ngFor=\"let d of resolvedWeekDayLabels\" class=\"weekday-header\" scope=\"col\" role=\"columnheader\">{{ d }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let week of rightCalendar\" role=\"row\">\r\n <td\r\n *ngFor=\"let dayObj of week\"\r\n role=\"gridcell\"\r\n (click)=\"dayObj.currentMonth && !isDateDisabled(rightYear, rightMonth, dayObj.day) && selectDate(dayObj.day, true)\"\r\n (mouseenter)=\"dayObj.currentMonth && !isDateDisabled(rightYear, rightMonth, dayObj.day) && onDateHover(dayObj.day, true)\"\r\n (mouseleave)=\"onDateLeave()\"\r\n [class.active]=\"dayObj.currentMonth && isDateSelected(rightYear, rightMonth, dayObj.day)\"\r\n [class.in-range]=\"dayObj.currentMonth && isDateInRange(rightYear, rightMonth, dayObj.day)\"\r\n [class.other-month]=\"!dayObj.currentMonth\"\r\n [class.disabled]=\"isDateDisabled(rightYear, rightMonth, dayObj.day)\"\r\n [class.multi-selected]=\"multiDateSelection && isDateInMultiSelection(rightYear, rightMonth, dayObj.day)\"\r\n [class.today]=\"dayObj.currentMonth && isToday(rightYear, rightMonth, dayObj.day)\"\r\n [class.calendar-day-keyboard-focus]=\"dayObj.currentMonth && isKeyboardFocusedCell(rightYear, rightMonth, dayObj.day)\"\r\n class=\"calendar-day\">\r\n {{ dayObj.day }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <!-- MONTH GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"rightView === 'months'\">\r\n <div class=\"bk-month-grid\" role=\"listbox\" [attr.aria-label]=\"'Select month for ' + rightYear\">\r\n <button\r\n *ngFor=\"let m of monthNamesShort; let i = index\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"i === rightMonth\"\r\n [class.active]=\"i === rightMonth\"\r\n [class.current]=\"isCurrentMonth(i, rightYear)\"\r\n [disabled]=\"isMonthDisabled(i, rightYear)\"\r\n (click)=\"selectRightMonthFromGrid(i)\"\r\n class=\"bk-month-cell\">\r\n {{ m }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToRightToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- YEAR GRID -->\r\n <div class=\"bk-grid-picker\" *ngIf=\"rightView === 'years'\">\r\n <div class=\"bk-year-grid\" role=\"listbox\" aria-label=\"Select year\">\r\n <button\r\n *ngFor=\"let y of getYearGridYears(rightYearRangeStart)\"\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"y === rightYear\"\r\n [class.active]=\"y === rightYear\"\r\n [class.current]=\"isCurrentYear(y)\"\r\n [disabled]=\"isYearDisabled(y)\"\r\n (click)=\"selectRightYearFromGrid(y)\"\r\n class=\"bk-year-cell\">\r\n {{ y }}\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"bk-today-btn\" (click)=\"goToRightToday()\" [disabled]=\"disabled || isDateDisabled(today.getFullYear(), today.getMonth(), today.getDate())\">Today</button>\r\n </div>\r\n\r\n <!-- End Time Picker for Dual Calendar -->\r\n <div *ngIf=\"enableTimepicker && rightView === 'days'\" class=\"timepicker-section\">\r\n <div class=\"timepicker-label\">End Time</div>\r\n <div class=\"timepicker-controls\">\r\n <bk-time-picker\r\n pickerId=\"dual-end\"\r\n [variation]=\"compact ? 'default' : 'lg'\"\r\n [timeFormat]=\"timeFormat\"\r\n [clearable]=\"clearableTime\"\r\n [label]=\"''\"\r\n [ngModel]=\"endTimeModel\"\r\n (ngModelChange)=\"onDualTimePickerChange($event, false); endTimeModel=$event\"\r\n [closePicker]=\"shouldClosePicker('dual-end')\"\r\n (pickerOpened)=\"onTimePickerOpened($event)\"\r\n (pickerClosed)=\"onTimePickerClosed($event)\">\r\n </bk-time-picker>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- FOOTER: month/year-only selection commits on click (like autoApply) \u2014 no Apply/Cancel to show. -->\r\n <div class=\"footer\" *ngIf=\"!inline && showCancelApply && pickerView === 'day'\">\r\n <button *ngIf=\"showCancel\" (click)=\"cancel()\" class=\"btn-cancel\" type=\"button\">Cancel</button>\r\n <button (click)=\"apply()\" class=\"btn-apply\" type=\"button\" [disabled]=\"disabled || isDualRangeApplyBlocked\">Apply</button>\r\n </div>\r\n\r\n </div>\r\n\r\n </ng-template>\r\n\r\n <!-- INLINE: rendered directly in normal flow, no overlay -->\r\n <div #calendarPopup\r\n *ngIf=\"inline\"\r\n class=\"calendar-popup inline-calendar\"\r\n tabindex=\"0\"\r\n (keydown)=\"onCalendarPopupKeydown($event)\"\r\n [ngClass]=\"{\r\n 'has-ranges': showRanges && customRanges,\r\n 'dual-calendar-mode': dualCalendar,\r\n 'compact': compact\r\n }\">\r\n <ng-container *ngTemplateOutlet=\"popupContent\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n@if (hasError){\r\n<p class=\"calender-error\">{{errorMessage}}</p>\r\n}\r\n", styles: [".calendar-container,.calendar-container *{font-family:Inter,sans-serif!important}.calendar-container{position:relative;display:inline-block;width:100%}.input-wrapper{position:relative;display:flex;align-items:center}.calendar-input{width:100%;padding:9px 14px 9px 40px;border:1px solid #ddd;border-radius:8px;font-size:14px;cursor:pointer;background:#fff;transition:all .2s}.calendar-input:hover{border-color:#999}.calendar-input:focus{outline:none;border-color:#999}.calendar-icon{position:absolute;left:12px;pointer-events:none;font-size:18px}.clear-btn{position:absolute;right:9px;background:none;border:none;font-size:20px;color:#999;cursor:pointer;padding:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;line-height:1;transition:color .2s;top:8px}.clear-btn:hover{color:#333}.calendar-popup{width:320px;background:#fff;border-radius:12px;box-shadow:0 10px 40px #00000026;z-index:1000;animation:slideDown .2s ease-out;font-family:Inter,sans-serif;scrollbar-width:thin;scrollbar-color:#c1c1c1 transparent}.calendar-popup::-webkit-scrollbar{width:6px}.calendar-popup::-webkit-scrollbar-track{background:transparent}.calendar-popup::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:3px}.calendar-popup::-webkit-scrollbar-thumb:hover{background:#a8a8a8}.calendar-popup:focus-visible{outline:0!important}.calendar-popup.inline-calendar{position:relative;top:0;left:0;width:100%;margin-top:0;animation:none;box-shadow:0 2px 8px #0000001a}.calendar-container.inline-mode{display:block;width:100%}.calendar-popup.dual-calendar-mode{width:600px}.calendar-popup.dual-calendar-mode.has-ranges{width:730px}.calendar-popup.has-ranges{width:450px}.calendar-popup.drop-up{animation:slideUp .2s ease-out}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.ranges{display:flex;flex-direction:column;gap:4px;margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid #eee;min-width:150px;padding-right:8px;scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}.range-btn{padding:7px 10px;border:1px solid transparent;background:transparent;border-radius:4px;cursor:pointer;text-align:left;font-size:14px;transition:all .2s;color:#838383;font-weight:500}.range-btn:hover{background:#f5f5f5;color:#000}.range-btn.active{background:#f0f0f0;color:#000;font-weight:500}.calendar-wrapper{padding:0 12px 12px}.header{display:flex;justify-content:space-between;align-items:center;padding:12px 0;min-height:54px;box-sizing:border-box}.month-year{font-size:15px;font-weight:500;color:#333;flex:1;display:flex;align-items:center;justify-content:center;text-align:center;text-transform:capitalize}.bk-month-year-btn{@apply bg-transparent border-0 rounded py-1 px-1 cursor-pointer transition-all duration-200;font:inherit;color:inherit;text-transform:inherit}.bk-month-year-btn:hover:not(:disabled){@apply text-black;}.bk-month-year-btn:disabled{@apply cursor-not-allowed text-[#ccc] opacity-50;}.nav-btn{background:none;border:none;font-size:24px;cursor:pointer;padding:11.5px 14px;color:#666;border-radius:4px;transition:all .2s;line-height:1;height:30px;width:30px;display:flex;justify-content:center;align-items:center}.nav-btn:hover{background:#f0f0f0;color:#000}.nav-btn img{max-width:none!important}.nav-btn:disabled{cursor:not-allowed;opacity:.35;pointer-events:none}.bk-grid-picker{@apply flex flex-col box-border h-[256px];}.bk-month-grid,.bk-year-grid{@apply grid grid-cols-3 auto-rows-min shrink-0 gap-[18px];}.bk-today-btn{@apply shrink-0 w-full p-2 mt-2 border border-[#eee] rounded-md bg-transparent text-[#333] text-[13px] font-medium cursor-pointer transition-all duration-200;}.bk-today-btn:hover:not(:disabled){@apply bg-[#efefef] text-black;}.bk-today-btn:disabled{@apply text-[#ddd] cursor-not-allowed opacity-50;}.bk-month-cell,.bk-year-cell{@apply flex items-center justify-center py-2.5 px-1 text-[13px] font-medium text-[#333] bg-transparent border-0 rounded-md cursor-pointer text-center transition-all duration-200;}.bk-month-cell:hover:not(:disabled):not(.active):not(.current),.bk-year-cell:hover:not(:disabled):not(.active):not(.current){@apply bg-[#efefef] text-black;}.bk-month-cell.active,.bk-year-cell.active{@apply bg-black text-white font-semibold;}.bk-month-cell.current:not(.active),.bk-year-cell.current:not(.active){@apply bg-[#e5e4e4] font-semibold;}.bk-month-cell:disabled,.bk-year-cell:disabled{@apply text-[#ddd] cursor-not-allowed opacity-50;}.calendar-table{width:100%;border-collapse:collapse;text-align:center}.weekday-header{font-size:12px;color:#7e7e7e;font-weight:600;padding:8px 4px;letter-spacing:.3px}.calendar-day{padding:8px 4px;font-size:14px;cursor:pointer;border-radius:6px;transition:all .2s;position:relative;color:#333;font-weight:500;line-height:1.5}.calendar-day:hover:not(.disabled):not(.other-month){background:#efefef;color:#000}.calendar-day.other-month{color:#ccc;cursor:default}.calendar-day.disabled{color:#ddd;cursor:not-allowed;opacity:.5}.calendar-day.active{background:#000!important;color:#fff!important;font-weight:600}.calendar-day.today{font-weight:600}.calendar-day.today:not(.active){background:#e5e4e4}.calendar-day.active:hover{background:#000!important}.calendar-day.today.disabled,.bk-month-cell.current:disabled,.bk-year-cell.current:disabled{color:#a9a9a9}.calendar-day.in-range{background:#f5f5f5;color:#333;border-radius:0;position:relative}.calendar-day.in-range:hover{background:#e8e8e8}.calendar-day.in-range:before{content:\"\";position:absolute;inset:0;background:#f5f5f5;z-index:-1}.calendar-day.in-range:hover:before{background:#e8e8e8}.calendar-day.multi-selected{background:#4caf50;color:#fff;font-weight:600;border-radius:6px}.calendar-day.multi-selected:hover{background:#45a049}.dual-calendar{display:flex;width:100%}.calendar-left,.calendar-right{flex:1;min-width:0;padding:0 12px 12px}.calendar-popup.has-ranges{display:flex;flex-direction:row}.calendar-popup.has-ranges .ranges{margin-bottom:0;border-bottom:none;padding:10px}.calendar-popup.has-ranges .dual-calendar,.calendar-popup.has-ranges .calendar-wrapper{flex:1}.calendar-right .header{justify-content:space-between}.calendar-right .header .month-year{text-align:center;flex:1}.timepicker-section{margin-top:12px;padding-top:12px;border-top:1px solid #eee}.timepicker-label{font-size:12px;font-weight:500;color:#000;margin-bottom:4px;letter-spacing:-.28px}.footer{padding:12px;display:flex;justify-content:flex-end;gap:8px;border-top:1px solid #eee}.btn-cancel,.btn-apply{padding:8px 16px;border:none;border-radius:4px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s;min-width:80px}.btn-cancel{background:#fff;color:#666;border:1px solid #ddd}.btn-apply{background:#000;color:#fff}.btn-apply:active{transform:translateY(0)}@media (max-width: 576px){.calendar-popup.dual-calendar-mode{max-width:300px}}@media (max-width: 768px){.dual-calendar{flex-direction:column}}@media (min-width: 577px) and (max-width: 1024px){.calendar-popup.dual-calendar-mode{max-width:500px}}@media (max-width: 1024px){.calendar-popup{width:100%;max-width:320px;max-height:300px;overflow:auto}.calendar-popup.dual-calendar-mode{width:100%;max-width:100%}.calendar-popup.has-ranges{flex-direction:column}.calendar-popup.has-ranges .ranges{border-right:none;border-bottom:1px solid #eee;padding-right:0;margin-right:0;padding-bottom:16px;margin-bottom:16px}}.ranges::-webkit-scrollbar{width:6px}.ranges::-webkit-scrollbar-track{background:#f1f1f1;border-radius:3px}.ranges::-webkit-scrollbar-thumb{background:#888;border-radius:3px}.ranges::-webkit-scrollbar-thumb:hover{background:#555}.w-100{width:100%}.flex-grow-1{flex-grow:1}.calendar-input.calendar-input-has-error{@apply border-[#d11e14];}.calendar-input:disabled{cursor:not-allowed;border-color:#e3e3e7;background-color:#f4f4f6;color:#a1a3ae}.btn-apply:disabled{cursor:not-allowed!important;opacity:.7}.calendar-day.calendar-day-keyboard-focus:not(.disabled):not(.other-month){outline:0px solid #000}.calendar-popup.compact{width:240px}.calendar-popup.compact.has-ranges{width:380px}.calendar-popup.compact.dual-calendar-mode{width:480px}.calendar-popup.compact.dual-calendar-mode.has-ranges{width:600px}.calendar-popup.compact .header{padding:8px 0;min-height:40px}.calendar-popup.compact .month-year{font-size:13px}.calendar-popup.compact .nav-btn{height:24px;width:24px;padding:6px 8px}.calendar-popup.compact .calendar-wrapper,.calendar-popup.compact .calendar-left,.calendar-popup.compact .calendar-right{padding:0 8px 8px}.calendar-popup.compact .weekday-header{font-size:11px;padding:4px 2px}.calendar-popup.compact .calendar-day{font-size:12px;padding:5px 2px;line-height:1.3}.calendar-popup.compact .ranges{min-width:120px;gap:2px;margin-bottom:8px;padding-bottom:8px}.calendar-popup.compact.has-ranges .ranges{padding:6px}.calendar-popup.compact .range-btn{font-size:12px;padding:5px 8px}.calendar-popup.compact .timepicker-section{margin-top:8px;padding-top:8px}.calendar-popup.compact .timepicker-label{font-size:11px}.calendar-popup.compact .footer{padding:8px;gap:6px}.calendar-popup.compact .btn-cancel,.calendar-popup.compact .btn-apply{font-size:11px;padding:6px 12px;min-width:64px}.calendar-popup.compact .bk-month-year-btn{@apply text-[13px] py-px px-1;}.calendar-popup.compact .nav-btn img{width:12px;height:8px}.calendar-popup.compact .bk-nav-btn-year img{width:12px;height:12px}.calendar-popup.compact .bk-grid-picker{@apply h-[178px];@apply justify-center;}.calendar-popup.compact .bk-month-grid,.calendar-popup.compact .bk-year-grid{@apply gap-1;}.calendar-popup.compact .bk-month-cell,.calendar-popup.compact .bk-year-cell{@apply text-[11px] py-1.5 px-0.5;}.calendar-popup.compact .bk-today-btn{@apply text-[11px] p-[5px];}\n"] }]
4047
4047
  }], ctorParameters: () => [{ type: BkCalendarManagerService }], propDecorators: { enableTimepicker: [{
4048
4048
  type: Input
4049
4049
  }], autoApply: [{
@@ -11476,7 +11476,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
11476
11476
  * flip — they stay under their trigger and scroll instead.
11477
11477
  */
11478
11478
  class BkMenu {
11479
- host;
11480
11479
  items = [];
11481
11480
  orientation = 'vertical';
11482
11481
  submenuMode = 'inline';
@@ -11554,9 +11553,6 @@ class BkMenu {
11554
11553
  return 210;
11555
11554
  }
11556
11555
  closeTimer = null;
11557
- constructor(host) {
11558
- this.host = host;
11559
- }
11560
11556
  /**
11561
11557
  * Inline mode: whenever the active leaf is (re)set — including the very
11562
11558
  * first binding, so a deep link or a page refresh lands with the section
@@ -11881,24 +11877,32 @@ class BkMenu {
11881
11877
  this.popupSide.clear();
11882
11878
  this.measuredIds.clear();
11883
11879
  }
11884
- // Pop-up mode: click outside the menu closes any open fly-outs.
11885
- onDocumentClick(event) {
11886
- if (this.isPopup && !this.host.nativeElement.contains(event.target)) {
11880
+ // Pop-up mode: any click that isn't on a menu button closes any open
11881
+ // fly-outs — both a genuine click outside the host, and a click that lands
11882
+ // on an open panel's own blank space (padding, group-title, background).
11883
+ // Fly-outs are position:fixed, so a click on one reads as "elsewhere" on
11884
+ // screen even though the panel is still a DOM descendant of the host — a
11885
+ // plain `host.contains(target)` check missed that and left the panel's own
11886
+ // blank space as a dead zone that couldn't close it. A real button click
11887
+ // never reaches here at all: onItemClick() calls event.stopPropagation()
11888
+ // before this document listener sees it, so this only ever fires for
11889
+ // clicks the menu itself didn't already handle.
11890
+ onDocumentClick() {
11891
+ if (this.isPopup && this.openIds.size)
11887
11892
  this.closeAll();
11888
- }
11889
11893
  }
11890
11894
  // Positions become stale on scroll/resize — close fly-outs to avoid drift.
11891
11895
  onViewportChange() {
11892
11896
  if (this.isPopup && this.openIds.size)
11893
11897
  this.closeAll();
11894
11898
  }
11895
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BkMenu, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
11896
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: BkMenu, isStandalone: true, selector: "bk-menu", inputs: { items: "items", orientation: "orientation", submenuMode: "submenuMode", trigger: "trigger", size: "size", hoverCloseDelay: "hoverCloseDelay", singleOpen: "singleOpen", submenuBackground: "submenuBackground", emitParentClick: "emitParentClick", activeItemId: "activeItemId", tintIcons: "tintIcons", maxHeight: "maxHeight" }, outputs: { activeItemIdChange: "activeItemIdChange", itemClick: "itemClick" }, host: { listeners: { "document:click": "onDocumentClick($event)", "window:scroll": "onViewportChange()", "window:resize": "onViewportChange()" } }, usesOnChanges: true, ngImport: i0, template: "<nav\r\n class=\"bk-menu\"\r\n [class.bk-menu--vertical]=\"isVertical\"\r\n [class.bk-menu--horizontal]=\"!isVertical\"\r\n [class.bk-menu--popup]=\"isPopup\"\r\n [class.bk-menu--compact]=\"isCompact\"\r\n [class.bk-menu--tint]=\"tintIcons\"\r\n role=\"menubar\"\r\n [attr.aria-orientation]=\"orientation\">\r\n <ul\r\n class=\"bk-menu__list\"\r\n [class.bk-menu__list--scroll]=\"maxHeightStyle\"\r\n [style.maxHeight]=\"maxHeightStyle\">\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTpl; context: { $implicit: items, level: 0, parent: null }\">\r\n </ng-container>\r\n </ul>\r\n</nav>\r\n\r\n<!-- Recursive item renderer. Context: $implicit = items at this level,\r\n level = depth, parent = the item they hang off (null at the top). -->\r\n<ng-template #itemTpl let-items let-level=\"level\" let-parent=\"parent\">\r\n @for (item of items; track item.id; let i = $index) {\r\n @if (isGroupStart(items, i)) {\r\n <li\r\n class=\"bk-menu__group-title bk-menu__group-title--section\"\r\n [class.bk-menu__group-title--divider]=\"i > 0\"\r\n [style.paddingLeft.px]=\"groupTitleIndent(level)\"\r\n role=\"presentation\">\r\n {{ item.groupLabel }}\r\n </li>\r\n }\r\n <li\r\n class=\"bk-menu__item\"\r\n [class.bk-menu__item--has-children]=\"hasChildren(item)\"\r\n [class.bk-menu__item--open]=\"isOpen(item)\"\r\n (mouseenter)=\"onItemEnter(item, items, $event, level, parent)\"\r\n (mouseleave)=\"onItemLeave(item)\"\r\n role=\"none\">\r\n <button\r\n type=\"button\"\r\n class=\"bk-menu__button\"\r\n [class.bk-menu__button--active]=\"isHighlighted(item)\"\r\n [class.bk-menu__button--disabled]=\"item.disabled\"\r\n [class.bk-menu__button--parent]=\"hasChildren(item)\"\r\n [style.paddingLeft.px]=\"inlineIndent(level)\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-haspopup]=\"hasChildren(item) ? 'true' : null\"\r\n [attr.aria-expanded]=\"hasChildren(item) ? isOpen(item) : null\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item, items, $event, level, parent)\">\r\n @if (item.icon) {\r\n <img class=\"bk-menu__icon\" [attr.src]=\"item.icon\" [alt]=\"item.iconAlt || item.label\" />\r\n }\r\n <span class=\"bk-menu__label\" (mouseenter)=\"onLabelEnter($event)\">{{ item.label }}</span>\r\n @if (hasChildren(item)) {\r\n <svg\r\n class=\"bk-menu__chevron\"\r\n [class.bk-menu__chevron--open]=\"!isPopup && isOpen(item)\"\r\n [class.bk-menu__chevron--right]=\"chevronDir(item, level) === 'right'\"\r\n [class.bk-menu__chevron--left]=\"chevronDir(item, level) === 'left'\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden=\"true\">\r\n <path d=\"M6 9L12 15L18 9\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (hasChildren(item)) {\r\n <ul\r\n class=\"bk-menu__submenu\"\r\n [class.bk-menu__submenu--inline]=\"!isPopup\"\r\n [class.bk-menu__submenu--bg]=\"submenuBackground && !isPopup\"\r\n [class.bk-menu__submenu--popup]=\"isPopup\"\r\n [class.bk-menu__submenu--open]=\"isOpen(item)\"\r\n [class.bk-menu__submenu--placing]=\"isPlacing(item)\"\r\n [class.bk-menu__submenu--side-right]=\"submenuSide(item) === 'right'\"\r\n [class.bk-menu__submenu--side-left]=\"submenuSide(item) === 'left'\"\r\n [class.bk-menu__submenu--side-down]=\"submenuSide(item) === 'down'\"\r\n [class.bk-menu__submenu--side-up]=\"submenuSide(item) === 'up'\"\r\n [style.top.px]=\"popupTop(item)\"\r\n [style.left.px]=\"popupLeft(item)\"\r\n [style.maxWidth]=\"popupMaxWidth(item)\"\r\n [style.maxHeight]=\"popupMaxHeight(item)\"\r\n role=\"menu\"\r\n [attr.aria-label]=\"item.childrenLabel || item.label\">\r\n @if (item.childrenLabel) {\r\n <li\r\n class=\"bk-menu__group-title\"\r\n [style.paddingLeft.px]=\"groupTitleIndent(level)\"\r\n (mouseenter)=\"onLabelEnter($event)\"\r\n role=\"presentation\">\r\n {{ item.childrenLabel }}\r\n </li>\r\n }\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTpl;\r\n context: { $implicit: item.children, level: level + 1, parent: item }\">\r\n </ng-container>\r\n </ul>\r\n }\r\n </li>\r\n }\r\n</ng-template>\r\n", styles: [".bk-menu{--menu-bg: #ffffff;--menu-submenu-bg: #f8f8f8;--menu-text: #141414;--menu-subtext: #6b7080;--menu-hover-bg: #edeef0;--menu-hover-text: #141414;--menu-active-bg: #141414;--menu-active-text: #ffffff;--menu-border: #efeff1;--menu-shadow: 0 7px 18px 0 rgba(0, 0, 0, .09);--menu-radius: 8px;--menu-disabled: .5;--menu-font-size: 14px;--menu-tracking: -.28px;--menu-pad-y: 10px;--menu-submenu-pad-y: 8px;--menu-pad-x: 12px;--menu-gap: 8px;--menu-icon-size: 16px;--menu-chevron-size: 16px;--menu-group-font-size: 11px;--menu-title-outdent: 8px;--menu-popup-pad: 4px;--menu-popup-pad-y: 8px;--menu-popup-item-pad-x: 16px;--menu-popup-min-w: 200px;--menu-popup-max-w: 280px;@apply block w-full max-w-full font-medium bg-[var(--menu-bg)] text-[color:var(--menu-text)] border border-[var(--menu-border)] rounded-[var(--menu-radius)] overflow-hidden;font-size:var(--menu-font-size);letter-spacing:var(--menu-tracking)}.bk-menu--compact{--menu-radius: 6px;--menu-font-size: 12px;--menu-tracking: -.24px;--menu-pad-y: 6px;--menu-submenu-pad-y: 4px;--menu-pad-x: 8px;--menu-gap: 6px;--menu-icon-size: 14px;--menu-chevron-size: 14px;--menu-group-font-size: 10px;--menu-title-outdent: 6px;--menu-popup-pad: 3px;--menu-popup-pad-y: 6px;--menu-popup-item-pad-x: 14px;--menu-popup-min-w: 160px;--menu-popup-max-w: 240px}.bk-menu__list,.bk-menu__submenu{@apply list-none m-0 p-0;}.bk-menu__list--scroll{@apply overflow-auto;}.bk-menu--horizontal>.bk-menu__list{@apply flex flex-row items-stretch overflow-x-auto;}.bk-menu__item{@apply relative;}.bk-menu__button{@apply flex items-center w-full m-0 border-0 bg-transparent text-inherit text-left cursor-pointer whitespace-nowrap transition-colors duration-100;font:inherit;letter-spacing:inherit;gap:var(--menu-gap);padding:var(--menu-pad-y) var(--menu-pad-x)}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item>.bk-menu__button{@apply w-auto;}.bk-menu--vertical>.bk-menu__list>.bk-menu__item:first-child>.bk-menu__button{@apply rounded-t-[var(--menu-radius)];}.bk-menu--vertical>.bk-menu__list>.bk-menu__item:last-child>.bk-menu__button{@apply rounded-b-[var(--menu-radius)];}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item:first-child>.bk-menu__button{@apply rounded-l-[var(--menu-radius)];}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item:last-child>.bk-menu__button{@apply rounded-r-[var(--menu-radius)];}.bk-menu__button:hover:not(:disabled):not(.bk-menu__button--active){@apply bg-[var(--menu-hover-bg)] text-[color:var(--menu-hover-text)];}.bk-menu__button--active{@apply bg-[var(--menu-active-bg)] text-[color:var(--menu-active-text)];}.bk-menu__button--disabled,.bk-menu__button:disabled{@apply opacity-[var(--menu-disabled)] cursor-not-allowed;}.bk-menu__submenu .bk-menu__button{@apply text-[color:var(--menu-subtext)] font-normal;padding-top:var(--menu-submenu-pad-y);padding-bottom:var(--menu-submenu-pad-y)}.bk-menu__submenu--popup .bk-menu__button{padding-left:var(--menu-popup-item-pad-x);padding-right:var(--menu-popup-item-pad-x)}.bk-menu__submenu .bk-menu__button--active{@apply text-[color:var(--menu-active-text)];}.bk-menu__group-title{@apply font-semibold uppercase tracking-wider text-[color:var(--menu-subtext)] whitespace-nowrap overflow-hidden text-ellipsis select-none;font-size:var(--menu-group-font-size);padding:var(--menu-pad-y) var(--menu-pad-x) calc(var(--menu-pad-y) / 2);padding-left:calc(var(--menu-pad-x) - var(--menu-title-outdent))}.bk-menu__submenu--popup>.bk-menu__group-title{margin-left:calc(var(--menu-popup-pad) * -1);margin-right:calc(var(--menu-popup-pad) * -1);padding-left:calc(var(--menu-popup-item-pad-x) - var(--menu-title-outdent) + var(--menu-popup-pad) + 2px);padding-right:calc(var(--menu-popup-item-pad-x) + var(--menu-popup-pad) + 2px)}.bk-menu__group-title--section{@apply mb-0 tracking-wide;padding-top:calc(var(--menu-pad-y) * 1.25)}.bk-menu__group-title--divider{@apply border-t border-[var(--menu-border)];margin-top:calc(var(--menu-pad-y) / 2)}.bk-menu__icon{@apply shrink-0 object-contain;width:var(--menu-icon-size);height:var(--menu-icon-size)}.bk-menu--tint .bk-menu__icon{@apply [filter:brightness(0)_saturate(0)];}.bk-menu--tint .bk-menu__button--active .bk-menu__icon{@apply [filter:brightness(0)_invert(1)];}.bk-menu__label{@apply flex-auto min-w-0 overflow-hidden text-ellipsis;}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item>.bk-menu__button>.bk-menu__label{@apply flex-none overflow-visible;}.bk-menu__chevron{@apply shrink-0 opacity-80 transition-transform duration-[.18s];width:var(--menu-chevron-size);height:var(--menu-chevron-size)}.bk-menu__chevron--open{@apply rotate-180;}.bk-menu__chevron--right{@apply -rotate-90;}.bk-menu__chevron--left{@apply rotate-90;}.bk-menu__submenu--inline{@apply overflow-hidden max-h-0 transition-[max-height] duration-200;}.bk-menu__submenu--inline.bk-menu__submenu--open{@apply max-h-[1000px];}.bk-menu__submenu--inline.bk-menu__submenu--bg{background-color:var(--menu-submenu-bg)}.bk-menu__submenu--popup{@apply fixed z-[1000] max-h-[100vh-16px] overflow-y-auto overflow-x-hidden bg-[var(--menu-bg)] border border-[var(--menu-border)] rounded-xl shadow-[var(--menu-shadow)] hidden;padding:var(--menu-popup-pad-y) var(--menu-popup-pad);min-width:var(--menu-popup-min-w);max-width:var(--menu-popup-max-w)}.bk-menu__submenu--popup.bk-menu__submenu--open{@apply block;}.bk-menu__submenu--placing{@apply opacity-0 pointer-events-none;}@media (max-width: 640px){.bk-menu--horizontal>.bk-menu__list{@apply overflow-x-auto;-webkit-overflow-scrolling:touch}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
11899
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BkMenu, deps: [], target: i0.ɵɵFactoryTarget.Component });
11900
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: BkMenu, isStandalone: true, selector: "bk-menu", inputs: { items: "items", orientation: "orientation", submenuMode: "submenuMode", trigger: "trigger", size: "size", hoverCloseDelay: "hoverCloseDelay", singleOpen: "singleOpen", submenuBackground: "submenuBackground", emitParentClick: "emitParentClick", activeItemId: "activeItemId", tintIcons: "tintIcons", maxHeight: "maxHeight" }, outputs: { activeItemIdChange: "activeItemIdChange", itemClick: "itemClick" }, host: { listeners: { "document:click": "onDocumentClick()", "window:scroll": "onViewportChange()", "window:resize": "onViewportChange()" } }, usesOnChanges: true, ngImport: i0, template: "<nav\r\n class=\"bk-menu\"\r\n [class.bk-menu--vertical]=\"isVertical\"\r\n [class.bk-menu--horizontal]=\"!isVertical\"\r\n [class.bk-menu--popup]=\"isPopup\"\r\n [class.bk-menu--compact]=\"isCompact\"\r\n [class.bk-menu--tint]=\"tintIcons\"\r\n role=\"menubar\"\r\n [attr.aria-orientation]=\"orientation\">\r\n <ul\r\n class=\"bk-menu__list\"\r\n [class.bk-menu__list--scroll]=\"maxHeightStyle\"\r\n [style.maxHeight]=\"maxHeightStyle\">\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTpl; context: { $implicit: items, level: 0, parent: null }\">\r\n </ng-container>\r\n </ul>\r\n</nav>\r\n\r\n<!-- Recursive item renderer. Context: $implicit = items at this level,\r\n level = depth, parent = the item they hang off (null at the top). -->\r\n<ng-template #itemTpl let-items let-level=\"level\" let-parent=\"parent\">\r\n @for (item of items; track item.id; let i = $index) {\r\n @if (isGroupStart(items, i)) {\r\n <li\r\n class=\"bk-menu__group-title bk-menu__group-title--section\"\r\n [class.bk-menu__group-title--divider]=\"i > 0\"\r\n [style.paddingLeft.px]=\"groupTitleIndent(level)\"\r\n role=\"presentation\">\r\n {{ item.groupLabel }}\r\n </li>\r\n }\r\n <li\r\n class=\"bk-menu__item\"\r\n [class.bk-menu__item--has-children]=\"hasChildren(item)\"\r\n [class.bk-menu__item--open]=\"isOpen(item)\"\r\n (mouseenter)=\"onItemEnter(item, items, $event, level, parent)\"\r\n (mouseleave)=\"onItemLeave(item)\"\r\n role=\"none\">\r\n <button\r\n type=\"button\"\r\n class=\"bk-menu__button\"\r\n [class.bk-menu__button--active]=\"isHighlighted(item)\"\r\n [class.bk-menu__button--disabled]=\"item.disabled\"\r\n [class.bk-menu__button--parent]=\"hasChildren(item)\"\r\n [style.paddingLeft.px]=\"inlineIndent(level)\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-haspopup]=\"hasChildren(item) ? 'true' : null\"\r\n [attr.aria-expanded]=\"hasChildren(item) ? isOpen(item) : null\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item, items, $event, level, parent)\">\r\n @if (item.icon) {\r\n <img class=\"bk-menu__icon\" [attr.src]=\"item.icon\" [alt]=\"item.iconAlt || item.label\" />\r\n }\r\n <span class=\"bk-menu__label\" (mouseenter)=\"onLabelEnter($event)\">{{ item.label }}</span>\r\n @if (hasChildren(item)) {\r\n <svg\r\n class=\"bk-menu__chevron\"\r\n [class.bk-menu__chevron--open]=\"!isPopup && isOpen(item)\"\r\n [class.bk-menu__chevron--right]=\"chevronDir(item, level) === 'right'\"\r\n [class.bk-menu__chevron--left]=\"chevronDir(item, level) === 'left'\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden=\"true\">\r\n <path d=\"M6 9L12 15L18 9\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (hasChildren(item)) {\r\n <ul\r\n class=\"bk-menu__submenu\"\r\n [class.bk-menu__submenu--inline]=\"!isPopup\"\r\n [class.bk-menu__submenu--bg]=\"submenuBackground && !isPopup\"\r\n [class.bk-menu__submenu--popup]=\"isPopup\"\r\n [class.bk-menu__submenu--open]=\"isOpen(item)\"\r\n [class.bk-menu__submenu--placing]=\"isPlacing(item)\"\r\n [class.bk-menu__submenu--side-right]=\"submenuSide(item) === 'right'\"\r\n [class.bk-menu__submenu--side-left]=\"submenuSide(item) === 'left'\"\r\n [class.bk-menu__submenu--side-down]=\"submenuSide(item) === 'down'\"\r\n [class.bk-menu__submenu--side-up]=\"submenuSide(item) === 'up'\"\r\n [style.top.px]=\"popupTop(item)\"\r\n [style.left.px]=\"popupLeft(item)\"\r\n [style.maxWidth]=\"popupMaxWidth(item)\"\r\n [style.maxHeight]=\"popupMaxHeight(item)\"\r\n role=\"menu\"\r\n [attr.aria-label]=\"item.childrenLabel || item.label\">\r\n @if (item.childrenLabel) {\r\n <li\r\n class=\"bk-menu__group-title\"\r\n [style.paddingLeft.px]=\"groupTitleIndent(level)\"\r\n (mouseenter)=\"onLabelEnter($event)\"\r\n role=\"presentation\">\r\n {{ item.childrenLabel }}\r\n </li>\r\n }\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTpl;\r\n context: { $implicit: item.children, level: level + 1, parent: item }\">\r\n </ng-container>\r\n </ul>\r\n }\r\n </li>\r\n }\r\n</ng-template>\r\n", styles: [".bk-menu{--menu-bg: #ffffff;--menu-submenu-bg: #f8f8f8;--menu-text: #141414;--menu-subtext: #6b7080;--menu-hover-bg: #edeef0;--menu-hover-text: #141414;--menu-active-bg: #141414;--menu-active-text: #ffffff;--menu-border: #efeff1;--menu-shadow: 0 7px 18px 0 rgba(0, 0, 0, .09);--menu-radius: 8px;--menu-disabled: .5;--menu-font-size: 14px;--menu-tracking: -.28px;--menu-pad-y: 10px;--menu-submenu-pad-y: 8px;--menu-pad-x: 12px;--menu-gap: 8px;--menu-icon-size: 16px;--menu-chevron-size: 16px;--menu-group-font-size: 11px;--menu-title-outdent: 8px;--menu-popup-pad: 4px;--menu-popup-pad-y: 8px;--menu-popup-item-pad-x: 16px;--menu-popup-min-w: 200px;--menu-popup-max-w: 280px;@apply block w-full max-w-full font-medium bg-[var(--menu-bg)] text-[color:var(--menu-text)] border border-[var(--menu-border)] rounded-[var(--menu-radius)] overflow-hidden;font-size:var(--menu-font-size);letter-spacing:var(--menu-tracking)}.bk-menu--compact{--menu-radius: 6px;--menu-font-size: 12px;--menu-tracking: -.24px;--menu-pad-y: 6px;--menu-submenu-pad-y: 4px;--menu-pad-x: 8px;--menu-gap: 6px;--menu-icon-size: 14px;--menu-chevron-size: 14px;--menu-group-font-size: 10px;--menu-title-outdent: 6px;--menu-popup-pad: 3px;--menu-popup-pad-y: 6px;--menu-popup-item-pad-x: 14px;--menu-popup-min-w: 160px;--menu-popup-max-w: 240px}.bk-menu__list,.bk-menu__submenu{@apply list-none m-0 p-0;}.bk-menu__list--scroll{@apply overflow-auto;}.bk-menu--horizontal>.bk-menu__list{@apply flex flex-row items-stretch overflow-x-auto;}.bk-menu__item{@apply relative;}.bk-menu__button{@apply flex items-center w-full m-0 border-0 bg-transparent text-inherit text-left cursor-pointer whitespace-nowrap transition-colors duration-100;font:inherit;letter-spacing:inherit;gap:var(--menu-gap);padding:var(--menu-pad-y) var(--menu-pad-x)}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item>.bk-menu__button{@apply w-auto;}.bk-menu--vertical>.bk-menu__list>.bk-menu__item:first-child>.bk-menu__button{@apply rounded-t-[var(--menu-radius)];}.bk-menu--vertical>.bk-menu__list>.bk-menu__item:last-child>.bk-menu__button{@apply rounded-b-[var(--menu-radius)];}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item:first-child>.bk-menu__button{@apply rounded-l-[var(--menu-radius)];}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item:last-child>.bk-menu__button{@apply rounded-r-[var(--menu-radius)];}.bk-menu--vertical:not(.bk-menu--popup)>.bk-menu__list>.bk-menu__item--open:last-child>.bk-menu__button{border-bottom-left-radius:0;border-bottom-right-radius:0}.bk-menu__button:hover:not(:disabled):not(.bk-menu__button--active){@apply bg-[var(--menu-hover-bg)] text-[color:var(--menu-hover-text)];}.bk-menu__item--open>.bk-menu__button:not(.bk-menu__button--active){@apply bg-[var(--menu-hover-bg)] text-[color:var(--menu-hover-text)];}.bk-menu__button--active{@apply bg-[var(--menu-active-bg)] text-[color:var(--menu-active-text)];}.bk-menu__button--disabled,.bk-menu__button:disabled{@apply opacity-[var(--menu-disabled)] cursor-not-allowed;}.bk-menu__submenu .bk-menu__button{@apply text-[color:var(--menu-subtext)] font-normal;padding-top:var(--menu-submenu-pad-y);padding-bottom:var(--menu-submenu-pad-y)}.bk-menu__submenu--popup .bk-menu__button{padding-left:var(--menu-popup-item-pad-x);padding-right:var(--menu-popup-item-pad-x)}.bk-menu__submenu .bk-menu__button--active{@apply text-[color:var(--menu-active-text)];}.bk-menu__group-title{@apply font-semibold uppercase tracking-wider text-[color:var(--menu-subtext)] whitespace-nowrap overflow-hidden text-ellipsis select-none;font-size:var(--menu-group-font-size);padding:var(--menu-pad-y) var(--menu-pad-x) calc(var(--menu-pad-y) / 2);padding-left:calc(var(--menu-pad-x) - var(--menu-title-outdent))}.bk-menu__submenu--popup>.bk-menu__group-title{margin-left:calc(var(--menu-popup-pad) * -1);margin-right:calc(var(--menu-popup-pad) * -1);padding-left:calc(var(--menu-popup-item-pad-x) - var(--menu-title-outdent) + var(--menu-popup-pad) + 2px);padding-right:calc(var(--menu-popup-item-pad-x) + var(--menu-popup-pad) + 2px)}.bk-menu__group-title--section{@apply mb-0 tracking-wide;padding-top:calc(var(--menu-pad-y) * 1.25)}.bk-menu__group-title--divider{@apply border-t border-[var(--menu-border)];margin-top:calc(var(--menu-pad-y) / 2)}.bk-menu__icon{@apply shrink-0 object-contain;width:var(--menu-icon-size);height:var(--menu-icon-size)}.bk-menu--tint .bk-menu__icon{@apply [filter:brightness(0)_saturate(0)];}.bk-menu--tint .bk-menu__button--active .bk-menu__icon{@apply [filter:brightness(0)_invert(1)];}.bk-menu__label{@apply flex-auto min-w-0 overflow-hidden text-ellipsis;}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item>.bk-menu__button>.bk-menu__label{@apply flex-none overflow-visible;}.bk-menu__chevron{@apply shrink-0 opacity-80 transition-transform duration-[.18s];width:var(--menu-chevron-size);height:var(--menu-chevron-size)}.bk-menu__chevron--open{@apply rotate-180;}.bk-menu__chevron--right{@apply -rotate-90;}.bk-menu__chevron--left{@apply rotate-90;}.bk-menu__submenu--inline{@apply overflow-hidden max-h-0 transition-[max-height] duration-200;}.bk-menu__submenu--inline.bk-menu__submenu--open{@apply max-h-[1000px];}.bk-menu__submenu--inline.bk-menu__submenu--bg{background-color:var(--menu-submenu-bg)}.bk-menu__submenu--popup{@apply fixed z-[1000] max-h-[100vh-16px] overflow-y-auto overflow-x-hidden bg-[var(--menu-bg)] border border-[var(--menu-border)] rounded-xl shadow-[var(--menu-shadow)] hidden;padding:var(--menu-popup-pad-y) var(--menu-popup-pad);min-width:var(--menu-popup-min-w);max-width:var(--menu-popup-max-w)}.bk-menu__submenu--popup.bk-menu__submenu--open{@apply block;}.bk-menu__submenu--placing{@apply opacity-0 pointer-events-none;}@media (max-width: 640px){.bk-menu--horizontal>.bk-menu__list{@apply overflow-x-auto;-webkit-overflow-scrolling:touch}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
11897
11901
  }
11898
11902
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BkMenu, decorators: [{
11899
11903
  type: Component,
11900
- args: [{ selector: 'bk-menu', standalone: true, imports: [CommonModule], template: "<nav\r\n class=\"bk-menu\"\r\n [class.bk-menu--vertical]=\"isVertical\"\r\n [class.bk-menu--horizontal]=\"!isVertical\"\r\n [class.bk-menu--popup]=\"isPopup\"\r\n [class.bk-menu--compact]=\"isCompact\"\r\n [class.bk-menu--tint]=\"tintIcons\"\r\n role=\"menubar\"\r\n [attr.aria-orientation]=\"orientation\">\r\n <ul\r\n class=\"bk-menu__list\"\r\n [class.bk-menu__list--scroll]=\"maxHeightStyle\"\r\n [style.maxHeight]=\"maxHeightStyle\">\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTpl; context: { $implicit: items, level: 0, parent: null }\">\r\n </ng-container>\r\n </ul>\r\n</nav>\r\n\r\n<!-- Recursive item renderer. Context: $implicit = items at this level,\r\n level = depth, parent = the item they hang off (null at the top). -->\r\n<ng-template #itemTpl let-items let-level=\"level\" let-parent=\"parent\">\r\n @for (item of items; track item.id; let i = $index) {\r\n @if (isGroupStart(items, i)) {\r\n <li\r\n class=\"bk-menu__group-title bk-menu__group-title--section\"\r\n [class.bk-menu__group-title--divider]=\"i > 0\"\r\n [style.paddingLeft.px]=\"groupTitleIndent(level)\"\r\n role=\"presentation\">\r\n {{ item.groupLabel }}\r\n </li>\r\n }\r\n <li\r\n class=\"bk-menu__item\"\r\n [class.bk-menu__item--has-children]=\"hasChildren(item)\"\r\n [class.bk-menu__item--open]=\"isOpen(item)\"\r\n (mouseenter)=\"onItemEnter(item, items, $event, level, parent)\"\r\n (mouseleave)=\"onItemLeave(item)\"\r\n role=\"none\">\r\n <button\r\n type=\"button\"\r\n class=\"bk-menu__button\"\r\n [class.bk-menu__button--active]=\"isHighlighted(item)\"\r\n [class.bk-menu__button--disabled]=\"item.disabled\"\r\n [class.bk-menu__button--parent]=\"hasChildren(item)\"\r\n [style.paddingLeft.px]=\"inlineIndent(level)\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-haspopup]=\"hasChildren(item) ? 'true' : null\"\r\n [attr.aria-expanded]=\"hasChildren(item) ? isOpen(item) : null\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item, items, $event, level, parent)\">\r\n @if (item.icon) {\r\n <img class=\"bk-menu__icon\" [attr.src]=\"item.icon\" [alt]=\"item.iconAlt || item.label\" />\r\n }\r\n <span class=\"bk-menu__label\" (mouseenter)=\"onLabelEnter($event)\">{{ item.label }}</span>\r\n @if (hasChildren(item)) {\r\n <svg\r\n class=\"bk-menu__chevron\"\r\n [class.bk-menu__chevron--open]=\"!isPopup && isOpen(item)\"\r\n [class.bk-menu__chevron--right]=\"chevronDir(item, level) === 'right'\"\r\n [class.bk-menu__chevron--left]=\"chevronDir(item, level) === 'left'\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden=\"true\">\r\n <path d=\"M6 9L12 15L18 9\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (hasChildren(item)) {\r\n <ul\r\n class=\"bk-menu__submenu\"\r\n [class.bk-menu__submenu--inline]=\"!isPopup\"\r\n [class.bk-menu__submenu--bg]=\"submenuBackground && !isPopup\"\r\n [class.bk-menu__submenu--popup]=\"isPopup\"\r\n [class.bk-menu__submenu--open]=\"isOpen(item)\"\r\n [class.bk-menu__submenu--placing]=\"isPlacing(item)\"\r\n [class.bk-menu__submenu--side-right]=\"submenuSide(item) === 'right'\"\r\n [class.bk-menu__submenu--side-left]=\"submenuSide(item) === 'left'\"\r\n [class.bk-menu__submenu--side-down]=\"submenuSide(item) === 'down'\"\r\n [class.bk-menu__submenu--side-up]=\"submenuSide(item) === 'up'\"\r\n [style.top.px]=\"popupTop(item)\"\r\n [style.left.px]=\"popupLeft(item)\"\r\n [style.maxWidth]=\"popupMaxWidth(item)\"\r\n [style.maxHeight]=\"popupMaxHeight(item)\"\r\n role=\"menu\"\r\n [attr.aria-label]=\"item.childrenLabel || item.label\">\r\n @if (item.childrenLabel) {\r\n <li\r\n class=\"bk-menu__group-title\"\r\n [style.paddingLeft.px]=\"groupTitleIndent(level)\"\r\n (mouseenter)=\"onLabelEnter($event)\"\r\n role=\"presentation\">\r\n {{ item.childrenLabel }}\r\n </li>\r\n }\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTpl;\r\n context: { $implicit: item.children, level: level + 1, parent: item }\">\r\n </ng-container>\r\n </ul>\r\n }\r\n </li>\r\n }\r\n</ng-template>\r\n", styles: [".bk-menu{--menu-bg: #ffffff;--menu-submenu-bg: #f8f8f8;--menu-text: #141414;--menu-subtext: #6b7080;--menu-hover-bg: #edeef0;--menu-hover-text: #141414;--menu-active-bg: #141414;--menu-active-text: #ffffff;--menu-border: #efeff1;--menu-shadow: 0 7px 18px 0 rgba(0, 0, 0, .09);--menu-radius: 8px;--menu-disabled: .5;--menu-font-size: 14px;--menu-tracking: -.28px;--menu-pad-y: 10px;--menu-submenu-pad-y: 8px;--menu-pad-x: 12px;--menu-gap: 8px;--menu-icon-size: 16px;--menu-chevron-size: 16px;--menu-group-font-size: 11px;--menu-title-outdent: 8px;--menu-popup-pad: 4px;--menu-popup-pad-y: 8px;--menu-popup-item-pad-x: 16px;--menu-popup-min-w: 200px;--menu-popup-max-w: 280px;@apply block w-full max-w-full font-medium bg-[var(--menu-bg)] text-[color:var(--menu-text)] border border-[var(--menu-border)] rounded-[var(--menu-radius)] overflow-hidden;font-size:var(--menu-font-size);letter-spacing:var(--menu-tracking)}.bk-menu--compact{--menu-radius: 6px;--menu-font-size: 12px;--menu-tracking: -.24px;--menu-pad-y: 6px;--menu-submenu-pad-y: 4px;--menu-pad-x: 8px;--menu-gap: 6px;--menu-icon-size: 14px;--menu-chevron-size: 14px;--menu-group-font-size: 10px;--menu-title-outdent: 6px;--menu-popup-pad: 3px;--menu-popup-pad-y: 6px;--menu-popup-item-pad-x: 14px;--menu-popup-min-w: 160px;--menu-popup-max-w: 240px}.bk-menu__list,.bk-menu__submenu{@apply list-none m-0 p-0;}.bk-menu__list--scroll{@apply overflow-auto;}.bk-menu--horizontal>.bk-menu__list{@apply flex flex-row items-stretch overflow-x-auto;}.bk-menu__item{@apply relative;}.bk-menu__button{@apply flex items-center w-full m-0 border-0 bg-transparent text-inherit text-left cursor-pointer whitespace-nowrap transition-colors duration-100;font:inherit;letter-spacing:inherit;gap:var(--menu-gap);padding:var(--menu-pad-y) var(--menu-pad-x)}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item>.bk-menu__button{@apply w-auto;}.bk-menu--vertical>.bk-menu__list>.bk-menu__item:first-child>.bk-menu__button{@apply rounded-t-[var(--menu-radius)];}.bk-menu--vertical>.bk-menu__list>.bk-menu__item:last-child>.bk-menu__button{@apply rounded-b-[var(--menu-radius)];}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item:first-child>.bk-menu__button{@apply rounded-l-[var(--menu-radius)];}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item:last-child>.bk-menu__button{@apply rounded-r-[var(--menu-radius)];}.bk-menu__button:hover:not(:disabled):not(.bk-menu__button--active){@apply bg-[var(--menu-hover-bg)] text-[color:var(--menu-hover-text)];}.bk-menu__button--active{@apply bg-[var(--menu-active-bg)] text-[color:var(--menu-active-text)];}.bk-menu__button--disabled,.bk-menu__button:disabled{@apply opacity-[var(--menu-disabled)] cursor-not-allowed;}.bk-menu__submenu .bk-menu__button{@apply text-[color:var(--menu-subtext)] font-normal;padding-top:var(--menu-submenu-pad-y);padding-bottom:var(--menu-submenu-pad-y)}.bk-menu__submenu--popup .bk-menu__button{padding-left:var(--menu-popup-item-pad-x);padding-right:var(--menu-popup-item-pad-x)}.bk-menu__submenu .bk-menu__button--active{@apply text-[color:var(--menu-active-text)];}.bk-menu__group-title{@apply font-semibold uppercase tracking-wider text-[color:var(--menu-subtext)] whitespace-nowrap overflow-hidden text-ellipsis select-none;font-size:var(--menu-group-font-size);padding:var(--menu-pad-y) var(--menu-pad-x) calc(var(--menu-pad-y) / 2);padding-left:calc(var(--menu-pad-x) - var(--menu-title-outdent))}.bk-menu__submenu--popup>.bk-menu__group-title{margin-left:calc(var(--menu-popup-pad) * -1);margin-right:calc(var(--menu-popup-pad) * -1);padding-left:calc(var(--menu-popup-item-pad-x) - var(--menu-title-outdent) + var(--menu-popup-pad) + 2px);padding-right:calc(var(--menu-popup-item-pad-x) + var(--menu-popup-pad) + 2px)}.bk-menu__group-title--section{@apply mb-0 tracking-wide;padding-top:calc(var(--menu-pad-y) * 1.25)}.bk-menu__group-title--divider{@apply border-t border-[var(--menu-border)];margin-top:calc(var(--menu-pad-y) / 2)}.bk-menu__icon{@apply shrink-0 object-contain;width:var(--menu-icon-size);height:var(--menu-icon-size)}.bk-menu--tint .bk-menu__icon{@apply [filter:brightness(0)_saturate(0)];}.bk-menu--tint .bk-menu__button--active .bk-menu__icon{@apply [filter:brightness(0)_invert(1)];}.bk-menu__label{@apply flex-auto min-w-0 overflow-hidden text-ellipsis;}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item>.bk-menu__button>.bk-menu__label{@apply flex-none overflow-visible;}.bk-menu__chevron{@apply shrink-0 opacity-80 transition-transform duration-[.18s];width:var(--menu-chevron-size);height:var(--menu-chevron-size)}.bk-menu__chevron--open{@apply rotate-180;}.bk-menu__chevron--right{@apply -rotate-90;}.bk-menu__chevron--left{@apply rotate-90;}.bk-menu__submenu--inline{@apply overflow-hidden max-h-0 transition-[max-height] duration-200;}.bk-menu__submenu--inline.bk-menu__submenu--open{@apply max-h-[1000px];}.bk-menu__submenu--inline.bk-menu__submenu--bg{background-color:var(--menu-submenu-bg)}.bk-menu__submenu--popup{@apply fixed z-[1000] max-h-[100vh-16px] overflow-y-auto overflow-x-hidden bg-[var(--menu-bg)] border border-[var(--menu-border)] rounded-xl shadow-[var(--menu-shadow)] hidden;padding:var(--menu-popup-pad-y) var(--menu-popup-pad);min-width:var(--menu-popup-min-w);max-width:var(--menu-popup-max-w)}.bk-menu__submenu--popup.bk-menu__submenu--open{@apply block;}.bk-menu__submenu--placing{@apply opacity-0 pointer-events-none;}@media (max-width: 640px){.bk-menu--horizontal>.bk-menu__list{@apply overflow-x-auto;-webkit-overflow-scrolling:touch}}\n"] }]
11901
- }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { items: [{
11904
+ args: [{ selector: 'bk-menu', standalone: true, imports: [CommonModule], template: "<nav\r\n class=\"bk-menu\"\r\n [class.bk-menu--vertical]=\"isVertical\"\r\n [class.bk-menu--horizontal]=\"!isVertical\"\r\n [class.bk-menu--popup]=\"isPopup\"\r\n [class.bk-menu--compact]=\"isCompact\"\r\n [class.bk-menu--tint]=\"tintIcons\"\r\n role=\"menubar\"\r\n [attr.aria-orientation]=\"orientation\">\r\n <ul\r\n class=\"bk-menu__list\"\r\n [class.bk-menu__list--scroll]=\"maxHeightStyle\"\r\n [style.maxHeight]=\"maxHeightStyle\">\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTpl; context: { $implicit: items, level: 0, parent: null }\">\r\n </ng-container>\r\n </ul>\r\n</nav>\r\n\r\n<!-- Recursive item renderer. Context: $implicit = items at this level,\r\n level = depth, parent = the item they hang off (null at the top). -->\r\n<ng-template #itemTpl let-items let-level=\"level\" let-parent=\"parent\">\r\n @for (item of items; track item.id; let i = $index) {\r\n @if (isGroupStart(items, i)) {\r\n <li\r\n class=\"bk-menu__group-title bk-menu__group-title--section\"\r\n [class.bk-menu__group-title--divider]=\"i > 0\"\r\n [style.paddingLeft.px]=\"groupTitleIndent(level)\"\r\n role=\"presentation\">\r\n {{ item.groupLabel }}\r\n </li>\r\n }\r\n <li\r\n class=\"bk-menu__item\"\r\n [class.bk-menu__item--has-children]=\"hasChildren(item)\"\r\n [class.bk-menu__item--open]=\"isOpen(item)\"\r\n (mouseenter)=\"onItemEnter(item, items, $event, level, parent)\"\r\n (mouseleave)=\"onItemLeave(item)\"\r\n role=\"none\">\r\n <button\r\n type=\"button\"\r\n class=\"bk-menu__button\"\r\n [class.bk-menu__button--active]=\"isHighlighted(item)\"\r\n [class.bk-menu__button--disabled]=\"item.disabled\"\r\n [class.bk-menu__button--parent]=\"hasChildren(item)\"\r\n [style.paddingLeft.px]=\"inlineIndent(level)\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-haspopup]=\"hasChildren(item) ? 'true' : null\"\r\n [attr.aria-expanded]=\"hasChildren(item) ? isOpen(item) : null\"\r\n role=\"menuitem\"\r\n (click)=\"onItemClick(item, items, $event, level, parent)\">\r\n @if (item.icon) {\r\n <img class=\"bk-menu__icon\" [attr.src]=\"item.icon\" [alt]=\"item.iconAlt || item.label\" />\r\n }\r\n <span class=\"bk-menu__label\" (mouseenter)=\"onLabelEnter($event)\">{{ item.label }}</span>\r\n @if (hasChildren(item)) {\r\n <svg\r\n class=\"bk-menu__chevron\"\r\n [class.bk-menu__chevron--open]=\"!isPopup && isOpen(item)\"\r\n [class.bk-menu__chevron--right]=\"chevronDir(item, level) === 'right'\"\r\n [class.bk-menu__chevron--left]=\"chevronDir(item, level) === 'left'\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden=\"true\">\r\n <path d=\"M6 9L12 15L18 9\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n </button>\r\n\r\n @if (hasChildren(item)) {\r\n <ul\r\n class=\"bk-menu__submenu\"\r\n [class.bk-menu__submenu--inline]=\"!isPopup\"\r\n [class.bk-menu__submenu--bg]=\"submenuBackground && !isPopup\"\r\n [class.bk-menu__submenu--popup]=\"isPopup\"\r\n [class.bk-menu__submenu--open]=\"isOpen(item)\"\r\n [class.bk-menu__submenu--placing]=\"isPlacing(item)\"\r\n [class.bk-menu__submenu--side-right]=\"submenuSide(item) === 'right'\"\r\n [class.bk-menu__submenu--side-left]=\"submenuSide(item) === 'left'\"\r\n [class.bk-menu__submenu--side-down]=\"submenuSide(item) === 'down'\"\r\n [class.bk-menu__submenu--side-up]=\"submenuSide(item) === 'up'\"\r\n [style.top.px]=\"popupTop(item)\"\r\n [style.left.px]=\"popupLeft(item)\"\r\n [style.maxWidth]=\"popupMaxWidth(item)\"\r\n [style.maxHeight]=\"popupMaxHeight(item)\"\r\n role=\"menu\"\r\n [attr.aria-label]=\"item.childrenLabel || item.label\">\r\n @if (item.childrenLabel) {\r\n <li\r\n class=\"bk-menu__group-title\"\r\n [style.paddingLeft.px]=\"groupTitleIndent(level)\"\r\n (mouseenter)=\"onLabelEnter($event)\"\r\n role=\"presentation\">\r\n {{ item.childrenLabel }}\r\n </li>\r\n }\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTpl;\r\n context: { $implicit: item.children, level: level + 1, parent: item }\">\r\n </ng-container>\r\n </ul>\r\n }\r\n </li>\r\n }\r\n</ng-template>\r\n", styles: [".bk-menu{--menu-bg: #ffffff;--menu-submenu-bg: #f8f8f8;--menu-text: #141414;--menu-subtext: #6b7080;--menu-hover-bg: #edeef0;--menu-hover-text: #141414;--menu-active-bg: #141414;--menu-active-text: #ffffff;--menu-border: #efeff1;--menu-shadow: 0 7px 18px 0 rgba(0, 0, 0, .09);--menu-radius: 8px;--menu-disabled: .5;--menu-font-size: 14px;--menu-tracking: -.28px;--menu-pad-y: 10px;--menu-submenu-pad-y: 8px;--menu-pad-x: 12px;--menu-gap: 8px;--menu-icon-size: 16px;--menu-chevron-size: 16px;--menu-group-font-size: 11px;--menu-title-outdent: 8px;--menu-popup-pad: 4px;--menu-popup-pad-y: 8px;--menu-popup-item-pad-x: 16px;--menu-popup-min-w: 200px;--menu-popup-max-w: 280px;@apply block w-full max-w-full font-medium bg-[var(--menu-bg)] text-[color:var(--menu-text)] border border-[var(--menu-border)] rounded-[var(--menu-radius)] overflow-hidden;font-size:var(--menu-font-size);letter-spacing:var(--menu-tracking)}.bk-menu--compact{--menu-radius: 6px;--menu-font-size: 12px;--menu-tracking: -.24px;--menu-pad-y: 6px;--menu-submenu-pad-y: 4px;--menu-pad-x: 8px;--menu-gap: 6px;--menu-icon-size: 14px;--menu-chevron-size: 14px;--menu-group-font-size: 10px;--menu-title-outdent: 6px;--menu-popup-pad: 3px;--menu-popup-pad-y: 6px;--menu-popup-item-pad-x: 14px;--menu-popup-min-w: 160px;--menu-popup-max-w: 240px}.bk-menu__list,.bk-menu__submenu{@apply list-none m-0 p-0;}.bk-menu__list--scroll{@apply overflow-auto;}.bk-menu--horizontal>.bk-menu__list{@apply flex flex-row items-stretch overflow-x-auto;}.bk-menu__item{@apply relative;}.bk-menu__button{@apply flex items-center w-full m-0 border-0 bg-transparent text-inherit text-left cursor-pointer whitespace-nowrap transition-colors duration-100;font:inherit;letter-spacing:inherit;gap:var(--menu-gap);padding:var(--menu-pad-y) var(--menu-pad-x)}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item>.bk-menu__button{@apply w-auto;}.bk-menu--vertical>.bk-menu__list>.bk-menu__item:first-child>.bk-menu__button{@apply rounded-t-[var(--menu-radius)];}.bk-menu--vertical>.bk-menu__list>.bk-menu__item:last-child>.bk-menu__button{@apply rounded-b-[var(--menu-radius)];}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item:first-child>.bk-menu__button{@apply rounded-l-[var(--menu-radius)];}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item:last-child>.bk-menu__button{@apply rounded-r-[var(--menu-radius)];}.bk-menu--vertical:not(.bk-menu--popup)>.bk-menu__list>.bk-menu__item--open:last-child>.bk-menu__button{border-bottom-left-radius:0;border-bottom-right-radius:0}.bk-menu__button:hover:not(:disabled):not(.bk-menu__button--active){@apply bg-[var(--menu-hover-bg)] text-[color:var(--menu-hover-text)];}.bk-menu__item--open>.bk-menu__button:not(.bk-menu__button--active){@apply bg-[var(--menu-hover-bg)] text-[color:var(--menu-hover-text)];}.bk-menu__button--active{@apply bg-[var(--menu-active-bg)] text-[color:var(--menu-active-text)];}.bk-menu__button--disabled,.bk-menu__button:disabled{@apply opacity-[var(--menu-disabled)] cursor-not-allowed;}.bk-menu__submenu .bk-menu__button{@apply text-[color:var(--menu-subtext)] font-normal;padding-top:var(--menu-submenu-pad-y);padding-bottom:var(--menu-submenu-pad-y)}.bk-menu__submenu--popup .bk-menu__button{padding-left:var(--menu-popup-item-pad-x);padding-right:var(--menu-popup-item-pad-x)}.bk-menu__submenu .bk-menu__button--active{@apply text-[color:var(--menu-active-text)];}.bk-menu__group-title{@apply font-semibold uppercase tracking-wider text-[color:var(--menu-subtext)] whitespace-nowrap overflow-hidden text-ellipsis select-none;font-size:var(--menu-group-font-size);padding:var(--menu-pad-y) var(--menu-pad-x) calc(var(--menu-pad-y) / 2);padding-left:calc(var(--menu-pad-x) - var(--menu-title-outdent))}.bk-menu__submenu--popup>.bk-menu__group-title{margin-left:calc(var(--menu-popup-pad) * -1);margin-right:calc(var(--menu-popup-pad) * -1);padding-left:calc(var(--menu-popup-item-pad-x) - var(--menu-title-outdent) + var(--menu-popup-pad) + 2px);padding-right:calc(var(--menu-popup-item-pad-x) + var(--menu-popup-pad) + 2px)}.bk-menu__group-title--section{@apply mb-0 tracking-wide;padding-top:calc(var(--menu-pad-y) * 1.25)}.bk-menu__group-title--divider{@apply border-t border-[var(--menu-border)];margin-top:calc(var(--menu-pad-y) / 2)}.bk-menu__icon{@apply shrink-0 object-contain;width:var(--menu-icon-size);height:var(--menu-icon-size)}.bk-menu--tint .bk-menu__icon{@apply [filter:brightness(0)_saturate(0)];}.bk-menu--tint .bk-menu__button--active .bk-menu__icon{@apply [filter:brightness(0)_invert(1)];}.bk-menu__label{@apply flex-auto min-w-0 overflow-hidden text-ellipsis;}.bk-menu--horizontal>.bk-menu__list>.bk-menu__item>.bk-menu__button>.bk-menu__label{@apply flex-none overflow-visible;}.bk-menu__chevron{@apply shrink-0 opacity-80 transition-transform duration-[.18s];width:var(--menu-chevron-size);height:var(--menu-chevron-size)}.bk-menu__chevron--open{@apply rotate-180;}.bk-menu__chevron--right{@apply -rotate-90;}.bk-menu__chevron--left{@apply rotate-90;}.bk-menu__submenu--inline{@apply overflow-hidden max-h-0 transition-[max-height] duration-200;}.bk-menu__submenu--inline.bk-menu__submenu--open{@apply max-h-[1000px];}.bk-menu__submenu--inline.bk-menu__submenu--bg{background-color:var(--menu-submenu-bg)}.bk-menu__submenu--popup{@apply fixed z-[1000] max-h-[100vh-16px] overflow-y-auto overflow-x-hidden bg-[var(--menu-bg)] border border-[var(--menu-border)] rounded-xl shadow-[var(--menu-shadow)] hidden;padding:var(--menu-popup-pad-y) var(--menu-popup-pad);min-width:var(--menu-popup-min-w);max-width:var(--menu-popup-max-w)}.bk-menu__submenu--popup.bk-menu__submenu--open{@apply block;}.bk-menu__submenu--placing{@apply opacity-0 pointer-events-none;}@media (max-width: 640px){.bk-menu--horizontal>.bk-menu__list{@apply overflow-x-auto;-webkit-overflow-scrolling:touch}}\n"] }]
11905
+ }], propDecorators: { items: [{
11902
11906
  type: Input
11903
11907
  }], orientation: [{
11904
11908
  type: Input
@@ -11928,7 +11932,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
11928
11932
  type: Output
11929
11933
  }], onDocumentClick: [{
11930
11934
  type: HostListener,
11931
- args: ['document:click', ['$event']]
11935
+ args: ['document:click']
11932
11936
  }], onViewportChange: [{
11933
11937
  type: HostListener,
11934
11938
  args: ['window:scroll']