// ─── K&N Elite — Funnel screens (unified light premium) ─── const { useState, useEffect, useRef } = React; // ═══════════ SCREEN 1 — HERO + ADDRESS (full-bg photo) ═══════════ function ScreenAddress({ data, setData, onNext }) { const { t } = useI18n(); const [addr, setAddr] = useState(data.address || ""); const [postal, setPostal] = useState(data.postal || ""); const [error, setError] = useState(""); const submit = () => { if (!addr.trim()) { setError(t("s1_address_ph")); return; } setData({ ...data, address: addr, postal }); onNext(); }; return (
{/* HERO — full background photo */}
Мадрид · Барселона · Валенсия · Аликанте
K&N Elite · Агентство элитной недвижимости

{t("s1_title")}
{t("s1_title_em")}

{t("s1_sub")}

{ e.preventDefault(); submit(); }} className="rise-slow" style={{ marginTop: 48, maxWidth: 620, marginLeft: "auto", marginRight: "auto", animationDelay: ".35s" }}>
{ setAddr(e.target.value); setError(""); }} autoFocus />
{error &&
{error}
}
Бесплатно Без регистрации 2 минуты
Средняя премия
+8,4%
к рыночной цене
По 420+ проданным объектам за 2025
{/* HOW IT WORKS section */}
{t("s1_how_title")}

Четыре шага до вашего отчёта

{[t("s1_how_1"), t("s1_how_2"), t("s1_how_3"), t("s1_how_4")].map((s, i) => (
0{i + 1}
{s}
))}
  {t("s1_coverage")}  
); } // ═══════════ SCREEN 2 — DETAILS (с 4 карточками типа) ═══════════ function ScreenDetails({ data, setData, onBack, onNext }) { const { t } = useI18n(); const [d, setD] = useState({ ...data }); const upd = (k, v) => setD({ ...d, [k]: v }); const toggleExtra = (v) => { const arr = d.extras.includes(v) ? d.extras.filter(x => x !== v) : [...d.extras, v]; upd("extras", arr); }; const submit = () => { setData(d); onNext(); }; const floorOptions = [ { v: "low", label: "Первый этаж", hint: "Партер, нижний уровень", icon: "⬇" }, { v: "mid", label: "Средний этаж", hint: "Между 2 и предпоследним", icon: "≡" }, { v: "top", label: "Верхний / Пентхаус", hint: "Последний этаж с террасой", icon: "⬆" }, { v: "house", label: "Частный дом", hint: "Отдельно стоящий объект", icon: "⌂" }, ]; return (

{t("s2_sub")}

