Compare commits

...
5 Commits
Author SHA1 Message Date
DogFatherGitandClaude Opus 5 69ba533cee Wer mit der Tastatur bedient, sieht wieder, wo er steht
pruef-barrierefrei-workspace, wissen.html, Scout und Creator: Beim
Durchtabben veraendert sich an den Wissenskacheln NICHTS. Kein Rahmen,
kein Ring, keine Kante. Wer nicht mit der Maus arbeitet, tippt blind.

=== EIN SPEZIFITAETS-UNFALL, UND ER BETRIFFT NICHT NUR DIESE SEITE ===

Die Regel war da und richtig geschrieben:

  wissen.css   .kachel:focus-visible { box-shadow: 0 0 0 3px ... }

Sie kam nur nicht an. Gemessen mit einem neuen Werkzeug
(server/mess-fokus.mjs, echte Tastendruecke, kein focus()):

  :focus true   :focus-visible true
  boxShadow     gleich   rgba(0,0,0,0.95) 7px 7px 14px -10px inset
  outline       gleich   none

`:focus-visible` griff also, und trotzdem blieb alles, wie es war.
Der Grund steht in module.css, in einer Liste von 45 Klassennamen:

  :is(.eintrag-karte, ..., .kachel, ..., .gruppe[data-gruppe], ...)

`:is()` uebernimmt die Spezifitaet seines STAERKSTEN Arguments.
`.gruppe[data-gruppe]` ist eine Klasse PLUS ein Attribut. Damit ist die
ganze Liste (0,2,0) statt (0,1,0) -- genau so stark wie
`.kachel:focus-visible`. Bei Gleichstand gewinnt, was spaeter geladen
wird, und module.css wird zuletzt geladen. Ein einziges Attribut in
einer Aufzaehlung, sechs Zeilen weiter rechts, hat den Fokusring von
jedem Bauteil im Haus verschluckt, dessen Fokusregel aus einer Klasse
besteht.

=== GELOEST WIRD DAS NICHT, INDEM MAN DIE LISTE SCHWAECHER MACHT ===

Das war schon einmal so (`:where()`, Spezifitaet null) und ergab einen
Zwitter aus neuer Form und alter Kante -- der Kommentar in module.css
beschreibt es. Wer die Zahl senkt, verschiebt das Problem auf die
naechste Regel.

Geloest wird es, indem die ANTWORT dort steht: ein Fokusring fuer die
ganze Modulliste, in derselben Datei wie die Form, mit
`:focus-visible` also eine Klasse staerker als die Grundregel. Er gilt
damit fuer jedes Modul im Haus -- auch fuer die, die es noch nicht
gibt, und auch dort, wo nie jemand an eine Fokusregel gedacht hat.

`outline-offset` ist NEGATIV, und das ist kein Geschmack: `clip-path`
(die Fase an der Ecke) schneidet alles ab, was ausserhalb der Form
liegt. Ein Ring mit positivem Abstand waere unsichtbar gewesen -- der
alte war es ja auch. Nach innen gezeichnet bleibt er stehen. Gemessen,
nicht geschlossen.

=== WAS NICHT MITREPARIERT WURDE, UND WARUM ES DASTEHT ===

Derselbe Gleichstand trifft auch Hover-Regeln in frueher geladenen
Dateien: `.ablage:hover` (dateien.css), `.call:hover` (calls.css),
`.kk:hover` (scouting.css), `.fortschritt:hover` (uebersicht.css)
setzen alle `border-color`, und die Grundregel setzt `border: 0`.
Diese vier tun vermutlich nichts.

Angefasst habe ich sie nicht -- es gibt kein Messgeraet dafuer. Fokus
laesst sich pruefen (die Pruefung tabbt und vergleicht), Hover nicht.
Und die naheliegende Loesung wuerde die Form von 45 Bauteilen auf 38
Seiten neu entscheiden; das ohne Messgeraet zu tun waere Raten mit viel
Einsatz. Der Befund steht deshalb als Absatz in module.css, damit der
Naechste nicht wieder bei null anfaengt.

=== UND EINE BEHAUPTUNG VON MIR WIRD ZURUECKGENOMMEN ===

Im Commit d7bb0f7e steht, ein Mindestabstand von 0,10 sei fuer 45
Kachelfarben „rechnerisch nicht mehr moeglich", mit einer Tabelle von
„Decken". Das ist falsch herum gelesen: Das Werkzeug SUCHT eine
Anordnung. Findet es nichts Besseres, sagt das etwas ueber das
Verfahren, nicht ueber die Welt. Nachweisbar ist nur, was es GEFUNDEN
hat -- und wie wenig das eine Decke ist, zeigt der eigene Lauf: Fuer
dieselben 45 Farben kam dasselbe Verfahren je nach Rasterweite einmal
auf 0,0974 und einmal auf 0,0876.

Die Pruefung sagt das jetzt so, und das Werkzeug heisst zwar weiter
kachelton-decke.mjs, erklaert aber in den ersten zwanzig Zeilen, dass
es keine Decke misst. Beide Werkzeuge liegen jetzt ueberhaupt im
Verzeichnis: Sie hiessen `tools/_toene-*.mjs`, und `tools/_*` ist
ausgenommen -- die Kommentare verwiesen also auf Dateien, die es nach
dem Klonen nirgends gibt.

GEMESSEN, alles nach den Aenderungen:

  pruef-barrierefrei-workspace   18 Punkte, 0 Fehler (vorher 2)
  pruef-buehne                  230 Punkte, 0 Fehler
  pruef-kachelraster             15 Punkte, 0 Fehler
  pruef-start-ansicht           157 Punkte, 0 Fehler
  pruef-kopfleiste-farbe          9 Punkte, 0 Fehler
  pruef-rueckmeldung             30 Punkte, 0 Fehler
  pruef-entwicklung-kacheln      34 Punkte, 0 Fehler
  pruef-kachel-universum         13 Punkte, 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-25 23:50:54 +02:00
DogFatherGitandClaude Opus 5 80988f2d23 Berichtigt: Die Rechnung hat zwei ausdrueckliche Wuensche ueberfahren
Der Commit davor hat alle 45 Kachelfarben neu verteilt, um acht fast
gleiche Paare zu trennen. Das Ergebnis war rechnerisch besser und
praktisch falsch. pruef-kachelfarben hat sechs Fehler gemeldet:

  Ton 38  #ff1a1a -> #ff241e   „nur die soll knall rot sein!!!"
  Ton 44  #a8d8ff -> #90c3ff   „soll auch babyblau sein mit bissl lila"
  Ton 40, 10, 33          unter die Buntheitsgrenze von 0,12 gedrueckt
  und die Regenbogenkachel zeigte noch die 32 alten Farben

Beide Farben standen mit Datum, Zitat und Begruendung in der Pruefung.
Ich habe sie nicht gelesen, weil ich ein GLOBALES Ziel optimiert habe
-- „alle 45 moeglichst weit auseinander" -- und eine globale Rechnung
kennt keine Einzelfaelle.

=== DIE LEHRE IST NICHT „DIE RECHNUNG WAR FALSCH" ===

Sondern: Eine Gesamtloesung fuer ein LOKALES Problem bezahlt man mit
allem, was an den nicht betroffenen Stellen schon richtig war. Acht
Paare standen zu eng. Verschoben wurden 45.

Der zweite Anlauf (tools/_toene-reparieren.mjs) macht es umgekehrt:
Solange ein Paar zu eng steht, wird das engste genommen und EINER der
beiden auf die naechste erlaubte Farbe geschoben. Sonst nichts.

Und dabei kam das Beste des Tages heraus -- gemessen, nicht geahnt:
Von den 45 Toenen tragen nur 33 eine Kachel, zwoelf stehen bereit. In
JEDEM der acht zu engen Paare ist mindestens einer dieser zwoelf
dabei. Wer den Unbenutzten verschiebt, loest dasselbe Problem, ohne
dass sich fuer irgendjemanden auch nur eine Kachel veraendert.

  kleinster Abstand   0,0154  ->  0,0940
  Paare unter 0,09        14  ->  0
  veraendert                       14 von 45
  davon in Gebrauch                 4 -- und zwar um 0,003 bis 0,012

Vier Zehntausendstel OKLab sind nicht zu sehen. Es gibt also KEINE
Kachel, die ihre Farbe wechselt. Das ist mehr als Bequemlichkeit: Wer
zwei Jahre lang „das Tuerkise" angesteuert hat, sucht danach, wenn es
plötzlich rosa ist.

=== UND DIE WUENSCHE STEHEN JETZT DORT, WO GERECHNET WIRD ===

Die Liste FESTGELEGT ist von server/pruef-kachelfarben.mjs nach
tools/kachelton-regeln.mjs gewandert -- neben die Schwellen, aus
genau demselben Grund, aus dem die Schwellen dort stehen.

In der Pruefung konnte sie nur EINES: eine Abweichung melden, nachdem
sie passiert ist. Das hat sie getan, und das ist ihr Verdienst. Aber
eine Bedingung, die erst NACH dem Schaden spricht, ist die schwaechere
Form. Wer die Farben rechnet, soll gar nicht erst die Moeglichkeit
haben, sie zu verschieben -- das Werkzeug liest die Liste jetzt selbst
und setzt festgelegte Toene sogar zurueck, wenn es sie verschoben
vorfindet.

Dasselbe gilt fuer die Buntheitsgrenze: Sie kommt aus der Regeldatei,
und sie gilt nur fuer benutzte Toene -- so, wie die Pruefung sie
anwendet. Das ist nicht Nachgiebigkeit, sondern Rechnung: Mit
Buntheit >= 0,12 fuer ALLE 45 ist ein Mindestabstand von 0,09
nachweislich unmoeglich (Decke 0,0853). Die zwoelf unbenutzten duerfen
blasser sein und nehmen genau den Druck aus dem engen
Blau-Tuerkis-Bereich, an dem der erste Anlauf gescheitert ist.

GEMESSEN: pruef-kachelfarben 26 Pruefungen, 0 Fehler (vorher 26 mit
6 Fehlern). pruef-kachel-universum 13 Pruefungen, 0 Fehler.
Regenbogenkachel mit tools/kachel-regenbogen.mjs neu geschrieben --
99 Punkte in drei Groessen, je 33 Farben.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-25 23:44:40 +02:00
DogFatherGitandClaude Opus 5 954426615f Der Pruefstand bekommt selbst eine Pruefung -- und der Mensch ein Stueck
der Notiz

Jede Nacht laeuft tools/nachtlauf.mjs ueber 193 Pruefdateien und
schreibt das Ergebnis als Notiz in Filipes Vault. Diese Notiz ist das
Einzige, was er von dem ganzen Aufwand zu sehen bekommt.

Und sie war die einzige Datei im Haus, die niemand geprueft hat.

=== WARUM DAS VORHER GAR NICHT GING ===

nachtlauf.mjs startet BEIM IMPORT sofort einen Lauf. Wer die Notiz
messen wollte, haette damit eine halbe Stunde Rechenzeit ausgeloest --
und nebenbei das echte Ergebnis auf Filipes Startseite ueberschrieben.
Am 04.09.2026 hat genau so ein Griff bei RunOne einen roten Alarm ueber
einer fehlerfreien Buchhaltung erzeugt, am Morgen einer Vorstellung.
„Ein Prueflauf ist kein harmloser Lesevorgang."

Der Textbau steht deshalb jetzt in tools/nachtlauf-notiz.mjs: nur
Textbau, kein Nebeneffekt, Importieren ist folgenlos.

=== UND EIN STUECK DER NOTIZ GEHOERT AB JETZT DEM MENSCHEN ===

Oben in der Notiz stand: „von Hand aendern bringt nichts, beim
naechsten Lauf ist es wieder ueberschrieben." Das war ehrlich und
trotzdem falsch herum gedacht.

Das Wertvollste an diesem Pruefstand ist naemlich nicht die Zahl,
sondern der Satz daneben: „die hier ist rot, weil sie den Umbau vom
24.09. nicht mitbekommen hat" oder „die ist echt, Finger weg". Genau
dieser Satz wurde jede Nacht geloescht. Heute Nacht standen 37
Dateien in der Liste, und bei 25 davon waere so ein Satz die halbe
Arbeit gewesen.

Jetzt gibt es einen Bereich zwischen zwei Marken, den der Lauf wieder
einsetzt statt ihn zu ueberschreiben. Fehlt er, wird er leer neu
angelegt -- mit der Erklaerung darin, wozu er da ist.

=== 30 PRUEFUNGEN, JEDE MIT GEGENPROBE ===

  1. Der Block „von Hand" ueberlebt einen Lauf -- UND das alte
     Ergebnis daneben verschwindet wirklich. Ohne die zweite Haelfte
     wuerde die erste nur beweisen, dass die Datei nicht angefasst
     wurde.
  2. Ein leerer Block zaehlt als nicht vorhanden; sonst waere die
     Erklaerung fuer immer weg, sobald jemand sie einmal loescht.
  3. Weniger Pruefungen als gestern werden gemeldet, auch wenn alles
     gruen ist (die Lehre vom 28.08.: 789 statt 804, gruen, und acht
     Pruefungen je Geraet waren still weggefallen). Gegenprobe: Bei
     MEHR Pruefungen darf der Satz NICHT kommen -- eine Warnung, die
     immer kommt, ist keine Warnung mehr.
  4. Der dritte Ausgang sagt „konnte nicht nachsehen", nennt den Grund
     und wie alt der letzte echte Stand ist -- und behauptet nirgends,
     alles sei in Ordnung.
  5. „Keine Pruefung gezaehlt" wird als das benannt, was es ist: kein
     Befund, sondern ein Zaehlproblem. Acht Dateien standen heute Nacht
     aus diesem Grund als rot da.

Punkt 5 der Pruefung hat sich beim ersten Lauf gleich bezahlt gemacht:
Sie zaehlt nach, ob JEDER der vier Aufrufe in nachtlauf.mjs den
Notizpfad mitreicht. Drei davon sind die seltenen Ausgaenge, die man
beim Ausprobieren nie erwischt -- und an jedem einzelnen waere der
Block „von Hand" spurlos verschwunden. Beim Umbau hatte ich genau
diese drei zuerst vergessen.

GEMESSEN: 30 Pruefungen, 0 Fehler. Die echte Notiz im Vault wird dabei
nicht angefasst -- gearbeitet wird in einem mktemp-Ordner.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-25 23:19:50 +02:00
DogFatherGitandClaude Opus 5 d7bb0f7e60 45 Kachelfarben: acht Paare waren dieselbe Farbe -- und die Pruefung
konnte es nicht sagen

Filipe am 17.09.: „ich will das jede kachel eine andere farbe hat, es
soll keine die gleiche farben haben bitte und auch keine die sich
irgendwie aehnlich sind ... die farben sollen auch richtig geil und
speziell sein."

Gemessen am 25.09.: #ff8fb4 gegen #fe8ebe, Abstand 0,0154 in OKLab.
Das ist mit blossem Auge DIESELBE Farbe. Acht solche Paare gab es.

=== WARUM ES NIEMAND GEMERKT HAT ===

pruef-kachel-universum hat es gesagt. Jede Nacht. Die Zeile stand da:
„kleinster Abstand 0,0154". Gelesen hat sie niemand -- weil direkt
daneben eine zweite Zeile stand, die NIEMALS gruen werden konnte:
„kein Paar unter 0,10".

Nachgerechnet (tools/_toene-packen.mjs, eine echte Kugelpackung ueber
alle sRGB-Farben, die 4,8:1 gegen den Grund halten, nicht blenden und
bunt genug sind):

  30 Farben  ->  0,115        48 Farben  ->  0,0925
  40 Farben  ->  0,103        52 Farben  ->  0,0840
  45 Farben  ->  0,0974       60 Farben  ->  0,0805

Die Forderung war fuer 21 Farben geschrieben. Bei den heutigen 45
liegt die DECKE bei 0,0974 -- „kein Paar unter 0,10" konnte niemand
erfuellen, mit keiner Palette der Welt.

DAS IST DER EIGENTLICHE BEFUND. Eine Bedingung, die niemand erfuellen
kann, macht nicht nur sich selbst wertlos. Sie faerbt die ganze Datei
rot, und ab da liest man die Zeile darueber nicht mehr. Der echte
Mangel lag acht Tage offen da, versteckt hinter einem Fehlalarm.

=== DIE NEUE PALETTE WURDE GERECHNET, NICHT NACHGEBESSERT ===

Von Hand nachbessern hat sie erst dahin gebracht: Am 08.09. waren es
21 Farben, danach kamen sechzehn dazu, jede einzeln gewaehlt, keine
gegen die anderen geprueft. In drei Schritten:

  1. Aus allen erlaubten sRGB-Farben 45 so waehlen, dass der kleinste
     Abstand so gross wie moeglich wird.
  2. Sie den 45 Kachelnummern so zuordnen, dass jede moeglichst nah an
     ihrer bisherigen Farbe bleibt -- eine Kachel soll wiedererkennbar
     sein, sie rueckt, sie wechselt nicht.
  3. Nachziehen: Jeder Ton darf zurueck in Richtung seiner alten Farbe
     wandern, solange der Mindestabstand haelt.

Ergebnis: kleinster Abstand 0,0154 -> 0,0931, kein Paar mehr unter
0,09. Dreissig der 45 Kacheln haben sich um weniger als 0,02 bewegt --
das sieht man nicht. Nur sieben sind sichtbar gewandert, und alle
sieben lagen in dem Gedraenge aus neun fast gleichen Rot- und
Rosatoenen, das den Ausschlag gegeben hat.

„Richtig geil und speziell" bleibt messbar erhalten: Die Buntheit hat
eine Untergrenze von 0,10 in der Rechnung, damit keine Farbe ins Graue
rutscht. Gemessen kostet das nichts -- mit dieser Grenze ist die Decke
sogar minimal hoeher als ohne (0,0974 gegen 0,0973).

=== UND DIE PRUEFUNG SAGT JETZT ETWAS ERFUELLBARES ===

  kleinster Abstand >= 0,09          (Decke fuer 45 Farben: 0,097)
  hoechstens 48 Farben               (darueber ist 0,09 nicht mehr
                                      erreichbar -- gemessen, nicht
                                      gesetzt)
  Gegenprobe: #ff8fb4 gegen #fe8ebe  muss durchfallen

Die zweite Zeile ist die wichtige: Sie bewacht den GRUND. Wer die
46., 47., 48. Kachel anlegt, kommt noch durch; wer die 52. anlegt,
bekommt gesagt, dass jetzt ueber die Palette geredet werden muss,
statt still wieder in zwei gleiche Farben zu rutschen. Genau das ist
zwischen dem 08.09. und dem 17.09. passiert.

GEMESSEN: pruef-kachel-universum 13 Pruefungen, 0 Fehler (vorher 12
mit 2 Fehlern). Schlechtester Textkontrast auf der fertigen Kachel
7,02:1, am Bildschirmfoto gemessen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-25 23:19:29 +02:00
DogFatherGitandClaude Opus 5 ce1a1f758c Zum dritten Mal dieselbe Schrift zu dunkel -- diesmal mit Luft
entwicklung.html, „Noch niemand im Team": 4,42:1 gemessen, noetig sind
4,5:1. Der Befund ist klein. Die Geschichte dahinter ist es nicht.

