/* Root app */ const { useState: useStateA, useEffect: useEffectA } = React; function BgSlider() { const imgs = [ IMG.case13, IMG.case11, IMG.case4, IMG.case6, IMG.case10, IMG.case12, IMG.case8, ].filter(Boolean); if (!imgs.length) return null; const set = [...imgs, ...imgs]; // duplicate for seamless loop return ( ); } function App() { const [tw, setTw] = useTweaks(); const [tweaksOn, setTweaksOn] = useStateA(false); const [footerReached, setFooterReached] = useStateA(false); useEffectA(() => { const handler = (e) => { if (!e.data || !e.data.type) return; if (e.data.type === '__activate_edit_mode') setTweaksOn(true); if (e.data.type === '__deactivate_edit_mode') setTweaksOn(false); }; window.addEventListener('message', handler); try { window.parent.postMessage({ type: '__edit_mode_available' }, '*'); } catch(e){} return () => window.removeEventListener('message', handler); }, []); useEffectA(() => { const footer = document.querySelector('.site-footer'); if (!footer) return; const observer = new IntersectionObserver( ([entry]) => setFooterReached(entry.isIntersecting), { threshold: 0 } ); observer.observe(footer); return () => observer.disconnect(); }, []); return ( <> {IMG.hamon && ( )}
{/*
*/}
{tw.showFloatingCta && (
予約の空き状況をみる
)} ); } ReactDOM.createRoot(document.getElementById('root')).render();