{/* Property type (4 cards) */}
Тип объекта
{floorOptions.map(o => ( ))}
{/* Area + rooms + baths */}
Площадь (м²)
upd("area", Number(e.target.value))} />
Комнат
upd("rooms", Number(e.target.value))} />
Санузлов
upd("baths", Number(e.target.value))} />
{/* Heating */}
Отопление
{/* Elevator + furniture */}
Лифт
upd("elevator", v === "y")} options={[{ value: "y", label: "Есть" }, { value: "n", label: "Нет" }]} />
Мебель
upd("furniture", v === "y")} options={[{ value: "y", label: "Есть" }, { value: "n", label: "Нет" }]} />
{/* Condition */}
Состояние
{[ { v: "reform", t: "Под ремонт", h: "Требуется реновация" }, { v: "good", t: "В хорошем состоянии", h: "Можно жить сразу" }, { v: "new", t: "Новое / после ремонта", h: "Недавно обновлено" }, ].map(o => ( ))}
{/* Extras */}
Дополнительно
{/* Actions */}
); } // ═══════════ SCREEN 3 — REPORT GENERATION (5 горизонтальных этапов, 10 сек каждый) ═══════════ function ScreenReport({ data, setData, onSubmit }) { const { t } = useI18n(); const [stage, setStage] = useState(0); const [stageProgress, setStageProgress] = useState(0); const [done, setDone] = useState(false); const [name, setName] = useState(data.name || ""); const [phone, setPhone] = useState(data.phone || ""); const [c1, setC1] = useState(false); const [c2, setC2] = useState(false); const stages = [ { t: "Собираем данные о похожих объектах", s: "Catastro · Idealista · Fotocasa · наша база" }, { t: "Анализируем динамику цен", s: "За 12 месяцев в радиусе 500 м" }, { t: "Рассчитываем базовую стоимость", s: "Коэффициенты по этажу, состоянию, площади" }, { t: "Оцениваем потенциал роста", s: "Что добавит наш подход к продаже" }, { t: "Формируем отчёт", s: "Диапазон, аналоги, рекомендации" }, ]; const STAGE_MS = 3000; useEffect(() => { if (stage >= stages.length) { setDone(true); return; } const start = performance.now(); let raf; const tick = (now) => { const p = Math.min(1, (now - start) / STAGE_MS); setStageProgress(p); if (p < 1) { raf = requestAnimationFrame(tick); } else { setStage(s => s + 1); setStageProgress(0); } }; raf = requestAnimationFrame(tick); return () => cancelAnimationFrame(raf); }, [stage]); const submit = () => { if (!name.trim() || !phone.trim() || !c1) return; setData({ ...data, name, phone }); onSubmit(); }; const advantages = [ { t: "Профессиональная фотосъёмка", b: "На каждый объект выезжает команда фотографов. Покупатель решает «смотреть или листать дальше» за 3 секунды — по первому кадру.", }, { t: "Хоум-стейджинг перед выходом на рынок", b: "Готовим объект к съёмке и показам: расстановка, текстиль, нейтрализация личных деталей. Сокращает срок продажи на 30–40%.", }, { t: "Закрытые группы покупателей + мультиканальное продвижение", b: "Своя база проверенных покупателей и закрытые клубы инвесторов видят объект до публикации на Idealista. Параллельно — таргетированная реклама и партнёрские агентства в Европе.", }, { t: "Агенты — выпускники нашего университета", b: "У нас свой университет с программой подготовки: право, налоги, оценка, переговоры. С клиентами работают только те, кто сдал экзамен.", }, ]; return (

Готовим отчёт по адресу: {data.address || "Calle Serrano 42, Madrid"}

{/* 5 горизонтальных этапов */}
{stages.map((s, i) => { const isActive = i === stage; const isDone = i < stage; return (
0{i + 1}
{s.t}
{s.s}
✓ готово
); })}
{done && (
✓ Готово
Отчёт собран. Оставьте контакты ниже — пришлём в WhatsApp в течение минуты.
)} {/* ─ Преимущества K&N Elite ─ */}
Почему именно K&N Elite

Четыре вещи, которые дают +6–11% к цене

Эти практики мы используем для каждого объекта в продаже

{advantages.map((a, i) => (
0{i + 1}
{a.t}
{a.b}
))}
Такой отчёт мы готовим для вашего объекта
{/* Lead form */}
Получить отчёт

Куда прислать отчёт?

Отправим PDF и короткое голосовое с комментариями аналитика

Имя
setName(e.target.value)} placeholder="Иван" />
Телефон / WhatsApp
setPhone(e.target.value)} placeholder="+34 612 345 678" />
Согласен с политикой обработки данных Хочу получать аналитику по рынку Мадрида и Барселоны
); } // ═══════════ SCREEN 4 — CONFIRMATION ═══════════ function ScreenConfirm({ data, onHome, onLogin }) { const { t } = useI18n(); return (
Отчёт отправлен

Готово. Проверьте WhatsApp.

Отчёт пришёл на номер {data.phone || "+34 612 345 678"}

Персональный менеджер свяжется в течение часа

Что дальше

Мы можем помочь продать ваш объект с премией к рынку

{[ { photo: PHOTOS.interior1, t: "Оценить выезд", b: "Агент приедет с фотографом и оценит точно", c: "Записаться" }, { photo: PHOTOS.interior2, t: "Продать с нами", b: "Стейджинг, фото, реклама, показы, нотариус", c: "Обсудить" }, { photo: PHOTOS.interior3, t: "Кабинет", b: "Все оценки, статус сделки, документы", c: "Войти", action: onLogin }, ].map((a, i) => (

{a.t}

{a.b}
{a.c} →
))}
); } Object.assign(window, { ScreenAddress, ScreenDetails, ScreenReport, ScreenConfirm });