{"version":3,"file":"acorex-components-scheduler.mjs","sources":["../../../../packages/components/scheduler/src/lib/scheduler.service.ts","../../../../packages/components/scheduler/src/lib/views/agenda/scheduler-agenda-view.component.ts","../../../../packages/components/scheduler/src/lib/views/agenda/scheduler-agenda-view.component.html","../../../../packages/components/scheduler/src/lib/views/day/scheduler-day-view.component.ts","../../../../packages/components/scheduler/src/lib/views/day/scheduler-day-view.component.html","../../../../packages/components/scheduler/src/lib/views/month/scheduler-month-view.component.ts","../../../../packages/components/scheduler/src/lib/views/month/scheduler-month-view.component.html","../../../../packages/components/scheduler/src/lib/views/timeline-day/scheduler-timeline-day-view.component.ts","../../../../packages/components/scheduler/src/lib/views/timeline-day/scheduler-timeline-day-view.component.html","../../../../packages/components/scheduler/src/lib/views/timeline-month/scheduler-timeline-month-view.component.ts","../../../../packages/components/scheduler/src/lib/views/timeline-month/scheduler-timeline-month-view.component.html","../../../../packages/components/scheduler/src/lib/views/timeline-weekly/scheduler-timeline-weekly-view.component.ts","../../../../packages/components/scheduler/src/lib/views/timeline-weekly/scheduler-timeline-weekly-view.component.html","../../../../packages/components/scheduler/src/lib/views/timeline-year/scheduler-timeline-year-view.component.ts","../../../../packages/components/scheduler/src/lib/views/timeline-year/scheduler-timeline-year-view.component.html","../../../../packages/components/scheduler/src/lib/views/week/scheduler-week-view.component.ts","../../../../packages/components/scheduler/src/lib/views/week/scheduler-week-view.component.html","../../../../packages/components/scheduler/src/lib/scheduler.component.ts","../../../../packages/components/scheduler/src/lib/scheduler.component.html","../../../../packages/components/scheduler/src/lib/scheduler.module.ts","../../../../packages/components/scheduler/src/acorex-components-scheduler.ts"],"sourcesContent":["import { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatService } from '@acorex/core/format';\nimport { AXLocaleService } from '@acorex/core/locale';\nimport { inject, Injectable, signal } from '@angular/core';\nimport { isEqual } from 'lodash-es';\nimport {\n  AXDayOfWeekName,\n  AXSchedulerActiveAppointmentsInBlock,\n  AXSchedulerAppointment,\n  AXSchedulerAppointmentDropResult,\n  AXSchedulerAppointmentSegment,\n  AXSchedulerBlockIdentifier,\n  AXSchedulerResource,\n  AXSchedulerView,\n} from './scheduler.class';\nimport { AXSchedulerAppointmentMouseEvent, AXSchedulerSlotMouseEvent } from './scheduler.component';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class AXSchedulerService {\n  private formatService = inject(AXFormatService);\n  private calendarService = inject(AXCalendarService);\n  private localeService = inject(AXLocaleService);\n\n  readonly HOURS_PER_DAY = 24;\n  readonly MINUTES_PER_HOUR = 60;\n  readonly BLOCK_DURATION_MINUTES = 30;\n  readonly MILLISECONDS_PER_MINUTE = 60 * 1000;\n  readonly MILLISECONDS_PER_DAY = this.HOURS_PER_DAY * this.MINUTES_PER_HOUR * this.MILLISECONDS_PER_MINUTE;\n\n  internalWeekend = signal<number[]>([]);\n  internalHoliday = signal<AXHolidayDate[]>([]);\n\n  /**\n   * Checks if two appointments overlap in time.\n   *\n   * @param appointmentA - First appointment to check.\n   * @param appointmentB - Second appointment to check.\n   * @returns boolean - True if appointments overlap, false otherwise.\n   */\n  doAppointmentsOverlap(appointmentA: AXSchedulerAppointment, appointmentB: AXSchedulerAppointment): boolean {\n    if (!appointmentA?.startDate || !appointmentA.endDate || !appointmentB?.startDate || !appointmentB.endDate) {\n      return false;\n    }\n    const startA = appointmentA.startDate.getTime();\n    const endA = appointmentA.endDate.getTime();\n    const startB = appointmentB.startDate.getTime();\n    const endB = appointmentB.endDate.getTime();\n    // Uses strict overlap check (change < / > to <= / >= if touching boundaries count)\n    return startA < endB && endA > startB;\n  }\n\n  /**\n   * Calculates appointment duration in minutes.\n   *\n   * @param Appointment - The appointment to calculate duration for.\n   * @returns number - Duration in minutes.\n   */\n  calculateDurationInMinutes(Appointment: AXSchedulerAppointment): number {\n    if (!Appointment?.startDate || !Appointment.endDate) return 0;\n    const durationMillis = Appointment.endDate.getTime() - Appointment.startDate.getTime();\n    return Math.max(0, durationMillis / this.MILLISECONDS_PER_MINUTE);\n  }\n\n  /**\n   * Gets the day index and block index for a given date time within the view context.\n   *\n   * @param dateTime - The date time to get block identifier for.\n   * @param viewStartDate - Start date of the view.\n   * @param startHour - Start hour of the view.\n   * @param endHour - End hour of the view (exclusive).\n   * @param viewTotalDays - Total days in the view (default: 1).\n   * @returns AXSchedulerBlockIdentifier | null - Block identifier or null if outside view.\n   */\n  getBlockIdentifier(\n    dateTime: AXDateTime,\n    viewStartDate: AXDateTime,\n    startHour: number,\n    endHour: number, // Exclusive end hour\n    viewTotalDays = 1, // Default to 1 for day view\n  ): AXSchedulerBlockIdentifier | null {\n    if (!viewStartDate || !dateTime || typeof startHour !== 'number' || typeof endHour !== 'number') {\n      return null;\n    }\n    const viewEndDate = viewStartDate.add('day', viewTotalDays); // Calculate exclusive end date\n\n    // Check if dateTime is within the view's date and time range\n    if (\n      dateTime.compare(viewStartDate, 'day') < 0 ||\n      dateTime.compare(viewEndDate, 'day') >= 0 || // Check against exclusive end date\n      dateTime.hour < startHour ||\n      dateTime.hour >= endHour // Check against exclusive end hour\n    ) {\n      return null;\n    }\n\n    // Calculate day index relative to view start\n    const dayIndex = Math.floor((dateTime.date.getTime() - viewStartDate.date.getTime()) / this.MILLISECONDS_PER_DAY);\n\n    // Ensure dayIndex is valid for the view duration\n    if (dayIndex < 0 || dayIndex >= viewTotalDays) {\n      return null;\n    }\n\n    const minutesIntoDay = dateTime.hour * this.MINUTES_PER_HOUR + dateTime.minute;\n    const minutesIntoViewHours = minutesIntoDay - startHour * this.MINUTES_PER_HOUR;\n\n    // This check should be redundant due to initial hour check, but safe to keep\n    if (minutesIntoViewHours < 0) return null;\n\n    const blockIndex = Math.floor(minutesIntoViewHours / this.BLOCK_DURATION_MINUTES);\n\n    return { dayIndex, blockIndex };\n  }\n\n  /**\n   * Groups appointments by the blocks they are ACTIVE in for a given view.\n   *\n   * @param singleDayAppointments - Array of appointment segments.\n   * @param viewStartDate - Start date of the view.\n   * @param startHour - Start hour of the view.\n   * @param endHour - End hour of the view.\n   * @param viewTotalDays - Total days in the view.\n   * @returns AXSchedulerActiveAppointmentsInBlock - Active appointments grouped by blocks.\n   */\n  private calculateActiveAppointmentsInBlock(\n    singleDayAppointments: AXSchedulerAppointmentSegment[],\n    viewStartDate: AXDateTime,\n    startHour: number,\n    endHour: number,\n    viewTotalDays: number, // Now required\n  ): AXSchedulerActiveAppointmentsInBlock {\n    const blocks: AXSchedulerActiveAppointmentsInBlock = {};\n    if (!viewStartDate || typeof startHour !== 'number' || typeof endHour !== 'number' || viewTotalDays <= 0) {\n      return blocks;\n    }\n    const viewEndDate = viewStartDate.add('day', viewTotalDays); // Exclusive end date\n    // Calculate total blocks based on consistent block duration\n    const totalBlocksPerDay = Math.max(\n      0,\n      (endHour - startHour) * (this.MINUTES_PER_HOUR / this.BLOCK_DURATION_MINUTES),\n    );\n\n    singleDayAppointments.forEach((appointment) => {\n      if (!appointment.startDate || !appointment.endDate || !appointment.id) return;\n\n      const appointmentEndDate = this.calendarService.create(appointment.endDate);\n      const appointmentStartDate = this.calendarService.create(appointment.startDate);\n\n      // Clamp appointment start/end times to the view boundaries (days and hours)\n      let effectiveStart = appointmentStartDate.compare(viewStartDate) < 0 ? viewStartDate : appointmentStartDate;\n      if (effectiveStart.hour < startHour) effectiveStart = effectiveStart.set('hour', startHour).startOf('hour');\n\n      let effectiveEnd = appointmentEndDate.compare(viewEndDate) >= 0 ? viewEndDate : appointmentEndDate;\n      if (effectiveEnd.hour >= endHour) {\n        const endDayBase = effectiveEnd.compare(viewEndDate) >= 0 ? viewEndDate.add('day', -1) : effectiveEnd;\n        effectiveEnd = endDayBase.set('hour', endHour).startOf('hour');\n      }\n\n      // Get start block info using the specified viewTotalDays\n      const startInfo = this.getBlockIdentifier(effectiveStart, viewStartDate, startHour, endHour, viewTotalDays);\n      if (!startInfo) return; // Appointment starts completely outside view\n\n      // Get end block info (last block occupied) using the specified viewTotalDays\n      const timeBeforeEnd = effectiveEnd.add('minute', -1);\n      const endInfo = this.getBlockIdentifier(timeBeforeEnd, viewStartDate, startHour, endHour, viewTotalDays);\n      // If endInfo is null, it means the appointment ends before the viewable part starts,\n      // or exactly at the start, so it occupies no blocks. Handle this case.\n      if (\n        !endInfo ||\n        endInfo.dayIndex < startInfo.dayIndex ||\n        (endInfo.dayIndex === startInfo.dayIndex && endInfo.blockIndex < startInfo.blockIndex)\n      ) {\n        return; // Appointment effectively has no duration within the viewable blocks\n      }\n\n      // Iterate through the days and blocks the appointment spans within the view\n      for (let dIdx = startInfo.dayIndex; dIdx <= endInfo.dayIndex; dIdx++) {\n        // Clamp day index just in case (should be handled by getBlockIdentifier checks)\n        if (dIdx < 0 || dIdx >= viewTotalDays) continue;\n\n        const startBlock = dIdx === startInfo.dayIndex ? startInfo.blockIndex : 0;\n        // Make sure endBlock doesn't exceed the calculated totalBlocksPerDay\n        const endBlock = dIdx === endInfo.dayIndex ? endInfo.blockIndex : totalBlocksPerDay - 1;\n\n        if (!blocks[dIdx]) blocks[dIdx] = {};\n\n        for (let bIdx = startBlock; bIdx <= endBlock; bIdx++) {\n          // Final check for block index validity\n          if (bIdx >= 0 && bIdx < totalBlocksPerDay) {\n            if (!blocks[dIdx][bIdx]) blocks[dIdx][bIdx] = [];\n            // Avoid duplicates if the same appointment is processed multiple times (shouldn't happen with outer loop)\n            if (!blocks[dIdx][bIdx].some((e) => e.id === appointment.id)) {\n              blocks[dIdx][bIdx].push(appointment);\n            }\n          }\n        }\n      }\n    });\n    return blocks;\n  }\n\n  /**\n   * Calculates day view concurrency information for appointments.\n   *\n   * @param singleDayAppointments - Array of appointment segments.\n   * @param viewStartDate - Start date of the view.\n   * @param startHour - Start hour of the view.\n   * @param endHour - End hour of the view.\n   * @returns Map<any, { maxConcurrency: number; effectiveTotalColumns: number }> - Concurrency information map.\n   */\n  calculateDayViewConcurrencyInfo(\n    singleDayAppointments: AXSchedulerAppointmentSegment[], // These are segments for the current day\n    viewStartDate: AXDateTime,\n    startHour: number,\n    endHour: number,\n  ): Map<any, { maxConcurrency: number; effectiveTotalColumns: number }> {\n    const resultInfo = new Map<any, { maxConcurrency: number; effectiveTotalColumns: number }>();\n    if (singleDayAppointments.length === 0) return resultInfo;\n\n    const activeAppointmentsMap = this.calculateActiveAppointmentsInBlock(\n      singleDayAppointments,\n      viewStartDate,\n      startHour,\n      endHour,\n      1, // Day view\n    );\n    const blocks = activeAppointmentsMap[0] ?? {};\n\n    // 1. Calculate initial maxConcurrency for each appointment segment\n    const maxConcurrencyMap = new Map<any, number>();\n    singleDayAppointments.forEach((segment) => {\n      let maxOverlapInSegmentBlocks = 0;\n      const segmentStartMinutes = segment.startDate.getHours() * this.MINUTES_PER_HOUR + segment.startDate.getMinutes();\n      const segmentEndMinutes = segment.endDate.getHours() * this.MINUTES_PER_HOUR + segment.endDate.getMinutes();\n\n      // Determine blocks this segment occupies relative to view's startHour\n      const viewRelativeStartMinutes = Math.max(0, segmentStartMinutes - startHour * this.MINUTES_PER_HOUR);\n      const viewRelativeEndMinutes = Math.min(\n        (endHour - startHour) * this.MINUTES_PER_HOUR,\n        segmentEndMinutes - startHour * this.MINUTES_PER_HOUR,\n      );\n\n      const firstBlockIndex = Math.floor(viewRelativeStartMinutes / this.BLOCK_DURATION_MINUTES);\n      const lastBlockIndex = Math.floor((viewRelativeEndMinutes - 1) / this.BLOCK_DURATION_MINUTES); // -1 because end is exclusive for block counting\n\n      for (let blockIdx = firstBlockIndex; blockIdx <= lastBlockIndex; blockIdx++) {\n        const appointmentsInBlock = blocks[blockIdx];\n        if (appointmentsInBlock) {\n          maxOverlapInSegmentBlocks = Math.max(maxOverlapInSegmentBlocks, appointmentsInBlock.length);\n        }\n      }\n      maxConcurrencyMap.set(segment.id, maxOverlapInSegmentBlocks || 1);\n    });\n\n    // 2. Iteratively determine effectiveTotalColumns for groups of overlapping appointments\n    const initialEffectiveTotalColumns = new Map<any, number>();\n    singleDayAppointments.forEach((segment) => {\n      initialEffectiveTotalColumns.set(segment.id, maxConcurrencyMap.get(segment.id) || 1);\n    });\n\n    let changed = true;\n    while (changed) {\n      changed = false;\n      singleDayAppointments.forEach((segmentA) => {\n        singleDayAppointments.forEach((segmentB) => {\n          if (segmentA.id === segmentB.id) return;\n\n          if (this.doAppointmentsOverlap(segmentA, segmentB)) {\n            const etcA = initialEffectiveTotalColumns.get(segmentA.id) || 1;\n            const etcB = initialEffectiveTotalColumns.get(segmentB.id) || 1;\n            const maxETC = Math.max(etcA, etcB);\n\n            if (etcA !== maxETC) {\n              initialEffectiveTotalColumns.set(segmentA.id, maxETC);\n              changed = true;\n            }\n            if (etcB !== maxETC) {\n              initialEffectiveTotalColumns.set(segmentB.id, maxETC);\n              changed = true;\n            }\n          }\n        });\n      });\n    }\n\n    // Populate final result\n    singleDayAppointments.forEach((segment) => {\n      resultInfo.set(segment.id, {\n        maxConcurrency: maxConcurrencyMap.get(segment.id) || 1,\n        effectiveTotalColumns: initialEffectiveTotalColumns.get(segment.id) || 1,\n      });\n    });\n\n    return resultInfo;\n  }\n\n  /**\n   * Groups appointments by day within a date range.\n   *\n   * @param appointments - Array of appointments.\n   * @param viewStartDate - Start date of the view.\n   * @param viewEndDate - End date of the view.\n   * @returns Map<string, AXSchedulerAppointment[]> - Appointments grouped by day.\n   */\n  groupAppointmentsByDay(\n    appointments: AXSchedulerAppointment[],\n    viewStartDate: AXDateTime, // First day visible in the grid\n    viewEndDate: AXDateTime, // Last day visible in the grid\n  ): Map<string, AXSchedulerAppointment[]> {\n    const groupedAppointments = new Map<string, AXSchedulerAppointment[]>();\n    if (!appointments || appointments.length === 0 || !viewStartDate || !viewEndDate) {\n      return groupedAppointments;\n    }\n\n    // Pre-calculate the end date for comparison (exclusive)\n    const exclusiveViewEndDate = viewEndDate.add('day', 1);\n\n    appointments.forEach((appointment) => {\n      if (!appointment.startDate || !appointment.endDate || !appointment.id) return;\n\n      // Determine the effective start and end dates of the appointment clamped by the view range\n      const appointmentStart = this.calendarService.create(appointment.startDate);\n      const appointmentEnd = this.calendarService.create(appointment.endDate);\n\n      // Skip if appointment ends before the view starts or starts after the view ends\n      if (\n        appointmentEnd.compare(viewStartDate, 'day') < 0 ||\n        appointmentStart.compare(exclusiveViewEndDate, 'day') >= 0\n      ) {\n        return;\n      }\n\n      // Clamp start date to the view start date\n      let currentDay =\n        appointmentStart.compare(viewStartDate, 'day') < 0 ? viewStartDate : appointmentStart.startOf('day');\n\n      // Loop through each day the appointment spans within the view range\n      let safeCount = 0; // Prevent infinite loops\n      while (\n        currentDay.compare(appointmentEnd, 'day') <= 0 &&\n        currentDay.compare(exclusiveViewEndDate, 'day') < 0 &&\n        safeCount < 100\n      ) {\n        const dateString = this.formatService.format(currentDay, 'datetime', { format: 'YYYY-MM-DD' }); // Use a consistent key format\n\n        if (!groupedAppointments.has(dateString)) {\n          groupedAppointments.set(dateString, []);\n        }\n        // Add the appointment if it's not already in the list for that day\n        if (!groupedAppointments.get(dateString).some((e) => e.id === appointment.id)) {\n          groupedAppointments.get(dateString).push(appointment);\n        }\n\n        currentDay = currentDay.add('day', 1);\n        safeCount++;\n      }\n      if (safeCount >= 100) {\n        console.warn('Safety break hit in groupAppointmentsByDay loop for appointment:', appointment.id);\n      }\n    });\n\n    return groupedAppointments;\n  }\n\n  /**\n   * Gets the day of week number for a given day name.\n   *\n   * @param dayName - The day name to get number for.\n   * @returns number - Day number (1-7, where 1 is Sunday).\n   */\n  getDayOfWeekNumber(dayName: AXDayOfWeekName): number {\n    switch (dayName) {\n      case 'sunday':\n        return 1;\n      case 'monday':\n        return 2;\n      case 'tuesday':\n        return 3;\n      case 'wednesday':\n        return 4;\n      case 'thursday':\n        return 5;\n      case 'friday':\n        return 6;\n      case 'saturday':\n        return 7;\n      default:\n        console.warn(`Invalid day name: ${dayName}. Defaulting to Sunday (1).`);\n        return 1;\n    }\n  }\n\n  /**\n   * Resolves the 0-based week-start index (0 = Sunday … 6 = Saturday) from locale or an override.\n   */\n  resolveWeekStartsOn(firstDayOfWeek?: AXDayOfWeekName): number {\n    if (firstDayOfWeek) {\n      return this.getDayOfWeekNumber(firstDayOfWeek) - 1;\n    }\n    return this.localeService.activeProfile().calendar.week.startsOn;\n  }\n\n  /**\n   * Aligns a date to the start of its week using locale week layout and calendar weekday indexing.\n   */\n  alignToWeekStart(date: AXDateTime, options?: { firstDayOfWeek?: AXDayOfWeekName }): AXDateTime {\n    const startsOn = this.resolveWeekStartsOn(options?.firstDayOfWeek);\n    const dayIndex = date.weekdayIndex;\n    const daysToSubtract = (dayIndex - startsOn + 7) % 7;\n    return date.startOf('day').add('day', -daysToSubtract);\n  }\n\n  /**\n   * Gets slot data for a given start date and view.\n   *\n   * @param startDate - Start date for the slot.\n   * @param view - View type.\n   * @returns { startDate: AXDateTime; endDate: AXDateTime; view: AXSchedulerView } - Slot data.\n   */\n  getSlotData(\n    startDate: AXDateTime,\n    view: AXSchedulerView,\n  ): { startDate: AXDateTime; endDate: AXDateTime; view: AXSchedulerView } {\n    let endDate: AXDateTime;\n    switch (view) {\n      case 'day':\n      case 'week':\n        endDate = startDate.add('minute', this.BLOCK_DURATION_MINUTES);\n        break;\n      case 'timeline-day':\n      case 'timeline-weekly':\n        endDate = startDate.add('minute', this.BLOCK_DURATION_MINUTES * 2);\n        break;\n      case 'month':\n      case 'agenda':\n      case 'timeline-month':\n      case 'timeline-year':\n        startDate = startDate.startOf('day');\n        endDate = startDate.endOf('day');\n        break;\n    }\n    return { startDate, endDate, view };\n  }\n\n  /**\n   * Handles events for appointments and slots.\n   *\n   * @param event - The event to handle.\n   * @param eventOutputMap - Map of event outputs.\n   * @param eventType - Type of event ('appointment' or 'slot').\n   */\n  handleEvent(\n    event: AXSchedulerSlotMouseEvent | AXSchedulerAppointmentMouseEvent,\n    eventOutputMap,\n    eventType: 'appointment' | 'slot',\n  ) {\n    const mouseEvent = event.nativeEvent;\n    mouseEvent.preventDefault();\n    mouseEvent.stopPropagation();\n    if (eventType === 'appointment') {\n      const appointmentOutputMap = eventOutputMap[eventType];\n      const emitter = appointmentOutputMap[mouseEvent.type as keyof typeof appointmentOutputMap];\n      if (emitter) emitter.emit(event as AXSchedulerAppointmentMouseEvent);\n    }\n    if (eventType === 'slot') {\n      const slotOutputMap = eventOutputMap[eventType];\n      const emitter = slotOutputMap[mouseEvent.type as keyof typeof slotOutputMap];\n      if (emitter) emitter.emit(event as AXSchedulerSlotMouseEvent);\n    }\n  }\n\n  /**\n   * Calculates timeline layout for appointments.\n   *\n   * @param appt - The appointment to calculate layout for.\n   * @param viewStartHour - Start hour of the view.\n   * @param viewEndHour - End hour of the view.\n   * @returns { left: string; width: string } | null - Layout information or null.\n   */\n  calculateTimelineLayout(\n    // `appt` here will be an AXSchedulerAppointmentSegmentType when called from TimelineDayView\n    appt: AXSchedulerAppointment,\n    viewStartHour: number, // e.g., 8 for 8 AM\n    viewEndHour: number, // e.g., 18 for 6 PM (timeline runs from 8:00 up to, but not including, 18:00)\n  ): { left: string; width: string } | null {\n    if (\n      !appt?.startDate ||\n      !appt.endDate ||\n      typeof viewStartHour !== 'number' ||\n      typeof viewEndHour !== 'number' ||\n      viewStartHour >= viewEndHour // Basic sanity check\n    ) {\n      console.warn('calculateTimelineLayout: Invalid input', { appt, viewStartHour, viewEndHour });\n      return null;\n    }\n\n    const totalViewDurationMinutes = (viewEndHour - viewStartHour) * 60;\n    if (totalViewDurationMinutes <= 0) return null; // No viewable duration\n\n    // Segment's start and end times (these are already clipped to the day by getClonedAppointmentSegmentOnDay)\n    const segmentStart = appt.startDate;\n    const segmentEnd = appt.endDate;\n\n    // --- Calculate Start Position (left) ---\n    // Effective start of the segment within the view's hours for THIS day\n    let effectiveSegmentStartMinutesInDay = segmentStart.getHours() * 60 + segmentStart.getMinutes();\n\n    // Clamp to viewStartHour for calculation if segment starts before viewable hours (shouldn't happen if segmenter worked)\n    effectiveSegmentStartMinutesInDay = Math.max(effectiveSegmentStartMinutesInDay, viewStartHour * 60);\n    // Clamp to viewEndHour for calculation if segment starts after viewable hours (shouldn't happen)\n    effectiveSegmentStartMinutesInDay = Math.min(effectiveSegmentStartMinutesInDay, viewEndHour * 60);\n\n    const minutesFromViewStartToSegmentStart = effectiveSegmentStartMinutesInDay - viewStartHour * 60;\n\n    // If segment effectively starts before the viewable part (after clamping), it means it's not visible or starts at 0%\n    if (\n      minutesFromViewStartToSegmentStart < 0 &&\n      Math.abs(minutesFromViewStartToSegmentStart) > 1e-6 /*epsilon for float issues*/\n    ) {\n      // This case should ideally be caught by the segmenter or initial overlap checks.\n      // If it happens, treat as starting at 0% but it might mean no visible part.\n    }\n\n    const leftPercentage = (Math.max(0, minutesFromViewStartToSegmentStart) / totalViewDurationMinutes) * 100;\n\n    // --- Calculate Duration and Width ---\n    // Effective end of the segment within the view's hours for THIS day\n    let effectiveSegmentEndMinutesInDay = segmentEnd.getHours() * 60 + segmentEnd.getMinutes();\n    if (segmentEnd.getHours() === 0 && segmentEnd.getMinutes() === 0 && segmentEnd.getTime() > segmentStart.getTime()) {\n      // If segment ends exactly at midnight (00:00 of next day, meaning it filled up to 24:00 of current day)\n      effectiveSegmentEndMinutesInDay = 24 * 60;\n    }\n\n    // Clamp to viewEndHour for calculation\n    effectiveSegmentEndMinutesInDay = Math.min(effectiveSegmentEndMinutesInDay, viewEndHour * 60);\n    // Clamp to viewStartHour for calculation (if segment ends before view starts)\n    effectiveSegmentEndMinutesInDay = Math.max(effectiveSegmentEndMinutesInDay, viewStartHour * 60);\n\n    const segmentDurationMinutesInView = Math.max(\n      0,\n      effectiveSegmentEndMinutesInDay - effectiveSegmentStartMinutesInDay,\n    );\n\n    if (segmentDurationMinutesInView <= 0) {\n      // Segment has no visible duration within the timeline hours\n      return null;\n    }\n\n    const widthPercentage = (segmentDurationMinutesInView / totalViewDurationMinutes) * 100;\n\n    // Ensure percentages are valid\n    if (\n      leftPercentage > 100 ||\n      leftPercentage < 0 ||\n      widthPercentage <= 0 ||\n      widthPercentage > 100 ||\n      leftPercentage + widthPercentage > 100.0001 /*allow for float errors*/\n    ) {\n      // This might indicate an issue with date clamping or logic.\n      // For now, if it results in an invalid layout, return null.\n      // console.warn(\"Timeline layout calculation resulted in out-of-bounds percentages:\",\n      //              {leftPercentage, widthPercentage, segmentStart, segmentEnd, viewStartHour, viewEndHour});\n      // A common case for (left + width > 100) is if an event ends *exactly* at viewEndHour,\n      // and viewEndHour itself is the boundary.\n      // Let's be a bit tolerant here if width is positive.\n      if (widthPercentage <= 0) return null;\n    }\n\n    return {\n      left: `${Math.max(0, Math.min(100, leftPercentage))}%`,\n      width: `${Math.max(0, Math.min(100, widthPercentage))}%`,\n    };\n  }\n\n  /**\n   * Gets cloned appointment segment for a specific day.\n   *\n   * @param appointment - The appointment to clone.\n   * @param day - The day to get segment for.\n   * @param viewStartHour - Start hour of the view.\n   * @param viewEndHour - End hour of the view.\n   * @param isFullDayCellContext - Whether this is for full day cell context.\n   * @returns AXSchedulerAppointmentSegment | null - Cloned segment or null.\n   */\n  getClonedAppointmentSegmentOnDay(\n    appointment: AXSchedulerAppointment, // This is the ORIGINAL appointment\n    day: AXDateTime,\n    viewStartHour: number,\n    viewEndHour: number,\n    isFullDayCellContext = false,\n  ): AXSchedulerAppointmentSegment | null {\n    if (!appointment || !appointment.startDate || !appointment.endDate) {\n      return null;\n    }\n\n    const appointmentStartDate = this.calendarService.create(appointment.startDate);\n    const appointmentEndDate = this.calendarService.create(appointment.endDate);\n\n    if (appointment.allDay) {\n      const dayStartOf = day.clone().startOf('day');\n      const appointmentStartDay = appointmentStartDate.startOf('day');\n      const appointmentEndDay = appointmentEndDate.startOf('day');\n\n      // Check if the appointment overlaps with the current day\n      if (appointmentStartDay.compare(dayStartOf, 'day') <= 0 && appointmentEndDay.compare(dayStartOf, 'day') >= 0) {\n        const isContinuationFromPreviousDay = appointmentStartDay.compare(dayStartOf, 'day') < 0;\n        const isContinuationToNextDay = appointmentEndDay.compare(dayStartOf, 'day') > 0;\n\n        return {\n          ...appointment,\n          startDate: dayStartOf.date,\n          endDate: dayStartOf.clone().add('day', 1).startOf('day').date,\n          allDay: true,\n          originalStartDate: appointmentStartDate.date,\n          originalEndDate: appointmentEndDate.date,\n          isContinuationFromPreviousDay,\n          isContinuationToNextDay,\n          originalAppointmentRef: appointment,\n        };\n      } else {\n        return null;\n      }\n    }\n\n    const dayStartBoundary = isFullDayCellContext\n      ? day.clone().startOf('day')\n      : day.clone().set('hour', viewStartHour).startOf('hour');\n    const dayEndBoundary = isFullDayCellContext\n      ? day.clone().add('day', 1).startOf('day')\n      : viewEndHour === 24 || (viewEndHour === 0 && viewStartHour === 0)\n        ? day.clone().add('day', 1).startOf('day')\n        : day.clone().set('hour', viewEndHour).startOf('hour');\n\n    if (\n      appointmentEndDate.compare(dayStartBoundary, 'second') <= 0 ||\n      appointmentStartDate.compare(dayEndBoundary, 'second') >= 0\n    ) {\n      return null;\n    }\n    const segmentStartDate =\n      appointmentStartDate.compare(dayStartBoundary, 'second') > 0 ? appointmentStartDate : dayStartBoundary;\n    const segmentEndDate =\n      appointmentEndDate.compare(dayEndBoundary, 'second') < 0 ? appointmentEndDate : dayEndBoundary;\n\n    if (segmentStartDate.compare(segmentEndDate, 'second') >= 0) {\n      return null;\n    }\n\n    const isContinuationFromPreviousDay = appointmentStartDate.compare(segmentStartDate, 'second') < 0;\n    const isContinuationToNextDay = appointmentEndDate.compare(segmentEndDate, 'second') > 0;\n    const duration = appointmentStartDate.duration(appointmentEndDate);\n\n    return {\n      ...appointment,\n      startDate: segmentStartDate.date,\n      endDate: segmentEndDate.date,\n      allDay: appointment.allDay || duration.total.miliseconds >= 24 * 60 * 60 * 1000 - 1,\n      originalStartDate: appointmentStartDate.date,\n      originalEndDate: appointmentEndDate.date,\n      isContinuationFromPreviousDay,\n      isContinuationToNextDay,\n      originalAppointmentRef: appointment,\n    };\n  }\n\n  /**\n   * Gets the original appointment from a segment.\n   *\n   * @param item - Appointment or appointment segment.\n   * @returns AXSchedulerAppointment - The original appointment.\n   */\n  getOriginalAppointment(item: AXSchedulerAppointment | AXSchedulerAppointmentSegment): AXSchedulerAppointment {\n    const segment = item as AXSchedulerAppointmentSegment;\n    if (segment.originalAppointmentRef) {\n      return segment.originalAppointmentRef;\n    }\n    return item;\n  }\n\n  /**\n   * Checks if a date is a holiday.\n   *\n   * @param date - The date to check.\n   * @returns boolean - True if the date is a holiday.\n   */\n  isHoliday(date: AXDateTime): boolean {\n    const globalHolidays = this.calendarService.holidays.some((d) => date.equal(d.date, 'day'));\n    const internalHolidays = this.internalHoliday().some((d) => date.equal(d.date, 'day'));\n    return globalHolidays || internalHolidays;\n  }\n\n  /**\n   * Checks if a date is a weekend.\n   *\n   * @param date - The date to check.\n   * @param calendar - The calendar type to use.\n   * @returns boolean - True if the date is a weekend.\n   */\n  isWeekend(date: AXDateTime, calendar: string): boolean {\n    const internalWeekend = this.internalWeekend();\n    const globalWeekend = this.calendarService.resolveCalendar(calendar).weekend;\n    if (internalWeekend.length === 0) {\n      return globalWeekend.includes(date.weekdayIndex);\n    }\n    return this.internalWeekend().includes(date.weekdayIndex);\n  }\n\n  /**\n   * Filters appointments by resources and unassigned appointments.\n   *\n   * @param appointments - Array of appointments to filter.\n   * @param resources - Array of resources.\n   * @param showUnassignedAppointments - Whether to show appointments without resources.\n   * @returns Map<any, AXSchedulerAppointment[]> - Appointments grouped by resource ID.\n   */\n  filterAppointmentsByResources(\n    appointments: AXSchedulerAppointment[],\n    resources: AXSchedulerResource[],\n    showUnassignedAppointments = true,\n  ): Map<any, AXSchedulerAppointment[]> {\n    const result = new Map<any, AXSchedulerAppointment[]>();\n\n    if (!resources || resources.length === 0) {\n      // If no resources, return all appointments under a default key\n      result.set('default', appointments);\n      return result;\n    }\n\n    // Initialize result map with empty arrays for each resource\n    resources.forEach((resource) => {\n      result.set(resource.id, []);\n    });\n\n    // Add unassigned appointments key if needed\n    if (showUnassignedAppointments) {\n      result.set('unassigned', []);\n    }\n\n    // Group appointments by resource\n    appointments.forEach((appointment) => {\n      if (appointment.resourceId !== undefined && appointment.resourceId !== null) {\n        // Find matching resource using isEqual for proper comparison\n        let foundResource = false;\n        for (const [key, resourceAppointments] of result.entries()) {\n          if (key !== 'unassigned' && isEqual(key, appointment.resourceId)) {\n            resourceAppointments.push(appointment);\n            foundResource = true;\n            break;\n          }\n        }\n\n        if (!foundResource && showUnassignedAppointments) {\n          // If resource doesn't exist in the resources array, treat as unassigned\n          result.get('unassigned').push(appointment);\n        }\n      } else if (showUnassignedAppointments) {\n        result.get('unassigned').push(appointment);\n      }\n    });\n\n    return result;\n  }\n\n  /**\n   * Gets appointments for a specific resource.\n   *\n   * @param appointments - Array of appointments.\n   * @param resourceId - The resource ID to filter by.\n   * @returns AXSchedulerAppointment[] - Filtered appointments.\n   */\n  getAppointmentsForResource(appointments: AXSchedulerAppointment[], resourceId: any): AXSchedulerAppointment[] {\n    if (resourceId === 'unassigned') {\n      return appointments.filter(\n        (appointment) => appointment.resourceId === undefined || appointment.resourceId === null,\n      );\n    }\n    return appointments.filter((appointment) => isEqual(appointment.resourceId, resourceId));\n  }\n\n  /**\n   * Gets all resource IDs including unassigned if applicable.\n   *\n   * @param resources - Array of resources.\n   * @param showUnassignedAppointments - Whether to include unassigned appointments.\n   * @returns string[] - Array of resource IDs.\n   */\n  getAllResourceIds(resources: AXSchedulerResource[], showUnassignedAppointments = true): any[] {\n    const resourceIds = resources.map((resource) => resource.id);\n    if (showUnassignedAppointments) {\n      resourceIds.push('unassigned');\n    }\n    return resourceIds;\n  }\n\n  /**\n   * Calculates the updated appointment data after a drag-and-drop operation.\n   *\n   * This utility method handles the complex logic of preserving appointment duration\n   * when dropping an appointment on a new slot. It correctly handles:\n   * - Single-day timed events (preserves exact duration in milliseconds)\n   * - All-day events (preserves the day span)\n   * - Multi-day events (preserves the number of days spanned)\n   * - Day-based views (agenda, month): preserves original time of day\n   * - Time-slot views (day, week, timeline): uses the slot's time\n   * - Resource ID changes\n   *\n   * @param event - The drop event from the scheduler's onAppointmentDrop output.\n   * @returns AXSchedulerAppointmentDropResult - The calculated new appointment data,\n   *          or null if the drop was on the same slot (no change needed).\n   *\n   * @example\n   * ```typescript\n   * // In your component:\n   * handleAppointmentDrop(event: AXSchedulerSlotDropEvent) {\n   *   const result = this.schedulerService.calculateAppointmentDropResult(event);\n   *\n   *   if (result.isSameSlotDrop) {\n   *     return; // No change needed\n   *   }\n   *\n   *   // Update your data\n   *   this.appointments.update(appointments =>\n   *     appointments.map(appt =>\n   *       appt.id === event.appointment.id\n   *         ? { ...appt, ...result }\n   *         : appt\n   *     )\n   *   );\n   * }\n   * ```\n   */\n  calculateAppointmentDropResult(event: {\n    appointment: AXSchedulerAppointment;\n    slot: { startDate: { date: Date }; endDate?: { date: Date }; view?: AXSchedulerView; resourceId?: unknown };\n    isSameSlotDrop: boolean;\n  }): AXSchedulerAppointmentDropResult {\n    // If dropped on the same slot, return early with isSameSlotDrop flag\n    if (event.isSameSlotDrop) {\n      return {\n        startDate: event.appointment.startDate,\n        endDate: event.appointment.endDate,\n        allDay: event.appointment.allDay ?? false,\n        resourceId: event.slot.resourceId,\n        isSameSlotDrop: true,\n      };\n    }\n\n    const originalStartDate = new Date(event.appointment.startDate);\n    const originalEndDate = new Date(event.appointment.endDate);\n    const wasAllDay = event.appointment.allDay === true;\n\n    // Check if appointment spans multiple calendar days\n    const startDay = new Date(originalStartDate);\n    startDay.setHours(0, 0, 0, 0);\n    const endDay = new Date(originalEndDate);\n    endDay.setHours(0, 0, 0, 0);\n    const isMultiDay = endDay.getTime() > startDay.getTime();\n\n    // Detect if this is a day-based view drop (agenda, month, timeline-month, timeline-year)\n    // These views have slots that span the entire day (00:00:00 to 23:59:59 or start of next day)\n    const slotStartDate = new Date(event.slot.startDate.date);\n    const isDayBasedSlot = this.isDayBasedSlotDrop(event.slot);\n\n    let newStartDate: Date;\n    let newEndDate: Date;\n    let isNewAllDay: boolean;\n\n    if (wasAllDay || isMultiDay) {\n      // For all-day events OR multi-day events, preserve the day span\n      // Calculate day span (number of days the event covers)\n      const daySpanMs = endDay.getTime() - startDay.getTime();\n      const daySpan = Math.max(0, Math.round(daySpanMs / this.MILLISECONDS_PER_DAY));\n\n      // New start is the start of the drop day\n      newStartDate = new Date(slotStartDate);\n      newStartDate.setHours(0, 0, 0, 0);\n\n      // New end is start + daySpan days\n      newEndDate = new Date(newStartDate);\n      newEndDate.setDate(newEndDate.getDate() + daySpan);\n\n      // Preserve original allDay flag\n      isNewAllDay = wasAllDay;\n    } else if (isDayBasedSlot) {\n      // For day-based views (agenda, month), preserve the original time of day\n      // Only change the date, not the time\n      const originalDuration = originalEndDate.getTime() - originalStartDate.getTime();\n\n      // Create new start date with the drop day but original time\n      newStartDate = new Date(slotStartDate);\n      newStartDate.setHours(\n        originalStartDate.getHours(),\n        originalStartDate.getMinutes(),\n        originalStartDate.getSeconds(),\n        originalStartDate.getMilliseconds(),\n      );\n\n      // New end is start + original duration\n      newEndDate = new Date(newStartDate.getTime() + originalDuration);\n      isNewAllDay = false;\n    } else {\n      // For time-slot based views (day, week, timeline-day), use the slot's time\n      const originalDuration = originalEndDate.getTime() - originalStartDate.getTime();\n\n      newStartDate = new Date(slotStartDate);\n      newEndDate = new Date(newStartDate.getTime() + originalDuration);\n      isNewAllDay = false;\n    }\n\n    return {\n      startDate: newStartDate,\n      endDate: newEndDate,\n      allDay: isNewAllDay,\n      resourceId: event.slot.resourceId,\n      isSameSlotDrop: false,\n    };\n  }\n\n  /**\n   * Determines if a slot represents a day-based drop (entire day slot).\n   * Day-based views (agenda, month, timeline-month, timeline-year) have slots\n   * that start at 00:00:00 and span the entire day.\n   *\n   * @param slot - The slot to check.\n   * @returns boolean - True if this is a day-based slot.\n   */\n  private isDayBasedSlotDrop(slot: {\n    startDate: { date: Date };\n    endDate?: { date: Date };\n    view?: AXSchedulerView;\n  }): boolean {\n    // If view is explicitly provided, use it\n    if (slot.view) {\n      return ['month', 'agenda', 'timeline-month', 'timeline-year'].includes(slot.view);\n    }\n\n    // Otherwise, detect by checking if slot starts at midnight (00:00:00)\n    // and spans a full day or close to it\n    const startDate = new Date(slot.startDate.date);\n    const isStartAtMidnight =\n      startDate.getHours() === 0 && startDate.getMinutes() === 0 && startDate.getSeconds() === 0;\n\n    if (!isStartAtMidnight) {\n      return false;\n    }\n\n    // If we have an end date, check if it's roughly a full day later\n    if (slot.endDate) {\n      const endDate = new Date(slot.endDate.date);\n      const durationMs = endDate.getTime() - startDate.getTime();\n      // A full day is 24 hours. Allow some tolerance (23-25 hours)\n      const isFullDayDuration = durationMs >= 23 * 60 * 60 * 1000 && durationMs <= 25 * 60 * 60 * 1000;\n      return isFullDayDuration;\n    }\n\n    // If no end date, assume it's a day-based slot if it starts at midnight\n    return isStartAtMidnight;\n  }\n\n  /**\n   * Applies the drop result to an appointment, returning a new updated appointment object.\n   *\n   * This is a convenience method that combines the drop result with the original appointment.\n   *\n   * @param appointment - The original appointment to update.\n   * @param dropResult - The result from calculateAppointmentDropResult.\n   * @returns AXSchedulerAppointment - A new appointment object with updated fields.\n   *\n   * @example\n   * ```typescript\n   * handleAppointmentDrop(event: AXSchedulerSlotDropEvent) {\n   *   const result = this.schedulerService.calculateAppointmentDropResult(event);\n   *\n   *   if (result.isSameSlotDrop) return;\n   *\n   *   this.appointments.update(appointments =>\n   *     appointments.map(appt =>\n   *       appt.id === event.appointment.id\n   *         ? this.schedulerService.applyDropResult(appt, result)\n   *         : appt\n   *     )\n   *   );\n   * }\n   * ```\n   */\n  applyDropResult(\n    appointment: AXSchedulerAppointment,\n    dropResult: AXSchedulerAppointmentDropResult,\n  ): AXSchedulerAppointment {\n    return {\n      ...appointment,\n      startDate: dropResult.startDate,\n      endDate: dropResult.endDate,\n      allDay: dropResult.allDay,\n      resourceId: dropResult.resourceId,\n    };\n  }\n}\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n  Component,\n  DOCUMENT,\n  TemplateRef,\n  ViewEncapsulation,\n  computed,\n  inject,\n  input,\n  output,\n  signal,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport { AXSchedulerAppointment, AXSchedulerAppointmentSegment } from '../../scheduler.class';\nimport {\n  AXSchedulerAppointmentMouseEvent,\n  AXSchedulerComponent,\n  AXSchedulerSlotDropEvent,\n  AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\nexport interface AgendaDayData {\n  date: AXDateTime;\n  appointments: AXSchedulerAppointmentSegment[];\n  holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate };\n}\n\n@Component({\n  selector: 'ax-scheduler-agenda-view',\n  templateUrl: './scheduler-agenda-view.component.html',\n  styleUrl: './scheduler-agenda-view.component.css',\n\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    '[class.ax-state-readonly]': 'readonly()',\n  },\n  imports: [\n    AsyncPipe,\n    AXFormatPipe,\n    AXDragDirective,\n    AXTranslatorPipe,\n    AXTooltipDirective,\n    AXDropZoneDirective,\n    AXDecoratorIconComponent,\n    AXDecoratorGenericComponent,\n  ],\n  providers: [{ provide: AXComponent, useExisting: AXSchedulerAgendaViewComponent }],\n})\nexport class AXSchedulerAgendaViewComponent extends NXComponent {\n  private document = inject(DOCUMENT);\n  private scheduler = inject(AXSchedulerComponent);\n  private calendarService = inject(AXCalendarService);\n  private schedulerService = inject(AXSchedulerService);\n\n  daysCount = input(7);\n  readonly = input(false);\n  draggable = input(true);\n  hasActions = input(false);\n  dragStartDelay = input(0);\n  calendar = input<string>();\n  date = input.required<AXDateTime>();\n  appointments = input<AXSchedulerAppointment[]>([]);\n  tooltipTemplate = input<string | TemplateRef<unknown>>();\n  selectedAppointmentId = input<string | number | null>(null);\n\n  protected isActive(appointmentId: string | number): boolean {\n    return this.selectedAppointmentId() === appointmentId;\n  }\n\n  private dragStartSlotId = signal<string | null>(null);\n\n  protected agendaDaysLayout = computed<AgendaDayData[]>(() => {\n    const allOriginalAppointments = this.appointments();\n    const agendaStartDate = this.date();\n    const numberOfDays = this.daysCount();\n\n    if (!agendaStartDate || !allOriginalAppointments) {\n      return [];\n    }\n\n    const result: AgendaDayData[] = [];\n\n    for (let i = 0; i < numberOfDays; i++) {\n      const currentDay = agendaStartDate.add('day', i).startOf('day');\n      const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n\n      for (const appt of allOriginalAppointments) {\n        const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, currentDay, 0, 24, true);\n        if (segment) {\n          segmentsForThisDay.push(segment);\n        }\n      }\n\n      const sortedSegments = orderBy(\n        segmentsForThisDay,\n        [\n          (s) => (s.allDay ? 0 : 1),\n          (s) => s.startDate.getTime(),\n          (s) => s.originalEndDate.getTime() - s.originalStartDate.getTime(),\n        ],\n        ['asc', 'asc', 'desc'],\n      );\n\n      result.push({\n        date: currentDay,\n        appointments: sortedSegments,\n        holiday: this.isHoliday(currentDay),\n      });\n    }\n    return result;\n  });\n\n  // Internal outputs to be caught by parent AXSchedulerComponent\n  slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n  onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n  // --- Event Handlers ---\n  private readonly eventOutputMap = {\n    slot: {\n      click: this.slotClickedInternal,\n      dblclick: this.slotDblClickedInternal,\n      contextmenu: this.slotRightClickedInternal,\n    },\n    appointment: {\n      click: this.appointmentClickedInternal,\n      dblclick: this.appointmentDblClickedInternal,\n      contextmenu: this.appointmentRightClickedInternal,\n    },\n  };\n  protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n    const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n    const appointmentRef = {\n      ...originalAppointment,\n      endDate: originalAppointment.endDate,\n      startDate: originalAppointment.startDate,\n    };\n    this.schedulerService.handleEvent(\n      { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n      this.eventOutputMap,\n      'appointment',\n    );\n  }\n  protected handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n    const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'agenda');\n    if (slotData) {\n      this.schedulerService.handleEvent(\n        { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n        this.eventOutputMap,\n        'slot',\n      );\n    }\n  }\n  protected handleDrop(e: AXDropZoneDropEvent, date: AXDateTime) {\n    const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'agenda');\n    const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n    const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n    const appointmentRef = {\n      ...originalAppointment,\n      endDate: originalAppointment.endDate,\n      startDate: originalAppointment.startDate,\n    };\n    this.onAppointmentDropInternal.emit({\n      dropEvent: e,\n      slot: slotData,\n      sender: this.scheduler,\n      appointment: appointmentRef,\n      isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n    });\n  }\n  protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n    event.stopPropagation();\n    const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n    this.onActionClickInternal.emit({\n      appointment: originalAppointment,\n      nativeEvent: event,\n      sender: this.scheduler,\n    });\n  }\n\n  protected isToday(date: AXDateTime): boolean {\n    const today = this.calendarService.create(new Date());\n    return date.equal(today, 'day');\n  }\n  protected isHoliday(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n    const isHoliday = this.schedulerService.isHoliday(date);\n    if (isHoliday) {\n      const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n      const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n      const holiday = globalHoliday || internalHoliday;\n      return {\n        state: 'holiday',\n        holiday,\n      };\n    }\n    const isWeekend = this.schedulerService.isWeekend(date, this.calendar());\n    if (isWeekend) {\n      return { state: 'weekend' };\n    }\n    return { state: 'none' };\n  }\n\n  protected getSlotId(e: PointerEvent) {\n    const dropListElement = this.document\n      .elementsFromPoint(e.clientX, e.clientY)\n      .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n    this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n  }\n\n  /**\n   * Checks if an appointment spans multiple days.\n   * Returns true if the appointment covers more than one calendar day.\n   */\n  protected isMultiDayAppointment(segment: AXSchedulerAppointmentSegment): boolean {\n    const startDate = this.calendarService.create(segment.originalStartDate, this.calendar()).startOf('day');\n    const endDate = this.calendarService.create(segment.originalEndDate, this.calendar()).startOf('day');\n    return !startDate.equal(endDate, 'day');\n  }\n\n  /**\n   * Gets the formatted date range for multi-day appointments.\n   * Returns the start and end dates formatted for display (e.g., \"7 Dec\", \"21 Dec\").\n   * Supports Persian calendar through the calendar input.\n   */\n  protected getMultiDayStartDate(segment: AXSchedulerAppointmentSegment): Date {\n    return segment.originalStartDate;\n  }\n\n  protected getMultiDayEndDate(segment: AXSchedulerAppointmentSegment): Date {\n    return segment.originalEndDate;\n  }\n}\n","<div class=\"ax-scheduler-agenda-container\">\n  @for (dayData of agendaDaysLayout(); track dayData.date.date.getTime()) {\n    <div\n      axDropZone\n      #zone=\"axDropZone\"\n      (onElementDrop)=\"handleDrop($event, dayData.date)\"\n      [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n      [class.ax-state-today]=\"isToday(dayData.date)\"\n      class=\"ax-scheduler-agenda-view-container {{\n        dayData.holiday.state !== 'none' ? (dayData.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n      }}\"\n      [style.--ax-scheduler-holiday-color]=\"dayData.holiday.holiday?.color ?? null\"\n      (click)=\"handleSlotEvent($event, dayData.date)\"\n      (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n      (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n      [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n    >\n      <div class=\"ax-scheduler-agenda-header-date-day\">\n        <span\n          class=\"ax-scheduler-agenda-header-date-day-char ax-scheduler-truncate\"\n          [axTooltip]=\"(dayData.holiday?.holiday?.description ?? dayData.holiday?.holiday?.title ?? '') | translate | async\"\n          [axTooltipPlacement]=\"'top-start'\"\n        >\n          {{ dayData.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n          @if (dayData.holiday.state === 'holiday' && dayData.holiday.holiday.title) {\n            ( {{ dayData.holiday.holiday.title | translate | async }} )\n          }\n        </span>\n        <span class=\"ax-scheduler-agenda-header-date-day-num\">\n          {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n        </span>\n      </div>\n      <div class=\"ax-scheduler-agenda-appointment-container\">\n        @for (segment of dayData.appointments; track segment.id + segment.originalStartDate.getTime()) {\n          <div\n            axDrag\n            [dragCursor]=\"'grab'\"\n            [dragData]=\"segment\"\n            [dragTransition]=\"false\"\n            [dragElementClone]=\"true\"\n            [dragStartDelay]=\"dragStartDelay()\"\n            [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n            (pointerdown)=\"getSlotId($event)\"\n            (click)=\"handleAppointmentEvent($event, segment)\"\n            (dblclick)=\"handleAppointmentEvent($event, segment)\"\n            (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n            [title]=\"\n              tooltipTemplate()\n                ? ''\n                : segment.title +\n                  (segment.allDay\n                    ? ' (All Day)'\n                    : ' (' +\n                      (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n                      ' - ' +\n                      (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n                      ')')\n            \"\n            class=\"ax-scheduler-agenda-appointment\"\n            [class.all-day-segment]=\"segment.allDay\"\n            [class.ax-state-active]=\"isActive(segment.id)\"\n            [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n            [axTooltip]=\"tooltipTemplate()\"\n            [axTooltipContext]=\"segment\"\n          >\n            <div class=\"ax-scheduler-agenda-appointment-time\">\n              <div\n                class=\"ax-scheduler-agenda-appointment-time-inner {{\n                  segment.cssClass ?? 'ax-scheduler-' + (segment.priority ?? 'primary') + '-priority'\n                }}\"\n              ></div>\n              @if (segment.allDay) {\n                @if (isMultiDayAppointment(segment)) {\n                  <span class=\"ax-scheduler-agenda-multiday-info\">\n                    <span class=\"ax-scheduler-agenda-multiday-badge\">\n                      {{\n                        getMultiDayStartDate(segment)\n                          | format: 'date' : { format: 'D MMM', calendar: calendar() }\n                          | async\n                      }}\n                      -\n                      {{\n                        getMultiDayEndDate(segment) | format: 'date' : { format: 'D MMM', calendar: calendar() } | async\n                      }}\n                    </span>\n                  </span>\n                } @else {\n                  <span>{{ '@acorex:dateTime.duration.all-day' | translate | async }}</span>\n                }\n              } @else {\n                @if (isMultiDayAppointment(segment)) {\n                  <span class=\"ax-scheduler-agenda-multiday-info\">\n                    <span class=\"ax-scheduler-agenda-multiday-badge\">\n                      {{\n                        getMultiDayStartDate(segment)\n                          | format: 'date' : { format: 'D MMM', calendar: calendar() }\n                          | async\n                      }}\n                      -\n                      {{\n                        getMultiDayEndDate(segment) | format: 'date' : { format: 'D MMM', calendar: calendar() } | async\n                      }}\n                    </span>\n                    <span>\n                      {{\n                        segment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n                      }}\n                      -\n                      {{ segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n                    </span>\n                  </span>\n                } @else {\n                  <span>\n                    {{ segment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n                    -\n                    {{ segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n                  </span>\n                }\n              }\n            </div>\n            <ax-title class=\"ax-scheduler-agenda-appointment-title ax-scheduler-truncate\">{{ segment.title }}</ax-title>\n            <!-- Description could go here if needed -->\n            <!-- @if (segment.description) {\n              <ax-subtitle>{{ segment.description }}</ax-subtitle>\n            } -->\n            @if (hasActions()) {\n              <ax-icon\n                class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                (click)=\"handleActionClick($event, segment)\"\n              >\n              </ax-icon>\n            }\n          </div>\n        }\n        @if (dayData.appointments.length === 0) {\n          <div class=\"ax-scheduler-agenda-no-appointments\">\n            {{ '@acorex:common.general.no-record' | translate | async }}\n          </div>\n        }\n      </div>\n    </div>\n  }\n</div>\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n  AfterViewInit,\n  Component,\n  computed,\n  DestroyRef,\n  DOCUMENT,\n  ElementRef,\n  inject,\n  input,\n  OnDestroy,\n  output,\n  signal,\n  TemplateRef,\n  viewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n  AXSchedulerAppointment,\n  AXSchedulerAppointmentSegment,\n  AXSchedulerDayAppointmentLayout,\n} from '../../scheduler.class';\nimport {\n  AXSchedulerAppointmentMouseEvent,\n  AXSchedulerComponent,\n  AXSchedulerSlotDropEvent,\n  AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n@Component({\n  selector: 'ax-scheduler-day-view',\n  templateUrl: './scheduler-day-view.component.html',\n  styleUrl: './scheduler-day-view.component.css',\n\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    '[class.ax-state-readonly]': 'readonly()',\n  },\n  imports: [\n    AsyncPipe,\n    AXFormatPipe,\n    AXDragDirective,\n    AXTranslatorPipe,\n    AXPopoverComponent,\n    AXTooltipDirective,\n    AXDropZoneDirective,\n    AXDecoratorIconComponent,\n    AXDecoratorGenericComponent,\n  ],\n  providers: [{ provide: AXComponent, useExisting: AXSchedulerDayViewComponent }],\n})\nexport class AXSchedulerDayViewComponent extends NXComponent implements AfterViewInit, OnDestroy {\n  private document = inject(DOCUMENT);\n  private destroyRef = inject(DestroyRef);\n  private scheduler = inject(AXSchedulerComponent);\n  private calendarService = inject(AXCalendarService);\n  private schedulerService = inject(AXSchedulerService);\n\n  readonly GAP_PX = 1;\n  private resizeObserverCleanup: (() => void) | undefined;\n\n  rtl = input(false);\n  readonly = input(false);\n  draggable = input(true);\n  hasActions = input(false);\n  dragStartDelay = input(0);\n  calendar = input<string>();\n  date = input.required<AXDateTime>();\n  endDayHour = input.required<number>();\n  startDayHour = input.required<number>();\n  showCurrentTimeIndicator = input<boolean>(true);\n  scrollToCurrentTimeIndicator = input<boolean>(false);\n  appointments = input<AXSchedulerAppointment[]>([]);\n  tooltipTemplate = input<string | TemplateRef<unknown>>();\n  selectedAppointmentId = input<string | number | null>(null);\n\n  protected isActive(appointmentId: string | number): boolean {\n    return this.selectedAppointmentId() === appointmentId;\n  }\n\n  // ViewChild for current time line element\n  currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n  private dragStartSlotId = signal<string | null>(null);\n\n  private processedAppointmentsForLayout = computed(() => {\n    const viewDate = this.date();\n    const startH = this.startDayHour();\n    const endH = this.endDayHour();\n    const allAppointmentsInView = this.appointments();\n    if (!viewDate || allAppointmentsInView.length === 0) {\n      return [];\n    }\n    const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n    for (const appt of allAppointmentsInView) {\n      const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, viewDate, startH, endH);\n      if (segment) {\n        segmentsForThisDay.push(segment);\n      }\n    }\n    return segmentsForThisDay;\n  });\n  protected allDayAppointments = computed(() => {\n    // Use segments from processedAppointmentsForLayout to get continuation flags\n    return this.processedAppointmentsForLayout()?.filter((e) => e && e.allDay) ?? [];\n  });\n  protected singleDayAppointments = computed(() => {\n    return this.processedAppointmentsForLayout()?.filter((e) => e && !e.allDay) ?? [];\n  });\n\n  slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n  onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n  private readonly eventOutputMap = {\n    slot: {\n      click: this.slotClickedInternal,\n      dblclick: this.slotDblClickedInternal,\n      contextmenu: this.slotRightClickedInternal,\n    },\n    appointment: {\n      click: this.appointmentClickedInternal,\n      dblclick: this.appointmentDblClickedInternal,\n      contextmenu: this.appointmentRightClickedInternal,\n    },\n  };\n  protected handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointment) {\n    const originalAppointment = (appointment as AXSchedulerAppointmentSegment).originalStartDate\n      ? ({\n          ...appointment,\n          startDate: (appointment as AXSchedulerAppointmentSegment).originalStartDate,\n          endDate: (appointment as AXSchedulerAppointmentSegment).originalEndDate,\n        } as AXSchedulerAppointment)\n      : appointment;\n    const appointmentRef = {\n      ...originalAppointment,\n      endDate: originalAppointment.endDate,\n      startDate: originalAppointment.startDate,\n    };\n    this.schedulerService.handleEvent(\n      { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n      this.eventOutputMap,\n      'appointment',\n    );\n  }\n  protected handleSingleSlotEvent(mouseEvent: MouseEvent, startDate: AXDateTime) {\n    const slotData = this.schedulerService.getSlotData(startDate, 'day');\n    if (slotData)\n      this.schedulerService.handleEvent(\n        { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n        this.eventOutputMap,\n        'slot',\n      );\n  }\n  protected handleAllDaySlotEvent(mouseEvent: MouseEvent) {\n    const endDate = this.date().endOf('day');\n    const startDate = this.date().startOf('day');\n    const slotData = { startDate, endDate, view: 'day' as const };\n    if (slotData)\n      this.schedulerService.handleEvent(\n        { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n        this.eventOutputMap,\n        'slot',\n      );\n  }\n  protected handleAllDayDrop(e: AXDropZoneDropEvent) {\n    const endDate = this.date().endOf('day');\n    const startDate = this.date().startOf('day');\n    const slotData = { startDate, endDate, view: 'day' as const };\n\n    const droppedAppt = e.dropped.dragData() as AXSchedulerAppointment;\n    const originalDroppedAppt = (droppedAppt as AXSchedulerAppointmentSegment).originalStartDate\n      ? ({\n          ...droppedAppt,\n          startDate: (droppedAppt as AXSchedulerAppointmentSegment).originalStartDate,\n          endDate: (droppedAppt as AXSchedulerAppointmentSegment).originalEndDate,\n        } as AXSchedulerAppointment)\n      : droppedAppt;\n    const appointmentRef = {\n      ...originalDroppedAppt,\n      endDate: originalDroppedAppt.endDate,\n      startDate: originalDroppedAppt.startDate,\n    };\n    this.onAppointmentDropInternal.emit({\n      dropEvent: e,\n      slot: slotData,\n      sender: this.scheduler,\n      appointment: appointmentRef,\n      isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n    });\n  }\n  protected handleSingleDayDrop(e: AXDropZoneDropEvent, startDate: AXDateTime) {\n    const slotData = this.schedulerService.getSlotData(startDate, 'day');\n    const droppedAppt = e.dropped.dragData() as AXSchedulerAppointment;\n    const originalDroppedAppt = (droppedAppt as AXSchedulerAppointmentSegment).originalStartDate\n      ? ({\n          ...droppedAppt,\n          startDate: (droppedAppt as AXSchedulerAppointmentSegment).originalStartDate,\n          endDate: (droppedAppt as AXSchedulerAppointmentSegment).originalEndDate,\n        } as AXSchedulerAppointment)\n      : droppedAppt;\n    const appointmentRef = {\n      ...originalDroppedAppt,\n      endDate: originalDroppedAppt.endDate,\n      startDate: originalDroppedAppt.startDate,\n    };\n    this.onAppointmentDropInternal.emit({\n      dropEvent: e,\n      slot: slotData,\n      sender: this.scheduler,\n      appointment: appointmentRef,\n      isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n    });\n  }\n  protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n    event.stopPropagation();\n    const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n    this.onActionClickInternal.emit({\n      appointment: originalAppointment,\n      nativeEvent: event,\n      sender: this.scheduler,\n    });\n  }\n\n  protected hoursArray = computed(() => {\n    let time = this.date();\n    if (!time) return [];\n    time = time.set('hour', this.startDayHour()).startOf('hour');\n    const hours = [time];\n    while (time.hour < this.endDayHour() - 1) {\n      time = time.add('hour', 1);\n      hours.push(time);\n    }\n    return hours;\n  });\n\n  private appointmentLayouts = computed(() => {\n    const layouts = new Map<any, AXSchedulerDayAppointmentLayout>();\n    const appointmentsToLayout = this.singleDayAppointments();\n    const viewDate = this.date();\n    const startH = this.startDayHour();\n    const endH = this.endDayHour();\n\n    if (appointmentsToLayout.length === 0 || !viewDate || typeof startH !== 'number' || typeof endH !== 'number') {\n      return layouts;\n    }\n\n    const concurrencyInfoMap = this.schedulerService.calculateDayViewConcurrencyInfo(\n      appointmentsToLayout,\n      viewDate,\n      startH,\n      endH,\n    );\n\n    const sortedAppointments = orderBy(\n      appointmentsToLayout,\n      [(e) => e.startDate.getTime(), (e) => e.originalEndDate.getTime() - e.originalStartDate.getTime()],\n      ['asc', 'desc'],\n    );\n\n    const columnsData: { appointments: AXSchedulerAppointmentSegment[] }[] = [];\n\n    for (const appointmentSegment of sortedAppointments) {\n      let assignedCol = -1;\n\n      for (let c = 0; ; c++) {\n        if (!columnsData[c]) {\n          columnsData[c] = { appointments: [] };\n        }\n\n        let conflict = false;\n\n        for (const placedSegment of columnsData[c].appointments) {\n          const startDate = this.calendarService.create(appointmentSegment.startDate, this.calendar());\n          const endDate = this.calendarService.create(appointmentSegment.endDate, this.calendar());\n          if (\n            startDate.compare(placedSegment.endDate, 'minute') < 0 &&\n            endDate.compare(placedSegment.startDate, 'minute') > 0\n          ) {\n            conflict = true;\n            break;\n          }\n        }\n\n        if (!conflict) {\n          assignedCol = c;\n          columnsData[c].appointments.push(appointmentSegment);\n          break;\n        }\n\n        if (c > appointmentsToLayout.length) {\n          console.warn(\n            `DayView: Safety break in column assignment for ${appointmentSegment.title}, assigning to new column ${c}`,\n          );\n          if (!columnsData[c]) columnsData[c] = { appointments: [] };\n          columnsData[c].appointments.push(appointmentSegment);\n          assignedCol = c;\n          break;\n        }\n      }\n\n      const concurrencyInfo = concurrencyInfoMap.get(appointmentSegment.id);\n      const effectiveCols = concurrencyInfo ? concurrencyInfo.effectiveTotalColumns : 1;\n\n      layouts.set(appointmentSegment.id, {\n        columnIndex: assignedCol,\n        effectiveTotalColumns: effectiveCols,\n      });\n    }\n    return layouts;\n  });\n\n  private getAppointmentLayout(key: any): AXSchedulerDayAppointmentLayout | undefined {\n    return this.appointmentLayouts().get(key);\n  }\n\n  protected getAppointmentLeft(key: any): string {\n    const layout = this.getAppointmentLayout(key);\n    if (layout && layout.effectiveTotalColumns > 0) {\n      const N = layout.effectiveTotalColumns;\n      const C = layout.columnIndex;\n      if (C < 0) {\n        console.warn('Invalid columnIndex < 0 for key:', key);\n        return '0px';\n      }\n      if (C === 0 || N <= 1) return '0px';\n      const leftPercent = C * (100 / N);\n      const gapOffsetPx = C * this.GAP_PX;\n      return `calc(${leftPercent}% + ${gapOffsetPx}px)`;\n    }\n    return '0px';\n  }\n\n  protected getAppointmentWidth(key: any): string {\n    const layout = this.getAppointmentLayout(key);\n    if (layout && layout.effectiveTotalColumns > 0) {\n      const N = layout.effectiveTotalColumns;\n\n      if (N <= 0) return '0%';\n      if (N === 1) return `calc(100% - ${this.GAP_PX}px)`;\n\n      const widthPercent = (1 / N) * 100;\n\n      return `calc(${widthPercent}% - ${this.GAP_PX}px)`;\n    }\n    return '0%';\n  }\n\n  protected getAppointmentTop(key: any): string {\n    const appointmentSegment = this.singleDayAppointments().find((e) => e.id === key);\n\n    if (appointmentSegment) {\n      const startMinutes = appointmentSegment.startDate.getHours() * 60 + appointmentSegment.startDate.getMinutes();\n      const startBlockOffset = startMinutes - this.startDayHour() * 60;\n      const yBlock = startBlockOffset / 30;\n      return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${yBlock} + 1px)`;\n    }\n    return '';\n  }\n\n  protected getAppointmentHeight(key: any): string {\n    const appointmentSegment = this.singleDayAppointments().find((e) => e.id === key);\n    if (appointmentSegment) {\n      const durationMillis = appointmentSegment.endDate.getTime() - appointmentSegment.startDate.getTime();\n      const durationMinutes = Math.max(0, durationMillis / (1000 * 60));\n      if (durationMinutes <= 0) return '0px';\n\n      const heightBlock = durationMinutes / 30;\n      const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height)`;\n\n      return `calc(${blockHeightExpr} * ${heightBlock} - ${this.GAP_PX}px)`;\n    }\n    return '0px';\n  }\n\n  protected getCurrentTimePosition(): number | null {\n    const now = this.calendarService.create(new Date(), this.calendar());\n    const dayStart = this.date().startOf('day');\n    const dayEnd = this.date().endOf('day');\n    const startHour = this.startDayHour();\n    const endHour = this.endDayHour();\n\n    // Check if current time is within the displayed day\n    if (now.isBefore(dayStart) || now.isAfter(dayEnd)) {\n      return null;\n    }\n\n    // Check if current time is within the visible hours\n    if (now.hour < startHour || now.hour >= endHour) {\n      return null;\n    }\n\n    // Calculate position as percentage within the visible time range\n    const currentMinutes = now.hour * 60 + now.minute;\n    const startMinutes = startHour * 60;\n    const endMinutes = endHour * 60;\n    const totalMinutes = endMinutes - startMinutes;\n\n    const positionInMinutes = currentMinutes - startMinutes;\n    return (positionInMinutes / totalMinutes) * 100;\n  }\n\n  protected getCurrentTimePositionWithOffset(): string | null {\n    const position = this.getCurrentTimePosition();\n    if (position === null) {\n      return null;\n    }\n\n    // For day view, calculate the vertical position (top) for the horizontal line\n    // based on the current time within the visible hours\n    const currentMinutes =\n      this.calendarService.create(new Date(), this.calendar()).hour * 60 +\n      this.calendarService.create(new Date(), this.calendar()).minute;\n    const startMinutes = this.startDayHour() * 60;\n    const positionInMinutes = currentMinutes - startMinutes;\n    const blockHeight = 30; // 30 minutes per block\n    const blocksFromStart = positionInMinutes / blockHeight;\n\n    return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${blocksFromStart} + 1px)`;\n  }\n\n  ngAfterViewInit() {\n    // Auto-scroll to current time when available using ResizeObserver\n    this.resizeObserverCleanup = this.setupCurrentTimeScroll();\n\n    // Register cleanup with DestroyRef\n    this.destroyRef.onDestroy(() => {\n      this.resizeObserverCleanup?.();\n    });\n  }\n\n  ngOnDestroy() {\n    this.resizeObserverCleanup?.();\n  }\n\n  private setupCurrentTimeScroll(): (() => void) | undefined {\n    if (!this.showCurrentTimeIndicator() || !this.scrollToCurrentTimeIndicator()) {\n      return undefined;\n    }\n\n    const currentPosition = this.getCurrentTimePosition();\n    if (currentPosition === null) {\n      return undefined;\n    }\n\n    const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n    if (!timeLineElement) {\n      return undefined;\n    }\n\n    // Use ResizeObserver to detect when the element is properly rendered\n    const resizeObserver = new ResizeObserver((entries) => {\n      for (const entry of entries) {\n        if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n          // Element has proper dimensions, scroll to it\n          timeLineElement.scrollIntoView({\n            behavior: 'smooth',\n            block: 'center',\n            inline: 'nearest',\n          });\n          // Disconnect observer after successful scroll\n          resizeObserver.disconnect();\n          break;\n        }\n      }\n    });\n\n    resizeObserver.observe(timeLineElement);\n\n    // Return cleanup function\n    return () => resizeObserver.disconnect();\n  }\n\n  protected getSlotId(e: PointerEvent) {\n    const dropListElement = this.document\n      .elementsFromPoint(e.clientX, e.clientY)\n      .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n    this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n  }\n}\n","<div class=\"ax-scheduler-day-header\">\n  <div class=\"ax-scheduler-day-header-table\" aria-hidden=\"true\">\n    <div>\n      {{ '@acorex:dateTime.duration.all-day' | translate | async }}\n    </div>\n  </div>\n  <div\n    axDropZone\n    #zone=\"axDropZone\"\n    (onElementDrop)=\"handleAllDayDrop($event)\"\n    [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n    (click)=\"handleAllDaySlotEvent($event)\"\n    (dblclick)=\"handleAllDaySlotEvent($event)\"\n    (contextmenu)=\"handleAllDaySlotEvent($event)\"\n    class=\"ax-scheduler-day-header-table-container\"\n    [attr.data-slot-id]=\"date().format('YYYYMMDD') + '-allday'\"\n  >\n    <div class=\"ax-scheduler-day-header-appointment-container\">\n      @if (allDayAppointments().length) {\n        <div\n          axDrag\n          [dragCursor]=\"'grab'\"\n          [dragTransition]=\"false\"\n          [dragElementClone]=\"true\"\n          [dragStartDelay]=\"dragStartDelay()\"\n          [dragDisabled]=\"!draggable() || allDayAppointments()[0].readonly || readonly()\"\n          (pointerdown)=\"getSlotId($event)\"\n          [dragData]=\"allDayAppointments()[0]\"\n          (click)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n          (dblclick)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n          (contextmenu)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n          [title]=\"tooltipTemplate() ? '' : allDayAppointments()[0].title\"\n          class=\"ax-scheduler-header-day-appointment\"\n          [class.ax-continuation-from-previous]=\"allDayAppointments()[0].isContinuationFromPreviousDay\"\n          [class.ax-continuation-to-next]=\"allDayAppointments()[0].isContinuationToNextDay\"\n          [class.ax-state-active]=\"isActive(allDayAppointments()[0].id)\"\n          [class]=\"\n            allDayAppointments()[0].cssClass ??\n            'ax-scheduler-' + (allDayAppointments()[0].priority ?? 'primary') + '-priority'\n          \"\n          [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n          [axTooltipContext]=\"allDayAppointments()[0]\"\n          [axTooltip]=\"tooltipTemplate()\"\n        >\n          <ax-title>\n            <span class=\"ax-scheduler-truncate\">{{ allDayAppointments()[0].title }}</span>\n            @if (hasActions()) {\n              <ax-icon\n                (click)=\"handleActionClick($event, allDayAppointments()[0])\"\n                class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n              >\n              </ax-icon>\n            }\n          </ax-title>\n          <ax-subtitle>\n            {{ allDayAppointments()[0].startDate | format: 'date' : { calendar: calendar() } | async }}\n            -\n            {{ allDayAppointments()[0].endDate | format: 'date' : { calendar: calendar() } | async }}\n          </ax-subtitle>\n        </div>\n      }\n      @if (allDayAppointments().length > 1) {\n        <div\n          #moreAppointments\n          class=\"ax-scheduler-day-header-more-tag\"\n          [class]=\"\n            allDayAppointments()[1].cssClass ??\n            'ax-scheduler-' + (allDayAppointments()[1].priority ?? 'primary') + '-priority'\n          \"\n        >\n          {{\n            '@acorex:common.general.more-items'\n              | translate: { params: { number: allDayAppointments().length - 1 } }\n              | async\n          }}\n        </div>\n        <ax-popover [target]=\"moreAppointments\">\n          <div class=\"ax-scheduler-popover\" [class.ax-state-readonly]=\"readonly()\" axDropZone>\n            @for (appointment of allDayAppointments(); track appointment.id; let first = $first) {\n              @if (!first) {\n                <div\n                  axDrag\n                  [dragCursor]=\"'grab'\"\n                  [dragData]=\"appointment\"\n                  [dragTransition]=\"false\"\n                  [dragElementClone]=\"true\"\n                  [dragStartDelay]=\"dragStartDelay()\"\n                  [dragDisabled]=\"!draggable() || appointment.readonly || readonly()\"\n                  (click)=\"handleAppointmentEvent($event, appointment)\"\n                  (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n                  (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n                  [title]=\"tooltipTemplate() ? '' : appointment.title\"\n                  class=\"ax-scheduler-popover-appointment\"\n                  [class.ax-continuation-from-previous]=\"appointment.isContinuationFromPreviousDay\"\n                  [class.ax-continuation-to-next]=\"appointment.isContinuationToNextDay\"\n                  [class.ax-state-active]=\"isActive(appointment.id)\"\n                  [class]=\"appointment.cssClass ?? 'ax-scheduler-' + (appointment.priority ?? 'primary') + '-priority'\"\n                  [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                  [axTooltipContext]=\"appointment\"\n                  [axTooltip]=\"tooltipTemplate()\"\n                >\n                  <ax-title>\n                    @if (appointment.isContinuationFromPreviousDay) {\n                      <span class=\"ax-continuation-arrow\">{{ rtl() ? '→ ' : '← ' }}</span>\n                    }\n                    <span class=\"ax-scheduler-truncate\">{{ appointment.title }}</span>\n                    @if (appointment.isContinuationToNextDay) {\n                      <span class=\"ax-continuation-arrow\">{{ rtl() ? ' ←' : ' →' }}</span>\n                    }\n                    @if (hasActions()) {\n                      <ax-icon\n                        (click)=\"handleActionClick($event, appointment)\"\n                        class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                      >\n                      </ax-icon>\n                    }\n                  </ax-title>\n                  <ax-subtitle>\n                    {{ appointment.originalStartDate | format: 'date' : { calendar: calendar() } | async }}\n                    -\n                    {{ appointment.originalEndDate | format: 'date' : { calendar: calendar() } | async }}\n                  </ax-subtitle>\n                </div>\n              }\n            }\n          </div>\n        </ax-popover>\n      }\n    </div>\n  </div>\n</div>\n\n<div class=\"ax-scheduler-day-time-container\">\n  <table class=\"ax-scheduler-day-time\" aria-hidden=\"true\" [border]=\"1\">\n    @for (time of hoursArray(); track time.date.getTime()) {\n      <div>\n        {{ time | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n      </div>\n    }\n  </table>\n  <div class=\"ax-scheduler-day-table-container\">\n    <!-- Current Time Line Indicator -->\n    @if (showCurrentTimeIndicator() && getCurrentTimePositionWithOffset() !== null) {\n      <div\n        #currentTimeLine\n        class=\"ax-scheduler-current-time-line\"\n        [style.inset-block-start]=\"getCurrentTimePositionWithOffset()\"\n      ></div>\n    }\n    <div class=\"ax-scheduler-day-appointment-container\">\n      @for (appointment of singleDayAppointments(); track appointment.id) {\n        <div\n          axDrag\n          [dragCursor]=\"'grab'\"\n          [dragData]=\"appointment\"\n          [dragTransition]=\"false\"\n          [dragElementClone]=\"true\"\n          [dragStartDelay]=\"dragStartDelay()\"\n          [dragDisabled]=\"!draggable() || appointment.readonly || readonly()\"\n          (pointerdown)=\"getSlotId($event)\"\n          (click)=\"handleAppointmentEvent($event, appointment)\"\n          (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n          (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n          [title]=\"tooltipTemplate() ? '' : appointment.title\"\n          class=\"ax-scheduler-day-appointment\"\n          [class.ax-continuation-from-previous]=\"appointment.isContinuationFromPreviousDay\"\n          [class.ax-continuation-to-next]=\"appointment.isContinuationToNextDay\"\n          [class.ax-state-active]=\"isActive(appointment.id)\"\n          [style.width]=\"getAppointmentWidth(appointment.id)\"\n          [style.height]=\"getAppointmentHeight(appointment.id)\"\n          [style.inset-block-start]=\"getAppointmentTop(appointment.id)\"\n          [style.inset-inline-start]=\"getAppointmentLeft(appointment.id)\"\n          [class]=\"appointment.cssClass ?? 'ax-scheduler-' + (appointment.priority ?? 'primary') + '-priority'\"\n          [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n          [axTooltipContext]=\"appointment\"\n          [axTooltip]=\"tooltipTemplate()\"\n        >\n          <ax-title>\n            <span class=\"ax-scheduler-truncate\">{{ appointment.title }}</span>\n            @if (hasActions()) {\n              <ax-icon\n                (click)=\"handleActionClick($event, appointment)\"\n                class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n              >\n              </ax-icon>\n            }\n          </ax-title>\n          <ax-subtitle>\n            {{ appointment.originalStartDate | format: 'time' : { calendar: calendar() } | async }} -\n            {{ appointment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n          </ax-subtitle>\n        </div>\n      }\n    </div>\n    <div aria-hidden=\"true\" class=\"ax-scheduler-day-slot\">\n      @for (time of hoursArray(); track time.date.getTime()) {\n        <div\n          axDropZone\n          #zone=\"axDropZone\"\n          (onElementDrop)=\"handleSingleDayDrop($event, time)\"\n          [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n          (click)=\"handleSingleSlotEvent($event, time)\"\n          (dblclick)=\"handleSingleSlotEvent($event, time)\"\n          (contextmenu)=\"handleSingleSlotEvent($event, time)\"\n          [attr.data-slot-id]=\"time.format('YYYYMMDD-HHmm')\"\n        ></div>\n        <div\n          axDropZone\n          #zone2=\"axDropZone\"\n          [class.ax-scheduler-slot-hovered]=\"zone2.isHovered()\"\n          (onElementDrop)=\"handleSingleDayDrop($event, time.add('minute', 30))\"\n          (click)=\"handleSingleSlotEvent($event, time.add('minute', 30))\"\n          (dblclick)=\"handleSingleSlotEvent($event, time.add('minute', 30))\"\n          (contextmenu)=\"handleSingleSlotEvent($event, time.add('minute', 30))\"\n          [attr.data-slot-id]=\"time.add('minute', 30).format('YYYYMMDD-HHmm')\"\n        ></div>\n      }\n    </div>\n  </div>\n</div>\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXLocaleService } from '@acorex/core/locale';\nimport { AXTranslatorPipe, resolveMultiLanguageString } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n  Component,\n  computed,\n  DOCUMENT,\n  inject,\n  input,\n  output,\n  signal,\n  TemplateRef,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport { AXDayOfWeekName, AXSchedulerAppointment, AXSchedulerAppointmentSegment } from '../../scheduler.class'; // Adjust path\nimport {\n  AXSchedulerAppointmentMouseEvent,\n  AXSchedulerComponent,\n  AXSchedulerSlotDropEvent,\n  AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n// --- Types specific to Month View Layout ---\n// Represents a single day cell in the month grid\nexport type AXSchedulerMonthDayCell = {\n  date: AXDateTime;\n  isCurrentMonth: boolean;\n  isToday: boolean;\n  isHoliday: boolean;\n  holidayTitle?: string;\n  holidayDescription?: string;\n  holidayCssClass?: string;\n  holidayColor?: string;\n  appointments: AXSchedulerAppointmentSegment[]; // All single-day appointments for this day\n  visibleAppointments: AXSchedulerAppointmentSegment[]; // Single-day appointments to display as chips\n  hiddenAppointments: AXSchedulerAppointmentSegment[]; // Single-day appointments hidden behind the badge\n  overflowCount: number; // Count of hidden single-day appointments\n  gridIndex: number; // The index of this day cell in the grid (0-based)\n};\n\n// Represents a multi-day appointment that spans across multiple day cells\nexport type AXSchedulerSpanningAppointment = {\n  appointment: AXSchedulerAppointment;\n  gridStartIndex: number; // Grid cell index where this appointment starts (0-based)\n  spanCount: number; // Number of cells this appointment spans\n  rowIndex: number; // Row index for stacking multiple spanning appointments\n  isStartClipped: boolean; // True if appointment starts before the visible grid\n  isEndClipped: boolean; // True if appointment extends beyond the visible grid\n};\n\n@Component({\n  selector: 'ax-scheduler-month-view',\n  templateUrl: './scheduler-month-view.component.html',\n  styleUrl: './scheduler-month-view.component.css',\n\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    '[class.ax-state-readonly]': 'readonly()',\n  },\n  imports: [\n    AsyncPipe,\n    AXFormatPipe,\n    AXDragDirective,\n    AXTranslatorPipe,\n    AXPopoverComponent,\n    AXTooltipDirective,\n    AXDropZoneDirective,\n    AXDecoratorIconComponent,\n  ],\n  providers: [{ provide: AXComponent, useExisting: AXSchedulerMonthViewComponent }],\n})\nexport class AXSchedulerMonthViewComponent extends NXComponent {\n  private document = inject(DOCUMENT);\n  private scheduler = inject(AXSchedulerComponent);\n  private calendarService = inject(AXCalendarService);\n  private localeService = inject(AXLocaleService);\n  private schedulerService = inject(AXSchedulerService);\n\n  // --- Inputs ---\n  readonly = input(false);\n  draggable = input(true);\n  hasActions = input(false);\n  dragStartDelay = input(0);\n  calendar = input<string>();\n  date = input.required<AXDateTime>();\n  appointments = input<AXSchedulerAppointment[]>([]);\n  firstDayOfWeek = input<AXDayOfWeekName>();\n  selectedAppointmentId = input<string | number | null>(null);\n\n  protected isActive(appointmentId: string | number): boolean {\n    return this.selectedAppointmentId() === appointmentId;\n  }\n  tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n  // --- Constants ---\n  readonly DAYS_IN_WEEK = 7;\n  readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 2;\n\n  private dragStartSlotId = signal<string | null>(null);\n\n  // Internal outputs to be caught by parent AXSchedulerComponent\n  slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n  onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n  // --- Event Handlers ---\n  private readonly eventOutputMap = {\n    slot: {\n      click: this.slotClickedInternal,\n      dblclick: this.slotDblClickedInternal,\n      contextmenu: this.slotRightClickedInternal,\n    },\n    appointment: {\n      click: this.appointmentClickedInternal,\n      dblclick: this.appointmentDblClickedInternal,\n      contextmenu: this.appointmentRightClickedInternal,\n    },\n  };\n  protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentSegmentOrOriginal: AXSchedulerAppointment) {\n    const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentSegmentOrOriginal);\n    const appointmentRef = {\n      ...originalAppointment,\n      endDate: originalAppointment.endDate,\n      startDate: originalAppointment.startDate,\n    };\n    this.schedulerService.handleEvent(\n      { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n      this.eventOutputMap,\n      'appointment',\n    );\n  }\n  protected handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n    const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'month'); // Ensure it's start of day\n    if (slotData) {\n      this.schedulerService.handleEvent(\n        { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n        this.eventOutputMap,\n        'slot',\n      );\n    }\n  }\n  protected handleDrop(e: AXDropZoneDropEvent, date: AXDateTime) {\n    const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'month');\n    const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n    const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n    const appointmentRef = {\n      ...originalAppointment,\n      endDate: originalAppointment.endDate,\n      startDate: originalAppointment.startDate,\n    };\n    this.onAppointmentDropInternal.emit({\n      dropEvent: e,\n      slot: slotData,\n      sender: this.scheduler,\n      appointment: appointmentRef,\n      isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n    });\n  }\n  protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n    event.stopPropagation();\n    const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n    this.onActionClickInternal.emit({\n      appointment: originalAppointment,\n      nativeEvent: event,\n      sender: this.scheduler,\n    });\n  }\n\n  // --- Base Computeds ---\n  // Calculate the start of the month based on the input date\n  private monthStartDate = computed(() => {\n    const d = this.date();\n    return d ? d.startOf('month') : null;\n  });\n\n  // Generate the list of weekday names based on the firstDayOfWeek\n  protected daysArray = computed(() => {\n    const currentDate = this.date();\n    const headerStartDate = this.schedulerService.alignToWeekStart(currentDate, {\n      firstDayOfWeek: this.firstDayOfWeek(),\n    });\n    return Array.from({ length: 7 }, (_, index) => headerStartDate.add('day', index));\n  });\n\n  // --- Calendar Grid Calculation ---\n  private calendarDaysInfo = computed(() => {\n    const monthStart = this.monthStartDate();\n    if (!monthStart) return { days: [], weeksNeeded: 0 };\n\n    const locale = this.localeService.activeProfile().localeInfo.code;\n\n    const firstDayOfMonth = monthStart;\n    const lastDayOfMonth = monthStart.endOf('month');\n\n    const firstDayOfGrid = this.schedulerService.alignToWeekStart(firstDayOfMonth, {\n      firstDayOfWeek: this.firstDayOfWeek(),\n    });\n\n    const leadingDays = Math.round(\n      (firstDayOfMonth.startOf('day').date.getTime() - firstDayOfGrid.startOf('day').date.getTime()) /\n        this.schedulerService.MILLISECONDS_PER_DAY,\n    );\n\n    // Determine how many total days to show to fill out the weeks\n    // A common approach is 6 weeks to ensure consistency, but your dynamic weeksNeeded is fine too.\n    // Let's stick to your dynamic `weeksNeeded` and `totalDaysToGenerate`\n    const daysInMonth = lastDayOfMonth.dayOfMonth;\n    const totalCellsMinimum = leadingDays + daysInMonth;\n    const weeksNeededDynamic = Math.ceil(totalCellsMinimum / this.DAYS_IN_WEEK);\n    const actualWeeksToShow = Math.max(4, Math.min(weeksNeededDynamic, 6)); // Clamp weeks\n    const totalDaysToGenerate = actualWeeksToShow * this.DAYS_IN_WEEK;\n\n    const days: {\n      date: AXDateTime;\n      isCurrentMonth: boolean;\n      isToday: boolean;\n      isHoliday: boolean;\n      holidayTitle?: string;\n      holidayDescription?: string;\n      holidayCssClass?: string;\n      holidayColor?: string;\n    }[] = [];\n    const today = this.calendarService.create(new Date());\n    let currentDay = firstDayOfGrid;\n\n    for (let i = 0; i < totalDaysToGenerate; i++) {\n      const isHoliday =\n        this.schedulerService.isHoliday(currentDay) || this.schedulerService.isWeekend(currentDay, this.calendar());\n\n      let holidayTitle: null | string = null;\n      let holidayDescription: null | string = null;\n      let holidayCssClass: null | string = null;\n      let holidayColor: null | string = null;\n      if (isHoliday) {\n        const globalHoliday = this.calendarService.holidays.find((d) => currentDay.equal(d.date, 'day'));\n        const internalHoliday = this.schedulerService.internalHoliday().find((d) => currentDay.equal(d.date, 'day'));\n        const holiday = globalHoliday || internalHoliday;\n        if (holiday) {\n          holidayTitle = resolveMultiLanguageString(holiday.title, locale) || null;\n          holidayDescription = resolveMultiLanguageString(holiday.description ?? holiday.title, locale) || null;\n          holidayCssClass = holiday.cssClass;\n          holidayColor = holiday.color ?? null;\n        }\n      }\n\n      days.push({\n        date: currentDay,\n        isCurrentMonth: currentDay.monthOfYear === monthStart.monthOfYear,\n        isToday: currentDay.equal(today, 'day'),\n        isHoliday,\n        holidayTitle,\n        holidayDescription,\n        holidayCssClass,\n        holidayColor,\n      });\n      currentDay = currentDay.add('day', 1);\n    }\n    return { days: days, weeksNeeded: actualWeeksToShow };\n  });\n\n  // --- Multi-day Appointment Detection ---\n  // Determines if an appointment spans more than one day\n  private isMultiDayAppointment(appointment: AXSchedulerAppointment): boolean {\n    const startDate = this.calendarService.create(appointment.startDate);\n    const endDate = this.calendarService.create(appointment.endDate);\n    return !startDate.startOf('day').equal(endDate.startOf('day'), 'day');\n  }\n\n  // Calculate spanning appointments with their grid positions\n  protected spanningAppointments = computed<AXSchedulerSpanningAppointment[]>(() => {\n    const { days } = this.calendarDaysInfo();\n    if (days.length === 0) return [];\n\n    const allAppointments = this.appointments();\n    if (!allAppointments || allAppointments.length === 0) return [];\n\n    const gridStartDate = days[0].date.startOf('day');\n    const gridEndDate = days[days.length - 1].date.endOf('day');\n    const totalGridCells = days.length;\n\n    // Filter to get only multi-day appointments\n    const multiDayAppts = allAppointments.filter((appt) => {\n      if (!appt.startDate || !appt.endDate) return false;\n      return this.isMultiDayAppointment(appt);\n    });\n\n    if (multiDayAppts.length === 0) return [];\n\n    // Sort multi-day appointments by start date, then by duration (longer first)\n    const sortedAppts = orderBy(\n      multiDayAppts,\n      [\n        (a) => a.startDate.getTime(),\n        (a) => a.endDate.getTime() - a.startDate.getTime(),\n        (a) => a.title?.toLowerCase() ?? '',\n      ],\n      ['asc', 'desc', 'asc'],\n    );\n\n    const spanningResult: AXSchedulerSpanningAppointment[] = [];\n    // Track which cells are occupied at each row level (for stacking)\n    const rowOccupancy: Map<number, Set<number>> = new Map();\n\n    for (const appt of sortedAppts) {\n      const apptStart = this.calendarService.create(appt.startDate).startOf('day');\n      const apptEnd = this.calendarService.create(appt.endDate).startOf('day');\n\n      // Check if appointment overlaps with the grid\n      if (apptEnd.compare(gridStartDate, 'day') < 0 || apptStart.compare(gridEndDate, 'day') > 0) {\n        continue;\n      }\n\n      // Calculate grid start index (clamped to grid bounds)\n      let gridStartIndex = 0;\n      let isStartClipped = false;\n      if (apptStart.compare(gridStartDate, 'day') < 0) {\n        gridStartIndex = 0;\n        isStartClipped = true;\n      } else {\n        // Calculate the difference in days\n        gridStartIndex = Math.floor(apptStart.duration(gridStartDate).total.days);\n      }\n\n      // Calculate grid end index (clamped to grid bounds)\n      let gridEndIndex = totalGridCells - 1;\n      let isEndClipped = false;\n      if (apptEnd.compare(gridEndDate, 'day') > 0) {\n        gridEndIndex = totalGridCells - 1;\n        isEndClipped = true;\n      } else {\n        gridEndIndex = Math.floor(apptEnd.duration(gridStartDate).total.days);\n      }\n\n      // Ensure valid indices\n      gridStartIndex = Math.max(0, Math.min(gridStartIndex, totalGridCells - 1));\n      gridEndIndex = Math.max(gridStartIndex, Math.min(gridEndIndex, totalGridCells - 1));\n\n      const spanCount = gridEndIndex - gridStartIndex + 1;\n\n      // Find the first available row for this appointment\n      let rowIndex = 0;\n      let foundRow = false;\n\n      while (!foundRow) {\n        if (!rowOccupancy.has(rowIndex)) {\n          rowOccupancy.set(rowIndex, new Set());\n        }\n        const occupiedCells = rowOccupancy.get(rowIndex) ?? new Set<number>();\n\n        // Check if any cell in the span range is occupied\n        let hasConflict = false;\n        for (let cellIdx = gridStartIndex; cellIdx <= gridEndIndex; cellIdx++) {\n          if (occupiedCells.has(cellIdx)) {\n            hasConflict = true;\n            break;\n          }\n        }\n\n        if (!hasConflict) {\n          // Mark cells as occupied\n          for (let cellIdx = gridStartIndex; cellIdx <= gridEndIndex; cellIdx++) {\n            occupiedCells.add(cellIdx);\n          }\n          foundRow = true;\n        } else {\n          rowIndex++;\n        }\n      }\n\n      spanningResult.push({\n        appointment: appt,\n        gridStartIndex,\n        spanCount,\n        rowIndex,\n        isStartClipped,\n        isEndClipped,\n      });\n    }\n\n    return spanningResult;\n  });\n\n  // Get the set of multi-day appointment IDs for exclusion from per-day rendering\n  private multiDayAppointmentIds = computed<Set<any>>(() => {\n    const spanning = this.spanningAppointments();\n    return new Set(spanning.map((s) => s.appointment.id));\n  });\n\n  // --- Day Cell Layout Calculation ---\n  protected dayCellLayouts = computed<AXSchedulerMonthDayCell[]>(() => {\n    const { days: initialDaysInfo } = this.calendarDaysInfo();\n    const allOriginalAppointments = this.appointments();\n    const multiDayIds = this.multiDayAppointmentIds();\n\n    if (initialDaysInfo.length === 0) {\n      return []; // Return empty array if no days to process\n    }\n    if (!allOriginalAppointments || allOriginalAppointments.length === 0) {\n      // If no appointments, map initialDaysInfo to the full structure with empty appointment arrays\n      return initialDaysInfo.map((dayInfo, gridIndex) => ({\n        ...dayInfo,\n        appointments: [],\n        visibleAppointments: [],\n        hiddenAppointments: [],\n        overflowCount: 0,\n        gridIndex,\n      }));\n    }\n\n    // Filter out multi-day appointments from single-day processing\n    const singleDayAppointments = allOriginalAppointments.filter((appt) => !multiDayIds.has(appt.id));\n\n    return initialDaysInfo.map((dayInfo, gridIndex) => {\n      const dayAsStartOfDay = dayInfo.date.startOf('day');\n      const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n\n      for (const appt of singleDayAppointments) {\n        const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(\n          appt,\n          dayAsStartOfDay,\n          0, // viewStartHour for month cell context (full day)\n          24, // viewEndHour for month cell context (full day)\n          true, // isFullDayCellContext = true\n        );\n        if (segment) {\n          segmentsForThisDay.push(segment);\n        }\n      }\n\n      const sortedSegments = orderBy(\n        segmentsForThisDay,\n        [\n          (s) => (s.allDay ? 0 : 1), // Segments marked as allDay first\n          (s) => s.originalStartDate.getTime(), // Then by original start time\n          (s) => s.originalEndDate.getTime() - s.originalStartDate.getTime(), // Then by duration (longer first)\n          (s) => s.title?.toLowerCase() ?? '', // Then by title\n        ],\n        ['asc', 'asc', 'desc', 'asc'],\n      );\n\n      const visibleAppointments = sortedSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n      const hiddenAppointments = sortedSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n      const overflowCount = hiddenAppointments.length;\n\n      return {\n        ...dayInfo,\n        appointments: sortedSegments,\n        visibleAppointments,\n        hiddenAppointments,\n        overflowCount,\n        gridIndex,\n      };\n    });\n  });\n\n  // --- Dynamic Grid Rows ---\n  protected gridTemplateRowsStyle = computed(() => {\n    const { weeksNeeded } = this.calendarDaysInfo();\n    if (!weeksNeeded || weeksNeeded <= 0) {\n      return `repeat(6, minmax(0, 1fr))`; // Fallback, ensures grid is at least somewhat sensible\n    }\n    return `repeat(${weeksNeeded}, minmax(0, 1fr))`; // Use 1fr for equal distribution\n  });\n\n  protected getSlotId(e: PointerEvent) {\n    const dropListElement = this.document\n      .elementsFromPoint(e.clientX, e.clientY)\n      .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n    this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n  }\n\n  // Calculate CSS styles for a spanning appointment\n  protected getSpanningAppointmentStyle(spanning: AXSchedulerSpanningAppointment): Record<string, string> {\n    const { gridStartIndex, spanCount, rowIndex } = spanning;\n\n    // Calculate column position (1-based for CSS Grid)\n    const columnStart = (gridStartIndex % this.DAYS_IN_WEEK) + 1;\n    const rowStart = Math.floor(gridStartIndex / this.DAYS_IN_WEEK) + 1;\n\n    // Calculate how many cells we can span within the same row\n    const cellsRemainingInRow = this.DAYS_IN_WEEK - (columnStart - 1);\n    const effectiveSpan = Math.min(spanCount, cellsRemainingInRow);\n\n    return {\n      'grid-column': `${columnStart} / span ${effectiveSpan}`,\n      'grid-row': `${rowStart}`,\n      '--spanning-row-index': `${rowIndex}`,\n    };\n  }\n\n  // Group spanning appointments by their week row for proper rendering\n  protected spanningAppointmentsByWeekRow = computed<Map<number, AXSchedulerSpanningAppointment[]>>(() => {\n    const spanning = this.spanningAppointments();\n    const { days } = this.calendarDaysInfo();\n\n    if (spanning.length === 0 || days.length === 0) return new Map();\n\n    const result = new Map<number, AXSchedulerSpanningAppointment[]>();\n\n    for (const appt of spanning) {\n      // An appointment might span multiple week rows, so we need to split it\n      let remainingSpan = appt.spanCount;\n      let currentGridIndex = appt.gridStartIndex;\n      let isFirstSegment = true;\n\n      while (remainingSpan > 0) {\n        const weekRowIndex = Math.floor(currentGridIndex / this.DAYS_IN_WEEK);\n        const columnInRow = currentGridIndex % this.DAYS_IN_WEEK;\n        const cellsRemainingInRow = this.DAYS_IN_WEEK - columnInRow;\n        const spanInThisRow = Math.min(remainingSpan, cellsRemainingInRow);\n        const isLastSegment = remainingSpan <= cellsRemainingInRow;\n\n        const segmentAppt: AXSchedulerSpanningAppointment = {\n          appointment: appt.appointment,\n          gridStartIndex: currentGridIndex,\n          spanCount: spanInThisRow,\n          rowIndex: appt.rowIndex,\n          // Start clipped if: original was clipped OR this is a continuation segment (not first)\n          isStartClipped: (appt.isStartClipped && isFirstSegment) || !isFirstSegment,\n          // End clipped if: original was clipped OR this segment continues to next row (not last)\n          isEndClipped: (appt.isEndClipped && isLastSegment) || !isLastSegment,\n        };\n\n        if (!result.has(weekRowIndex)) {\n          result.set(weekRowIndex, []);\n        }\n        const weekRowAppts = result.get(weekRowIndex);\n        if (weekRowAppts) {\n          weekRowAppts.push(segmentAppt);\n        }\n\n        remainingSpan -= spanInThisRow;\n        currentGridIndex += spanInThisRow;\n        isFirstSegment = false;\n      }\n    }\n\n    return result;\n  });\n\n  // Get the number of week rows in the current month view\n  protected weekRowsArray = computed<number[]>(() => {\n    const { weeksNeeded } = this.calendarDaysInfo();\n    return Array.from({ length: weeksNeeded }, (_, i) => i);\n  });\n\n  // Get spanning appointments for a specific week row\n  protected getSpanningAppointmentsForWeekRow(weekRowIndex: number): AXSchedulerSpanningAppointment[] {\n    return this.spanningAppointmentsByWeekRow().get(weekRowIndex) ?? [];\n  }\n\n  // Calculate the maximum row index (number of stacked spanning appointments - 1) for each week row\n  protected maxSpanningRowsPerWeek = computed<Map<number, number>>(() => {\n    const byWeekRow = this.spanningAppointmentsByWeekRow();\n    const result = new Map<number, number>();\n\n    for (const [weekRowIndex, appointments] of byWeekRow.entries()) {\n      let maxRowIndex = 0;\n      for (const appt of appointments) {\n        if (appt.rowIndex > maxRowIndex) {\n          maxRowIndex = appt.rowIndex;\n        }\n      }\n      result.set(weekRowIndex, maxRowIndex + 1); // +1 to get count from 0-based index\n    }\n\n    return result;\n  });\n\n  // Get the number of spanning appointment rows for a specific day cell\n  protected getSpanningRowsCountForDayCell(gridIndex: number): number {\n    const weekRowIndex = Math.floor(gridIndex / this.DAYS_IN_WEEK);\n    return this.maxSpanningRowsPerWeek().get(weekRowIndex) ?? 0;\n  }\n}\n","<div class=\"ax-scheduler-month-container\">\n  <!-- Weekday Header -->\n  <div class=\"ax-scheduler-month-weekdays\">\n    @for (day of daysArray(); track day.date.getTime()) {\n      <div class=\"ax-scheduler-month-weekday\">\n        {{ day | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n      </div>\n    }\n  </div>\n\n  <!-- Calendar Grid Wrapper -->\n  <div class=\"ax-scheduler-month-grid-wrapper\">\n    <!-- Spanning Appointments Layer -->\n    <div class=\"ax-scheduler-month-spanning-layer\" [style.gridTemplateRows]=\"gridTemplateRowsStyle()\">\n      @for (weekRowIndex of weekRowsArray(); track weekRowIndex) {\n        <div class=\"ax-scheduler-month-spanning-week-row\">\n          @for (\n            spanning of getSpanningAppointmentsForWeekRow(weekRowIndex);\n            track spanning.appointment.id + spanning.gridStartIndex\n          ) {\n            <div\n              axDrag\n              [dragCursor]=\"'grab'\"\n              [dragData]=\"spanning.appointment\"\n              [dragTransition]=\"false\"\n              [dragElementClone]=\"true\"\n              [dragStartDelay]=\"dragStartDelay()\"\n              [dragDisabled]=\"!draggable() || spanning.appointment.readonly || readonly()\"\n              (pointerdown)=\"getSlotId($event)\"\n              (click)=\"handleAppointmentEvent($event, spanning.appointment)\"\n              (dblclick)=\"handleAppointmentEvent($event, spanning.appointment)\"\n              (contextmenu)=\"handleAppointmentEvent($event, spanning.appointment)\"\n              [title]=\"\n                tooltipTemplate()\n                  ? ''\n                  : spanning.appointment.title +\n                    ' (' +\n                    (spanning.appointment.startDate\n                      | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                      | async) +\n                    ' - ' +\n                    (spanning.appointment.endDate\n                      | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                      | async) +\n                    ')'\n              \"\n              class=\"ax-scheduler-month-spanning-appointment\"\n              [class.ax-spanning-start-clipped]=\"spanning.isStartClipped\"\n              [class.ax-spanning-end-clipped]=\"spanning.isEndClipped\"\n              [class.ax-state-active]=\"isActive(spanning.appointment.id)\"\n              [class]=\"\n                spanning.appointment.cssClass ??\n                'ax-scheduler-' + (spanning.appointment.priority ?? 'primary') + '-priority'\n              \"\n              [style.grid-column]=\"(spanning.gridStartIndex % 7) + 1 + ' / span ' + spanning.spanCount\"\n              [style.grid-row]=\"spanning.rowIndex + 1\"\n              [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n              [axTooltip]=\"tooltipTemplate()\"\n              [axTooltipContext]=\"spanning.appointment\"\n            >\n              <span class=\"ax-spanning-appointment-title\">\n                <span class=\"ax-scheduler-truncate\">{{ spanning.appointment.title }}</span>\n                @if (hasActions()) {\n                  <ax-icon\n                    (click)=\"handleActionClick($event, spanning.appointment)\"\n                    class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                  >\n                  </ax-icon>\n                }\n              </span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n\n    <!-- Calendar Grid -->\n    <div class=\"ax-scheduler-month-grid\" [style.gridTemplateRows]=\"gridTemplateRowsStyle()\">\n      @for (dayCell of dayCellLayouts(); track dayCell.date.date.getTime()) {\n        <div\n          axDropZone\n          #zone=\"axDropZone\"\n          (onElementDrop)=\"handleDrop($event, dayCell.date)\"\n          [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n          (click)=\"handleSlotEvent($event, dayCell.date)\"\n          (dblclick)=\"handleSlotEvent($event, dayCell.date)\"\n          (contextmenu)=\"handleSlotEvent($event, dayCell.date)\"\n          class=\"ax-scheduler-month-day-cell {{\n            dayCell.isHoliday ? (dayCell.holidayCssClass ?? 'ax-state-holiday') : ''\n          }}\"\n          [style.--ax-scheduler-holiday-color]=\"dayCell.holidayColor ?? null\"\n          [class.ax-state-today]=\"dayCell.isToday\"\n          [class.ax-other-month]=\"!dayCell.isCurrentMonth\"\n          [attr.data-slot-id]=\"dayCell.date.format('YYYYMMDD')\"\n        >\n          <div class=\"ax-scheduler-month-day-header\">\n            <span class=\"ax-scheduler-month-day-number ax-scheduler-truncate\" [axTooltip]=\"dayCell.holidayDescription ?? ''\">\n              {{ dayCell.date.dayOfMonth }}\n\n              @if (dayCell.holidayTitle) {\n                ( {{ dayCell.holidayTitle }} )\n              }\n            </span>\n          </div>\n          <div\n            class=\"ax-scheduler-month-day-appointments\"\n            [style.--spanning-rows-count]=\"getSpanningRowsCountForDayCell(dayCell.gridIndex)\"\n          >\n            <!-- Visible Single-day Appointment Segments -->\n            @for (segment of dayCell.visibleAppointments; track segment.id + segment.originalStartDate) {\n              <div\n                axDrag\n                [dragCursor]=\"'grab'\"\n                [dragData]=\"segment\"\n                [dragTransition]=\"false\"\n                [dragElementClone]=\"true\"\n                [dragStartDelay]=\"dragStartDelay()\"\n                [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n                (pointerdown)=\"getSlotId($event)\"\n                (click)=\"handleAppointmentEvent($event, segment)\"\n                (dblclick)=\"handleAppointmentEvent($event, segment)\"\n                (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n                [title]=\"\n                  tooltipTemplate()\n                    ? ''\n                    : segment.title +\n                      (segment.allDay\n                        ? ''\n                        : ' (' +\n                          (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n                          ' - ' +\n                          (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n                          ')')\n                \"\n                [class.all-day-segment]=\"segment.allDay\"\n                class=\"ax-scheduler-month-appointment-chip\"\n                [class.ax-state-active]=\"isActive(segment.id)\"\n                [class]=\"segment.cssClass ?? 'ax-scheduler-' + (segment.priority ?? 'primary') + '-priority'\"\n                [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                [axTooltip]=\"tooltipTemplate()\"\n                [axTooltipContext]=\"segment\"\n              >\n                <span class=\"ax-appointment-chip-title\">\n                  <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n                  @if (hasActions()) {\n                    <ax-icon\n                      (click)=\"handleActionClick($event, segment)\"\n                      class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                    >\n                    </ax-icon>\n                  }\n                </span>\n                @if (!segment.allDay) {\n                  <span>\n                    {{ segment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n                    -\n                    {{ segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n                  </span>\n                }\n              </div>\n            }\n            <!-- Overflow Badge and Popover -->\n            @if (dayCell.overflowCount > 0) {\n              <div #moreAppointments class=\"ax-scheduler-month-overflow-badge\" (click)=\"$event.stopPropagation()\">\n                <!-- Stop propagation to prevent slot click -->\n                +{{\n                  '@acorex:common.general.more-items' | translate: { params: { number: dayCell.overflowCount } } | async\n                }}\n              </div>\n              <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n                <div\n                  axDropZone\n                  [class.ax-state-readonly]=\"readonly()\"\n                  class=\"ax-scheduler-popover ax-scheduler-month-popover-appointment\"\n                >\n                  @for (segment of dayCell.hiddenAppointments; track segment.id + segment.originalStartDate) {\n                    <div\n                      axDrag\n                      [dragCursor]=\"'grab'\"\n                      [dragData]=\"segment\"\n                      [dragTransition]=\"false\"\n                      [dragElementClone]=\"true\"\n                      [dragStartDelay]=\"dragStartDelay()\"\n                      [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n                      (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                      (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                      (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                      [title]=\"\n                        tooltipTemplate()\n                          ? ''\n                          : segment.title +\n                            (segment.allDay\n                              ? ''\n                              : ' (' +\n                                (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n                                ' - ' +\n                                (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n                                ')')\n                      \"\n                      class=\"ax-scheduler-popover-appointment\"\n                      [class.all-day-segment]=\"segment.allDay\"\n                      [class.ax-state-active]=\"isActive(segment.id)\"\n                      [class]=\"segment.cssClass ?? 'ax-scheduler-' + (segment.priority ?? 'primary') + '-priority'\"\n                      [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                      [axTooltip]=\"tooltipTemplate()\"\n                      [axTooltipContext]=\"segment\"\n                    >\n                      <span class=\"ax-appointment-chip-title\">\n                        <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n                        @if (hasActions()) {\n                          <ax-icon\n                            (click)=\"handleActionClick($event, segment)\"\n                            class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                          >\n                          </ax-icon>\n                        }\n                      </span>\n                      @if (!segment.allDay) {\n                        <span>\n                          {{\n                            segment.originalStartDate\n                              | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n                              | async\n                          }}\n                          -\n                          {{\n                            segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n                          }}\n                        </span>\n                      }\n                    </div>\n                  }\n                </div>\n              </ax-popover>\n            }\n          </div>\n        </div>\n      }\n    </div>\n  </div>\n</div>\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AsyncPipe, NgTemplateOutlet } from '@angular/common';\nimport {\n  AfterViewInit,\n  Component,\n  computed,\n  DestroyRef,\n  DOCUMENT,\n  ElementRef,\n  inject,\n  input,\n  OnDestroy,\n  output,\n  signal,\n  TemplateRef,\n  viewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { isEqual, orderBy } from 'lodash-es';\nimport {\n  AXSchedulerAppointment,\n  AXSchedulerAppointmentLayout,\n  AXSchedulerAppointmentSegment,\n  AXSchedulerResource,\n} from '../../scheduler.class';\nimport {\n  AXSchedulerAppointmentMouseEvent,\n  AXSchedulerComponent,\n  AXSchedulerSlotDropEvent,\n  AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n@Component({\n  selector: 'ax-scheduler-timeline-day-view',\n  templateUrl: './scheduler-timeline-day-view.component.html',\n  styleUrl: './scheduler-timeline-day-view.component.css',\n\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    '[class.ax-state-readonly]': 'readonly()',\n  },\n  imports: [\n    NgTemplateOutlet,\n    AsyncPipe,\n    AXFormatPipe,\n    AXDragDirective,\n    AXTooltipDirective,\n    AXDropZoneDirective,\n    AXDecoratorIconComponent,\n    AXDecoratorGenericComponent,\n  ],\n  providers: [{ provide: AXComponent, useExisting: AXSchedulerTimelineDayViewComponent }],\n})\nexport class AXSchedulerTimelineDayViewComponent extends NXComponent implements AfterViewInit, OnDestroy {\n  private document = inject(DOCUMENT);\n  private destroyRef = inject(DestroyRef);\n  private scheduler = inject(AXSchedulerComponent);\n  private calendarService = inject(AXCalendarService);\n  private schedulerService = inject(AXSchedulerService);\n\n  private resizeObserverCleanup?: () => void;\n\n  readonly GAP_PX = 1;\n\n  readonly = input(false);\n  draggable = input(true);\n  hasActions = input(false);\n  dragStartDelay = input(0);\n  calendar = input<string>();\n  showResourceHeaders = input(true);\n  date = input.required<AXDateTime>();\n  endDayHour = input.required<number>();\n  selectedAppointmentId = input<string | number | null>(null);\n\n  protected isActive(appointmentId: string | number): boolean {\n    return this.selectedAppointmentId() === appointmentId;\n  }\n  startDayHour = input.required<number>();\n  showUnassignedAppointments = input(true);\n  resources = input<AXSchedulerResource[]>([]);\n  showCurrentTimeIndicator = input<boolean>(true);\n  scrollToCurrentTimeIndicator = input<boolean>(false);\n  resourceTemplate = input<TemplateRef<unknown>>();\n  appointments = input<AXSchedulerAppointment[]>([]);\n  tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n  private dragStartSlotId = signal<string | null>(null);\n  private dragStartSlotResourceId = signal<any>(null);\n\n  currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n  /**\n   * Gets appointments grouped by resources for timeline view.\n   */\n  protected appointmentsByResource = computed(() => {\n    const allAppointments = this.appointments();\n    const resources = this.resources();\n    const showUnassigned = this.showUnassignedAppointments();\n\n    return this.schedulerService.filterAppointmentsByResources(allAppointments, resources, showUnassigned);\n  });\n\n  /**\n   * Gets all resource IDs including unassigned if applicable.\n   */\n  protected resourceIds = computed(() => {\n    const resources = this.resources();\n    const showUnassigned = this.showUnassignedAppointments();\n\n    return this.schedulerService.getAllResourceIds(resources, showUnassigned);\n  });\n\n  /**\n   * Processes original appointments to get segments relevant to this specific day and its viewable hours.\n   * Filters out original all-day events.\n   */\n  private processedSegmentsForLayout = computed<AXSchedulerAppointmentSegment[]>(() => {\n    const viewDate = this.date();\n    const allOriginalAppointments = this.appointments();\n    const viewConfigStartHour = this.startDayHour();\n    const viewConfigEndHour = this.endDayHour();\n\n    if (!viewDate || !allOriginalAppointments || allOriginalAppointments.length === 0) {\n      return [];\n    }\n\n    const segmentsOnThisDay: AXSchedulerAppointmentSegment[] = [];\n    for (const appt of allOriginalAppointments) {\n      if (appt.allDay) {\n        // For all-day appointments, create a segment that spans the full day\n        const dayStart = viewDate.startOf('day');\n        const dayEnd = viewDate.endOf('day');\n\n        // Check if the all-day appointment overlaps with this day\n        const apptStart = this.calendarService.create(appt.startDate, this.calendar()).startOf('day');\n        const apptEnd = this.calendarService.create(appt.endDate, this.calendar()).startOf('day');\n\n        if (apptStart.compare(dayEnd, 'day') <= 0 && apptEnd.compare(dayStart, 'day') >= 0) {\n          const allDaySegment: AXSchedulerAppointmentSegment = {\n            ...appt,\n            startDate: dayStart.date,\n            endDate: dayEnd.date,\n            allDay: true,\n            originalStartDate: appt.startDate,\n            originalEndDate: appt.endDate,\n            isContinuationFromPreviousDay: apptStart.compare(dayStart, 'day') < 0,\n            isContinuationToNextDay: apptEnd.compare(dayStart, 'day') > 0,\n            originalAppointmentRef: appt,\n          };\n          segmentsOnThisDay.push(allDaySegment);\n        }\n        continue;\n      }\n\n      const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(\n        appt,\n        viewDate,\n        viewConfigStartHour,\n        viewConfigEndHour,\n        false,\n      );\n\n      if (segment) {\n        segmentsOnThisDay.push(segment);\n      }\n    }\n    return segmentsOnThisDay;\n  });\n\n  // Internal outputs to be caught by parent AXSchedulerComponent\n  slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n  onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n  // --- Event Handlers ---\n  private readonly eventOutputMap = {\n    slot: {\n      click: this.slotClickedInternal,\n      dblclick: this.slotDblClickedInternal,\n      contextmenu: this.slotRightClickedInternal,\n    },\n    appointment: {\n      click: this.appointmentClickedInternal,\n      dblclick: this.appointmentDblClickedInternal,\n      contextmenu: this.appointmentRightClickedInternal,\n    },\n  };\n  protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n    const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n    const appointmentRef = {\n      ...originalAppointment,\n      endDate: originalAppointment.endDate,\n      startDate: originalAppointment.startDate,\n    };\n    this.schedulerService.handleEvent(\n      { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n      this.eventOutputMap,\n      'appointment',\n    );\n  }\n  protected handleSlotEvent(mouseEvent: MouseEvent, startDate: AXDateTime) {\n    const slotData = this.schedulerService.getSlotData(startDate, 'timeline-day');\n    if (slotData)\n      this.schedulerService.handleEvent(\n        { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n        this.eventOutputMap,\n        'slot',\n      );\n  }\n  protected handleDrop(e: AXDropZoneDropEvent, startDate: AXDateTime, resourceId?: any) {\n    const slotData = this.schedulerService.getSlotData(startDate, 'timeline-day');\n    const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n    const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n    const appointmentRef = {\n      ...originalAppointment,\n      endDate: originalAppointment.endDate,\n      startDate: originalAppointment.startDate,\n    };\n\n    // Convert 'unassigned' string to undefined for proper unassigned appointments\n    const actualResourceId = resourceId === 'unassigned' ? undefined : resourceId;\n\n    // Check if it's the same slot (same time AND same resource)\n    const dragStartSlotId = this.dragStartSlotId();\n    const dropSlotId = e.sender.element().dataset['slotId'];\n    const dragStartResourceId = this.dragStartSlotResourceId();\n    const isSameSlotDrop = dragStartSlotId === dropSlotId && dragStartResourceId === resourceId;\n\n    this.onAppointmentDropInternal.emit({\n      dropEvent: e,\n      slot: { ...slotData, resourceId: actualResourceId },\n      sender: this.scheduler,\n      appointment: appointmentRef,\n      isSameSlotDrop,\n    });\n  }\n  protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n    event.stopPropagation();\n    const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n    this.onActionClickInternal.emit({\n      appointment: originalAppointment,\n      nativeEvent: event,\n      sender: this.scheduler,\n    });\n  }\n\n  protected hoursArray = computed(() => {\n    let time = this.date();\n    if (!time) return [];\n    time = time.set('hour', this.startDayHour()).startOf('hour');\n    const hours = [time];\n    while (time.hour < this.endDayHour() - 1) {\n      time = time.add('hour', 1);\n      hours.push(time);\n    }\n    return hours;\n  });\n\n  // --- Appointment Layout Calculation ---\n  protected appointmentLayouts = computed((): AXSchedulerAppointmentLayout[] => {\n    const finalLayouts: AXSchedulerAppointmentLayout[] = [];\n    const viewConfigStartHour = this.startDayHour();\n    const viewConfigEndHour = this.endDayHour();\n    const appointmentsToLayout = this.processedSegmentsForLayout(); // USE SEGMENTS\n\n    if (\n      typeof viewConfigStartHour !== 'number' ||\n      typeof viewConfigEndHour !== 'number' ||\n      appointmentsToLayout.length === 0\n    ) {\n      return finalLayouts;\n    }\n\n    const sortedAppointments = orderBy(\n      appointmentsToLayout,\n      [(seg) => seg.startDate.getTime(), (seg) => seg.originalEndDate.getTime()],\n      ['asc', 'desc'],\n    );\n\n    const rowEndTimes: AXDateTime[] = [];\n\n    for (const segment of sortedAppointments) {\n      const horizLayout = this.schedulerService.calculateTimelineLayout(\n        segment, // Pass the segment\n        viewConfigStartHour,\n        viewConfigEndHour,\n      );\n\n      if (!horizLayout) continue; // Segment is outside the viewable hour range or invalid\n\n      // For overlap check, use the segment's start and end times\n      const segmentStartTime = this.calendarService.create(segment.startDate, this.calendar());\n      const segmentEndTime = this.calendarService.create(segment.endDate, this.calendar());\n\n      let assignedRowIndex = -1;\n      for (let i = 0; i < rowEndTimes.length; i++) {\n        // If this segment starts AFTER OR AT the time the row becomes free\n        if (segmentStartTime.compare(rowEndTimes[i], 'minute') >= 0) {\n          assignedRowIndex = i;\n          break;\n        }\n      }\n\n      if (assignedRowIndex === -1) {\n        assignedRowIndex = rowEndTimes.length;\n        rowEndTimes.push(segmentEndTime); // Add segment's end time for the new row\n      } else {\n        // Update the end time for the assigned row with this segment's end time\n        rowEndTimes[assignedRowIndex] = segmentEndTime;\n      }\n\n      const layoutHeight = 'var(--ax-comp-scheduler-timeline-view-blocks-height)'; // CSS variable for height\n      const layoutLeft = horizLayout.left;\n      const layoutWidth = `calc(${horizLayout.width} - ${this.GAP_PX}px)`; // Apply horizontal gap if items are side-by-side within a row (not typical for this stacking)\n      const layoutTop = `calc(${assignedRowIndex} * (${layoutHeight} + ${this.GAP_PX}px))`; // Vertical stacking with gap\n\n      finalLayouts.push({\n        appointment: segment, // Store the segment data\n        layoutLeft,\n        layoutWidth,\n        layoutTop,\n        layoutHeight,\n      });\n    }\n\n    return finalLayouts;\n  });\n\n  /**\n   * Gets appointments for a specific resource.\n   */\n  protected getAppointmentsForResource(resourceId: any): AXSchedulerAppointment[] {\n    const appointmentsByResource = this.appointmentsByResource();\n    // Find the correct key in the Map using isEqual for proper comparison\n    for (const [key, appointments] of appointmentsByResource.entries()) {\n      if (key === 'unassigned' && resourceId === 'unassigned') {\n        return appointments;\n      }\n      if (key !== 'unassigned' && isEqual(key, resourceId)) {\n        return appointments;\n      }\n    }\n    return [];\n  }\n\n  /**\n   * Gets resource title by ID.\n   */\n  protected getResourceTitle(resourceId: any): string {\n    if (resourceId === 'unassigned') {\n      return 'Unassigned';\n    }\n    const resources = this.resources();\n    const resource = resources.find((r) => isEqual(r.id, resourceId));\n    return resource?.title || String(resourceId);\n  }\n\n  protected getResourceContext(resourceId: any) {\n    const resources = this.resources();\n    const resource = resources.find((r) => isEqual(r.id, resourceId));\n    return resource || { id: resourceId, title: String(resourceId) };\n  }\n\n  protected getCurrentTimePosition(): number | null {\n    const now = this.calendarService.create(new Date(), this.calendar());\n    const dayStart = this.date().startOf('day');\n    const dayEnd = this.date().endOf('day');\n    const startHour = this.startDayHour();\n    const endHour = this.endDayHour();\n\n    // Check if current time is within the displayed day\n    if (now.isBefore(dayStart) || now.isAfter(dayEnd)) {\n      return null;\n    }\n\n    // Check if current time is within the visible hours\n    if (now.hour < startHour || now.hour >= endHour) {\n      return null;\n    }\n\n    // Calculate position as percentage within the visible time range\n    const currentMinutes = now.hour * 60 + now.minute;\n    const startMinutes = startHour * 60;\n    const endMinutes = endHour * 60;\n    const totalMinutes = endMinutes - startMinutes;\n\n    const positionInMinutes = currentMinutes - startMinutes;\n    return (positionInMinutes / totalMinutes) * 100;\n  }\n\n  protected getCurrentTimePositionWithOffset(): string | null {\n    const position = this.getCurrentTimePosition();\n    if (position === null) {\n      return null;\n    }\n\n    if (this.showResourceHeaders() && this.resources().length > 0) {\n      return `calc(${position}% + (${100 - position} * var(--ax-comp-scheduler-resource-header-width, 8rem)) / 100)`;\n    } else {\n      return `${position}%`;\n    }\n  }\n\n  ngAfterViewInit() {\n    // Auto-scroll to current time when available using ResizeObserver\n    this.resizeObserverCleanup = this.setupCurrentTimeScroll();\n\n    // Register cleanup with DestroyRef\n    this.destroyRef.onDestroy(() => {\n      this.resizeObserverCleanup?.();\n    });\n  }\n\n  ngOnDestroy() {\n    this.resizeObserverCleanup?.();\n  }\n\n  private setupCurrentTimeScroll(): (() => void) | undefined {\n    if (!this.showCurrentTimeIndicator() || !this.scrollToCurrentTimeIndicator()) {\n      return undefined;\n    }\n\n    const currentPosition = this.getCurrentTimePosition();\n    if (currentPosition === null) {\n      return undefined;\n    }\n\n    const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n    if (!timeLineElement) {\n      return undefined;\n    }\n\n    // Use ResizeObserver to detect when the element is properly rendered\n    const resizeObserver = new ResizeObserver((entries) => {\n      for (const entry of entries) {\n        if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n          // Element has proper dimensions, scroll to it\n          timeLineElement.scrollIntoView({\n            behavior: 'smooth',\n            block: 'nearest',\n            inline: 'center',\n          });\n          // Disconnect observer after successful scroll\n          resizeObserver.disconnect();\n          break;\n        }\n      }\n    });\n\n    resizeObserver.observe(timeLineElement);\n\n    // Cleanup on component destroy\n    return () => resizeObserver.disconnect();\n  }\n\n  /**\n   * Gets appointment layouts for a specific resource with proper positioning.\n   */\n  protected getAppointmentLayoutsForResource(resourceId: any): AXSchedulerAppointmentLayout[] {\n    const resourceAppointments = this.getAppointmentsForResource(resourceId);\n    const viewDate = this.date();\n    const viewConfigStartHour = this.startDayHour();\n    const viewConfigEndHour = this.endDayHour();\n\n    if (!viewDate || resourceAppointments.length === 0) {\n      return [];\n    }\n\n    // Get segments for this specific resource\n    const resourceSegments: AXSchedulerAppointmentSegment[] = [];\n    for (const appt of resourceAppointments) {\n      const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(\n        appt,\n        viewDate,\n        viewConfigStartHour,\n        viewConfigEndHour,\n      );\n      if (segment) {\n        resourceSegments.push(segment);\n      }\n    }\n\n    const finalLayouts: AXSchedulerAppointmentLayout[] = [];\n    const sortedAppointments = orderBy(\n      resourceSegments,\n      [(seg) => seg.startDate.getTime(), (seg) => seg.originalEndDate.getTime()],\n      ['asc', 'desc'],\n    );\n\n    const rowEndTimes: AXDateTime[] = [];\n\n    for (const segment of sortedAppointments) {\n      const horizLayout = this.schedulerService.calculateTimelineLayout(\n        segment,\n        viewConfigStartHour,\n        viewConfigEndHour,\n      );\n\n      if (!horizLayout) continue;\n\n      const segmentStartTime = this.calendarService.create(segment.startDate, this.calendar());\n      const segmentEndTime = this.calendarService.create(segment.endDate, this.calendar());\n\n      let assignedRowIndex = -1;\n      for (let i = 0; i < rowEndTimes.length; i++) {\n        if (segmentStartTime.compare(rowEndTimes[i], 'minute') >= 0) {\n          assignedRowIndex = i;\n          break;\n        }\n      }\n\n      if (assignedRowIndex === -1) {\n        assignedRowIndex = rowEndTimes.length;\n        rowEndTimes.push(segmentEndTime);\n      } else {\n        rowEndTimes[assignedRowIndex] = segmentEndTime;\n      }\n\n      const layoutHeight = 'var(--ax-comp-scheduler-timeline-view-blocks-height)';\n      const layoutLeft = horizLayout.left;\n      const layoutWidth = `calc(${horizLayout.width} - ${this.GAP_PX}px)`;\n      const layoutTop = `calc(${assignedRowIndex} * (${layoutHeight} + ${this.GAP_PX}px))`;\n\n      finalLayouts.push({\n        appointment: segment,\n        layoutLeft,\n        layoutWidth,\n        layoutTop,\n        layoutHeight,\n      });\n    }\n\n    return finalLayouts;\n  }\n\n  /**\n   * Calculates the height for a resource row based on its appointments.\n   */\n  protected getResourceRowHeight(resourceId: any): string {\n    const layouts = this.getAppointmentLayoutsForResource(resourceId);\n\n    if (layouts.length === 0) {\n      // If no appointments, use minimum height (one appointment height)\n      return 'var(--ax-comp-scheduler-basic-view-blocks-height)';\n    }\n\n    // Calculate the maximum number of overlapping rows needed\n    const appointments = layouts.map((layout) => layout.appointment);\n    const maxOverlappingRows = this.calculateMaxOverlappingRows(appointments);\n\n    // Use CSS calc() to handle the height calculation with CSS variables\n    return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${maxOverlappingRows} + ${this.GAP_PX}px * ${Math.max(0, maxOverlappingRows)})`;\n  }\n\n  /**\n   * Calculates the maximum number of overlapping appointment rows needed.\n   */\n  private calculateMaxOverlappingRows(appointments: AXSchedulerAppointmentSegment[]): number {\n    if (appointments.length === 0) return 0;\n    if (appointments.length === 1) return 1;\n\n    // Sort appointments by start time, then by end time (descending)\n    const sortedAppointments = [...appointments].sort((a, b) => {\n      const startDiff = a.startDate.getTime() - b.startDate.getTime();\n      if (startDiff !== 0) return startDiff;\n      return b.endDate.getTime() - a.endDate.getTime(); // Longer appointments first\n    });\n\n    // Simulate the row assignment algorithm from the original layout\n    const rowEndTimes: Date[] = [];\n    let maxRows = 0;\n\n    for (const appointment of sortedAppointments) {\n      let assignedRowIndex = -1;\n\n      // Find the first available row\n      for (let i = 0; i < rowEndTimes.length; i++) {\n        if (appointment.startDate >= rowEndTimes[i]) {\n          assignedRowIndex = i;\n          break;\n        }\n      }\n\n      // If no available row, create a new one\n      if (assignedRowIndex === -1) {\n        assignedRowIndex = rowEndTimes.length;\n        rowEndTimes.push(appointment.endDate);\n      } else {\n        // Update the row's end time\n        rowEndTimes[assignedRowIndex] = appointment.endDate;\n      }\n\n      // Track the maximum number of rows used\n      maxRows = Math.max(maxRows, rowEndTimes.length);\n    }\n\n    return Math.max(maxRows, 1); // Minimum one row\n  }\n\n  protected getSlotId(e: PointerEvent) {\n    const dropListElement = this.document\n      .elementsFromPoint(e.clientX, e.clientY)\n      .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n    this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n    this.dragStartSlotResourceId.set(dropListElement ? dropListElement.dataset['resourceId'] : null);\n  }\n}\n","@if (resources().length === 0 || !showResourceHeaders()) {\n  <!-- Original layout when no resources -->\n  <div class=\"ax-scheduler-timeline-header\">\n    @for (hour of hoursArray(); track hour.date.getTime()) {\n      <div class=\"ax-scheduler-timeline-header-hours\">\n        <span>{{ hour | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}</span>\n      </div>\n    }\n  </div>\n\n  <div class=\"ax-scheduler-timeline-content\">\n    <!-- Current Time Line Indicator -->\n    @if (showCurrentTimeIndicator() && getCurrentTimePositionWithOffset() !== null) {\n      <div\n        class=\"ax-scheduler-current-time-line\"\n        [style.inset-inline-start]=\"getCurrentTimePositionWithOffset()\"\n        #currentTimeLine\n      ></div>\n    }\n    <div class=\"ax-scheduler-timeline-appointment-container\">\n      @for (\n        layout of resources().length === 0 ? appointmentLayouts() : getAppointmentLayoutsForResource(resourceIds()[0]);\n        track layout.appointment.id\n      ) {\n        <div\n          axDrag\n          [dragCursor]=\"'grab'\"\n          [dragTransition]=\"false\"\n          [dragElementClone]=\"true\"\n          [dragStartDelay]=\"dragStartDelay()\"\n          [dragDisabled]=\"!draggable() || layout.appointment.readonly || readonly()\"\n          [dragData]=\"layout.appointment\"\n          (pointerdown)=\"getSlotId($event)\"\n          (click)=\"handleAppointmentEvent($event, layout.appointment)\"\n          (dblclick)=\"handleAppointmentEvent($event, layout.appointment)\"\n          (contextmenu)=\"handleAppointmentEvent($event, layout.appointment)\"\n          [title]=\"tooltipTemplate() ? '' : layout.appointment.title\"\n          [style.width]=\"layout.layoutWidth\"\n          [style.height]=\"layout.layoutHeight\"\n          class=\"ax-scheduler-timeline-appointment {{\n            layout.appointment.cssClass ?? 'ax-scheduler-' + (layout.appointment.priority ?? 'primary') + '-priority'\n          }}\"\n          [class.ax-state-active]=\"isActive(layout.appointment.id)\"\n          [style.insetBlockStart]=\"layout.layoutTop\"\n          [style.insetInlineStart]=\"layout.layoutLeft\"\n          [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n          [axTooltipContext]=\"layout.appointment\"\n          [axTooltip]=\"tooltipTemplate()\"\n        >\n          <ax-title>\n            <span class=\"ax-scheduler-truncate\">{{ layout.appointment.title }}</span>\n            @if (hasActions()) {\n              <ax-icon\n                (click)=\"handleActionClick($event, layout.appointment)\"\n                class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n              >\n              </ax-icon>\n            }\n          </ax-title>\n          <ax-subtitle>\n            {{\n              layout.appointment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n            }}\n            -\n            {{\n              layout.appointment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n            }}\n          </ax-subtitle>\n        </div>\n      }\n    </div>\n    <div class=\"ax-scheduler-timeline-slot-row\" aria-hidden=\"true\">\n      @for (time of hoursArray(); track time.date.getTime()) {\n        <div\n          axDropZone\n          #zone=\"axDropZone\"\n          (onElementDrop)=\"handleDrop($event, time)\"\n          [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n          class=\"ax-scheduler-timeline-slot-cell\"\n          (click)=\"handleSlotEvent($event, time)\"\n          (dblclick)=\"handleSlotEvent($event, time)\"\n          (contextmenu)=\"handleSlotEvent($event, time)\"\n          [attr.data-slot-id]=\"time.format('YYYYMMDD-HHmm')\"\n        ></div>\n      }\n    </div>\n  </div>\n} @else {\n  <!-- Resource-based layout -->\n  <div class=\"ax-scheduler-timeline-resource-container\">\n    <!-- Single sticky time header for all resources (only show if not used in multi-day) -->\n    @if (showResourceHeaders()) {\n      <div class=\"ax-scheduler-timeline-header ax-scheduler-timeline-header-sticky\">\n        <div class=\"ax-scheduler-timeline-resource-header-placeholder\"><span>Resources</span></div>\n        @for (hour of hoursArray(); track hour.date.getTime()) {\n          <div class=\"ax-scheduler-timeline-header-hours\">\n            <span>{{ hour | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}</span>\n          </div>\n        }\n      </div>\n    }\n\n    <!-- Resource rows -->\n    <div class=\"ax-scheduler-timeline-resource-rows\">\n      <!-- Current Time Line Indicator -->\n      @if (showCurrentTimeIndicator() && getCurrentTimePositionWithOffset() !== null) {\n        <div\n          #currentTimeLine\n          class=\"ax-scheduler-current-time-line\"\n          [style.inset-inline-start]=\"getCurrentTimePositionWithOffset()\"\n        ></div>\n      }\n\n      @for (resourceId of resourceIds(); track resourceId) {\n        <div class=\"ax-scheduler-timeline-resource-row\" [style.height]=\"getResourceRowHeight(resourceId)\">\n          @if (showResourceHeaders()) {\n            <!-- Sticky Resource Header -->\n            <div class=\"ax-scheduler-timeline-resource-header ax-scheduler-timeline-resource-header-sticky\">\n              @if (resourceTemplate() && typeof resourceTemplate() !== 'string') {\n                <ng-container\n                  [ngTemplateOutlet]=\"$any(resourceTemplate())\"\n                  [ngTemplateOutletContext]=\"{\n                    $implicit: getResourceContext(resourceId),\n                    resource: getResourceContext(resourceId),\n                    resourceId: resourceId,\n                  }\"\n                ></ng-container>\n              } @else {\n                <span class=\"ax-scheduler-timeline-resource-title\">{{ getResourceTitle(resourceId) }}</span>\n              }\n            </div>\n          }\n\n          <!-- Resource Content -->\n          <div class=\"ax-scheduler-timeline-resource-content\">\n            <div class=\"ax-scheduler-timeline-appointment-container\">\n              @for (layout of getAppointmentLayoutsForResource(resourceId); track layout.appointment.id) {\n                <div\n                  axDrag\n                  [dragCursor]=\"'grab'\"\n                  [dragTransition]=\"false\"\n                  [dragElementClone]=\"true\"\n                  [dragStartDelay]=\"dragStartDelay()\"\n                  [dragDisabled]=\"!draggable() || layout.appointment.readonly || readonly()\"\n                  [dragData]=\"layout.appointment\"\n                  (pointerdown)=\"getSlotId($event)\"\n                  (click)=\"handleAppointmentEvent($event, layout.appointment)\"\n                  (dblclick)=\"handleAppointmentEvent($event, layout.appointment)\"\n                  (contextmenu)=\"handleAppointmentEvent($event, layout.appointment)\"\n                  [title]=\"tooltipTemplate() ? '' : layout.appointment.title\"\n                  [style.width]=\"layout.layoutWidth\"\n                  [style.height]=\"layout.layoutHeight\"\n                  class=\"ax-scheduler-timeline-appointment {{\n                    layout.appointment.cssClass ??\n                      'ax-scheduler-' + (layout.appointment.priority ?? 'primary') + '-priority'\n                  }}\"\n                  [class.ax-state-active]=\"isActive(layout.appointment.id)\"\n                  [style.insetBlockStart]=\"layout.layoutTop\"\n                  [style.insetInlineStart]=\"layout.layoutLeft\"\n                  [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                  [axTooltipContext]=\"layout.appointment\"\n                  [axTooltip]=\"tooltipTemplate()\"\n                >\n                  <ax-title>\n                    <span class=\"ax-scheduler-truncate\">{{ layout.appointment.title }}</span>\n                    @if (hasActions()) {\n                      <ax-icon\n                        (click)=\"handleActionClick($event, layout.appointment)\"\n                        class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                      >\n                      </ax-icon>\n                    }\n                  </ax-title>\n                  <ax-subtitle>\n                    {{\n                      layout.appointment.originalStartDate\n                        | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n                        | async\n                    }}\n                    -\n                    {{\n                      layout.appointment.originalEndDate\n                        | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n                        | async\n                    }}\n                  </ax-subtitle>\n                </div>\n              }\n            </div>\n            <div class=\"ax-scheduler-timeline-slot-row\" aria-hidden=\"true\">\n              @for (time of hoursArray(); track time.date.getTime()) {\n                <div\n                  axDropZone\n                  #zone=\"axDropZone\"\n                  (onElementDrop)=\"handleDrop($event, time, resourceId)\"\n                  [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n                  class=\"ax-scheduler-timeline-slot-cell\"\n                  (click)=\"handleSlotEvent($event, time)\"\n                  (dblclick)=\"handleSlotEvent($event, time)\"\n                  (contextmenu)=\"handleSlotEvent($event, time)\"\n                  [attr.data-slot-id]=\"time.format('YYYYMMDD-HHmm')\"\n                  [attr.data-resource-id]=\"resourceId\"\n                ></div>\n              }\n            </div>\n          </div>\n        </div>\n      }\n    </div>\n  </div>\n}\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgTemplateOutlet } from '@angular/common';\nimport {\n  AfterViewInit,\n  Component,\n  computed,\n  DestroyRef,\n  DOCUMENT,\n  ElementRef,\n  inject,\n  input,\n  OnDestroy,\n  output,\n  signal,\n  TemplateRef,\n  viewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { isEqual, orderBy } from 'lodash-es';\nimport { AXSchedulerAppointment, AXSchedulerAppointmentSegment, AXSchedulerResource } from '../../scheduler.class';\nimport {\n  AXSchedulerAppointmentMouseEvent,\n  AXSchedulerComponent,\n  AXSchedulerSlotDropEvent,\n  AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\nexport interface TimelineMonthViewDayData {\n  date: AXDateTime;\n  dayIndex: number; // 0-based index within the month\n  // These will be segments, precisely clipped and flagged for this day\n  visibleAppointments: AXSchedulerAppointmentSegment[];\n  hiddenAppointments: AXSchedulerAppointmentSegment[];\n  moreCount: number;\n  // You might also want to store all segments for the day if needed elsewhere\n  // allSegmentsForDay: AXSchedulerAppointmentSegmentType[];\n  holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate };\n  // Resource-specific data\n  appointmentsByResource?: Map<\n    string,\n    { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number }\n  >;\n}\n\n// Represents a multi-day appointment spanning across multiple day columns\nexport type AXSchedulerTimelineSpanningAppointment = {\n  appointment: AXSchedulerAppointment;\n  startDayIndex: number; // 0-based index of the starting day in the month\n  spanCount: number; // Number of days this appointment spans\n  rowIndex: number; // Row index for stacking multiple spanning appointments\n  isStartClipped: boolean; // True if appointment starts before the visible range\n  isEndClipped: boolean; // True if appointment extends beyond the visible range\n};\n\n@Component({\n  selector: 'ax-scheduler-timeline-month-view',\n  templateUrl: './scheduler-timeline-month-view.component.html',\n  styleUrl: './scheduler-timeline-month-view.component.css',\n\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    '[class.ax-state-readonly]': 'readonly()',\n  },\n  imports: [\n    NgTemplateOutlet,\n    AsyncPipe,\n    AXFormatPipe,\n    AXDragDirective,\n    AXTranslatorPipe,\n    AXPopoverComponent,\n    AXTooltipDirective,\n    AXDropZoneDirective,\n    AXDecoratorIconComponent,\n    AXDecoratorGenericComponent,\n  ],\n  providers: [{ provide: AXComponent, useExisting: AXSchedulerTimelineMonthViewComponent }],\n})\nexport class AXSchedulerTimelineMonthViewComponent extends NXComponent implements AfterViewInit, OnDestroy {\n  private document = inject(DOCUMENT);\n  private destroyRef = inject(DestroyRef);\n  private scheduler = inject(AXSchedulerComponent);\n  private calendarService = inject(AXCalendarService);\n  private schedulerService = inject(AXSchedulerService);\n\n  private resizeObserverCleanup?: () => void;\n\n  private readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 3;\n\n  // --- Multi-day Appointment Detection ---\n  private isMultiDayAppointment(appointment: AXSchedulerAppointment): boolean {\n    const startDate = this.calendarService.create(appointment.startDate);\n    const endDate = this.calendarService.create(appointment.endDate);\n    return !startDate.startOf('day').equal(endDate.startOf('day'), 'day');\n  }\n\n  // Calculate spanning appointments with their grid positions\n  protected spanningAppointments = computed<AXSchedulerTimelineSpanningAppointment[]>(() => {\n    const allAppointments = this.appointments();\n    const monthStartDate = this.date().startOf('month');\n    const monthEndDate = this.date().endOf('month');\n    const daysInMonth = monthEndDate.dayOfMonth;\n\n    if (!allAppointments || allAppointments.length === 0) return [];\n\n    // Filter to get only multi-day appointments\n    const multiDayAppts = allAppointments.filter((appt) => {\n      if (!appt.startDate || !appt.endDate) return false;\n      return this.isMultiDayAppointment(appt) || appt.allDay;\n    });\n\n    if (multiDayAppts.length === 0) return [];\n\n    // Sort by start date, then by duration (longer first)\n    const sortedAppts = orderBy(\n      multiDayAppts,\n      [\n        (a) => a.startDate.getTime(),\n        (a) => a.endDate.getTime() - a.startDate.getTime(),\n        (a) => a.title?.toLowerCase() ?? '',\n      ],\n      ['asc', 'desc', 'asc'],\n    );\n\n    const spanningResult: AXSchedulerTimelineSpanningAppointment[] = [];\n    const rowOccupancy: Map<number, Set<number>> = new Map();\n\n    for (const appt of sortedAppts) {\n      const apptStart = this.calendarService.create(appt.startDate).startOf('day');\n      const apptEnd = this.calendarService.create(appt.endDate).startOf('day');\n\n      // Check if appointment overlaps with the month\n      if (apptEnd.compare(monthStartDate, 'day') < 0 || apptStart.compare(monthEndDate, 'day') > 0) {\n        continue;\n      }\n\n      // Calculate start day index (clamped to month bounds)\n      let startDayIndex = 0;\n      let isStartClipped = false;\n      if (apptStart.compare(monthStartDate, 'day') < 0) {\n        startDayIndex = 0;\n        isStartClipped = true;\n      } else {\n        startDayIndex = Math.floor(apptStart.duration(monthStartDate).total.days);\n      }\n\n      // Calculate end day index (clamped to month bounds)\n      let endDayIndex = daysInMonth - 1;\n      let isEndClipped = false;\n      if (apptEnd.compare(monthEndDate, 'day') > 0) {\n        endDayIndex = daysInMonth - 1;\n        isEndClipped = true;\n      } else {\n        endDayIndex = Math.floor(apptEnd.duration(monthStartDate).total.days);\n      }\n\n      // Ensure valid indices\n      startDayIndex = Math.max(0, Math.min(startDayIndex, daysInMonth - 1));\n      endDayIndex = Math.max(startDayIndex, Math.min(endDayIndex, daysInMonth - 1));\n\n      const spanCount = endDayIndex - startDayIndex + 1;\n\n      // Find the first available row\n      let rowIndex = 0;\n      let foundRow = false;\n\n      while (!foundRow) {\n        if (!rowOccupancy.has(rowIndex)) {\n          rowOccupancy.set(rowIndex, new Set());\n        }\n        const occupiedCells = rowOccupancy.get(rowIndex) ?? new Set<number>();\n\n        let hasConflict = false;\n        for (let dayIdx = startDayIndex; dayIdx <= endDayIndex; dayIdx++) {\n          if (occupiedCells.has(dayIdx)) {\n            hasConflict = true;\n            break;\n          }\n        }\n\n        if (!hasConflict) {\n          for (let dayIdx = startDayIndex; dayIdx <= endDayIndex; dayIdx++) {\n            occupiedCells.add(dayIdx);\n          }\n          foundRow = true;\n        } else {\n          rowIndex++;\n        }\n      }\n\n      spanningResult.push({\n        appointment: appt,\n        startDayIndex,\n        spanCount,\n        rowIndex,\n        isStartClipped,\n        isEndClipped,\n      });\n    }\n\n    return spanningResult;\n  });\n\n  // Get the set of multi-day appointment IDs for exclusion from per-day rendering\n  private multiDayAppointmentIds = computed<Set<any>>(() => {\n    const spanning = this.spanningAppointments();\n    return new Set(spanning.map((s) => s.appointment.id));\n  });\n\n  // Get spanning appointments for a specific resource\n  protected getSpanningAppointmentsForResource(resourceId: any): AXSchedulerTimelineSpanningAppointment[] {\n    const allSpanning = this.spanningAppointments();\n    return allSpanning.filter((spanning) => {\n      if (resourceId === 'unassigned') {\n        return spanning.appointment.resourceId === undefined || spanning.appointment.resourceId === null;\n      }\n      return isEqual(spanning.appointment.resourceId, resourceId);\n    });\n  }\n\n  // Calculate max spanning rows for the non-resource view\n  protected maxSpanningRows = computed<number>(() => {\n    const spanning = this.spanningAppointments();\n    if (spanning.length === 0) return 0;\n    return Math.max(...spanning.map((s) => s.rowIndex)) + 1;\n  });\n\n  // Calculate max spanning rows for a specific resource\n  protected getMaxSpanningRowsForResource(resourceId: any): number {\n    const resourceSpanning = this.getSpanningAppointmentsForResource(resourceId);\n    if (resourceSpanning.length === 0) return 0;\n    return Math.max(...resourceSpanning.map((s) => s.rowIndex)) + 1;\n  }\n\n  readonly = input(false);\n  draggable = input(true);\n  hasActions = input(false);\n  dragStartDelay = input(0);\n  calendar = input<string>();\n  showResourceHeaders = input(true);\n  date = input.required<AXDateTime>();\n  showUnassignedAppointments = input(true);\n  selectedAppointmentId = input<string | number | null>(null);\n\n  protected isActive(appointmentId: string | number): boolean {\n    return this.selectedAppointmentId() === appointmentId;\n  }\n  resources = input<AXSchedulerResource[]>([]);\n  showCurrentTimeIndicator = input<boolean>(true);\n  scrollToCurrentTimeIndicator = input<boolean>(false);\n  resourceTemplate = input<TemplateRef<unknown>>();\n  appointments = input<AXSchedulerAppointment[]>([]);\n  tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n  private dragStartSlotId = signal<string | null>(null);\n  private dragStartSlotResourceId = signal<any>(null);\n\n  currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n  protected processedDayData = computed<TimelineMonthViewDayData[]>(() => {\n    const allOriginalAppointments = this.appointments();\n    const monthStartDate = this.date().startOf('month');\n    const daysInMonth = monthStartDate.endOf('month').dayOfMonth;\n    const resources = this.resources();\n    const showUnassigned = this.showUnassignedAppointments();\n    const multiDayIds = this.multiDayAppointmentIds();\n\n    if (!allOriginalAppointments) {\n      return Array.from({ length: daysInMonth }, (_, i) => {\n        const dayDate = monthStartDate.add('day', i);\n\n        return {\n          date: dayDate,\n          dayIndex: i,\n          visibleAppointments: [],\n          hiddenAppointments: [],\n          moreCount: 0,\n          appointmentsByResource: resources.length > 0 ? new Map() : undefined,\n        };\n      });\n    }\n\n    // Filter out multi-day appointments from single-day processing\n    const singleDayAppointments = allOriginalAppointments.filter((appt) => !multiDayIds.has(appt.id));\n\n    const result: TimelineMonthViewDayData[] = [];\n\n    for (let i = 0; i < daysInMonth; i++) {\n      const currentDayDate = monthStartDate.add('day', i).startOf('day'); // Ensure it's start of day\n      const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n\n      for (const appt of singleDayAppointments) {\n        // For Timeline Month View, each day is a row. We want segments for the full 24h of that day.\n        // The view's startHour/endHour are NOT used to clip segments here,\n        // as it's not a horizontal time scale *within* the day row.\n        const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, currentDayDate, 0, 24, true);\n        if (segment) {\n          segmentsForThisDay.push(segment);\n        }\n      }\n\n      // Sort segments: all-day first, then by segment start time (which is clipped to the day)\n      const sortedSegments = orderBy(\n        segmentsForThisDay,\n        [\n          (s) => (s.allDay ? 0 : 1), // Segments marked as allDay first\n          (s) => s.startDate.getTime(), // Segment's start time on this day\n          (s) => s.endDate.getTime() - s.startDate.getTime(), // Segment's duration on this day\n          (s) => s.title?.toLowerCase() ?? '',\n        ],\n        ['asc', 'asc', 'desc', 'asc'],\n      );\n\n      const visibleAppointments = sortedSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n      const hiddenAppointments = sortedSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n\n      // Handle resource grouping if resources are provided\n      let appointmentsByResource:\n        | Map<\n            string,\n            { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number }\n          >\n        | undefined;\n\n      if (resources.length > 0) {\n        appointmentsByResource = new Map();\n        const resourceIds = this.schedulerService.getAllResourceIds(resources, showUnassigned);\n\n        for (const resourceId of resourceIds) {\n          // Filter segments by resource ID\n          const resourceSegments = sortedSegments.filter((segment) => {\n            if (resourceId === 'unassigned') {\n              return segment.resourceId === undefined || segment.resourceId === null;\n            }\n            return isEqual(segment.resourceId, resourceId);\n          });\n\n          const resourceVisible = resourceSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n          const resourceHidden = resourceSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n\n          appointmentsByResource.set(resourceId, {\n            visible: resourceVisible,\n            hidden: resourceHidden,\n            moreCount: resourceHidden.length,\n          });\n        }\n      }\n\n      result.push({\n        date: currentDayDate,\n        dayIndex: i,\n        visibleAppointments: visibleAppointments,\n        hiddenAppointments: hiddenAppointments,\n        moreCount: hiddenAppointments.length,\n        holiday: this.isHoliday(currentDayDate),\n        appointmentsByResource,\n      });\n    }\n    return result;\n  });\n\n  // Internal outputs to be caught by parent AXSchedulerComponent\n  slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n  onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n  // --- Event Handlers ---\n  private readonly eventOutputMap = {\n    slot: {\n      click: this.slotClickedInternal,\n      dblclick: this.slotDblClickedInternal,\n      contextmenu: this.slotRightClickedInternal,\n    },\n    appointment: {\n      click: this.appointmentClickedInternal,\n      dblclick: this.appointmentDblClickedInternal,\n      contextmenu: this.appointmentRightClickedInternal,\n    },\n  };\n  protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n    const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n    const appointmentRef = {\n      ...originalAppointment,\n      endDate: originalAppointment.endDate,\n      startDate: originalAppointment.startDate,\n    };\n    this.schedulerService.handleEvent(\n      { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n      this.eventOutputMap,\n      'appointment',\n    );\n  }\n  protected handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n    // date is the specific day\n    const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'timeline-month');\n    if (slotData)\n      this.schedulerService.handleEvent(\n        { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n        this.eventOutputMap,\n        'slot',\n      );\n  }\n  protected handleDrop(e: AXDropZoneDropEvent, date: AXDateTime, resourceId?: any) {\n    // date is the specific day\n    const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'timeline-month');\n    const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n    const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n    const appointmentRef = {\n      ...originalAppointment,\n      endDate: originalAppointment.endDate,\n      startDate: originalAppointment.startDate,\n    };\n\n    // Convert 'unassigned' string to undefined for proper unassigned appointments\n    const actualResourceId = resourceId === 'unassigned' ? undefined : resourceId;\n\n    // Check if it's the same slot (same time AND same resource)\n    const dragStartSlotId = this.dragStartSlotId();\n    const dropSlotId = e.sender.element().dataset['slotId'];\n    const dragStartResourceId = this.dragStartSlotResourceId();\n    const isSameSlotDrop = dragStartSlotId === dropSlotId && dragStartResourceId === resourceId;\n\n    this.onAppointmentDropInternal.emit({\n      dropEvent: e,\n      slot: { ...slotData, resourceId: actualResourceId },\n      sender: this.scheduler,\n      appointment: appointmentRef,\n      isSameSlotDrop,\n    });\n  }\n  protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n    event.stopPropagation();\n    const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n    this.onActionClickInternal.emit({\n      appointment: originalAppointment,\n      nativeEvent: event,\n      sender: this.scheduler,\n    });\n  }\n\n  protected isToday(date: AXDateTime): boolean {\n    const today = this.calendarService.create(new Date());\n    return date.equal(today, 'day');\n  }\n  protected isHoliday(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n    const isHoliday = this.schedulerService.isHoliday(date);\n    if (isHoliday) {\n      const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n      const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n      const holiday = globalHoliday || internalHoliday;\n      return {\n        state: 'holiday',\n        holiday,\n      };\n    }\n    const isWeekend = this.schedulerService.isWeekend(date, this.calendar());\n    if (isWeekend) {\n      return { state: 'weekend' };\n    }\n    return { state: 'none' };\n  }\n\n  /**\n   * Gets appointments grouped by resources for timeline view.\n   */\n  protected appointmentsByResource = computed(() => {\n    const allAppointments = this.appointments();\n    const resources = this.resources();\n    const showUnassigned = this.showUnassignedAppointments();\n\n    return this.schedulerService.filterAppointmentsByResources(allAppointments, resources, showUnassigned);\n  });\n\n  /**\n   * Gets all resource IDs including unassigned if applicable.\n   */\n  protected resourceIds = computed(() => {\n    const resources = this.resources();\n    const showUnassigned = this.showUnassignedAppointments();\n\n    return this.schedulerService.getAllResourceIds(resources, showUnassigned);\n  });\n\n  /**\n   * Gets appointments for a specific resource.\n   */\n  protected getAppointmentsForResource(resourceId: any): AXSchedulerAppointment[] {\n    const appointmentsByResource = this.appointmentsByResource();\n    // Find the correct key in the Map using isEqual for proper comparison\n    for (const [key, appointments] of appointmentsByResource.entries()) {\n      if (key === 'unassigned' && resourceId === 'unassigned') {\n        return appointments;\n      }\n      if (key !== 'unassigned' && isEqual(key, resourceId)) {\n        return appointments;\n      }\n    }\n    return [];\n  }\n\n  /**\n   * Gets resource title by ID.\n   */\n  protected getResourceTitle(resourceId: any): string {\n    if (resourceId === 'unassigned') {\n      return 'Unassigned';\n    }\n    const resources = this.resources();\n    const resource = resources.find((r) => isEqual(r.id, resourceId));\n    return resource?.title || String(resourceId);\n  }\n\n  protected getResourceContext(resourceId: any) {\n    const resources = this.resources();\n    const resource = resources.find((r) => isEqual(r.id, resourceId));\n    return resource || { id: resourceId, title: String(resourceId) };\n  }\n\n  protected getCurrentTimePosition(): number | null {\n    const now = this.calendarService.create(new Date(), this.calendar());\n    const monthStart = this.date().startOf('month');\n    const monthEnd = this.date().endOf('month');\n\n    // Check if current time is within the displayed month\n    if (now.isBefore(monthStart) || now.isAfter(monthEnd)) {\n      return null;\n    }\n\n    // Calculate position as percentage of the month\n    const durationFromStart = now.duration(monthStart);\n    const totalDuration = monthEnd.duration(monthStart);\n    return (durationFromStart.total.days / totalDuration.total.days) * 100;\n  }\n\n  ngAfterViewInit() {\n    // Auto-scroll to current time when available using ResizeObserver\n    this.resizeObserverCleanup = this.setupCurrentTimeScroll();\n\n    // Register cleanup with DestroyRef\n    this.destroyRef.onDestroy(() => {\n      this.resizeObserverCleanup?.();\n    });\n  }\n\n  ngOnDestroy() {\n    this.resizeObserverCleanup?.();\n  }\n\n  private setupCurrentTimeScroll(): (() => void) | undefined {\n    if (!this.showCurrentTimeIndicator() || !this.scrollToCurrentTimeIndicator()) {\n      return undefined;\n    }\n\n    const currentPosition = this.getCurrentTimePosition();\n    if (currentPosition === null) {\n      return undefined;\n    }\n\n    const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n    if (!timeLineElement) {\n      return undefined;\n    }\n\n    // Use ResizeObserver to detect when the element is properly rendered\n    const resizeObserver = new ResizeObserver((entries) => {\n      for (const entry of entries) {\n        if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n          // Element has proper dimensions, scroll to it\n          timeLineElement.scrollIntoView({\n            behavior: 'smooth',\n            block: 'nearest',\n            inline: 'center',\n          });\n          // Disconnect observer after successful scroll\n          resizeObserver.disconnect();\n          break;\n        }\n      }\n    });\n\n    resizeObserver.observe(timeLineElement);\n\n    // Cleanup on component destroy\n    return () => resizeObserver.disconnect();\n  }\n\n  /**\n   * Gets appointments for a specific resource and day.\n   */\n  protected getAppointmentsForResourceAndDay(\n    resourceId: any,\n    dayData: TimelineMonthViewDayData,\n  ): { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number } {\n    if (!dayData.appointmentsByResource) {\n      return { visible: [], hidden: [], moreCount: 0 };\n    }\n    return dayData.appointmentsByResource.get(resourceId) || { visible: [], hidden: [], moreCount: 0 };\n  }\n\n  protected getSlotId(e: PointerEvent) {\n    const dropListElement = this.document\n      .elementsFromPoint(e.clientX, e.clientY)\n      .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n    this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n    this.dragStartSlotResourceId.set(dropListElement ? dropListElement.dataset['resourceId'] : null);\n  }\n\n  /**\n   * Gets the height for a specific resource row based on appointments.\n   */\n  protected getResourceRowHeight(resourceId: any): string {\n    const dayData = this.processedDayData();\n    let maxAppointments = 0;\n    let hasMoreLink = false;\n\n    // Find the maximum number of visible appointments for this resource across all days\n    // Only consider visible appointments, not hidden ones\n    for (const day of dayData) {\n      const resourceAppointments = this.getAppointmentsForResourceAndDay(resourceId, day);\n      maxAppointments = Math.max(maxAppointments, resourceAppointments.visible.length);\n\n      // Check if any day has hidden appointments (more link)\n      if (resourceAppointments.moreCount > 0) {\n        hasMoreLink = true;\n      }\n    }\n\n    if (maxAppointments === 0) {\n      // If no appointments, use minimum height (one appointment height)\n      return 'var(--ax-comp-scheduler-basic-view-blocks-height)';\n    }\n\n    // Use CSS calc with CSS variables for dynamic height calculation\n    // Formula: (appointments * appointment-height) + (gaps) + (more-link if present)\n    const appointmentHeight = 'var(--ax-comp-scheduler-timeline-month-appointment-height, 3rem)';\n    const gapHeight = 'var(--ax-comp-scheduler-timeline-month-gap-height, 0.125rem)';\n    const moreLinkHeight = 'var(--ax-comp-scheduler-timeline-month-more-link-height, 2.5rem)';\n\n    if (hasMoreLink) {\n      // If there are hidden appointments, add space for the more link\n      return `calc(${maxAppointments} * ${appointmentHeight} + ${maxAppointments - 1} * ${gapHeight} + ${moreLinkHeight})`;\n    } else {\n      // No more link needed\n      return `calc(${maxAppointments} * ${appointmentHeight} + ${maxAppointments - 1} * ${gapHeight})`;\n    }\n  }\n\n  /**\n   * Calculates the maximum number of overlapping appointment rows needed.\n   * This is a simplified version for timeline month view.\n   */\n  protected calculateMaxOverlappingRows(appointments: AXSchedulerAppointmentSegment[]): number {\n    if (appointments.length === 0) return 1;\n\n    // For timeline month view, we'll use a simple approach\n    // Each appointment takes one row, so the max overlapping rows is just the count\n    return Math.max(1, appointments.length);\n  }\n\n  protected shouldShowCurrentTimeForDay(dayDate: AXDateTime): boolean {\n    const now = this.calendarService.create(new Date(), this.calendar());\n    const monthStart = this.date().startOf('month');\n    const monthEnd = this.date().endOf('month');\n\n    // Check if current time is within the displayed month range\n    if (now.isBefore(monthStart) || now.isAfter(monthEnd)) {\n      return false;\n    }\n\n    // Check if current time is on the same day as this day column\n    return now.isSame(dayDate, 'day');\n  }\n}\n","@if (resources().length === 0 || !showResourceHeaders()) {\n  <!-- Original layout when no resources -->\n  <div class=\"ax-scheduler-timeline-month-wrapper\">\n    <!-- Spanning appointments layer -->\n    @if (spanningAppointments().length > 0) {\n      <div class=\"ax-scheduler-timeline-month-spanning-layer\" [style.--timeline-days-count]=\"processedDayData().length\">\n        @for (spanning of spanningAppointments(); track spanning.appointment.id) {\n          <div\n            axDrag\n            [dragCursor]=\"'grab'\"\n            [dragData]=\"spanning.appointment\"\n            [dragTransition]=\"false\"\n            [dragElementClone]=\"true\"\n            [dragStartDelay]=\"dragStartDelay()\"\n            [dragDisabled]=\"!draggable() || spanning.appointment.readonly || readonly()\"\n            (pointerdown)=\"getSlotId($event)\"\n            (click)=\"handleAppointmentEvent($event, spanning.appointment)\"\n            (dblclick)=\"handleAppointmentEvent($event, spanning.appointment)\"\n            (contextmenu)=\"handleAppointmentEvent($event, spanning.appointment)\"\n            [title]=\"\n              tooltipTemplate()\n                ? ''\n                : spanning.appointment.title +\n                  ' (' +\n                  (spanning.appointment.startDate\n                    | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                    | async) +\n                  ' - ' +\n                  (spanning.appointment.endDate | format: 'date' : { format: 'MMM d', calendar: calendar() } | async) +\n                  ')'\n            \"\n            class=\"ax-scheduler-timeline-spanning-appointment {{\n              spanning.appointment.cssClass ??\n                'ax-scheduler-' + (spanning.appointment.priority ?? 'primary') + '-priority'\n            }}\"\n            [class.ax-spanning-start-clipped]=\"spanning.isStartClipped\"\n            [class.ax-spanning-end-clipped]=\"spanning.isEndClipped\"\n            [class.ax-state-active]=\"isActive(spanning.appointment.id)\"\n            [style.grid-column]=\"spanning.startDayIndex + 1 + ' / span ' + spanning.spanCount\"\n            [style.grid-row]=\"spanning.rowIndex + 1\"\n            [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n            [axTooltip]=\"tooltipTemplate()\"\n            [axTooltipContext]=\"spanning.appointment\"\n          >\n            <span class=\"ax-spanning-appointment-title\">\n              <span class=\"ax-scheduler-truncate\">{{ spanning.appointment.title }}</span>\n              @if (hasActions()) {\n                <ax-icon\n                  (click)=\"handleActionClick($event, spanning.appointment)\"\n                  class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                ></ax-icon>\n              }\n            </span>\n          </div>\n        }\n      </div>\n    }\n\n    <div class=\"ax-scheduler-timeline-month-container\">\n      @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n        <div>\n          <div class=\"ax-scheduler-timeline-header\">\n            <div\n              [class.ax-state-today]=\"isToday(dayData.date)\"\n              class=\"ax-scheduler-month-header-date-day {{\n                dayData.holiday.state !== 'none' ? (dayData.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n              }}\"\n              [style.--ax-scheduler-holiday-color]=\"dayData.holiday.holiday?.color ?? null\"\n            >\n              <span\n                class=\"ax-scheduler-month-header-date-day-char ax-scheduler-truncate\"\n                [axTooltip]=\"(dayData.holiday.holiday?.description ?? dayData.holiday.holiday?.title ?? '') | translate | async\"\n              >\n                {{ dayData.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n                @if (dayData.holiday.state === 'holiday' && dayData.holiday.holiday.title) {\n                  ( {{ dayData.holiday.holiday.title | translate | async }} )\n                }\n              </span>\n              <span class=\"ax-scheduler-month-header-date-day-num\">\n                {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n              </span>\n            </div>\n          </div>\n\n          <div\n            axDropZone\n            #zone=\"axDropZone\"\n            (onElementDrop)=\"handleDrop($event, dayData.date)\"\n            [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n            class=\"ax-scheduler-timeline-content\"\n            (click)=\"handleSlotEvent($event, dayData.date)\"\n            (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n            (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n            [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n            [style.--spanning-rows-count]=\"maxSpanningRows()\"\n          >\n            <!-- Current Time Line Indicator -->\n            @if (\n              showCurrentTimeIndicator() &&\n              shouldShowCurrentTimeForDay(dayData.date) &&\n              getCurrentTimePosition() !== null\n            ) {\n              <div\n                class=\"ax-scheduler-current-time-line\"\n                [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n                #currentTimeLine\n              ></div>\n            }\n            <div class=\"ax-scheduler-timeline-appointment-container\">\n              @for (segment of dayData.visibleAppointments; track segment.id + segment.originalStartDate.getTime()) {\n                <div\n                  axDrag\n                  [dragData]=\"segment\"\n                  [dragCursor]=\"'grab'\"\n                  [dragTransition]=\"false\"\n                  [dragElementClone]=\"true\"\n                  [dragStartDelay]=\"dragStartDelay()\"\n                  [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n                  (pointerdown)=\"getSlotId($event)\"\n                  (click)=\"handleAppointmentEvent($event, segment)\"\n                  (dblclick)=\"handleAppointmentEvent($event, segment)\"\n                  (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n                  [title]=\"\n                    tooltipTemplate()\n                      ? ''\n                      : segment.title +\n                        ' (' +\n                        (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n                        ' - ' +\n                        (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n                        ')'\n                  \"\n                  class=\"ax-scheduler-timeline-appointment {{\n                    segment.cssClass ?? 'ax-scheduler-' + (segment.priority ?? 'primary') + '-priority'\n                  }}\"\n                  [class.ax-state-active]=\"isActive(segment.id)\"\n                  [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                  [axTooltip]=\"tooltipTemplate()\"\n                  [axTooltipContext]=\"segment\"\n                >\n                  <ax-title>\n                    <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n                    @if (hasActions()) {\n                      <ax-icon\n                        (click)=\"handleActionClick($event, segment)\"\n                        class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                      >\n                      </ax-icon>\n                    }\n                  </ax-title>\n                  <ax-subtitle>\n                    {{ segment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n                    -\n                    {{ segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n                  </ax-subtitle>\n                </div>\n              }\n              @if (dayData.moreCount > 0) {\n                <div #moreAppointments class=\"ax-scheduler-month-overflow-badge\" (click)=\"$event.stopPropagation()\">\n                  +{{\n                    '@acorex:common.general.more-items' | translate: { params: { number: dayData.moreCount } } | async\n                  }}\n                </div>\n                <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n                  <div\n                    axDropZone\n                    [class.ax-state-readonly]=\"readonly()\"\n                    class=\"ax-scheduler-popover ax-scheduler-month-popover-appointment\"\n                  >\n                    @for (\n                      segment of dayData.hiddenAppointments;\n                      track segment.id + segment.originalStartDate.getTime()\n                    ) {\n                      <div\n                        axDrag\n                        [dragData]=\"segment\"\n                        [dragCursor]=\"'grab'\"\n                        [dragTransition]=\"false\"\n                        [dragElementClone]=\"true\"\n                        [dragStartDelay]=\"dragStartDelay()\"\n                        [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n                        (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                        (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                        (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                        [title]=\"\n                          tooltipTemplate()\n                            ? ''\n                            : segment.title +\n                              ' (' +\n                              (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n                              ' - ' +\n                              (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n                              ')'\n                        \"\n                        class=\"ax-scheduler-popover-appointment {{\n                          segment.cssClass ?? 'ax-scheduler-' + (segment.priority ?? 'primary') + '-priority'\n                        }}\"\n                        [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                        [axTooltip]=\"tooltipTemplate()\"\n                        [axTooltipContext]=\"segment\"\n                      >\n                        <ax-title>\n                          <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n                          @if (hasActions()) {\n                            <ax-icon\n                              (click)=\"handleActionClick($event, segment)\"\n                              class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                            >\n                            </ax-icon>\n                          }\n                        </ax-title>\n                        <ax-subtitle>\n                          {{\n                            segment.originalStartDate\n                              | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n                              | async\n                          }}\n                          -\n                          {{\n                            segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n                          }}\n                        </ax-subtitle>\n                      </div>\n                    }\n                  </div>\n                </ax-popover>\n              }\n            </div>\n          </div>\n        </div>\n      }\n    </div>\n  </div>\n} @else {\n  <!-- Resource-based layout with sticky resources -->\n  <div class=\"ax-scheduler-timeline-month-resource-container\">\n    <!-- Sticky header with resource placeholder and day headers -->\n    @if (showResourceHeaders()) {\n      <div class=\"ax-scheduler-timeline-month-header-sticky\">\n        <div class=\"ax-scheduler-timeline-month-resource-header-placeholder\"><span>Resources</span></div>\n        @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n          <div class=\"ax-scheduler-timeline-month-day-header\">\n            <div\n              [class.ax-state-today]=\"isToday(dayData.date)\"\n              class=\"ax-scheduler-month-header-date-day {{\n                dayData.holiday?.state !== 'none' ? (dayData.holiday?.holiday?.cssClass ?? 'ax-state-holiday') : ''\n              }}\"\n              [style.--ax-scheduler-holiday-color]=\"dayData.holiday?.holiday?.color ?? null\"\n            >\n              <span\n                class=\"ax-scheduler-month-header-date-day-char ax-scheduler-truncate\"\n                [axTooltip]=\"(dayData.holiday?.holiday?.description ?? dayData.holiday?.holiday?.title ?? '') | translate | async\"\n              >\n                {{ dayData.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n                @if (dayData.holiday?.state === 'holiday' && dayData.holiday?.holiday?.title) {\n                  ( {{ dayData.holiday.holiday.title | translate | async }} )\n                }\n              </span>\n              <span class=\"ax-scheduler-month-header-date-day-num\">\n                {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n              </span>\n            </div>\n          </div>\n        }\n      </div>\n    }\n\n    <!-- Resource rows with sticky resource headers -->\n    <div class=\"ax-scheduler-timeline-month-resource-rows\">\n      <!-- Current Time Line Indicator -->\n      @if (showCurrentTimeIndicator() && getCurrentTimePosition() !== null) {\n        <div\n          class=\"ax-scheduler-current-time-line\"\n          [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n          #currentTimeLine\n        ></div>\n      }\n\n      @for (resourceId of resourceIds(); track resourceId) {\n        <div\n          class=\"ax-scheduler-timeline-month-resource-row\"\n          [style.--resource-spanning-rows-count]=\"getMaxSpanningRowsForResource(resourceId)\"\n        >\n          @if (showResourceHeaders()) {\n            <!-- Sticky Resource Header -->\n            <div class=\"ax-scheduler-timeline-month-resource-header ax-scheduler-timeline-month-resource-header-sticky\">\n              @if (resourceTemplate() && typeof resourceTemplate() !== 'string') {\n                <ng-container\n                  [ngTemplateOutlet]=\"$any(resourceTemplate())\"\n                  [ngTemplateOutletContext]=\"{\n                    $implicit: getResourceContext(resourceId),\n                    resource: getResourceContext(resourceId),\n                    resourceId: resourceId,\n                  }\"\n                ></ng-container>\n              } @else {\n                <span class=\"ax-scheduler-timeline-month-resource-title\">{{ getResourceTitle(resourceId) }}</span>\n              }\n            </div>\n          }\n\n          <!-- Resource Content -->\n          <div class=\"ax-scheduler-timeline-month-resource-content\">\n            <!-- Spanning appointments layer for this resource -->\n            @if (getSpanningAppointmentsForResource(resourceId).length > 0) {\n              <div\n                class=\"ax-scheduler-timeline-resource-spanning-layer\"\n                [style.--timeline-days-count]=\"processedDayData().length\"\n              >\n                @for (spanning of getSpanningAppointmentsForResource(resourceId); track spanning.appointment.id) {\n                  <div\n                    axDrag\n                    [dragCursor]=\"'grab'\"\n                    [dragData]=\"spanning.appointment\"\n                    [dragTransition]=\"false\"\n                    [dragElementClone]=\"true\"\n                    [dragStartDelay]=\"dragStartDelay()\"\n                    [dragDisabled]=\"!draggable() || spanning.appointment.readonly || readonly()\"\n                    (pointerdown)=\"getSlotId($event)\"\n                    (click)=\"handleAppointmentEvent($event, spanning.appointment)\"\n                    (dblclick)=\"handleAppointmentEvent($event, spanning.appointment)\"\n                    (contextmenu)=\"handleAppointmentEvent($event, spanning.appointment)\"\n                    [title]=\"\n                      tooltipTemplate()\n                        ? ''\n                        : spanning.appointment.title +\n                          ' (' +\n                          (spanning.appointment.startDate\n                            | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                            | async) +\n                          ' - ' +\n                          (spanning.appointment.endDate\n                            | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                            | async) +\n                          ')'\n                    \"\n                    class=\"ax-scheduler-timeline-spanning-appointment {{\n                      spanning.appointment.cssClass ??\n                        'ax-scheduler-' + (spanning.appointment.priority ?? 'primary') + '-priority'\n                    }}\"\n                    [class.ax-spanning-start-clipped]=\"spanning.isStartClipped\"\n                    [class.ax-spanning-end-clipped]=\"spanning.isEndClipped\"\n                    [class.ax-state-active]=\"isActive(spanning.appointment.id)\"\n                    [style.grid-column]=\"spanning.startDayIndex + 1 + ' / span ' + spanning.spanCount\"\n                    [style.grid-row]=\"spanning.rowIndex + 1\"\n                    [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                    [axTooltip]=\"tooltipTemplate()\"\n                    [axTooltipContext]=\"spanning.appointment\"\n                  >\n                    <span class=\"ax-spanning-appointment-title\">\n                      <span class=\"ax-scheduler-truncate\">{{ spanning.appointment.title }}</span>\n                      @if (hasActions()) {\n                        <ax-icon\n                          (click)=\"handleActionClick($event, spanning.appointment)\"\n                          class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                        ></ax-icon>\n                      }\n                    </span>\n                  </div>\n                }\n              </div>\n            }\n\n            @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n              <div\n                axDropZone\n                #zone=\"axDropZone\"\n                (onElementDrop)=\"handleDrop($event, dayData.date, resourceId)\"\n                [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n                class=\"ax-scheduler-timeline-content\"\n                (click)=\"handleSlotEvent($event, dayData.date)\"\n                (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n                (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n                [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n                [attr.data-resource-id]=\"resourceId\"\n                [style.--spanning-rows-count]=\"getMaxSpanningRowsForResource(resourceId)\"\n              >\n                <div class=\"ax-scheduler-timeline-appointment-container\">\n                  @for (\n                    segment of getAppointmentsForResourceAndDay(resourceId, dayData).visible;\n                    track segment.id + segment.originalStartDate.getTime()\n                  ) {\n                    <div\n                      axDrag\n                      [dragData]=\"segment\"\n                      [dragCursor]=\"'grab'\"\n                      [dragTransition]=\"false\"\n                      [dragElementClone]=\"true\"\n                      [dragStartDelay]=\"dragStartDelay()\"\n                      [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n                      (pointerdown)=\"getSlotId($event)\"\n                      (click)=\"handleAppointmentEvent($event, segment)\"\n                      (dblclick)=\"handleAppointmentEvent($event, segment)\"\n                      (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n                      [title]=\"\n                        tooltipTemplate()\n                          ? ''\n                          : segment.allDay\n                            ? segment.title +\n                              ' (' +\n                              (segment.originalStartDate\n                                | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                                | async) +\n                              ' - ' +\n                              (segment.originalEndDate\n                                | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                                | async) +\n                              ')'\n                            : segment.title +\n                              ' (' +\n                              (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n                              ' - ' +\n                              (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n                              ')'\n                      \"\n                      class=\"ax-scheduler-timeline-appointment {{\n                        segment.cssClass ?? 'ax-scheduler-' + (segment.priority ?? 'primary') + '-priority'\n                      }}\"\n                      [class.all-day-segment]=\"segment.allDay\"\n                      [class.ax-state-active]=\"isActive(segment.id)\"\n                      [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                      [axTooltip]=\"tooltipTemplate()\"\n                      [axTooltipContext]=\"segment\"\n                    >\n                      <ax-title>\n                        <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n                        @if (hasActions()) {\n                          <ax-icon\n                            (click)=\"handleActionClick($event, segment)\"\n                            class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                          >\n                          </ax-icon>\n                        }\n                      </ax-title>\n                      <ax-subtitle>\n                        @if (segment.allDay) {\n                          {{\n                            segment.originalStartDate\n                              | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                              | async\n                          }}\n                          @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n                            -\n                            {{\n                              segment.originalEndDate\n                                | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                                | async\n                            }}\n                          }\n                        } @else {\n                          {{\n                            segment.originalStartDate\n                              | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n                              | async\n                          }}\n                          -\n                          {{\n                            segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n                          }}\n                        }\n                      </ax-subtitle>\n                    </div>\n                  }\n                  @if (getAppointmentsForResourceAndDay(resourceId, dayData).moreCount > 0) {\n                    <div #moreAppointments class=\"ax-scheduler-month-overflow-badge\" (click)=\"$event.stopPropagation()\">\n                      +{{\n                        '@acorex:common.general.more-items'\n                          | translate\n                            : { params: { number: getAppointmentsForResourceAndDay(resourceId, dayData).moreCount } }\n                          | async\n                      }}\n                    </div>\n                    <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n                      <div\n                        axDropZone\n                        [class.ax-state-readonly]=\"readonly()\"\n                        class=\"ax-scheduler-popover ax-scheduler-month-popover-appointment\"\n                      >\n                        @for (\n                          segment of getAppointmentsForResourceAndDay(resourceId, dayData).hidden;\n                          track segment.id + segment.originalStartDate.getTime()\n                        ) {\n                          <div\n                            axDrag\n                            [dragData]=\"segment\"\n                            [dragCursor]=\"'grab'\"\n                            [dragTransition]=\"false\"\n                            [dragElementClone]=\"true\"\n                            [dragStartDelay]=\"dragStartDelay()\"\n                            [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n                            (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                            (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                            (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                            [title]=\"\n                              tooltipTemplate()\n                                ? ''\n                                : segment.allDay\n                                  ? segment.title +\n                                    ' (' +\n                                    (segment.originalStartDate\n                                      | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                                      | async) +\n                                    ' - ' +\n                                    (segment.originalEndDate\n                                      | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                                      | async) +\n                                    ')'\n                                  : segment.title +\n                                    ' (' +\n                                    (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n                                    ' - ' +\n                                    (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n                                    ')'\n                            \"\n                            class=\"ax-scheduler-popover-appointment {{\n                              segment.cssClass ?? 'ax-scheduler-' + (segment.priority ?? 'primary') + '-priority'\n                            }}\"\n                            [class.all-day-segment]=\"segment.allDay\"\n                            [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                            [axTooltip]=\"tooltipTemplate()\"\n                            [axTooltipContext]=\"segment\"\n                          >\n                            <ax-title>\n                              <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n                              @if (hasActions()) {\n                                <ax-icon\n                                  (click)=\"handleActionClick($event, segment)\"\n                                  class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                                >\n                                </ax-icon>\n                              }\n                            </ax-title>\n                            <ax-subtitle>\n                              @if (segment.allDay) {\n                                {{\n                                  segment.originalStartDate\n                                    | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                                    | async\n                                }}\n                                @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n                                  -\n                                  {{\n                                    segment.originalEndDate\n                                      | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                                      | async\n                                  }}\n                                }\n                              } @else {\n                                {{\n                                  segment.originalStartDate\n                                    | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n                                    | async\n                                }}\n                                -\n                                {{\n                                  segment.originalEndDate\n                                    | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n                                    | async\n                                }}\n                              }\n                            </ax-subtitle>\n                          </div>\n                        }\n                      </div>\n                    </ax-popover>\n                  }\n                </div>\n              </div>\n            }\n          </div>\n        </div>\n      }\n    </div>\n  </div>\n}\n","// prettier-ignore\nimport { AXDragDirective } from '@acorex/cdk/drag-drop';\n// prettier-ignore\nimport { AXComponent,NXComponent } from '@acorex/cdk/common';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgTemplateOutlet } from '@angular/common';\nimport {\n  AfterViewInit,\n  Component,\n  computed,\n  DestroyRef,\n  ElementRef,\n  inject,\n  input,\n  OnDestroy,\n  output,\n  TemplateRef,\n  viewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { isEqual } from 'lodash-es';\nimport { AXSchedulerAppointment, AXSchedulerResource } from '../../scheduler.class';\nimport {\n  AXSchedulerAppointmentMouseEvent,\n  AXSchedulerComponent,\n  AXSchedulerSlotDropEvent,\n  AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\nimport { AXSchedulerTimelineDayViewComponent } from '../timeline-day/scheduler-timeline-day-view.component';\n\n/**\n * Represents a spanning appointment in the timeline-weekly view.\n */\ninterface AXSchedulerTimelineWeeklySpanningAppointment {\n  appointment: AXSchedulerAppointment;\n  startDayIndex: number;\n  spanCount: number;\n  rowIndex: number;\n  isStartClipped: boolean;\n  isEndClipped: boolean;\n  resourceId?: unknown;\n}\n\nexport interface TimelineWeeklyDaySlot {\n  date: AXDateTime;\n  // Pass the RAW original appointments that *overlap* with this day.\n  // The child timeline-day-view will handle segmentation.\n  originalAppointmentsForThisDay: AXSchedulerAppointment[];\n  holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate };\n}\n\n@Component({\n  selector: 'ax-scheduler-timeline-weekly-view',\n  templateUrl: './scheduler-timeline-weekly-view.component.html',\n  styleUrl: './scheduler-timeline-weekly-view.component.css',\n\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    '[class.ax-state-readonly]': 'readonly()',\n  },\n  imports: [\n    AsyncPipe,\n    NgTemplateOutlet,\n    AXFormatPipe,\n    AXTranslatorPipe,\n    AXDragDirective,\n    AXTooltipDirective,\n    AXDecoratorIconComponent,\n    AXSchedulerTimelineDayViewComponent,\n  ],\n  providers: [{ provide: AXComponent, useExisting: AXSchedulerTimelineWeeklyViewComponent }],\n})\nexport class AXSchedulerTimelineWeeklyViewComponent extends NXComponent implements AfterViewInit, OnDestroy {\n  private destroyRef = inject(DestroyRef);\n  private scheduler = inject(AXSchedulerComponent);\n  private calendarService = inject(AXCalendarService);\n  private schedulerService = inject(AXSchedulerService);\n\n  private resizeObserverCleanup?: () => void;\n\n  daysCount = input(7);\n  readonly = input(false);\n  draggable = input(true);\n  hasActions = input(false);\n  dragStartDelay = input(0);\n  calendar = input<string>();\n  showResourceHeaders = input(true);\n  date = input.required<AXDateTime>();\n  endDayHour = input.required<number>();\n  selectedAppointmentId = input<string | number | null>(null);\n\n  protected isActive(appointmentId: string | number): boolean {\n    return this.selectedAppointmentId() === appointmentId;\n  }\n  showCurrentTimeIndicator = input(true);\n  scrollToCurrentTimeIndicator = input<boolean>(false);\n  startDayHour = input.required<number>();\n  showUnassignedAppointments = input(true);\n  resources = input<AXSchedulerResource[]>([]);\n  resourceTemplate = input<TemplateRef<unknown>>();\n  appointments = input<AXSchedulerAppointment[]>([]);\n  tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n  currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n  protected daysDataForTimelineViews = computed<TimelineWeeklyDaySlot[]>(() => {\n    const allOriginalAppointments = this.appointments();\n    const multiViewStartDate = this.date();\n    const numberOfDays = this.daysCount();\n\n    if (!multiViewStartDate || !allOriginalAppointments) {\n      return [];\n    }\n\n    const result: TimelineWeeklyDaySlot[] = [];\n\n    for (let i = 0; i < numberOfDays; i++) {\n      const currentDayDate = multiViewStartDate.add('day', i);\n      const currentDayStart = currentDayDate.startOf('day');\n      const currentDayEnd = currentDayDate.endOf('day');\n\n      // Filter appointments that overlap with this day, preserving original times\n      const appointmentsForThisDay = allOriginalAppointments.filter((appt) => {\n        const apptStart = this.calendarService.create(appt.startDate, this.calendar());\n        const apptEnd = this.calendarService.create(appt.endDate, this.calendar());\n\n        // Check if appointment overlaps with this day\n        return apptStart.compare(currentDayEnd, 'second') <= 0 && apptEnd.compare(currentDayStart, 'second') >= 0;\n      });\n\n      result.push({\n        date: currentDayDate,\n        holiday: this.isHoliday(currentDayDate),\n        originalAppointmentsForThisDay: appointmentsForThisDay,\n      });\n    }\n    return result;\n  });\n\n  /**\n   * Checks if an appointment spans multiple days.\n   */\n  private isMultiDayAppointment(appointment: AXSchedulerAppointment): boolean {\n    const start = this.calendarService.create(appointment.startDate, this.calendar());\n    const end = this.calendarService.create(appointment.endDate, this.calendar());\n    return !start.equal(end, 'day');\n  }\n\n  /**\n   * Computes spanning appointments for multi-day events across the view.\n   */\n  protected spanningAppointments = computed<AXSchedulerTimelineWeeklySpanningAppointment[]>(() => {\n    const allAppointments = this.appointments();\n    const daysData = this.daysDataForTimelineViews();\n    const resources = this.resources();\n    const showUnassigned = this.showUnassignedAppointments();\n\n    if (!daysData.length || !allAppointments.length) return [];\n\n    const viewStartDate = daysData[0].date.startOf('day');\n    const viewEndDate = daysData[daysData.length - 1].date.endOf('day');\n\n    // Filter multi-day appointments\n    const multiDayAppointments = allAppointments.filter((appt) => this.isMultiDayAppointment(appt));\n\n    const spanningResults: AXSchedulerTimelineWeeklySpanningAppointment[] = [];\n\n    // Group by resource if resources are present\n    const resourceIds =\n      resources.length > 0 ? this.schedulerService.getAllResourceIds(resources, showUnassigned) : [undefined];\n\n    for (const resourceId of resourceIds) {\n      // Filter appointments for this resource\n      const resourceAppointments =\n        resources.length > 0\n          ? multiDayAppointments.filter((appt) => {\n              if (resourceId === 'unassigned') {\n                return appt.resourceId === undefined || appt.resourceId === null;\n              }\n              return isEqual(appt.resourceId, resourceId);\n            })\n          : multiDayAppointments;\n\n      // Track occupied rows per day for this resource\n      const rowOccupancy = new Map<number, Set<number>>(); // dayIndex -> Set of occupied columns\n\n      for (const appt of resourceAppointments) {\n        const apptStart = this.calendarService.create(appt.startDate, this.calendar()).startOf('day');\n        const apptEnd = this.calendarService.create(appt.endDate, this.calendar()).startOf('day');\n\n        // Check if appointment overlaps with view\n        if (apptEnd.isBefore(viewStartDate) || apptStart.isAfter(viewEndDate)) {\n          continue;\n        }\n\n        // Calculate visible start and end day indices\n        let startDayIndex = 0;\n        let isStartClipped = false;\n        if (apptStart.isBefore(viewStartDate)) {\n          startDayIndex = 0;\n          isStartClipped = true;\n        } else {\n          for (let i = 0; i < daysData.length; i++) {\n            if (apptStart.equal(daysData[i].date, 'day')) {\n              startDayIndex = i;\n              break;\n            }\n          }\n        }\n\n        let endDayIndex = daysData.length - 1;\n        let isEndClipped = false;\n        if (apptEnd.isAfter(viewEndDate)) {\n          endDayIndex = daysData.length - 1;\n          isEndClipped = true;\n        } else {\n          for (let i = 0; i < daysData.length; i++) {\n            if (apptEnd.equal(daysData[i].date, 'day')) {\n              endDayIndex = i;\n              break;\n            }\n          }\n        }\n\n        const spanCount = endDayIndex - startDayIndex + 1;\n\n        // Find available row\n        let rowIndex = 0;\n        let foundRow = false;\n        while (!foundRow) {\n          let canUseRow = true;\n          for (let d = startDayIndex; d <= endDayIndex; d++) {\n            const occupiedRows = rowOccupancy.get(d) ?? new Set<number>();\n            if (occupiedRows.has(rowIndex)) {\n              canUseRow = false;\n              break;\n            }\n          }\n          if (canUseRow) {\n            foundRow = true;\n          } else {\n            rowIndex++;\n          }\n        }\n\n        // Mark row as occupied\n        for (let d = startDayIndex; d <= endDayIndex; d++) {\n          if (!rowOccupancy.has(d)) {\n            rowOccupancy.set(d, new Set<number>());\n          }\n          rowOccupancy.get(d)?.add(rowIndex);\n        }\n\n        spanningResults.push({\n          appointment: appt,\n          startDayIndex,\n          spanCount,\n          rowIndex,\n          isStartClipped,\n          isEndClipped,\n          resourceId,\n        });\n      }\n    }\n\n    return spanningResults;\n  });\n\n  /**\n   * Gets the set of multi-day appointment IDs to exclude from individual day views.\n   */\n  protected multiDayAppointmentIds = computed<Set<unknown>>(() => {\n    const allAppointments = this.appointments();\n    const ids = new Set<unknown>();\n    for (const appt of allAppointments) {\n      if (this.isMultiDayAppointment(appt)) {\n        ids.add(appt.id);\n      }\n    }\n    return ids;\n  });\n\n  /**\n   * Gets spanning appointments filtered for a specific resource.\n   */\n  protected getSpanningAppointmentsForResource(resourceId: unknown): AXSchedulerTimelineWeeklySpanningAppointment[] {\n    const all = this.spanningAppointments();\n    if (resourceId === undefined) {\n      return all.filter((s) => s.resourceId === undefined);\n    }\n    return all.filter((s) => isEqual(s.resourceId, resourceId));\n  }\n\n  /**\n   * Gets the maximum number of spanning rows for a resource.\n   */\n  protected getMaxSpanningRowsForResource(resourceId: unknown): number {\n    const spanning = this.getSpanningAppointmentsForResource(resourceId);\n    if (spanning.length === 0) return 0;\n    return Math.max(...spanning.map((s) => s.rowIndex)) + 1;\n  }\n\n  /**\n   * Gets the maximum number of spanning rows across all appointments (for non-resource layouts).\n   */\n  protected maxSpanningRows = computed<number>(() => {\n    const spanning = this.spanningAppointments();\n    if (spanning.length === 0) return 0;\n    return Math.max(...spanning.map((s) => s.rowIndex)) + 1;\n  });\n\n  /**\n   * Filters appointments for a day, excluding multi-day appointments.\n   */\n  protected getFilteredAppointmentsForDay(originalAppointments: AXSchedulerAppointment[]): AXSchedulerAppointment[] {\n    const multiDayIds = this.multiDayAppointmentIds();\n    return originalAppointments.filter((appt) => !multiDayIds.has(appt.id));\n  }\n\n  /**\n   * Handles clicking on a spanning appointment.\n   */\n  protected handleSpanningAppointmentEvent(event: MouseEvent, appointment: AXSchedulerAppointment) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const appointmentEvent: AXSchedulerAppointmentMouseEvent = {\n      sender: this.scheduler,\n      nativeEvent: event,\n      appointment,\n    };\n\n    switch (event.type) {\n      case 'click':\n        this.appointmentClickedInternal.emit(appointmentEvent);\n        break;\n      case 'dblclick':\n        this.appointmentDblClickedInternal.emit(appointmentEvent);\n        break;\n      case 'contextmenu':\n        this.appointmentRightClickedInternal.emit(appointmentEvent);\n        break;\n    }\n  }\n\n  /**\n   * Handles action click on spanning appointment.\n   */\n  protected handleSpanningActionClick(event: MouseEvent, appointment: AXSchedulerAppointment) {\n    event.stopPropagation();\n    this.onActionClickInternal.emit({\n      sender: this.scheduler,\n      nativeEvent: event,\n      appointment,\n    });\n  }\n\n  slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n  onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n  protected handleDrop(event: AXSchedulerSlotDropEvent, resourceId: any) {\n    // Convert 'unassigned' string to undefined for proper unassigned appointments\n    const actualResourceId = resourceId === 'unassigned' ? undefined : resourceId;\n\n    // Use the isSameSlotDrop value from the child timeline-day-view component\n    // The child component has the proper context for its own day\n    const isSameSlotDrop = event.isSameSlotDrop;\n\n    // Update the slot with the correct resource ID\n    const updatedEvent: AXSchedulerSlotDropEvent = {\n      ...event,\n      slot: {\n        ...event.slot,\n        resourceId: actualResourceId,\n      },\n      isSameSlotDrop,\n    };\n\n    this.onAppointmentDropInternal.emit(updatedEvent);\n  }\n\n  protected isToday(date: AXDateTime): boolean {\n    const today = this.calendarService.create(new Date());\n    return date.equal(today, 'day');\n  }\n\n  /**\n   * Gets appointments grouped by resources for timeline view.\n   */\n  protected appointmentsByResource = computed(() => {\n    const allAppointments = this.appointments();\n    const resources = this.resources();\n    const showUnassigned = this.showUnassignedAppointments();\n\n    return this.schedulerService.filterAppointmentsByResources(allAppointments, resources, showUnassigned);\n  });\n\n  /**\n   * Gets all resource IDs including unassigned if applicable.\n   */\n  protected resourceIds = computed(() => {\n    const resources = this.resources();\n    const showUnassigned = this.showUnassignedAppointments();\n\n    return this.schedulerService.getAllResourceIds(resources, showUnassigned);\n  });\n\n  /**\n   * Gets appointments for a specific resource.\n   */\n  protected getAppointmentsForResource(resourceId: any): AXSchedulerAppointment[] {\n    const appointmentsByResource = this.appointmentsByResource();\n    // Find the correct key in the Map using isEqual for proper comparison\n    for (const [key, appointments] of appointmentsByResource.entries()) {\n      if (key === 'unassigned' && resourceId === 'unassigned') {\n        return appointments;\n      }\n      if (key !== 'unassigned' && isEqual(key, resourceId)) {\n        return appointments;\n      }\n    }\n    return [];\n  }\n\n  /**\n   * Gets resource title by ID.\n   */\n  protected getResourceTitle(resourceId: any): string {\n    if (resourceId === 'unassigned') {\n      return 'Unassigned';\n    }\n    const resources = this.resources();\n    const resource = resources.find((r) => isEqual(r.id, resourceId));\n    return resource?.title || String(resourceId);\n  }\n\n  protected getResourceContext(resourceId: any) {\n    const resources = this.resources();\n    const resource = resources.find((r) => isEqual(r.id, resourceId));\n    return resource || { id: resourceId, title: String(resourceId) };\n  }\n\n  protected getCurrentTimePosition(): number | null {\n    const now = this.calendarService.create(new Date(), this.calendar());\n    const startHour = this.startDayHour();\n    const endHour = this.endDayHour();\n\n    // Check if current time is within the visible hours\n    if (now.hour < startHour || now.hour >= endHour) {\n      return null;\n    }\n\n    // Calculate position as percentage within the visible time range\n    const currentMinutes = now.hour * 60 + now.minute;\n    const startMinutes = startHour * 60;\n    const endMinutes = endHour * 60;\n    const totalMinutes = endMinutes - startMinutes;\n\n    const positionInMinutes = currentMinutes - startMinutes;\n    return (positionInMinutes / totalMinutes) * 100;\n  }\n\n  protected shouldShowCurrentTimeForDay(dayDate: AXDateTime): boolean {\n    const now = this.calendarService.create(new Date(), this.calendar());\n    const multiViewStart = this.date();\n    const multiViewEnd = this.date().add('day', this.daysCount() - 1);\n\n    // Check if current time is within the displayed multi-day range\n    if (now.isBefore(multiViewStart) || now.isAfter(multiViewEnd)) {\n      return false;\n    }\n\n    // Check if current time is on the same day as this day column\n    return now.isSame(dayDate, 'day');\n  }\n\n  ngAfterViewInit() {\n    // Auto-scroll to current time when available using ResizeObserver\n    this.resizeObserverCleanup = this.setupCurrentTimeScroll();\n\n    // Register cleanup with DestroyRef\n    this.destroyRef.onDestroy(() => {\n      this.resizeObserverCleanup?.();\n    });\n  }\n\n  ngOnDestroy() {\n    this.resizeObserverCleanup?.();\n  }\n\n  private setupCurrentTimeScroll(): (() => void) | undefined {\n    if (!this.showCurrentTimeIndicator() || !this.scrollToCurrentTimeIndicator()) {\n      return undefined;\n    }\n\n    const now = this.calendarService.create(new Date(), this.calendar());\n    const multiViewStart = this.date();\n    const multiViewEnd = this.date().add('day', this.daysCount() - 1);\n\n    // Check if current time is within the displayed multi-day range\n    if (now.isBefore(multiViewStart) || now.isAfter(multiViewEnd)) {\n      return undefined;\n    }\n\n    const currentPosition = this.getCurrentTimePosition();\n    if (currentPosition === null) {\n      return undefined;\n    }\n\n    const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n    if (!timeLineElement) {\n      return undefined;\n    }\n\n    // Use ResizeObserver to detect when the element is properly rendered\n    const resizeObserver = new ResizeObserver((entries) => {\n      for (const entry of entries) {\n        if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n          // Element has proper dimensions, scroll to it\n          timeLineElement.scrollIntoView({\n            behavior: 'smooth',\n            block: 'nearest',\n            inline: 'center',\n          });\n          // Disconnect observer after successful scroll\n          resizeObserver.disconnect();\n          break;\n        }\n      }\n    });\n\n    resizeObserver.observe(timeLineElement);\n\n    // Cleanup on component destroy\n    return () => resizeObserver.disconnect();\n  }\n\n  /**\n   * Gets appointments for a specific resource and day.\n   */\n  protected getAppointmentsForResourceAndDay(\n    resourceId: any,\n    dayAppointments: AXSchedulerAppointment[],\n  ): AXSchedulerAppointment[] {\n    if (resourceId === 'unassigned') {\n      return dayAppointments.filter(\n        (appointment) => appointment.resourceId === undefined || appointment.resourceId === null,\n      );\n    }\n    // Use isEqual for proper comparison of resource IDs of any type\n    return dayAppointments.filter((appointment) => isEqual(appointment.resourceId, resourceId));\n  }\n\n  /**\n   * Gets the height for a specific resource across all days.\n   */\n  protected getResourceRowHeight(resourceId: unknown): string {\n    // Calculate the maximum height needed for this specific resource across all days\n    const daysData = this.daysDataForTimelineViews();\n    const multiDayIds = this.multiDayAppointmentIds();\n    let maxAppointmentRows = 1; // Minimum appointment rows\n\n    for (const daySlot of daysData) {\n      // Get appointments for this resource, excluding multi-day ones (they're in spanning layer)\n      const allAppointments = this.getAppointmentsForResourceAndDay(resourceId, daySlot.originalAppointmentsForThisDay);\n      const singleDayAppointments = allAppointments.filter((appt) => !multiDayIds.has(appt.id));\n\n      if (singleDayAppointments.length > 0) {\n        // Calculate overlapping rows for this resource on this day\n        const overlappingRows = this.calculateMaxOverlappingRowsForAppointments(singleDayAppointments, daySlot.date);\n        maxAppointmentRows = Math.max(maxAppointmentRows, overlappingRows);\n      }\n    }\n\n    // Get spanning rows count for this resource\n    const spanningRowsCount = this.getMaxSpanningRowsForResource(resourceId);\n\n    // Use CSS calc to return the height\n    // Formula: spanning_height + appointment_height\n    const GAP_PX = 4; // Same as in timeline-day component\n    const SPANNING_ROW_HEIGHT = 'var(--ax-scheduler-timeline-spanning-row-height)';\n    const SPANNING_GAP = 'var(--ax-scheduler-timeline-spanning-gap)';\n\n    if (spanningRowsCount > 0) {\n      // Height = spanning rows + appointments\n      return `calc(${spanningRowsCount} * (${SPANNING_ROW_HEIGHT} + ${SPANNING_GAP}) + var(--ax-comp-scheduler-basic-view-blocks-height) * ${maxAppointmentRows} + ${GAP_PX}px * ${Math.max(0, maxAppointmentRows - 1)} + 0.25rem)`;\n    } else {\n      // No spanning rows, just appointments\n      return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${maxAppointmentRows} + ${GAP_PX}px * ${Math.max(0, maxAppointmentRows - 1)})`;\n    }\n  }\n\n  /**\n   * Calculates the maximum number of overlapping rows for a set of appointments.\n   * Uses the actual segmented times that will be displayed in the timeline view.\n   */\n  private calculateMaxOverlappingRowsForAppointments(\n    appointments: AXSchedulerAppointment[],\n    dayDate: AXDateTime,\n  ): number {\n    if (appointments.length === 0) return 1;\n    if (appointments.length === 1) return 1;\n\n    // Get the actual segments that will be displayed in the timeline view\n    const segments: any[] = [];\n    const viewConfigStartHour = this.startDayHour();\n    const viewConfigEndHour = this.endDayHour();\n\n    for (const appointment of appointments) {\n      if (appointment.allDay) {\n        // For all-day appointments, create a segment that spans the full day\n        const dayStart = this.calendarService.create(appointment.startDate, this.calendar()).startOf('day');\n        const dayEnd = this.calendarService.create(appointment.endDate, this.calendar()).startOf('day');\n\n        // Check if the all-day appointment overlaps with the current day\n        const currentDayStart = dayDate.startOf('day');\n        const currentDayEnd = dayDate.endOf('day');\n\n        if (dayStart.compare(currentDayEnd, 'day') <= 0 && dayEnd.compare(currentDayStart, 'day') >= 0) {\n          segments.push({\n            startDate: currentDayStart.date,\n            endDate: currentDayEnd.date,\n            allDay: true,\n          });\n        }\n      } else {\n        // For regular appointments, get the proper segment\n        const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(\n          appointment,\n          dayDate,\n          viewConfigStartHour,\n          viewConfigEndHour,\n          false,\n        );\n\n        if (segment) {\n          segments.push(segment);\n        }\n      }\n    }\n\n    if (segments.length === 0) return 1;\n    if (segments.length === 1) return 1;\n\n    // Sort segments by start time, then by end time (descending)\n    const sortedSegments = [...segments].sort((a, b) => {\n      const startDiff = a.startDate.getTime() - b.startDate.getTime();\n      if (startDiff !== 0) return startDiff;\n      return b.endDate.getTime() - a.endDate.getTime();\n    });\n\n    const rowEndTimes: Date[] = [];\n    let maxRows = 0;\n\n    for (const segment of sortedSegments) {\n      let assignedRowIndex = -1;\n\n      // Find the first row where this segment can fit\n      for (let i = 0; i < rowEndTimes.length; i++) {\n        if (segment.startDate >= rowEndTimes[i]) {\n          assignedRowIndex = i;\n          break;\n        }\n      }\n\n      // If no row is available, create a new one\n      if (assignedRowIndex === -1) {\n        assignedRowIndex = rowEndTimes.length;\n        rowEndTimes.push(segment.endDate);\n      } else {\n        rowEndTimes[assignedRowIndex] = segment.endDate;\n      }\n\n      maxRows = Math.max(maxRows, rowEndTimes.length);\n    }\n\n    return Math.max(maxRows, 1);\n  }\n\n  /**\n   * Gets the hours array for time slots display.\n   */\n  protected getHoursArray(): AXDateTime[] {\n    const startHour = this.startDayHour();\n    const endHour = this.endDayHour();\n    const hours: AXDateTime[] = [];\n\n    // Use the first day's date as a base for creating time slots\n    const firstDay = this.daysDataForTimelineViews()[0];\n    if (!firstDay) return [];\n\n    let time = firstDay.date.set('hour', startHour).startOf('hour');\n    hours.push(time);\n\n    while (time.hour < endHour - 1) {\n      time = time.add('hour', 1);\n      hours.push(time);\n    }\n\n    return hours;\n  }\n\n  /**\n   * Gets the number of hours for CSS calculations.\n   */\n  protected getHoursCount(): number {\n    return this.endDayHour() - this.startDayHour();\n  }\n\n  protected isHoliday(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n    const isHoliday = this.schedulerService.isHoliday(date);\n    if (isHoliday) {\n      const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n      const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n      const holiday = globalHoliday || internalHoliday;\n      return {\n        state: 'holiday',\n        holiday,\n      };\n    }\n    const isWeekend = this.schedulerService.isWeekend(date, this.calendar());\n    if (isWeekend) {\n      return { state: 'weekend' };\n    }\n    return { state: 'none' };\n  }\n}\n","@if (resources().length === 0 || !showResourceHeaders()) {\n  <!-- Original layout when no resources -->\n  <div class=\"ax-scheduler-timeline-day-view-container\" [style.--spanning-rows-count]=\"maxSpanningRows()\">\n    <!-- Spanning appointments layer -->\n    @if (spanningAppointments().length > 0) {\n      <div\n        class=\"ax-scheduler-timeline-weekly-spanning-layer\"\n        [style.--timeline-days-count]=\"daysDataForTimelineViews().length\"\n      >\n        @for (spanning of spanningAppointments(); track spanning.appointment.id) {\n          <div\n            axDrag\n            [dragCursor]=\"'grab'\"\n            [dragData]=\"spanning.appointment\"\n            [dragTransition]=\"false\"\n            [dragElementClone]=\"true\"\n            [dragStartDelay]=\"dragStartDelay()\"\n            [dragDisabled]=\"!draggable() || spanning.appointment.readonly || readonly()\"\n            (click)=\"handleSpanningAppointmentEvent($event, spanning.appointment)\"\n            (dblclick)=\"handleSpanningAppointmentEvent($event, spanning.appointment)\"\n            (contextmenu)=\"handleSpanningAppointmentEvent($event, spanning.appointment)\"\n            [title]=\"\n              spanning.appointment.title +\n              ' (' +\n              (spanning.appointment.startDate | format: 'date' : { format: 'MMM d', calendar: calendar() } | async) +\n              ' - ' +\n              (spanning.appointment.endDate | format: 'date' : { format: 'MMM d', calendar: calendar() } | async) +\n              ')'\n            \"\n            class=\"ax-scheduler-timeline-spanning-appointment {{\n              spanning.appointment.cssClass ??\n                'ax-scheduler-' + (spanning.appointment.priority ?? 'primary') + '-priority'\n            }}\"\n            [class.ax-spanning-start-clipped]=\"spanning.isStartClipped\"\n            [class.ax-spanning-end-clipped]=\"spanning.isEndClipped\"\n            [class.ax-state-active]=\"isActive(spanning.appointment.id)\"\n            [style.grid-column]=\"spanning.startDayIndex + 1 + ' / span ' + spanning.spanCount\"\n            [style.grid-row]=\"spanning.rowIndex + 1\"\n          >\n            <span class=\"ax-spanning-appointment-title\">\n              <span class=\"ax-scheduler-truncate\">{{ spanning.appointment.title }}</span>\n              @if (hasActions()) {\n                <ax-icon\n                  (click)=\"handleSpanningActionClick($event, spanning.appointment)\"\n                  class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                ></ax-icon>\n              }\n            </span>\n          </div>\n        }\n      </div>\n    }\n    @for (daySlot of daysDataForTimelineViews(); track daySlot.date.date.getTime()) {\n      <div class=\"ax-scheduler-timeline-weekly-column\">\n        <div\n          [class.ax-state-today]=\"isToday(daySlot.date)\"\n          class=\"ax-scheduler-week-header-date-day {{\n            daySlot.holiday.state !== 'none' ? (daySlot.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n          }}\"\n          [style.--ax-scheduler-holiday-color]=\"daySlot.holiday.holiday?.color ?? null\"\n        >\n          <span\n            class=\"ax-scheduler-week-header-date-day-char ax-scheduler-truncate\"\n            [axTooltip]=\"(daySlot.holiday.holiday?.description ?? daySlot.holiday.holiday?.title ?? '') | translate | async\"\n          >\n            {{ daySlot.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n            @if (daySlot.holiday.state === 'holiday' && daySlot.holiday.holiday.title) {\n              ( {{ daySlot.holiday.holiday.title | translate | async }} )\n            }\n          </span>\n          <span class=\"ax-scheduler-week-header-date-day-num\">\n            {{ daySlot.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n          </span>\n        </div>\n        <ax-scheduler-timeline-day-view\n          [date]=\"daySlot.date\"\n          [readonly]=\"readonly()\"\n          [draggable]=\"draggable()\"\n          [resources]=\"resources()\"\n          [endDayHour]=\"endDayHour()\"\n          [hasActions]=\"hasActions()\"\n          [showResourceHeaders]=\"true\"\n          [startDayHour]=\"startDayHour()\"\n          [dragStartDelay]=\"dragStartDelay()\"\n          [tooltipTemplate]=\"tooltipTemplate()\"\n          [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n          [appointments]=\"getFilteredAppointmentsForDay(daySlot.originalAppointmentsForThisDay)\"\n          [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n          (onActionClickInternal)=\"onActionClickInternal.emit($event)\"\n          (slotClickedInternal)=\"slotClickedInternal.emit($event)\"\n          (slotDblClickedInternal)=\"slotDblClickedInternal.emit($event)\"\n          (slotRightClickedInternal)=\"slotRightClickedInternal.emit($event)\"\n          (onAppointmentDropInternal)=\"handleDrop($event, undefined)\"\n          (appointmentClickedInternal)=\"appointmentClickedInternal.emit($event)\"\n          (appointmentDblClickedInternal)=\"appointmentDblClickedInternal.emit($event)\"\n          (appointmentRightClickedInternal)=\"appointmentRightClickedInternal.emit($event)\"\n        >\n        </ax-scheduler-timeline-day-view>\n      </div>\n    }\n  </div>\n} @else {\n  <!-- Resource-based layout for weekly -->\n  <div\n    class=\"ax-scheduler-timeline-weekly-resource-container\"\n    [style.--ax-comp-scheduler-hours-count]=\"getHoursCount()\"\n  >\n    <!-- Top header with day names -->\n    <div class=\"ax-scheduler-timeline-weekly-top-header\">\n      <!-- Resource placeholder -->\n      <div class=\"ax-scheduler-timeline-weekly-resource-header-placeholder\"></div>\n      <!-- Day headers -->\n      @for (daySlot of daysDataForTimelineViews(); track daySlot.date.date.getTime()) {\n        <div class=\"ax-scheduler-timeline-weekly-day-header\">\n          <div\n            [class.ax-state-today]=\"isToday(daySlot.date)\"\n            class=\"ax-scheduler-week-header-date-day {{\n              daySlot.holiday.state !== 'none' ? (daySlot.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n            }}\"\n            [style.--ax-scheduler-holiday-color]=\"daySlot.holiday.holiday?.color ?? null\"\n          >\n            <span\n              class=\"ax-scheduler-week-header-date-day-char ax-scheduler-truncate\"\n              [axTooltip]=\"(daySlot.holiday.holiday?.description ?? daySlot.holiday.holiday?.title ?? '') | translate | async\"\n            >\n              {{ daySlot.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n              @if (daySlot.holiday.state === 'holiday' && daySlot.holiday.holiday.title) {\n                ( {{ daySlot.holiday.holiday.title | translate | async }} )\n              }\n            </span>\n            <span class=\"ax-scheduler-week-header-date-day-num\">\n              {{ daySlot.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n            </span>\n          </div>\n        </div>\n      }\n    </div>\n\n    <!-- Time header with hours for each day -->\n    <div class=\"ax-scheduler-timeline-weekly-time-header\">\n      <!-- Resource placeholder -->\n      <div class=\"ax-scheduler-timeline-weekly-time-header-placeholder\"><span>Resources</span></div>\n      <!-- Time slots for each day -->\n      @for (daySlot of daysDataForTimelineViews(); track daySlot.date.date.getTime()) {\n        <div class=\"ax-scheduler-timeline-weekly-day-time-slots\">\n          @for (hour of getHoursArray(); track hour.date.getTime()) {\n            <div class=\"ax-scheduler-timeline-weekly-time-slot\">\n              <span>{{ hour | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n\n    <!-- Main content area -->\n    <div class=\"ax-scheduler-timeline-weekly-content\">\n      <!-- Resource headers column -->\n      <div class=\"ax-scheduler-timeline-weekly-resource-headers\">\n        <!-- Resource headers -->\n        @for (resourceId of resourceIds(); track resourceId) {\n          <div\n            class=\"ax-scheduler-timeline-weekly-resource-header\"\n            [style.height]=\"getResourceRowHeight(resourceId)\"\n            [style.--resource-spanning-rows-count]=\"getMaxSpanningRowsForResource(resourceId)\"\n          >\n            @if (resourceTemplate() && typeof resourceTemplate() !== 'string') {\n              <ng-container\n                [ngTemplateOutlet]=\"$any(resourceTemplate())\"\n                [ngTemplateOutletContext]=\"{\n                  $implicit: getResourceContext(resourceId),\n                  resource: getResourceContext(resourceId),\n                  resourceId: resourceId,\n                }\"\n              ></ng-container>\n            } @else {\n              <span class=\"ax-scheduler-timeline-resource-title\">{{ getResourceTitle(resourceId) }}</span>\n            }\n          </div>\n        }\n      </div>\n\n      <!-- Days columns -->\n      <div class=\"ax-scheduler-timeline-weekly-days-container\" #daysContainer>\n        @for (daySlot of daysDataForTimelineViews(); track daySlot.date.date.getTime(); let dayIndex = $index) {\n          <div class=\"ax-scheduler-timeline-weekly-column\">\n            <!-- Current Time Line Indicator for this day -->\n            @if (\n              showCurrentTimeIndicator() &&\n              shouldShowCurrentTimeForDay(daySlot.date) &&\n              getCurrentTimePosition() !== null\n            ) {\n              <div\n                class=\"ax-scheduler-current-time-line\"\n                [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n                #currentTimeLine\n              ></div>\n            }\n            <!-- Resource rows for this day -->\n            <div class=\"ax-scheduler-timeline-weekly-resource-rows\">\n              @for (resourceId of resourceIds(); track resourceId) {\n                <div\n                  class=\"ax-scheduler-timeline-weekly-resource-row\"\n                  [style.height]=\"getResourceRowHeight(resourceId)\"\n                  [style.--resource-spanning-rows-count]=\"getMaxSpanningRowsForResource(resourceId)\"\n                >\n                  <!-- Spanning layer for this resource (only on first day column) -->\n                  @if (dayIndex === 0 && getSpanningAppointmentsForResource(resourceId).length > 0) {\n                    <div\n                      class=\"ax-scheduler-timeline-resource-spanning-layer\"\n                      [style.--timeline-days-count]=\"daysDataForTimelineViews().length\"\n                    >\n                      @for (spanning of getSpanningAppointmentsForResource(resourceId); track spanning.appointment.id) {\n                        <div\n                          axDrag\n                          [dragCursor]=\"'grab'\"\n                          [dragData]=\"spanning.appointment\"\n                          [dragTransition]=\"false\"\n                          [dragElementClone]=\"true\"\n                          [dragStartDelay]=\"dragStartDelay()\"\n                          [dragDisabled]=\"!draggable() || spanning.appointment.readonly || readonly()\"\n                          (click)=\"handleSpanningAppointmentEvent($event, spanning.appointment)\"\n                          (dblclick)=\"handleSpanningAppointmentEvent($event, spanning.appointment)\"\n                          (contextmenu)=\"handleSpanningAppointmentEvent($event, spanning.appointment)\"\n                          [title]=\"\n                            spanning.appointment.title +\n                            ' (' +\n                            (spanning.appointment.startDate\n                              | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                              | async) +\n                            ' - ' +\n                            (spanning.appointment.endDate\n                              | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                              | async) +\n                            ')'\n                          \"\n                          class=\"ax-scheduler-timeline-spanning-appointment {{\n                            spanning.appointment.cssClass ??\n                              'ax-scheduler-' + (spanning.appointment.priority ?? 'primary') + '-priority'\n                          }}\"\n                          [class.ax-spanning-start-clipped]=\"spanning.isStartClipped\"\n                          [class.ax-spanning-end-clipped]=\"spanning.isEndClipped\"\n                          [class.ax-state-active]=\"isActive(spanning.appointment.id)\"\n                          [style.grid-column]=\"spanning.startDayIndex + 1 + ' / span ' + spanning.spanCount\"\n                          [style.grid-row]=\"spanning.rowIndex + 1\"\n                        >\n                          <span class=\"ax-spanning-appointment-title\">\n                            <span class=\"ax-scheduler-truncate\">{{ spanning.appointment.title }}</span>\n                            @if (hasActions()) {\n                              <ax-icon\n                                (click)=\"handleSpanningActionClick($event, spanning.appointment)\"\n                                class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                              ></ax-icon>\n                            }\n                          </span>\n                        </div>\n                      }\n                    </div>\n                  }\n                  <ax-scheduler-timeline-day-view\n                    [date]=\"daySlot.date\"\n                    [readonly]=\"readonly()\"\n                    [draggable]=\"draggable()\"\n                    [resources]=\"\n                      resourceId === 'unassigned' ? [] : [{ id: resourceId, title: getResourceTitle(resourceId) }]\n                    \"\n                    [endDayHour]=\"endDayHour()\"\n                    [hasActions]=\"hasActions()\"\n                    [showResourceHeaders]=\"false\"\n                    [startDayHour]=\"startDayHour()\"\n                    [showCurrentTimeIndicator]=\"false\"\n                    [dragStartDelay]=\"dragStartDelay()\"\n                    [tooltipTemplate]=\"tooltipTemplate()\"\n                    [showUnassignedAppointments]=\"resourceId === 'unassigned'\"\n                    [appointments]=\"\n                      getFilteredAppointmentsForDay(\n                        getAppointmentsForResourceAndDay(resourceId, daySlot.originalAppointmentsForThisDay)\n                      )\n                    \"\n                    (onActionClickInternal)=\"onActionClickInternal.emit($event)\"\n                    (slotClickedInternal)=\"slotClickedInternal.emit($event)\"\n                    (slotDblClickedInternal)=\"slotDblClickedInternal.emit($event)\"\n                    (slotRightClickedInternal)=\"slotRightClickedInternal.emit($event)\"\n                    (onAppointmentDropInternal)=\"handleDrop($event, resourceId)\"\n                    (appointmentClickedInternal)=\"appointmentClickedInternal.emit($event)\"\n                    (appointmentDblClickedInternal)=\"appointmentDblClickedInternal.emit($event)\"\n                    (appointmentRightClickedInternal)=\"appointmentRightClickedInternal.emit($event)\"\n                  >\n                  </ax-scheduler-timeline-day-view>\n                </div>\n              }\n            </div>\n          </div>\n        }\n      </div>\n    </div>\n  </div>\n}\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgTemplateOutlet } from '@angular/common';\nimport {\n  AfterViewInit,\n  Component,\n  computed,\n  DestroyRef,\n  DOCUMENT,\n  ElementRef,\n  inject,\n  input,\n  OnDestroy,\n  output,\n  signal,\n  TemplateRef,\n  viewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { isEqual, orderBy } from 'lodash-es';\nimport { AXSchedulerAppointment, AXSchedulerAppointmentSegment, AXSchedulerResource } from '../../scheduler.class';\nimport {\n  AXSchedulerAppointmentMouseEvent,\n  AXSchedulerComponent,\n  AXSchedulerSlotDropEvent,\n  AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\nexport interface TimelineYearViewDayData {\n  date: AXDateTime;\n  dayIndex: number; // 0-based index within the year\n  // These will be segments, precisely clipped and flagged for this day\n  visibleAppointments: AXSchedulerAppointmentSegment[];\n  hiddenAppointments: AXSchedulerAppointmentSegment[];\n  moreCount: number;\n  holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate };\n  // Resource-specific data\n  appointmentsByResource?: Map<\n    string,\n    { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number }\n  >;\n}\n\n// Represents a multi-day appointment spanning across multiple day columns\nexport type AXSchedulerTimelineYearSpanningAppointment = {\n  appointment: AXSchedulerAppointment;\n  startDayIndex: number; // 0-based index of the starting day in the year\n  spanCount: number; // Number of days this appointment spans\n  rowIndex: number; // Row index for stacking multiple spanning appointments\n  isStartClipped: boolean; // True if appointment starts before the visible range\n  isEndClipped: boolean; // True if appointment extends beyond the visible range\n};\n\n@Component({\n  selector: 'ax-scheduler-timeline-year-view',\n  templateUrl: './scheduler-timeline-year-view.component.html',\n  styleUrl: './scheduler-timeline-year-view.component.css',\n\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    '[class.ax-state-readonly]': 'readonly()',\n  },\n  imports: [\n    NgTemplateOutlet,\n    AsyncPipe,\n    AXFormatPipe,\n    AXDragDirective,\n    AXTranslatorPipe,\n    AXPopoverComponent,\n    AXTooltipDirective,\n    AXDropZoneDirective,\n    AXDecoratorIconComponent,\n    AXDecoratorGenericComponent,\n  ],\n  providers: [{ provide: AXComponent, useExisting: AXSchedulerTimelineYearViewComponent }],\n})\nexport class AXSchedulerTimelineYearViewComponent extends NXComponent implements AfterViewInit, OnDestroy {\n  private document = inject(DOCUMENT);\n  private destroyRef = inject(DestroyRef);\n  private scheduler = inject(AXSchedulerComponent);\n  private calendarService = inject(AXCalendarService);\n  private schedulerService = inject(AXSchedulerService);\n\n  private resizeObserverCleanup?: () => void;\n\n  private readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 3; // Reduced for year view due to space constraints\n\n  // --- Multi-day Appointment Detection ---\n  private isMultiDayAppointment(appointment: AXSchedulerAppointment): boolean {\n    const startDate = this.calendarService.create(appointment.startDate);\n    const endDate = this.calendarService.create(appointment.endDate);\n    return !startDate.startOf('day').equal(endDate.startOf('day'), 'day');\n  }\n\n  // Calculate spanning appointments with their grid positions\n  protected spanningAppointments = computed<AXSchedulerTimelineYearSpanningAppointment[]>(() => {\n    const allAppointments = this.appointments();\n    const yearStartDate = this.date().startOf('year');\n    const yearEndDate = this.date().endOf('year');\n    const daysInYear = yearEndDate.dayOfYear;\n\n    if (!allAppointments || allAppointments.length === 0) return [];\n\n    // Filter to get only multi-day appointments\n    const multiDayAppts = allAppointments.filter((appt) => {\n      if (!appt.startDate || !appt.endDate) return false;\n      return this.isMultiDayAppointment(appt) || appt.allDay;\n    });\n\n    if (multiDayAppts.length === 0) return [];\n\n    // Sort by start date, then by duration (longer first)\n    const sortedAppts = orderBy(\n      multiDayAppts,\n      [\n        (a) => a.startDate.getTime(),\n        (a) => a.endDate.getTime() - a.startDate.getTime(),\n        (a) => a.title?.toLowerCase() ?? '',\n      ],\n      ['asc', 'desc', 'asc'],\n    );\n\n    const spanningResult: AXSchedulerTimelineYearSpanningAppointment[] = [];\n    const rowOccupancy: Map<number, Set<number>> = new Map();\n\n    for (const appt of sortedAppts) {\n      const apptStart = this.calendarService.create(appt.startDate).startOf('day');\n      const apptEnd = this.calendarService.create(appt.endDate).startOf('day');\n\n      // Check if appointment overlaps with the year\n      if (apptEnd.compare(yearStartDate, 'day') < 0 || apptStart.compare(yearEndDate, 'day') > 0) {\n        continue;\n      }\n\n      // Calculate start day index (clamped to year bounds)\n      let startDayIndex = 0;\n      let isStartClipped = false;\n      if (apptStart.compare(yearStartDate, 'day') < 0) {\n        startDayIndex = 0;\n        isStartClipped = true;\n      } else {\n        startDayIndex = Math.floor(apptStart.duration(yearStartDate).total.days);\n      }\n\n      // Calculate end day index (clamped to year bounds)\n      let endDayIndex = daysInYear - 1;\n      let isEndClipped = false;\n      if (apptEnd.compare(yearEndDate, 'day') > 0) {\n        endDayIndex = daysInYear - 1;\n        isEndClipped = true;\n      } else {\n        endDayIndex = Math.floor(apptEnd.duration(yearStartDate).total.days);\n      }\n\n      // Ensure valid indices\n      startDayIndex = Math.max(0, Math.min(startDayIndex, daysInYear - 1));\n      endDayIndex = Math.max(startDayIndex, Math.min(endDayIndex, daysInYear - 1));\n\n      const spanCount = endDayIndex - startDayIndex + 1;\n\n      // Find the first available row\n      let rowIndex = 0;\n      let foundRow = false;\n\n      while (!foundRow) {\n        if (!rowOccupancy.has(rowIndex)) {\n          rowOccupancy.set(rowIndex, new Set());\n        }\n        const occupiedCells = rowOccupancy.get(rowIndex) ?? new Set<number>();\n\n        let hasConflict = false;\n        for (let dayIdx = startDayIndex; dayIdx <= endDayIndex; dayIdx++) {\n          if (occupiedCells.has(dayIdx)) {\n            hasConflict = true;\n            break;\n          }\n        }\n\n        if (!hasConflict) {\n          for (let dayIdx = startDayIndex; dayIdx <= endDayIndex; dayIdx++) {\n            occupiedCells.add(dayIdx);\n          }\n          foundRow = true;\n        } else {\n          rowIndex++;\n        }\n      }\n\n      spanningResult.push({\n        appointment: appt,\n        startDayIndex,\n        spanCount,\n        rowIndex,\n        isStartClipped,\n        isEndClipped,\n      });\n    }\n\n    return spanningResult;\n  });\n\n  // Get the set of multi-day appointment IDs for exclusion from per-day rendering\n  private multiDayAppointmentIds = computed<Set<any>>(() => {\n    const spanning = this.spanningAppointments();\n    return new Set(spanning.map((s) => s.appointment.id));\n  });\n\n  // Get spanning appointments for a specific resource\n  protected getSpanningAppointmentsForResource(resourceId: any): AXSchedulerTimelineYearSpanningAppointment[] {\n    const allSpanning = this.spanningAppointments();\n    return allSpanning.filter((spanning) => {\n      if (resourceId === 'unassigned') {\n        return spanning.appointment.resourceId === undefined || spanning.appointment.resourceId === null;\n      }\n      return isEqual(spanning.appointment.resourceId, resourceId);\n    });\n  }\n\n  // Calculate max spanning rows for the non-resource view\n  protected maxSpanningRows = computed<number>(() => {\n    const spanning = this.spanningAppointments();\n    if (spanning.length === 0) return 0;\n    return Math.max(...spanning.map((s) => s.rowIndex)) + 1;\n  });\n\n  // Calculate max spanning rows for a specific resource\n  protected getMaxSpanningRowsForResource(resourceId: any): number {\n    const resourceSpanning = this.getSpanningAppointmentsForResource(resourceId);\n    if (resourceSpanning.length === 0) return 0;\n    return Math.max(...resourceSpanning.map((s) => s.rowIndex)) + 1;\n  }\n\n  readonly = input(false);\n  draggable = input(true);\n  hasActions = input(false);\n  dragStartDelay = input(0);\n  calendar = input<string>();\n  showResourceHeaders = input(true);\n  date = input.required<AXDateTime>();\n  showUnassignedAppointments = input(true);\n  selectedAppointmentId = input<string | number | null>(null);\n\n  protected isActive(appointmentId: string | number): boolean {\n    return this.selectedAppointmentId() === appointmentId;\n  }\n  resources = input<AXSchedulerResource[]>([]);\n  showCurrentTimeIndicator = input<boolean>(true);\n  scrollToCurrentTimeIndicator = input<boolean>(false);\n  resourceTemplate = input<TemplateRef<unknown>>();\n  appointments = input<AXSchedulerAppointment[]>([]);\n  tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n  private dragStartSlotId = signal<string | null>(null);\n  private dragStartSlotResourceId = signal<any>(null);\n\n  currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n  // Performance optimization: reduce drag start delay for year view\n  protected optimizedDragStartDelay = computed(() => {\n    return this.dragStartDelay() > 0 ? Math.min(this.dragStartDelay(), 50) : 0;\n  });\n\n  protected processedDayData = computed<TimelineYearViewDayData[]>(() => {\n    const allOriginalAppointments = this.appointments();\n    const yearStartDate = this.date().startOf('year');\n    const yearEndDate = this.date().endOf('year');\n    const daysInYear = yearEndDate.dayOfYear;\n    const resources = this.resources();\n    const showUnassigned = this.showUnassignedAppointments();\n    const multiDayIds = this.multiDayAppointmentIds();\n\n    if (!allOriginalAppointments) {\n      return Array.from({ length: daysInYear }, (_, i) => {\n        const currentDayDate = yearStartDate.add('day', i).startOf('day');\n        return {\n          date: currentDayDate,\n          dayIndex: i,\n          visibleAppointments: [],\n          hiddenAppointments: [],\n          moreCount: 0,\n          holiday: this.getHolidayInfo(currentDayDate),\n        };\n      });\n    }\n\n    // Filter out multi-day appointments from single-day processing\n    const singleDayAppointments = allOriginalAppointments.filter((appt) => !multiDayIds.has(appt.id));\n\n    const result: TimelineYearViewDayData[] = [];\n\n    for (let i = 0; i < daysInYear; i++) {\n      const currentDayDate = yearStartDate.add('day', i).startOf('day');\n      const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n\n      for (const appt of singleDayAppointments) {\n        // For Timeline Year View, each day is a column. We want segments for the full 24h of that day.\n        const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, currentDayDate, 0, 24, true);\n        if (segment) {\n          segmentsForThisDay.push(segment);\n        }\n      }\n\n      // Sort segments: all-day first, then by segment start time (which is clipped to the day)\n      const sortedSegments = orderBy(\n        segmentsForThisDay,\n        [\n          (s) => (s.allDay ? 0 : 1), // Segments marked as allDay first\n          (s) => s.startDate.getTime(), // Segment's start time on this day\n          (s) => s.endDate.getTime() - s.startDate.getTime(), // Segment's duration on this day\n          (s) => s.title?.toLowerCase() ?? '',\n        ],\n        ['asc', 'asc', 'desc', 'asc'],\n      );\n\n      const visibleAppointments = sortedSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n      const hiddenAppointments = sortedSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n\n      // Handle resource grouping if resources are provided - also exclude multi-day\n      let appointmentsByResource:\n        | Map<\n            string,\n            { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number }\n          >\n        | undefined;\n\n      if (resources.length > 0) {\n        appointmentsByResource = new Map();\n        const allResourceIds = this.schedulerService.getAllResourceIds(resources, showUnassigned);\n\n        allResourceIds.forEach((resourceId) => {\n          const appointmentsForResource = this.schedulerService.getAppointmentsForResource(\n            singleDayAppointments,\n            resourceId,\n          );\n\n          const resourceSegments: AXSchedulerAppointmentSegment[] = [];\n          for (const appt of appointmentsForResource) {\n            const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, currentDayDate, 0, 24, true);\n            if (segment) {\n              resourceSegments.push(segment);\n            }\n          }\n\n          const sortedResourceSegments = orderBy(\n            resourceSegments,\n            [\n              (s) => (s.allDay ? 0 : 1),\n              (s) => s.startDate.getTime(),\n              (s) => s.endDate.getTime() - s.startDate.getTime(),\n              (s) => s.title?.toLowerCase() ?? '',\n            ],\n            ['asc', 'asc', 'desc', 'asc'],\n          );\n\n          const visible = sortedResourceSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n          const hidden = sortedResourceSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n\n          appointmentsByResource.set(resourceId, {\n            visible,\n            hidden,\n            moreCount: hidden.length,\n          });\n        });\n      }\n\n      result.push({\n        date: currentDayDate,\n        dayIndex: i,\n        visibleAppointments,\n        hiddenAppointments,\n        moreCount: hiddenAppointments.length,\n        holiday: this.getHolidayInfo(currentDayDate),\n        appointmentsByResource,\n      });\n    }\n\n    return result;\n  });\n\n  protected resourceIds = computed(() => {\n    const resources = this.resources();\n    if (resources.length === 0) return [];\n    return this.schedulerService.getAllResourceIds(resources, this.showUnassignedAppointments());\n  });\n\n  private getHolidayInfo(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n    const isHoliday = this.schedulerService.isHoliday(date);\n    if (isHoliday) {\n      const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n      const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n      const holiday = globalHoliday || internalHoliday;\n      return {\n        state: 'holiday',\n        holiday,\n      };\n    }\n    const isWeekend = this.schedulerService.isWeekend(date, this.calendar());\n    if (isWeekend) {\n      return { state: 'weekend' };\n    }\n    return { state: 'none' };\n  }\n\n  protected isToday(date: AXDateTime): boolean {\n    const today = this.calendarService.create(new Date(), this.calendar());\n    return date.equal(today, 'day');\n  }\n\n  protected getResourceTitle(resourceId: any): string {\n    const resources = this.resources();\n    const resource = resources.find((r) => isEqual(r.id, resourceId));\n    return resource?.title ?? String(resourceId);\n  }\n\n  protected getAppointmentsForResourceAndDay(resourceId: any, dayData: TimelineYearViewDayData) {\n    return dayData.appointmentsByResource?.get(resourceId) ?? { visible: [], hidden: [], moreCount: 0 };\n  }\n\n  protected getResourceContext(resourceId: any) {\n    const resources = this.resources();\n    const resource = resources.find((r) => isEqual(r.id, resourceId));\n    return resource || { id: resourceId, title: String(resourceId) };\n  }\n\n  protected getCurrentTimePosition(): number | null {\n    const now = this.calendarService.create(new Date(), this.calendar());\n    const yearStart = this.date().startOf('year');\n    const yearEnd = this.date().endOf('year');\n\n    // Check if current time is within the displayed year\n    if (now.isBefore(yearStart) || now.isAfter(yearEnd)) {\n      return null;\n    }\n\n    // Calculate position as percentage of the year\n    const durationFromStart = now.duration(yearStart);\n    const totalDuration = yearEnd.duration(yearStart);\n    return (durationFromStart.total.days / totalDuration.total.days) * 100;\n  }\n\n  ngAfterViewInit() {\n    // Auto-scroll to current time when available using ResizeObserver\n    this.resizeObserverCleanup = this.setupCurrentTimeScroll();\n\n    // Register cleanup with DestroyRef\n    this.destroyRef.onDestroy(() => {\n      this.resizeObserverCleanup?.();\n    });\n  }\n\n  ngOnDestroy() {\n    this.resizeObserverCleanup?.();\n  }\n\n  private setupCurrentTimeScroll(): (() => void) | undefined {\n    if (!this.showCurrentTimeIndicator() || !this.scrollToCurrentTimeIndicator()) {\n      return undefined;\n    }\n\n    const currentPosition = this.getCurrentTimePosition();\n    if (currentPosition === null) {\n      return undefined;\n    }\n\n    const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n    if (!timeLineElement) {\n      return undefined;\n    }\n\n    // Use ResizeObserver to detect when the element is properly rendered\n    const resizeObserver = new ResizeObserver((entries) => {\n      for (const entry of entries) {\n        if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n          // Element has proper dimensions, scroll to it\n          timeLineElement.scrollIntoView({\n            behavior: 'smooth',\n            block: 'nearest',\n            inline: 'center',\n          });\n          // Disconnect observer after successful scroll\n          resizeObserver.disconnect();\n          break;\n        }\n      }\n    });\n\n    resizeObserver.observe(timeLineElement);\n\n    // Cleanup on component destroy\n    return () => resizeObserver.disconnect();\n  }\n\n  // Internal outputs to be caught by parent AXSchedulerComponent\n  slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n  onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n  // --- Event Handlers ---\n  private readonly eventOutputMap = {\n    slot: {\n      click: this.slotClickedInternal,\n      dblclick: this.slotDblClickedInternal,\n      contextmenu: this.slotRightClickedInternal,\n    },\n    appointment: {\n      click: this.appointmentClickedInternal,\n      dblclick: this.appointmentDblClickedInternal,\n      contextmenu: this.appointmentRightClickedInternal,\n    },\n  };\n\n  protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n    const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n    const appointmentRef = {\n      ...originalAppointment,\n      endDate: originalAppointment.endDate,\n      startDate: originalAppointment.startDate,\n    };\n    this.schedulerService.handleEvent(\n      { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n      this.eventOutputMap,\n      'appointment',\n    );\n  }\n\n  protected handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n    // date is the specific day\n    const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'timeline-year');\n    if (slotData)\n      this.schedulerService.handleEvent(\n        { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n        this.eventOutputMap,\n        'slot',\n      );\n  }\n\n  protected handleDrop(e: AXDropZoneDropEvent, date: AXDateTime, resourceId?: any) {\n    // date is the specific day\n    const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'timeline-year');\n    const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n    const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n    const appointmentRef = {\n      ...originalAppointment,\n      endDate: originalAppointment.endDate,\n      startDate: originalAppointment.startDate,\n    };\n\n    // Convert 'unassigned' string to undefined for proper unassigned appointments\n    const actualResourceId = resourceId === 'unassigned' ? undefined : resourceId;\n\n    // Check if it's the same slot (same time AND same resource)\n    const dragStartSlotId = this.dragStartSlotId();\n    const dropSlotId = e.sender.element().dataset['slotId'];\n    const dragStartResourceId = this.dragStartSlotResourceId();\n    const isSameSlotDrop = dragStartSlotId === dropSlotId && dragStartResourceId === resourceId;\n\n    this.onAppointmentDropInternal.emit({\n      dropEvent: e,\n      slot: { ...slotData, resourceId: actualResourceId },\n      sender: this.scheduler,\n      appointment: appointmentRef,\n      isSameSlotDrop,\n    });\n  }\n\n  protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n    event.stopPropagation();\n    const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n    this.onActionClickInternal.emit({\n      appointment: originalAppointment,\n      nativeEvent: event,\n      sender: this.scheduler,\n    });\n  }\n\n  protected shouldShowCurrentTimeForDay(dayDate: AXDateTime): boolean {\n    const now = this.calendarService.create(new Date(), this.calendar());\n    const yearStart = this.date().startOf('year');\n    const yearEnd = this.date().endOf('year');\n\n    // Check if current time is within the displayed year range\n    if (now.isBefore(yearStart) || now.isAfter(yearEnd)) {\n      return false;\n    }\n\n    // Check if current time is on the same day as this day column\n    return now.isSame(dayDate, 'day');\n  }\n\n  protected getSlotId(e: PointerEvent) {\n    const dropListElement = this.document\n      .elementsFromPoint(e.clientX, e.clientY)\n      .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n    this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n    this.dragStartSlotResourceId.set(dropListElement ? dropListElement.dataset['resourceId'] : null);\n  }\n}\n","@if (resources().length === 0 || !showResourceHeaders()) {\n  <!-- Original layout when no resources -->\n  <div class=\"ax-scheduler-timeline-year-wrapper\">\n    <!-- Spanning appointments layer -->\n    @if (spanningAppointments().length > 0) {\n      <div class=\"ax-scheduler-timeline-year-spanning-layer\" [style.--timeline-days-count]=\"processedDayData().length\">\n        @for (spanning of spanningAppointments(); track spanning.appointment.id) {\n          <div\n            axDrag\n            [dragCursor]=\"'grab'\"\n            [dragData]=\"spanning.appointment\"\n            [dragTransition]=\"false\"\n            [dragElementClone]=\"true\"\n            [dragStartDelay]=\"optimizedDragStartDelay()\"\n            [dragDisabled]=\"!draggable() || spanning.appointment.readonly || readonly()\"\n            (pointerdown)=\"getSlotId($event)\"\n            (click)=\"handleAppointmentEvent($event, spanning.appointment)\"\n            (dblclick)=\"handleAppointmentEvent($event, spanning.appointment)\"\n            (contextmenu)=\"handleAppointmentEvent($event, spanning.appointment)\"\n            [title]=\"\n              tooltipTemplate()\n                ? ''\n                : spanning.appointment.title +\n                  ' (' +\n                  (spanning.appointment.startDate\n                    | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                    | async) +\n                  ' - ' +\n                  (spanning.appointment.endDate | format: 'date' : { format: 'MMM d', calendar: calendar() } | async) +\n                  ')'\n            \"\n            class=\"ax-scheduler-timeline-spanning-appointment {{\n              spanning.appointment.cssClass ??\n                'ax-scheduler-' + (spanning.appointment.priority ?? 'primary') + '-priority'\n            }}\"\n            [class.ax-spanning-start-clipped]=\"spanning.isStartClipped\"\n            [class.ax-spanning-end-clipped]=\"spanning.isEndClipped\"\n            [class.ax-state-active]=\"isActive(spanning.appointment.id)\"\n            [style.grid-column]=\"spanning.startDayIndex + 1 + ' / span ' + spanning.spanCount\"\n            [style.grid-row]=\"spanning.rowIndex + 1\"\n            [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n            [axTooltip]=\"tooltipTemplate()\"\n            [axTooltipContext]=\"spanning.appointment\"\n          >\n            <span class=\"ax-spanning-appointment-title\">\n              <span class=\"ax-scheduler-truncate\">{{ spanning.appointment.title }}</span>\n              @if (hasActions()) {\n                <ax-icon\n                  (click)=\"handleActionClick($event, spanning.appointment)\"\n                  class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                ></ax-icon>\n              }\n            </span>\n          </div>\n        }\n      </div>\n    }\n\n    <div class=\"ax-scheduler-timeline-year-container\">\n      @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n        <div>\n          <div class=\"ax-scheduler-timeline-header\">\n            <div\n              [class.ax-state-today]=\"isToday(dayData.date)\"\n              class=\"ax-scheduler-year-header-date-day {{\n                dayData.holiday.state !== 'none' ? (dayData.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n              }}\"\n              [style.--ax-scheduler-holiday-color]=\"dayData.holiday.holiday?.color ?? null\"\n            >\n              <span\n                class=\"ax-scheduler-year-header-date-day-char ax-scheduler-truncate\"\n                [axTooltip]=\"(dayData.holiday.holiday?.description ?? dayData.holiday.holiday?.title ?? '') | translate | async\"\n              >\n                {{ dayData.date | format: 'date' : { format: 'MMMM', calendar: calendar() } | async }}\n                @if (dayData.holiday.state === 'holiday' && dayData.holiday.holiday.title) {\n                  ( {{ dayData.holiday.holiday.title | translate | async }} )\n                }\n              </span>\n              <span class=\"ax-scheduler-year-header-date-day-num\">\n                {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n              </span>\n            </div>\n          </div>\n\n          <div\n            axDropZone\n            #zone=\"axDropZone\"\n            (onElementDrop)=\"handleDrop($event, dayData.date)\"\n            [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n            class=\"ax-scheduler-timeline-content\"\n            (click)=\"handleSlotEvent($event, dayData.date)\"\n            (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n            (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n            [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n            [style.pointer-events]=\"draggable() ? 'auto' : 'none'\"\n            [style.--spanning-rows-count]=\"maxSpanningRows()\"\n          >\n            <!-- Current Time Line Indicator -->\n            @if (\n              showCurrentTimeIndicator() &&\n              shouldShowCurrentTimeForDay(dayData.date) &&\n              getCurrentTimePosition() !== null\n            ) {\n              <div\n                class=\"ax-scheduler-current-time-line\"\n                [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n                #currentTimeLine\n              ></div>\n            }\n            <div class=\"ax-scheduler-timeline-appointment-container\">\n              @for (segment of dayData.visibleAppointments; track segment.id + segment.originalStartDate.getTime()) {\n                <div\n                  axDrag\n                  [dragData]=\"segment\"\n                  [dragCursor]=\"'grab'\"\n                  [dragTransition]=\"false\"\n                  [dragElementClone]=\"true\"\n                  [dragStartDelay]=\"optimizedDragStartDelay()\"\n                  [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n                  (pointerdown)=\"getSlotId($event)\"\n                  (click)=\"handleAppointmentEvent($event, segment)\"\n                  (dblclick)=\"handleAppointmentEvent($event, segment)\"\n                  (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n                  [title]=\"\n                    tooltipTemplate()\n                      ? ''\n                      : segment.title +\n                        ' (' +\n                        (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n                        ' - ' +\n                        (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n                        ')'\n                  \"\n                  class=\"ax-scheduler-timeline-appointment {{\n                    segment.cssClass ?? 'ax-scheduler-' + (segment.priority ?? 'primary') + '-priority'\n                  }}\"\n                  [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                  [axTooltip]=\"tooltipTemplate()\"\n                  [axTooltipContext]=\"segment\"\n                >\n                  <ax-title>\n                    <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n                    @if (hasActions()) {\n                      <ax-icon\n                        (click)=\"handleActionClick($event, segment)\"\n                        class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                      >\n                      </ax-icon>\n                    }\n                  </ax-title>\n                  <span class=\"ax-scheduler-timeline-appointment-time\">\n                    {{ segment.originalStartDate | format: 'time' : { calendar: calendar() } | async }}\n                    @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n                      -\n                      {{ segment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n                    }\n                  </span>\n                </div>\n              }\n\n              <!-- Overflow Badge and Popover -->\n              @if (dayData.moreCount > 0) {\n                <div #moreAppointments class=\"ax-scheduler-year-overflow-badge\" (click)=\"$event.stopPropagation()\">\n                  +{{\n                    '@acorex:common.general.more-items' | translate: { params: { number: dayData.moreCount } } | async\n                  }}\n                </div>\n                <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n                  <div\n                    axDropZone\n                    [class.ax-state-readonly]=\"readonly()\"\n                    class=\"ax-scheduler-popover ax-scheduler-timeline-year-popover-appointment\"\n                  >\n                    @for (\n                      segment of dayData.hiddenAppointments;\n                      track segment.id + segment.originalStartDate.getTime()\n                    ) {\n                      <div\n                        axDrag\n                        [dragCursor]=\"'grab'\"\n                        [dragData]=\"segment\"\n                        [dragTransition]=\"false\"\n                        [dragElementClone]=\"true\"\n                        [dragStartDelay]=\"optimizedDragStartDelay()\"\n                        [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n                        (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                        (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                        (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                        [title]=\"\n                          tooltipTemplate()\n                            ? ''\n                            : segment.title +\n                              ' (' +\n                              (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n                              ' - ' +\n                              (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n                              ')'\n                        \"\n                        class=\"ax-scheduler-popover-appointment {{\n                          segment.cssClass ?? 'ax-scheduler-' + (segment.priority ?? 'primary') + '-priority'\n                        }}\"\n                        [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                        [axTooltip]=\"tooltipTemplate()\"\n                        [axTooltipContext]=\"segment\"\n                      >\n                        <ax-title>\n                          <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n                          @if (hasActions()) {\n                            <ax-icon\n                              (click)=\"handleActionClick($event, segment)\"\n                              class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                            >\n                            </ax-icon>\n                          }\n                        </ax-title>\n                        <span class=\"ax-scheduler-timeline-appointment-time\">\n                          {{ segment.originalStartDate | format: 'time' : { calendar: calendar() } | async }}\n                          @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n                            -\n                            {{ segment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n                          }\n                        </span>\n                      </div>\n                    }\n                  </div>\n                </ax-popover>\n              }\n            </div>\n          </div>\n        </div>\n      }\n    </div>\n  </div>\n} @else {\n  <!-- Resource-based layout -->\n  <div class=\"ax-scheduler-timeline-year-resource-container\">\n    <div class=\"ax-scheduler-timeline-year-header-sticky\">\n      <div class=\"ax-scheduler-timeline-year-resource-header-placeholder\">\n        <span>Resources</span>\n      </div>\n\n      <div class=\"ax-scheduler-timeline-year-day-header\">\n        @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n          <div\n            [class.ax-state-today]=\"isToday(dayData.date)\"\n            class=\"ax-scheduler-year-header-date-day {{\n              dayData.holiday.state !== 'none' ? (dayData.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n            }}\"\n            [style.--ax-scheduler-holiday-color]=\"dayData.holiday.holiday?.color ?? null\"\n          >\n            <span\n              class=\"ax-scheduler-year-header-date-day-char ax-scheduler-truncate\"\n              [axTooltip]=\"(dayData.holiday.holiday?.description ?? dayData.holiday.holiday?.title ?? '') | translate | async\"\n            >\n              {{ dayData.date | format: 'date' : { format: 'MMMM', calendar: calendar() } | async }}\n              @if (dayData.holiday.state === 'holiday' && dayData.holiday.holiday.title) {\n                ( {{ dayData.holiday.holiday.title | translate | async }} )\n              }\n            </span>\n            <span class=\"ax-scheduler-year-header-date-day-num\">\n              {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n            </span>\n          </div>\n        }\n      </div>\n    </div>\n\n    <div class=\"ax-scheduler-timeline-year-resource-rows\">\n      <!-- Current Time Line Indicator -->\n      @if (showCurrentTimeIndicator() && getCurrentTimePosition() !== null) {\n        <div\n          class=\"ax-scheduler-current-time-line\"\n          [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n          #currentTimeLine\n        ></div>\n      }\n\n      @for (resourceId of resourceIds(); track resourceId) {\n        <div\n          class=\"ax-scheduler-timeline-year-resource-row\"\n          [style.--resource-spanning-rows-count]=\"getMaxSpanningRowsForResource(resourceId)\"\n        >\n          <div class=\"ax-scheduler-timeline-year-resource-header ax-scheduler-timeline-year-resource-header-sticky\">\n            @if (resourceTemplate() && typeof resourceTemplate() !== 'string') {\n              <ng-container\n                [ngTemplateOutlet]=\"$any(resourceTemplate())\"\n                [ngTemplateOutletContext]=\"{\n                  $implicit: getResourceContext(resourceId),\n                  resource: getResourceContext(resourceId),\n                  resourceId: resourceId,\n                }\"\n              ></ng-container>\n            } @else {\n              <div class=\"ax-scheduler-timeline-year-resource-title\">\n                {{ getResourceTitle(resourceId) | translate | async }}\n              </div>\n            }\n          </div>\n\n          <div class=\"ax-scheduler-timeline-year-resource-content\">\n            <!-- Spanning appointments layer for this resource -->\n            @if (getSpanningAppointmentsForResource(resourceId).length > 0) {\n              <div\n                class=\"ax-scheduler-timeline-resource-spanning-layer\"\n                [style.--timeline-days-count]=\"processedDayData().length\"\n              >\n                @for (spanning of getSpanningAppointmentsForResource(resourceId); track spanning.appointment.id) {\n                  <div\n                    axDrag\n                    [dragCursor]=\"'grab'\"\n                    [dragData]=\"spanning.appointment\"\n                    [dragTransition]=\"false\"\n                    [dragElementClone]=\"true\"\n                    [dragStartDelay]=\"optimizedDragStartDelay()\"\n                    [dragDisabled]=\"!draggable() || spanning.appointment.readonly || readonly()\"\n                    (pointerdown)=\"getSlotId($event)\"\n                    (click)=\"handleAppointmentEvent($event, spanning.appointment)\"\n                    (dblclick)=\"handleAppointmentEvent($event, spanning.appointment)\"\n                    (contextmenu)=\"handleAppointmentEvent($event, spanning.appointment)\"\n                    [title]=\"\n                      tooltipTemplate()\n                        ? ''\n                        : spanning.appointment.title +\n                          ' (' +\n                          (spanning.appointment.startDate\n                            | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                            | async) +\n                          ' - ' +\n                          (spanning.appointment.endDate\n                            | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                            | async) +\n                          ')'\n                    \"\n                    class=\"ax-scheduler-timeline-spanning-appointment {{\n                      spanning.appointment.cssClass ??\n                        'ax-scheduler-' + (spanning.appointment.priority ?? 'primary') + '-priority'\n                    }}\"\n                    [class.ax-spanning-start-clipped]=\"spanning.isStartClipped\"\n                    [class.ax-spanning-end-clipped]=\"spanning.isEndClipped\"\n                    [class.ax-state-active]=\"isActive(spanning.appointment.id)\"\n                    [style.grid-column]=\"spanning.startDayIndex + 1 + ' / span ' + spanning.spanCount\"\n                    [style.grid-row]=\"spanning.rowIndex + 1\"\n                    [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                    [axTooltip]=\"tooltipTemplate()\"\n                    [axTooltipContext]=\"spanning.appointment\"\n                  >\n                    <span class=\"ax-spanning-appointment-title\">\n                      <span class=\"ax-scheduler-truncate\">{{ spanning.appointment.title }}</span>\n                      @if (hasActions()) {\n                        <ax-icon\n                          (click)=\"handleActionClick($event, spanning.appointment)\"\n                          class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                        ></ax-icon>\n                      }\n                    </span>\n                  </div>\n                }\n              </div>\n            }\n\n            @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n              <div\n                axDropZone\n                #zone=\"axDropZone\"\n                (onElementDrop)=\"handleDrop($event, dayData.date, resourceId)\"\n                [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n                class=\"ax-scheduler-timeline-year-slot-row\"\n                (click)=\"handleSlotEvent($event, dayData.date)\"\n                (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n                (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n                [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n                [attr.data-resource-id]=\"resourceId\"\n                [style.pointer-events]=\"draggable() ? 'auto' : 'none'\"\n                [style.--spanning-rows-count]=\"getMaxSpanningRowsForResource(resourceId)\"\n              >\n                <div class=\"ax-scheduler-timeline-appointment-container\">\n                  @for (\n                    segment of getAppointmentsForResourceAndDay(resourceId, dayData).visible;\n                    track segment.id + segment.originalStartDate.getTime()\n                  ) {\n                    <div\n                      axDrag\n                      [dragData]=\"segment\"\n                      [dragCursor]=\"'grab'\"\n                      [dragTransition]=\"false\"\n                      [dragElementClone]=\"true\"\n                      [dragStartDelay]=\"optimizedDragStartDelay()\"\n                      [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n                      (pointerdown)=\"getSlotId($event)\"\n                      (click)=\"handleAppointmentEvent($event, segment)\"\n                      (dblclick)=\"handleAppointmentEvent($event, segment)\"\n                      (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n                      [title]=\"\n                        tooltipTemplate()\n                          ? ''\n                          : segment.allDay\n                            ? segment.title +\n                              ' (' +\n                              (segment.originalStartDate\n                                | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                                | async) +\n                              ' - ' +\n                              (segment.originalEndDate\n                                | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                                | async) +\n                              ')'\n                            : segment.title +\n                              ' (' +\n                              (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n                              ' - ' +\n                              (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n                              ')'\n                      \"\n                      class=\"ax-scheduler-timeline-appointment {{\n                        segment.cssClass ?? 'ax-scheduler-' + (segment.priority ?? 'primary') + '-priority'\n                      }}\"\n                      [class.all-day-segment]=\"segment.allDay\"\n                      [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                      [axTooltip]=\"tooltipTemplate()\"\n                      [axTooltipContext]=\"segment\"\n                    >\n                      <ax-title>\n                        <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n                        @if (hasActions()) {\n                          <ax-icon\n                            (click)=\"handleActionClick($event, segment)\"\n                            class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                          >\n                          </ax-icon>\n                        }\n                      </ax-title>\n                      <span class=\"ax-scheduler-timeline-appointment-time\">\n                        @if (segment.allDay) {\n                          {{\n                            segment.originalStartDate\n                              | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                              | async\n                          }}\n                          @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n                            -\n                            {{\n                              segment.originalEndDate\n                                | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                                | async\n                            }}\n                          }\n                        } @else {\n                          {{ segment.originalStartDate | format: 'time' : { calendar: calendar() } | async }}\n                          @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n                            -\n                            {{ segment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n                          }\n                        }\n                      </span>\n                    </div>\n                  }\n\n                  <!-- Overflow Badge and Popover -->\n                  @if (getAppointmentsForResourceAndDay(resourceId, dayData).moreCount > 0) {\n                    <div #moreAppointments class=\"ax-scheduler-year-overflow-badge\" (click)=\"$event.stopPropagation()\">\n                      +{{\n                        '@acorex:common.general.more-items'\n                          | translate\n                            : { params: { number: getAppointmentsForResourceAndDay(resourceId, dayData).moreCount } }\n                          | async\n                      }}\n                    </div>\n                    <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n                      <div\n                        axDropZone\n                        [class.ax-state-readonly]=\"readonly()\"\n                        class=\"ax-scheduler-popover ax-scheduler-timeline-year-popover-appointment\"\n                      >\n                        @for (\n                          segment of getAppointmentsForResourceAndDay(resourceId, dayData).hidden;\n                          track segment.id + segment.originalStartDate.getTime()\n                        ) {\n                          <div\n                            axDrag\n                            [dragCursor]=\"'grab'\"\n                            [dragData]=\"segment\"\n                            [dragTransition]=\"false\"\n                            [dragElementClone]=\"true\"\n                            [dragStartDelay]=\"optimizedDragStartDelay()\"\n                            [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n                            (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                            (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                            (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n                            [title]=\"\n                              tooltipTemplate()\n                                ? ''\n                                : segment.allDay\n                                  ? segment.title\n                                  : segment.title +\n                                    ' (' +\n                                    (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n                                    ' - ' +\n                                    (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n                                    ')'\n                            \"\n                            class=\"ax-scheduler-popover-appointment {{\n                              segment.cssClass ?? 'ax-scheduler-' + (segment.priority ?? 'primary') + '-priority'\n                            }}\"\n                            [class.all-day-segment]=\"segment.allDay\"\n                            [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                            [axTooltip]=\"tooltipTemplate()\"\n                            [axTooltipContext]=\"segment\"\n                          >\n                            <ax-title>\n                              <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n                              @if (hasActions()) {\n                                <ax-icon\n                                  (click)=\"handleActionClick($event, segment)\"\n                                  class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                                >\n                                </ax-icon>\n                              }\n                            </ax-title>\n                            @if (!segment.allDay) {\n                              <span class=\"ax-scheduler-timeline-appointment-time\">\n                                {{ segment.originalStartDate | format: 'time' : { calendar: calendar() } | async }}\n                                @if (\n                                  !segment.allDay &&\n                                  segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()\n                                ) {\n                                  -\n                                  {{ segment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n                                }\n                              </span>\n                            }\n                          </div>\n                        }\n                      </div>\n                    </ax-popover>\n                  }\n                </div>\n              </div>\n            }\n          </div>\n        </div>\n      }\n    </div>\n  </div>\n}\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n  AfterViewInit,\n  Component,\n  computed,\n  DestroyRef,\n  DOCUMENT,\n  ElementRef,\n  inject,\n  input,\n  OnDestroy,\n  output,\n  signal,\n  TemplateRef,\n  viewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n  AXSchedulerAllDaySlotData,\n  AXSchedulerAppointment,\n  AXSchedulerAppointmentLayout,\n  AXSchedulerAppointmentSegment,\n  AXSchedulerDayAppointmentLayout,\n  AXSchedulerOverflowBadge,\n} from '../../scheduler.class';\nimport {\n  AXSchedulerAppointmentMouseEvent,\n  AXSchedulerComponent,\n  AXSchedulerSlotDropEvent,\n  AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\ntype AXSchedulerGridBadgeInfo = AXSchedulerOverflowBadge & {\n  hiddenAppointments: AXSchedulerAppointmentSegment[];\n};\n\n// Represents a multi-day appointment spanning across day columns in the week view\ntype AXSchedulerWeekSpanningAppointment = {\n  appointment: AXSchedulerAppointment;\n  startDayIndex: number; // 0-6 for days in the week\n  spanCount: number; // Number of days this appointment spans in the visible week\n  rowIndex: number; // Row index for stacking multiple spanning appointments\n  isStartClipped: boolean; // True if appointment starts before the visible week\n  isEndClipped: boolean; // True if appointment extends beyond the visible week\n};\n\n@Component({\n  selector: 'ax-scheduler-week-view',\n  templateUrl: './scheduler-week-view.component.html',\n  styleUrl: './scheduler-week-view.component.css',\n\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    '[class.ax-state-readonly]': 'readonly()',\n  },\n  imports: [\n    AsyncPipe,\n    AXFormatPipe,\n    AXDragDirective,\n    AXTranslatorPipe,\n    AXPopoverComponent,\n    AXTooltipDirective,\n    AXDropZoneDirective,\n    AXDecoratorIconComponent,\n    AXDecoratorGenericComponent,\n  ],\n  providers: [{ provide: AXComponent, useExisting: AXSchedulerWeekViewComponent }],\n})\nexport class AXSchedulerWeekViewComponent extends NXComponent implements AfterViewInit, OnDestroy {\n  // --- Injected Services & Private State ---\n  private readonly document = inject(DOCUMENT);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly scheduler = inject(AXSchedulerComponent);\n  private readonly calendarService = inject(AXCalendarService);\n  private readonly schedulerService = inject(AXSchedulerService);\n  private readonly dragStartSlotId = signal<string | null>(null);\n\n  // --- Constants ---\n  private readonly GAP_PX = 1;\n  private readonly BADGE_SPACE_REM = 2;\n\n  private resizeObserverCleanup: (() => void) | undefined;\n\n  // --- Component Inputs ---\n  public readonly = input(false);\n  public draggable = input(true);\n  public hasActions = input(false);\n  public dragStartDelay = input(0);\n  public calendar = input<string>();\n  public date = input.required<AXDateTime>();\n  public endDayHour = input.required<number>();\n  public startDayHour = input.required<number>();\n  public showCurrentTimeIndicator = input<boolean>(true);\n  public scrollToCurrentTimeIndicator = input<boolean>(false);\n  public appointments = input<AXSchedulerAppointment[]>([]);\n  public tooltipTemplate = input<string | TemplateRef<unknown>>();\n  public selectedAppointmentId = input<string | number | null>(null);\n\n  protected isActive(appointmentId: string | number): boolean {\n    return this.selectedAppointmentId() === appointmentId;\n  }\n\n  // ViewChild for current time line element\n  currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n  // --- Component Outputs (Internal, to be caught by the main scheduler) ---\n  protected readonly slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  protected readonly slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  protected readonly slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n  protected readonly appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  protected readonly appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  protected readonly appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n  protected readonly onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n  protected readonly onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n  // =================================================================================================\n  //\n  // VIEW MODEL COMPUTATIONS (for rendering the template)\n  //\n  // =================================================================================================\n\n  /**\n   * @protected\n   * Generates an array of AXDateTime objects for the hours displayed in the view's time ruler.\n   * This is used for rendering the `HH:mm` labels on the side.\n   */\n  protected hoursArray = computed(() => {\n    let time = this.date();\n    if (!time) return [];\n    time = time.set('hour', this.startDayHour()).startOf('hour');\n    const hours = [time];\n    while (time.hour < this.endDayHour() - 1) {\n      time = time.add('hour', 1);\n      hours.push(time);\n    }\n    return hours;\n  });\n\n  /**\n   * @protected\n   * Generates an array of day data objects for the 7 days in the view, including holiday info.\n   * This is used for rendering the day headers (e.g., \"Monday 10\").\n   */\n  protected daysArray = computed(\n    (): { date: AXDateTime; holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } }[] => {\n      const time = this.date();\n      if (!time) return [];\n      const days = [{ date: time, holiday: this.isHoliday(time) }];\n      for (let index = 1; index <= 6; index++) {\n        const date = time.add('day', index);\n        days.push({ date, holiday: this.isHoliday(date) });\n      }\n      return days;\n    },\n  );\n\n  /**\n   * @protected\n   * Calculates the total number of 30-minute blocks within the visible hours of a single day.\n   */\n  protected totalBlocksPerViewDay = computed(() => {\n    const startH = this.startDayHour();\n    const endH = this.endDayHour();\n    return Math.max(0, (endH - startH) * (60 / 30));\n  });\n\n  // --- Multi-day Appointment Detection ---\n  // Determines if an appointment spans more than one day\n  private isMultiDayAppointment(appointment: AXSchedulerAppointment): boolean {\n    const startDate = this.calendarService.create(appointment.startDate);\n    const endDate = this.calendarService.create(appointment.endDate);\n    return !startDate.startOf('day').equal(endDate.startOf('day'), 'day');\n  }\n\n  // Calculate spanning appointments with their grid positions for the all-day header\n  protected spanningAppointments = computed<AXSchedulerWeekSpanningAppointment[]>(() => {\n    const daysInWeek = this.daysArray();\n    if (daysInWeek.length === 0) return [];\n\n    const allAppointments = this.appointments();\n    if (!allAppointments || allAppointments.length === 0) return [];\n\n    const weekStartDate = daysInWeek[0].date.startOf('day');\n    const weekEndDate = daysInWeek[daysInWeek.length - 1].date.endOf('day');\n\n    // Filter to get only multi-day appointments (single-day all-day go to allday-slots)\n    const multiDayAppts = allAppointments.filter((appt) => {\n      if (!appt.startDate || !appt.endDate) return false;\n      return this.isMultiDayAppointment(appt);\n    });\n\n    if (multiDayAppts.length === 0) return [];\n\n    // Sort by start date, then by duration (longer first)\n    const sortedAppts = orderBy(\n      multiDayAppts,\n      [\n        (a) => a.startDate.getTime(),\n        (a) => a.endDate.getTime() - a.startDate.getTime(),\n        (a) => a.title?.toLowerCase() ?? '',\n      ],\n      ['asc', 'desc', 'asc'],\n    );\n\n    const spanningResult: AXSchedulerWeekSpanningAppointment[] = [];\n    // Track which day columns are occupied at each row level\n    const rowOccupancy: Map<number, Set<number>> = new Map();\n\n    for (const appt of sortedAppts) {\n      const apptStart = this.calendarService.create(appt.startDate).startOf('day');\n      const apptEnd = this.calendarService.create(appt.endDate).startOf('day');\n\n      // Check if appointment overlaps with the week\n      if (apptEnd.compare(weekStartDate, 'day') < 0 || apptStart.compare(weekEndDate, 'day') > 0) {\n        continue;\n      }\n\n      // Calculate start day index (clamped to week bounds)\n      let startDayIndex = 0;\n      let isStartClipped = false;\n      if (apptStart.compare(weekStartDate, 'day') < 0) {\n        startDayIndex = 0;\n        isStartClipped = true;\n      } else {\n        startDayIndex = Math.floor(apptStart.duration(weekStartDate).total.days);\n      }\n\n      // Calculate end day index (clamped to week bounds)\n      let endDayIndex = 6;\n      let isEndClipped = false;\n      if (apptEnd.compare(weekEndDate, 'day') > 0) {\n        endDayIndex = 6;\n        isEndClipped = true;\n      } else {\n        endDayIndex = Math.floor(apptEnd.duration(weekStartDate).total.days);\n      }\n\n      // Ensure valid indices\n      startDayIndex = Math.max(0, Math.min(startDayIndex, 6));\n      endDayIndex = Math.max(startDayIndex, Math.min(endDayIndex, 6));\n\n      const spanCount = endDayIndex - startDayIndex + 1;\n\n      // Find the first available row\n      let rowIndex = 0;\n      let foundRow = false;\n\n      while (!foundRow) {\n        if (!rowOccupancy.has(rowIndex)) {\n          rowOccupancy.set(rowIndex, new Set());\n        }\n        const occupiedCells = rowOccupancy.get(rowIndex) ?? new Set<number>();\n\n        let hasConflict = false;\n        for (let dayIdx = startDayIndex; dayIdx <= endDayIndex; dayIdx++) {\n          if (occupiedCells.has(dayIdx)) {\n            hasConflict = true;\n            break;\n          }\n        }\n\n        if (!hasConflict) {\n          for (let dayIdx = startDayIndex; dayIdx <= endDayIndex; dayIdx++) {\n            occupiedCells.add(dayIdx);\n          }\n          foundRow = true;\n        } else {\n          rowIndex++;\n        }\n      }\n\n      spanningResult.push({\n        appointment: appt,\n        startDayIndex,\n        spanCount,\n        rowIndex,\n        isStartClipped,\n        isEndClipped,\n      });\n    }\n\n    return spanningResult;\n  });\n\n  // Get the set of multi-day/all-day appointment IDs for exclusion from regular all-day rendering\n  private multiDayAppointmentIds = computed<Set<any>>(() => {\n    const spanning = this.spanningAppointments();\n    return new Set(spanning.map((s) => s.appointment.id));\n  });\n\n  // Calculate the maximum row index to determine header height\n  protected maxSpanningRowIndex = computed(() => {\n    const spanning = this.spanningAppointments();\n    if (spanning.length === 0) return -1;\n    return Math.max(...spanning.map((s) => s.rowIndex));\n  });\n\n  /**\n   * @protected\n   * Filters processed segments to get only single-day all-day appointments for the all-day header.\n   * Multi-day appointments are rendered separately as spanning bars.\n   */\n  protected allDayAppointmentsPerDay = computed((): AXSchedulerAllDaySlotData[] => {\n    const daysInWeek = this.daysArray().map((e) => e.date);\n    const multiDayIds = this.multiDayAppointmentIds();\n\n    // Filter to get only single-day all-day segments (not part of spanning appointments)\n    const allDaySegments = this.processedAppointmentsForLayout().filter((s) => s.allDay && !multiDayIds.has(s.id));\n\n    return daysInWeek.map((dayDate) => {\n      const currentDayStart = dayDate.startOf('day');\n      const appointmentsForThisDay = allDaySegments.filter((segment) =>\n        this.calendarService.create(segment.startDate, this.calendar()).startOf('day').equal(currentDayStart, 'day'),\n      );\n      return {\n        day: dayDate,\n        appointments: orderBy(appointmentsForThisDay, ['originalStartDate', 'title'], ['asc', 'asc']),\n      };\n    });\n  });\n\n  // =================================================================================================\n  //\n  // GRID LAYOUT & BADGE LOGIC (THE CORE FIX)\n  // This logic follows a three-step process:\n  // 1. `dayViewLayoutsByDay`: Calculate a full multi-column layout for each day. This is our \"source of truth\".\n  // 2. `visibleAppointmentsLayout`: Render ONLY the first column (`columnIndex: 0`) from the source of truth.\n  // 3. `overflowBadgesWithData`: Render badges for all other columns (`columnIndex > 0`).\n  //\n  // =================================================================================================\n\n  /**\n   * [STEP 1 - Private] Calculate a full multi-column layout for each day, as if it were a Day View.\n   * This becomes the single source of truth for what overlaps with what.\n   */\n  private dayViewLayoutsByDay = computed(() => {\n    const layoutsByDay = new Map<number, Map<any, AXSchedulerDayAppointmentLayout>>();\n    const allSegments = this.timedGridSegments();\n    const viewStartDate = this.date();\n    const startH = this.startDayHour();\n    const endH = this.endDayHour();\n\n    for (let dayIndex = 0; dayIndex < 7; dayIndex++) {\n      const dayDate = viewStartDate.add('day', dayIndex);\n      const segmentsForThisDay = allSegments.filter((seg) =>\n        this.calendarService.create(seg.startDate, this.calendar()).startOf('day').equal(dayDate.startOf('day'), 'day'),\n      );\n      if (segmentsForThisDay.length === 0) continue;\n\n      const concurrencyInfoMap = this.schedulerService.calculateDayViewConcurrencyInfo(\n        segmentsForThisDay,\n        dayDate,\n        startH,\n        endH,\n      );\n      const sortedAppointments = orderBy(\n        segmentsForThisDay,\n        [(e) => e.startDate.getTime(), (e) => e.originalEndDate.getTime() - e.originalStartDate.getTime()],\n        ['asc', 'desc'],\n      );\n\n      const dayLayouts = new Map<any, AXSchedulerDayAppointmentLayout>();\n      const columnsData: { appointments: AXSchedulerAppointmentSegment[] }[] = [];\n\n      for (const appointmentSegment of sortedAppointments) {\n        let assignedCol = -1;\n        for (let c = 0; ; c++) {\n          if (!columnsData[c]) columnsData[c] = { appointments: [] };\n          let conflict = false;\n          for (const placedSegment of columnsData[c].appointments) {\n            if (this.schedulerService.doAppointmentsOverlap(appointmentSegment, placedSegment)) {\n              conflict = true;\n              break;\n            }\n          }\n          if (!conflict) {\n            assignedCol = c;\n            columnsData[c].appointments.push(appointmentSegment);\n            break;\n          }\n        }\n        const concurrencyInfo = concurrencyInfoMap.get(appointmentSegment.id);\n        const effectiveCols = concurrencyInfo ? concurrencyInfo.effectiveTotalColumns : 1;\n        dayLayouts.set(appointmentSegment.id, { columnIndex: assignedCol, effectiveTotalColumns: effectiveCols });\n      }\n      layoutsByDay.set(dayIndex, dayLayouts);\n    }\n    return layoutsByDay;\n  });\n\n  /**\n   * @protected\n   * [STEP 2] From the full layout, select ONLY appointments in the first column (`columnIndex: 0`)\n   * to be visible. Calculate their width based on whether they have siblings in other columns.\n   */\n  protected visibleAppointmentsLayout = computed((): AXSchedulerAppointmentLayout[] => {\n    const finalLayouts: AXSchedulerAppointmentLayout[] = [];\n    const layoutsByDay = this.dayViewLayoutsByDay();\n    const allSegments = this.timedGridSegments();\n    const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height, 30px)`;\n    const N = 7;\n\n    for (const appt of allSegments) {\n      const apptStartDate = this.calendarService.create(appt.startDate, this.calendar());\n      const dayIndex = Math.floor(\n        (apptStartDate.startOf('day').date.getTime() - this.date().startOf('day').date.getTime()) /\n          this.schedulerService.MILLISECONDS_PER_DAY,\n      );\n      if (dayIndex < 0 || dayIndex >= N) continue;\n\n      const layoutInfo = layoutsByDay.get(dayIndex)?.get(appt.id);\n      if (!layoutInfo || layoutInfo.columnIndex !== 0) continue;\n\n      const startMinutes = apptStartDate.hour * 60 + apptStartDate.minute;\n      const startBlockOffset = startMinutes - this.startDayHour() * 60;\n      const layoutTop = `calc(${blockHeightExpr} * ${startBlockOffset / 30} + 1px)`;\n\n      const durationMinutes = this.schedulerService.calculateDurationInMinutes(appt);\n      const layoutHeight = `calc(${blockHeightExpr} * ${durationMinutes / 30} - ${this.GAP_PX}px)`;\n\n      const hasHiddenSiblings = layoutInfo.effectiveTotalColumns > 1;\n      const layoutWidth = hasHiddenSiblings\n        ? `calc(100% / ${N} - ${this.BADGE_SPACE_REM + 0.5}rem)`\n        : `calc(100% / ${N})`;\n\n      finalLayouts.push({\n        appointment: appt,\n        layoutTop,\n        layoutHeight,\n        layoutLeft: `calc(${dayIndex * (100 / N)}%)`,\n        layoutWidth,\n      });\n    }\n    return finalLayouts;\n  });\n\n  /**\n   * @protected\n   * [STEP 3] Create badges for all appointments NOT in the first column (`columnIndex > 0`).\n   */\n  protected overflowBadgesWithData = computed((): AXSchedulerGridBadgeInfo[] => {\n    const badgesInfo: AXSchedulerGridBadgeInfo[] = [];\n    const layoutsByDay = this.dayViewLayoutsByDay();\n    const allTimedSegments = this.timedGridSegments();\n    const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height, 30px)`;\n    const N = 7;\n\n    const hiddenAppointments = allTimedSegments.filter((appt) => {\n      const apptStartDate = this.calendarService.create(appt.startDate, this.calendar());\n      const dayIndex = Math.floor(\n        (apptStartDate.startOf('day').date.getTime() - this.date().startOf('day').date.getTime()) /\n          this.schedulerService.MILLISECONDS_PER_DAY,\n      );\n      const layoutInfo = layoutsByDay.get(dayIndex)?.get(appt.id);\n      return layoutInfo && layoutInfo.columnIndex > 0;\n    });\n\n    const groupedHidden = new Map<string, AXSchedulerAppointmentSegment[]>();\n    for (const appt of hiddenAppointments) {\n      const apptStartDate = this.calendarService.create(appt.startDate, this.calendar());\n      const startInfo = this.schedulerService.getBlockIdentifier(\n        apptStartDate,\n        this.date(),\n        this.startDayHour(),\n        this.endDayHour(),\n        7,\n      );\n      if (!startInfo) continue;\n\n      const key = `${startInfo.dayIndex}-${startInfo.blockIndex}`;\n      if (!groupedHidden.has(key)) groupedHidden.set(key, []);\n      groupedHidden.get(key).push(appt);\n    }\n\n    groupedHidden.forEach((group, key) => {\n      const [dayIndexStr, blockIndexStr] = key.split('-');\n      const dayIndex = parseInt(dayIndexStr);\n      const blockIndex = parseInt(blockIndexStr);\n\n      const badgeTop = `calc(${blockHeightExpr} * ${blockIndex} + 0.75rem)`;\n      const badgeLeft = `calc(${dayIndex * (100 / N)}% + (100% / ${N}) - ${this.BADGE_SPACE_REM}rem)`;\n\n      badgesInfo.push({\n        key: `badge-${key}`,\n        count: group.length,\n        badgeTop,\n        badgeLeft,\n        hiddenAppointments: group,\n      });\n    });\n\n    return badgesInfo;\n  });\n\n  // =================================================================================================\n  //\n  // EVENT HANDLERS & UTILITY METHODS\n  //\n  // =================================================================================================\n\n  private readonly eventOutputMap = {\n    slot: {\n      click: this.slotClickedInternal,\n      dblclick: this.slotDblClickedInternal,\n      contextmenu: this.slotRightClickedInternal,\n    },\n    appointment: {\n      click: this.appointmentClickedInternal,\n      dblclick: this.appointmentDblClickedInternal,\n      contextmenu: this.appointmentRightClickedInternal,\n    },\n  };\n\n  /**\n   * Handles click, dblclick, and contextmenu events on an appointment and emits them to the parent.\n   * @param mouseEvent The native DOM event.\n   * @param appointmentSegment The appointment data segment that was interacted with.\n   * @protected\n   */\n  protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentSegment: AXSchedulerAppointment): void {\n    const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentSegment);\n    this.schedulerService.handleEvent(\n      { nativeEvent: mouseEvent, appointment: originalAppointment, sender: this.scheduler },\n      this.eventOutputMap,\n      'appointment',\n    );\n  }\n\n  /**\n   * Handles click, dblclick, and contextmenu events on an empty time slot and emits them to the parent.\n   * @param mouseEvent The native DOM event.\n   * @param hour The starting hour of the slot.\n   * @param day The day of the slot.\n   * @param minuteIndex The half-hour index (0 or 1).\n   * @protected\n   */\n  protected handleSingleSlotEvent(\n    mouseEvent: MouseEvent,\n    hour: AXDateTime,\n    day: AXDateTime,\n    minuteIndex: number,\n  ): void {\n    const startDate = day.set('hour', hour.hour).set('minute', minuteIndex * 30);\n    const slotData = this.schedulerService.getSlotData(startDate, 'week');\n    if (slotData)\n      this.schedulerService.handleEvent(\n        { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n        this.eventOutputMap,\n        'slot',\n      );\n  }\n\n  /**\n   * Handles interaction events on the all-day slot.\n   * @param mouseEvent The native DOM event.\n   * @param day The corresponding day for the all-day slot.\n   * @protected\n   */\n  protected handleAllDaySlotEvent(mouseEvent: MouseEvent, day: AXDateTime): void {\n    const slotData = { startDate: day.startOf('day'), endDate: day.endOf('day'), view: 'week' as const };\n    this.schedulerService.handleEvent(\n      { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n      this.eventOutputMap,\n      'slot',\n    );\n  }\n\n  /**\n   * Handles dropping an appointment onto the all-day slot.\n   * @param e The drop event from the CDK.\n   * @param day The corresponding day for the all-day slot.\n   * @protected\n   */\n  protected handleAllDayDrop(e: AXDropZoneDropEvent, day: AXDateTime): void {\n    const slotData = { startDate: day.startOf('day'), endDate: day.endOf('day'), view: 'week' as const };\n    const originalAppointment = this.schedulerService.getOriginalAppointment(\n      e.dropped.dragData() as AXSchedulerAppointment,\n    );\n    this.onAppointmentDropInternal.emit({\n      dropEvent: e,\n      slot: slotData,\n      sender: this.scheduler,\n      appointment: originalAppointment,\n      isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n    });\n  }\n\n  /**\n   * Handles dropping an appointment onto a timed grid slot.\n   * @param e The drop event from the CDK.\n   * @param hour The starting hour of the drop target.\n   * @param day The day of the drop target.\n   * @param minuteIndex The half-hour index (0 or 1) of the drop target.\n   * @protected\n   */\n  protected handleSingleDayDrop(e: AXDropZoneDropEvent, hour: AXDateTime, day: AXDateTime, minuteIndex: number): void {\n    const startDate = day.set('hour', hour.hour).set('minute', minuteIndex * 30);\n    const slotData = this.schedulerService.getSlotData(startDate, 'week');\n    const originalAppointment = this.schedulerService.getOriginalAppointment(\n      e.dropped.dragData() as AXSchedulerAppointment,\n    );\n    this.onAppointmentDropInternal.emit({\n      dropEvent: e,\n      slot: slotData,\n      sender: this.scheduler,\n      appointment: originalAppointment,\n      isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n    });\n  }\n\n  /**\n   * Handles clicks on the \"more\" action icon on an appointment.\n   * @param event The native mouse event.\n   * @param appointmentItem The appointment associated with the action.\n   * @protected\n   */\n  protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment): void {\n    event.stopPropagation();\n    const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n    this.onActionClickInternal.emit({\n      appointment: originalAppointment,\n      nativeEvent: event,\n      sender: this.scheduler,\n    });\n  }\n\n  /**\n   * @protected\n   * Checks if a given date is the current day.\n   * @param date The date to check.\n   * @returns `true` if the date is today.\n   */\n  protected isToday(date: AXDateTime): boolean {\n    return date.equal(this.calendarService.create(new Date()), 'day');\n  }\n\n  /**\n   * @protected\n   * Checks if a given date is a holiday or weekend.\n   * @param date The date to check.\n   * @returns An object describing the day's status (holiday, weekend, or none).\n   */\n  protected isHoliday(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n    const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n    const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n    const holiday = globalHoliday || internalHoliday;\n    if (holiday) return { state: 'holiday', holiday };\n    if (this.schedulerService.isWeekend(date, this.calendar())) return { state: 'weekend' };\n    return { state: 'none' };\n  }\n\n  /**\n   * @protected\n   * Captures the data-slot-id attribute when a drag operation starts on an appointment.\n   * @param e The pointer event that initiates the drag.\n   */\n  protected getSlotId(e: PointerEvent): void {\n    const dropListElement = this.document\n      .elementsFromPoint(e.clientX, e.clientY)\n      .find((el): el is HTMLElement => (el as HTMLElement).dataset['slotId'] !== undefined);\n    this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n  }\n\n  protected getCurrentTimePosition(): number | null {\n    const now = this.calendarService.create(new Date(), this.calendar());\n    const weekStart = this.date().startOf('day');\n    const weekEnd = this.date().add('day', 7).startOf('day');\n    const startHour = this.startDayHour();\n    const endHour = this.endDayHour();\n\n    // Check if current time is within the displayed week\n    if (now.isBefore(weekStart) || now.isAfter(weekEnd)) {\n      return null;\n    }\n\n    // Check if current time is within the visible hours\n    if (now.hour < startHour || now.hour >= endHour) {\n      return null;\n    }\n\n    // Calculate position as percentage within the visible time range\n    const currentMinutes = now.hour * 60 + now.minute;\n    const startMinutes = startHour * 60;\n    const endMinutes = endHour * 60;\n    const totalMinutes = endMinutes - startMinutes;\n\n    const positionInMinutes = currentMinutes - startMinutes;\n    return (positionInMinutes / totalMinutes) * 100;\n  }\n\n  protected getCurrentTimePositionWithOffset(): string | null {\n    const position = this.getCurrentTimePosition();\n    if (position === null) {\n      return null;\n    }\n\n    // For week view, calculate the vertical position (top) for the horizontal line\n    // based on the current time within the visible hours\n    const currentMinutes =\n      this.calendarService.create(new Date(), this.calendar()).hour * 60 +\n      this.calendarService.create(new Date(), this.calendar()).minute;\n    const startMinutes = this.startDayHour() * 60;\n    const positionInMinutes = currentMinutes - startMinutes;\n    const blockHeight = 30; // 30 minutes per block\n    const blocksFromStart = positionInMinutes / blockHeight;\n\n    return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${blocksFromStart} + 1px)`;\n  }\n\n  protected getCurrentDayColumnPosition(): string | null {\n    const now = this.calendarService.create(new Date(), this.calendar());\n    const weekStart = this.date().startOf('day');\n    const weekEnd = this.date().add('day', 7).startOf('day');\n\n    // Check if current time is within the displayed week\n    if (now.isBefore(weekStart) || now.isAfter(weekEnd)) {\n      return null;\n    }\n\n    // Calculate which day of the week the current day falls into\n    const daysDiff = Math.floor((now.date.getTime() - weekStart.date.getTime()) / (24 * 60 * 60 * 1000));\n    if (daysDiff < 0 || daysDiff >= 7) {\n      return null;\n    }\n\n    // Calculate the left position for the current day column\n    // The time column width is already accounted for in the container positioning\n    const dayWidth = 100 / 7; // 7 days in a week\n    const leftPosition = daysDiff * dayWidth;\n\n    return `${leftPosition}%`;\n  }\n\n  protected getCurrentDayColumnWidth(): string {\n    const dayWidth = 100 / 7; // 7 days in a week\n    return `${dayWidth}%`;\n  }\n\n  ngAfterViewInit() {\n    // Auto-scroll to current time when available using ResizeObserver\n    this.resizeObserverCleanup = this.setupCurrentTimeScroll();\n\n    // Register cleanup with DestroyRef\n    this.destroyRef.onDestroy(() => {\n      this.resizeObserverCleanup?.();\n    });\n  }\n\n  ngOnDestroy() {\n    this.resizeObserverCleanup?.();\n  }\n\n  private setupCurrentTimeScroll(): (() => void) | undefined {\n    if (!this.showCurrentTimeIndicator() || !this.scrollToCurrentTimeIndicator()) {\n      return undefined;\n    }\n\n    const currentPosition = this.getCurrentTimePosition();\n    if (currentPosition === null) {\n      return undefined;\n    }\n\n    const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n    if (!timeLineElement) {\n      return undefined;\n    }\n\n    // Use ResizeObserver to detect when the element is properly rendered\n    const resizeObserver = new ResizeObserver((entries) => {\n      for (const entry of entries) {\n        if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n          // Element has proper dimensions, scroll to it\n          timeLineElement.scrollIntoView({\n            behavior: 'smooth',\n            block: 'center',\n            inline: 'nearest',\n          });\n          // Disconnect observer after successful scroll\n          resizeObserver.disconnect();\n          break;\n        }\n      }\n    });\n\n    resizeObserver.observe(timeLineElement);\n\n    // Return cleanup function\n    return () => resizeObserver.disconnect();\n  }\n\n  protected shouldShowCurrentTimeForToday(): boolean {\n    if (!this.showCurrentTimeIndicator()) {\n      return false;\n    }\n\n    const now = this.calendarService.create(new Date(), this.calendar());\n    const weekStart = this.date().startOf('day');\n    const weekEnd = this.date().add('day', 7).startOf('day');\n\n    // Check if current time is within the displayed week\n    if (now.isBefore(weekStart) || now.isAfter(weekEnd)) {\n      return false;\n    }\n\n    // Check if current time is within the visible hours\n    if (now.hour < this.startDayHour() || now.hour >= this.endDayHour()) {\n      return false;\n    }\n\n    return true;\n  }\n\n  // --- Private Data Processing ---\n  private processedAppointmentsForLayout = computed<AXSchedulerAppointmentSegment[]>(() => {\n    const viewDays = this.daysArray().map((e) => e.date);\n    const allOriginalAppointments = this.appointments();\n    if (viewDays.length === 0 || allOriginalAppointments.length === 0) return [];\n\n    const startH = this.startDayHour();\n    const endH = this.endDayHour();\n    const allSegmentsInView: AXSchedulerAppointmentSegment[] = [];\n\n    for (const day of viewDays) {\n      for (const appt of allOriginalAppointments) {\n        const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, day.startOf('day'), startH, endH);\n        if (segment) allSegmentsInView.push(segment);\n      }\n    }\n    const uniqueSegmentsMap = new Map<string, AXSchedulerAppointmentSegment>();\n    allSegmentsInView.forEach((seg) => {\n      const mapKey = `${seg.id}-${seg.startDate.getTime()}-${seg.endDate.getTime()}`;\n      if (!uniqueSegmentsMap.has(mapKey)) uniqueSegmentsMap.set(mapKey, seg);\n    });\n    return Array.from(uniqueSegmentsMap.values());\n  });\n\n  private timedGridSegments = computed<AXSchedulerAppointmentSegment[]>(() => {\n    return this.processedAppointmentsForLayout()?.filter((segment) => !segment.allDay) ?? [];\n  });\n}\n","<div class=\"ax-scheduler-week-header\">\n  <div class=\"ax-scheduler-week-header-days\">\n    <div class=\"ax-scheduler-week-header-table\"></div>\n    <div class=\"ax-scheduler-week-header-date\" aria-hidden=\"true\">\n      @for (day of daysArray(); track day.date.date.getTime()) {\n        <div\n          [class.ax-state-today]=\"isToday(day.date)\"\n          class=\"ax-scheduler-week-header-date-day {{\n            day.holiday.state !== 'none' ? (day.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n          }}\"\n          [style.--ax-scheduler-holiday-color]=\"day.holiday.holiday?.color ?? null\"\n        >\n          <span\n            class=\"ax-scheduler-week-header-date-day-char ax-scheduler-truncate\"\n            [axTooltip]=\"(day.holiday?.holiday?.description ?? day.holiday?.holiday?.title ?? '') | translate | async\"\n          >\n            {{ day.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n            @if (day.holiday.state === 'holiday' && day.holiday.holiday.title) {\n              ( {{ day.holiday.holiday.title | translate | async }} )\n            }\n          </span>\n          <span class=\"ax-scheduler-week-header-date-day-num\">\n            {{ day.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n          </span>\n        </div>\n      }\n    </div>\n  </div>\n  <!-- All-day / Multi-day Spanning Appointments Header -->\n  <div class=\"ax-scheduler-week-header-days ax-scheduler-week-allday-header\">\n    <div class=\"ax-scheduler-week-header-table\">{{ '@acorex:dateTime.duration.all-day' | translate | async }}</div>\n    <div class=\"ax-scheduler-week-allday-content\">\n      <!-- Spanning Appointments Layer -->\n      @if (spanningAppointments().length > 0) {\n        <div class=\"ax-scheduler-week-spanning-layer\">\n          @for (spanning of spanningAppointments(); track spanning.appointment.id) {\n            <div\n              axDrag\n              [dragCursor]=\"'grab'\"\n              [dragData]=\"spanning.appointment\"\n              [dragTransition]=\"false\"\n              [dragElementClone]=\"true\"\n              [dragStartDelay]=\"dragStartDelay()\"\n              [dragDisabled]=\"!draggable() || spanning.appointment.readonly || readonly()\"\n              (pointerdown)=\"getSlotId($event)\"\n              (click)=\"handleAppointmentEvent($event, spanning.appointment)\"\n              (dblclick)=\"handleAppointmentEvent($event, spanning.appointment)\"\n              (contextmenu)=\"handleAppointmentEvent($event, spanning.appointment)\"\n              [title]=\"\n                tooltipTemplate()\n                  ? ''\n                  : spanning.appointment.title +\n                    ' (' +\n                    (spanning.appointment.startDate\n                      | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                      | async) +\n                    ' - ' +\n                    (spanning.appointment.endDate\n                      | format: 'date' : { format: 'MMM d', calendar: calendar() }\n                      | async) +\n                    ')'\n              \"\n              class=\"ax-scheduler-week-spanning-appointment\"\n              [class.ax-spanning-start-clipped]=\"spanning.isStartClipped\"\n              [class.ax-spanning-end-clipped]=\"spanning.isEndClipped\"\n              [class.ax-state-active]=\"isActive(spanning.appointment.id)\"\n              [class]=\"\n                spanning.appointment.cssClass ??\n                'ax-scheduler-' + (spanning.appointment.priority ?? 'primary') + '-priority'\n              \"\n              [style.grid-column]=\"spanning.startDayIndex + 1 + ' / span ' + spanning.spanCount\"\n              [style.--spanning-row-index]=\"spanning.rowIndex\"\n              [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n              [axTooltip]=\"tooltipTemplate()\"\n              [axTooltipContext]=\"spanning.appointment\"\n            >\n              <span class=\"ax-spanning-appointment-title\">\n                <span class=\"ax-scheduler-truncate\">{{ spanning.appointment.title }}</span>\n                @if (hasActions()) {\n                  <ax-icon\n                    (click)=\"handleActionClick($event, spanning.appointment)\"\n                    class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                  ></ax-icon>\n                }\n              </span>\n            </div>\n          }\n        </div>\n      }\n      <!-- Drop zones for each day -->\n      <div class=\"ax-scheduler-week-allday-slots\">\n        @for (slotData of allDayAppointmentsPerDay(); track slotData.day.date.getTime()) {\n          <div\n            axDropZone\n            #zone2=\"axDropZone\"\n            [class.ax-scheduler-slot-hovered]=\"zone2.isHovered()\"\n            (onElementDrop)=\"handleAllDayDrop($event, slotData.day)\"\n            class=\"ax-scheduler-all-day-slot\"\n            (click)=\"handleAllDaySlotEvent($event, slotData.day)\"\n            (dblclick)=\"handleAllDaySlotEvent($event, slotData.day)\"\n            (contextmenu)=\"handleAllDaySlotEvent($event, slotData.day)\"\n          >\n            <!-- Single-day all-day appointments only -->\n            @if (slotData.appointments.length > 0) {\n              <div\n                axDrag\n                [dragCursor]=\"'grab'\"\n                [dragTransition]=\"false\"\n                [dragElementClone]=\"true\"\n                [dragStartDelay]=\"dragStartDelay()\"\n                [dragData]=\"slotData.appointments[0]\"\n                [dragDisabled]=\"!draggable() || slotData.appointments[0].readonly || readonly()\"\n                (pointerdown)=\"getSlotId($event)\"\n                (click)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n                (dblclick)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n                (contextmenu)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n                [title]=\"tooltipTemplate() ? '' : slotData.appointments[0].title\"\n                class=\"ax-scheduler-header-week-appointment\"\n                [style.width]=\"slotData.appointments.length > 1 ? 'calc(100% - 2rem)' : '100%'\"\n                [class.ax-state-active]=\"isActive(slotData.appointments[0].id)\"\n                [class]=\"\n                  slotData.appointments[0].cssClass ??\n                  'ax-scheduler-' + (slotData.appointments[0].priority ?? 'primary') + '-priority'\n                \"\n                [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                [axTooltipContext]=\"slotData.appointments[0]\"\n                [axTooltip]=\"tooltipTemplate()\"\n              >\n                <ax-title>\n                  <span class=\"ax-scheduler-truncate\">{{ slotData.appointments[0].title }}</span>\n                  @if (hasActions()) {\n                    <ax-icon\n                      (click)=\"handleActionClick($event, slotData.appointments[0])\"\n                      class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                    ></ax-icon>\n                  }\n                </ax-title>\n              </div>\n            }\n            @if (slotData.appointments.length > 1) {\n              <div\n                #moreAppointments\n                class=\"ax-scheduler-appointment-badge\"\n                [style.width]=\"'1.5rem'\"\n                [style.border]=\"'none'\"\n                [class]=\"\n                  slotData.appointments[1].cssClass ??\n                  'ax-scheduler-' + (slotData.appointments[1].priority ?? 'primary') + '-priority'\n                \"\n              >\n                +{{ slotData.appointments.length - 1 }}\n              </div>\n              <ax-popover [target]=\"moreAppointments\">\n                <div class=\"ax-scheduler-popover\" [class.ax-state-readonly]=\"readonly()\" axDropZone>\n                  @for (appointment of slotData.appointments; track appointment.id; let first = $first) {\n                    @if (!first) {\n                      <div\n                        axDrag\n                        [dragCursor]=\"'grab'\"\n                        [dragData]=\"appointment\"\n                        [dragTransition]=\"false\"\n                        [dragElementClone]=\"true\"\n                        [dragStartDelay]=\"dragStartDelay()\"\n                        [dragDisabled]=\"!draggable() || appointment.readonly || readonly()\"\n                        (click)=\"handleAppointmentEvent($event, appointment)\"\n                        (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n                        (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n                        [title]=\"tooltipTemplate() ? '' : appointment.title\"\n                        class=\"ax-scheduler-popover-appointment\"\n                        [class.ax-state-active]=\"isActive(appointment.id)\"\n                        [class]=\"\n                          appointment.cssClass ?? 'ax-scheduler-' + (appointment.priority ?? 'primary') + '-priority'\n                        \"\n                        [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                        [axTooltipContext]=\"appointment\"\n                        [axTooltip]=\"tooltipTemplate()\"\n                      >\n                        <ax-title>\n                          <span class=\"ax-scheduler-truncate\">{{ appointment.title }}</span>\n                          @if (hasActions()) {\n                            <ax-icon\n                              (click)=\"handleActionClick($event, appointment)\"\n                              class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                            ></ax-icon>\n                          }\n                        </ax-title>\n                      </div>\n                    }\n                  }\n                </div>\n              </ax-popover>\n            }\n          </div>\n        }\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"ax-scheduler-week-time-container\">\n  <div class=\"ax-scheduler-week-time\" aria-hidden=\"true\">\n    @for (time of hoursArray(); track time.date.getTime()) {\n      <div>\n        {{ time | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n      </div>\n    }\n  </div>\n\n  <div class=\"ax-scheduler-week-table-container\">\n    <!-- Current Time Line Indicator -->\n    @if (\n      shouldShowCurrentTimeForToday() &&\n      getCurrentTimePositionWithOffset() !== null &&\n      getCurrentDayColumnPosition() !== null\n    ) {\n      <div\n        #currentTimeLine\n        class=\"ax-scheduler-current-time-line\"\n        [style.inset-block-start]=\"getCurrentTimePositionWithOffset()\"\n        [style.inset-inline-start]=\"getCurrentDayColumnPosition()\"\n        [style.width]=\"getCurrentDayColumnWidth()\"\n      ></div>\n    }\n    <div class=\"ax-scheduler-week-appointment-container\">\n      @for (appt of visibleAppointmentsLayout(); track appt.appointment.id) {\n        <div\n          axDrag\n          [dragCursor]=\"'grab'\"\n          [dragTransition]=\"false\"\n          [dragElementClone]=\"true\"\n          [dragData]=\"appt.appointment\"\n          [dragStartDelay]=\"dragStartDelay()\"\n          [dragDisabled]=\"!draggable() || appt.appointment.readonly || readonly()\"\n          (pointerdown)=\"getSlotId($event)\"\n          (click)=\"handleAppointmentEvent($event, appt.appointment)\"\n          (dblclick)=\"handleAppointmentEvent($event, appt.appointment)\"\n          (contextmenu)=\"handleAppointmentEvent($event, appt.appointment)\"\n          [title]=\"tooltipTemplate() ? '' : appt.appointment.title\"\n          [style.width]=\"appt.layoutWidth\"\n          [style.height]=\"appt.layoutHeight\"\n          class=\"ax-scheduler-week-appointment\"\n          [style.inset-block-start]=\"appt.layoutTop\"\n          [style.inset-inline-start]=\"appt.layoutLeft\"\n          [class.ax-state-active]=\"isActive(appt.appointment.id)\"\n          [class]=\"\n            appt.appointment.cssClass ?? 'ax-scheduler-' + (appt.appointment.priority ?? 'primary') + '-priority'\n          \"\n          [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n          [axTooltipContext]=\"appt.appointment\"\n          [axTooltip]=\"tooltipTemplate()\"\n        >\n          <ax-title>\n            <span class=\"ax-scheduler-truncate\">{{ appt.appointment.title }}</span>\n            @if (hasActions()) {\n              <ax-icon\n                (click)=\"handleActionClick($event, appt.appointment)\"\n                class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n              ></ax-icon>\n            }\n          </ax-title>\n          <ax-subtitle>\n            {{\n              appt.appointment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n            }}\n            -\n            {{ appt.appointment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n          </ax-subtitle>\n        </div>\n      }\n\n      <!-- Overflow Badges with Popovers -->\n      @for (badge of overflowBadgesWithData(); track badge.key) {\n        <!-- Wrap badge and popover for targeting -->\n        <div\n          style=\"position: absolute\"\n          class=\"ax-scheduler-badge-wrapper\"\n          [style.inset-block-start]=\"badge.badgeTop\"\n          [style.inset-inline-start]=\"badge.badgeLeft\"\n        >\n          <!-- The Badge itself -->\n          <div\n            #actionButton\n            class=\"ax-scheduler-appointment-badge\"\n            [class]=\"\n              badge.hiddenAppointments[0].cssClass ??\n              'ax-scheduler-' + (badge.hiddenAppointments[0].priority ?? 'primary') + '-priority'\n            \"\n          >\n            +{{ badge.count }}\n          </div>\n          <!-- The Popover -->\n          <ax-popover [target]=\"actionButton\">\n            <div class=\"ax-scheduler-popover\" axDropZone>\n              @for (appointment of badge.hiddenAppointments; track appointment.id) {\n                <div\n                  axDrag\n                  [dragCursor]=\"'grab'\"\n                  [dragData]=\"appointment\"\n                  [dragTransition]=\"false\"\n                  [dragElementClone]=\"true\"\n                  [dragStartDelay]=\"dragStartDelay()\"\n                  [dragDisabled]=\"!draggable() || appointment.readonly || readonly()\"\n                  (click)=\"handleAppointmentEvent($event, appointment)\"\n                  (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n                  (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n                  [title]=\"tooltipTemplate() ? '' : appointment.title\"\n                  class=\"ax-scheduler-popover-appointment\"\n                  [class.ax-state-active]=\"isActive(appointment.id)\"\n                  [class]=\"appointment.cssClass ?? 'ax-scheduler-' + (appointment.priority ?? 'primary') + '-priority'\"\n                  [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n                  [axTooltipContext]=\"appointment\"\n                  [axTooltip]=\"tooltipTemplate()\"\n                >\n                  <ax-title>\n                    <span class=\"ax-scheduler-truncate\">{{ appointment.title }}</span>\n                    @if (hasActions()) {\n                      <ax-icon\n                        (click)=\"handleActionClick($event, appointment)\"\n                        class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n                      ></ax-icon>\n                    }\n                  </ax-title>\n                  <ax-subtitle>\n                    {{\n                      appointment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n                    }}\n                    -\n                    {{\n                      appointment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n                    }}\n                  </ax-subtitle>\n                </div>\n              }\n            </div>\n          </ax-popover>\n        </div>\n      }\n    </div>\n\n    <table aria-hidden=\"true\" [border]=\"1\">\n      <tbody>\n        @for (time of hoursArray(); track time.date.getTime()) {\n          <tr>\n            @for (day of daysArray(); track day.date.date.getTime()) {\n              <td\n                axDropZone\n                #zone=\"axDropZone\"\n                [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n                (onElementDrop)=\"handleSingleDayDrop($event, time, day.date, 0)\"\n                (click)=\"handleSingleSlotEvent($event, time, day.date, 0)\"\n                (dblclick)=\"handleSingleSlotEvent($event, time, day.date, 0)\"\n                (contextmenu)=\"handleSingleSlotEvent($event, time, day.date, 0)\"\n                [attr.data-slot-id]=\"day.date.format('YYYYMMDD') + '-' + time.format('HHmm')\"\n              ></td>\n            }\n          </tr>\n          <tr>\n            @for (day of daysArray(); track day.date.date.getTime()) {\n              <td\n                axDropZone\n                #zone2=\"axDropZone\"\n                [class.ax-scheduler-slot-hovered]=\"zone2.isHovered()\"\n                (onElementDrop)=\"handleSingleDayDrop($event, time, day.date, 1)\"\n                (click)=\"handleSingleSlotEvent($event, time, day.date, 1)\"\n                (dblclick)=\"handleSingleSlotEvent($event, time, day.date, 1)\"\n                (contextmenu)=\"handleSingleSlotEvent($event, time, day.date, 1)\"\n                [attr.data-slot-id]=\"day.date.format('YYYYMMDD') + '-' + time.add('minute', 30).format('HHmm')\"\n              ></td>\n            }\n          </tr>\n        }\n      </tbody>\n    </table>\n  </div>\n</div>\n","import { AXComponent, AXValueChangedEvent, NXComponent, NXEvent, NXNativeEvent } from '@acorex/cdk/common';\nimport { AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXBadgeComponent } from '@acorex/components/badge';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXCalendarComponent } from '@acorex/components/calendar';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXSelectBoxComponent } from '@acorex/components/select-box';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXEventService, AXSystemEvents } from '@acorex/core/events';\nimport { AXFormatService } from '@acorex/core/format';\nimport { AXLocaleService } from '@acorex/core/locale';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXUnsubscriber } from '@acorex/core/utils';\nimport {\n  Component,\n  computed,\n  effect,\n  inject,\n  input,\n  linkedSignal,\n  model,\n  OnInit,\n  output,\n  signal,\n  TemplateRef,\n  untracked,\n  viewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { filter } from 'rxjs';\nimport {\n  AXDayOfWeekName,\n  AXSchedulerAppointment,\n  AXSchedulerAppointmentDataSource,\n  AXSchedulerAppointmentLoader,\n  AXSchedulerDateRange,\n  AXSchedulerResource,\n  AXSchedulerView,\n} from './scheduler.class';\nimport { AXSchedulerService } from './scheduler.service';\nimport { AXSchedulerAgendaViewComponent } from './views/agenda/scheduler-agenda-view.component';\nimport { AXSchedulerDayViewComponent } from './views/day/scheduler-day-view.component';\nimport { AXSchedulerMonthViewComponent } from './views/month/scheduler-month-view.component';\nimport { AXSchedulerTimelineDayViewComponent } from './views/timeline-day/scheduler-timeline-day-view.component';\nimport { AXSchedulerTimelineMonthViewComponent } from './views/timeline-month/scheduler-timeline-month-view.component';\nimport { AXSchedulerTimelineWeeklyViewComponent } from './views/timeline-weekly/scheduler-timeline-weekly-view.component';\nimport { AXSchedulerTimelineYearViewComponent } from './views/timeline-year/scheduler-timeline-year-view.component';\nimport { AXSchedulerWeekViewComponent } from './views/week/scheduler-week-view.component';\n\nexport interface AXSchedulerAppointmentMouseEvent extends NXNativeEvent<AXSchedulerComponent, MouseEvent> {\n  appointment: AXSchedulerAppointment;\n}\nexport interface AXSchedulerSlotMouseEvent extends NXNativeEvent<AXSchedulerComponent, MouseEvent> {\n  slot: {\n    endDate: AXDateTime;\n    startDate: AXDateTime;\n    view: AXSchedulerView;\n  };\n}\nexport interface AXSchedulerSlotDropEvent extends NXEvent<AXSchedulerComponent> {\n  dropEvent: AXDropZoneDropEvent;\n  appointment: AXSchedulerAppointment;\n  slot: {\n    endDate: AXDateTime;\n    startDate: AXDateTime;\n    view: AXSchedulerView;\n    resourceId?: any; // Resource ID for timeline views\n  };\n  isSameSlotDrop: boolean; // True if dropped on the same time AND same resource\n}\n\n@Component({\n  selector: 'ax-scheduler',\n  templateUrl: './scheduler.component.html',\n  styleUrls: ['./scheduler.component.css'],\n\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    '[class.ax-rtl]': 'rtl()',\n  },\n  imports: [\n    FormsModule,\n    AXBadgeComponent,\n    AXButtonComponent,\n    AXPopoverComponent,\n    AXCalendarComponent,\n    AXSelectBoxComponent,\n    AXDecoratorIconComponent,\n    AXSchedulerDayViewComponent,\n    AXSchedulerWeekViewComponent,\n    AXSchedulerMonthViewComponent,\n    AXSchedulerAgendaViewComponent,\n    AXSchedulerTimelineDayViewComponent,\n    AXSchedulerTimelineMonthViewComponent,\n    AXSchedulerTimelineWeeklyViewComponent,\n    AXSchedulerTimelineYearViewComponent,\n  ],\n  providers: [AXUnsubscriber, { provide: AXComponent, useExisting: AXSchedulerComponent }],\n})\nexport class AXSchedulerComponent extends NXComponent implements OnInit {\n  private unsubscriber = inject(AXUnsubscriber);\n  private formatService = inject(AXFormatService);\n  private localeService = inject(AXLocaleService);\n  private calendarService = inject(AXCalendarService);\n  private schedulerService = inject(AXSchedulerService);\n  private translationService = inject(AXTranslationService);\n  private eventService = inject(AXEventService);\n\n  private translationRevision = signal(0);\n\n  private calendarPopover = viewChild<AXPopoverComponent>('calendarPopover');\n  private _calendarDayCellTemplate = viewChild<TemplateRef<unknown>>('calendarDayCellTemplate');\n  private _calendarMonthCellTemplate = viewChild<TemplateRef<unknown>>('calendarMonthCellTemplate');\n  private _calendarYearCellTemplate = viewChild<TemplateRef<unknown>>('calendarYearCellTemplate');\n\n  /** Expose template refs for calendar bindings (signals are not callable in template type-check) */\n  protected get calendarDayCellTemplateRef(): TemplateRef<unknown> | undefined {\n    return this._calendarDayCellTemplate() ?? undefined;\n  }\n  protected get calendarMonthCellTemplateRef(): TemplateRef<unknown> | undefined {\n    return this._calendarMonthCellTemplate() ?? undefined;\n  }\n  protected get calendarYearCellTemplateRef(): TemplateRef<unknown> | undefined {\n    return this._calendarYearCellTemplate() ?? undefined;\n  }\n\n  private displayViews: Record<AXSchedulerView, string> = {\n    day: 'daily',\n    week: 'weekly',\n    month: 'monthly',\n    'timeline-day': 'daily-timeline',\n    'timeline-weekly': 'weekly-timeline',\n    'timeline-month': 'monthly-timeline',\n    'timeline-year': 'yearly-timeline',\n    agenda: 'agenda',\n  };\n\n  public calendar = input<'gregorian' | 'solar-hijri' | string>();\n  protected calendarType = linkedSignal<'gregorian' | 'solar-hijri' | string>(\n    () => this.localeService.activeProfile().calendar.system,\n  );\n\n  public startingDate = input<Date>(new Date());\n  public currentDate = linkedSignal<{ startingDate: Date; calendarType: string }, AXDateTime>({\n    source: () => ({\n      startingDate: this.startingDate(),\n      calendarType: this.calendarType(),\n    }),\n    computation: (source, previous) => {\n      if (previous) {\n        return this.calendarService.create(previous.value.date, source.calendarType);\n      }\n      return this.calendarService.create(source.startingDate, source.calendarType).startOf('day');\n    },\n  });\n\n  private _appointments = signal<AXSchedulerAppointment[]>([]);\n  public appointments = this._appointments.asReadonly();\n  protected readonly rtl = this.localeService.isRtl;\n  protected isFullScreen = signal(false);\n  protected viewsDataSource = computed(() =>\n    this.views().map((view) => ({\n      id: view,\n      text: `@acorex:dateTime.duration.${this.displayViews[view]}`,\n    })),\n  );\n  private prevDate = signal<AXDateTime>(this.calendarService.create(new Date(), this.calendarType()));\n\n  // Track the currently selected/active appointment\n  protected selectedAppointmentId = signal<string | number | null>(null);\n\n  public endDayHour = input(24);\n  public startDayHour = input(8);\n  public hasHeader = input(true);\n  public readonly = input(false);\n  public draggable = input(true);\n  public hasActions = input(false);\n  public dragStartDelay = input(0);\n  public weekend = input<number[]>([]);\n  public allowFullScreen = input(true);\n  public multiDayViewDaysCount = input(7);\n  public showResourceHeaders = input(true);\n  public showCurrentTimeIndicator = input(true);\n  public scrollToCurrentTimeIndicator = input(false);\n  public showUnassignedAppointments = input(true);\n  public resources = input<AXSchedulerResource[]>([]);\n  public resourceTemplate = input<TemplateRef<unknown>>();\n  public firstDayOfWeek = input<AXDayOfWeekName>();\n  public tooltipTemplate = input<string | TemplateRef<unknown>>();\n  public dataSource = input<AXSchedulerAppointmentDataSource>([]);\n  public holidays = input<(range: AXSchedulerDateRange) => Promise<AXHolidayDate[]>>();\n  public views = input<AXSchedulerView[]>([\n    'day',\n    'week',\n    'month',\n    'timeline-day',\n    'timeline-weekly',\n    'timeline-month',\n    'timeline-year',\n    'agenda',\n  ]);\n\n  public selectedView = model<AXSchedulerView>(this.views()[0]);\n  private prevView = signal<AXSchedulerView>(this.selectedView());\n\n  // --- Public Outputs ---\n  public onDataLoaded = output<void>();\n  public onRangeChanged = output<AXSchedulerDateRange>();\n  public onSlotClicked = output<AXSchedulerSlotMouseEvent>();\n  public onSlotDblClicked = output<AXSchedulerSlotMouseEvent>();\n  public onSlotRightClick = output<AXSchedulerSlotMouseEvent>();\n  public onAppointmentDrop = output<AXSchedulerSlotDropEvent>();\n  public onActionClick = output<AXSchedulerAppointmentMouseEvent>();\n  public onAppointmentClicked = output<AXSchedulerAppointmentMouseEvent>();\n  public onAppointmentDblClicked = output<AXSchedulerAppointmentMouseEvent>();\n  public onAppointmentRightClick = output<AXSchedulerAppointmentMouseEvent>();\n\n  // --- Internal Handlers for View Outputs ---\n  protected handleSlotClickInternal(eventData: AXSchedulerSlotMouseEvent) {\n    // Deselect appointment when clicking on a slot\n    this.selectedAppointmentId.set(null);\n    this.onSlotClicked.emit(eventData);\n  }\n  protected handleSlotDblClickInternal(eventData: AXSchedulerSlotMouseEvent) {\n    this.onSlotDblClicked.emit(eventData);\n  }\n  protected handleSlotRightClickInternal(eventData: AXSchedulerSlotMouseEvent) {\n    this.onSlotRightClick.emit(eventData);\n  }\n  protected handleAppointmentClickInternal(eventData: AXSchedulerAppointmentMouseEvent) {\n    // Set the clicked appointment as selected/active\n    this.selectedAppointmentId.set(eventData.appointment.id);\n    this.onAppointmentClicked.emit(eventData);\n  }\n  protected handleAppointmentDblClickInternal(eventData: AXSchedulerAppointmentMouseEvent) {\n    this.onAppointmentDblClicked.emit(eventData);\n  }\n  protected handleAppointmentRightClickInternal(eventData: AXSchedulerAppointmentMouseEvent) {\n    this.onAppointmentRightClick.emit(eventData);\n  }\n  protected handleAppointmentDropInternal(eventData: AXSchedulerSlotDropEvent) {\n    this.onAppointmentDrop.emit(eventData);\n  }\n\n  ngOnInit() {\n    this.calendarService.calendarChanges$.pipe(this.unsubscriber.takeUntilDestroy).subscribe(() => {\n      this.syncCurrentDateAfterLocaleChange();\n    });\n\n    this.localeService.profileChanged$.pipe(this.unsubscriber.takeUntilDestroy).subscribe((profile) => {\n      this.calendarType.set(profile.calendar.system);\n      queueMicrotask(() => this.syncCurrentDateAfterLocaleChange());\n    });\n\n    this.translationService.langChanges$.pipe(this.unsubscriber.takeUntilDestroy).subscribe(() => {\n      this.translationRevision.update((v) => v + 1);\n      const currentDate = this.calendarService.create(this.currentDate().date, this.calendarType());\n      if (!currentDate.equal(this.currentDate())) {\n        this.currentDate.set(currentDate);\n      }\n    });\n\n    this.eventService.onEvent\n      .pipe(\n        filter((event) => event.type === AXSystemEvents.AXLanguageLoaded),\n        this.unsubscriber.takeUntilDestroy,\n      )\n      .subscribe(() => this.translationRevision.update((v) => v + 1));\n  }\n\n  /** Applies an explicit `[calendar]` override only when it differs from the active locale profile. */\n  #calendarOverrideEffect = effect(() => {\n    const override = this.calendar();\n    const profileSystem = this.localeService.activeProfile().calendar.system;\n    if (override != null && override !== profileSystem) {\n      untracked(() => this.calendarType.set(override));\n    }\n  });\n\n  /**\n   * Picks a stable anchor inside the visible week so re-aligning after a locale\n   * change does not drift when the previous week start was a Sunday/Monday edge.\n   */\n  private getWeekReanchorDate(): AXDateTime {\n    const current = this.calendarService.create(this.currentDate().date, this.calendarType());\n    const today = this.calendarService.now(this.calendarType()).startOf('day');\n    const weekEnd = current.add('day', 6);\n\n    if (today.compare(current, 'day') >= 0 && today.compare(weekEnd, 'day') <= 0) {\n      return today;\n    }\n\n    return current.add('day', 3);\n  }\n\n  private syncCurrentDateAfterLocaleChange(): void {\n    let currentDate = this.calendarService.create(this.currentDate().date, this.calendarType());\n    const view = this.selectedView();\n\n    if (view === 'week' || view === 'timeline-weekly') {\n      currentDate = this.schedulerService.alignToWeekStart(this.getWeekReanchorDate(), {\n        firstDayOfWeek: this.firstDayOfWeek(),\n      });\n    }\n\n    if (!currentDate.equal(this.currentDate())) {\n      this.currentDate.set(currentDate);\n    }\n  }\n\n  #appointmentEffect = effect(() => {\n    const dataSource = this.dataSource();\n    const range = {\n      end: this.range().end,\n      from: this.range().from,\n    };\n\n    if (typeof dataSource === 'function') {\n      const result = dataSource({ range });\n      // Handle both sync and async loaders\n      if (result instanceof Promise) {\n        result.then((list) => {\n          this._appointments.set(list);\n          this.onDataLoaded.emit();\n        });\n      } else {\n        this._appointments.set(result);\n        this.onDataLoaded.emit();\n      }\n    } else {\n      const list = dataSource as AXSchedulerAppointment[];\n      this._appointments.set(list);\n      this.onDataLoaded.emit();\n    }\n  });\n\n  #holidayEffect = effect(() => {\n    const func = this.holidays();\n    if (!func) return; // Guard against undefined holidays function\n\n    const range = {\n      end: this.range().end,\n      from: this.range().from,\n    };\n\n    const result = func(range);\n    if (result instanceof Promise) {\n      result.then((holidays) => {\n        this.schedulerService.internalHoliday.set(holidays);\n      });\n    } else {\n      this.schedulerService.internalHoliday.set(result as AXHolidayDate[]);\n    }\n  });\n\n  #weekendEffect = effect(() => {\n    const weekend = this.weekend();\n    this.schedulerService.internalWeekend.set(weekend);\n  });\n\n  private getGridDateRange(dateInMonth: AXDateTime): { gridStartDate: AXDateTime; gridEndDate: AXDateTime } {\n    const firstDayOfMonth = dateInMonth.startOf('month');\n    const gridStartDate = this.schedulerService.alignToWeekStart(firstDayOfMonth, {\n      firstDayOfWeek: this.firstDayOfWeek(),\n    });\n    const gridEndDate = gridStartDate.add('day', 6 * 7 - 1);\n    return { gridStartDate, gridEndDate };\n  }\n\n  public currentDateText = computed(() => {\n    this.translationRevision();\n    this.localeService.activeProfile();\n\n    switch (this.selectedView()) {\n      case 'day':\n      case 'timeline-day':\n        return this.formatService.format(this.currentDate(), 'datetime', {\n          format: 'DD MMMM yyyy',\n          calendar: this.calendarType(),\n        });\n      case 'week': {\n        const startOfWeek = this.formatService.format(this.currentDate(), 'datetime', {\n          format: 'DD MMMM yyyy',\n          calendar: this.calendarType(),\n        });\n        const endOfWeek = this.formatService.format(this.currentDate().add('week', 1).add('day', -1), 'datetime', {\n          format: 'DD MMMM yyyy',\n          calendar: this.calendarType(),\n        });\n        return `${startOfWeek} - ${endOfWeek}`;\n      }\n      case 'agenda':\n      case 'timeline-weekly': {\n        const startOfWeek = this.formatService.format(this.currentDate(), 'datetime', {\n          format: 'DD MMMM yyyy',\n          calendar: this.calendarType(),\n        });\n        const endOfWeek = this.formatService.format(\n          this.currentDate().add('day', this.multiDayViewDaysCount() - 1),\n          'datetime',\n          {\n            format: 'DD MMMM yyyy',\n            calendar: this.calendarType(),\n          },\n        );\n        return `${startOfWeek} - ${endOfWeek}`;\n      }\n      case 'month':\n      case 'timeline-month':\n        return this.formatService.format(this.currentDate(), 'datetime', {\n          format: 'MMMM yyyy',\n          calendar: this.calendarType(),\n        });\n      case 'timeline-year':\n        return this.formatService.format(this.currentDate(), 'datetime', {\n          format: 'yyyy',\n          calendar: this.calendarType(),\n        });\n    }\n  });\n\n  public calendarDepth = computed(() => {\n    switch (this.selectedView()) {\n      case 'day':\n      case 'week':\n      case 'agenda':\n      case 'timeline-day':\n      case 'timeline-weekly':\n        return 'day';\n      case 'month':\n      case 'timeline-month':\n        return 'month';\n      case 'timeline-year':\n        return 'year';\n    }\n  });\n\n  private mappedAppointments = computed<AXSchedulerAppointment[]>(() => {\n    const items = this._appointments() as AXSchedulerAppointment[];\n\n    return items\n      .map((item) => {\n        const startDate = this.calendarService.create(item.startDate, this.calendarType());\n        const endDate = this.calendarService.create(item.endDate, this.calendarType());\n        // Basic validation\n        if (!startDate?.date || !endDate?.date) {\n          console.warn('Scheduler: Skipping item due to invalid date fields:', item);\n          return null;\n        }\n        // Check if dates are valid after creation\n        if (isNaN(startDate.date.getTime()) || isNaN(endDate.date.getTime())) {\n          console.warn('Scheduler: Skipping item due to invalid parsed date (NaN):', item);\n          return null;\n        }\n        return item;\n      })\n      .filter((appt): appt is AXSchedulerAppointment => appt !== null); // Filter out nulls from invalid dates\n  });\n\n  public range = computed<AXSchedulerDateRange>(() => {\n    const view = this.selectedView();\n    const current = this.currentDate().startOf('day');\n\n    if (!current) return { from: null, end: null };\n\n    switch (view) {\n      case 'day':\n      case 'timeline-day': {\n        const range = { from: current.date, end: current.endOf('day').date };\n        return range;\n      }\n      case 'week': {\n        const range = { from: current.date, end: current.add('day', 7).date };\n        return range;\n      }\n      case 'month': {\n        const { gridStartDate, gridEndDate } = this.getGridDateRange(current);\n        const range = { from: gridStartDate.date, end: gridEndDate.add('day', 1).date };\n        return range;\n      }\n      case 'timeline-month': {\n        const range = { from: current.startOf('month').date, end: current.endOf('month').date };\n        return range;\n      }\n      case 'agenda':\n      case 'timeline-weekly': {\n        const range = { from: current.date, end: current.add('day', this.multiDayViewDaysCount()).date };\n        return range;\n      }\n      case 'timeline-year': {\n        const range = { from: current.startOf('year').date, end: current.endOf('year').date };\n        return range;\n      }\n    }\n  });\n\n  #rangeChangedEffect = effect(() => {\n    this.onRangeChanged.emit(this.range());\n  });\n\n  #viewChangedEffect = effect(() => {\n    const view = this.selectedView();\n    untracked(() => {\n      this.handleViewChanged(this.prevView(), view);\n    });\n  });\n\n  viewAppointments = computed<AXSchedulerAppointment[]>(() => {\n    const current = this.currentDate();\n    const mapped = this.mappedAppointments();\n    const rangeStart = this.range().from;\n    const rangeEnd = this.range().end;\n\n    if (!current || mapped.length === 0) return [];\n\n    return mapped.filter(\n      (appt) =>\n        this.calendarService.create(appt.startDate, this.calendarType()).compare(rangeEnd, 'second') <= 0 &&\n        this.calendarService.create(appt.endDate, this.calendarType()).compare(rangeStart, 'second') >= 0,\n    );\n  });\n\n  protected hasAppointmentsOnDate(date: Date): boolean {\n    if (!date) {\n      return false;\n    }\n\n    const target = this.calendarService.create(date, this.calendarType()).startOf('day');\n    const appointments = this.mappedAppointments();\n\n    if (!appointments || appointments.length === 0) {\n      return false;\n    }\n\n    return appointments.some((appt) => {\n      const start = this.calendarService.create(appt.startDate, this.calendarType()).startOf('day');\n      const end = this.calendarService.create(appt.endDate, this.calendarType()).startOf('day');\n      return target.compare(start, 'day') >= 0 && target.compare(end, 'day') <= 0;\n    });\n  }\n\n  /**\n   * Returns whether any appointment overlaps the given month (used for calendar month-cell badge).\n   * Works correctly when navigating to previous/next month or year in the calendar.\n   */\n  protected hasAppointmentsInMonth(monthStartDate: Date): boolean {\n    if (!monthStartDate) return false;\n    const startOfMonth = this.calendarService.create(monthStartDate, this.calendarType()).startOf('month');\n    const endOfMonth = startOfMonth.endOf('month');\n    const appointments = this.mappedAppointments();\n    if (!appointments?.length) return false;\n    return appointments.some((appt) => {\n      const apptStart = this.calendarService.create(appt.startDate, this.calendarType());\n      const apptEnd = this.calendarService.create(appt.endDate, this.calendarType());\n      return apptEnd.compare(startOfMonth, 'day') >= 0 && apptStart.compare(endOfMonth, 'day') <= 0;\n    });\n  }\n\n  /**\n   * Returns whether any appointment falls in the given year (used for calendar year-cell badge).\n   */\n  protected hasAppointmentsInYear(yearStartDate: Date): boolean {\n    if (!yearStartDate) return false;\n    const startOfYear = this.calendarService.create(yearStartDate, this.calendarType()).startOf('year');\n    const endOfYear = startOfYear.endOf('year');\n    const appointments = this.mappedAppointments();\n    if (!appointments?.length) return false;\n    return appointments.some((appt) => {\n      const apptStart = this.calendarService.create(appt.startDate, this.calendarType());\n      const apptEnd = this.calendarService.create(appt.endDate, this.calendarType());\n      return apptEnd.compare(startOfYear, 'day') >= 0 && apptStart.compare(endOfYear, 'day') <= 0;\n    });\n  }\n\n  /**\n   * Handles view change events.\n   *\n   * @param e - The value changed event containing old and new view values.\n   */\n  viewChanged(e: AXValueChangedEvent<AXSchedulerView>) {\n    const newView = e.value;\n    const oldView = e.oldValue;\n    this.selectedView.set(newView);\n\n    this.handleViewChanged(oldView, newView);\n  }\n\n  private handleViewChanged(oldView: AXSchedulerView, newView: AXSchedulerView) {\n    if (oldView === newView) {\n      return;\n    }\n\n    if (oldView === 'week') {\n      const startsOn = this.schedulerService.resolveWeekStartsOn(this.firstDayOfWeek());\n      const offset = (this.prevDate().weekdayIndex - startsOn + 7) % 7;\n      this.currentDate.set(this.currentDate().add('day', offset));\n    }\n\n    this.prevDate.set(this.currentDate());\n\n    if (newView === 'week' || newView === 'timeline-weekly') {\n      const today = this.calendarService.now(this.calendarType()).startOf('day');\n      this.prevDate.set(today);\n      this.currentDate.set(\n        this.schedulerService.alignToWeekStart(today, {\n          firstDayOfWeek: this.firstDayOfWeek(),\n        }),\n      );\n    }\n\n    this.prevView.set(newView);\n  }\n\n  /**\n   * Navigates to the next time period based on current view.\n   */\n  nextClick() {\n    switch (this.selectedView()) {\n      case 'day':\n      case 'timeline-day':\n        this.currentDate.set(this.currentDate().add('day', 1));\n        break;\n\n      case 'week':\n        this.currentDate.set(\n          this.schedulerService.alignToWeekStart(this.currentDate().add('week', 1), {\n            firstDayOfWeek: this.firstDayOfWeek(),\n          }),\n        );\n        break;\n\n      case 'agenda':\n      case 'timeline-weekly':\n        this.currentDate.set(this.currentDate().add('day', this.multiDayViewDaysCount()));\n        break;\n\n      case 'month':\n      case 'timeline-month':\n        this.currentDate.set(this.currentDate().add('month', 1));\n        break;\n\n      case 'timeline-year':\n        this.currentDate.set(this.currentDate().add('year', 1));\n        break;\n    }\n  }\n\n  /**\n   * Navigates to the previous time period based on current view.\n   */\n  prevClick() {\n    switch (this.selectedView()) {\n      case 'day':\n      case 'timeline-day':\n        this.currentDate.set(this.currentDate().add('day', -1));\n        break;\n\n      case 'week':\n        this.currentDate.set(\n          this.schedulerService.alignToWeekStart(this.currentDate().add('week', -1), {\n            firstDayOfWeek: this.firstDayOfWeek(),\n          }),\n        );\n        break;\n\n      case 'agenda':\n      case 'timeline-weekly':\n        this.currentDate.set(this.currentDate().add('day', -this.multiDayViewDaysCount()));\n        break;\n\n      case 'month':\n      case 'timeline-month':\n        this.currentDate.set(this.currentDate().add('month', -1));\n        break;\n\n      case 'timeline-year':\n        this.currentDate.set(this.currentDate().add('year', -1));\n        break;\n    }\n  }\n\n  /**\n   * Handles calendar date change events.\n   *\n   * @param e - The value changed event containing the new date.\n   */\n  calendarDateChanged(e: AXValueChangedEvent<Date>) {\n    let currentDate = this.calendarService.create(e.value, this.calendarType());\n    if (this.selectedView() === 'week') {\n      currentDate = this.schedulerService.alignToWeekStart(currentDate, {\n        firstDayOfWeek: this.firstDayOfWeek(),\n      });\n    }\n    if (!currentDate.equal(this.currentDate())) {\n      this.currentDate.set(currentDate);\n    }\n    this.calendarPopover()?.close();\n  }\n\n  /**\n   * Toggles fullscreen mode for the scheduler.\n   */\n  public handleFullScreen() {\n    if (!this.isFullScreen()) this.nativeElement.classList.add('ax-full-screen-container');\n    else this.nativeElement.classList.remove('ax-full-screen-container');\n    this.isFullScreen.set(!this.isFullScreen());\n  }\n\n  /**\n   * Refreshes the scheduler data.\n   *\n   * @param appointments - Optional array of appointments to refresh with.\n   */\n  public async refresh(appointments?: AXSchedulerAppointment[]) {\n    if (appointments) {\n      const newAppointments = this._appointments().map((appt) => {\n        return appointments.find((a) => a.id === appt.id) ?? appt;\n      });\n      this._appointments.set(newAppointments);\n      this.onDataLoaded.emit();\n      return;\n    }\n    if (typeof this.dataSource() === 'function') {\n      const func = this.dataSource() as AXSchedulerAppointmentLoader;\n      const range = {\n        end: this.range().end,\n        from: this.range().from,\n      };\n      const list = await func({ range });\n      this._appointments.set(list);\n      this.onDataLoaded.emit();\n      return;\n    }\n    const list = this.dataSource() as AXSchedulerAppointment[];\n    this._appointments.set(list);\n    this.onDataLoaded.emit();\n  }\n}\n","<div class=\"ax-scheduler-container\">\n  @if (hasHeader()) {\n    <div class=\"ax-scheduler-header\">\n      <div class=\"ax-scheduler-date\">\n        <ax-button look=\"blank\" (onClick)=\"prevClick()\">\n          <ax-icon\n            class=\"ax-icon text-xl\"\n            [class.ax-icon-chevron-left]=\"!rtl()\"\n            [class.ax-icon-chevron-right]=\"rtl()\"\n          ></ax-icon>\n        </ax-button>\n        <ax-button look=\"blank\" [text]=\"currentDateText()\" #date></ax-button>\n        <ax-button look=\"blank\" (onClick)=\"nextClick()\">\n          <ax-icon\n            class=\"ax-icon text-xl\"\n            [class.ax-icon-chevron-right]=\"!rtl()\"\n            [class.ax-icon-chevron-left]=\"rtl()\"\n          ></ax-icon>\n        </ax-button>\n        <ax-popover [target]=\"date\" #calendarPopover>\n          <ax-calendar\n            [type]=\"calendarType()\"\n            [depth]=\"calendarDepth()\"\n            [ngModel]=\"currentDate()\"\n            [dayCellTemplate]=\"calendarDayCellTemplateRef\"\n            [monthCellTemplate]=\"calendarMonthCellTemplateRef\"\n            [yearCellTemplate]=\"calendarYearCellTemplateRef\"\n            (onValueChanged)=\"calendarDateChanged($event)\"\n          ></ax-calendar>\n        </ax-popover>\n      </div>\n      <div class=\"ax-scheduler-actions\">\n        <ax-select-box\n          [dropdownWidth]=\"'200px'\"\n          [ngModel]=\"selectedView()\"\n          [dataSource]=\"viewsDataSource()\"\n          (onValueChanged)=\"viewChanged($event)\"\n        ></ax-select-box>\n\n        @if (allowFullScreen()) {\n          <ax-button look=\"blank\" (onClick)=\"handleFullScreen()\">\n            <ax-icon>\n              <i class=\"fa-solid\" [class.fa-compress]=\"isFullScreen()\" [class.fa-expand]=\"!isFullScreen()\"></i>\n            </ax-icon>\n          </ax-button>\n        }\n      </div>\n    </div>\n  }\n  <div class=\"ax-scheduler-views-container\">\n    @switch (selectedView()) {\n      @case ('day') {\n        <ax-scheduler-day-view\n          [rtl]=\"rtl()\"\n          [date]=\"currentDate()\"\n          [readonly]=\"readonly()\"\n          [draggable]=\"draggable()\"\n          [hasActions]=\"hasActions()\"\n          [calendar]=\"calendarType()\"\n          [endDayHour]=\"endDayHour()\"\n          [startDayHour]=\"startDayHour()\"\n          [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n          [scrollToCurrentTimeIndicator]=\"scrollToCurrentTimeIndicator()\"\n          [appointments]=\"viewAppointments()\"\n          [dragStartDelay]=\"dragStartDelay()\"\n          [tooltipTemplate]=\"tooltipTemplate()\"\n          [selectedAppointmentId]=\"selectedAppointmentId()\"\n          (onActionClickInternal)=\"onActionClick.emit($event)\"\n          (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n          (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n          (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n          (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n          (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n          (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n          (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n        ></ax-scheduler-day-view>\n      }\n      @case ('week') {\n        <ax-scheduler-week-view\n          [date]=\"currentDate()\"\n          [readonly]=\"readonly()\"\n          [draggable]=\"draggable()\"\n          [calendar]=\"calendarType()\"\n          [endDayHour]=\"endDayHour()\"\n          [hasActions]=\"hasActions()\"\n          [startDayHour]=\"startDayHour()\"\n          [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n          [scrollToCurrentTimeIndicator]=\"scrollToCurrentTimeIndicator()\"\n          [appointments]=\"viewAppointments()\"\n          [dragStartDelay]=\"dragStartDelay()\"\n          [tooltipTemplate]=\"tooltipTemplate()\"\n          [selectedAppointmentId]=\"selectedAppointmentId()\"\n          (onActionClickInternal)=\"onActionClick.emit($event)\"\n          (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n          (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n          (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n          (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n          (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n          (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n          (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n        ></ax-scheduler-week-view>\n      }\n      @case ('month') {\n        <ax-scheduler-month-view\n          [date]=\"currentDate()\"\n          [readonly]=\"readonly()\"\n          [draggable]=\"draggable()\"\n          [calendar]=\"calendarType()\"\n          [hasActions]=\"hasActions()\"\n          [appointments]=\"viewAppointments()\"\n          [firstDayOfWeek]=\"firstDayOfWeek()\"\n          [dragStartDelay]=\"dragStartDelay()\"\n          [tooltipTemplate]=\"tooltipTemplate()\"\n          [selectedAppointmentId]=\"selectedAppointmentId()\"\n          (onActionClickInternal)=\"onActionClick.emit($event)\"\n          (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n          (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n          (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n          (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n          (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n          (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n          (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n        ></ax-scheduler-month-view>\n      }\n      @case ('timeline-day') {\n        <ax-scheduler-timeline-day-view\n          [date]=\"currentDate()\"\n          [readonly]=\"readonly()\"\n          [resources]=\"resources()\"\n          [draggable]=\"draggable()\"\n          [hasActions]=\"hasActions()\"\n          [calendar]=\"calendarType()\"\n          [endDayHour]=\"endDayHour()\"\n          [startDayHour]=\"startDayHour()\"\n          [appointments]=\"viewAppointments()\"\n          [dragStartDelay]=\"dragStartDelay()\"\n          [tooltipTemplate]=\"tooltipTemplate()\"\n          [resourceTemplate]=\"resourceTemplate()\"\n          [showResourceHeaders]=\"showResourceHeaders()\"\n          [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n          [scrollToCurrentTimeIndicator]=\"scrollToCurrentTimeIndicator()\"\n          [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n          [selectedAppointmentId]=\"selectedAppointmentId()\"\n          (onActionClickInternal)=\"onActionClick.emit($event)\"\n          (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n          (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n          (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n          (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n          (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n          (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n          (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n        >\n        </ax-scheduler-timeline-day-view>\n      }\n      @case ('timeline-weekly') {\n        <ax-scheduler-timeline-weekly-view\n          [date]=\"currentDate()\"\n          [readonly]=\"readonly()\"\n          [resources]=\"resources()\"\n          [draggable]=\"draggable()\"\n          [calendar]=\"calendarType()\"\n          [endDayHour]=\"endDayHour()\"\n          [hasActions]=\"hasActions()\"\n          [startDayHour]=\"startDayHour()\"\n          [appointments]=\"viewAppointments()\"\n          [dragStartDelay]=\"dragStartDelay()\"\n          [daysCount]=\"multiDayViewDaysCount()\"\n          [tooltipTemplate]=\"tooltipTemplate()\"\n          [resourceTemplate]=\"resourceTemplate()\"\n          [showResourceHeaders]=\"showResourceHeaders()\"\n          [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n          [scrollToCurrentTimeIndicator]=\"scrollToCurrentTimeIndicator()\"\n          [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n          [selectedAppointmentId]=\"selectedAppointmentId()\"\n          (onActionClickInternal)=\"onActionClick.emit($event)\"\n          (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n          (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n          (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n          (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n          (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n          (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n          (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n        >\n        </ax-scheduler-timeline-weekly-view>\n      }\n      @case ('timeline-month') {\n        <ax-scheduler-timeline-month-view\n          [date]=\"currentDate()\"\n          [readonly]=\"readonly()\"\n          [resources]=\"resources()\"\n          [draggable]=\"draggable()\"\n          [calendar]=\"calendarType()\"\n          [hasActions]=\"hasActions()\"\n          [appointments]=\"viewAppointments()\"\n          [dragStartDelay]=\"dragStartDelay()\"\n          [tooltipTemplate]=\"tooltipTemplate()\"\n          [resourceTemplate]=\"resourceTemplate()\"\n          [showResourceHeaders]=\"showResourceHeaders()\"\n          [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n          [scrollToCurrentTimeIndicator]=\"scrollToCurrentTimeIndicator()\"\n          [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n          [selectedAppointmentId]=\"selectedAppointmentId()\"\n          (onActionClickInternal)=\"onActionClick.emit($event)\"\n          (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n          (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n          (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n          (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n          (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n          (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n          (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n        >\n        </ax-scheduler-timeline-month-view>\n      }\n      @case ('timeline-year') {\n        <ax-scheduler-timeline-year-view\n          [date]=\"currentDate()\"\n          [readonly]=\"readonly()\"\n          [resources]=\"resources()\"\n          [draggable]=\"draggable()\"\n          [calendar]=\"calendarType()\"\n          [hasActions]=\"hasActions()\"\n          [appointments]=\"viewAppointments()\"\n          [dragStartDelay]=\"dragStartDelay()\"\n          [tooltipTemplate]=\"tooltipTemplate()\"\n          [resourceTemplate]=\"resourceTemplate()\"\n          [showResourceHeaders]=\"showResourceHeaders()\"\n          [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n          [scrollToCurrentTimeIndicator]=\"scrollToCurrentTimeIndicator()\"\n          [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n          [selectedAppointmentId]=\"selectedAppointmentId()\"\n          (onActionClickInternal)=\"onActionClick.emit($event)\"\n          (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n          (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n          (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n          (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n          (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n          (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n          (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n        >\n        </ax-scheduler-timeline-year-view>\n      }\n      @case ('agenda') {\n        <ax-scheduler-agenda-view\n          [date]=\"currentDate()\"\n          [readonly]=\"readonly()\"\n          [draggable]=\"draggable()\"\n          [calendar]=\"calendarType()\"\n          [hasActions]=\"hasActions()\"\n          [appointments]=\"viewAppointments()\"\n          [dragStartDelay]=\"dragStartDelay()\"\n          [daysCount]=\"multiDayViewDaysCount()\"\n          [tooltipTemplate]=\"tooltipTemplate()\"\n          [selectedAppointmentId]=\"selectedAppointmentId()\"\n          (onActionClickInternal)=\"onActionClick.emit($event)\"\n          (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n          (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n          (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n          (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n          (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n          (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n          (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n        >\n        </ax-scheduler-agenda-view>\n      }\n    }\n  </div>\n</div>\n<ng-template #calendarDayCellTemplate let-data>\n  @let slot = data.slot;\n  <div class=\"flex flex-col items-center justify-between gap-1\">\n    <span>{{ slot.text }}</span>\n    @if (hasAppointmentsOnDate($safeNavigationMigration(slot.date?.date))) {\n      <ax-badge color=\"primary\"></ax-badge>\n    }\n  </div>\n</ng-template>\n<ng-template #calendarMonthCellTemplate let-data>\n  @let slot = data.slot;\n  <div class=\"flex flex-col items-center justify-between gap-1\">\n    <span>{{ slot.text }}</span>\n    @if (hasAppointmentsInMonth($safeNavigationMigration(slot.date?.date))) {\n      <ax-badge color=\"primary\"></ax-badge>\n    }\n  </div>\n</ng-template>\n<ng-template #calendarYearCellTemplate let-data>\n  @let slot = data.slot;\n  <div class=\"flex flex-col items-center justify-between gap-1\">\n    <span>{{ slot.text }}</span>\n    @if (hasAppointmentsInYear($safeNavigationMigration(slot.date?.date))) {\n      <ax-badge color=\"primary\"></ax-badge>\n    }\n  </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { AXSchedulerComponent } from './scheduler.component';\nimport { AXSchedulerAgendaViewComponent } from './views/agenda/scheduler-agenda-view.component';\nimport { AXSchedulerDayViewComponent } from './views/day/scheduler-day-view.component';\nimport { AXSchedulerMonthViewComponent } from './views/month/scheduler-month-view.component';\nimport { AXSchedulerTimelineDayViewComponent } from './views/timeline-day/scheduler-timeline-day-view.component';\nimport { AXSchedulerTimelineMonthViewComponent } from './views/timeline-month/scheduler-timeline-month-view.component';\nimport { AXSchedulerTimelineWeeklyViewComponent } from './views/timeline-weekly/scheduler-timeline-weekly-view.component';\nimport { AXSchedulerTimelineYearViewComponent } from './views/timeline-year/scheduler-timeline-year-view.component';\nimport { AXSchedulerWeekViewComponent } from './views/week/scheduler-week-view.component';\n\nconst COMPONENT = [\n  AXSchedulerComponent,\n  AXSchedulerDayViewComponent,\n  AXSchedulerWeekViewComponent,\n  AXSchedulerMonthViewComponent,\n  AXSchedulerAgendaViewComponent,\n  AXSchedulerTimelineDayViewComponent,\n  AXSchedulerTimelineMonthViewComponent,\n  AXSchedulerTimelineWeeklyViewComponent,\n  AXSchedulerTimelineYearViewComponent,\n];\n\n@NgModule({\n  imports: [...COMPONENT],\n  exports: [...COMPONENT],\n  providers: [],\n})\nexport class AXSchedulerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}