add textarea component, move duplicate code into mixins