{"version":3,"file":"agendaList.mjs","names":[],"sources":["../../../../../../package/common/calendar/components/agendaList/agendaList.tsx"],"sourcesContent":["import { useId, useLayoutEffect, useRef, type CSSProperties, type ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport EmptyState from 'components/common/emptyState';\n\nimport type { CalendarEvent } from '../../calendar.types';\nimport { addDays, dateToDay, isSameDay, shownDays } from '../../dates';\nimport { formatDayNumber, formatLongDate, formatTime, formatTimeRange, formatWeekday } from '../../format';\nimport { eventEnd, eventsByDay, isAllDayLike } from '../../layout';\nimport type { AgendaListProps } from './agendaList.types';\n\nimport styles from './agendaList.module.pcss';\nimport { cssColor } from '../../../styles/tone';\n\nfunction AgendaList<E extends CalendarEvent>({\n  events,\n  start,\n  days,\n  hidden,\n  scrollTo,\n  showDayHeaders,\n  locale,\n  today,\n  text,\n  onEventClick,\n  renderEvent,\n  eventClassName,\n  className,\n  classNames,\n  slotStyles,\n}: AgendaListProps<E>): ReactElement {\n  const id = useId();\n  const listRef = useRef<HTMLDivElement>(null);\n  const dates = shownDays(start, days, hidden);\n  const perDay = eventsByDay(events, dates);\n  const scrollKey = scrollTo ? dateToDay(scrollTo) : null;\n\n  useLayoutEffect(() => {\n    const list = listRef.current;\n    if (!list || scrollKey === null) return;\n    const groups = list.querySelectorAll<HTMLElement>('[data-cal-day]');\n    const target = [...groups].find((group) => (group.dataset.calDay ?? '') >= scrollKey);\n    list.scrollTop = target ? target.offsetTop : 0;\n  }, [scrollKey]);\n\n  const listed = perDay.flatMap((dayEvents, index) =>\n    dayEvents.length > 0 || !showDayHeaders ? [{ day: dates[index], dayEvents }] : [],\n  );\n\n  return (\n    <div ref={listRef} className={cx(styles.agendaList, className)}>\n      {listed.every(({ dayEvents }) => dayEvents.length === 0) && (\n        <EmptyState className={styles.agendaListEmpty}>{text.noEvents}</EmptyState>\n      )}\n      {listed.map(({ day, dayEvents }) => {\n        if (dayEvents.length === 0) return null;\n        const headerId = `${id}-${dateToDay(day)}`;\n        const isToday = isSameDay(day, today);\n        const dayEnd = addDays(day, 1);\n        return (\n          <div\n            key={dateToDay(day)}\n            role='group'\n            aria-labelledby={showDayHeaders ? headerId : undefined}\n            className={cx(styles.agendaListDay, showDayHeaders && styles.agendaListDayWithHeader)}\n            data-cal-day={dateToDay(day)}\n          >\n            {showDayHeaders && (\n              <div\n                id={headerId}\n                className={cx(styles.agendaListDayHeader, classNames?.dayHeader)}\n                style={slotStyles?.dayHeader}\n                aria-label={formatLongDate(day, locale)}\n              >\n                <span\n                  className={cx(styles.agendaListDayNumber, isToday && styles.agendaListDayNumberToday)}\n                  aria-hidden\n                >\n                  {formatDayNumber(day, locale)}\n                </span>\n                <span className={styles.agendaListDayName} aria-hidden>\n                  {formatWeekday(day, locale, 'short')}\n                </span>\n              </div>\n            )}\n            <ul className={styles.agendaListEvents}>\n              {dayEvents.map((event) => {\n                const end = eventEnd(event);\n                const from = event.start < day ? day : event.start;\n                const to = end > dayEnd ? dayEnd : end;\n                const allDay = isAllDayLike(event) || (event.start <= day && end >= dayEnd);\n                const when = allDay ? text.allDay : formatTimeRange(event.start, end, locale);\n                return (\n                  <li key={event.id}>\n                    <button\n                      type='button'\n                      className={cx(styles.agendaListEvent, classNames?.event, eventClassName?.(event))}\n                      style={\n                        { '--event-color': event.color && cssColor(event.color), ...slotStyles?.event } as CSSProperties\n                      }\n                      aria-label={`${event.title}, ${when}`}\n                      data-cal-event={String(event.id)}\n                      onClick={(clickEvent) => onEventClick?.(event, clickEvent.currentTarget)}\n                    >\n                      <span className={styles.agendaListTime} aria-hidden>\n                        {allDay ? (\n                          text.allDay\n                        ) : (\n                          <>\n                            <span>{formatTime(from, locale)}</span>\n                            <span className={styles.agendaListTimeEnd}>{formatTime(to, locale)}</span>\n                          </>\n                        )}\n                      </span>\n                      <span className={styles.agendaListAccent} aria-hidden />\n                      <span className={styles.agendaListTitle} aria-hidden>\n                        {renderEvent ? renderEvent(event, { singleLine: false }) : event.title}\n                      </span>\n                    </button>\n                  </li>\n                );\n              })}\n            </ul>\n          </div>\n        );\n      })}\n    </div>\n  );\n}\n\nexport default AgendaList;\n"],"mappings":"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"}