Files
ToolCTRLandClaude Opus 4.7 9ecfc015b1
Deploy / build-and-deploy (push) Successful in 21s
Form: Vorname/Nachname + Branche, Hero ohne Leistungen-Button
Form
- Name in Vorname + Nachname gesplittet (beide Pflicht), 2-Spalten-Grid
- Neues Feld Branche neben Firmenname (optional, 2-Spalten-Grid)
- Telefon-Label auf 'Telefonnummer' vereinheitlicht
- Placeholder ohne Em-Dash

script.js
- Validierung jetzt auf vorname/nachname/email/nachricht
- Payload sendet neue Einzelfelder (vorname, nachname, firmenname,
  branche) PLUS zusammengesetzte Backward-Compat-Felder (name, firma
  mit Branche-Suffix in Klammern), damit server.js/Inbox-Schema
  unverändert bleibt

Hero
- 'Leistungen ansehen' Ghost-Button entfernt, nur noch der schwarze
  'Kontakt aufnehmen' CTA

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-03 12:21:39 +02:00

137 lines
4.1 KiB
JavaScript

/* ToolCTRL — Landing Page Interaktion */
(function () {
"use strict";
/* ---- Jahr im Footer ---- */
var yearEl = document.getElementById("year");
if (yearEl) yearEl.textContent = String(new Date().getFullYear());
/* ---- Mobile-Navigation ---- */
var toggle = document.querySelector(".nav-toggle");
var mobileNav = document.querySelector(".mobile-nav");
if (toggle && mobileNav) {
toggle.addEventListener("click", function () {
var open = mobileNav.hasAttribute("hidden");
if (open) {
mobileNav.removeAttribute("hidden");
toggle.setAttribute("aria-expanded", "true");
} else {
mobileNav.setAttribute("hidden", "");
toggle.setAttribute("aria-expanded", "false");
}
});
mobileNav.querySelectorAll("a").forEach(function (a) {
a.addEventListener("click", function () {
mobileNav.setAttribute("hidden", "");
toggle.setAttribute("aria-expanded", "false");
});
});
}
/* ---- Lead-Formular ---- */
var form = document.getElementById("lead-form");
var status = document.getElementById("form-status");
if (!form) return;
function setStatus(msg, kind) {
if (!status) return;
status.textContent = msg;
status.className = "form-status " + (kind || "");
status.hidden = false;
}
function fieldRow(input) {
return input.closest(".form-row");
}
function validate() {
var ok = true;
["f-vorname", "f-nachname", "f-email", "f-nachricht"].forEach(function (id) {
var el = document.getElementById(id);
if (!el) return;
var row = fieldRow(el);
var valid = el.value.trim() !== "";
if (id === "f-email" && valid) {
valid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(el.value.trim());
}
if (row) row.classList.toggle("invalid", !valid);
if (!valid) ok = false;
});
return ok;
}
form.addEventListener("submit", function (e) {
e.preventDefault();
if (!validate()) {
setStatus("Bitte füllen Sie die markierten Pflichtfelder aus.", "err");
return;
}
var btn = form.querySelector("button[type=submit]");
var vorname = form.vorname.value.trim();
var nachname = form.nachname.value.trim();
var firmenname = form.firmenname.value.trim();
var branche = form.branche.value.trim();
var payload = {
name: (vorname + " " + nachname).trim(),
vorname: vorname,
nachname: nachname,
firma: firmenname + (branche ? " (" + branche + ")" : ""),
firmenname: firmenname,
branche: branche,
email: form.email.value.trim(),
telefon: form.telefon.value.trim(),
nachricht: form.nachricht.value.trim(),
website: form.website.value.trim(), // Honeypot
quelle: "Landing Page"
};
if (btn) { btn.disabled = true; btn.textContent = "Wird gesendet …"; }
setStatus("Anfrage wird übermittelt …", "");
fetch("/api/lead", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
})
.then(function (res) {
return res.json().then(function (data) {
return { ok: res.ok, data: data };
});
})
.then(function (r) {
if (r.ok) {
form.reset();
setStatus(
"Vielen Dank — Ihre Anfrage ist bei uns eingegangen. Wir melden uns zeitnah.",
"ok"
);
} else {
setStatus(
(r.data && r.data.error) ||
"Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.",
"err"
);
}
})
.catch(function () {
setStatus(
"Verbindung fehlgeschlagen. Bitte schreiben Sie uns direkt an info@tool-ctrl.de.",
"err"
);
})
.finally(function () {
if (btn) { btn.disabled = false; btn.textContent = "Anfrage senden"; }
});
});
/* Markierung beim Tippen entfernen */
form.querySelectorAll("input, textarea").forEach(function (el) {
el.addEventListener("input", function () {
var row = fieldRow(el);
if (row) row.classList.remove("invalid");
});
});
})();