/* ============================================================
app.jsx — main router & mount
============================================================ */
const ROUTES = {
"/login": () => ,
"/dashboard": () => ,
"/checkouts": () => ,
"/products": () => ,
"/bumps": () => ,
"/sales": () => ,
"/customers": () => ,
"/settings": () => ,
"/pay/preview":() => ,
"/obrigado": () => ,
};
function Router(){
const { route, user, setRoute } = useApp();
// Auth gate — public routes
const publicRoutes = ["/login", "/pay/preview", "/obrigado"];
React.useEffect(() => {
if (!user && !publicRoutes.includes(route)){
// For demo: if user navigates somewhere requiring auth without logging in,
// bounce to login — but auto-mock-login on first run for convenience.
setRoute("/login");
}
}, [route, user]);
const View = ROUTES[route] || ROUTES["/login"];
return ;
}
function App(){
return (
);
}
/* ============================================================
Tweaks panel — exposed via the toolbar Tweaks toggle
============================================================ */
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"accent": "#0a0a0a",
"paper": "#f7f6f4",
"density": "comfortable",
"showInkKpi": true
}/*EDITMODE-END*/;
function TweaksUI(){
const { setRoute, pushToast } = useApp();
const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
// Apply tweaks to root vars
React.useEffect(() => {
const r = document.documentElement.style;
r.setProperty("--ink", t.accent);
r.setProperty("--paper", t.paper);
r.setProperty("--paper-2", shade(t.paper, -3));
r.setProperty("--paper-3", shade(t.paper, -6));
document.body.style.fontSize = t.density === "compact" ? "13.5px" : "14.5px";
}, [t]);
return (
setTweak("accent", v)}
options={["#0a0a0a", "#1a1a1f", "#1f4f7d", "#2a4a2f", "#5a2a2a"]}/>
setTweak("paper", v)}
options={["#f7f6f4", "#f1f0ec", "#f4eee6", "#ffffff", "#0a0a0a"]}/>
setTweak("density", v)}
options={[{ label: "Confortável", value: "comfortable" }, { label: "Compacto", value: "compact" }]}/>
setRoute("/login")} />
setRoute("/dashboard")} />
setRoute("/checkouts")} />
setRoute("/sales")} />
setRoute("/pay/preview")} />
setRoute("/obrigado")} />
pushToast("Venda aprovada · ORD-7843", "ok")} />
pushToast("Cartão recusado · ORD-7844", "bad")} />
);
}
function shade(hex, dl){
// small helper — darken / lighten by delta percent (-10..10)
try {
const c = hex.replace("#", "");
const v = parseInt(c.length === 3 ? c.split("").map(x => x + x).join("") : c, 16);
let r = (v >> 16) & 255, g = (v >> 8) & 255, b = v & 255;
const adj = Math.round(255 * (dl / 100));
r = Math.max(0, Math.min(255, r + adj));
g = Math.max(0, Math.min(255, g + adj));
b = Math.max(0, Math.min(255, b + adj));
return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
} catch { return hex; }
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render();