/* global React, LIcons */ // Como funciona — cena animada: USB conecta → contas detectadas → iniciar aquecimento (loop) const { useState: useScState, useEffect: useScEffect, useRef: useScRef } = React; const SC_STEPS = [ { title: 'Conecte via USB', desc: 'Plugue o celular no PC. Sem API, sem senha — o controle é físico.', dur: 4600 }, { title: 'Contas detectadas', desc: 'O painel encontra o aparelho e lista as contas prontas para aquecer.', dur: 4200 }, { title: 'Inicie o aquecimento', desc: 'Um clique e as interações rodam sozinhas — de dia, de noite, no loop.', dur: 8400 }, ]; const SC_LOGS = [ ['@loja.doce.rj', 'curtiu um vídeo'], ['@fit.gabi', 'assistiu 14s de vídeo'], ['@viral.cortes', 'comentou em um vídeo'], ['@loja.doce.rj', 'salvou um vídeo'], ['@fit.gabi', 'compartilhou um vídeo'], ]; function StepsSection() { const [step, setStep] = useScState(0); const [cycle, setCycle] = useScState(0); const [sc, setSc] = useScState({}); const [cursor, setCursor] = useScState({ x: 480, y: 330, vis: false }); const [click, setClick] = useScState(0); const [log, setLog] = useScState(0); const timers = useScRef([]); const after = (ms, fn) => timers.current.push(setTimeout(fn, ms)); const clearAll = () => { timers.current.forEach(clearTimeout); timers.current = []; }; // timeline por passo useScEffect(() => { clearAll(); if (step === 0) { setSc({}); setCursor(c => ({ ...c, vis: false })); after(700, () => setSc({ plugged: true })); after(1500, () => setSc({ plugged: true, flowing: true })); } else if (step === 1) { setSc(s => ({ plugged: true, flowing: true, detected: true })); setCursor(c => ({ ...c, vis: false })); } else { setSc(s => ({ ...s, plugged: true, flowing: true, detected: true })); setCursor({ x: 480, y: 330, vis: true }); after(500, () => setCursor({ x: 408, y: 296, vis: true })); after(1300, () => { setClick(c => c + 1); setSc(s => ({ ...s, pressing: true })); }); after(1550, () => setSc(s => ({ ...s, pressing: false, running: true }))); after(2100, () => setCursor(c => ({ ...c, x: 470, y: 345 }))); after(3000, () => setCursor(c => ({ ...c, vis: false }))); } // auto-avança after(SC_STEPS[step].dur, () => { setStep(s => (s + 1) % 3); setCycle(c => c + 1); }); return clearAll; }, [step, cycle]); // logs em loop enquanto rodando useScEffect(() => { if (!sc.running) return; const id = setInterval(() => setLog(l => l + 1), 2000); return () => clearInterval(id); }, [sc.running]); // escala da cena const wrapRef = useScRef(null); const [scale, setScale] = useScState(1); useScEffect(() => { const fit = () => { if (!wrapRef.current) return; const w = wrapRef.current.clientWidth - 24; setScale(Math.min(1, w / 620)); }; fit(); window.addEventListener('resize', fit); return () => window.removeEventListener('resize', fit); }, []); const lg = SC_LOGS[log % SC_LOGS.length]; const scClass = ['sc', sc.plugged && 'plugged', sc.flowing && 'flowing', sc.detected && 'detected', sc.pressing && 'pressing', sc.running && 'running'].filter(Boolean).join(' '); return (