Usage
TimePicker from @prepared911/ui-calendar is a thin wrapper around @prepared911/ui-core Input with type="time". It accepts HH:MM strings, exposes an optional tailIcon (defaults to a clock glyph), and renders a Label unless hideLabel is true. Use it for any same-day clock value—a meeting start, a reminder at 4pm, or the lower / upper bound of a TimeRangePicker.
For matched start / end pairs with optional maxRange enforcement, use TimeRangePicker (same package) which composes two TimePickers via TimeRangeInputs.
<input type="time"> gives platform-accessible pickers for free.TimeRangeInputs / TimeRangePicker. When the consuming surface renders a start / end pair, use the range variants rather than a handwritten pair of TimePickers.DateTimePicker / AdvancedDateTimeRangePicker. These compose TimePicker internally; you rarely need it standalone when the date is part of the value.Input or a dedicated duration control: "90 minutes" is not a time of day.DateTimePicker so the two fields stay coordinated.AdvancedDateTimeRangePicker.TimePicker. Single field with id, value (HH:MM), onChange(string), optional label, hideLabel, and tailIcon.TimeRangePicker. Self-contained start / end pair with optional maxRange (in hours). Default values are 00:00 and 23:59.TimeRangeInputs. The primitive the range picker uses; reach for it when the parent already owns controlled strings and wants layout control (see CustomTimeRangePopoverContent in dispatch).maxRange (range variants). Caps the span in hours; the component clamps the end when the start moves so the range can never exceed maxRange.tailIcon. Override the default SVGAsset.Time when the field needs a product-specific glyph.hideLabel. Drop the visible label when the surrounding layout supplies it externally; the field still uses label for the accessible name.Do
TimePicker with a visible label or an external Label via id: native time inputs do not carry an implicit name.TimePickers together; TimeRangeInputs enforces maxRange and keeps the en-dash separator consistent.Don't
TimePicker for a duration ("90 minutes") or a timestamp: it's a time of day, not an interval or an instant.aria-label / label: screen readers need the accessible name.TimePickers bound to the same state; use a range variant.Native <input type="time"> inherits the platform picker and keyboard semantics. The app is responsible for the visible label and for distinguishing start / end in speech when a range is rendered. See the Accessibility page for the full contract.