Date picker
Um botão que abre um calendário em um popover, ou em um bottom sheet no celular, para datas únicas e intervalos.
pnpm dlx shadcn@latest add https://hextaui.com/r/date-picker.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cn react-day-pickerCopie e cole o código a seguir no seu projeto.
components/ui/date-picker.tsx components/ui/calendar.tsx components/ui/popover.tsx components/ui/sheet.tsx components/ui/button.tsx lib/motion.ts Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Em telas com menos de 640px de largura, o calendário abre em um bottom sheet em vez de um popover, para que os dias continuem grandes o bastante para o toque.
Controlado
Passe value e onValueChange. Valores limpos são null. O calendário sempre abre no mês da data selecionada, e escolher um dia o fecha e devolve o foco ao botão.
Intervalo
<DateRangePicker /> mostra dois meses em telas maiores. O primeiro clique sempre inicia um novo intervalo, mesmo quando já há um definido, e o segundo clique o conclui em qualquer ordem e fecha o seletor.
Dias desativados
Passe qualquer matcher do react-day-picker como calendarProps.disabled. Aqui, apenas dias úteis futuros podem ser escolhidos.
Dropdowns de mês e ano
Para datas distantes, como um aniversário, defina captionLayout: "dropdown" com um startMonth e um endMonth. Rotule o gatilho com um <label /> apontando para seu id.
Em um formulário
Com name, uma data única é enviada como 2026-10-14 e um intervalo como 2026-10-20/2026-10-24. Seletores vazios enviam uma string vazia.
Desabilitado
Um gatilho desativado ainda pode exibir um valor.
Contêiner estreito
O gatilho nunca cresce além do seu contêiner. Rótulos longos são truncados em vez de quebrar de linha.
Dentro de uma sheet
O seletor fica acima do sheet, e Escape fecha apenas o seletor.
Da direita para a esquerda
Passe locale para o rótulo do gatilho e um locale do react-day-picker com dir: "rtl" em calendarProps para o calendário. As teclas de seta seguem a direção.
| Tecla | Ação |
|---|---|
| EnterSpace | No gatilho, abre o seletor e foca o dia selecionado, ou hoje. Em um dia, o seleciona. |
| ←→ | Move para o dia anterior ou seguinte. |
| ↑↓ | Move para o mesmo dia da semana anterior ou seguinte. |
| Page UpPage Down | Move para o mês anterior ou seguinte. |
| ShiftPage Up | Move para o ano anterior. Shift Page Down move para o seguinte. |
| HomeEnd | Move para o início ou o fim da semana. |
| Esc | Fecha o seletor e devolve o foco ao gatilho. |
- O popover é rotulado com
title, e o bottom sheet o exibe como heading. Traduza-o junto complaceholder. - O gatilho não tem um rótulo visível próprio. Combine-o com um
<label />ou passearia-label. - Dias desativados são ignorados pelo teclado e anunciados como indisponíveis.
Os dois seletores compartilham as props abaixo e renderizam um gatilho <Button /> com um <Calendar /> em um popover ou bottom sheet.
| Prop | Tipo | Padrão |
|---|---|---|
value | Date | null | – |
defaultValue | Date | null | null |
onValueChange | (value: Date | null) => void | – |
placeholder | string | "Pick a date" |
titleNome acessível do popover, título do sheet. | string | "Select a date" |
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean) => void | – |
localeFormata o rótulo do gatilho com Intl.DateTimeFormat. Passe um locale do react-day-picker em calendarProps para traduzir o calendário também. | string | "en-US" |
clearableAdiciona um botão Clear abaixo do calendário quando há um valor. | boolean | false |
clearLabel | string | "Clear" |
nameRenderiza um input oculto para que o valor seja enviado com o formulário. | string | – |
calendarPropsRepassado ao calendário, exceto mode, selected, onSelect, required, numberOfMonths e autoFocus. Use para dias desativados, captionLayout, startMonth, endMonth, locale e dir. | CalendarProps | – |
variantO gatilho é um Button e aceita também suas outras props. | Button variant | "outline" |
disabled | boolean | false |
classNameAplicado ao gatilho, que é w-60 por padrão. | string | – |
| Prop | Tipo | Padrão |
|---|---|---|
value | { from: Date; to?: Date } | null | – |
defaultValue | { from: Date; to?: Date } | null | null |
onValueChangeChamado quando o segundo dia é escolhido. | (value: DateRange | null) => void | – |
placeholder | string | "Pick a date range" |
title | string | "Select dates" |
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean) => void | – |
localeFormata o rótulo do gatilho com Intl.DateTimeFormat. Passe um locale do react-day-picker em calendarProps para traduzir o calendário também. | string | "en-US" |
clearableAdiciona um botão Clear abaixo do calendário quando há um valor. | boolean | false |
clearLabel | string | "Clear" |
nameRenderiza um input oculto para que o valor seja enviado com o formulário. | string | – |
calendarPropsRepassado ao calendário, exceto mode, selected, onSelect, required, numberOfMonths e autoFocus. Use para dias desativados, captionLayout, startMonth, endMonth, locale e dir. | CalendarProps | – |
variantO gatilho é um Button e aceita também suas outras props. | Button variant | "outline" |
disabled | boolean | false |
classNameAplicado ao gatilho, que é w-60 por padrão. | string | – |
| Atributo | Descrição |
|---|---|
data-slot="date-picker-trigger" | O botão gatilho. |
data-empty | Presente no gatilho enquanto não há valor. Mostra o placeholder em texto atenuado. |
data-popup-open | Presente no gatilho enquanto o seletor está aberto. |
data-slot="date-picker-content" | Envolve o calendário no popover ou sheet. |
data-slot="date-picker-clear" | O botão Clear. |
- ButtonBotões em todas as variantes e tamanhos, com um fluxo integrado de carregamento, sucesso e erro que dispensa o spinner em requisições rápidas.
- CalendarUma grade de datas para seleção única, de intervalo e múltipla, com meses deslizantes, prévias de intervalo e dias com tamanho adequado ao toque.
- PopoverUm painel flutuante ancorado a um gatilho que se redimensiona suavemente com o conteúdo e segue a direção do gatilho.
- SheetUm painel que desliza a partir de qualquer borda, com deslize para dispensar, bloqueio de rolagem e aninhamento empilhado.
- CheckboxUma caixa de seleção cujo check é desenhado na tela, com pais indeterminados, grupos e rótulos que compartilham seu hover.
- ComboboxUm select filtrável com chips, grupos e resultados assíncronos, em um popup que se redimensiona conforme você digita.
Usado em blocos
Blocos que se baseiam em Date picker.