docs(readme): redesenha o README com hero em SVG [skip ci]
This commit is contained in:
1 parent
558c3d5b48
commit
8e5d548598
2 files changed
+128
-127
No files matched your search
@@ -1,59 +1,16 @@
|
||||
<div align="center">
|
||||
|
||||
<img src="public/edev_logo.svg" width="110" alt="Logo do Evandro.dev.br">
|
||||
<img src="assets/readme/hero.svg" width="100%" alt="evandro.dev.br: o portfólio de Evandro Fonseca Junior, com o índice dos nove cases publicados e o estado de cada um">
|
||||
|
||||
<h1>Evandro Fonseca Junior</h1>
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
<p><strong>Engenheiro da Computação em Garuva-SC: sites, sistemas web e revisão de apps feitos com IA, com contato direto pelo WhatsApp.</strong></p>
|
||||
|
||||
<a href="https://evandro.dev.br">Site</a> ·
|
||||
<a href="https://evandro.dev.br/cases">Cases</a> ·
|
||||
<a href="https://evandro.dev.br/curriculo">Currículo</a> ·
|
||||
<a href="#-quickstart">Quickstart</a> ·
|
||||
<a href="#-arquitetura">Arquitetura</a> ·
|
||||
<a href="https://www.linkedin.com/in/evandrodevbr/">LinkedIn</a> ·
|
||||
<a href="https://git.evandro.dev.br/evandro/portifolio-evandrodevbr/issues">Issues</a>
|
||||
|
||||

|
||||

|
||||

