Files
vyndr/web/src/app/pricing/page.tsx
T
builtbykev a18a3f33fc DS5 — Pricing (Desk-as-hero) + Motion + Empty/Error + archetype glyphs
Part 6 #8 — Desk $44.99 is the hero tier. New DeskShowcase leads the
pricing page with the "$1M terminal · $44.99" story + real feature
visuals (alt-line ladder, quarter-Kelly, parlay φ, real-time feed) in a
balanced two-column layout (kills the dead right-half). Desk is the sole
highlighted tier / single primary CTA (color contract #9); Analyst is
secondary. Real prices: Free 5 scans, Analyst $14.99/$19.99, Desk
$34.99/$44.99. ClaimMeter + Stripe checkout wiring untouched.

Part 4 #7 — Ticker → punctuated stillness. The continuous marquee is
retired; the ticker now RESTS ≥4s on each ranked item and pulses only on
change. The EKG heartbeat is a static readout — the header's ONE idle
proof-of-life is the single SIGNAL-LIVE live-dot (the ticker dropped its
competing pulse). All durations tokenized (--motion-*, --ticker-hold);
prefers-reduced-motion kills the motion entirely.

Part 8 #20 — new EmptyState component modeled on the north-star 404
(scanlines + glitch wordmark + amber system voice + CTA hierarchy),
reused at the bare-red "Team not found", "Game not found", and the
ledger empties — one unified voice.

Part 5 — archetype glyph+chip propagated to STREAKS rows + ledger rows
(optional + self-hiding; absent beats fabricated); grade reveal already
carries ArchetypeBlend.

Tests: new tests/unit/ds5PricingStates.test.js (22) locks all four
workstreams; updated teamHubUI + vyndrDesignSystem for the new surfaces.
237 suites / 2864 tests green; next build exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 00:31:35 -04:00

50 lines
1.8 KiB
TypeScript

import type { Metadata } from 'next';
import Pricing from '@/components/Pricing';
import { ClaimMeter } from '@/components/vyndr';
import DeskShowcase from './DeskShowcase';
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' }}>
{/* DS5 (#8) — Desk is the hero. The "$1M terminal" story leads, above the
grid, so the premium tier stops being an afterthought. */}
<DeskShowcase />
<Pricing />
{/* Founder-seat scarcity under the grid (§12) */}
<div style={{ padding: '8px 16px 48px' }}>
<ClaimMeter />
</div>
</main>
);
}