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.
71 lines
2.9 KiB
TypeScript
71 lines
2.9 KiB
TypeScript
import { ArrowLeft, Code2, Home } from "lucide-react";
|
|
import type { Metadata } from "next";
|
|
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,
|
|
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() {
|
|
return (
|
|
<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-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>
|
|
<h2 className="font-[family-name:var(--font-display)] text-2xl md:text-3xl font-bold text-slate-300 mb-4">
|
|
Página não encontrada
|
|
</h2>
|
|
<p className="font-[family-name:var(--font-body)] text-slate-400 mb-8">
|
|
A página que você está procurando não existe ou foi movida.
|
|
</p>
|
|
</div>
|
|
|
|
<div className="flex flex-col sm:flex-row gap-4 justify-center">
|
|
<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
|
|
</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
|
|
</HoverPrefetchLink>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
);
|
|
}
|