// landing.jsx — StarPath landing page const landingStyles = { hero: { position: 'relative', minHeight: '92vh', padding: '40px 56px 80px', overflow: 'hidden', display: 'grid', gridTemplateColumns: '1.15fr 1fr', gap: '40px', alignItems: 'center', }, heroBg: { position: 'absolute', right: '-180px', top: '50%', transform: 'translateY(-50%)', pointerEvents: 'none', opacity: 0.6, }, }; const HeroBackdrop = () => (
{/* Radial vignette */}
{/* Large background chart on the right */}
); const Hero = () => (
{/* Left column — copy */}
{/* Хук уникального механизма: снимает главное возражение «это же гороскопы» раньше, чем человек успевает его сформулировать. */}
Правило 0,01°

Почему всё
повторяется?
И что делать.

Третий раз один и тот же финал в отношениях. Карьера, которая стоит третий год. Вопрос «со мной что-то не так» в два часа ночи. Разбор показывает механику: в какой точке всё каждый раз сворачивает не туда — и что с этим делать. Стоит как один сеанс у психолога.

{/* Trust strip */}
{[ { num: '0,01', unit: '°', label: 'точность позиций планет' }, { num: '<1', unit: 'часа', label: 'от данных до PDF' }, { num: '7', unit: 'дней', label: 'возврат, если не зашло' }, ].map((s, i) => (
{s.num} {s.unit}
{s.label}
))}
{/* Right column — natal chart */}
{/* Floating annotation */}
Текущий момент
Луна в Скорпионе
18.05.2026 · 14:32 MSK
Транзит
Юпитер ↔ Сатурн
оппозиция, 4° орб
); // ——— Marquee strip with running zodiac glyphs ——— const ZodiacMarquee = () => (
{[...ZODIAC_ORDER, ...ZODIAC_ORDER, ...ZODIAC_ORDER].map((z, i) => (
{{ aries: 'Овен', taurus: 'Телец', gemini: 'Близнецы', cancer: 'Рак', leo: 'Лев', virgo: 'Дева', libra: 'Весы', scorpio: 'Скорпион', sagittarius: 'Стрелец', capricorn: 'Козерог', aquarius: 'Водолей', pisces: 'Рыбы' }[z]}
))}
); // ——— Как это работает: три шага и три правила ——— // // Раньше здесь шли две секции подряд — «Механика: почему это не гороскоп» и // «Как это работает» — и рассказывали одно и то же дважды: правило 0,01° и шаг // «сначала считает астрономия», второй проход и шаг «второй проход и PDF». В // шапке они тоже стояли рядом двумя пунктами, ведущими по сути в одно место. // // Осталась одна секция. Спина — три шага (что человек делает и что получает), // на каждом висит правило, из-за которого шаг даёт не то, что даёт гороскоп по // знаку. Третье правило — «правило второй недели» — про результат, а не про // процесс, поэтому стоит плашкой под шагами, а не четвёртой колонкой в ряду. // // Секция не отрицает, что это астрология: мы сами отдаём бесплатный гороскоп // по знаку на /goroskop, и «это не гороскоп» рядом с ним звучало как враньё. // Сравнение идёт по объёму входных данных: у гороскопа в ленте на входе одно // Солнце и двенадцатая часть страны в читателях, здесь — дата, время и место // одного человека. Это же и ответ на «чем платное лучше бесплатного». // // Про языковую модель здесь не кричим. Она работает на шаге интерпретации и по // уже посчитанным цифрам, а не считает карту, — сказать это один раз в FAQ // («Это просто текст из нейросети?») честнее, чем повторять в каждом блоке: // в продающем тексте это звучит не как гарантия точности, а как оправдание. // // id="how", а не "mechanism": на этот якорь ведут подвал и шапка сайта. const HowItWorks = () => (
Как это работает · 03

Не по знаку Солнца, а по всей твоей карте

Гороскоп по знаку знает про тебя одно: где стояло Солнце. Разбор считается на дату, время и место рождения — по всем планетам, домам и аспектам. Три шага, без опросников и шаманизма.
{[ { n: '01', rule: 'Без опросников', title: 'Введи данные', desc: 'Имя, дата, время и место рождения — больше ничего. Время не помнишь — оставь пустым: разбор соберётся, просто без глав про дома. Точное время обычно стоит в свидетельстве о рождении.', ic: , }, { n: '02', rule: 'Правило 0,01°', title: 'Сначала расчёт', desc: 'Положение планет на минуту твоего рождения берётся из эфемерид Swiss Ephemeris — с точностью до сотой доли градуса. Это тот же расчёт, которым пользуется астрономия. Дальше в работу идут конкретные градусы, дома и аспекты твоей карты, а не знак Солнца.', ic: , }, { n: '03', rule: 'Воду вычёркивают до тебя', title: 'Потом интерпретация', desc: 'Посчитанное разбирается по методике школы Левин/Подводный. Каждую готовую главу перечитывает второй редактор и убирает всё, что подошло бы любому человеку: абзац, который можно отправить и твоей маме, и твоей коллеге, до тебя не доходит. Разбор приходит на email меньше чем за час и остаётся в кабинете навсегда.', ic: , }, ].map((s, i) => (
{s.n}
{s.ic}
{s.rule}

{s.title}

{s.desc}

))}
Правило второй недели · не совет, а схема

