Secret
Secret field with a button to show/hide the text for user control.
With error
HTML
<div class="Secret has-error" data-jess="Secret">
<input class="Secret-input" data-role="input" type="password" name="secret" aria-invalid="true">
<button class="Secret-toggle" data-role="toggle" type="button" aria-pressed="false" aria-label="Show secret">
<span data-role="show">Show</span>
<span data-role="hide">Hide</span>
</button>
</div>
CSS
.Secret
{
display: flex;
align-items: stretch;
font-family: var(--jess-font-family);
font-size: var(--jess-font-size);
line-height: var(--jess-line-height);
color: var(--jess-color-text);
border: var(--jess-border-width) solid var(--jess-color-border);
border-radius: var(--jess-border-radius);
background: var(--jess-color-background);
overflow: hidden;
}
.Secret:focus-within
{
border-color: var(--jess-color-border-focus);
outline: 2px solid var(--jess-color-border-focus);
outline-offset: 1px;
}
.Secret-input
{
flex: 1 1 auto;
min-width: 0;
padding: var(--jess-spacing-sm);
border: 0;
background: transparent;
}
.Secret-input:focus
{
outline: none;
}
.Secret-toggle
{
flex: 0 0 auto;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0 var(--jess-spacing-sm);
border-left: var(--jess-border-width) solid var(--jess-color-border);
color: var(--jess-color-muted);
}
.Secret-toggle:hover
{
color: var(--jess-color-text);
}
.Secret [data-role="hide"],
.Secret.is-visible [data-role="show"]
{
display: none;
}
.Secret.is-visible [data-role="hide"]
{
display: block;
}
.Secret.has-error
{
border-color: var(--jess-color-error);
background: var(--jess-color-error-background);
}
JS
export default function Secret(root)
{
if (!root || root.getAttribute("data-mounted") === "true")
{
return;
}
var input = root.querySelector('[data-role="input"]');
var button = root.querySelector('[data-role="toggle"]');
if (!input || !button)
{
return;
}
root.setAttribute("data-mounted", "true");
button.addEventListener("click", function ()
{
var show = input.getAttribute("type") === "password";
input.setAttribute("type", show ? "text" : "password");
root.classList.toggle("is-visible", show);
button.setAttribute("aria-pressed", show ? "true" : "false");
button.setAttribute("aria-label", show ? "Hide secret" : "Show secret");
});
}