// Scenes 1-5 for Yohann Escher hero motion.
// ── SCENE 1: Intention dot + emerging modules (0 - 3.5s) ──────────────────
function Scene1() {
const { localTime } = useSprite();
const cx = 960, cy = 500;
// First 1.5s: just the dot. Then modules appear.
const modules = [
{ label: 'Ideia', icon: Icons.spark, angle: -90, dist: 220, delay: 1.6 },
{ label: 'Produto', icon: Icons.bolt, angle: -30, dist: 240, delay: 1.8 },
{ label: 'Cliente', icon: Icons.user, angle: 30, dist: 230, delay: 2.0 },
{ label: 'Conteúdo', icon: Icons.doc, angle: 90, dist: 220, delay: 2.2 },
{ label: 'Venda', icon: Icons.chart, angle: 150, dist: 240, delay: 2.4 },
{ label: 'Atendimento', icon: Icons.msg, angle: 210, dist: 230, delay: 2.6 },
];
return (
{modules.map((m, i) => {
const rad = m.angle * Math.PI / 180;
const x = cx + Math.cos(rad) * m.dist;
const y = cy + Math.sin(rad) * m.dist;
return (
);
})}
Cena 01 — Intenção
Todo crescimento começa com uma intenção.
);
}
// ── SCENE 2: Fragmentation (3.5 - 7s) ─────────────────────────────────────
function Scene2() {
const { localTime } = useSprite();
const t = useTime();
// 12 modules scattered with broken connections
const mods = [
{ label: 'Posts', icon: Icons.doc, x: 280, y: 320, delay: 0.0 },
{ label: 'Tráfego', icon: Icons.chart, x: 520, y: 220, delay: 0.1 },
{ label: 'WhatsApp', icon: Icons.msg, x: 780, y: 280, delay: 0.2 },
{ label: 'CRM', icon: Icons.user, x: 1100, y: 220, delay: 0.3 },
{ label: 'Planilhas', icon: Icons.doc, x: 1380, y: 300, delay: 0.4 },
{ label: 'Reuniões', icon: Icons.cal, x: 1640, y: 380, delay: 0.5 },
{ label: 'Leads', icon: Icons.user, x: 320, y: 560, delay: 0.6 },
{ label: 'Follow-up', icon: Icons.msg, x: 620, y: 660, delay: 0.7 },
{ label: 'Analytics', icon: Icons.chart, x: 940, y: 720, delay: 0.8 },
{ label: 'Campanhas', icon: Icons.bolt, x: 1240, y: 660, delay: 0.9 },
{ label: 'E-mails', icon: Icons.msg, x: 1540, y: 580, delay: 1.0 },
{ label: 'Tarefas', icon: Icons.cog, x: 1700, y: 720, delay: 1.1 },
];
// Broken connections between random pairs
const broken = [
[0, 1], [1, 2], [2, 3], [3, 4], [4, 5],
[6, 7], [7, 8], [8, 9], [9, 10], [10, 11],
[0, 6], [3, 9], [5, 11], [1, 7],
];
// micro-text errors
const microTexts = [
{ text: 'lead perdido', x: 410, y: 615, delay: 1.6 },
{ text: 'follow-up atrasado', x: 760, y: 715, delay: 1.9 },
{ text: 'dados espalhados', x: 1340, y: 705, delay: 2.2 },
{ text: 'campanha sem leitura', x: 1480, y: 230, delay: 2.5 },
];
return (
{broken.map(([a, b], i) => (
))}
{mods.map((m, i) => (
))}
{microTexts.map((mt, i) => {
const localT = localTime - mt.delay;
if (localT < 0 || localT > 1.4) return null;
const fade = Math.sin(localT * Math.PI / 1.4);
return (
{mt.text}
);
})}
Cena 02 — Fragmentação
Depois, tudo vira peça solta.
);
}
// ── SCENE 3: The real problem (7 - 10s) ───────────────────────────────────
function Scene3() {
const { localTime } = useSprite();
// Reuse mods from scene 2 but frozen + dimmed
const mods = [
{ label: 'Posts', icon: Icons.doc, x: 280, y: 320 },
{ label: 'Tráfego', icon: Icons.chart, x: 520, y: 220 },
{ label: 'WhatsApp', icon: Icons.msg, x: 780, y: 280 },
{ label: 'CRM', icon: Icons.user, x: 1100, y: 220 },
{ label: 'Planilhas', icon: Icons.doc, x: 1380, y: 300 },
{ label: 'Reuniões', icon: Icons.cal, x: 1640, y: 380 },
{ label: 'Leads', icon: Icons.user, x: 320, y: 560 },
{ label: 'Follow-up', icon: Icons.msg, x: 620, y: 660 },
{ label: 'Analytics', icon: Icons.chart, x: 940, y: 720 },
{ label: 'Campanhas', icon: Icons.bolt, x: 1240, y: 660 },
{ label: 'E-mails', icon: Icons.msg, x: 1540, y: 580 },
{ label: 'Tarefas', icon: Icons.cog, x: 1700, y: 720 },
];
const phase1 = clamp(localTime / 0.6, 0, 1); // dim
const phase2 = clamp((localTime - 0.5) / 0.6, 0, 1); // first headline
const phase3 = clamp((localTime - 1.7) / 0.7, 0, 1); // swap to "estrutura"
// dark veil
const veil = phase1 * 0.55;
return (
{mods.map((m, i) => (
))}
{/* central headline */}
O problema não é falta de ferramenta.
{phase3 > 0 && (
É falta de{' '}
estrutura.
)}
{phase3 > 0.3 && }
Cena 03 — O diagnóstico
);
}
// ── SCENE 4: Strategy enters (10 - 13.5s) ─────────────────────────────────
function Scene4() {
const { localTime } = useSprite();
const cx = 960, cy = 500;
const groups = {
marketing: { x: 380, y: 320, label: 'Marketing',
items: [{ l: 'Conteúdo', i: Icons.doc }, { l: 'Posts', i: Icons.doc },
{ l: 'Landing', i: Icons.globe }, { l: 'Campanhas', i: Icons.bolt }] },
comercial: { x: 1540, y: 320, label: 'Comercial',
items: [{ l: 'Leads', i: Icons.user }, { l: 'CRM', i: Icons.user },
{ l: 'Follow-up', i: Icons.msg }, { l: 'Propostas', i: Icons.doc }] },
operacao: { x: 380, y: 720, label: 'Operação',
items: [{ l: 'Atendimento', i: Icons.msg }, { l: 'Tarefas', i: Icons.cog },
{ l: 'Processos', i: Icons.flow }, { l: 'Agenda', i: Icons.cal }] },
inteligencia: { x: 1540, y: 720, label: 'Inteligência',
items: [{ l: 'Dados', i: Icons.chart }, { l: 'Analytics', i: Icons.chart },
{ l: 'IA', i: Icons.spark }, { l: 'Relatórios', i: Icons.doc }] },
};
// Strategy card appears at 0
const stratEnter = Easing.easeOutBack(clamp(localTime / 0.6, 0, 1));
return (
{/* Lines from center to each group */}
{Object.entries(groups).map(([key, g], i) => (
))}
{/* Group cluster cards */}
{Object.entries(groups).map(([key, g], gi) => (
))}
{/* Central Strategy card */}
Cena 04 — Direção
Estratégia transforma peças em direção.
);
}
function GroupCluster({ cx, cy, label, items, delay = 0 }) {
const { localTime } = useSprite();
const localT = Math.max(0, localTime - delay);
const enter = Easing.easeOutCubic(clamp(localT / 0.5, 0, 1));
const t = useTime();
return (
{label}
{items.map((it, i) => {
const itDelay = delay + 0.2 + i * 0.05;
const itT = Math.max(0, localTime - itDelay);
const itEnter = Easing.easeOutCubic(clamp(itT / 0.4, 0, 1));
return (
{it.i}
{it.l}
);
})}
);
}
// ── SCENE 5: System born / Dashboard pillars (13.5 - 17s) ─────────────────
function Scene5() {
const { localTime } = useSprite();
const cx = 960;
const enter = Easing.easeOutCubic(clamp(localTime / 0.7, 0, 1));
const pillars = [
{ label: 'Marketing Inteligente', desc: 'Conteúdo + funil + dados', icon: Icons.bolt, accent: '+34%' },
{ label: 'Automação', desc: 'Fluxos sem fricção', icon: Icons.flow, accent: '24/7' },
{ label: 'IA Aplicada', desc: 'Decisão amplificada', icon: Icons.spark, accent: 'live' },
{ label: 'Dados & Decisão', desc: 'Da planilha à clareza', icon: Icons.chart, accent: '3.2x' },
];
return (
{/* Main panel */}
{/* Header */}
{Icons.star}
SISTEMA
Sistema de Crescimento
Operando
{/* 4 pillars */}
{pillars.map((p, i) => {
const pDelay = 0.5 + i * 0.12;
const pT = Math.max(0, localTime - pDelay);
const pEnter = Easing.easeOutCubic(clamp(pT / 0.5, 0, 1));
return (
{p.label}
{p.desc}
{/* mini sparkline */}
);
})}
Cena 05 — Sistema
Quando tudo se conecta, o negócio opera com inteligência.
);
}
function pillarSparkline(seed, t) {
const pts = [];
const n = 12;
for (let i = 0; i < n; i++) {
const x = (i / (n - 1)) * 200;
const phase = seed * 1.7 + i * 0.5;
const noise = Math.sin(phase + t * 0.4) * 4;
const trend = 28 - i * (1.6 + seed * 0.2);
const y = clamp(trend + noise, 4, 28);
pts.push(`${i === 0 ? 'M' : 'L'} ${x.toFixed(1)} ${y.toFixed(1)}`);
}
return pts.join(' ');
}
Object.assign(window, { Scene1, Scene2, Scene3, Scene4, Scene5 });