Building Reactive Interfaces with Event-Driven System Logic