{"version":3,"file":"ngx-com-components-calendar.mjs","sources":["../../../projects/com/components/calendar/calendar.types.ts","../../../projects/com/components/calendar/date-adapter/date-adapter.ts","../../../projects/com/components/calendar/date-adapter/native-date-adapter.ts","../../../projects/com/components/calendar/calendar-cell.variants.ts","../../../projects/com/components/calendar/calendar-header.variants.ts","../../../projects/com/components/calendar/calendar.variants.ts","../../../projects/com/components/calendar/calendar.utils.ts","../../../projects/com/components/calendar/calendar-cell.ts","../../../projects/com/components/calendar/calendar-header.ts","../../../projects/com/components/calendar/views/calendar-view-base.ts","../../../projects/com/components/calendar/views/month-view.ts","../../../projects/com/components/calendar/views/year-view.ts","../../../projects/com/components/calendar/views/multi-year-view.ts","../../../projects/com/components/calendar/views/index.ts","../../../projects/com/components/calendar/selection/selection-strategy.ts","../../../projects/com/components/calendar/selection/single-selection-strategy.ts","../../../projects/com/components/calendar/selection/range-selection-strategy.ts","../../../projects/com/components/calendar/selection/multi-selection-strategy.ts","../../../projects/com/components/calendar/selection/week-selection-strategy.ts","../../../projects/com/components/calendar/selection/index.ts","../../../projects/com/components/calendar/calendar.ts","../../../projects/com/components/calendar/providers.ts","../../../projects/com/components/calendar/index.ts","../../../projects/com/components/calendar/ngx-com-components-calendar.ts"],"sourcesContent":["/**\n * Calendar shared types and interfaces\n */\n\n/** Represents a date range with a start and end date */\nexport interface DateRange<D> {\n  /** Start of the date range */\n  start: D | null;\n  /** End of the date range */\n  end: D | null;\n}\n\n/** Factory function to create a DateRange */\nexport function createDateRange<D>(start: D | null, end: D | null): DateRange<D> {\n  return { start, end };\n}\n\n/** Available calendar views */\nexport type CalendarView = 'month' | 'year' | 'multi-year';\n\n/** Cell states for styling */\nexport type CalendarCellState =\n  | 'default'\n  | 'today'\n  | 'selected'\n  | 'range-start'\n  | 'range-middle'\n  | 'range-end'\n  | 'disabled'\n  | 'preview-start'\n  | 'preview-middle'\n  | 'preview-end';\n\n/** Data structure representing a calendar cell */\nexport interface CalendarCell<D> {\n  /** The date value this cell represents */\n  value: D;\n  /** Display text for the cell */\n  displayValue: string;\n  /** Accessible label for screen readers */\n  ariaLabel: string;\n  /** Whether this cell is enabled/selectable */\n  enabled: boolean;\n  /** CSS classes to apply (from dateClass input) */\n  cssClasses: string;\n  /** Whether this cell represents today */\n  isToday: boolean;\n  /** Whether this cell is currently selected */\n  isSelected: boolean;\n  /** Whether this cell is the start of a range */\n  isRangeStart: boolean;\n  /** Whether this cell is in the middle of a range */\n  isRangeMiddle: boolean;\n  /** Whether this cell is the end of a range */\n  isRangeEnd: boolean;\n  /** Whether this cell is the start of a preview range */\n  isPreviewStart: boolean;\n  /** Whether this cell is in the middle of a preview range */\n  isPreviewMiddle: boolean;\n  /** Whether this cell is the end of a preview range */\n  isPreviewEnd: boolean;\n  /** Comparison value for keyboard navigation and selection */\n  compareValue: number;\n}\n\n/** Configuration for creating a calendar cell */\nexport interface CalendarCellConfig<D> {\n  value: D;\n  displayValue: string;\n  ariaLabel: string;\n  enabled?: boolean;\n  cssClasses?: string;\n  compareValue: number;\n}\n\n/** Factory function to create a CalendarCell with defaults */\nexport function createCalendarCell<D>(config: CalendarCellConfig<D>): CalendarCell<D> {\n  return {\n    value: config.value,\n    displayValue: config.displayValue,\n    ariaLabel: config.ariaLabel,\n    enabled: config.enabled ?? true,\n    cssClasses: config.cssClasses ?? '',\n    compareValue: config.compareValue,\n    isToday: false,\n    isSelected: false,\n    isRangeStart: false,\n    isRangeMiddle: false,\n    isRangeEnd: false,\n    isPreviewStart: false,\n    isPreviewMiddle: false,\n    isPreviewEnd: false,\n  };\n}\n\n/** Style format for month and day names */\nexport type NameStyle = 'long' | 'short' | 'narrow';\n\n/** Number of days in a week */\nexport const DAYS_PER_WEEK = 7;\n\n/** Number of weeks displayed in month view */\nexport const WEEKS_PER_MONTH = 6;\n\n/** Number of years displayed in multi-year view */\nexport const YEARS_PER_PAGE = 24;\n\n/** Number of rows in multi-year view */\nexport const YEARS_PER_ROW = 4;\n\n/** Number of months per row in year view */\nexport const MONTHS_PER_ROW = 4;\n\n/** Function type for custom date filtering */\nexport type DateFilterFn<D> = (date: D) => boolean;\n\n/** Function type for applying custom CSS classes to dates */\nexport type DateClassFn<D> = (date: D, view: CalendarView) => string;\n","import { InjectionToken } from '@angular/core';\nimport type { NameStyle } from '../calendar.types';\n\n/**\n * Abstract date adapter class that provides date manipulation operations.\n * Implement this class to support different date libraries (date-fns, Luxon, Temporal, etc.)\n */\nexport abstract class DateAdapter<D> {\n  /** The locale to use for formatting. Can be overridden. */\n  locale: string = 'en-US';\n\n  /** Gets today's date */\n  abstract today(): D;\n\n  /** Gets the year component of the given date */\n  abstract getYear(date: D): number;\n\n  /** Gets the month component of the given date (0-indexed, 0 = January) */\n  abstract getMonth(date: D): number;\n\n  /** Gets the day of month component of the given date */\n  abstract getDate(date: D): number;\n\n  /** Gets the day of the week (0 = Sunday, 6 = Saturday) */\n  abstract getDayOfWeek(date: D): number;\n\n  /** Adds the given number of days to the date */\n  abstract addDays(date: D, days: number): D;\n\n  /** Adds the given number of months to the date */\n  abstract addMonths(date: D, months: number): D;\n\n  /** Adds the given number of years to the date */\n  abstract addYears(date: D, years: number): D;\n\n  /** Creates a new date with the given year, month (0-indexed), and day */\n  abstract createDate(year: number, month: number, date: number): D;\n\n  /** Gets the number of days in the month of the given date */\n  abstract getNumDaysInMonth(date: D): number;\n\n  /** Gets the first day of the week (0 = Sunday, 1 = Monday, etc.) */\n  abstract getFirstDayOfWeek(): number;\n\n  /** Gets the names of the months */\n  abstract getMonthNames(style: NameStyle): string[];\n\n  /** Gets the names of the days of the week */\n  abstract getDayOfWeekNames(style: NameStyle): string[];\n\n  /** Gets the display name for a year */\n  abstract getYearName(date: D): string;\n\n  /** Formats the date according to the given format string */\n  abstract format(date: D, displayFormat: string): string;\n\n  /** Parses a date string into a date object */\n  abstract parse(value: string, parseFormat: string): D | null;\n\n  /** Checks whether the given date is valid */\n  abstract isValid(date: D): boolean;\n\n  /** Checks whether two dates are the same day */\n  abstract isSameDay(first: D, second: D): boolean;\n\n  /** Compares two dates. Returns -1 if first < second, 0 if equal, 1 if first > second */\n  abstract compareDate(first: D, second: D): number;\n\n  /** Clamps the given date to the specified min/max range */\n  abstract clampDate(date: D, min: D | null, max: D | null): D;\n\n  /**\n   * Gets the first day of the month for the given date\n   */\n  getFirstDayOfMonth(date: D): D {\n    return this.createDate(this.getYear(date), this.getMonth(date), 1);\n  }\n\n  /**\n   * Checks whether two dates are in the same month and year\n   */\n  isSameMonthAndYear(first: D, second: D): boolean {\n    return (\n      this.getYear(first) === this.getYear(second) &&\n      this.getMonth(first) === this.getMonth(second)\n    );\n  }\n\n  /**\n   * Checks whether the given date is within the specified range\n   */\n  isDateInRange(date: D, start: D | null, end: D | null): boolean {\n    if (!start || !end) return false;\n    const compareToStart = this.compareDate(date, start);\n    const compareToEnd = this.compareDate(date, end);\n    return compareToStart >= 0 && compareToEnd <= 0;\n  }\n\n  /** Gets the hour component of the given date (0-23) */\n  abstract getHours(date: D): number;\n\n  /** Gets the minute component of the given date (0-59) */\n  abstract getMinutes(date: D): number;\n\n  /** Gets the second component of the given date (0-59) */\n  abstract getSeconds(date: D): number;\n\n  /** Returns a new date with the given hour, minute, second set */\n  abstract setTime(date: D, hours: number, minutes: number, seconds: number): D;\n\n  /** Creates a date with the given year, month (0-indexed), day, hours, minutes, seconds */\n  abstract createDateTime(\n    year: number,\n    month: number,\n    day: number,\n    hours: number,\n    minutes: number,\n    seconds: number,\n  ): D;\n\n  /**\n   * Gets a unique identifier for the date (useful for trackBy)\n   */\n  getId(date: D): string {\n    return `${this.getYear(date)}-${this.getMonth(date)}-${this.getDate(date)}`;\n  }\n\n  /**\n   * Sets the locale for the adapter\n   */\n  setLocale(locale: string): void {\n    this.locale = locale;\n  }\n}\n\n/** Injection token for the DateAdapter */\nexport const DATE_ADAPTER: InjectionToken<DateAdapter<unknown>> = new InjectionToken<DateAdapter<unknown>>('DATE_ADAPTER');\n","import { inject, Injectable, LOCALE_ID } from '@angular/core';\nimport { DateAdapter } from './date-adapter';\nimport type { NameStyle } from '../calendar.types';\n\n/**\n * DateAdapter implementation using the native JavaScript Date object.\n * This is the default adapter shipped with the library.\n */\n@Injectable()\nexport class NativeDateAdapter extends DateAdapter<Date> {\n  private readonly localeId: string = inject(LOCALE_ID);\n\n  constructor() {\n    super();\n    this.locale = this.localeId;\n  }\n\n  override today(): Date {\n    return this.stripTime(new Date());\n  }\n\n  override getYear(date: Date): number {\n    return date.getFullYear();\n  }\n\n  override getMonth(date: Date): number {\n    return date.getMonth();\n  }\n\n  override getDate(date: Date): number {\n    return date.getDate();\n  }\n\n  override getDayOfWeek(date: Date): number {\n    return date.getDay();\n  }\n\n  override addDays(date: Date, days: number): Date {\n    const result = new Date(date);\n    result.setDate(result.getDate() + days);\n    return this.stripTime(result);\n  }\n\n  override addMonths(date: Date, months: number): Date {\n    const result = new Date(date);\n    const targetMonth = result.getMonth() + months;\n    const targetYear = result.getFullYear() + Math.floor(targetMonth / 12);\n    const normalizedMonth = ((targetMonth % 12) + 12) % 12;\n\n    // Handle month overflow (e.g., Jan 31 + 1 month = Feb 28/29)\n    const daysInTargetMonth = this.getDaysInMonth(targetYear, normalizedMonth);\n    const targetDay = Math.min(result.getDate(), daysInTargetMonth);\n\n    result.setFullYear(targetYear, normalizedMonth, targetDay);\n    return this.stripTime(result);\n  }\n\n  override addYears(date: Date, years: number): Date {\n    return this.addMonths(date, years * 12);\n  }\n\n  override createDate(year: number, month: number, day: number): Date {\n    // Validate inputs\n    if (month < 0 || month > 11) {\n      throw new Error(`Invalid month index \"${month}\". Month index must be between 0 and 11.`);\n    }\n\n    if (day < 1) {\n      throw new Error(`Invalid date \"${day}\". Date must be greater than 0.`);\n    }\n\n    const result = new Date(year, month, day);\n\n    // Check for date overflow (e.g., Feb 30)\n    if (result.getMonth() !== month) {\n      throw new Error(`Invalid date \"${day}\" for month index \"${month}\".`);\n    }\n\n    return this.stripTime(result);\n  }\n\n  override getNumDaysInMonth(date: Date): number {\n    return this.getDaysInMonth(this.getYear(date), this.getMonth(date));\n  }\n\n  override getFirstDayOfWeek(): number {\n    try {\n      // Modern browsers: use Intl.Locale API (Chrome 99+, Firefox 104+, Safari 17+)\n      const locale = new Intl.Locale(this.locale);\n      if ('weekInfo' in locale && locale.weekInfo) {\n        // weekInfo.firstDay is 1=Mon, 7=Sun; convert to 0=Sun, 1=Mon...\n        const firstDay = (locale.weekInfo as { firstDay: number }).firstDay;\n        return firstDay === 7 ? 0 : firstDay;\n      }\n    } catch {\n      // Fallback silently for older browsers\n    }\n\n    // Legacy fallback for browsers without weekInfo support\n    const sundayLocales = ['en', 'ja', 'ko', 'zh'];\n    const localePrefix = this.locale.split('-')[0] ?? this.locale;\n    return sundayLocales.includes(localePrefix) ? 0 : 1;\n  }\n\n  override setLocale(locale: string): void {\n    try {\n      // Validate locale string using Intl.DateTimeFormat\n      new Intl.DateTimeFormat(locale);\n      this.locale = locale;\n    } catch {\n      console.warn(`Invalid locale: ${locale}. Falling back to en-US.`);\n      this.locale = 'en-US';\n    }\n  }\n\n  override getMonthNames(style: NameStyle): string[] {\n    const formatter = new Intl.DateTimeFormat(this.locale, { month: style });\n    return Array.from({ length: 12 }, (_, i) => {\n      const date = new Date(2020, i, 1);\n      return formatter.format(date);\n    });\n  }\n\n  override getDayOfWeekNames(style: NameStyle): string[] {\n    const formatter = new Intl.DateTimeFormat(this.locale, { weekday: style });\n    // Start from a known Sunday (Jan 4, 2020 is a Saturday, Jan 5 is Sunday)\n    return Array.from({ length: 7 }, (_, i) => {\n      const date = new Date(2020, 0, 5 + i); // Jan 5, 2020 is a Sunday\n      return formatter.format(date);\n    });\n  }\n\n  override getYearName(date: Date): string {\n    const formatter = new Intl.DateTimeFormat(this.locale, { year: 'numeric' });\n    return formatter.format(date);\n  }\n\n  override format(date: Date, displayFormat: string): string {\n    if (!this.isValid(date)) {\n      throw new Error('Cannot format invalid date.');\n    }\n\n    // Support common format patterns\n    const formatOptions = this.parseFormatString(displayFormat);\n    const formatter = new Intl.DateTimeFormat(this.locale, formatOptions);\n    return formatter.format(date);\n  }\n\n  override parse(value: string, _parseFormat: string): Date | null {\n    if (!value) return null;\n\n    // Attempt to parse using Date.parse\n    const timestamp = Date.parse(value);\n    if (isNaN(timestamp)) {\n      return null;\n    }\n\n    return this.stripTime(new Date(timestamp));\n  }\n\n  override isValid(date: Date): boolean {\n    return date instanceof Date && !isNaN(date.getTime());\n  }\n\n  override isSameDay(first: Date, second: Date): boolean {\n    return (\n      this.getYear(first) === this.getYear(second) &&\n      this.getMonth(first) === this.getMonth(second) &&\n      this.getDate(first) === this.getDate(second)\n    );\n  }\n\n  override compareDate(first: Date, second: Date): number {\n    const yearDiff = this.getYear(first) - this.getYear(second);\n    if (yearDiff !== 0) return yearDiff > 0 ? 1 : -1;\n\n    const monthDiff = this.getMonth(first) - this.getMonth(second);\n    if (monthDiff !== 0) return monthDiff > 0 ? 1 : -1;\n\n    const dateDiff = this.getDate(first) - this.getDate(second);\n    if (dateDiff !== 0) return dateDiff > 0 ? 1 : -1;\n\n    return 0;\n  }\n\n  override getHours(date: Date): number {\n    return date.getHours();\n  }\n\n  override getMinutes(date: Date): number {\n    return date.getMinutes();\n  }\n\n  override getSeconds(date: Date): number {\n    return date.getSeconds();\n  }\n\n  override setTime(date: Date, hours: number, minutes: number, seconds: number): Date {\n    const result = new Date(date);\n    result.setHours(hours, minutes, seconds, 0);\n    return result;\n  }\n\n  override createDateTime(\n    year: number,\n    month: number,\n    day: number,\n    hours: number,\n    minutes: number,\n    seconds: number,\n  ): Date {\n    if (month < 0 || month > 11) {\n      throw new Error(`Invalid month index \"${month}\". Month index must be between 0 and 11.`);\n    }\n\n    if (day < 1) {\n      throw new Error(`Invalid date \"${day}\". Date must be greater than 0.`);\n    }\n\n    const result = new Date(year, month, day, hours, minutes, seconds);\n\n    if (result.getMonth() !== month) {\n      throw new Error(`Invalid date \"${day}\" for month index \"${month}\".`);\n    }\n\n    return result;\n  }\n\n  override clampDate(date: Date, min: Date | null, max: Date | null): Date {\n    if (min && this.compareDate(date, min) < 0) {\n      return min;\n    }\n    if (max && this.compareDate(date, max) > 0) {\n      return max;\n    }\n    return date;\n  }\n\n  /**\n   * Strips the time component from a date, returning midnight\n   */\n  private stripTime(date: Date): Date {\n    return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n  }\n\n  /**\n   * Gets the number of days in a specific month\n   */\n  private getDaysInMonth(year: number, month: number): number {\n    // Day 0 of next month gives us the last day of current month\n    return new Date(year, month + 1, 0).getDate();\n  }\n\n  /**\n   * Parses a format string into Intl.DateTimeFormat options\n   */\n  private parseFormatString(format: string): Intl.DateTimeFormatOptions {\n    // Simple format mapping - can be extended as needed\n    const formatMap: Record<string, Intl.DateTimeFormatOptions> = {\n      short: { dateStyle: 'short' },\n      medium: { dateStyle: 'medium' },\n      long: { dateStyle: 'long' },\n      full: { dateStyle: 'full' },\n      monthYear: { year: 'numeric', month: 'long' },\n      monthYearShort: { year: 'numeric', month: 'short' },\n      dayMonth: { day: 'numeric', month: 'long' },\n      dayMonthYear: { day: 'numeric', month: 'long', year: 'numeric' },\n      time: { hour: 'numeric', minute: '2-digit' },\n      timeWithSeconds: { hour: 'numeric', minute: '2-digit', second: '2-digit' },\n      dateTimeShort: { dateStyle: 'short', timeStyle: 'short' },\n      dateTimeMedium: { dateStyle: 'medium', timeStyle: 'short' },\n      dateTimeLong: { dateStyle: 'long', timeStyle: 'medium' },\n    };\n\n    return formatMap[format] ?? { dateStyle: 'medium' };\n  }\n}\n","import { cva } from 'class-variance-authority';\n\n\ntype CellView = 'month' | 'year' | 'multi-year';\ntype CellState =\n  | 'default'\n  | 'today'\n  | 'selected'\n  | 'range-start'\n  | 'range-middle'\n  | 'range-end'\n  | 'preview-start'\n  | 'preview-middle'\n  | 'preview-end'\n  | 'disabled';\ntype WrapperRange = 'none' | 'start' | 'middle' | 'end' | 'single';\n\n/**\n * CVA variants for calendar cell styling.\n * Uses semantic theme tokens for consistent cross-theme styling.\n *\n * @tokens `--color-ring`, `--color-foreground`, `--color-muted`,\n *         `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,\n *         `--color-primary-subtle`, `--color-primary-subtle-foreground`,\n *         `--color-disabled-foreground`, `--radius-calendar-cell`\n */\nexport const calendarCellVariants: (props?: {\n  view?: CellView;\n  state?: CellState;\n  outside?: boolean;\n}) => string = cva(\n  // Base styles applied to all cells\n  [\n    'relative',\n    'flex',\n    'items-center',\n    'justify-center',\n    'cursor-pointer',\n    'select-none',\n    'transition-colors',\n    'duration-normal',\n    'focus-visible:outline-[1px]',\n    'focus-visible:outline-offset-2',\n    'focus-visible:outline-ring',\n  ],\n  {\n    variants: {\n      view: {\n        month: ['h-9', 'w-9', 'text-sm', 'rounded-pill'],\n        year: ['h-10', 'w-16', 'text-sm', 'rounded-calendar-cell'],\n        'multi-year': ['h-10', 'w-14', 'text-sm', 'rounded-calendar-cell'],\n      },\n      state: {\n        default: ['text-foreground', 'hover:bg-muted'],\n        today: [\n          'text-primary',\n          'font-semibold',\n          'ring-1',\n          'ring-ring',\n          'hover:bg-primary-subtle',\n        ],\n        selected: [\n          'bg-primary',\n          'text-primary-foreground',\n          'font-semibold',\n          'hover:bg-primary-hover',\n        ],\n        'range-start': [\n          'bg-primary',\n          'text-primary-foreground',\n          'font-semibold',\n          'rounded-l-pill',\n          'rounded-r-none',\n          'hover:bg-primary-hover',\n        ],\n        'range-middle': [\n          'bg-primary-subtle',\n          'text-primary-subtle-foreground',\n          'rounded-none',\n          'hover:brightness-95',\n        ],\n        'range-end': [\n          'bg-primary',\n          'text-primary-foreground',\n          'font-semibold',\n          'rounded-r-pill',\n          'rounded-l-none',\n          'hover:bg-primary-hover',\n        ],\n        // Preview states use opacity-70 intentionally: the reduced opacity distinguishes\n        // the hover preview range from the committed selection, providing clear UX feedback.\n        // No semantic token exists for this transient visual state.\n        'preview-start': [\n          'bg-primary-subtle',\n          'text-primary-subtle-foreground',\n          'rounded-l-pill',\n          'rounded-r-none',\n          'ring-1',\n          'ring-ring',\n          'opacity-70',\n        ],\n        'preview-middle': [\n          'bg-primary-subtle',\n          'text-primary-subtle-foreground',\n          'rounded-none',\n          'opacity-70',\n        ],\n        'preview-end': [\n          'bg-primary-subtle',\n          'text-primary-subtle-foreground',\n          'rounded-r-pill',\n          'rounded-l-none',\n          'ring-1',\n          'ring-ring',\n          'opacity-70',\n        ],\n        disabled: ['text-disabled-foreground', 'cursor-not-allowed', 'hover:bg-transparent'],\n      },\n      outside: {\n        true: ['text-muted-foreground'],\n        false: [],\n      },\n    },\n    compoundVariants: [\n      {\n        state: 'disabled',\n        outside: true,\n        class: ['text-disabled-foreground'],\n      },\n      {\n        state: 'selected',\n        class: ['ring-0'],\n      },\n    ],\n    defaultVariants: {\n      view: 'month',\n      state: 'default',\n      outside: false,\n    },\n  }\n);\n\nexport type CalendarCellVariants = {\n  view?: CellView;\n  state?: CellState;\n  outside?: boolean;\n};\n\n/**\n * CVA variants for the calendar cell wrapper (used for range backgrounds)\n *\n * @tokens `--color-primary-subtle`\n */\nexport const calendarCellWrapperVariants: (props?: { range?: WrapperRange | undefined }) => string = cva(\n  ['relative', 'flex', 'items-center', 'justify-center'],\n  {\n    variants: {\n      range: {\n        none: [],\n        start: ['bg-primary-subtle', 'rounded-l-pill'],\n        middle: ['bg-primary-subtle'],\n        end: ['bg-primary-subtle', 'rounded-r-pill'],\n        single: [],\n      },\n    },\n    defaultVariants: {\n      range: 'none',\n    },\n  }\n);\n\nexport type CalendarCellWrapperVariants = {\n  range?: WrapperRange | undefined;\n};\n","import { cva } from 'class-variance-authority';\n\ntype ButtonType = 'navigation' | 'period';\n\n/**\n * CVA variants for the calendar header container.\n */\nexport const calendarHeaderVariants: () => string = cva(\n  [\n    'flex',\n    'items-center',\n    'justify-between',\n    'px-2',\n    'py-1',\n    'mb-2',\n  ],\n  {\n    variants: {},\n    defaultVariants: {},\n  }\n);\n\nexport type CalendarHeaderVariants = Record<string, never>;\n\n/**\n * CVA variants for the calendar header buttons.\n *\n * @tokens `--color-foreground`, `--color-ring`, `--color-muted`,\n *         `--color-disabled-foreground`, `--radius-calendar-cell`\n */\nexport const calendarHeaderButtonVariants: (props?: { type?: ButtonType }) => string = cva(\n  [\n    'inline-flex',\n    'items-center',\n    'justify-center',\n    'select-none',\n    'transition-colors',\n    'duration-normal',\n    'text-foreground',\n    'focus-visible:outline-[1px]',\n    'focus-visible:outline-offset-2',\n    'focus-visible:outline-ring',\n    'disabled:cursor-not-allowed',\n    'disabled:text-disabled-foreground',\n  ],\n  {\n    variants: {\n      type: {\n        navigation: [\n          'h-9',\n          'w-9',\n          'rounded-pill',\n          'hover:bg-muted',\n        ],\n        period: [\n          'px-3',\n          'py-1.5',\n          'text-sm',\n          'font-semibold',\n          'rounded-calendar-cell',\n          'hover:bg-muted',\n        ],\n      },\n    },\n    defaultVariants: {\n      type: 'navigation',\n    },\n  }\n);\n\nexport type CalendarHeaderButtonVariants = {\n  type?: ButtonType;\n};\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * CVA variants for the main calendar container.\n *\n * @tokens `--color-background`, `--color-border-subtle`, `--radius-calendar`\n */\nexport const calendarVariants: (props?: { bordered?: boolean }) => string = cva(\n  [\n    'com-calendar',\n    'inline-block',\n    'p-2',\n    'bg-background',\n  ],\n  {\n    variants: {\n      bordered: {\n        true: ['rounded-calendar', 'shadow-sm', 'border', 'border-border-subtle'],\n        false: [],\n      },\n    },\n    defaultVariants: {\n      bordered: true,\n    },\n  }\n);\n\nexport type CalendarVariants = VariantProps<typeof calendarVariants>;\n\n/**\n * CVA variants for the months container in month view.\n * Handles single vs dual-month layouts.\n */\nexport const monthsContainerVariants: (props?: { columns?: 1 | 2 }) => string = cva('', {\n  variants: {\n    columns: {\n      1: '',\n      2: 'flex gap-4',\n    },\n  },\n  defaultVariants: {\n    columns: 1,\n  },\n});\n\nexport type MonthsContainerVariants = VariantProps<typeof monthsContainerVariants>;\n","import type { DateAdapter } from './date-adapter';\nimport type { NameStyle } from './calendar.types';\n\n/**\n * Creates a 2D grid from a flat array of items.\n *\n * @param items The flat array of items to arrange into a grid\n * @param columns Number of columns per row\n * @returns 2D array where each inner array is a row\n */\nexport function createGrid<T>(items: T[], columns: number): T[][] {\n  const grid: T[][] = [];\n  for (let i = 0; i < items.length; i += columns) {\n    grid.push(items.slice(i, i + columns));\n  }\n  return grid;\n}\n\n/**\n * Calculates the new index when navigating a grid with arrow keys.\n *\n * @param currentIndex Current position in the flat array\n * @param direction Navigation direction ('left' | 'right' | 'up' | 'down')\n * @param totalItems Total number of items in the grid\n * @param columns Number of columns per row\n * @returns New index or null if navigation would go out of bounds\n */\nexport function navigateGrid(\n  currentIndex: number,\n  direction: 'left' | 'right' | 'up' | 'down',\n  totalItems: number,\n  columns: number\n): number | null {\n  let newIndex: number;\n\n  switch (direction) {\n    case 'left':\n      newIndex = currentIndex - 1;\n      break;\n    case 'right':\n      newIndex = currentIndex + 1;\n      break;\n    case 'up':\n      newIndex = currentIndex - columns;\n      break;\n    case 'down':\n      newIndex = currentIndex + columns;\n      break;\n    default:\n      return null;\n  }\n\n  if (newIndex < 0 || newIndex >= totalItems) {\n    return null;\n  }\n\n  return newIndex;\n}\n\n/**\n * Weekday header information for the month view.\n */\nexport interface WeekdayHeader {\n  /** Full label for the weekday (used in aria-label) */\n  label: string;\n  /** Narrow/abbreviated label (displayed in the header cell) */\n  narrow: string;\n}\n\n/**\n * Gets weekday headers for the calendar month view.\n * The headers are ordered starting from the first day of the week.\n *\n * @param adapter Date adapter to use for getting weekday names\n * @param style Style for the full label ('long' | 'short' | 'narrow')\n * @param firstDayOfWeek Optional override for first day of week (0=Sun, 1=Mon, ..., 6=Sat)\n * @returns Array of weekday headers starting from first day of week\n */\nexport function getWeekdayHeaders<D>(\n  adapter: DateAdapter<D>,\n  style: NameStyle = 'long',\n  firstDayOfWeek?: number\n): WeekdayHeader[] {\n  const startDay = firstDayOfWeek ?? adapter.getFirstDayOfWeek();\n  const longNames = adapter.getDayOfWeekNames(style);\n  const narrowNames = adapter.getDayOfWeekNames('narrow');\n\n  const headers: WeekdayHeader[] = [];\n  for (let i = 0; i < 7; i++) {\n    const dayIndex = (startDay + i) % 7;\n    headers.push({\n      label: longNames[dayIndex] ?? '',\n      narrow: narrowNames[dayIndex] ?? '',\n    });\n  }\n  return headers;\n}\n\n/**\n * Checks whether a date should be disabled based on constraints.\n *\n * @param date The date to check\n * @param minDate Minimum allowed date (inclusive)\n * @param maxDate Maximum allowed date (inclusive)\n * @param dateFilter Custom filter function\n * @param adapter Date adapter for comparisons\n * @returns true if the date should be disabled\n */\nexport function isDateDisabled<D>(\n  date: D,\n  minDate: D | null,\n  maxDate: D | null,\n  dateFilter: ((d: D) => boolean) | null,\n  adapter: DateAdapter<D>\n): boolean {\n  if (minDate && adapter.compareDate(date, minDate) < 0) {\n    return true;\n  }\n  if (maxDate && adapter.compareDate(date, maxDate) > 0) {\n    return true;\n  }\n  if (dateFilter && !dateFilter(date)) {\n    return true;\n  }\n  return false;\n}\n\n/**\n * Checks whether a month should be disabled based on constraints.\n * A month is disabled if ALL days in that month are disabled.\n *\n * @param year The year of the month to check\n * @param month The month to check (0-indexed)\n * @param minDate Minimum allowed date\n * @param maxDate Maximum allowed date\n * @param adapter Date adapter for date operations\n * @returns true if the entire month should be disabled\n */\nexport function isMonthDisabled<D>(\n  year: number,\n  month: number,\n  minDate: D | null,\n  maxDate: D | null,\n  adapter: DateAdapter<D>\n): boolean {\n  const firstOfMonth = adapter.createDate(year, month, 1);\n  const lastOfMonth = adapter.createDate(year, month, adapter.getNumDaysInMonth(firstOfMonth));\n\n  // Month is disabled if it's entirely before min or entirely after max\n  if (minDate && adapter.compareDate(lastOfMonth, minDate) < 0) {\n    return true;\n  }\n  if (maxDate && adapter.compareDate(firstOfMonth, maxDate) > 0) {\n    return true;\n  }\n  return false;\n}\n\n/**\n * Checks whether a year should be disabled based on constraints.\n * A year is disabled if ALL months in that year are disabled.\n *\n * @param year The year to check\n * @param minDate Minimum allowed date\n * @param maxDate Maximum allowed date\n * @param adapter Date adapter for date operations\n * @returns true if the entire year should be disabled\n */\nexport function isYearDisabled<D>(\n  year: number,\n  minDate: D | null,\n  maxDate: D | null,\n  adapter: DateAdapter<D>\n): boolean {\n  const firstOfYear = adapter.createDate(year, 0, 1);\n  const lastOfYear = adapter.createDate(year, 11, 31);\n\n  // Year is disabled if it's entirely before min or entirely after max\n  if (minDate && adapter.compareDate(lastOfYear, minDate) < 0) {\n    return true;\n  }\n  if (maxDate && adapter.compareDate(firstOfYear, maxDate) > 0) {\n    return true;\n  }\n  return false;\n}\n\n/**\n * Gets the starting year for the multi-year view grid.\n * Aligns the year to be at the start of a YEARS_PER_PAGE block.\n *\n * @param activeYear The currently active year\n * @param yearsPerPage Number of years shown per page (default 24)\n * @returns The first year of the multi-year page\n */\nexport function getMultiYearStartingYear(activeYear: number, yearsPerPage: number = 24): number {\n  return Math.floor(activeYear / yearsPerPage) * yearsPerPage;\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  ElementRef,\n  input,\n  output,\n  viewChild,\n} from '@angular/core';\nimport type { Signal, InputSignal, OutputEmitterRef, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n  calendarCellVariants,\n  calendarCellWrapperVariants,\n} from './calendar-cell.variants';\nimport type { CalendarCellVariants } from './calendar-cell.variants';\nimport type { CalendarCell, CalendarCellState, CalendarView } from './calendar.types';\n\n/** Event emitted when a navigation key is pressed */\nexport interface CalendarCellKeyNavEvent<D> {\n  direction: string;\n  cell: CalendarCell<D>;\n}\n\n/**\n * A single cell in the calendar grid.\n * This is a shared, stateless component used across all calendar views.\n *\n * @example\n * ```html\n * <com-calendar-cell\n *   [cell]=\"dayCell\"\n *   [view]=\"'month'\"\n *   (selected)=\"onSelect($event)\"\n * />\n * ```\n *\n * @tokens `--color-ring`, `--color-foreground`, `--color-muted`, `--color-muted-foreground`,\n *         `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,\n *         `--color-primary-subtle`, `--color-primary-subtle-foreground`,\n *         `--color-disabled-foreground`, `--radius-calendar-cell`\n */\n@Component({\n  selector: 'com-calendar-cell',\n  template: `\n    <div [class]=\"wrapperClasses()\">\n      <button\n        #cellButton\n        type=\"button\"\n        [class]=\"cellClasses()\"\n        [attr.aria-label]=\"cell().ariaLabel\"\n        [attr.aria-selected]=\"cell().isSelected || null\"\n        [attr.aria-disabled]=\"!cell().enabled || null\"\n        [attr.aria-current]=\"cell().isToday ? 'date' : null\"\n        [attr.tabindex]=\"tabindex()\"\n        [disabled]=\"!cell().enabled\"\n        (click)=\"onCellClick()\"\n        (keydown)=\"onKeydown($event)\"\n        (mouseenter)=\"onMouseEnter()\"\n        (focus)=\"onFocus()\"\n      >\n        @if (cellTemplate()) {\n          <ng-container\n            [ngTemplateOutlet]=\"cellTemplate()!\"\n            [ngTemplateOutletContext]=\"{ $implicit: cell() }\"\n          />\n        } @else {\n          {{ cell().displayValue }}\n        }\n      </button>\n    </div>\n  `,\n  imports: [NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    role: 'gridcell',\n  },\n})\nexport class ComCalendarCell<D> {\n  /** Reference to the button element for focus management */\n  private readonly buttonRef: Signal<ElementRef<HTMLButtonElement> | undefined> = viewChild<ElementRef<HTMLButtonElement>>('cellButton');\n\n  /** The cell data to render */\n  readonly cell: InputSignal<CalendarCell<D>> = input.required<CalendarCell<D>>();\n\n  /** The current calendar view */\n  readonly view: InputSignal<CalendarView> = input<CalendarView>('month');\n\n  /** Whether this cell is outside the current month (for month view) */\n  readonly outside: InputSignal<boolean> = input<boolean>(false);\n\n  /** Tab index for keyboard navigation (-1 for not focusable, 0 for focusable) */\n  readonly tabindex: InputSignal<number> = input<number>(-1);\n\n  /** Custom template for cell content */\n  readonly cellTemplate: InputSignal<TemplateRef<{ $implicit: CalendarCell<D> }> | null> = input<TemplateRef<{\n    $implicit: CalendarCell<D>;\n  }> | null>(null);\n\n  /** Emitted when the cell is selected */\n  readonly selected: OutputEmitterRef<CalendarCell<D>> = output<CalendarCell<D>>();\n\n  /** Emitted when the cell is focused */\n  readonly focused: OutputEmitterRef<CalendarCell<D>> = output<CalendarCell<D>>();\n\n  /** Emitted when the mouse enters the cell (for range preview) */\n  readonly previewed: OutputEmitterRef<CalendarCell<D>> = output<CalendarCell<D>>();\n\n  /** Emitted when a navigation key is pressed */\n  readonly keyNav: OutputEmitterRef<CalendarCellKeyNavEvent<D>> = output<CalendarCellKeyNavEvent<D>>();\n\n  /** Computed cell state for styling */\n  protected readonly cellState: Signal<CalendarCellState> = computed<CalendarCellState>(() => {\n    const c = this.cell();\n\n    if (!c.enabled) return 'disabled';\n    if (c.isRangeStart) return 'range-start';\n    if (c.isRangeEnd) return 'range-end';\n    if (c.isRangeMiddle) return 'range-middle';\n    if (c.isPreviewStart) return 'preview-start';\n    if (c.isPreviewEnd) return 'preview-end';\n    if (c.isPreviewMiddle) return 'preview-middle';\n    if (c.isSelected) return 'selected';\n    if (c.isToday) return 'today';\n    return 'default';\n  });\n\n  /** Computed wrapper range state */\n  protected readonly wrapperRange: Signal<'none' | 'start' | 'middle' | 'end' | 'single'> = computed(() => {\n    const c = this.cell();\n    if (c.isRangeStart && c.isRangeEnd) return 'single';\n    if (c.isRangeStart) return 'start';\n    if (c.isRangeEnd) return 'end';\n    if (c.isRangeMiddle) return 'middle';\n    return 'none';\n  });\n\n  /** Computed CSS classes for the cell button */\n  protected readonly cellClasses: Signal<string> = computed(() => {\n    const c = this.cell();\n    const variants: CalendarCellVariants = {\n      view: this.view(),\n      state: this.cellState(),\n      outside: this.outside(),\n    };\n    const baseClasses = calendarCellVariants(variants);\n    return c.cssClasses ? `${baseClasses} ${c.cssClasses}` : baseClasses;\n  });\n\n  /** Computed CSS classes for the wrapper div */\n  protected readonly wrapperClasses: Signal<string> = computed(() => {\n    return calendarCellWrapperVariants({ range: this.wrapperRange() });\n  });\n\n  protected onCellClick(): void {\n    const c = this.cell();\n    if (c.enabled) {\n      this.selected.emit(c);\n    }\n  }\n\n  protected onKeydown(event: KeyboardEvent): void {\n    const c = this.cell();\n    const navKeys: Record<string, string> = {\n      ArrowLeft: 'left',\n      ArrowRight: 'right',\n      ArrowUp: 'up',\n      ArrowDown: 'down',\n      Home: 'home',\n      End: 'end',\n      PageUp: 'pageUp',\n      PageDown: 'pageDown',\n    };\n\n    const direction = navKeys[event.key];\n    if (direction) {\n      event.preventDefault();\n      this.keyNav.emit({ direction, cell: c });\n      return;\n    }\n\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      if (c.enabled) {\n        this.selected.emit(c);\n      }\n    }\n  }\n\n  protected onMouseEnter(): void {\n    this.previewed.emit(this.cell());\n  }\n\n  protected onFocus(): void {\n    this.focused.emit(this.cell());\n  }\n\n  /** Focuses the button element within this cell */\n  focusButton(): void {\n    this.buttonRef()?.nativeElement.focus();\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  input,\n  output,\n  type InputSignal,\n  type OutputEmitterRef,\n  type Signal,\n} from '@angular/core';\nimport {\n  calendarHeaderVariants,\n  calendarHeaderButtonVariants,\n} from './calendar-header.variants';\n\n/**\n * Navigation header component for the calendar.\n * Provides prev/next buttons and a clickable period label for view switching.\n *\n * @example\n * ```html\n * <com-calendar-header\n *   [periodLabel]=\"'January 2024'\"\n *   [periodAriaLabel]=\"'January 2024, click to switch view'\"\n *   [prevDisabled]=\"false\"\n *   [nextDisabled]=\"false\"\n *   [canSwitchView]=\"true\"\n *   (prevClicked)=\"onPrev()\"\n *   (nextClicked)=\"onNext()\"\n *   (periodClicked)=\"onPeriodClick()\"\n * />\n * ```\n *\n * @tokens `--color-foreground`, `--color-ring`, `--color-muted`,\n *         `--color-disabled-foreground`, `--radius-calendar-cell`\n */\n@Component({\n  selector: 'com-calendar-header',\n  template: `\n    <div [class]=\"headerClasses()\">\n      <button\n        type=\"button\"\n        [class]=\"navButtonClasses()\"\n        [disabled]=\"prevDisabled()\"\n        [attr.aria-label]=\"prevAriaLabel()\"\n        (click)=\"prevClicked.emit()\"\n      >\n        <svg\n          class=\"h-5 w-5\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          aria-hidden=\"true\"\n        >\n          <path\n            d=\"M15 18l-6-6 6-6\"\n            stroke-width=\"2\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n          />\n        </svg>\n      </button>\n\n      <button\n        type=\"button\"\n        [class]=\"periodButtonClasses()\"\n        [attr.aria-label]=\"periodAriaLabel()\"\n        [disabled]=\"!canSwitchView()\"\n        (click)=\"onPeriodClick()\"\n      >\n        {{ periodLabel() }}\n      </button>\n\n      <button\n        type=\"button\"\n        [class]=\"navButtonClasses()\"\n        [disabled]=\"nextDisabled()\"\n        [attr.aria-label]=\"nextAriaLabel()\"\n        (click)=\"nextClicked.emit()\"\n      >\n        <svg\n          class=\"h-5 w-5\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          aria-hidden=\"true\"\n        >\n          <path\n            d=\"M9 18l6-6-6-6\"\n            stroke-width=\"2\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n          />\n        </svg>\n      </button>\n    </div>\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    class: 'com-calendar-header-host block',\n  },\n})\nexport class ComCalendarHeader {\n  /** Display text (e.g., \"January 2024\", \"2024\", \"2000 – 2023\") */\n  readonly periodLabel: InputSignal<string> = input.required<string>();\n\n  /** Accessible label for period button */\n  readonly periodAriaLabel: InputSignal<string> = input.required<string>();\n\n  /** Accessible label for previous button */\n  readonly prevAriaLabel: InputSignal<string> = input<string>('Previous');\n\n  /** Accessible label for next button */\n  readonly nextAriaLabel: InputSignal<string> = input<string>('Next');\n\n  /** Disable previous button */\n  readonly prevDisabled: InputSignal<boolean> = input<boolean>(false);\n\n  /** Disable next button */\n  readonly nextDisabled: InputSignal<boolean> = input<boolean>(false);\n\n  /** Whether clicking period label switches view */\n  readonly canSwitchView: InputSignal<boolean> = input<boolean>(true);\n\n  /** Emitted when previous button is clicked */\n  readonly prevClicked: OutputEmitterRef<void> = output<void>();\n\n  /** Emitted when next button is clicked */\n  readonly nextClicked: OutputEmitterRef<void> = output<void>();\n\n  /** Emitted when period label is clicked (switch view) */\n  readonly periodClicked: OutputEmitterRef<void> = output<void>();\n\n  /** Computed header container classes */\n  protected readonly headerClasses: Signal<string> = computed(() =>\n    calendarHeaderVariants()\n  );\n\n  /** Computed navigation button classes */\n  protected readonly navButtonClasses: Signal<string> = computed(() =>\n    calendarHeaderButtonVariants({ type: 'navigation' })\n  );\n\n  /** Computed period button classes */\n  protected readonly periodButtonClasses: Signal<string> = computed(() =>\n    calendarHeaderButtonVariants({ type: 'period' })\n  );\n\n  /**\n   * Handles period button click.\n   * Only emits if view switching is allowed.\n   */\n  protected onPeriodClick(): void {\n    if (this.canSwitchView()) {\n      this.periodClicked.emit();\n    }\n  }\n}\n","import {\n  Directive,\n  afterEveryRender,\n  inject,\n  input,\n  output,\n  computed,\n  signal,\n  type Signal,\n  type InputSignal,\n  type OutputEmitterRef,\n  type WritableSignal,\n  type TemplateRef,\n} from '@angular/core';\nimport type { ComCalendarCell } from '../calendar-cell';\nimport type {\n  CalendarCell,\n  CalendarView,\n  DateFilterFn,\n  DateClassFn,\n  DateRange,\n} from '../calendar.types';\nimport { DateAdapter, DATE_ADAPTER } from '../date-adapter';\n\n/**\n * Abstract base class for calendar view components.\n * Provides shared inputs, outputs, and utility methods for month, year, and multi-year views.\n *\n * @tokens None - abstract base class, tokens are defined in concrete view components\n */\n@Directive()\nexport abstract class CalendarViewBase<D> {\n  /** Date adapter for date operations */\n  protected readonly dateAdapter: DateAdapter<D> = inject(DATE_ADAPTER) as DateAdapter<D>;\n\n  /** The date to display and navigate from */\n  readonly activeDate: InputSignal<D> = input.required<D>();\n\n  /** The currently selected date, date range, or array of dates (multi-selection) */\n  readonly selected: InputSignal<D | D[] | DateRange<D> | null> = input<D | D[] | DateRange<D> | null>(null);\n\n  /** Minimum selectable date */\n  readonly minDate: InputSignal<D | null> = input<D | null>(null);\n\n  /** Maximum selectable date */\n  readonly maxDate: InputSignal<D | null> = input<D | null>(null);\n\n  /** Custom filter function to disable specific dates */\n  readonly dateFilter: InputSignal<DateFilterFn<D> | null> = input<DateFilterFn<D> | null>(null);\n\n  /** Custom function to add CSS classes to dates */\n  readonly dateClass: InputSignal<DateClassFn<D> | null> = input<DateClassFn<D> | null>(null);\n\n  /** Start date for range preview (hover state) */\n  readonly previewStart: InputSignal<D | null> = input<D | null>(null);\n\n  /** End date for range preview (hover state) */\n  readonly previewEnd: InputSignal<D | null> = input<D | null>(null);\n\n  /** Custom template for cell content */\n  readonly cellTemplate: InputSignal<TemplateRef<{ $implicit: CalendarCell<D> }> | null> = input<\n    TemplateRef<{ $implicit: CalendarCell<D> }> | null\n  >(null);\n\n  /** Emitted when a date is selected */\n  readonly selectedChange: OutputEmitterRef<D> = output<D>();\n\n  /** Emitted when the active date changes (keyboard navigation) */\n  readonly activeDateChange: OutputEmitterRef<D> = output<D>();\n\n  /** Emitted when the preview range changes (mouse hover) */\n  readonly previewChange: OutputEmitterRef<D | null> = output<D | null>();\n\n  /** The calendar view type for this component */\n  protected abstract readonly view: CalendarView;\n\n  /** Cell components for focus management. Must be implemented by each view using viewChildren. */\n  protected abstract readonly cellComponents: Signal<readonly ComCalendarCell<D>[]>;\n\n  /** Internal signal for tracking the focused cell's compare value */\n  protected readonly focusedCellValue: WritableSignal<number | null> = signal<number | null>(null);\n\n  /** Signal for pending focus operation (set by focusCell, consumed by afterRender) */\n  protected readonly focusPending: WritableSignal<number | null> = signal<number | null>(null);\n\n  constructor() {\n    // Handle focus after render to ensure DOM is updated\n    afterEveryRender(() => {\n      const pending = this.focusPending();\n      if (pending !== null) {\n        const cellComponent = this.cellComponents().find(\n          c => c.cell().compareValue === pending\n        );\n        cellComponent?.focusButton();\n        this.focusPending.set(null);\n      }\n    });\n  }\n\n  /**\n   * The grid of cells to display.\n   * Must be implemented by each view to generate the appropriate cells.\n   */\n  abstract readonly cells: Signal<CalendarCell<D>[][]>;\n\n  /**\n   * Accessible label for the grid (e.g., \"January 2024\").\n   * Must be implemented by each view.\n   */\n  abstract readonly gridLabel: Signal<string>;\n\n  /** Today's date for comparison */\n  protected readonly today: Signal<D> = computed(() => this.dateAdapter.today());\n\n  /**\n   * Checks if a date is the currently selected date.\n   */\n  protected isSelected(date: D): boolean {\n    const sel = this.selected();\n    if (!sel) return false;\n\n    // Multi selection (array of dates)\n    if (Array.isArray(sel)) {\n      return sel.some(d => this.dateAdapter.isSameDay(date, d));\n    }\n\n    // Range selection - check start or end\n    if (this.isDateRange(sel)) {\n      const range = sel as DateRange<D>;\n      if (range.start && this.dateAdapter.isSameDay(date, range.start)) return true;\n      if (range.end && this.dateAdapter.isSameDay(date, range.end)) return true;\n      return false;\n    }\n\n    // Single date selection\n    return this.dateAdapter.isSameDay(date, sel);\n  }\n\n  /**\n   * Checks if a date is the start of a selected range.\n   */\n  protected isRangeStart(date: D): boolean {\n    const sel = this.selected();\n    if (!sel || !this.isDateRange(sel)) return false;\n    return sel.start !== null && this.dateAdapter.isSameDay(date, sel.start);\n  }\n\n  /**\n   * Checks if a date is the end of a selected range.\n   */\n  protected isRangeEnd(date: D): boolean {\n    const sel = this.selected();\n    if (!sel || !this.isDateRange(sel)) return false;\n    return sel.end !== null && this.dateAdapter.isSameDay(date, sel.end);\n  }\n\n  /**\n   * Checks if a date is in the middle of a selected range.\n   */\n  protected isRangeMiddle(date: D): boolean {\n    const sel = this.selected();\n    if (!sel || !this.isDateRange(sel)) return false;\n    if (!sel.start || !sel.end) return false;\n    return this.dateAdapter.isDateInRange(date, sel.start, sel.end) && !this.isRangeStart(date) && !this.isRangeEnd(date);\n  }\n\n  /**\n   * Checks if a date is the start of the preview range.\n   */\n  protected isPreviewStart(date: D): boolean {\n    const start = this.previewStart();\n    return start !== null && this.dateAdapter.isSameDay(date, start);\n  }\n\n  /**\n   * Checks if a date is the end of the preview range.\n   */\n  protected isPreviewEnd(date: D): boolean {\n    const end = this.previewEnd();\n    return end !== null && this.dateAdapter.isSameDay(date, end);\n  }\n\n  /**\n   * Checks if a date is in the middle of the preview range.\n   */\n  protected isPreviewMiddle(date: D): boolean {\n    const start = this.previewStart();\n    const end = this.previewEnd();\n    if (!start || !end) return false;\n    return (\n      this.dateAdapter.isDateInRange(date, start, end) && !this.isPreviewStart(date) && !this.isPreviewEnd(date)\n    );\n  }\n\n  /**\n   * Type guard to check if a value is a DateRange.\n   */\n  protected isDateRange(value: D | D[] | DateRange<D>): value is DateRange<D> {\n    return value !== null && typeof value === 'object' && 'start' in value && 'end' in value;\n  }\n\n  /**\n   * Handles cell selection events.\n   */\n  onCellSelected(cell: CalendarCell<D>): void {\n    if (cell.enabled) {\n      this.selectedChange.emit(cell.value);\n    }\n  }\n\n  /**\n   * Handles cell preview events (mouse hover).\n   */\n  onCellPreviewed(cell: CalendarCell<D>): void {\n    this.previewChange.emit(cell.value);\n  }\n\n  /**\n   * Clears the preview when mouse leaves the grid.\n   */\n  onGridMouseLeave(): void {\n    this.previewChange.emit(null);\n  }\n\n  /**\n   * Handles keyboard navigation within the grid.\n   * Must be implemented by each view to handle view-specific navigation.\n   */\n  abstract onKeyNav(event: { direction: string; cell: CalendarCell<D> }): void;\n\n  /**\n   * Checks if a cell should have tabindex=\"0\" (be the focusable cell).\n   */\n  isActiveCell(cell: CalendarCell<D>): boolean {\n    const focused = this.focusedCellValue();\n    if (focused !== null) {\n      return cell.compareValue === focused;\n    }\n    // Default to the active date's cell\n    return this.getActiveCompareValue() === cell.compareValue;\n  }\n\n  /**\n   * Gets the compare value for the active date.\n   * Must be implemented by each view.\n   */\n  protected abstract getActiveCompareValue(): number;\n\n  /**\n   * Focuses the cell with the given compare value.\n   * Uses afterRender to ensure DOM is updated before focusing.\n   * Public to allow parent components to manage cross-grid focus in dual-month mode.\n   */\n  focusCell(compareValue: number): void {\n    this.focusedCellValue.set(compareValue);\n    this.focusPending.set(compareValue);\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  input,\n  viewChildren,\n  type InputSignal,\n  type Signal,\n} from '@angular/core';\nimport { ComCalendarCell, type CalendarCellKeyNavEvent } from '../calendar-cell';\nimport type { CalendarCell, CalendarView } from '../calendar.types';\nimport {\n  DAYS_PER_WEEK,\n  WEEKS_PER_MONTH,\n  createCalendarCell,\n} from '../calendar.types';\nimport { createGrid, getWeekdayHeaders, isDateDisabled, type WeekdayHeader } from '../calendar.utils';\nimport { CalendarViewBase } from './calendar-view-base';\n\nconst TOTAL_CELLS = DAYS_PER_WEEK * WEEKS_PER_MONTH;\n\n/**\n * Month view component displaying a 7x6 grid of days.\n * Shows the days of the current month with leading/trailing days from adjacent months.\n *\n * @example\n * ```html\n * <com-calendar-month-view\n *   [activeDate]=\"activeDate()\"\n *   [selected]=\"selected()\"\n *   (selectedChange)=\"onDateSelected($event)\"\n *   (activeDateChange)=\"onActiveDateChange($event)\"\n * />\n * ```\n *\n * @tokens `--color-muted-foreground`\n */\n@Component({\n  selector: 'com-calendar-month-view',\n  template: `\n    <div\n      role=\"grid\"\n      class=\"com-calendar-month-view\"\n      [attr.aria-label]=\"gridLabel()\"\n      (mouseleave)=\"onGridMouseLeave()\"\n    >\n      <!-- Weekday headers -->\n      <div role=\"row\" class=\"com-calendar-month-view__header grid grid-cols-7 gap-0\">\n        @for (header of weekdayHeaders(); track $index) {\n          <div\n            role=\"columnheader\"\n            class=\"com-calendar-month-view__header-cell flex items-center justify-center h-9 text-xs font-medium text-muted-foreground\"\n            [attr.aria-label]=\"header.label\"\n          >\n            {{ header.narrow }}\n          </div>\n        }\n      </div>\n\n      <!-- Day cells -->\n      @for (row of cells(); track $index) {\n        <div role=\"row\" class=\"com-calendar-month-view__row grid grid-cols-7 gap-0\">\n          @for (cell of row; track cell.compareValue) {\n            <com-calendar-cell\n              [cell]=\"cell\"\n              [view]=\"view\"\n              [outside]=\"isOutsideMonth(cell)\"\n              [tabindex]=\"isActiveCell(cell) ? 0 : -1\"\n              [cellTemplate]=\"cellTemplate()\"\n              [attr.data-compare-value]=\"cell.compareValue\"\n              (selected)=\"onCellSelected($event)\"\n              (previewed)=\"onCellPreviewed($event)\"\n              (keyNav)=\"onKeyNav($event)\"\n            />\n          }\n        </div>\n      }\n    </div>\n  `,\n  imports: [ComCalendarCell],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    class: 'com-calendar-month-view-host',\n  },\n})\nexport class ComCalendarMonthView<D> extends CalendarViewBase<D> {\n  protected readonly view: CalendarView = 'month';\n\n  /** Cell components for focus management */\n  protected readonly cellComponents: Signal<readonly ComCalendarCell<D>[]> = viewChildren<ComCalendarCell<D>>(ComCalendarCell);\n\n  /** Override first day of week (0=Sun, 1=Mon, ..., 6=Sat) */\n  readonly firstDayOfWeek: InputSignal<number> = input<number>(0);\n\n  /** Grid index for dual-month display (0=left, 1=right) */\n  readonly gridIndex: InputSignal<number> = input<number>(0);\n\n  /** Weekday header labels */\n  readonly weekdayHeaders: Signal<WeekdayHeader[]> = computed(() => {\n    return getWeekdayHeaders(this.dateAdapter, 'long', this.firstDayOfWeek());\n  });\n\n  /** The month being displayed (0-indexed) */\n  readonly displayMonth: Signal<number> = computed(() => {\n    return this.dateAdapter.getMonth(this.activeDate());\n  });\n\n  /** The year being displayed */\n  readonly displayYear: Signal<number> = computed(() => {\n    return this.dateAdapter.getYear(this.activeDate());\n  });\n\n  /** Grid of day cells (7 columns x 6 rows = 42 cells) */\n  readonly cells: Signal<CalendarCell<D>[][]> = computed(() => {\n    const activeDate = this.activeDate();\n    const _year = this.dateAdapter.getYear(activeDate);\n    const _month = this.dateAdapter.getMonth(activeDate);\n    const firstOfMonth = this.dateAdapter.getFirstDayOfMonth(activeDate);\n    const firstDayOfWeek = this.firstDayOfWeek();\n\n    // Calculate the offset to start the grid\n    // How many days from the previous month should we show?\n    const firstDayOfMonthWeekday = this.dateAdapter.getDayOfWeek(firstOfMonth);\n    const offset = (firstDayOfMonthWeekday - firstDayOfWeek + DAYS_PER_WEEK) % DAYS_PER_WEEK;\n\n    // Start date is the first cell (may be in previous month)\n    const startDate = this.dateAdapter.addDays(firstOfMonth, -offset);\n\n    const today = this.today();\n    const minDate = this.minDate();\n    const maxDate = this.maxDate();\n    const dateFilter = this.dateFilter();\n    const dateClass = this.dateClass();\n\n    const days: CalendarCell<D>[] = [];\n\n    for (let i = 0; i < TOTAL_CELLS; i++) {\n      const date = this.dateAdapter.addDays(startDate, i);\n      const dayOfMonth = this.dateAdapter.getDate(date);\n      const cellMonth = this.dateAdapter.getMonth(date);\n      const isDisabled = isDateDisabled(date, minDate, maxDate, dateFilter, this.dateAdapter);\n      const isToday = this.dateAdapter.isSameDay(date, today);\n      const cssClasses = dateClass ? dateClass(date, this.view) : '';\n\n      // Create a unique compare value using year, month, day\n      const cellYear = this.dateAdapter.getYear(date);\n      const compareValue = cellYear * 10000 + cellMonth * 100 + dayOfMonth;\n\n      const cell = createCalendarCell<D>({\n        value: date,\n        displayValue: String(dayOfMonth),\n        ariaLabel: this.dateAdapter.format(date, 'fullDate'),\n        enabled: !isDisabled,\n        cssClasses,\n        compareValue,\n      });\n\n      // Update computed properties\n      cell.isToday = isToday;\n      cell.isSelected = this.isSelected(date);\n      cell.isRangeStart = this.isRangeStart(date);\n      cell.isRangeEnd = this.isRangeEnd(date);\n      cell.isRangeMiddle = this.isRangeMiddle(date);\n      cell.isPreviewStart = this.isPreviewStart(date);\n      cell.isPreviewEnd = this.isPreviewEnd(date);\n      cell.isPreviewMiddle = this.isPreviewMiddle(date);\n\n      days.push(cell);\n    }\n\n    return createGrid(days, DAYS_PER_WEEK);\n  });\n\n  /** Accessible label for the grid showing month and year */\n  readonly gridLabel: Signal<string> = computed(() => {\n    const monthNames = this.dateAdapter.getMonthNames('long');\n    return `${monthNames[this.displayMonth()]} ${this.displayYear()}`;\n  });\n\n  /** First date of the displayed month */\n  private readonly firstOfMonth: Signal<D> = computed(() => {\n    return this.dateAdapter.getFirstDayOfMonth(this.activeDate());\n  });\n\n  protected getActiveCompareValue(): number {\n    const date = this.activeDate();\n    const year = this.dateAdapter.getYear(date);\n    const month = this.dateAdapter.getMonth(date);\n    const day = this.dateAdapter.getDate(date);\n    return year * 10000 + month * 100 + day;\n  }\n\n  /**\n   * Checks if a cell is outside the current displayed month.\n   */\n  isOutsideMonth(cell: CalendarCell<D>): boolean {\n    const cellMonth = this.dateAdapter.getMonth(cell.value);\n    return cellMonth !== this.displayMonth();\n  }\n\n  /**\n   * Handles keyboard navigation for the month view.\n   * - Arrow left/right: ±1 day\n   * - Arrow up/down: ±7 days (one week)\n   * - Home: First day of week\n   * - End: Last day of week\n   * - PageUp: Previous month\n   * - PageDown: Next month\n   */\n  onKeyNav(event: CalendarCellKeyNavEvent<D>): void {\n    const currentDate = event.cell.value;\n    let newDate: D | null = null;\n\n    switch (event.direction) {\n      case 'left':\n        newDate = this.dateAdapter.addDays(currentDate, -1);\n        break;\n\n      case 'right':\n        newDate = this.dateAdapter.addDays(currentDate, 1);\n        break;\n\n      case 'up':\n        newDate = this.dateAdapter.addDays(currentDate, -DAYS_PER_WEEK);\n        break;\n\n      case 'down':\n        newDate = this.dateAdapter.addDays(currentDate, DAYS_PER_WEEK);\n        break;\n\n      case 'home': {\n        // Go to first day of the week\n        const dayOfWeek = this.dateAdapter.getDayOfWeek(currentDate);\n        const firstDay = this.firstDayOfWeek();\n        const diff = (dayOfWeek - firstDay + DAYS_PER_WEEK) % DAYS_PER_WEEK;\n        newDate = this.dateAdapter.addDays(currentDate, -diff);\n        break;\n      }\n\n      case 'end': {\n        // Go to last day of the week\n        const dayOfWeek = this.dateAdapter.getDayOfWeek(currentDate);\n        const firstDay = this.firstDayOfWeek();\n        const daysUntilEnd = (6 - dayOfWeek + firstDay + DAYS_PER_WEEK) % DAYS_PER_WEEK;\n        newDate = this.dateAdapter.addDays(currentDate, daysUntilEnd);\n        break;\n      }\n\n      case 'pageUp':\n        newDate = this.dateAdapter.addMonths(currentDate, -1);\n        break;\n\n      case 'pageDown':\n        newDate = this.dateAdapter.addMonths(currentDate, 1);\n        break;\n    }\n\n    if (newDate) {\n      // Update focus cell compare value\n      const year = this.dateAdapter.getYear(newDate);\n      const month = this.dateAdapter.getMonth(newDate);\n      const day = this.dateAdapter.getDate(newDate);\n      const compareValue = year * 10000 + month * 100 + day;\n      this.focusCell(compareValue);\n      this.activeDateChange.emit(newDate);\n    }\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  viewChildren,\n  type Signal,\n} from '@angular/core';\nimport { ComCalendarCell, type CalendarCellKeyNavEvent } from '../calendar-cell';\nimport type { CalendarCell, CalendarView } from '../calendar.types';\nimport { MONTHS_PER_ROW, createCalendarCell } from '../calendar.types';\nimport { createGrid, isMonthDisabled } from '../calendar.utils';\nimport { CalendarViewBase } from './calendar-view-base';\n\nconst MONTHS_PER_YEAR = 12;\n\n/**\n * Year view component displaying a 4x3 grid of months.\n * Allows the user to select a month within the currently active year.\n *\n * @example\n * ```html\n * <com-calendar-year-view\n *   [activeDate]=\"activeDate()\"\n *   [selected]=\"selected()\"\n *   (selectedChange)=\"onMonthSelected($event)\"\n *   (activeDateChange)=\"onActiveMonthChange($event)\"\n * />\n * ```\n *\n * @tokens None - uses ComCalendarCell which provides all token styling\n */\n@Component({\n  selector: 'com-calendar-year-view',\n  template: `\n    <div\n      role=\"grid\"\n      class=\"com-calendar-year-view\"\n      [attr.aria-label]=\"gridLabel()\"\n      (mouseleave)=\"onGridMouseLeave()\"\n    >\n      @for (row of cells(); track $index) {\n        <div role=\"row\" class=\"com-calendar-year-view__row grid grid-cols-4 gap-1\">\n          @for (cell of row; track cell.compareValue) {\n            <com-calendar-cell\n              [cell]=\"cell\"\n              [view]=\"view\"\n              [tabindex]=\"isActiveCell(cell) ? 0 : -1\"\n              [cellTemplate]=\"cellTemplate()\"\n              [attr.data-compare-value]=\"cell.compareValue\"\n              (selected)=\"onCellSelected($event)\"\n              (previewed)=\"onCellPreviewed($event)\"\n              (keyNav)=\"onKeyNav($event)\"\n            />\n          }\n        </div>\n      }\n    </div>\n  `,\n  imports: [ComCalendarCell],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    class: 'com-calendar-year-view-host',\n  },\n})\nexport class ComCalendarYearView<D> extends CalendarViewBase<D> {\n  protected readonly view: CalendarView = 'year';\n\n  /** Cell components for focus management */\n  protected readonly cellComponents: Signal<readonly ComCalendarCell<D>[]> = viewChildren<ComCalendarCell<D>>(ComCalendarCell);\n\n  /** The year being displayed */\n  readonly displayYear: Signal<number> = computed(() => {\n    return this.dateAdapter.getYear(this.activeDate());\n  });\n\n  /** Grid of month cells (4 columns x 3 rows = 12 months) */\n  readonly cells: Signal<CalendarCell<D>[][]> = computed(() => {\n    const year = this.displayYear();\n    const monthNames = this.dateAdapter.getMonthNames('short');\n    const today = this.today();\n    const todayYear = this.dateAdapter.getYear(today);\n    const todayMonth = this.dateAdapter.getMonth(today);\n    const _activeMonth = this.dateAdapter.getMonth(this.activeDate());\n    const minDate = this.minDate();\n    const maxDate = this.maxDate();\n    const dateClass = this.dateClass();\n\n    const months: CalendarCell<D>[] = [];\n\n    for (let month = 0; month < MONTHS_PER_YEAR; month++) {\n      const date = this.dateAdapter.createDate(year, month, 1);\n      const isDisabled = isMonthDisabled(year, month, minDate, maxDate, this.dateAdapter);\n      const isToday = year === todayYear && month === todayMonth;\n      const isSelectedMonth = this.isMonthSelected(year, month);\n      const cssClasses = dateClass ? dateClass(date, this.view) : '';\n\n      const monthName = monthNames[month] ?? '';\n      const cell = createCalendarCell<D>({\n        value: date,\n        displayValue: monthName,\n        ariaLabel: `${monthName} ${year}`,\n        enabled: !isDisabled,\n        cssClasses,\n        compareValue: month,\n      });\n\n      // Update computed properties\n      cell.isToday = isToday;\n      cell.isSelected = isSelectedMonth;\n      cell.isRangeStart = this.isMonthRangeStart(year, month);\n      cell.isRangeEnd = this.isMonthRangeEnd(year, month);\n      cell.isRangeMiddle = this.isMonthRangeMiddle(year, month);\n      cell.isPreviewStart = this.isMonthPreviewStart(year, month);\n      cell.isPreviewEnd = this.isMonthPreviewEnd(year, month);\n      cell.isPreviewMiddle = this.isMonthPreviewMiddle(year, month);\n\n      months.push(cell);\n    }\n\n    return createGrid(months, MONTHS_PER_ROW);\n  });\n\n  /** Accessible label for the grid */\n  readonly gridLabel: Signal<string> = computed(() => {\n    return `${this.displayYear()}`;\n  });\n\n  protected getActiveCompareValue(): number {\n    return this.dateAdapter.getMonth(this.activeDate());\n  }\n\n  /**\n   * Handles keyboard navigation for the year view.\n   * - Arrow left/right: ±1 month\n   * - Arrow up/down: ±4 months (one row)\n   * - Home: January\n   * - End: December\n   * - PageUp: Previous year\n   * - PageDown: Next year\n   */\n  onKeyNav(event: CalendarCellKeyNavEvent<D>): void {\n    const currentMonth = this.dateAdapter.getMonth(event.cell.value);\n    const year = this.displayYear();\n    let newDate: D | null = null;\n\n    switch (event.direction) {\n      case 'left':\n        if (currentMonth > 0) {\n          newDate = this.dateAdapter.addMonths(event.cell.value, -1);\n          this.focusCell(currentMonth - 1);\n        }\n        break;\n\n      case 'right':\n        if (currentMonth < 11) {\n          newDate = this.dateAdapter.addMonths(event.cell.value, 1);\n          this.focusCell(currentMonth + 1);\n        }\n        break;\n\n      case 'up':\n        if (currentMonth >= MONTHS_PER_ROW) {\n          newDate = this.dateAdapter.addMonths(event.cell.value, -MONTHS_PER_ROW);\n          this.focusCell(currentMonth - MONTHS_PER_ROW);\n        }\n        break;\n\n      case 'down':\n        if (currentMonth < MONTHS_PER_YEAR - MONTHS_PER_ROW) {\n          newDate = this.dateAdapter.addMonths(event.cell.value, MONTHS_PER_ROW);\n          this.focusCell(currentMonth + MONTHS_PER_ROW);\n        }\n        break;\n\n      case 'home':\n        newDate = this.dateAdapter.createDate(year, 0, 1);\n        this.focusCell(0);\n        break;\n\n      case 'end':\n        newDate = this.dateAdapter.createDate(year, 11, 1);\n        this.focusCell(11);\n        break;\n\n      case 'pageUp':\n        newDate = this.dateAdapter.addYears(event.cell.value, -1);\n        break;\n\n      case 'pageDown':\n        newDate = this.dateAdapter.addYears(event.cell.value, 1);\n        break;\n    }\n\n    if (newDate) {\n      this.activeDateChange.emit(newDate);\n    }\n  }\n\n  private isMonthSelected(year: number, month: number): boolean {\n    const sel = this.selected();\n    if (!sel) return false;\n\n    if (Array.isArray(sel)) {\n      return sel.some(d => this.dateAdapter.getYear(d) === year && this.dateAdapter.getMonth(d) === month);\n    }\n\n    if (!this.isDateRange(sel)) {\n      return (\n        this.dateAdapter.getYear(sel) === year && this.dateAdapter.getMonth(sel) === month\n      );\n    }\n\n    const range = sel;\n    if (\n      range.start &&\n      this.dateAdapter.getYear(range.start) === year &&\n      this.dateAdapter.getMonth(range.start) === month\n    ) {\n      return true;\n    }\n    if (\n      range.end &&\n      this.dateAdapter.getYear(range.end) === year &&\n      this.dateAdapter.getMonth(range.end) === month\n    ) {\n      return true;\n    }\n    return false;\n  }\n\n  private isMonthRangeStart(year: number, month: number): boolean {\n    const sel = this.selected();\n    if (!sel || !this.isDateRange(sel) || !sel.start) return false;\n    return (\n      this.dateAdapter.getYear(sel.start) === year &&\n      this.dateAdapter.getMonth(sel.start) === month\n    );\n  }\n\n  private isMonthRangeEnd(year: number, month: number): boolean {\n    const sel = this.selected();\n    if (!sel || !this.isDateRange(sel) || !sel.end) return false;\n    return (\n      this.dateAdapter.getYear(sel.end) === year && this.dateAdapter.getMonth(sel.end) === month\n    );\n  }\n\n  private isMonthRangeMiddle(year: number, month: number): boolean {\n    const sel = this.selected();\n    if (!sel || !this.isDateRange(sel) || !sel.start || !sel.end) return false;\n\n    const monthDate = this.dateAdapter.createDate(year, month, 1);\n    const startMonth = this.dateAdapter.createDate(\n      this.dateAdapter.getYear(sel.start),\n      this.dateAdapter.getMonth(sel.start),\n      1\n    );\n    const endMonth = this.dateAdapter.createDate(\n      this.dateAdapter.getYear(sel.end),\n      this.dateAdapter.getMonth(sel.end),\n      1\n    );\n\n    return (\n      this.dateAdapter.compareDate(monthDate, startMonth) > 0 &&\n      this.dateAdapter.compareDate(monthDate, endMonth) < 0\n    );\n  }\n\n  private isMonthPreviewStart(year: number, month: number): boolean {\n    const start = this.previewStart();\n    if (!start) return false;\n    return (\n      this.dateAdapter.getYear(start) === year && this.dateAdapter.getMonth(start) === month\n    );\n  }\n\n  private isMonthPreviewEnd(year: number, month: number): boolean {\n    const end = this.previewEnd();\n    if (!end) return false;\n    return this.dateAdapter.getYear(end) === year && this.dateAdapter.getMonth(end) === month;\n  }\n\n  private isMonthPreviewMiddle(year: number, month: number): boolean {\n    const start = this.previewStart();\n    const end = this.previewEnd();\n    if (!start || !end) return false;\n\n    const monthDate = this.dateAdapter.createDate(year, month, 1);\n    const startMonth = this.dateAdapter.createDate(\n      this.dateAdapter.getYear(start),\n      this.dateAdapter.getMonth(start),\n      1\n    );\n    const endMonth = this.dateAdapter.createDate(\n      this.dateAdapter.getYear(end),\n      this.dateAdapter.getMonth(end),\n      1\n    );\n\n    return (\n      this.dateAdapter.compareDate(monthDate, startMonth) > 0 &&\n      this.dateAdapter.compareDate(monthDate, endMonth) < 0\n    );\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  viewChildren,\n  type Signal,\n} from '@angular/core';\nimport { ComCalendarCell, type CalendarCellKeyNavEvent } from '../calendar-cell';\nimport type { CalendarCell, CalendarView } from '../calendar.types';\nimport { YEARS_PER_PAGE, YEARS_PER_ROW, createCalendarCell } from '../calendar.types';\nimport { createGrid, getMultiYearStartingYear, isYearDisabled } from '../calendar.utils';\nimport { CalendarViewBase } from './calendar-view-base';\n\n/**\n * Multi-year view component displaying a 4x6 grid of years (24 years total).\n * Allows the user to select a year within the displayed range.\n *\n * @example\n * ```html\n * <com-calendar-multi-year-view\n *   [activeDate]=\"activeDate()\"\n *   [selected]=\"selected()\"\n *   (selectedChange)=\"onYearSelected($event)\"\n *   (activeDateChange)=\"onActiveYearChange($event)\"\n * />\n * ```\n *\n * @tokens None - uses ComCalendarCell which provides all token styling\n */\n@Component({\n  selector: 'com-calendar-multi-year-view',\n  template: `\n    <div\n      role=\"grid\"\n      class=\"com-calendar-multi-year-view\"\n      [attr.aria-label]=\"gridLabel()\"\n      (mouseleave)=\"onGridMouseLeave()\"\n    >\n      @for (row of cells(); track $index) {\n        <div role=\"row\" class=\"com-calendar-multi-year-view__row grid grid-cols-4 gap-1\">\n          @for (cell of row; track cell.compareValue) {\n            <com-calendar-cell\n              [cell]=\"cell\"\n              [view]=\"view\"\n              [tabindex]=\"isActiveCell(cell) ? 0 : -1\"\n              [cellTemplate]=\"cellTemplate()\"\n              [attr.data-compare-value]=\"cell.compareValue\"\n              (selected)=\"onCellSelected($event)\"\n              (previewed)=\"onCellPreviewed($event)\"\n              (keyNav)=\"onKeyNav($event)\"\n            />\n          }\n        </div>\n      }\n    </div>\n  `,\n  imports: [ComCalendarCell],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    class: 'com-calendar-multi-year-view-host',\n  },\n})\nexport class ComCalendarMultiYearView<D> extends CalendarViewBase<D> {\n  protected readonly view: CalendarView = 'multi-year';\n\n  /** Cell components for focus management */\n  protected readonly cellComponents: Signal<readonly ComCalendarCell<D>[]> = viewChildren<ComCalendarCell<D>>(ComCalendarCell);\n\n  /** The first year in the displayed range */\n  readonly startYear: Signal<number> = computed(() => {\n    const activeYear = this.dateAdapter.getYear(this.activeDate());\n    return getMultiYearStartingYear(activeYear, YEARS_PER_PAGE);\n  });\n\n  /** The last year in the displayed range */\n  readonly endYear: Signal<number> = computed(() => {\n    return this.startYear() + YEARS_PER_PAGE - 1;\n  });\n\n  /** Grid of year cells (4 columns x 6 rows = 24 years) */\n  readonly cells: Signal<CalendarCell<D>[][]> = computed(() => {\n    const start = this.startYear();\n    const today = this.today();\n    const todayYear = this.dateAdapter.getYear(today);\n    const _activeYear = this.dateAdapter.getYear(this.activeDate());\n    const minDate = this.minDate();\n    const maxDate = this.maxDate();\n    const dateClass = this.dateClass();\n\n    const years: CalendarCell<D>[] = [];\n\n    for (let i = 0; i < YEARS_PER_PAGE; i++) {\n      const year = start + i;\n      const date = this.dateAdapter.createDate(year, 0, 1);\n      const isDisabled = isYearDisabled(year, minDate, maxDate, this.dateAdapter);\n      const isToday = year === todayYear;\n      const isSelectedYear = this.isYearSelected(year);\n      const cssClasses = dateClass ? dateClass(date, this.view) : '';\n\n      const cell = createCalendarCell<D>({\n        value: date,\n        displayValue: this.dateAdapter.getYearName(date),\n        ariaLabel: this.dateAdapter.getYearName(date),\n        enabled: !isDisabled,\n        cssClasses,\n        compareValue: year,\n      });\n\n      // Update computed properties\n      cell.isToday = isToday;\n      cell.isSelected = isSelectedYear;\n      cell.isRangeStart = this.isYearRangeStart(year);\n      cell.isRangeEnd = this.isYearRangeEnd(year);\n      cell.isRangeMiddle = this.isYearRangeMiddle(year);\n      cell.isPreviewStart = this.isYearPreviewStart(year);\n      cell.isPreviewEnd = this.isYearPreviewEnd(year);\n      cell.isPreviewMiddle = this.isYearPreviewMiddle(year);\n\n      years.push(cell);\n    }\n\n    return createGrid(years, YEARS_PER_ROW);\n  });\n\n  /** Accessible label for the grid showing the year range */\n  readonly gridLabel: Signal<string> = computed(() => {\n    return `${this.startYear()} – ${this.endYear()}`;\n  });\n\n  protected getActiveCompareValue(): number {\n    return this.dateAdapter.getYear(this.activeDate());\n  }\n\n  /**\n   * Handles keyboard navigation for the multi-year view.\n   * - Arrow left/right: ±1 year\n   * - Arrow up/down: ±4 years (one row)\n   * - Home: First year in range\n   * - End: Last year in range\n   * - PageUp: Previous 24 years\n   * - PageDown: Next 24 years\n   */\n  onKeyNav(event: CalendarCellKeyNavEvent<D>): void {\n    const currentYear = this.dateAdapter.getYear(event.cell.value);\n    const start = this.startYear();\n    const end = this.endYear();\n    const indexInPage = currentYear - start;\n    let newDate: D | null = null;\n\n    switch (event.direction) {\n      case 'left':\n        if (currentYear > start) {\n          newDate = this.dateAdapter.addYears(event.cell.value, -1);\n          this.focusCell(currentYear - 1);\n        }\n        break;\n\n      case 'right':\n        if (currentYear < end) {\n          newDate = this.dateAdapter.addYears(event.cell.value, 1);\n          this.focusCell(currentYear + 1);\n        }\n        break;\n\n      case 'up':\n        if (indexInPage >= YEARS_PER_ROW) {\n          newDate = this.dateAdapter.addYears(event.cell.value, -YEARS_PER_ROW);\n          this.focusCell(currentYear - YEARS_PER_ROW);\n        }\n        break;\n\n      case 'down':\n        if (indexInPage < YEARS_PER_PAGE - YEARS_PER_ROW) {\n          newDate = this.dateAdapter.addYears(event.cell.value, YEARS_PER_ROW);\n          this.focusCell(currentYear + YEARS_PER_ROW);\n        }\n        break;\n\n      case 'home':\n        newDate = this.dateAdapter.createDate(start, 0, 1);\n        this.focusCell(start);\n        break;\n\n      case 'end':\n        newDate = this.dateAdapter.createDate(end, 0, 1);\n        this.focusCell(end);\n        break;\n\n      case 'pageUp':\n        newDate = this.dateAdapter.addYears(event.cell.value, -YEARS_PER_PAGE);\n        break;\n\n      case 'pageDown':\n        newDate = this.dateAdapter.addYears(event.cell.value, YEARS_PER_PAGE);\n        break;\n    }\n\n    if (newDate) {\n      this.activeDateChange.emit(newDate);\n    }\n  }\n\n  private isYearSelected(year: number): boolean {\n    const sel = this.selected();\n    if (!sel) return false;\n\n    if (Array.isArray(sel)) {\n      return sel.some(d => this.dateAdapter.getYear(d) === year);\n    }\n\n    if (!this.isDateRange(sel)) {\n      return this.dateAdapter.getYear(sel) === year;\n    }\n\n    const range = sel;\n    if (range.start && this.dateAdapter.getYear(range.start) === year) {\n      return true;\n    }\n    if (range.end && this.dateAdapter.getYear(range.end) === year) {\n      return true;\n    }\n    return false;\n  }\n\n  private isYearRangeStart(year: number): boolean {\n    const sel = this.selected();\n    if (!sel || !this.isDateRange(sel) || !sel.start) return false;\n    return this.dateAdapter.getYear(sel.start) === year;\n  }\n\n  private isYearRangeEnd(year: number): boolean {\n    const sel = this.selected();\n    if (!sel || !this.isDateRange(sel) || !sel.end) return false;\n    return this.dateAdapter.getYear(sel.end) === year;\n  }\n\n  private isYearRangeMiddle(year: number): boolean {\n    const sel = this.selected();\n    if (!sel || !this.isDateRange(sel) || !sel.start || !sel.end) return false;\n\n    const startYear = this.dateAdapter.getYear(sel.start);\n    const endYear = this.dateAdapter.getYear(sel.end);\n\n    return year > startYear && year < endYear;\n  }\n\n  private isYearPreviewStart(year: number): boolean {\n    const start = this.previewStart();\n    if (!start) return false;\n    return this.dateAdapter.getYear(start) === year;\n  }\n\n  private isYearPreviewEnd(year: number): boolean {\n    const end = this.previewEnd();\n    if (!end) return false;\n    return this.dateAdapter.getYear(end) === year;\n  }\n\n  private isYearPreviewMiddle(year: number): boolean {\n    const start = this.previewStart();\n    const end = this.previewEnd();\n    if (!start || !end) return false;\n\n    const startYear = this.dateAdapter.getYear(start);\n    const endYear = this.dateAdapter.getYear(end);\n\n    return year > startYear && year < endYear;\n  }\n}\n","/**\n * Calendar view components\n */\n\nexport { CalendarViewBase } from './calendar-view-base';\nexport { ComCalendarMonthView } from './month-view';\nexport { ComCalendarYearView } from './year-view';\nexport { ComCalendarMultiYearView } from './multi-year-view';\n","import { InjectionToken } from '@angular/core';\nimport type { DateRange } from '../calendar.types';\n\n/**\n * Result returned from a selection strategy's select method.\n */\nexport interface SelectionResult<D, S> {\n  /** The new selection value */\n  selection: S;\n  /** Whether the selection is complete (emit to consumer) */\n  isComplete: boolean;\n  /** Optional: dates to highlight during incomplete selection */\n  preview?: DateRange<D> | null;\n}\n\n/**\n * Abstract selection strategy that defines how dates are selected and previewed.\n * Implement this class to create custom selection behaviors.\n *\n * @typeParam D - The date type (e.g., Date, Luxon DateTime)\n * @typeParam S - The selection type (e.g., D | null, DateRange<D>, D[])\n */\nexport abstract class CalendarSelectionStrategy<D, S = unknown> {\n  /**\n   * Process a date selection. Called when user clicks a date cell.\n   * @param date The clicked date\n   * @param currentSelection The current selection state\n   * @returns Object with new selection and whether selection is complete\n   */\n  abstract select(date: D, currentSelection: S): SelectionResult<D, S>;\n\n  /**\n   * Create a preview range based on current selection and hovered date.\n   * Used for showing range preview while hovering.\n   * @param activeDate The currently hovered date\n   * @param currentSelection The current selection state\n   * @returns DateRange for preview styling, or null if no preview\n   */\n  abstract createPreview(activeDate: D | null, currentSelection: S): DateRange<D> | null;\n\n  /**\n   * Check if a date is part of the current selection.\n   * Used for styling cells.\n   */\n  abstract isSelected(date: D, currentSelection: S): boolean;\n\n  /**\n   * Check if a date is the start of a selected range.\n   */\n  abstract isRangeStart(date: D, currentSelection: S): boolean;\n\n  /**\n   * Check if a date is the end of a selected range.\n   */\n  abstract isRangeEnd(date: D, currentSelection: S): boolean;\n\n  /**\n   * Check if a date is in the middle of a selected range.\n   */\n  abstract isRangeMiddle(date: D, currentSelection: S): boolean;\n}\n\n/** Injection token for the selection strategy */\nexport const CALENDAR_SELECTION_STRATEGY: InjectionToken<\n  CalendarSelectionStrategy<unknown, unknown>\n> = new InjectionToken<CalendarSelectionStrategy<unknown, unknown>>(\n  'CalendarSelectionStrategy'\n);\n","import { inject, Injectable } from '@angular/core';\nimport type { DateRange } from '../calendar.types';\nimport { DateAdapter, DATE_ADAPTER } from '../date-adapter';\nimport { CalendarSelectionStrategy, type SelectionResult } from './selection-strategy';\n\n/**\n * Selection strategy for single date selection.\n *\n * Behavior:\n * - Click date → immediately selects it\n * - No preview range\n * - Output: single date D\n *\n * @example\n * ```typescript\n * @Component({\n *   providers: [\n *     { provide: CALENDAR_SELECTION_STRATEGY, useClass: SingleSelectionStrategy }\n *   ],\n *   template: `<com-calendar (selectedChange)=\"onSelect($event)\" />`\n * })\n * export class SinglePickerComponent {\n *   onSelect(date: Date) {\n *     console.log('Selected:', date);\n *   }\n * }\n * ```\n */\n@Injectable()\nexport class SingleSelectionStrategy<D> extends CalendarSelectionStrategy<D, D | null> {\n  private readonly dateAdapter: DateAdapter<D> = inject(DATE_ADAPTER) as DateAdapter<D>;\n\n  select(date: D, _currentSelection: D | null): SelectionResult<D, D | null> {\n    return {\n      selection: date,\n      isComplete: true,\n    };\n  }\n\n  createPreview(_activeDate: D | null, _currentSelection: D | null): DateRange<D> | null {\n    // Single selection has no preview\n    return null;\n  }\n\n  isSelected(date: D, currentSelection: D | null): boolean {\n    if (!currentSelection) return false;\n    return this.dateAdapter.isSameDay(date, currentSelection);\n  }\n\n  isRangeStart(_date: D, _currentSelection: D | null): boolean {\n    // No range in single selection\n    return false;\n  }\n\n  isRangeEnd(_date: D, _currentSelection: D | null): boolean {\n    return false;\n  }\n\n  isRangeMiddle(_date: D, _currentSelection: D | null): boolean {\n    return false;\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport type { DateRange } from '../calendar.types';\nimport { DateAdapter, DATE_ADAPTER } from '../date-adapter';\nimport { CalendarSelectionStrategy, type SelectionResult } from './selection-strategy';\n\n/**\n * Selection strategy for date range selection.\n *\n * Behavior:\n * - First click → sets range start, selection incomplete\n * - Second click → sets range end, selection complete\n * - If second date is before first, swap them\n * - Hovering after first click shows preview range\n * - Output: DateRange<D>\n *\n * @example\n * ```typescript\n * @Component({\n *   providers: [\n *     { provide: CALENDAR_SELECTION_STRATEGY, useClass: RangeSelectionStrategy }\n *   ],\n *   template: `\n *     <com-calendar\n *       [selected]=\"selectedRange()\"\n *       (selectedChange)=\"onRangeSelect($event)\"\n *     />\n *   `\n * })\n * export class RangePickerComponent {\n *   selectedRange = signal<DateRange<Date> | null>(null);\n *\n *   onRangeSelect(range: DateRange<Date>) {\n *     this.selectedRange.set(range);\n *   }\n * }\n * ```\n */\n@Injectable()\nexport class RangeSelectionStrategy<D> extends CalendarSelectionStrategy<D, DateRange<D> | null> {\n  private readonly dateAdapter: DateAdapter<D> = inject(DATE_ADAPTER) as DateAdapter<D>;\n\n  select(date: D, currentSelection: DateRange<D> | null): SelectionResult<D, DateRange<D> | null> {\n    // If no selection or selection is complete, start new range\n    if (!currentSelection || (currentSelection.start && currentSelection.end)) {\n      return {\n        selection: { start: date, end: null },\n        isComplete: false,\n      };\n    }\n\n    // We have a start but no end - complete the range\n    const start = currentSelection.start!;\n    let rangeStart: D;\n    let rangeEnd: D;\n\n    // Ensure start <= end\n    if (this.dateAdapter.compareDate(date, start) < 0) {\n      rangeStart = date;\n      rangeEnd = start;\n    } else {\n      rangeStart = start;\n      rangeEnd = date;\n    }\n\n    return {\n      selection: { start: rangeStart, end: rangeEnd },\n      isComplete: true,\n    };\n  }\n\n  createPreview(activeDate: D | null, currentSelection: DateRange<D> | null): DateRange<D> | null {\n    // Only show preview when we have start but no end\n    if (!activeDate || !currentSelection?.start || currentSelection.end) {\n      return null;\n    }\n\n    const start = currentSelection.start;\n    // Ensure preview has correct order\n    if (this.dateAdapter.compareDate(activeDate, start) < 0) {\n      return { start: activeDate, end: start };\n    }\n    return { start, end: activeDate };\n  }\n\n  isSelected(date: D, currentSelection: DateRange<D> | null): boolean {\n    if (!currentSelection) return false;\n    const { start, end } = currentSelection;\n    if (start && this.dateAdapter.isSameDay(date, start)) return true;\n    if (end && this.dateAdapter.isSameDay(date, end)) return true;\n    return false;\n  }\n\n  isRangeStart(date: D, currentSelection: DateRange<D> | null): boolean {\n    if (!currentSelection?.start) return false;\n    return this.dateAdapter.isSameDay(date, currentSelection.start);\n  }\n\n  isRangeEnd(date: D, currentSelection: DateRange<D> | null): boolean {\n    if (!currentSelection?.end) return false;\n    return this.dateAdapter.isSameDay(date, currentSelection.end);\n  }\n\n  isRangeMiddle(date: D, currentSelection: DateRange<D> | null): boolean {\n    if (!currentSelection?.start || !currentSelection?.end) return false;\n    return (\n      this.dateAdapter.isDateInRange(date, currentSelection.start, currentSelection.end) &&\n      !this.isRangeStart(date, currentSelection) &&\n      !this.isRangeEnd(date, currentSelection)\n    );\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport type { DateRange } from '../calendar.types';\nimport { DateAdapter, DATE_ADAPTER } from '../date-adapter';\nimport { CalendarSelectionStrategy, type SelectionResult } from './selection-strategy';\n\n/**\n * Selection strategy for multiple date selection.\n *\n * Behavior:\n * - Click date → toggles it in/out of selection array\n * - Each click is complete (emits immediately)\n * - No preview range\n * - Output: D[]\n *\n * @example\n * ```typescript\n * @Component({\n *   providers: [\n *     { provide: CALENDAR_SELECTION_STRATEGY, useClass: MultiSelectionStrategy }\n *   ],\n *   template: `<com-calendar (selectedChange)=\"onMultiSelect($event)\" />`\n * })\n * export class MultiPickerComponent {\n *   selectedDates = signal<Date[]>([]);\n *\n *   onMultiSelect(dates: Date[]) {\n *     this.selectedDates.set(dates);\n *   }\n * }\n * ```\n */\n@Injectable()\nexport class MultiSelectionStrategy<D> extends CalendarSelectionStrategy<D, D[]> {\n  private readonly dateAdapter: DateAdapter<D> = inject(DATE_ADAPTER) as DateAdapter<D>;\n\n  select(date: D, currentSelection: D[]): SelectionResult<D, D[]> {\n    const existing = currentSelection ?? [];\n    const index = existing.findIndex(d => this.dateAdapter.isSameDay(d, date));\n\n    let newSelection: D[];\n    if (index >= 0) {\n      // Date exists, remove it\n      newSelection = [...existing.slice(0, index), ...existing.slice(index + 1)];\n    } else {\n      // Date doesn't exist, add it\n      newSelection = [...existing, date];\n    }\n\n    return {\n      selection: newSelection,\n      isComplete: true, // Each toggle is a complete action\n    };\n  }\n\n  createPreview(_activeDate: D | null, _currentSelection: D[]): DateRange<D> | null {\n    // Multi-selection has no range preview\n    return null;\n  }\n\n  isSelected(date: D, currentSelection: D[]): boolean {\n    const selection = currentSelection ?? [];\n    return selection.some(d => this.dateAdapter.isSameDay(d, date));\n  }\n\n  isRangeStart(_date: D, _currentSelection: D[]): boolean {\n    // No ranges in multi-selection\n    return false;\n  }\n\n  isRangeEnd(_date: D, _currentSelection: D[]): boolean {\n    return false;\n  }\n\n  isRangeMiddle(_date: D, _currentSelection: D[]): boolean {\n    return false;\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport type { DateRange } from '../calendar.types';\nimport { DateAdapter, DATE_ADAPTER } from '../date-adapter';\nimport { CalendarSelectionStrategy, type SelectionResult } from './selection-strategy';\n\n/**\n * Selection strategy for week selection.\n *\n * Behavior:\n * - Click any day → selects the entire week containing that day\n * - Week starts based on DateAdapter.getFirstDayOfWeek()\n * - Single click completes selection\n * - Output: DateRange<D> (Monday–Sunday or Sunday–Saturday)\n *\n * @example\n * ```typescript\n * @Component({\n *   providers: [\n *     { provide: CALENDAR_SELECTION_STRATEGY, useClass: WeekSelectionStrategy }\n *   ],\n *   template: `<com-calendar (selectedChange)=\"onWeekSelect($event)\" />`\n * })\n * export class WeekPickerComponent {\n *   onWeekSelect(week: DateRange<Date>) {\n *     console.log('Week:', week.start, 'to', week.end);\n *   }\n * }\n * ```\n */\n@Injectable()\nexport class WeekSelectionStrategy<D> extends CalendarSelectionStrategy<D, DateRange<D> | null> {\n  private readonly dateAdapter: DateAdapter<D> = inject(DATE_ADAPTER) as DateAdapter<D>;\n\n  select(date: D, _currentSelection: DateRange<D> | null): SelectionResult<D, DateRange<D> | null> {\n    const weekRange = this.getWeekRange(date);\n    return {\n      selection: weekRange,\n      isComplete: true,\n    };\n  }\n\n  createPreview(activeDate: D | null, _currentSelection: DateRange<D> | null): DateRange<D> | null {\n    if (!activeDate) return null;\n    return this.getWeekRange(activeDate);\n  }\n\n  isSelected(date: D, currentSelection: DateRange<D> | null): boolean {\n    if (!currentSelection?.start || !currentSelection?.end) return false;\n    return this.dateAdapter.isDateInRange(date, currentSelection.start, currentSelection.end);\n  }\n\n  isRangeStart(date: D, currentSelection: DateRange<D> | null): boolean {\n    if (!currentSelection?.start) return false;\n    return this.dateAdapter.isSameDay(date, currentSelection.start);\n  }\n\n  isRangeEnd(date: D, currentSelection: DateRange<D> | null): boolean {\n    if (!currentSelection?.end) return false;\n    return this.dateAdapter.isSameDay(date, currentSelection.end);\n  }\n\n  isRangeMiddle(date: D, currentSelection: DateRange<D> | null): boolean {\n    if (!currentSelection?.start || !currentSelection?.end) return false;\n    return (\n      this.isSelected(date, currentSelection) &&\n      !this.isRangeStart(date, currentSelection) &&\n      !this.isRangeEnd(date, currentSelection)\n    );\n  }\n\n  /** Compute the week range for a given date */\n  private getWeekRange(date: D): DateRange<D> {\n    const dayOfWeek = this.dateAdapter.getDayOfWeek(date);\n    const firstDayOfWeek = this.dateAdapter.getFirstDayOfWeek();\n\n    // Calculate days to subtract to get to week start\n    const daysToSubtract = (dayOfWeek - firstDayOfWeek + 7) % 7;\n    const weekStart = this.dateAdapter.addDays(date, -daysToSubtract);\n    const weekEnd = this.dateAdapter.addDays(weekStart, 6);\n\n    return { start: weekStart, end: weekEnd };\n  }\n}\n","/**\n * Selection strategies for calendar component.\n * Provides pluggable selection behaviors: single, range, multiple, and week selection.\n */\n\nexport {\n  CalendarSelectionStrategy,\n  CALENDAR_SELECTION_STRATEGY,\n  type SelectionResult,\n} from './selection-strategy';\n\nexport { SingleSelectionStrategy } from './single-selection-strategy';\nexport { RangeSelectionStrategy } from './range-selection-strategy';\nexport { MultiSelectionStrategy } from './multi-selection-strategy';\nexport { WeekSelectionStrategy } from './week-selection-strategy';\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  inject,\n  input,\n  linkedSignal,\n  output,\n  signal,\n  viewChildren,\n  type InputSignal,\n  type OutputEmitterRef,\n  type Signal,\n  type TemplateRef,\n  type WritableSignal,\n} from '@angular/core';\nimport { ComCalendarHeader } from './calendar-header';\nimport { calendarVariants, monthsContainerVariants } from './calendar.variants';\nimport type {\n  CalendarCell,\n  CalendarView,\n  DateFilterFn,\n  DateClassFn,\n  DateRange,\n} from './calendar.types';\nimport { YEARS_PER_PAGE } from './calendar.types';\nimport { DateAdapter, DATE_ADAPTER } from './date-adapter';\nimport {\n  ComCalendarMonthView,\n  ComCalendarYearView,\n  ComCalendarMultiYearView,\n} from './views';\nimport { getMultiYearStartingYear, isMonthDisabled, isYearDisabled } from './calendar.utils';\nimport {\n  CalendarSelectionStrategy,\n  CALENDAR_SELECTION_STRATEGY,\n  RangeSelectionStrategy,\n} from './selection';\n\n/**\n * Main calendar orchestrator component.\n * Composes the calendar header and view components (month, year, multi-year)\n * with view switching, navigation, and enhanced accessibility.\n *\n * @tokens `--color-background`, `--color-foreground`, `--color-border-subtle`,\n *         `--color-ring`, `--color-muted`, `--color-muted-foreground`,\n *         `--color-primary`, `--color-primary-foreground`, `--color-primary-hover`,\n *         `--color-primary-subtle`, `--color-primary-subtle-foreground`,\n *         `--color-disabled-foreground`\n *\n * @example\n * ```html\n * <com-calendar\n *   [activeDate]=\"activeDate\"\n *   [selected]=\"selectedDate\"\n *   [minDate]=\"minDate\"\n *   [maxDate]=\"maxDate\"\n *   (selectedChange)=\"onDateSelected($event)\"\n *   (viewChanged)=\"onViewChanged($event)\"\n * />\n * ```\n */\n@Component({\n  selector: 'com-calendar',\n  template: `\n    <div\n      [class]=\"calendarClasses()\"\n      role=\"application\"\n      aria-label=\"Calendar\"\n    >\n      <com-calendar-header\n        [periodLabel]=\"periodLabel()\"\n        [periodAriaLabel]=\"periodAriaLabel()\"\n        [prevAriaLabel]=\"prevAriaLabel()\"\n        [nextAriaLabel]=\"nextAriaLabel()\"\n        [prevDisabled]=\"prevDisabled()\"\n        [nextDisabled]=\"nextDisabled()\"\n        [canSwitchView]=\"currentView() !== 'multi-year'\"\n        (prevClicked)=\"onPrevClicked()\"\n        (nextClicked)=\"onNextClicked()\"\n        (periodClicked)=\"onPeriodClicked()\"\n      />\n\n      <!-- Live region for screen reader announcements -->\n      <div\n        class=\"sr-only\"\n        aria-live=\"polite\"\n        aria-atomic=\"true\"\n      >\n        {{ liveAnnouncement() }}\n      </div>\n\n      @switch (currentView()) {\n        @case ('month') {\n          <div [class]=\"monthsContainerClasses()\">\n            <com-calendar-month-view\n              [activeDate]=\"internalActiveDate()\"\n              [selected]=\"selected()\"\n              [minDate]=\"minDate()\"\n              [maxDate]=\"maxDate()\"\n              [dateFilter]=\"dateFilter()\"\n              [dateClass]=\"dateClass()\"\n              [cellTemplate]=\"cellTemplate()\"\n              [firstDayOfWeek]=\"computedFirstDayOfWeek()\"\n              [previewStart]=\"previewRange()?.start ?? null\"\n              [previewEnd]=\"previewRange()?.end ?? null\"\n              [gridIndex]=\"0\"\n              (selectedChange)=\"onDateSelected($event)\"\n              (activeDateChange)=\"onActiveDateChange($event, 0)\"\n              (previewChange)=\"onPreviewChange($event)\"\n            />\n\n            @if (effectiveMonthColumns() >= 2 && secondaryActiveDate()) {\n              <com-calendar-month-view\n                [activeDate]=\"secondaryActiveDate()!\"\n                [selected]=\"selected()\"\n                [minDate]=\"minDate()\"\n                [maxDate]=\"maxDate()\"\n                [dateFilter]=\"dateFilter()\"\n                [dateClass]=\"dateClass()\"\n                [cellTemplate]=\"cellTemplate()\"\n                [firstDayOfWeek]=\"computedFirstDayOfWeek()\"\n                [previewStart]=\"previewRange()?.start ?? null\"\n                [previewEnd]=\"previewRange()?.end ?? null\"\n                [gridIndex]=\"1\"\n                (selectedChange)=\"onDateSelected($event)\"\n                (activeDateChange)=\"onActiveDateChange($event, 1)\"\n                (previewChange)=\"onPreviewChange($event)\"\n              />\n            }\n          </div>\n        }\n        @case ('year') {\n          <com-calendar-year-view\n            [activeDate]=\"internalActiveDate()\"\n            [selected]=\"selected()\"\n            [minDate]=\"minDate()\"\n            [maxDate]=\"maxDate()\"\n            [dateClass]=\"dateClass()\"\n            [cellTemplate]=\"cellTemplate()\"\n            [previewStart]=\"previewRange()?.start ?? null\"\n            [previewEnd]=\"previewRange()?.end ?? null\"\n            (selectedChange)=\"onMonthSelected($event)\"\n            (activeDateChange)=\"onActiveDateChange($event)\"\n            (previewChange)=\"onPreviewChange($event)\"\n          />\n        }\n        @case ('multi-year') {\n          <com-calendar-multi-year-view\n            [activeDate]=\"internalActiveDate()\"\n            [selected]=\"selected()\"\n            [minDate]=\"minDate()\"\n            [maxDate]=\"maxDate()\"\n            [dateClass]=\"dateClass()\"\n            [cellTemplate]=\"cellTemplate()\"\n            [previewStart]=\"previewRange()?.start ?? null\"\n            [previewEnd]=\"previewRange()?.end ?? null\"\n            (selectedChange)=\"onYearSelected($event)\"\n            (activeDateChange)=\"onActiveDateChange($event)\"\n            (previewChange)=\"onPreviewChange($event)\"\n          />\n        }\n      }\n    </div>\n  `,\n  styles: `\n    .sr-only {\n      position: absolute;\n      width: 1px;\n      height: 1px;\n      padding: 0;\n      margin: -1px;\n      overflow: hidden;\n      clip: rect(0, 0, 0, 0);\n      white-space: nowrap;\n      border: 0;\n    }\n  `,\n  imports: [\n    ComCalendarHeader,\n    ComCalendarMonthView,\n    ComCalendarYearView,\n    ComCalendarMultiYearView,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    class: 'com-calendar-host block',\n  },\n})\nexport class ComCalendar<D> {\n  /** Date adapter for date operations */\n  private readonly dateAdapter: DateAdapter<D> = inject(DATE_ADAPTER) as DateAdapter<D>;\n\n  /** Optional selection strategy for custom selection behaviors */\n  private readonly selectionStrategy = inject(CALENDAR_SELECTION_STRATEGY, {\n    optional: true,\n  }) as CalendarSelectionStrategy<D, unknown> | null;\n\n  /** Query for month views for cross-grid focus management */\n  private readonly monthViews: Signal<readonly ComCalendarMonthView<D>[]> = viewChildren<ComCalendarMonthView<D>>(ComCalendarMonthView);\n\n  /** The date to display and navigate from */\n  readonly activeDate: InputSignal<D | undefined> = input<D>();\n\n  /** The currently selected date, date range, or array of dates (multi-selection) */\n  readonly selected: InputSignal<D | D[] | DateRange<D> | null> = input<D | D[] | DateRange<D> | null>(null);\n\n  /** Minimum selectable date */\n  readonly minDate: InputSignal<D | null> = input<D | null>(null);\n\n  /** Maximum selectable date */\n  readonly maxDate: InputSignal<D | null> = input<D | null>(null);\n\n  /** Custom filter function to disable specific dates */\n  readonly dateFilter: InputSignal<DateFilterFn<D> | null> = input<DateFilterFn<D> | null>(null);\n\n  /** Custom function to add CSS classes to dates */\n  readonly dateClass: InputSignal<DateClassFn<D> | null> = input<DateClassFn<D> | null>(null);\n\n  /** Whether to show the card border and shadow. Set to false when used inside datepicker panel. */\n  readonly bordered: InputSignal<boolean> = input<boolean>(true);\n\n  /** Initial view to display */\n  readonly startView: InputSignal<CalendarView> = input<CalendarView>('month');\n\n  /** Override first day of week (0=Sun, 1=Mon, ..., 6=Sat). Uses locale default if null. */\n  readonly firstDayOfWeek: InputSignal<number | null> = input<number | null>(null);\n\n  /** Number of months to display side-by-side (1 or 2). Defaults to 2 when RangeSelectionStrategy is used. */\n  readonly monthColumns: InputSignal<number> = input<number>(1);\n\n  /** Computed first day of week (input override or adapter default) */\n  readonly computedFirstDayOfWeek: Signal<number> = computed(() => {\n    const override = this.firstDayOfWeek();\n    if (override !== null && override >= 0 && override <= 6) {\n      return override;\n    }\n    return this.dateAdapter.getFirstDayOfWeek();\n  });\n\n  /** Effective number of month columns (auto-defaults to 2 for RangeSelectionStrategy) */\n  readonly effectiveMonthColumns: Signal<number> = computed(() => {\n    const explicit = this.monthColumns();\n    if (explicit !== 1) return explicit; // User override\n\n    // Auto-default to 2 when RangeSelectionStrategy is injected\n    if (this.selectionStrategy instanceof RangeSelectionStrategy) return 2;\n    return 1;\n  });\n\n  /** Secondary active date for dual-month display (+1 month from primary) */\n  readonly secondaryActiveDate: Signal<D | null> = computed(() => {\n    if (this.effectiveMonthColumns() < 2) return null;\n    return this.dateAdapter.addMonths(this.internalActiveDate(), 1);\n  });\n\n  /** Custom template for cell content */\n  readonly cellTemplate: InputSignal<TemplateRef<{ $implicit: CalendarCell<D> }> | null> = input<\n    TemplateRef<{ $implicit: CalendarCell<D> }> | null\n  >(null);\n\n  /** Emitted when a date is selected */\n  readonly selectedChange: OutputEmitterRef<D> = output<D>();\n\n  /** Emitted when the view changes */\n  readonly viewChanged: OutputEmitterRef<CalendarView> = output<CalendarView>();\n\n  /** Emitted when the active date changes */\n  readonly activeDateChange: OutputEmitterRef<D> = output<D>();\n\n  /** Current view state (synced from startView input, writable for view switching) */\n  readonly currentView: WritableSignal<CalendarView> = linkedSignal(() => this.startView());\n\n  /** Internal active date (synced from activeDate input, writable for navigation) */\n  readonly internalActiveDate: WritableSignal<D> = linkedSignal(() =>\n    this.activeDate() ?? this.dateAdapter.today()\n  );\n\n  /** Live announcement for screen readers */\n  readonly liveAnnouncement: WritableSignal<string> = signal<string>('');\n\n  /** Internal selection state managed by strategy (synced from selected input) */\n  readonly internalSelection: WritableSignal<unknown> = linkedSignal(() => this.selected());\n\n  /** Currently hovered/previewed date */\n  readonly previewDate: WritableSignal<D | null> = signal<D | null>(null);\n\n  /** Computed preview range from strategy */\n  readonly previewRange: Signal<DateRange<D> | null> = computed(() => {\n    if (!this.selectionStrategy) return null;\n    return this.selectionStrategy.createPreview(\n      this.previewDate(),\n      this.internalSelection()\n    );\n  });\n\n  /** Calendar container classes */\n  readonly calendarClasses: Signal<string> = computed(() =>\n    calendarVariants({ bordered: this.bordered() })\n  );\n\n  /** Months container classes for single/dual-month layout */\n  readonly monthsContainerClasses: Signal<string> = computed(() =>\n    monthsContainerVariants({ columns: this.effectiveMonthColumns() as 1 | 2 })\n  );\n\n  /** Month names for formatting */\n  private readonly monthNames: Signal<string[]> = computed(() =>\n    this.dateAdapter.getMonthNames('long')\n  );\n\n  /** Period label for the header (e.g., \"January 2024\", \"January – February 2024\", \"2024\", \"2000 – 2023\") */\n  readonly periodLabel: Signal<string> = computed(() => {\n    const date = this.internalActiveDate();\n    const view = this.currentView();\n    const year = this.dateAdapter.getYear(date);\n    const month = this.dateAdapter.getMonth(date);\n\n    switch (view) {\n      case 'month': {\n        const monthName = this.monthNames()[month];\n\n        // Multi-month: \"January – February 2026\" or \"December 2025 – January 2026\"\n        if (this.effectiveMonthColumns() >= 2) {\n          const secondDate = this.secondaryActiveDate()!;\n          const secondMonth = this.dateAdapter.getMonth(secondDate);\n          const secondYear = this.dateAdapter.getYear(secondDate);\n          const secondMonthName = this.monthNames()[secondMonth];\n\n          if (year === secondYear) {\n            return `${monthName} – ${secondMonthName} ${year}`;\n          }\n          return `${monthName} ${year} – ${secondMonthName} ${secondYear}`;\n        }\n        return `${monthName} ${year}`;\n      }\n      case 'year':\n        return `${year}`;\n      case 'multi-year': {\n        const startYear = getMultiYearStartingYear(year, YEARS_PER_PAGE);\n        const endYear = startYear + YEARS_PER_PAGE - 1;\n        return `${startYear} – ${endYear}`;\n      }\n    }\n  });\n\n  /** Accessible label for the period button */\n  readonly periodAriaLabel: Signal<string> = computed(() => {\n    const view = this.currentView();\n    const label = this.periodLabel();\n\n    switch (view) {\n      case 'month':\n        return `${label}, click to switch to year view`;\n      case 'year':\n        return `${label}, click to switch to multi-year view`;\n      case 'multi-year':\n        return label;\n    }\n  });\n\n  /** Accessible label for the previous button */\n  readonly prevAriaLabel: Signal<string> = computed(() => {\n    const view = this.currentView();\n    switch (view) {\n      case 'month':\n        return 'Previous month';\n      case 'year':\n        return 'Previous year';\n      case 'multi-year':\n        return `Previous ${YEARS_PER_PAGE} years`;\n    }\n  });\n\n  /** Accessible label for the next button */\n  readonly nextAriaLabel: Signal<string> = computed(() => {\n    const view = this.currentView();\n    switch (view) {\n      case 'month':\n        return 'Next month';\n      case 'year':\n        return 'Next year';\n      case 'multi-year':\n        return `Next ${YEARS_PER_PAGE} years`;\n    }\n  });\n\n  /** Whether the previous button is disabled */\n  readonly prevDisabled: Signal<boolean> = computed(() => {\n    const date = this.internalActiveDate();\n    const minDate = this.minDate();\n    if (!minDate) return false;\n\n    const view = this.currentView();\n    const year = this.dateAdapter.getYear(date);\n    const month = this.dateAdapter.getMonth(date);\n\n    switch (view) {\n      case 'month': {\n        // Disabled if previous month is entirely before min\n        const prevMonth = month === 0 ? 11 : month - 1;\n        const prevYear = month === 0 ? year - 1 : year;\n        return isMonthDisabled(prevYear, prevMonth, minDate, null, this.dateAdapter);\n      }\n      case 'year': {\n        // Disabled if previous year is entirely before min\n        return isYearDisabled(year - 1, minDate, null, this.dateAdapter);\n      }\n      case 'multi-year': {\n        // Disabled if previous page's last year is before min\n        const startYear = getMultiYearStartingYear(year, YEARS_PER_PAGE);\n        const prevPageLastYear = startYear - 1;\n        return isYearDisabled(prevPageLastYear, minDate, null, this.dateAdapter);\n      }\n    }\n  });\n\n  /** Whether the next button is disabled */\n  readonly nextDisabled: Signal<boolean> = computed(() => {\n    const date = this.internalActiveDate();\n    const maxDate = this.maxDate();\n    if (!maxDate) return false;\n\n    const view = this.currentView();\n    const year = this.dateAdapter.getYear(date);\n    const month = this.dateAdapter.getMonth(date);\n\n    switch (view) {\n      case 'month': {\n        // Disabled if next month is entirely after max\n        const nextMonth = month === 11 ? 0 : month + 1;\n        const nextYear = month === 11 ? year + 1 : year;\n        return isMonthDisabled(nextYear, nextMonth, null, maxDate, this.dateAdapter);\n      }\n      case 'year': {\n        // Disabled if next year is entirely after max\n        return isYearDisabled(year + 1, null, maxDate, this.dateAdapter);\n      }\n      case 'multi-year': {\n        // Disabled if next page's first year is after max\n        const startYear = getMultiYearStartingYear(year, YEARS_PER_PAGE);\n        const nextPageFirstYear = startYear + YEARS_PER_PAGE;\n        return isYearDisabled(nextPageFirstYear, null, maxDate, this.dateAdapter);\n      }\n    }\n  });\n\n  /**\n   * Handles previous button click.\n   * Navigates to the previous period based on current view.\n   */\n  onPrevClicked(): void {\n    const view = this.currentView();\n    const date = this.internalActiveDate();\n    let newDate: D;\n\n    switch (view) {\n      case 'month':\n        newDate = this.dateAdapter.addMonths(date, -1);\n        break;\n      case 'year':\n        newDate = this.dateAdapter.addYears(date, -1);\n        break;\n      case 'multi-year':\n        newDate = this.dateAdapter.addYears(date, -YEARS_PER_PAGE);\n        break;\n    }\n\n    this.internalActiveDate.set(newDate);\n    this.activeDateChange.emit(newDate);\n    this.announceNavigation('previous');\n  }\n\n  /**\n   * Handles next button click.\n   * Navigates to the next period based on current view.\n   */\n  onNextClicked(): void {\n    const view = this.currentView();\n    const date = this.internalActiveDate();\n    let newDate: D;\n\n    switch (view) {\n      case 'month':\n        newDate = this.dateAdapter.addMonths(date, 1);\n        break;\n      case 'year':\n        newDate = this.dateAdapter.addYears(date, 1);\n        break;\n      case 'multi-year':\n        newDate = this.dateAdapter.addYears(date, YEARS_PER_PAGE);\n        break;\n    }\n\n    this.internalActiveDate.set(newDate);\n    this.activeDateChange.emit(newDate);\n    this.announceNavigation('next');\n  }\n\n  /**\n   * Handles period label click.\n   * Switches to the next higher view (month → year → multi-year).\n   */\n  onPeriodClicked(): void {\n    const current = this.currentView();\n    if (current === 'month') {\n      this.currentView.set('year');\n    } else if (current === 'year') {\n      this.currentView.set('multi-year');\n    }\n    // multi-year cannot switch further up\n    this.viewChanged.emit(this.currentView());\n    this.announceViewChange();\n  }\n\n  /**\n   * Handles date selection from month view.\n   * Uses selection strategy if available, otherwise emits directly.\n   */\n  onDateSelected(date: D): void {\n    if (this.selectionStrategy) {\n      const result = this.selectionStrategy.select(date, this.internalSelection());\n      this.internalSelection.set(result.selection);\n\n      if (result.isComplete) {\n        // Cast to D for the output - the strategy determines the actual type\n        this.selectedChange.emit(result.selection as D);\n      }\n    } else {\n      // Fallback: default single selection behavior\n      this.selectedChange.emit(date);\n    }\n  }\n\n  /**\n   * Handles preview change from views (mouse hover).\n   * Updates the preview date for strategy to compute preview range.\n   */\n  onPreviewChange(date: D | null): void {\n    this.previewDate.set(date);\n  }\n\n  /**\n   * Handles month selection from year view.\n   * Drills down to month view with the selected month.\n   */\n  onMonthSelected(date: D): void {\n    this.internalActiveDate.set(date);\n    this.currentView.set('month');\n    this.viewChanged.emit('month');\n    this.activeDateChange.emit(date);\n    this.announceViewChange();\n  }\n\n  /**\n   * Handles year selection from multi-year view.\n   * Drills down to year view with the selected year.\n   */\n  onYearSelected(date: D): void {\n    this.internalActiveDate.set(date);\n    this.currentView.set('year');\n    this.viewChanged.emit('year');\n    this.activeDateChange.emit(date);\n    this.announceViewChange();\n  }\n\n  /**\n   * Handles active date change from child views (keyboard navigation).\n   * In dual-month mode, handles cross-grid focus transitions.\n   */\n  onActiveDateChange(date: D, gridIndex?: number): void {\n    const views = this.monthViews();\n\n    // In dual-month mode, check if we should focus the other grid\n    if (this.effectiveMonthColumns() >= 2 && views.length === 2 && gridIndex !== undefined) {\n      const primaryMonth = this.dateAdapter.getMonth(this.internalActiveDate());\n      const secondaryMonth = this.dateAdapter.getMonth(this.secondaryActiveDate()!);\n      const targetMonth = this.dateAdapter.getMonth(date);\n\n      // Determine which grid the target date belongs to\n      if (gridIndex === 0 && targetMonth === secondaryMonth) {\n        // Navigated from left grid into right grid - focus right grid\n        const rightView = views[1];\n        if (rightView) {\n          const compareValue = this.computeCompareValue(date);\n          rightView.focusCell(compareValue);\n          return;\n        }\n      }\n      if (gridIndex === 1 && targetMonth === primaryMonth) {\n        // Navigated from right grid into left grid - focus left grid\n        const leftView = views[0];\n        if (leftView) {\n          const compareValue = this.computeCompareValue(date);\n          leftView.focusCell(compareValue);\n          return;\n        }\n      }\n    }\n\n    // Default: update active date and let normal navigation occur\n    this.internalActiveDate.set(date);\n    this.activeDateChange.emit(date);\n  }\n\n  /**\n   * Computes a unique compare value from a date for focus management.\n   */\n  private computeCompareValue(date: D): number {\n    const year = this.dateAdapter.getYear(date);\n    const month = this.dateAdapter.getMonth(date);\n    const day = this.dateAdapter.getDate(date);\n    return year * 10000 + month * 100 + day;\n  }\n\n  /**\n   * Announces a view change to screen readers.\n   */\n  private announceViewChange(): void {\n    const view = this.currentView();\n    const label = this.periodLabel();\n    const viewLabel = view === 'multi-year' ? 'multi-year' : view;\n    this.liveAnnouncement.set(`${viewLabel} view, ${label}`);\n  }\n\n  /**\n   * Announces navigation to screen readers.\n   */\n  private announceNavigation(direction: 'previous' | 'next'): void {\n    this.liveAnnouncement.set(`Navigated to ${direction} ${this.periodLabel()}`);\n  }\n}\n","import type { Provider } from '@angular/core';\nimport { DATE_ADAPTER, NativeDateAdapter } from './date-adapter';\nimport { CALENDAR_SELECTION_STRATEGY } from './selection/selection-strategy';\nimport { SingleSelectionStrategy } from './selection/single-selection-strategy';\nimport { RangeSelectionStrategy } from './selection/range-selection-strategy';\nimport { MultiSelectionStrategy } from './selection/multi-selection-strategy';\nimport { WeekSelectionStrategy } from './selection/week-selection-strategy';\n\n/**\n * Provides the native JavaScript Date adapter for the calendar.\n * This is required for the calendar component to work with native Date objects.\n *\n * @example\n * ```typescript\n * @Component({\n *   providers: [provideNativeDateAdapter()],\n * })\n * export class MyComponent {}\n * ```\n */\nexport function provideNativeDateAdapter(): Provider {\n  return { provide: DATE_ADAPTER, useClass: NativeDateAdapter };\n}\n\n/**\n * Provides the single selection strategy (default behavior).\n * Allows selecting one date at a time.\n *\n * @example\n * ```typescript\n * @Component({\n *   providers: [\n *     provideNativeDateAdapter(),\n *     provideSingleSelectionStrategy(),\n *   ],\n * })\n * export class MyComponent {}\n * ```\n */\nexport function provideSingleSelectionStrategy(): Provider {\n  return { provide: CALENDAR_SELECTION_STRATEGY, useClass: SingleSelectionStrategy };\n}\n\n/**\n * Provides the range selection strategy.\n * Allows selecting a start and end date to create a date range.\n *\n * @example\n * ```typescript\n * @Component({\n *   providers: [\n *     provideNativeDateAdapter(),\n *     provideRangeSelectionStrategy(),\n *   ],\n * })\n * export class MyComponent {\n *   range = signal<DateRange<Date> | null>(null);\n * }\n * ```\n */\nexport function provideRangeSelectionStrategy(): Provider {\n  return { provide: CALENDAR_SELECTION_STRATEGY, useClass: RangeSelectionStrategy };\n}\n\n/**\n * Provides the multi selection strategy.\n * Allows selecting multiple individual dates.\n *\n * @example\n * ```typescript\n * @Component({\n *   providers: [\n *     provideNativeDateAdapter(),\n *     provideMultiSelectionStrategy(),\n *   ],\n * })\n * export class MyComponent {\n *   dates = signal<Date[]>([]);\n * }\n * ```\n */\nexport function provideMultiSelectionStrategy(): Provider {\n  return { provide: CALENDAR_SELECTION_STRATEGY, useClass: MultiSelectionStrategy };\n}\n\n/**\n * Provides the week selection strategy.\n * Allows selecting entire weeks at a time.\n *\n * @example\n * ```typescript\n * @Component({\n *   providers: [\n *     provideNativeDateAdapter(),\n *     provideWeekSelectionStrategy(),\n *   ],\n * })\n * export class MyComponent {\n *   range = signal<DateRange<Date> | null>(null);\n * }\n * ```\n */\nexport function provideWeekSelectionStrategy(): Provider {\n  return { provide: CALENDAR_SELECTION_STRATEGY, useClass: WeekSelectionStrategy };\n}\n","/**\n * ngx-com/components/calendar\n * Calendar component public API\n */\n\n// Types\nexport type {\n  DateRange,\n  CalendarView,\n  CalendarCellState,\n  CalendarCell,\n  CalendarCellConfig,\n  NameStyle,\n  DateFilterFn,\n  DateClassFn,\n} from './calendar.types';\n\nexport {\n  createDateRange,\n  createCalendarCell,\n  DAYS_PER_WEEK,\n  WEEKS_PER_MONTH,\n  YEARS_PER_PAGE,\n  YEARS_PER_ROW,\n  MONTHS_PER_ROW,\n} from './calendar.types';\n\n// Date Adapter\nexport { DateAdapter, DATE_ADAPTER, NativeDateAdapter } from './date-adapter';\n\n// Variants\nexport { calendarCellVariants, calendarCellWrapperVariants } from './calendar-cell.variants';\nexport type { CalendarCellVariants, CalendarCellWrapperVariants } from './calendar-cell.variants';\n\nexport { calendarHeaderVariants, calendarHeaderButtonVariants } from './calendar-header.variants';\nexport type { CalendarHeaderVariants, CalendarHeaderButtonVariants } from './calendar-header.variants';\n\nexport { calendarVariants } from './calendar.variants';\nexport type { CalendarVariants } from './calendar.variants';\n\n// Utilities\nexport {\n  createGrid,\n  navigateGrid,\n  getWeekdayHeaders,\n  isDateDisabled,\n  isMonthDisabled,\n  isYearDisabled,\n  getMultiYearStartingYear,\n} from './calendar.utils';\nexport type { WeekdayHeader } from './calendar.utils';\n\n// Components\nexport { ComCalendarCell } from './calendar-cell';\nexport type { CalendarCellKeyNavEvent } from './calendar-cell';\n\n// Header Component\nexport { ComCalendarHeader } from './calendar-header';\n\n// Calendar Orchestrator\nexport { ComCalendar } from './calendar';\n\n// View Components\nexport {\n  CalendarViewBase,\n  ComCalendarMonthView,\n  ComCalendarYearView,\n  ComCalendarMultiYearView,\n} from './views';\n\n// Selection Strategies\nexport {\n  CalendarSelectionStrategy,\n  CALENDAR_SELECTION_STRATEGY,\n  SingleSelectionStrategy,\n  RangeSelectionStrategy,\n  MultiSelectionStrategy,\n  WeekSelectionStrategy,\n} from './selection';\nexport type { SelectionResult } from './selection';\n\n// Provider Functions\nexport {\n  provideNativeDateAdapter,\n  provideSingleSelectionStrategy,\n  provideRangeSelectionStrategy,\n  provideMultiSelectionStrategy,\n  provideWeekSelectionStrategy,\n} from './providers';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}