diff --git a/README.md b/README.md index 92609c8..dded8a3 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,41 @@
Engenheiro da Computação em Garuva-SC: sites, sistemas web e revisão de apps feitos com IA, com contato direto pelo WhatsApp.
- -Site · -Cases · -Currículo · -Quickstart · -Arquitetura · -LinkedIn · -Issues - - - - +[Site](https://evandro.dev.br) · [Cases](https://evandro.dev.br/cases) · [Currículo](https://evandro.dev.br/curriculo) · [LinkedIn](https://www.linkedin.com/in/evandrodevbr/) · [Issues](https://git.evandro.dev.br/evandro/portifolio-evandrodevbr/issues)
|
|
+| **SC Plus Aquicultura** | **AS Serviços** |
+|
|
|
-## 📌 O problema
+Capturas feitas com Chrome headless a partir de deploys de produção do próprio autor. Origem e créditos (inclusive do ícone do WhatsApp) em [`CREDITS.md`](CREDITS.md).
-Pequenos negócios costumam vender e atender por mensagem: o cliente pergunta o preço um a um, o estoque vive em planilha e qualquer mudança no site depende de um desenvolvedor. Este repositório é o site [evandro.dev.br](https://evandro.dev.br), a vitrine de quem resolve isso: projetos entregues, serviços, currículo e um botão de WhatsApp para começar a conversa.
+## O que é
-## ✨ O que faz
+O código do site [evandro.dev.br](https://evandro.dev.br), o portfólio de Evandro Fonseca Junior, engenheiro da computação em Garuva-SC. Pequenos negócios costumam vender e atender por mensagem: o cliente pergunta o preço um a um, o estoque vive em planilha e qualquer mudança no site depende de um desenvolvedor. O site mostra projetos entregues, serviços, currículo e um botão de WhatsApp para começar a conversa.
- Apresenta três ofertas: criação de sites, sistemas web sob medida e revisão de apps feitos com IA (`/ia`).
-- Publica oito cases com stack, entregas e decisões técnicas, cada um em `/cases/
|
|
-| **SC Plus Aquicultura** | **AS Serviços** |
-|
|
|
+O repositório é a referência de como o site funciona, não um template. As decisões que valem conferir:
-Capturas feitas com Chrome headless a partir de deploys de produção do próprio autor. Origem e créditos (inclusive do ícone do WhatsApp) em [`CREDITS.md`](CREDITS.md).
+- **Sem backend.** O formulário de contato abre o `wa.me` com o briefing já preenchido, e o rodapé mantém o contato direto por e-mail; não há API route ativa nem banco.
+- **3D só onde o aparelho aguenta.** O hero e o notebook de projetos em Three.js aparecem só onde o dispositivo comporta; em telas pequenas, com ponteiro `coarse` ou movimento reduzido, o site entrega a versão em HTML estático.
+- **Analytics com consentimento.** O Google Analytics só carrega depois de aceite explícito, e o consentimento pode ser revogado depois (detalhes em `/privacidade`).
+- **Demos externas não derrubam o render.** O estado de cada demo vem de um snapshot versionado; em produção, o render não consulta as demos.
-## 🚀 Quickstart
+Quando não usar: se você procura um template de portfólio. O projeto é pessoal (`"private": true` no `package.json`) e não tem licença publicada.
-| Ferramenta | Versão mínima |
-| --- | --- |
-| Node.js | `22.x` (`engines`) |
-| pnpm | `9.15.9` (`packageManager`) |
-| Chromium | só para `pnpm test:e2e` (Playwright) |
+## Como funciona
-```bash
-corepack pnpm@9.15.9 install --frozen-lockfile
-corepack pnpm@9.15.9 dev # Next.js com Turbopack
-corepack pnpm@9.15.9 build # build de produção
-corepack pnpm@9.15.9 start # serve um build já gerado
-```
-
-A instalação é sempre com `--frozen-lockfile`, igual ao CI e ao Nixpacks.
-
-Não há `.env.example` e nenhuma variável é necessária para rodar localmente. As que o código lê:
-
-| Variável | Obrigatória | Descrição |
-| --- | --- | --- |
-| `NEXT_PUBLIC_GOOGLE_ADS_CONVERSION_LABEL` | Não | Rótulo de conversão do Google Ads; sem ele, nenhum evento de conversão é enviado |
-| `BASE_URL` | Não | Endereço do site testado por `pnpm test:e2e` (padrão `http://localhost:3001`) |
-| `PW_CHROMIUM` | Não | Caminho de um Chromium local para o Playwright, para não baixar o navegador |
-
-> [!IMPORTANT]
-> O Next.js (`16.3.8`) é fixado de propósito: a `16.2.11` mantinha três advisories transitivos de severidade alta, e a `16.3.0` foi a menor versão estável da mesma major que deixou as auditorias sem vulnerabilidades high. Não faça downgrade sem repetir `pnpm audit`.
-
-## 🧱 Arquitetura
-
-```mermaid
-flowchart LR
- A["public/portfolio-data.json"] --> B["lib/portfolio-data.server.ts"]
- S["lib/site-content.ts"] --> E["app/ App Router"]
- C["data/project-health.json"] --> B
- D["scripts/check-projects.mjs"] -->|rename atômico| C
- B --> E
- E --> F["Vercel"]
-```
-
-- O conteúdo vem de `public/portfolio-data.json` e `lib/site-content.ts`; a homepage escolhe os projetos pelo campo `featured`.
-- `data/project-health.json` é um snapshot versionado das demos. Ele só controla o CTA de cada card (disponível, indisponível, desconhecido ou sem demo) e nunca remove um card.
-- Em produção, o render só lê o snapshot e não consulta demos externas. Em desenvolvimento, um snapshot ausente ou com mais de 15 minutos é atualizado em memória.
-- `pnpm check:projects` atualiza o snapshot por rename atômico. Contrato completo em [`docs/project-health.md`](docs/project-health.md).
-- Não há API route ativa.
-
-### CI/CD
-
-Um único workflow, [`.gitea/workflows/ci.yml`](.gitea/workflows/ci.yml), roda em `push`, `pull_request` e `workflow_dispatch`, com permissão `contents: read`. O repositório usa Gitea; por isso não há badge de GitHub Actions.
+1. O conteúdo vem de `public/portfolio-data.json` (lido por `lib/portfolio-data.server.ts`) e de `lib/site-content.ts`; a homepage escolhe os projetos pelo campo `featured`.
+2. `data/project-health.json` é um snapshot versionado das demos. Ele só controla o CTA de cada card (disponível, indisponível, desconhecido ou sem demo) e nunca remove um card.
+3. Em produção, o render só lê o snapshot. Em desenvolvimento, um snapshot ausente ou com mais de 15 minutos é atualizado em memória. `pnpm check:projects` atualiza o arquivo por rename atômico. Contrato completo em [`docs/project-health.md`](docs/project-health.md).
+4. Um único workflow, [`.gitea/workflows/ci.yml`](.gitea/workflows/ci.yml), roda em `push`, `pull_request` e `workflow_dispatch`, com permissão `contents: read`:
| Job | O que roda | Bloqueia o deploy |
-| --- | --- | --- |
+|---|---|---|
| `verify` | Node 22, `pnpm install --frozen-lockfile`, `lint`, `typecheck`, `test -- --runInBand`, `build` | Sim |
| `audit` | `pnpm audit --prod` e `pnpm audit --dev`, ambos com `--audit-level=high` | Não |
| `e2e` | Playwright (Chromium) contra o build de produção na porta 3001; publica `test-results/` | Não |
-| `deploy` | Vercel CLI `61.1.0`; só após `verify`; branch padrão vai para produção, as demais para preview; pull request não publica | n/a |
+| `deploy` | Vercel CLI `61.1.0`, só após `verify`: branch padrão vai para produção, as demais para preview; pull request não publica | n/a |
O deploy usa o secret `VERCEL_TOKEN`; o projeto na Vercel é o nome do repositório, ou a variável `VERCEL_PROJECT`. [`nixpacks.toml`](nixpacks.toml) (`nodejs_22`, `pnpm-9_x`) e [`vercel.json`](vercel.json) (`framework: nextjs`) descrevem o build.