Password Input Or Text Input Div
PasswordInputOrTextInputDiv is a headless component that wraps a native <input type="password"> and <input type="text"> element with accessible labelling and an optional toggle button to show or hide the password text. The input automatically includes autocomplete="current-password" for proper browser password manager integration.
This component is useful for login forms, registration forms, account settings, or any interface requiring secure password entry. The show/hide toggle improves usability by letting users verify their input, while the aria-pressed attribute on the toggle button communicates the visibility state to assistive technologies.
Implementation Notes
- Renders a wrapper
<div>containing the password input and an optional toggle button - The input type dynamically switches between
"password"and"text"based on thevisiblestate - Uses reactive state to track password visibility internally
- Supports two-way binding on the
valueprop - The toggle button uses
aria-pressedto indicate the current visibility state - Includes
autocomplete="current-password"on the input for browser password manager support - Supports
requiredanddisabledboolean states on the input - Spreads
restPropsonto the wrapper<div>for consumer customization
Props
label: string (required) -- accessible name for the password input viaaria-labelvalue: string (default:"") -- current password value; bindable with two-wayvaluebindingshowToggle: boolean (default:true) -- whether to render the show/hide toggle buttontoggleLabel: string (default:"Show password") -- accessible label for the toggle buttonrequired: boolean (default:false) -- whether the input is requireddisabled: boolean (default:false) -- whether the input is disabled...restProps: unknown -- additional attributes spread onto the wrapper<div>
Usage
<Field label="Password">
<PasswordInputOrTextInputDiv label="Password" value={value} />
</Field>
<Field label="Create a password">
<Hint>Must be at least 12 characters</Hint>
<PasswordInputOrTextInputDiv
label="Create a password"
toggleLabel="Show password"
value={value}
/>
</Field>
<Field label="Confirm password">
<PasswordInputOrTextInputDiv
label="Confirm password"
toggleLabel="Show password"
value={confirmValue}
/>
</Field>
Keyboard Interactions
- Enter/Space on the toggle button: Toggles password visibility between masked and plain text
ARIA
aria-label={label}-- provides an accessible name for the password inputaria-label={toggleLabel}-- provides an accessible name for the toggle buttonaria-pressed={visible}-- indicates whether the password is currently visible (on the toggle button)
When to Use
- Use when you need a password field with an explicit show/hide toggle button that switches the input type between password and text
- Use when the toggle behaviour needs to be visible as a button alongside the input
- Use for login forms, registration flows, and account settings where users benefit from verifying their password entry
- Use when you want the consumer to have full control over the toggle button styling and positioning
When Not to Use
- Do not use when a standard PasswordInput with built-in show/hide is sufficient
- Do not use for non-password fields -- use TextInput for plain text or PinInputDiv for codes
- Do not use for MFA codes, one-time passwords, or PINs -- use PinInputDiv instead
Headless
The PasswordInputOrTextInputDiv headless component provides a <div> wrapping a native <input> with dynamic type switching between password and text, aria-label for accessible naming, aria-pressed on the toggle button, and autocomplete="current-password". The consumer provides all visual styling for the input, toggle button, and wrapper layout.
Styles
The consumer provides all CSS styling. The component renders with a .password-input-or-text-input-div class for targeting. Common styling includes positioning the toggle button within or beside the input field.
Testing
- Verify the component renders a wrapper
<div>containing an<input>element - Verify the input
typeis"password"by default - Verify
aria-labelis set from thelabelprop - Verify the toggle button switches the input type between
"password"and"text" - Verify
aria-pressedon the toggle button reflects the visibility state - Verify
disabledandrequiredattributes propagate correctly - Verify pass-through attributes are applied to the wrapper
<div>
Advice
- Designers: Position the show/hide toggle button clearly within or beside the input field, using a recognizable eye icon with sufficient contrast.
- Developers: Set
autocompleteto"new-password"for registration forms by overriding viarestPropsto help password managers distinguish between login and signup flows.
Related components
password-input— an input for entering a password with obscured text <input type="password">text-input— a single-line text input field <input type="text">pin-input-div— a series of single-digit inputs for entering a PIN or OTP code
References
- HTML password input: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/password
- WAI-ARIA Button Pattern (toggle): https://www.w3.org/WAI/ARIA/apg/patterns/button/