Filipe: "Es darf vor allem keine Stellen geben, an denen ein Benutzer
etwas falsch machen kann, nur weil die Seite es nicht verstaendlich
genug erklaert."
Gemessen: 30 Stellen in 16 Dateien benutzten confirm() oder prompt().
Das Haus hatte die richtige Bauweise laengst -- einen <dialog>, in
aufgaben.html sogar ausfuehrlich begruendet -- aber sie stand IN EINER
SEITE. Wer anderswo etwas loeschen liess, hatte sie nicht.
confirm('Wirklich loeschen?') stellt die falsche Frage: Es fragt, ob
man sicher ist, und nennt nicht, WAS passiert, was BLEIBT und ob es
ZURUECK geht. Jetzt beantwortet jeder der 41 Dialoge alle drei.
Neu: workspace/assets/js/nachfrage.js -- window.frageNach() mit
Pflichtgrund, Zahlenfeld, einzeiliger Eingabe und Abtippsicherung.
Drei Ausgaenge: <dialog> / confirm()-Notnagel fuer Safari vor 15.4 /
Abbruch (Esc, Klick daneben, "Doch nicht" -- immer false).
DREIMAL DERSELBE FALLSTRICK, dreimal nachgemessen statt vermutet:
.dialog stand in aufgaben.css und leistung.css -> auf dateien.html
waere der Dialog ein weisser Systemkasten gewesen. 14 Regeln
klammergenau nach module.css verschoben (Klammern gezaehlt, nicht
per Muster geschnitten -- heute frueh hat ein nicht-gieriges
Muster schon einmal CSS zerrissen).
Das Formular trug .neu neu--blank -- und .neu gibt seine Abstaende
nur in aufgaben.css. Gemessen: padding 0px, und die Felder
verloren ihre height:44px. Jetzt steht alles unter
.nachfrage__form in module.css; der Dialog borgt nichts mehr.
Die erste Fassung der Pruefung zaehlte nachfrage.js SELBST als
Nutzer -- damit war jede Seite trivialerweise "Nutzer" und die
Pruefung gruen ohne Inhalt. Jetzt ausdruecklich ausgenommen.
ZWEI FUNDE NEBENBEI:
hilfeAufraeumen() wird im Betrieb NIE aufgerufen. Der Kommentar
behauptete "wird beim Start aufgerufen (siehe index.js)" -- das
war nie wahr; einziger Aufrufer ist die eigene Pruefung. Folge:
geschlossene vertrauliche Faelle bleiben unbegrenzt stehen. NICHT
eingeschaltet (das loescht echte Daten und ist Filipes
Entscheidung), sondern der Kommentar richtiggestellt.
Einen Hilfe-Fall zu schliessen ist endgueltig -- es gibt keine
Route, die ihn wieder oeffnet. Vorher stand darueber nur die
Frage nach einem Schlusswort. Jetzt sagt der Dialog es.
pruef-struktur hat meine eigene Pruefung von heute Nachmittag
erwischt: Sie bildete ihr Datum aus UTC. Beim Beheben erst
heuteLokal(datum) genommen -- die Funktion nimmt gar kein Argument
und haette still "heute" statt "+3 Tage" geliefert. Jetzt tagLokal(3),
nachgerechnet: Abstand 3 Tage.
Am Bildschirm angesehen (Rechner 1280, Handy 390): passt rein, Esc
ergibt false, Fokus liegt auf dem harmlosen Knopf, Knoepfe 44px auf
Touch. Der Platzhalter im Abtippfeld zeigte den erwarteten Namen --
das sah aus wie ein schon ausgefuelltes Feld, entfernt.
Neu: server/pruef-nachfrage.mjs -- 17/0, mit sechs Gegenproben und
beiden Richtungen (wer fragt, laedt die Datei; wer nie fragt, laedt
sie nicht -- sonst truege die Anmeldewand 4,8 KB fuer nichts).
pruef-meldungen 8/0, pruef-css-klassen gruen, pruef-struktur gruen,
pruef-leistung gruen.
818 lines
38 KiB
CSS
818 lines
38 KiB
CSS
/* =====================================================================
|
|
module.css — DIE FORM ALLER MODULE
|
|
|
|
Herausgeloest aus start.css am 07.09.2026. Diese Datei beschreibt die
|
|
SILHOUETTE der ganzen Anwendung: die abgeschnittene Ecke, das
|
|
Kantenlicht, die Eckwinkel und das Raster.
|
|
|
|
Sie wird von JEDER Seite geladen -- ausser von der Anmeldeseite
|
|
(index.html), die unangetastet bleibt.
|
|
|
|
SIE WIRD ALS LETZTE GELADEN, und das ist keine Kosmetik. Bis zum
|
|
07.09.2026 stand sie an dritter Stelle, VOR den Seitendateien. Dort
|
|
hat sie auf vier Seiten schlicht nichts bewirkt: `.call` in
|
|
calls.css, `.regel`/`.zustand`/`.ki-kasten` in automation.css,
|
|
`.unterweisung` in bereich.css und `.fortschritt` in dateien.css
|
|
setzen alle selbst `border-radius` und `box-shadow` -- gleiche
|
|
Spezifitaet, spaeter im Ladeweg, also gewinnen sie. Ergebnis war
|
|
genau das, was Filipe zu Recht bemaengelt hat: die neue Form auf
|
|
manchen Seiten, die alte auf anderen, "ueberall ein bisschen".
|
|
Als letzte Datei gewinnt die Form ueberall.
|
|
|
|
WER EINE NEUE KARTE BAUT, traegt ihren Klassennamen in die Listen
|
|
unten ein. Die Liste steht siebenmal in dieser Datei (Grundform,
|
|
Kantenlicht, Raster, Handy und dreimal Kontrastmodus) -- das ist die
|
|
schwache Stelle dieser Bauart, denn eine vergessene Kopie faellt
|
|
niemandem auf. Deshalb steht vor jeder Kopie die Marke
|
|
MODULLISTE, und `pruef-css-klassen.mjs` vergleicht alle sieben
|
|
Vorkommen miteinander: Weicht eines ab, wird die Pruefung rot.
|
|
===================================================================== */
|
|
|
|
/* =====================================================================
|
|
HUD-MODULE — die FORM ändert sich, nicht der Lack (07.09.2026)
|
|
|
|
Filipe: "DU HAST WIEDER EINE KLEINE ÄNDERUNG ÜBERALL GEMACHT ANSTATT
|
|
EINE RIESEN ÄNDERUNG."
|
|
|
|
---------------------------------------------------------------------
|
|
ER HAT RECHT, UND DER GRUND WAR IMMER DERSELBE
|
|
|
|
Ich habe dreimal das MATERIAL getauscht -- Mattglas, Leuchtschiene,
|
|
Verlauf mit Schatten -- und dreimal die FORM gelassen. Ein
|
|
abgerundetes Rechteck bleibt ein abgerundetes Rechteck. Die
|
|
Silhouette ist aber das Einzige, was man aus fünf Metern erkennt;
|
|
deshalb sah jede Änderung "wie vorher" aus.
|
|
|
|
DIE NEUE FORM:
|
|
|
|
1. DIE ECKE OBEN LINKS IST ABGESCHNITTEN. Eine Schräge statt einer
|
|
Rundung -- eine andere geometrische Klasse, und genau deshalb
|
|
fällt sie auf. Gebaut mit `clip-path`, also eine echte
|
|
Silhouette und kein aufgemalter Fleck.
|
|
2. EIN LICHT LÄUFT AUF DER KANTE, oben und über die Schräge, in der
|
|
Farbe der Kategorie -- nicht ein Rahmen rundherum (das wäre
|
|
wieder ein Kasten), sondern eine beleuchtete Oberkante.
|
|
3. ECKWINKEL UNTEN RECHTS. Zwei kurze Striche, die eine Ecke
|
|
andeuten, ohne sie zu zeichnen -- die Sprache von Peilung und
|
|
Zielmarke.
|
|
4. EIN FEINES RASTER statt Körnung. Körnung sagt "Papier", ein
|
|
Raster sagt "Messgerät".
|
|
|
|
---------------------------------------------------------------------
|
|
DREI DINGE, DIE BEIM ERSTEN ANLAUF SCHIEFGINGEN
|
|
|
|
`clip-path` SCHNEIDET DEN SCHLAGSCHATTEN AB. Deshalb liegt die Höhe
|
|
hier in `filter: drop-shadow()` und nicht in `box-shadow`: drop-shadow
|
|
folgt der WIRKLICHEN Form, box-shadow immer dem Rechteck -- er würde
|
|
einen Schatten für eine Ecke zeichnen, die es nicht mehr gibt.
|
|
|
|
DIE REGELN STANDEN IN `:where()`. Das hat Spezifität NULL, also
|
|
gewann jede ältere `.kachel::before`-Regel. Die Silhouette kam durch
|
|
(die setzt sonst niemand), das Kantenlicht nicht -- heraus kam ein
|
|
Zwitter aus neuer Form und alter Kante. Jetzt steht hier `:is()`:
|
|
Das übernimmt die Spezifität seines stärksten Arguments, also die
|
|
einer einzelnen Klasse. Damit liegt die Form gleichauf mit
|
|
`.kachel` und gewinnt über den Ladeweg -- deshalb muss diese Datei
|
|
zuletzt kommen (siehe oben).
|
|
|
|
UND SIE STAND ZU FRÜH IM LADEWEG. Siehe der Absatz ganz oben; das
|
|
war derselbe Fehler noch einmal, nur eine Ebene höher.
|
|
===================================================================== */
|
|
|
|
:root {
|
|
/* Die Schräge steht als Größe da, damit Silhouette, Kantenlicht und
|
|
Eckwinkel garantiert dieselbe benutzen. */
|
|
--fase: 18px;
|
|
/* DAS RASTER TRITT ZURUECK (09.09.2026, screen3).
|
|
|
|
Filipe: "die hintergrunde sollen ueberall so sein dass die sich
|
|
nicht in den vordergrund draengeln."
|
|
|
|
Es stand auf .26 Deckkraft. Das ist auf einer dunklen Flaeche kein
|
|
Hauch mehr, sondern ein gezeichnetes Gitter -- im Tagdialog lief es
|
|
sichtbar durch die Ueberschrift, in den Sammelkacheln stand es vor
|
|
den Karten darin. Ein Hintergrund, den man LIEST, ist kein
|
|
Hintergrund.
|
|
|
|
Jetzt .09. Das ist der Wert, bei dem man aus einem Meter Abstand
|
|
eine Struktur SIEHT, aber keine Linien ZAEHLT -- und genau das ist
|
|
der Unterschied zwischen Material und Muster. Dieselbe Ueberlegung
|
|
wie beim Kohlefasergewebe der Zentrale, das bei drei Prozent liegt.
|
|
|
|
EINE ZAHL FUER DAS GANZE HAUS: `--raster` steht hier einmal und
|
|
wird an 20 Stellen benutzt. Wer es leiser will, aendert diese eine
|
|
Zeile -- deshalb war es auch richtig, es nicht an jeder Kachel
|
|
einzeln nachzuziehen. */
|
|
--raster:
|
|
repeating-linear-gradient(0deg, rgba(150, 186, 220, .09) 0 1px, transparent 1px 26px),
|
|
repeating-linear-gradient(90deg, rgba(150, 186, 220, .09) 0 1px, transparent 1px 26px);
|
|
|
|
/* DAS STERNENFELD -- die Stelle, an der ein Haus dem Grund jeder
|
|
Kachel etwas Eigenes geben kann, OHNE die Kachelliste ein achtes
|
|
Mal abzuschreiben.
|
|
|
|
Hier steht `none`: Im Agenturhaus aendert sich dadurch kein
|
|
einziges Pixel -- eine Ebene ohne Bild zeichnet nichts. Wer ein
|
|
Haus baut, setzt diese drei Werte auf `:root` um und hat damit
|
|
jede Kachel der ganzen Adresse erwischt, auch die, die es noch
|
|
gar nicht gibt.
|
|
|
|
DREI WERTE, WEIL EIN HINTERGRUND DREI LISTEN HAT. Bild, Groesse
|
|
und Lage werden Ebene fuer Ebene einander zugeordnet. Wer nur das
|
|
Bild austauscht, bekommt die Groesse der Ebene davor -- deshalb
|
|
gehoeren sie zusammen und werden zusammen gesetzt.
|
|
|
|
Die FORM bleibt davon unberuehrt: Fase, Kantenlicht und Eckwinkel
|
|
stehen woanders. Ein Sternenfeld faerbt, es schneidet nicht. */
|
|
--sternenfeld: none;
|
|
--sternenfeld-mass: auto;
|
|
--sternenfeld-lage: 0 0;
|
|
|
|
/* Wie stark die ganze Ebene aus Raster, Eckwinkeln und Sternenfeld
|
|
durchkommt. Steht als Wert da, damit ein Haus mit eigenem Grund
|
|
ihn heben kann -- .26 bleibt der Wert des Agenturhauses. */
|
|
--modul-schleier: .26;
|
|
}
|
|
|
|
/* MODULLISTE */
|
|
: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) {
|
|
position: relative;
|
|
clip-path: polygon(var(--fase) 0, 100% 0, 100% 100%, 0 100%, 0 var(--fase));
|
|
border-radius: 0;
|
|
border: 0;
|
|
/* STUFE 1: DIE SCHRAEGE WIRD EINE ECHTE FASE.
|
|
|
|
Bisher war die abgeschnittene Ecke ein Loch -- Material, das fehlt.
|
|
Eine gefraeste Fase ist etwas anderes: Sie hat eine FLAECHE, und
|
|
auf der liegt Schatten, weil sie schraeg zum Licht steht. Genau
|
|
das macht dieser Innenschatten aus der Richtung der Schraege. Der
|
|
Unterschied ist klein zu beschreiben und gross zu sehen: Aus einer
|
|
weggeschnittenen Ecke wird ein bearbeitetes Werkstueck.
|
|
|
|
`inset` und nicht aussen: Ein aeusserer Schatten liegt hier im
|
|
`filter` (siehe unten), weil `clip-path` einen `box-shadow` nach
|
|
der Form abschneiden wuerde. Ein INNERER Schatten wird von
|
|
derselben Form sauber begrenzt -- er soll ja hineinreichen. */
|
|
box-shadow: inset 7px 7px 14px -10px rgba(0, 0, 0, .95);
|
|
filter:
|
|
drop-shadow(0 2px 3px rgba(0, 0, 0, .55))
|
|
drop-shadow(0 12px 22px rgba(0, 0, 0, .55));
|
|
}
|
|
|
|
/* DAS KANTENLICHT. Ein Layer mit derselben Silhouette, 1,6 px kleiner --
|
|
was übrig bleibt, ist eine Linie, die exakt der Form folgt, Schräge
|
|
inklusive. Ein `border` könnte das nicht: Er folgt dem Rechteck. */
|
|
/* MODULLISTE */
|
|
: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)::before {
|
|
content: "";
|
|
position: absolute; inset: 0;
|
|
pointer-events: none;
|
|
z-index: 2;
|
|
width: auto; height: auto;
|
|
opacity: 1;
|
|
background: linear-gradient(158deg,
|
|
color-mix(in srgb, var(--ton, var(--akzent)) 90%, #ffffff) 0%,
|
|
color-mix(in srgb, var(--ton, var(--akzent)) 60%, transparent) 15%,
|
|
rgba(150, 186, 220, .20) 45%,
|
|
rgba(150, 186, 220, .07) 100%);
|
|
clip-path: polygon(
|
|
var(--fase) 0, 100% 0, 100% 100%, 0 100%, 0 var(--fase),
|
|
1.6px calc(var(--fase) + 0.7px), 1.6px calc(100% - 1.6px),
|
|
calc(100% - 1.6px) calc(100% - 1.6px), calc(100% - 1.6px) 1.6px,
|
|
calc(var(--fase) + 0.7px) 1.6px, 1.6px calc(var(--fase) + 0.7px),
|
|
0 var(--fase));
|
|
}
|
|
|
|
/* RASTER UND ECKWINKEL. Beides auf ::after -- ein drittes Element gibt
|
|
es nicht, und beides ist reine Optik ohne Klicks. */
|
|
/* MODULLISTE */
|
|
: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)::after {
|
|
content: "";
|
|
position: absolute; inset: 0;
|
|
pointer-events: none;
|
|
z-index: 0;
|
|
/* STUFE 2: ECKWINKEL AN DREI ECKEN STATT AN EINER.
|
|
|
|
Eine einzelne Ecke unten rechts liest sich als Verzierung. Drei
|
|
Ecken lesen sich als RAHMUNG -- das Auge schliesst sie zu einem
|
|
Ausschnitt, und genau diese Sprache benutzen Peilung, Zielmarke
|
|
und Messgeraet.
|
|
|
|
Die vierte Ecke bleibt frei, und das ist Absicht: Dort sitzt die
|
|
Fase. Ein Winkel auf einer abgeschnittenen Ecke waere ein Winkel,
|
|
der ins Leere zeigt.
|
|
|
|
Sechs Verlaufsebenen fuer sechs Striche. Jede Ebene ist eine
|
|
einfarbige Flaeche, die durch `background-size` auf einen Strich
|
|
zusammenschrumpft -- billiger als sechs Elemente im Baum, und sie
|
|
wandern beim Groessenwechsel automatisch mit. */
|
|
--winkel: linear-gradient(var(--ton, var(--akzent)), var(--ton, var(--akzent))) no-repeat;
|
|
background:
|
|
var(--winkel), var(--winkel), /* unten rechts */
|
|
var(--winkel), var(--winkel), /* oben rechts */
|
|
var(--winkel), var(--winkel), /* unten links */
|
|
var(--raster),
|
|
var(--sternenfeld, none);
|
|
background-size:
|
|
18px 1.5px, 1.5px 18px,
|
|
18px 1.5px, 1.5px 18px,
|
|
18px 1.5px, 1.5px 18px,
|
|
26px 26px, 26px 26px,
|
|
var(--sternenfeld-mass, auto);
|
|
background-position:
|
|
right 10px bottom 10px, right 10px bottom 10px,
|
|
right 10px top 10px, right 10px top 10px,
|
|
left 10px bottom 10px, left 10px bottom 10px,
|
|
0 0, 0 0,
|
|
var(--sternenfeld-lage, 0 0);
|
|
/* .3 war zu laut: Das Raster soll man nicht LESEN, sondern spueren.
|
|
Bei 26 px Abstand und einem Viertel Deckkraft bleibt der Eindruck
|
|
"Messgeraet", ohne dass die Linien mit dem Text konkurrieren. */
|
|
opacity: var(--modul-schleier, .26);
|
|
transform: none;
|
|
}
|
|
|
|
/* Der Inhalt gehört ÜBER Raster und Kantenlicht. Ohne diese Zeile
|
|
liegt bei Karten ohne eigenen Stapelwert der Text unter dem Raster
|
|
und wird von ihm überzeichnet.
|
|
|
|
`:not(.licht)` IST KEINE FEINHEIT, SONDERN DIE REPARATUR EINES
|
|
FEHLERS, DEN DIESE ZEILE SELBST VERURSACHT HAT (07.09.2026).
|
|
|
|
Das Licht, das dem Zeiger folgt, ist ein <span class="licht"> und
|
|
damit ein direktes Kind jeder Karte. `position: relative` hat ihm
|
|
sein `position: absolute` genommen: Aus einer Fläche über der ganzen
|
|
Karte wurde ein leerer Inline-Span ohne Ausdehnung. Im Browser
|
|
gemessen -- `display: inline`, obwohl in start.css `absolute`
|
|
steht -- und genau deshalb war das Licht weg, das Filipe
|
|
zurückhaben wollte.
|
|
|
|
Merksatz: Eine Regel auf `> *` trifft auch das, was gar kein Inhalt
|
|
ist. Wer sie schreibt, muss wissen, was sonst noch als Kind in
|
|
diesen Karten liegt. */
|
|
:is(.eintrag-karte, .call, .datei, .kachel, .leer-hinweis,
|
|
.team-karte, .zahl, .k-listentag, .person, .creator) > *:not(.licht) {
|
|
position: relative;
|
|
z-index: 1;
|
|
}
|
|
|
|
/* Beim Anfassen kommt das Modul NÄHER, es leuchtet nicht auf. */
|
|
:is(.kachel, .datei, .pdf, .creator, .person, .kk, .call, .team-karte):hover {
|
|
transform: translateY(-3px);
|
|
box-shadow: none;
|
|
filter:
|
|
drop-shadow(0 4px 6px rgba(0, 0, 0, .6))
|
|
drop-shadow(0 20px 34px rgba(0, 0, 0, .6))
|
|
drop-shadow(0 0 14px color-mix(in srgb, var(--ton, var(--akzent)) 30%, transparent));
|
|
}
|
|
:is(.kachel, .datei, .pdf, .creator, .person, .kk, .call, .team-karte) {
|
|
transition: transform var(--tempo), filter var(--tempo);
|
|
}
|
|
|
|
@media (max-width: 620px) {
|
|
/* Dieselbe Form, kleiner -- keine zweite Gestaltung. */
|
|
:root { --fase: 12px; }
|
|
/* MODULLISTE */
|
|
: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) {
|
|
filter: drop-shadow(0 3px 8px rgba(0, 0, 0, .7));
|
|
}
|
|
}
|
|
|
|
@media (prefers-reduced-motion: reduce) {
|
|
:is(.kachel, .datei, .pdf, .creator, .person, .kk, .call, .team-karte):hover {
|
|
transform: none;
|
|
}
|
|
}
|
|
@media (forced-colors: active) {
|
|
/* Im Kontrastmodus zählt die Kante, und die muss ein echter `border`
|
|
sein. Die Schräge bleibt: Sie ist Geometrie, keine Farbe. */
|
|
/* MODULLISTE */
|
|
: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) {
|
|
filter: none; border: 1px solid CanvasText;
|
|
}
|
|
/* MODULLISTE */
|
|
: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)::after {
|
|
display: none;
|
|
}
|
|
/* MODULLISTE */
|
|
: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)::before {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
|
|
/* =====================================================================
|
|
STUFE 3: DAS ZEICHEN BEKOMMT EINE METALLFASSUNG (07.09.2026)
|
|
|
|
Filipe: "perfektionier alle kacheln die du vorhin gewechselt hast auf
|
|
der ganzen website, mach sie alle noch geiler und geiler und noch
|
|
spezieller. sie gehen aber in eine gute richtung schon."
|
|
|
|
Die Plakette war ein abgerundetes Quadrat mit einem Farbschleier --
|
|
also dieselbe Form wie ueberall sonst im Netz. Sie wird jetzt zu
|
|
einem GEFASSTEN Schild:
|
|
|
|
* dieselbe abgeschnittene Ecke wie die Karte, nur kleiner. Ein
|
|
Bauteil, das zu seinem Gehaeuse passt.
|
|
* ein 2 px breiter Ring aus gebuerstetem Metall -- dieselbe
|
|
Handschrift wie die Luenette der Uhr und die Fassung der
|
|
Konsole. Damit spricht die ganze Anwendung EINE Materialsprache
|
|
statt drei.
|
|
* die Farbe der Kategorie liegt INNEN, im Schild, nicht im Ring.
|
|
So bleibt der Ring ueberall gleich und das Schild verschieden --
|
|
genau die Aufteilung, die ein Typenschild auf einem Geraet hat.
|
|
|
|
Diese Regeln stehen HIER und nicht in start.css: module.css wird
|
|
zuletzt geladen und ist der Ort fuer die FORM. In start.css
|
|
beschriebe man dieselbe Sache noch einmal an zweiter Stelle, und die
|
|
beiden liefen beim naechsten Mal auseinander.
|
|
===================================================================== */
|
|
.kachel__zeichen {
|
|
--z-fase: 9px;
|
|
position: relative;
|
|
border: 0;
|
|
border-radius: 0;
|
|
padding: 2px;
|
|
overflow: visible;
|
|
clip-path: polygon(
|
|
var(--z-fase) 0, 100% 0, 100% 100%, 0 100%, 0 var(--z-fase));
|
|
/* Gebuerstetes Metall, rund gedreht -- rund heisst conic. Die Lehre
|
|
von heute Nachmittag: Die Verlaufsart muss zur FORM passen. */
|
|
/* GEDAEMPFT, aber mit demselben Wechsel. Der erste Anlauf war fast
|
|
weiss -- auf 2 px Breite las sich das als greller Rahmen, und die
|
|
Fassung zog mehr Aufmerksamkeit als das Zeichen darin. Eine
|
|
Fassung ist Beiwerk; sie soll das Schild halten, nicht mit ihm
|
|
konkurrieren. Also dieselben Stopps, nur eine Blende dunkler --
|
|
der Wechsel hell/dunkel bleibt, und mit ihm das Metall. */
|
|
background:
|
|
conic-gradient(from 210deg,
|
|
#b9c8da 0deg, #5a6b80 44deg, #d6e2ef 88deg, #44536a 140deg,
|
|
#aebdd0 196deg, #64758c 244deg, #cddaea 296deg, #4e5d73 340deg,
|
|
#b9c8da 360deg);
|
|
box-shadow:
|
|
0 6px 16px -8px rgba(0, 0, 0, .9),
|
|
0 0 0 1px rgba(6, 10, 18, .55),
|
|
/* DAS LICHT DES SCHILDES FAELLT AUF DIE KACHEL. Ein beleuchteter
|
|
Gegenstand wirft Farbe auf seine Umgebung -- ohne diesen Abfall
|
|
sieht selbst ein gut gebautes Schild aufgeklebt aus. Sehr weit
|
|
gestreut und weit unter der Blendschwelle: Man soll ihn nicht
|
|
sehen, man soll ihn vermissen, wenn er fehlt. */
|
|
0 10px 42px -14px color-mix(in srgb, var(--ton, var(--akzent)) 75%, transparent);
|
|
}
|
|
/* Das Schild IM Ring -- hier liegt die Farbe der Kategorie. */
|
|
.kachel__zeichen::before {
|
|
content: "";
|
|
position: absolute; inset: 2px;
|
|
z-index: 0;
|
|
pointer-events: none;
|
|
clip-path: polygon(
|
|
calc(var(--z-fase) - 2px) 0, 100% 0, 100% 100%, 0 100%,
|
|
0 calc(var(--z-fase) - 2px));
|
|
background:
|
|
linear-gradient(150deg, rgba(255, 255, 255, .20) 0%, rgba(255, 255, 255, .04) 26%, transparent 52%),
|
|
radial-gradient(120% 100% at 22% 8%,
|
|
color-mix(in srgb, var(--ton, var(--akzent)) 58%, transparent) 0%,
|
|
color-mix(in srgb, var(--ton, var(--akzent)) 26%, transparent) 48%,
|
|
color-mix(in srgb, var(--ton, var(--akzent)) 10%, transparent) 100%),
|
|
linear-gradient(#0a0f18, #0a0f18);
|
|
}
|
|
/* Beim Anfassen hebt sich das Schild leicht -- kein Leuchten, nur
|
|
Naehe. Dieselbe Sprache wie bei der Karte selbst. */
|
|
.kachel:hover .kachel__zeichen {
|
|
transform: translateY(-1px);
|
|
border-color: transparent;
|
|
box-shadow:
|
|
0 10px 22px -9px rgba(0, 0, 0, .95),
|
|
0 0 0 1px rgba(6, 10, 18, .55),
|
|
0 0 14px -4px color-mix(in srgb, var(--ton, var(--akzent)) 55%, transparent);
|
|
}
|
|
/* DIE GROSSE KACHEL FUEHRT IHRE EIGENE RUNDUNG -- zweimal sogar
|
|
(start.css, 21 px und 18 px), und beide sind mit `.kachel[…] .x`
|
|
staerker als eine einzelne Klasse. Gemessen: `border-radius: 18px`,
|
|
obwohl module.css `0` setzt und zuletzt geladen wird. Die Fase kam
|
|
durch (die setzt sonst niemand), die Rundung blieb -- heraus kam ein
|
|
Schild mit abgeschnittener Ecke UND runden Ecken.
|
|
|
|
Dieselbe Falle wie heute schon zweimal: `:where()` war zu schwach,
|
|
`body.start .willkommen` zu stark, und hier ist es die Verschachtelung.
|
|
Deshalb steht die Antwort hier mit derselben Gewichtung wie die
|
|
Rundung, die sie ersetzt. */
|
|
.kachel[data-gross="ja"] .kachel__zeichen,
|
|
.kachel .kachel__zeichen {
|
|
--z-fase: 11px;
|
|
border-radius: 0;
|
|
}
|
|
|
|
@media (forced-colors: active) {
|
|
/* Im Kontrastmodus zaehlt die Kante. Die Fase bleibt -- sie ist
|
|
Geometrie, keine Farbe. */
|
|
.kachel__zeichen { background: Canvas; border: 1px solid CanvasText; box-shadow: none; }
|
|
.kachel__zeichen::before { display: none; }
|
|
}
|
|
|
|
|
|
/* =====================================================================
|
|
DIE TAGESKACHEL "WAS IST DRAN" (07.09.2026)
|
|
|
|
Filipe: "soll auch besser und auffaelliger aussehen bitte."
|
|
|
|
Sie bestand aus drei abgerundeten Zeilen mit einem Farbstreifen
|
|
links -- also aus der Form, die es hier bis heute Frueh ueberall
|
|
gab. Sie bekommt jetzt dieselbe Behandlung wie alles andere, und
|
|
zwar konsequent:
|
|
|
|
* Die drei Zeilen sind MODULE. `.dran__punkt` steht seit heute in
|
|
der Modulliste oben: abgeschnittene Ecke, Kantenlicht in der
|
|
Farbe des Bereichs, Eckwinkel, Fase. Damit sind sie kleine
|
|
Ausgaben derselben Bauteile, zu denen sie fuehren -- was sie ja
|
|
auch sind.
|
|
* Die ZAHL wird zum gefassten Schild, wie das Zeichen auf den
|
|
Kacheln. Sie ist die eigentliche Aussage der Zeile ("EINS
|
|
wartet"), und sie stand bisher als blosse Ziffer daneben.
|
|
* Zwischen den beiden Haelften laeuft eine gefraeste Nut statt
|
|
einer Linie -- dieselbe Sprache wie auf der Konsole.
|
|
===================================================================== */
|
|
|
|
/* Der Farbstreifen links entfaellt: Die Zeile hat jetzt ein
|
|
Kantenlicht, und beides zusammen waeren zwei Kanten fuer dieselbe
|
|
Aussage. */
|
|
.dran__punkt::before { width: 0; }
|
|
|
|
.dran__zahl {
|
|
--z-fase: 7px;
|
|
display: grid; place-items: center;
|
|
min-width: 30px; min-height: 26px;
|
|
padding: 2px;
|
|
font-size: 1.02rem;
|
|
/* DIE FARBE BLEIBT IN DER ZIFFER, nicht im Schild.
|
|
|
|
Im ersten Anlauf stand hier Weiss, weil das auf Metall gut
|
|
aussieht. Damit war die Aussage weg: Die Zahl traegt die Farbe des
|
|
Bereichs, zu dem die Zeile fuehrt -- und bei etwas Ueberfaelligem
|
|
die Warnfarbe. Das ist kein Schmuck, sondern die schnellste
|
|
Auskunft der ganzen Kachel. pruef-start-ansicht hat es sofort
|
|
gemeldet ("ueberfaellige Zeilen sind rot": weiss statt rot), und
|
|
die Pruefung hatte recht.
|
|
|
|
Das Schild darunter bleibt deshalb fast neutral -- nur eine Spur
|
|
Farbton, damit die Ziffer nicht auf Grau steht. */
|
|
color: var(--ton, var(--akzent));
|
|
text-align: center;
|
|
clip-path: polygon(var(--z-fase) 0, 100% 0, 100% 100%, 0 100%, 0 var(--z-fase));
|
|
background:
|
|
conic-gradient(from 210deg,
|
|
#b9c8da 0deg, #5a6b80 44deg, #d6e2ef 88deg, #44536a 140deg,
|
|
#aebdd0 196deg, #64758c 244deg, #cddaea 296deg, #4e5d73 340deg,
|
|
#b9c8da 360deg);
|
|
box-shadow: 0 4px 12px -7px rgba(0, 0, 0, .9), 0 0 0 1px rgba(6, 10, 18, .5);
|
|
}
|
|
/* Das Schild IM Ring traegt die Farbe des Bereichs -- wie bei den
|
|
Kacheln liegt die Farbe innen, das Metall bleibt ueberall gleich. */
|
|
.dran__zahl::before {
|
|
content: ""; position: absolute; inset: 2px; z-index: -1;
|
|
clip-path: polygon(
|
|
calc(var(--z-fase) - 2px) 0, 100% 0, 100% 100%, 0 100%,
|
|
0 calc(var(--z-fase) - 2px));
|
|
background:
|
|
linear-gradient(150deg, rgba(255, 255, 255, .10) 0%, transparent 48%),
|
|
linear-gradient(color-mix(in srgb, var(--ton, var(--akzent)) 14%, #080d15),
|
|
color-mix(in srgb, var(--ton, var(--akzent)) 6%, #080d15));
|
|
}
|
|
.dran__zahl { position: relative; isolation: isolate; }
|
|
|
|
/* Die Nut zwischen "Was ist dran" und "Heute". Dunkel auf der
|
|
Lichtseite, hell auf der Schattenseite -- so liest sich eine
|
|
Vertiefung. Eine aufgemalte Linie kann das nicht. */
|
|
.tagesblick__seite--heute::before {
|
|
content: ""; position: absolute;
|
|
left: -21px; top: -6px; bottom: -6px; width: 2px;
|
|
pointer-events: none;
|
|
background: linear-gradient(90deg,
|
|
rgba(0, 0, 0, .75) 0 1px,
|
|
rgba(255, 255, 255, .12) 1px 2px);
|
|
}
|
|
|
|
@media (forced-colors: active) {
|
|
.dran__zahl { background: Canvas; box-shadow: none; border: 1px solid CanvasText; }
|
|
.dran__zahl::before { display: none; }
|
|
.tagesblick__seite--heute::before { background: CanvasText; }
|
|
}
|
|
|
|
/* =====================================================================
|
|
TIPPZIELE AUF GERÄTEN, DIE MIT DEM FINGER BEDIENT WERDEN
|
|
(19.09.2026)
|
|
|
|
Diese Regel stand zuerst in `start.css` — und griff nicht. Der Grund
|
|
ist die Ladereihenfolge: Jede Seite lädt `gate → start → seite →
|
|
module → haus`. `aufgaben.css` setzt `.schnitt { min-height: 38px }`
|
|
mit derselben Stärke, kommt aber SPÄTER und gewinnt damit.
|
|
|
|
Gefunden hat das nicht das Lesen, sondern der Rundgang: Nach der
|
|
Änderung meldete er `.schnitt` unverändert mit 38 px. Eine Regel, die
|
|
man geschrieben hat und die nicht ankommt, sieht im Editor genauso
|
|
aus wie eine, die wirkt.
|
|
|
|
`module.css` ist die vorletzte Datei und schlägt damit jede
|
|
Seitendatei. `haus.css` bleibt die letzte — dort geht es um Farben
|
|
des Hauses, nicht um Maße.
|
|
|
|
WARUM `pointer: coarse` UND NICHT EINE BREITE: Die Frage ist nicht,
|
|
wie breit der Bildschirm ist, sondern womit jemand tippt. Ein
|
|
schmales Browserfenster am Rechner wird mit der Maus bedient und
|
|
braucht keine 44 px; ein 1200 px breites Tablet sehr wohl. Eine
|
|
Breite hätte beide Fälle falsch beantwortet.
|
|
===================================================================== */
|
|
@media (pointer: coarse) {
|
|
.filterreihe__knopf, .k-chip, .k-ansicht, .marke-tag, .tag-knopf,
|
|
.schnitt, .creator-knopf, .tagzeile__knopf, .starthilfe__beispiel,
|
|
.t-kuemmern__knopf, .bw-kuemmern__knopf, .wecker-knopf, .wahl2__knopf {
|
|
min-height: 44px;
|
|
}
|
|
/* Die Kalenderpfeile und das Rechtefeld waren zu SCHMAL, nicht zu
|
|
niedrig -- 38 bzw. 34 px. Ein Pfeil, den man nicht trifft, blättert
|
|
nicht. */
|
|
#zurueck-zeit, #vor-zeit, .rechte-feld, .k-pfeil {
|
|
min-width: 44px; min-height: 44px;
|
|
}
|
|
/* Nachgetragen nach dem zweiten Lauf -- der Rundgang hat sie einzeln
|
|
benannt, statt dass ich sie hätte raten müssen. */
|
|
.knopf, .k-pille { min-height: 44px; }
|
|
.k-pille { display: inline-flex; align-items: center; }
|
|
/* Der Ersatzknopf der Auswahlfelder ist `width: 100%` -- in einer
|
|
schmalen Spalte wird er damit 34 px breit. Lieber einmal über den
|
|
Rand als dauerhaft nicht zu treffen. */
|
|
/* AN DER HUELLE, NICHT AM KNOPF (berichtigt 19.09.2026).
|
|
|
|
Erst stand hier nur `.wahl2__knopf { min-width: 44px }` -- und der
|
|
Knopf blieb 34 px. Der Grund liegt eine Ebene hoeher: start.css
|
|
setzt auf dem Handy `.wahl2 { min-width: 0 }`, damit schmale
|
|
Geraete nicht waagerecht schieben muessen. Die Huelle schrumpft
|
|
also auf 34 px, und der Knopf darin ist `width: 100%`.
|
|
|
|
Eine Mindestbreite am Kind gegen eine Null am Elternteil ist ein
|
|
Kampf, den das Kind nicht gewinnt. Also bekommt die Huelle ihre
|
|
44 px -- und der Knopf folgt von selbst. Die urspruengliche
|
|
Absicht (kein waagerechtes Schieben) bleibt gewahrt: 44 px ist
|
|
schmaler als jedes Feld vorher. */
|
|
.wahl2, .wahl2__knopf { min-width: 44px; }
|
|
/* Und die Filterknoepfe waren 41 statt 44 breit -- drei Pixel, die
|
|
der Rundgang sechsmal gemeldet hat. */
|
|
.filterreihe__knopf, .k-chip { min-width: 44px; }
|
|
}
|
|
|
|
|
|
/* =====================================================================
|
|
DER DIALOG — hierher verschoben am 19.09.2026
|
|
|
|
Er stand in `aufgaben.css` und `leistung.css`. Das war richtig,
|
|
solange nur diese zwei Seiten einen Dialog hatten. Seit es
|
|
`nachfrage.js` gibt, kann JEDE Seite nachfragen, bevor etwas weg
|
|
ist -- und auf einer Seite, die `aufgaben.css` nicht laedt, waere
|
|
der Dialog ungestaltet gewesen: weisser Kasten, Systemschrift,
|
|
mitten auf einer dunklen Seite.
|
|
|
|
`module.css` laedt auf jeder Seite (vorletzte Datei, direkt vor
|
|
`haus.css`). Was mehr als eine Seite benutzt, gehoert hierher.
|
|
|
|
In `aufgaben.css` bleibt genau eine Regel: `.dialog__knoepfe
|
|
#b-loeschen` -- die haengt an einer ID, die es nur dort gibt.
|
|
===================================================================== */
|
|
/* =====================================================================
|
|
DIALOGE (07.09.2026 überarbeitet)
|
|
|
|
Filipe zu zwei davon: "lass alles in dieser kachel viel spezieller und
|
|
geiler aussehen" und "dass soll auch viel besser aussehen".
|
|
|
|
Er hatte recht, und der Grund war nicht Geschmack: Ein Dialog war
|
|
bisher ein grauer Kasten (`background: #0b1018`, ein Rand, fertig) --
|
|
während die Seite dahinter aus beleuchteten Platten mit Schienen,
|
|
Körnung und Glanz besteht. Beim Öffnen fiel man aus dem einen
|
|
Material ins andere.
|
|
|
|
Jetzt trägt er dieselbe Sprache wie alles übrige:
|
|
- Leuchtschiene links, im Hausakzent
|
|
- Kopfzeile abgesetzt mit einer feinen Fuge
|
|
- Körnung und ein fester Glanz von links oben
|
|
- Materialstärke: Licht oben, Schatten unten
|
|
Und er ist deutlich TIEFER als vorher (#0b1018 war ein helles Grau
|
|
gegen das, was jetzt hinter ihm liegt) -- ein Dialog muss sich vom
|
|
Untergrund abheben, sonst schwimmt er darin.
|
|
|
|
Der Hintergrund dahinter wird STÄRKER abgedunkelt und weicher
|
|
gezeichnet: Ein Dialog ist der einzige Ort, an dem ein Weichzeichner
|
|
richtig ist -- er soll das Dahinter ausdrücklich zurücktreten
|
|
lassen. Genau dafür ist er gemacht, und genau deshalb war er unter
|
|
den Kacheln falsch.
|
|
===================================================================== */
|
|
.dialog {
|
|
position: relative;
|
|
width: min(580px, calc(100vw - 32px));
|
|
padding: 0;
|
|
border: 1px solid rgba(150, 186, 220, .16);
|
|
/* DIE FASE STATT RUNDER ECKEN (08.09.2026).
|
|
|
|
Filipe: "alles was sie sehen soll dan auch nach der neuen struktur
|
|
aufgebaut sein" -- und ein Dialog ist das, was man am genauesten
|
|
ansieht, weil er alles andere verdeckt.
|
|
|
|
Er kann NICHT in die Modulliste von module.css: Die belegt
|
|
`::before` und `::after` fuer die Eckwinkel, und beide sind hier
|
|
schon vergeben -- an die Leuchtschiene links und den Lichtsaum.
|
|
Beides gegen zwei Winkel zu tauschen waere ein Rueckschritt.
|
|
Deshalb hier nur der Zuschnitt, von Hand, mit derselben Groesse
|
|
`--fase` wie ueberall. Wer die Fase spaeter aendert, aendert sie
|
|
hier mit. */
|
|
clip-path: polygon(var(--fase, 18px) 0, 100% 0, 100% 100%, 0 100%, 0 var(--fase, 18px));
|
|
border-radius: 0;
|
|
background:
|
|
linear-gradient(90deg,
|
|
color-mix(in srgb, var(--akzent) 16%, transparent) 0%,
|
|
color-mix(in srgb, var(--akzent) 5%, transparent) 14%,
|
|
transparent 40%),
|
|
linear-gradient(163deg, #141c29 0%, #0a0e17 58%, #070a11 100%);
|
|
color: var(--text);
|
|
box-shadow:
|
|
inset 0 1px 0 rgba(255, 255, 255, .10),
|
|
inset 0 -1px 0 rgba(0, 0, 0, .55),
|
|
inset 2px 0 0 -1px color-mix(in srgb, var(--akzent) 34%, transparent),
|
|
0 30px 70px -24px rgba(0, 0, 0, .92),
|
|
0 4px 12px -6px rgba(0, 0, 0, .7);
|
|
overflow: hidden;
|
|
}
|
|
|
|
/* Die Leuchtschiene -- dieselbe wie an jeder Kachel. */
|
|
.dialog::before {
|
|
content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px;
|
|
border-radius: 4px 0 0 4px;
|
|
background: linear-gradient(180deg,
|
|
color-mix(in srgb, var(--akzent) 55%, #fff) 0%,
|
|
var(--akzent) 26%,
|
|
color-mix(in srgb, var(--akzent) 48%, transparent) 100%);
|
|
box-shadow:
|
|
0 0 9px 0 color-mix(in srgb, var(--akzent) 55%, transparent),
|
|
3px 0 20px -3px color-mix(in srgb, var(--akzent) 42%, transparent);
|
|
z-index: 2;
|
|
}
|
|
|
|
/* Glanz und Körnung. `pointer-events: none` ist Pflicht: Ohne das läge
|
|
eine unsichtbare Fläche über dem ganzen Formular, und kein einziges
|
|
Feld wäre anklickbar. */
|
|
.dialog::after {
|
|
content: ""; position: absolute; inset: 0; pointer-events: none;
|
|
border-radius: inherit;
|
|
background:
|
|
linear-gradient(122deg,
|
|
rgba(255, 255, 255, .075) 0%,
|
|
rgba(255, 255, 255, .020) 15%,
|
|
transparent 34%);
|
|
/* Ohne Körnung -- siehe die Begründung in automation.css: Auf einer
|
|
Ebene mit der Spiegelung erbt sie deren Deckkraft und wird zum
|
|
grauen Schleier. */
|
|
opacity: .55;
|
|
z-index: 1;
|
|
}
|
|
|
|
.dialog > * { position: relative; z-index: 2; }
|
|
|
|
.dialog::backdrop {
|
|
background: rgba(2, 4, 8, .78);
|
|
backdrop-filter: blur(6px) saturate(80%);
|
|
}
|
|
|
|
/* Der Kopf steht auf einer eigenen Stufe: Überschrift, darunter der
|
|
erklärende Satz, darunter eine feine Fuge. Ohne diese Trennung
|
|
verschwimmt die Ansage mit dem ersten Feld -- und genau die Ansage
|
|
ist das, was den Dialog erklärt. */
|
|
.dialog__titel {
|
|
margin: 0 0 4px;
|
|
font-size: 1.24rem; font-weight: 700; letter-spacing: -.015em;
|
|
color: #f2f7fd;
|
|
}
|
|
|
|
.dialog__unter {
|
|
margin: 0 0 16px; padding-bottom: 16px;
|
|
border-bottom: 1px solid rgba(150, 186, 220, .12);
|
|
font-size: .87rem; line-height: 1.55;
|
|
color: var(--text-leise);
|
|
}
|
|
|
|
/* Hat ein Dialog keine Erklärung, muss die Fuge trotzdem da sein --
|
|
sonst hängt die Überschrift am ersten Feld. */
|
|
.dialog__titel:last-of-type,
|
|
.dialog__unter:empty { border-bottom: 0; }
|
|
|
|
.dialog__unter:empty {
|
|
margin: 0 0 16px; padding-bottom: 16px;
|
|
border-bottom: 1px solid rgba(150, 186, 220, .12);
|
|
}
|
|
|
|
.dialog__knoepfe { display: flex; gap: 10px; align-items: center; margin-top: 16px; flex-wrap: wrap; }
|
|
|
|
/* ---------- Der Dialog --------------------------------------------------- */
|
|
|
|
.dialog__unter {
|
|
margin: -4px 0 14px;
|
|
font-size: .85rem; color: var(--text-still);
|
|
max-width: 60ch; line-height: 1.5;
|
|
}
|
|
|
|
/* ---------- Der Import --------------------------------------------------- */
|
|
|
|
.dialog--breit { max-width: 720px; }
|
|
|
|
.dialog__unter--still { font-size: .8rem; color: var(--text-still); }
|
|
|
|
/* Ein Fenster, das laenger ist als der Bildschirm, versteckt seine
|
|
eigenen Knoepfe. Gerollt wird INNEN, damit "Uebernehmen" immer
|
|
erreichbar bleibt. */
|
|
.dialog--breit .neu { max-height: min(86vh, 900px); overflow-y: auto; }
|
|
|
|
/* ---- Die zwei Zeilen, die confirm() nicht kann ---------------------
|
|
`nachfrage.js` baut den Dialog; diese beiden Teile gibt es nur dort.
|
|
|
|
Die Endgueltig-Zeile ist der wichtigste Satz im ganzen Dialog --
|
|
sie beantwortet die einzige Frage, die vor einem Loeschen zaehlt.
|
|
Deshalb bekommt sie eine eigene Farbe UND ein Zeichen davor: Farbe
|
|
allein traegt keine Aussage (Rot-Gruen-Schwaeche, Kontrastmodus),
|
|
und im Kontrastmodus wird `color` ohnehin ersetzt. Das Zeichen
|
|
bleibt in jedem Fall. */
|
|
.nachfrage__endgueltig {
|
|
margin: 0 0 4px;
|
|
padding: 8px 10px;
|
|
font-size: .86rem;
|
|
line-height: 1.45;
|
|
color: #ffd9d2;
|
|
background: rgba(190, 74, 60, .13);
|
|
border-left: 3px solid rgba(214, 96, 80, .62);
|
|
}
|
|
.nachfrage__endgueltig::before { content: "! "; font-weight: 800; }
|
|
|
|
/* Der Fehler IM Dialog (z. B. fehlender Grund). Er darf nicht
|
|
aussehen wie der Fehlerstreifen der Seite dahinter -- der ist
|
|
verdeckt, dieser hier gehoert zum Formular. Leer nimmt er keinen
|
|
Platz weg, sonst rutschten die Knoepfe beim ersten Fehler. */
|
|
.nachfrage__fehler { margin: 0; font-size: .86rem; color: #ffb4a8; }
|
|
.nachfrage__fehler:empty { display: none; }
|
|
|
|
/* Am Handy klebt der Dialog sonst am oberen Rand und die Knoepfe
|
|
liegen unter der Tastatur. Er waechst von unten, wie ein Blatt,
|
|
das hochgezogen wird -- das ist dort die gewohnte Richtung. */
|
|
@media (max-width: 560px) {
|
|
.nachfrage { margin: auto auto 0; width: 100vw; max-width: 100vw; }
|
|
}
|
|
|
|
@media (forced-colors: active) {
|
|
.nachfrage__endgueltig { border-left: 3px solid CanvasText; background: Canvas; }
|
|
}
|
|
|
|
/* Der kleine Hinweis unter einem Feld im Nachfrage-Dialog ("Du kannst
|
|
bis zu 14 Tage geben"). Er steht UNTER dem Feld, nicht daneben:
|
|
daneben rutscht er am Handy weg, und dort liest ihn niemand. */
|
|
.nachfrage__hinweis { margin: 4px 0 0; font-size: .8rem; color: var(--text-still); }
|
|
.nachfrage__hinweis:empty { display: none; }
|
|
|
|
/* ---- Der Dialog steht auf eigenen Füßen ---------------------------
|
|
NACHGEMESSEN AM 19.09.2026, und es war genau derselbe Fehler wie
|
|
bei `.dialog` selbst: Das Formular trug erst die Klassen
|
|
`neu neu--blank` — und `.neu` gibt seine Abstände NUR in
|
|
`aufgaben.css`. Gemessen auf einer Seite ohne diese Datei:
|
|
`padding: 0px`. Der Text klebte am Rand, und die Eingabefelder
|
|
verloren ihre `height: 44px` — also ausgerechnet die Größe, die
|
|
ein Daumen trifft.
|
|
|
|
Am Bildschirm sah es trotzdem "irgendwie richtig" aus, weil die
|
|
Schrift und die Farben aus `gate.css` kamen. Solche Abhängigkeiten
|
|
sieht man nicht, man misst sie.
|
|
|
|
Deshalb steht hier alles, was der Dialog braucht — er borgt nichts
|
|
mehr aus einer Seitendatei. `.knopf`, `.abmelden` und `.feld-schild`
|
|
bleiben: die stehen in `gate.css` bzw. `start.css`, und die lädt
|
|
jede Seite. */
|
|
.nachfrage__form { margin: 0; padding: 20px; display: grid; gap: 10px; }
|
|
.nachfrage__zeile { display: grid; gap: 5px; }
|
|
.nachfrage__form input,
|
|
.nachfrage__form textarea {
|
|
width: 100%;
|
|
box-sizing: border-box;
|
|
font: inherit;
|
|
color: var(--text);
|
|
background: var(--tinte);
|
|
border: 1px solid var(--rand);
|
|
border-radius: var(--radius, 10px);
|
|
padding: 8px 10px;
|
|
}
|
|
/* 44 Pixel, weil ein Daumen weniger nicht sicher trifft. Dieselbe Zahl
|
|
wie überall im Haus -- sie steht hier, damit sie nicht davon abhängt,
|
|
welche Seitendatei zufällig geladen ist. */
|
|
.nachfrage__form input { height: 44px; }
|
|
.nachfrage__form textarea { min-height: 62px; resize: vertical; }
|
|
.nachfrage__form input:focus,
|
|
.nachfrage__form textarea:focus {
|
|
outline: none;
|
|
box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .75),
|
|
0 0 0 3px rgba(63, 189, 245, .16);
|
|
}
|
|
/* Die Knöpfe unten bekommen Luft nach oben -- sonst sitzt "Löschen"
|
|
direkt unter dem Satz, der davor warnt. */
|
|
.nachfrage .dialog__knoepfe { margin-top: 6px; }
|