Files
ToolCTRL-website/public/script.js
T
ToolCTRLandClaude Opus 4.7 6597f6b303
Deploy / build-and-deploy (push) Successful in 22s
Landing: Events-Sektion, Grid-Hintergrund, scharfe Form, Konzept-Texte, Telefon im Footer
UI / Layout
- Subtiler 72px-Grid auf html (rgba(10,10,10,.032)), body transparent
- Neue Events-Sektion vor #kontakt: TechDay-Card + AI-GameJam-Card mit
  3px-Border + 7px-Offset-Shadow, ganze Card klickbar via stretched-link
- Form mit scharfen Ecken und 12px-Offset-Shadow (raffael-Stil),
  Section-Dark-Button-Schatten, monochromer Form-Status

Navigation
- Nur noch Start / TechDay / GameJam + Kontakt-Button (Anchor-Links
  zur Landingpage raus, da sie ohnehin direkt darunter erscheinen)
- Größere Hover-Fläche pro Nav-Link via padding, Unterstreichung
  via ::after fest positioniert
- Mobile-Nav synchron, TechDay-Page synchron

Copy
- Hero: CTA 'Projekt besprechen' -> 'Kontakt aufnehmen'
- Leistungen: neuer Intro + alle sechs Card-Texte (Hands-Off, Anzug,
  Kommandozentrale, Tools-aneinander-vorbei, zerstueckelte Teil-
  loesungen, waechst-mit-Ihrem-Betrieb)
- Vorgehen -> 'Konzept' / 'Das ToolCTRL Konzept.' mit vier Schritten
  (Situationsanalyse, Grundkonzepte, Umsetzung, Betrieb & Wartung)
- Kontakt-Intro umgeschrieben, Form-Label 'Worum geht es Ihnen?'

Kontakt
- E-Mail global admin@ -> info@ (5 Dateien inkl. script.js Fallback)
- Telefon +49 1523 7750939 in Footer-Kontaktspalte (index + techday),
  klickbar via tel:

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-02 19:59:42 +02:00

128 lines
3.7 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-name", "f-email", "f-nachricht"].forEach(function (id) {
var el = document.getElementById(id);
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 payload = {
name: form.name.value.trim(),
firma: form.firma.value.trim(),
email: form.email.value.trim(),
telefon: form.telefon.value.trim(),
nachricht: form.nachricht.value.trim(),
website: form.website.value.trim(), // Honeypot
quelle: "Messe — 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");
});
});
})();