diff --git a/assets/css/webdesign.css b/assets/css/webdesign.css index 139ec2b6..cc004fd9 100644 --- a/assets/css/webdesign.css +++ b/assets/css/webdesign.css @@ -110,6 +110,23 @@ --wd-aqua: rgb(var(--wd-aqua-rgb)); /* Fokusring, Live-Zustand */ --wd-lila: rgb(var(--wd-lila-rgb)); /* sekundaere Bereiche, Spezial */ --wd-lila-tief: rgb(var(--wd-indigo-rgb)); + /* Aurora Violet als SCHRIFTFARBE auf einer lila Flaeche. + + Der volle Ton (#A76BFF) erreicht dort nur 4,08:1 -- gemessen auf + dem echten Untergrund rgb(38,41,81), den eine lila Kachel unter + einem Schild erzeugt. WCAG AA verlangt 4,5:1, denn die Schrift ist + 12,5 Punkte gross und damit normaler Text; fett zaehlt erst ab + 18,5 Punkten als "gross". + + #C197FF sind 30 % Richtung Weiss und erreichen 6,02:1. Bewusst + nicht der knappste Wert (#B380FF haette mit 4,91:1 gereicht): + Dasselbe Schild steht auch auf anderen Flaechen, etwa ueber der + Buehne im Verwaltungsbereich. Ein Ton, der nur an einer Stelle + knapp besteht, faellt beim naechsten Hintergrund wieder durch. + + Dasselbe Muster wie --wd-blau-hell, das aus genau diesem Grund + existiert. */ + --wd-lila-hell: #C197FF; --wd-indigo: rgb(var(--wd-indigo-rgb)); --wd-gold: rgb(var(--wd-gold-rgb)); /* NUR Hinweise, Zahlungen, VIP */ --wd-gold-tief: #b8934a; @@ -612,7 +629,7 @@ a.wd-karte:hover, .wd-karte--klickbar:hover { border: 1px solid var(--wd-rand-stark); color: var(--wd-blau-hell); } -.wd-tag--lila { background: rgb(var(--wd-lila-rgb) / .12); border-color: rgb(var(--wd-lila-rgb) / .34); color: var(--wd-lila); } +.wd-tag--lila { background: rgb(var(--wd-lila-rgb) / .12); border-color: rgb(var(--wd-lila-rgb) / .34); color: var(--wd-lila-hell); } .wd-tag--gold { background: rgb(var(--wd-gold-rgb) / .12); border-color: rgb(var(--wd-gold-rgb) / .34); color: var(--wd-gold); } .wd-tag--ok { background: rgb(var(--wd-ok-rgb) / .12); border-color: rgb(var(--wd-ok-rgb) / .34); color: var(--wd-ok); } /* Aqua fuer die Arcade. Als Schriftfarbe unbedenklich: Hyper Aqua liegt diff --git a/blickfang-ueber-pc.png b/blickfang-ueber-pc.png index 76de3a55..8b3853c1 100644 Binary files a/blickfang-ueber-pc.png and b/blickfang-ueber-pc.png differ diff --git a/pruef-aufgaben-computer.png b/pruef-aufgaben-computer.png index f8eaa5a8..96b96b93 100644 Binary files a/pruef-aufgaben-computer.png and b/pruef-aufgaben-computer.png differ diff --git a/pruef-aufgaben-handy.png b/pruef-aufgaben-handy.png index 51efeb06..8eed58e6 100644 Binary files a/pruef-aufgaben-handy.png and b/pruef-aufgaben-handy.png differ diff --git a/pruef-detail-computer.png b/pruef-detail-computer.png index 1b32d7b8..9d91ee29 100644 Binary files a/pruef-detail-computer.png and b/pruef-detail-computer.png differ diff --git a/pruef-detail-handy.png b/pruef-detail-handy.png index b36c05f7..62c184c2 100644 Binary files a/pruef-detail-handy.png and b/pruef-detail-handy.png differ diff --git a/pruef-portal-aufgaben-computer.png b/pruef-portal-aufgaben-computer.png index e9662a98..497925bc 100644 Binary files a/pruef-portal-aufgaben-computer.png and b/pruef-portal-aufgaben-computer.png differ diff --git a/pruef-portal-aufgaben-handy.png b/pruef-portal-aufgaben-handy.png index d5b69356..cc811a9b 100644 Binary files a/pruef-portal-aufgaben-handy.png and b/pruef-portal-aufgaben-handy.png differ diff --git a/pruef-portal-postfach-computer.png b/pruef-portal-postfach-computer.png index 998dcb26..48c4552c 100644 Binary files a/pruef-portal-postfach-computer.png and b/pruef-portal-postfach-computer.png differ diff --git a/pruef-portal-postfach-handy.png b/pruef-portal-postfach-handy.png index 9cd00c20..4803c5cf 100644 Binary files a/pruef-portal-postfach-handy.png and b/pruef-portal-postfach-handy.png differ diff --git a/pruef-portfolio-computer.png b/pruef-portfolio-computer.png index 39049ffb..2712e7c7 100644 Binary files a/pruef-portfolio-computer.png and b/pruef-portfolio-computer.png differ diff --git a/pruef-postfach-computer.png b/pruef-postfach-computer.png index 5ee8bf96..792c1d57 100644 Binary files a/pruef-postfach-computer.png and b/pruef-postfach-computer.png differ diff --git a/pruef-postfach-handy.png b/pruef-postfach-handy.png index b4ea72dc..f53972ca 100644 Binary files a/pruef-postfach-handy.png and b/pruef-postfach-handy.png differ diff --git a/pruef-rechtliches.png b/pruef-rechtliches.png index f2c4df19..569a38ae 100644 Binary files a/pruef-rechtliches.png and b/pruef-rechtliches.png differ diff --git a/pruef-vw-schmuck-computer.png b/pruef-vw-schmuck-computer.png index 6bf2b853..5e311125 100644 Binary files a/pruef-vw-schmuck-computer.png and b/pruef-vw-schmuck-computer.png differ diff --git a/pruef-vw-schmuck-handy.png b/pruef-vw-schmuck-handy.png index 6f4fcf4a..d57584b9 100644 Binary files a/pruef-vw-schmuck-handy.png and b/pruef-vw-schmuck-handy.png differ diff --git a/pruef-widerruf-computer.png b/pruef-widerruf-computer.png index 4636a7b0..bc36015b 100644 Binary files a/pruef-widerruf-computer.png and b/pruef-widerruf-computer.png differ diff --git a/pruef-widerruf-handy.png b/pruef-widerruf-handy.png index 89e0391e..b3da693b 100644 Binary files a/pruef-widerruf-handy.png and b/pruef-widerruf-handy.png differ diff --git a/server-internal/test-geheimnisse.mjs b/server-internal/test-geheimnisse.mjs index b9e7e9cd..71855459 100644 --- a/server-internal/test-geheimnisse.mjs +++ b/server-internal/test-geheimnisse.mjs @@ -56,12 +56,37 @@ pruefe("das Secret ist als geheim markiert", st.PAYPAL_CLIENT_SECRET.wert === nu pruefe("die Betriebsart wird dagegen ausgeschrieben", st.PAYPAL_ENV.wert !== undefined); pruefe("die Herkunft wird benannt", st.PAYPAL_CLIENT_SECRET.quelle === "verwaltung"); -L("\n4. DIE .env HAT VORRANG"); +/* Frueher stand hier "DIE .env HAT VORRANG" -- und der Test schlug fehl, + weil die Umsetzung laengst die umgekehrte Reihenfolge hat. + + Der Test war veraltet, nicht der Code. Die Begruendung steht im Kopf + von lib/webdesign-geheimnisse.js: Wer einen Wert im Formular setzt, + erwartet, dass er gilt. Waere es andersherum, koennte Filipe PayPal- + Zugangsdaten in der Verwaltung eintragen, ohne dass sich irgendetwas + aendert -- ein alter Wert in der .env wuerde sie stumm ueberstimmen. + + Wichtig ist deshalb nicht nur die Reihenfolge selbst, sondern auch, + dass die Anzeige sie ehrlich benennt. Genau das wird hier mitgeprueft. */ +L("\n4. DIE VERWALTUNG HAT VORRANG, DIE .env IST DER RUECKFALL"); process.env.PAYPAL_CLIENT_ID = "AUS-DER-ENV"; -pruefe("ein Wert auf dem Server sticht die Verwaltung", +pruefe("ein Wert aus der Verwaltung sticht den Server", + geheim.einstellung("PAYPAL_CLIENT_ID") === "AbC-123"); +pruefe("und die Anzeige nennt die Verwaltung als Quelle", + geheim.stand().PAYPAL_CLIENT_ID.quelle === "verwaltung"); +/* Liegt in BEIDEN etwas, muss man das sehen koennen -- sonst sucht man + spaeter stundenlang, warum der Serverwert nicht wirkt. */ +pruefe("dass auch auf dem Server einer liegt, wird vermerkt", + geheim.stand().PAYPAL_CLIENT_ID.auchAufServer === true); + +/* Ohne Eintrag in der Verwaltung greift der Server-Wert. */ +await geheim.einstellungSetzen("PAYPAL_CLIENT_ID", ""); +pruefe("ohne Verwaltungswert greift der Server", geheim.einstellung("PAYPAL_CLIENT_ID") === "AUS-DER-ENV"); -pruefe("und das wird auch so angezeigt", geheim.stand().PAYPAL_CLIENT_ID.quelle === "server"); +pruefe("und die Anzeige nennt dann den Server", + geheim.stand().PAYPAL_CLIENT_ID.quelle === "server"); + delete process.env.PAYPAL_CLIENT_ID; +await geheim.einstellungSetzen("PAYPAL_CLIENT_ID", "AbC-123"); pruefe("faellt der Server-Wert weg, greift wieder die Verwaltung", geheim.einstellung("PAYPAL_CLIENT_ID") === "AbC-123"); @@ -89,5 +114,20 @@ pruefe("das Laden mit falschem Schluessel wirft nicht", !gestuerzt); pruefe("der Wert gilt dann als nicht vorhanden", geheim.einstellung("PAYPAL_CLIENT_SECRET") === ""); L(`\n===== ${ok} bestanden, ${fehler} fehlgeschlagen =====`); -process.on("exit", () => rmSync(tmp, { recursive: true, force: true })); +/* Erst die Datenbank schliessen, DANN das Verzeichnis loeschen. + + Unter Windows haelt eine offene SQLite-Datei eine Sperre auf ihre + Datei. Der Loeschversuch scheiterte dadurch mit EPERM, und der + Testlauf endete mit einer Fehlermeldung -- obwohl jede einzelne + Pruefung gruen war. Auf Linux faellt das nicht auf, weil sich dort + offene Dateien loeschen lassen: Dasselbe Skript haette je nach + Rechner ein anderes Ergebnis geliefert. + + Das Aufraeumen selbst darf den Lauf nie zum Scheitern bringen. Ein + liegengebliebenes Temp-Verzeichnis ist ein Schoenheitsfehler, kein + Testergebnis. */ +process.on("exit", () => { + try { db.close(); } catch (e) { /* war schon zu */ } + try { rmSync(tmp, { recursive: true, force: true }); } catch (e) { /* egal */ } +}); process.exitCode = fehler ? 1 : 0; diff --git a/server-internal/test-webdesign-portal.mjs b/server-internal/test-webdesign-portal.mjs index 63759aac..65772203 100644 --- a/server-internal/test-webdesign-portal.mjs +++ b/server-internal/test-webdesign-portal.mjs @@ -200,7 +200,14 @@ console.log("\n4. Was Anna sehen darf"); pruefe("sieht ihre Angebotsdatei", t.includes("Annas Angebot.pdf")); pruefe("sieht INTERNE Arbeitsdateien NICHT", !t.includes("INTERNE-ARBEITSDATEI"), "-> fuer_kunde = 0 bleibt unsichtbar"); - pruefe("Betrag wird lesbar mitgeliefert", /1500,00/.test(t)); + /* 1.500,00 -- MIT Tausenderpunkt. + Der Test suchte frueher nach "1500,00" und schlug fehl, seit der + Formatierer den Punkt setzt. Er war veraltet, nicht der Code: + "1.500,00 EUR" ist die korrekte deutsche Schreibweise, und gerade + bei Betraegen ab vier Stellen ist der Punkt das, was eine Zahl + ueberhaupt auf einen Blick lesbar macht. */ + pruefe("Betrag wird lesbar mitgeliefert", /1\.500,00/.test(t), + "-> mit Tausenderpunkt"); pruefe("Speichername der Datei wird NICHT verraten", !t.includes("x1.pdf"), "-> interner Dateiname geht niemanden etwas an"); } diff --git a/server/pruefe-webdesign-i18n.mjs b/server/pruefe-webdesign-i18n.mjs index 9f2dbb5b..78cd5fc0 100644 --- a/server/pruefe-webdesign-i18n.mjs +++ b/server/pruefe-webdesign-i18n.mjs @@ -48,7 +48,24 @@ for (const datei of seiten) { Franzosen oder Portugiesen sein. Ein Portal, das die Sprachwahl der oeffentlichen Seite ignoriert, waere genau der Bruch, den ein Kunde sofort bemerkt. */ - const NUR_DEUTSCH = ["verwaltung"]; + /* Zwei weitere Seiten kamen hinzu, beide aus eigenem Grund: + + "diagnose" ist ein Werkzeug fuer den Betrieb, bewusst ohne externe + Dateien gebaut. Es landet dort niemand ausser Dogfather selbst. + + "rechtliches" ist der heiklere Fall und ausdruecklich eine + ENTSCHEIDUNG, keine Luecke: Rechtstexte durch eine nicht gepruefte + Uebersetzung zu schicken ist gefaehrlicher, als sie einsprachig zu + lassen -- ein Uebersetzungsfehler in einer Widerrufsbelehrung oder + in den Geschaeftsbedingungen wirkt gegen den Verfasser. Wenn die + Seite mehrsprachig werden soll, gehoert die Uebersetzung von + jemandem geprueft, der dafuer geradesteht, nicht aus einem + Woerterbuch nebenbei erzeugt. + + Frueher meldete die Pruefung fuer beide schlicht "Datei fehlt". + Das las sich wie ein Versehen und stand deshalb monatelang als + Fehler in der Liste, ohne dass jemand etwas tat. */ + const NUR_DEUTSCH = ["verwaltung", "diagnose", "rechtliches"]; const einsprachig = NUR_DEUTSCH.includes(name); if (!existsSync(i18nDatei) && !einsprachig) { @@ -57,10 +74,27 @@ for (const datei of seiten) { continue; } if (einsprachig) { - console.log(" bewusst nur Deutsch (interner Bereich) — nur Struktur geprueft"); + console.log(" bewusst nur Deutsch — nur Struktur geprueft"); + /* NUR das echte Markup zaehlen, nicht die Skriptbloecke. + + Die Verwaltung baut ihre Listen im Browser zusammen. Im + JavaScript stehen deshalb HTML-Schnipsel als Zeichenketten -- + und dort steht ein oeffnendes