v1.0.0
15 Sep 2026First release.
Added
- A caret that does not jump. The state is the raw string you typed and the field's text is derived from it, so the caret can be stored as "after the nth raw character" and re-rendering cannot move it. Typing into the middle, deleting across a separator and pasting over a selection all keep their position, and the tests assert each one.
- The raw value posted for you: the field's
namemoves to a hidden input carrying the unmasked characters, so a plain form submit sends clean data with no JavaScript of yours involved.postRaw: falseturns it off,rawNameposts both. - Nothing rewritten while a mobile keyboard is composing, so Android and iOS keyboards keep their own buffer intact.
- One routine for typing and pasting, so a value copied in already formatted — or formatted differently — lands correctly.
- Tokens as a map of regular expressions rather than three fixed classes, so
HH:HH:HH:HH:HH:HHwith{ H: /[0-9A-Fa-f]/ }is a MAC address. - Presets for CNIC, NTN, Emirates ID, UAE TRN, Saudi ID, Saudi VAT, Qatar ID, Bahrain CPR, PAN, GSTIN, cards and Amex cards, expiry, CVC, IBAN, dates, times, MAC addresses and hex colours — taking their lengths from the same table Devix Validators checks.
onChangeandonCompletethat do not fire on mount, because a value you passed in is not a change — and a controlled field whose handler runs during its own construction is how a render loop starts.setMask(), which regroups what is already typed instead of emptying the field.- Lazy rendering by default, so an empty field is empty;
lazy: falsewith aplaceholderCharshows the shape up front. - A DOM-free core —
createMask,apply,accept,caretAfter,rawBefore— that runs on a server, for formatting a stored value into a table or a PDF. - React, Vue, Svelte,
<dx-masked-input>and a CDN build over one core. - 2.3 kB gzip, zero dependencies.