// 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 */}
Квартиры и частные дома
Автономно без интернета
Умный дом,
который сам
следит за собой.
Проектируем и устанавливаем умный дом для квартир и частных домов:
в новостройках, на этапе ремонта и в уже обжитом жилом фонде.
Протечки, климат, свет и безопасность — под контролем с первого дня.
{/* RIGHT: draggable device tiles (no text overlap) */}
{/* metric strip — отдельные карточки с собственными рамками */}
{[
["От 10 000 ₽", "стартовый пакет"],
["На этапе ремонта", "чисто, без штробления"],
["Квартира / частный дом", "новостройка или обжитой фонд"],
["24 / 7", "локальная работа"],
].map(([v, l], i) => (
))}
);
// 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",
}}>
{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
Пока вас нет — дом
Не одно устройство — целая система. Освещение, климат, безопасность и вентиляция
работают по сценариям, а не вручную.
{lines.map((l, idx) => (
setI(idx)} style={{
border: "1px solid " + (idx === i ? "var(--ink-2)" : "var(--line)"),
background: idx === i ? "var(--ink-2)" : "transparent",
color: idx === i ? "#EEF3FA" : "var(--ink-3)",
borderRadius: 999,
padding: "6px 12px",
fontSize: 13,
cursor: "pointer",
fontFamily: "var(--mono)",
letterSpacing: "0.04em",
}}>{String(idx + 1).padStart(2, "0")}
))}
);
};
// --- Variant C: "Comparison" — head-to-head ---
const HeroComparison = () => (
Чем мы отличаемся
Умный дом, который не ломается без интернета.
Обычный умный дом — это набор устройств на чужом облаке. РазумДом — автономный сервер
у вас дома: всё работает локально, всегда.
Обычная система
Облачная
{[
"Зависит от интернета",
"Один бренд — одно приложение",
"Данные уходят на чужой сервер",
"Перестаёт работать, если сервис закрыт",
].map(t => (
{t}
))}
РазумДом
Автономная
{[
"Работает локально, без облака",
"Поддержка Zigbee любых производителей",
"Данные остаются дома",
"Сервер у вас — никто не отключит",
].map(t => (
{t}
))}
);
window.Hero = Hero;