feat: add SEO and sitemap functionality

- Implemented robots.txt to guide search engine indexing.
- Created layout components for the selector and series pages to manage metadata.
- Developed a dynamic sitemap generator based on existing series and frameworks data.
- Centralized SEO information in a new lib/seo.js file to maintain consistency across the site.
- Added SVG logos for branding.
This commit is contained in:
Lucas Rayan committed 2026-08-23 11:16:13 -03:00
1 parent 3de4f2501d
commit 37971056c2
74 files changed
+563 -41337

No files matched your search

+9 -5
View File
@@ -38,6 +38,7 @@
<div>
<strong>Lucas Rayan Guerra</strong>
Ciência Embarcada · ESPDocs
linkedin.com/in/lucasrguerra
</div>
<div style="text-align:right">
<strong>Material de apoio</strong>
@@ -1884,7 +1885,9 @@ Temperatura: 26.1 C | Umidade: 62.0 %</code></pre>
<tr>
<td class="destaque">Conteúdo e redação</td>
<td><strong>Lucas Rayan Guerra</strong><br>
Ciência Embarcada · <a href="https://cienciaembarcada.com.br">cienciaembarcada.com.br</a></td>
Ciência Embarcada · <a href="https://cienciaembarcada.com.br">cienciaembarcada.com.br</a><br>
<a href="https://linkedin.com/in/lucasrguerra">linkedin.com/in/lucasrguerra</a><br>
<a href="mailto:contato@lucasrguerra.dev.br">contato@lucasrguerra.dev.br</a></td>
</tr>
<tr>
<td class="destaque">Dados técnicos</td>
@@ -1942,11 +1945,12 @@ Temperatura: 26.1 C | Umidade: 62.0 %</code></pre>
</div>
<div class="caixa dica">
<div class="caixa-titulo">Encontrou um erro?</div>
<div class="caixa-titulo">Dúvidas, correções e contato</div>
<p>
Correções e sugestões são bem-vindas e ajudam as próximas turmas. Reporte pelo ESPDocs,
em <a href="https://espdocs.cienciaembarcada.com.br/">espdocs.cienciaembarcada.com.br</a>,
ou fale com a coordenação da LASER.
Correções e sugestões são bem-vindas e ajudam as próximas turmas. Fale direto com o
autor por <a href="mailto:contato@lucasrguerra.dev.br">contato@lucasrguerra.dev.br</a>
ou pelo LinkedIn, em
<a href="https://linkedin.com/in/lucasrguerra">linkedin.com/in/lucasrguerra</a>.
</p>
</div>
+19
View File
@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 260 64" role="img" aria-label="ESPDocs">
<title>ESPDocs</title>
<defs>
<linearGradient id="gl" x1="6" y1="58" x2="250" y2="6" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#3b82f6"/>
<stop offset="0.55" stop-color="#8b5cf6"/>
<stop offset="1" stop-color="#ec4899"/>
</linearGradient>
</defs>
<g stroke="url(#gl)" stroke-width="3.4" stroke-linecap="round">
<path d="M2 21h7"/><path d="M2 32h7"/><path d="M2 43h7"/>
</g>
<rect x="9.25" y="9.25" width="45.5" height="45.5" rx="13" fill="none" stroke="url(#gl)" stroke-width="4.5"/>
<g stroke="url(#gl)" stroke-width="4.5" stroke-linecap="round">
<path d="M19 21h26"/><path d="M19 32h21"/><path d="M19 43h15"/>
</g>
<text x="72" y="43" font-family="Outfit, Inter, system-ui, sans-serif" font-size="34"
font-weight="800" letter-spacing="-0.5" fill="url(#gl)">ESPDocs</text>
</svg>

After

Width:  |  Height:  |  Size: 954 B

+29
View File
@@ -0,0 +1,29 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="ESPDocs">
<title>ESPDocs</title>
<defs>
<linearGradient id="g" x1="6" y1="58" x2="58" y2="6" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#3b82f6"/>
<stop offset="0.55" stop-color="#8b5cf6"/>
<stop offset="1" stop-color="#ec4899"/>
</linearGradient>
</defs>
<!-- Pinos entrando pela esquerda: o sinal que chega do silício. -->
<g stroke="url(#g)" stroke-width="3.4" stroke-linecap="round">
<path d="M2 21h7"/>
<path d="M2 32h7"/>
<path d="M2 43h7"/>
</g>
<!-- Corpo do encapsulamento. -->
<rect x="9.25" y="9.25" width="45.5" height="45.5" rx="13"
fill="none" stroke="url(#g)" stroke-width="4.5"/>
<!-- Os mesmos três níveis viram linhas de texto: a documentação.
Comprimento decrescente para ler como parágrafo. -->
<g stroke="url(#g)" stroke-width="4.5" stroke-linecap="round">
<path d="M19 21h26"/>
<path d="M19 32h21"/>
<path d="M19 43h15"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB