ButtonEvent now takes nil state argument for stateless input, like interaction zones