// Hero — 3 variations via Tweaks const Hero = ({ variant = "promise", t, setTweak, onConsult }) => { return (
{variant === "promise" && } {variant === "scenarios" && } {variant === "comparison" && }
); }; // --- Variant A: "Promise" — bold statement, problem-led --- const HERO_TILES = [ { id: "leak", title: "Протечка", status: "Кран перекрыт", hint: "Датчик поймал воду — кран перекрывается автоматически за 2 секунды.", color: "var(--leak)", icon: "drop", x: 6, y: 10 }, { id: "climate", title: "+22.4°", status: "Гостиная · комфорт", hint: "Климат держится по сценарию в каждой комнате, без перерасхода.", color: "var(--good)", icon: "thermo", x: 168, y: 86 }, { id: "guard", title: "Дом", status: "Никого нет · охрана", hint: "При уходе включается охрана периметра и контроль окон.", color: "var(--ink-2)", icon: "shield", x: 10, y: 188 }, { id: "light", title: "Свет", status: "Прихожая выкл", hint: "Свет гаснет сам, когда в комнате никого нет.", color: "var(--accent)", icon: "bulb", x: 176, y: 262 }, ]; const HeroPromise = ({ onConsult }) => (
{/* LEFT: text + CTA */}
Квартиры и частные дома Автономно без интернета

Умный дом,
который сам
следит за собой.

Проектируем и устанавливаем умный дом для квартир и частных домов: в новостройках, на этапе ремонта и в уже обжитом жилом фонде. Протечки, климат, свет и безопасность — под контролем с первого дня.

Собрать свой пакет { e.preventDefault(); onConsult && onConsult(); }}> Хочу бесплатную консультацию Консультация — 0 ₽
{/* RIGHT: draggable device tiles (no text overlap) */}
{/* metric strip — отдельные карточки с собственными рамками */}
{[ ["От 10 000 ₽", "стартовый пакет"], ["На этапе ремонта", "чисто, без штробления"], ["Квартира / частный дом", "новостройка или обжитой фонд"], ["24 / 7", "локальная работа"], ].map(([v, l], i) => (
{v}
{l}
))}
); // Draggable (desktop) / static grid (mobile) device tiles const HeroTiles = () => { const zoneRef = React.useRef(null); const [isDesktop, setIsDesktop] = React.useState(true); const [pos, setPos] = React.useState(() => { const o = {}; HERO_TILES.forEach((t) => { o[t.id] = { x: t.x, y: t.y }; }); return o; }); const [openId, setOpenId] = React.useState("leak"); const drag = React.useRef(null); React.useEffect(() => { const mq = window.matchMedia("(min-width: 981px)"); const apply = () => setIsDesktop(mq.matches); apply(); mq.addEventListener ? mq.addEventListener("change", apply) : mq.addListener(apply); return () => { mq.removeEventListener ? mq.removeEventListener("change", apply) : mq.removeListener(apply); }; }, []); const onDown = (id) => (e) => { if (!isDesktop) return; const zone = zoneRef.current; e.currentTarget.setPointerCapture(e.pointerId); drag.current = { id, moved: false, sx: e.clientX, sy: e.clientY, ox: pos[id].x, oy: pos[id].y, zw: zone.clientWidth, zh: zone.clientHeight, tw: e.currentTarget.offsetWidth, th: e.currentTarget.offsetHeight, }; }; const onMove = (e) => { const d = drag.current; if (!d) return; const dx = e.clientX - d.sx, dy = e.clientY - d.sy; if (Math.abs(dx) > 3 || Math.abs(dy) > 3) d.moved = true; const nx = Math.max(0, Math.min(d.ox + dx, d.zw - d.tw)); const ny = Math.max(0, Math.min(d.oy + dy, d.zh - d.th)); setPos((p) => ({ ...p, [d.id]: { x: nx, y: ny } })); }; const onUp = (id) => (e) => { const d = drag.current; if (d && !d.moved) setOpenId((o) => (o === id ? null : id)); drag.current = null; }; return (
{HERO_TILES.map((t) => { const open = openId === t.id; return (
{ if (e.key === "Enter" || e.key === " ") { e.preventDefault(); setOpenId((o) => (o === t.id ? null : t.id)); } }} className="hero-tile" style={isDesktop ? { position: "absolute", left: pos[t.id].x, top: pos[t.id].y, width: 212, touchAction: "none", cursor: drag.current && drag.current.id === t.id ? "grabbing" : "grab", zIndex: open ? 5 : 1, } : { touchAction: "auto", cursor: "pointer", }}>
{t.title}
{t.status}
{open && (
{t.hint}
)}
); })}
Перетащите карточки · нажмите для подсказки
); }; // --- Variant B: "Scenarios" — typewriter rolling scenarios --- const HeroScenarios = () => { const lines = React.useMemo(() => [ { verb: "перекрывает", what: "воду при протечке", icon: "drop", color: "var(--leak)" }, { verb: "поддерживает", what: "+22° в гостиной", icon: "thermo", color: "var(--good)" }, { verb: "охраняет", what: "квартиру, когда вы в отъезде", icon: "shield", color: "var(--ink-2)" }, { verb: "включает", what: "свет, как только вы вошли", icon: "bulb", color: "var(--accent)" }, { verb: "поливает", what: "теплицу, пока вы на работе", icon: "sprout", color: "var(--safe)" }, ], []); const [i, setI] = React.useState(0); React.useEffect(() => { const t = setInterval(() => setI(p => (p + 1) % lines.length), 2600); return () => clearInterval(t); }, [lines.length]); const cur = lines[i]; return (
Сценарии · автономно · Zigbee

Пока вас нет — дом

{cur.verb}
{cur.what}

Не одно устройство — целая система. Освещение, климат, безопасность и вентиляция работают по сценариям, а не вручную.

Собрать пакет Посмотреть сценарии
{lines.map((l, idx) => ( ))}
); }; // --- Variant C: "Comparison" — head-to-head --- const HeroComparison = () => (
Чем мы отличаемся

Умный дом, который не ломается без интернета.

Обычный умный дом — это набор устройств на чужом облаке. РазумДом — автономный сервер у вас дома: всё работает локально, всегда.

Собрать пакет Сравнить системы
Обычная система

Облачная

    {[ "Зависит от интернета", "Один бренд — одно приложение", "Данные уходят на чужой сервер", "Перестаёт работать, если сервис закрыт", ].map(t => (
  • {t}
  • ))}
vs
РазумДом

Автономная

    {[ "Работает локально, без облака", "Поддержка Zigbee любых производителей", "Данные остаются дома", "Сервер у вас — никто не отключит", ].map(t => (
  • {t}
  • ))}
); window.Hero = Hero;