/* global React, ReactDOM, I18nProvider, ThemeProvider, TopBar, Hub, TOOL_VIEWS, useHashRoute, useTweaks, TweaksPanel, TweakSection, TweakRadio, TweakSelect */ /* ============================================================ app.jsx — Top-level App + router + Tweaks wiring ============================================================ */ const { useEffect: useEff, useState: useSt } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "cardStyle": "soft", "layout": "horiz", "mdStyle": "gfm", "dropzone": "default" }/*EDITMODE-END*/; function AppRoot() { const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS); // Publish to window for tool components (they read once on render) useEff(() => { window.__cv_tweaks = tweaks; }, [tweaks]); // Force re-render of tool components when tweaks change (since they read window) return ( ); } function Shell({ tweaks, setTweak }) { const route = useHashRoute(); const { t } = window.useI18n(); // Re-render observer for tweaks updates within tool views // (tool views read from window.__cv_tweaks; we just need them to remount/update) const tweakKey = `${tweaks.cardStyle}|${tweaks.layout}|${tweaks.mdStyle}|${tweaks.dropzone}`; let body = null; if (route.name === 'tool') { const ToolView = TOOL_VIEWS[route.toolId]; body = ToolView ? : ; } else { body = ; } return (
{body} setTweak('cardStyle', v)} /> setTweak('layout', v)} /> setTweak('mdStyle', v)} /> setTweak('dropzone', v)} />
); } // Bootstrap const root = ReactDOM.createRoot(document.getElementById('root')); root.render();