// Landing + magic-link flow. Export to window.Screens.Landing.
const { useState: useStateL } = React;
function Landing({ onAuthed }) {
const { Button, TextInput } = window.UI;
const I = window.Icons;
const [stage, setStage] = useStateL('input'); // input | sent | landed
const [email, setEmail] = useStateL('');
const [error, setError] = useStateL('');
const submit = () => {
const e = email.trim();
if (!e || !/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(e)) {
setError('Введите корректный email');
return;
}
setError('');
setStage('sent');
};
const continueAsNew = () => {
// user clicked the magic link
onAuthed({ email, firstTime: true });
};
const continueAsReturning = () => {
onAuthed({ email, firstTime: false });
};
return (
{/* nav */}
{/* left: pitch */}
v1.0 · early access
Карусели для соцсетей на автопилоте
Omneee читает ваши источники, предлагает темы по брендбуку и собирает карусели,
готовые к публикации. От голосовой заметки до ZIP с PNG — за две минуты.
{['#FF5A1F', '#26C281', '#7C5CFF', '#EF476F'].map((c, i) => (
))}
1 200+ авторов уже пишут с Omneee
{[
['RSS, Telegram, сайты', 'Подключите источники — мы вытащим темы'],
['Идеи в одном месте', 'Текст, ссылки, голосовые — всё попадает в бэклог'],
['Брендбук, который слушают', 'Цвета, шрифты, тон — Omneee помнит каждую деталь'],
].map(([t, s], i) => (
{t}. {s}.
))}
{/* right: auth card */}
{/* decorative carousel preview behind */}
Войти
Без паролей. По ссылке.
Введите email — пришлём ссылку для входа.
{stage === 'input' && (
}
value={email}
onChange={(v) => { setEmail(v); setError(''); }}
placeholder="you@email.com"
size="lg"
onKeyDown={(e) => e.key === 'Enter' && submit()}
autoFocus
/>
{error && {error}
}
}>Отправить ссылку
Нажимая «Отправить», вы соглашаетесь с условиями и политикой .
)}
{stage === 'sent' && (
Проверьте почту
Письмо отправлено на {email} .
Откройте ссылку из письма, чтобы войти.
Демо · симулируем клик
Войти как новый пользователь
Войти как существующий
setStage('input')}>← Изменить email
)}
);
}
function CoverPreview({ color1, color2, v = 1 }) {
const isV1 = v === 1;
return (
{isV1 ? '01 · ВВЕДЕНИЕ' : '03 · ЦИФРА'}
OMNEEE
{isV1 ? (
<>
Дизайн без AI
Манифест на 2026 год
>
) : (
<>
3×
рост ARR за квартал — что мы сделали
>
)}
@brand
);
}
window.Screens = window.Screens || {};
window.Screens.Landing = Landing;