feat(cases): prova certa por serviço, páginas internas com trabalho no topo

Diagnóstico sem case que não cabe; desktop com o GCC Installer como projeto próprio; IoT com o Twins Lab e a nota da Apolo. Mosaico de pôsteres em /servicos e /cases, faixa baixa em uma coluna no currículo, privacidade e laboratório; Laboratório como lista compacta; SEV começando por catálogo, pedido no WhatsApp e painel; Joinville e SC nos títulos; imagens do LCP com fetchPriority e sizes reais; pré-carregamento só no hover; 404 com Open Graph próprio.
This commit is contained in:
Evandro Fonseca Junior committed 2026-10-14 17:01:35 -03:00
1 parent 7b633f0f4a
commit de6af74a0c
37 files changed
+1062 -254

No files matched your search

+28 -8
View File
@@ -1,14 +1,34 @@
import { ArrowLeft, Code2, Home } from "lucide-react";
import type { Metadata } from "next";
import Link from "next/link";
import HoverPrefetchLink from "@/app/components/HoverPrefetchLink";
import { twitterHandle } from "@/lib/seo";
import { siteName } from "@/lib/site-content";
const title = "Página não encontrada";
const description = "A página que você procura não existe ou foi movida.";
// O Next já escreve <meta name="robots" content="noindex"> em toda página 404; repetir `robots` aqui duplicaria a tag.
// O layout raiz libera a indexação para o Googlebot, então só essa regra é trocada. A canônica da home também não vale num 404.
// O cartão de compartilhamento é o do próprio 404 e fica sem `url`: o endereço pedido não existe, e o `og:url` da home
// (herdado do layout, que é substituído por inteiro quando a página define `openGraph`) apontaria a prévia para outra página.
export const metadata: Metadata = {
title: "Página não encontrada",
description: "A página que você procura não existe ou foi movida.",
title,
description,
alternates: { canonical: null },
robots: { googleBot: { index: false, follow: false } },
openGraph: {
locale: "pt_BR",
title,
description,
siteName,
type: "website",
},
twitter: {
card: "summary_large_image",
title,
description,
creator: twitterHandle,
},
};
export default function NotFound() {
@@ -16,7 +36,7 @@ export default function NotFound() {
<main className="min-h-screen bg-[#030712] flex items-center justify-center px-6">
<div className="max-w-2xl mx-auto text-center">
<div className="mb-8">
<Code2 className="w-24 h-24 text-[var(--slash)] mx-auto mb-4 opacity-60" />
<Code2 className="w-24 h-24 text-slate-500 mx-auto mb-4 opacity-60" />
<h1 className="font-[family-name:var(--font-display)] text-6xl md:text-8xl font-extrabold text-white mb-4">
404
</h1>
@@ -29,20 +49,20 @@ export default function NotFound() {
</div>
<div className="flex flex-col sm:flex-row gap-4 justify-center">
<Link
<HoverPrefetchLink
href="/"
className="px-6 py-3 border border-slate-600 hover:border-slate-400 bg-transparent text-white rounded-lg font-[family-name:var(--font-body)] text-base font-semibold transition-all flex items-center justify-center gap-2"
>
<Home className="w-5 h-5" />
Voltar ao início
</Link>
<Link
</HoverPrefetchLink>
<HoverPrefetchLink
href="/cases"
className="px-6 py-3 font-[family-name:var(--font-body)] text-base text-slate-300 hover:text-white underline underline-offset-4 rounded-lg font-medium transition-all flex items-center justify-center gap-2"
>
<ArrowLeft className="w-5 h-5" />
Ver os cases
</Link>
</HoverPrefetchLink>
</div>
</div>
</main>