An interactive date picker with single, range, and multiple selection modes. Supports min/max constraints, unavailable dates, a "Today" shortcut, and Livewire binding via wire:model.
Single-date selection by default. Click a day to select it; click again to deselect. Returns a Y-m-d string.
<x-ui::calendar name="date" />
Set mode="range" to select a start and end date. Hover between clicks to preview the range band. Returns start/end.
<x-ui::calendar mode="range" name="period" />
Set mode="multiple" to pick any number of individual dates. Returns a comma-separated Y-m-d string.
<x-ui::calendar mode="multiple" name="dates" />
Three cell sizes to match the density of your layout.
Small
Medium
Large
<x-ui::calendar size="sm" />
<x-ui::calendar size="md" />
<x-ui::calendar size="lg" />
Use min, max, and unavailable to restrict which dates can be selected. min="today" is a convenience shorthand.
min="today"
Unavailable dates
{{-- Only today and future --}}
<x-ui::calendar min="today" />
{{-- Within the next 30 days --}}
<x-ui::calendar
min="today"
:max="now()->addDays(30)->format('Y-m-d')"
/>
{{-- Block specific dates --}}
<x-ui::calendar
min="today"
unavailable="2026-05-12,2026-05-19,2026-05-26"
/>
Bind with wire:model. The hidden input dispatches input and change events on every selection so the Livewire property stays in sync.
Single
wire:model value
—
Range
wire:model value
—
Multiple
wire:model value
—
// Livewire component
public string $single = '';
public string $range = '';
public string $multiple = '';
// Template — single
<x-ui::calendar wire:model="single" />
// Template — range
<x-ui::calendar mode="range" wire:model="range" />
// Template — multiple
<x-ui::calendar mode="multiple" wire:model="multiple" />
Add with-today to show a "Today" shortcut below the grid — clicking it jumps to the current month and selects today's date.
<x-ui::calendar with-today />
Add the disabled attribute to render the calendar as read-only — all interaction is blocked and the calendar renders at reduced opacity.
<x-ui::calendar
value="{{ now()->format('Y-m-d') }}"
disabled
/>