This uses the BEM methodology as far as possible in order to keep the code as clean and simple as possible.