feat: component model