// Main app — nav, hero, services, specialists, gallery, shop, booking, footer, cart, AI concierge, admin. const { useState, useEffect, useRef } = React; const SERVICES_DATA = [ {n:'01', title:'Salão de Beleza', icon:'Scissors', tags:['Corte','Coloração','Tratamentos','Penteados'], body:'Cortes autorais, coloração premium e tratamentos profundos. Cada fio recebe atenção personalizada — da consulta de cor à finalização.'}, {n:'02', title:'Massoterapia', icon:'Leaf', tags:['Relaxante','Drenagem','Modeladora','Pedras Quentes'], body:'Toque terapêutico para corpo e mente. Drenagem linfática, massagem relaxante e protocolos de bem-estar em ambiente acolhedor.'}, {n:'03', title:'Loja Exclusiva', icon:'Sparkle', tags:['Capilares','Óleos','Aromaterapia','Skincare'], body:'Curadoria exclusiva de produtos premium — os mesmos que usamos no atendimento, agora para continuar o ritual em casa.'}, ]; function App() { const store = useStore(); const [scrolled, setScrolled] = useState(false); const [menuOpen, setMenuOpen] = useState(false); const [cart, setCart] = useState({}); const [cartOpen, setCartOpen] = useState(false); const [favs, setFavs] = useState({}); const [toast, setToast] = useState(null); const [added, setAdded] = useState(null); const [aiOpen, setAiOpen] = useState(false); const [adminOpen, setAdminOpen] = useState(false); const [checkoutOpen, setCheckoutOpen] = useState(false); const [galFilter, setGalFilter] = useState('Todas'); const [page, setPage] = useState(() => (location.hash === '#massoterapia' ? 'massoterapia' : 'studio')); const [lightbox, setLightbox] = useState(null); useEffect(() => { const on = () => setScrolled(window.scrollY > 12); on(); window.addEventListener('scroll', on, {passive:true}); return () => window.removeEventListener('scroll', on); }, []); useEffect(() => { const t = setTimeout(() => window.Motion && window.Motion.init({...(store.cinema||{}), poster: store.hero.photo}), 60); return () => clearTimeout(t); }, []); useEffect(() => { const t = setTimeout(() => window.Motion && window.Motion.refresh(), 240); return () => clearTimeout(t); }, [galFilter, store.gallery, store.products, store.instagram]); useEffect(() => { const locked = cartOpen || aiOpen || adminOpen || checkoutOpen || menuOpen || !!lightbox; window.Motion && window.Motion.lock(locked); }, [cartOpen, aiOpen, adminOpen, checkoutOpen, menuOpen, lightbox]); useEffect(() => { const on = () => { const next = location.hash === '#massoterapia' ? 'massoterapia' : 'studio'; setPage(prev => { if (prev !== next) window.Motion && window.Motion.reset(); return next; }); }; window.addEventListener('hashchange', on); return () => window.removeEventListener('hashchange', on); }, []); useEffect(() => { const t = setTimeout(() => window.Motion && window.Motion.build(), 140); return () => clearTimeout(t); }, [page]); const goPage = (p) => { setMenuOpen(false); if (p === page) return; window.Motion && window.Motion.reset(); history.replaceState(null, '', p === 'massoterapia' ? '#massoterapia' : location.pathname); setPage(p); window.scrollTo(0, 0); }; const showToast = (msg) => { setToast(msg); clearTimeout(showToast._t); showToast._t = setTimeout(() => setToast(null), 2200); }; const addToCart = (p) => { setCart(prev => ({...prev, [p.id]: {p, qty: (prev[p.id]?.qty || 0) + 1}})); setAdded(p.id); setTimeout(() => setAdded(null), 700); showToast(`${p.name} adicionado à sacola`); }; const setQty = (id, q) => setCart(prev => { const next = {...prev}; if (q <= 0) delete next[id]; else next[id] = {...next[id], qty:q}; return next; }); const toggleFav = (id) => setFavs(prev => ({...prev, [id]: !prev[id]})); const cartItems = Object.values(cart); const cartCount = cartItems.reduce((a,b)=>a+b.qty, 0); const cartTotal = cartItems.reduce((a,b)=>a + b.p.priceN * b.qty, 0); const scrollTo = (id) => { setMenuOpen(false); if (page !== 'studio') { goPage('studio'); setTimeout(() => scrollTo(id), 320); return; } const el = document.getElementById(id); if (!el) return; if (window.Motion) setTimeout(() => window.Motion.scrollTo(el), 60); else window.scrollTo({top: el.offsetTop - 70, behavior:'smooth'}); }; const cats = ['Todas', ...Array.from(new Set(store.gallery.map(g => g.cat)))]; const shots = galFilter === 'Todas' ? store.gallery : store.gallery.filter(g => g.cat === galFilter); const A = store.profiles.angella, L = store.profiles.aline; return ( <>
Angella Barros
scrollTo('servicos')}>Serviços scrollTo('galeria')}>Galeria scrollTo('instagram')}>Instagram scrollTo('loja')}>Loja goPage('massoterapia')}>Massoterapia scrollTo('agendar')}>Agendar
{page === 'studio' ? (<> scrollTo('agendar')} onAi={()=>setAiOpen(true)}/>
Tríade de Serviços

Três caminhos.
Um mesmo cuidado.

{SERVICES_DATA.map((s, i) => { const IconEl = Icon[s.icon]; return (
scrollTo(i===2?'loja':'agendar')}>
— {s.n}

{s.title}

{s.body}

{s.tags.map(t => {t})}
); })}
A especialista

Angella Barros

Coloração autoral, cortes e tratamentos conduzidos por quem abriu o studio em 2018 e atende cada cliente pessoalmente.

{A.name}
{A.role}

{A.bio}

{A.s1}{A.s1l}
{A.s2}{A.s2l}
Galeria

Nosso trabalho, em imagens.

{cats.map(c => )}
{shots.map((g, i) => (
setLightbox(g)}>
{g.caption}
{g.caption}
{g.cat}
{String(i+1).padStart(2,'0')}
))} {!shots.length &&

Nenhuma foto nesta categoria ainda.

}
{lightbox && (
setLightbox(null)}> {lightbox.caption}/
{lightbox.caption}
)}
Loja Exclusiva

Continue o ritual em casa.

{store.products.map((p, i) => (
{p.tag &&
{p.tag}
} {p.img ? {p.name} : }
{p.cat}
{p.name}
{brl(p.priceN)}
))}
) : ( {const el=document.getElementById('agendar'); if(!el) return; window.Motion ? window.Motion.scrollTo(el) : window.scrollTo({top:el.offsetTop-70,behavior:'smooth'});}}/> )} WhatsApp
setCartOpen(false)}/> setAiOpen(false)} showToast={showToast}/> setCheckoutOpen(false)} items={cartItems} total={cartTotal} onDone={()=>setCart({})} showToast={showToast}/> setAdminOpen(false)} showToast={showToast}/>
{toast}
); } ReactDOM.createRoot(document.getElementById('root')).render();