Este é o meu portfólio pessoal e site profissional. Aqui eu apresento minha trajetória, projetos e experimentos como desenvolvedor e fundador da Monynha Softwares. Este repositório também funciona como um laboratório vivo onde exploro interações modernas, acessibilidade, experiências 3D e boas práticas de front‑end.
Uma experiência imersiva com animações 3D em WebGL, design responsivo e suporte multilíngue (PT, EN, ES, FR).
- Overview
- Setup
- Development
- Testing
- Build
- Deployment
- Language handling
- Contributing
- License / Contact
Este projeto é uma SPA construída com Vite + React + TypeScript, estilizada com Tailwind e shadcn/ui. O conteúdo é orientado por dados a partir de um arquivo cv.json, com backend opcional em Supabase. O pipeline de CI executa lint, testes e build a cada push ou pull request.
A documentação detalhada está disponível em docs/README.md.
- Node.js >= 20.19
- npm >= 9
npm installCrie um arquivo .env conforme descrito na seção de banco de dados.
npm run devnpm run buildnpm run previewnpm run test
npm run lintnpm run dev— servidor de desenvolvimentonpm run build— build de produçãonpm run preview— serve o build localmentenpm run test— testes com Vitest (use--coveragepara cobertura)npm run lint— ESLint + verificação de tipos
Utilizo Vitest para testes unitários, além de alguns scripts auxiliares para validações manuais.
- Executar todos os testes:
npm run test- Com cobertura (usado no CI):
npm run test:coverageOs scripts ficam na pasta tests/ para manter o repositório organizado.
-
Testes de conectividade e Supabase
- Script:
tests/test-connectivity.js - O que faz: valida a conexão com o Supabase, lê dados básicos do schema
portfolio, executa um insert de teste empublic.leads(respeitando RLS) e roda um exemplo de JOIN. - Execução:
- Script:
node .\tests\test-connectivity.jsVariáveis VITE_SUPABASE_URL e VITE_SUPABASE_KEY podem ser sobrescritas via ambiente.
-
Demo de tradução via endpoint público do Google Translate
- Script:
tests/test-free-translation.js - Execução:
- Script:
node .\tests\test-free-translation.jsTambém pode ser executado diretamente no console do navegador.
-
Teste de Edge Function de e‑mail (Supabase)
- Script:
tests/test-edge-function.sh - Execução:
- Script:
chmod +x tests/test-edge-function.sh
./tests/test-edge-function.shNo Windows, utilize WSL ou Git Bash.
- Frontend: React 18 + TypeScript + Vite 7
- Estilos: Tailwind + shadcn/ui
- Estado e async: TanStack Query
- 3D: Three.js / React Three Fiber
- Animações: Framer Motion
- Roteamento: React Router v6
- Testes: Vitest (+ happy-dom)
- CI/CD: GitHub Actions
MS-Portfolio/
├── src/
│ ├── components/ # UI (shadcn + custom)
│ ├── pages/ # Rotas (lazy-loaded)
│ ├── lib/ # Utilitários, cliente Supabase, idiomas
│ ├── hooks/ # Hooks React
│ └── types/ # Tipos TypeScript
├── public/
│ ├── data/ # cv.json (fonte de conteúdo)
│ └── images/ # SVGs acessíveis (com <title>)
└── supabase/
└── migrations/ # Schema e seeds
- Projetos, séries e artes:
public/data/cv.json - Posts (Pensamentos): arquivos Markdown em
public/content/blog/ - Controle de idioma:
src/lib/language.ts - Traduções dinâmicas:
src/lib/translateService.ts(com cache emlocalStorage)
- Edite
public/data/cv.json - Adicione uma miniatura SVG em
public/images/(com<title>) - Referencie no JSON (
"thumbnail": "/images/meu-projeto.svg") - Execute
npm run buildpara validar o bundle
Os posts são escritos em Markdown com frontmatter YAML:
---
title: "Título do Post"
date: "2025-11-02"
author: "Marcelo Santos"
tags: ["tag1", "tag2"]
excerpt: "Resumo curto do post."
---
Conteúdo em Markdown...Depois, adicione o slug ao array BLOG_POSTS em src/lib/markdownLoader.ts e gere o build.
O projeto integra com Supabase, com fallback automático para cv.json caso o backend não esteja disponível.
Crie o arquivo .env:
VITE_SUPABASE_URL=https://seu-projeto.supabase.co
VITE_SUPABASE_KEY=sua-anon-key
VITE_SUPABASE_SCHEMA=portfolioA configuração completa de schema e migrações está documentada em docs/SUPABASE.md.
O banco possui tabelas para perfil, projetos, artes, séries, experiências profissionais, habilidades e contatos. O formulário de contato sempre registra project_source='portfolio' para rastreabilidade.
O conteúdo é originalmente escrito em português. O helper em src/lib/language.ts mantém o atributo <html lang> sincronizado com a preferência do visitante armazenada em localStorage (monynha-lang) e dispara um evento customizado para atualização reativa da interface.
Para adicionar novos idiomas, basta estender a lista de idiomas suportados e fornecer os textos traduzidos.
Issues e pull requests são bem‑vindos. Consulte CONTRIBUTING.md para convenções de commit e instruções de setup local.
MIT. © Marcelo Santos — https://marcelo.monynha.com
Para oportunidades ou dúvidas, entre em contato: mailto:marcelo@monynha.com