diff --git a/app/components/AppFooter.vue b/app/components/AppFooter.vue
index 6955352350..3548b118aa 100644
--- a/app/components/AppFooter.vue
+++ b/app/components/AppFooter.vue
@@ -20,27 +20,19 @@ const closeModal = () => modalRef.value?.close?.()
-
-
- {{ $t('footer.about') }}
-
-
- {{ $t('footer.blog') }}
-
-
- {{ $t('privacy_policy.title') }}
-
-
- {{ $t('a11y.footer_title') }}
-
-
- {{ $t('translation_status.title') }}
-
+
+
+
+
+ {{
+ $t('footer.product')
+ }}
+ {{ $t('footer.about') }}
+ {{ $t('footer.blog') }}
+ {{ $t('footer.docs') }}
-
-
- {{ $t('footer.docs') }}
-
-
- {{ $t('footer.source') }}
-
-
- {{ $t('footer.social') }}
-
-
- {{ discord.label }}
-
+
+
+
+ {{
+ $t('footer.legal')
+ }}
+ {{ $t('privacy_policy.title') }}
+ {{ $t('a11y.footer_title') }}
+ {{
+ $t('translation_status.title')
+ }}
+
+
+
+
+ {{
+ $t('footer.community')
+ }}
+ {{ $t('footer.source') }}
+ {{ $t('footer.social') }}
+ {{ discord.label }}
diff --git a/i18n/locales/en.json b/i18n/locales/en.json
index 02c1af000f..f1518faec9 100644
--- a/i18n/locales/en.json
+++ b/i18n/locales/en.json
@@ -19,7 +19,10 @@
"social": "social",
"chat": "chat",
"builders_chat": "builders",
- "keyboard_shortcuts": "keyboard shortcuts"
+ "keyboard_shortcuts": "keyboard shortcuts",
+ "product": "Product",
+ "legal": "Legal",
+ "community": "Community"
},
"shortcuts": {
"section": {
diff --git a/i18n/schema.json b/i18n/schema.json
index 885bd6eb5e..acc8bb80ad 100644
--- a/i18n/schema.json
+++ b/i18n/schema.json
@@ -63,6 +63,15 @@
},
"keyboard_shortcuts": {
"type": "string"
+ },
+ "product": {
+ "type": "string"
+ },
+ "legal": {
+ "type": "string"
+ },
+ "community": {
+ "type": "string"
}
},
"additionalProperties": false
diff --git a/test/nuxt/components/AppFooter.spec.ts b/test/nuxt/components/AppFooter.spec.ts
index f799f74235..c2498fffbf 100644
--- a/test/nuxt/components/AppFooter.spec.ts
+++ b/test/nuxt/components/AppFooter.spec.ts
@@ -4,6 +4,31 @@ import AppFooter from '~/components/AppFooter.vue'
/* check nuxt module at modules/build-env.ts */
describe('AppFooter', () => {
+ it('renders three labeled columns: Product, Legal, Community', async () => {
+ const component = await mountSuspended(AppFooter, {
+ route: '/',
+ })
+
+ // All three column label spans should be present
+ const columnLabels = component.findAll('span.tracking-wide')
+ expect(columnLabels.length).toBeGreaterThanOrEqual(3)
+
+ const labelTexts = columnLabels.map(span => span.text().toLowerCase())
+ expect(labelTexts.some(t => t.includes('product'))).toBe(true)
+ expect(labelTexts.some(t => t.includes('legal'))).toBe(true)
+ expect(labelTexts.some(t => t.includes('community'))).toBe(true)
+ })
+
+ it('footer contains links expected in the Product column', async () => {
+ const component = await mountSuspended(AppFooter, {
+ route: '/about',
+ })
+
+ // The Product column should link to /about and /blog
+ const aboutLink = component.find('a[href="/about"]')
+ expect(aboutLink.exists()).toBe(true)
+ })
+
it('BuildEnvironment is properly displayed at settings', async () => {
const buildInfo = useAppConfig().buildInfo
const component = await mountSuspended(AppFooter, {