Tessera UI

Date Picker

A button-triggered date picker popover built on Calendar and Base UI Popover. Supports single, range, and multiple selection, preset shortcuts, stacked or sidebar preset layouts, footer slot, and min/max constraints.

Installation

pnpm add @tessinaui/ui react-day-picker

Usage

import { DatePicker, createRangePresets } from "@tessinaui/ui";
{/* Single date */}
<DatePicker mode="single" selected={date} onSelect={setDate} />

{/* Date + time range with Apply button */}
<DatePicker
  mode="range"
  selected={range}
  onSelect={setRange}
  showDateTime
  showTimezone
  onApply={({ start, startTime, end, endTime }) => console.log({ start, startTime, end, endTime })}
/>

{/* Date range with presets sidebar */}
<DatePicker
  mode="range"
  selected={range}
  onSelect={setRange}
  presets={createRangePresets()}
  presetsPosition="left"
  numberOfMonths={2}
/>

Playground

Preview
Loading...

Showcase

Preview
Loading...

API Reference

DatePicker props

Selection

PropTypeDefaultDescription
mode"single" | "range" | "multiple""single"Selection mode
selectedDate | DateRange | Date[]Controlled selection value
onSelect(value) => voidCalled when selection changes

Trigger

PropTypeDefaultDescription
placeholderstring"Pick a date"Label shown when nothing is selected
triggerVariantButtonProps["variant"]"outline"Trigger button variant
triggerSizeButtonProps["size"]"sm"Trigger button size
triggerClassNamestringExtra classes for the trigger (e.g. "w-56")

Calendar options

PropTypeDefaultDescription
size"sm" | "md" | "lg""md"Calendar cell size
numberOfMonthsnumber1Months shown inside the popover
showWeekNumberbooleanfalseShow ISO week numbers
showOutsideDaysbooleantrueShow adjacent month days
fixedWeeksbooleanfalseAlways render 6 rows
fromDateDateEarliest selectable date
toDateDateLatest selectable date
disabledMatcher | Matcher[]Disable specific dates
defaultMonthDateDefault visible month

Date & time

PropTypeDefaultDescription
showDateTimebooleanfalseShow built-in Start/End date inputs, time inputs, and Apply button below the calendar
onApply(data: DateTimeApplyData) => voidCalled when the Apply button is clicked
showTimezonebooleanfalseShow the detected local timezone below the Apply button
interface DateTimeApplyData {
  start?: Date;
  startTime?: string; // "HH:MM"
  end?: Date;
  endTime?: string;   // "HH:MM"
}

Presets

PropTypeDefaultDescription
presetsPresetItem[]List of preset shortcuts
presetsPosition"left" | "top""left""left" renders a sidebar; "top" renders pill chips above the calendar

Layout

PropTypeDefaultDescription
footerReactNodeSlot rendered below the calendar (e.g. apply/clear buttons)
rounded"none" | "sm" | "md" | "lg" | "xl" | "full""lg"Popover border radius
align"start" | "center" | "end""start"Popover horizontal alignment relative to trigger
side"bottom" | "top" | "left" | "right""bottom"Popover side
dir"ltr" | "rtl""ltr"Text direction — RTL flips nav arrows and calendar layout
classNamestringAdded to the outer wrapper <div>

PresetItem type

interface PresetItem {
  label: string;
  getValue: () => Date | DateRange;
}

Built-in preset helpers

import { createSinglePresets, createRangePresets } from "@tessinaui/ui";

// Single: Today, Yesterday, Last week
const singlePresets = createSinglePresets();

// Range: Today, Yesterday, Last 7 days, Last 30 days, Last 3 months
const rangePresets = createRangePresets();

DateRange type

import type { DateRange } from "@tessinaui/ui";

interface DateRange {
  from: Date | undefined;
  to?: Date | undefined;
}

On this page