Accessibility
DateInput is a Prepared-styled field (@prepared911/ui-core Input) wrapped in a Popover that opens a DatePicker. The field and popover manage the usual input / trigger a11y; the underlying grid ships react-day-picker's semantics. The app owns the visible label, the short tooltip copy when showTooltip is enabled, and any Apply-time announcement of the committed value.
Input reads id + label and creates a labeled input. placeholder is styling, not a name.Popover sets aria-expanded on the trigger, opens on focus / click, and closes on Escape or outside click with focus returned to the trigger.react-day-picker roles carry through (role="grid", arrow-key navigation, aria-selected, aria-disabled).showTooltip is true, hovering the field renders a short tooltip with the formatted value. The tooltip is opened via @prepared911/ui-core Tooltip which uses Radix semantics.cta). @prepared911/ui-core Buttons: focusable, activatable by Enter / Space.label, or pair id with an external Label. Placeholder text is not an accessible name.Popover behavior returns focus to the field on Escape or outside click. When a programmatic onApply closes the popover, restore focus yourself (see Focus management).showTooltip is enabled, keep tooltip text short: it is not a label substitute.tailIconButton).DatePicker (Up / Down by week, Left / Right by day, Home / End within a week).cta) activates the button.<input> via @prepared911/ui-core Input; the associated Label provides the accessible name.tailIconButton, when provided). @prepared911/ui-core IconButton with a required title / aria-label.Popover wraps the calendar content; the trigger exposes aria-expanded.role="grid" from react-day-picker.DateInput opens the popover on field focus and restores focus on Escape. Programmatic closes after Apply need a deliberate restore—otherwise keyboard operators land at the document root.
DateInput inside another overlay with its own focus management (a Drawer, Modal), coordinate onOpenChange so the overlay doesn't close when the date popover does.