Refactor component hierarchy, add attributes to AbstractHtmlElement