Keyboard & Accessibility

Keyboard & accessibility

Every pointer operation has a keyboard equivalent, and every operation is announced — WCAG 2.2 dragging movements, built in.

Every drag operation in the Scheduler can be performed without a pointer — the WCAG 2.2 dragging movements criterion is part of the component’s contract, not an add-on.

Keyboard reference

KeysContextAction
TabMove between toolbar, events, and the slot grid.
Slot gridMove the roving slot focus (hour / day).
Enter / SpaceEmpty slotAnchor a range selection; arrows extend it; Enter creates the event.
Enter / SpaceEventGrab the event; arrows move it by snap / day; Enter confirms.
Shift+EnterEventGrab the end edge instead — arrows resize.
F2EventOpen the edit dialog (title, times, color, repeat).
EscapeAnywhereClose the dialog, or cancel the active drag, selection or grab (pointer drags too).
Delete / BackspaceEventDelete the event (or occurrence, per the active scope).

In the month view the arrows move by ±1 day and ±1 week; in the timeline / move in time and / between resources.

The edit dialog is a role="dialog" with aria-modal; it opens focused on the title field, saves on Enter (form submit), and closes on Escape returning focus to the event.

Announcements

State changes are announced through a polite live region: grabbing an event, moving it (“moved to …”), resizing, creating, deleting, cancelling, and rejected drops when overlap control is on. Every message is localizable through the labels system.

Semantics

The time grid exposes role="grid" with labeled gridcell slots and a roving tabindex; events are focusable with descriptive labels (title plus localized time range); the toolbar’s view switch reports the active view via aria-pressed.

Conformance & known limitations

The component targets WCAG 2.2 AA. What ships today: full keyboard equivalence for dragging (§2.5.7), status messages for every operation (§4.1.3), visible focus and token-based contrast, a focus-contained modal edit dialog, and grid semantics with aria-rowcount/aria-colcount and indexed rows/cells across the time grid, month, and timeline views.

Known limitations, deliberately documented rather than hidden:

  • In time-grid views the event boxes are an absolutely-positioned layer inside the grid container but not children of a gridcell — the keyboard contract does not depend on this, and a fully APG-conformant restructuring is planned.
  • Creating events with the keyboard is available in the time-grid views; in month and timeline, keyboard users create via the time-grid views or your own UI on top of eventChange.

Testing hook

Every meaningful element carries a stable data-part attribute (event, time-slot, month-day, drag-preview, live-region, …). Target these in your end-to-end tests — they are a supported contract, class names are not.