DatePicker
A DatePicker component styled with Tailwind CSS.
Example#
import {Button, Calendar, CalendarCell, CalendarGrid, CalendarGridBody, CalendarGridHeader, CalendarHeaderCell, DateInput, DatePicker, DateSegment, Dialog, Group, Heading, Label, Popover} from 'react-aria-components';
import type {ButtonProps, PopoverProps} from 'react-aria-components';
import ChevronUpDownIcon from '@spectrum-icons/workflow/ChevronUpDown';
import ChevronLeftIcon from '@spectrum-icons/workflow/ChevronLeft';
import ChevronRightIcon from '@spectrum-icons/workflow/ChevronRight';
function DatePickerExample() {
return (
<div className="bg-gradient-to-r from-violet-500 to-fuchsia-600 p-12 sm:h-[400px] rounded-lg flex items-start justify-center">
<DatePicker className="group flex flex-col gap-1 w-[200px]">
<Label className="text-white cursor-default">Date</Label>
<Group className="flex rounded-lg bg-white/90 focus-within:bg-white group-open:bg-white transition pl-3 shadow-md text-gray-700 focus-visible:ring-2 ring-black">
<DateInput className="flex flex-1 py-2">
{(segment) => (
<DateSegment
segment={segment}
className="px-0.5 tabular-nums outline-none rounded-sm focus:bg-violet-700 focus:text-white caret-transparent placeholder-shown:italic"
/>
)}
</DateInput>
<Button className="outline-none px-3 flex items-center text-gray-700 transition border-0 border-solid border-l border-l-purple-200 bg-transparent rounded-r-lg pressed:bg-purple-100 focus-visible:ring-2 ring-black">
<ChevronUpDownIcon size="XS" />
</Button>
</Group>
<MyPopover>
<Dialog className="p-6 text-gray-600">
<Calendar>
<header className="flex items-center gap-1 pb-4 px-1 font-serif w-full">
<Heading className="flex-1 font-semibold text-2xl ml-2" />
<RoundButton slot="previous">
<ChevronLeftIcon />
</RoundButton>
<RoundButton slot="next">
<ChevronRightIcon />
</RoundButton>
</header>
<CalendarGrid className="border-spacing-1 border-separate">
<CalendarGridHeader>
{(day) => (
<CalendarHeaderCell className="text-xs text-gray-500 font-semibold">
{day}
</CalendarHeaderCell>
)}
</CalendarGridHeader>
<CalendarGridBody>
{(date) => (
<CalendarCell
date={date}
className="w-9 h-9 outline-none cursor-default rounded-full flex items-center justify-center outside-month:text-gray-300 hover:bg-gray-100 pressed:bg-gray-200 selected:bg-violet-700 selected:text-white focus-visible:ring ring-violet-600/70 ring-offset-2"
/>
)}
</CalendarGridBody>
</CalendarGrid>
</Calendar>
</Dialog>
</MyPopover>
</DatePicker>
</div>
);
}
function RoundButton(props: ButtonProps) {
return (
<Button
{...props}
className="w-9 h-9 outline-none cursor-default bg-transparent text-gray-600 border-0 rounded-full flex items-center justify-center hover:bg-gray-100 pressed:bg-gray-200 focus-visible:ring ring-violet-600/70 ring-offset-2"
/>
);
}
function MyPopover(props: PopoverProps) {
return (
<Popover
{...props}
className={({ isEntering, isExiting }) => `
overflow-auto rounded-lg drop-shadow-lg ring-1 ring-black/10 bg-white
`}
/>
);
}
import {
Button,
Calendar,
CalendarCell,
CalendarGrid,
CalendarGridBody,
CalendarGridHeader,
CalendarHeaderCell,
DateInput,
DatePicker,
DateSegment,
Dialog,
Group,
Heading,
Label,
Popover
} from 'react-aria-components';
import type {
ButtonProps,
PopoverProps
} from 'react-aria-components';
import ChevronUpDownIcon from '@spectrum-icons/workflow/ChevronUpDown';
import ChevronLeftIcon from '@spectrum-icons/workflow/ChevronLeft';
import ChevronRightIcon from '@spectrum-icons/workflow/ChevronRight';
function DatePickerExample() {
return (
<div className="bg-gradient-to-r from-violet-500 to-fuchsia-600 p-12 sm:h-[400px] rounded-lg flex items-start justify-center">
<DatePicker className="group flex flex-col gap-1 w-[200px]">
<Label className="text-white cursor-default">
Date
</Label>
<Group className="flex rounded-lg bg-white/90 focus-within:bg-white group-open:bg-white transition pl-3 shadow-md text-gray-700 focus-visible:ring-2 ring-black">
<DateInput className="flex flex-1 py-2">
{(segment) => (
<DateSegment
segment={segment}
className="px-0.5 tabular-nums outline-none rounded-sm focus:bg-violet-700 focus:text-white caret-transparent placeholder-shown:italic"
/>
)}
</DateInput>
<Button className="outline-none px-3 flex items-center text-gray-700 transition border-0 border-solid border-l border-l-purple-200 bg-transparent rounded-r-lg pressed:bg-purple-100 focus-visible:ring-2 ring-black">
<ChevronUpDownIcon size="XS" />
</Button>
</Group>
<MyPopover>
<Dialog className="p-6 text-gray-600">
<Calendar>
<header className="flex items-center gap-1 pb-4 px-1 font-serif w-full">
<Heading className="flex-1 font-semibold text-2xl ml-2" />
<RoundButton slot="previous">
<ChevronLeftIcon />
</RoundButton>
<RoundButton slot="next">
<ChevronRightIcon />
</RoundButton>
</header>
<CalendarGrid className="border-spacing-1 border-separate">
<CalendarGridHeader>
{(day) => (
<CalendarHeaderCell className="text-xs text-gray-500 font-semibold">
{day}
</CalendarHeaderCell>
)}
</CalendarGridHeader>
<CalendarGridBody>
{(date) => (
<CalendarCell
date={date}
className="w-9 h-9 outline-none cursor-default rounded-full flex items-center justify-center outside-month:text-gray-300 hover:bg-gray-100 pressed:bg-gray-200 selected:bg-violet-700 selected:text-white focus-visible:ring ring-violet-600/70 ring-offset-2"
/>
)}
</CalendarGridBody>
</CalendarGrid>
</Calendar>
</Dialog>
</MyPopover>
</DatePicker>
</div>
);
}
function RoundButton(props: ButtonProps) {
return (
<Button
{...props}
className="w-9 h-9 outline-none cursor-default bg-transparent text-gray-600 border-0 rounded-full flex items-center justify-center hover:bg-gray-100 pressed:bg-gray-200 focus-visible:ring ring-violet-600/70 ring-offset-2"
/>
);
}
function MyPopover(props: PopoverProps) {
return (
<Popover
{...props}
className={({ isEntering, isExiting }) => `
overflow-auto rounded-lg drop-shadow-lg ring-1 ring-black/10 bg-white
`}
/>
);
}
import {
Button,
Calendar,
CalendarCell,
CalendarGrid,
CalendarGridBody,
CalendarGridHeader,
CalendarHeaderCell,
DateInput,
DatePicker,
DateSegment,
Dialog,
Group,
Heading,
Label,
Popover
} from 'react-aria-components';
import type {
ButtonProps,
PopoverProps
} from 'react-aria-components';
import ChevronUpDownIcon from '@spectrum-icons/workflow/ChevronUpDown';
import ChevronLeftIcon from '@spectrum-icons/workflow/ChevronLeft';
import ChevronRightIcon from '@spectrum-icons/workflow/ChevronRight';
function DatePickerExample() {
return (
<div className="bg-gradient-to-r from-violet-500 to-fuchsia-600 p-12 sm:h-[400px] rounded-lg flex items-start justify-center">
<DatePicker className="group flex flex-col gap-1 w-[200px]">
<Label className="text-white cursor-default">
Date
</Label>
<Group className="flex rounded-lg bg-white/90 focus-within:bg-white group-open:bg-white transition pl-3 shadow-md text-gray-700 focus-visible:ring-2 ring-black">
<DateInput className="flex flex-1 py-2">
{(
segment
) => (
<DateSegment
segment={segment}
className="px-0.5 tabular-nums outline-none rounded-sm focus:bg-violet-700 focus:text-white caret-transparent placeholder-shown:italic"
/>
)}
</DateInput>
<Button className="outline-none px-3 flex items-center text-gray-700 transition border-0 border-solid border-l border-l-purple-200 bg-transparent rounded-r-lg pressed:bg-purple-100 focus-visible:ring-2 ring-black">
<ChevronUpDownIcon size="XS" />
</Button>
</Group>
<MyPopover>
<Dialog className="p-6 text-gray-600">
<Calendar>
<header className="flex items-center gap-1 pb-4 px-1 font-serif w-full">
<Heading className="flex-1 font-semibold text-2xl ml-2" />
<RoundButton slot="previous">
<ChevronLeftIcon />
</RoundButton>
<RoundButton slot="next">
<ChevronRightIcon />
</RoundButton>
</header>
<CalendarGrid className="border-spacing-1 border-separate">
<CalendarGridHeader>
{(day) => (
<CalendarHeaderCell className="text-xs text-gray-500 font-semibold">
{day}
</CalendarHeaderCell>
)}
</CalendarGridHeader>
<CalendarGridBody>
{(date) => (
<CalendarCell
date={date}
className="w-9 h-9 outline-none cursor-default rounded-full flex items-center justify-center outside-month:text-gray-300 hover:bg-gray-100 pressed:bg-gray-200 selected:bg-violet-700 selected:text-white focus-visible:ring ring-violet-600/70 ring-offset-2"
/>
)}
</CalendarGridBody>
</CalendarGrid>
</Calendar>
</Dialog>
</MyPopover>
</DatePicker>
</div>
);
}
function RoundButton(
props: ButtonProps
) {
return (
<Button
{...props}
className="w-9 h-9 outline-none cursor-default bg-transparent text-gray-600 border-0 rounded-full flex items-center justify-center hover:bg-gray-100 pressed:bg-gray-200 focus-visible:ring ring-violet-600/70 ring-offset-2"
/>
);
}
function MyPopover(
props: PopoverProps
) {
return (
<Popover
{...props}
className={(
{
isEntering,
isExiting
}
) => `
overflow-auto rounded-lg drop-shadow-lg ring-1 ring-black/10 bg-white
`}
/>
);
}
Tailwind config#
This example uses the following plugins:
Add them to your tailwind.config.js
:
module.exports = {
// ...
plugins: [
require('tailwindcss-react-aria-components'),
require('tailwindcss-animate')
]
};
module.exports = {
// ...
plugins: [
require('tailwindcss-react-aria-components'),
require('tailwindcss-animate')
]
};
module.exports = {
// ...
plugins: [
require(
'tailwindcss-react-aria-components'
),
require(
'tailwindcss-animate'
)
]
};
Components#
DatePicker
A date picker combines a DateField and a Calendar popover.
DateField
A date field allows a user to enter and edit date values using a keyboard.
Calendar
A calendar allows a user to select a single date from a date grid.
Button
A button allows a user to perform an action.
Popover
A popover displays content in context with a trigger element.
Dialog
A dialog is an overlay shown above other content in an application.