// 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 ( <>
{s.body}
Coloração autoral, cortes e tratamentos conduzidos por quem abriu o studio em 2018 e atende cada cliente pessoalmente.
{A.bio}
Nenhuma foto nesta categoria ainda.
}