Date Picker 12

PreviousNext

Travel date picker with departure/return dates and time selection for bookings

Docs
shadcn-studiocomponent

Preview

Loading preview…
registry/new-york/components/date-picker/date-picker-12.tsx
'use client'

import { useState } from 'react'

import { ChevronDownIcon } from 'lucide-react'

import { Button } from '@/registry/new-york/ui/button'
import { Calendar } from '@/registry/new-york/ui/calendar'
import { Input } from '@/registry/new-york/ui/input'
import { Label } from '@/registry/new-york/ui/label'
import { Popover, PopoverContent, PopoverTrigger } from '@/registry/new-york/ui/popover'

const DatePickerRangeAndTimePickerDemo = () => {
  const [openFrom, setOpenFrom] = useState(false)
  const [openTo, setOpenTo] = useState(false)
  const [dateFrom, setDateFrom] = useState<Date | undefined>(new Date('2025-06-18'))
  const [dateTo, setDateTo] = useState<Date | undefined>(new Date('2025-06-25'))

  return (
    <div className='flex w-full max-w-64 min-w-0 flex-col gap-6'>
      <div className='flex gap-4'>
        <div className='flex flex-1 flex-col gap-3'>
          <Label htmlFor='date-from' className='px-1'>
            Departure date
          </Label>
          <Popover open={openFrom} onOpenChange={setOpenFrom}>
            <PopoverTrigger asChild>
              <Button variant='outline' id='date-from' className='w-full justify-between font-normal'>
                {dateFrom
                  ? dateFrom.toLocaleDateString('en-US', {
                      day: '2-digit',
                      month: 'short',
                      year: 'numeric'
                    })
                  : 'Pick a date'}
                <ChevronDownIcon />
              </Button>
            </PopoverTrigger>
            <PopoverContent className='w-auto overflow-hidden p-0' align='start'>
              <Calendar
                mode='single'
                selected={dateFrom}
                onSelect={date => {
                  setDateFrom(date)
                  setOpenFrom(false)
                }}
              />
            </PopoverContent>
          </Popover>
        </div>
        <div className='flex flex-col gap-3'>
          <Label htmlFor='time-from' className='invisible px-1'>
            From
          </Label>
          <Input
            type='time'
            id='time-from'
            step='1'
            defaultValue='09:30:00'
            className='bg-background appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none'
          />
        </div>
      </div>
      <div className='flex gap-4'>
        <div className='flex flex-1 flex-col gap-3'>
          <Label htmlFor='date-to' className='px-1'>
            Return date
          </Label>
          <Popover open={openTo} onOpenChange={setOpenTo}>
            <PopoverTrigger asChild>
              <Button variant='outline' id='date-to' className='w-full justify-between font-normal'>
                {dateTo
                  ? dateTo.toLocaleDateString('en-US', {
                      day: '2-digit',
                      month: 'short',
                      year: 'numeric'
                    })
                  : 'Pick a date'}
                <ChevronDownIcon />
              </Button>
            </PopoverTrigger>
            <PopoverContent className='w-auto overflow-hidden p-0' align='start'>
              <Calendar
                mode='single'
                selected={dateTo}
                captionLayout='dropdown'
                onSelect={date => {
                  setDateTo(date)
                  setOpenTo(false)
                }}
                disabled={dateFrom && { before: dateFrom }}
              />
            </PopoverContent>
          </Popover>
        </div>
        <div className='flex flex-col gap-3'>
          <Label htmlFor='time-to' className='invisible px-1'>
            To
          </Label>
          <Input
            type='time'
            id='time-to'
            step='1'
            defaultValue='18:30:00'
            className='bg-background appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none'
          />
        </div>
      </div>
    </div>
  )
}

export default DatePickerRangeAndTimePickerDemo

Installation

npx shadcn@latest add @shadcn-studio/date-picker-12

Usage

import { DatePicker12 } from "@/components/date-picker-12"
<DatePicker12 />