custom component without composer