import Link from "next/link"; import { METHODOLOGY_PAGES, PUBLIC_BRIEFS, SOURCE_PAGES, absolutePublicUrl, briefPath, methodologyPath, sourcePath, type MethodologyPage, type PublicBrief, type SourcePage, } from "@/content/public-content"; import { PublicContentAnalytics, PublicContentCta, PublicContentOutboundLink, } from "./PublicContentAnalytics"; const pageShell = "min-h-screen bg-[#f4f7fb] text-slate-950"; const contentWrap = "mx-auto flex w-full max-w-6xl flex-col gap-8 px-4 py-6 sm:px-6 lg:px-8"; const panel = "rounded-lg border border-slate-200 bg-white shadow-[0_1px_3px_rgba(15,23,42,0.05)]"; const sectionTitle = "text-sm font-semibold uppercase tracking-[0.08em] text-slate-500"; const bodyText = "text-sm leading-6 text-slate-700"; const primaryButton = "inline-flex min-h-10 items-center justify-center rounded-md bg-slate-950 px-4 py-2 text-sm font-semibold text-white transition hover:bg-slate-800"; const secondaryButton = "inline-flex min-h-10 items-center justify-center rounded-md border border-slate-300 bg-white px-4 py-2 text-sm font-semibold text-slate-900 transition hover:border-slate-400 hover:bg-slate-50"; function PublicHeader() { return (
PolyWeather
); } function PageIntro({ eyebrow, title, description, }: { eyebrow: string; title: string; description: string; }) { return (

{eyebrow}

{title}

{description}

); } function SourceLinks({ slugs }: { slugs: string[] }) { return (
{slugs.map((slug) => { const source = SOURCE_PAGES.find((entry) => entry.slug === slug); if (!source) return null; return ( {source.title} ); })}
); } function MethodologyLinks({ slugs }: { slugs: string[] }) { return (
{slugs.map((slug) => { const page = METHODOLOGY_PAGES.find((entry) => entry.slug === slug); if (!page) return null; return ( {page.title} ); })}
); } function BriefCard({ brief }: { brief: PublicBrief }) { return (

{brief.cityName} / {brief.date}

{brief.title}

{brief.settlementSource}

{brief.description}

{brief.signals.map((signal) => (

{signal.label}

{signal.value}

{signal.detail}

))}
Read brief
); } export function BriefsIndexPageView() { return (
{PUBLIC_BRIEFS.map((brief) => ( ))}

Methodology

How the public read is produced

Briefs cross-link to the DEB methodology and settlement-source priority pages so readers can audit why PolyWeather does not treat generic city forecasts as market truth.

Source notes

Official-source context

Source pages explain why MGM, METAR, HKO, NOAA, and model guidance are displayed separately in PolyWeather workflows.

); } export function BriefDetailPageView({ brief }: { brief: PublicBrief }) { return (
{brief.signals.map((signal) => (

{signal.label}

{signal.value}

{signal.detail}

))}

Checks before acting

    {brief.checkpoints.map((checkpoint) => (
  • {checkpoint}
  • ))}

Distribution copy

{brief.distributionText}

Share on X

Methodology links

Source links

{brief.notFinancialAdvice}

); } function BriefSection({ body, title }: { body: string; title: string }) { return (

{title}

{body}

); } function InfoRow({ label, value }: { label: string; value: string }) { return (
{label}
{value}
); } export function MethodologyIndexPageView() { return (
{METHODOLOGY_PAGES.map((page) => (

{formatDate(page.updatedAt)}

{page.title}

{page.description}

Read methodology
))}
); } export function MethodologyDetailPageView({ page }: { page: MethodologyPage }) { return (

{page.summary}

{page.sections.map((section) => (

{section.heading}

{section.body}

    {section.bullets.map((bullet) => (
  • {bullet}
  • ))}
))}
); } export function SourcesIndexPageView() { return (
{SOURCE_PAGES.map((source) => (

{source.operator}

{source.title}

{source.description}

Read source note
))}
); } export function SourceDetailPageView({ source }: { source: SourcePage }) { return (

Reliability notes

    {source.reliabilityNotes.map((note) => (
  • {note}
  • ))}

Related methodology

); } function formatDateTime(value: string) { return new Intl.DateTimeFormat("en", { dateStyle: "medium", timeStyle: "short", }).format(new Date(value)); } function formatDate(value: string) { return new Intl.DateTimeFormat("en", { dateStyle: "medium", }).format(new Date(value)); }