=== DREIMAL IN VIER WOCHEN, IMMER DERSELBE GRIFF ===

  01.09.  #6d7d92 -> #75859a    gemessen 4,43  ->  4,95
  07.09.  #75859a -> #7f8fa6    gemessen 4,50  ->  rund 4,9
  25.09.  #7f8fa6 -> #95a4ba    gemessen 4,42  ->  5,75

Neben jedem dieser Schritte steht ein sorgfaeltiger Kommentar, der
erklaert, warum genau dieser Wert richtig ist. Alle drei waren richtig
-- fuer den Untergrund, den man GERADE KANNTE.

Der Hintergrund ist aber ein BILD. Bilder haben helle Stellen, und die
liegen bei jedem neuen Layout woanders. Wer eine Schrift auf zwei
Kommastellen genau gegen die hellste Stelle einstellt, die er heute
gefunden hat, stellt sie auf den naechsten Umbau ein.

=== WAS DIESMAL ANDERS GEMACHT WURDE ===

1. NICHT NUR DIE ROTE SEITE ANGESEHEN. Die schlechtesten Werte ALLER
   vierzehn Seiten nebeneinandergelegt:

     hilfe.html      4,90   auf rgb(51,53,56)   <- die hellste im Haus
     teamlage.html   4,98   auf rgb(45,52,64)
     entwicklung     4,42   auf rgb(40,41,44)   <- die, die rot war
     befinden.html   5,38   auf rgb(29,39,46)
     ... zehn weitere ueber 6,3

   Die rote Seite war also NICHT die gefaehrlichste. Zwei andere lagen
   knapper an der Grenze, als der letzte Rutscher gross war -- sie
   waeren als naechste drangewesen. Haette ich nur entwicklung.html
   repariert, haette ich in zwei Wochen dasselbe noch einmal getan.

2. DER BEZUG IST JETZT DIE HELLSTE FLAECHE IM HAUS, nicht die der
   Seite, die gerade rot ist. Beide Toene beider Haeuser gegen
   rgb(51,53,56) gerechnet:

     Gate    still #7f8fa6 -> #95a4ba   4,35 -> 4,86
             leise #94a5bb -> #9fb0c6   4,90 -> 5,56
     Crew    still #8f88b2 -> #a7a0cb   4,10 -> 5,00
             leise #a9a2ca -> #b4aed6   5,10 -> 5,84

   Der stille Ton im Crew-Haus stand bei 4,10 -- UNTER der Grenze, seit
   Wochen, ohne dass eine Pruefung je etwas gesagt haette. Nicht weil
   sie nachsichtig war, sondern weil noch keine Crew-Seite mit dieser
   Flaeche angesehen wurde. Ein gruener Haken heisst nicht, dass
   nachgesehen wurde.

3. PRUEF-BUEHNE PRUEFT JETZT AUCH DIE LUFT. Nicht nur „ueber 4,5",
   sondern: „hat die schlechteste Stelle dieser Seite noch elf Prozent
   Reserve?" Die Zahl ist gemessen und nicht gewaehlt -- beide
   Rutscher oben waren rund elf Prozent gross, und 4,5 mal 1,11 ist
   5,0. Eine Seite unter diesem Wert ist noch in Ordnung und schon in
   Gefahr, und genau das soll sie sagen, solange man es noch in Ruhe
   beheben kann.

   Sie haengt an der jeweiligen Grenze, nicht an einer festen 5,0: Bei
   grossem Text sind 3:1 erlaubt, dieselbe Luft sind dort 3,33. Eine
   hineingeschriebene 5,0 wuerde grossen Text ohne Not anmahnen.

