DREI BLOECKE AUS DEM PERFEKTIONSLAUF.
1. HOCHLADEN MIT FORTSCHRITT UND ABBRUCH
Alle fuenf Wege (Dateien, Chat-Anhang, Wissen-PDF, Aufgaben-Anhang,
Profilbild) benutzten `fetch`. Das kann beim SENDEN nicht sagen, wie
weit es ist -- sichtbar war "wird hochgeladen …", von der ersten bis
zur letzten Sekunde gleich. Bei 40 MB im Mobilfunknetz zwei Minuten.
Wer das sieht, drueckt noch einmal und laedt dieselbe Datei doppelt.
Neu: workspace/assets/js/hochladen.js (XMLHttpRequest, das Einzige,
was `upload.onprogress` kann) samt gemeinsamer Anzeige.
Drei Ausgaenge: fertig / abgebrochen / schiefgegangen -- und ein
Abbruch ist KEIN Fehler und bekommt keine rote Meldung.
DABEI AUFGEFALLEN: KEINE EINZIGE PRUEFUNG im Haus laedt eine Datei
ueber die Oberflaeche hoch. Der ganze Umbau waere gruen gewesen,
ohne dass ein Byte je den Weg der Nutzer gegangen waere.
Neu: server/pruef-hochladen.mjs -- 18/0, mit echter Datei.
Zwei Irrtuemer beim Bauen, beide gemessen statt vermutet:
Ohne Drosselung gibt es auf localhost EINEN Fortschritt-Stand.
Das sah nach Befund aus und war keiner. Jetzt 2 MBit/s ueber
CDP -- derselbe Verlauf wie bei den Modis im Mobilfunk, 57
gemessene Zwischenstaende.
Gewartet wurde auf den Dateinamen "irgendwo im Dokument" -- der
stand auch im Fortschrittsbalken. Die Bedingung war erfuellt,
bevor etwas angekommen war.
2. LEERZUSTAENDE
Elf von 18 Brettern fielen auf "Noch kein Eintrag in diesem
Bereich" zurueck. Am ersten Tag ist ALLES leer -- wer da achtzehn
Bretter oeffnet und achtzehnmal denselben Satz liest, lernt nichts
ueber die Bretter, sondern dass das System kaputt ist. Jeder Satz
sagt jetzt, was hier hingehoert UND was der naechste Schritt ist.
Neu: server/pruef-leerzustand.mjs -- 13/0, leitet die Bretter aus
BEREICHE ab; ein neunzehntes ohne Satz macht sie rot.
3. ABMELDEN UND KONTRASTMODUS
Abmelden war am Handy ein 44-Pixel-Zeichen neben Glocke und Suche,
sofort wirksam. Teurer als es aussieht: Zum Wiederanmelden braucht
man den Zugangscode, und den gibt es EINMAL. Jetzt mit Rueckfrage,
die genau das sagt -- und dazu, dass Zumachen reicht (12 Stunden).
Kontrastmodus: 68 Regeln zeigen einen Zustand NUR ueber Farbe
(35x aria-pressed, 33x data-an). Der Modus ersetzt alle Farben und
entfernt box-shadow -- gedrueckt sah aus wie nicht gedrueckt.
14 CSS-Dateien hatten gar keinen Block. Statt 14 Bloecke zu pflegen
eine Regel in gate.css, die den ZUSTAND trifft statt die Datei.
Gemessen mit forcedColors: active -- vorher ununterscheidbar,
jetzt `solid 2px Highlight`.
Was seinen Zustand als WORT traegt (.marke-status, .t-stufe,
.spalte), braucht nichts -- nachgesehen, nicht vermutet.
PRUEFUNGEN, DIE AUF confirm() WARTETEN: Fuenf Dateien benutzten
`seite.once("dialog", d => d.accept())`. Playwright faengt confirm()
selbst ab, einen <dialog> nicht -- pruef-chat-anhaenge meldete acht
Fehler, keiner davon im Code. Neu: server/helfer-nachfrage.mjs, der
beide Wege kennt (auch den Notnagel fuer Safari vor 15.4).
pruef-chat-anhaenge, -ausbau, -optik und pruef-code wieder gruen.
hilfeAufraeumen bleibt ausgeschaltet -- das loescht echte Daten und
ist Filipes Entscheidung.
875 lines
41 KiB
CSS
875 lines
41 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; }
|
|
|
|
/* ---- Hochladen, das man sehen kann --------------------------------
|
|
Gebaut von `hochladen.js`, benutzt an fünf Stellen (Dateien,
|
|
Chat-Anhang, Wissen-PDF, Aufgaben-Anhang, Profilbild). Steht hier
|
|
und nicht in fünf Seitendateien -- aus demselben Grund wie der
|
|
Dialog darüber: Hochladen soll überall gleich aussehen. */
|
|
.hochlade { margin: 8px 0; display: grid; gap: 6px; }
|
|
.hochlade__kopf {
|
|
display: flex; align-items: center; justify-content: space-between;
|
|
gap: 10px; flex-wrap: wrap;
|
|
}
|
|
.hochlade__text { font-size: .9rem; color: var(--text-leise); }
|
|
|
|
/* 44 Pixel, damit ein Daumen den Abbruch trifft -- gerade hier, denn
|
|
wer abbricht, hat es meist eilig. */
|
|
.hochlade__abbruch {
|
|
min-height: 44px; min-width: 44px; padding: 0 14px;
|
|
font: inherit; font-size: .86rem;
|
|
color: var(--text-leise);
|
|
background: transparent;
|
|
border: 1px solid var(--rand);
|
|
border-radius: var(--radius, 10px);
|
|
cursor: pointer;
|
|
}
|
|
.hochlade__abbruch:hover:not(:disabled) { color: var(--text); border-color: var(--akzent); }
|
|
.hochlade__abbruch:disabled { opacity: .55; cursor: default; }
|
|
|
|
/* Ein natives <progress>: Vorleseprogramme kennen es, und ohne
|
|
`value` zeigt es von allein den unbestimmten Lauf -- genau der Fall,
|
|
in dem der Browser die Gesamtgröße nicht kennt. */
|
|
.hochlade__balken {
|
|
-webkit-appearance: none; appearance: none;
|
|
width: 100%; height: 6px; border: none;
|
|
background: rgba(150, 186, 220, .14);
|
|
border-radius: 999px; overflow: hidden;
|
|
}
|
|
.hochlade__balken::-webkit-progress-bar { background: rgba(150, 186, 220, .14); }
|
|
.hochlade__balken::-webkit-progress-value {
|
|
background: var(--akzent); border-radius: 999px;
|
|
transition: width .15s linear;
|
|
}
|
|
.hochlade__balken::-moz-progress-bar { background: var(--akzent); border-radius: 999px; }
|
|
|
|
/* Der letzte Satz nach einem Abbruch. Ruhig, nicht rot: Wer selbst
|
|
abbricht, hat keinen Fehler gemacht. */
|
|
.hochlade--schluss .hochlade__text { color: var(--text-still); }
|
|
|
|
/* Kein Wandern, wenn jemand Bewegung abbestellt hat. Der Balken
|
|
springt dann einfach auf den neuen Wert. */
|
|
@media (prefers-reduced-motion: reduce) {
|
|
.hochlade__balken::-webkit-progress-value { transition: none; }
|
|
}
|
|
|
|
@media (forced-colors: active) {
|
|
.hochlade__balken { border: 1px solid CanvasText; }
|
|
.hochlade__abbruch { border: 1px solid ButtonText; color: ButtonText; }
|
|
}
|