/* global React, ReactDOM, Icon, RouteCtx, Sidebar, TopBar, useTweaks, TweaksPanel, TweakSection, TweakRadio, TweakToggle, TweakSelect, TweakButton, ScreenLanding, ScreenBinding, ScreenDashboard, ScreenRelics, ScreenStaticRoster, ScreenRaidNight, ScreenLoot, ScreenFC, ScreenSettings */ const { useState: useStateApp, useEffect: useEffectApp, useMemo: useMemoApp } = React; // EDITMODE block for persistence const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "theme": "dark", "syncState": "ok", "staticEmpty": false, "fflogsImported": true, "initialScreen": "dashboard" }/*EDITMODE-END*/; function App() { const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); // initial screen from hash, or tweak default, or dashboard const hashScreen = () => { const h = (window.location.hash || '').replace('#', ''); return h || t.initialScreen || 'dashboard'; }; const [screen, setScreen] = useStateApp(hashScreen); useEffectApp(() => { const onHash = () => setScreen(hashScreen()); window.addEventListener('hashchange', onHash); return () => window.removeEventListener('hashchange', onHash); }, []); const go = (s) => { window.location.hash = s; setScreen(s); }; const route = useMemoApp(() => ({ screen, go }), [screen]); // theme useEffectApp(() => { document.documentElement.classList.toggle('theme-light', t.theme === 'light'); document.documentElement.classList.toggle('theme-dark', t.theme !== 'light'); }, [t.theme]); const character = { name: 'Aerith Nightsong', world: 'Sargatanas', dc: 'Aether' }; // Some screens have no shell (landing, binding) const noShell = screen === 'landing' || screen === 'binding'; const screenEl = (() => { switch (screen) { case 'landing': return ; case 'binding': return ; case 'dashboard': return ; case 'collections': return ; case 'relics': return ; case 'static': return ; case 'raidnight': return ; case 'loot': return ; case 'fc': return ; case 'settings': return ; default: return ; } })(); return (
{!noShell && } {noShell ? ( screenEl ) : (
setTweak('theme', t.theme === 'light' ? 'dark' : 'light')} />
{screenEl}
)}
setTweak('theme', v)} /> setTweak('syncState', v)} /> setTweak('staticEmpty', v)} /> setTweak('fflogsImported', v)} />
{[ ['landing', '1 · Landing'], ['binding', '2 · Binding'], ['dashboard', '3 · Dashboard'], ['relics', '4 · Relics'], ['static', '5 · Static'], ['raidnight', '6 · Raid night'], ['loot', '7 · Loot'], ['fc', '8 · FC'], ['settings', '9 · Settings'], ].map(([id, label]) => ( ))}
); } function ScreenPlaceholder({ title, sub }) { return (

{title}

{sub}
This screen is part of the broader product but not in this round of mockups.
); } ReactDOM.createRoot(document.getElementById('root')).render();