feat: initialize frontend with Next.js, Tailwind CSS, and internationalization support
- Added package.json for project dependencies and scripts - Configured PostCSS with Tailwind CSS - Created global styles and theme context for dark mode support - Implemented layout and routing for internationalization using next-intl - Developed main components: Header, Footer, Hero, About, Skills, Projects, Contact - Added language switcher and contact form with validation - Created project card component to display project details - Set up localization files for English and Portuguese - Configured Tailwind CSS for styling and responsive design - Added favicon and logo assets
This commit is contained in:
58
frontend/src/app/(i18n)/[locale]/layout.tsx
Normal file
58
frontend/src/app/(i18n)/[locale]/layout.tsx
Normal file
@@ -0,0 +1,58 @@
|
||||
import { Inter } from "next/font/google";
|
||||
import Header from "@/app/components/Header"; // Usando o Header que forneci
|
||||
import Footer from "@/app/components/Footer";
|
||||
import "@/app/globals.css"; // Importando o CSS global
|
||||
|
||||
// Importações importantes do next-intl
|
||||
import {hasLocale, Locale, NextIntlClientProvider} from 'next-intl';
|
||||
import { ThemeProvider } from "@/configuration/ThemeContext";
|
||||
import {getTranslations, setRequestLocale} from 'next-intl/server';
|
||||
import { ReactNode } from "react";
|
||||
import { routing } from "@/i18n/routing";
|
||||
import { notFound } from "next/navigation";
|
||||
|
||||
const inter = Inter({ subsets: ["latin"] });
|
||||
|
||||
type Props = {
|
||||
children: ReactNode;
|
||||
params: Promise<{locale: Locale}>;
|
||||
};
|
||||
|
||||
export function generateStaticParams() {
|
||||
return routing.locales.map((locale) => ({locale}));
|
||||
}
|
||||
|
||||
export async function generateMetadata(props: Omit<Props, 'children'>) {
|
||||
const {locale} = await props.params;
|
||||
const t = await getTranslations({locale, namespace: 'metadata'});
|
||||
|
||||
return {
|
||||
title: t('home_title'),
|
||||
description: t('home_description')
|
||||
};
|
||||
}
|
||||
|
||||
export default async function RootLayout({children, params}: Props) {
|
||||
const {locale} = await params;
|
||||
if (!hasLocale(routing.locales, locale)) {
|
||||
notFound();
|
||||
}
|
||||
|
||||
setRequestLocale(locale);
|
||||
|
||||
return (
|
||||
<html lang={locale} className="scroll-smooth">
|
||||
<body className={`${inter.className} bg-background text-text-primary`}>
|
||||
<ThemeProvider>
|
||||
<NextIntlClientProvider locale={locale}>
|
||||
<Header />
|
||||
<main className="flex flex-col items-center">
|
||||
{children}
|
||||
</main>
|
||||
<Footer />
|
||||
</NextIntlClientProvider>
|
||||
</ThemeProvider>
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user