Component

**This is a WIP, please don't merge yet.**

Currently three tests fail, mainly handling `null` content.