{"version":3,"file":"talenra-ngx-base-date.mjs","sources":["../../../projects/ngx-base/date/src/date-filters/date-in-the-future.filter.ts","../../../projects/ngx-base/date/src/date-filters/date-in-the-past.filter.ts","../../../projects/ngx-base/date/src/date-filters/first-day-of-month.filter.ts","../../../projects/ngx-base/date/src/date-filters/weekdays.filter.ts","../../../projects/ngx-base/date/src/validators/is-valid-date.function.ts","../../../projects/ngx-base/date/src/validators/validate-date.ts","../../../projects/ngx-base/date/src/validators/validate-date-is-in-the-future.ts","../../../projects/ngx-base/date/src/validators/validate-date-is-in-the-past.ts","../../../projects/ngx-base/date/src/validators/utils/convert-to-utc-date.ts","../../../projects/ngx-base/date/src/validators/validate-start-date-is-before-end-date.ts","../../../projects/ngx-base/date/src/validators/validate-year-is-equal-or-greater.ts","../../../projects/ngx-base/date/src/date/calendar-overlay/calendar-overlay.utils.ts","../../../projects/ngx-base/date/src/date/calendar-overlay/calendar-overlay.keyboard-navigation.ts","../../../projects/ngx-base/date/src/date/calendar-overlay/calendar-overlay.keyboard-navigation.day.ts","../../../projects/ngx-base/date/src/date/calendar-overlay/calendar-overlay.keyboard-navigation.month.ts","../../../projects/ngx-base/date/src/date/calendar-overlay/calendar-overlay.keyboard-navigation.year.ts","../../../projects/ngx-base/date/src/date/calendar-overlay/calendar-overlay.types.ts","../../../projects/ngx-base/date/src/date/calendar-overlay/calendar-overlay.component.ts","../../../projects/ngx-base/date/src/date/calendar-overlay/calendar-overlay.component.html","../../../projects/ngx-base/date/src/date-input/date-input.pipe.ts","../../../projects/ngx-base/date/src/date-input/date-input.directive.ts","../../../projects/ngx-base/date/src/time-input/time-input.pipe.ts","../../../projects/ngx-base/date/src/time-input/time-input.directive.ts","../../../projects/ngx-base/date/src/date/date.component.ts","../../../projects/ngx-base/date/src/date/date.component.html","../../../projects/ngx-base/date/src/date/date.types.ts","../../../projects/ngx-base/date/talenra-ngx-base-date.ts"],"sourcesContent":["import { DateFilterFn } from './date-filter.type';\n\n/**\n * Filter for days in the future (allowToday: true includes today)\n * Only allows to select dates in the future and greys out other options in the overlay\n *\n * ```typescript\n * // Component class\n * import { dateInTheFuture } from '@talenra/ngx-base/date';\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <talenra-date [dateFilterFn]=\"dateInTheFutureFilter(false)\"></talenra-date>\n * ```\n */\nexport const dateInTheFutureFilter: (allowToday: boolean) => DateFilterFn = (allowToday?: boolean) => {\n  const today = new Date();\n  if (allowToday) {\n    today.setHours(0, 0, 0, 0);\n  } else {\n    today.setHours(23, 59, 59, 59);\n  }\n  return (date: Date) => {\n    return allowToday ? date >= today : date > today;\n  };\n};\n","import { DateFilterFn } from './date-filter.type';\n\n/**\n * Filter for days in the past (allowToday: true includes today)\n * Only allows to select dates in the passt and greys out other options in the overlay\n *\n * ```typescript\n * // Component class\n * import { dateInThePastFilter } from '@talenra/ngx-base/date';\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <talenra-date [dateFilterFn]=\"dateInThePastFilter(false)\"></talenra-date>\n * ```\n */\nexport const dateInThePastFilter: (allowToday: boolean) => DateFilterFn = (allowToday?: boolean) => {\n  const today = new Date();\n  if (allowToday) {\n    today.setHours(23, 59, 59, 59);\n  } else {\n    today.setHours(0, 0, 0, 0);\n  }\n  return (date: Date) => {\n    return allowToday ? date <= today : date < today;\n  };\n};\n","import { DateFilterFn } from './date-filter.type';\n\n/**\n * Filter for first day of month.\n * Only allows to select the first day of each month and greys out other options in the overlay\n *\n * ```typescript\n * // Component class\n * import { firstDayOfMonthFilter } from '@talenra/ngx-base/date';\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <talenra-date [dateFilterFn]=\"firstDayOfMonthFilter\"></talenra-date>\n * ```\n */\nexport const firstDayOfMonthFilter: DateFilterFn = function firstDayOfMonthFilter(date: Date): boolean {\n  return date.getDate() === 1;\n};\n","import { DateFilterFn } from './date-filter.type';\n\n/**\n * Filter for weekdays (Monday - Friday)\n * Only allows to select weekdays and greys out other options in the overlay\n *\n * ```typescript\n * // Component class\n * import { weekdaysFilter } from '@talenra/ngx-base/date';\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <talenra-date [dateFilterFn]=\"weekdsaysFilter\"></talenra-date>\n * ```\n */\nexport const weekdaysFilter: DateFilterFn = function weekdaysFilter(date: Date): boolean {\n  return !!(date && new Date(date).getDay() % 6);\n};\n","/**\n * Internal Date validator function shared by several validator functions that are exposed by the library\n *\n * @internal\n */\nexport function isValidDateFn(date: Date | undefined | string): boolean {\n  if (!date || date === '') {\n    return false;\n  }\n\n  if (!(date instanceof Date)) {\n    return false;\n  }\n\n  if (isNaN(date.getTime())) {\n    return false;\n  }\n\n  return true;\n}\n","import { AbstractControl, ValidatorFn } from '@angular/forms';\nimport { isValidDateFn } from './is-valid-date.function';\n\n/**\n * Checks whether the date is valid. Only basic validation.\n *\n * ```typescript\n * // Component class\n * import { validateDate } from '@talenra/ngx-base/date';\n *\n * const form = new FormGroup({\n *    date: new FormControl('', validateDate())\n * });\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <talenra-form-field label=\"Date\">\n *    <talenra-date formControlName=\"date\"></talenra-date>\n *    <talenra-form-error [isVisible]=\"stateForm.get('date')?.touched && stateForm.get('date')?.hasError('invalidDate')\"\n *    </talenra-form-error>\n * </talenra-form-fiel>\n * ```\n */\nexport function validateDate(): ValidatorFn {\n  return (control: AbstractControl): { [key: string]: boolean } | null => {\n    const date = new Date(control.value);\n\n    if (!isValidDateFn(date)) {\n      return { invalidDate: true };\n    }\n\n    return null;\n  };\n}\n","import { AbstractControl, ValidatorFn } from '@angular/forms';\nimport { isValidDateFn } from './is-valid-date.function';\n\n/**\n * Checks whether the date is in the future. Often used in combination with `validateDate`.\n *\n * @param includesToday If true, the date is considered valid if it is today.\n * @param includeTime If true, the time is taken into account for the comparison.\n *\n * ```typescript\n * import { validateDate, validateDateIsInTheFuture } from '@talenra/ngx-base/date';\n *\n * const form = new FormGroup({\n *  date: new FormControl('', [validateDate(), validateDateIsInTheFuture())\n * });\n * ```\n *\n * ```html\n * <talenra-form-field label=\"Date\">\n *   <talenra-date formControlName=\"date\"></talenra-date>\n *   <talenra-form-error [isVisible]=\"stateForm.get('date')?.touched && stateForm.get('date')?.hasError('dateIsInThePast')\">\n *     The date must be in the future.\n *   </talenra-form-error>\n *   <talenra-form-error [isVisible]=\"stateForm.get('date')?.touched && stateForm.get('date')?.hasError('invalidDate')\">\n *    The date is invalid.\n *   </talenra-form-error>\n *  </talenra-form-field>\n * ```\n */\nexport function validateDateIsInTheFuture(includesToday = false, includeTime = false): ValidatorFn {\n  return (control: AbstractControl): { [key: string]: boolean } | null => {\n    if (control.value === null || control.value === undefined) return null;\n\n    const date = new Date(control.value);\n\n    if (!isValidDateFn(date)) {\n      return { invalidDate: true };\n    }\n\n    const currentDate = new Date();\n    if (!includeTime) {\n      currentDate.setHours(0, 0, 0, 0);\n      date.setHours(0, 0, 0, 0);\n    }\n    if (includesToday) {\n      if (date < currentDate) {\n        return { dateIsInThePast: true };\n      }\n    } else {\n      if (date <= currentDate) {\n        return { dateIsInThePast: true };\n      }\n    }\n\n    return null;\n  };\n}\n","import { AbstractControl, ValidatorFn } from '@angular/forms';\nimport { isValidDateFn } from './is-valid-date.function';\n\n/**\n * Checks whether the date is in the future.\n *\n * @param includesToday If true, the date is considered valid if it is today.\n * @param includeTime If true, the time is taken into account for the comparison.\n *\n * ```typescript\n * // Component class\n * import { validateDate, validateDateIsInThePast } from '@talenra/ngx-base/date';\n *\n * const form = new FormGroup({\n *    date: new FormControl('', [validateDate(), validateDateIsInThePast())\n * });\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <talenra-form-field label=\"Date\">\n *    <talenra-date formControlName=\"date\"></talenra-date>\n *    <talenra-form-error [isVisible]=\"stateForm.get('date')?.touched && stateForm.get('date')?.hasError('dateIsInTheFuture')\">\n *      The date must be in the past.\n *    </talenra-form-error>\n *    <talenra-form-error [isVisible]=\"stateForm.get('date')?.touched && stateForm.get('date')?.hasError('invalidDate')\">\n *      The date is invalid.\n *    </talenra-form-error>\n *  </talenra-form-field>\n *  ```\n */\nexport function validateDateIsInThePast(includesToday = false, includeTime = false): ValidatorFn {\n  return (control: AbstractControl): { [key: string]: boolean } | null => {\n    if (control.value === null || control.value === undefined) return null;\n\n    const date = new Date(control.value);\n\n    if (!isValidDateFn(date)) {\n      return { invalidDate: true };\n    }\n\n    const currentDate = new Date();\n    if (!includeTime) {\n      currentDate.setHours(0, 0, 0, 0);\n      date.setHours(0, 0, 0, 0);\n    }\n    if (includesToday) {\n      if (date > currentDate) {\n        return { dateIsInTheFuture: true };\n      }\n    } else {\n      if (date >= currentDate) {\n        return { dateIsInTheFuture: true };\n      }\n    }\n\n    return null;\n  };\n}\n","/** @internal */\nexport function convertToUtcDate(date: string | Date): Date {\n  const utcDate = new Date(date);\n  utcDate.setMinutes(0);\n  utcDate.setSeconds(0);\n  utcDate.setMilliseconds(0);\n  return utcDate;\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\nimport { convertToUtcDate } from './utils/convert-to-utc-date';\n\n/**\n * Checks if the start date is before the end date.\n *\n * @param startDateId Name of the form-control\n * @param endDateId Name of the form-control\n * @param allowSameDay Allows the end date to be on the same day as the start date, default is 'false'\n *\n * @returns Returns a function which in case of an error it returns `{ invalidDateOrder: true }` apart from that `null`.\n */\nexport function validateStartDateIsBeforeEndDate(\n  startDateId: string,\n  endDateId: string,\n  allowSameDay: boolean = false\n): ValidatorFn {\n  return (control: AbstractControl): ValidationErrors | null => {\n    const isErrorIf = allowSameDay\n      ? convertToUtcDate(control.value[endDateId]).getTime() < convertToUtcDate(control.value[startDateId]).getTime()\n      : convertToUtcDate(control.value[endDateId]).getTime() <= convertToUtcDate(control.value[startDateId]).getTime();\n    if (control.value[startDateId] && control.value[endDateId] && isErrorIf) {\n      control.get(startDateId)?.setErrors({ invalidDateOrder: true });\n      control.get(endDateId)?.setErrors({ invalidDateOrder: true });\n      return { invalidDateOrder: true };\n    }\n    control.get(startDateId)?.setErrors({ invalidDateOrder: null });\n    control.get(endDateId)?.setErrors({ invalidDateOrder: null });\n    control.get(startDateId)?.updateValueAndValidity({ onlySelf: true });\n    control.get(endDateId)?.updateValueAndValidity({ onlySelf: true });\n    return null;\n  };\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\nimport { convertToUtcDate } from './utils/convert-to-utc-date';\n\n/**\n * Checks if a date's year is greater than or equal the threshold's year.\n *\n * @param threshold The minimum year\n *\n * @returns Returns a function which in case of an error it returns `{ invalidPeriodStartYear: true }` apart from that `null`.\n */\nexport function validateYearIsEqualOrGreater(threshold: number): ValidatorFn {\n  return (control: AbstractControl): ValidationErrors | null => {\n    if (control.value) {\n      const utcDate = convertToUtcDate(control.value);\n      if (utcDate.getFullYear() < threshold) {\n        return { invalidPeriodStartYear: true };\n      }\n    }\n    return null;\n  };\n}\n","/**\n * Utilities for the calendar overlay.\n *\n * @internal\n */\nexport class CalendarOverlayUtils {\n  /** Returns last day of given month. */\n  public static lastDayOfMonth(year: number, month: number): Date {\n    return new Date(year, month + 1, 0);\n  }\n\n  /**\n   * Add/substract month like in a physical calendar (flip page). Adding 1 month to a date like Jan 31 might\n   * result in unexpected values like Mar 3. This method adjusts the date to the last day of the target month.\n   */\n  public static offsetMonthFenced(date: Date, months: number): Date {\n    let newDate = new Date(date.getTime());\n    newDate.setMonth(newDate.getMonth() + months);\n    // Check if the month changed and if so, set date to last day of month\n    // → `% 12` to compare month independent of year\n    // → `+ 12` to prevent negative values\n    if (newDate.getMonth() !== (((date.getMonth() + months) % 12) + 12) % 12) {\n      newDate = CalendarOverlayUtils.lastDayOfMonth(newDate.getFullYear(), newDate.getMonth() - 1);\n    }\n    return newDate;\n  }\n\n  /** Returns the number of months between two given months/years. */\n  public static monthDiff(from: { year: number; month: number }, to: { year: number; month: number }): number {\n    return (to.year - from.year) * 12 + to.month - from.month;\n  }\n}\n","import { CalendarOverlayComponent } from './calendar-overlay.component';\nimport { TCalendarControl } from './calendar-overlay.types';\nimport { CalendarOverlayUtils } from './calendar-overlay.utils';\n\n/**\n * Handles keyboard navigation for the CalendarOverlay component in day mode.\n *\n * @internal\n */\nexport class CalendarOverlayKeyboardNavigation {\n  /** Reference to the associated CalendarOverlay component */\n  protected calendar: CalendarOverlayComponent;\n\n  /**\n   * Tab sequence of controls in calendar head.\n   */\n  protected controlsSequence: TCalendarControl[] = ['prev', 'month', 'year', 'next'];\n\n  /** @internal */\n  constructor(calendar: CalendarOverlayComponent) {\n    this.calendar = calendar;\n  }\n\n  /** Handle keyboard events */\n  public handleKeypress(event: KeyboardEvent): void {\n    // Separate handler methods if focus is on calendar's head or body → improves code structure\n    if (this.calendar.focussedControl) {\n      this.navigateCalendarHead(event);\n    } else {\n      this.navigateCalendarBody(event);\n    }\n  }\n\n  /** Handle keyboard events if focus is in calendar head (where controls like \"prev/next month\" are). */\n  protected navigateCalendarHead(event: KeyboardEvent): void {\n    switch (event.key) {\n      case 'Tab':\n        // Tab through controls in calendar head\n        const tabDirection = event.shiftKey ? -1 : 1;\n        // Get the index of the next item in sequence\n        const nextIndex = this.calendar.focussedControl\n          ? this.controlsSequence.indexOf(this.calendar.focussedControl) + tabDirection\n          : 0;\n        // Update the focussed control or unset it if index is off-sequence\n        this.calendar.focussedControl = !this.controlsSequence[nextIndex] ? null : this.controlsSequence[nextIndex];\n        break;\n      case 'Enter':\n      case ' ':\n        // Invoke the focussed control\n        this.calendar.focussedControl === 'prev' && this.calendar.prevMonth();\n        this.calendar.focussedControl === 'next' && this.calendar.nextMonth();\n        this.calendar.focussedControl === 'month' && this.calendar.onMonthMode();\n        this.calendar.focussedControl === 'year' && this.calendar.onYearMode();\n        this.calendar.focussedControl === 'prevYears' && this.offsetYearBy(this.calendar.numberOfYearsInSelection * -1);\n        this.calendar.focussedControl === 'nextYears' && this.offsetYearBy(this.calendar.numberOfYearsInSelection);\n        break;\n    }\n  }\n\n  /** Handle keyboard events if focus is in calendar body (where dates are selected). */\n  protected navigateCalendarBody(event: KeyboardEvent): void {\n    if (event.key === 'Tab') {\n      // Focus the first control in calendar's head\n      this.calendar.focussedControl = event.shiftKey\n        ? this.controlsSequence[this.controlsSequence.length - 1]\n        : this.controlsSequence[0];\n    }\n  }\n\n  // -- Day manipulations --\n\n  /** Moves focussed day by given number of days. */\n  protected offsetDateBy(days: number): void {\n    if (!this.calendar.focussedDate) return;\n    // Update the focussed date\n    this.calendar.focussedDate.setDate(this.calendar.focussedDate.getDate() + days);\n    // Switch month as required\n    this.calendar.setCalendarDate(this.calendar.focussedDate);\n  }\n\n  /** Moves focussed day by given number of months. */\n  protected offsetMonthBy(months: number): void {\n    if (!this.calendar.focussedDate) return;\n    this.calendar.focussedDate = CalendarOverlayUtils.offsetMonthFenced(this.calendar.focussedDate, months);\n    // Switch month as required\n    this.calendar.setCalendarDate(this.calendar.focussedDate);\n  }\n\n  /** Set focussed day to given day. */\n  protected setDateTo(day: number | 'last'): void {\n    if (!this.calendar.focussedDate) return;\n    if (day === 'last') {\n      // Get last day of month\n      day = CalendarOverlayUtils.lastDayOfMonth(\n        this.calendar.focussedDate.getFullYear(),\n        this.calendar.focussedDate.getMonth()\n      ).getDate();\n    }\n    // Update the focussed date\n    this.calendar.focussedDate.setDate(day);\n    // Switch month as required\n    this.calendar.setCalendarDate(this.calendar.focussedDate);\n  }\n\n  // -- Month manipulations --\n\n  /** Moves focussed month by given number of months. */\n  protected offsetMonthInSameYearBy(months: number): void {\n    if (!this.calendar.focussedDate) return;\n    const currentMonth = this.calendar.focussedDate.getMonth();\n    const targetMonth = (((currentMonth + months) % 12) + 12) % 12; // ensure positive number\n    // Update the focussed date\n    this.calendar.focussedDate = CalendarOverlayUtils.offsetMonthFenced(\n      this.calendar.focussedDate,\n      targetMonth - currentMonth\n    );\n  }\n\n  /** Moves focussed month to a given index. */\n  protected setMonthTo(month: number): void {\n    if (!this.calendar.focussedDate) return;\n    // Update the focussed date\n    this.calendar.focussedDate.setMonth(month % 12);\n  }\n\n  // -- Year manipulations --\n\n  /** Moves focussed year by given number of years. */\n  protected offsetYearBy(years: number): void {\n    if (!this.calendar.focussedDate) return;\n    const yearToSet = this.calendar.focussedDate.getFullYear() + years;\n    // Update the focussed date\n    this.calendar.focussedDate.setFullYear(yearToSet);\n    // Update year view\n    this.updateYearSelection(yearToSet);\n  }\n\n  /** Set focussed year to given year. */\n  protected setYearTo(year: 'first' | 'last'): void {\n    if (!this.calendar.focussedDate) return;\n    const yearToSet =\n      year === 'first'\n        ? this.calendar.yearSelection[0]\n        : this.calendar.yearSelection[this.calendar.yearSelection.length - 1];\n    // Update the focussed date\n    this.calendar.focussedDate.setFullYear(yearToSet);\n  }\n\n  /** Helper: Updates the years selection if focussed year is outside current range. */\n  protected updateYearSelection(year: number): void {\n    const firstYear: number = this.calendar.yearSelection[0];\n    const lastYear: number = this.calendar.yearSelection[this.calendar.yearSelection.length - 1];\n    // No update required if focussed year is within current range\n    if (year >= firstYear && year <= lastYear) return;\n    // One page down/up\n    const offset: number = this.calendar.numberOfYearsInSelection * (year < firstYear ? -1 : 1);\n    this.calendar.calculateYearSelection(firstYear + offset);\n  }\n}\n","import { CalendarOverlayComponent } from './calendar-overlay.component';\nimport { CalendarOverlayKeyboardNavigation } from './calendar-overlay.keyboard-navigation';\n\n/**\n * Handles keyboard navigation for the CalendarOverlay component in day mode.\n *\n * @internal\n */\nexport class CalendarOverlayKeyboardNavigationDay extends CalendarOverlayKeyboardNavigation {\n  /** @internal */\n  constructor(calendar: CalendarOverlayComponent) {\n    super(calendar);\n  }\n\n  /** Handle keyboard events if focus is in calendar body (where dates are selected). */\n  protected navigateCalendarBody(event: KeyboardEvent): void {\n    switch (event.key) {\n      case 'Tab':\n        // Focus the first control in calendar's head (handled in parent class)\n        super.navigateCalendarBody(event);\n        break;\n      case 'ArrowUp':\n        // One week back\n        this.offsetDateBy(-7);\n        break;\n      case 'ArrowRight':\n        // One day forward\n        this.offsetDateBy(1);\n        break;\n      case 'ArrowDown':\n        // One week forward\n        this.offsetDateBy(7);\n        break;\n      case 'ArrowLeft':\n        // One day back\n        this.offsetDateBy(-1);\n        break;\n      case 'Home':\n        // First day of month\n        this.setDateTo(1);\n        break;\n      case 'End':\n        // Last day of month\n        this.setDateTo('last');\n        break;\n      case 'PageUp':\n        // One month back\n        this.offsetMonthBy(-1);\n        break;\n      case 'PageDown':\n        // One month forward\n        this.offsetMonthBy(1);\n        break;\n      case 'Enter':\n      case ' ':\n        // Select focussed date\n        this.calendar.focussedDate && this.calendar.onSelectDay(this.calendar.focussedDate);\n        break;\n    }\n  }\n}\n","import { CalendarOverlayComponent } from './calendar-overlay.component';\nimport { CalendarOverlayKeyboardNavigation } from './calendar-overlay.keyboard-navigation';\n\n/**\n * Handles keyboard navigation for the CalendarOverlay component in month mode.\n *\n * @internal\n */\nexport class CalendarOverlayKeyboardNavigationMonth extends CalendarOverlayKeyboardNavigation {\n  /** @internal */\n  constructor(calendar: CalendarOverlayComponent) {\n    super(calendar);\n  }\n\n  /** Handle keyboard events if focus is in calendar body (where dates are selected). */\n  protected navigateCalendarBody(event: KeyboardEvent): void {\n    switch (event.key) {\n      case 'Tab':\n        // Focus the first control in calendar's head (handled in parent class)\n        super.navigateCalendarBody(event);\n        break;\n      case 'ArrowUp':\n        // One row up\n        this.offsetMonthInSameYearBy(-3);\n        break;\n      case 'ArrowRight':\n        // Next month\n        this.offsetMonthInSameYearBy(1);\n        break;\n      case 'ArrowDown':\n        // One row down\n        this.offsetMonthInSameYearBy(3);\n        break;\n      case 'ArrowLeft':\n        // Previous month\n        this.offsetMonthInSameYearBy(-1);\n        break;\n      case 'Home':\n        // First month (January)\n        this.setMonthTo(0);\n        break;\n      case 'End':\n        // Last month (December)\n        this.setMonthTo(11);\n        break;\n      case 'Enter':\n      case ' ':\n        // Select focussed date\n        this.calendar.focussedDate && this.calendar.onSelectMonth(this.calendar.focussedDate.getMonth());\n        break;\n    }\n  }\n}\n","import { CalendarOverlayComponent } from './calendar-overlay.component';\nimport { CalendarOverlayKeyboardNavigation } from './calendar-overlay.keyboard-navigation';\n\n/**\n * Handles keyboard navigation for the CalendarOverlay component in year mode.\n *\n * @internal\n */\nexport class CalendarOverlayKeyboardNavigationYear extends CalendarOverlayKeyboardNavigation {\n  /** @internal */\n  constructor(calendar: CalendarOverlayComponent) {\n    super(calendar);\n    this.controlsSequence = ['prev', 'month', 'year', 'next', 'prevYears', 'nextYears'];\n  }\n\n  /** Handle keyboard events if focus is in calendar body (where dates are selected). */\n  protected navigateCalendarBody(event: KeyboardEvent): void {\n    switch (event.key) {\n      case 'Tab':\n        // Focus the first control in calendar's head (handled in parent class)\n        super.navigateCalendarBody(event);\n        break;\n      case 'ArrowUp':\n        // One row up\n        this.offsetYearBy(CalendarOverlayComponent.YEAR_SELECTION_COLS * -1);\n        break;\n      case 'ArrowRight':\n        // Next year\n        this.offsetYearBy(1);\n        break;\n      case 'ArrowDown':\n        // One row down\n        this.offsetYearBy(CalendarOverlayComponent.YEAR_SELECTION_COLS);\n        break;\n      case 'ArrowLeft':\n        // Previous year\n        this.offsetYearBy(-1);\n        break;\n      case 'Home':\n        // First year in table\n        this.setYearTo('first');\n        break;\n      case 'End':\n        // Last year in table\n        this.setYearTo('last');\n        break;\n      case 'PageUp':\n        // One page up\n        this.offsetYearBy(this.calendar.numberOfYearsInSelection * -1);\n        break;\n      case 'PageDown':\n        // One page down\n        this.offsetYearBy(this.calendar.numberOfYearsInSelection);\n        break;\n      case 'Enter':\n      case ' ':\n        // Select focussed date\n        this.calendar.focussedDate && this.calendar.onSelectYear(this.calendar.focussedDate.getFullYear());\n        break;\n    }\n  }\n}\n","/**\n * Values accepted by `CalendarOverlay`'s `overlayMode` property.\n *\n * @internal\n */\nexport const OverlayMode = { Day: 'day', Month: 'month', Year: 'year' } as const;\n\n/**\n * Type of values accepted by `CalendarOverlay`'s `overlayMode` property.\n *\n * @internal\n */\nexport type TOverlayMode = (typeof OverlayMode)[keyof typeof OverlayMode];\n\n/**\n * Controls used in calendar's head.\n *\n * @internal\n */\nexport const CalendarControl = {\n  Prev: 'prev',\n  Next: 'next',\n  Month: 'month',\n  Year: 'year',\n  PrevYears: 'prevYears',\n  NextYears: 'nextYears',\n} as const;\n\n/**\n * Type of controls used in calendar's head.\n *\n * @internal\n */\nexport type TCalendarControl = (typeof CalendarControl)[keyof typeof CalendarControl];\n\n/** @internal */\nexport interface MonthSelection {\n  name: string;\n  index: number;\n}\n","import { ChangeDetectionStrategy, Component, EventEmitter, OnInit, Output } from '@angular/core';\nimport { IconComponent } from '@talenra/ngx-base/icons';\nimport { ButtonComponent } from '@talenra/ngx-base/button';\nimport { CalendarOverlayKeyboardNavigationDay } from './calendar-overlay.keyboard-navigation.day';\nimport { CalendarOverlayKeyboardNavigationMonth } from './calendar-overlay.keyboard-navigation.month';\nimport { CalendarOverlayKeyboardNavigationYear } from './calendar-overlay.keyboard-navigation.year';\nimport { MonthSelection, OverlayMode, TCalendarControl, TOverlayMode } from './calendar-overlay.types';\nimport { CalendarOverlayUtils } from './calendar-overlay.utils';\nimport { DateFilterFn } from '../../date-filters/date-filter.type';\n\n/** @internal */\ntype SupportedLocale = 'de' | 'it' | 'fr' | 'en';\n\n/**\n * Overlay calendar allows picking dates using mouse/touch or keyboard. It provides an alternative to typing in a date.\n *\n * A note about naming things:\n * - \"selected\" is used for the value of the date component (e.g \"selected month\" represents the month of the date component's value.)\n * - \"focussed\" is used for the date that is currently focussed/hovered by the user (e.g. \"focussed month\" represents the month of the date that is currently focussed.). This is used for keyboard navigation.\n * - \"current\" is used for the current date (e.g. \"current month\" represents the current month in real world time.)\n * - \"calendar\" is used for the month and year displayed in this calendar (e.g. \"calendar month\" represents the month displayed in the calendar – given the calendar is not in year mode of course.)\n *\n * @internal\n */\n@Component({\n  selector: 'talenra-calendar-overlay',\n  templateUrl: './calendar-overlay.component.html',\n  styleUrls: ['./calendar-overlay.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    '(window:keyup)': 'handleKeyup($event)',\n  },\n  imports: [IconComponent, ButtonComponent],\n})\nexport class CalendarOverlayComponent implements OnInit {\n  /** Numbers of rows displayed in the year chooser. */\n  static YEAR_SELECTION_ROWS = 4;\n\n  /** Numbers of columns displayed in the year chooser. */\n  static YEAR_SELECTION_COLS = 5;\n\n  /** Localized strings for today */\n  private localeLookup: Record<SupportedLocale, string> = {\n    de: 'Heute',\n    it: 'Oggi',\n    fr: \"Aujourd'hui\",\n    en: 'Today',\n  };\n\n  /** Number of years displayed in the year-chooser. */\n  numberOfYearsInSelection =\n    CalendarOverlayComponent.YEAR_SELECTION_COLS * CalendarOverlayComponent.YEAR_SELECTION_ROWS;\n\n  /** Emits the new date when selected. */\n  @Output() dateSelected = new EventEmitter<Date>();\n\n  /** Function that determines whether a date is selectable. */\n  dateFilterFn?: DateFilterFn;\n\n  locale: string = 'de-CH';\n\n  /** Month displayed in the calendar. */\n  private calendarMonth: number;\n\n  /** Year displayed in the calendar. */\n  calendarYear: number;\n\n  /** List of days of the month displayed. */\n  daysInMonth: Date[][] = [];\n\n  /** Currently selected date (the date component's value). */\n  private selectedDate: Date | null = null;\n\n  /** Currently focussed date (the date which would be selected, if the user clicks or presses space/enter) */\n  focussedDate: Date | null = null;\n\n  /** Currently focussed control (the navigation elements in the calendar header, e.g. arrow-left). */\n  focussedControl: TCalendarControl | null = null;\n\n  /** Current display mode (year, month, day). */\n  overlayMode: TOverlayMode = OverlayMode.Day;\n\n  /** List of years displayed in the year-chooser. */\n  yearSelection: number[] = [];\n\n  /** Helper to handle keyboard navigation */\n  private keyNav: {\n    day: CalendarOverlayKeyboardNavigationDay;\n    month: CalendarOverlayKeyboardNavigationMonth;\n    year: CalendarOverlayKeyboardNavigationYear;\n  };\n\n  /** Determines whether keyboard navigation is active. Used to prevent interferences in keyboard handling. */\n  private allowKeyboardNavigation = false;\n\n  /** @internal */\n  constructor() {\n    this.keyNav = {\n      day: new CalendarOverlayKeyboardNavigationDay(this),\n      month: new CalendarOverlayKeyboardNavigationMonth(this),\n      year: new CalendarOverlayKeyboardNavigationYear(this),\n    };\n    this.focussedDate = new Date();\n    const today = new Date();\n    this.calendarMonth = today.getMonth();\n    this.calendarYear = today.getFullYear();\n    this.generateCalendar();\n  }\n\n  /** @internal */\n  ngOnInit(): void {\n    // Initialize year mode if requested\n    if (this.overlayMode === OverlayMode.Year) this.onYearMode();\n    // Allow keyboard navigation after the first change detection cycle.\n    // Prevents interferences with parent's key handlers.\n    setTimeout(() => {\n      this.allowKeyboardNavigation = true;\n    });\n  }\n\n  /** Generates the calendar data required for display. */\n  private generateCalendar(): void {\n    this.daysInMonth = [];\n    // First day of the month\n    const firstDay = new Date(this.calendarYear, this.calendarMonth, 1);\n    // Last day of the month\n    const lastDay = new Date(this.calendarYear, this.calendarMonth + 1, 0);\n\n    const date = new Date(firstDay);\n    while (date.getDay() !== 1) {\n      date.setDate(date.getDate() - 1);\n    }\n\n    while (date <= lastDay || date.getDay() !== 1) {\n      const week = [];\n      for (let i = 0; i < 7; i++) {\n        week.push(new Date(date));\n        date.setDate(date.getDate() + 1);\n      }\n      this.daysInMonth.push(week);\n    }\n    // Make sure focussed date is within the displayed month\n    if (this.focussedDate) {\n      const monthDiff = CalendarOverlayUtils.monthDiff(\n        { year: this.focussedDate?.getFullYear(), month: this.focussedDate?.getMonth() },\n        { year: this.calendarYear, month: this.calendarMonth }\n      );\n      this.focussedDate = CalendarOverlayUtils.offsetMonthFenced(this.focussedDate, monthDiff);\n    }\n  }\n\n  /** Go one month back into past. */\n  prevMonth(): void {\n    this.calendarMonth = (this.calendarMonth + 11) % 12;\n    this.calendarMonth === 11 && this.calendarYear--;\n    this.generateCalendar();\n  }\n\n  /** Go one month further into future. */\n  nextMonth(): void {\n    this.calendarMonth = (this.calendarMonth + 1) % 12;\n    this.calendarMonth === 0 && this.calendarYear++;\n    this.generateCalendar();\n  }\n\n  /** Update the month displayed. */\n  setCalendarDate(date: Date): void {\n    // No update if the date is in the same month\n    if (this.calendarMonth === date.getMonth() && this.calendarYear === date.getFullYear()) return;\n    this.calendarMonth = date.getMonth();\n    this.calendarYear = date.getFullYear();\n    this.generateCalendar();\n  }\n\n  /** Updates the selected date and updates the calendar's month and year. */\n  setInitialDate(date: Date): void {\n    this.selectedDate = date;\n    this.focussedDate = new Date(date.getTime()); // cloned, not referenced\n    this.setCalendarDate(date);\n  }\n\n  /** Returns whether a given control has focus. Used for keyboard navigation. */\n  isFocussedControl(control: TCalendarControl): boolean {\n    return this.focussedControl === control;\n  }\n\n  /** Returns whether a given date matches the current day. */\n  isCurrentDay(date: Date): boolean {\n    const today = new Date();\n    return (\n      date.getDate() === today.getDate() &&\n      date.getMonth() === today.getMonth() &&\n      date.getFullYear() === today.getFullYear()\n    );\n  }\n\n  /** Returns whether today's date is focussed */\n  protected isTodayFocussed(): boolean {\n    return !!(this.focussedDate && this.isCurrentDay(this.focussedDate));\n  }\n\n  /** Returns whether a given date matches the selected day. */\n  isSelectedDate(date: Date): boolean {\n    if (!this.selectedDate) return false;\n    return (\n      date.getDate() === this.selectedDate.getDate() &&\n      date.getMonth() === this.selectedDate.getMonth() &&\n      date.getFullYear() === this.selectedDate.getFullYear()\n    );\n  }\n\n  /** Returns whether a given date matches the focussed day. */\n  isFocussedDate(date: Date): boolean {\n    if (!this.focussedDate) return false;\n    return (\n      date.getDate() === this.focussedDate.getDate() &&\n      date.getMonth() === this.focussedDate.getMonth() &&\n      date.getFullYear() === this.focussedDate.getFullYear()\n    );\n  }\n\n  /** Returns whether a given month matches the selected month. */\n  isSelectedMonth(month: MonthSelection): boolean {\n    return month.index === this.selectedDate?.getMonth();\n  }\n\n  /** Returns whether a given month matches the focussed month. */\n  isFocussedMonth(month: MonthSelection): boolean {\n    return month.index === this.focussedDate?.getMonth();\n  }\n\n  /** Returns whether a given month matches the current month (real world time). */\n  isCurrentMonth(month: MonthSelection): boolean {\n    return month.index === new Date().getMonth();\n  }\n\n  /** Returns whether a given year matches the selected year. */\n  isSelectedYear(year: number): boolean {\n    return year === this.selectedDate?.getFullYear();\n  }\n\n  /** Returns whether a given year matches the focussed year. */\n  isFocussedYear(year: number): boolean {\n    return year === this.focussedDate?.getFullYear();\n  }\n\n  /** Returns whether a given year matches the current year (real world time). */\n  isCurrentYear(year: number): boolean {\n    return year === new Date().getFullYear();\n  }\n\n  /**\n   * Returns whether a date belongs to the displayed month.\n   *\n   * @internal\n   */\n  belongsToCalendarMonth(date: Date): boolean {\n    return date.getMonth() === this.calendarMonth && date.getFullYear() === this.calendarYear;\n  }\n\n  /**\n   * Localized name of the displayed month.\n   *\n   * @internal\n   */\n  get calendarMonthName(): string {\n    return new Date(`${this.calendarYear}-${(this.calendarMonth + 1).toString().padStart(2, '0')}`).toLocaleString(\n      this.locale,\n      { month: 'long' }\n    );\n  }\n\n  /** returns the localized name of 'today'. */\n  get localizedToday(): string {\n    const lookupLocale = this.locale.split('-')[0] as SupportedLocale;\n    return this.localeLookup[lookupLocale] || 'Today';\n  }\n\n  /** Returns the selected month. */\n  get monthSelection(): MonthSelection[] {\n    const monthSelection = [];\n    for (let month = 0; month < 12; month++) {\n      const date = new Date(2022, month, 1);\n      monthSelection.push({ index: month, name: date.toLocaleString(this.locale, { month: 'long' }) });\n    }\n    return monthSelection;\n  }\n\n  /** Generates the list of years available to choose from in year-chooser mode. */\n  calculateYearSelection(baseYear: number) {\n    this.yearSelection = [];\n    for (let year = baseYear; year < baseYear + this.numberOfYearsInSelection; year++) {\n      this.yearSelection.push(year);\n    }\n  }\n\n  /** Returns the list of weekdays. */\n  get weekdayNames(): string[] {\n    const baseDate = new Date(2022, 0, 3); // Just a Monday\n    const weekdays = [];\n    for (let i = 0; i < 7; i++) {\n      const day = new Date(baseDate.getTime() + i * 24 * 60 * 60 * 1000);\n      weekdays.push(day.toLocaleDateString(this.locale, { weekday: 'short' }));\n    }\n    return weekdays;\n  }\n\n  /** Switch to month-chooser mode. */\n  onMonthMode() {\n    this.focussedControl = null;\n    this.overlayMode = OverlayMode.Month;\n  }\n\n  /** Switch to year-chooser mode. */\n  onYearMode() {\n    // First year in calendarYear's decade\n    const baseYear: number = Math.floor(this.calendarYear / 10) * 10 + 1;\n    this.calculateYearSelection(baseYear);\n    this.focussedControl = null;\n    this.overlayMode = OverlayMode.Year;\n  }\n\n  /** Handles user picking a day. Date is validated against the date filter. Invalid dates cannot be selected. */\n  onSelectDay(date: Date): void {\n    if (this.dateFilterFn && !this.dateFilterFn(date)) return;\n    this.selectedDate = date;\n    this.dateSelected.emit(date);\n  }\n\n  /** User picked a month. */\n  onSelectMonth(index: number) {\n    this.overlayMode = OverlayMode.Day;\n    this.calendarMonth = index;\n    this.generateCalendar();\n  }\n\n  /** User picked a year. */\n  onSelectYear(year: number) {\n    this.overlayMode = OverlayMode.Day;\n    this.calendarYear = year;\n    this.generateCalendar();\n  }\n\n  /** Handle/delegate keyboard navigation */\n  private handleKeyup(event: KeyboardEvent): void {\n    if (!this.allowKeyboardNavigation) return;\n    this.keyNav[this.overlayMode].handleKeypress(event);\n  }\n\n  /** Go to today's date. */\n  protected goToToday() {\n    const today = new Date();\n    this.focussedDate = today;\n    this.overlayMode = OverlayMode.Day;\n    this.calendarMonth = today.getMonth();\n    this.calendarYear = today.getFullYear();\n    this.generateCalendar();\n  }\n}\n","<!-- Month and Year Navigation -->\n<div class=\"header\">\n  <button class=\"icon-button\" [class.focussed]=\"isFocussedControl('prev')\">\n    <talenra-icon name=\"chevron-left\" (click)=\"prevMonth()\" data-testid=\"previous-month\" />\n  </button>\n  <span>\n    <a class=\"link\" [class.focussed]=\"isFocussedControl('month')\" (click)=\"onMonthMode()\" data-testid=\"select-month\">{{\n      calendarMonthName\n    }}</a\n    >&nbsp;<a\n      class=\"link\"\n      [class.focussed]=\"isFocussedControl('year')\"\n      (click)=\"onYearMode()\"\n      data-testid=\"select-year\"\n      >{{ calendarYear }}</a\n    >\n  </span>\n  <button class=\"icon-button\" [class.focussed]=\"isFocussedControl('next')\">\n    <talenra-icon name=\"chevron-right\" (click)=\"nextMonth()\" data-testid=\"next-month\" />\n  </button>\n</div>\n\n<!-- Day mode -->\n@if (overlayMode === 'day') {\n  <div class=\"calendar\" data-testid=\"calendar-overlay\">\n    <div class=\"weekdays\">\n      @for (day of weekdayNames; track day) {\n        <span class=\"weekday\">{{ day }}</span>\n      }\n    </div>\n    @for (week of daysInMonth; track week[0]) {\n      <div class=\"week\">\n        @for (day of week; track day) {\n          <div\n            class=\"day\"\n            [class.selectable]=\"dateFilterFn ? dateFilterFn(day) : true\"\n            [class.current]=\"isCurrentDay(day)\"\n            [class.selected]=\"isSelectedDate(day)\"\n            [class.focussed]=\"isFocussedDate(day)\"\n            [class.muted]=\"!belongsToCalendarMonth(day)\"\n            (click)=\"onSelectDay(day)\">\n            {{ day.getDate() }}\n          </div>\n        }\n      </div>\n    }\n  </div>\n}\n\n<!-- Month mode -->\n@if (overlayMode === 'month') {\n  <div>\n    <div class=\"months\">\n      @for (month of monthSelection; track month.index) {\n        <div\n          class=\"month selectable\"\n          [class.selected]=\"isSelectedMonth(month)\"\n          [class.focussed]=\"isFocussedMonth(month)\"\n          [class.current]=\"isCurrentMonth(month)\"\n          (click)=\"onSelectMonth(month.index)\">\n          {{ month.name }}\n        </div>\n      }\n    </div>\n  </div>\n}\n\n<!-- Year mode -->\n@if (overlayMode === 'year') {\n  <div>\n    <div class=\"range-selector\">\n      <button\n        talenra-button\n        kind=\"ghost\"\n        icon=\"chevron-left\"\n        (click)=\"calculateYearSelection(yearSelection[0] - this.numberOfYearsInSelection)\"></button>\n      <span>{{ yearSelection[0] }}&ndash;{{ yearSelection[yearSelection.length - 1] }}</span>\n      <button\n        talenra-button\n        kind=\"ghost\"\n        icon=\"chevron-right\"\n        (click)=\"calculateYearSelection(yearSelection[yearSelection.length - 1] + 1)\"></button>\n    </div>\n    <div class=\"years\">\n      @for (year of yearSelection; track year.toString()) {\n        <div\n          class=\"year selectable\"\n          [class.selected]=\"isSelectedYear(year)\"\n          [class.focussed]=\"isFocussedYear(year)\"\n          [class.current]=\"isCurrentYear(year)\"\n          (click)=\"onSelectYear(year)\">\n          {{ year }}\n        </div>\n      }\n    </div>\n  </div>\n}\n\n<div class=\"footer\">\n  <a class=\"footer-link\" [class.disabled]=\"isTodayFocussed()\" (click)=\"goToToday()\" data-testid=\"go-to-today\">{{\n    localizedToday\n  }}</a>\n</div>\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Transforms a string into a date format (DD.MM.YYYY).\n *\n * @internal\n */\n@Pipe({\n  name: 'date-input',\n})\nexport class DateInputPipe implements PipeTransform {\n  transform(value: string): string {\n    if (!value) {\n      return '';\n    }\n\n    const normalizedValue = value.replace(/[^0-9.]/g, '');\n\n    const separator = '.';\n    const [dayOrElse, month, year] = normalizedValue.split(separator);\n\n    if (dayOrElse && this.isNullOrEmpty(month) && this.isNullOrEmpty(year)) {\n      if (dayOrElse.length === 4) {\n        return `01.01.${dayOrElse}`;\n      } else if (dayOrElse.length === 8) {\n        const dayString = dayOrElse.substring(0, 2);\n        const monthString = dayOrElse.substring(2, 4);\n        const yearString = dayOrElse.substring(4);\n        return [dayString, monthString, yearString].join('.');\n      } else if (dayOrElse.length === 6) {\n        const dayString = dayOrElse.substring(0, 2);\n        const monthString = dayOrElse.substring(2, 4);\n        const yearString = dayOrElse.substring(4);\n        const currentYearPart = new Date().getFullYear().toString().substring(0, 2);\n        return [dayString, monthString, `${currentYearPart}${yearString}`].join('.');\n      } else {\n        const dayInt = parseInt(dayOrElse);\n        const currentMonth = new Date().getMonth() + 1;\n        const currentYear = new Date().getFullYear();\n        return [this.numberToPaddedString(dayInt, 2), this.numberToPaddedString(currentMonth, 2), currentYear].join(\n          separator\n        );\n      }\n    }\n    if (dayOrElse && month && this.isNullOrEmpty(year)) {\n      const dayInt = parseInt(dayOrElse);\n      const monthInt = parseInt(month);\n      const currentYear = new Date().getFullYear();\n      return [this.numberToPaddedString(dayInt, 2), this.numberToPaddedString(monthInt, 2), currentYear].join(\n        separator\n      );\n    }\n    if (dayOrElse && month && year) {\n      const dayInt = parseInt(dayOrElse);\n      const monthInt = parseInt(month);\n      const yearInt = parseInt(year);\n      const currentYearPart = new Date()\n        .getFullYear()\n        .toString()\n        .substring(0, 4 - Math.max(year.length, 2));\n      const currentYear = `${currentYearPart}${this.numberToPaddedString(yearInt, 2)}`;\n      return [this.numberToPaddedString(dayInt, 2), this.numberToPaddedString(monthInt, 2), currentYear].join(\n        separator\n      );\n    }\n\n    return normalizedValue;\n  }\n\n  private isNullOrEmpty(str: string | null): boolean {\n    return !str || str.trim().length === 0;\n  }\n\n  private numberToPaddedString(int: number, padding: number): string {\n    return int.toString().padStart(padding, '0');\n  }\n}\n","import { booleanAttribute, Directive, Input, OnInit, inject } from '@angular/core';\nimport { AbstractControl, NgControl } from '@angular/forms';\nimport { DateInputPipe } from './date-input.pipe';\n\n/**\n * Auto-format input to date format (DD.MM.YYYY) by applying the DateInputPipe on blur\n *\n * @internal\n */\n@Directive({\n  selector: 'input[talenra-input][talenra-date-input]',\n  host: {\n    '(blur)': 'handleBlur($event.target.value)',\n  },\n})\nexport class TalenraDateDirective implements OnInit {\n  /** @internal */\n  @Input({ transform: booleanAttribute }) isBirthDate = false;\n\n  private control: AbstractControl | null = null;\n\n  private ngControl = inject(NgControl, { optional: true, self: true });\n  private datePipe = inject(DateInputPipe);\n\n  /** @internal */\n  ngOnInit(): void {\n    this.control = this.ngControl?.control || null;\n    setTimeout(() => {\n      const initialValue = this.control?.value;\n      if (initialValue) {\n        this.control?.setValue(this.datePipe.transform(initialValue));\n      }\n    });\n  }\n\n  /**\n   * Auto-format input\n   */\n  private handleBlur(inputValue: string | undefined): void {\n    if (inputValue === '') {\n      this.control?.setValue('');\n    } else if (inputValue) {\n      let formattedValue = this.datePipe.transform(inputValue);\n      formattedValue = this.isBirthDate ? this.adjustBirthDate(formattedValue) : formattedValue;\n      this.control?.setValue(formattedValue);\n    }\n  }\n\n  /**\n   * Corrects autocompleted dates in case dates in the future are not allowed\n   */\n  private adjustBirthDate(inputValue: string): string {\n    // Helper functions\n    const yearToCurrentCentury = (year: number, centuryOffset = 0): number =>\n      Math.floor(new Date().getFullYear() / 100 + centuryOffset) * 100 + (year % 100);\n    const isValidDate = (day: number, month: number, year: number): boolean => {\n      const date = new Date(year, month, day);\n      return date.getFullYear() === year && date.getMonth() === month && date.getDate() === day;\n    };\n    const numberToPaddedString = (int: number, padding: number): string => {\n      return int.toString().padStart(padding, '0');\n    };\n\n    // Do not try to adjust empty string\n    if (!inputValue) return '';\n    const [dayIn, monthIn, yearIn] = inputValue.split('.').map(Number);\n    // Prevent overshooting the given month/year (e.g. 32.1.2020 -> 1.2.2020 or  1.13.2020 -> 1.1.2021)\n    if (!isValidDate(dayIn, monthIn - 1, yearIn)) return inputValue;\n    const inputDate = new Date(yearIn, monthIn - 1, dayIn);\n    // If date is in the future, shift it to the last century\n    if (inputDate > new Date()) inputDate.setFullYear(yearToCurrentCentury(inputDate.getFullYear(), -1));\n    // Format and return the output\n    const dayOut = numberToPaddedString(inputDate.getDate(), 2);\n    const monthOut = numberToPaddedString(inputDate.getMonth() + 1, 2);\n    const yearOut = inputDate.getFullYear();\n    return `${dayOut}.${monthOut}.${yearOut}`;\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Transforms a string into a time format (HH:MM).\n *\n * @internal\n */\n@Pipe({\n  name: 'time-input',\n})\nexport class TimeInputPipe implements PipeTransform {\n  private readonly TimePattern = /^(\\d{1,2}):?(\\d{2})?$/;\n  private readonly ThreeDigitTimePattern = /^(\\d)(\\d{2})?$/;\n  private readonly UnknownTimePattern = /^(\\d{1,2}):?(\\d)?$/;\n\n  transform(value: string): string {\n    if (!value) {\n      return '';\n    }\n\n    value = value.replace('.', ':');\n    value = value.replace(/:/g, '').length === 5 ? value.slice(0, -1) : value;\n\n    let match = this.TimePattern.exec(value);\n    if (value.length === 3) {\n      match = this.ThreeDigitTimePattern.exec(value);\n    }\n\n    if (!match) {\n      // best guess, last try\n      match = this.UnknownTimePattern.exec(value);\n      if (!match) {\n        return value;\n      }\n    }\n\n    const hours = Number(match[1]);\n    const minutes = match[2] ? Number(match[2]) : 0;\n\n    // if (hours > 23) hours = 0;\n    // if (minutes > 59) minutes = 0;\n\n    const hoursString = hours.toString();\n    const minutesString = minutes.toString();\n\n    return `${hoursString.padStart(2, '0')}:${minutesString.padStart(2, '0')}`;\n  }\n}\n","import { Directive, ElementRef, OnInit, Renderer2, inject } from '@angular/core';\nimport { AbstractControl, NgControl } from '@angular/forms';\nimport { TimeInputPipe } from './time-input.pipe';\n\n/**\n * Auto-format input to time format (HH:MM) by applying the TimeInputPipe on blur\n *\n * @internal\n */\n@Directive({\n  selector: 'input[talenra-input][talenra-time-input]',\n  host: {\n    '(blur)': 'handleBlur($event.target.value)',\n    '(keypress)': 'onKeyPress($event)',\n    '(paste)': 'onPaste($event)',\n  },\n  providers: [TimeInputPipe],\n})\nexport class TalenraTimeDirective implements OnInit {\n  private control: AbstractControl | null = null;\n\n  private ngControl = inject(NgControl, { optional: true, self: true });\n  private elementRef = inject<ElementRef<HTMLInputElement>>(ElementRef);\n  private timePipe = inject(TimeInputPipe);\n  private renderer = inject(Renderer2);\n\n  /** @internal */\n  ngOnInit(): void {\n    this.control = this.ngControl?.control || null;\n    setTimeout(() => {\n      const initialValue = this.control?.value;\n      if (initialValue) {\n        this.control?.setValue(this.timePipe.transform(initialValue));\n      }\n    });\n  }\n\n  /**\n   * Auto-format input on blur\n   */\n  private handleBlur(inputValue: string | undefined): void {\n    if (inputValue) {\n      const formattedValue = this.timePipe.transform(inputValue);\n      this.control?.setValue(formattedValue);\n    }\n  }\n\n  /**\n   * Allow only digits, ':' and '.'\n   */\n  private onKeyPress(event: KeyboardEvent) {\n    const pattern = /[0-9\\:\\.]/;\n    if (!pattern.test(event.key)) {\n      event.preventDefault();\n    }\n  }\n\n  /**\n   * Allow only digits, ':' and '.'\n   */\n  private onPaste(event: ClipboardEvent) {\n    const textFromClipboard = event.clipboardData?.getData('text').replace(/[^0-9:.]/g, '') ?? '';\n    const formattedText = this.timePipe.transform(textFromClipboard);\n    this.renderer.setProperty(this.elementRef.nativeElement, 'value', formattedText);\n    event.preventDefault();\n  }\n}\n","import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n  AfterViewInit,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  ElementRef,\n  inject,\n  Injector,\n  Input,\n  input,\n  LOCALE_ID,\n  OnInit,\n  QueryList,\n  ViewChild,\n  ViewChildren,\n  ViewContainerRef,\n} from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR, NgControl, ReactiveFormsModule } from '@angular/forms';\nimport {\n  ClearButtonComponent,\n  ControlContainerComponent,\n  FormFieldControl,\n  FormFieldControlBaseComponent,\n} from '@talenra/ngx-base/form-field';\nimport { asapScheduler } from 'rxjs';\nimport { InputComponent } from '@talenra/ngx-base/input';\nimport { TLocale } from '@talenra/ngx-base/shared';\nimport { IconComponent } from '@talenra/ngx-base/icons';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CalendarOverlayComponent } from './calendar-overlay/calendar-overlay.component';\nimport { OverlayMode, TOverlayMode } from './calendar-overlay/calendar-overlay.types';\nimport { DateFilterFn } from '../date-filters/date-filter.type';\nimport { DateInputPipe } from '../date-input/date-input.pipe';\nimport { isValidDateFn } from '../validators/is-valid-date.function';\nimport { TalenraDateDirective } from '../date-input/date-input.directive';\nimport { TalenraTimeDirective } from '../time-input/time-input.directive';\n\n/**\n * Interface to store focus state of date/time inputs.\n *\n * @internal\n */\ninterface IFocusItem {\n  date: boolean;\n  time: boolean;\n}\n\n/**\n * Used to create a \"unique\" ID for each instance.\n *\n * @internal\n */\nlet nextId = 0;\n\n/**\n * The Date component allows users to enter a date either through text input or by choosing from a calendar overlay. It\n * provides an optional field to enter a time.\n *\n * ```html\n * <talenra-form-field label=\"Simple date\">\n *   <talenra-date formControlName=\"simpleDate\"></talenra-date>\n * </talenra-form-field>\n *\n * <talenra-form-field label=\"Date with time\">\n *   <talenra-date formControlName=\"dateTime\" showTime></talenra-date>\n * </talenra-form-field>\n *\n * <talenra-form-field label=\"Date with filter\">\n *   <talenra-date formControlName=\"dateTime\" [dateFilterFn]=\"weekdaysFilter\"></talenra-date>\n * </talenra-form-field>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { DateComponent } from '@talenra/ngx-base/date';\n * ```\n *\n * <example-url>../../#date</example-url>\n */\n@Component({\n  selector: 'talenra-date',\n  templateUrl: './date.component.html',\n  styleUrls: ['./date.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    '[tabindex]': '-1',\n    '[class.disabled]': 'disabled',\n    '[class.readonly]': 'readonly',\n    '[class]': 'hostClass',\n  },\n  providers: [\n    { provide: DateInputPipe },\n    { provide: FormFieldControl, useExisting: DateComponent },\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: DateComponent,\n      multi: true,\n    },\n  ],\n  imports: [\n    ClearButtonComponent,\n    ControlContainerComponent,\n    InputComponent,\n    TalenraDateDirective,\n    ReactiveFormsModule,\n    FormsModule,\n    IconComponent,\n    TalenraTimeDirective,\n  ],\n})\nexport class DateComponent\n  extends FormFieldControlBaseComponent\n  implements OnInit, AfterViewInit, ControlValueAccessor, FormFieldControl<DateComponent>\n{\n  /**\n   * Function to filter dates in the calendar overlay.\n   *\n   * @see {@link DateFilterFn}\n   * @see {@link firstDayOfMonthFilter}\n   * @see {@link weekdaysFilter}\n   *\n   * ```html\n   * <talenra-date [dateFilterFn]=\"weekdaysFilter\" />\n   * ```\n   */\n  @Input() dateFilterFn?: DateFilterFn;\n\n  /**\n   * Determines whether the time input is shown.\n   *\n   * ```html\n   * <talenra-date showTime />\n   * ```\n   */\n  @Input({ transform: booleanAttribute }) showTime = false;\n\n  /**\n   * Label displayed for the time input (optional).\n   *\n   * ```html\n   * <talenra-date showTime timeLabel=\"Time HH:MM\" />\n   * ```\n   */\n  @Input() timeLabel = '';\n\n  /**\n   * Date the calendar overlay opens with if the control has no value.\n   *\n   * ```typescript\n   * protected calendarInitialDate = new Date('2020-06-30');\n   * ```\n   *\n   * ```html\n   * <talenra-date [calendarInitialDate]=\"calendarInitialDate\" />\n   * ```\n   */\n  public calendarInitialDate = input<Date | null>(null);\n\n  /**\n   * Mode the calendar overlay opens with if the control has no value.\n   *\n   * ```html\n   * <talenra-date calendarInitialMode=\"year\" />\n   * ```\n   *\n   * @see {@link OverlayMode}\n   */\n  public calendarInitialMode = input<TOverlayMode>(OverlayMode.Day);\n\n  /**\n   * Locale to dynamically overwrite the app's locale.\n   * Allowed values, see: Locale\n   *\n   * ```html\n   * <talenra-date dynamicLocale=\"fr-CH\" />\n   * ```\n   *\n   * @see {@link Locale}\n   * @see {@link TLocale}\n   */\n  @Input() dynamicLocale: TLocale | null = null;\n\n  /**\n   * Determines whether the date is a birth date. Enforces the date to be today or in the past.\n   *\n   * ```html\n   * <talenra-date isBirthDate />\n   * ```\n   */\n  @Input({ transform: booleanAttribute }) isBirthDate = false;\n\n  /**\n   * Determines whether the control is disabled/enabled.\n   *\n   * ```html\n   * <talenra-date disabled />\n   * ```\n   */\n  @Input({ transform: booleanAttribute })\n  /** Get the control's disabled state. */\n  get disabled() {\n    return this._disabled;\n  }\n\n  /** Set the control's disabled state. */\n  set disabled(value: boolean) {\n    if (value === this.disabled) return;\n    this._disabled = value;\n    this.changeDetector.markForCheck();\n    this.stateChanges.next();\n  }\n\n  /** @internal */\n  _disabled = false;\n\n  /**\n   * Determines whether the control is read-only.\n   *\n   * ```html\n   * <talenra-date readonly />\n   * ```\n   */\n  @Input({ transform: booleanAttribute })\n  /** Get the control's read-only state */\n  get readonly(): boolean {\n    return this._readonly;\n  }\n\n  /** Set the control's read-only state */\n  set readonly(value: boolean) {\n    if (value === this._readonly) return;\n    this._readonly = value;\n    this.changeDetector.markForCheck();\n    this.stateChanges.next();\n  }\n\n  /** @internal */\n  _readonly = false;\n\n  /** Handle label, foucus etc. within the control, not in FormField */\n  hasControlContainer = true;\n\n  /** Stores focus state of the date/time inputs. */\n  protected itemHasFocus: IFocusItem = { date: false, time: false };\n\n  /** Stores focus state of date/time inputs _and_ its children. */\n  protected itemHasFocusWithin: IFocusItem = { date: false, time: false };\n\n  /** The date value of the control. */\n  private date: Date | null = null;\n\n  /** Date string as it is displayed in the input field. */\n  protected dateString = '';\n\n  /** Time string as it is displayed in the input field. */\n  protected timeString = '';\n\n  /** Reference to the overlay used for the calendar. */\n  private overlayRef: OverlayRef | undefined;\n\n  /** @internal */\n  @ViewChild('inputDate', { read: ElementRef }) inputDate!: ElementRef<HTMLInputElement>;\n\n  /** @internal */\n  @ViewChildren(InputComponent) inputComponents!: QueryList<InputComponent>;\n\n  private get hostClass(): string {\n    return this.formField ? `size--${this.formField.size()}` : '';\n  }\n\n  protected readonly injector: Injector = inject(Injector);\n  private readonly appLocale = inject(LOCALE_ID);\n  private readonly overlay = inject(Overlay);\n  private readonly viewContainerRef = inject(ViewContainerRef);\n  private readonly dateInputPipe = inject(DateInputPipe);\n  private readonly destroyRef: DestroyRef = inject(DestroyRef);\n\n  /** @internal */\n  ngOnInit(): void {\n    this.id = `talenra-date--${nextId++}`;\n  }\n\n  /** @internal */\n  ngAfterViewInit(): void {\n    this.control = this.injector.get(NgControl, null)?.control || null;\n    this.control?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n      this.stateChanges.next();\n      this.changeDetector.markForCheck();\n    });\n  }\n\n  /** @internal */\n  registerOnChange(fn: never): void {\n    this.onChange = fn;\n  }\n\n  /** @internal */\n  registerOnTouched(fn: never): void {\n    this.onTouched = fn;\n  }\n\n  /** @internal */\n  writeValue(date: Date | string): void {\n    if (date === '') return;\n    this.date = this.getDate(date);\n    if (typeof date === 'string') this.value = this.date;\n    if (date === null || date === undefined) {\n      this.dateString = '';\n      this.timeString = '';\n    } else if (this.date && isValidDateFn(this.date)) {\n      this.dateString = this.dateInputPipe.transform(\n        this.date.toLocaleDateString('de-CH', {\n          day: '2-digit',\n          month: '2-digit',\n          year: 'numeric',\n        })\n      );\n      this.timeString = this.date.toLocaleTimeString('de-CH', { hour: '2-digit', minute: '2-digit' });\n    }\n  }\n\n  /** @internal */\n  openCalendarOverlay(event: Event) {\n    // No overlay while disabled/read-only\n    if (this.disabled || this.readonly) return;\n    // Prevent re-opening the overlay\n    if (this.overlayRef?.overlayElement) return;\n    if (this.overlayRef) this.overlayRef.dispose();\n\n    const overlayConfig = new OverlayConfig({\n      positionStrategy: this.overlay\n        .position()\n        .flexibleConnectedTo(event.target as HTMLElement)\n        .withPositions([\n          {\n            originX: 'end',\n            originY: 'bottom',\n            overlayX: 'end',\n            overlayY: 'top',\n          },\n        ]),\n      hasBackdrop: true,\n      backdropClass: 'cdk-overlay-transparent-backdrop',\n    });\n\n    this.overlayRef = this.overlay.create(overlayConfig);\n    this.overlayRef.backdropClick().subscribe(() => this.overlayRef?.dispose());\n    this.overlayRef.keydownEvents().subscribe((event) => {\n      if (event.key === 'Escape') {\n        this.overlayRef?.dispose();\n        // Only close the Calendar Overlay, not any potential parent Overlays\n        event.stopPropagation();\n      }\n      event.preventDefault();\n    });\n    this.overlayRef.detachments().subscribe(() => {\n      asapScheduler.schedule(() => {\n        this.focus();\n      });\n    });\n\n    const overlayComponent = this.overlayRef.attach(\n      new ComponentPortal(CalendarOverlayComponent, this.viewContainerRef)\n    );\n    overlayComponent.instance.dateFilterFn = this.dateFilterFn;\n    overlayComponent.instance.locale = this.locale;\n    // Try to set the calendar's initial date\n    const valueIsValid: boolean = !!this.date && isValidDateFn(this.date);\n    const initialDate: Date | null = valueIsValid ? this.date : this.calendarInitialDate();\n    if (initialDate) overlayComponent.instance.setInitialDate(initialDate);\n    // Set calendar mode\n    overlayComponent.instance.overlayMode = valueIsValid ? OverlayMode.Day : this.calendarInitialMode();\n    overlayComponent.instance.dateSelected.subscribe((date) => {\n      this.overlayValueSelected(date);\n    });\n  }\n\n  /** @internal */\n  overlayValueSelected(date: Date) {\n    const dateString = date.toLocaleDateString('de-CH', { year: 'numeric', month: 'numeric', day: 'numeric' });\n    this.dateString = this.dateInputPipe.transform(dateString);\n    this.date = this.parseDate();\n    this.onChange(this.date);\n    this.overlayRef?.dispose();\n    this.changeDetector.markForCheck();\n  }\n\n  /** @internal */\n  timeChanged(timeString: string) {\n    if (this.timeString === timeString) return;\n    this.timeString = timeString;\n    this.date = this.parseDate();\n    this.onChange(this.date);\n    this.inputComponents.forEach((inputComponent) => {\n      inputComponent.updateHostClass();\n    });\n  }\n\n  /** @internal */\n  dateChanged(dateString: string) {\n    if (this.dateString === dateString) return;\n    this.dateString = dateString;\n    this.date = this.parseDate();\n    this.onChange(this.date);\n    this.inputComponents.forEach((inputComponent) => {\n      inputComponent.updateHostClass();\n    });\n  }\n\n  private parseDate(): Date | null {\n    if (this.dateString === '') return null;\n\n    const dateParts = this.dateString.split('.');\n    const day = parseInt(dateParts[0]);\n    const month = parseInt(dateParts[1]) - 1; // Subtract 1 to make the month zero-indexed\n    const yearString = dateParts[2];\n    let year = parseInt(yearString);\n    if (yearString && yearString.length == 2) {\n      const currentYear = new Date().getFullYear();\n      const currentCentury = Math.floor(currentYear / 100);\n      year = currentCentury * 100 + parseInt(yearString);\n    }\n    if (!this.isValidDate(day, month, year)) {\n      return new Date('invalid string');\n    }\n    let hour = 0;\n    let minute = 0;\n    const pattern = /^(\\d{1,2}):(\\d{1,2})$/;\n    if (this.timeString && pattern.test(this.timeString)) {\n      const timeParts = this.timeString.split(':');\n      hour = parseInt(timeParts[0]);\n      minute = parseInt(timeParts[1]);\n    }\n\n    if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {\n      return new Date('invalid string');\n    }\n\n    return new Date(year, month, day, hour, minute);\n  }\n\n  private isValidDate(day: number, month: number, year: number) {\n    const date = new Date(year, month, day);\n    return date.getFullYear() === year && date.getMonth() === month && date.getDate() === day;\n  }\n\n  /** Set the focus to the date input. */\n  public focus(): void {\n    this.inputDate?.nativeElement.focus();\n  }\n\n  /** Determines whether clear button is visible. */\n  showClearButton(item: 'date' | 'time'): boolean {\n    return (\n      !this.formField?.hideClearButton() &&\n      !this.disabled &&\n      !this.readonly &&\n      // Only show if the related item has a value\n      !!this[`${item}String`] &&\n      // Only show if related item or its children have focus\n      this.itemHasFocusWithin[item]\n    );\n  }\n\n  /**\n   * Clear the value and focus the input element. Triggered by the clear button in ControlContainers.\n   *\n   * @internal\n   */\n  public clearValue(): void {\n    this.control?.setValue(null);\n    this.onChange(this.value);\n    this.onTouched();\n    this.focus();\n  }\n\n  /**\n   * Handle focus events (focus, blur)\n   *\n   * @internal\n   */\n  onFocusChange(event: FocusEvent): void {\n    const hasFocus: boolean = event.type === 'focus';\n    // No focus while disabled/read-only\n    if (hasFocus && (this.disabled || this.readonly)) return;\n    // Store focus state of the date/time inputs\n    this.itemHasFocus[(event.target as HTMLElement).hasAttribute('talenra-time-input') ? 'time' : 'date'] = hasFocus;\n    if (hasFocus === this.hasFocus) return;\n    this.hasFocus = hasFocus;\n    // Consider the control as 'touched' once the user has triggered a blur event.\n    !this.hasFocus && this.onTouched();\n    // Propagate state changes\n    this.stateChanges.next();\n  }\n\n  /**\n   * Catch keydown event of spacebar. We need to prevent the default behaviour of spacebar's keydown event\n   * (scroll page down) as we want to open the calendar overlay on _keyup_.\n   *\n   * @internal\n   */\n  onSpaceDown(event: Event): void {\n    event.preventDefault();\n  }\n\n  /** @internal */\n  get isEmpty(): boolean {\n    return !this.dateString;\n  }\n\n  /** Returns the locale actually used by the component (dynamic or app locale). */\n  get locale(): string {\n    return this.dynamicLocale ? this.dynamicLocale : this.appLocale;\n  }\n\n  private getDate(date: Date | string): Date | null {\n    if (date instanceof Date) return date;\n\n    if (this.isDateStringWithTimezone(date)) {\n      return new Date(date);\n    }\n\n    const separator = '.';\n    const formattedString = this.dateInputPipe.transform(date);\n    if (this.isSimpleDateString(formattedString, separator)) {\n      const [day, month, year] = formattedString.split(separator).map(Number);\n      if (day && month && year) {\n        return new Date(year, month - 1, day);\n      }\n    }\n    return null;\n  }\n\n  private isDateStringWithTimezone(dateString: string): boolean {\n    const regex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}$/;\n    return regex.test(dateString);\n  }\n\n  private isSimpleDateString(dateString: string, separator: string): boolean {\n    const regex = new RegExp(`^\\\\d{2}\\\\${separator}\\\\d{2}\\\\${separator}\\\\d{4}$`);\n    return regex.test(dateString);\n  }\n}\n","<div class=\"wrapper\">\n  <div\n    class=\"input date\"\n    [class.show-clear-button]=\"showClearButton('date')\"\n    (focusin)=\"itemHasFocusWithin['date'] = true\"\n    (focusout)=\"itemHasFocusWithin['date'] = false\">\n    <talenra-control-container\n      [hasFocus]=\"itemHasFocus.date\"\n      [isEmpty]=\"!dateString\"\n      [label]=\"formField?.label() || ''\"\n      [readonly]=\"readonly\"\n      [required]=\"required\"\n      [status]=\"formField?.status() || 'default'\"\n      [size]=\"formField?.size() || 'm'\"\n      (clearValue)=\"clearValue()\"\n      hideClearButton>\n      <input\n        talenra-input\n        talenra-date-input\n        [isBirthDate]=\"isBirthDate\"\n        [ngModel]=\"dateString\"\n        (ngModelChange)=\"dateChanged($event)\"\n        (blur)=\"onFocusChange($event)\"\n        (focus)=\"onFocusChange($event)\"\n        [disabled]=\"disabled\"\n        [readonly]=\"readonly\"\n        type=\"text\"\n        maxlength=\"10\"\n        data-testid=\"date-input\"\n        #inputDate />\n      <div class=\"buttons\">\n        <talenra-clear-button [isVisible]=\"showClearButton('date')\" (click)=\"clearValue()\" />\n        <talenra-icon\n          class=\"calendar-icon\"\n          name=\"date-range\"\n          tabindex=\"0\"\n          (click)=\"openCalendarOverlay($event)\"\n          (keyup.space)=\"openCalendarOverlay($event)\"\n          (keyup.enter)=\"openCalendarOverlay($event)\"\n          (keydown.space)=\"onSpaceDown($event)\"\n          data-testid=\"calendar-icon\" />\n      </div>\n    </talenra-control-container>\n  </div>\n  @if (showTime) {\n    <div\n      class=\"input time\"\n      [class.show-clear-button]=\"showClearButton('time')\"\n      (focusin)=\"itemHasFocusWithin['time'] = true\"\n      (focusout)=\"itemHasFocusWithin['time'] = false\">\n      <talenra-control-container\n        [hasFocus]=\"itemHasFocus.time\"\n        [isEmpty]=\"!timeString\"\n        [label]=\"timeLabel\"\n        [readonly]=\"readonly\"\n        [required]=\"required\"\n        [status]=\"formField?.status() || 'default'\"\n        [size]=\"formField?.size() || 'm'\"\n        (clearValue)=\"clearValue()\"\n        hideClearButton>\n        <input\n          talenra-input\n          talenra-time-input\n          [ngModel]=\"timeString\"\n          (ngModelChange)=\"timeChanged($event)\"\n          (blur)=\"onFocusChange($event)\"\n          (focus)=\"onFocusChange($event)\"\n          [disabled]=\"disabled\"\n          [readonly]=\"readonly\"\n          type=\"text\"\n          maxlength=\"5\"\n          data-testid=\"time-input\" />\n        <div class=\"buttons\">\n          <talenra-clear-button [isVisible]=\"showClearButton('time')\" (click)=\"clearValue()\" />\n        </div>\n      </talenra-control-container>\n    </div>\n  }\n</div>\n","/**\n * Locale values that can be used to overwrite the current apps's locale.\n *\n * ```html\n * <talenra-date formControlName=\"date1\" dynamicLocale=\"fr-CH\"></talenra-date>\n * ```\n *\n * ```typescript\n * import { DateLocale, TDateLocale } from '@talenra/ngx-base/date';\n * const locale: TDateLocale = DateLocale['fr-CH'];\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { DateLocale } from '@talenra/ngx-base/date';\n * ```\n *\n * @see {@link DateComponent}\n * @deprecated Use `Locale` from `@talenra/ngx-base/shared` instead.\n */\nexport const DateLocale = { 'de-CH': 'de-CH', 'fr-CH': 'fr-CH', 'it-CH': 'it-CH' } as const;\n\n/**\n * Type of locale values that can be used to overwrite the current apps's locale.\n *\n * ### Import\n *\n * ```typescript\n * import { TDateLocale } from '@talenra/ngx-base/date';\n * ```\n *\n * @see {@link DateComponent}\n * @deprecated Use `TLocale` from `@talenra/ngx-base/shared` instead.\n */\nexport type TDateLocale = (typeof DateLocale)[keyof typeof DateLocale];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}