Form-error feedback primitives (saastarter parity: "invalid fields ring red + shake", "errors clear as you type").
Framework-agnostic — they toggle the SEMANTIC contract (aria-invalid + the .shake class); the LOOK is @suluk/theme
base CSS ([aria-invalid] destructive ring + @keyframes shake). So a hand-written form gets accessible, animated
validation feedback without a component framework.
Form-error feedback primitives (saastarter parity: "invalid fields ring red + shake", "errors clear as you type"). Framework-agnostic — they toggle the SEMANTIC contract (aria-invalid + the .shake class); the LOOK is
@suluk/themebase CSS ([aria-invalid] destructive ring +@keyframesshake). So a hand-written form gets accessible, animated validation feedback without a component framework.