[api] move user rendering to a view
[api] refactor HasAttributes a bit