AngularJS widget framework