{"version":3,"file":"monthView.mjs","names":[],"sources":["../../../../../../package/common/calendar/components/monthView/monthView.tsx"],"sourcesContent":["import {\n  useLayoutEffect,\n  useRef,\n  useState,\n  type CSSProperties,\n  type KeyboardEvent,\n  type MouseEvent,\n  type ReactElement,\n} from 'react';\nimport cx from 'classnames';\n\nimport Button from 'components/common/button';\nimport Popover from 'components/common/popover';\nimport { PopoverAlign, PopoverPlacement } from 'components/common/popover/popover.types';\nimport { isSelfActivation } from 'components/common/utils/activationKey';\nimport { isDismissClick } from 'components/common/utils/dismissClick';\nimport { CalendarView, type CalendarEvent } from '../../calendar.types';\nimport {\n  addDays,\n  addMonths,\n  allDaySlot,\n  dayDiff,\n  dateToDay,\n  gridKeyTarget,\n  isSameDay,\n  periodRange,\n  shownDays,\n  startOfMonth,\n  startOfWeek,\n  weekNumber,\n} from '../../dates';\nimport { formatDayNumber, formatLongDate, formatMonthTitle, formatTime, formatWeekday } from '../../format';\nimport { clamp, pageStep } from '../../gesture';\nimport { eventDays, eventsByDay, isAllDayLike, limitLanes, moveByDays, packLanes, type LaneBar } from '../../layout';\nimport { useGestures, type GesturePoint } from '../../useGestures';\nimport { usePager } from '../../usePager';\nimport AgendaList from '../agendaList';\nimport type { MonthDrag, MonthViewProps } from './monthView.types';\n\nimport pagerStyles from '../../pager.module.pcss';\nimport styles from './monthView.module.pcss';\nimport { cssColor } from '../../../styles/tone';\n\nconst STEPS = [-1, 0, 1] as const;\n\nfunction MonthView<E extends CalendarEvent>({\n  events,\n  date,\n  today,\n  locale,\n  weekStartsOn,\n  hidden,\n  showWeekNumbers,\n  text,\n  onDateChange,\n  onOpenDay,\n  onEventClick,\n  onEventChange,\n  onSlotCreate,\n  renderEvent,\n  eventClassName,\n  classNames,\n  slotStyles,\n}: MonthViewProps<E>): ReactElement {\n  const rootRef = useRef<HTMLDivElement>(null);\n  const viewportRef = useRef<HTMLDivElement>(null);\n  const currentRef = useRef<HTMLDivElement>(null);\n  const pendingFocus = useRef<string | null>(null);\n  const dragRef = useRef<MonthDrag<E> | null>(null);\n  const [capacity, setCapacity] = useState(Infinity);\n  const [list, setList] = useState<{ day: Date; anchor: HTMLElement; fromKeyboard: boolean } | null>(null);\n  const [drag, setDrag] = useState<MonthDrag<E> | null>(null);\n\n  const month = startOfMonth(date);\n  const weekdays = shownDays(startOfWeek(today, weekStartsOn), 7, hidden);\n  const gridStart = periodRange(CalendarView.Month, month, weekStartsOn).start;\n  const rowDates = (paneStart: Date, row: number) => shownDays(addDays(paneStart, row * 7), 7, hidden);\n\n  const pager = usePager(\n    dateToDay(month),\n    (step) => onDateChange(addMonths(date, step)),\n    () => currentRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]') ?? null,\n  );\n\n  // Lanes that fit a cell, from the real geometry, so `+N` appears exactly when bars would clip.\n  // Without layout (jsdom) there is nothing to measure, and every event is shown.\n  useLayoutEffect(() => {\n    const viewport = viewportRef.current;\n    if (!viewport) return;\n    function measure() {\n      const bars = viewport!.querySelector<HTMLElement>('[data-cal-bars]');\n      if (!bars || bars.clientHeight === 0) {\n        setCapacity(Infinity);\n        return;\n      }\n      const style = getComputedStyle(bars);\n      const lane = parseFloat(style.gridAutoRows);\n      const gap = parseFloat(style.rowGap) || 0;\n      const top = parseFloat(style.paddingTop) || 0;\n      setCapacity(lane > 0 ? Math.max(1, Math.floor((bars.clientHeight - top + gap) / (lane + gap))) : Infinity);\n    }\n    measure();\n    const observer = new ResizeObserver(measure);\n    observer.observe(viewport);\n    return () => observer.disconnect();\n  }, []);\n\n  // Arrowing onto a day of the next month pages first, so the cell to focus only exists after\n  // the render that follows.\n  useLayoutEffect(() => {\n    const key = pendingFocus.current;\n    if (key === null) return;\n    pendingFocus.current = null;\n    currentRef.current?.querySelector<HTMLElement>(`[data-cal-day=\"${key}\"]`)?.focus();\n  });\n\n  function dayAt(point: GesturePoint): Date | null {\n    const pane = currentRef.current;\n    if (!pane) return null;\n    const rect = pane.getBoundingClientRect();\n    if (rect.width === 0 || rect.height === 0) return null;\n    const count = weekdays.length;\n    const column = clamp(Math.floor(((point.x - rect.left) / rect.width) * count), 0, count - 1);\n    const row = clamp(Math.floor(((point.y - rect.top) / rect.height) * 6), 0, 5);\n    return rowDates(gridStart, row)[column];\n  }\n\n  function cellFor(day: Date): HTMLElement | null {\n    return currentRef.current?.querySelector<HTMLElement>(`[data-cal-day=\"${dateToDay(day)}\"]`) ?? null;\n  }\n\n  // Mirrored in a ref, as in the time grid: a release can arrive before the render of the move\n  // before it, and has to drop where that move was.\n  function setDragState(next: MonthDrag<E> | null) {\n    dragRef.current = next;\n    setDrag(next);\n  }\n\n  useGestures<MonthDrag<E>>(rootRef, {\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 (!currentRef.current?.contains(target)) return null;\n      const grabbed = dayAt(point);\n      if (grabbed === null) return null;\n      const element = target.closest<HTMLElement>('[data-cal-event]');\n      if (element) {\n        const event = onEventChange && events.find((candidate) => String(candidate.id) === element.dataset.calEvent);\n        return event && !event.readOnly ? { event, grabbed, offset: 0 } : null;\n      }\n      // A day number that opens its day is a link, and a press on it is a click however it moves.\n      if (!onSlotCreate || target.closest('[data-cal-more]')) return null;\n      if (onOpenDay && target.closest('[data-cal-day-number]')) return null;\n      return { event: null, grabbed, offset: 0 };\n    },\n    onDragStart: setDragState,\n    onDragMove: (point) => {\n      const current = dragRef.current;\n      const day = dayAt(point);\n      if (!current || day === null) return;\n      const offset = dayDiff(current.grabbed, day);\n      if (offset !== current.offset) setDragState({ ...current, offset });\n    },\n    onDragEnd: (point) => {\n      const current = dragRef.current;\n      setDragState(null);\n      const day = dayAt(point);\n      if (!current || day === null) return;\n      const { event, grabbed } = current;\n      if (!event) {\n        const slot = allDaySlot(grabbed, day);\n        onSlotCreate?.(slot, cellFor(slot.start) ?? rootRef.current!);\n        return;\n      }\n      const offset = dayDiff(grabbed, day);\n      if (offset !== 0) onEventChange?.({ event, ...moveByDays(event, offset) });\n    },\n    onDragCancel: () => setDragState(null),\n  });\n\n  function openList(day: Date, fromKeyboard: boolean) {\n    const anchor = cellFor(day);\n    if (anchor) setList({ day, anchor, fromKeyboard });\n  }\n\n  function handleCellClick(clickEvent: MouseEvent<HTMLDivElement>, day: Date) {\n    if (onOpenDay && (clickEvent.target as Element).closest('[data-cal-day-number]')) {\n      onOpenDay(day);\n      return;\n    }\n    if (isDismissClick(clickEvent.nativeEvent)) return;\n    onSlotCreate?.(allDaySlot(day), clickEvent.currentTarget);\n  }\n\n  function handleKeyDown(keyEvent: KeyboardEvent<HTMLDivElement>, day: Date) {\n    const next = gridKeyTarget(keyEvent.key, day, weekStartsOn, hidden);\n    if (!next) {\n      if (isSelfActivation(keyEvent)) {\n        keyEvent.preventDefault();\n        openList(day, true);\n      }\n      return;\n    }\n    keyEvent.preventDefault();\n    pendingFocus.current = dateToDay(next);\n    onDateChange(next);\n  }\n\n  function renderBar(bar: LaneBar<E>) {\n    const { event } = bar;\n    const filled = isAllDayLike(event) || bar.span > 1 || bar.continuesBefore || bar.continuesAfter;\n    const interactive = Boolean(onEventClick) || (Boolean(onEventChange) && !event.readOnly);\n    return (\n      <div\n        key={event.id}\n        data-cal-event={String(event.id)}\n        className={cx(\n          styles.monthViewBar,\n          filled ? styles.monthViewBarFilled : styles.monthViewBarTimed,\n          bar.continuesBefore && styles.monthViewBarContinuesBefore,\n          bar.continuesAfter && styles.monthViewBarContinuesAfter,\n          interactive && styles.monthViewBarInteractive,\n          drag?.event === event && styles.monthViewBarDragging,\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        onClick={(clickEvent) => onEventClick?.(event, clickEvent.currentTarget)}\n      >\n        {!filled && <span className={styles.monthViewDot} />}\n        {!filled && <span className={styles.monthViewTime}>{formatTime(event.start, locale)}</span>}\n        <span className={styles.monthViewBarTitle}>\n          {renderEvent ? renderEvent(event, { singleLine: true }) : event.title}\n        </span>\n      </div>\n    );\n  }\n\n  function renderPane(step: (typeof STEPS)[number]) {\n    const paneMonth = addMonths(month, step);\n    const isCurrent = step === 0;\n    const paneStart = periodRange(CalendarView.Month, paneMonth, weekStartsOn).start;\n\n    let target: { from: Date; to: Date } | null = null;\n    if (isCurrent && drag?.event && drag.offset !== 0) {\n      const { first, last } = eventDays(drag.event);\n      target = { from: addDays(first, drag.offset), to: addDays(last, drag.offset) };\n    } else if (isCurrent && drag && !drag.event) {\n      const over = addDays(drag.grabbed, drag.offset);\n      target = drag.offset < 0 ? { from: over, to: drag.grabbed } : { from: drag.grabbed, to: over };\n    }\n\n    return (\n      <div\n        key={dateToDay(paneMonth)}\n        ref={isCurrent ? currentRef : undefined}\n        className={cx(\n          pagerStyles.pagerPane,\n          step === -1 && pagerStyles.pagerPanePrev,\n          step === 1 && pagerStyles.pagerPaneNext,\n          styles.monthViewPane,\n        )}\n        inert={!isCurrent}\n        aria-hidden={!isCurrent || undefined}\n      >\n        {Array.from({ length: 6 }, (_, row) => {\n          const dates = rowDates(paneStart, row);\n          const perDay = eventsByDay(events, dates);\n          const lanes = limitLanes(packLanes(events, dates), dates.length, capacity);\n          // Numbered by the ISO week holding most of its days, which the middle one is in.\n          const week = showWeekNumbers ? text.weekNumber(weekNumber(dates[Math.floor(dates.length / 2)])) : undefined;\n          return (\n            <div key={dateToDay(dates[0])} role='row' aria-label={week} className={styles.monthViewWeek}>\n              {dates.map((day, column) => {\n                const count = perDay[column].length;\n                const isToday = isSameDay(day, today);\n                const name = formatLongDate(day, locale);\n                return (\n                  <div\n                    key={dateToDay(day)}\n                    role='gridcell'\n                    data-cal-day={dateToDay(day)}\n                    tabIndex={isCurrent && isSameDay(day, date) ? 0 : -1}\n                    aria-current={isToday ? 'date' : undefined}\n                    aria-label={count > 0 ? `${name}, ${text.eventCount(count)}` : name}\n                    className={cx(\n                      styles.monthViewCell,\n                      day.getMonth() !== paneMonth.getMonth() && styles.monthViewCellOutside,\n                      onSlotCreate && styles.monthViewCellCreatable,\n                      target &&\n                        dayDiff(target.from, day) >= 0 &&\n                        dayDiff(day, target.to) >= 0 &&\n                        styles.monthViewCellTarget,\n                      classNames?.cell,\n                    )}\n                    style={slotStyles?.cell}\n                    onClick={(clickEvent) => handleCellClick(clickEvent, day)}\n                    onKeyDown={(keyEvent) => handleKeyDown(keyEvent, day)}\n                  >\n                    <span\n                      data-cal-day-number\n                      aria-hidden\n                      className={cx(\n                        styles.monthViewDayNumber,\n                        isToday && styles.monthViewDayNumberToday,\n                        onOpenDay && styles.monthViewDayNumberLink,\n                      )}\n                    >\n                      {formatDayNumber(day, locale)}\n                    </span>\n                    {week && column === 0 && (\n                      <span aria-hidden className={styles.monthViewWeekNumber}>\n                        {week}\n                      </span>\n                    )}\n                  </div>\n                );\n              })}\n              {/* Pointer only: a keyboard reaches a day's events through Enter on its cell. */}\n              <div data-cal-bars aria-hidden className={styles.monthViewBars}>\n                {lanes.visible.map(renderBar)}\n                {lanes.hidden.map(\n                  (count, column) =>\n                    count > 0 && (\n                      <div\n                        key={`more-${column}`}\n                        data-cal-more\n                        className={styles.monthViewMore}\n                        style={{ gridColumn: column + 1, gridRow: lanes.moreLane + 1 }}\n                        onClick={() => openList(dates[column], false)}\n                      >\n                        {text.more(count)}\n                      </div>\n                    ),\n                )}\n              </div>\n            </div>\n          );\n        })}\n      </div>\n    );\n  }\n\n  return (\n    <div ref={rootRef} className={styles.monthView} style={{ '--days': weekdays.length } as CSSProperties}>\n      <div role='grid' aria-label={formatMonthTitle(date, locale)} className={styles.monthViewGrid}>\n        <div role='row' className={styles.monthViewWeekdays}>\n          {weekdays.map((day) => (\n            <div\n              key={day.getDay()}\n              role='columnheader'\n              aria-label={formatWeekday(day, locale, 'long')}\n              className={cx(styles.monthViewWeekday, classNames?.dayHeader)}\n              style={slotStyles?.dayHeader}\n            >\n              {formatWeekday(day, locale, 'short')}\n            </div>\n          ))}\n        </div>\n        <div ref={viewportRef} className={cx(pagerStyles.pagerViewport, styles.monthViewViewport)}>\n          <div ref={pager.trackRef} className={pagerStyles.pagerTrack}>\n            {STEPS.map(renderPane)}\n          </div>\n        </div>\n      </div>\n      <Popover\n        anchor={list?.anchor ?? null}\n        isOpen={list !== null}\n        onOpenChange={(open) => !open && setList(null)}\n        // Enter on a cell is a key event of ours, which Popover cannot see, so it is told.\n        focusOnOpen={list?.fromKeyboard ?? false}\n        placement={PopoverPlacement.Bottom}\n        align={PopoverAlign.Start}\n        content={\n          list && (\n            <div className={styles.monthViewList}>\n              <div className={styles.monthViewListTitle}>{formatLongDate(list.day, locale)}</div>\n              <AgendaList\n                className={styles.monthViewListEvents}\n                events={events}\n                start={list.day}\n                days={1}\n                showDayHeaders={false}\n                locale={locale}\n                today={today}\n                text={text}\n                onEventClick={(event) => {\n                  setList(null);\n                  // The list's own row unmounts with the popover, so the day's cell anchors it.\n                  onEventClick?.(event, list.anchor);\n                }}\n                renderEvent={renderEvent}\n                eventClassName={eventClassName}\n                classNames={classNames}\n                slotStyles={slotStyles}\n              />\n              {onSlotCreate && (\n                <Button\n                  className={styles.monthViewListCreate}\n                  onClick={() => {\n                    setList(null);\n                    onSlotCreate(allDaySlot(list.day), list.anchor);\n                  }}\n                >\n                  {text.newEvent}\n                </Button>\n              )}\n            </div>\n          )\n        }\n      />\n    </div>\n  );\n}\n\nexport default MonthView;\n"],"mappings":"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"}