{"version":3,"file":"timeGrid.mjs","names":[],"sources":["../../../../../../package/common/calendar/components/timeGrid/timeGrid.tsx"],"sourcesContent":["import {\n  useEffect,\n  useLayoutEffect,\n  useRef,\n  useState,\n  type CSSProperties,\n  type MouseEvent,\n  type ReactElement,\n  type RefObject,\n} from 'react';\nimport cx from 'classnames';\nimport { faChevronDown } from '@fortawesome/free-solid-svg-icons';\n\nimport ActionIcon from 'components/common/actionIcon';\nimport { isDismissClick } from 'components/common/utils/dismissClick';\nimport type { CalendarEvent } from '../../calendar.types';\nimport {\n  addDays,\n  allDaySlot,\n  atMinutes,\n  dayDiff,\n  dateToDay,\n  endAfter,\n  isSameDay,\n  MINUTES_PER_DAY,\n  minutesOfDay,\n  periodRange,\n  shownDays,\n  stepDate,\n  weekNumber,\n} from '../../dates';\nimport {\n  formatClockRange,\n  formatDayNumber,\n  formatHour,\n  formatLongDate,\n  formatTimeRange,\n  formatWeekday,\n} from '../../format';\nimport { clamp, pageStep, snap } from '../../gesture';\nimport {\n  BRIEF_EVENT_MINUTES,\n  eventEnd,\n  isAllDayLike,\n  limitLanes,\n  moveByDays,\n  packDay,\n  packLanes,\n  type LaneBar,\n  type LimitedLanes,\n  type TimedBox,\n} from '../../layout';\nimport { useGestures, type GesturePoint } from '../../useGestures';\nimport { useNow } from '../../useNow';\nimport { usePager } from '../../usePager';\nimport type { AllDayDrag, TimeDrag, TimeGridProps, TimeGridZoom } from './timeGrid.types';\n\nimport pagerStyles from '../../pager.module.pcss';\nimport styles from './timeGrid.module.pcss';\nimport { cssColor } from '../../../styles/tone';\n\nconst STEPS = [-1, 0, 1] as const;\nconst HOURS = Array.from({ length: 23 }, (_, i) => i + 1);\nconst ALL_DAY_LANES = 3;\n/** Below this an event is drawn on one line, its time after its title. */\nconst SHORT_EVENT_MINUTES = 45;\n/** Hour first scrolled to when today is not in view and no working hours are set. */\nconst DEFAULT_SCROLL_HOUR = 7;\n/** Deepest zoom, as a multiple of the theme's hour height. */\nconst MAX_ZOOM = 4;\n\ninterface ZoomElements {\n  scroller: HTMLElement;\n  head: HTMLElement;\n  body: HTMLElement;\n}\n\n/**\n * Sets the hour height, and scrolls so `anchorHour` stays under `clientY`: zooming pivots on the\n * fingers or the cursor instead of the top of the day.\n */\nfunction zoomTo(\n  { scroller, head, body }: ZoomElements,\n  zoomRef: RefObject<TimeGridZoom | null>,\n  hour: number,\n  anchorHour: number,\n  clientY: number,\n) {\n  const base = zoomRef.current?.base ?? body.getBoundingClientRect().height / 24;\n  if (!base) return;\n  // Zoomed out, the whole day fits exactly.\n  const min = Math.max((scroller.clientHeight - head.offsetHeight) / 24, 1);\n  const next = clamp(hour, Math.min(min, base), base * MAX_ZOOM);\n  zoomRef.current = { hour: next, base };\n  scroller.style.setProperty('--custom-calendar-hour-height', `${next}px`);\n  const top = scroller.getBoundingClientRect().top;\n  scroller.scrollTop = body.offsetTop + anchorHour * next - (clientY - top);\n}\n\nfunction TimeGrid<E extends CalendarEvent>({\n  events,\n  date,\n  period,\n  locale,\n  weekStartsOn,\n  slotMinutes,\n  hidden,\n  scrollToHour,\n  workingHours,\n  showWeekNumbers,\n  text,\n  onDateChange,\n  onOpenDay,\n  onEventClick,\n  onEventChange,\n  onSlotCreate,\n  renderEvent,\n  eventClassName,\n  classNames,\n  slotStyles,\n  zoomRef,\n}: TimeGridProps<E>): ReactElement {\n  const scrollerRef = useRef<HTMLDivElement>(null);\n  const headRef = useRef<HTMLDivElement>(null);\n  const bodyRef = useRef<HTMLDivElement>(null);\n  const currentRef = useRef<HTMLDivElement>(null);\n  const allDayRef = useRef<HTMLDivElement>(null);\n  const dragRef = useRef<TimeDrag<E> | null>(null);\n  const slotRef = useRef<HTMLDivElement>(null);\n  const snapshot = useRef(events);\n  const pinchRef = useRef<{ hour: number; anchorHour: number; distance: number } | null>(null);\n  const [drag, setDrag] = useState<TimeDrag<E> | null>(null);\n  const [allDayOpen, setAllDayOpen] = useState(false);\n  const now = useNow();\n\n  const range = periodRange(period, date, weekStartsOn, hidden);\n  const rangeStart = range.start;\n  /** Calendar days the period spans, hidden ones included. */\n  const periodDays = dayDiff(range.start, range.end);\n  const columns = shownDays(rangeStart, periodDays, hidden);\n  // While a drag runs, the grid renders the events as they were when it began: the touch that\n  // started it keeps targeting the element it landed on, and iOS stops delivering its moves if\n  // a re-render replaces that element.\n  const shown = drag ? snapshot.current : events;\n\n  const pager = usePager(\n    dateToDay(rangeStart),\n    (step) => onDateChange(stepDate(period, date, step, hidden)),\n    () => scrollerRef.current,\n  );\n\n  function zoomElements(): ZoomElements | null {\n    const scroller = scrollerRef.current;\n    const head = headRef.current;\n    const body = bodyRef.current;\n    return scroller && head && body ? { scroller, head, body } : null;\n  }\n\n  // Once, on mount: paging keeps the scroll position, so the same hours stay under the eye.\n  useLayoutEffect(() => {\n    const scroller = scrollerRef.current;\n    const body = bodyRef.current;\n    if (!scroller || !body) return;\n    const hour = body.offsetHeight / 24;\n    if (!hour) return;\n    const todayShown = columns.some((day) => isSameDay(day, now));\n    const target =\n      scrollToHour ??\n      (todayShown ? Math.max(0, minutesOfDay(now) / 60 - 1) : (workingHours?.[0] ?? DEFAULT_SCROLL_HOUR));\n    scroller.scrollTop = clamp(target, 0, 24) * hour;\n    // oxlint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  useEffect(() => {\n    const scroller = scrollerRef.current;\n    if (!scroller) return;\n    // Trackpad pinches arrive as a wheel with Ctrl held (Chromium, Firefox); Safari sends\n    // `gesturechange` instead, and there the trackpad zooms the page as usual.\n    function onWheel(event: WheelEvent) {\n      if (!event.ctrlKey) return;\n      const elements = zoomElements();\n      if (!elements) return;\n      event.preventDefault();\n      const rect = elements.body.getBoundingClientRect();\n      const hour = rect.height / 24;\n      if (!hour) return;\n      zoomTo(\n        elements,\n        zoomRef,\n        hour * Math.exp(-event.deltaY * 0.01),\n        (event.clientY - rect.top) / hour,\n        event.clientY,\n      );\n    }\n    scroller.addEventListener('wheel', onWheel, { passive: false });\n    return () => scroller.removeEventListener('wheel', onWheel);\n    // zoomElements only reads refs.\n    // oxlint-disable-next-line react-hooks/exhaustive-deps\n  }, [zoomRef]);\n\n  /** Days from the period's first day, hidden ones included, to the column under `x` in `rect`. */\n  function dayAt(x: number, rect: DOMRect): number {\n    const column = clamp(Math.floor(((x - rect.left) / rect.width) * columns.length), 0, columns.length - 1);\n    return dayDiff(rangeStart, columns[column]);\n  }\n\n  /** `day` counts from the period's first day, hidden ones included, so it adds up to a date. */\n  function pointAt(point: GesturePoint): { day: number; minutes: number } | null {\n    const pane = currentRef.current;\n    if (!pane) return null;\n    const rect = pane.getBoundingClientRect();\n    if (!rect.width || !rect.height) return null;\n    return {\n      day: dayAt(point.x, rect),\n      minutes: clamp(((point.y - rect.top) / rect.height) * MINUTES_PER_DAY, 0, MINUTES_PER_DAY),\n    };\n  }\n\n  function allDayAt(point: GesturePoint): number | null {\n    const rect = allDayRef.current?.getBoundingClientRect();\n    return rect?.width ? dayAt(point.x, rect) : null;\n  }\n\n  /** Whole days: the event moved by as many as the pointer has, or the days a new slot covers. */\n  function allDayPreview({ event, grabbed }: AllDayDrag<E>, over: number): { start: Date; end: Date } {\n    if (event) return moveByDays(event, over - grabbed);\n    const { start, end } = allDaySlot(addDays(rangeStart, grabbed), addDays(rangeStart, over));\n    return { start, end };\n  }\n\n  /** Wall-clock minutes from the first shown midnight: negative before it. */\n  function minutesFromStart(value: Date): number {\n    return dayDiff(rangeStart, value) * MINUTES_PER_DAY + minutesOfDay(value);\n  }\n\n  function preview(current: TimeDrag<E>, point: GesturePoint): { start: Date; end: Date } | null {\n    if (current.kind === 'allDay') {\n      const over = allDayAt(point);\n      return over === null ? null : allDayPreview(current, over);\n    }\n    const at = pointAt(point);\n    if (!at) return null;\n    const limit = periodDays * MINUTES_PER_DAY;\n\n    if (current.kind === 'create') {\n      const anchor = Math.floor(current.anchor / slotMinutes) * slotMinutes;\n      const [from, to] =\n        at.minutes >= anchor\n          ? [anchor, Math.max(Math.ceil(at.minutes / slotMinutes) * slotMinutes, anchor + slotMinutes)]\n          : [Math.floor(at.minutes / slotMinutes) * slotMinutes, anchor + slotMinutes];\n      const day = addDays(rangeStart, current.day);\n      const start = atMinutes(day, from);\n      return { start, end: endAfter(start, atMinutes(day, Math.min(to, MINUTES_PER_DAY)), to - from) };\n    }\n\n    const pointer = at.day * MINUTES_PER_DAY + at.minutes;\n    const eventStart = minutesFromStart(current.event.start);\n    if (current.kind === 'move') {\n      const from = clamp(snap(pointer - current.grab, slotMinutes), Math.min(eventStart, 0), limit - slotMinutes);\n      const start = atMinutes(rangeStart, from);\n      // The real length, not the wall-clock one, so a move across a clock change keeps it.\n      const length = eventEnd(current.event).getTime() - current.event.start.getTime();\n      return { start, end: new Date(start.getTime() + length) };\n    }\n    const to = clamp(snap(pointer, slotMinutes), eventStart + slotMinutes, Math.max(limit, eventStart + slotMinutes));\n    const start = current.event.start;\n    return { start, end: endAfter(start, atMinutes(rangeStart, to), to - eventStart) };\n  }\n\n  function setDragState(next: TimeDrag<E> | null) {\n    dragRef.current = next;\n    setDrag(next);\n  }\n\n  function findEvent(element: HTMLElement): E | undefined {\n    return events.find((candidate) => String(candidate.id) === element.dataset.calEvent);\n  }\n\n  useGestures<TimeDrag<E>>(scrollerRef, {\n    onPress: pager.finish,\n    canSwipe: () => true,\n    onSwipeMove: pager.move,\n    onSwipeEnd: (dx, velocity) => pager.settle(pageStep(dx, pager.width(), velocity)),\n    dragFrom: (target, point) => {\n      if (allDayRef.current?.contains(target)) return allDayDragFrom(target, point);\n      if (!currentRef.current?.contains(target)) return null;\n      const at = pointAt(point);\n      if (!at) return null;\n      const element = target.closest<HTMLElement>('[data-cal-event]');\n      if (element) {\n        const event = onEventChange ? findEvent(element) : undefined;\n        if (!event || event.readOnly) return null;\n        const current = { start: event.start, end: eventEnd(event) };\n        if (target.closest('[data-cal-resize]')) return { kind: 'resize', event, ...current };\n        const grab = at.day * MINUTES_PER_DAY + at.minutes - minutesFromStart(event.start);\n        return { kind: 'move', event, grab, ...current };\n      }\n      if (!onSlotCreate) return null;\n      const day = addDays(rangeStart, at.day);\n      return { kind: 'create', day: at.day, anchor: at.minutes, start: day, end: day };\n    },\n    onDragStart: (started, point) => {\n      snapshot.current = events;\n      setDragState({ ...started, ...preview(started, point) });\n    },\n    onDragMove: (point) => {\n      const current = dragRef.current;\n      const next = current && preview(current, point);\n      if (!current || !next) return;\n      if (next.start.getTime() === current.start.getTime() && next.end.getTime() === current.end.getTime()) return;\n      setDragState({ ...current, ...next });\n    },\n    onDragEnd: (point) => {\n      const current = dragRef.current;\n      setDragState(null);\n      if (!current) return;\n      const { start, end } = preview(current, point) ?? current;\n      if (current.kind === 'create') {\n        onSlotCreate?.({ start, end, allDay: false }, markSlot(current.day, start, end));\n        return;\n      }\n      const { event } = current;\n      if (!event) {\n        onSlotCreate?.({ start, end, allDay: true }, dayHeader(start));\n        return;\n      }\n      const unchanged = start.getTime() === event.start.getTime() && end.getTime() === eventEnd(event).getTime();\n      if (!unchanged) onEventChange?.({ event, start, end });\n    },\n    onDragCancel: () => setDragState(null),\n    onPinchStart: (center, distance) => {\n      const body = bodyRef.current;\n      if (!body) return;\n      const rect = body.getBoundingClientRect();\n      const hour = rect.height / 24;\n      if (!hour) return;\n      pinchRef.current = { hour, anchorHour: (center.y - rect.top) / hour, distance };\n    },\n    onPinchMove: (center, distance) => {\n      const pinch = pinchRef.current;\n      const elements = zoomElements();\n      if (!pinch || !elements || !pinch.distance) return;\n      zoomTo(elements, zoomRef, (pinch.hour * distance) / pinch.distance, pinch.anchorHour, center.y);\n    },\n    onPinchEnd: () => {\n      pinchRef.current = null;\n    },\n    autoScroll: () => {\n      const scroller = scrollerRef.current;\n      const head = headRef.current;\n      // A drag in the all-day row is above the hours, where the zone would scroll them up.\n      if (!scroller || !head || dragRef.current?.kind === 'allDay') return null;\n      const rect = scroller.getBoundingClientRect();\n      // The sticky head covers the top of the scroller, so the zone starts below it.\n      return { element: scroller, top: rect.top + head.offsetHeight, bottom: rect.bottom };\n    },\n  });\n\n  function allDayDragFrom(target: Element, point: GesturePoint): AllDayDrag<E> | null {\n    const grabbed = allDayAt(point);\n    if (grabbed === null || target.closest('[data-cal-more]')) return null;\n    const element = target.closest<HTMLElement>('[data-cal-event]');\n    if (element) {\n      const event = onEventChange ? findEvent(element) : undefined;\n      if (!event || event.readOnly) return null;\n      return { kind: 'allDay', event, grabbed, start: event.start, end: eventEnd(event) };\n    }\n    if (!onSlotCreate) return null;\n    const { start, end } = allDaySlot(addDays(rangeStart, grabbed));\n    return { kind: 'allDay', event: null, grabbed, start, end };\n  }\n\n  /** The header of `day`'s column: what a new all-day slot is anchored to. */\n  function dayHeader(day: Date): HTMLElement {\n    const header = headRef.current?.querySelector<HTMLElement>(`[data-cal-head-day=\"${dateToDay(day)}\"]`);\n    return header ?? scrollerRef.current!;\n  }\n\n  function handleAllDayClick(clickEvent: MouseEvent<HTMLDivElement>) {\n    if (!onSlotCreate || isDismissClick(clickEvent.nativeEvent)) return;\n    if ((clickEvent.target as Element).closest('[data-cal-event], [data-cal-more]')) return;\n    const rect = clickEvent.currentTarget.getBoundingClientRect();\n    if (!rect.width) return;\n    const day = addDays(rangeStart, dayAt(clickEvent.clientX, rect));\n    onSlotCreate(allDaySlot(day), dayHeader(day));\n  }\n\n  function handleColumnClick(clickEvent: MouseEvent<HTMLDivElement>, day: Date) {\n    if (!onSlotCreate || isDismissClick(clickEvent.nativeEvent)) return;\n    if ((clickEvent.target as Element).closest('[data-cal-event]')) return;\n    const rect = clickEvent.currentTarget.getBoundingClientRect();\n    if (!rect.height) return;\n    const minutes = ((clickEvent.clientY - rect.top) / rect.height) * MINUTES_PER_DAY;\n    const from = clamp(Math.floor(minutes / slotMinutes) * slotMinutes, 0, MINUTES_PER_DAY - slotMinutes);\n    const start = atMinutes(day, from);\n    // Real time, not the clock: across a clock change an hour on the clock is none or two.\n    const end = new Date(start.getTime() + Math.max(60, slotMinutes) * 60_000);\n    const midnight = atMinutes(day, MINUTES_PER_DAY);\n    const slot = { start, end: end < midnight ? end : midnight, allDay: false };\n    onSlotCreate(slot, markSlot(dayDiff(rangeStart, day), slot.start, slot.end));\n  }\n\n  /**\n   * Moves the invisible box over a new slot and returns it: the anchor `onSlotCreate` hands out,\n   * so the app can open its editor right next to the slot, as `onEventClick` lets it for an event.\n   */\n  function markSlot(dayIndex: number, start: Date, end: Date): HTMLElement {\n    const marker = slotRef.current;\n    if (!marker) return scrollerRef.current!;\n    const next = addDays(rangeStart, dayIndex + 1);\n    const top = minutesOfDay(start);\n    const bottom = end >= next ? MINUTES_PER_DAY : minutesOfDay(end);\n    const column = Math.max(\n      columns.findIndex((day) => dayDiff(rangeStart, day) === dayIndex),\n      0,\n    );\n    marker.style.left = `${(column / columns.length) * 100}%`;\n    marker.style.width = `${100 / columns.length}%`;\n    marker.style.top = `${(top / MINUTES_PER_DAY) * 100}%`;\n    // Never upside down: on the day the clocks go back, a slot can end on an earlier clock time.\n    marker.style.height = `${(Math.max(bottom - top, 0) / MINUTES_PER_DAY) * 100}%`;\n    return marker;\n  }\n\n  function renderAllDayBar(bar: LaneBar<E>) {\n    const { event } = bar;\n    return (\n      <button\n        key={event.id}\n        type='button'\n        data-cal-event={String(event.id)}\n        className={cx(\n          styles.timeGridBar,\n          bar.continuesBefore && styles.timeGridBarContinuesBefore,\n          bar.continuesAfter && styles.timeGridBarContinuesAfter,\n          drag?.kind === 'allDay' && drag.event === event && styles.timeGridBarDragged,\n          classNames?.event,\n          eventClassName?.(event),\n        )}\n        style={\n          {\n            '--event-color': event.color && cssColor(event.color),\n            gridColumn: `${bar.start + 1} / span ${bar.span}`,\n            gridRow: bar.lane + 1,\n            ...slotStyles?.event,\n          } as CSSProperties\n        }\n        aria-label={`${event.title}, ${text.allDay}`}\n        onClick={(clickEvent) => onEventClick?.(event, clickEvent.currentTarget)}\n      >\n        <span className={styles.timeGridBarTitle} aria-hidden>\n          {renderEvent ? renderEvent(event, { singleLine: true }) : event.title}\n        </span>\n      </button>\n    );\n  }\n\n  function renderBox(box: TimedBox<E>) {\n    const { event } = box;\n    const minutes = box.bottom - box.top;\n    const short = minutes < SHORT_EVENT_MINUTES;\n    const when = formatTimeRange(event.start, eventEnd(event), locale);\n    const resizable = Boolean(onEventChange) && !event.readOnly && !box.continuesAfter;\n    const dragged = drag && drag.kind !== 'create' && drag.event === event;\n    return (\n      <button\n        key={event.id}\n        type='button'\n        data-cal-event={String(event.id)}\n        aria-label={`${event.title}, ${when}`}\n        className={cx(\n          styles.timeGridEvent,\n          short && styles.timeGridEventShort,\n          minutes < BRIEF_EVENT_MINUTES && styles.timeGridEventBrief,\n          box.continuesBefore && styles.timeGridEventContinuesBefore,\n          box.continuesAfter && styles.timeGridEventContinuesAfter,\n          (onEventClick || resizable) && styles.timeGridEventInteractive,\n          dragged && styles.timeGridEventDragged,\n          classNames?.event,\n          eventClassName?.(event),\n        )}\n        style={\n          {\n            '--event-color': event.color && cssColor(event.color),\n            top: `${(box.top / MINUTES_PER_DAY) * 100}%`,\n            '--span': `${(minutes / MINUTES_PER_DAY) * 100}%`,\n            left: `calc(var(--column-width) * ${box.column / box.columns})`,\n            width: `calc(var(--column-width) * ${box.span / box.columns})`,\n            ...slotStyles?.event,\n          } as CSSProperties\n        }\n        onClick={(clickEvent) => onEventClick?.(event, clickEvent.currentTarget)}\n      >\n        <span className={styles.timeGridEventTitle} aria-hidden>\n          {renderEvent ? renderEvent(event, { singleLine: short }) : event.title}\n        </span>\n        <span className={styles.timeGridEventTime} aria-hidden>\n          {formatClockRange(event.start, eventEnd(event), locale)}\n        </span>\n        {resizable && <span data-cal-resize className={styles.timeGridResize} aria-hidden />}\n      </button>\n    );\n  }\n\n  function renderPreview(day: Date) {\n    if (!drag || drag.kind === 'allDay') return null;\n    const dayStart = day;\n    const next = addDays(day, 1);\n    if (drag.end <= dayStart && drag.start < dayStart) return null;\n    if (drag.start >= next) return null;\n    const top = drag.start < dayStart ? 0 : minutesOfDay(drag.start);\n    const bottom = drag.end >= next ? MINUTES_PER_DAY : minutesOfDay(drag.end);\n    const color = drag.kind === 'create' ? undefined : drag.event.color;\n    const title = drag.kind === 'create' ? null : drag.event.title;\n    return (\n      <div\n        className={styles.timeGridPreview}\n        style={\n          {\n            '--event-color': color && cssColor(color),\n            top: `${(top / MINUTES_PER_DAY) * 100}%`,\n            height: `${(Math.max(bottom - top, 15) / MINUTES_PER_DAY) * 100}%`,\n          } as CSSProperties\n        }\n        aria-hidden\n      >\n        {title && <span className={styles.timeGridEventTitle}>{title}</span>}\n        <span className={styles.timeGridPreviewTime}>{formatClockRange(drag.start, drag.end, locale)}</span>\n      </div>\n    );\n  }\n\n  /** Where an all-day drag would put its days, drawn over the bars. */\n  function renderAllDayPreview(dates: readonly Date[]) {\n    if (drag?.kind !== 'allDay') return null;\n    const target = { id: '', title: '', allDay: true, ...drag.event, start: drag.start, end: drag.end };\n    const [bar] = packLanes([target], dates);\n    if (!bar) return null;\n    return (\n      <div\n        className={cx(styles.timeGridBar, styles.timeGridBarPreview)}\n        style={\n          {\n            '--event-color': drag.event?.color && cssColor(drag.event.color),\n            gridColumn: `${bar.start + 1} / span ${bar.span}`,\n            gridRow: 1,\n          } as CSSProperties\n        }\n        aria-hidden\n      >\n        <span className={styles.timeGridBarTitle}>{drag.event?.title}</span>\n      </div>\n    );\n  }\n\n  const panes = STEPS.map((step) => {\n    const paneRange = periodRange(period, stepDate(period, date, step, hidden), weekStartsOn, hidden);\n    const start = paneRange.start;\n    const dates = shownDays(start, dayDiff(start, paneRange.end), hidden);\n    const allDay = packLanes(shown, dates, isAllDayLike);\n    const lanes: LimitedLanes<E> = allDayOpen\n      ? { visible: allDay, moreLane: 0, hidden: dates.map(() => 0) }\n      : limitLanes(allDay, dates.length, ALL_DAY_LANES);\n    return { step, start, dates, lanes };\n  });\n  const hasHidden = panes[1].lanes.hidden.some((count) => count > 0);\n  const work = workingHours?.map((hour) => (clamp(hour, 0, 24) / 24) * 100);\n  // Working from the evening into the morning, such as `[22, 6]`: shaded between its end and start.\n  const overnight = work !== undefined && work[0] > work[1];\n  const paneClass = (step: number) =>\n    cx(pagerStyles.pagerPane, step === -1 && pagerStyles.pagerPanePrev, step === 1 && pagerStyles.pagerPaneNext);\n\n  return (\n    <div\n      ref={scrollerRef}\n      tabIndex={-1}\n      className={styles.timeGrid}\n      style={\n        {\n          '--days': columns.length,\n          '--custom-calendar-hour-height': zoomRef.current ? `${zoomRef.current.hour}px` : undefined,\n          '--work-start': work && `${Math.min(...work)}%`,\n          '--work-end': work && `${Math.max(...work)}%`,\n        } as CSSProperties\n      }\n    >\n      <div ref={headRef} className={styles.timeGridHead}>\n        <div className={styles.timeGridCorner}>\n          {showWeekNumbers && (\n            // Numbered by the ISO week holding most of the shown days, which the middle one is in.\n            <span className={styles.timeGridWeekNumber}>\n              {text.weekNumber(weekNumber(columns[Math.floor(columns.length / 2)]))}\n            </span>\n          )}\n          {(hasHidden || allDayOpen) && (\n            <ActionIcon\n              className={cx(styles.timeGridToggle, allDayOpen && styles.timeGridToggleOpen)}\n              icon={faChevronDown}\n              title={text.allDay}\n              aria-label={text.allDay}\n              aria-expanded={allDayOpen}\n              onClick={() => setAllDayOpen((open) => !open)}\n            />\n          )}\n        </div>\n        <div className={pagerStyles.pagerViewport}>\n          <div ref={pager.trackRef} className={pagerStyles.pagerTrack}>\n            {panes.map(({ step, start, dates, lanes }) => (\n              <div\n                key={dateToDay(start)}\n                className={cx(paneClass(step), styles.timeGridHeadPane)}\n                inert={step !== 0}\n                aria-hidden={step !== 0 || undefined}\n              >\n                {dates.map((day) => {\n                  const isToday = isSameDay(day, now);\n                  const content = (\n                    <>\n                      <span className={styles.timeGridWeekday}>{formatWeekday(day, locale, 'short')}</span>\n                      <span className={cx(styles.timeGridDayNumber, isToday && styles.timeGridDayNumberToday)}>\n                        {formatDayNumber(day, locale)}\n                      </span>\n                    </>\n                  );\n                  const shared = {\n                    className: cx(styles.timeGridDayHeader, classNames?.dayHeader),\n                    style: slotStyles?.dayHeader,\n                    'aria-current': isToday ? ('date' as const) : undefined,\n                    'data-cal-head-day': dateToDay(day),\n                  };\n                  return columns.length > 1 && onOpenDay ? (\n                    <button\n                      key={dateToDay(day)}\n                      type='button'\n                      {...shared}\n                      className={cx(shared.className, styles.timeGridDayHeaderLink)}\n                      aria-label={formatLongDate(day, locale)}\n                      onClick={() => onOpenDay(day)}\n                    >\n                      {content}\n                    </button>\n                  ) : (\n                    <div key={dateToDay(day)} {...shared}>\n                      {content}\n                    </div>\n                  );\n                })}\n                <div\n                  ref={step === 0 ? allDayRef : undefined}\n                  className={cx(styles.timeGridAllDay, onSlotCreate && styles.timeGridAllDayCreatable)}\n                  aria-label={text.allDay}\n                  role='group'\n                  onClick={handleAllDayClick}\n                >\n                  {lanes.visible.map(renderAllDayBar)}\n                  {lanes.hidden.map(\n                    (count, column) =>\n                      count > 0 && (\n                        <div\n                          key={`more-${column}`}\n                          aria-hidden\n                          data-cal-more\n                          className={styles.timeGridMore}\n                          style={{ gridColumn: column + 1, gridRow: lanes.moreLane + 1 }}\n                          onClick={() => setAllDayOpen(true)}\n                        >\n                          {text.more(count)}\n                        </div>\n                      ),\n                  )}\n                  {step === 0 && renderAllDayPreview(dates)}\n                </div>\n              </div>\n            ))}\n          </div>\n        </div>\n      </div>\n\n      <div ref={bodyRef} className={styles.timeGridBody}>\n        <div className={styles.timeGridGutter} aria-hidden>\n          {HOURS.map((hour) => (\n            <span key={hour} className={styles.timeGridHour} style={{ top: `${(hour / 24) * 100}%` }}>\n              {formatHour(hour, locale)}\n            </span>\n          ))}\n        </div>\n        <div className={pagerStyles.pagerViewport}>\n          <div ref={pager.trackRef} className={pagerStyles.pagerTrack}>\n            {panes.map(({ step, start, dates }) => (\n              <div\n                key={dateToDay(start)}\n                ref={step === 0 ? currentRef : undefined}\n                className={cx(paneClass(step), styles.timeGridBodyPane)}\n                inert={step !== 0}\n                aria-hidden={step !== 0 || undefined}\n              >\n                {dates.map((day) => {\n                  const isToday = isSameDay(day, now);\n                  return (\n                    <div\n                      key={dateToDay(day)}\n                      role='group'\n                      aria-label={formatLongDate(day, locale)}\n                      data-cal-column={dateToDay(day)}\n                      className={cx(\n                        styles.timeGridColumn,\n                        isToday && styles.timeGridColumnToday,\n                        work && styles.timeGridColumnWorking,\n                        overnight && styles.timeGridColumnWorkingOvernight,\n                        onSlotCreate && styles.timeGridColumnCreatable,\n                        classNames?.cell,\n                      )}\n                      style={slotStyles?.cell}\n                      onClick={(clickEvent) => handleColumnClick(clickEvent, day)}\n                    >\n                      {packDay(shown, day).map(renderBox)}\n                      {isToday && (\n                        <div\n                          className={styles.timeGridNow}\n                          style={{ top: `${(minutesOfDay(now) / MINUTES_PER_DAY) * 100}%` }}\n                          aria-hidden\n                        />\n                      )}\n                      {step === 0 && renderPreview(day)}\n                    </div>\n                  );\n                })}\n                {step === 0 && <div ref={slotRef} className={styles.timeGridSlot} aria-hidden />}\n              </div>\n            ))}\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default TimeGrid;\n"],"mappings":"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"}