diff --git a/web-next/app/[locale]/account/page.tsx b/web-next/app/[locale]/account/page.tsx
index 83d7986..a4a0a23 100644
--- a/web-next/app/[locale]/account/page.tsx
+++ b/web-next/app/[locale]/account/page.tsx
@@ -1,7 +1,7 @@
import { getTranslations, setRequestLocale } from 'next-intl/server'
import { redirect } from '@/i18n/navigation'
import { getSession } from '@/lib/session'
-import { LogoutButton } from './LogoutButton'
+import { LogoutButton } from '@/components/LogoutButton'
export const dynamic = 'force-dynamic'
diff --git a/web-next/app/[locale]/layout.tsx b/web-next/app/[locale]/layout.tsx
index 3d37230..b86092b 100644
--- a/web-next/app/[locale]/layout.tsx
+++ b/web-next/app/[locale]/layout.tsx
@@ -3,6 +3,8 @@ import { notFound } from 'next/navigation'
import { NextIntlClientProvider, hasLocale } from 'next-intl'
import { getTranslations, setRequestLocale } from 'next-intl/server'
import { routing } from '@/i18n/routing'
+import { Header } from '@/components/Header'
+import { Footer } from '@/components/Footer'
import '../globals.css'
export function generateStaticParams() {
@@ -44,8 +46,12 @@ export default async function LocaleLayout({
return (
-
- {children}
+
+
+
+ {children}
+
+
)
diff --git a/web-next/components/Footer.tsx b/web-next/components/Footer.tsx
new file mode 100644
index 0000000..5efd429
--- /dev/null
+++ b/web-next/components/Footer.tsx
@@ -0,0 +1,10 @@
+export function Footer() {
+ const year = 2026 // TODO: sustituir por año dinámico cuando haya fuente de fecha
+ return (
+
+ )
+}
diff --git a/web-next/components/Header.tsx b/web-next/components/Header.tsx
new file mode 100644
index 0000000..6d8c264
--- /dev/null
+++ b/web-next/components/Header.tsx
@@ -0,0 +1,47 @@
+import { getTranslations } from 'next-intl/server'
+import { Link } from '@/i18n/navigation'
+import { getSession } from '@/lib/session'
+import { LanguageSwitcher } from './LanguageSwitcher'
+import { LogoutButton } from './LogoutButton'
+
+export async function Header() {
+ const t = await getTranslations('Nav')
+ const session = await getSession()
+ const loggedIn = Boolean(session.username)
+
+ return (
+
+ )
+}
diff --git a/web-next/components/LanguageSwitcher.tsx b/web-next/components/LanguageSwitcher.tsx
new file mode 100644
index 0000000..36d9414
--- /dev/null
+++ b/web-next/components/LanguageSwitcher.tsx
@@ -0,0 +1,28 @@
+'use client'
+
+import { useLocale } from 'next-intl'
+import { usePathname, useRouter } from '@/i18n/navigation'
+import { routing } from '@/i18n/routing'
+
+const LABELS: Record = { es: 'ES', en: 'EN' }
+
+export function LanguageSwitcher() {
+ const locale = useLocale()
+ const pathname = usePathname() // sin prefijo de idioma
+ const router = useRouter()
+
+ return (
+
+ )
+}
diff --git a/web-next/app/[locale]/account/LogoutButton.tsx b/web-next/components/LogoutButton.tsx
similarity index 65%
rename from web-next/app/[locale]/account/LogoutButton.tsx
rename to web-next/components/LogoutButton.tsx
index 8b36c09..aa3bcd7 100644
--- a/web-next/app/[locale]/account/LogoutButton.tsx
+++ b/web-next/components/LogoutButton.tsx
@@ -4,8 +4,8 @@ import { useState } from 'react'
import { useTranslations } from 'next-intl'
import { useRouter } from '@/i18n/navigation'
-export function LogoutButton() {
- const t = useTranslations('Account')
+export function LogoutButton({ className }: { className?: string }) {
+ const t = useTranslations('Nav')
const router = useRouter()
const [busy, setBusy] = useState(false)
@@ -17,11 +17,7 @@ export function LogoutButton() {
}
return (
-