// SourceWeaver theme picker — wraps the Landing root and renders a TweaksPanel.
function ThemedLanding() {
const [tweaks, setTweak] = useTweaks({ theme: 'terminal' });
React.useEffect(() => {
document.documentElement.dataset.theme = tweaks.theme;
// Propagate theme to embedded app iframes (e.g. the hero AppShell mock).
const frames = document.querySelectorAll('iframe[data-sw-app]');
frames.forEach(f => {
try { f.contentWindow.postMessage({ type: '__sw_set_theme', theme: tweaks.theme }, '*'); } catch {}
});
}, [tweaks.theme]);
// Re-apply the URL hash after first paint. Babel-in-browser transpiles the
// page async, so on a cold load with #anchor the section doesn't exist yet
// when the browser tries to resolve it.
React.useEffect(() => {
const id = window.location.hash.slice(1);
if (!id) return;
const tryScroll = () => {
const el = document.getElementById(id);
if (el) el.scrollIntoView({ block: 'start' });
};
tryScroll();
const t = setTimeout(tryScroll, 200);
return () => clearTimeout(t);
}, []);
return (
<>
setTweak('theme', v)}
options={[
{ value: 'terminal', label: 'Terminal' },
{ value: 'mid', label: 'Mid' },
{ value: 'light', label: 'Light' },
]}
/>
>
);
}
Object.assign(window, { ThemedLanding });