const { ProductCard, ReserveDialog, IconButton, Badge, PhotoFrame } = window.WeiterfunkelnChDesignSystem_572ff0; /* Produktkachel = ProductCard des Design-Systems plus Merkliste-Herz */ function ProductTile({ product, wished, onWish, onReserve, compact }) { return (
{product.topLabel && ( {product.topLabel} )} { location.href = "produkt.html?id=" + product.id; }} onReserve={() => onReserve(product)} /> {(product.availability !== "verkauft" || wished) && (
onWish(product.id)} filled={wished} style={{ background: wished ? "none" : "rgba(252,250,246,.86)", color: wished ? "#C1443A" : "var(--text-muted)" }} />
)}
); } function ProductGrid({ items, store, onReserve, min, compact, gap }) { return (
{items.map(p => ( ))}
); } /* Reservierungsflow: Dialog des Design-Systems, danach ist das Stück überall reserviert */ function useReserveFlow(store) { const [piece, setPiece] = React.useState(null); // Referenzstabil halten (nur neu berechnen, wenn piece wirklich wechselt) — sonst // erzeugt jedes Re-Render (z.B. store.addReserved beim Absenden) ein neues Objekt, // das ReserveDialog als "anderes Produkt" interpretiert und Formular + Bestätigung // sofort wieder zurücksetzt, bevor die Nutzerin sie sieht. const dialogProduct = React.useMemo(() => ( piece ? { name: piece.name, kind: piece.kind, price: piece.price, material: piece.materialLabel, sku: piece.id, image: piece.image } : null ), [piece]); const handleSubmit = (data) => { store.addReserved(piece.id); // Anfrage an den Server: legt sie in der Reservierungs-Liste ab und schickt // eine E-Mail an hallo@weiterfunkeln.ch. Läuft im Hintergrund — der Dialog // zeigt die Bestätigung unabhängig davon sofort an (Fallback bleibt der // "Lieber direkt schreiben"-Mailto-Link im Dialog selbst). fetch("https://weiterfunkeln.ch/backend/reserve.php", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ sku: piece.id, vorname: data.vorname, nachname: data.nachname, email: data.email, telefon: data.telefon, nachricht: data.nachricht, }), }).catch((err) => { console.error("Weiterfunkeln: Reservierungsanfrage konnte nicht gesendet werden.", err); }); }; const dialog = ( setPiece(null)} onSubmit={handleSubmit} /> ); return { open: setPiece, dialog }; } function Breadcrumbs({ trail }) { return ( ); } function PageHead({ eyebrow, title, intro, gradient }) { return (
{eyebrow && {eyebrow}}

{title}

{intro &&

{intro}

}
); } Object.assign(window, { ProductTile, ProductGrid, useReserveFlow, Breadcrumbs, PageHead });