Skip to content

Components · Date, time and scheduling

AgendaList

Events grouped by day with sticky day headings, a Today marker and an empty state.

@rookcom/monarch-react/schedulingComponent

Agenda

Wednesday 4 November, Today, 3 events

Thursday 5 November, 1 event

  • Time off · Priya

Friday 6 November, 1 event

Usage examples

Empty

Custom empty state and range

Purpose

Lists upcoming events in time order, one section per day, for an agenda view, a dashboard card or a narrow screen where a grid does not fit. Needed by: calendar.

Use when

  • The agenda view of a calendar, or the phone layout of a week.
  • An "Upcoming" card listing the next bookings, interviews or deadlines.

Avoid when

  • Overlaps and free time matter: use TimeGrid.
  • The user scans a whole month: use CalendarMonthView.
  • The rows are not events (a task list, a feed): use a plain list.

Design principles

  • Days are sections with a real heading, so the outline and screen-reader heading navigation follow the days.
  • All-day events come first in a day, then timed events by start time.
  • A time column on the left keeps titles aligned; below 24rem it moves above the title.
  • Today is marked by text ("Today") and colour, never colour alone.
  • The product supplies data and callbacks; the list only orders, groups and formats.

API reference

import { AgendaList } from '@rookcom/monarch-react/scheduling';
ExportKindRenderingRoot class
AgendaListcomponentclient.mn-agenda-list

Renders a <div> (ref) containing one <section aria-labelledby> per day with an h3 (see headingLevel) and a <ul> of EventChip bar chips.

Days come from the events (from to the last event) or from from + days; showEmptyDays lists days with nothing.

Times are formatted with Intl in timeZone and locale; pass both (and today) for identical server and client output.

Generated from the TypeScript declarations of packages/react/src/components/scheduling/agenda-list.

Properties

AgendaList

Events grouped by day, in order: sticky day headings with a count and a "Today" marker, all-day events first, an empty state when nothing is scheduled, and arrow keys to move between events.

PropTypeDescription
events requiredreadonly CalendarEvent[]
classNamestring
dayNotes((day: string) => readonly ReactNode[] | undefined)Informational rows shown first in a day, such as time off or a holiday. A day with notes is listed even when it has no events.
daysnumberHow many days from `from` to cover. Default: through the last event.
emptyReactNodeReplaces the default empty state.
fromstringFirst day listed, `'2026-11-04'`. Default: the first day with an event. Events that started earlier but are still running appear on it.
headingLevel3 | 4 | 6 | 2 | 5Level of the day headings. Default 3.
hourCycleHourCycleForce a 12- or 24-hour clock (`'12'` or `'24'`, as in the date pickers); by default the locale decides.
idstring
labelsAgendaListLabels
localestring
onEventClick((event: CalendarEvent) => void)
renderEvent((event: CalendarEvent, chip: ReactElement) => ReactNode)Wrap or replace each chip (for example in a PopoverTrigger). Keep one focusable element.
showEmptyDaysbooleanList days in the range that have nothing. Default `false`.
timeZonestringIANA zone events are grouped in. Defaults to the runtime's; pass it for server rendering.
todaystring | nullToday, for the marker. Inject for server rendering; read from the clock after mount when left out; `null` for none.

Variants

PropValuesDescription
headingLevel'2''3''4''5''6'Level of the day headings, to fit the page outline. Default 3.
showEmptyDays'true''false'List every day in the range, with a zero count, instead of only days with events or notes.

States

StateExposed asBehaviour
Todaydata-today (section)Link-coloured date and a "Today" pill in the heading.
Emptydata-empty (root)EmptyState "Nothing scheduled", or your empty node.
Note rows–Hatched informational rows from dayNotes (time off, holidays), shown first.
Event status–Each row is an EventChip, so tentative, cancelled and declined read as in every view.

Interaction behaviour

  • Activating a row calls onEventClick(event), or follows the event’s href.
  • renderEvent(event, chip) wraps a row, for example in a PopoverTrigger.
  • Give the list a height or max-height to scroll inside a card; the day headings stick to the top.
  • A multi-day event appears on each day it touches; a timed event continuing from an earlier day shows "– end".

Keyboard support

KeysAction
TabEnters the list at today’s first event (or the first event), then leaves it: one tab stop.
ArrowDown / ArrowUpNext or previous event, across days.
Page Down / Page UpFirst event of the next or previous day.
Home / EndFirst or last event.
Enter / SpaceActivates the focused event.

Accessibility

Role
region per day (section labelled by its heading)
Accessible name
Each day section is named by its heading: "Wednesday 4 November, Today, 3 events".
  • Rows are EventChip buttons named "title, time, status, detail".
  • Roving tabindex keeps a long agenda to one tab stop while every event stays reachable.
  • Verified with axe in jsdom and in Chromium, Firefox and WebKit on /components/agenda-list.

Responsive behaviour

  • Uses a container query: below 24rem the time sits above the title and the status beside it.
  • Titles and details truncate; nothing forces horizontal scrolling at 320px.

Theme support

  • Headings use --mn-color-bg-surface, so they cover scrolled rows in every theme.
  • The Today pill uses --mn-color-accent-subtle with default text, which meets contrast in every theme.
  • Note rows are hatched with --mn-color-bg-muted / --mn-color-bg-subtle.

Do and don't

Do

  • Pass timeZone, locale and today from the user’s settings so grouping matches the rest of the product.
  • Give it a bounded height inside cards so the sticky headings work.
  • Use dayNotes for time off and holidays instead of fake events.

Don't

  • Do not sort or group the events yourself; pass them in any order.
  • Do not nest interactive controls inside a row; open details in a popover or page.

Dependencies

KindDepends on
npm packagesreact
Monarch componentsEmptyState, EventChip

Testing coverage

  • Groups by day with headings, counts and a Today marker; all-day events first, then by start time.
  • Arrow keys, Page Up/Down and Home/End move between events across days; one tab stop; Enter activates.
  • The tab stop starts at today or later.
  • Groups in the given time zone; continuing events show their end only.
  • Fixed ranges with showEmptyDays, dayNotes, heading level and labels.
  • Default and custom empty states; renderEvent wrapping.
  • No axe violations in jsdom; renders on the server.
CheckCovered
Axe in jsdomYes
Server renderingYes
Browser suitesVisual baselines: /__gallery/agenda-list; Cross-browser axe: /components/agenda-list

Tests: packages/react/src/components/scheduling/agenda-list