Portfólio profissional desenvolvido com Next.js, totalmente internacionalizado e responsivo, seguindo as melhores práticas de desenvolvimento moderno.
- Sobre o Projeto
- Tecnologias
- Funcionalidades
- Estrutura do Projeto
- Pré-requisitos
- Instalação
- Scripts Disponíveis
- Internacionalização (i18n)
- Rotas e Páginas
- Componentes
- Design System
- Desenvolvimento
- Build e Deploy
DevStack é um portfólio profissional moderno que demonstra projetos, habilidades técnicas e experiência profissional. A aplicação foi desenvolvida seguindo princípios de Spec-Driven Development (SDD), garantindo código limpo, manutenível e escalável.
- ✅ Totalmente Internacionalizado - Suporte para 4 idiomas (Inglês, Português BR, Espanhol, Francês)
- ✅ Rotas Localizadas - URLs traduzidas para cada idioma
- ✅ Design Responsivo - Otimizado para mobile, tablet e desktop
- ✅ Performance Otimizada - Utilizando Next.js App Router e otimizações de imagem
- ✅ TypeScript - Tipagem estática para maior segurança e produtividade
- ✅ Tailwind CSS v4 - Estilização moderna e consistente
- Next.js 16.1.1 - Framework React com App Router
- React 19.2.3 - Biblioteca UI
- TypeScript 5 - Superset JavaScript com tipagem
- next-intl 4.7.0 - Internacionalização completa para Next.js
- Tailwind CSS 4 - Framework CSS utility-first
- PostCSS - Processamento de CSS
- clsx - Construção condicional de classes CSS
- lucide-react - Biblioteca de ícones
-
Home/Login (
/loginou/conectar)- Página de autenticação com formulário de login
- Suporte a login com GitHub
- Validação de formulário
-
Sobre (
/aboutou/sobre//a-propos)- Apresentação profissional
- Stack tecnológico
- Estatísticas e experiência
- Download de currículo
-
Projetos (
/projectsou/projetos//proyectos//projets)- Carrossel de projetos com navegação manual
- Cards de projeto com imagem, tecnologias e descrição
- Layout responsivo (1 projeto mobile, até 3 desktop)
- Totalmente internacionalizado
-
Contato (
/contactou/contato//contacto)- Formulário de contato
- Informações de localização
- Mensagens traduzidas
- Header - Navegação principal com seletor de idioma
- Footer - Rodapé com links e informações legais
- ProjectsCarousel - Carrossel responsivo de projetos
- ProjectCard - Card individual de projeto
- Button - Botão reutilizável com variantes
- Input - Campo de entrada de texto
- TextArea - Área de texto multilinha
devstack/
├── app/ # App Router do Next.js
│ ├── [locale]/ # Rotas internacionalizadas
│ │ ├── about/ # Página Sobre
│ │ ├── contact/ # Página Contato
│ │ ├── login/ # Página Login
│ │ ├── projects/ # Página Projetos
│ │ ├── layout.tsx # Layout principal
│ │ └── page.tsx # Página inicial
│ ├── globals.css # Estilos globais e tema
│ └── icon.svg # Ícone da aplicação
│
├── components/ # Componentes React
│ ├── Button.tsx
│ ├── Footer.tsx
│ ├── Header.tsx
│ ├── Input.tsx
│ ├── ProjectCard.tsx
│ ├── ProjectsCarousel.tsx
│ └── TextArea.tsx
│
├── i18n/ # Configuração de internacionalização
│ ├── navigation.ts # Hooks de navegação
│ ├── request.ts # Configuração de requisição
│ └── routing.ts # Configuração de rotas e pathnames
│
├── messages/ # Arquivos de tradução
│ ├── en.json # Inglês
│ ├── pt-BR.json # Português (Brasil)
│ ├── es.json # Espanhol
│ └── fr.json # Francês
│
├── public/ # Arquivos estáticos
│ ├── logo.svg
│ ├── profilePic.png
│ └── ...
│
├── next.config.ts # Configuração do Next.js
├── tailwind.config.ts # Configuração do Tailwind CSS
├── tsconfig.json # Configuração do TypeScript
├── package.json # Dependências e scripts
└── README.md # Este arquivo
Antes de começar, certifique-se de ter instalado:
- Node.js 18.x ou superior
- npm 9.x ou superior (ou yarn/pnpm)
-
Clone o repositório
git clone <url-do-repositorio> cd devstack
-
Instale as dependências
npm install # ou yarn install # ou pnpm install
-
Execute o servidor de desenvolvimento
npm run dev # ou yarn dev # ou pnpm dev
-
Acesse a aplicação
Abra http://localhost:3000 no seu navegador.
A aplicação suporta os seguintes idiomas:
- Inglês:
http://localhost:3000/en - Português BR:
http://localhost:3000/pt-BR - Espanhol:
http://localhost:3000/es - Francês:
http://localhost:3000/fr
- Inglês:
Inicia o servidor de desenvolvimento em modo watch.
- URL:
http://localhost:3000 - Hot reload habilitado
- Erros exibidos no console
Cria uma build de produção otimizada.
- Gera arquivos estáticos otimizados
- Minifica código e assets
- Pronto para deploy
Inicia o servidor de produção (após build).
- Requer
npm run buildantes - Servidor otimizado para produção
Executa o ESLint para verificar qualidade do código.
- Verifica erros e warnings
- Sugere melhorias de código
A aplicação utiliza next-intl para gerenciamento completo de internacionalização.
| Idioma | Código | Status |
|---|---|---|
| Inglês | en |
✅ Completo |
| Português (Brasil) | pt-BR |
✅ Completo |
| Espanhol | es |
✅ Completo |
| Francês | fr |
✅ Completo |
As rotas são traduzidas automaticamente conforme o idioma:
| Rota Base | Inglês | Português BR | Espanhol | Francês |
|---|---|---|---|---|
/login |
/login |
/conectar |
/conectar |
/connecter |
/about |
/about |
/sobre |
/sobre |
/a-propos |
/contact |
/contact |
/contato |
/contacto |
/contact |
/projects |
/projects |
/projetos |
/proyectos |
/projets |
-
Adicione a chave nos arquivos JSON
Edite os arquivos em
messages/:{ "novaChave": { "titulo": "Título", "descricao": "Descrição" } } -
Use no componente
import { useTranslations } from 'next-intl'; const t = useTranslations('novaChave'); return <h1>{t('titulo')}</h1>;
-
Adicione rotas localizadas (se necessário)
Edite
i18n/routing.ts:pathnames: { "/nova-rota": { "en": "/new-route", "pt-BR": "/nova-rota", "es": "/nueva-ruta", "fr": "/nouvelle-route" } }
Todas as rotas estão dentro de app/[locale]/, onde [locale] é o código do idioma.
- Componente:
app/[locale]/login/page.tsx - Descrição: Página de autenticação
- Funcionalidades: Formulário de login, login com GitHub
- Componente:
app/[locale]/about/page.tsx - Descrição: Página sobre o desenvolvedor
- Funcionalidades: Perfil, stack tecnológico, estatísticas
- Componente:
app/[locale]/projects/page.tsx - Descrição: Portfólio de projetos
- Funcionalidades: Carrossel de projetos, cards interativos
- Componente:
app/[locale]/contact/page.tsx - Descrição: Formulário de contato
- Funcionalidades: Envio de mensagens, informações de contato
Navegação principal com:
- Logo e nome da aplicação
- Links de navegação (About, Projects, Contact)
- Seletor de idioma
- Botão "Hire Me"
Props: Nenhuma (usa hooks internos)
Rodapé com:
- Links legais (Privacy Policy, Terms of Service, Help Center)
- Copyright
Props: Nenhuma (usa traduções internas)
Carrossel responsivo de projetos:
- Navegação por botões (anterior/próximo)
- Responsivo: 1 item mobile, até 3 desktop
- Contador de projetos
Props:
{
projects: Project[];
}
type Project = {
id: string;
image: string;
technologies: string[];
description: string;
}Card individual de projeto:
- Imagem do projeto
- Badges de tecnologias
- Descrição do projeto
Props:
{
image: string;
technologies: string[];
description: string;
}Botão reutilizável com variantes.
Campo de entrada de texto.
Área de texto multilinha.
O projeto utiliza variáveis CSS para cores, definidas em app/globals.css:
--background: #0a0c10 /* Fundo principal */
--foreground: #ffffff /* Texto principal */
--surface: #11141b /* Superfícies (cards, etc) */
--primary: #2563eb /* Cor primária (azul) */
--primary-hover: #1d4ed8 /* Hover do primário */
--border: #1e293b /* Bordas */
--muted: #94a3b8 /* Texto secundário */- Fonte Sans: Geist Sans (via Next.js)
- Fonte Mono: Geist Mono (via Next.js)
Utiliza o sistema de espaçamento do Tailwind CSS:
px-6,py-12- Container padrãogap-6,gap-8- Espaçamento entre elementosmax-w-6xl- Largura máxima do container
- Mobile:
< 768px- 1 projeto visível no carrossel - Tablet:
768px - 1023px- 2 projetos visíveis - Desktop:
≥ 1024px- 3 projetos visíveis
- TypeScript: Tipagem estrita habilitada
- Componentes: Funções com PascalCase
- Arquivos: kebab-case para arquivos, PascalCase para componentes
- Hooks: Prefixo
use(ex:useTranslations,useRouter)
'use client'; // Se necessário
import { useTranslations } from 'next-intl';
export function ComponentName() {
const t = useTranslations('namespace');
return (
// JSX
);
}- Crie o arquivo em
components/ComponentName.tsx - Exporte como função nomeada
- Use TypeScript para tipagem
- Adicione traduções se necessário
- Documente props e uso
npm run buildIsso irá:
- Otimizar todos os assets
- Gerar páginas estáticas quando possível
- Minificar código JavaScript e CSS
- Criar bundle otimizado
Este projeto é privado e proprietário.