A solution without js would be to use aria-invalid selector like so:
input[aria-invalid="true"] { border-color: #f00; }
in tailwind v4:
<input class="aria-invalid:border-red-500" />