/* sections-b.jsx — Houses, Advantages, Location, Gallery, FAQ, Form, Footer */ const { useState: useStateB, useRef: useRefB, useEffect: useEffectB } = React; const SHEETS_URL = "https://script.google.com/macros/s/AKfycbzDXsWykixh3-HAJqDOUqmRtjtuA8Xr0jXVrhztNif5UiqT5Q9u0POzsxUh-XRnfq2f/exec"; function Houses() { const specs = [ ["ruler", "Загальна площа", "76", "м²"], ["deck", "Простора тераса", "18", "м²"], ["sofa", "Кухня-вітальня", "1", "відкритий простір"], ["bed", "Окремі спальні", "2", "кімнати"], ]; return (
Будинки

Продумане
планування

Ми проаналізували попит і різні сценарії використання нерухомості — і створили формат, що має стабільно високий попит серед гостей цілий рік.

    {specs.map(([ic, k, v, u]) => (
  • {k} {v} {u}
  • ))}

Конструкторська модель будинку дозволяє адаптувати площу та опції під запит інвестора.

Спальня з панорамою Карпат
Вітальня-їдальня з виглядом на ліс
Ванна кімната в природних тонах
); } function Advantages() { const cards = [ ["mountain", "Локація з попитом цілий рік", "Тиша лісу поєднується з близькістю до сучасної інфраструктури — 5–15 хв до всього необхідного."], ["phone", "Безконтактний сервіс", "Усі послуги для гостей доступні через мобільний додаток — зручно та сучасно."], ["coins", "Пулова система доходу", "Прибуток від оренди всіх будинків об'єднується та рівномірно розподіляється між інвесторами за прозорими правилами."], ["shield", "Гарантії забудовника", "Незмінність ціни з моменту підписання договору та гнучкий графік оплати під 0% на весь час будівництва."], ]; return (
Чому «Теплий»

Керований дохідний продукт,
підтверджений нерухомістю

Ми — забудовник із власною керуючою компанією. Створюємо теплий відпочинок «як удома» з рівнем готельного сервісу, а для інвесторів — повністю керований дохідний продукт.

{cards.map(([ic, t, d], i) => (

{t}

{d}

))}
); } function Location() { const chips = [ ["pin", "Яремче, вул. Довбуша"], ["road", "5–15 хв до інфраструктури"], ["mountain", "Краєвиди Карпат"], ["tree", "Тиша смерекового лісу"], ]; return (
Локація

Яремче — перлина Карпат

Місце, що поєднує гірську природу, автентику та комфорт. Для тих, хто шукає спокій, традиції та активний відпочинок у будь-яку пору року.

{chips.map(([ic, t]) => {t})}
Прокласти маршрут
«Теплий» · Яремче
Відкрити в Google Maps
); } const GALLERY = [ [R("cabinMountain","assets/cabin-mountain.jpg"), "Дім із виглядом на гори"], [R("cabinBalcony","assets/cabin-balcony.png"), "Краєвид з тераси"], [R("cabinFire","assets/cabin-fire.jpg"), "Вечори біля ватри"], [R("cabinFamily","assets/cabin-family.jpg"), "Тепло сімейного відпочинку"], [R("cabinForest","assets/cabin-forest.png"), "Котеджі серед лісу"], ]; function Gallery() { const [current, setCurrent] = useStateB(0); const [idx, setIdx] = useStateB(-1); const open = idx >= 0; const touchX = useRefB(null); const N = GALLERY.length; const prev = () => setCurrent(c => (c - 1 + N) % N); const next = () => setCurrent(c => (c + 1) % N); const onTouchStart = (e) => { touchX.current = e.touches[0].clientX; }; const onTouchEnd = (e) => { if (touchX.current === null) return; const dx = e.changedTouches[0].clientX - touchX.current; if (Math.abs(dx) > 45) (dx < 0 ? next : prev)(); touchX.current = null; }; // Keyboard arrows drive the lightbox when open, otherwise the carousel. useEffectB(() => { const onKey = (e) => { if (open && e.key === "Escape") return setIdx(-1); if (e.key === "ArrowRight") open ? setIdx(i => (i + 1) % N) : next(); if (e.key === "ArrowLeft") open ? setIdx(i => (i - 1 + N) % N) : prev(); }; window.addEventListener("keydown", onKey); if (open) document.body.style.overflow = "hidden"; return () => { window.removeEventListener("keydown", onKey); document.body.style.overflow = ""; }; }, [open]); return ( ); } const FAQS = [ ["Де і коли відбудеться захід?", Зустрічаємося в Яремче, вул. Довбуша, 27 червня о 12:00 за київським часом. Після реєстрації ми надішлемо всі деталі заходу на вашу електронну пошту — тож вам не доведеться ні про що хвилюватися.], ["Що буде на заході?", На вас чекає особливий день знайомства з «Теплим» — його концепцією, перевагами та інвестиційним потенціалом. Ми подбали і про зміст, і про атмосферу: фуршет, вино та узвар, DJ-сет, welcome pack для кожного гостя, мольфарка з передбаченнями, фотозони та професійний фотограф. Для комфорту — затишні лаунж-зони з краєвидом на ліс, пледи та парасолі на випадок будь-якої погоди.], ["Як запросити колегу?", Раді, що ви плануєте відвідати подію разом! Просто надішліть колегам посилання на цей сайт, щоб вони також зареєструвалися. Так ми врахуємо всіх гостей і завчасно підготуємо welcome pack.], ["Як дізнатися про «Теплий» більше?", На основному сайті ви знайдете локацію, фінансові розрахунки та прогноз прибутковості, планування будинків і PDF-каталоги. Підписуйтесь на Instagram та Telegram, щоб першими отримувати новини.], ]; function Faq() { const [open, setOpen] = useStateB(0); return (
Питання та відповіді

Усе, що варто знати

{FAQS.map(([q, a], i) => (
{a}
))}
); } function RegForm({ formRef }) { const [role, setRole] = useStateB("Інвестор"); const [guests, setGuests] = useStateB(1); const [vals, setVals] = useStateB({ name: "", phone: "", email: "", company: "" }); const [errs, setErrs] = useStateB({}); const [consent, setConsent] = useStateB(false); const [done, setDone] = useStateB(false); const [loading, setLoading] = useStateB(false); const set = (k) => (e) => { setVals(v => ({ ...v, [k]: e.target.value })); setErrs(er => ({ ...er, [k]: false })); }; const validate = () => { const e = {}; if (vals.name.trim().length < 2) e.name = "Вкажіть ваше ім'я"; if (!/^[+()\d\s-]{9,}$/.test(vals.phone.trim())) e.phone = "Перевірте номер телефону"; if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(vals.email.trim())) e.email = "Перевірте email"; if (role === "Брокер" && vals.company.trim().length < 2) e.company = "Вкажіть назву компанії"; if (!consent) e.consent = "Потрібна згода"; setErrs(e); return Object.keys(e).length === 0; }; const submit = (e) => { e.preventDefault(); if (!validate()) return; setLoading(true); fetch(SHEETS_URL, { method: "POST", mode: "no-cors", headers: { "Content-Type": "text/plain" }, body: JSON.stringify({ role, name: vals.name, phone: vals.phone, email: vals.email, company: vals.company, guests }), }) .catch(() => {}) .finally(() => { setLoading(false); setDone(true); }); }; return (
Реєстрація

Займіть місце на «Теплому прийомі»

    {["Особистий welcome pack для кожного гостя", "Презентація проєкту та інвестиційних умов", "Фуршет, етно-музика та активності Карпат", "Кількість місць обмежена"].map(t => (
  • {t}
  • ))}
27 червня · 12:00 Яремче
{done ? (

Дякуємо, {vals.name.split(" ")[0]}!

Ваше місце заброньовано. Усі деталі заходу та welcome pack ми надішлемо на {vals.email}. До зустрічі в серці Карпат!

) : (
{["Інвестор", "Брокер"].map(r => ( ))}
{role === "Брокер" && (
{errs.company}
)}
{errs.name}
{errs.phone}
{errs.email}
)}
); } function Footer({ onRegister }) { return ( ); } Object.assign(window, { Houses, Advantages, Location, Gallery, Faq, RegForm, Footer });