const { useState, useEffect, useCallback } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "serifFont": "Playfair Display", "sansFont": "Hanken Grotesk", "palette": ["#bd5e3c", "#6b7048"], "heroStyle": "overlay", "radius": 18 }/*EDITMODE-END*/; function App() { const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); const [cart, setCart] = useState([]); const [dish, setDish] = useState(null); // offenes Gericht-Modal const [cartOpen, setCartOpen] = useState(false); const [reserveOpen, setReserveOpen] = useState(false); useReveal(); // Tweaks → CSS-Variablen useEffect(() => { const r = document.documentElement.style; r.setProperty("--font-serif", `'${t.serifFont}', serif`); r.setProperty("--font-sans", `'${t.sansFont}', system-ui, sans-serif`); const [a, a2] = t.palette; r.setProperty("--accent", a); r.setProperty("--accent-d", `color-mix(in srgb, ${a} 84%, black)`); r.setProperty("--accent2", a2); r.setProperty("--radius", t.radius + "px"); }, [t]); const addToCart = useCallback((line) => { setCart((c) => { const i = c.findIndex((x) => x.key === line.key); if (i >= 0) { const next = [...c]; next[i] = { ...next[i], qty: Math.min(20, next[i].qty + line.qty) }; return next; } return [...c, line]; }); // kleines haptisches Feedback: Cart kurz öffnen? Nein — dezent, nur Badge. }, []); const setQty = useCallback((key, qty) => { setCart((c) => qty <= 0 ? c.filter((x) => x.key !== key) : c.map((x) => x.key === key ? { ...x, qty: Math.min(20, qty) } : x)); }, []); const removeItem = useCallback((key) => setCart((c) => c.filter((x) => x.key !== key)), []); const clearCart = useCallback(() => setCart([]), []); const count = cart.reduce((s, i) => s + i.qty, 0); const subtotal = cart.reduce((s, i) => s + i.unit * i.qty, 0); const openOrder = () => { if (count > 0) { setCartOpen(true); } else { const el = document.getElementById("menu"); if (el) el.scrollIntoView({ behavior: "smooth" }); } }; const browseMenu = () => { const el = document.getElementById("menu"); if (el) el.scrollIntoView({ behavior: "smooth" }); }; return (