// blocks.jsx — reusable content sections built on i18n data
function TrustBar() {
const items = [["a", "aL"], ["b", "bL"], ["c", "cL"], ["d", "dL"]];
return (
{items.map(([n, l], i) => (
{t("trust." + n)}
{t("trust." + l)}
))}
);
}
function PromiseBand() {
return (
{t("home.promiseEyebrow")}
{t("home.promiseTitle")}
{t("home.promiseText")}
);
}
function ServiceCard({ s, dark }) {
return (
{s.title}
{s.desc}
{s.bullets && (
{s.bullets.map((b, i) => (
-
{b}
))}
)}
{s.icon === "anchor" && s.bullets && (
)}
);
}
function ServiceGrid({ dark, bullets }) {
const services = t("services");
return (
{services.map((s, i) => )}
);
}
// CodixLightbox — kleines Karussell für die coDiagnostiX-Planungsbilder.
// Backdrop-Klick / Esc schließt, Pfeiltasten blättern.
function CodixLightbox({ onClose }) {
const shots = t("codiagnostix.shots");
const n = shots.length;
const [idx, setIdx] = React.useState(0);
const go = React.useCallback((d) => setIdx((i) => (i + d + n) % n), [n]);
React.useEffect(() => {
const onKey = (e) => {
if (e.key === "Escape") onClose();
else if (e.key === "ArrowRight") go(1);
else if (e.key === "ArrowLeft") go(-1);
};
window.addEventListener("keydown", onKey);
const prev = document.body.style.overflow;
document.body.style.overflow = "hidden";
return () => { window.removeEventListener("keydown", onKey); document.body.style.overflow = prev; };
}, [go, onClose]);
const navBtn = { width: 46, height: 46, borderRadius: "50%", border: "1px solid var(--line-gold)", background: "rgba(10,10,10,0.55)", color: "var(--gold-300)", display: "flex", alignItems: "center", justifyContent: "center", cursor: "pointer", flexShrink: 0 };
const shot = shots[idx];
const stop = (e) => e.stopPropagation();
return (
{t("codiagnostix.title")}
{t("codiagnostix.note")}
{shot.cap}
{shots.map((_, i) => (
))}
);
}
// Trigger-Link in der Implantologie-Kachel — öffnet das Planungs-Karussell.
function ImplantPlanningTrigger() {
const [open, setOpen] = React.useState(false);
const [hover, setHover] = React.useState(false);
return (
{open && setOpen(false)} />}
);
}
function AudienceCard({ a }) {
return (
{a.title}
{a.hook}
{a.msg}
{a.key === "implantologie" &&
}
);
}
function AudienceGrid() {
const aud = t("audiences");
return (
);
}
function CoopSteps() {
const steps = t("coopSteps");
return (
{steps.map((s, i) => (
))}
);
}
function FinalCTA() {
const phone = t("contactData.phone");
return (
{t("home.finalTitle")}
{t("home.finalText")}
);
}
function Testimonials({ dark }) {
const items = t("testimonials");
return (
{items.map((q, i) => (
“
{q.quote}
{q.name}
{q.role}
))}
);
}
Object.assign(window, { TrustBar, PromiseBand, ServiceCard, ServiceGrid, AudienceCard, AudienceGrid, CoopSteps, FinalCTA, Testimonials, CodixLightbox, ImplantPlanningTrigger });