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 (
);
}
/* 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 });