<form>
	<div class="field">
		<label for="input">Input</label>
		<input id="input" required="required" aria-describedby="input-message" />
		<div id="input-message" class="message">
			<ul class="validation" role="list">
				<li data-matches="valid">Currently <code>:valid</code></li>
				<li data-matches="invalid">Currently <code>:invalid</code></li>
				<li data-matches="user-valid">Currently <code>:user-valid</code></li>
				<li data-matches="user-invalid">Currently <code>:user-invalid</code></li>
			</ul>
		</div>
	</div>
	<div class="field">
		<label for="select">Select</label>
		<select id="select" required="required" aria-describedby="select-message">
			<option value="">Choose an option</option>
			<option value="1">One</option>
			<option value="2">Two</option>
			<option value="3">Three</option>
		</select>
		<div id="select-message" class="message">
			<ul class="validation" role="list">
				<li data-matches="valid">Currently <code>:valid</code></li>
				<li data-matches="invalid">Currently <code>:invalid</code></li>
				<li data-matches="user-valid">Currently <code>:user-valid</code></li>
				<li data-matches="user-invalid">Currently <code>:user-invalid</code></li>
			</ul>
		</div>
	</div>
	<div class="field">
		<label for="textarea">Textarea</label>
		<textarea id="textarea" required="required" aria-describedby="textarea-message"></textarea>
		<div id="textarea-message" class="message">
			<ul class="validation" role="list">
				<li data-matches="valid">Currently <code>:valid</code></li>
				<li data-matches="invalid">Currently <code>:invalid</code></li>
				<li data-matches="user-valid">Currently <code>:user-valid</code></li>
				<li data-matches="user-invalid">Currently <code>:user-invalid</code></li>
			</ul>
		</div>
	</div>
</form>
@import url("https://fonts.googleapis.com/css2?family=Anybody:ital,wght@0,800;1,700&display=swap");

:root {
	--state-color: black;
	--bg: white;
}

input:user-valid,
select:user-valid,
textarea:user-valid {
	--state-color: green;
	--bg: linear-gradient(45deg in oklch, lime, #02c3ff);
}

input:user-invalid,
select:user-invalid,
textarea:user-invalid {
	--state-color: red;
	--bg: linear-gradient(15deg in oklch, #ea00ff, #ffb472);
}

input,
select,
textarea {
	appearance: none;
	border: 3px solid var(--state-color);
	background: var(--bg);
	border-radius: 0.5rem;
	box-sizing: border-box;
	font: inherit;
	padding: 0.5rem;
	inline-size: 100%;

	&:focus {
		outline: 3px dashed black;
	}
}

body {
	font-family: "Anybody", sans-serif;
	padding: 2rem;
}

External CSS

  1. https://codepen.io/morewry/pen/XWOPbvb/29beabc5634ea4eb363302459df8811c.css

External JavaScript

This Pen doesn't use any external JavaScript resources.