Files
vyndr/web/src/components/Features.tsx
T
builtbykev 6bc18d823c Honesty pass: remove every live fabrication (REMOVE/HIDE only, no feature cut)
Six live untruths corrected — no grade/snapshot/scorer/pipeline touched:
1. /compare — hardcoded Jokic A+/Wembanyama A + fake VERDICT replaced with an
   honest in-development state; removed from Nav + BottomTabBar (route still
   resolves, never the sample). Real two-player build is later.
2. Pricing — founder Desk $34.99→$44.99 (matches lib/checkout.js), Analyst
   $14.99; removed the struck $19.99/$44.99 "regular" numbers and DeskShowcase's
   stale $34.99. First-100 counter is real (ClaimMeter → Stripe countFounderSeats);
   no fake "first 50" desk claim added (no such counter exists).
3. FAQ "NexaPay" → Stripe (verified: live checkout is Next→Express→checkout.stripe.com).
4. FAQ + Features "Brier/CLV published from day one" removed (not surfaced yet) —
   returns when real. Backend Brier compute untouched.
5. MobileEdgeBoard removed from the Slate — its edge% feed was a miscalibrated
   placeholder (masked >40% as "—"); phones now show the real game cards.
6. Price triplet — never-computed model/EV now derives NO_MODEL (honest absent,
   MODEL "—" / "NOT PRICED", no verdict) instead of QUARANTINE's false "we
   suppressed our price / a leg is poisoned" copy. Fixes grade card + LiveHeroProp.

Full suite 3833 green, web build exit 0. Tests updated to the new honest contracts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VsztNChZ7vEvSR61AuMhD1
2026-07-27 06:04:00 -04:00

120 lines
3.7 KiB
TypeScript

const FEATURES = [
{
icon: '◆',
title: 'Player DNA archetypes',
body: 'Every player has a prop fingerprint. We classify it, show you which props are reliable vs volatile, and grade accordingly.',
},
{
icon: '↻',
title: 'Self-improving model',
body: 'Every resolved grade makes the next one sharper. The engine learns what works and corrects what doesn\'t.',
},
{
icon: '⚡',
title: 'Lineup intel before tip-off',
body: 'Real-time lineup and injury data from trusted sources, giving you the edge before the books adjust.',
},
{
icon: '⊘',
title: 'Kill conditions',
body: 'Six hard checks on every prop. If minutes, fatigue, blowout risk, or splits say no, we flag it — even on an A grade.',
},
{
icon: '∿',
title: 'Parlay correlation math',
body: 'We catch the legs that secretly fight each other. The books love correlated unders — we surface them before you tap.',
},
{
icon: '⌧',
title: 'Deep pitcher-batter matchups',
body: 'We score discipline, contact quality, and zone tendencies for every MLB matchup. Not just ERA.',
},
{
icon: '◯',
title: 'Every sport, one engine',
body: 'NBA. MLB. WNBA. Soccer. NFL coming September 2026 — more rolling out through 2026. A unified intelligence layer with sport-specific calibration.',
},
{
icon: '⌦',
title: 'The honest ledger',
body: 'Every grade. Every result. No hiding. No deletion. Public accuracy by grade tier, once the sample is large enough to mean something.',
},
];
export default function Features() {
return (
<section
style={{
padding: '96px 24px',
borderTop: '1px solid var(--border)',
}}
>
<div style={{ maxWidth: 1200, margin: '0 auto' }}>
<header style={{ textAlign: 'center', maxWidth: 720, margin: '0 auto 64px' }}>
<h2
className="text-balance"
style={{
fontSize: 'clamp(28px, 4vw, 44px)',
fontWeight: 700,
letterSpacing: '-0.02em',
marginBottom: 16,
}}
>
One platform. Everything connected.
</h2>
<p style={{ fontSize: 17, color: 'var(--text-secondary)' }}>
Built by bettors who got tired of switching between five tabs to grade one prop.
</p>
</header>
<div
style={{
display: 'grid',
gap: 16,
}}
className="features-grid"
>
{FEATURES.map((f, i) => (
<div
key={f.title}
className={`surface surface-hover diagonal-cut animate-fade-up stagger-${(i % 6) + 1}`}
style={{ padding: 24 }}
>
<div
className="mono"
style={{
fontSize: 28,
color: 'var(--grade-a)',
marginBottom: 16,
lineHeight: 1,
}}
aria-hidden
>
{f.icon}
</div>
<h3 style={{ fontSize: 16, fontWeight: 600, marginBottom: 8 }}>{f.title}</h3>
<p style={{ fontSize: 14, color: 'var(--text-secondary)', lineHeight: 1.6 }}>{f.body}</p>
</div>
))}
</div>
</div>
<style jsx>{`
:global(.features-grid) {
grid-template-columns: 1fr;
}
@media (min-width: 640px) {
:global(.features-grid) {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 1024px) {
:global(.features-grid) {
grid-template-columns: repeat(4, 1fr);
}
}
`}</style>
</section>
);
}