Calendar Table
A calendar board is a component that presents dates in a structured grid layout, typically organized by weeks and days, allowing users to view and interact with calendar data at a glance. Commonly used in scheduling applications, event planners, and dashboard interfaces, the calendar board renders dates as cells within a table grid, making it easy to scan across days, weeks, or months.
This headless component renders a <table> element with role="grid" and an accessible label. The consumer provides the table rows and cells as children, along with any header rows for day-of-week labels.
Implementation Notes
- Renders a
<table>element withrole="grid"for structured calendar grid semantics - Consumer provides
<tr>rows with<td>or<th>cells as children - The
labelprop should describe the calendar period (e.g., "January 2025") - Accepts
...restPropsfor forwarding additional attributes to the table element - No internal state -- purely a structural wrapper
Props
label: string (required) -- accessible name describing the calendar period (e.g., month and year), applied viaaria-labelchildren: slot (required) -- table rows and cells representing the calendar grid
Usage
<CalendarTable label="April 2026">
<CalendarTableHead>
<CalendarTableRow>
<th>Mon</th><th>Tue</th><th>Wed</th><th>Thu</th><th>Fri</th><th>Sat</th><th>Sun</th>
</CalendarTableRow>
</CalendarTableHead>
<CalendarTableBody>
<CalendarTableRow>
<CalendarTableTD>1</CalendarTableTD>
<CalendarTableTD>2</CalendarTableTD>
<CalendarTableTD>3</CalendarTableTD>
<CalendarTableTD>4</CalendarTableTD>
<CalendarTableTD>5</CalendarTableTD>
<CalendarTableTD>6</CalendarTableTD>
<CalendarTableTD>7</CalendarTableTD>
</CalendarTableRow>
<CalendarTableRow>
<CalendarTableTD today selected>8</CalendarTableTD>
<CalendarTableTD>9</CalendarTableTD>
<CalendarTableTD>10</CalendarTableTD>
<CalendarTableTD>11</CalendarTableTD>
<CalendarTableTD>12</CalendarTableTD>
<CalendarTableTD>13</CalendarTableTD>
<CalendarTableTD>14</CalendarTableTD>
</CalendarTableRow>
</CalendarTableBody>
<CalendarTableFoot>
<CalendarTableRow>
<td colspan="7">3 events this week</td>
</CalendarTableRow>
</CalendarTableFoot>
</CalendarTable>
Keyboard Interactions
None built-in -- the consumer should implement grid keyboard navigation on cells as needed (arrow keys for cell-to-cell movement, Enter/Space for selection).
ARIA
role="grid"-- identifies the table as an interactive grid widgetaria-label={label}-- provides an accessible name describing the calendar period
When to Use
- Use to display an interactive calendar grid for managing dates, scheduling, and date selection
- Use when users need to view and interact with dates in a monthly or weekly grid format
- Use in scheduling applications, event planners, and dashboard calendars where a visual date layout is needed
- Use as the container for CalendarTableHead, CalendarTableBody, CalendarTableFoot, CalendarTableRow, and CalendarTableTD
When Not to Use
- Do not use for displaying general tabular data -- use Table or DataTable instead
- Do not use for date range selection without a grid -- use CalendarRangePicker for start-and-end-date picking
- Do not use for simple date entry where users already know the date -- use DateInput for a compact input field
Headless
This component provides a <table> element with role="grid" and aria-label for accessible calendar grid semantics, with zero visual styling. The consumer is responsible for all CSS including cell sizing, grid lines, day-of-week header styling, selected/today state highlights, and month navigation controls.
Styles
The consumer provides all CSS styling. The component renders with a .calendar-table class for targeting. No default styles are included — this is a fully headless component.
Testing
- Verify the component renders a
<table>element with classcalendar-table - Verify role="grid"` -- identifies the table as an interactive grid widget
- Verify aria-label={label}` -- provides an accessible name describing the calendar period
- Verify pass-through attributes are applied
Advice
- Designers: Clearly distinguish today's date and selected dates from other days. Use consistent cell sizing and ensure enough contrast for day numbers.
- Developers: Implement arrow key navigation between cells, Enter/Space for selection, and ensure the
labelprop describes the calendar period (e.g., "January 2025") for screen readers.
Composition
CalendarTable follows the Table composition pattern:
- CalendarTable -- outer
<table>withrole="grid"andaria-label. - CalendarTableHead --
<thead>containing day-of-week column headers. - CalendarTableBody --
<tbody>containing rows of day cells. - CalendarTableFoot --
<tfoot>for optional summary or navigation content. - CalendarTableRow --
<tr>representing one week. - CalendarTableCell --
<td>representing one day with selection and today state.
<CalendarTable label="January 2025">
<CalendarTableHead>
<CalendarTableRow><th>Sun</th><th>Mon</th><th>Tue</th></CalendarTableRow>
</CalendarTableHead>
<CalendarTableBody>
<CalendarTableRow>
<CalendarTableCell>1</CalendarTableCell>
<CalendarTableCell today selected>2</CalendarTableCell>
<CalendarTableCell>3</CalendarTableCell>
</CalendarTableRow>
</CalendarTableBody>
</CalendarTable>
Related components
calendar-table-body— a calendar table interactive grid tbody for managing dates, days, etc. <tbody>calendar-table-foot— a calendar table interactive grid tfoot for managing dates, days, etc. <tfoot>calendar-table-head— a calendar table interactive grid thead for managing dates, days, etc. <thead>calendar-table-row— a calendar table interactive grid row for managing dates, days, etc. <tr>calendar-table-td— a calendar table interactive grid data cell for managing dates, days, etc. <td>calendar-table-th— a calendar table interactive grid header cell for managing dates, days, etc. <th>table— a table with rows and columns <table>
References
- WAI-ARIA Grid Pattern: https://www.w3.org/WAI/ARIA/apg/patterns/grid/