Calendar
Ein Datumsraster für Einzel-, Bereichs- und Mehrfachauswahl, mit gleitenden Monaten, Bereichsvorschau und Tagen in Touch-Größe.
| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
pnpm dlx shadcn@latest add https://hextaui.com/r/calendar.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 react-day-picker @base-ui/react @tabler/icons-react class-variance-authority cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/calendar.tsx components/ui/button.tsx lib/motion.ts Passe die Importpfade an dein Projekt-Setup an.
Calendar umschließt das <DayPicker /> von react-day-picker, sodass jede DayPicker-Prop wie auf daypicker.dev dokumentiert funktioniert. HextaUI ergänzt Styling, Monatsübergänge, eine Bereichsvorschau und ein hydration-sicheres Heute.
Range
Mit mode="range" zeigt das Hovern oder Fokussieren eines Tages nach dem ersten Klick eine Vorschau des Bereichs, den der nächste Klick auswählt. numberOfMonths zeigt Monate nebeneinander, auf schmalen Bildschirmen gestapelt.
Bereichsgrenzen
min und max begrenzen die Länge des Bereichs in Tagen. Mit excludeDisabled beginnt ein Bereich, der einen deaktivierten Tag enthalten würde, stattdessen von vorn.
Mehrfach
mode="multiple" schaltet einzelne Tage um. max begrenzt, wie viele ausgewählt werden können.
Dropdowns für Monat und Jahr
captionLayout="dropdown" ersetzt die Überschrift durch native Selects, sodass Smartphones ihre eigene Auswahl erhalten. Setze startMonth und endMonth, um die Jahre zu begrenzen.
Begrenzt
Die Navigation stoppt bei startMonth und endMonth, und disabled sperrt Tage außerhalb des Fensters. useToday() liefert ein Heute, das beim Server-Rendering sicher verwendet werden kann.
Gesteuerter Monat
Übergib month und onMonthChange, um den sichtbaren Monat zu steuern. Sprünge gleiten in Bewegungsrichtung, und die Höhe passt sich sanft zwischen 5 und 6 Wochenzeilen an.
Kalenderwochen
showWeekNumber fügt eine Wochenspalte hinzu. ISOWeek verwendet die ISO-Zählung, beginnend am Montag. showOutsideDays={false} blendet Tage anderer Monate aus.
Festes Heute
Übergib today, um den hervorgehobenen Tag festzulegen, für Tests oder eine andere Zeitzone. animate={false} schaltet Monatsübergänge ab.
In einem Sheet
In einem Sheet, Popover oder Dialog verwirft der Kalender seinen eigenen Hintergrund und geht in die Fläche über.
Rechts nach links
Übergib ein locale aus react-day-picker/locale und dir="rtl". Pfeile, Navigation und Gleitrichtung werden alle gespiegelt. Innerhalb eines DirectionProvider mit dir="rtl" wird die Richtung automatisch übernommen.
Fokussiere einen Tag und nutze dann diese Tasten. Das Verlassen des sichtbaren Monats wechselt den Monat.
| Taste | Aktion |
|---|---|
| ←→ | Vorheriger oder nächster Tag. In Rechts-nach-links-Layouts umgekehrt. |
| ↑↓ | Derselbe Tag der vorherigen oder nächsten Woche. |
| Shift←→ | Vorheriger oder nächster Monat. |
| Shift↑↓ | Vorheriges oder nächstes Jahr. |
| Page UpPage Down | Vorheriger oder nächster Monat. |
| ShiftPage UpPage Down | Vorheriges oder nächstes Jahr. |
| Home | Erster Tag der Woche. |
| End | Letzter Tag der Woche. |
| EnterSpace | Wählt den fokussierten Tag aus. |
- Der Monat ist ein Raster. Jeder Tag ist ein Button mit einem vollständigen Datumslabel, und ausgewählte Tage setzen
aria-selected. - Monatswechsel per Tastatur überspringen das Gleiten und blenden nur über, sodass der Fokus sich nie unter einem bewegten Raster verschiebt.
- Bei reduzierter Bewegung blenden Monatswechsel über, und die Höhenänderung erfolgt sofort.
- Auf Touchscreens wachsen die Tageszellen auf 44 px.
Akzeptiert alle <DayPicker />-Props. Die folgenden Standardwerte weichen von denen von DayPicker ab oder wurden von HextaUI hinzugefügt.
| Prop | Typ | Standard |
|---|---|---|
modeOhne Modus sind Tage nicht auswählbar. | "single" | "multiple" | "range" | – |
selectedEntspricht dem Modus. | Date | Date[] | DateRange | – |
onSelect | (selected, triggerDate, modifiers, event) => void | – |
requiredVerhindert das Abwählen der letzten Auswahl. | boolean | – |
minMindestanzahl Tage in einem Bereich oder im Modus multiple ausgewählt. | number | – |
maxMaximale Anzahl Tage in einem Bereich oder im Modus multiple ausgewählt. | number | – |
excludeDisabledBereichsmodus. | boolean | – |
disabled | Matcher | Matcher[] | – |
monthGesteuerter Monat. | Date | – |
defaultMonth | Date | – |
onMonthChange | (month: Date) => void | – |
startMonth | Date | – |
endMonth | Date | – |
numberOfMonths | number | 1 |
captionLayout | "label" | "dropdown" | "dropdown-months" | "dropdown-years" | "label" |
navLayoutHextaUI-Standard. Die Pfeile sitzen zu beiden Seiten der Überschrift. | "around" | "after" | "around" |
showOutsideDaysHextaUI-Standard. | boolean | true |
animateMonatsgleiten und Höhenübergänge. HextaUI-Standard. | boolean | true |
buttonVariantVariante der Buttons für zurück und weiter. | Button variant | "ghost" |
showWeekNumber | boolean | false |
ISOWeek | boolean | false |
weekStartsOn | 0 | 1 | 2 | 3 | 4 | 5 | 6 | – |
fixedWeeks | boolean | false |
todayStandardmäßig das heutige Datum des Clients, über Mitternacht und Hydration hinweg synchron gehalten. | Date | – |
timeZone | string | – |
locale | Partial<DayPickerLocale> | – |
dir | "ltr" | "rtl" | – |
footer | ReactNode | – |
| Attribut | Beschreibung |
|---|---|
data-slot="calendar" | Die Kalender-Root in CSS ansprechen. |
--cell-size | Größe der Tageszellen. 36 px, auf Touchscreens 44 px. |
--cell-radius | Eckenradius der Tageszellen und Buttons. |
data-slot="calendar-day" | Tageszellen. Tragen data-selected, data-disabled, data-outside, data-today, data-hidden und data-focused. |
data-preview | Auf Tageszellen: Anfang, Mitte oder Ende der Bereichsvorschau beim Hovern. |
data-range-middle | Auf Tageszellen in einem ausgewählten Bereich. |
Der Button in jedem Tag. Übergib deinen eigenen an components={{ DayButton }} und verwende diesen weiter, um das Styling beizubehalten.
| Attribut | Beschreibung |
|---|---|
data-slot="calendar-day-button" | Tag-Buttons in CSS ansprechen. |
data-day | Das ISO-Datum, etwa 2026-10-03. |
data-today | Vorhanden am heutigen Tag, ohne Tage außerhalb des Monats. |
data-selected-single | Ausgewählt, außerhalb eines Bereichs. |
data-range-start | Erster Tag des Bereichs. |
data-range-middle | Ein Tag innerhalb des Bereichs. |
data-range-end | Letzter Tag des Bereichs. |
Gibt das heutige Datum als Date auf dem Client zurück und undefined beim Server-Rendering, sodass daraus gebildete Grenzen nie zu einem Hydration-Mismatch führen. Es aktualisiert sich um Mitternacht. Siehe die useToday-Anleitung.
- ButtonButtons in allen Varianten und Größen, mit eingebautem Lade-, Erfolgs- und Fehlerablauf, der den Spinner bei schnellen Anfragen überspringt.
- MotionDie Easing-Kurven, Dauern und der Reduced-Motion-Check, mit denen jede Komponente animiert, plus Hooks für Größen-Morphs und gleitende Hervorhebungen.
- useTodayDas heutige Datum, das um Mitternacht und bei der Rückkehr zum Tab weiterläuft, ohne Hydration-Mismatch.
- 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.