Promotes the safe 1.5.0-beta.2 code without functional changes. Everything in this release is backwards-compatible: no public type changes and no behavior changes beyond the bug fixes below. Two beta.1 experiments are deliberately excluded — the iOS native-selection workaround (the thin native selection artifact remains a known cosmetic limitation) and the onComplete type narrowing, which returns in 2.0.0 as a documented breaking change.
- fix(input): reserve the password manager badge gutter only where it fits
- fix(input): disable spellcheck by default
- fix(input): feature-detect
ResizeObserverbefore observing - fix(input): use a 16px fallback until
--root-heightresolves, preventing iOS focus zoom - fix(input): clear pending synchronization timeouts on unmount
- feat(input): add a
nonceprop for Content-Security-Policy support - fix(input): guard the input reference used by the
selectionchangelistener - fix(input): opt the container out of browser translation
- fix(input): report cosmetic CSS rule failures as warnings instead of errors
- docs: document the stable iOS selection behavior and its cosmetic limitation
Safe release candidate for 1.5.0. This release withdraws the experimental iOS native-selection workaround from 1.5.0-beta.1 after compatibility review. The edit menu, paste, typing, selection and focus behavior return to the proven 1.4.x implementation; the thin native selection artifact remains a known iOS limitation.
It also withdraws the onComplete type narrowing from 1.5.0-beta.1. Although type-level only, it can fail compilation of existing handlers typed with extra or non-string parameters (a common example is passing react-hook-form's handleSubmit(onSubmit) directly), which makes it a breaking change under semver. It will return in 2.0.0 with a documented migration path.
- revert(input): withdraw the experimental iOS native-selection workaround from 1.5.0-beta.1
- revert(types): withdraw the
onCompletenarrowing from 1.5.0-beta.1, deferring it to 2.0.0 - docs: align the mobile and edge-case documentation with the stable candidate
- test: verify focus, typing, editing, deletion, paste, Select All → Paste and the native edit menu on iOS 18.0 and 26.5 simulators
Deprecated experimental release. It introduced an iOS native-selection workaround that moved and scaled the underlying input, and narrowed the onComplete type in a way that can break compilation of existing apps. Both were withdrawn in 1.5.0-beta.2 and are not planned for 1.5.0 stable. Existing installs remain reproducible, but new beta users should use 1.5.0-beta.2 or later.
Prepared but not published. Its safe changes are included in 1.5.0-beta.2.
- fix(input): reserve the password manager badge gutter only where it fits
- Once a badge was detected, the input grew 40px past the container to push the badge off the last slot — and the only guard was the distance to the viewport's right edge. Inside a constrained scroll container (a card, a modal) that overhang registered as scrollable overflow: a horizontal scrollbar appeared and shifted the whole layout. The space check now measures the nearest ancestor that constrains horizontal overflow (scroll containers,
overflow: hidden/clipancestors, the container itself, and the real viewport width) and skips the push when the gutter doesn't fit; the badge then stays over the last slot, exactly as withpushPasswordManagerStrategy="none". Nothing is ever clipped, so extensions keep rendering their badges.
- Once a badge was detected, the input grew 40px past the container to push the badge off the last slot — and the only guard was the distance to the viewport's right edge. Inside a constrained scroll container (a card, a modal) that overhang registered as scrollable overflow: a horizontal scrollbar appeared and shifted the whole layout. The space check now measures the nearest ancestor that constrains horizontal overflow (scroll containers,
- fix(input): disable spellcheck by default
- Browsers would mark a filled code as a spelling error and underline it.
spellChecknow defaults tofalse; passing your ownspellCheckprop still overrides it.
- Browsers would mark a filled code as a spelling error and underline it.
- fix(input): feature-detect ResizeObserver before observing
- Browsers without
ResizeObserver(e.g. iOS Safari <13.4) crashed on mount. When the observer is unavailable, the root height is now simply measured once on mount.
- Browsers without
- fix(input): fall back to 16px font-size until
--root-heightresolves- Before the variable is set, the invisible input inherited its font-size — and when that inherited size was under 16px, iOS Safari zoomed the whole page on focus or back-navigation.
- fix(input): clear pending sync timeouts on unmount
- The autofill/selection sync timeouts could fire after unmount, causing state updates on an unmounted component — noisy
act()warnings and flaky CI test runs.
- The autofill/selection sync timeouts could fire after unmount, causing state updates on an unmounted component — noisy
- feat(input): add
nonceprop- Applied to the
<style>tag the library injects, so astyle-srcContent-Security-Policy that requires nonces no longer blocks it.
- Applied to the
- fix(input): use the guarded input reference inside the selectionchange listener
- Fixes a
null is not an object (evaluating 'setSelectionRange')crash when the listener fired while the ref was already null.
- Fixes a
- fix(input): opt the container out of browser translation
- Chrome's translator rewrote the slots' text nodes (wrapping them in
<font>elements), crashing React on the next re-render — easiest to hit with alphanumeric codes under an active page translation. The container now carriestranslate="no"; a one-time code is never meaningful to translate.
- Chrome's translator rewrote the slots' text nodes (wrapping them in
- fix(input): log CSS rule insertion failures as warnings, not errors
- Some environments reject individual cosmetic selectors (
:autofillin older Android WebViews, for instance). Nothing breaks when that happens, but theconsole.errorwas captured by Sentry and similar tools as if the application had failed. Same message, warning level.
- Some environments reject individual cosmetic selectors (
chore(types): narrowonCompleteto(value: string) => unknown- Withdrawn in 1.5.0-beta.2: the narrowing fails compilation of handlers typed with extra or non-string parameters, so it is a breaking change. Deferred to 2.0.0.