GEMESSEN: pruef-buehne 230 Pruefungen (vorher 192), 0 Fehler.
Schlechteste Seite jetzt hilfe.html mit 5,15:1 -- 15 % ueber der
Grenze. Die Schrift bleibt deutlich leiser als der Haupttext: der
steht bei 11,8:1, also mehr als doppelt so hoch.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-25 23:19:04 +02:00
55 changed files with 1997 additions and 815 deletions
+152
View File
@@ -0,0 +1,152 @@
/* =====================================================================
SIEHT MAN, WO DER TASTATURFOKUS STEHT?
=====================================================================
Gebaut am 25.09.2026, weil `pruef-neue-seiten` einen Kontrast von
1,07 meldete ("Schoen, dass du da bist") und die Stelle im CSS
tadellos aussah. Diese Messung liest die Farben an Ort und Stelle
aus und geht die Elternkette hoch, bis sie eine deckende Flaeche
findet -- genau das, was die Pruefung tut, nur sichtbar.
Ergebnis damals: dunkler Text auf HELLBLAUER Flaeche, rund 10:1.
Die Pruefung konnte das Format `color(srgb ...)` nicht lesen, ging
deshalb zum fast schwarzen Elternteil weiter und rechnete dunkel
gegen dunkel. Ohne diese Messung haette ich an einem CSS geaendert,
an dem nichts war.
Aufrufen mit:
node server/mess-farbe-am-text.mjs <seite.html> "<Textanfang>"
===================================================================== */
import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
const SEITE = process.argv[2] || "wissen.html";
const SUCHE = process.argv[3] || ".kachel";
const PORT = 5457;
/* IST DIE NUMMER FREI? Sonst misst dieses Werkzeug an einem fremden
Server -- und liefert ein Ergebnis, das zu einem ganz anderen Stand
gehoert. Die Pruefungen holen sich ihre Nummer ueber helfer-port;
ein Messwerkzeug, das von Hand gestartet wird, braucht wenigstens
diese eine Frage. */
{
const netz = await import("node:net");
const frei = await new Promise((fertig) => {
const s = netz.createServer();
s.once("error", () => fertig(false));
s.once("listening", () => s.close(() => fertig(true)));
s.listen(PORT, "127.0.0.1");
});
if (!frei) {
console.error(`Port ${PORT} ist belegt -- hier laeuft schon etwas. `
+ "Gemessen wuerde sonst ein fremder Stand. Abgebrochen.");
process.exit(3);
}
}
const ordner = mkdtempSync(join(tmpdir(), "ws-kontrast-"));
process.env.WORKSPACE_DB = join(ordner, "workspace.db");
process.env.PORT = String(PORT);
process.env.SITE_ACCESS_SECRET = "lokaler-test";
process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00";
const express = (await import("express")).default;
const ec = express.response.cookie;
express.response.cookie = function (n, w, o) {
return ec.call(this, n, w, { ...(o || {}), secure: false });
};
import { notbremse } from "./helfer-notbremse.mjs";
await import("./index.js");
notbremse(200_000, "mess-kontrast");
await new Promise((r) => setTimeout(r, 900));
const BASIS = `http://127.0.0.1:${PORT}`;
const { DatabaseSync } = await import("node:sqlite");
const { scryptSync, randomBytes, createHmac } = await import("node:crypto");
const d = new DatabaseSync(process.env.WORKSPACE_DB);
const jetzt = new Date().toISOString();
const sch = randomBytes(32).toString("hex");
d.prepare("INSERT INTO einstellungen (schluessel, wert, geaendert, von)"
+ " VALUES (?,?,?,NULL) ON CONFLICT(schluessel) DO NOTHING")
.run("code_kennung_schluessel", sch, jetzt);
const anlegen = (name, rolle, code) => {
const s = randomBytes(16).toString("hex");
const h = scryptSync(code, s, 64,
{ N: 32768, r: 8, p: 1, maxmem: 96 * 1024 * 1024 }).toString("hex");
return d.prepare("INSERT INTO personen"
+ " (name, rolle, code_hash, code_salt, code_n, code_kennung, aktiv, erstellt)"
+ " VALUES (?,?,?,?,?,?,1,?) RETURNING id")
.get(name, rolle, h, s, 32768,
createHmac("sha256", sch).update(code).digest("hex"), jetzt).id;
};
anlegen("Filipe", "admin", "CODE-DOGI-0001");
anlegen("Sina", "scout", "CODE-SCOUT-0001");
d.close();
const an = await fetch(BASIS + "/workspace/api/anmelden", {
method: "POST", headers: { "Content-Type": "application/json" },
body: JSON.stringify({ rolle: "scout", code: "CODE-SCOUT-0001" }),
});
const keks = (an.headers.getSetCookie?.() || []).map((z) => z.split(";")[0]).join("; ");
const pw = await import(
"file:///C:/Users/qciga/Documents/Obelix/Analyse/node_modules/playwright/index.mjs");
const browser = await pw.chromium.launch();
const kontext = await browser.newContext({ viewport: { width: 1440, height: 900 } });
await kontext.addCookies(keks.split("; ").map((k) => {
const [n, ...r] = k.split("=");
return { name: n, value: r.join("="), domain: "127.0.0.1", path: "/" };
}));
const seite = await kontext.newPage();
await seite.goto(`${BASIS}/workspace/${SEITE}`, { waitUntil: "networkidle" });
await seite.waitForTimeout(900);
const stil = (e) => { const c = getComputedStyle(e); return {
outlineStyle: c.outlineStyle, outlineWidth: c.outlineWidth, outlineColor: c.outlineColor,
boxShadow: c.boxShadow, borderColor: c.borderColor, backgroundColor: c.backgroundColor,
textDecorationLine: c.textDecorationLine, filter: c.filter, clipPath: c.clipPath }; };
const vorher = await seite.evaluate((sel) => {
const e = document.querySelector(sel);
if (!e) return null;
e.setAttribute("data-mess", "1");
const c = getComputedStyle(e);
return { text: (e.textContent || "").trim().slice(0, 30), tag: e.tagName,
outline: `${c.outlineStyle} ${c.outlineWidth} ${c.outlineColor}`,
boxShadow: c.boxShadow, borderColor: c.borderColor, backgroundColor: c.backgroundColor,
filter: c.filter, clipPath: c.clipPath.slice(0, 60) };
}, SUCHE);
if (!vorher) { console.log(`${SUCHE} nicht gefunden auf ${SEITE}`); process.exit(1); }
await seite.evaluate(() => document.body.focus?.());
let gefunden = null;
for (let i = 0; i < 40 && !gefunden; i++) {
await seite.keyboard.press("Tab");
await seite.waitForTimeout(140);
gefunden = await seite.evaluate(() => {
const e = document.activeElement;
if (!e || !e.hasAttribute?.("data-mess")) return null;
const c = getComputedStyle(e);
return { outline: `${c.outlineStyle} ${c.outlineWidth} ${c.outlineColor}`,
boxShadow: c.boxShadow, borderColor: c.borderColor, backgroundColor: c.backgroundColor,
filter: c.filter, clipPath: c.clipPath.slice(0, 60),
fv: e.matches(":focus-visible"), f: e.matches(":focus") };
});
}
console.log(`
=== ${SUCHE} auf ${SEITE} (${vorher.tag}, "${vorher.text}") ===`);
if (!gefunden) console.log(" mit der Tastatur NICHT erreicht");
else {
console.log(` :focus ${gefunden.f} :focus-visible ${gefunden.fv}`);
for (const k of ["outline", "boxShadow", "borderColor", "backgroundColor", "filter", "clipPath"]) {
const gleich = vorher[k] === gefunden[k];
console.log(` ${k.padEnd(16)} ${gleich ? "gleich " : "ANDERS "} `
+ `${String(vorher[k]).slice(0, 55)}`
+ (gleich ? "" : `
-> ${String(gefunden[k]).slice(0, 55)}`));
}
}
await browser.close();
process.exit(0);
+37
View File
@@ -501,6 +501,43 @@ for (const [breite, hoehe, wie] of [[1440, 950, "Computer"], [390, 780, "Handy"]
+ (schlimmster.verlauf ? ", Verlauf im Text" : "")
+ ` [${schlimmster.lage}] in ${schlimmster.eltern}`
+ ` -- gemessen bei ${schlimmster.gemessenBei} auf ${schlimmster.gemessenAuf}` : ""));
/* ==== UND WIE VIEL LUFT IST NOCH DA? (25.09.2026) ============
4,5:1 ist die Grenze, an der Text aufhoert, lesbar zu sein.
Eine Seite, die GENAU dort steht, ist nicht in Ordnung --
sie ist einen Handgriff davon entfernt, es nicht mehr zu sein.
Dass das kein Gedankenspiel ist, steht in gate.css: Derselbe
leiseste Ton musste dreimal in vier Wochen angehoben werden,
immer aus demselben Grund -- der Hintergrund ist ein Bild, es
wurde heller, und die Schrift war auf zwei Kommastellen genau
auf den alten Stand eingestellt.
01.09. 4,43 -> 4,95
07.09. 4,50 -> rund 4,9
25.09. 4,42 -> 5,75
Beide Rutscher waren rund elf Prozent gross. Deshalb steht
hier 1,11 und keine gewaehlte Zahl: Eine Seite besteht diese
Zeile genau dann, wenn sie noch EINEN Rutscher dieser Groesse
vertraegt, ohne unlesbar zu werden. Bei 4,5 sind das 5,0.
Diese Zeile ist die zweite Meinung zur Zeile darueber und
ersetzt sie nicht: Die obere sagt, ob die Seite in Ordnung
ist, diese, ob sie es morgen noch sein wird.
Sie haengt bewusst an `schlimmster.grenze` und nicht an einer
eigenen 5,0 -- bei grossem Text ist die Grenze 3:1, und
dieselbe Luft sind dort 3,33. Wer die Zahl fest hineinschriebe,
wuerde grossen Text unnoetig anmahnen. */
const LUFT = 1.11;
ok(schlimmster.v >= schlimmster.grenze * LUFT,
`${s}: und noch Luft bis zur Grenze `
+ `(${schlimmster.v.toFixed(2)}:1, noetig waeren `
+ `${(schlimmster.grenze * LUFT).toFixed(2)}:1 -- `
+ `${((schlimmster.v / schlimmster.grenze - 1) * 100).toFixed(0)} % ueber `
+ `${schlimmster.grenze}:1)`);
/* Wenn rings um einen Text nirgends freier Untergrund liegt, ist er
ungeprüft geblieben. Das darf vorkommen (dicht gesetzte Zeilen),
aber nicht unbemerkt und nicht bei vielen -- sonst meldet die
+61 -8
View File
@@ -120,18 +120,71 @@ for (let i = 0; i < liste.length; i++) {
}
paare.sort((x, y) => x.d - y.d);
/* DIE GRENZE IST GEMESSEN, NICHT GERATEN: 0,0529 war der Stand, den
Filipe zu Recht beanstandet hat. Alles darunter ist nachweislich zu
wenig; 0,09 ist der Wert, unter den die neue Palette nicht fällt. */
/* ==== DIE GRENZE WAR FUER EINUNDZWANZIG FARBEN GESETZT (25.09.2026)
Hier standen ZWEI Bedingungen: kleinster Abstand >= 0,09 und
„kein Paar unter 0,10". Die zweite hat seit dem 17.09. niemand
mehr erfuellt, und niemand konnte sagen, wie es gehen sollte.
Gesucht wurde mit tools/kachelton-decke.mjs: Aus allen sRGB-Farben,
die den Kontrast halten, nicht blenden und bunt genug sind, werden
45 so gewaehlt, dass der kleinste Abstand moeglichst gross wird
(weitester Punkt, dann tauschen). Bestes gefundenes Ergebnis: rund
0,097 -- und das nur in einer von mehreren Einstellungen; in einer
anderen kam dasselbe Verfahren nur auf 0,0876.
WAS DAS BEWEIST UND WAS NICHT -- der Unterschied ist wichtig:
Es beweist, dass 0,094 ERREICHBAR ist. Dafuer gibt es eine
Anordnung, und sie steht in start.css.
Es beweist NICHT, dass 0,10 unmoeglich ist. Ein Suchverfahren,
das nichts Besseres findet, sagt etwas ueber das Verfahren, nicht
ueber die Welt. Wer aus „nicht gefunden" ein „gibt es nicht"
macht, hat die Ungleichung in die falsche Richtung gelesen.
Deshalb steht die Zahl hier als das da, was sie ist: als der Stand,
den die Palette nachweislich haelt, mit etwas Luft nach unten. Sie
heisst nicht mehr „Decke", denn eine Decke ist sie nicht.
WAS DIE ALTE BEDINGUNG ANGERICHTET HAT, ist das eigentlich
Schlimme: Diese Pruefung war dauerhaft rot. Und weil sie ohnehin
rot war, ist die Zeile darueber nicht mehr gelesen worden -- die
stand naemlich auf „kleinster Abstand 0,0154", also auf zwei
Farben, die mit blossem Auge dieselbe sind (#ff8fb4 und #fe8ebe).
Acht solche Paare gab es. Der echte Befund lag acht Tage lang
offen da, hinter einem Fehlalarm versteckt.
Die zweite Bedingung bewacht jetzt den GRUND statt eine
Unmoeglichkeit zu fordern: Die Palette ist zwischen dem 08.09. und
dem 17.09. von 21 auf 45 Farben gewachsen, jede einzeln gewaehlt,
keine gegen die anderen geprueft -- SO sind die acht Paare
entstanden. Ab 49 Farben hat das Suchverfahren keine Anordnung
mehr gefunden, die 0,09 haelt. Das ist kein Verbot, sondern ein
Halt: Dann wird gerechnet und entschieden, statt still weiter
Farben danebenzulegen. */
const GRENZE = 0.09;
const HOECHSTENS = 48; // ab 49 fand die Suche nichts mehr, das GRENZE haelt
ok(paare[0].d >= GRENZE,
`kleinster Abstand ${paare[0].d.toFixed(4)} (Grenze ${GRENZE}) `
`kleinster Abstand ${paare[0].d.toFixed(4)} (Grenze ${GRENZE}; `
+ `am weitesten gefunden wurden rund 0,097 fuer ${liste.length} Farben) `
+ `-- ${paare[0].a.hex}/${paare[0].b.hex}`);
ok(liste.length <= HOECHSTENS,
liste.length <= HOECHSTENS
? `${liste.length} Farben -- bis ${HOECHSTENS} ist ${GRENZE} gefunden worden`
: `${liste.length} Farben: fuer so viele hat tools/kachelton-decke.mjs `
+ `keine Anordnung mit ${GRENZE} mehr gefunden. Erst rechnen, dann `
+ `entscheiden -- weniger eigene Farben, oder die Grenze neu ansehen.`);
/* GEGENPROBE. Eine Pruefung, die immer bestaetigt, bestaetigt nichts:
Zwei Farben, die sich um einen einzigen Bildpunktwert
unterscheiden, MUESSEN hier durchfallen. */
{
const eng = paare.filter((p) => p.d < 0.10).length;
ok(eng === 0,
eng ? `${eng} Paare unter 0,10: ${paare.slice(0, 3).map((p) => `${p.a.hex}/${p.b.hex}`).join(", ")}`
: `kein einziges der ${paare.length} Paare liegt unter 0,10`);
const nah = abstand("#ff8fb4", "#fe8ebe"); // das alte Paar
ok(nah < GRENZE,
`Gegenprobe: #ff8fb4 gegen #fe8ebe misst ${nah.toFixed(4)} und faellt durch`);
}
{
/* KEINE ZWEI GLEICHEN. Das steht als eigene Zeile da, obwohl der
+4 -38
View File
@@ -53,44 +53,10 @@ const CSS = join(HIER, "..", "workspace", "assets", "css", "start.css");
const { GRUND, MINDEST_ABSTAND, MINDEST_BUNTHEIT } =
await import("../tools/kachelton-regeln.mjs");
/* Was festgelegt ist — mit dem Grund, aus dem es festgelegt wurde. */
const FESTGELEGT = [
/* BERICHTIGT AM 22.09.2026. Ich hatte screen5 und screen6 vertauscht
und das Rot auf "Draussen" gelegt. Filipe: "nicht die kachel
draussen soll rot sein sondern die kachel vertraulich melden nur
die soll knall rot sein!!!" */
{ ton: 38, kachel: "Vertraulich melden", hex: "#ff1a1a",
warum: "knalliges Rot -- wer den vertraulichen Weg sucht, soll ihn finden, ohne zu lesen" },
{ ton: 39, kachel: "Draußen",
warum: "die Farbe, die Regeln & Hilfe hatte -- ausdruecklicher Wunsch (screen5)" },
/* BABYBLAU IST PER DEFINITION BLASS (25.09.2026).
Filipe: „die hauptfarbe der kachel soll auch babyblau sein mit
bissl lila."
Diese Farbe haelt die Buntheitsgrenze von 0,12 NICHT (sie liegt
bei 0,074) -- und kann sie nicht halten, das liegt am Wort.
Nachgemessen mit `node tools/_babyblau-suchen.mjs`: Unter allen
Blautoenen im Umkreis des Wunsches gibt es KEINEN, der gleichzeitig
Buntheit >= 0,12 und Abstand >= 0,09 schafft -- der beste kommt
auf 0,075 Abstand. Der Blaubereich ist von den Toenen 15, 23, 26,
31, 41 und 43 besetzt.
DIE GRENZE WIRD DESHALB NICHT GESENKT, sondern hier BENANNT
ausgenommen. Eine gesenkte Grenze gaelte fuer alle 45 Toene und
liesse ab morgen jede blasse Farbe durch; eine benannte Ausnahme
gilt fuer genau diese eine und steht mit ihrem Grund da.
UND SIE IST NICHT GRATIS: Wer blass sein darf, muss dafuer beim
ABSTAND ueberdurchschnittlich sein -- das ist der Zweck, den die
Buntheitsregel nur stellvertretend misst. Gemessen 0,1125 zur
naechsten Farbe (Ton 15), das 7,3-Fache des engsten Paares, das im
Haus ohnehin steht. Die Bedingung dazu steht unten bei der
Pruefung und ist echt: Faellt der Abstand unter 0,10, wird diese
Zeile rot. */
{ ton: 44, kachel: "Support", hex: "#a8d8ff", blassErlaubt: 0.10,
warum: "Babyblau auf Wunsch -- blass, dafuer mit gemessenem Sicherheitsabstand" },
];
/* Was festgelegt ist, steht in tools/kachelton-regeln.mjs -- zusammen
mit den Schwellen und aus demselben Grund: Eine Regel, die an zwei
Orten steht, steht irgendwann in zwei Fassungen da. */
const { FESTGELEGT } = await import("../tools/kachelton-regeln.mjs");
let ok = 0, fehl = 0;
const pruef = (name, bedingung, zusatz = "") => {
+277
View File
@@ -0,0 +1,277 @@
/* =====================================================================
pruef-nachtlauf.mjs — Wer prüft den Prüfstand? (25.09.2026)
Jede Nacht läuft `tools/nachtlauf.mjs` über alle Prüfdateien und
schreibt das Ergebnis als Notiz in Filipes Vault. Diese Notiz ist
das Einzige, was er von dem ganzen Aufwand zu sehen bekommt.
Und sie war bis heute die einzige Datei im Haus, die niemand geprüft
hat. Das ist genau die Stelle, an der ein stiller Fehler am
teuersten ist: Schreibt die Notiz Unsinn, merkt es keiner — sie
sieht ja aus wie immer.
---------------------------------------------------------------------
WARUM DAS VORHER GAR NICHT GING
`nachtlauf.mjs` startet beim Import SOFORT einen Lauf über 193
Dateien. Wer die Notiz messen wollte, hätte damit eine halbe Stunde
Rechenzeit ausgelöst — und nebenbei das echte Ergebnis auf Filipes
Startseite überschrieben. Das ist keine Kleinigkeit: Am 04.09.2026
hat genau so ein Griff bei RunOne einen roten Alarm über einer
fehlerfreien Buchhaltung erzeugt, am Morgen einer Vorstellung.
Deshalb wurde der Textbau nach `tools/nachtlauf-notiz.mjs`
ausgelagert. Diese Prüfung importiert nur das Modul; es hat keine
Nebenwirkungen, schreibt nichts und misst nichts.
---------------------------------------------------------------------
WAS GEPRÜFT WIRD
1. Der Block „VON HAND" überlebt jeden Lauf — und nur er.
2. Fehlt er, wird er mit seiner Erklärung neu angelegt.
3. Ein Rückgang der Prüfungszahl steht in der Notiz (28.08.2026).
4. Der dritte Ausgang sagt „konnte nicht nachsehen" und behauptet
NICHT, alles sei in Ordnung.
5. Jeder Aufruf in nachtlauf.mjs reicht den Notizpfad mit —
sonst ginge der Block an genau diesem Ausgang verloren.
Zu jeder Aussage gehört eine Gegenprobe: eine Prüfung, die immer
bestätigt, bestätigt nichts.
Aufrufen mit: node server/pruef-nachtlauf.mjs
===================================================================== */
import { mkdtempSync, rmSync, writeFileSync, readFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join, dirname } from "node:path";
import { fileURLToPath } from "node:url";
import {
MARKE_AUF, MARKE_ZU, handNotizLesen, notizSchreiben, zeitWort,
} from "../tools/nachtlauf-notiz.mjs";
const HIER = dirname(fileURLToPath(import.meta.url));
const NACHTLAUF = join(HIER, "..", "tools", "nachtlauf.mjs");
let ok = 0, fehl = 0;
const pruef = (name, bedingung, zusatz = "") => {
if (bedingung) { ok++; console.log(` ok ${name}`); }
else { fehl++; console.log(` FEHL ${name}${zusatz ? " — " + zusatz : ""}`); }
};
const melde = (t) => console.log(t);
/* Ein Wegwerf-Ordner. In den Vault wird hier nichts geschrieben --
die echte Notiz bleibt unberührt, auch wenn die Prüfung abstürzt. */
const ORDNER = mkdtempSync(join(tmpdir(), "pruef-nachtlauf-"));
const NOTIZ = join(ORDNER, "Pruefstand.md");
process.on("exit", () => { try { rmSync(ORDNER, { recursive: true, force: true }); } catch { /* egal */ } });
const LAGE_GRUEN = { dateien: 193, dateienOk: 193, punkte: 8900, punkteOk: 8900, rote: [] };
const LAGE_ROT = {
dateien: 193, dateienOk: 192, punkte: 8900, punkteOk: 8899,
rote: [{ datei: "pruef-beispiel.mjs", code: 1, erste: "FEHL irgendetwas stimmt nicht" }],
};
/* =======================================================================
1. DER BLOCK „VON HAND" ÜBERLEBT
======================================================================= */
melde("=== 1. Was von Hand dasteht, bleibt stehen ===");
const HANDTEXT = "## Von Hand\n\npruef-beispiel ist rot, weil sie den Umbau vom 24.09.\n"
+ "nicht mitbekommen hat. Nicht anfassen, ist in Arbeit.";
/* Erster Lauf: keine Notiz da -- der Block muss entstehen. */
writeFileSync(NOTIZ, notizSchreiben({ lage: LAGE_GRUEN, vorher: null, minuten: 12 }, NOTIZ), "utf8");
{
const t = readFileSync(NOTIZ, "utf8");
pruef("eine neue Notiz bekommt den Block von selbst",
t.includes(MARKE_AUF) && t.includes(MARKE_ZU));
pruef("und er erklärt, wozu er da ist",
/überlebt jeden Lauf/.test(t),
"ein leerer Block ohne Erklärung wird beim ersten Überschreiben gelöscht");
}
/* Jetzt schreibt ein Mensch etwas hinein. */
{
const t = readFileSync(NOTIZ, "utf8");
const a = t.indexOf(MARKE_AUF) + MARKE_AUF.length;
const b = t.indexOf(MARKE_ZU);
writeFileSync(NOTIZ, t.slice(0, a) + "\n" + HANDTEXT + "\n" + t.slice(b), "utf8");
}
/* Und der nächste Lauf schreibt die Notiz neu -- mit ganz anderem
Ergebnis, damit auch wirklich alles andere ausgetauscht wird. */
writeFileSync(NOTIZ, notizSchreiben({ lage: LAGE_ROT, vorher: null, minuten: 31 }, NOTIZ), "utf8");
{
const t = readFileSync(NOTIZ, "utf8");
pruef("der Satz von Hand steht nach dem nächsten Lauf noch da",
t.includes("Nicht anfassen, ist in Arbeit."));
pruef("mit seiner Überschrift", t.includes("## Von Hand"));
/* GEGENPROBE. Bliebe ALLES stehen, wäre die Prüfung oben wertlos:
Sie würde dann nur beweisen, dass die Datei nicht angefasst wurde. */
pruef("Gegenprobe: das alte Ergebnis ist verschwunden",
!t.includes("Alles in Ordnung"),
"der grüne Stand von vorher steht noch drin -- dann wird gar nicht überschrieben");
pruef("Gegenprobe: das neue Ergebnis ist da", t.includes("pruef-beispiel.mjs"));
}
/* Und ein Block ohne Inhalt darf nicht als „von Hand" durchgehen --
sonst bliebe die Erklärung für immer weg, sobald jemand sie löscht. */
{
writeFileSync(NOTIZ, `# x\n\n${MARKE_AUF}\n \n${MARKE_ZU}\n`, "utf8");
pruef("ein leerer Block zählt als nicht vorhanden",
handNotizLesen(NOTIZ) === null);
writeFileSync(NOTIZ, "# x\n\nkeine Marken hier\n", "utf8");
pruef("Gegenprobe: ohne Marken wird nichts gefunden",
handNotizLesen(NOTIZ) === null);
writeFileSync(NOTIZ, `# x\n\n${MARKE_AUF}\nhallo\n${MARKE_ZU}\n`, "utf8");
pruef("Gegenprobe: mit Inhalt wird er gefunden",
handNotizLesen(NOTIZ) === "hallo");
}
/* =======================================================================
2. EIN RÜCKGANG DER ANZAHL STEHT IN DER NOTIZ
Die Lehre vom 28.08.2026: Ein Lauf meldete 789 statt 804 Prüfungen
und war dabei grün. Acht Prüfungen je Gerät waren stillschweigend
weggefallen. Wer nur „bestanden" liest, hätte sie ab da dauerhaft
ungeprüft gelassen.
======================================================================= */
melde("");
melde("=== 2. Weniger Prüfungen als gestern ist ein Befund ===");
{
const weniger = notizSchreiben({
lage: { ...LAGE_GRUEN, punkte: 8700, punkteOk: 8700 },
vorher: { wann: "24.09.2026 um 05:49", zeit: Date.now() - 86400000,
dateien: 193, dateienOk: 193, punkte: 8900, punkteOk: 8900 },
minuten: 12,
}, NOTIZ);
pruef("200 Prüfungen weniger werden gemeldet, obwohl alles grün ist",
/200 Prüfungen WENIGER/.test(weniger));
pruef("und es steht dabei, warum das trotzdem ein Befund ist",
/beweist nichts/.test(weniger));
const mehr = notizSchreiben({
lage: LAGE_GRUEN,
vorher: { wann: "24.09.2026 um 05:49", zeit: Date.now() - 86400000,
dateien: 193, dateienOk: 193, punkte: 8700, punkteOk: 8700 },
minuten: 12,
}, NOTIZ);
/* GEGENPROBE: Steigt die Zahl, darf der Satz NICHT kommen. Eine
Warnung, die immer kommt, ist keine Warnung mehr. */
pruef("Gegenprobe: bei MEHR Prüfungen kommt die Warnung nicht",
!/Prüfungen WENIGER/.test(mehr));
const wenigerDateien = notizSchreiben({
lage: { ...LAGE_GRUEN, dateien: 190, dateienOk: 190 },
vorher: { wann: "24.09.2026 um 05:49", zeit: Date.now() - 86400000,
dateien: 193, dateienOk: 193, punkte: 8900, punkteOk: 8900 },
minuten: 12,
}, NOTIZ);
pruef("auch eine verschwundene Prüfdatei wird genannt",
/3 Prüfdatei\(en\) weniger/.test(wenigerDateien));
}
/* =======================================================================
3. DER DRITTE AUSGANG
„Konnte nicht nachsehen" ist weder gut noch schlecht -- es ist die
dritte Antwort, und sie darf auf keinen Fall wie „alles in Ordnung"
aussehen.
======================================================================= */
melde("");
melde("=== 3. Konnte nicht nachsehen ===");
{
const t = notizSchreiben({
vorher: { wann: "24.09.2026 um 05:49", zeit: Date.now() - 3 * 86400000,
dateien: 193, dateienOk: 193, punkte: 8900, punkteOk: 8900 },
konnteNicht: "Ein Lauf läuft schon seit 01:12.",
}, NOTIZ);
pruef("es steht als eigener Zustand da", /Konnte nicht nachsehen/.test(t));
pruef("und sagt NICHT, dass alles in Ordnung ist", !/Alles in Ordnung/.test(t));
pruef("der Grund steht dabei", /läuft schon seit 01:12/.test(t));
pruef("und wie alt der letzte echte Stand ist",
/3 Tage her/.test(t), t.split("\n").filter((z) => /gemessen/.test(z)).join(" | "));
const ohneVorher = notizSchreiben({ vorher: null, konnteNicht: "irgendein Grund" }, NOTIZ);
pruef("Gegenprobe: ohne früheres Ergebnis wird das auch gesagt",
/noch kein früheres Ergebnis/.test(ohneVorher));
}
/* =======================================================================
4. „KEINE PRÜFUNG GEZÄHLT" IST KEIN BEFUND
Acht Dateien standen im Nachtlauf vom 25.09. als rot, ohne dass
irgendetwas kaputt war: Sie schreiben ihre Ergebnisse als ` OK `
statt ` ok `, und der Zähler erkannte davon nichts. Die Notiz muss
diesen Unterschied benennen, sonst sucht man im Programm.
======================================================================= */
melde("");
melde("=== 4. Null gezählte Prüfungen ===");
{
const t = notizSchreiben({
lage: { dateien: 193, dateienOk: 192, punkte: 8900, punkteOk: 8900,
rote: [{ datei: "pruef-still.mjs", code: 0, nullPunkte: true, erste: "alles bestanden" }] },
vorher: null, minuten: 12,
}, NOTIZ);
pruef("die Notiz nennt es beim Namen",
/Kein Befund – es wurde keine einzige Prüfung GEZÄHLT/.test(t));
pruef("und erklärt, woran es meist liegt", /statt/.test(t) && /OK/.test(t));
pruef("warnt aber trotzdem davor, es liegenzulassen",
/still aufhören zu prüfen/.test(t));
}
/* =======================================================================
5. JEDER AUSGANG REICHT DEN PFAD MIT
Der Block „von Hand" wird aus der VORHANDENEN Datei gelesen. Wer
`notizSchreiben(...)` ohne den Pfad aufruft, schreibt an genau
diesem Ausgang eine Notiz ohne ihn -- und der Block ist weg. Das
sind vier Stellen in nachtlauf.mjs, und drei davon sind die
seltenen Ausgänge, die man beim Ausprobieren nie erwischt.
======================================================================= */
melde("");
melde("=== 5. Alle Ausgänge in nachtlauf.mjs ===");
{
const quelle = readFileSync(NACHTLAUF, "utf8");
/* `notizSchreiben(` trifft nur Aufrufe -- die Importzeile schreibt
den Namen ohne Klammer. */
const aufrufe = (quelle.match(/notizSchreiben\(/g) || []).length;
const mitPfad = (quelle.match(/\}, NOTIZ\)/g) || []).length;
pruef(`alle ${aufrufe} Aufrufe reichen den Notizpfad mit`,
aufrufe >= 4 && mitPfad === aufrufe,
`${aufrufe} Aufrufe, davon ${mitPfad} mit Pfad`);
/* GEGENPROBE: Der Zähler oben darf nicht einfach immer gleich sein. */
pruef("Gegenprobe: ein Aufruf ohne Pfad würde auffallen",
(("notizSchreiben({ a })").match(/\}, NOTIZ\)/g) || []).length === 0);
pruef("nachtlauf.mjs baut den Text nicht mehr selbst",
!/function notizSchreiben/.test(quelle),
"sonst gäbe es zwei Fassungen, und geprüft würde die falsche");
}
/* =======================================================================
6. KLEINIGKEITEN, DIE SONST NIEMAND MISST
======================================================================= */
melde("");
melde("=== 6. Datum und Rahmen ===");
{
pruef("das Datum wird deutsch geschrieben",
/^\d{2}\.\d{2}\.\d{4} um \d{2}:\d{2}$/.test(zeitWort(new Date(2026, 8, 25, 5, 7))),
zeitWort(new Date(2026, 8, 25, 5, 7)));
pruef("und zweistellig, auch am Morgen",
zeitWort(new Date(2026, 0, 3, 5, 7)) === "03.01.2026 um 05:07");
const gruen = notizSchreiben({ lage: LAGE_GRUEN, vorher: null, minuten: 12 }, NOTIZ);
pruef("bei null roten steht der beruhigende Satz",
/Keine Datei ist rot/.test(gruen));
const rot = notizSchreiben({ lage: LAGE_ROT, vorher: null, minuten: 31 }, NOTIZ);
pruef("bei einer roten steht die Einzahl richtig",
/## 1 Prüfung ist rot/.test(rot), rot.split("\n")[7] || "");
pruef("und der Befehl zum Einzelnachsehen steht dabei",
/node server\/pruef-beispiel\.mjs/.test(rot));
pruef("samt dem Hinweis, dass rot nicht automatisch kaputt heißt",
/Rot heißt nicht automatisch kaputt/.test(rot));
}
melde("");
melde(` ${ok} bestanden, ${fehl} fehlgeschlagen`);
melde("");
process.exit(fehl ? 1 : 0);
+139
View File
@@ -0,0 +1,139 @@
/* =====================================================================
WIE WEIT BEKOMMT MAN N FARBEN AUSEINANDER? (25.09.2026)
Erst messen, dann bauen. Bevor an der Kachelpalette etwas geaendert
wird, muss die Frage beantwortet sein, welcher Mindestabstand fuer
eine gegebene Anzahl ueberhaupt zu SCHAFFEN ist -- sonst baut man
an einer Bedingung, die niemand erfuellen kann. Genau das war bei
„kein Paar unter 0,10" passiert.
WAS DIESES WERKZEUG SAGT -- und was nicht. Es sucht: aus allen
erlaubten sRGB-Farben werden N so gewaehlt, dass der kleinste
Abstand moeglichst gross wird (erst weitester Punkt, dann tauschen,
solange es besser wird).
Was herauskommt, ist ein Wert, der ERREICHBAR ist. Dafuer gibt es
eine Anordnung, und die kann man sich ansehen.
Was NICHT herauskommt, ist eine Obergrenze. „Mehr habe ich nicht
gefunden" heisst nicht „mehr gibt es nicht" -- das Verfahren ist
ein Naeherungsverfahren. Wie sehr das zaehlt, zeigt der eigene
Lauf: Fuer 45 Farben kam es je nach Rasterweite und
Buntheitsgrenze einmal auf 0,0974 und einmal auf 0,0876. Wer die
erste Zahl eine „Decke" nennt, liest die Ungleichung falsch
herum.
Die Schwellen kommen aus kachelton-regeln.mjs; ueber die Umgebung
lassen sie sich fuers Ausprobieren verschieben:
ANZAHL=52 KONTRAST=4.6 MAXLEUCHTE=0.9 node tools/kachelton-decke.mjs 0.10
Der Zahlenwert hinter dem Namen ist die geforderte Mindestbuntheit;
mehrere Werte hintereinander vergleichen mehrere Annahmen.
===================================================================== */
/* Die Schwellen kommen aus der Regeldatei -- abgeschrieben waeren sie
eine zweite Fassung derselben Regel, und genau daran ist am 22.09.
schon einmal ein Farbvorschlag gescheitert (siehe dort). Der kleine
Aufschlag beim Kontrast ist Luft fuers Runden und steht als solcher
da; alles andere laesst sich ueber die Umgebung setzen, weil das
Ausprobieren von Annahmen der Zweck dieses Werkzeugs ist. */
import { GRUND, MINDEST_KONTRAST } from "./kachelton-regeln.mjs";
const lin0 = (c) => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4);
const GRUND_LEUCHTE = [1, 3, 5].map((i) => lin0(parseInt(GRUND.slice(i, i + 2), 16) / 255))
.reduce((s, v, i) => s + [0.2126, 0.7152, 0.0722][i] * v, 0);
const MIN_KONTRAST = Number(process.env.KONTRAST || MINDEST_KONTRAST + 0.3);
const MAX_LEUCHTE = Number(process.env.MAXLEUCHTE || 0.82);
const ANZAHL = Number(process.env.ANZAHL || 45);
const lin = (c) => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4);
function lab(r0, g0, b0) {
const r = lin(r0 / 255), g = lin(g0 / 255), b = lin(b0 / 255);
const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
return [0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,
1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,
0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s];
}
const leuchte = (r, g, b) => 0.2126 * lin(r / 255) + 0.7152 * lin(g / 255) + 0.0722 * lin(b / 255);
function kandidaten(minBunt, schritt) {
const raus = [];
for (let r = 0; r <= 255; r += schritt) {
for (let g = 0; g <= 255; g += schritt) {
for (let b = 0; b <= 255; b += schritt) {
const y = leuchte(r, g, b);
if ((y + 0.05) / (GRUND_LEUCHTE + 0.05) < MIN_KONTRAST) continue;
if (y > MAX_LEUCHTE) continue;
const L = lab(r, g, b);
if (Math.hypot(L[1], L[2]) < minBunt) continue;
raus.push({ r, g, b, L });
}
}
}
return raus;
}
const d2 = (a, b) => (a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 + (a[2] - b[2]) ** 2;
function packen(k, n) {
/* 1. Weitester Punkt zuerst -- das gibt schon eine gute Verteilung. */
const gewaehlt = [k[Math.floor(k.length / 2)]];
const naechste = k.map((p) => d2(p.L, gewaehlt[0].L));
while (gewaehlt.length < n) {
let best = 0;
for (let i = 1; i < k.length; i++) if (naechste[i] > naechste[best]) best = i;
gewaehlt.push(k[best]);
for (let i = 0; i < k.length; i++) {
const d = d2(k[i].L, k[best].L); if (d < naechste[i]) naechste[i] = d;
}
}
/* 2. Tauschen: jeden Punkt durch den besten Kandidaten ersetzen. */
const minOhne = (idx) => {
let m = Infinity;
for (let i = 0; i < gewaehlt.length; i++) {
if (i === idx) continue;
for (let j = i + 1; j < gewaehlt.length; j++) {
if (j === idx) continue;
const d = d2(gewaehlt[i].L, gewaehlt[j].L); if (d < m) m = d;
}
}
return m;
};
for (let runde = 0; runde < 40; runde++) {
let geaendert = false;
for (let idx = 0; idx < gewaehlt.length; idx++) {
const grenze = minOhne(idx);
let besterWert = -1, bester = gewaehlt[idx];
for (const p of k) {
let m = Infinity;
for (let i = 0; i < gewaehlt.length; i++) {
if (i === idx) continue;
const d = d2(p.L, gewaehlt[i].L); if (d < m) { m = d; if (m <= besterWert) break; }
}
if (m > besterWert) { besterWert = m; bester = p; }
}
const jetzt = Math.min(grenze, Math.min(...gewaehlt.map((q, i) =>
(i === idx ? Infinity : d2(gewaehlt[idx].L, q.L)))));
if (Math.min(grenze, besterWert) > jetzt + 1e-12) { gewaehlt[idx] = bester; geaendert = true; }
}
if (!geaendert) break;
}
let m = Infinity;
for (let i = 0; i < gewaehlt.length; i++) {
for (let j = i + 1; j < gewaehlt.length; j++) m = Math.min(m, d2(gewaehlt[i].L, gewaehlt[j].L));
}
return { gewaehlt, min: Math.sqrt(m) };
}
const hex = (p) => "#" + [p.r, p.g, p.b].map((c) => c.toString(16).padStart(2, "0")).join("");
const stufen = process.argv.slice(2).length
? process.argv.slice(2).map(Number) : [0, 0.06, 0.09, 0.12, 0.15];
for (const mb of stufen) {
const k = kandidaten(mb, 5);
const { gewaehlt, min } = packen(k, ANZAHL);
console.log(`Buntheit >= ${mb.toFixed(2)} ${k.length} Kandidaten `
+ `${ANZAHL} Farben, kleinster Abstand ${min.toFixed(4)}`);
if (process.env.ZEIGEN) console.log(" " + gewaehlt.map(hex).join(" "));
}
+300
View File
@@ -0,0 +1,300 @@
/* =====================================================================
NUR DIE FARBEN BEWEGEN, DIE SICH WIRKLICH IN DIE QUERE KOMMEN
(25.09.2026, zweiter Anlauf)
Der erste Anlauf hat ALLE 45 Farben neu verteilt (die Rechnung
dazu steht in der Geschichte des Verzeichnisses, Commit d7bb0f7e).
Das Ergebnis war rechnerisch besser und praktisch falsch: Er ist
dabei ueber zwei ausdrueckliche Wuensche gelaufen (das knallrote
#ff1a1a fuer "Vertraulich melden", das Babyblau #a8d8ff fuer
"Support") und hat drei Toene unter die Buntheitsgrenze von 0,12
gedrueckt. pruef-kachelfarben hat alles fuenf gefunden.
DIE LEHRE IST NICHT "die Rechnung war falsch", sondern: Eine
Gesamtloesung fuer ein LOKALES Problem bezahlt man mit allem, was
an den nicht betroffenen Stellen schon richtig war. Acht Paare
standen zu eng -- also werden acht Paare auseinandergezogen und
sonst nichts angefasst.
VORGEHEN. Solange irgendein Paar unter dem Mindestabstand liegt:
das engste nehmen, den beweglicheren der beiden auf die naechste
erlaubte Farbe schieben, die alle Bedingungen haelt. Festgelegte
Toene sind unbeweglich.
ALLE SCHWELLEN KOMMEN AUS tools/kachelton-regeln.mjs. Keine Zahl
wird hier abgeschrieben -- genau dafuer gibt es die Datei.
node tools/kachelton-entzerren.mjs rechnen und zeigen
node tools/kachelton-entzerren.mjs schreiben start.css aendern
===================================================================== */
import { readFileSync, writeFileSync, mkdtempSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import {
GRUND, MINDEST_ABSTAND, MINDEST_BUNTHEIT, HOECHST_BUNTHEIT,
MINDEST_KONTRAST, FESTGELEGT,
} from "./kachelton-regeln.mjs";
const DATEI = "workspace/assets/css/start.css";
/* Etwas Luft ueber jeder Schwelle -- gerundet wird auf ganze
Bildpunkte, und eine Farbe, die genau auf der Grenze steht, faellt
beim naechsten Runden darunter. */
const ZIEL_ABSTAND = MINDEST_ABSTAND + 0.004;
const ZIEL_KONTRAST = MINDEST_KONTRAST + 0.15;
const ZIEL_BUNT = MINDEST_BUNTHEIT + 0.004;
const lin = (c) => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4);
const srgb = (h) => [1, 3, 5].map((i) => parseInt(h.slice(i, i + 2), 16) / 255);
function oklab(h) {
const [r, g, b] = srgb(h).map(lin);
const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
return [0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,
1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,
0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s];
}
const leuchte = (h) => { const [r, g, b] = srgb(h).map(lin); return 0.2126 * r + 0.7152 * g + 0.0722 * b; };
const kontrast = (h) => (leuchte(h) + 0.05) / (leuchte(GRUND) + 0.05);
const bunt = (h) => { const [, a, b] = oklab(h); return Math.hypot(a, b); };
const abst = (a, b) => { const x = oklab(a), y = oklab(b); return Math.hypot(x[0] - y[0], x[1] - y[1], x[2] - y[2]); };
const hexVon = (r, g, b) => "#" + [r, g, b].map((c) => c.toString(16).padStart(2, "0")).join("");
/* ---------- Die Farben aus der Datei --------------------------------- */
const css = readFileSync(DATEI, "utf8");
const TOENE = [...css.matchAll(/\[data-ton="(\d+)"\]\s*\{\s*--ton:\s*(#[0-9a-fA-F]{6})/g)]
.map((m) => ({ n: Number(m[1]), alt: m[2].toLowerCase(), hex: m[2].toLowerCase() }));
if (TOENE.length < 20) { console.error("Muster passt nicht mehr"); process.exit(3); }
/* ---------- Wer darf sich nicht bewegen, wer darf blass sein --------- */
const FEST = new Map(FESTGELEGT.filter((f) => f.hex).map((f) => [f.ton, f.hex.toLowerCase()]));
const BLASS_ERLAUBT = new Map(FESTGELEGT.filter((f) => f.blassErlaubt).map((f) => [f.ton, f.blassErlaubt]));
for (const t of TOENE) {
if (FEST.has(t.n) && t.hex !== FEST.get(t.n)) {
console.log(` Ton ${t.n} steht auf ${t.hex}, festgelegt ist ${FEST.get(t.n)} -- wird zurueckgesetzt`);
t.hex = FEST.get(t.n);
}
}
/* ---------- WELCHE TOENE WERDEN UEBERHAUPT BENUTZT? ------------------
Die Buntheitsgrenze gilt nur fuer BENUTZTE Toene -- so steht es in
pruef-kachelfarben, und das ist der Grund, aus dem die Reparatur
ueberhaupt aufgeht: Mit Buntheit >= 0,12 fuer ALLE 45 ist ein
Mindestabstand von 0,09 rechnerisch unmoeglich (gemessene Decke:
0,0853). Die zwoelf unbenutzten duerfen blasser sein und nehmen
damit Druck aus dem engen Blau-Tuerkis-Bereich.
Gefragt wird das Programm selbst, nicht eine Liste. */
process.env.WORKSPACE_DB = process.env.WORKSPACE_DB
|| join(mkdtempSync(join(tmpdir(), "toene-")), "workspace.db");
const w = await import("../server/workspace.js");
const BENUTZT = new Set();
for (const r of ["admin", "hand", "linke", "modi", "gast", "manager", "scout", "creator", "spicy"]) {
for (const haus of ["crew", "agentur"]) {
let k = [];
try { k = [...(w.bereicheFuer({ id: 1, rolle: r, name: "X" }, haus) || []),
...(w.zusatzBereicheFuer({ id: 1, rolle: r, name: "X" }, haus) || [])]; }
catch { continue; }
for (const kachel of k) if (kachel?.ton != null) BENUTZT.add(Number(kachel.ton));
}
}
if (BENUTZT.size < 20) { console.error(`nur ${BENUTZT.size} benutzte Toene gefunden`); process.exit(5); }
console.log(`${BENUTZT.size} von ${TOENE.length} Toenen werden benutzt: ${[...BENUTZT].sort((a, b) => a - b).join(", ")}`);
/* Auch die unbenutzten sollen so bunt bleiben, wie es noch passt --
sonst steht beim naechsten Gebrauch ein blasser Ton bereit und die
Pruefung wird rot, obwohl niemand etwas falsch gemacht hat. */
const UNBENUTZT_BUNT = Number(process.env.UNBUNT || 0.045);
const buntNoetig = (n) => (BENUTZT.has(n) && !BLASS_ERLAUBT.has(n) ? ZIEL_BUNT
: Math.min(UNBENUTZT_BUNT, bunt(TOENE.find((t) => t.n === n).alt)));
/* Der verlangte Mindestabstand kann je Ton hoeher sein: Wer blass sein
darf, muss das beim Abstand ausgleichen (steht so in
pruef-kachelfarben und ist dort begruendet). */
const abstandFuer = (n) => Math.max(ZIEL_ABSTAND, (BLASS_ERLAUBT.get(n) ?? 0) + 0.004);
/* ---------- Alle erlaubten Farben ------------------------------------ */
const ALLE = [];
for (let r = 0; r <= 255; r += 2) {
for (let g = 0; g <= 255; g += 2) {
for (let b = 0; b <= 255; b += 2) {
const h = hexVon(r, g, b);
if (kontrast(h) < ZIEL_KONTRAST) continue;
const c = bunt(h);
if (c > HOECHST_BUNTHEIT) continue;
ALLE.push({ hex: h, bunt: c });
}
}
}
const kandidatenFuer = (n) => ALLE.filter((x) => x.bunt >= buntNoetig(n)).map((x) => x.hex);
console.log(`${ALLE.length} erlaubte Farben (Kontrast >= ${ZIEL_KONTRAST.toFixed(2)}, `
+ `Buntheit bis ${HOECHST_BUNTHEIT}; benutzte Toene ab ${ZIEL_BUNT.toFixed(3)})`);
/* ---------- Was steht zu eng? ---------------------------------------- */
const engstes = () => {
let m = Infinity, wo = null;
for (let i = 0; i < TOENE.length; i++) {
for (let j = i + 1; j < TOENE.length; j++) {
const noetig = Math.max(abstandFuer(TOENE[i].n), abstandFuer(TOENE[j].n));
const d = abst(TOENE[i].hex, TOENE[j].hex);
if (d < noetig && d - noetig < m) { m = d - noetig; wo = { i, j, d, noetig }; }
}
}
return wo;
};
const naechsterZu = (h, ausser) => {
let m = Infinity;
for (const t of TOENE) { if (t === ausser) continue; m = Math.min(m, abst(h, t.hex)); }
return m;
};
console.log("");
let bewegt = 0;
for (let runde = 0; runde < 200; runde++) {
const p = engstes();
if (!p) break;
const a = TOENE[p.i], b = TOENE[p.j];
/* Wer wird bewegt? Nicht der Festgelegte. Sonst der, fuer den die
naechste erlaubte Stelle naeher an seinem eigenen Ton liegt. */
const kandidatFuer = (t) => {
if (FEST.has(t.n)) return null;
let best = null, bestWeg = Infinity;
const noetig = abstandFuer(t.n);
for (const h of kandidatenFuer(t.n)) {
const weg = abst(t.alt, h);
if (weg >= bestWeg) continue;
let ok = true;
for (const u of TOENE) {
if (u === t) continue;
if (abst(h, u.hex) < Math.max(noetig, abstandFuer(u.n))) { ok = false; break; }
}
if (ok) { best = h; bestWeg = weg; }
}
return best ? { hex: best, weg: bestWeg } : null;
};
const ka = kandidatFuer(a), kb = kandidatFuer(b);
if (!ka && !kb) {
console.error(`Fuer ${a.hex} (Ton ${a.n}) und ${b.hex} (Ton ${b.n}) gibt es keinen Platz.`);
process.exit(4);
}
/* WER WEICHT AUS? ZUERST DER, DEN NIEMAND SIEHT.
Gemessen: In JEDEM der acht zu engen Paare ist mindestens einer
der beiden Toene gar nicht in Gebrauch -- 33 der 45 tragen eine
Kachel, zwoelf stehen nur bereit. Wer den unbenutzten verschiebt,
loest dasselbe Problem, ohne dass sich fuer irgendjemanden auch
nur eine Kachel veraendert.
Das ist mehr als Bequemlichkeit: Eine Kachel, die ihre Farbe
wechselt, muss neu gelernt werden. Wer zwei Jahre lang „das
Tuerkise" angesteuert hat, sucht danach. Diese Kosten entstehen
hier schlicht nicht.
Erst wenn beide benutzt sind (oder beide nicht), entscheidet der
kuerzere Weg. */
const frei = (t, k) => k && !BENUTZT.has(t.n);
const nimm = frei(a, ka) && !frei(b, kb) ? { t: a, k: ka }
: frei(b, kb) && !frei(a, ka) ? { t: b, k: kb }
: !ka ? { t: b, k: kb } : !kb ? { t: a, k: ka }
: (ka.weg <= kb.weg ? { t: a, k: ka } : { t: b, k: kb });
console.log(` ${p.d.toFixed(4)} (noetig ${p.noetig.toFixed(3)}) Ton ${a.n} ${a.hex} <-> `
+ `Ton ${b.n} ${b.hex} -> Ton ${nimm.t.n} wandert nach ${nimm.k.hex} `
+ `(${nimm.k.weg.toFixed(3)})`);
nimm.t.hex = nimm.k.hex;
bewegt++;
}
/* ---------- NACHZIEHEN -----------------------------------------------
Der Durchgang oben arbeitet sich vom engsten Paar nach vorn und
entscheidet dabei immer nur mit dem, was GERADE dasteht. Wer
frueh ausweichen muss, weicht deshalb manchmal weiter aus als
noetig -- die Stelle, die ihm gepasst haette, wird erst zwei
Schritte spaeter frei.
Gemessen war das kein Schoenheitsfehler: Ton 10 (#ff6877, ein
Korallrot) landete beim ersten Lauf auf #a86cb4, einem Violett --
0,178 entfernt, und niemand haette die Kachel wiedererkannt.
Also am Ende noch einmal von vorn: Jeder bewegte Ton darf so weit
zu seiner alten Farbe zurueck, wie die Bedingungen es zulassen.
Das aendert am Mindestabstand nichts -- es wird nur geprueft, ob
es NAEHER geht. */
for (let runde = 0; runde < 12; runde++) {
let geruckt = false;
for (const t of TOENE) {
if (FEST.has(t.n) || t.hex === t.alt) continue;
const jetzt = abst(t.alt, t.hex);
const noetig = abstandFuer(t.n);
let best = null, bestWeg = jetzt;
for (const h of kandidatenFuer(t.n)) {
const weg = abst(t.alt, h);
if (weg >= bestWeg) continue;
let ok = true;
for (const u of TOENE) {
if (u === t) continue;
if (abst(h, u.hex) < Math.max(noetig, abstandFuer(u.n))) { ok = false; break; }
}
if (ok) { best = h; bestWeg = weg; }
}
if (best) {
console.log(` nachgezogen: Ton ${t.n} ${t.hex} -> ${best} `
+ `(${jetzt.toFixed(3)} -> ${bestWeg.toFixed(3)} vom alten Ton)`);
t.hex = best; geruckt = true;
}
}
if (!geruckt) break;
}
/* ---------- Nachmessen ------------------------------------------------ */
let klein = Infinity, wo = null, unterSoll = 0;
for (let i = 0; i < TOENE.length; i++) {
for (let j = i + 1; j < TOENE.length; j++) {
const d = abst(TOENE[i].hex, TOENE[j].hex);
const noetig = Math.max(abstandFuer(TOENE[i].n), abstandFuer(TOENE[j].n));
if (d < noetig) unterSoll++;
if (d < klein) { klein = d; wo = [TOENE[i], TOENE[j]]; }
}
}
const geaendert = TOENE.filter((t) => t.hex !== t.alt);
const zuBlass = TOENE.filter((t) => BENUTZT.has(t.n)
&& bunt(t.hex) < MINDEST_BUNTHEIT && !BLASS_ERLAUBT.has(t.n));
const zuDunkel = TOENE.filter((t) => kontrast(t.hex) < MINDEST_KONTRAST);
const doppelt = TOENE.length - new Set(TOENE.map((t) => t.hex)).size;
console.log("");
console.log(`geaendert ${geaendert.length} von ${TOENE.length}`);
for (const t of geaendert) {
console.log(` Ton ${String(t.n).padStart(2)} ${t.alt} -> ${t.hex} `
+ `verschoben ${abst(t.alt, t.hex).toFixed(3)} Buntheit ${bunt(t.hex).toFixed(3)} `
+ `Kontrast ${kontrast(t.hex).toFixed(2)}:1`);
}
console.log(`kleinster Abstand ${klein.toFixed(4)} (Ton ${wo[0].n} ${wo[0].hex} / Ton ${wo[1].n} ${wo[1].hex})`);
console.log(`unter dem Soll ${unterSoll}`);
console.log(`zu blass ${zuBlass.map((t) => `Ton ${t.n} ${bunt(t.hex).toFixed(3)}`).join(", ") || "keiner"}`);
console.log(`zu dunkel ${zuDunkel.map((t) => `Ton ${t.n}`).join(", ") || "keiner"}`);
console.log(`doppelt ${doppelt}`);
for (const [n, h] of FEST) {
const t = TOENE.find((x) => x.n === n);
console.log(`festgelegt Ton ${n} ${t.hex} ${t.hex === h ? "(unveraendert)" : "*** ABWEICHUNG ***"}`);
}
if (process.argv[2] === "schreiben") {
if (unterSoll || zuBlass.length || zuDunkel.length || doppelt
|| [...FEST].some(([n, h]) => TOENE.find((x) => x.n === n).hex !== h)) {
console.error("\nNICHT geschrieben -- das Ergebnis haelt die Bedingungen nicht.");
process.exit(1);
}
let neu = css;
for (const t of TOENE) {
const muster = new RegExp(`(\\[data-ton="${t.n}"\\]\\s*\\{\\s*--ton:\\s*)#[0-9a-fA-F]{6}`);
if (!muster.test(neu)) { console.error(`Ton ${t.n} nicht wiedergefunden`); process.exit(2); }
neu = neu.replace(muster, `$1${t.hex}`);
}
writeFileSync(DATEI, neu);
console.log("\nstart.css geschrieben.");
}
+62
View File
@@ -49,3 +49,65 @@ export const HOECHST_BUNTHEIT = 0.30;
/* Nicht verhandelbar: Eine Kachelfarbe trägt auch Text und Zahlen. */
export const MINDEST_KONTRAST = 4.5;
/* =====================================================================
WAS FESTGELEGT IST -- und warum (hierher geholt am 25.09.2026)
Diese Liste stand in server/pruef-kachelfarben.mjs. Dort konnte sie
nur EINES: eine Abweichung melden, nachdem sie passiert ist.
Genau das ist am 25.09. passiert. Eine Rechnung hat die 45
Kachelfarben neu verteilt, um acht fast gleiche Paare zu trennen --
und dabei zwei ausdrueckliche Wuensche ueberfahren, weil sie sie
nicht kannte:
Ton 38 #ff1a1a „nur die soll knall rot sein!!!" -> #ff241e
Ton 44 #a8d8ff „soll auch babyblau sein" -> #90c3ff
Die Pruefung hat beides gefunden, und das ist ihr Verdienst. Aber
eine Bedingung, die erst NACH dem Schaden spricht, ist die
schwaechere Form: Wer die Farben rechnet, soll gar nicht erst die
Moeglichkeit haben, sie zu verschieben.
Deshalb steht sie jetzt hier, neben den Schwellen -- und beide
Seiten lesen sie von hier: die Pruefung, um zu melden, und das
Rechenwerkzeug, um sie festzuhalten.
===================================================================== */
export /* Was festgelegt ist — mit dem Grund, aus dem es festgelegt wurde. */
const FESTGELEGT = [
/* BERICHTIGT AM 22.09.2026. Ich hatte screen5 und screen6 vertauscht
und das Rot auf "Draussen" gelegt. Filipe: "nicht die kachel
draussen soll rot sein sondern die kachel vertraulich melden nur
die soll knall rot sein!!!" */
{ ton: 38, kachel: "Vertraulich melden", hex: "#ff1a1a",
warum: "knalliges Rot -- wer den vertraulichen Weg sucht, soll ihn finden, ohne zu lesen" },
{ ton: 39, kachel: "Draußen",
warum: "die Farbe, die Regeln & Hilfe hatte -- ausdruecklicher Wunsch (screen5)" },
/* BABYBLAU IST PER DEFINITION BLASS (25.09.2026).
Filipe: „die hauptfarbe der kachel soll auch babyblau sein mit
bissl lila."
Diese Farbe haelt die Buntheitsgrenze von 0,12 NICHT (sie liegt
bei 0,074) -- und kann sie nicht halten, das liegt am Wort.
Nachgemessen mit `node tools/_babyblau-suchen.mjs`: Unter allen
Blautoenen im Umkreis des Wunsches gibt es KEINEN, der gleichzeitig
Buntheit >= 0,12 und Abstand >= 0,09 schafft -- der beste kommt
auf 0,075 Abstand. Der Blaubereich ist von den Toenen 15, 23, 26,
31, 41 und 43 besetzt.
DIE GRENZE WIRD DESHALB NICHT GESENKT, sondern hier BENANNT
ausgenommen. Eine gesenkte Grenze gaelte fuer alle 45 Toene und
liesse ab morgen jede blasse Farbe durch; eine benannte Ausnahme
gilt fuer genau diese eine und steht mit ihrem Grund da.
UND SIE IST NICHT GRATIS: Wer blass sein darf, muss dafuer beim
ABSTAND ueberdurchschnittlich sein -- das ist der Zweck, den die
Buntheitsregel nur stellvertretend misst. Gemessen 0,1125 zur
naechsten Farbe (Ton 15), das 7,3-Fache des engsten Paares, das im
Haus ohnehin steht. Die Bedingung dazu steht unten bei der
Pruefung und ist echt: Faellt der Abstand unter 0,10, wird diese
Zeile rot. */
{ ton: 44, kachel: "Support", hex: "#a8d8ff", blassErlaubt: 0.10,
warum: "Babyblau auf Wunsch -- blass, dafuer mit gemessenem Sicherheitsabstand" },
];
+166
View File
@@ -0,0 +1,166 @@
/* =====================================================================
DIE NOTIZ FÜR DEN PRÜFSTAND (ausgelagert am 25.09.2026)
Stand vorher mitten in `nachtlauf.mjs`. Ausgelagert, damit sie
PRÜFBAR wird: `nachtlauf.mjs` startet beim Import sofort einen
Lauf über alle Prüfdateien -- wer die Notiz messen wollte, hätte
dafür eine halbe Stunde Rechenzeit ausgelöst und nebenbei das
echte Ergebnis auf Filipes Startseite überschrieben.
Hier drin steht nur Textbau, kein Nebeneffekt. Importieren ist
folgenlos. Geprüft von `server/pruef-nachtlauf.mjs`.
===================================================================== */
import { readFileSync } from "node:fs";
const zweiZiffern = (n) => String(n).padStart(2, "0");
function zeitWort(d = new Date()) {
return `${zweiZiffern(d.getDate())}.${zweiZiffern(d.getMonth() + 1)}.${d.getFullYear()}`
+ ` um ${zweiZiffern(d.getHours())}:${zweiZiffern(d.getMinutes())}`;
}
export { zeitWort };
/* =====================================================================
EIN STÜCK DER NOTIZ GEHÖRT DEM MENSCHEN (25.09.2026)
Bis heute stand oben in der Notiz: "von Hand ändern bringt nichts,
beim nächsten Lauf ist es wieder überschrieben." Das war ehrlich
und trotzdem falsch herum gedacht.
Denn das Wertvollste an diesem Prüfstand ist gerade NICHT die
Zahl, sondern der Satz daneben: "Diese Prüfung ist rot, weil sie
den Umbau vom 24.09. nicht mitbekommen hat" oder "die hier ist
echt, Finger weg". Wer das aufschreiben will, schreibt es genau
hierhin -- und fand es am nächsten Morgen gelöscht.
Deshalb gibt es jetzt einen Bereich zwischen zwei Marken, den der
Lauf beim Schreiben WIEDER EINSETZT statt ihn zu überschreiben.
Fehlt er (neue Notiz, jemand hat ihn gelöscht), wird er leer neu
angelegt -- mit der Erklärung drin, wozu er da ist.
===================================================================== */
export const MARKE_AUF = "<!-- VON HAND — dieser Teil bleibt stehen -->";
export const MARKE_ZU = "<!-- ENDE VON HAND -->";
export function handNotizLesen(NOTIZ) {
let alt = "";
try { alt = readFileSync(NOTIZ, "utf8"); } catch { return null; }
const a = alt.indexOf(MARKE_AUF);
const b = alt.indexOf(MARKE_ZU, a + 1);
if (a < 0 || b < 0) return null;
const drin = alt.slice(a + MARKE_AUF.length, b).trim();
return drin.length ? drin : null;
}
export function notizSchreiben({ lage, vorher, minuten, konnteNicht }, notizPfad) {
const jetzt = new Date();
const hand = handNotizLesen(notizPfad);
const zeilen = [];
zeilen.push("# Prüfstand Team Dogi");
zeilen.push("");
zeilen.push("*Diese Notiz schreibt `tools/nachtlauf.mjs`. Alles außerhalb des Blocks");
zeilen.push("„VON HAND“ ist beim nächsten Lauf wieder überschrieben — was DRIN steht,");
zeilen.push("bleibt stehen.*");
zeilen.push("");
zeilen.push(MARKE_AUF);
if (hand) {
zeilen.push(hand);
} else {
zeilen.push("## Von Hand");
zeilen.push("");
zeilen.push("*Hier hinein gehört, was die Zahlen nicht sagen können: welche rote");
zeilen.push("Zeile schon untersucht ist, welche echt ist, woran gerade gearbeitet");
zeilen.push("wird. Dieser Block überlebt jeden Lauf — der Rest der Notiz nicht.*");
}
zeilen.push(MARKE_ZU);
zeilen.push("");
if (konnteNicht) {
zeilen.push("## ⚠ Konnte nicht nachsehen");
zeilen.push("");
zeilen.push(konnteNicht);
zeilen.push("");
if (vorher?.wann) {
const tage = Math.floor((Date.now() - vorher.zeit) / 86400000);
zeilen.push(`Zuletzt wirklich gemessen: **${vorher.wann}**`
+ (tage >= 1 ? ` — das ist **${tage} Tag${tage === 1 ? "" : "e"} her**.` : "."));
} else {
zeilen.push("Es gibt noch kein früheres Ergebnis.");
}
return zeilen.join("\n") + "\n";
}
const rot = lage.rote.length;
zeilen.push(rot
? `## ${rot} Prüfung${rot === 1 ? "" : "en"} ${rot === 1 ? "ist" : "sind"} rot`
: "## Alles in Ordnung");
zeilen.push("");
zeilen.push(`Gemessen am **${zeitWort(jetzt)}**, Dauer ${minuten} Minuten.`);
zeilen.push("");
zeilen.push("| | jetzt | vorher |");
zeilen.push("|---|---|---|");
zeilen.push(`| Dateien in Ordnung | ${lage.dateienOk} von ${lage.dateien} | `
+ `${vorher ? `${vorher.dateienOk} von ${vorher.dateien}` : "—"} |`);
zeilen.push(`| Einzelprüfungen bestanden | ${lage.punkteOk} von ${lage.punkte} | `
+ `${vorher ? `${vorher.punkteOk} von ${vorher.punkte}` : "—"} |`);
zeilen.push("");
/* EIN RÜCKGANG DER ANZAHL IST EIN BEFUND, AUCH WENN ALLES GRÜN IST.
Am 28.08.2026 meldete ein Lauf 789 statt 804 Prüfungen und war
dabei grün: Acht Prüfungen je Gerät waren stillschweigend
weggefallen -- ausgerechnet die, die die wichtigste Funktion
absichern. Wer nur "bestanden" liest, hätte sie ab da dauerhaft
ungeprüft gelassen. */
if (vorher && lage.punkte != null && vorher.punkte != null
&& lage.punkte < vorher.punkte) {
zeilen.push(`> **Es werden ${vorher.punkte - lage.punkte} Prüfungen WENIGER gemacht als beim letzten Lauf.**`);
zeilen.push("> Das ist auch dann ein Befund, wenn alles grün ist: Eine Prüfung, die");
zeilen.push("> still nicht mehr läuft, beweist nichts — und niemandem fällt es auf.");
zeilen.push("");
}
if (vorher && lage.dateien != null && vorher.dateien != null
&& lage.dateien < vorher.dateien) {
zeilen.push(`> **Es gibt ${vorher.dateien - lage.dateien} Prüfdatei(en) weniger als beim letzten Lauf.**`);
zeilen.push("");
}
if (rot) {
zeilen.push("## Was rot ist");
zeilen.push("");
for (const r of lage.rote) {
zeilen.push(`### \`${r.datei}\``);
zeilen.push("");
if (r.nullPunkte) {
zeilen.push(`**Kein Befund – es wurde keine einzige Prüfung GEZÄHLT** `
+ `(Exitcode ${r.code}).` );
zeilen.push("");
zeilen.push("Das ist etwas anderes als „kaputt“: Die Datei ist "
+ "durchgelaufen. Der Zähler hat ihre Punkte nur nicht erkannt – "
+ "meist, weil sie ihre Ergebnisse anders schreibt als erwartet "
+ "(` OK ` statt ` ok `, andere Einrückung, eigenes Format). "
+ "Nachsehen lohnt trotzdem: Eine Datei, deren Punkte niemand "
+ "zählt, kann still aufhören zu prüfen, ohne dass es auffällt. "
+ "Zuletzt stand da:");
zeilen.push("");
} else if (r.ohneGrund) {
zeilen.push(`**Konnte nicht sagen, woran es lag** (Exitcode ${r.code}). `
+ "Das ist etwas anderes als ein Befund: Die Prüfung ist nicht "
+ "durchgelaufen, hat aber auch keine FEHL-Zeile hinterlassen. "
+ "Meist steckt dahinter eine Zeitüberschreitung oder ein Absturz "
+ "im Vorlauf, kein Fehler im Programm. Zuletzt stand da:");
zeilen.push("");
}
zeilen.push(`\`\`\`\n${r.erste}\n\`\`\``);
zeilen.push("");
zeilen.push(`Einzeln nachsehen: \`node server/${r.datei}\``);
zeilen.push("");
}
zeilen.push("**Rot heißt nicht automatisch kaputt.** Dreimal am 23.09.2026 war");
zeilen.push("die Prüfung veraltet und das Programm richtig — einmal war es");
zeilen.push("umgekehrt und ein Rollenname stand offen im Netz. Erst nachsehen,");
zeilen.push("dann entscheiden, wer recht hat.");
} else {
zeilen.push("Keine Datei ist rot. Der nächste Lauf kommt in der nächsten Nacht.");
}
zeilen.push("");
return zeilen.join("\n") + "\n";
}
+7 -108
View File
@@ -71,6 +71,7 @@ import {
} from "node:fs";
import { join, dirname } from "node:path";
import { fileURLToPath } from "node:url";
import { notizSchreiben, zeitWort } from "./nachtlauf-notiz.mjs";
const HIER = dirname(fileURLToPath(import.meta.url));
const WURZEL = join(HIER, "..");
@@ -94,11 +95,8 @@ const SCHLOSS = join(WURZEL, "tools", ".nachtlauf-laeuft");
was blockiert, wird abgeschafft. */
const SCHLOSS_FRIST_MS = 3 * 60 * 60 * 1000;
const zweiZiffern = (n) => String(n).padStart(2, "0");
function zeitWort(d = new Date()) {
return `${zweiZiffern(d.getDate())}.${zweiZiffern(d.getMonth() + 1)}.${d.getFullYear()}`
+ ` um ${zweiZiffern(d.getHours())}:${zweiZiffern(d.getMinutes())}`;
}
/* `zeitWort` kommt aus nachtlauf-notiz.mjs -- zwei Kopien derselben
Datumsschreibweise waeren zwei Staende, die auseinanderlaufen. */
function schlossNehmen() {
if (existsSync(SCHLOSS)) {
@@ -216,105 +214,6 @@ function auswerten(aus) {
/* ---------------------------------------------------------------------
Die Notiz
--------------------------------------------------------------------- */
function notizSchreiben({ lage, vorher, minuten, konnteNicht }) {
const jetzt = new Date();
const zeilen = [];
zeilen.push("# Prüfstand Team Dogi");
zeilen.push("");
zeilen.push("*Diese Notiz schreibt `tools/nachtlauf.mjs` — von Hand ändern bringt nichts,");
zeilen.push("beim nächsten Lauf ist es wieder überschrieben.*");
zeilen.push("");
if (konnteNicht) {
zeilen.push("## ⚠ Konnte nicht nachsehen");
zeilen.push("");
zeilen.push(konnteNicht);
zeilen.push("");
if (vorher?.wann) {
const tage = Math.floor((Date.now() - vorher.zeit) / 86400000);
zeilen.push(`Zuletzt wirklich gemessen: **${vorher.wann}**`
+ (tage >= 1 ? ` — das ist **${tage} Tag${tage === 1 ? "" : "e"} her**.` : "."));
} else {
zeilen.push("Es gibt noch kein früheres Ergebnis.");
}
return zeilen.join("\n") + "\n";
}
const rot = lage.rote.length;
zeilen.push(rot
? `## ${rot} Prüfung${rot === 1 ? "" : "en"} ${rot === 1 ? "ist" : "sind"} rot`
: "## Alles in Ordnung");
zeilen.push("");
zeilen.push(`Gemessen am **${zeitWort(jetzt)}**, Dauer ${minuten} Minuten.`);
zeilen.push("");
zeilen.push("| | jetzt | vorher |");
zeilen.push("|---|---|---|");
zeilen.push(`| Dateien in Ordnung | ${lage.dateienOk} von ${lage.dateien} | `
+ `${vorher ? `${vorher.dateienOk} von ${vorher.dateien}` : "—"} |`);
zeilen.push(`| Einzelprüfungen bestanden | ${lage.punkteOk} von ${lage.punkte} | `
+ `${vorher ? `${vorher.punkteOk} von ${vorher.punkte}` : "—"} |`);
zeilen.push("");
/* EIN RÜCKGANG DER ANZAHL IST EIN BEFUND, AUCH WENN ALLES GRÜN IST.
Am 28.08.2026 meldete ein Lauf 789 statt 804 Prüfungen und war
dabei grün: Acht Prüfungen je Gerät waren stillschweigend
weggefallen -- ausgerechnet die, die die wichtigste Funktion
absichern. Wer nur "bestanden" liest, hätte sie ab da dauerhaft
ungeprüft gelassen. */
if (vorher && lage.punkte != null && vorher.punkte != null
&& lage.punkte < vorher.punkte) {
zeilen.push(`> **Es werden ${vorher.punkte - lage.punkte} Prüfungen WENIGER gemacht als beim letzten Lauf.**`);
zeilen.push("> Das ist auch dann ein Befund, wenn alles grün ist: Eine Prüfung, die");
zeilen.push("> still nicht mehr läuft, beweist nichts — und niemandem fällt es auf.");
zeilen.push("");
}
if (vorher && lage.dateien != null && vorher.dateien != null
&& lage.dateien < vorher.dateien) {
zeilen.push(`> **Es gibt ${vorher.dateien - lage.dateien} Prüfdatei(en) weniger als beim letzten Lauf.**`);
zeilen.push("");
}
if (rot) {
zeilen.push("## Was rot ist");
zeilen.push("");
for (const r of lage.rote) {
zeilen.push(`### \`${r.datei}\``);
zeilen.push("");
if (r.nullPunkte) {
zeilen.push(`**Kein Befund – es wurde keine einzige Prüfung GEZÄHLT** `
+ `(Exitcode ${r.code}).` );
zeilen.push("");
zeilen.push("Das ist etwas anderes als „kaputt“: Die Datei ist "
+ "durchgelaufen. Der Zähler hat ihre Punkte nur nicht erkannt – "
+ "meist, weil sie ihre Ergebnisse anders schreibt als erwartet "
+ "(` OK ` statt ` ok `, andere Einrückung, eigenes Format). "
+ "Nachsehen lohnt trotzdem: Eine Datei, deren Punkte niemand "
+ "zählt, kann still aufhören zu prüfen, ohne dass es auffällt. "
+ "Zuletzt stand da:");
zeilen.push("");
} else if (r.ohneGrund) {
zeilen.push(`**Konnte nicht sagen, woran es lag** (Exitcode ${r.code}). `
+ "Das ist etwas anderes als ein Befund: Die Prüfung ist nicht "
+ "durchgelaufen, hat aber auch keine FEHL-Zeile hinterlassen. "
+ "Meist steckt dahinter eine Zeitüberschreitung oder ein Absturz "
+ "im Vorlauf, kein Fehler im Programm. Zuletzt stand da:");
zeilen.push("");
}
zeilen.push(`\`\`\`\n${r.erste}\n\`\`\``);
zeilen.push("");
zeilen.push(`Einzeln nachsehen: \`node server/${r.datei}\``);
zeilen.push("");
}
zeilen.push("**Rot heißt nicht automatisch kaputt.** Dreimal am 23.09.2026 war");
zeilen.push("die Prüfung veraltet und das Programm richtig — einmal war es");
zeilen.push("umgekehrt und ein Rollenname stand offen im Netz. Erst nachsehen,");
zeilen.push("dann entscheiden, wer recht hat.");
} else {
zeilen.push("Keine Datei ist rot. Der nächste Lauf kommt in der nächsten Nacht.");
}
zeilen.push("");
return zeilen.join("\n") + "\n";
}
/* ---------------------------------------------------------------------
Los
@@ -326,7 +225,7 @@ const schloss = erzwingen ? { ok: true } : schlossNehmen();
if (!schloss.ok) {
/* DER DRITTE AUSGANG. Kein Fehler -- nur: hier war nichts zu messen. */
mkdirSync(dirname(NOTIZ), { recursive: true });
writeFileSync(NOTIZ, notizSchreiben({ vorher, konnteNicht: schloss.grund }), "utf8");
writeFileSync(NOTIZ, notizSchreiben({ vorher, konnteNicht: schloss.grund }, NOTIZ), "utf8");
console.log("Konnte nicht nachsehen: " + schloss.grund);
process.exit(0);
}
@@ -343,7 +242,7 @@ if (!ergebnis.ging) {
mkdirSync(dirname(NOTIZ), { recursive: true });
writeFileSync(NOTIZ, notizSchreiben({
vorher, konnteNicht: `Der Läufer ließ sich nicht starten: ${ergebnis.grund}`,
}), "utf8");
}, NOTIZ), "utf8");
console.log("Konnte nicht nachsehen: " + ergebnis.grund);
process.exit(0);
}
@@ -360,13 +259,13 @@ if (lage.dateien == null || lage.punkte == null || lage.punkte === 0) {
konnteNicht: "Der Lauf hat keine einzige Zahl geliefert — vermutlich ist er"
+ " abgebrochen, bevor er anfangen konnte.\n\nLetzte Ausgabe:\n\n```\n"
+ ergebnis.aus.slice(-700) + "\n```",
}), "utf8");
}, NOTIZ), "utf8");
console.log("Konnte nicht nachsehen: keine Zahlen in der Ausgabe.");
process.exit(0);
}
mkdirSync(dirname(NOTIZ), { recursive: true });
writeFileSync(NOTIZ, notizSchreiben({ lage, vorher, minuten: ergebnis.minuten }), "utf8");
writeFileSync(NOTIZ, notizSchreiben({ lage, vorher, minuten: ergebnis.minuten }, NOTIZ), "utf8");
/* Der Stand für den nächsten Vergleich -- erst NACH der Notiz, damit
ein Absturz beim Schreiben nicht den alten Vergleichswert wegnimmt. */
+5 -5
View File
@@ -16,8 +16,8 @@
verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
<!-- Ohne diese drei nimmt ein iPhone einen Bildschirmausschnitt als
Symbol, Android zeichnet die Leiste weiss, und die Seite oeffnet
ausserhalb der App -- auf einer Seite, die genau erklaeren soll,
@@ -33,7 +33,7 @@
schreibt jede Seite app.webmanifest -- auch die hier. -->
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<style>
/* Bewusst in der Seite und nicht in einer eigenen Datei: Diese Seite
soll auch dann noch etwas anzeigen, wenn genau das schiefgeht,
@@ -135,7 +135,7 @@
<script src="assets/js/anruf-probe.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/anruf-probe.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
</body>
</html>
+4 -4
View File
@@ -23,25 +23,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/workspace-192.png?v=202609251440",
"src": "/assets/img/app-symbole/workspace-192.png?v=202609252349",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-512.png?v=202609251440",
"src": "/assets/img/app-symbole/workspace-512.png?v=202609252349",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609251440",
"src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609252349",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609251440",
"src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609252349",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+22 -2
View File
@@ -78,8 +78,28 @@
Grenze -- diese Werte liegen darueber und werden am fertigen
Bildschirmfoto nachgemessen, nicht an der Farbangabe. */
--text: #e4e0f4;
--text-leise: #a9a2ca;
--text-still: #8f88b2;
/* 25.09.2026 angehoben: --text-leise von #a9a2ca auf #b4aed6,
--text-still von #8f88b2 auf #a7a0cb. Gleichzeitig mit den
Grautoenen im Gatehaus und aus demselben Grund.
Gefunden wurde der Mangel drueben (entwicklung.html, 4,42:1), aber
nachgerechnet gilt er hier genauso: Gegen die hellste Flaeche des
Hauses -- rgb(51,53,56) auf hilfe.html -- stand der stille Ton bei
4,10:1 und der leise bei 5,10:1. Der erste war also UNTER der
Grenze. Dass ihn keine Pruefung gemeldet hat, heisst nur, dass
noch keine Crew-Seite mit dieser Flaeche angesehen wurde -- nicht,
dass er in Ordnung war.
Die Lehre aus drei Anlaeufen in vier Wochen: Wer die leiseste
Schrift auf „gerade eben 4,5“ stellt, stellt sie auf den naechsten
Fehlschlag. Gemessen wird deshalb ab jetzt gegen die hellste
Flaeche im HAUS, nicht gegen die der Seite, die gerade rot war.
Jetzt: still 5,00:1 gegen die hellste Flaeche und 7,90:1 gegen
reine Tinte, leise 5,84:1 und 9,22:1. Der Abstand zum Haupttext
(#e4e0f4) bleibt gross -- der steht bei 11,3:1. */
--text-leise: #b4aed6;
--text-still: #a7a0cb;
/* ---- Die Mischung ------------------------------------------------
`--akzent` ist das Babyblau: Es traegt Knoepfe, Umrandungen und
+46 -2
View File
@@ -34,7 +34,15 @@
--rand-hell: rgba(150, 186, 220, 0.30);
--text: #dbe4ef; /* kein reines Weiss - schont die Augen */
--text-leise: #94a5bb;
/* 25.09.2026 von #94a5bb auf #9fb0c6.
Gemessen an echten Bildpunkten stand dieser Ton auf hilfe.html bei
4,90:1 und auf teamlage.html bei 4,98:1 -- ueber der Grenze, aber
mit weniger Luft, als die beiden letzten Rutscher gross waren
(jeweils rund zehn Prozent). Er waere also beim naechsten helleren
Untergrund derselbe Fall gewesen wie der Ton darunter, nur ein
paar Wochen spaeter. */
--text-leise: #9fb0c6;
/* Von #6d7d92 auf #75859a angehoben (01.09.2026).
Aufgefallen erst, als die Buehne im Hintergrund dazukam und der
Kontrast an echten BILDPUNKTEN gemessen wurde statt an der
@@ -56,7 +64,43 @@
Wer den Hintergrund heller macht, muss die leiseste Schrift
nachziehen. Die Alternative waere gewesen, das Bild wieder
zuzudecken -- dann haette man den Aufwand auch lassen koennen. */
--text-still: #7f8fa6;
/* 25.09.2026: #7f8fa6 -> #95a4ba. DAS DRITTE MAL DERSELBE GRIFF --
und deshalb diesmal nicht wieder auf Kante.
Die drei Staende nebeneinander, alle an echten Bildpunkten
gemessen, alle vom selben Werkzeug (pruef-buehne):
01.09. #6d7d92 -> #75859a gemessen 4,43 -> 4,95
07.09. #75859a -> #7f8fa6 gemessen 4,50 -> rund 4,9
25.09. #7f8fa6 -> #95a4ba gemessen 4,42 -> 5,75
Zweimal wurde auf „gerade eben ueber 4,5" eingestellt, und
zweimal hat der naechste hellere Untergrund es wieder
unterschritten. Der Fehler war nie die Farbe, sondern die
Bezugsgroesse: Gemessen wurde jedes Mal gegen den hellsten
Untergrund, den man GERADE KANNTE. Der Hintergrund ist aber ein
Bild, und Bilder haben helle Stellen an wechselnden Orten -- wer
dagegen auf zwei Kommastellen einstellt, stellt auf den naechsten
Fehlschlag ein.
DIESMAL IST DER BEZUG DIE HELLSTE FLAECHE IM GANZEN HAUS:
rgb(51,53,56) auf hilfe.html, gefunden, indem die Werte ALLER
vierzehn Seiten nebeneinandergelegt wurden statt nur die der
einen, die rot war. Gegen sie haelt der neue Ton 4,86:1, gegen
reine Tinte 7,68:1, an der Stelle des Befundes 5,75:1.
Leiser als der Haupttext bleibt er deutlich -- der steht bei
11,8:1, also mehr als doppelt so hoch.
Und damit es nicht ein viertes Mal so weit kommt, prueft
pruef-buehne jetzt nicht mehr nur „ueber 4,5", sondern auch, ob
der schlechteste Wert einer Seite noch 5,0 erreicht. Die Zahl ist
gemessen und nicht gewaehlt: Beide Rutscher oben waren rund elf
Prozent gross, und 4,5 mal 1,11 ist 5,0. Eine Seite, die darunter
liegt, ist noch in Ordnung und schon in Gefahr -- genau das soll
sie sagen. */
--text-still: #95a4ba;
--akzent: #3fbdf5; /* aus dem Neon des Motivs, entsättigt */
--akzent-tief: #1f7fb0;
+67
View File
@@ -269,6 +269,73 @@
transition: transform var(--tempo), filter var(--tempo);
}
/* =====================================================================
WER MIT DER TASTATUR BEDIENT, MUSS SEHEN, WO ER STEHT (25.09.2026)
Gefunden von pruef-barrierefrei-workspace auf wissen.html: Die
Wissenskacheln zeigten beim Durchtabben KEINE Veraenderung --
gemessen mit echten Tastendruecken, nicht mit focus().
Die Ursache ist ein Spezifitaets-Unfall, und sie betrifft nicht nur
diese eine Seite:
wissen.css .kachel:focus-visible (0,2,0)
module.css :is(... .gruppe[data-gruppe] ...) (0,2,0)
`:is()` uebernimmt die Spezifitaet seines STAERKSTEN Arguments.
In der Modulliste steht `.gruppe[data-gruppe]` -- eine Klasse PLUS
ein Attribut. Damit ist die ganze Liste (0,2,0) statt (0,1,0), und
weil diese Datei zuletzt geladen wird, gewinnt sie bei
Gleichstand. Der `box-shadow` des Fokusrings wurde also vom
Faseschatten dieser Datei ueberschrieben -- auf JEDEM Modul, dessen
Fokusregel nur aus einer Klasse und `:focus-visible` besteht.
NICHT GELOEST WIRD DAS, INDEM MAN DIE LISTE SCHWAECHER MACHT. Das
war schon einmal so (`:where()`, Spezifitaet null) und hat einen
Zwitter aus neuer Form und alter Kante ergeben -- der Absatz oben
beschreibt es. Wer die Zahl senkt, verschiebt das Problem nur auf
die naechste Regel.
GELOEST WIRD ES, INDEM DIE ANTWORT HIER STEHT. Ein Fokusring fuer
die ganze Modulliste, in derselben Datei wie die Form, mit
`:focus-visible` also eine Klasse staerker als die Grundregel. Er
gilt damit fuer jedes Modul im Haus -- auch fuer die, die es noch
nicht gibt, und auch dort, wo niemand an eine Fokusregel gedacht
hat. Das ist der Unterschied zwischen einer Reparatur und einer
Regel.
`outline-offset` ist NEGATIV, und das ist kein Geschmack:
`clip-path` schneidet alles ab, was ausserhalb der Form liegt --
ein Ring mit positivem Abstand waere unsichtbar. Nach innen
gezeichnet liegt er drin und bleibt stehen. Gemessen mit
server/mess-fokus.mjs.
`:focus-visible` und nicht `:focus`: Wer mit der Maus klickt, will
keinen Rahmen sehen. Die Browser entscheiden das selbst, und sie
entscheiden es richtig.
NOCH OFFEN, UND HIER NOTIERT, DAMIT ES NICHT VERLORENGEHT: Derselbe
Gleichstand trifft auch HOVER-Regeln in frueher geladenen Dateien.
`.ablage:hover` in dateien.css, `.call:hover` in calls.css,
`.kk:hover` in scouting.css und `.fortschritt:hover` in
uebersicht.css setzen alle `border-color` -- und die Grundregel
oben setzt `border: 0`, gleich stark und spaeter im Ladeweg. Diese
vier Regeln tun also vermutlich nichts.
NICHT MITREPARIERT, weil es kein Messgeraet dafuer gibt: Fokus
laesst sich pruefen (pruef-barrierefrei-workspace tabbt und
vergleicht), Hover nicht -- es gibt keine Pruefung, die sagen
koennte, ob eine Aenderung dort etwas kaputt macht. Und die
naheliegende Loesung (die Grundregel schwaecher machen, indem
`.gruppe[data-gruppe]` aus der Liste in einen eigenen Selektor
wandert) wuerde die Form von 45 Bauteilen auf 38 Seiten neu
entscheiden. Das ohne Messgeraet zu tun, waere Raten mit viel
Einsatz. */
:is(.eintrag-karte, .call, .chat, .datei, .ablage, .zahlkarte, .regel, .zustand, .ki-kasten, .spalte, .balance, .saeulen-kasten, .neu, .call-raum, .creator, .summe, .pdf, .pdf-ablage, .suchleiste, .person, .kk, .fortschritt, .punkt, .dran__punkt, .unterweisung, .warnkarte, .kachel, .tagesblick, .leer-hinweis, .team-karte, .zahl, .k-listentag, .import-vorschau, .code-fenster, .schulung__neu, .gruppe[data-gruppe], .kopf-zeile, .k-kopf, .steckbrief, .k-anlasskarte, .k-anlasskachel, .k-raster, .entscheidung, .liste-kachel, fieldset.gruppe, .t-kachel, .tperson, .tl):focus-visible {
outline: 2px solid var(--akzent);
outline-offset: -4px;
}
@media (max-width: 620px) {
/* Dieselbe Form, kleiner -- keine zweite Gestaltung. */
:root { --fase: 12px; }
+26 -26
View File
@@ -888,8 +888,8 @@ body.start > main { position: relative; z-index: 1; }
Unterschied), und jede Farbe haelt 4,5:1 gegen den dunklen Grund --
sie traegt auch Text. Wer sie neu rechnet: Das Werkzeug bricht ab,
wenn das Ergebnis schlechter waere als der alte Stand. */
[data-ton="1"] { --ton: #0c86af; } /* Dashboard */
[data-ton="2"] { --ton: #fe5e82; } /* Zahlen */
[data-ton="1"] { --ton: #aa6c90; } /* Dashboard */
[data-ton="2"] { --ton: #d050a4; } /* Zahlen */
[data-ton="3"] { --ton: #18b803; } /* LIVE */
[data-ton="4"] { --ton: #c16302; } /* Chat */
/* TON 5 IST VON HAND GESETZT (09.09.2026, screen4).
@@ -925,22 +925,22 @@ body.start > main { position: relative; z-index: 1; }
gewünscht ("alle kacheln auf der ganzen website sollen sein wie auf
der startseite"). Was sie heraushebt, ist die Farbe, nicht eine
Sonderform. */
[data-ton="5"] { --ton: #ff08d5; } /* Schutz & Regeln -- Wunsch: extrem auffällig */
[data-ton="5"] { --ton: #fe04d8; } /* Schutz & Regeln -- Wunsch: extrem auffällig */
[data-ton="6"] { --ton: #b699fe; } /* Community */
[data-ton="7"] { --ton: #098f71; } /* Reports */
[data-ton="8"] { --ton: #ab68ff; } /* Kalender */
[data-ton="9"] { --ton: #e701c1; } /* Bibliothek */
[data-ton="10"] { --ton: #ff6877; } /* Steckbrief */
[data-ton="11"] { --ton: #db8908; } /* Personen */
[data-ton="12"] { --ton: #0ce6a3; } /* Content */
[data-ton="9"] { --ton: #ceae6e; } /* Bibliothek */
[data-ton="10"] { --ton: #fe667e; } /* Steckbrief */
[data-ton="11"] { --ton: #da8a06; } /* Personen */
[data-ton="12"] { --ton: #7eca8c; } /* Content */
[data-ton="13"] { --ton: #12b37e; } /* Aufgaben */
[data-ton="14"] { --ton: #ffbd4a; } /* Technik */
[data-ton="15"] { --ton: #01d7e3; } /* Calls */
[data-ton="16"] { --ton: #19b2c2; } /* Start-Check */
[data-ton="15"] { --ton: #9ce6bc; } /* Calls */
[data-ton="16"] { --ton: #28aeba; } /* Start-Check */
[data-ton="17"] { --ton: #cace02; } /* Agentur */
[data-ton="18"] { --ton: #aa99ff; } /* Automationen */
[data-ton="18"] { --ton: #9a86ca; } /* Automationen */
[data-ton="19"] { --ton: #08eb9f; } /* Dateien */
[data-ton="20"] { --ton: #ff8fb4; } /* Creator-Profile */
[data-ton="20"] { --ton: #d48a92; } /* Creator-Profile */
/* TON 21 IST VON HAND GESETZT (09.09.2026, screen6).
Filipe: "die farbe von dieser kategorie soll knall rot sein."
@@ -958,7 +958,7 @@ body.start > main { position: relative; z-index: 1; }
Kontrast auf dem dunklen Grund: 5,01:1 (noetig 4,5). Von sechs
geprueften Rottoenen hat dieser den groessten Abstand UND genug
Kontrast -- deshalb dieser und nicht der erstbeste. */
[data-ton="21"] { --ton: #f80442; } /* Scout-Pipeline -- Wunsch: knallrot */
[data-ton="21"] { --ton: #d6525e; } /* Scout-Pipeline -- Wunsch: knallrot */
/* TON 22 -- TEAM-LAGE (09.09.2026).
@@ -1133,7 +1133,7 @@ body.start > main { position: relative; z-index: 1; }
statt die Schwelle stillschweigend zu senken. */
[data-ton="39"] { --ton: #ff57ba; } /* Vertraulich melden */
[data-ton="40"] { --ton: #ff9d82; } /* Entwicklung (die Auswertung) */
[data-ton="41"] { --ton: #6d8cfe; } /* Treff-Chat */
[data-ton="41"] { --ton: #6c8efe; } /* Treff-Chat */
[data-ton="42"] { --ton: #918a01; } /* Material (Platzhalter, wird gerechnet) */
[data-ton="43"] { --ton: #027afb; } /* Calls & Protokolle (gerechnet 22.09.2026) */
/* GEWUENSCHT UND NACHGEMESSEN (25.09.2026)
@@ -1178,7 +1178,7 @@ body.start > main { position: relative; z-index: 1; }
(vorher hielt es eine zu blasse Farbe, weil ihr Abstand gut war).
Wer diesen Ton spaeter aufhellen will, muss den Abstand neu rechnen
-- nicht nach Gefuehl nachbessern. */
[data-ton="45"] { --ton: #fd6401; } /* Unterstützen (gerechnet 24.09.2026) */
[data-ton="45"] { --ton: #fe660e; } /* Unterstützen (gerechnet 24.09.2026) */
/* WARUM ES KEINEN TON 46 GIBT (25.09.2026)
Die Tuer ins andere Haus trug bis heute Ton 40 -- dieselbe Nummer
@@ -8565,13 +8565,13 @@ body.start .k-leiste .feldschild::after {
radial-gradient(4.82px 4.82px at 21.3px 22.8px, color-mix(in srgb, #07fff1 88%, #ffffff), color-mix(in srgb, #07fff1 88%, #ffffff) 34%, color-mix(in srgb, #07fff1 55%, transparent) 52%, transparent 100%),
radial-gradient(5.48px 5.48px at 50.6px 7.0px, color-mix(in srgb, #fe8ebe 88%, #ffffff), color-mix(in srgb, #fe8ebe 88%, #ffffff) 34%, color-mix(in srgb, #fe8ebe 55%, transparent) 52%, transparent 100%),
radial-gradient(6.57px 6.57px at 81.2px 6.7px, color-mix(in srgb, #72d512 88%, #ffffff), color-mix(in srgb, #72d512 88%, #ffffff) 34%, color-mix(in srgb, #72d512 55%, transparent) 52%, transparent 100%),
radial-gradient(4.71px 4.71px at 110.3px 23.0px, color-mix(in srgb, #6d8cfe 88%, #ffffff), color-mix(in srgb, #6d8cfe 88%, #ffffff) 34%, color-mix(in srgb, #6d8cfe 55%, transparent) 52%, transparent 100%),
radial-gradient(4.71px 4.71px at 110.3px 23.0px, color-mix(in srgb, #6c8efe 88%, #ffffff), color-mix(in srgb, #6c8efe 88%, #ffffff) 34%, color-mix(in srgb, #6c8efe 55%, transparent) 52%, transparent 100%),
radial-gradient(4.88px 4.88px at 154.3px 8.0px, color-mix(in srgb, #c16302 88%, #ffffff), color-mix(in srgb, #c16302 88%, #ffffff) 34%, color-mix(in srgb, #c16302 55%, transparent) 52%, transparent 100%),
radial-gradient(4.83px 4.83px at 185.7px 11.5px, color-mix(in srgb, #12b37e 88%, #ffffff), color-mix(in srgb, #12b37e 88%, #ffffff) 34%, color-mix(in srgb, #12b37e 55%, transparent) 52%, transparent 100%),
radial-gradient(4.33px 4.33px at 16.5px 42.0px, color-mix(in srgb, #ff57ba 88%, #ffffff), color-mix(in srgb, #ff57ba 88%, #ffffff) 34%, color-mix(in srgb, #ff57ba 55%, transparent) 52%, transparent 100%),
radial-gradient(5.17px 5.17px at 49.7px 52.7px, color-mix(in srgb, #a2af10 88%, #ffffff), color-mix(in srgb, #a2af10 88%, #ffffff) 34%, color-mix(in srgb, #a2af10 55%, transparent) 52%, transparent 100%),
radial-gradient(4.63px 4.63px at 82.5px 47.6px, color-mix(in srgb, #027afb 88%, #ffffff), color-mix(in srgb, #027afb 88%, #ffffff) 34%, color-mix(in srgb, #027afb 55%, transparent) 52%, transparent 100%),
radial-gradient(4.55px 4.55px at 105.1px 54.1px, color-mix(in srgb, #fd6401 88%, #ffffff), color-mix(in srgb, #fd6401 88%, #ffffff) 34%, color-mix(in srgb, #fd6401 55%, transparent) 52%, transparent 100%),
radial-gradient(4.55px 4.55px at 105.1px 54.1px, color-mix(in srgb, #fe660e 88%, #ffffff), color-mix(in srgb, #fe660e 88%, #ffffff) 34%, color-mix(in srgb, #fe660e 55%, transparent) 52%, transparent 100%),
radial-gradient(6.07px 6.07px at 149.6px 56.3px, color-mix(in srgb, #08eb9f 88%, #ffffff), color-mix(in srgb, #08eb9f 88%, #ffffff) 34%, color-mix(in srgb, #08eb9f 55%, transparent) 52%, transparent 100%),
radial-gradient(4.34px 4.34px at 182.8px 53.3px, color-mix(in srgb, #f4acff 88%, #ffffff), color-mix(in srgb, #f4acff 88%, #ffffff) 34%, color-mix(in srgb, #f4acff 55%, transparent) 52%, transparent 100%),
radial-gradient(5.58px 5.58px at 14.4px 89.8px, color-mix(in srgb, #cace02 88%, #ffffff), color-mix(in srgb, #cace02 88%, #ffffff) 34%, color-mix(in srgb, #cace02 55%, transparent) 52%, transparent 100%),
@@ -8586,7 +8586,7 @@ body.start .k-leiste .feldschild::after {
radial-gradient(4.52px 4.52px at 105.6px 108.9px, color-mix(in srgb, #d21afd 88%, #ffffff), color-mix(in srgb, #d21afd 88%, #ffffff) 34%, color-mix(in srgb, #d21afd 55%, transparent) 52%, transparent 100%),
radial-gradient(4.31px 4.31px at 150.4px 108.8px, color-mix(in srgb, #918a01 88%, #ffffff), color-mix(in srgb, #918a01 88%, #ffffff) 34%, color-mix(in srgb, #918a01 55%, transparent) 52%, transparent 100%),
radial-gradient(5.83px 5.83px at 189.4px 117.4px, color-mix(in srgb, #0687bc 88%, #ffffff), color-mix(in srgb, #0687bc 88%, #ffffff) 34%, color-mix(in srgb, #0687bc 55%, transparent) 52%, transparent 100%),
radial-gradient(4.38px 4.38px at 10.9px 139.1px, color-mix(in srgb, #ff6877 88%, #ffffff), color-mix(in srgb, #ff6877 88%, #ffffff) 34%, color-mix(in srgb, #ff6877 55%, transparent) 52%, transparent 100%),
radial-gradient(4.38px 4.38px at 10.9px 139.1px, color-mix(in srgb, #fe667e 88%, #ffffff), color-mix(in srgb, #fe667e 88%, #ffffff) 34%, color-mix(in srgb, #fe667e 55%, transparent) 52%, transparent 100%),
radial-gradient(6.29px 6.29px at 54.7px 155.9px, color-mix(in srgb, #a7ff98 88%, #ffffff), color-mix(in srgb, #a7ff98 88%, #ffffff) 34%, color-mix(in srgb, #a7ff98 55%, transparent) 52%, transparent 100%),
radial-gradient(6.12px 6.12px at 75.1px 154.0px, color-mix(in srgb, #ab68ff 88%, #ffffff), color-mix(in srgb, #ab68ff 88%, #ffffff) 34%, color-mix(in srgb, #ab68ff 55%, transparent) 52%, transparent 100%),
radial-gradient(6.08px 6.08px at 123.3px 154.7px, color-mix(in srgb, #ffbd4a 88%, #ffffff), color-mix(in srgb, #ffbd4a 88%, #ffffff) 34%, color-mix(in srgb, #ffbd4a 55%, transparent) 52%, transparent 100%),
@@ -8594,7 +8594,7 @@ body.start .k-leiste .feldschild::after {
radial-gradient(4.42px 4.42px at 177.4px 144.5px, color-mix(in srgb, #f10778 88%, #ffffff), color-mix(in srgb, #f10778 88%, #ffffff) 34%, color-mix(in srgb, #f10778 55%, transparent) 52%, transparent 100%),
radial-gradient(5.16px 5.16px at 17.7px 183.1px, color-mix(in srgb, #61ff09 88%, #ffffff), color-mix(in srgb, #61ff09 88%, #ffffff) 34%, color-mix(in srgb, #61ff09 55%, transparent) 52%, transparent 100%),
radial-gradient(4.80px 4.80px at 46.6px 182.2px, color-mix(in srgb, #b699fe 88%, #ffffff), color-mix(in srgb, #b699fe 88%, #ffffff) 34%, color-mix(in srgb, #b699fe 55%, transparent) 52%, transparent 100%),
radial-gradient(5.00px 5.00px at 80.1px 179.7px, color-mix(in srgb, #db8908 88%, #ffffff), color-mix(in srgb, #db8908 88%, #ffffff) 34%, color-mix(in srgb, #db8908 55%, transparent) 52%, transparent 100%),
radial-gradient(5.00px 5.00px at 80.1px 179.7px, color-mix(in srgb, #da8a06 88%, #ffffff), color-mix(in srgb, #da8a06 88%, #ffffff) 34%, color-mix(in srgb, #da8a06 55%, transparent) 52%, transparent 100%),
/* 4. DIE MITTLEREN — die Masse des Feldes. */
radial-gradient(3.21px 3.21px at 5.1px 5.6px, color-mix(in srgb, #07fff1 82%, #ffffff), color-mix(in srgb, #07fff1 82%, #ffffff) 34%, transparent 100%),
@@ -8603,10 +8603,10 @@ body.start .k-leiste .feldschild::after {
radial-gradient(2.86px 2.86px at 82.4px 14.9px, color-mix(in srgb, #cace02 82%, #ffffff), color-mix(in srgb, #cace02 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.96px 2.96px at 98.8px 9.3px, color-mix(in srgb, #12b37e 82%, #ffffff), color-mix(in srgb, #12b37e 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.65px 2.65px at 121.0px 14.2px, color-mix(in srgb, #b699fe 82%, #ffffff), color-mix(in srgb, #b699fe 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.49px 2.49px at 11.8px 26.8px, color-mix(in srgb, #ff6877 82%, #ffffff), color-mix(in srgb, #ff6877 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.49px 2.49px at 11.8px 26.8px, color-mix(in srgb, #fe667e 82%, #ffffff), color-mix(in srgb, #fe667e 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.92px 2.92px at 33.8px 37.3px, color-mix(in srgb, #eeef08 82%, #ffffff), color-mix(in srgb, #eeef08 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.47px 2.47px at 55.5px 38.6px, color-mix(in srgb, #08eb9f 82%, #ffffff), color-mix(in srgb, #08eb9f 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.55px 2.55px at 74.8px 28.0px, color-mix(in srgb, #6d8cfe 82%, #ffffff), color-mix(in srgb, #6d8cfe 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.55px 2.55px at 74.8px 28.0px, color-mix(in srgb, #6c8efe 82%, #ffffff), color-mix(in srgb, #6c8efe 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.43px 2.43px at 103.9px 38.4px, color-mix(in srgb, #f10778 82%, #ffffff), color-mix(in srgb, #f10778 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.62px 2.62px at 124.3px 27.3px, color-mix(in srgb, #918a01 82%, #ffffff), color-mix(in srgb, #918a01 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.61px 2.61px at 6.8px 55.0px, color-mix(in srgb, #069511 82%, #ffffff), color-mix(in srgb, #069511 82%, #ffffff) 34%, transparent 100%),
@@ -8616,7 +8616,7 @@ body.start .k-leiste .feldschild::after {
radial-gradient(2.89px 2.89px at 97.7px 59.0px, color-mix(in srgb, #18b803 82%, #ffffff), color-mix(in srgb, #18b803 82%, #ffffff) 34%, transparent 100%),
radial-gradient(3.29px 3.29px at 125.8px 57.6px, color-mix(in srgb, #a8d8ff 82%, #ffffff), color-mix(in srgb, #a8d8ff 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.52px 2.52px at 10.9px 83.0px, color-mix(in srgb, #ff57ba 82%, #ffffff), color-mix(in srgb, #ff57ba 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.37px 2.37px at 33.1px 72.6px, color-mix(in srgb, #db8908 82%, #ffffff), color-mix(in srgb, #db8908 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.37px 2.37px at 33.1px 72.6px, color-mix(in srgb, #da8a06 82%, #ffffff), color-mix(in srgb, #da8a06 82%, #ffffff) 34%, transparent 100%),
radial-gradient(3.21px 3.21px at 54.6px 78.8px, color-mix(in srgb, #a7ff98 82%, #ffffff), color-mix(in srgb, #a7ff98 82%, #ffffff) 34%, transparent 100%),
radial-gradient(3.43px 3.43px at 71.0px 71.9px, color-mix(in srgb, #08b5fc 82%, #ffffff), color-mix(in srgb, #08b5fc 82%, #ffffff) 34%, transparent 100%),
radial-gradient(3.16px 3.16px at 92.6px 70.6px, color-mix(in srgb, #f4acff 82%, #ffffff), color-mix(in srgb, #f4acff 82%, #ffffff) 34%, transparent 100%),
@@ -8624,7 +8624,7 @@ body.start .k-leiste .feldschild::after {
radial-gradient(2.50px 2.50px at 16.0px 101.8px, color-mix(in srgb, #61ff09 82%, #ffffff), color-mix(in srgb, #61ff09 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.80px 2.80px at 33.8px 102.3px, color-mix(in srgb, #0687bc 82%, #ffffff), color-mix(in srgb, #0687bc 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.52px 2.52px at 49.8px 93.9px, color-mix(in srgb, #e871ff 82%, #ffffff), color-mix(in srgb, #e871ff 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.87px 2.87px at 77.0px 95.8px, color-mix(in srgb, #fd6401 82%, #ffffff), color-mix(in srgb, #fd6401 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.87px 2.87px at 77.0px 95.8px, color-mix(in srgb, #fe660e 82%, #ffffff), color-mix(in srgb, #fe660e 82%, #ffffff) 34%, transparent 100%),
radial-gradient(2.37px 2.37px at 101.9px 95.3px, color-mix(in srgb, #72d512 82%, #ffffff), color-mix(in srgb, #72d512 82%, #ffffff) 34%, transparent 100%),
radial-gradient(3.42px 3.42px at 113.5px 91.8px, color-mix(in srgb, #0ed1d0 82%, #ffffff), color-mix(in srgb, #0ed1d0 82%, #ffffff) 34%, transparent 100%),
radial-gradient(3.22px 3.22px at 12.7px 116.5px, color-mix(in srgb, #d21afd 82%, #ffffff), color-mix(in srgb, #d21afd 82%, #ffffff) 34%, transparent 100%),
@@ -8645,16 +8645,16 @@ body.start .k-leiste .feldschild::after {
radial-gradient(1.69px 1.69px at 46.6px 21.7px, color-mix(in srgb, #069511 74%, #ffffff), color-mix(in srgb, #069511 74%, #ffffff) 34%, transparent 100%),
radial-gradient(2.03px 2.03px at 64.3px 18.5px, color-mix(in srgb, #a8d8ff 74%, #ffffff), color-mix(in srgb, #a8d8ff 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.36px 1.36px at 77.2px 20.7px, color-mix(in srgb, #f4acff 74%, #ffffff), color-mix(in srgb, #f4acff 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.40px 1.40px at 3.8px 31.4px, color-mix(in srgb, #fd6401 74%, #ffffff), color-mix(in srgb, #fd6401 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.40px 1.40px at 3.8px 31.4px, color-mix(in srgb, #fe660e 74%, #ffffff), color-mix(in srgb, #fe660e 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.36px 1.36px at 17.0px 32.1px, color-mix(in srgb, #a2af10 74%, #ffffff), color-mix(in srgb, #a2af10 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.84px 1.84px at 32.1px 35.9px, color-mix(in srgb, #12b37e 74%, #ffffff), color-mix(in srgb, #12b37e 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.63px 1.63px at 48.3px 34.6px, color-mix(in srgb, #6d8cfe 74%, #ffffff), color-mix(in srgb, #6d8cfe 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.63px 1.63px at 48.3px 34.6px, color-mix(in srgb, #6c8efe 74%, #ffffff), color-mix(in srgb, #6c8efe 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.47px 1.47px at 61.7px 38.8px, color-mix(in srgb, #fe8ebe 74%, #ffffff), color-mix(in srgb, #fe8ebe 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.59px 1.59px at 73.2px 36.6px, color-mix(in srgb, #db8908 74%, #ffffff), color-mix(in srgb, #db8908 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.59px 1.59px at 73.2px 36.6px, color-mix(in srgb, #da8a06 74%, #ffffff), color-mix(in srgb, #da8a06 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.34px 1.34px at 2.9px 51.3px, color-mix(in srgb, #61ff09 74%, #ffffff), color-mix(in srgb, #61ff09 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.78px 1.78px at 17.6px 52.6px, color-mix(in srgb, #0ed1d0 74%, #ffffff), color-mix(in srgb, #0ed1d0 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.72px 1.72px at 35.6px 46.1px, color-mix(in srgb, #ab68ff 74%, #ffffff), color-mix(in srgb, #ab68ff 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.87px 1.87px at 50.9px 49.3px, color-mix(in srgb, #ff6877 74%, #ffffff), color-mix(in srgb, #ff6877 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.87px 1.87px at 50.9px 49.3px, color-mix(in srgb, #fe667e 74%, #ffffff), color-mix(in srgb, #fe667e 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.44px 1.44px at 59.6px 52.2px, color-mix(in srgb, #918a01 74%, #ffffff), color-mix(in srgb, #918a01 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.77px 1.77px at 73.3px 49.9px, color-mix(in srgb, #18b803 74%, #ffffff), color-mix(in srgb, #18b803 74%, #ffffff) 34%, transparent 100%),
radial-gradient(1.76px 1.76px at 3.5px 65.0px, color-mix(in srgb, #08b5fc 74%, #ffffff), color-mix(in srgb, #08b5fc 74%, #ffffff) 34%, transparent 100%),
+19 -19
View File
@@ -12,19 +12,19 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -391,22 +391,22 @@
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
<script src="assets/js/textform.js?v=202609251440"></script>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/hochladen.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/textform.js?v=202609252349"></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/hochladen.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/zuteilung.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/zuteilung.js?v=202609252349" defer></script>
<!-- Der Vorlagenkatalog stand bis zum 23.09.2026 mitten in
aufgaben.js. Er bedient jetzt zwei Seiten und hat deshalb eine
eigene Datei; hier zeigt er den Creator-Katalog.
Vor aufgaben.js, weil die Seite ihn beim Start einrichtet. -->
<script src="assets/js/vorlagenbrett.js?v=202609251440" defer></script>
<script src="assets/js/aufgaben.js?v=202609251440" defer></script>
<script src="assets/js/vorlagenbrett.js?v=202609252349" defer></script>
<script src="assets/js/aufgaben.js?v=202609252349" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/automation.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -168,15 +168,15 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/automation.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/automation.js?v=202609252349" defer></script>
</body>
</html>
+17 -17
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -197,16 +197,16 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/holen.js?v=202609251440" defer></script>
<script src="assets/js/befinden.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/holen.js?v=202609252349" defer></script>
<script src="assets/js/befinden.js?v=202609252349" defer></script>
</body>
</html>
+22 -22
View File
@@ -12,24 +12,24 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609252349" />
<!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett
„Mitmachen". Eine eigene Kopie der Regel hier waere die zweite
Stelle, an der dieselbe Sache anders aussieht. -->
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -304,19 +304,19 @@
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
<script src="assets/js/textform.js?v=202609251440"></script>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/textform.js?v=202609252349"></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/checkliste.js?v=202609251440" defer></script>
<script src="assets/js/ampel.js?v=202609251440" defer></script>
<script src="assets/js/schulung.js?v=202609251440" defer></script>
<script src="assets/js/holen.js?v=202609251440" defer></script>
<script src="assets/js/bereich.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/checkliste.js?v=202609252349" defer></script>
<script src="assets/js/ampel.js?v=202609252349" defer></script>
<script src="assets/js/schulung.js?v=202609252349" defer></script>
<script src="assets/js/holen.js?v=202609252349" defer></script>
<script src="assets/js/bereich.js?v=202609252349" defer></script>
</body>
</html>
+19 -19
View File
@@ -7,17 +7,17 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -108,15 +108,15 @@
</main>
<!-- Der Fuß gehört zu jeder Seite - siehe pruef-css-klassen. -->
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/auskunft.js?v=202609251440" defer></script>
<script src="assets/js/bewerben.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/auskunft.js?v=202609252349" defer></script>
<script src="assets/js/bewerben.js?v=202609252349" defer></script>
</body>
</html>
+18 -18
View File
@@ -7,16 +7,16 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein - siehe treff-regeln.html. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -80,16 +80,16 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/auskunft.js?v=202609251440" defer></script>
<script src="assets/js/bewerbungen.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/auskunft.js?v=202609252349" defer></script>
<script src="assets/js/bewerbungen.js?v=202609252349" defer></script>
</body>
</html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/calls.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -89,15 +89,15 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/ki.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/calls.js?v=202609251440" defer></script>
<script src="assets/js/ki.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/calls.js?v=202609252349" defer></script>
</body>
</html>
+20 -20
View File
@@ -12,26 +12,26 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<!-- aufgaben.css bringt die Dialog- und Formularstile mit (.dialog,
.neu__zeile, .dialog__knoepfe). Sie stehen dort seit dem
Aufgabenbrett; sie hierher zu kopieren hiesse, sie an zwei Stellen
zu pflegen. Dieselbe Lösung nutzen kalender.html und content.html.
Gemeldet von pruef-css-klassen.mjs, bevor jemand einen ungestylten
Dialog zu sehen bekam. -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/chat.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -739,24 +739,24 @@
</form>
</dialog>
<script src="assets/js/bereiche.js?v=202609251440"></script>
<script src="assets/js/bereiche.js?v=202609252349"></script>
<!-- TEXTFORM VOR ALLEM ANDEREN (21.09.2026): chat.js und bereich.js
fragen beim Zeichnen nach `window.Textform`. Kaeme sie spaeter,
waere die erste gezeichnete Nachricht ohne Gestaltung -- und das
faellt nur dem auf, der genau hinsieht. KEIN `defer`, damit sie
wirklich vor den anderen dasteht. -->
<script src="assets/js/textform.js?v=202609251440"></script>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/hochladen.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440"></script>
<script src="assets/js/glocke.js?v=202609251440"></script>
<script src="assets/js/textform.js?v=202609252349"></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/hochladen.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349"></script>
<script src="assets/js/glocke.js?v=202609252349"></script>
<!-- ANRUF VOR CHAT (18.09.2026): anruf.js stellt `window.anrufStarten`
bereit, und chat.js baut die Knoepfe nur, wenn es das gibt.
Andersherum waere die Reihenfolge eine stille Abhaengigkeit --
die Knoepfe fehlten, und niemand wuesste warum. -->
<script src="assets/js/anruf.js?v=202609251711"></script>
<script src="assets/js/anruf.js?v=202609252349"></script>
<!-- DIE BILDSCHAU (25.09.2026). Eigene Datei, weil sie nichts vom
Chat weiss: Sie bekommt einen Weg und einen Namen und zeigt ein
Bild. Jede andere Seite mit Fotos kann sie ebenso benutzen, ohne
@@ -767,8 +767,8 @@
sie beim ersten Foto noch nicht da -- und der erste Klick ginge
wie frueher in den Tab. Ein Fehler, der nur beim ERSTEN Mal
auftritt, ist der, den man nie nachstellen kann. -->
<script src="assets/js/bildschau.js?v=202609251440"></script>
<script src="assets/js/chat.js?v=202609251440"></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/bildschau.js?v=202609252349"></script>
<script src="assets/js/chat.js?v=202609252349"></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
</body>
</html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/content.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/content.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -179,15 +179,15 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/checkliste.js?v=202609251440" defer></script>
<script src="assets/js/content.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/checkliste.js?v=202609252349" defer></script>
<script src="assets/js/content.js?v=202609252349" defer></script>
</body>
</html>
+6 -6
View File
@@ -36,15 +36,15 @@
<link rel="preload" as="image" href="assets/img/buehne/crew-gate-hoch-580.webp"
type="image/webp" media="(max-width: 899px)" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/crew-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/crew-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<!-- Diese Wand steht NUR auf der Adresse von Team Dogi (ueberall sonst
404, siehe crewWeiche). Sie darf das Haus deshalb direkt nennen
statt ueber den Platzhalter haus.css zu gehen -- und sie MUSS es:
Eine Zugangswand, die sich erst nach dem Umbiegen faerbt, waere
die eine Seite, auf der man das Umfaerben sieht. -->
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/crew-haus.css?v=202609252349" />
</head>
<body class="gate gate--crew">
@@ -459,7 +459,7 @@
<script src="assets/js/gate.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/gate.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
</body>
</html>
+4 -4
View File
@@ -23,25 +23,25 @@
},
"icons": [
{
"src": "/assets/img/app-symbole/crew-192.png?v=202609251440",
"src": "/assets/img/app-symbole/crew-192.png?v=202609252349",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-512.png?v=202609251440",
"src": "/assets/img/app-symbole/crew-512.png?v=202609252349",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609251440",
"src": "/assets/img/app-symbole/crew-192-maskable.png?v=202609252349",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609251440",
"src": "/assets/img/app-symbole/crew-512-maskable.png?v=202609252349",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/dateien.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -108,15 +108,15 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/hochladen.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/hochladen.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/dateien.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/dateien.js?v=202609252349" defer></script>
</body>
</html>
+18 -18
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -297,20 +297,20 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/holen.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/holen.js?v=202609252349" defer></script>
<!-- VOR entwicklung.js: Die Seite richtet den Katalog beim Start ein,
also muss es ihn zu dem Zeitpunkt geben. Mit "defer" laufen beide
in Dokumentreihenfolge. -->
<script src="assets/js/vorlagenbrett.js?v=202609251440" defer></script>
<script src="assets/js/entwicklung.js?v=202609251440" defer></script>
<script src="assets/js/vorlagenbrett.js?v=202609252349" defer></script>
<script src="assets/js/entwicklung.js?v=202609252349" defer></script>
</body>
</html>
+15 -15
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/hilfe.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -146,14 +146,14 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/hilfe.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/hilfe.js?v=202609252349" defer></script>
</body>
</html>
+5 -5
View File
@@ -30,9 +30,9 @@
<link rel="preload" as="image" href="assets/img/buehne/gate-hoch-580.webp"
type="image/webp" media="(max-width: 899px)" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
</head>
<body class="gate">
@@ -427,7 +427,7 @@
<script src="assets/js/gate.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/gate.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
</body>
</html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/kalender.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -383,15 +383,15 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/kalender.js?v=202609251440" defer></script>
<script src="assets/js/kalender-abo.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/kalender.js?v=202609252349" defer></script>
<script src="assets/js/kalender-abo.js?v=202609252349" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/leistung.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -444,13 +444,13 @@
</form>
</dialog>
<script src="assets/js/meldung.js?v=202609251440"></script>
<script src="assets/js/nachfrage.js?v=202609251440"></script>
<script src="assets/js/wahl.js?v=202609251440"></script>
<script src="assets/js/bereiche.js?v=202609251440"></script>
<script src="assets/js/kopf.js?v=202609251440"></script>
<script src="assets/js/glocke.js?v=202609251440"></script>
<script src="assets/js/leistung.js?v=202609251440"></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349"></script>
<script src="assets/js/nachfrage.js?v=202609252349"></script>
<script src="assets/js/wahl.js?v=202609252349"></script>
<script src="assets/js/bereiche.js?v=202609252349"></script>
<script src="assets/js/kopf.js?v=202609252349"></script>
<script src="assets/js/glocke.js?v=202609252349"></script>
<script src="assets/js/leistung.js?v=202609252349"></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,13 +12,13 @@
vergessen wird. -->
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/material.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/material.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start" data-ton="42" data-buehne="studio">
@@ -138,14 +138,14 @@
<p class="m-laedt" id="laedt">Einen Moment …</p>
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/hochladen.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/material.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/hochladen.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/material.js?v=202609252349" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/personen.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -453,14 +453,14 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/personen.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/personen.js?v=202609252349" defer></script>
</body>
</html>
+18 -18
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -214,16 +214,16 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/hochladen.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/hochladen.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/steckbrief.js?v=202609251440" defer></script>
<script src="assets/js/profil.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/steckbrief.js?v=202609252349" defer></script>
<script src="assets/js/profil.js?v=202609252349" defer></script>
</body>
</html>
+17 -17
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -134,14 +134,14 @@
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
die seit dem 07.09. jede Seite danach absucht. -->
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/holen.js?v=202609251440" defer></script>
<script src="assets/js/rechte.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/holen.js?v=202609252349" defer></script>
<script src="assets/js/rechte.js?v=202609252349" defer></script>
</body>
</html>
+18 -18
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/report.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/report.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -106,17 +106,17 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/ki.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/holen.js?v=202609251440" defer></script>
<script src="assets/js/report.js?v=202609251440" defer></script>
<script src="assets/js/ki.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/holen.js?v=202609252349" defer></script>
<script src="assets/js/report.js?v=202609252349" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/scouting.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -173,14 +173,14 @@
</div>
</div>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/scouting.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/scouting.js?v=202609252349" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,21 +12,21 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<!-- Nur die Startseite: Begrüßungskachel, Uhr, Glockenmulde. Siehe
den Hinweis in start.css -- dort stand es bis zum 07.09.2026. -->
<link rel="stylesheet" href="assets/css/heim.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/heim.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -700,16 +700,16 @@
</p>
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/live.js?v=202609251440" defer></script>
<script src="assets/js/start.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/live.js?v=202609252349" defer></script>
<script src="assets/js/start.js?v=202609252349" defer></script>
</body>
</html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/startcheck.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -85,16 +85,16 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/ki.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/startcheck.js?v=202609251440" defer></script>
<script src="assets/js/ki.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/startcheck.js?v=202609252349" defer></script>
</body>
</html>
+18 -18
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/profil.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -150,16 +150,16 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/hochladen.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/hochladen.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/auskunft.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/steckbrief.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/auskunft.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/steckbrief.js?v=202609252349" defer></script>
</body>
</html>
+14 -14
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/support.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/support.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -128,16 +128,16 @@
(reading 'LEITUNG')" ab -- gemessen am 24.09.2026, als diese
Zeile beim Anlegen der Seite fehlte. Die Kopfleiste kam
trotzdem, deshalb sah man es nur in der Browserkonsole. -->
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<!-- wahl.js gehoert zu kopf.js: Der Sicht-Umschalter in der
Kopfleiste baut daraus seine Liste. pruef-css-klassen setzt das
seit dem 07.09.2026 durch -- damals fehlte es auf chat.html und
uebersicht.html, und heute hier. -->
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/support.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/support.js?v=202609252349" defer></script>
</body>
</html>
+18 -18
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609252349" />
<!-- Wegen des Kastens „Anfragen“ ueber der Liste. Eine eigene Kopie
der Regel hier waere die zweite Stelle, an der dieselbe Sache
anders aussieht. -->
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -111,15 +111,15 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/holen.js?v=202609251440" defer></script>
<script src="assets/js/talente.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/holen.js?v=202609252349" defer></script>
<script src="assets/js/talente.js?v=202609252349" defer></script>
</body>
</html>
+16 -16
View File
@@ -7,20 +7,20 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/team.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/team.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -110,15 +110,15 @@
</main>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/holen.js?v=202609251440" defer></script>
<script src="assets/js/team.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/holen.js?v=202609252349" defer></script>
<script src="assets/js/team.js?v=202609252349" defer></script>
</body>
</html>
+17 -17
View File
@@ -7,20 +7,20 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/team.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/team.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<!-- `data-buehne` steht hier fest und nicht im Skript: Die Kachel zu
@@ -84,15 +84,15 @@
Kaputt ist dabei nichts -- er funktioniert. Genau deshalb faellt
es niemandem auf, und deshalb prueft pruef-css-klassen die
ABHAENGIGKEIT statt der Optik. Hier hat sie angeschlagen. -->
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/holen.js?v=202609251440" defer></script>
<script src="assets/js/teamlage.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/holen.js?v=202609252349" defer></script>
<script src="assets/js/teamlage.js?v=202609252349" defer></script>
</body>
</html>
+15 -15
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -112,15 +112,15 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/teilen.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/teilen.js?v=202609252349" defer></script>
</body>
</html>
+16 -16
View File
@@ -7,14 +7,14 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -126,14 +126,14 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/treff-moderation.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/treff-moderation.js?v=202609252349" defer></script>
</body>
</html>
+16 -16
View File
@@ -7,18 +7,18 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/treff.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein. Auf der Adresse des
Rudels biegt der Server genau diesen Dateinamen auf crew-haus.css
um, und die Seite kommt schon beim ERSTEN Abruf in Lila und
Babyblau an -- ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -248,14 +248,14 @@
Beim ersten Anlauf fehlte die Zeile auf genau diesen beiden neuen
Seiten. Gefunden hat das nicht das Auge, sondern pruef-css-klassen,
die seit dem 07.09. jede Seite danach absucht. -->
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/auskunft.js?v=202609251440" defer></script>
<script src="assets/js/treff-regeln.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/auskunft.js?v=202609252349" defer></script>
<script src="assets/js/treff-regeln.js?v=202609252349" defer></script>
</body>
</html>
+16 -16
View File
@@ -12,22 +12,22 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<!-- Formular- und Dialogstile: seit dem 07.09.2026 steht hier der
Dialog "Creator anlegen". -->
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/uebersicht.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -149,16 +149,16 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/uebersicht.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/uebersicht.js?v=202609252349" defer></script>
</body>
</html>
+15 -15
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -335,14 +335,14 @@
</main>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/live.js?v=202609251440" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/live.js?v=202609252349" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609252349" defer></script>
</body>
</html>
+16 -16
View File
@@ -7,13 +7,13 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/unterstuetzen.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/unterstuetzen.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -106,17 +106,17 @@
<!-- bereiche.js VOR kopf.js: Dort steht `window.Bereiche`, und kopf.js
liest daraus die Leitungsrollen. Ohne sie stürzt jede Seite mit
„Cannot read properties of undefined (reading 'LEITUNG')" ab. -->
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/holen.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/holen.js?v=202609252349" defer></script>
<!-- Die Satz-Tafel. Ohne sie stand auf dieser Seite das Maschinenwort
des Servers (z.B. "nicht_gefunden") statt eines Satzes -- gemeldet
von pruef-meldungen, nicht beim Ansehen. -->
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/unterstuetzen.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/unterstuetzen.js?v=202609252349" defer></script>
</body>
</html>
+16 -16
View File
@@ -7,15 +7,15 @@
<meta name="robots" content="noindex, nofollow" />
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/entwicklung.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/werdegang.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -144,14 +144,14 @@
</main>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/werdegang.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/werdegang.js?v=202609252349" defer></script>
</body>
</html>
+15 -15
View File
@@ -12,13 +12,13 @@
vergessen wird. -->
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/willkommen.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<!-- KOERPERKLASSE "start", NICHT "gate" (berichtigt 21.09.2026).
`body.gate` ist die Anmeldewand: `display:flex; align-items:center`,
@@ -75,13 +75,13 @@
<p class="fehler" id="fehler" hidden></p>
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/willkommen.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/willkommen.js?v=202609252349" defer></script>
</body>
</html>
+17 -17
View File
@@ -12,20 +12,20 @@
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
eine Flaeche sind statt zweier. -->
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609252349" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609252349" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/start.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/wissen.css?v=202609252349" />
<link rel="stylesheet" href="assets/css/module.css?v=202609252349" />
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
genau diesen Dateinamen auf crew-haus.css um, und die Seite
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
ohne Umfaerben im Browser, ohne Flackern. -->
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609252349" />
</head>
<body class="start">
@@ -190,15 +190,15 @@
</main>
<script src="assets/js/meldung.js?v=202609251440" defer></script>
<script src="assets/js/hochladen.js?v=202609251440" defer></script>
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
<script src="assets/js/meldung.js?v=202609252349" defer></script>
<script src="assets/js/hochladen.js?v=202609252349" defer></script>
<script src="assets/js/nachfrage.js?v=202609252349" defer></script>
<script src="assets/js/wahl.js?v=202609251440" defer></script>
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
<script src="assets/js/installieren.js?v=202609251440" defer></script>
<script src="assets/js/kopf.js?v=202609251440" defer></script>
<script src="assets/js/glocke.js?v=202609251440" defer></script>
<script src="assets/js/wissen.js?v=202609251440" defer></script>
<script src="assets/js/wahl.js?v=202609252349" defer></script>
<script src="assets/js/bereiche.js?v=202609252349" defer></script>
<script src="assets/js/installieren.js?v=202609252349" defer></script>
<script src="assets/js/kopf.js?v=202609252349" defer></script>
<script src="assets/js/glocke.js?v=202609252349" defer></script>
<script src="assets/js/wissen.js?v=202609252349" defer></script>
</body>
</html>