// ---- Product page: personalization form + live preview --------------
// Dynamic "what happens in your book" chips
function LiveEffects({ data }) {
const season = window.seasonFromDate(data.et);
const ssw = window.sswToday(data.et);
const bag = BIRTHPLACES[data.ort];
const chips = [];
if (data.name) chips.push({ ico: "feather", t: <>Cover und Intro für {data.name} > });
if (data.et) chips.push({ ico: "calendar", t: ssw ? <>Heute SSW {ssw} > : <>Wochenseiten ab SSW 5 > });
if (season) chips.push({ ico: season === "sommer" ? "sun" : "leaf",
t: <>Erstausstattung für ein {season === "sommer" ? "Sommerbaby" : "Winterbaby"} > });
chips.push({ ico: "home", t: {bag.bagTitle} });
if (data.ort === "zuhause") chips.push({ ico: "leaf", t: <>Seite Mein Geburtsraum zu Hause > });
chips.push(data.photopages
? { ico: "image", t: <>Mit Foto-Seiten für Ultraschall und Babybauch> }
: { ico: "image", t: <>Ohne Foto-Seiten> });
if (data.partner) chips.push({ ico: "users", t: <>Mit {data.partner} mitgedacht> });
return (
Das entsteht in deinem Buch
{chips.map((c, i) => (
{c.t}
))}
);
}
function Field({ label, hint, children, required, error }) {
return (
{label} {required && * }
{hint && {hint} }
{children}
{error &&
{error}
}
);
}
function ConfigForm({ data, setData, errors }) {
const set = (k, v) => setData({ ...data, [k]: v });
return (
{/* Name */}
set("name", e.target.value)} />
{/* Farbvariante */}
{COVER_THEMES.map(t => (
set("theme", t.id)}
className={"j-theme" + (data.theme === t.id ? " is-on" : "")} title={t.label}>
Aa
{data.theme === t.id && }
{t.label}
))}
{/* Geburtstermin */}
set("et", e.target.value)} />
{/* Geburtsort */}
{Object.values(BIRTHPLACES).map(b => (
set("ort", b.id)}
className={"j-ort" + (data.ort === b.id ? " is-on" : "")}>
{b.label}
))}
{BIRTHPLACES[data.ort].note}
{/* Foto-Seiten */}
set("photopages", true)}
className={"j-photo" + (data.photopages ? " is-on" : "")}>
{data.photopages && }
Dazunehmen
Seiten zum Einkleben deiner Bilder
set("photopages", false)}
className={"j-photo" + (!data.photopages ? " is-on" : "")}>
{!data.photopages && }
Weglassen
schlanker, ganz ohne Foto-Seiten
{/* Partner */}
set("partner", e.target.value)} />
Lässt du das Feld frei, formulieren wir alle Stellen für dich allein.
);
}
function BuyBox({ data, addToCart, validate }) {
const [qty, setQty] = useState(1);
const [added, setAdded] = useState(false);
const onAdd = () => {
if (!validate()) {
document.querySelector(".j-form")?.scrollIntoView({ block: "center", behavior: "smooth" });
return;
}
addToCart({ data: { ...data }, price: PRICE, qty });
setAdded(true);
setTimeout(() => setAdded(false), 1800);
};
return (
setQty(Math.max(1, qty - 1))} aria-label="weniger">
{qty}
setQty(qty + 1)} aria-label="mehr">
{added ? <> Hinzugefügt> : <>In den Warenkorb · {eur(PRICE * qty)}>}
{["Visa", "Mastercard", "PayPal", "Klarna", "Apple Pay"].map(p => {p} )}
Lieferung in 8 bis 10 Tagen
30 Tage Geld-zurück
Produziert in Deutschland
);
}
function Upsell() {
const items = [
{ t: "Gel-Stifte Set, vier Farben", p: 9.98, ico: "feather" },
{ t: "Sticker zum Gestalten", p: 7.99, ico: "sparkle" },
{ t: "Geschenkverpackung", p: 5.99, ico: "bookmark" },
];
return (
Wird oft dazu gewählt
{items.map((it, i) => (
))}
);
}
function SpecsAccordion() {
const specs = [
{ q: "Material und Verarbeitung", a: "Hardcover mit mattem Einband, vollfarbig gedruckt, mit zwei Lesebändchen." },
{ q: "Umfang und Papier", a: "Rund 105 bis 120 Seiten auf hochwertigem Papier, angenehm zu beschreiben." },
{ q: "Format", a: "Quadratisch, 20,5 × 20,5 cm. Kompakt genug für die Tasche, großzügig genug zum Schreiben." },
{ q: "Produktion und Versand", a: "Hochwertig in Deutschland produziert. Lieferung in 8 bis 10 Tagen, Versand 4,95 €." },
];
const [open, setOpen] = useState(-1);
return (
Ausstattung
{specs.map((s, i) => (
setOpen(open === i ? -1 : i)}>
{s.q}
))}
);
}
function ProductPage({ go, data, setData, layout, addToCart }) {
const [errors, setErrors] = useState({});
const validate = () => {
const e = {};
if (!data.name.trim()) e.name = "Wir brauchen deinen Namen fürs Cover.";
if (!data.et) e.et = "Bitte trag deinen Geburtstermin ein.";
setErrors(e);
return Object.keys(e).length === 0;
};
useEffect(() => {
setErrors(prev => {
const n = { ...prev };
if (data.name.trim()) delete n.name;
if (data.et) delete n.et;
return n;
});
}, [data.name, data.et]);
const editorial = layout === "editorial";
const atelier = layout === "atelier";
return (
go("home")}>Start
Schwangerschaftsjournal, personalisiert
{["Cover", "Wochenseite", "Kliniktasche", "Brief"].map((t, i) => (
))}
{!editorial &&
}
{["L","S","M","A"].map(a => {a} )}
Über 2.300 begleitete Schwangerschaften
Schwangerschaftsjournal
Dein personalisierter Begleiter durch neun Monate. Für Notizen, Termine und das, was du behalten möchtest.
4,9 von 5, 2.314 Bewertungen
{eur(PRICE)}
inkl. MwSt, zzgl. 4,95 € Versand
{editorial &&
}
);
}
Object.assign(window, { ProductPage });