Schedule
A calendar with month, week, day, agenda and resource timeline views, drag to move and resize, recurring events and any time zone.
Import
import { Schedule } from '@vitral/vue';Week
Business hours are shaded; overlapping events share the column; the red line is now. The standup repeats every weekday, payroll on the first and last of the month.
Month
Events run across the days they cover; a busy day shows “+N more”, which opens the full list.
Agenda
The next two weeks as a list, day by day.
- Friday, September 25, 2026
- Saturday, September 26, 2026
- Sunday, September 27, 2026
- Monday, September 28, 2026
- Tuesday, September 29, 2026
- Wednesday, September 30, 2026
- Thursday, October 1, 2026
- Friday, October 2, 2026
- Monday, October 5, 2026
- Tuesday, October 6, 2026
- Wednesday, October 7, 2026
- Thursday, October 8, 2026
Timeline by resource
Rooms as rows and time across. Drag a booking to another room, or press Alt with Up and Down.
The same instants, read somewhere else
Three fixed instants, drawn in whichever zone is chosen. Nothing about the events changes — only which hour and which day the grid puts them at, so the nightly build crosses into the day before or the day after depending on where you are standing. Click an event: what comes back is the instant it always was.
Custom toolbar, content and revert
The toolbar and the event content are slots. Hours run 08:00–18:00 in 15-minute slots, and a move onto a weekend is reverted.
API
Read from packages/vue/src/components/Schedule/types.ts, so it says what the component actually accepts.
Props
| Name | Type | Description |
|---|---|---|
| events | ScheduleEvent[] | — |
| resources | ScheduleResource[] | Rows of the timeline view. |
| views | ScheduleViewName[] | The views the switcher offers, in order. Defaults to month, week, day and agenda, plus timeline when there are resources. |
| toolbar | boolean | Shown after the title; set to false to hide the built-in toolbar. Defaults to true. |
| timeZone | string | The zone the calendar is drawn in — an IANA name such as `'America/Sao_Paulo'`. Events keep the instants they were given; only which hour and which day they are shown at changes, and every date the schedule emits is an instant again. An all-day event is a date rather than an instant, so it stays where it is put. |
| slotDuration | number | — |
| timelineSlotDuration | number | Minutes the timeline's columns span. Defaults to 60. |
| snapDuration | number | Minutes a drag or a key moves by. Defaults to 15. |
| minTime | string | The first time shown, `'HH:mm'`. Defaults to `'00:00'`. |
| maxTime | string | The last time shown, `'HH:mm'`. Defaults to `'24:00'`. |
| scrollTime | string | Where the week and day views open scrolled to. Defaults to `'08:00'`. |
| businessHours | ScheduleBusinessHours | ScheduleBusinessHours[] | false | Shades the time outside them; false shades nothing. Defaults to Monday–Friday, 09:00–17:00. |
| firstDayOfWeek | number | 0 = Sunday; defaults to the locale's `firstDayOfWeek`. |
| hour12 | boolean | Force a 12- or 24-hour clock; defaults to the locale's. |
| editable | boolean | Events can be dragged and resized. Defaults to true. |
| selectable | boolean | Empty time can be dragged over to pick a range (`select`). Defaults to true. |
| nowIndicator | boolean | A line at the current time. Defaults to true. |
| defaultDuration | number | Minutes a timed event without an end lasts. Defaults to 60. |
| agendaDays | number | Days the agenda lists. Defaults to 7. |
| timelineDays | number | Days the timeline spans. Defaults to 1. |
| maxEventsPerDay | number | Events shown in a month cell before "+N more". Defaults to 3. |
| scrollHeight | string | Height of the scrolling area of the week, day and timeline views. Defaults to `'36rem'`. |
Plus pt, dt and unstyled from BaseProps, see pass-through and unstyled mode.
Emits
| Event | Payload | Description |
|---|---|---|
| range-change | range: { start: Date; end: Date; view: ScheduleViewName } | The visible range changed: the moment to fetch its events. |
| event-click | payload: { event: ScheduleEvent; occurrence: ScheduleOccurrenceInfo; originalEvent: Event } | — |
| event-change | change: ScheduleEventChange | — |
| select | selection: ScheduleSelection | — |
| date-click | payload: { date: Date; allDay: boolean; resourceId?: string | number | null; originalEvent: Event } | — |
Slots
| Name | Slot props | Description |
|---|---|---|
| default | — | The parts, written as children: `<Schedule.Toolbar>`, `<Schedule.Event>`… |
| toolbar | (props: ScheduleToolbarSlotProps) | Replaces the whole toolbar. |
| event | (props: ScheduleEventSlotProps) | An event's content. |
| resource | (props: { resource: ScheduleResource }) | A resource's row header in the timeline. |
| empty | — | The agenda with nothing in it. |