widgets have a UI state