Gebaut auf Vercels UI SDK 0.1.0-beta.1. Die API kann sich ändern.
Date picker
Ein Datepicker auf Vercels UI SDK, in dem man ein Datum in der eigenen Sprache tippt oder auswählt, mit Bereichen, Presets und ISO-Werten.
- Formularkomponenten
- 18 Teilen
- 9 Beispielen
@tabler/icons-react@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-date-picker.jsonFügt die Komponente, die HextaUI-Theme-Tokens und alle HextaUI-Komponenten hinzu, von denen sie abhängt.
Füge die Theme-Tokens zu deinem globalen CSS hinzu, falls du das noch nicht getan hast.
Installiere die Abhängigkeiten.
pnpm add @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/ui-sdk-date-picker.tsx components/ui/button.tsx Passe die Importpfade an dein Projekt-Setup an.
UI SDK bringt etwas eigenes CSS in einem Cascade Layer namens ui-sdk mit. Deklariere diesen Layer ganz oben im globalen Stylesheet, über dem Tailwind-Import, damit deine Klassen gewinnen.
Werte sind ISO-Datumsstrings wie 2026-11-20, ohne Uhrzeit oder Zeitzone, also brauchst du keine Datumsbibliothek. Man tippt in der eigenen Reihenfolge, etwa 11/20/2026 oder 20.11.2026, und das Feld formatiert das Datum bei Enter oder beim Verlassen. DatePickerContent ohne Kinder rendert einen gestalteten Kalender.
Mit mode="range" fügst du ein zweites Input mit end hinzu. Der Kalender bleibt nach dem ersten Datum offen und schließt nach dem zweiten. months={2} zeigt zwei Monate nebeneinander, auf kleinen Bildschirmen untereinander.
Ein DatePickerPreset wählt seinen value und schließt das Popup. Solange sein Wert ausgewählt ist, wirkt er gedrückt.
Minimum, Maximum und nicht verfügbare Daten
Beispiel öffnen: Minimum, Maximum und nicht verfügbare Datenmin, max und unavailable gelten beim Tippen und Auswählen. Hier sind Wochenenden und zwei Feiertage nicht wählbar, und ein getippter wird als ungültig markiert.
locale legt das Eingabeformat, den Hinweis und die Namen im Kalender fest. Ohne es liest der Picker das lang der Seite. Die Buttons haben englische Namen, also gib aria-label an, um sie zu übersetzen.
Mit einem name wird das Datum als ISO-String gesendet. required blockiert ein leeres Absenden, Text, der kein Datum ist, ebenfalls, und Reset kehrt zu defaultValue zurück.
Ein Controller aus createDatePickerController() setzt das Datum oder öffnet den Kalender von überall, und onValueChange meldet jede Änderung. Lass value hier weg, damit der Kalender zum Monat springen kann, den der Controller wählt.
disabled verhindert Tippen und Öffnen. readOnly öffnet den Kalender weiterhin zum Ansehen, aber nichts lässt sich ändern.
Mit arabischer Locale in dir=rtl laufen Feld, Pfeile und Kalender von rechts.
| Taste | Aktion |
|---|---|
| Enter | Im Input liest es das getippte Datum. Auf einem Tag wählt es ihn. |
| ←→↑↓ | Wechselt zwischen Tagen, nach oben und unten um eine Woche. |
| Page UpPage Down | Geht einen Monat zurück oder vor. |
| HomeEnd | Wechselt zum Anfang oder Ende der Woche. |
| Esc | Bricht einen unfertigen Bereich ab, sonst schließt es den Kalender. |
Der Kalender öffnet sich als Dialog mit einem Raster aus Tagen, jeder voll benannt, etwa „Friday, November 20, 2026“. Der Hinweis beschreibt das Input, sodass Screenreader das einzugebende Format hören. Text, der kein Datum ist, setzt aria-invalid und behält den alten Wert, und nicht verfügbare Tage bleiben fokussierbar, damit Tastaturnutzer sie trotzdem hören.
Trigger, Popup und Pfeile haben englische Namen. Gib jedem ein aria-label, um sie zu übersetzen. Inputs nutzen auf Touchscreens 16px Schrift, damit iOS nicht zoomt, und das Popup skaliert nur herein, wenn Bewegung erlaubt ist.
Jeder Teil umschließt den gleichnamigen UI-SDK-Teil und nimmt alle seine Props an, darunter render und einen className, der eine Funktion des Teilzustands sein kann. DatePickerControl, DatePickerSeparator und DatePickerCalendar sind Layout-Teile von HextaUI.
| Prop | Typ | Standard |
|---|---|---|
mode | "single" | "range" | "single" |
value | string | [string, string] | null | – |
defaultValue | string | [string, string] | null | – |
onValueChange | (value, details) => void | – |
min | string | – |
max | string | – |
unavailableISO-Daten, { from, to }, { weekday }, { before }, { after } oder eine Funktion. | DateMatchers | – |
months | number | 1 |
pageBy | "month" | "page" | "month" |
locale | string | – |
weekStartsOn | number | – |
minDays | number | – |
maxDays | number | – |
closeOnSelect | boolean | true |
disabled | boolean | false |
readOnly | boolean | false |
name | string | – |
startName | string | – |
endName | string | – |
required | boolean | false |
open | boolean | – |
onOpenChange | (open, details) => void | – |
controllerAus createDatePickerController(). | DatePickerController | – |
| Attribut | Beschreibung |
|---|---|
data-slot="date-picker" | Spricht den Datepicker in CSS an. |
data-open | Vorhanden, solange geöffnet. |
data-invalid | Vorhanden, solange ein Input Text enthält, der kein Datum ist. |
data-disabled | Vorhanden, wenn deaktiviert. |
data-readonly | Vorhanden, wenn schreibgeschützt. |
| Prop | Typ | Standard |
|---|---|---|
endMacht es zum Ende eines Bereichs. | boolean | false |
| Prop | Typ | Standard |
|---|---|---|
childrenStandard ist ein Kalendersymbol. | ReactNode | – |
aria-label | string | "Choose date" |
| Prop | Typ | Standard |
|---|---|---|
childrenStandard ist ein X-Symbol namens Clear. Es verschwindet, solange nichts zu leeren ist. | ReactNode | – |
| Prop | Typ | Standard |
|---|---|---|
childrenStandard ist ein DatePickerCalendar. | ReactNode | – |
align | Align | "start" |
sideOffset | number | 6 |
collisionPadding | number | 8 |
| Attribut | Beschreibung |
|---|---|
data-slot="date-picker-content" | Spricht das Popup in CSS an. |
--cell-size | Die Größe jedes Tages, auf Touchscreens größer. |
| Prop | Typ | Standard |
|---|---|---|
monthsWie viele Raster nebeneinander erscheinen. | number | 1 |
| Prop | Typ | Standard |
|---|---|---|
value | string | [string, string] | – |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Beschreibung |
|---|---|
data-slot="calendar-day" | Spricht einen Tag in CSS an. |
data-today | Vorhanden am heutigen Tag. |
data-range-start | Vorhanden, wo ein Bereich beginnt. |
data-range-end | Vorhanden, wo ein Bereich endet. |
data-unavailable | Vorhanden an einem Tag, der nicht wählbar ist. |
data-outside | Vorhanden an einem Tag des nächsten oder vorigen Monats. |
- ButtonButtons in allen Varianten und Größen, mit eingebautem Lade-, Erfolgs- und Fehlerablauf, der den Spinner bei schnellen Anfragen überspringt.
- CalendarEin Datumsraster für Einzel-, Bereichs- und Mehrfachauswahl, mit gleitenden Monaten, Bereichsvorschau und Tagen in Touch-Größe.
- CheckboxEine Checkbox, deren Häkchen sich einzeichnet, mit unbestimmten übergeordneten Elementen, Gruppen und Labels, die ihren Hover teilen.
- ComboboxEin filterbares Select mit Chips, Gruppen und asynchronen Ergebnissen, in einem Popup, das sich beim Tippen anpasst.
- Date pickerEin Button, der einen Kalender in einem Popover öffnet, auf Smartphones als Bottom Sheet, für einzelne Daten und Zeiträume.
- FieldLabels, Beschreibungen und Fehler, mit ihrem Steuerelement verbunden, mit Validierungszuständen und Layouts für Formulare.