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:
1 parent
7b633f0f4a
commit
de6af74a0c
37 files changed
+1062
-254
No files matched your search
+28
-8
@@ -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>
|
||||
|
||||
Reference in new issue
Block a user