// app.jsx — root, estado, navegação e tweaks const { useState: useA, useEffect: useAE } = React; function hexToRgba(hex, a) { const h = hex.replace('#', ''); const r = parseInt(h.slice(0,2),16), g = parseInt(h.slice(2,4),16), b = parseInt(h.slice(4,6),16); return `rgba(${r},${g},${b},${a})`; } const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "accent": "#ff2d2d", "displayFont": "Barlow Condensed", "glow": true, "avatarPulse": true, "radius": 22 }/*EDITMODE-END*/; function App() { const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); const [onboarded, setOnboarded] = useA(false); const [screen, setScreen] = useA('dashboard'); const [inWorkout, setInWorkout] = useA(false); const [user, setUser] = useA(USER_STATE); const [profile, setProfile] = useA(null); const rootStyle = { '--accent': t.accent, '--accent-soft': hexToRgba(t.accent, 0.16), '--ff-display': `'${t.displayFont}', 'Arial Narrow', sans-serif`, '--r-lg': t.radius + 'px', '--r-xl': (t.radius + 8) + 'px', '--glow': t.glow ? 'drop-shadow(0 0 8px var(--accent-soft))' : 'none', '--aura-play': t.avatarPulse ? 'running' : 'paused', }; const reset = () => { setOnboarded(false); setScreen('dashboard'); setInWorkout(false); }; return (
{!onboarded ? ( { setProfile(p); setUser(u => ({ ...u, name: p.name || u.name, level: p.level || u.level, sex: p.sex || u.sex })); setOnboarded(true); }} /> ) : inWorkout ? ( setInWorkout(false)} onFinish={() => { setInWorkout(false); setScreen('dashboard'); }} /> ) : ( {screen === 'dashboard' && setInWorkout(true)} onNav={setScreen} />} {screen === 'workout' && setInWorkout(true)} onNav={setScreen} />} {screen === 'avatar' && } {screen === 'history' && } { if (s === 'workout') setInWorkout(true); else setScreen(s); }} /> )} setTweak('accent', v)} /> setTweak('displayFont', v)} /> setTweak('radius', v)} /> setTweak('glow', v)} /> setTweak('avatarPulse', v)} />
); } ReactDOM.createRoot(document.getElementById('root')).render();