Как это устроено
Нативные атрибуты:
<input type="email" required minlength="3" pattern=".+@.+" />
Браузер покажет ошибки при submit. Для UX добавьте JS-валидацию и сообщения, связанные через aria-describedby. novalidate на form отключает натив.
Итог: required/type/pattern + доступные сообщения; сервер всё равно проверяет снова.