Date Picker
Calendar-based date selection with single date and range options for property bookings.
Date Picker Variants
Single Date Picker
September 2025
Su
Mo
Tu
We
Th
Fr
Sa
Date Range Picker
→
Calendar View
September 2025
Su
Mo
Tu
We
Th
Fr
Sa
Implementation Guide
HTML Structure
<!-- Date Picker -->
<div class="lyd-datepicker">
<input type="text" class="lyd-datepicker-input"
placeholder="Select date" readonly>
<svg class="lyd-datepicker-icon">...</svg>
<div class="lyd-calendar">
<div class="lyd-calendar-header">
<button class="lyd-calendar-nav-btn">‹</button>
<div class="lyd-calendar-title">September 2025</div>
<button class="lyd-calendar-nav-btn">›</button>
</div>
<div class="lyd-calendar-weekdays">
<div class="lyd-calendar-weekday">Su</div>
<!-- ... more weekdays ... -->
</div>
<div class="lyd-calendar-grid">
<button class="lyd-calendar-day">1</button>
<!-- ... more days ... -->
</div>
</div>
</div>
React/Next.js Component
import { useState, useRef, useEffect } from 'react';
interface DatePickerProps {
label?: string;
value?: Date;
onChange?: (date: Date) => void;
minDate?: Date;
maxDate?: Date;
placeholder?: string;
}
export const DatePicker = ({
label,
value,
onChange,
minDate,
maxDate,
placeholder = 'Select date'
}: DatePickerProps) => {
const [isOpen, setIsOpen] = useState(false);
const [selectedDate, setSelectedDate] = useState(value || new Date());
const ref = useRef(null);
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
if (ref.current && !ref.current.contains(event.target as Node)) {
setIsOpen(false);
}
};
document.addEventListener('mousedown', handleClickOutside);
return () => document.removeEventListener('mousedown', handleClickOutside);
}, []);
const formatDate = (date: Date) => {
return date.toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
};
return (
<div className="lyd-input-group">
{label && <label className="lyd-input-label">{label}</label>}
<div className="lyd-datepicker" ref={ref}>
<input
type="text"
className="lyd-datepicker-input"
value={value ? formatDate(value) : ''}
placeholder={placeholder}
readOnly
onClick={() => setIsOpen(!isOpen)}
/>
<svg className="lyd-datepicker-icon" viewBox="0 0 24 24">
<path d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
</svg>
{isOpen && (
<Calendar
selectedDate={selectedDate}
onDateSelect={(date) => {
setSelectedDate(date);
onChange?.(date);
setIsOpen(false);
}}
minDate={minDate}
maxDate={maxDate}
/>
)}
</div>
</div>
);
};
API Reference
| Class | Description |
|---|---|
.lyd-datepicker |
Container for date picker |
.lyd-datepicker-input |
Input field for date display |
.lyd-datepicker-icon |
Calendar icon |
.lyd-calendar |
Calendar dropdown container |
.lyd-calendar-header |
Calendar header with navigation |
.lyd-calendar-grid |
Grid container for days |
.lyd-calendar-day |
Individual day button |
.selected |
Selected date styling |
.today |
Today's date indicator |
.in-range |
Dates within selected range |