navius

Date Range Picker

Two segmented date inputs for a start and an end, a trigger that opens a popover, and a single ordered NaviusDateRange value.

Range: 2026-07-01 / 2026-07-08

Features

  • The endpoints are embedded Date Inputs bound to the start / end side of the shared range, reusing the whole segment brain.
  • The value is a NaviusDateRange (a nullable Start and End), so a range can be partially entered; both endpoints submit ISO under StartName / EndName.
  • The trigger opens a Popover; the range calendar grid itself is delegated to the styled layer (a range-mode calendar), so the brain owns the value, inputs, popover and form submission, not a second calendar engine.
  • Controlled via @bind-Value / @bind-Open, uncontrolled via DefaultValue / DefaultOpen.

Installation

Install the brain, or copy just this primitive in with the CLI.

Anatomy

Import the parts and assemble them. The root renders no DOM of its own; it cascades state through the wrapped popover.

API Reference

NaviusDateRangePicker. Owns the NaviusDateRange value and open state and cascades them. Renders no DOM (wraps a Popover). Value and Open are two-way bindable.

Prop Type Default
Value NaviusDateRange Empty
ValueChanged EventCallback<NaviusDateRange> -
DefaultValue NaviusDateRange Empty
Open bool false
OpenChanged EventCallback<bool> -
DefaultOpen bool false
MinValue DateOnly? -
MaxValue DateOnly? -
Granularity string "day"
Disabled bool false
ReadOnly bool false
Required bool false
Invalid bool false
StartName string? -
EndName string? -
ChildContent RenderFragment? -

NaviusDateRangePickerControl. The labelled group wrapping the endpoints, separator and trigger; hosts the two hidden bubble inputs. Renders a div with role=group.

Prop Type Default
ChildContent RenderFragment? -
…attributes IDictionary<string, object>? -
Data attribute Values
[data-navius-date-range-picker] Present on the group
[data-disabled] Present when disabled
[data-readonly] Present when read-only
[data-invalid] Present when invalid
[data-required] Present when required

NaviusDateRangePickerInput. One endpoint: an embedded Date Input bound to the start or end side (Part). Renders the Date Input group.

Prop Type Default
Part string "start"
…attributes IDictionary<string, object>? -
Data attribute Values
[data-navius-date-range-picker-input] Present on the endpoint input
[data-part] "start" | "end"

NaviusDateRangePickerSeparator. The visual 'to' between the endpoints, hidden from assistive tech. Renders an aria-hidden span.

Prop Type Default
ChildContent RenderFragment? -
…attributes IDictionary<string, object>? -

NaviusDateRangePickerTrigger. The calendar button that opens the popup. Delegates to the Popover trigger. Renders a button.

Prop Type Default
ChildContent RenderFragment? -
…attributes IDictionary<string, object>? -
Data attribute Values
[data-navius-date-range-picker-trigger] Present on the trigger button
[data-popup-open] Present while the popup is open (from the Popover trigger)

NaviusDateRangePickerContent. Portals and anchors the popup (Popover Portal > Positioner > Popup) and hosts the range calendar. The Popup is role=dialog. Renders the popover popup.

Prop Type Default
Side string "bottom"
Align string "start"
SideOffset double 4
ChildContent RenderFragment? -
…attributes IDictionary<string, object>? -
Data attribute Values
[data-navius-date-range-picker-popup] Present on the popup (role=dialog)
[data-open] / [data-closed] Open/closed lifecycle, from the Popover engine
[data-starting-style] / [data-ending-style] Enter/exit animation hooks, from the Popover engine

Accessibility

The control is a role="group" carrying aria-invalid; each endpoint keeps its spinbutton segments (see Date Input). The trigger carries aria-haspopup="dialog" + aria-expanded; the popup is role="dialog". The separator is aria-hidden.