Calendar primitive for picking a date range. Soma owns the state
machine (start → preview → end), the keyboard nav, the min/max
constraints (minValue, maxValue,
minDays, maxDays) and the hover-preview
signaling. Eidos paints the cells with distinct
data-range-start / data-range-end /
data-in-range / data-in-preview-range
treatments — the shared partial at
range-calendar.css is consumed by both this standalone
component and by DateRangePicker's popover content.
{#snippet children(_props: RangeCalendarGridRowSnippetProps)}
{#each weekdays as wd, i (i)}
{wd}
{/each}
{/snippet}
{#each month.weeks as week (week[0].toString())}
{#snippet children(_props: RangeCalendarGridRowSnippetProps)}
{#each week as date (date.toString())}
{/each}
{/snippet}
{/each}
{/each}
{/snippet}
trace
{#if trace.length === 0}
click a day to start; hover to preview; click second to commit
{:else}
{#each trace.slice(0, 3) as entry (entry.at)}
{entry.event} · {entry.family}{entry.intent ? ' · ' + entry.intent : ''}{fmtTime(entry.at)}
{/each}
{/if}
range {rangeLabel}
{#if tab === 'live'}
Controls
Soma owns the range state machine, the keyboard navigation, the
min/max constraints and the hover-preview signaling. Eidos adds
variant/size/color cascades.
The sub-parts (Header, Heading,
PrevButton, NextButton,
MonthSelect, YearSelect,
Grid, GridHead, GridBody,
GridRow, HeadCell, Cell,
Day) are pass-throughs to soma — they accept the
headless props from the soma `RangeCalendarXxxProps` types
unchanged. See the morfo table below for the per-part data
contract.
Selectors at src/uix/eidos/components/range-calendar/range-calendar.css.
This file is consumed BOTH by the standalone eidos
<RangeCalendar> and by
<DateRangePicker>'s popover content — the
same [data-range-calendar-*] attrs land in both
environments. The picker recipe only adds scoping overrides
(no chrome, max-content sizing, transparent background).
not-allowed cursor + reduced opacity (+ line-through for unavailable).
{/if}
{#if tab === 'a11y'}
Accessibility
Follows the APG grid pattern
with localized labels for range-start / range-end / in-range
announced via aria-label additions on the relevant
day cells.
Keyboard
Key
Action
ArrowLeft / ArrowRight
Move focus ±1 day.
ArrowUp / ArrowDown
Move focus ±1 week.
PageUp / PageDown
Move focus ±1 month.
Shift+PageUp / Shift+PageDown
Move focus ±1 year.
Home / End
First / last day of the visible week.
Enter / Space
Commit start (first press) or end (second press).
Escape
Cancel the in-progress range; revert to last committed.