DRY: use is_visual util consistently