Changelog
Every release of Time Picker, newest first. Breaking changes are flagged.
v1.1.0
15 Sep 2026
Added#
- Fifteen language packs, at
@devix-labs/time-picker/locales: Arabic, Urdu, French, German, Spanish,
Portuguese, Italian, Dutch, Turkish, Russian, Polish, Hindi, Indonesian, Chinese and Japanese.
registerAll() takes all of them; registerStrings('fr', fr) takes one, and a bundler ships only
what you name — 0.3–0.4 KB gzipped each, 3.9 KB for all fifteen. The widget itself carries none of
it.
registerStrings(locale, pack) and stringsFor(locale). Registration is global, so a locale set in
markup — <dx-time-picker locale="ar"> — is translated too. An exact tag beats the language, so
pt-BR can differ from pt.
- A pack also carries the words people type: with French registered,
midi and minuit are times.
The parser's own English list stays underneath, so noon keeps working in a French field, and
strings.words of your own are merged with the pack's rather than replacing them.
- Languages demo: the same picker in all fifteen.
Fixed#
- The panel footer is pinned to the bottom instead of scrolling away with the list. A day of
quarter-hours is ninety-six rows, which put "Now" and "Clear" three thousand pixels down.
Changed#
strings now sits on top of the registered pack rather than on top of English, so replacing one
word no longer gives up the other seventeen.
- The picker grew about 250 bytes gzipped to carry the language registry; the size budgets moved with
it.
v1.0.0
12 Sep 2026
First release.
Added#
- Times that can be taken away:
disabled accepts exact times, [from, to] spans — including ones
that cross midnight — and rules of your own; enabled is the allow-list. Unavailable times stay in
the list, struck through, with a reason a screen reader reads out.
slots, for booking: the list given outright, each row with its own label, note and reason.
- A field that takes what people type: "5pm", "17:30", "1730", "5.30", "530", "5:3", "7h30", "noon",
"now", and Arabic-Indic, Persian, Devanagari, Bengali or full-width digits with ص and م.
- An ambiguous hour resolved by what the picker would accept — in a shop open nine to six, "5" is the
afternoon — and otherwise by the half of the day the field is in.
- A 12- or 24-hour clock taken from the locale through
Intl, not from a flag, with hourCycle to
override it.
- Other clocks:
zones reads the chosen time in each, daylight saving included, and says when it
lands on another day. No date library.
- A range mode that moves you on to the end field, strikes out ends that break
minDuration or
maxDuration, shows the duration, and can run past midnight with overnight.
- A value that cannot drift: seconds since midnight, posted as
HH:mm in a hidden field while the
visible one shows the locale's notation. A value already in the field — value="{{ old('at') }}" —
is read as the starting one, in either notation.
- Keyboard throughout: a
combobox field pointing at a listbox through aria-activedescendant,
arrows that step over unavailable times, Home, End, Page Up, Page Down, Enter and Escape. Tabbing
into the field does not spring the panel open.
- A bottom sheet on small touch screens, with rows a thumb can hit.
- A
columns layout — hours, minutes, seconds and the two halves of the day — chosen automatically
when the steps are fine.
- Now and Clear, an inline mode,
seconds, and a live region for refusals.
- React, Vue, Svelte,
<dx-time> and a CDN build over one DOM core, plus a $.timepicker() adapter
for jquery-timepicker.
- Theming through CSS variables,
classNames on every part, theme: 'auto', a @layer devix
stylesheet, RTL and forced-colors support.
- 9.1 kB gzip, zero dependencies. The core — parsing, formatting, slots and zones — is 2.7 kB on its
own, without the widget.