docs: function step( self, animation, now ){
          var style = cy._private.style;
          var properties = animation.properties;
          var params = animation.params;
          var startTime = animation.callTime;
          var percent;
          
          if( animation.duration === 0 ){
            percent = 1;
          } else {
            percent = Math.min(1, (now - startTime)/animation.duration);
          }
  
          if( percent < 0 ){
            percent = 0;
          } else if( percent > 1 ){
            percent = 1;
          }
          
          if( properties.delay == null ){ // then update the position
            var startPos = animation.startPosition;
            var endPos = properties.position;
            var pos = self._private.position;
            if( endPos ){
              if( valid( startPos.x, endPos.x ) ){
                pos.x = ease( startPos.x, endPos.x, percent );
              }
  
              if( valid( startPos.y, endPos.y ) ){
                pos.y = ease( startPos.y, endPos.y, percent );
              }
            }
  
            if( properties.css ){
              var props = $$.style.properties;
              for( var i = 0; i < props.length; i++ ){
                var name = props[i].name;
                var end = properties.css[ name ];
  
                if( end !== undefined ){
                  var start = animation.startStyle[ name ];
                  var easedVal = ease( start, end, percent );
                  
                  style.applyBypass( self, name, easedVal );
                }
              } // for props
            } // if 
          }
          
          if( $$.is.fn(params.step) ){
            params.step.apply( self, [ now ] );
          }
          
          if( percent >= 1 ){
            animation.done = true;
          }
          
          return percent;
        }