Code review: login no longer strands visitors with zero sign-in methods when
the providers fetch fails (falls back to SMS + error notice); skeleton while
providers load instead of a blank card.
Design re-audit: proof band flipped from apology to flex ('Don't take our
word for it / Every claim links to its proof') and promoted to the primary
heading tier; unverifiable '60 seconds'/'in minutes' speed claims dropped;
fg-subtle body text bumped to fg-muted (AA contrast); marketplace section
differentiated via border-y + elevated bg (adjacent hairlines removed);
preview frame traffic lights on-palette; header h-12 -> h-14 (hero svh calc
adjusted); emerald-400 -> --color-success token.
Content QA: rest-api article description drift between page and registry
resolved; ChatGPT plan-gating table and Atlassian Rovo SSE-cutoff claims now
carry dated hedges.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SXUwmPVRTD8AKQtio6gCN5
122 lines
4.6 KiB
TypeScript
122 lines
4.6 KiB
TypeScript
import { CookieBanner } from '@/components/cookie-banner';
|
|
import { Logo } from '@/components/logo';
|
|
import { MarketingAuthButtons } from '@/components/marketing-auth-buttons';
|
|
import { MarketingMobileMenu } from '@/components/marketing-mobile-menu';
|
|
import Link from 'next/link';
|
|
|
|
export default function MarketingLayout({ children }: { children: React.ReactNode }) {
|
|
return (
|
|
<div className="flex min-h-screen flex-col">
|
|
<header className="sticky top-0 z-50 border-b border-[--color-border] bg-[--color-bg]/80 backdrop-blur-md">
|
|
<div className="mx-auto flex h-14 max-w-6xl items-center justify-between px-5 sm:px-6">
|
|
<div className="flex items-center gap-6">
|
|
<Logo />
|
|
<nav className="hidden items-center gap-5 text-[13px] text-[--color-fg-muted] md:flex">
|
|
<Link href="/#how" className="transition-colors hover:text-[--color-fg]">
|
|
How it works
|
|
</Link>
|
|
<Link href="/templates" className="transition-colors hover:text-[--color-fg]">
|
|
Templates
|
|
</Link>
|
|
<Link href="/pricing" className="transition-colors hover:text-[--color-fg]">
|
|
Pricing
|
|
</Link>
|
|
<Link href="/docs" className="transition-colors hover:text-[--color-fg]">
|
|
Docs
|
|
</Link>
|
|
<Link href="/guides" className="transition-colors hover:text-[--color-fg]">
|
|
Guides
|
|
</Link>
|
|
<Link href="/changelog" className="transition-colors hover:text-[--color-fg]">
|
|
Changelog
|
|
</Link>
|
|
</nav>
|
|
</div>
|
|
<div className="flex items-center gap-1.5 sm:gap-2">
|
|
<MarketingAuthButtons />
|
|
<MarketingMobileMenu />
|
|
</div>
|
|
</div>
|
|
</header>
|
|
<main className="flex-1">{children}</main>
|
|
<footer className="border-t border-[--color-border] py-12">
|
|
<div className="mx-auto max-w-6xl px-6">
|
|
<div className="grid gap-10 sm:grid-cols-2 md:grid-cols-4">
|
|
{/* Brand column — positioning line + live status. */}
|
|
<div className="sm:col-span-2 md:col-span-1">
|
|
<Logo />
|
|
<p className="mt-3 max-w-xs text-[12.5px] leading-relaxed text-[--color-fg-muted]">
|
|
From a prompt to a hosted, OAuth-protected MCP server — for Claude, Cursor and
|
|
ChatGPT.
|
|
</p>
|
|
<Link
|
|
href="/status"
|
|
className="mt-4 flex items-center gap-2 text-[12px] text-[--color-fg-muted] transition-colors hover:text-[--color-fg]"
|
|
>
|
|
<span className="size-1.5 animate-pulse rounded-full bg-[--color-success]" />
|
|
<span>System status</span>
|
|
</Link>
|
|
</div>
|
|
<FooterColumn
|
|
title="Product"
|
|
links={[
|
|
{ href: '/templates', label: 'Templates' },
|
|
{ href: '/pricing', label: 'Pricing' },
|
|
{ href: '/changelog', label: 'Changelog' },
|
|
{ href: '/security', label: 'Security' },
|
|
]}
|
|
/>
|
|
<FooterColumn
|
|
title="Resources"
|
|
links={[
|
|
{ href: '/docs', label: 'Docs' },
|
|
{ href: '/guides', label: 'Guides' },
|
|
{ href: '/docs/faq', label: 'FAQ' },
|
|
{ href: '/contact', label: 'Contact' },
|
|
]}
|
|
/>
|
|
<FooterColumn
|
|
title="Legal"
|
|
links={[
|
|
{ href: '/privacy', label: 'Privacy' },
|
|
{ href: '/terms', label: 'Terms' },
|
|
{ href: '/agb', label: 'AGB' },
|
|
{ href: '/impressum', label: 'Impressum' },
|
|
]}
|
|
/>
|
|
</div>
|
|
<div className="mt-10 border-t border-[--color-border] pt-6 text-[12px] text-[--color-fg-subtle]">
|
|
© {new Date().getFullYear()} BuildMyMCPServer
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
<CookieBanner />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function FooterColumn({
|
|
title,
|
|
links,
|
|
}: {
|
|
title: string;
|
|
links: { href: string; label: string }[];
|
|
}) {
|
|
return (
|
|
<div>
|
|
<h3 className="text-[11px] font-semibold uppercase tracking-[0.16em] text-[--color-fg-muted]">
|
|
{title}
|
|
</h3>
|
|
<ul className="mt-3 space-y-2 text-[12.5px] text-[--color-fg-muted]">
|
|
{links.map((l) => (
|
|
<li key={l.href}>
|
|
<Link href={l.href} className="transition-colors hover:text-[--color-fg]">
|
|
{l.label}
|
|
</Link>
|
|
</li>
|
|
))}
|
|
</ul>
|
|
</div>
|
|
);
|
|
}
|