Files
vyndr/web/src/components/Footer.tsx
T
builtbykev 4b262fdd65 S2 (a1): compliance + approval pack
- /responsible-gambling rebuilt sincerely: 21+, 1-800-GAMBLER primary,
  17-state resource list, warning signs, self-exclusion guidance, links
  to the existing /settings surfaces. No marketing adjacency.
- /terms + /privacy honest drafts with entity placeholders ([ENTITY NAME],
  [STATE OF FORMATION], [ARBITRATION VENUE], [CONTACT EMAIL]); privacy
  sub-processors match reality (adds Sentry, honest PostHog description).
- NEW /methodology: pipeline -> engine -> letter grades, refusals,
  VYNDR Originals, ledger settle + CLV + n>=20, why misses are public.
- /about audited to North Star framing (THE PROOF card, methodology link).
- Footer: 1-800-GAMBLER + Methodology link; compliance audit found zero
  pages suppressing the global footer.
- 5 Ghost seed articles in content/articles/ + docs/GHOST-PUBLISHING.md
  manual runbook (no Ghost access used).
- tests/unit/compliancePages.test.js (repo source-text style). 2429 tests
  green, web build exit 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 14:29:31 -04:00

96 lines
3.4 KiB
TypeScript

import { Wordmark } from '@/components/vyndr';
// VYNDR 2.0 footer (§C.4). System language, not marketing — mono, uppercase
// labels, the Detroit signature, and the legal/21+ line. Server component
// (no interactivity); link hover is handled by the global .footer-link rule.
const COLUMNS: { head: string; links: { label: string; href: string }[] }[] = [
{
head: 'PRODUCT',
links: [
{ label: 'Slate', href: '/dashboard' },
{ label: 'The Terminal', href: '/terminal' },
{ label: 'Pricing', href: '/pricing' },
{ label: 'Invite friends', href: '/invite' },
],
},
{
head: 'COMPANY',
links: [
{ label: 'About', href: '/about' },
{ label: 'Methodology', href: '/methodology' },
{ label: 'The Report', href: '/blog' },
{ label: 'Help & FAQ', href: '/help' },
],
},
{
head: 'LEGAL',
links: [
{ label: 'Responsible Play', href: '/responsible-gambling' },
{ label: 'Terms', href: '/terms' },
{ label: 'Privacy', href: '/privacy' },
],
},
];
const mono = { fontFamily: 'var(--mono)' } as const;
export default function Footer() {
return (
<footer style={{ borderTop: '1px solid var(--border)', marginTop: 40, padding: '34px 24px' }}>
<div style={{ maxWidth: 1320, margin: '0 auto' }}>
<div style={{ display: 'flex', justifyContent: 'space-between', flexWrap: 'wrap', gap: 28 }}>
<div style={{ maxWidth: 300 }}>
<a href="/" aria-label="VYNDR — home" style={{ display: 'inline-flex' }}>
<Wordmark size="sm" beta />
</a>
<div style={{ ...mono, fontSize: 11.5, color: 'var(--text-2)', lineHeight: 1.7, marginTop: 14 }}>
Prop intelligence the books don&apos;t want you to have. Analytics tool, not a sportsbook.
</div>
</div>
<div style={{ display: 'flex', gap: 48, flexWrap: 'wrap' }}>
{COLUMNS.map((col) => (
<div key={col.head}>
<div className="label" style={{ fontSize: 9.5, marginBottom: 12 }}>{col.head}</div>
<div style={{ display: 'flex', flexDirection: 'column', gap: 9 }}>
{col.links.map((l) => (
<a key={l.label} href={l.href} className="footer-link" style={{ ...mono, fontSize: 12, color: 'var(--text-1)', textDecoration: 'none' }}>
{l.label}
</a>
))}
</div>
</div>
))}
</div>
</div>
<div
style={{
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
flexWrap: 'wrap',
gap: 12,
marginTop: 30,
paddingTop: 20,
borderTop: '1px solid var(--border)',
}}
>
<div style={{ ...mono, fontSize: 11, color: 'var(--text-2)' }}>
VYNDR is an analytics tool, not a sportsbook. Not financial advice. Gamble responsibly. 21+ ·{' '}
<a href="tel:18004262537" style={{ color: 'var(--amber)', textDecoration: 'none' }}>1-800-GAMBLER</a>
</div>
<div style={{ ...mono, fontSize: 11, color: 'var(--text-2)' }}>
BUILT BY KEVON BUTLER · DETROIT · © 2026 VYNDR
</div>
</div>
</div>
<style>{`
.footer-link { transition: color .15s; }
.footer-link:hover { color: var(--text-0); }
`}</style>
</footer>
);
}