Password input
Password input is a UI element designed to securely and confidentially capture a user’s password.
On this page
- Password input v1.2.0
Overview
Password input is a UI element designed to securely and confidentially capture a user’s password.
Password input feature enhances privacy by replacing characters with dots as they are typed. It also includes usability features like the option to show or hide the password and helper text to assist with password creation.
A password input is a specific configuration of the text input. It uses a .text-input wrapper to create a textual form field with OUDS styles, then wraps a pair of <input class="text-input-field"> and <label> elements in .text-input-container. Note that the <label> must come before the <input>.
A placeholder attribute is required on each <input> as our CSS-only floating label implementation relies on the :placeholder-shown pseudo-element to detect when the input is empty.
You will need to write some additional JavaScript code to make the show/hide password button work properly: change the icon and the input type to display the password. You can find a live example with JavaScript below.
Enter a password with at least 8 characters (without the DEV- prefix).
Enter a password with at least 8 characters
Enter a password with at least 8 characters
Enter a password with at least 8 characters (without the DEV- prefix).
Password must be at least 8 characters (without the DEV- prefix).
Enter a password with at least 8 characters (without the DEV- prefix).
Password must be at least 8 characters (without the DEV- prefix).
<div class="text-input mb-medium">
<div class="text-input-container">
<label for="inputPassword">Password</label>
<input type="password" id="inputPassword" class="text-input-field" placeholder=" ">
<button class="btn btn-minimal btn-icon" type="button" aria-pressed="false">
<svg aria-hidden="true">
<use xlink:href="/orange-compact/docs/1.1/assets/img/ouds-web-sprite.svg#accessibility-vision"/>
</svg>
<span class="visually-hidden">Show password</span>
</button>
</div>
</div>
<div class="text-input mb-medium">
<div class="text-input-container">
<svg aria-hidden="true">
<use xlink:href="/orange-compact/docs/1.1/assets/img/ouds-web-sprite.svg#lock-closed"/>
</svg>
<label for="inputPasswordIcon">Password</label>
<input type="password" id="inputPasswordIcon" class="text-input-field" placeholder="Minimum 8 characters">
<button class="btn btn-minimal btn-icon" type="button" aria-pressed="false">
<svg aria-hidden="true">
<use xlink:href="/orange-compact/docs/1.1/assets/img/ouds-web-sprite.svg#accessibility-vision"/>
</svg>
<span class="visually-hidden">Show password</span>
</button>
</div>
</div>
<div class="text-input mb-medium">
<div class="text-input-container">
<svg aria-hidden="true">
<use xlink:href="/orange-compact/docs/1.1/assets/img/ouds-web-sprite.svg#lock-closed"/>
</svg>
<label for="inputPasswordPrefix">Password</label>
<div class="input-container" data-bs-prefix="DEV-">
<input type="password" id="inputPasswordPrefix" aria-describedby="inputPasswordPrefixHelper" class="text-input-field" placeholder=" ">
</div>
<button class="btn btn-minimal btn-icon" type="button" aria-pressed="false">
<svg aria-hidden="true">
<use xlink:href="/orange-compact/docs/1.1/assets/img/ouds-web-sprite.svg#accessibility-vision"/>
</svg>
<span class="visually-hidden">Show password</span>
</button>
</div>
<p id="inputPasswordPrefixHelper" class="helper-text">Enter a password with at least 8 characters (without the DEV- prefix).</p>
</div>
<div class="text-input mb-medium">
<div class="text-input-container text-input-container-outlined">
<svg aria-hidden="true">
<use xlink:href="/orange-compact/docs/1.1/assets/img/ouds-web-sprite.svg#lock-closed"/>
</svg>
<label for="inputPasswordOutlined">Password</label>
<input type="password" id="inputPasswordOutlined" aria-describedby="inputPasswordOutlinedHelper" class="text-input-field" placeholder=" ">
<button class="btn btn-minimal btn-icon" type="button" aria-pressed="false">
<svg aria-hidden="true">
<use xlink:href="/orange-compact/docs/1.1/assets/img/ouds-web-sprite.svg#accessibility-vision"/>
</svg>
<span class="visually-hidden">Show password</span>
</button>
</div>
<p id="inputPasswordOutlinedHelper" class="helper-text">Enter a password with at least 8 characters</p>
</div>
<div class="text-input mb-medium">
<div class="text-input-container text-input-container-outlined">
<svg aria-hidden="true">
<use xlink:href="/orange-compact/docs/1.1/assets/img/ouds-web-sprite.svg#lock-closed"/>
</svg>
<label for="inputPasswordOutlinedValue">Password</label>
<input type="password" id="inputPasswordOutlinedValue" aria-describedby="inputPasswordOutlinedValueHelper" class="text-input-field" placeholder=" " value="My$ecureP@ssw0rd">
<button class="btn btn-minimal btn-icon" type="button" aria-pressed="false">
<svg aria-hidden="true">
<use xlink:href="/orange-compact/docs/1.1/assets/img/ouds-web-sprite.svg#accessibility-vision"/>
</svg>
<span class="visually-hidden">Show password</span>
</button>
</div>
<p id="inputPasswordOutlinedValueHelper" class="helper-text">Enter a password with at least 8 characters</p>
</div>
<div class="text-input mb-medium">
<div class="text-input-container">
<label for="inputPasswordInvalid">Password</label>
<div class="input-container" data-bs-prefix="DEV-">
<input type="password" id="inputPasswordInvalid" class="text-input-field is-invalid" aria-describedby="inputPasswordInvalidError" placeholder=" " value="12345">
</div>
<button class="btn btn-minimal btn-icon" type="button" aria-pressed="false">
<svg aria-hidden="true">
<use xlink:href="/orange-compact/docs/1.1/assets/img/ouds-web-sprite.svg#accessibility-vision"/>
</svg>
<span class="visually-hidden">Show password</span>
</button>
</div>
<p id="inputPasswordInvalidHelper" class="helper-text">Enter a password with at least 8 characters (without the DEV- prefix).</p>
<p id="inputPasswordInvalidError" class="error-text">Password must be at least 8 characters (without the DEV- prefix).</p>
</div>
<div class="text-input">
<div class="text-input-container text-input-container-outlined">
<svg aria-hidden="true">
<use xlink:href="/orange-compact/docs/1.1/assets/img/ouds-web-sprite.svg#lock-closed"/>
</svg>
<label for="inputPasswordOutlinedInvalid">Password</label>
<div class="input-container" data-bs-prefix="DEV-">
<input type="password" id="inputPasswordOutlinedInvalid" class="text-input-field is-invalid" aria-describedby="inputPasswordOutlinedInvalidError" placeholder=" " value="12345">
</div>
<button class="btn btn-minimal btn-icon" type="button" aria-pressed="false">
<svg aria-hidden="true">
<use xlink:href="/orange-compact/docs/1.1/assets/img/ouds-web-sprite.svg#accessibility-vision"/>
</svg>
<span class="visually-hidden">Show password</span>
</button>
</div>
<p id="inputPasswordOutlinedInvalidHelper" class="helper-text">Enter a password with at least 8 characters (without the DEV- prefix).</p>
<p id="inputPasswordOutlinedInvalidError" class="error-text">Password must be at least 8 characters (without the DEV- prefix).</p>
</div> JavaScript
Live example
Find here an example of how to implement a password input with a show password button, show / hide the password value and manage the button icon and label, in an accessible way.
<div id="liveShowPasswordExample" class="text-input component-max-width">
<div class="text-input-container">
<label for="liveInputPassword">Password</label>
<input type="password" id="liveInputPassword" class="text-input-field" placeholder=" ">
<button class="btn btn-minimal btn-icon" id="togglePassword" type="button" aria-pressed="false">
<svg aria-hidden="true">
<use xlink:href="/orange-compact/docs/1.1/assets/img/ouds-web-sprite.svg#accessibility-vision"/>
</svg>
<span class="visually-hidden">Show password</span>
</button>
</div>
</div> // Toggle password visibility
const togglePasswordButton = document.querySelector('#liveShowPasswordExample #togglePassword')
if (togglePasswordButton) {
const passwordInput = document.querySelector('#liveShowPasswordExample #liveInputPassword')
const iconUse = togglePasswordButton.querySelector('use')
const visuallyHiddenText = togglePasswordButton.querySelector('.visually-hidden')
togglePasswordButton.addEventListener('click', event => {
event.preventDefault()
// Toggle the type attribute to make the password visible or hidden
const type = passwordInput.getAttribute('type') === 'password' ? 'text' : 'password'
passwordInput.setAttribute('type', type)
// Toggle the icon, the visually-hidden text for accessibility reasons
if (type === 'text') {
iconUse.setAttribute('xlink:href', iconUse.getAttribute('xlink:href').replace('accessibility-vision', 'hide'))
visuallyHiddenText.textContent = 'Hide password'
togglePasswordButton.setAttribute('aria-pressed', 'true')
} else {
iconUse.setAttribute('xlink:href', iconUse.getAttribute('xlink:href').replace('hide', 'accessibility-vision'))
visuallyHiddenText.textContent = 'Show password'
togglePasswordButton.setAttribute('aria-pressed', 'false')
}
})
}