// Grape Elevate — App shell const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "dark": false, "lang": "pt", "density": "regular", "palette": ["#8B5CF6", "#06B6D4", "#FB7185"] }/*EDITMODE-END*/; function NavItem({ icon, label, active, onClick, badge }) { return ( ); } function Sidebar({ t, route, setRoute, unreadCount }) { return ( ); } function App() { const [tw, setTweak] = useTweaks(TWEAK_DEFAULTS); const t = useI18n(tw.lang); const [route, setRoute] = React.useState('home'); const [automations, setAutomations] = React.useState(seedAutomations); const [conversations, setConversations] = React.useState(seedConversations); const [activity, setActivity] = React.useState(seedActivity); const [recent, setRecent] = React.useState(seedRecent); const [toast, setToast] = React.useState(null); // Sync theme + density to attributes so CSS variables flip globally. React.useEffect(() => { document.documentElement.dataset.theme = tw.dark ? 'dark' : 'light'; document.documentElement.dataset.density = tw.density; // Brand palette override document.documentElement.style.setProperty('--grape', tw.palette[0]); document.documentElement.style.setProperty('--cyan', tw.palette[1]); document.documentElement.style.setProperty('--coral', tw.palette[2]); }, [tw]); const showToast = (msg) => { setToast(msg); setTimeout(() => setToast(null), 1800); }; const unreadCount = conversations.reduce((s, c) => s + (c.unread || 0), 0); const Page = (() => { if (route === 'home') return { setRoute('flow'); showToast('Modelo carregado no construtor'); }} />; if (route === 'automations') return setRoute('flow')} />; if (route === 'flow') return setRoute('automations')} onSaveToast={showToast} />; if (route === 'inbox') return ; if (route === 'settings') return ; if (route === 'broadcasts') return ; if (route === 'roadmap') return ; return null; })(); // Demo mode bus — wires the simulator into App state setters. const resetDemo = () => { setAutomations(seedAutomations()); setConversations(seedConversations()); setActivity(seedActivity()); setRecent(seedRecent()); showToast('Dados da demo reiniciados'); }; const bus = React.useMemo(() => createDemoBus({ automations, setAutomations, setConversations, setActivity, setRecent, showToast, reset: resetDemo, }), [automations]); return (
{Page}
{toast &&
{toast}
} setTweak('dark', v)} /> setTweak('density', v)} /> setTweak('palette', v)} /> setTweak('lang', v)} />
); } function BroadcastsStub({ t }) { return ( <>

{t('nav.broadcasts')}

Envie uma mensagem para um segmento de contatos. Exemplo: todo mundo com a tag #lead-quente.

Em breve

Disparos segmentados

Crie campanhas pra segmentos da sua base e dispare com 1 clique. Vamos liberar essa funcionalidade na próxima semana.

); } window.App = App;