SPB Git forge

spb/polyllm

Public
15commits 1branches 0releases
2.2 MBsize
maindefault branch
13 days agolast push
TypeScript 97.4% SQL 1% JavaScript 0.9% CSS 0.6%
5.1 KB · 121 lines tsx
Raw Blame History
1import Link from "next/link";2import { ExternalLink, Mail } from "lucide-react";3import { Logo } from "@/components/brand/logo";4import { ProviderIcon } from "@/components/brand/provider-icon";5import { PROVIDER_ORDER } from "@/lib/client/providers";6import { PROVIDER_LABEL } from "./mock-data";7import { InstallHint } from "./install-hint";89const COLUMNS: { title: string; links: { label: string; href: string; external?: boolean }[] }[] = [10  {11    title: "Product",12    links: [13      { label: "Features", href: "/#features" },14      { label: "Arena", href: "/#arena" },15      { label: "Interactive demo", href: "/#demo" },16      { label: "Security", href: "/security" },17      { label: "FAQ", href: "/#faq" },18    ],19  },20  {21    title: "Models",22    links: [23      { label: "Model catalog", href: "/models" },24      { label: "Live model API (JSON)", href: "/api/public/models" },25      { label: "Try the Arena", href: "/app/arena" },26    ],27  },28  {29    title: "Account",30    links: [31      { label: "Sign in", href: "/login" },32      { label: "Create account", href: "/signup" },33      { label: "Forgot password", href: "/forgot-password" },34      { label: "Open the app", href: "/app/chat" },35    ],36  },37  {38    title: "Legal",39    links: [40      { label: "Privacy", href: "/privacy" },41      { label: "Terms", href: "/terms" },42      { label: "Contact", href: "/contact" },43    ],44  },45];4647export function MarketingFooter() {48  return (49    <footer className="border-t border-border bg-bg-subtle/60">50      <div className="mx-auto w-full max-w-6xl px-5 py-12 sm:px-8 sm:py-16">51        <div className="grid gap-10 lg:grid-cols-[1.5fr_repeat(4,1fr)]">52          <div className="max-w-xs">53            <Logo size={24} />54            <p className="mt-3 text-sm leading-6 text-fg-muted">One interface. Every model. Bring your own keys.</p>55            <ul className="mt-5 flex flex-wrap gap-x-3.5 gap-y-2" aria-label="Supported providers">56              {PROVIDER_ORDER.map((p) => (57                <li key={p} className="inline-flex items-center gap-1.5 text-xs text-fg-subtle">58                  <ProviderIcon provider={p} size={13} />59                  {PROVIDER_LABEL[p]}60                </li>61              ))}62            </ul>63            <InstallHint className="mt-6" compact />64          </div>65          <div className="grid grid-cols-2 gap-8 sm:grid-cols-4 lg:col-span-4">66            {COLUMNS.map((col) => (67              <div key={col.title}>68                <h3 className="text-[13px] font-semibold text-fg">{col.title}</h3>69                <ul className="mt-3 space-y-2">70                  {col.links.map((l) => (71                    <li key={l.href}>72                      <Link href={l.href} className="inline-flex min-h-[28px] items-center text-sm text-fg-muted transition-colors hover:text-fg">73                        {l.label}74                      </Link>75                    </li>76                  ))}77                </ul>78              </div>79            ))}80          </div>81        </div>8283        {/* Made by */}84        <div className="mt-12 grid gap-6 border-t border-border pt-8 sm:grid-cols-3">85          <div>86            <p className="text-[11px] font-medium uppercase tracking-[0.12em] text-fg-subtle">Made by</p>87            <p className="mt-1.5 text-sm font-medium text-fg">Simon-Pierre Boucher</p>88            <a href="mailto:contact@spboucher.ai" className="mt-1 inline-flex items-center gap-1.5 text-sm text-fg-muted transition-colors hover:text-fg">89              <Mail className="size-3.5" aria-hidden /> contact@spboucher.ai90            </a>91          </div>92          <div>93            <p className="text-[11px] font-medium uppercase tracking-[0.12em] text-fg-subtle">Hosted on</p>94            <a href="https://www.maclustr.io" target="_blank" rel="noreferrer noopener" className="mt-1.5 inline-flex items-center gap-1.5 text-sm font-medium text-fg transition-colors hover:text-accent">95              MacLustr — www.maclustr.io <ExternalLink className="size-3.5 text-fg-subtle" aria-hidden />96            </a>97            <p className="mt-1 text-sm text-fg-muted">A private cluster of Apple silicon Macs in Québec.</p>98          </div>99          <div>100            <p className="text-[11px] font-medium uppercase tracking-[0.12em] text-fg-subtle">Contact</p>101            <p className="mt-1.5 text-sm text-fg-muted">102              Questions, bugs, security reports:{" "}103              <Link href="/contact" className="font-medium text-fg underline-offset-4 hover:underline">104                contact page105              </Link>106              .107            </p>108          </div>109        </div>110111        <div className="mt-8 flex flex-col gap-3 border-t border-border pt-6 text-xs text-fg-subtle sm:flex-row sm:items-start sm:justify-between">112          <p>© {new Date().getFullYear()} PolyLLM · Simon-Pierre Boucher. All rights reserved.</p>113          <p className="max-w-lg leading-5 sm:text-right">114            OpenAI, Anthropic, Google Gemini, xAI, Mistral AI, DeepSeek, Moonshot AI (Kimi), OpenRouter and Cerebras are trademarks of their respective owners. PolyLLM is an independent product and is not affiliated with or endorsed by any provider.115          </p>116        </div>117      </div>118    </footer>119  );120}121