From abe1a47a680864cf0e3ef3a9cbbbaf4cd2f00bc9 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Mon, 19 Oct 2026 12:51:16 +0000 Subject: [PATCH] feat(web): pit.world network footer, two-row site footer Render the pit.world network footer server-side as the last thing in (fetched from pit.world/snippets/footer.html, cached an hour, 3s timeout, renders nothing on failure; CSP style-src already allows 'unsafe-inline'). The site footer goes from a five-column link dump to two rows: logo and the eight links people use, then copyright/license, socials and the language switcher. Dropped: the repeated tagline, the nine-entry package-manager column (all on /download), FAQ/requirements/troubleshooting anchors, changelog/use-cases, and the Profullstack ring bar. Co-Authored-By: Claude Opus 5.5 --- apps/web/src/app/layout.tsx | 2 + apps/web/src/components/footer.tsx | 202 +++++++------------------ apps/web/src/components/pit-footer.tsx | 25 +++ 3 files changed, 78 insertions(+), 151 deletions(-) create mode 100644 apps/web/src/components/pit-footer.tsx diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index bcb73058..9a1512b7 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -5,6 +5,7 @@ import { NextIntlClientProvider } from 'next-intl'; import { getLocale, getTranslations } from 'next-intl/server'; import { localeDirection, ogLocale } from '@/i18n/locales'; import { PWAInstallButton } from '@/components/pwa'; +import { PitFooter } from '@/components/pit-footer'; import './globals.css'; export async function generateMetadata(): Promise { @@ -166,6 +167,7 @@ export default async function RootLayout({ children }: { children: React.ReactNo src="https://crawlproof.com/stats.js" strategy="afterInteractive" /> + ); diff --git a/apps/web/src/components/footer.tsx b/apps/web/src/components/footer.tsx index 2ba4bcad..dc881bf6 100644 --- a/apps/web/src/components/footer.tsx +++ b/apps/web/src/components/footer.tsx @@ -1,5 +1,4 @@ import Link from 'next/link'; -import { Footer as PfsFooter } from '@profullstack/footer/react'; import { useTranslations } from 'next-intl'; import { Logo } from '@/components/Logo'; import { LanguageSwitcher } from '@/components/LanguageSwitcher'; @@ -30,56 +29,19 @@ function TwitterIcon({ className }: { className?: string }) { ); } -// Internal links carry a message key (footer.links.*); package-manager names -// under `install` are proper nouns and stay as written. -const footerLinks = { - product: [ - { key: 'features', href: '/features' }, - { key: 'useCases', href: '/use-cases' }, - { key: 'download', href: '/download' }, - { key: 'pricing', href: '/pricing' }, - { key: 'changelog', href: '/changelog' }, - ], - install: [ - { - name: 'Homebrew (macOS)', - href: 'https://github.com/profullstack/homebrew-pairux', - external: true, - }, - { - name: 'Scoop (Windows)', - href: 'https://github.com/profullstack/scoop-pairux', - external: true, - }, - { - name: 'WinGet (Windows)', - href: 'https://github.com/profullstack/pairux.com/releases', - external: true, - }, - { - name: 'Chocolatey (Windows)', - href: 'https://github.com/profullstack/pairux.com/releases', - external: true, - }, - { name: 'AUR (Arch)', href: 'https://aur.archlinux.org/packages/pairux-bin', external: true }, - { name: 'APT (Debian)', href: 'https://github.com/profullstack/pairux-apt', external: true }, - { name: 'RPM (Fedora)', href: 'https://github.com/profullstack/pairux-rpm', external: true }, - { name: 'Gentoo', href: 'https://github.com/profullstack/gentoo-pairux', external: true }, - { name: 'Nix', href: 'https://github.com/profullstack/pairux-nix', external: true }, - ], - resources: [ - { key: 'documentation', href: '/docs' }, - { key: 'faq', href: '/docs#faq' }, - { key: 'systemRequirements', href: '/docs#requirements' }, - { key: 'troubleshooting', href: '/docs#troubleshooting' }, - ], - company: [ - { key: 'about', href: '/about' }, - { key: 'blog', href: '/blog' }, - { key: 'privacy', href: '/privacy' }, - { key: 'terms', href: '/terms' }, - ], -}; +// The links people need, one row. Message keys live under footer.links.*. +// Network links (search, ring, publish) come from the pit.world footer the +// root layout renders after this one. +const footerLinks = [ + { key: 'features', href: '/features' }, + { key: 'pricing', href: '/pricing' }, + { key: 'download', href: '/download' }, + { key: 'documentation', href: '/docs' }, + { key: 'blog', href: '/blog' }, + { key: 'about', href: '/about' }, + { key: 'privacy', href: '/privacy' }, + { key: 'terms', href: '/terms' }, +]; const socialLinks = [ { @@ -102,107 +64,45 @@ const socialLinks = [ export function Footer() { const t = useTranslations('footer'); return ( -