// Bespoke Wealth Advisory — page composition + tweaks const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "hero": "editorial", "accent": ["#0D903A", "#1A549F"], "showQuotes": true }/*EDITMODE-END*/; function App() { const [tweaks, setTweak] = window.useTweaks(TWEAK_DEFAULTS); // Apply accent gradient globally via CSS vars React.useEffect(() => { const [from, to] = Array.isArray(tweaks.accent) ? tweaks.accent : ["#0D903A", "#1A549F"]; document.documentElement.style.setProperty( '--ambiz-gradient-button', `linear-gradient(271deg, ${from} -13%, ${to} 93%)` ); document.documentElement.style.setProperty( '--ambiz-gradient', `linear-gradient(to right, ${from}, ${to})` ); }, [tweaks.accent]); // Scroll reveal — light touch. Only animates sections that haven't entered the // viewport yet at mount; the rest stay visible by default. React.useEffect(() => { const obs = new IntersectionObserver(entries => { entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add('visible'); obs.unobserve(e.target); }}); }, { threshold: 0.08, rootMargin: '0px 0px -10% 0px' }); document.querySelectorAll('.section').forEach(el => { const r = el.getBoundingClientRect(); if (r.top > window.innerHeight * 0.9) { // below the fold — give it a reveal animation el.classList.add('reveal-anim'); obs.observe(el); } }); return () => obs.disconnect(); }, []); return (
setTweak('hero', v)} options={[ { value: 'editorial', label: 'Editorial' }, { value: 'command', label: 'Command' }, { value: 'cinematic', label: 'Cinema' }, ]} /> setTweak('accent', v)} options={[ ['#0D903A', '#1A549F'], ['#0D903A', '#0F8E42'], ['#246BB2', '#164A97'], ['#057430', '#FFBA00'], ]} />
); } const root = ReactDOM.createRoot(document.getElementById('root')); root.render();