Statische Website ohne Build-Schritt: reines HTML, CSS und Vanilla-JS, lauffaehig auf beliebigem Webspace. Neun Seiten: Startseite, Dienstleistungen, Projekte, Ueber uns, Kontakt sowie Impressum, Datenschutz, Danke-Seite und 404. Kernstueck der Startseite ist die Stueckzahl-Achse: ein logarithmischer Regler von 1 bis 100.000 Stueck, der zur gewaehlten Menge Verfahren, Werkzeugkosten, Lieferzeit und Anwendungsfall ausgibt. Die dritte Zone ist optisch zurueckgenommen, weil Serienspritzguss ueber Partnerbetriebe laeuft und nicht zum eigenen Leistungsumfang gehoert. Der Leistungsumfang ist durchgehend auf FDM, SLA und SLA-gedruckte Formeinsaetze beschraenkt. Gestaltung nach Vorgabe: Anthrazit, Salbeigruen und Flieder als Akzent. Archivo, Public Sans und IBM Plex Mono werden lokal ausgeliefert statt ueber die Google-CDN eingebunden. Kontaktformular ueber Web3Forms mit Client-Validierung; der Access-Key ist noch ein Platzhalter. Alle Firmen- und Projektinhalte sind sichtbar als Platzhalter markiert, die Uebergabe-Checkliste steht in der README. Geprueft: WCAG-AA-Kontraste auf allen Seiten, kein horizontaler Ueberlauf von 320 bis 1920 px, Tastaturbedienung der Achse, feste Zeilenzahl der Hero-Headline. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
79 lines
2.3 KiB
JavaScript
79 lines
2.3 KiB
JavaScript
/* ==========================================================================
|
|
Purinto GmbH — Projektfilter
|
|
Filtert die Projektliste nach Branche und Verfahren. Beide Gruppen wirken
|
|
gemeinsam (UND): "Medizintechnik" + "Bridge Tooling" zeigt nur Projekte,
|
|
auf die beides zutrifft.
|
|
|
|
Ohne JavaScript sind schlicht alle Projekte sichtbar — die Filterleiste
|
|
wird dann gar nicht erst eingeblendet.
|
|
========================================================================== */
|
|
|
|
(function () {
|
|
"use strict";
|
|
|
|
var leiste = document.querySelector("[data-filter]");
|
|
var liste = document.querySelector("[data-projektliste]");
|
|
if (!leiste || !liste) return;
|
|
|
|
var projekte = liste.querySelectorAll("[data-branche]");
|
|
var leerHinweis = document.querySelector("[data-leer]");
|
|
var zaehler = document.querySelector("[data-zaehler]");
|
|
|
|
// Filterleiste ist nur mit JS sinnvoll, deshalb erst jetzt einblenden.
|
|
leiste.hidden = false;
|
|
|
|
var auswahl = { branche: "alle", verfahren: "alle" };
|
|
|
|
function passt(projekt) {
|
|
if (
|
|
auswahl.branche !== "alle" &&
|
|
projekt.getAttribute("data-branche") !== auswahl.branche
|
|
) {
|
|
return false;
|
|
}
|
|
|
|
if (auswahl.verfahren !== "alle") {
|
|
var verfahren = (projekt.getAttribute("data-verfahren") || "").split(/\s+/);
|
|
if (verfahren.indexOf(auswahl.verfahren) === -1) return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function anwenden() {
|
|
var sichtbar = 0;
|
|
|
|
Array.prototype.forEach.call(projekte, function (projekt) {
|
|
var zeigen = passt(projekt);
|
|
projekt.classList.toggle("ist-versteckt", !zeigen);
|
|
if (zeigen) sichtbar++;
|
|
});
|
|
|
|
if (leerHinweis) leerHinweis.hidden = sichtbar > 0;
|
|
|
|
if (zaehler) {
|
|
zaehler.textContent =
|
|
sichtbar === 1 ? "1 Projekt" : sichtbar + " Projekte";
|
|
}
|
|
}
|
|
|
|
leiste.addEventListener("click", function (e) {
|
|
var knopf = e.target.closest("[data-gruppe]");
|
|
if (!knopf) return;
|
|
|
|
var gruppe = knopf.getAttribute("data-gruppe");
|
|
auswahl[gruppe] = knopf.getAttribute("data-wert");
|
|
|
|
// Gedrückten Zustand innerhalb der Gruppe umsetzen
|
|
var geschwister = leiste.querySelectorAll(
|
|
'[data-gruppe="' + gruppe + '"]'
|
|
);
|
|
Array.prototype.forEach.call(geschwister, function (el) {
|
|
el.setAttribute("aria-pressed", String(el === knopf));
|
|
});
|
|
|
|
anwenden();
|
|
});
|
|
|
|
anwenden();
|
|
})();
|