UI

Calendar

Calendário embutido na tela para escolher uma data (Calendar) ou um período (RangeCalendar).

Data do agendamento, setembro de 2026

30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3

Instalação

npx shadcn@latest add @lenstech/calendar

Uso

import { getLocalTimeZone, today } from "@internationalized/date"
import { I18nProvider } from "react-aria-components"
import { Calendar } from "@/components/ui/calendar"
<I18nProvider locale="pt-BR">
  <Calendar aria-label="Data do agendamento" defaultValue={today(getLocalTimeZone())} />
</I18nProvider>

Datas são CalendarDate, não Date

O valor do calendário é um objeto do pacote @internationalized/date (CalendarDate), sem hora nem fuso — assim "15/10" nunca vira "14/10" por causa do fuso horário.

  • Criar: today(getLocalTimeZone()), parseDate("2026-10-15") ou new CalendarDate(2026, 10, 15).
  • Enviar para a API: data.toString() → "2026-10-15" (ISO).
  • Converter para Date: data.toDate(getLocalTimeZone()).
  • Converter de Date: parseDate(date.toISOString().slice(0, 10)).
  • Calcular: data.add({ days: 7 }), data.subtract({ months: 1 }), data.compare(outra).

Idioma

Envolva em <I18nProvider locale="pt-BR"> (ou defina o idioma na raiz da aplicação) para ter nomes de meses, dias da semana e início da semana em português.

Exemplos

Período (RangeCalendar)

RangeCalendar seleciona início e fim. O valor é { start, end }; os extremos ficam em primary e o meio em accent.

Período do relatório, setembro de 2026

30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3

De 24 de set. a 30 de set.

Datas mínima, máxima e indisponíveis

minValue e maxValue limitam a navegação; isDateUnavailable risca dias específicos (fins de semana, feriados, agenda cheia).

Data da visita técnica, setembro de 2026

30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3

Controlado

Use value e onChange para ler a data escolhida e reagir a ela.

Data de entrega, outubro de 2026

27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

Entrega em sábado, 3 de outubro de 2026

Inválido

Com isInvalid e errorMessage, a mensagem aparece abaixo do calendário.

Data do evento, setembro de 2026

30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
Escolha uma data a partir de hoje.

Quando usar

  • Use embutido na tela, quando o calendário é o foco: agenda de atendimentos, escolha de dia de entrega.
  • Não use em formulários comuns — prefira Date Picker, que permite digitar e abre o calendário num popover.
  • Não use para datas conhecidas de cor, como nascimento — use Date Field.

API

Calendar

Aceita todas as props do Calendar do React Aria, mais:

Prop

Type

RangeCalendar

Aceita todas as props do RangeCalendar do React Aria, mais errorMessage. value, defaultValue e onChange usam { start: DateValue; end: DateValue }.

On this page