The web-nuxt footer is manifest-driven. Edit apps/web-nuxt/zship.app.json and keep the footer content inside the top-level footer object.
Do not hardcode footer copy, links, or legal text in LandingFooter.vue. The component should only render siteConfig.footer.
Footer fields
{
"footer": {
"brandDisplay": "logo-and-site-name",
"contactEmail": "support@example.com",
"description": [
{
"en": "Short product promise for the footer.",
"zh-CN": "Localized footer promise."
}
],
"sections": [
{
"titleKey": "footer_section_product",
"items": [
{
"labelKey": "nav_pricing",
"to": "/pricing"
}
]
}
],
"copyright": "(c) {year} {siteName}"
}
}
Field reference
brandDisplay: controls brand rendering. Uselogo-and-site-name,logo-only, orsite-name-only.contactEmail: footer-specific email. Set it to an empty string to hide the email row.description: one or more footer description lines. Use localized objects when the public site supports multiple locales.sections: navigation columns. Each section usestitleKeyorlabel, and each item useslabelKeyorlabelplusto.disclaimer: legal or trademark text shown in the bottom row.copyright: bottom-left copyright text. It supports{year},{siteName}, and{brandName}tokens.
Launch checklist
- Confirm
footer.descriptionno longer references the template if the product has been renamed. - Confirm
footer.contactEmailreaches a real support mailbox. - Confirm every footer route exists.
- Confirm external links open the expected brand accounts.
- Confirm
footer.disclaimermatches your legal and trademark policy.