p-pin-code can be integrated into a form in two ways: controlled or uncontrolled, depending on your needs.value property and change event to
keep it in sync with your application logic. This approach is ideal for complex forms or when using a form library. Note
that the component will still always update its internal value automatically when interacted with.<input type="text" />, automatically
managing its own state and including its value in form submissions through the
Attention
p-pin-code does not use a single native input internally. As a result, it lacks access to native
ValidityState
properties and validationMessage, and it cannot display the native validation popover. This means
validation behavior and error display will need to be implemented separately if required.Form section in the
<!doctype html>
<html lang="en" class="scheme-light-dark">
<head>
<title></title>
</head>
<body class="bg-canvas">
<form class="flex flex-col gap-fluid-sm">
<p-pin-code name="myPinCode" label="Some Label"></p-pin-code>
<div class="flex gap-fluid-sm">
<p-button type="submit">Submit</p-button>
<p-button type="reset">Reset</p-button>
</div>
<p-text>Last submitted data: </p-text>
</form>
<script>
const debugElement = document.querySelector('p-text');
const form = document.querySelector('form');
form.addEventListener('submit', (e) => {
e.preventDefault();
const formData = new FormData(e.target);
debugElement.innerText = `Last submitted data: ${Array.from(formData.values()).join() || 'none'}`;
});
</script>
</body>
</html>p-pin-code component also supports copying and pasting a
value and OTP auto-suggestion on mobile.p-pin-code component performs basic validation of the pasted value:p-pin-code attempts to fill the other inputs.1234 into any of the inputs in the example below.<!doctype html>
<html lang="en" class="scheme-light-dark">
<head>
<title></title>
</head>
<body class="bg-canvas">
<p-pin-code label="Some label"></p-pin-code>
<script>
</script>
</body>
</html>label, description or message need markup such as a link. Do not set the corresponding
host property at the same time, because properties take precedence. Named slots only accept
label, description and message, you can also use label-after for content that should appear after the
label but is not part of the label itself, such as an external link or popover.Attention
disabled/loading state, slotted focusable UI elements (e.g. a) will still receive keyboard focus. Add tabindex="-1" to those UI elements.label-after slot is not affected by a disabled/loading state at all.<!doctype html>
<html lang="en" class="scheme-light-dark">
<head>
<title></title>
</head>
<body class="bg-canvas">
<p-pin-code state="error">
<span slot="label" id="some-label-id">
Some label with a
<a href="https://designsystem.porsche.com" class="underline">
link
</a>
and a "label-after" slot.
</span>
<p-popover slot="label-after">
Some Popover content with a
<a href="https://designsystem.porsche.com" class="underline">
link
</a>
.
</p-popover>
<span slot="description" id="some-description-id">
Some description with a
<a href="https://designsystem.porsche.com" class="underline">
link
</a>
.
</span>
<span slot="message" id="some-message-id">
Some error message with a
<a href="https://designsystem.porsche.com" class="underline">
link
</a>
.
</span>
</p-pin-code>
<script>
</script>
</body>
</html>