Closes #8: Input validation component