Scheduler

Plans events in agenda, week, or month views with date navigation and accessible rescheduling.

Loading schedule…

The week ahead

Loading schedule…

Use it for

  • An event collection in agenda, week, or month views, using a named timeZone or the browser zone.
  • Selecting a new event time or rescheduling while preserving duration.

Not for

  • Recurrence expansion or conflict enforcement; prepare those in the application.

Three ways in. They share one source, so the pixels match whichever you pick.

1. Import the package

npm install @noorddev/vlak-react

// once, next to your app's root
import "@noorddev/vlak-react/css";

import { Scheduler } from "@noorddev/vlak-react";

Precompiled React and one stylesheet. No compiler to configure. Per-component imports work too: @noorddev/vlak-react/components/scheduler.

2. Vendor the source

npx @noorddev/vlak-cli add scheduler

The StyleX leaf lands in components/vlak/ with its dependencies, for your own compiler to own. See StyleX.

3. Through shadcn

npx shadcn add https://vlak.dev/r/scheduler.json

The same registry item, installed by shadcn's CLI.

CSS only

<link rel="stylesheet" href="node_modules/@noorddev/vlak/css/vlak.css" />

No React. Link vlak.css and use the markup and classes below.

import { Scheduler } from "@noorddev/vlak-react";

<Scheduler events={events} defaultValue={new Date("2026-09-07T12:00:00Z")} timeZone="Europe/Amsterdam" defaultView="week" onSlotSelect={createEvent} onEventSelect={openEvent} onEventMove={rescheduleEvent} />

Scheduler

Agenda, week, and month planning in an explicit or browser-local zone. Mutations are callbacks.

PropTypeDefaultDescription
eventsrequiredreadonly SchedulerEvent[]
valueDate
defaultValueDate
onValueChange(day: Date) => void
viewSchedulerView
defaultViewSchedulerView"week"
onViewChange(view: SchedulerView) => void
onEventSelect(event: SchedulerEvent) => void
onSlotSelect(start: Date) => void
onEventMove(event: SchedulerEvent, next: { start: Date; end: Date; }) => void
weekStart0 | 11
localestring"en"
timeZonestringIANA zone, for example Europe/Amsterdam. Defaults to the browser zone.
labelstring"Schedule"
disabledbooleanfalse

Also accepts Omit<HTMLAttributes<HTMLDivElement>, "defaultValue">.

KeysDoes
Tab, Enter, SpaceOperates date navigation, event buttons, scheduling actions, and view selection.
EscapeCloses the rescheduling dialog and returns focus to the triggering action.
<div class="rs-scheduler" role="region" aria-label="Schedule"><h3 class="rs-scheduler-title">Monday, 7 September</h3><ol class="rs-scheduler-list"><li class="rs-scheduler-event"><span>Review</span><span class="rs-scheduler-time">09:00–09:30</span></li></ol></div>
.rs-scheduler.rs-scheduler-toolbar.rs-scheduler-action.rs-scheduler-title.rs-scheduler-scroll.rs-scheduler-week.rs-scheduler-date.rs-scheduler-month.rs-scheduler-weekday.rs-scheduler-list.rs-scheduler-event.rs-scheduler-event-button.rs-scheduler-time.rs-scheduler-empty.rs-scheduler-form.rs-scheduler-day.rs-scheduler-selected.rs-scheduler-cell.rs-scheduler-outside