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.
Example
Show demo markup
<div class="password-input-or-text-input-div"><input type="password" aria-label="Password" /><button type="button">Show</button></div>
Usage example
<script lang="ts">
import PasswordInputOrTextInputDiv from './PasswordInputOrTextInputDiv.svelte';
let password = $state("");
</script>
<PasswordInputOrTextInputDiv label="Password" bind:value={password} />
Show Svelte source
// In your Svelte component:
import PasswordInputOrTextInputDiv from "lily-design-system-svelte-headless/components/PasswordInputOrTextInputDiv/PasswordInputOrTextInputDiv.svelte";
<PasswordInputOrTextInputDiv>
<!-- content -->
</PasswordInputOrTextInputDiv>
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>
Props
label: string (required) -- accessible name for the password input via aria-label
value: string (default: "") -- current password value; bindable with two-way value binding
showToggle: boolean (default: true) -- whether to render the show/hide toggle button
toggleLabel: string (default: "Show password") -- accessible label for the toggle button
required: boolean (default: false) -- whether the input is required
disabled: boolean (default: false) -- whether the input is disabled
...restProps: unknown -- additional attributes spread onto the wrapper <div>
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 input
aria-label={toggleLabel} -- provides an accessible name for the toggle button
aria-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
type is "password" by default
- Verify
aria-label is set from the label prop
- Verify the toggle button switches the input type between
"password" and "text"
- Verify
aria-pressed on the toggle button reflects the visibility state
- Verify
disabled and required attributes 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
autocomplete to "new-password" for registration forms by overriding via restProps to help password managers distinguish between login and signup flows.
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 the visible state
- Uses reactive state to track password visibility internally
- Supports two-way binding on the
value prop
- The toggle button uses
aria-pressed to indicate the current visibility state
- Includes
autocomplete="current-password" on the input for browser password manager support
- Supports
required and disabled boolean states on the input
- Spreads
restProps onto the wrapper <div> for consumer customization
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/
Canonical contract
Generated from this component's canonical metadata — the machine-checked source the implementations are held to.
Metadata
- Component: password-input-or-text-input-div
- PascalCase: PasswordInputOrTextInputDiv
- Description: an input for entering a password <input type="password"> or text <input type="text"> with show/hide toggle
- Status: beta — implemented and unit-tested in all seven frameworks with an axe-clean demo page; not yet exercised in composed flows
- HTML tag: <div>
- CSS class: .password-input-or-text-input-div
- Interactive: yes
ARIA
aria-label={label} -- provides an accessible name for the password input aria-label={toggleLabel} -- provides an accessible name for the toggle button aria-pressed={visible} -- indicates whether the password is currently visible (on the toggle button)
Keyboard
- Enter/Space on the toggle button: Toggles password visibility between masked and plain text
Props
label: string (required) -- accessible name for the password input via aria-label value: string (default: "") -- current password value; bindable with two-way value binding showToggle: boolean (default: true) -- whether to render the show/hide toggle button toggleLabel: string (default: "Show password") -- accessible label for the toggle button required: boolean (default: false) -- whether the input is required disabled: boolean (default: false) -- whether the input is disabled ...restProps: unknown -- additional attributes spread onto the wrapper <div>