Segmented range input with an attached range calendar popover. Soma owns the two
endpoints, min/max validation, popover state and range selection; Eidos only adds the
visual size, variant and color recipe.
{#snippet children({ segments }: DateRangePickerInputSnippetProps)}
{#each segments as { part, value }, index (`start-${part}-${index}`)}
{value}
{/each}
{/snippet}
to
{#snippet children({ segments }: DateRangePickerInputSnippetProps)}
{#each segments as { part, value }, index (`end-${part}-${index}`)}
{value}
{/each}
{/snippet}
trace
{#if trace.length === 0}
open the picker and select a range
{:else}
{#each trace.slice(0, 3) as entry}
{entry.event} - {entry.family}{entry.intent ? ' - ' + entry.intent : ''}{fmtTime(entry.at)}
{/each}
{/if}
open {String(open)}
range
{valueLabel}
{#if tab === 'live'}
Controls
soma owns value, min/max dates, range
length, disabled/unavailable dates and popover behavior.
eidos owns visual treatment.
soma props - range value and constraints
eidos props - visual treatment
Demo content
somaheadless - shared range, field, popover and calendarsvelte
{somaSnippet}
eidosvisual - root plus attached field, popover and range-calendar partssvelte
{eidosSnippet}
{/if}
{#if tab === 'api'}
API reference
DateRangePicker is a composition over DateRangeField, Popover and RangeCalendar. Air
has no local DateRangePicker; Terra in morfo-runtime is the historical baseline.
Prop
Owner
Default
Description
value bindable
soma
undefined
Range {'{ start, end }'} shared by both inputs and calendar.
placeholder bindable
soma
today
Visible month anchor.
open bindable
soma
false
Popover state.
minValue / maxValue
soma
-
Selectable date bounds. Invalid pairs mark the range calendar invalid and log through UIX.
Top heading shows full range; each visible month gets its own title only when there are 2 months.
{/if}
{#if tab === 'morfo'}
morfo contract
Source: src/uix/morfo/components/date-range-picker.ts. The picker
declares only the composition root, trigger and calendar bridge; DateRangeField,
RangeCalendar and Popover keep their own contracts.
The public picker is a composition. Its event surface is the union of range calendar
selection/navigation events, popover disclosure events and any field commit events.
Owner
Events
Responsibility
DateRangePicker
{dateRangePickerEvents.length}
Root state and composition.
DateRangeField
{dateRangeFieldEvents.length}
Endpoint field commits.
RangeCalendar
{rangeCalendarEvents.length}
Start selection, range commit, clear and calendar navigation.
Popover
{popoverCompiled.actions.byName.size}
Disclosure events.
Composed event declarations
Owner
Name
Family
Verb
Sequence
Intent
{#each eventRows as { owner, action }}
{@const intentDecl = 'intent' in action.semantic ? action.semantic.intent : undefined}
Selectors live in src/uix/eidos/components/date-range-picker/date-range-picker.css.
The field and trigger use DateField tokens; the popup range grid mirrors Calendar
without drawing a nested card.