|
||||
[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)
|
||||
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
## 📌 O problema
|
||||
|
||||
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 faz
|
||||
|
||||
- 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/<id>`.
|
||||
- Detalha seis serviços em `/servicos/*`, com escopo e etapas visíveis e a parte técnica em `<details>`.
|
||||
- Serve o currículo em HTML e o PDF em `/Profile.pdf`.
|
||||
- Abre o `wa.me` com o briefing já preenchido a partir do formulário de contato; não há backend de formulário.
|
||||
- Mostra o hero e o notebook de projetos em 3D (Three.js) só onde o dispositivo comporta; nos demais, entrega HTML estático.
|
||||
- Carrega Google Analytics somente depois de aceite explícito, e permite revogar o consentimento depois.
|
||||
- Gera `sitemap.xml`, `robots.txt`, manifest, imagens Open Graph e dados estruturados JSON-LD.
|
||||
|
||||
### Cases publicados
|
||||
|
||||
Fonte: `public/portfolio-data.json` e `lib/site-content.ts` (os mesmos oito ids).
|
||||
|
||||
| Case | O que é | Estado | Demo |
|
||||
| --- | --- | --- | --- |
|
||||
| [`sev-modaintima`](https://evandro.dev.br/cases/sev-modaintima) | SEV Moda Íntima: catálogo digital e loja virtual, pedido pelo WhatsApp e painel de estoque | Em produção | [sevmodaintima.com.br](https://sevmodaintima.com.br) |
|
||||
| [`lavacao-047`](https://evandro.dev.br/cases/lavacao-047) | Lavação 047: site e painel para lavação automotiva em Garuva-SC, o dono edita preços, textos e fotos | Em produção | [landing-page-lavacao047.vercel.app](https://landing-page-lavacao047.vercel.app) |
|
||||
| [`nutriscan`](https://evandro.dev.br/cases/nutriscan) | NutriScan: consulta de produtos por nome e código de barras | Em produção | [nutriscan.evandro.dev.br](https://nutriscan.evandro.dev.br) |
|
||||
| [`twins-lab`](https://evandro.dev.br/cases/twins-lab) | Twins Lab: painel ao vivo de um reator simulado | Protótipo | sem demo |
|
||||
| [`reddit-explorer`](https://evandro.dev.br/cases/reddit-explorer) | Reddit Posts Explorer: posts de um fórum de IA, filtrados por período | Concluído | sem demo |
|
||||
| [`sc-plus`](https://evandro.dev.br/cases/sc-plus) | SC Plus Aquicultura: site institucional com áreas, projetos e contato | Concluído | [scplus.evandro.dev.br](https://scplus.evandro.dev.br) |
|
||||
| [`gcc-installer`](https://evandro.dev.br/cases/gcc-installer) | MinGW GCC Installer: instalador do compilador GCC para Windows | Concluído | sem demo |
|
||||
| [`as-servicos`](https://evandro.dev.br/cases/as-servicos) | AS Serviços: site institucional com cena 3D | Concluído | sem demo |
|
||||
|
||||
## 🖼️ Demonstração
|
||||
|
||||
| SEV Moda Íntima | NutriScan |
|
||||
|---|---|
|
||||
| <img src="./public/assets/prints/print-sev.png" width="380" alt="Site da SEV Moda Íntima"> | <img src="./public/assets/prints/print-nutriscan.png" width="380" alt="NutriScan"> |
|
||||
@@ -62,72 +19,66 @@ Fonte: `public/portfolio-data.json` e `lib/site-content.ts` (os mesmos oito ids)
|
||||
|
||||
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).
|
||||
|
||||
## 🚀 Quickstart
|
||||
## O que é
|
||||
|
||||
| Ferramenta | Versão mínima |
|
||||
| --- | --- |
|
||||
| Node.js | `22.x` (`engines`) |
|
||||
| pnpm | `9.15.9` (`packageManager`) |
|
||||
| Chromium | só para `pnpm test:e2e` (Playwright) |
|
||||
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.
|
||||
|
||||
```bash
|
||||
corepack [email protected] install --frozen-lockfile
|
||||
corepack [email protected] dev # Next.js com Turbopack
|
||||
corepack [email protected] build # build de produção
|
||||
corepack [email protected] start # serve um build já gerado
|
||||
```
|
||||
- Apresenta três ofertas: criação de sites, sistemas web sob medida e revisão de apps feitos com IA (`/ia`).
|
||||
- Publica nove cases com stack, entregas e decisões técnicas, cada um em `/cases/<id>`.
|
||||
- Detalha seis serviços em `/servicos/*`, com escopo e etapas visíveis e a parte técnica em `<details>`.
|
||||
- Serve o currículo em HTML e o PDF em `/Profile.pdf`.
|
||||
- Gera `sitemap.xml`, `robots.txt`, manifest, imagens Open Graph e dados estruturados JSON-LD.
|
||||
|
||||
A instalação é sempre com `--frozen-lockfile`, igual ao CI e ao Nixpacks.
|
||||
### Cases publicados
|
||||
|
||||
Não há `.env.example` e nenhuma variável é necessária para rodar localmente. As que o código lê:
|
||||
Fonte: `public/portfolio-data.json` e `lib/site-content.ts` (os mesmos nove ids).
|
||||
|
||||
| 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 |
|
||||
| Case | O que é | Estado | Demo |
|
||||
|---|---|---|---|
|
||||
| [`julia-beauty`](https://evandro.dev.br/cases/julia-beauty) | Julia Beauty: site de estúdio de extensão de cílios em Camboriú, com simulador de efeito e SEO local | Em produção | [juliabeauty.com.br](https://juliabeauty.com.br) |
|
||||
| [`sev-modaintima`](https://evandro.dev.br/cases/sev-modaintima) | SEV Moda Íntima: catálogo digital e loja virtual, pedido pelo WhatsApp e painel de estoque | Em produção | [sevmodaintima.com.br](https://sevmodaintima.com.br) |
|
||||
| [`lavacao-047`](https://evandro.dev.br/cases/lavacao-047) | Lavação 047: site e painel para lavação automotiva em Garuva-SC, o dono edita preços, textos e fotos | Em produção | [landing-page-lavacao047.vercel.app](https://landing-page-lavacao047.vercel.app) |
|
||||
| [`nutriscan`](https://evandro.dev.br/cases/nutriscan) | NutriScan: consulta de produtos por nome e código de barras | Em produção | [nutriscan.evandro.dev.br](https://nutriscan.evandro.dev.br) |
|
||||
| [`twins-lab`](https://evandro.dev.br/cases/twins-lab) | Twins Lab: painel ao vivo de um reator simulado | Protótipo | sem demo |
|
||||
| [`reddit-explorer`](https://evandro.dev.br/cases/reddit-explorer) | Reddit Posts Explorer: posts de um fórum de IA, filtrados por período | Concluído | sem demo |
|
||||
| [`sc-plus`](https://evandro.dev.br/cases/sc-plus) | SC Plus Aquicultura: site institucional com áreas, projetos e contato | Concluído | [scplus.evandro.dev.br](https://scplus.evandro.dev.br) |
|
||||
| [`gcc-installer`](https://evandro.dev.br/cases/gcc-installer) | MinGW GCC Installer: instalador do compilador GCC para Windows | Concluído | sem demo |
|
||||
| [`as-servicos`](https://evandro.dev.br/cases/as-servicos) | AS Serviços: site institucional com cena 3D | Concluído | sem demo |
|
||||
|
||||
> [!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`.
|
||||
## Por que usar
|
||||
|
||||
## 🧱 Arquitetura
|
||||
O repositório é a referência de como o site funciona, não um template. As decisões que valem conferir:
|
||||
|
||||
```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"]
|
||||
```
|
||||
- **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.
|
||||
|
||||
- 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.
|
||||
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.
|
||||
|
||||
### CI/CD
|
||||
## Como funciona
|
||||
|
||||
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.
|
||||
|
||||
<details>
|
||||
<summary>Rotas</summary>
|
||||
<summary>Rotas e estrutura</summary>
|
||||
|
||||
| Rota | Conteúdo |
|
||||
|---|---|
|
||||
| `/` | Hero, notebook de projetos, perfil, competências, experiência, projetos, modalidades de trabalho e contato |
|
||||
| `/cases`, `/cases/<id>` | Índice e página de cada um dos oito cases |
|
||||
| `/cases`, `/cases/<id>` | Índice e página de cada um dos nove cases |
|
||||
| `/servicos` | Índice dos seis serviços |
|
||||
| `/servicos/criacao-de-sites` | Criação de sites |
|
||||
| `/servicos/engenharia-de-software` | Sistemas web e aplicativos mobile sob medida |
|
||||
@@ -139,10 +90,6 @@ O deploy usa o secret `VERCEL_TOKEN`; o projeto na Vercel é o nome do repositó
|
||||
| `/curriculo` | Currículo em HTML, com download de `/Profile.pdf` |
|
||||
| `/privacidade` | Privacidade e consentimento de analytics |
|
||||
|
||||
</details>
|
||||
|
||||
## 🗂️ Estrutura
|
||||
|
||||
```text
|
||||
app/ rotas (App Router) e componentes
|
||||
lib/ conteúdo (site-content.ts), SEO, JSON-LD, WhatsApp, project health
|
||||
@@ -152,26 +99,25 @@ scripts/ check-projects.mjs e utilitários de SEO e vídeo
|
||||
e2e/ testes Playwright (9 specs)
|
||||
docs/ SEO/GEO, project health e planos
|
||||
.gitea/workflows/ ci.yml (verify, audit, e2e, deploy)
|
||||
nixpacks.toml build e start via Nixpacks
|
||||
CREDITS.md créditos de capturas e ícone
|
||||
```
|
||||
|
||||
Stack: Next.js 16.3.8, React 19.1.0, TypeScript 5.9.2, Tailwind CSS 4, Three.js, Lenis e Lucide React. Qualidade: Biome, Jest 30 com Testing Library (150 arquivos de teste), Playwright e axe-core. Todas as dependências diretas estão fixadas em versões exatas, exceto `lenis` (`^1.3.26`).
|
||||
</details>
|
||||
|
||||
## 🧪 Scripts
|
||||
## Início rápido
|
||||
|
||||
| Comando | O que faz |
|
||||
| --- | --- |
|
||||
| `pnpm dev` | Next.js em desenvolvimento com Turbopack |
|
||||
| `pnpm build` | Build de produção com Turbopack |
|
||||
| `pnpm start` | Serve um build já gerado |
|
||||
| `pnpm lint` | Executa `biome check` |
|
||||
| `pnpm typecheck` | Executa `next typegen` e `tsc --noEmit` |
|
||||
| `pnpm format` | Formata o repositório com Biome |
|
||||
| `pnpm test` | Executa a suíte Jest |
|
||||
| `pnpm test:watch` | Executa Jest em modo watch |
|
||||
| `pnpm test:e2e` | Executa o Playwright contra um servidor já no ar (`BASE_URL`) |
|
||||
| `pnpm check:projects` | Consulta as demos e substitui atomicamente `data/project-health.json` |
|
||||
Requisitos: Node.js `22.x` (`engines`), pnpm `9.15.9` (`packageManager`) e, só para `pnpm test:e2e`, o Chromium do Playwright.
|
||||
|
||||
```bash
|
||||
corepack [email protected] install --frozen-lockfile
|
||||
corepack [email protected] dev # Next.js com Turbopack
|
||||
corepack [email protected] build # build de produção
|
||||
corepack [email protected] start # serve um build já gerado
|
||||
```
|
||||
|
||||
A instalação é sempre com `--frozen-lockfile`, igual ao CI e ao Nixpacks.
|
||||
|
||||
> [!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`.
|
||||
|
||||
Validação completa, na mesma ordem do CI:
|
||||
|
||||
@@ -185,30 +131,39 @@ corepack [email protected] audit --prod --audit-level=high
|
||||
corepack [email protected] audit --dev --audit-level=high
|
||||
```
|
||||
|
||||
Para os testes de ponta a ponta: `pnpm build && pnpm start -p 3001`, e em outro terminal `BASE_URL=http://localhost:3001 pnpm test:e2e`.
|
||||
Testes de ponta a ponta: `pnpm build && pnpm start -p 3001` e, em outro terminal, `BASE_URL=http://localhost:3001 pnpm test:e2e`.
|
||||
|
||||
## 📚 Documentação
|
||||
Outros scripts: `pnpm format` (Biome), `pnpm test:watch` (Jest em modo watch) e `pnpm check:projects` (atualiza `data/project-health.json`).
|
||||
|
||||
- [`docs/project-health.md`](docs/project-health.md): estados do CTA das demos e atualização do snapshot.
|
||||
- [`docs/seo-geo-operations.md`](docs/seo-geo-operations.md): runbook de SEO e GEO (Search Console, Bing, Cloudflare, CrUX), descrito e **não executado**.
|
||||
- [`docs/seo-geo-validation.md`](docs/seo-geo-validation.md): validação de SEO e GEO.
|
||||
- [`CREDITS.md`](CREDITS.md): créditos das capturas de tela e do ícone do WhatsApp.
|
||||
## Configuração
|
||||
|
||||
## 🛣️ Limitações e próximos passos
|
||||
Não há `.env.example`, e nenhuma variável é necessária para rodar localmente. O código lê:
|
||||
|
||||
- **Sem backend.** O formulário de contato não grava nada: abre `wa.me` com o briefing preenchido, e o rodapé mantém o contato direto por e-mail.
|
||||
- **Demos externas podem aparecer como indisponíveis.** O CTA reflete o último snapshot versionado, não uma consulta em tempo real. No snapshot de 2026-07-11, só a SEV respondeu 200; `nutriscan` falhou na consulta e `sc-plus` respondeu 502. Rode `pnpm check:projects` para renová-lo.
|
||||
- **Sem 3D em telas pequenas, com ponteiro `coarse` ou movimento reduzido.** O hero e o notebook entregam a versão HTML.
|
||||
| Variável | Descrição |
|
||||
|---|---|
|
||||
| `NEXT_PUBLIC_GOOGLE_ADS_CONVERSION_LABEL` | Rótulo de conversão do Google Ads; sem ele, nenhum evento de conversão é enviado |
|
||||
| `BASE_URL` | Endereço do site testado por `pnpm test:e2e` (padrão `http://localhost:3001`) |
|
||||
| `PW_CHROMIUM` | Caminho de um Chromium local para o Playwright, para não baixar o navegador |
|
||||
|
||||
## Estado do projeto
|
||||
|
||||
Em produção em [evandro.dev.br](https://evandro.dev.br). Stack: Next.js 16.3.8, React 19.1.0, TypeScript 5.9.2, Tailwind CSS 4, Three.js, Lenis e Lucide React. Qualidade: Biome, Jest 30 com Testing Library (150 arquivos de teste), Playwright e axe-core. Todas as dependências diretas estão fixadas em versões exatas, exceto `lenis` (`^1.3.26`).
|
||||
|
||||
Limites e próximos passos:
|
||||
|
||||
- **Demos externas podem aparecer como indisponíveis.** O CTA reflete o último snapshot versionado, não uma consulta em tempo real. No snapshot de 2026-07-11, só a SEV respondeu 200; `nutriscan` falhou na consulta, `twins-lab` respondeu 404 e `sc-plus`, 502. Rode `pnpm check:projects` para renová-lo. Em 2026-10-24, `nutriscan.evandro.dev.br` continuava sem responder com o app.
|
||||
- **Ações externas de SEO/GEO pendentes.** Search Console, Bing, Cloudflare e CrUX estão só no runbook.
|
||||
|
||||
## 🤝 Contribuindo
|
||||
Documentação: [`docs/project-health.md`](docs/project-health.md) (estados do CTA das demos e atualização do snapshot), [`docs/seo-geo-operations.md`](docs/seo-geo-operations.md) (runbook de SEO e GEO, descrito e **não executado**), [`docs/seo-geo-validation.md`](docs/seo-geo-validation.md) (validação de SEO e GEO) e [`CREDITS.md`](CREDITS.md).
|
||||
|
||||
Projeto pessoal (`"private": true` no `package.json`). O CI roda em `push` e `pull_request`; antes de abrir um PR, o que ele exige deve passar localmente:
|
||||
O CI roda em `push` e `pull_request`; antes de abrir um PR, rode `pnpm lint && pnpm typecheck && pnpm test -- --runInBand && pnpm build`.
|
||||
|
||||
```bash
|
||||
pnpm lint && pnpm typecheck && pnpm test -- --runInBand && pnpm build
|
||||
```
|
||||
## Licença
|
||||
|
||||
## 📄 Licença
|
||||
Sem licença publicada: todos os direitos reservados.
|
||||
|
||||
Sem licença definida — todos os direitos reservados.
|
||||
<div align="center">
|
||||
|
||||
<sub>Feito por <a href="https://evandro.dev.br">Evandro Fonseca Junior</a> · <a href="https://git.evandro.dev.br/evandro">git.evandro.dev.br</a></sub>
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,46 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="420" viewBox="0 0 1200 420" role="img" aria-labelledby="title desc">
|
||||
<title id="title">evandro.dev.br</title>
|
||||
<desc id="desc">O portfólio de Evandro Fonseca Junior em evandro.dev.br. À direita, o índice /cases com os nove cases publicados e o estado de cada um, com Julia Beauty em destaque como o case mais recente.</desc>
|
||||
|
||||
<rect width="1200" height="420" rx="24" fill="#f4f2ed"/>
|
||||
|
||||
<g id="title-block" font-family="system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif">
|
||||
<text x="64" y="104" font-family="ui-monospace, 'SF Mono', Consolas, monospace" font-size="20" fill="#4a4a4a">portifolio-evandrodevbr</text>
|
||||
<rect x="64" y="200" width="120" height="10" fill="#ccff00"/>
|
||||
<text x="64" y="186" font-size="64" font-weight="700" fill="#0a0a0a">evandro.dev.br</text>
|
||||
<text x="64" y="252" font-size="28" fill="#0a0a0a">O portfólio de Evandro Fonseca Junior:</text>
|
||||
<text x="64" y="288" font-size="28" fill="#0a0a0a">cases, serviços e currículo.</text>
|
||||
<text x="64" y="344" font-family="ui-monospace, 'SF Mono', Consolas, monospace" font-size="20" fill="#4a4a4a">Next.js 16 · React 19 · Three.js</text>
|
||||
</g>
|
||||
|
||||
<g id="project-proof" font-family="ui-monospace, 'SF Mono', Consolas, monospace">
|
||||
<rect x="640" y="36" width="496" height="348" rx="16" fill="#ffffff" stroke="#dcdad5" stroke-width="2"/>
|
||||
<text x="672" y="78" font-size="22" font-weight="700" fill="#0a0a0a">/cases</text>
|
||||
<text x="1104" y="78" font-size="18" fill="#4a4a4a" text-anchor="end">9 cases</text>
|
||||
<line x1="672" y1="94" x2="1104" y2="94" stroke="#dcdad5" stroke-width="2"/>
|
||||
|
||||
<rect x="660" y="102" width="456" height="32" rx="6" fill="#ccff00"/>
|
||||
<g font-size="20" fill="#0a0a0a">
|
||||
<text x="672" y="125">julia-beauty</text>
|
||||
<text x="672" y="155">sev-modaintima</text>
|
||||
<text x="672" y="185">lavacao-047</text>
|
||||
<text x="672" y="215">nutriscan</text>
|
||||
<text x="672" y="245">twins-lab</text>
|
||||
<text x="672" y="275">reddit-explorer</text>
|
||||
<text x="672" y="305">sc-plus</text>
|
||||
<text x="672" y="335">gcc-installer</text>
|
||||
<text x="672" y="365">as-servicos</text>
|
||||
</g>
|
||||
<g font-size="18" fill="#4a4a4a" text-anchor="end">
|
||||
<text x="1104" y="125" fill="#0a0a0a">em produção</text>
|
||||
<text x="1104" y="155">em produção</text>
|
||||
<text x="1104" y="185">em produção</text>
|
||||
<text x="1104" y="215">em produção</text>
|
||||
<text x="1104" y="245">protótipo</text>
|
||||
<text x="1104" y="275">concluído</text>
|
||||
<text x="1104" y="305">concluído</text>
|
||||
<text x="1104" y="335">concluído</text>
|
||||
<text x="1104" y="365">concluído</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
Reference in new issue
Block a user