На выходе не «прислушайся к себе», а карта повторяющегося сценария: в какой точке он каждый раз начинается. Обычно это вторая неделя, а не седьмой месяц в два часа ночи.

); // ——— Бесплатный расчёт ——— // // Вход в воронку: посчитать можно до всякой регистрации и оплаты. Карточки те // же, что на посадочных страницах (free-calc.jsx), — своя копия разошлась бы с // продуктом при первой правке. // // Стоит на главной, а не только на отдельной странице: до этого /matrica жила // без единой ссылки на неё, и бесплатный расчёт существовал только для тех, // кто знает адрес наизусть. const FreeCalc = () => (
Бесплатно, без регистрации

Посмотри свою карту прямо сейчас

Натальная карта считается по дате, времени и месту рождения — Солнце, Луна и Асцендент появятся сразу на экране. Не знаете времени — есть матрица судьбы, ей хватает одной даты.

Позиции считаются по эфемеридам, тем же, что и в платном разборе. Разница не в точности, а в глубине: расчёт показывает конфигурацию, разбор объясняет, что она означает в вашей жизни.{' '} Подробнее про натальную карту {' · '} про матрицу

); // ——— Products ——— const Products = () => { const items = [ { title: catalogTitle('natal', 'Натальная карта'), service: 'natal', product: 'natal', tag: 'бестселлер', planets: ['sun', 'moon', 'mercury'], price: catalogPriceText('natal', 1990), desc: 'Почему ты выбираешь именно таких, в какой момент начинаешь исчезать в другом человеке и где твои деньги совпадают с твоей энергией.', pages: '6 глав · PDF и интерактивная карта', accent: 'gold', }, { title: catalogTitle('year_ahead', 'Прогноз на год'), service: 'year_ahead', product: 'forecast', tag: 'прогноз', planets: ['jupiter', 'saturn'], price: catalogPriceText('year_ahead', 2990), desc: 'Когда давить, когда лучше ничего не начинать, а когда прыгать. Чтобы в ноябре, если накроет, ты знала: это месяц, а не ты.', pages: 'календарь года · помесячные окна', accent: 'celest', }, { title: catalogTitle('compatibility', 'Совместимость'), service: 'compatibility', product: 'compat', tag: 'двое', planets: ['venus', 'mars'], price: catalogPriceText('compatibility', 2490), desc: 'Мой ли это человек — или мы просто ссоримся по одному и тому же кругу. Где вам легко, а где будет больно и почему.', pages: 'синастрия двоих · от притяжения до конфликтов', accent: 'rose', }, { // Подписка, а не разовый разбор. До этого здесь стоял «Индивидуальный // гороскоп» за 199 ₽ — недельный forecast_week, которого нет ни в // каталоге (/api/catalog его не отдаёт, цена бралась из фолбэка), ни в // карточках визарда. Человек читал «на каждый день · 199 ₽», кликал и // попадал на экран, где ежедневное стоит 299 ₽ в месяц. title: 'Ежедневный прогноз', product: 'daily', tag: 'подписка', planets: ['moon', 'sun'], price: rubFmt(subscriptionOffer().price_rub) + '/мес', desc: 'Каждое утро — короткое сообщение про твой день по твоей карте, а не «всем Овнам сегодня».', pages: `первые ${subscriptionOffer().trial_days} дней бесплатно · отменить в один клик`, accent: 'sage', }, ]; return (
Каталог · 04

Выбери, что важно сейчас

Три разбора под три разных вопроса и подписка на каждый день. Всё считается по одной и той же карте — твоей.
{items.map((p, i) => (
{/* Карточки каталога вдвое выше карточек механики — звёзд на них больше, иначе та же дюжина на большей площади читается как случайно забытые точки. */} {/* corner ornament */}
{p.tag} 0{i + 1}
{p.planets.map((pl, j) => (
))}

{p.title}

{p.desc}

{p.pages} {p.price}
{/* Выбор доезжает до визарда: без ?product= он открывался на натальной карте, что бы человек ни нажал на главной. */} {/* Пример этого продукта, а не «пример вообще»: раньше единственная ссылка вела на натальную карту, и выбирающий матрицу изучал чужой товар. */} {p.service && catalogHasExample(p.service) && ( Посмотреть пример )}
))}
); }; // ——— Sample chapter preview ——— const SampleChapter = () => (
Что внутри PDF · 05

