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
This commit is contained in:
@@ -1,65 +1,24 @@
|
||||
'use client';
|
||||
|
||||
import { useState } from 'react';
|
||||
import SectionHead from '@/components/vyndr/SectionHead';
|
||||
import GradeBadge from '@/components/vyndr/GradeBadge';
|
||||
import TerminalInput from '@/components/vyndr/TerminalInput';
|
||||
|
||||
// Head-to-head player comparison (§6). Sample data for now — real player
|
||||
// resolution wires to /api/players/search + game logs in a later pass.
|
||||
const SAMPLE = {
|
||||
a: { name: 'Nikola Jokić', team: 'DEN', rows: { 'L10 PTS': '28.4', 'L10 REB': '12.1', 'L10 AST': '9.8', 'Usage%': '29.1', 'Grade': 'A+' } },
|
||||
b: { name: 'Victor Wembanyama', team: 'SA', rows: { 'L10 PTS': '26.9', 'L10 REB': '10.4', 'L10 AST': '4.2', 'Usage%': '31.0', 'Grade': 'A' } },
|
||||
};
|
||||
const ROW_KEYS = ['L10 PTS', 'L10 REB', 'L10 AST', 'Usage%', 'Grade'];
|
||||
|
||||
const num = (v: string) => parseFloat(v.replace(/[^\d.]/g, ''));
|
||||
|
||||
// Head-to-head player comparison (§6). IN DEVELOPMENT — real two-player
|
||||
// resolution wires to /api/players/search + live game logs in a later pass.
|
||||
// Until then this surface shows an honest in-development state: NO sample
|
||||
// matchups, NO hardcoded grades, no fabricated verdict.
|
||||
export default function ComparePage() {
|
||||
const [a, setA] = useState('Nikola Jokić');
|
||||
const [b, setB] = useState('Victor Wembanyama');
|
||||
|
||||
return (
|
||||
<section style={{ maxWidth: 860, margin: '0 auto', padding: '28px 16px 96px' }}>
|
||||
<SectionHead accent="var(--g-a)">▚ HEAD TO HEAD</SectionHead>
|
||||
<h1 className="mono" style={{ fontSize: 28, fontWeight: 800, letterSpacing: '-0.02em', margin: '8px 0 18px' }}>COMPARE</h1>
|
||||
|
||||
<div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12, marginBottom: 20 }}>
|
||||
<TerminalInput prompt="›" value={a} onChange={setA} placeholder="Player A" />
|
||||
<TerminalInput prompt="›" value={b} onChange={setB} placeholder="Player B" amber />
|
||||
</div>
|
||||
|
||||
<div style={{ background: 'var(--bg-1)', border: '1px solid var(--border)', borderRadius: 10, overflow: 'hidden' }}>
|
||||
<div style={{ display: 'grid', gridTemplateColumns: '1fr 140px 1fr', padding: '14px 16px', background: 'var(--bg-2)', borderBottom: '1px solid var(--border)', alignItems: 'center' }}>
|
||||
<div style={{ fontSize: 16, fontWeight: 800, textAlign: 'right' }}>{SAMPLE.a.name} <span className="mono" style={{ fontSize: 11, color: 'var(--text-2)' }}>{SAMPLE.a.team}</span></div>
|
||||
<div className="label" style={{ textAlign: 'center' }}>VS</div>
|
||||
<div style={{ fontSize: 16, fontWeight: 800 }}>{SAMPLE.b.name} <span className="mono" style={{ fontSize: 11, color: 'var(--text-2)' }}>{SAMPLE.b.team}</span></div>
|
||||
</div>
|
||||
{ROW_KEYS.map((k) => {
|
||||
const av = SAMPLE.a.rows[k as keyof typeof SAMPLE.a.rows];
|
||||
const bv = SAMPLE.b.rows[k as keyof typeof SAMPLE.b.rows];
|
||||
const isGrade = k === 'Grade';
|
||||
const aWins = !isGrade && num(av) >= num(bv);
|
||||
const bWins = !isGrade && num(bv) >= num(av);
|
||||
return (
|
||||
<div key={k} style={{ display: 'grid', gridTemplateColumns: '1fr 140px 1fr', padding: '11px 16px', borderBottom: '1px solid var(--border)', alignItems: 'center' }}>
|
||||
<div className="mono" style={{ textAlign: 'right', fontSize: 15, fontWeight: 700, color: aWins ? 'var(--g-a)' : 'var(--text-0)' }}>
|
||||
{isGrade ? <GradeBadge grade={av} size="sm" glow /> : av}
|
||||
</div>
|
||||
<div className="label" style={{ textAlign: 'center' }}>{k}</div>
|
||||
<div className="mono" style={{ fontSize: 15, fontWeight: 700, color: bWins ? 'var(--g-a)' : 'var(--text-0)' }}>
|
||||
{isGrade ? <GradeBadge grade={bv} size="sm" glow /> : bv}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
|
||||
<div className="intel-surface scanlines" style={{ marginTop: 16, borderRadius: 10, padding: '16px 18px', position: 'relative', overflow: 'hidden' }}>
|
||||
<div className="intel-surface scanlines" style={{ borderRadius: 10, padding: '22px 20px', position: 'relative', overflow: 'hidden' }}>
|
||||
<div style={{ position: 'relative', zIndex: 2 }}>
|
||||
<div className="label" style={{ color: 'rgba(232,255,244,.6)', marginBottom: 6 }}>VYNDR VERDICT</div>
|
||||
<div className="label" style={{ color: 'rgba(232,255,244,.6)', marginBottom: 8 }}>IN DEVELOPMENT</div>
|
||||
<div className="mono" style={{ fontSize: 14, color: '#e8fff4', lineHeight: 1.6 }}>
|
||||
{SAMPLE.a.name} carries the higher floor on scoring, boards, and playmaking — on current form, the edge tilts his way.
|
||||
Head-to-head comparison is being wired to live player game logs. We are not
|
||||
shipping sample matchups here — when the real two-player read is ready it grades
|
||||
from the same pipeline as every other card. Check back soon.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -83,7 +83,7 @@ export default function DeskShowcase() {
|
||||
Claim a Founder Desk →
|
||||
</a>
|
||||
<span className="mono" style={{ fontSize: 12.5, color: 'var(--text-tertiary)' }}>
|
||||
<span style={{ color: 'var(--g-a)', fontWeight: 700 }}>$34.99</span> locked for the first 100 · then $44.99
|
||||
<span style={{ color: 'var(--g-a)', fontWeight: 700 }}>$44.99</span> locked for the first 100 founders · the rate holds for life
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user