User explicit: "1 bilhão de entusiastas pelo mundo ovni" — site is for the
UFO-curious public, not for skeptics. The 8-detective scaffolding becomes
invisible plumbing; the reader sees stories about what was observed.
Reader-facing changes:
New homepage (web/app/page.tsx)
- SiteHeader: magazine-style top nav (no detective tiles)
- HeroBanner: full-bleed editorial opener with declassified-page art
background, display-serif headline, live stats row (122 docs,
2047 events, 1861 witnesses, 867 craft catalogued)
- FeaturedCase: cover-story treatment of the most recent case_report,
uses a real document page as hero image, links to /c/[slug]
- PortalGrid: 6 thematic doorways into the archive — Sightings,
Witnesses, Craft, Hot spots, Programs, Documents — each tile shows
a real entity count and short editorial blurb
- GreatestHits: top 9 most-cited events from the corpus
(Kenneth Arnold 1947, Mantell 1948, …) as a magazine grid
- Doc list kept but reframed as "the primary record"
New sub-pages (5)
- /sightings → events (2047), magazine grid
- /witnesses → people (1861), compact table
- /objects → uap_objects (867), magazine grid
- /locations → locations (1757), compact table
- /operations → organizations (1596), compact table
- /documents → full doc list with thumbnails (mirrors homepage section
for direct deep-link)
All share <EntityListPage> shell with per-page i18n + JSON-LD ItemList
Stripped detective surfacing
- /jobs/[id]: "Sherlock Holmes / Dr. Watson" → "Investigation in progress"
- chat-bubble: detective-named card → neutral "Investigação em andamento"
- quick-launch: 7-kind detective dropdown → single "investigar um caso"
input (kind=case_report hardcoded)
- /bureau: rewritten as the case-file library (no artefact dumps)
Typography + design
- Fraunces variable serif loaded for display headings
(`.font-display` class)
- Gold-amber accent (#e0c080) unified as the brand colour
- Asymmetric magazine grids (1+2+3 column, generous whitespace)
- Hover micro-interactions (image scale on featured case, translateX
on portal arrows)
SEO + GEO
- layout.tsx metadataBase + title.template + per-route Metadata exports
- Organization JSON-LD on root layout
- WebSite + SearchAction JSON-LD on homepage
- CollectionPage + ItemList JSON-LD on every entity list page
- openGraph + twitter cards, pt-BR primary + en-US alternate
- ai:purpose meta tag for Generative Engine Optimization — declares
the site as a citation-linked primary-source archive
- robots: index + follow with large image preview
The detectives themselves remain alive in the backend (runtime, DB, audit
log), but the reader never sees "Holmes / Sun-Tzu / Watson" in the UI. The
next phase will reorient case-writer to write as a single best-seller voice
synthesising all the internal sources.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
104 lines
3.9 KiB
TypeScript
104 lines
3.9 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { JetBrains_Mono, Inter, Fraunces } from "next/font/google";
|
|
import "./globals.css";
|
|
import { CommandPalette } from "@/components/command-palette";
|
|
import { LocaleToggle, getLocale } from "@/components/locale-toggle";
|
|
|
|
const inter = Inter({ subsets: ["latin"], variable: "--font-sans" });
|
|
const mono = JetBrains_Mono({ subsets: ["latin"], variable: "--font-mono" });
|
|
const fraunces = Fraunces({
|
|
subsets: ["latin"],
|
|
variable: "--font-display",
|
|
weight: ["400", "600", "700", "900"],
|
|
axes: ["SOFT", "WONK"],
|
|
});
|
|
|
|
const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL ?? "https://disclosure.top";
|
|
|
|
export const metadata: Metadata = {
|
|
metadataBase: new URL(SITE_URL),
|
|
title: {
|
|
default: "The Disclosure Bureau — UAP/UFO desclassificado",
|
|
template: "%s · The Disclosure Bureau",
|
|
},
|
|
description:
|
|
"122 documentos desclassificados do Departamento de Guerra dos EUA sobre UAP/UFO. " +
|
|
"Pilotos, oficiais e físicos relatam o que viram. Avistamentos, testemunhas, " +
|
|
"objetos catalogados — arquivos abertos da divulgação.",
|
|
keywords: [
|
|
"UAP", "UFO", "ovni", "desclassificado", "war.gov", "Pentagon",
|
|
"Kenneth Arnold", "Mantell", "green fireballs", "Sandia",
|
|
"Project Blue Book", "Robertson Panel", "AATIP",
|
|
"documentos desclassificados", "avistamento", "testemunha",
|
|
"disclosure", "divulgação UFO",
|
|
],
|
|
authors: [{ name: "The Disclosure Bureau" }],
|
|
openGraph: {
|
|
type: "website",
|
|
siteName: "The Disclosure Bureau",
|
|
title: "The Disclosure Bureau — UAP/UFO desclassificado",
|
|
description:
|
|
"122 documentos desclassificados. Pilotos, oficiais, físicos relatam o que viram.",
|
|
locale: "pt_BR",
|
|
alternateLocale: ["en_US"],
|
|
url: SITE_URL,
|
|
},
|
|
twitter: {
|
|
card: "summary_large_image",
|
|
title: "The Disclosure Bureau",
|
|
description: "Arquivos UAP/UFO desclassificados, narrados a partir do registro público.",
|
|
},
|
|
alternates: {
|
|
canonical: "/",
|
|
languages: { "pt-BR": "/", "en-US": "/" },
|
|
},
|
|
robots: {
|
|
index: true,
|
|
follow: true,
|
|
googleBot: {
|
|
index: true,
|
|
follow: true,
|
|
"max-image-preview": "large",
|
|
"max-snippet": -1,
|
|
},
|
|
},
|
|
other: {
|
|
// GEO (Generative Engine Optimization) — explicit primary-source statement
|
|
// so retrieval-augmented assistants understand what the site is.
|
|
"ai:purpose":
|
|
"Public, citation-linked archive of declassified UAP/UFO documents from the US Department of War. Each case file is grounded in primary-source memos with verbatim quotes and bbox-cropped imagery.",
|
|
"ai:license": "Documents are US Government works in the public domain; site narrative © Disclosure Bureau, CC-BY 4.0.",
|
|
},
|
|
};
|
|
|
|
export default async function RootLayout({ children }: { children: React.ReactNode }) {
|
|
const locale = await getLocale();
|
|
return (
|
|
<html lang={locale === "en" ? "en" : "pt-BR"} className="dark" data-locale={locale}>
|
|
<head>
|
|
{/* JSON-LD: organization-level schema. Per-page Article/Event schemas
|
|
are added in their own routes. */}
|
|
<script
|
|
type="application/ld+json"
|
|
dangerouslySetInnerHTML={{ __html: JSON.stringify({
|
|
"@context": "https://schema.org",
|
|
"@type": "Organization",
|
|
name: "The Disclosure Bureau",
|
|
url: SITE_URL,
|
|
description:
|
|
"Public archive of declassified UAP/UFO documents from the US Department of War, " +
|
|
"with narrated case files grounded in primary sources.",
|
|
sameAs: [],
|
|
}) }}
|
|
/>
|
|
</head>
|
|
<body className={`${inter.variable} ${mono.variable} ${fraunces.variable}`}>
|
|
{children}
|
|
<CommandPalette />
|
|
<div className="fixed bottom-3 left-3 z-40 opacity-70 hover:opacity-100 transition">
|
|
<LocaleToggle current={locale} />
|
|
</div>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|