Skip to content
Devix Open Source

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.