diff --git a/docs/pages/getting-started/form-controls.md b/docs/pages/getting-started/form-controls.md
index 1d5c74cc7..05ebc9aab 100644
--- a/docs/pages/getting-started/form-controls.md
+++ b/docs/pages/getting-started/form-controls.md
@@ -80,9 +80,20 @@ The form will not be submitted if a required field is incomplete.
```
@@ -134,9 +145,16 @@ To restrict a value to a specific [pattern](https://developer.mozilla.org/en-US/
```
@@ -178,9 +196,16 @@ Some input types will automatically trigger constraints, such as `email` and `ur
```
@@ -224,17 +249,23 @@ To create a custom validation error, pass a non-empty string to the `setCustomVa
const form = document.querySelector('.input-validation-custom');
const input = form.querySelector('sl-input');
- form.addEventListener('submit', event => {
- event.preventDefault();
- alert('All fields are valid!');
- });
+ // Wait for controls to be defined before attaching form listeners
+ await Promise.all([
+ customElements.whenDefined('sl-button'),
+ customElements.whenDefined('sl-input')
+ ]).then(() => {
+ form.addEventListener('submit', event => {
+ event.preventDefault();
+ alert('All fields are valid!');
+ });
- input.addEventListener('sl-input', () => {
- if (input.value === 'shoelace') {
- input.setCustomValidity('');
- } else {
- input.setCustomValidity("Hey, you're supposed to type 'shoelace' before submitting this!");
- }
+ input.addEventListener('sl-input', () => {
+ if (input.value === 'shoelace') {
+ input.setCustomValidity('');
+ } else {
+ input.setCustomValidity("Hey, you're supposed to type 'shoelace' before submitting this!");
+ }
+ });
});
```
@@ -326,9 +357,19 @@ This example demonstrates custom validation styles using `data-user-invalid` and
@@ -417,33 +458,39 @@ To disable the browser's error messages, you need to cancel the `sl-invalid` eve
const form = document.querySelector('.inline-validation');
const nameError = document.querySelector('#name-error');
- // A form control is invalid
- form.addEventListener(
- 'sl-invalid',
- event => {
- // Suppress the browser's constraint validation message
+ // Wait for controls to be defined before attaching form listeners
+ await Promise.all([
+ customElements.whenDefined('sl-button'),
+ customElements.whenDefined('sl-input')
+ ]).then(() => {
+ // A form control is invalid
+ form.addEventListener(
+ 'sl-invalid',
+ event => {
+ // Suppress the browser's constraint validation message
+ event.preventDefault();
+
+ nameError.textContent = `Error: ${event.target.validationMessage}`;
+ nameError.hidden = false;
+
+ event.target.focus();
+ },
+ { capture: true } // you must use capture since sl-invalid doesn't bubble!
+ );
+
+ // Handle form submit
+ form.addEventListener('submit', event => {
event.preventDefault();
+ nameError.hidden = true;
+ nameError.textContent = '';
+ setTimeout(() => alert('All fields are valid'), 50);
+ });
- nameError.textContent = `Error: ${event.target.validationMessage}`;
- nameError.hidden = false;
-
- event.target.focus();
- },
- { capture: true } // you must use capture since sl-invalid doesn't bubble!
- );
-
- // Handle form submit
- form.addEventListener('submit', event => {
- event.preventDefault();
- nameError.hidden = true;
- nameError.textContent = '';
- setTimeout(() => alert('All fields are valid'), 50);
- });
-
- // Handle form reset
- form.addEventListener('reset', event => {
- nameError.hidden = true;
- nameError.textContent = '';
+ // Handle form reset
+ form.addEventListener('reset', event => {
+ nameError.hidden = true;
+ nameError.textContent = '';
+ });
});