Шесть вопросов,
которые ты уже себе задавала.

Не магия и не «звёзды велят». Каждая глава берёт один твой вопрос и отвечает на него через твою карту — по-русски, с конкретикой, без гороскопной воды.

{[ { ic: , title: 'Со мной что-то не так или это нормально', sub: 'Солнце, Луна, асцендент' }, { ic: , title: 'Почему я снова выбираю таких', sub: 'Венера, Марс, 7 дом' }, { ic: , title: 'Почему дохожу до финала и не прохожу', sub: 'МС, Сатурн, 10 дом' }, { ic: , title: 'Куда мне на самом деле идти', sub: 'Лунные узлы, 12 дом' }, { ic: , title: 'Почему меня выключает к четвергу', sub: 'Марс, 6 дом, Хирон' }, { ic: , title: 'Что с этим делать в понедельник утром', sub: 'Практики и journal-вопросы' }, ].map((c, i) => (
{c.ic}
{c.title}
{c.sub}
))}
{/* PDF Preview mockup */}
STAR PATH
Глава 1
Глава 1 · Ядро личности

Солнце в Раке,
Луна в Скорпионе

«В тебе с рождения живёт парадокс: мягкость снаружи (Рак), но глубокий, иногда тёмный внутренний мир (Скорпион). Это даёт тебе редкий дар — видеть людей насквозь, не теряя при этом доброты...»

Пример из реального разбора · анонимизировано
{/* page peek behind */}
); // ——— Testimonials ——— // // В секции только тексты клиентов из /api/reviews, прошедшие модерацию. // Придуманных карточек здесь больше нет: под видом отзыва на продающей // странице стоял текст, который никто нам не писал, — и он же оттеснял // настоящий отзыв, пока их не набиралось три. Нет одобренных отзывов — // секции нет вовсе: пустое место честнее выдуманного. const Testimonials = () => { const [real, setReal] = React.useState([]); React.useEffect(() => { let alive = true; fetch('/api/reviews?limit=6', { credentials: 'same-origin' }) .then(r => (r.ok ? r.json() : { reviews: [] })) .then(d => { if (alive) setReal((d && d.reviews) || []); }) .catch(() => {}); return () => { alive = false; }; }, []); const items = real.slice(0, 3); // Секция существует ровно тогда, когда есть что показать. if (items.length === 0) return null; // Одна-две карточки в сетке на три колонки растянулись бы во всю ширину и // читались как недоделанная секция. Колонок ровно столько, сколько карточек. const cols = Math.min(items.length, 3); const gridMaxWidth = cols === 1 ? '560px' : cols === 2 ? '880px' : 'none'; return (
Отзывы · 06

Что говорят

{items.map((t, i) => (
{/* seed от текста, а не от индекса: секция подменяет затравочные отзывы настоящими, и по индексу узор бы не поменялся. */}

«{t.text}»

{/* Знак — только оформление; в пограничные сутки бэкенд его не присылает, и тогда в кружке остаётся первая буква имени. */} {t.zodiac ? : {(t.name || '·').slice(0, 1)}}
{t.name}
{t.note &&
{t.note}
}
))}
); }; // ——— FAQ ——— const FAQItem = ({ q, a }) => { const [open, setOpen] = React.useState(false); return (
{open && (
{a}
)}
); }; const FAQ = () => (
Вопросы · 08

Что обычно спрашивают

); // ——— Цена вопроса: якорь против терапии и часовой консультации ——— const PriceAnchor = () => (
Цена вопроса · 07

Сколько стоит тот же вопрос

Всё это — способы ответить себе на одно и то же «почему у меня опять так». Цены средние по Москве.

{[ { what: 'Год терапии', price: '≈ 216 000 ₽', note: 'первые три месяца уходят на «давайте познакомимся»' }, { what: 'Час у астролога', price: '4 500 ₽', note: 'аудиозапись, которую переслушивают один раз' }, { what: 'Курс «найди себя»', price: '30 000 ₽', note: '12 недель и 60 уроков, которые редко досматривают' }, { what: 'Разбор Star Path', price: catalogPriceText('natal', 1990), note: 'читается за вечер, остаётся в кабинете навсегда', own: true }, ].map((r, i) => (
{r.what}
{r.note}
{r.price}
))}
); // ——— CTA ——— const FinalCTA = () => (

Хватит гадать,
что с тобой не так.

Ответы про характер, отношения и карьеру — в одном разборе. Остаётся в кабинете навсегда: в ноябре, когда снова накроет, его можно перечитать.

7 дней на возврат, если не узнаешь себя
); // ——— Footer ——— // Разметку не держим здесь: футер один на весь сайт и лежит в // web/landing/partials/footer.html. Сервер подставляет его в