Este repositório contém o código-fonte do meu portfólio pessoal, um projeto desenvolvido para demonstrar minhas habilidades em desenvolvimento front-end moderno, consumo de APIs e design de interface.
O projeto é especial pois é totalmente dinâmico: ele se popula automaticamente buscando e exibindo meus dados de usuário e repositórios diretamente da GitHub API em tempo real.
Este projeto foi construído com uma stack moderna e robusta:
- React: Biblioteca principal para a construção da interface de usuário.
- TypeScript: Adicionado para garantir robustez, tipagem estática e maior manutenibilidade do código, especialmente ao lidar com estruturas de dados complexas da API (interfaces
RepositoryeUser). - APIs Web Nativas: Utilização do
fetchpara consumo assíncrono das APIs do GitHub. - Estilização via JS (Inline/CSS-in-JS like): Demonstração de uma abordagem de estilo programático e componentizado, onde todas as regras de layout e design estão definidas diretamente no arquivo JavaScript.
O objetivo principal deste projeto era criar uma experiência de portfólio que fosse ao mesmo tempo elegante e técnica, evidenciando o uso de boas práticas e recursos avançados do React e TypeScript.
A funcionalidade central do portfólio é a comunicação com o GitHub.
- Endpoint: São feitas duas chamadas de API:
https://api.github.com/users/rickferrdev(Dados do usuário)https://api.github.com/users/rickferrdev/repos?per_page=100(Lista de repositórios)
- Gerenciamento de Estado: O hook
useState(comuser,repos, eloading) e o hookuseEffectsão utilizados para gerenciar o ciclo de vida da busca de dados e o estado de carregamento. - Assincronicidade: A função
fetchDatautilizaPromise.allpara buscar os dados de usuário e repositórios em paralelo, otimizando o tempo de carregamento inicial.
A utilização de TypeScript foi crucial para definir as estruturas de dados esperadas da API do GitHub.
- Interfaces: As interfaces
RepositoryeUserdefinem claramente os campos esperados (e seus tipos, comostring,number,boolean,null) garantindo que o código que consome esses dados esteja seguro e auto-documentado.
O código está modularizado em componentes e funções auxiliares:
- Componente Principal (
Portfolio): Gerencia o estado e orquestra a renderização das diferentes seções (Hero e Projetos). - Componente de Cartão de Repositório: Cada projeto (
<a>no grid) é uma unidade visual, com lógica de estilo e hover encapsulada. - Ícones e Funções Auxiliares:
- Ícones SVG: Os ícones (
MapPinIcon,LinkIcon, etc.) são implementados como componentes React, tornando-os fáceis de usar e estilizar. - Função
getLanguageColor: Mapeia a linguagem de programação (repo.language) para uma cor específica, que é usada para estilizar o título e o indicador de cor no cartão, um toque visual que reforça a tecnologia principal de cada projeto.
- Ícones SVG: Os ícones (
- Componente
Badge: Exibe informações de status de forma consistente (ex: "Open to Work").
- Filtragem de Repositórios: A função de ordenação filtra forks (
.filter((repo) => !repo.fork)) e ordena os projetos pelo número de estrelas (.sort((a, b) => b.stargazers_count - a.stargazers_count)), garantindo que os projetos mais relevantes e de autoria própria sejam exibidos primeiro. - Estilização Dinâmica: A cor do título do cartão do projeto é definida dinamicamente com base na linguagem principal (
langColor), criando um visual coeso e informativo. - Acessibilidade e Usabilidade: O uso de tags semânticas (
<header>,<main>,<footer>,<a>) e atributos (target="_blank",rel="noreferrer") contribui para uma melhor acessibilidade e usabilidade.
Embora este seja um projeto de portfólio hospedado, você pode configurá-lo localmente:
- Clone o repositório:
git clone https://github.com/rickferrdev/exuberant-night cd exuberant-night - Instale as dependências:
npm install
- Execute o projeto:
npm dev
- O projeto estará acessível em
http://localhost:3000(ou porta similar, dependendo da sua configuração).