<swd-pin-field></swd-pin-field>
The length of the field can be customized via the length attribute/property (default to 5).
<swd-pin-field length="3"></swd-pin-field>
The validation can be handled by a string of allowed chars (attribute), a regex (property), or a function (property).
Only numbers:
<swd-pin-field validate="0123456789"></swd-pin-field>
Resolved keys can be formatted with the format prop.
All uppercase:
<swd-pin-field id="field"></swd-pin-field>
const field = document.getElementById("field");
field.format = key => key.toUpperCase();
change: when the code changescomplete: when the code is completeresolve: when a key passes the validatorreject: when a key does not pass the validator
<swd-pin-field id="field"></swd-pin-field>
const field = document.getElementById("field");
field.addEventListener("change", evt => alert(`PIN Field changed: ${evt.detail.value}`));
field.addEventListener("complete", evt => alert(`PIN Field completed: ${evt.detail.value}`));
field.addEventListener("resolve", evt => alert(`PIN Field key resolved: ${evt.detail.key}`));
field.addEventListener("reject", evt => alert(`PIN Field key resolved: ${evt.detail.key}`));
The field can be customized with the class and style attributes. Standard validation
pseudo-classes :valid and :invalid can also be used. Since there is no
:complete pseudo-classe, the field exposes a custom attribute completed to match with
disabled.
<swd-pin-field
class="pin-field"
type="password"
autocapitalize="off"
autocorrect="off"
autocomplete="off"
inputmode="text"
></swd-pin-field>
.pin-field {
background-color: rgb(248, 249, 250);
border: 1px solid rgb(204, 204, 204);
border-radius: 0.3rem;
font-size: 2rem;
margin: 0.25rem;
height: 3.5rem;
outline: none;
text-align: center;
transition-duration: 250ms;
transition-property: background, color, border, box-shadow, transform;
width: 3rem;
}
.pin-field:focus {
border-color: rgb(0, 123, 255);
outline: none;
transform: scale(1.05);
}
.pin-field:invalid {
animation: shake 3 linear 75ms;
border-color: rgb(220, 53, 69);
box-shadow: 0 0 0.25rem rgba(220, 53, 69, 0.5);
}
swd-pin-field[completed] .pin-field {
border-color: rgb(40, 167, 69);
background-color: rgba(40, 167, 69, 0.25);
}
@keyframes shake {
from {
transform: scale(1.05) translateY(-5%);
}
to {
transform: scale(1.05) translateY(5%);
}
}