// matrix-landing.jsx — отдельная страница «Матрица судьбы» в дизайн-системе Star Path. // Переиспользует LandingNav / Footer / landingStyles из landing.jsx (общая babel-область). // Воронка: free-calc по дате (/api/free/matrix) → email-лид (/api/free/lead) → // CTA на полный разбор (/order/new?product=matrix → guest-checkout). const mxMaskDate = (s) => { const d = (s || '').replace(/\D/g, '').slice(0, 8); const p = [d.slice(0, 2)]; if (d.length >= 3) p.push(d.slice(2, 4)); if (d.length >= 5) p.push(d.slice(4, 8)); return p.filter(Boolean).join('.'); }; const MX_SECTIONS = [ { n: '01', t: 'Ядро личности', d: 'Главный аркан и как тебя видят' }, { n: '02', t: 'Предназначение', d: 'Вектор реализации и смысл пути' }, { n: '03', t: 'Таланты', d: 'Врождённые сильные стороны' }, { n: '04', t: 'Деньги', d: 'Денежный канал и реализация в деле' }, { n: '05', t: 'Отношения', d: 'Как строишь близость и любовь' }, { n: '06', t: 'Кармическая задача', d: 'Главный урок души' }, { n: '07', t: 'Рекомендации', d: 'Конкретные практики по матрице' }, { n: '08', t: 'Октаграмма', d: 'Все 22 аркана на твоей карте' }, ]; const MatrixLanding = () => { const [dob, setDob] = React.useState(''); const [result, setResult] = React.useState(null); const [calculating, setCalculating] = React.useState(false); const [err, setErr] = React.useState(null); const [email, setEmail] = React.useState(''); const [leadConsent, setLeadConsent] = React.useState(false); const [leadSent, setLeadSent] = React.useState(false); const isoDob = () => { const m = (dob || '').match(/^(\d{1,2})[.\-/](\d{1,2})[.\-/](\d{4})$/); return m ? `${m[3]}-${m[2].padStart(2, '0')}-${m[1].padStart(2, '0')}` : ''; }; const calc = async () => { const iso = isoDob(); if (!iso) { setErr('Введи дату в формате ДД.ММ.ГГГГ'); return; } setErr(null); setCalculating(true); try { const r = await fetch('/api/free/matrix', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ born_date: iso }), }); const d = await r.json(); if (!r.ok) throw new Error(d.error || 'Не удалось рассчитать'); setResult(d); } catch (e) { setErr(e.message || 'Ошибка'); } finally { setCalculating(false); } }; const sendLead = async () => { if (!email.includes('@')) { setErr('Укажи корректный email'); return; } if (!leadConsent) { setErr('Подтверди согласие с условиями'); return; } setErr(null); try { await fetch('/api/free/lead', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: email.trim(), kind: 'matrix', born_date: isoDob() }), }); } catch (_) { /* best-effort */ } setLeadSent(true); }; const goOrder = () => { window.location.href = '/order/new?product=matrix'; }; const inputStyle = { padding: '14px 16px', borderRadius: '10px', border: '1px solid var(--line)', background: 'rgba(255,255,255,0.03)', color: 'var(--ink-primary)', fontSize: '17px', textAlign: 'center', letterSpacing: '0.04em', width: '100%', }; // Карточка free-calc: либо форма, либо результат. const calcCard = (
{!result ? (
Бесплатный расчёт
setDob(mxMaskDate(e.target.value))} placeholder="ДД.ММ.ГГГГ" inputMode="numeric" style={inputStyle} /> {err &&
{err}
}
Без регистрации · результат сразу на экране
) : (
Твой главный аркан
{result.center?.arcanum}
{result.center?.name}

{result.teaser}

{(result.points || []).map(p => (
{p.arcanum}
{p.code}
))}
{!leadSent && ( <>

Хочешь полный разбор всех 9 точек — предназначение, деньги, отношения, карма?

setEmail(e.target.value)} placeholder="email — пришлём детали" style={{ ...inputStyle, fontSize: '15px', letterSpacing: 0 }} /> )} {leadSent &&
Готово — детали придут на email ✓
}
)}
); return (
Матрица судьбы

Рассчитай матрицу судьбы
бесплатно — по дате рождения.

Система самопознания на 22 арканах Таро. Без времени и места рождения — нужна только дата. Узнай свой главный аркан за минуту, а полный разбор раскроет предназначение, деньги и отношения.

{[ { num: '22', unit: 'аркана', label: 'на твоей карте' }, { num: '8', unit: 'глав', label: 'в полном разборе' }, { num: '1', unit: 'поле', label: 'нужна только дата' }, ].map((s, i) => (
{s.num} {s.unit}
{s.label}
))}
{calcCard}
Что внутри разбора

8 глав о тебе по матрице судьбы

{MX_SECTIONS.map(s => (
{s.n}
{s.t}
{s.d}
))}
); }; Object.assign(window, { MatrixLanding });