/* Multi-step Funnel + Footer */ function StepDot({ active, done }) { return (
); } function ChoiceCard({ icon: Icon, label, selected, onClick, emoji }) { return ( ); } function Field({ label, value, onChange, type = "text", error, placeholder }) { return ( ); } /* Calendar logic helpers */ function isSameDay(a, b) { return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate(); } function startOfDay(d) { const x = new Date(d); x.setHours(0,0,0,0); return x; } function addDays(d, n) { const x = new Date(d); x.setDate(x.getDate() + n); return x; } function getEarliestSelectable(today) { let candidate = addDays(startOfDay(today), 2); // Must be Mon–Fri while (candidate.getDay() === 0 || candidate.getDay() === 6) { candidate = addDays(candidate, 1); } return candidate; } function isDateDisabled(d, today, earliest) { const day = d.getDay(); if (day === 0 || day === 6) return true; if (startOfDay(d) < earliest) return true; return false; } function CustomCalendar({ value, onChange, today }) { const [view, setView] = useState(() => { const t = startOfDay(today); return new Date(t.getFullYear(), t.getMonth(), 1); }); const earliest = useMemo(() => getEarliestSelectable(today), [today]); const monthName = view.toLocaleDateString("de-DE", { month: "long", year: "numeric" }); // Build grid: Monday-first const firstDay = new Date(view.getFullYear(), view.getMonth(), 1); const lastDay = new Date(view.getFullYear(), view.getMonth() + 1, 0); const startWeekday = (firstDay.getDay() + 6) % 7; // Mon=0 const daysInMonth = lastDay.getDate(); const cells = []; for (let i = 0; i < startWeekday; i++) cells.push(null); for (let d = 1; d <= daysInMonth; d++) cells.push(new Date(view.getFullYear(), view.getMonth(), d)); while (cells.length % 7 !== 0) cells.push(null); const canPrev = !(view.getFullYear() === today.getFullYear() && view.getMonth() === today.getMonth()); return (Kein Sales-Pitch. Wir hören zu, bauen einen klaren Fahrplan und Sie entscheiden.
Wählen Sie das Hauptprojekt — Mehrfaches geht später.
So können wir den Umfang einschätzen.
Für eine erste Orientierung — kein Festpreis.
Damit wir den Termin bestätigen können.
Mo–Fr, 9:00–18:30 Uhr. Frühestens in 2 Werktagen.
Hier die Übersicht Ihrer Anfrage.
Wir melden uns innerhalb von 24h bei Ihnen mit der Terminbestätigung.