Session 9: api-football + FootApi + Tank01 adapters, grace period middleware, cookie consent, /pricing page, OOM fix documented (1240 tests)

This commit is contained in:
Kev
2026-06-10 19:41:37 -04:00
parent 4db1c1c539
commit b55dcbd614
25 changed files with 2463 additions and 22 deletions
+40
View File
@@ -0,0 +1,40 @@
import type { Metadata } from 'next';
import Pricing from '@/components/Pricing';
export const metadata: Metadata = {
title: 'Pricing — VYNDR',
description: 'Founder pricing locks for life. $14.99/mo Analyst, $44.99/mo Desk. First 100 seats only.',
openGraph: {
title: 'VYNDR — Founder Pricing',
description: 'Sports prop intelligence. Beta pricing locks for life. First 100 seats.',
type: 'website',
url: 'https://vyndr.app/pricing',
},
twitter: {
card: 'summary_large_image',
title: 'VYNDR — Founder Pricing',
description: 'Sports prop intelligence. Beta pricing locks for life.',
},
};
/**
* Dedicated /pricing route. The Pricing component is also embedded on
* the landing page under the `#pricing` anchor; this page exists so:
* - The renewal email at `web/src/services/email.ts` (which links
* to `/pricing`) lands on something real instead of 404'ing.
* - Nav / CTA links can hand users a single stable URL whether
* they're already authenticated or not.
* - SEO crawlers see pricing on a canonical URL, not deep in the
* landing-page anchor.
*
* The component itself is fully client-side rendered (it owns
* checkout state + AuthContext access), so this page wraps it in a
* minimal scroll-restoration-friendly shell.
*/
export default function PricingPage() {
return (
<main style={{ minHeight: '100vh', paddingTop: 64 }}>
<Pricing />
</main>
);
}