Vitral 0.2
Dados

Schedule

Um calendário com visões de mês, semana, dia, agenda e linha do tempo por recurso, arrastar para mover e redimensionar, eventos recorrentes e qualquer fuso.

Importação

main.ts
import { Schedule } from '@vitral/vue';

Semana

O horário comercial fica sombreado; eventos sobrepostos dividem a coluna; a linha vermelha é o agora. A daily se repete em todo dia útil, a folha de pagamento no primeiro e no último dia do mês.

20 de set de 2026 – 26 de set de 2026
Horário
Dia inteiro
00:00
00:30
01:00
01:30
02:00
02:30
03:00
03:30
04:00
04:30
05:00
05:30
06:00
06:30
07:00
07:30
08:00
08:30
09:00
09:30
10:00
10:30
11:00
11:30
12:00
12:30
13:00
13:30
14:00
14:30
15:00
15:30
16:00
16:30
17:00
17:30
18:00
18:30
19:00
19:30
20:00
20:30
21:00
21:30
22:00
22:30
23:00
23:30
Move, resize or select something. Press an event to open it.
<script setup lang="ts">import { Button, Dialog, Schedule, StackPanel, Tag, type ScheduleEvent, type ScheduleEventChange, type ScheduleOccurrenceInfo, type ScheduleSelection, type ScheduleViewName } from '@vitral/vue';import { computed, ref } from 'vue'; const today = new Date();const at = (dayOffset: number, hour: number, minute = 0) => new Date(today.getFullYear(), today.getMonth(), today.getDate() + dayOffset, hour, minute);const day = (dayOffset: number) => at(dayOffset, 0); const events = ref<ScheduleEvent[]>([    { id: 1, title: 'Standup', start: at(-today.getDay() + 1, 9), end: at(-today.getDay() + 1, 9, 15), recurrence: 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR', color: 'var(--vt-chart-4)' },    { id: 2, title: 'Design review', start: at(0, 10), end: at(0, 11, 30) },    { id: 3, title: 'Pairing', start: at(0, 10, 30), end: at(0, 12) },    { id: 4, title: 'Lunch with Ana', start: at(1, 12, 30), end: at(1, 13, 30), color: 'var(--vt-chart-3)' },    { id: 5, title: 'Release', start: day(2), end: day(4), allDay: true, color: 'var(--vt-chart-2)' },    { id: 6, title: 'Planning', start: at(-1, 14), end: at(-1, 16) },    { id: 7, title: 'Board meeting', start: at(3, 15), end: at(3, 16), editable: false, color: 'var(--vt-chart-6)' },    { id: 8, title: 'Payroll', start: new Date(today.getFullYear(), today.getMonth(), 1, 8), recurrence: 'FREQ=MONTHLY;BYMONTHDAY=1,-1', allDay: true, color: 'var(--vt-chart-5)' }]); let nextId = 100;const log = ref('Move, resize or select something. Press an event to open it.');const view = ref<ScheduleViewName>('week');const date = ref(day(0)); // ---- opening an event// `event-click` hands over the event, which occurrence of it was pressed, and// the original DOM event. What to do with that is the application's: a dialog// here, a drawer or a side panel somewhere else.const opened = ref<{ event: ScheduleEvent; occurrence: ScheduleOccurrenceInfo } | null>(null);const details = computed(() => {    const current = opened.value;    if (!current) return null;    const { event, occurrence } = current;    const when = occurrence.allDay        ? occurrence.start.toLocaleDateString(undefined, { weekday: 'long', day: 'numeric', month: 'long' })        : `${occurrence.start.toLocaleString(undefined, { weekday: 'long', day: 'numeric', month: 'long', hour: '2-digit', minute: '2-digit' })} – ${occurrence.end.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })}`;    return { title: event.title, when, recurring: occurrence.recurring, editable: event.editable !== false };}); // Applies a change: a single event is updated; one occurrence of a series is// split off as an event of its own and left out of the series.function apply(change: ScheduleEventChange) {    const { event, occurrence, start, end, allDay, resourceId } = change;    if (occurrence.recurring) {        events.value = [            ...events.value.map((e) => (e === event ? { ...e, exdate: [...(e.exdate ?? []), occurrence.start] } : e)),            { ...event, id: nextId++, recurrence: null, exdate: undefined, start, end, allDay, resourceId }        ];    } else {        events.value = events.value.map((e) => (e === event ? { ...e, start, end, allDay, resourceId } : e));    }    log.value = `${event.title}: ${start.toLocaleString()} → ${end.toLocaleString()} (${change.kind}, ${change.via})`;} function create(selection: ScheduleSelection) {    events.value = [...events.value, { id: nextId++, title: 'New event', start: selection.start, end: selection.end, allDay: selection.allDay, resourceId: selection.resourceId }];    log.value = `Created ${selection.start.toLocaleString()} → ${selection.end.toLocaleString()}`;}</script> <template>    <Schedule        v-model:view="view"        v-model:date="date"        :events="events"        scroll-time="08:00"        style="width: 100%"        @event-change="apply"        @select="create"        @event-click="opened = { event: $event.event, occurrence: $event.occurrence }"    />    <small style="color: var(--vt-text-muted-color)">{{ log }}</small>     <Dialog :visible="!!opened" modal :header="details?.title" :style="{ width: 'min(26rem, 92vw)' }" @update:visible="opened = null">        <StackPanel v-if="details" spacing="0.5rem">            <p style="margin: 0">{{ details.when }}</p>            <StackPanel orientation="horizontal" spacing="0.625rem" align="center" wrap>                <Tag v-if="details.recurring" value="Repeats" severity="info" />                <Tag v-if="!details.editable" value="Locked" severity="secondary" />            </StackPanel>        </StackPanel>        <template #footer>            <Button label="Close" severity="secondary" variant="text" @click="opened = null" />        </template>    </Dialog></template>

Mês

Os eventos atravessam os dias que ocupam; um dia cheio mostra “+N more”, que abre a lista completa.

setembro de 2026
domingo
segunda-feira
terça-feira
quarta-feira
quinta-feira
sexta-feira
sábado
domingo, 30 de agosto de 2026
segunda-feira, 31 de agosto de 2026
terça-feira, 1 de setembro de 2026
quarta-feira, 2 de setembro de 2026
quinta-feira, 3 de setembro de 2026
sexta-feira, 4 de setembro de 2026
sábado, 5 de setembro de 2026
domingo, 6 de setembro de 2026
segunda-feira, 7 de setembro de 2026
terça-feira, 8 de setembro de 2026
quarta-feira, 9 de setembro de 2026
quinta-feira, 10 de setembro de 2026
sexta-feira, 11 de setembro de 2026
sábado, 12 de setembro de 2026
domingo, 13 de setembro de 2026
segunda-feira, 14 de setembro de 2026
terça-feira, 15 de setembro de 2026
quarta-feira, 16 de setembro de 2026
quinta-feira, 17 de setembro de 2026
sexta-feira, 18 de setembro de 2026
sábado, 19 de setembro de 2026
domingo, 20 de setembro de 2026
segunda-feira, 21 de setembro de 2026
terça-feira, 22 de setembro de 2026
quarta-feira, 23 de setembro de 2026
quinta-feira, 24 de setembro de 2026
sexta-feira, 25 de setembro de 2026
sábado, 26 de setembro de 2026
domingo, 27 de setembro de 2026
segunda-feira, 28 de setembro de 2026
terça-feira, 29 de setembro de 2026
quarta-feira, 30 de setembro de 2026
quinta-feira, 1 de outubro de 2026
sexta-feira, 2 de outubro de 2026
sábado, 3 de outubro de 2026
domingo, 4 de outubro de 2026
segunda-feira, 5 de outubro de 2026
terça-feira, 6 de outubro de 2026
quarta-feira, 7 de outubro de 2026
quinta-feira, 8 de outubro de 2026
sexta-feira, 9 de outubro de 2026
sábado, 10 de outubro de 2026
<script setup lang="ts">import { Button, Dialog, Schedule, StackPanel, Tag, type ScheduleEvent, type ScheduleEventChange, type ScheduleOccurrenceInfo, type ScheduleSelection, type ScheduleViewName } from '@vitral/vue';import { computed, ref } from 'vue'; const today = new Date();const at = (dayOffset: number, hour: number, minute = 0) => new Date(today.getFullYear(), today.getMonth(), today.getDate() + dayOffset, hour, minute);const day = (dayOffset: number) => at(dayOffset, 0); const events = ref<ScheduleEvent[]>([    { id: 1, title: 'Standup', start: at(-today.getDay() + 1, 9), end: at(-today.getDay() + 1, 9, 15), recurrence: 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR', color: 'var(--vt-chart-4)' },    { id: 2, title: 'Design review', start: at(0, 10), end: at(0, 11, 30) },    { id: 3, title: 'Pairing', start: at(0, 10, 30), end: at(0, 12) },    { id: 4, title: 'Lunch with Ana', start: at(1, 12, 30), end: at(1, 13, 30), color: 'var(--vt-chart-3)' },    { id: 5, title: 'Release', start: day(2), end: day(4), allDay: true, color: 'var(--vt-chart-2)' },    { id: 6, title: 'Planning', start: at(-1, 14), end: at(-1, 16) },    { id: 7, title: 'Board meeting', start: at(3, 15), end: at(3, 16), editable: false, color: 'var(--vt-chart-6)' },    { id: 8, title: 'Payroll', start: new Date(today.getFullYear(), today.getMonth(), 1, 8), recurrence: 'FREQ=MONTHLY;BYMONTHDAY=1,-1', allDay: true, color: 'var(--vt-chart-5)' }]); let nextId = 100;const view = ref<ScheduleViewName>('month'); const opened = ref<{ event: ScheduleEvent; occurrence: ScheduleOccurrenceInfo } | null>(null);const details = computed(() => {    const current = opened.value;    if (!current) return null;    const { event, occurrence } = current;    const when = occurrence.allDay        ? occurrence.start.toLocaleDateString(undefined, { weekday: 'long', day: 'numeric', month: 'long' })        : `${occurrence.start.toLocaleString(undefined, { weekday: 'long', day: 'numeric', month: 'long', hour: '2-digit', minute: '2-digit' })} – ${occurrence.end.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })}`;    return { title: event.title, when, recurring: occurrence.recurring, editable: event.editable !== false };}); // Applies a change: a single event is updated; one occurrence of a series is// split off as an event of its own and left out of the series.function apply(change: ScheduleEventChange) {    const { event, occurrence, start, end, allDay, resourceId } = change;    if (occurrence.recurring) {        events.value = [            ...events.value.map((e) => (e === event ? { ...e, exdate: [...(e.exdate ?? []), occurrence.start] } : e)),            { ...event, id: nextId++, recurrence: null, exdate: undefined, start, end, allDay, resourceId }        ];    } else {        events.value = events.value.map((e) => (e === event ? { ...e, start, end, allDay, resourceId } : e));    }} function create(selection: ScheduleSelection) {    events.value = [...events.value, { id: nextId++, title: 'New event', start: selection.start, end: selection.end, allDay: selection.allDay, resourceId: selection.resourceId }];}</script> <template>    <Schedule        v-model:view="view"        :events="events"        :max-events-per-day="2"        style="width: 100%"        @event-change="apply"        @select="create"        @event-click="opened = { event: $event.event, occurrence: $event.occurrence }"    />     <Dialog :visible="!!opened" modal :header="details?.title" :style="{ width: 'min(26rem, 92vw)' }" @update:visible="opened = null">        <StackPanel v-if="details" spacing="0.5rem">            <p style="margin: 0">{{ details.when }}</p>            <StackPanel orientation="horizontal" spacing="0.625rem" align="center" wrap>                <Tag v-if="details.recurring" value="Repeats" severity="info" />                <Tag v-if="!details.editable" value="Locked" severity="secondary" />            </StackPanel>        </StackPanel>        <template #footer>            <Button label="Close" severity="secondary" variant="text" @click="opened = null" />        </template>    </Dialog></template>

Agenda

As próximas duas semanas como lista, dia a dia.

25 de set de 2026 – 8 de out de 2026
  • sexta-feira, 25 de setembro de 2026
  • sábado, 26 de setembro de 2026
  • domingo, 27 de setembro de 2026
  • segunda-feira, 28 de setembro de 2026
  • terça-feira, 29 de setembro de 2026
  • quarta-feira, 30 de setembro de 2026
  • quinta-feira, 1 de outubro de 2026
  • sexta-feira, 2 de outubro de 2026
  • segunda-feira, 5 de outubro de 2026
  • terça-feira, 6 de outubro de 2026
  • quarta-feira, 7 de outubro de 2026
  • quinta-feira, 8 de outubro de 2026
<script setup lang="ts">import { Schedule, type ScheduleEvent } from '@vitral/vue'; const today = new Date();const at = (dayOffset: number, hour: number, minute = 0) => new Date(today.getFullYear(), today.getMonth(), today.getDate() + dayOffset, hour, minute);const day = (dayOffset: number) => at(dayOffset, 0); const events: ScheduleEvent[] = [    { id: 1, title: 'Standup', start: at(-today.getDay() + 1, 9), end: at(-today.getDay() + 1, 9, 15), recurrence: 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR', color: 'var(--vt-chart-4)' },    { id: 2, title: 'Design review', start: at(0, 10), end: at(0, 11, 30) },    { id: 3, title: 'Pairing', start: at(0, 10, 30), end: at(0, 12) },    { id: 4, title: 'Lunch with Ana', start: at(1, 12, 30), end: at(1, 13, 30), color: 'var(--vt-chart-3)' },    { id: 5, title: 'Release', start: day(2), end: day(4), allDay: true, color: 'var(--vt-chart-2)' },    { id: 6, title: 'Planning', start: at(-1, 14), end: at(-1, 16) },    { id: 7, title: 'Board meeting', start: at(3, 15), end: at(3, 16), editable: false, color: 'var(--vt-chart-6)' },    { id: 8, title: 'Payroll', start: new Date(today.getFullYear(), today.getMonth(), 1, 8), recurrence: 'FREQ=MONTHLY;BYMONTHDAY=1,-1', allDay: true, color: 'var(--vt-chart-5)' }];</script> <template>    <Schedule view="agenda" :views="['agenda']" :agenda-days="14" :events="events" style="width: 100%" /></template>

Linha do tempo por recurso

Salas nas linhas e o tempo na horizontal. Arraste uma reserva para outra sala, ou pressione Alt com Up e Down.

sexta-feira, 25 de setembro de 2026
Recursos
07:00
08:00
09:00
10:00
11:00
12:00
13:00
14:00
15:00
16:00
17:00
18:00
19:00
Auditorium
Room B
Room C
Studio
<script setup lang="ts">import { Schedule, type ScheduleEvent, type ScheduleEventChange, type ScheduleViewName } from '@vitral/vue';import { ref } from 'vue'; const today = new Date();const at = (dayOffset: number, hour: number, minute = 0) => new Date(today.getFullYear(), today.getMonth(), today.getDate() + dayOffset, hour, minute);const day = (dayOffset: number) => at(dayOffset, 0); const view = ref<ScheduleViewName>('timeline');const resources = [    { id: 'a', title: 'Auditorium' },    { id: 'b', title: 'Room B', color: 'var(--vt-chart-3)' },    { id: 'c', title: 'Room C', color: 'var(--vt-chart-7)' },    { id: 'd', title: 'Studio' }];const bookings = ref<ScheduleEvent[]>([    { id: 'k1', title: 'Onboarding', start: at(0, 9), end: at(0, 12), resourceId: 'a' },    { id: 'k2', title: 'Interview', start: at(0, 10), end: at(0, 11), resourceId: 'b' },    { id: 'k3', title: 'Interview', start: at(0, 10, 30), end: at(0, 11, 30), resourceId: 'b' },    { id: 'k4', title: 'Workshop', start: at(0, 13), end: at(0, 17), resourceId: 'c' },    { id: 'k5', title: 'Recording', start: at(0, 8), end: at(0, 10), resourceId: 'd' },    { id: 'k6', title: 'Maintenance', start: day(0), end: day(1), allDay: true, resourceId: 'd' }]); function rebook(change: ScheduleEventChange) {    bookings.value = bookings.value.map((e) => (e === change.event ? { ...e, start: change.start, end: change.end, resourceId: change.resourceId } : e));}</script> <template>    <Schedule v-model:view="view" :views="['timeline', 'week']" :resources="resources" :events="bookings" min-time="07:00" max-time="20:00" scroll-height="20rem" style="width: 100%" @event-change="rebook">        <template #resource="{ resource }">            <span style="display: flex; align-items: center; gap: 0.5rem">                <span :style="{ width: '0.5rem', height: '0.5rem', borderRadius: '50%', background: resource.color ?? 'var(--vt-chart-1)' }" />                {{ resource.title }}            </span>        </template>    </Schedule></template>

Os mesmos instantes, lidos em outro lugar

Três instantes fixos, desenhados no fuso que for escolhido. Nada nos eventos muda — só a hora e o dia em que a grade os coloca, então o build noturno passa para o dia anterior ou para o seguinte conforme o lugar de onde se olha. Clique num evento: o que volta é o instante que ele sempre foi.

segunda-feira, 9 de março de 2026
Horário
segunda-feira, 9 de março de 2026
Dia inteiro
00:00
00:30
01:00
01:30
02:00
02:30
03:00
03:30
04:00
04:30
05:00
05:30
06:00
06:30
07:00
07:30
08:00
08:30
09:00
09:30
10:00
10:30
11:00
11:30
12:00
12:30
13:00
13:30
14:00
14:30
15:00
15:30
16:00
16:30
17:00
17:30
18:00
18:30
19:00
19:30
20:00
20:30
21:00
21:30
22:00
22:30
23:00
23:30
<script setup lang="ts">import { Button, Schedule, StackPanel } from '@vitral/vue';import { ref } from 'vue'; // ---- the same instants, read in three placesconst zones = ['UTC', 'America/Sao_Paulo', 'Asia/Tokyo'] as const;const zone = ref<(typeof zones)[number]>('America/Sao_Paulo');const handoverDay = new Date(2026, 2, 9);const handovers = [    { id: 'h1', title: 'Handover', start: new Date(Date.UTC(2026, 2, 9, 15, 0)), end: new Date(Date.UTC(2026, 2, 9, 16, 0)) },    { id: 'h2', title: 'Market open', start: new Date(Date.UTC(2026, 2, 9, 13, 30)), end: new Date(Date.UTC(2026, 2, 9, 14, 0)) },    { id: 'h3', title: 'Nightly build', start: new Date(Date.UTC(2026, 2, 9, 2, 0)), end: new Date(Date.UTC(2026, 2, 9, 3, 0)) }];const readBack = ref('');const showInstant = (change: { occurrence: { start: Date } }) => (readBack.value = change.occurrence.start.toISOString());</script> <template>    <StackPanel spacing="1rem" style="width: 100%">        <div style="display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem">            <div style="display: flex; gap: 0.5rem" role="group" aria-label="Time zone">                <Button v-for="z in zones" :key="z" size="small" severity="secondary" variant="outlined" :aria-pressed="zone === z" @click="zone = z">{{ z }}</Button>            </div>            <small v-if="readBack" style="color: var(--vt-text-muted-color)">Reported as {{ readBack }}</small>        </div>        <Schedule :events="handovers" :date="handoverDay" view="day" :views="['day']" :time-zone="zone" scroll-time="00:00" aria-label="Handovers" @event-click="showInstant" />    </StackPanel></template>

Barra de ferramentas, conteúdo e reversão personalizados

A barra de ferramentas e o conteúdo dos eventos são slots. O horário vai das 08:00 às 18:00 em intervalos de 15 minutos, e uma mudança para o fim de semana é revertida.

20 de set de 2026 – 26 de set de 2026
20 de set de 2026 – 26 de set de 2026
Horário
Dia inteiro
08:00
08:15
08:30
08:45
09:00
09:15
09:30
09:45
10:00
10:15
10:30
10:45
11:00
11:15
11:30
11:45
12:00
12:15
12:30
12:45
13:00
13:15
13:30
13:45
14:00
14:15
14:30
14:45
15:00
15:15
15:30
15:45
16:00
16:15
16:30
16:45
17:00
17:15
17:30
17:45
<script setup lang="ts">import { Button, Schedule, type ScheduleEvent, type ScheduleEventChange } from '@vitral/vue';import { ref } from 'vue'; const today = new Date();const at = (hour: number) => new Date(today.getFullYear(), today.getMonth(), today.getDate(), hour); // Weekends are closed: a move onto one is taken back.const guarded = ref<ScheduleEvent[]>([{ id: 'g', title: 'Try moving me to a weekend', start: at(11), end: at(12) }]);function guard(change: ScheduleEventChange) {    const weekend = change.start.getDay() === 0 || change.start.getDay() === 6;    if (weekend) {        change.revert();        return;    }    guarded.value = guarded.value.map((e) => (e === change.event ? { ...e, start: change.start, end: change.end } : e));}</script> <template>    <Schedule :events="guarded" view="week" :slot-duration="15" min-time="08:00" max-time="18:00" scroll-height="24rem" :hour12="false" style="width: 100%" @event-change="guard">        <template #toolbar="{ title, prev, next, today: goToday }">            <div style="display: flex; align-items: center; gap: 0.5rem">                <Button icon="chevronLeft" aria-label="Previous week" variant="outlined" size="small" @click="prev" />                <Button label="This week" variant="outlined" size="small" @click="goToday" />                <Button icon="chevronRight" aria-label="Next week" variant="outlined" size="small" @click="next" />                <strong style="margin-inline-start: 0.5rem">{{ title }}</strong>            </div>        </template>        <template #event="{ event, timeText }">            <strong>{{ event.title }}</strong>            <small>{{ timeText }}</small>        </template>    </Schedule></template>

API

Lido de packages/vue/src/components/Schedule/types.ts, então diz o que o componente aceita de fato.

Props

NomeTipoDescrição
eventsScheduleEvent[]—
resourcesScheduleResource[]Linhas da visão de linha do tempo.
viewsScheduleViewName[]As visões que o seletor oferece, em ordem. O padrão é mês, semana, dia e agenda, mais a linha do tempo quando há recursos.
toolbarbooleanMostrado depois do título; defina como false para ocultar a barra de ferramentas embutida. O padrão é true.
timeZonestringO fuso em que o calendário é desenhado — um nome IANA como `'America/Sao_Paulo'`. Os eventos mantêm os instantes que receberam; só muda em que hora e em que dia são mostrados, e toda data que a agenda emite volta a ser um instante. Um evento de dia inteiro é uma data, não um instante, então fica onde foi posto.
slotDurationnumber—
timelineSlotDurationnumberMinutos que cada coluna da linha do tempo abrange. O padrão é 60.
snapDurationnumberMinutos que um arrasto ou uma tecla move. O padrão é 15.
minTimestringO primeiro horário mostrado, `'HH:mm'`. O padrão é `'00:00'`.
maxTimestringO último horário mostrado, `'HH:mm'`. O padrão é `'24:00'`.
scrollTimestringAté onde as visões de semana e dia abrem roladas. O padrão é `'08:00'`.
businessHoursScheduleBusinessHours | ScheduleBusinessHours[] | falseSombreia o tempo fora dele; false não sombreia nada. O padrão é segunda a sexta, 09:00–17:00.
firstDayOfWeeknumber0 = domingo; o padrão é o `firstDayOfWeek` do locale.
hour12booleanForça um relógio de 12 ou 24 horas; o padrão vem do locale.
editablebooleanOs eventos podem ser arrastados e redimensionados. O padrão é true.
selectablebooleanÉ possível arrastar sobre horário vazio para escolher um intervalo (`select`). O padrão é true.
nowIndicatorbooleanUma linha no horário atual. O padrão é true.
defaultDurationnumberMinutos que dura um evento com horário e sem fim. O padrão é 60.
agendaDaysnumberDias que a agenda lista. O padrão é 7.
timelineDaysnumberDias que a linha do tempo abrange. O padrão é 1.
maxEventsPerDaynumberEventos mostrados numa célula do mês antes de "+N more". O padrão é 3.
scrollHeightstringAltura da área rolável das visões de semana, dia e linha do tempo. O padrão é `'36rem'`.

Mais pt, dt e unstyled de BaseProps; veja pass-through e modo sem estilo.

Emits

EventoPayloadDescrição
range-changerange: { start: Date; end: Date; view: ScheduleViewName }O intervalo visível mudou: o momento de buscar seus eventos.
event-clickpayload: { event: ScheduleEvent; occurrence: ScheduleOccurrenceInfo; originalEvent: Event }—
event-changechange: ScheduleEventChange—
selectselection: ScheduleSelection—
date-clickpayload: { date: Date; allDay: boolean; resourceId?: string | number | null; originalEvent: Event }—

Slots

NomeProps do slotDescrição
default—As partes, escritas como filhos: `<Schedule.Toolbar>`, `<Schedule.Event>`…
toolbar(props: ScheduleToolbarSlotProps)Substitui a barra de ferramentas inteira.
event(props: ScheduleEventSlotProps)O conteúdo de um evento.
resource(props: { resource: ScheduleResource })O cabeçalho da linha de um recurso na linha do tempo.
empty—A agenda sem nada nela.