// Scenes 6-10 for Yohann Escher hero motion.
// ── SCENE 6: Automation flow (17 - 20.5s) ─────────────────────────────────
function Scene6() {
const { localTime } = useSprite();
const steps = [
{ label: 'Novo Lead', sub: 'site → form', icon: Icons.user, x: 200, y: 540 },
{ label: 'Análise IA', sub: 'qualifica intent', icon: Icons.spark, x: 500, y: 540 },
{ label: 'CRM', sub: 'organiza pipeline', icon: Icons.flow, x: 800, y: 540 },
{ label: 'Mensagem', sub: 'gerada e enviada', icon: Icons.msg, x: 1100, y: 540 },
{ label: 'Follow-up', sub: 'agendado', icon: Icons.cal, x: 1400, y: 540 },
{ label: 'Métrica', sub: 'mede e ajusta', icon: Icons.chart, x: 1700, y: 540 },
];
// Pulse traveling along the chain
const pulseT = (localTime % 3.0) / 3.0; // 0..1 across the whole chain
const activeIdx = Math.floor(pulseT * steps.length);
const stepProgress = (pulseT * steps.length) - activeIdx;
return (
{/* connectors */}
{steps.slice(0, -1).map((s, i) => {
const next = steps[i + 1];
const isActive = i === activeIdx;
return (
);
})}
{/* Pulse dot */}
{(() => {
if (localTime < 1.0) return null;
const cur = steps[activeIdx];
const nxt = steps[Math.min(steps.length - 1, activeIdx + 1)];
const px = cur.x + (nxt.x - cur.x) * stepProgress;
const py = cur.y;
return (
);
})()}
{/* Step cards */}
{steps.map((s, i) => {
const delay = 0.1 + i * 0.1;
const localT = Math.max(0, localTime - delay);
const enter = Easing.easeOutCubic(clamp(localT / 0.5, 0, 1));
const isActive = i === activeIdx && localTime > 1.0;
const wasReached = i <= activeIdx && localTime > 1.0;
return (
{s.icon}
{s.label}
{s.sub}
{wasReached && !isActive && (
{Icons.check}
)}
);
})}
{/* Stats card */}
Cena 06 — Automação
Processos deixam de depender do improviso .
);
}
function StatChip({ x, y, label, value }) {
const { localTime, duration } = useSprite();
const enter = Easing.easeOutBack(clamp(localTime / 0.5, 0, 1));
return (
{label}
{value}
);
}
// ── SCENE 7: Marketing as system (20.5 - 24s) ─────────────────────────────
function Scene7() {
const { localTime } = useSprite();
return (
{/* Landing page mock - left */}
{/* Funnel center */}
{/* CRM right */}
{/* connecting flow */}
Cena 07 — Marketing como sistema
Marketing inteligente não é só conteúdo .
É sistema, dados e automação trabalhando juntos.
);
}
function Mock_LandingPage({ x, y, delay = 0 }) {
const { localTime } = useSprite();
const localT = Math.max(0, localTime - delay);
const enter = Easing.easeOutCubic(clamp(localT / 0.5, 0, 1));
return (
● ● ● landing.yohann.com
Sistemas que convertem .
Estratégia, automação e IA conectadas em uma mesma arquitetura.
Agendar conversa
Ver mais
↑ {Math.round(34 + Math.sin(localTime * 2) * 2)}% conversão
);
}
function Mock_Funnel({ x, y, delay = 0 }) {
const { localTime } = useSprite();
const localT = Math.max(0, localTime - delay);
const enter = Easing.easeOutCubic(clamp(localT / 0.5, 0, 1));
const stages = [
{ label: 'Visitas', count: 4280, w: 240, delay: 0.2 },
{ label: 'Leads', count: 612, w: 200, delay: 0.5 },
{ label: 'Qualificados', count: 287, w: 160, delay: 0.8 },
{ label: 'Propostas', count: 96, w: 120, delay: 1.1 },
{ label: 'Fechados', count: 38, w: 80, delay: 1.4 },
];
return (
Funil
Conversão por etapa
{stages.map((s, i) => {
const sT = Math.max(0, localTime - delay - s.delay);
const sEnter = Easing.easeOutCubic(clamp(sT / 0.5, 0, 1));
const w = s.w * sEnter;
return (
{s.label}
{Math.round(s.count * sEnter)}
);
})}
);
}
function Mock_CRM({ x, y, delay = 0 }) {
const { localTime } = useSprite();
const localT = Math.max(0, localTime - delay);
const enter = Easing.easeOutCubic(clamp(localT / 0.5, 0, 1));
const cols = [
{ label: 'Novo', count: 24, color: 'rgba(255,255,255,0.15)' },
{ label: 'Contato', count: 16, color: 'rgba(255,107,26,0.35)' },
{ label: 'Proposta', count: 9, color: 'rgba(255,107,26,0.6)' },
{ label: 'Fechado', count: 4, color: YE.orange },
];
return (
{cols.map((c, i) => {
const cT = Math.max(0, localTime - delay - 0.3 - i * 0.1);
const cEnter = Easing.easeOutCubic(clamp(cT / 0.4, 0, 1));
return (
{c.label}
{Array.from({ length: Math.min(4, c.count) }).map((_, j) => (
))}
);
})}
);
}
// ── SCENE 8: AI as decision layer (24 - 27.5s) ────────────────────────────
function Scene8() {
const { localTime } = useSprite();
const cx = 960, cy = 520;
const actions = [
{ label: 'interpreta', angle: -90 },
{ label: 'recomenda', angle: -45 },
{ label: 'prioriza', angle: 0 },
{ label: 'resume', angle: 45 },
{ label: 'escreve', angle: 90 },
{ label: 'analisa', angle: 135 },
{ label: 'organiza', angle: 180 },
{ label: 'aprende', angle: 225 },
];
const t = useTime();
const breath = 1 + 0.04 * Math.sin(localTime * 1.6);
return (
{/* Orbit ring */}
{/* Action chips on orbit */}
{actions.map((a, i) => {
const delay = 0.4 + i * 0.08;
const localT = Math.max(0, localTime - delay);
const enter = Easing.easeOutCubic(clamp(localT / 0.5, 0, 1));
const rad = (a.angle + t * 6) * Math.PI / 180;
const r = 290;
const x = cx + Math.cos(rad) * r;
const y = cy + Math.sin(rad) * r;
return (
{a.label}
);
})}
{/* Central AI nucleus */}
{/* "Próxima melhor ação" insight card */}
Cena 08 — Inteligência aplicada
IA não substitui direção. Amplifica quem tem método.
);
}
function NextActionCard({ x, y }) {
const { localTime } = useSprite();
const enter = Easing.easeOutBack(clamp(localTime / 0.5, 0, 1));
return (
{Icons.spark}
Próxima melhor ação
Lead "Mariana C." está pronta para proposta. Score 92.
agendar follow-up →
);
}
// ── SCENE 9: Results dashboard (27.5 - 31s) ───────────────────────────────
function Scene9() {
const { localTime } = useSprite();
const metrics = [
{ label: 'Conversão', value: 42, prefix: '+', suffix: '%', delay: 0.3 },
{ label: 'Leads organizados', value: 128, prefix: '+', suffix: '', delay: 0.5 },
{ label: 'Tempo operacional', value: 35, prefix: '-', suffix: '%', delay: 0.7 },
{ label: 'ROI no funil', value: 3.2, prefix: '', suffix: 'x', decimals: 1, delay: 0.9 },
{ label: 'Propostas ativas', value: 87, prefix: '', suffix: '', delay: 1.1 },
{ label: 'Processos visíveis',value: 100, prefix: '', suffix: '%', delay: 1.3 },
];
return (
{metrics.map((m, i) => (
))}
{/* Big chart */}
Performance
Últimos 90 dias
↑ trending
Cena 09 — Resultado real
Resultado real nasce quando a operação ganha forma .
);
}
function MetricCard({ label, value, prefix = '', suffix = '', decimals = 0, delay = 0 }) {
const { localTime } = useSprite();
const localT = Math.max(0, localTime - delay);
const enter = Easing.easeOutCubic(clamp(localT / 0.5, 0, 1));
const count = Easing.easeOutCubic(clamp(localT / 1.4, 0, 1));
const v = value * count;
return (
{label}
{prefix}
{v.toFixed(decimals)}
{suffix}
);
}
function BigChart() {
const { localTime } = useSprite();
const t = clamp(localTime / 1.8, 0, 1);
const eased = Easing.easeOutCubic(t);
// Generate path
const w = 1400, h = 140;
const n = 40;
const pts = [];
for (let i = 0; i < n; i++) {
const x = (i / (n - 1)) * w;
const trend = h - (i / n) * h * 0.75;
const noise = Math.sin(i * 0.6) * 8 + Math.cos(i * 0.3) * 4;
const y = clamp(trend + noise, 8, h - 4);
pts.push({ x, y });
}
// Reveal up to eased fraction
const revealN = Math.floor(eased * n);
const path = pts.slice(0, Math.max(2, revealN)).map((p, i) =>
`${i === 0 ? 'M' : 'L'} ${p.x.toFixed(1)} ${p.y.toFixed(1)}`
).join(' ');
const fillPath = path + ` L ${pts[Math.max(1, revealN - 1)].x} ${h} L 0 ${h} Z`;
return (
{/* gridlines */}
{[0.25, 0.5, 0.75].map(g => (
))}
{revealN > 0 && (
)}
);
}
// ── SCENE 10: Closing positioning (31 - 35s) ─────────────────────────────
function Scene10() {
const { localTime } = useSprite();
const cx = 960, cy = 540;
const enter = Easing.easeOutCubic(clamp(localTime / 0.7, 0, 1));
const phase2 = clamp((localTime - 0.8) / 0.6, 0, 1);
const phase3 = clamp((localTime - 1.6) / 0.6, 0, 1);
const ctaPhase = clamp((localTime - 2.2) / 0.6, 0, 1);
const t = useTime();
const orbit = t * 12;
return (
{/* Soft orbital cards */}
{[0, 60, 120, 180, 240, 300].map((angle, i) => {
const rad = (angle + orbit) * Math.PI / 180;
const r = 420;
const x = cx + Math.cos(rad) * r;
const y = cy + Math.sin(rad) * r * 0.55;
const labels = ['Estratégia', 'Sistemas', 'Automação', 'IA', 'Marketing', 'Dados'];
const cardEnter = Easing.easeOutCubic(clamp((localTime - 0.3 - i * 0.06) / 0.5, 0, 1));
return (
{labels[i]}
);
})}
{/* Central radial star */}
{[0, 45, 90, 135].map(a => (
))}
{/* Headline */}
Estratégia + Sistemas + IA
para transformar operação em resultado real.
{/* CTA */}
Cena 10 — Posicionamento
);
}
Object.assign(window, { Scene6, Scene7, Scene8, Scene9, Scene10 });