I am afraid there is no “UI-way of achieving it” so far.
It is super simple inside the code though:
footer.json:
{
"collectionName": "components_global_footers",
"info": {
"displayName": "footer",
"icon": "align-right"
},
"options": {},
"attributes": {
"footerColumns": {
"type": "component",
"repeatable": true,
"component": "shared.footer-columns"
},
"socialNetworks": {
"type": "component",
"repeatable": true,
"component": "shared.social-networks"
},
"button": {
"type": "component",
"repeatable": false,
"component": "shared.button"
},
"label": {
"type": "string"
}
}
}
shared/footer-columns.json:
{
"collectionName": "components_shared_footer_columns",
"info": {
"displayName": "footerColumns",
"icon": "align-justify"
},
"options": {},
"attributes": {
"title": {
"type": "string",
"required": true
},
"links": {
"type": "component",
"repeatable": true,
"component": "shared.link"
}
}
}
Afterwards if you want to deeply populate the nested components you need to use the plugin: strapi-plugin-populate-deep - npm