A month grid to pick a start and an end date.
| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
27 | 28 | 29 | 30 | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 1 | 2 | 3 | 4 | 5 |
Trip: 2026-10-29 → 2026-11-04
Usage
<script lang="ts">
import {
type DateValue,
getLocalTimeZone,
today,
} from "@internationalized/date";
import { RangeCalendar } from "@orochibraru/ui/range-calendar";
const start = today(getLocalTimeZone());
let value = $state<{
start: DateValue | undefined;
end: DateValue | undefined;
}>({
start,
end: start.add({ days: 6 }),
});
</script>
<div class="flex flex-wrap items-start gap-6">
<RangeCalendar bind:value numberOfMonths={2} class="rounded-md border" />
<p class="text-muted-foreground text-sm">
Trip: {value.start?.toString() ?? "…"} → {value.end?.toString() ?? "…"}
</p>
</div>