Gebaut auf Vercels UI SDK 0.1.0-beta.2. Die API kann sich ändern.
Date input
Ein Datumsfeld auf Vercels UI SDK, das Teil für Teil in der Reihenfolge der Locale getippt wird, mit optionaler Uhrzeit, Minimum und Maximum, gesperrten Tagen und ISO-Wert.
- Formularkomponenten
- 3 Teilen
- 10 Beispielen
@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-date-input.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.2 @ui-sdk/core@0.1.0-beta.2 cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/ui-sdk-date-input.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.
Nutze ein Datumsfeld für Daten, die man auswendig kennt, etwa einen Geburtstag. Der Wert ist ein ISO-Datum wie "2026-11-02" und bleibt null, bis jeder Teil etwas enthält. Jeder Teil füllt sich beim Tippen und springt weiter, der Tag bleibt innerhalb seines Monats, und ein ganzes Datum lässt sich in jeden Teil einfügen. Zum Auswählen im Kalender nutze den Date Picker.
Das Feld ist eine Gruppe, also benenne es mit aria-labelledby oder aria-label. Ein Klick irgendwo in den Rahmen fokussiert den nächstgelegenen Teil.
DateInput rendert seine Teile selbst. Füge DateInputSegments selbst ein, um ein Symbol oder anderen Inhalt daneben zu setzen.
granularity mit "hour", "minute" oder "second" fügt die Uhrzeit hinzu, und der Wert wird zu lokalem Datum und Uhrzeit wie "2026-11-02T14:30".
Ein Datum vor min oder nach max markiert das Feld als ungültig, und sein Formular wird nicht gesendet.
unavailable nimmt ISO-Daten, Bereiche { from, to }, Wochentage oder eine Funktion, und ein passendes Datum ist ungültig.
locale bestimmt Reihenfolge und Trennzeichen. Die Ziffern sind immer 0 bis 9 und der Kalender immer gregorianisch, sodass der Wert überall dasselbe Datum bedeutet.
Ein verstecktes Feld sendet das ISO-Datum unter name, hier neben einem Time Input. required stoppt ein leeres oder halb getipptes Datum, und ein Zurücksetzen stellt den Standardwert her.
createDateInputController() setzt, leert oder fokussiert das Feld von überall. Fokussiere einen Teil über seine Einheit, etwa "year".
Ein deaktiviertes Feld wird beim Fokussieren übersprungen und nicht gesendet.
Ein schreibgeschütztes Feld nimmt den Fokus an und wird gesendet, aber Tasten und Tippen ändern es nicht.
Die Teile behalten die Reihenfolge der Locale, und die Pfeiltasten folgen ihnen auf dem Bildschirm.
| Taste | Aktion |
|---|---|
| 0–9 | Füllt den Teil und springt zum nächsten. |
| /. | Wechselt zum nächsten Teil. |
| ↑↓ | Ändert den Teil um eins und läuft im Kreis. Ein leerer Teil beginnt bei heute. |
| PageUpPageDown | Ändert in größeren Schritten: Jahr um 5, Monat um 3, Tag um 7. |
| HomeEnd | Springt zum ersten oder letzten Wert des Teils. |
| ←→ | Wechselt zum vorherigen oder nächsten Teil. |
| Backspace | Löscht die letzte Ziffer, leert dann den Teil und springt dann zurück. |
| Enter | Sendet das Formular mit der Eingabe ab. |
Die Wurzel ist eine Gruppe. Jeder Teil ist ein Spinbutton, benannt nach seiner Einheit wie „month“, mit Wert und Bereich, und ein leerer Teil wird als „Empty“ vorgelesen. Der Text zwischen den Teilen ist für Screenreader verborgen.
Die Teile sind echte Eingabefelder, daher zeigen Handys einen Ziffernblock und Tippen funktioniert, bevor das Skript der Seite läuft. Auf Touchscreens wachsen sie auf 16px, damit Handys nicht zoomen, und der fokussierte Teil wird hervorgehoben statt eine Einfügemarke zu zeigen.
Jeder Teil umhüllt den gleichnamigen UI-SDK-Teil und nimmt alle seine Props an, auch render und einen className, der eine Funktion des Zustands sein kann.
| Prop | Typ | Standard |
|---|---|---|
value | string | null | – |
defaultValue | string | null | – |
onValueChangeLäuft, sobald jeder Teil etwas enthält, und mit null, wenn einer geleert wird. | (value: string | null, details) => void | – |
granularity | "day" | "hour" | "minute" | "second" | "day" |
hourCycleStandardmäßig die Uhr der Locale. | 12 | 24 | – |
min | string | – |
max | string | – |
unavailableISO-Daten, Bereiche { from, to }, { weekday } oder eine Funktion. | DateMatchers | – |
localeStandardmäßig die Sprache der Seite. | string | – |
invalid | boolean | false |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllerAus createDateInputController(). | DateInputController | – |
childrenStandardmäßig DateInputSegments. | ReactNode | (state) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Beschreibung |
|---|---|
data-slot="date-input" | Zum Ansprechen des Datumsfelds in CSS. |
data-invalid | Vorhanden, wenn das Datum außerhalb von min und max liegt, gesperrt ist oder invalid gesetzt ist. |
data-empty | Vorhanden, solange alle Teile leer sind. |
data-disabled | Vorhanden, wenn deaktiviert. |
data-readonly | Vorhanden, wenn schreibgeschützt. |
data-required | Vorhanden, wenn erforderlich. |
Rendert für jeden Teil ein DateInputSegment in der Reihenfolge der Locale, mit dem Text dazwischen.
| Prop | Typ | Standard |
|---|---|---|
segmentEines der segments aus dem Zustand der Wurzel. | DateInputSegmentData | – |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Beschreibung |
|---|---|
data-slot="date-input-segment" | Zum Ansprechen eines Teils in CSS. |
data-type | year, month, day, hour, minute, second, dayPeriod oder literal für den Text zwischen den Teilen. |
data-empty | Vorhanden, solange der Teil leer ist. |
- 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.
- InputEin Texteingabefeld mit drei Größen, ungültigen und schreibgeschützten Zuständen, nativem Validierungsstyling und einer 16-px-Schrift für Touch, damit Smartphones nie hineinzoomen.