/* REVO JURIS — Header, mobile drawer, video hero, stats (single-language) */
function Brand({ footer }) {
const onDark = footer;
const src = onDark ? 'assets/logomark-inverse.svg' : 'assets/logomark.svg';
return (
REVO JURIS
Consulting Limited
億誠國際法律顧問有限公司
);
}
function Header({ onEnquire, lang, setLang }) {
const tx = useTx();
const [scrolled, setScrolled] = React.useState(false);
const [drawer, setDrawer] = React.useState(false);
React.useEffect(() => {
const onScroll = () => setScrolled(window.scrollY > 12);
window.addEventListener('scroll', onScroll);
return () => window.removeEventListener('scroll', onScroll);
}, []);
const cjk = lang === 'ZH' ? ' cjk' : '';
return (
{tx(UI.hotShort)} · +852 5715 5628
{tx(UI.langs)}
{NAV_LINKS.map(([t, h]) =>
setDrawer(false)}>{tx(t)})}
);
}
function Hero({ onEnquire, onHotline, onFees }) {
const lang = useLang();
const tx = useTx();
const cjk = lang === 'ZH' ? ' cjk' : '';
const h1 = tx(HERO.h1);
const videoRef = React.useRef(null);
const [videoOk, setVideoOk] = React.useState(false);
React.useEffect(() => {
const v = videoRef.current;
if (!v) return;
v.muted = true; v.defaultMuted = true;
const tryPlay = () => { const p = v.play(); if (p) p.catch(() => {}); };
const onData = () => { if (v.videoWidth > 0) setVideoOk(true); tryPlay(); };
tryPlay();
v.addEventListener('loadeddata', onData);
v.addEventListener('canplay', onData);
return () => { v.removeEventListener('loadeddata', onData); v.removeEventListener('canplay', onData); };
}, []);
const cityH = [42, 64, 52, 80, 60, 92, 50, 72, 58, 86, 46, 70, 56, 78, 48, 66];
return (
{/* Cinematic fallback scene — always present behind the banner */}
{tx(HERO.eyebrow)}
{h1[0]}
{h1[1]}
{tx(HERO.lede)}
{HERO.trust.map((c, i) => (
{tx(c.t)}
))}
);
}
function Stats() {
const lang = useLang();
const tx = useTx();
const cjk = lang === 'ZH' ? ' cjk' : '';
return (
{STATS.map(([n, label], i) => (
{tx(n)}
{tx(label)}
))}
);
}
Object.assign(window, { Header, Hero, Stats, Brand });