1- 'use client'
2-
3- import { useTranslations } from 'next-intl'
1+ import { getTranslations } from 'next-intl/server'
42import { Link } from '@/i18n/navigation'
53import LanguageSwitcher from './controls/LanguageSwitcher'
6- import { useTheme } from './ThemeProvider '
4+ import ThemeSwitcher from './controls/ThemeSwitcher '
75
86// Footer link list component to reduce code duplication
97interface FooterLinkListProps {
@@ -19,19 +17,11 @@ function FooterLinkList({ title, links }: FooterLinkListProps) {
1917 { links . map ( item => (
2018 < li key = { item . href } >
2119 { item . isExternal ? (
22- < a
23- href = { item . href }
24- target = "_blank"
25- rel = "noopener noreferrer"
26- className = "text-sm text-[var(--color-text-secondary)] hover:text-[var(--color-text)] transition-colors font-light"
27- >
20+ < a href = { item . href } target = "_blank" rel = "noopener noreferrer" className = "footer-link" >
2821 { item . label }
2922 </ a >
3023 ) : (
31- < Link
32- href = { item . href }
33- className = "text-sm text-[var(--color-text-secondary)] hover:text-[var(--color-text)] transition-colors font-light"
34- >
24+ < Link href = { item . href } className = "footer-link" >
3525 { item . label }
3626 </ Link >
3727 ) }
@@ -42,12 +32,11 @@ function FooterLinkList({ title, links }: FooterLinkListProps) {
4232 )
4333}
4434
45- function Footer ( ) {
46- const { theme, toggleTheme } = useTheme ( )
47- const tFooter = useTranslations ( 'footer' )
48- const tCommunity = useTranslations ( 'community' )
49- const tStacks = useTranslations ( 'stacks' )
50- const tNav = useTranslations ( 'header' )
35+ export default async function Footer ( ) {
36+ const tFooter = await getTranslations ( 'footer' )
37+ const tCommunity = await getTranslations ( 'community' )
38+ const tStacks = await getTranslations ( 'stacks' )
39+ const tHeader = await getTranslations ( 'header' )
5140
5241 // Define link arrays (static hrefs, only labels depend on translations)
5342 const resourceLinks = [
@@ -60,9 +49,9 @@ function Footer() {
6049 ]
6150
6251 const documentationLinks = [
63- { href : '/docs' , label : tNav ( 'docs' ) } ,
64- { href : '/articles' , label : tNav ( 'articles' ) } ,
65- { href : '/curated-collections' , label : tNav ( 'curatedCollections' ) } ,
52+ { href : '/docs' , label : tFooter ( 'docs' ) } ,
53+ { href : '/articles' , label : tFooter ( 'articles' ) } ,
54+ { href : '/curated-collections' , label : tFooter ( 'curatedCollections' ) } ,
6655 { href : '/#faq' , label : tFooter ( 'faq' ) } ,
6756 ]
6857
@@ -89,20 +78,13 @@ function Footer() {
8978 < div className = "max-w-8xl mx-auto px-[var(--spacing-md)]" >
9079 < div className = "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-9 gap-[var(--spacing-lg)] mb-[var(--spacing-lg)]" >
9180 < div className = "flex flex-col gap-[var(--spacing-sm)] lg:col-span-3" >
92- < span className = "text-sm font-semibold tracking-tight" > { tFooter ( 'aicodingstack ') } </ span >
81+ < span className = "text-sm font-semibold tracking-tight" > { tHeader ( 'aiCodingStack ') } </ span >
9382 < p className = "text-sm pb-[var(--spacing-sm)] leading-[1.8] text-[var(--color-text-secondary)] font-light" >
9483 { tFooter ( 'tagline' ) }
9584 < span className = "block mt-[var(--spacing-sm)]" > { tFooter ( 'openSource' ) } </ span >
9685 </ p >
9786 < div className = "flex gap-[var(--spacing-xs)]" >
98- < button
99- type = "button"
100- onClick = { toggleTheme }
101- className = "inline-block w-auto px-[var(--spacing-sm)] py-[var(--spacing-xs)] border border-[var(--color-border)] hover:bg-[var(--color-hover)] transition-colors text-xs font-light tracking-tight text-left"
102- aria-label = { tFooter ( 'toggleTheme' ) }
103- >
104- { theme === 'light' ? `◐ ${ tFooter ( 'darkMode' ) } ` : `◑ ${ tFooter ( 'lightMode' ) } ` }
105- </ button >
87+ < ThemeSwitcher />
10688 < LanguageSwitcher />
10789 </ div >
10890 </ div >
@@ -123,5 +105,3 @@ function Footer() {
123105 </ footer >
124106 )
125107}
126-
127- export default Footer
0 commit comments