/* app.jsx — root composer */
const PALETTE = {
bg:"#f6f2ec", bg2:"#efe9df", bg3:"#e8e1d3",
sage:"#6b7f63", sage3:"#d8dfd0", sage4:"#eef1e8",
terra:"#b9603e", terra3:"#ead7c8",
};
function App() {
React.useEffect(() => {
const root = document.documentElement;
root.style.setProperty('--bg', PALETTE.bg);
root.style.setProperty('--bg-2', PALETTE.bg2);
root.style.setProperty('--bg-3', PALETTE.bg3);
root.style.setProperty('--sage', PALETTE.sage);
root.style.setProperty('--sage-3', PALETTE.sage3);
root.style.setProperty('--sage-4', PALETTE.sage4);
root.style.setProperty('--terra', PALETTE.terra);
root.style.setProperty('--terra-3', PALETTE.terra3);
root.style.setProperty('--font-display', "'Fraunces', Georgia, serif");
root.style.setProperty('--font-sans', "'DM Sans', system-ui, sans-serif");
root.style.setProperty('--font-serif', "'Fraunces', Georgia, serif");
document.body.style.fontSize = '16px';
root.style.setProperty('--heading-weight', 350);
root.style.setProperty('--letter-tracking', '0em');
root.style.setProperty('--radius', '18px');
root.style.setProperty('--radius-lg', '27.9px');
root.style.setProperty('--radius-xl', '39.6px');
root.style.setProperty('--radius-sm', '9.9px');
root.style.setProperty('--maxw', '1240px');
document.body.dataset.theme = 'light';
document.body.dataset.density = 'regular';
document.body.dataset.italics = 'on';
document.body.dataset.nav = 'classic';
document.body.dataset.btnshape = 'pill';
document.body.dataset.btnstyle = 'filled';
document.body.dataset.card = 'flat';
document.body.dataset.imgfilter = 'none';
document.body.dataset.grain = 'off';
document.body.dataset.shadows = 'on';
document.body.dataset.ulinks = 'off';
document.body.dataset.navsticky = 'on';
}, []);
React.useEffect(() => {
const QUERY = [
'.eyebrow', 'h1', 'h2', 'h3',
'.hero-img', '.hero-meta',
'.step', '.prob-cell', '.testimonial-card',
'.card', '.card-sage', '.card-terra',
'.stat', '.kv', '.booking',
'.value-item', '.footer-brand-big', '.footer-col',
].join(', ');
document.querySelectorAll('section:not(.hero), footer, .values-strip').forEach(sec => {
sec.querySelectorAll(QUERY).forEach((el, i) => {
el.classList.add('rv');
el.style.setProperty('--rv-d', Math.min(i * 80, 400) + 'ms');
});
});
const io = new IntersectionObserver(entries => {
entries.forEach(e => {
if (e.isIntersecting) { e.target.classList.add('rv-in'); io.unobserve(e.target); }
});
}, { threshold: 0.08, rootMargin: '0px 0px -30px 0px' });
document.querySelectorAll('.rv').forEach(el => io.observe(el));
return () => io.disconnect();
}, []);
return (
<>
>
);
}
ReactDOM.createRoot(document.getElementById('root')).render();