[feature] make usable as component