lsa-planer

LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.

/ src styles app.css

54,1 KB Rohdatei
src/styles/app.css — 2160 Zeilen
1 /*
2 * Erscheinungsbild der Anwendung.
3 *
4 * Eine Datei, ein Farbsystem. Der Altbestand verteilte 4.000 Zeilen auf drei
5 * Dateien mit einander widersprechenden Regeln zu denselben Selektoren und
6 * ueber 200 !important-Angaben; Farben waren teils als CSS-Variable, teils
7 * hartcodiert hinterlegt, sodass im dunklen Erscheinungsbild dunkler Text auf
8 * dunklem Grund stand.
9 *
10 * Alle Farben kommen aus den Variablen unten. Helles und dunkles
11 * Erscheinungsbild belegen dieselben Variablen unterschiedlich.
12 */
13
14 /*
15 * Alle Schriftgroessen und Geruestmasse relativ.
16 *
17 * Absolute px-Angaben uebergehen die Schriftgroesse, die der Anwender im
18 * Betriebssystem eingestellt hat - wer sie dort vergroessert, sah hier keinen
19 * Unterschied. Die kleinste Stufe liegt bei 0,75rem (12 Bildpunkte bei
20 * Voreinstellung); darunter wird Fliesstext auch mit guten Augen muehsam.
21 * Die Geruestmasse unten sind aus demselben Grund relativ: Waechst der Text,
22 * ohne dass Kopfzeile, Statusleiste und Navigation mitwachsen, wird er dort
23 * abgeschnitten.
24 */
25 :root {
26 color-scheme: light dark;
27
28 --grund: #f4f6f9;
29 --flaeche: #ffffff;
30 --flaeche-erhoben: #ffffff;
31 --flaeche-gedaempft: #eef1f6;
32 --rand: #d3d9e3;
33 /*
34 * Begrenzung eines Bedienelements - Eingabefeld, Auswahlfeld, Schaltflaeche.
35 *
36 * #b3bccb erreichte auf der Flaeche darunter nur 1,91:1; wo ein Feld
37 * aufhoert und der Hintergrund anfaengt, war damit kaum auszumachen, und in
38 * den Matrizen verschwand das Raster der Eingabefelder ganz. Gefordert sind
39 * 3:1 (WCAG 1.4.11). #7e8797 erreicht auf Weiss 3,62:1, auf der gedaempften
40 * Flaeche #eef1f6 noch 3,20:1. --rand bleibt heller: Karten-, Tabellen- und
41 * Trennlinien begrenzen nichts, was bedient wird.
42 */
43 --rand-stark: #7e8797;
44
45 --text: #1b2230;
46 --text-gedaempft: #5b6577;
47 --text-invers: #ffffff;
48
49 --akzent: #1f5fa8;
50 --akzent-hell: #e8f0fb;
51 --akzent-text: #ffffff;
52
53 --fehler: #b3261e;
54 --fehler-flaeche: #fdecea;
55 --warnung: #8a5a00;
56 --warnung-flaeche: #fff4e0;
57 --erfolg: #1f6b3a;
58 --erfolg-flaeche: #e8f5ec;
59 --hinweis: #33566e;
60 --hinweis-flaeche: #eaf2f7;
61
62 --signal-rot: #d13b2e;
63 --signal-rotgelb: #e08b1f;
64 --signal-gruen: #2e9e4f;
65 --signal-gelb: #e8b923;
66 --signal-dunkel: #5b6577;
67
68 --radius: 6px;
69 --radius-klein: 4px;
70 --schatten: 0 1px 3px rgb(16 24 40 / 12%);
71 --schatten-hoch: 0 12px 32px rgb(16 24 40 / 22%);
72
73 --schrift: system-ui, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
74 --schrift-fest: 'Cascadia Mono', Consolas, 'SF Mono', 'Liberation Mono', monospace;
75
76 --kopf-hoehe: 3.25rem;
77 --leiste-hoehe: 1.875rem;
78 --nav-breite: 14.5rem;
79 }
80
81 :root[data-erscheinungsbild='dunkel'] {
82 --grund: #12161d;
83 --flaeche: #1a1f28;
84 --flaeche-erhoben: #222834;
85 --flaeche-gedaempft: #171c24;
86 --rand: #2f3743;
87 /* #414b5a erreichte nur 1,87:1; #74808f erreicht 4,11:1 auf --flaeche und
88 * 3,68:1 auf --flaeche-erhoben. */
89 --rand-stark: #74808f;
90
91 --text: #e6eaf1;
92 --text-gedaempft: #a3adbd;
93 --text-invers: #12161d;
94
95 --akzent: #5a9bea;
96 --akzent-hell: #1b2a3d;
97 --akzent-text: #0d1218;
98
99 --fehler: #ff8a80;
100 --fehler-flaeche: #3a1d1a;
101 --warnung: #ffc65c;
102 --warnung-flaeche: #3a2f14;
103 --erfolg: #7ddc9c;
104 --erfolg-flaeche: #14301f;
105 --hinweis: #9dc8e8;
106 --hinweis-flaeche: #17242e;
107
108 --signal-rot: #e5584a;
109 --signal-rotgelb: #f0a23a;
110 --signal-gruen: #4cbc6e;
111 --signal-gelb: #f4cf4a;
112 --signal-dunkel: #6d7788;
113
114 --schatten: 0 1px 3px rgb(0 0 0 / 45%);
115 --schatten-hoch: 0 12px 32px rgb(0 0 0 / 60%);
116 }
117
118 * {
119 box-sizing: border-box;
120 }
121
122 /*
123 * `hidden` schlaegt jede Klassenregel.
124 *
125 * BEFUND AUS DEM BETRIEB (11.09.2026): In der Ansicht "Ausgabe" stand der
126 * Warnbalken "Rechenweg abgewaehlt" dauerhaft da - auch bei gesetztem
127 * Haekchen. Die Ansicht blendet ihn ueber das HTML-Merkmal `hidden` aus
128 * (exportView.ts), und das wirkt allein ueber die Regel `[hidden] {
129 * display: none }` des Browsers. Die hat die schwaechste Spezifitaet, die es
130 * gibt, und `.hinweisbalken { display: flex }` weiter unten schlaegt sie. Der
131 * Balken war damit nicht auszublenden.
132 *
133 * WARUM !important, obwohl der Kopf dieser Datei ueber 200 solcher Angaben im
134 * Altbestand beklagt: Hier ist es kein Notbehelf gegen eine widersprechende
135 * Regel, sondern die einzige Form, in der die Zusage "hidden blendet aus"
136 * ueberhaupt gilt. Ohne sie muesste jede kuenftige Klasse mit eigenem
137 * `display` daran denken - und die eine, die es vergisst, faellt erst im
138 * Betrieb auf. Betroffen waren ausser dem Hinweisbalken keine der drei
139 * uebrigen Stellen, die `hidden` setzen; das ist Zufall und keine Ordnung.
140 */
141 [hidden] {
142 display: none !important;
143 }
144
145 html,
146 body {
147 height: 100%;
148 margin: 0;
149 }
150
151 body {
152 font-family: var(--schrift);
153 /*
154 * Relative Schriftgroesse.
155 *
156 * 14px uebergingen die Schriftgroesse, die der Anwender im Betriebssystem
157 * eingestellt hat - wer sie dort vergroessert, sah hier keinen Unterschied.
158 * 0,875rem ist derselbe Wert bei Voreinstellung und waechst mit.
159 */
160 font-size: 0.875rem;
161 line-height: 1.5;
162 color: var(--text);
163 background: var(--grund);
164 /*
165 * Kein overflow:hidden mehr am Koerper: Bei starker Vergroesserung war der
166 * untere Teil der Anwendung damit unerreichbar - er lag ausserhalb des
167 * Fensters, und es liess sich nicht dorthin rollen.
168 */
169 overflow: auto;
170 }
171
172 h1,
173 h2,
174 h3 {
175 margin: 0;
176 font-weight: 600;
177 line-height: 1.3;
178 }
179
180 /*
181 * Die Groesse muss der Rangfolge folgen: h1 > h2 > h3.
182 *
183 * Zuvor war h1 mit 15 px kleiner gesetzt als h2 mit 17 px. Sehend wirkte die
184 * Hauptueberschrift dadurch untergeordnet, und wer sich beim Ueberfliegen an
185 * der Groesse orientiert, wurde in die Irre gefuehrt.
186 */
187 h1 {
188 font-size: 1.25rem;
189 }
190 h2 {
191 font-size: 1.0625rem;
192 }
193 h3 {
194 font-size: 0.875rem;
195 }
196
197 p {
198 margin: 0 0 8px;
199 }
200
201 a {
202 color: var(--akzent);
203 }
204
205 /*
206 * Fokusanzeige.
207 *
208 * Zweifarbig: Der helle Aussenring haelt den Rahmen auch auf dunklem Grund
209 * sichtbar. Eine einfarbige Umrandung verschwindet je nach Untergrund - und wer
210 * mit der Tastatur arbeitet, hat dann keine Ahnung mehr, wo er ist.
211 */
212 :focus-visible {
213 outline: 3px solid var(--akzent);
214 outline-offset: 2px;
215 box-shadow: 0 0 0 5px var(--flaeche);
216 }
217
218 /*
219 * Nur fuer die Sprachausgabe.
220 *
221 * Der Text bleibt im Dokument und wird vorgelesen, nimmt aber keinen Platz ein.
222 * Nicht ueber display:none oder visibility:hidden - beides nimmt den Text auch
223 * der Sprachausgabe. Beim Fokussieren wird er sichtbar, damit Sprungmarken
224 * ihren Zweck erfuellen.
225 */
226 .nur-vorlesen {
227 position: absolute;
228 width: 1px;
229 height: 1px;
230 padding: 0;
231 margin: -1px;
232 overflow: hidden;
233 clip-path: inset(50%);
234 white-space: nowrap;
235 border: 0;
236 }
237
238 .nur-vorlesen:focus,
239 .nur-vorlesen:focus-within {
240 position: static;
241 width: auto;
242 height: auto;
243 margin: 0;
244 overflow: visible;
245 clip-path: none;
246 white-space: normal;
247 }
248
249 /* Sprungmarke zum Inhalt - erster fokussierbarer Punkt des Dokuments. */
250 .sprungmarke:focus {
251 position: fixed;
252 top: 8px;
253 left: 8px;
254 z-index: 200;
255 padding: 10px 16px;
256 background: var(--flaeche);
257 border: 2px solid var(--akzent);
258 border-radius: var(--radius);
259 font-weight: 600;
260 }
261
262 /*
263 * Ruhigere Darstellung, wenn das Betriebssystem sie verlangt.
264 *
265 * Bewegung kann Uebelkeit und Schwindel ausloesen. Diese Regel nimmt Uebergaenge
266 * und Animationen der Oberflaeche zurueck - mehr tut sie nicht, und mehr steht
267 * auch sonst nirgends: Es gibt im Programm keine zweite Stelle, die
268 * `prefers-reduced-motion` auswertet.
269 *
270 * WAS HIER FRUEHER STAND (Fassung 5.7.0): "Die Simulation laeuft weiter, aber
271 * sie startet dann nicht von selbst; das steuert die Ansicht." Beides beschrieb
272 * Code, den es nicht gibt.
273 * Die Simulationsansicht wertet die Einstellung nicht aus - sie muss es auch
274 * nicht: Ihre Bildschleife laeuft ueberhaupt nur nach einem Druck auf
275 * "Starten" (src/ui/views/simulationView.ts, `start()`), und beim Verlassen der
276 * Ansicht wird sie abgemeldet. Eine Bewegung, die niemals von selbst anfaengt,
277 * braucht keine Ausnahme; ein Kommentar, der eine erfundene Steuerung
278 * beschreibt, verleitet dagegen dazu, sie beim naechsten Umbau vorauszusetzen.
279 */
280 @media (prefers-reduced-motion: reduce) {
281 *,
282 *::before,
283 *::after {
284 animation-duration: 0.01ms !important;
285 animation-iteration-count: 1 !important;
286 transition-duration: 0.01ms !important;
287 scroll-behavior: auto !important;
288 }
289 }
290
291 /* Erhoehter Kontrast, wenn das Betriebssystem ihn verlangt. */
292 @media (prefers-contrast: more) {
293 :root {
294 --rand: #000;
295 }
296
297 /*
298 * `!important` aus demselben Grund wie bei den Farbfeldern weiter unten:
299 * `.knopf` und `input, select, textarea` setzen spaeter in dieser Datei die
300 * Kurzschreibweise `border: 1px solid ...`, und die schreibt border-width
301 * wieder auf 1 Bildpunkt zurueck. Bei gleicher Spezifitaet gewinnt die
302 * spaetere Regel, eine Medienabfrage aendert daran nichts. Wer erhoehten
303 * Kontrast eingestellt hat, sah also weiterhin genau denselben duennen Rand
304 * und konnte in den Matrizen nicht ausmachen, wo ein Eingabefeld aufhoert
305 * und die naechste Zelle anfaengt.
306 */
307 .knopf,
308 input,
309 select,
310 textarea {
311 border-width: 2px !important;
312 }
313 }
314
315 /*
316 * Kontrastdesign des Betriebssystems.
317 *
318 * Windows ersetzt in diesem Modus alle Farben durch das Paar, das der Anwender
319 * gewaehlt hat. Flaechen, die sich nur ueber ihre Hintergrundfarbe abheben -
320 * Karten, Kennzahlen, Meldungen, Hinweise -, verschmelzen dann mit dem Grund:
321 * Aus einem Pruefbericht wird eine einzige Textwand, in der nicht mehr zu sehen
322 * ist, wo ein Befund aufhoert und der naechste anfaengt. Eine Kontur haelt sie
323 * auseinander.
324 */
325 @media (forced-colors: active) {
326 .karte,
327 .kennzahl,
328 .meldung,
329 .hinweisbalken,
330 .befund,
331 .fuehrung,
332 .leer-hinweis,
333 .assistent-erklaerung,
334 .hilfe-kurz,
335 .dialog {
336 border: 1px solid CanvasText;
337 }
338
339 /*
340 * Die Farbpunkte sind die einzige Auskunft darueber, welche Farbe eine
341 * Signalgruppe im Signalzeitenplan traegt - werden sie durch die Systemfarbe
342 * ersetzt, sehen alle gleich aus. Sie behalten deshalb ihre Farbe; eine
343 * Kontur haelt sie auf jedem Grund sichtbar.
344 *
345 * `!important` ist hier keine Bequemlichkeit: `.farbpunkt` und
346 * `.legende-farbe` setzen weiter unten in dieser Datei selbst eine
347 * `border`-Kurzschreibweise. Eine Medienabfrage erhoeht die Spezifitaet
348 * nicht, also gewinnt bei Gleichstand die spaetere Regel - die Kontur fiel
349 * weg, und weil `forced-color-adjust: none` daneben die Systemfarben
350 * fernhaelt, standen die Farbfelder ohne jede Begrenzung auf dem Grund: Ein
351 * gelber Punkt auf gelbem Kontrastgrund ist schlicht nicht mehr da. Die
352 * Regeln umzusortieren wuerde nur so lange helfen, bis jemand unten die
353 * naechste ergaenzt.
354 */
355 .farbpunkt,
356 .legende-farbe,
357 .leiste-punkt {
358 border: 1px solid CanvasText !important;
359 forced-color-adjust: none;
360 }
361
362 /* Der aktive Navigationspunkt zeigt sich sonst nur ueber die Flaeche. */
363 .nav-knopf[aria-current='page'] {
364 border: 1px solid CanvasText;
365 }
366
367 /*
368 * Der zweite, helle Ring der Fokusanzeige ist ein Schlagschatten - den
369 * unterdrueckt das Kontrastdesign. Die Umrandung allein muss reichen.
370 */
371 :focus-visible {
372 outline: 3px solid CanvasText;
373 }
374 }
375
376 /* --- Grundgeruest --------------------------------------------------------- */
377
378 .anwendung {
379 display: grid;
380 /*
381 * Kopf- und Fusszeile duerfen wachsen.
382 *
383 * Zuvor waren beide auf eine feste Hoehe genagelt. Die neun Schaltflaechen der
384 * Kopfleiste brauchen rund 900 Bildpunkte; wurde es enger, brach die Leiste um -
385 * die Zeile blieb aber 52 Bildpunkte hoch, und Navigation und Inhalt malten
386 * ihren Hintergrund ueber die zweite Knopfreihe. Die Knoepfe waren dann weder
387 * zu sehen noch anzuklicken.
388 *
389 * Getroffen hat das genau die Vergroesserung auf 200 Prozent: Auf einem
390 * Full-HD-Schirm sind das 960 Bildpunkte, und die rettende Medienabfrage
391 * griff erst bei 900.
392 */
393 grid-template-rows: minmax(var(--kopf-hoehe), auto) 1fr minmax(var(--leiste-hoehe), auto);
394 grid-template-columns: var(--nav-breite) 1fr;
395 grid-template-areas:
396 'kopf kopf'
397 'nav inhalt'
398 'leiste leiste';
399 /*
400 * Mindestens die Fensterhoehe, aber nicht genau sie: Waechst die Kopfzeile
401 * durch Umbruch, muss das Geruest mitwachsen duerfen, statt unten
402 * abzuschneiden.
403 */
404 min-height: 100vh;
405 }
406
407 .kopf {
408 grid-area: kopf;
409 display: flex;
410 gap: 12px;
411 align-items: center;
412 padding: 0 12px;
413 background: var(--flaeche);
414 border-bottom: 1px solid var(--rand);
415 }
416
417 /*
418 * Programmname in der Kopfzeile - Wortmarke, keine Ueberschrift.
419 *
420 * Als h1 gesetzt stand auf jeder Seite eine zweite, immer gleiche
421 * Hauptueberschrift; die Ueberschriftengliederung war damit fuer eine
422 * Sprachausgabe unbrauchbar. Die Marke behaelt ihr bisheriges Aussehen.
423 */
424 .kopf-marke {
425 flex-shrink: 0;
426 font-size: 0.9375rem;
427 font-weight: 600;
428 }
429
430 .kopf-titel {
431 display: flex;
432 flex-direction: column;
433 min-width: 0;
434 line-height: 1.15;
435 }
436
437 .kopf-titel strong {
438 overflow: hidden;
439 font-size: 0.875rem;
440 text-overflow: ellipsis;
441 white-space: nowrap;
442 }
443
444 .kopf-titel span {
445 font-size: 0.75rem;
446 color: var(--text-gedaempft);
447 }
448
449 .kopf-aktionen {
450 display: flex;
451 flex-wrap: wrap;
452 gap: 6px;
453 align-items: center;
454 margin-left: auto;
455 }
456
457 .nav {
458 grid-area: nav;
459 padding: 8px;
460 overflow-y: auto;
461 background: var(--flaeche-gedaempft);
462 border-right: 1px solid var(--rand);
463 }
464
465 .nav-gruppe {
466 padding: 0 10px;
467 margin: 14px 0 4px;
468 font-size: 0.75rem;
469 font-weight: 700;
470 color: var(--text-gedaempft);
471 text-transform: uppercase;
472 letter-spacing: 0.06em;
473 }
474
475 .nav-gruppe:first-child {
476 margin-top: 2px;
477 }
478
479 /*
480 * Die Navigationsgruppen sind Listen.
481 *
482 * Zuvor hingen Ueberschrift und Schaltflaechen flach nebeneinander in der
483 * `nav`: Es wurde nicht angesagt, wie viele Bereiche in "Erfassung" stecken,
484 * und dass ein Knopf zu seiner Gruppe gehoert, war allein optisch zu sehen.
485 *
486 * Entfernt werden nur die Aufzaehlungszeichen - NICHT ueber `display:
487 * contents`: Das nimmt die Listenrolle mit, und dann waere der Umbau
488 * vergeblich gewesen.
489 */
490 .nav-liste {
491 padding: 0;
492 margin: 0;
493 list-style: none;
494 }
495
496 .nav-knopf {
497 display: flex;
498 gap: 8px;
499 align-items: center;
500 width: 100%;
501 padding: 8px 10px;
502 margin-bottom: 2px;
503 font: inherit;
504 color: var(--text);
505 text-align: left;
506 cursor: pointer;
507 background: none;
508 border: none;
509 border-radius: var(--radius-klein);
510 }
511
512 /* Die Nummer macht die Bearbeitungsreihenfolge sichtbar. */
513 .nav-nummer {
514 flex-shrink: 0;
515 width: 1.25rem;
516 height: 1.25rem;
517 font-size: 0.75rem;
518 font-weight: 600;
519 line-height: 1.25rem;
520 color: var(--text-gedaempft);
521 text-align: center;
522 background: var(--flaeche);
523 border: 1px solid var(--rand);
524 border-radius: 50%;
525 }
526
527 .nav-knopf[aria-current='page'] .nav-nummer {
528 color: var(--akzent-text);
529 background: var(--akzent);
530 border-color: var(--akzent);
531 }
532
533 .nav-beschriftung {
534 min-width: 0;
535 overflow: hidden;
536 text-overflow: ellipsis;
537 white-space: nowrap;
538 }
539
540 .nav-knopf:hover {
541 background: var(--flaeche);
542 }
543
544 .nav-knopf[aria-current='page'] {
545 font-weight: 600;
546 color: var(--akzent);
547 background: var(--akzent-hell);
548 }
549
550 .nav-abzeichen {
551 min-width: 1.25rem;
552 padding: 0 5px;
553 margin-left: auto;
554 font-size: 0.75rem;
555 font-weight: 600;
556 color: var(--text-invers);
557 text-align: center;
558 border-radius: 9px;
559 }
560
561 /*
562 * Formmerkmal neben der Farbe (Befund M11).
563 *
564 * Fehler und Warnung unterschieden sich am Abzeichen allein durch den
565 * Hintergrund; die beiden Toene stehen zueinander bei 1,10:1 (hell) und
566 * 1,47:1 (dunkel) und sind damit bei Farbfehlsichtigkeit und im
567 * Schwarzweissdruck nicht zu trennen. Das Ausrufezeichen steht nur am
568 * Fehlerabzeichen und macht den Unterschied ohne Farbe sichtbar; das Wort fuer
569 * die Sprachausgabe setzt shell.ts als `nur-vorlesen` daneben.
570 */
571 .nav-abzeichen-zeichen {
572 margin-left: 2px;
573 font-weight: 700;
574 }
575
576 .nav-abzeichen-fehler {
577 color: var(--text-invers);
578 background: var(--fehler);
579 }
580 .nav-abzeichen-warnung {
581 color: var(--text-invers);
582 background: var(--warnung);
583 }
584
585 .inhalt {
586 grid-area: inhalt;
587 padding: 16px;
588 overflow: auto;
589 }
590
591 /*
592 * Statusleiste.
593 *
594 * Die drei Abschnitte - Pruefstatus, Umlaufzeit, Projektstand - passen bei
595 * 200 Prozent Vergroesserung nicht mehr nebeneinander. Ohne Umbruch liefen sie
596 * waagerecht aus dem Fenster heraus; die Angaben rechts waren dann weder zu
597 * sehen noch zu erreichen, und gerade dort steht, ob der Plan geprueft ist.
598 * Jetzt bricht die Leiste um und die Geruestzeile waechst mit (siehe
599 * grid-template-rows in .anwendung).
600 *
601 * Der Name --statusleiste haengt hier, damit sich die Kurzmeldungen an der
602 * TATSAECHLICHEN Hoehe der Leiste ausrichten koennen - siehe .meldungen.
603 */
604 .leiste {
605 display: flex;
606 flex-wrap: wrap;
607 grid-area: leiste;
608 gap: 4px 14px;
609 align-items: center;
610 min-height: var(--leiste-hoehe);
611 padding: 4px 12px;
612 font-size: 0.75rem;
613 color: var(--text-gedaempft);
614 background: var(--flaeche);
615 border-top: 1px solid var(--rand);
616 anchor-name: --statusleiste;
617 }
618
619 .leiste-abschnitt {
620 display: flex;
621 gap: 6px;
622 align-items: center;
623 white-space: nowrap;
624 }
625
626 .leiste-rechts {
627 margin-left: auto;
628 }
629
630 .leiste-punkt {
631 width: 8px;
632 height: 8px;
633 border-radius: 50%;
634 }
635
636 .leiste-punkt-ok {
637 background: var(--erfolg);
638 }
639 .leiste-punkt-fehler {
640 background: var(--fehler);
641 }
642 .leiste-punkt-warnung {
643 background: var(--warnung);
644 }
645
646 /* --- Karten und Abschnitte ------------------------------------------------ */
647
648 /*
649 * DIE BREITE WIRD DORT BEGRENZT, WO SIE STOERT - NICHT PAUSCHAL.
650 *
651 * Zuvor stand hier `max-width: 1400px; margin: 0 auto`. Der Grund war richtig:
652 * Fliesstextzeilen von 200 Zeichen liest niemand gern. Die Stelle war es
653 * nicht. Die Grenze traf die ganze Ansicht, also auch die Signalgruppentabelle
654 * mit ihren sechzehn Spalten: Auf einem 1900 Bildpunkte breiten Fenster
655 * standen links und rechts je rund 250 Bildpunkte leer, waehrend die Tabelle
656 * in der Mitte waagerecht rollen musste. Ein Rollbalken, den man bei jeder
657 * Zeile neu bedient, ist teurer als eine lange Zeile.
658 *
659 * Deshalb: Die Ansicht nimmt die Breite, die da ist. Begrenzt werden
660 * Fliesstext (unten, 80 Zeichen) und einzelne Formularfelder (.karte .feld) -
661 * beides Stellen, an denen Breite tatsaechlich schadet. Tabellen, Matrizen,
662 * Zeitdiagramm und Lageplan bekommen den ganzen Platz.
663 */
664 .ansicht {
665 display: flex;
666 flex-direction: column;
667 gap: 16px;
668 }
669
670 /*
671 * Zeilenlaenge des Fliesstexts.
672 *
673 * 80 Zeichen sind die uebliche Obergrenze fuer gut lesbaren Fliesstext. Ohne
674 * diese Regel liefen die Erlaeuterungen im Pruefbericht und in den Vorgaben
675 * auf einem breiten Schirm bis zu 200 Zeichen je Zeile - beim Zeilenwechsel
676 * findet man dann den Anfang der naechsten Zeile nicht wieder.
677 */
678 .ansicht p,
679 .ansicht li {
680 max-width: 80ch;
681 }
682
683 /*
684 * Einzelne Formularfelder bekommen ein Mass, keine Bahn.
685 *
686 * Ein Textfeld ueber die volle Fensterbreite ist kein Gewinn: Man sieht
687 * seinen Anfang und sein Ende nicht gleichzeitig, und der Bezug zur
688 * Beschriftung darueber geht verloren. In der Vorgabenansicht war das
689 * Fundstellenfeld ohne diese Regel 1567 Bildpunkte breit.
690 *
691 * Die Bemerkung ist ausgenommen - dort schreibt man ganze Saetze.
692 */
693 .karte .feld {
694 max-width: 52ch;
695 }
696
697 .karte .feld textarea {
698 max-width: none;
699 }
700
701 .ansicht-kopf p {
702 max-width: 78ch;
703 margin: 4px 0 0;
704 color: var(--text-gedaempft);
705 }
706
707 .karte {
708 padding: 14px 16px;
709 background: var(--flaeche);
710 border: 1px solid var(--rand);
711 border-radius: var(--radius);
712 box-shadow: var(--schatten);
713 }
714
715 .abschnitt-kopf {
716 display: flex;
717 flex-wrap: wrap;
718 gap: 10px;
719 align-items: center;
720 margin-bottom: 12px;
721 }
722
723 .abschnitt-aktionen {
724 display: flex;
725 flex-wrap: wrap;
726 gap: 6px;
727 margin-left: auto;
728 }
729
730 .raster {
731 display: grid;
732 grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
733 gap: 12px 16px;
734 }
735
736 .raster-schmal {
737 grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
738 }
739
740 .leer-hinweis {
741 padding: 24px;
742 color: var(--text-gedaempft);
743 text-align: center;
744 background: var(--flaeche-gedaempft);
745 border: 1px dashed var(--rand-stark);
746 border-radius: var(--radius);
747 }
748
749 /* --- Formulare ------------------------------------------------------------ */
750
751 .feld {
752 display: flex;
753 flex-direction: column;
754 gap: 4px;
755 min-width: 0;
756 }
757
758 /*
759 * Gruppe zusammengehoerender Bedienelemente.
760 *
761 * `fieldset` ist die einzige Auszeichnung, die einer Sprachausgabe sagt, dass
762 * acht Kontrollkaestchen zusammen EINE Sache festlegen - ohne sie hoert man
763 * acht unverbundene Schalter. Der Browser malt dazu aber Rahmen und
764 * Innenabstand, die hier nicht ins Bild passen; die werden zurueckgenommen.
765 *
766 * `min-width: 0` ist kein Beiwerk: Ein `fieldset` schrumpft sonst nicht unter
767 * die Breite seines Inhalts und sprengt jedes Raster, in dem es steht.
768 */
769 .feldgruppe {
770 min-width: 0;
771 padding: 0;
772 margin: 0;
773 border: none;
774 }
775
776 /*
777 * `.feld-name` traegt dieselbe Gestalt wie ein `label`, ist aber keins.
778 *
779 * Ein `label` gehoert zu einem Bedienelement. Wo nur ein errechneter Wert
780 * steht - die ermittelte Umlaufzeit, die Freigabezeit im Plan -, gibt es
781 * nichts zu bedienen; ein `label` ohne Ziel sagt einer Sprachausgabe
782 * "Beschriftung" und laesst offen, wozu. Sichtbar bleibt es dieselbe Zeile.
783 *
784 * Die zweite Haelfte der Liste faengt den Fall ab, dass ein Hilfeknopf neben
785 * der Beschriftung steht: feld() in src/ui/assistent.ts schiebt dafuer ein
786 * `.feld-kopf` zwischen `.feld` und `label`, und ein Kindselektor allein greift
787 * dann nicht mehr. Im gefuehrten Einstieg standen die Feldnamen dadurch in
788 * Fliesstextgroesse und Normalstaerke - genauso gross wie der Wert darunter,
789 * sodass Beschriftung und Eingabe nicht mehr auseinanderzuhalten waren.
790 *
791 * Es bleibt bei Kindselektoren. `.feld label` traefe auch das `label` aus
792 * checkbox() in src/ui/dom.ts, das bewusst in `.feld-eingabe` neben dem
793 * Kaestchen steht und die Beschriftung des Schalters traegt - klein und
794 * gedaempft gesetzt waere sie die einzige Zeile, die den Schalter erklaert.
795 */
796 .feld > label,
797 .feld > .feld-name,
798 .feld > .feld-kopf > label,
799 .feld > .feld-kopf > .feld-name {
800 display: block;
801 font-size: 0.75rem;
802 font-weight: 600;
803 color: var(--text-gedaempft);
804 }
805
806 /*
807 * Beschriftung und Hilfeknopf in einer Zeile.
808 *
809 * Der Hilfeknopf lag frueher IM label und wanderte damit in den vorgelesenen
810 * Feldnamen ("Umlaufzeit Hilfe"). Herausgeloest braucht er eine Zeile, die
811 * beides nebeneinander haelt, ohne dass der Knopf die Grundlinie verschiebt.
812 */
813 .feld-kopf {
814 display: flex;
815 align-items: center;
816 gap: 6px;
817 }
818
819 .feld-eingabe {
820 display: flex;
821 gap: 6px;
822 align-items: center;
823 }
824
825 .feld-einheit {
826 font-size: 0.75rem;
827 color: var(--text-gedaempft);
828 white-space: nowrap;
829 }
830
831 .feld-hinweis {
832 margin: 0;
833 font-size: 0.75rem;
834 color: var(--text-gedaempft);
835 }
836
837 .feld-schalter .feld-eingabe {
838 gap: 8px;
839 }
840
841 .feld-schalter label {
842 font-size: 0.8125rem;
843 font-weight: 400;
844 color: var(--text);
845 }
846
847 input,
848 select,
849 textarea {
850 width: 100%;
851 min-width: 0;
852 padding: 6px 8px;
853 font: inherit;
854 color: var(--text);
855 background: var(--flaeche-erhoben);
856 border: 1px solid var(--rand-stark);
857 border-radius: var(--radius-klein);
858 }
859
860 /*
861 * Platzhaltertext.
862 *
863 * Die Platzhalter tragen hier fachliche Werte - die Mindestfreigabezeit einer
864 * Signalgruppe, den Regelwert eines Kennwerts, die Hinweise "berechnet" und
865 * "verteilt". Wer sie nicht lesen kann, sieht nicht, welcher Wert gerade gilt.
866 * Der Vorgabeton der Browser liegt je nach Browser zwischen 2,4:1 (Grauton
867 * #a9a9a9 auf Weiss) und 3,6:1 (Textfarbe mit 54 Prozent Deckung) und damit
868 * unter den geforderten 4,5:1. Die gedaempfte Textfarbe erreicht hell 5,88:1
869 * und dunkel 6,52:1 auf der Feldflaeche. Die Deckung wird ausdruecklich auf 1
870 * gesetzt, weil Firefox den Platzhalter sonst zusaetzlich abschwaecht.
871 */
872 input::placeholder,
873 textarea::placeholder {
874 color: var(--text-gedaempft);
875 opacity: 1;
876 }
877
878 /*
879 * Kontrollkaestchen.
880 *
881 * 18 Bildpunkte Kaestchen plus 3 Bildpunkte Rand ringsum ergeben ein Ziel von
882 * 24 Bildpunkten samt Abstand - das Mindestmass aus WCAG 2.5.8, ohne dass die
883 * Kaestchen in der Vertraeglichkeits- und der Zwischenzeitenmatrix unfoermig
884 * werden. Bei 16 Bildpunkten trifft sie mit dem Finger oder mit zittriger Hand
885 * niemand zuverlaessig.
886 */
887 input[type='checkbox'] {
888 width: 18px;
889 height: 18px;
890 margin: 3px;
891 accent-color: var(--akzent);
892 }
893
894 input[type='color'] {
895 width: 42px;
896 height: 30px;
897 padding: 2px;
898 }
899
900 input:disabled,
901 select:disabled,
902 textarea:disabled {
903 color: var(--text-gedaempft);
904 background: var(--flaeche-gedaempft);
905 }
906
907 textarea {
908 min-height: 72px;
909 font-family: inherit;
910 resize: vertical;
911 }
912
913 /* --- Schaltflaechen ------------------------------------------------------- */
914
915 .knopf {
916 display: inline-flex;
917 gap: 6px;
918 align-items: center;
919 padding: 6px 12px;
920 font: inherit;
921 font-size: 0.8125rem;
922 color: var(--text);
923 cursor: pointer;
924 background: var(--flaeche-erhoben);
925 border: 1px solid var(--rand-stark);
926 border-radius: var(--radius-klein);
927 }
928
929 .knopf:hover:not(:disabled) {
930 border-color: var(--akzent);
931 }
932
933 /*
934 * Gesperrte Schaltflaeche.
935 *
936 * Zwei Abschwaechungen uebereinander - gedaempfte Textfarbe UND 55 Prozent
937 * Deckung - druecken die Beschriftung auf 2,33:1 (#5b6577 zu 55 Prozent auf
938 * Weiss ergibt #a5aab4). Lesbar ist das nicht mehr, und gerade bei einer
939 * gesperrten Schaltflaeche muss zu erkennen sein, WELCHE Wahl gerade nicht
940 * offensteht. Ein Mechanismus genuegt: Die gedaempfte Farbe traegt den
941 * Kontrast - 5,19:1 hell, 7,55:1 dunkel auf der gedaempften Flaeche -, und die
942 * gedaempfte Flaeche zeigt die Sperre auch dem, der Farben schlecht
943 * unterscheidet. So halten es die Formularfelder oben bereits.
944 *
945 * Die Angaben schlagen auch bei .knopf-primaer und .knopf-gefahr durch: Klasse
946 * plus Pseudoklasse wiegen schwerer als deren einzelne Klasse.
947 */
948 .knopf:disabled {
949 color: var(--text-gedaempft);
950 cursor: not-allowed;
951 background: var(--flaeche-gedaempft);
952 border-color: var(--rand);
953 }
954
955 .knopf-primaer {
956 font-weight: 600;
957 color: var(--akzent-text);
958 background: var(--akzent);
959 border-color: var(--akzent);
960 }
961
962 .knopf-gefahr {
963 color: var(--fehler);
964 border-color: var(--fehler);
965 }
966
967 .knopf-schlicht {
968 background: none;
969 border-color: transparent;
970 }
971
972 .knopf-klein {
973 padding: 3px 8px;
974 font-size: 0.75rem;
975 }
976
977 /* --- Tabellen ------------------------------------------------------------- */
978
979 .tabelle-rahmen {
980 /*
981 * `position: relative` macht den Rahmen zum Bezugspunkt fuer alles, was in
982 * ihm absolut positioniert ist - und damit zu dem, der es auch beschneidet.
983 *
984 * Ohne diese Zeile hing ein absolut positioniertes Kind ohne positionierten
985 * Vorfahren am Dokument statt am Rahmen. Beschnitten wurde es dann von
986 * niemandem: Die vorlesbaren Wertebereichshinweise in den Zellen der
987 * Signalgruppentabelle standen rechnerisch bei Bildpunkt 1900 und zogen das
988 * ganze Dokument auf 1938 Bildpunkte Breite. Die Folge war genau der Fehler,
989 * den der rollende Rahmen verhindern soll: Nicht die Tabelle rollte
990 * waagerecht, sondern die gesamte Seite - mitsamt Kopfzeile und Navigation.
991 */
992 position: relative;
993 overflow-x: auto;
994 border: 1px solid var(--rand);
995 border-radius: var(--radius);
996 }
997
998 table {
999 width: 100%;
1000 border-collapse: collapse;
1001 }
1002
1003 th,
1004 td {
1005 padding: 7px 10px;
1006 text-align: left;
1007 border-bottom: 1px solid var(--rand);
1008 }
1009
1010 /*
1011 * Spaltenkoepfe duerfen umbrechen.
1012 *
1013 * Zuvor stand hier `white-space: nowrap`. Der Gedanke war richtig - er sollte
1014 * verhindern, dass ein Kopf zu "Zuf" gequetscht wird -, aber er zwang jeden
1015 * Kopf auf EINE Zeile, und ausgeschriebene Koepfe wie "Erhoehter Zeitbedarf"
1016 * oder "Mindestfreigabe" machten die Signalgruppentabelle dadurch 1916
1017 * Bildpunkte breit. Sie rollte selbst auf einem 1900 Bildpunkte breiten
1018 * Fenster waagerecht.
1019 *
1020 * Umbrechen ist nicht Quetschen: Die Tabelle steht weiterhin auf
1021 * `width: max-content`, kein Feld wird schmaler als sein Inhalt. Der Kopf wird
1022 * zweizeilig - 74 statt 38 Bildpunkte hoch -, und die Tabelle passt mit 1602
1023 * Bildpunkten in den Rahmen. Zwei Zeilen Kopf sind ein guenstiger Tausch gegen
1024 * einen Rollbalken, der bei jeder Zeile neu zu bedienen ist.
1025 */
1026 th {
1027 position: sticky;
1028 top: 0;
1029 z-index: 1;
1030 font-size: 0.75rem;
1031 font-weight: 600;
1032 color: var(--text-gedaempft);
1033 background: var(--flaeche-gedaempft);
1034 vertical-align: bottom;
1035 }
1036
1037 tbody tr:last-child td {
1038 border-bottom: none;
1039 }
1040
1041 tbody tr:hover td {
1042 background: var(--flaeche-gedaempft);
1043 }
1044
1045 td.zahl,
1046 th.zahl {
1047 font-variant-numeric: tabular-nums;
1048 text-align: right;
1049 }
1050
1051 td.eng {
1052 width: 1%;
1053 white-space: nowrap;
1054 }
1055
1056 /*
1057 * Tabellenbreite: Inhalt vor Fensterbreite.
1058 *
1059 * Zuvor galt table { width: 100% }. Bei sechzehn Spalten teilte der Browser die
1060 * Fensterbreite auf, quetschte jede Spalte und schnitt die Auswahlfelder ab -
1061 * aus "Kraftfahrzeuge" wurde "Kraftfahr", aus "Zufahrt Nord" wurde "Zufal".
1062 * Lesbar war das nicht, und ausgerechnet in einer Auswahlliste ist der
1063 * abgeschnittene Text die einzige Auskunft darueber, was gerade eingestellt ist.
1064 *
1065 * Jetzt bestimmt der Inhalt die Breite; ist die Tabelle breiter als das
1066 * Fenster, wird waagerecht gerollt. Fuer eine Datentabelle ist das der richtige
1067 * Weg - anders als bei Fliesstext gibt es hier nichts umzubrechen.
1068 */
1069 .tabelle-rahmen table {
1070 width: auto;
1071 min-width: 100%;
1072 }
1073
1074 /*
1075 * Fokusanzeige in der Tabelle.
1076 *
1077 * .tabelle-rahmen rollt waagerecht und ist damit ein Rollbereich - alles, was
1078 * ueber seinen Rand hinausragt, wird abgeschnitten, auch senkrecht. Die
1079 * Fokusanzeige ragt mit Umrandung, Abstand und hellem Aussenring bis zu zehn
1080 * Bildpunkte hinaus; in der letzten Zeile und am linken Rand blieb davon ein
1081 * angeschnittener Strich uebrig, und wer mit der Tastatur arbeitet, sah nicht
1082 * mehr, in welcher Zelle er steht. Nach innen gezeichnet bleibt der Ring
1083 * vollstaendig sichtbar.
1084 */
1085 .tabelle-rahmen :focus-visible {
1086 outline-offset: -2px;
1087 /*
1088 * Der helle Aussenring wird durch einen Innenring ersetzt: Auf den
1089 * eingefaerbten Zellen der Zwischenzeiten- und der Vertraeglichkeitsmatrix
1090 * liegt der Rahmen sonst unmittelbar auf der Fuellfarbe.
1091 */
1092 box-shadow: inset 0 0 0 2px var(--flaeche);
1093 }
1094
1095 /*
1096 * Springt die Tastatur in eine Zelle, rollt der Browser sie an den oberen
1097 * Rand des Rollbereichs. Der klebende Spaltenkopf saesse dann darauf.
1098 */
1099 .tabelle-rahmen th,
1100 .tabelle-rahmen td {
1101 scroll-margin-top: 44px;
1102 scroll-margin-left: 12px;
1103 scroll-margin-right: 12px;
1104 }
1105
1106 table input,
1107 table select {
1108 padding: 4px 6px;
1109 font-size: 0.8125rem;
1110 }
1111
1112 /* Auswahlfelder zeigen ihren Wert vollstaendig. */
1113 table select {
1114 min-width: max-content;
1115 }
1116
1117 table input[type='text'] {
1118 min-width: 14ch;
1119 }
1120
1121 table input[type='number'] {
1122 min-width: 7ch;
1123 }
1124
1125 /* Sichtbare Tabellenbeschriftung, wo sie gewuenscht ist. */
1126 .tabelle-beschriftung {
1127 padding: 8px 10px;
1128 font-size: 0.8125rem;
1129 font-weight: 600;
1130 color: var(--text-gedaempft);
1131 text-align: left;
1132 }
1133
1134 /* --- Zwischenzeitenmatrix ------------------------------------------------- */
1135
1136 .matrix {
1137 font-variant-numeric: tabular-nums;
1138 }
1139
1140 .matrix th {
1141 text-align: center;
1142 }
1143
1144 .matrix td {
1145 padding: 0;
1146 text-align: center;
1147 }
1148
1149 .matrix-zelle {
1150 width: 100%;
1151 min-width: 54px;
1152 padding: 6px 4px;
1153 font: inherit;
1154 font-variant-numeric: tabular-nums;
1155 color: var(--text);
1156 text-align: center;
1157 cursor: pointer;
1158 background: none;
1159 border: none;
1160 }
1161
1162 .matrix-zelle:hover {
1163 background: var(--akzent-hell);
1164 }
1165
1166 .matrix-zelle-leer {
1167 color: var(--text-gedaempft);
1168 }
1169
1170 /*
1171 * Die kritische Zelle traegt zusaetzlich eine Wellenlinie.
1172 *
1173 * Zuvor unterschied sich "Zwischenzeit 0 s bei bestehendem Konflikt" von einem
1174 * gueltigen Wert allein durch die rote Schrift - fuer Rotsehschwache und im
1175 * Schwarzweissdruck also gar nicht. Das Gegenstueck steht in
1176 * src/ui/views/conflictsView.ts: Die Zelle zeigt "0 !" statt einer blanken 0.
1177 */
1178 .matrix-zelle-kritisch {
1179 font-weight: 600;
1180 color: var(--fehler);
1181 text-decoration: underline wavy;
1182 text-underline-offset: 3px;
1183 background: var(--fehler-flaeche);
1184 }
1185
1186 .matrix-zelle-vorgegeben {
1187 font-style: italic;
1188 text-decoration: underline dotted;
1189 }
1190
1191 /*
1192 * Traegt eine Zelle beide Zustaende, hat der kritische Vorrang: Dass die
1193 * Zwischenzeit 0 s betraegt, wiegt schwerer als die Herkunft des Werts. Ohne
1194 * diese Regel gewinnt die weiter unten stehende .matrix-zelle-vorgegeben mit
1195 * ihrer gepunkteten Linie, und die Warnung verschwindet still.
1196 */
1197 .matrix-zelle-kritisch.matrix-zelle-vorgegeben {
1198 text-decoration: underline wavy;
1199 }
1200
1201 .matrix-diagonale {
1202 background: var(--flaeche-gedaempft);
1203 }
1204
1205 /* Vertraeglichkeitsmatrix - paarweise, nur obere Dreiecksmatrix bedienbar */
1206
1207 .vertraeglichkeit-zelle {
1208 min-width: 96px;
1209 font-size: 0.75rem;
1210 }
1211
1212 .vertraeglichkeit-feindlich {
1213 font-weight: 600;
1214 color: var(--fehler);
1215 background: var(--fehler-flaeche);
1216 }
1217
1218 .vertraeglichkeit-frei {
1219 color: var(--erfolg);
1220 background: var(--erfolg-flaeche);
1221 }
1222
1223 .vertraeglichkeit-zelle:hover {
1224 outline: 2px solid var(--akzent);
1225 outline-offset: -2px;
1226 }
1227
1228 /* --- Signalzeitenplan ----------------------------------------------------- */
1229
1230 .plan-rahmen {
1231 overflow-x: auto;
1232 background: var(--flaeche);
1233 border: 1px solid var(--rand);
1234 border-radius: var(--radius);
1235 }
1236
1237 .plan-leinwand {
1238 display: block;
1239 }
1240
1241 /* Zeit-Weg-Diagramm der Koordinierung - dieselbe Behandlung wie der
1242 Signalzeitenplan: eigener Rahmen, waagerecht rollbar, Leinwand als Block. */
1243 .zeitweg-rahmen {
1244 overflow-x: auto;
1245 background: var(--flaeche);
1246 border: 1px solid var(--rand);
1247 border-radius: var(--radius);
1248 }
1249
1250 .zeitweg {
1251 display: block;
1252 }
1253
1254 .plan-legende {
1255 display: flex;
1256 flex-wrap: wrap;
1257 gap: 14px;
1258 margin-top: 10px;
1259 font-size: 0.75rem;
1260 }
1261
1262 .legende-eintrag {
1263 display: flex;
1264 gap: 6px;
1265 align-items: center;
1266 }
1267
1268 .legende-farbe {
1269 width: 16px;
1270 height: 12px;
1271 border: 1px solid rgb(0 0 0 / 25%);
1272 border-radius: 2px;
1273 }
1274
1275 /*
1276 * Strichprobe der Lageplan-Legende.
1277 *
1278 * Sie zeigt Farbe UND Strichmuster einer Verkehrsart. Das Muster ist im
1279 * Schwarzweissdruck und bei Rot-Gruen-Schwaeche die einzige Unterscheidung,
1280 * die bleibt - Kfz gegen Rad stehen als Farben nur 1,48:1 zueinander. Das
1281 * Muster selbst kommt als Farbverlauf aus der Ansicht, damit es nicht neben
1282 * der Zeichnung her gepflegt werden muss; hier stehen nur die Masse.
1283 *
1284 * `flex: 0 0 auto`, weil der Eintrag ein Flexbehaelter ist und die Probe sonst
1285 * auf null zusammenfaellt, sobald die Legende umbricht.
1286 */
1287 .legende-strich {
1288 flex: 0 0 auto;
1289 width: 34px;
1290 height: 3px;
1291 border-radius: 1px;
1292 }
1293
1294 /*
1295 * Der Hervorheben-Knopf steht in derselben Zelle wie das Namensfeld der
1296 * Fahrlinie. Ohne Abstand klebt er am Feldrand und sieht aus, als gehoere er
1297 * dazu - dann ist schwer zu treffen, was gemeint war.
1298 *
1299 * Bewusst ueber das Datenattribut und nicht ueber `.tabelle-rahmen td
1300 * .knopf-klein`: Letzteres traefe auch die Loeschknoepfe, die allein in ihrer
1301 * Zelle stehen.
1302 */
1303 [data-hervorheben] {
1304 margin-left: 6px;
1305 }
1306
1307 /* --- Pruefbericht --------------------------------------------------------- */
1308
1309 .befund {
1310 display: grid;
1311 grid-template-columns: auto 1fr;
1312 gap: 4px 12px;
1313 padding: 10px 12px;
1314 margin-bottom: 8px;
1315 border: 1px solid var(--rand);
1316 border-left-width: 4px;
1317 border-radius: var(--radius-klein);
1318 }
1319
1320 .befund-fehler {
1321 background: var(--fehler-flaeche);
1322 border-left-color: var(--fehler);
1323 }
1324 .befund-warnung {
1325 background: var(--warnung-flaeche);
1326 border-left-color: var(--warnung);
1327 }
1328 .befund-hinweis {
1329 background: var(--hinweis-flaeche);
1330 border-left-color: var(--hinweis);
1331 }
1332
1333 .befund-marke {
1334 padding: 1px 7px;
1335 font-size: 0.75rem;
1336 font-weight: 600;
1337 text-transform: uppercase;
1338 border-radius: 9px;
1339 }
1340
1341 .befund-fehler .befund-marke {
1342 color: var(--text-invers);
1343 background: var(--fehler);
1344 }
1345 .befund-warnung .befund-marke {
1346 color: var(--text-invers);
1347 background: var(--warnung);
1348 }
1349 .befund-hinweis .befund-marke {
1350 color: var(--text-invers);
1351 background: var(--hinweis);
1352 }
1353
1354 .befund-titel {
1355 font-weight: 600;
1356 }
1357
1358 .befund-koerper {
1359 grid-column: 2;
1360 }
1361
1362 .befund-koerper p {
1363 margin: 2px 0;
1364 }
1365
1366 .befund-quelle {
1367 font-size: 0.75rem;
1368 color: var(--text-gedaempft);
1369 }
1370
1371 .befund-vorschlag {
1372 font-size: 0.8125rem;
1373 }
1374
1375 .befund-vorschlag::before {
1376 content: '→ ';
1377 font-weight: 600;
1378 }
1379
1380 /* --- Kennzahlen ----------------------------------------------------------- */
1381
1382 .kennzahlen {
1383 display: grid;
1384 grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
1385 gap: 10px;
1386 }
1387
1388 .kennzahl {
1389 padding: 10px 12px;
1390 background: var(--flaeche-gedaempft);
1391 border: 1px solid var(--rand);
1392 border-radius: var(--radius-klein);
1393 }
1394
1395 .kennzahl dt {
1396 font-size: 0.75rem;
1397 color: var(--text-gedaempft);
1398 }
1399
1400 .kennzahl dd {
1401 margin: 2px 0 0;
1402 font-size: 1.1875rem;
1403 font-variant-numeric: tabular-nums;
1404 font-weight: 600;
1405 }
1406
1407 .kennzahl-fussnote {
1408 font-size: 0.75rem;
1409 color: var(--text-gedaempft);
1410 }
1411
1412 .stufe {
1413 display: inline-block;
1414 min-width: 22px;
1415 padding: 0 6px;
1416 font-weight: 700;
1417 color: var(--text-invers);
1418 text-align: center;
1419 border-radius: var(--radius-klein);
1420 }
1421
1422 .stufe-a,
1423 .stufe-b {
1424 background: var(--erfolg);
1425 }
1426 .stufe-c,
1427 .stufe-d {
1428 background: var(--warnung);
1429 }
1430 .stufe-e,
1431 .stufe-f {
1432 background: var(--fehler);
1433 }
1434
1435 /* --- Meldungen und Dialoge ------------------------------------------------ */
1436
1437 /*
1438 * Ablage der Kurzmeldungen, ueber der Statusleiste.
1439 *
1440 * Der Abstand nach unten war aus --leiste-hoehe gerechnet. Seit die Leiste
1441 * umbrechen darf, ist dieser Wert nur noch ihre Untergrenze: Bei zwei oder drei
1442 * Zeilen schoeben sich die Meldungen hinter die Leiste, und ausgerechnet eine
1443 * abgelehnte Eingabe waere dann nicht mehr zu lesen.
1444 *
1445 * Deshalb wird die tatsaechliche Oberkante der Leiste abgefragt. Wo das nicht
1446 * geht - aeltere Browser, oder wenn es gar keine Leiste gibt, etwa auf der
1447 * Startfehlerseite -, gilt weiter die alte Rechnung. Das max() faengt den Fall
1448 * ab, dass die Leiste beim Rollen unter den Fensterrand rutscht: Dann bleiben
1449 * die Meldungen am unteren Fensterrand stehen, statt mit hinauszuwandern.
1450 */
1451 .meldungen {
1452 position: fixed;
1453 right: 16px;
1454 bottom: calc(var(--leiste-hoehe) + 16px);
1455 /*
1456 * UEBER dem Fensterhintergrund (.dialog-hintergrund, z-index 300).
1457 *
1458 * Der Meldungsstapel wird als einziger Teil des Hintergrunds nicht
1459 * stillgelegt, damit die Sprachausgabe seine Live-Bereiche weiter ansagt und
1460 * eine stehengebliebene Warnung schliessbar bleibt (legeHintergrundStill in
1461 * src/ui/feedback.ts). Bei z-index 200 traf beides nicht zu: Der halb
1462 * deckende Fensterhintergrund lag darueber, die Meldung war abgedunkelt, und
1463 * ein Klick auf ihren Schliessen-Knopf landete auf dem Hintergrund - der
1464 * schliesst das FENSTER. Wer im Zwischenzeitenfenster eine Zahl vertippt,
1465 * bekam so eine Warnung, die er nicht wegbekommt, ohne das Fenster zu
1466 * verlieren.
1467 *
1468 * Meldungen stehen unten rechts, Fenster mittig: Ueberdeckung ist die
1469 * Ausnahme, und im Zweifel gehoert die Warnung nach vorn.
1470 */
1471 z-index: 400;
1472 display: flex;
1473 flex-direction: column;
1474 gap: 8px;
1475 max-width: 420px;
1476 /*
1477 * Warnungen und Fehler bleiben stehen, bis sie geschlossen werden (siehe
1478 * notify() in src/ui/feedback.ts). Mehrere koennen sich dadurch stapeln -
1479 * mehrfach abgelehnte Zahleneingaben erzeugen jede fuer sich eine Warnung.
1480 * Ohne Hoehenbegrenzung waechst der Stapel aus dem Bild heraus, und
1481 * ausgerechnet die aelteste Meldung, bei der es zuerst schiefging, waere
1482 * dann weder zu lesen noch zu schliessen.
1483 *
1484 * Wie bei `bottom` ist --leiste-hoehe nur die Ersatzrechnung fuer Browser
1485 * ohne Ankerbezug; das genaue Mass steht im @supports-Block darunter.
1486 */
1487 max-height: calc(100vh - var(--leiste-hoehe) - 32px);
1488 overflow-y: auto;
1489 }
1490
1491 /*
1492 * Die beiden Ansagebereiche im Meldungsstapel.
1493 *
1494 * Sie sind getrennt, weil eine Sprachausgabe Hinweise hoeflich und Warnungen
1495 * bestimmt ansagen soll - sichtbar bilden sie aber EINEN Stapel. Zuvor waren
1496 * es zwei eigene, gleich verortete Behaelter, die deckungsgleich uebereinander
1497 * lagen; seit Warnungen stehen bleiben, verdeckte der eine den anderen.
1498 */
1499 .meldungen-gruppe {
1500 display: flex;
1501 flex-direction: column;
1502 gap: 8px;
1503 }
1504
1505 /* Ein leerer Bereich darf keine Luecke im Stapel hinterlassen. */
1506 .meldungen-gruppe:empty {
1507 display: none;
1508 }
1509
1510 @supports (anchor-name: --statusleiste) {
1511 .meldungen {
1512 bottom: max(16px, calc(anchor(--statusleiste top, var(--leiste-hoehe)) + 16px));
1513 /*
1514 * Die Hoehenbegrenzung muss derselben Kante folgen wie `bottom`, sonst
1515 * treten die beiden Angaben auseinander: `bottom` haengt an der
1516 * TATSAECHLICHEN Oberkante der Leiste, die Begrenzung rechnete aber mit
1517 * --leiste-hoehe - und das ist seit dem Umbruch nur noch die Untergrenze.
1518 * Bricht die Leiste auf drei Zeilen um, war der erlaubte Stapel um zwei
1519 * Zeilenhoehen zu hoch und wuchs oben wieder aus dem Fenster heraus,
1520 * genau an der aeltesten Meldung vorbei. anchor-size() liefert die
1521 * gemessene Hoehe; die Ersatzangabe greift, wo es gar keine Leiste gibt.
1522 */
1523 max-height: calc(100vh - anchor-size(--statusleiste height, var(--leiste-hoehe)) - 32px);
1524 }
1525 }
1526
1527 .meldung {
1528 display: flex;
1529 gap: 10px;
1530 align-items: flex-start;
1531 padding: 10px 12px;
1532 background: var(--flaeche-erhoben);
1533 border: 1px solid var(--rand);
1534 border-left: 4px solid var(--hinweis);
1535 border-radius: var(--radius);
1536 box-shadow: var(--schatten-hoch);
1537 }
1538
1539 .meldung-erfolg {
1540 border-left-color: var(--erfolg);
1541 }
1542 .meldung-warnung {
1543 border-left-color: var(--warnung);
1544 }
1545 .meldung-fehler {
1546 border-left-color: var(--fehler);
1547 }
1548
1549 /*
1550 * Meldungsverlauf im Fenster "Meldungen dieser Sitzung".
1551 *
1552 * Dieselben Meldungsstuecke, nur untereinander in einer Liste statt schwebend
1553 * am Bildschirmrand: Der Schlagschatten gehoert zum schwebenden Balken und
1554 * waere hier nur Unruhe, und die Zeitangabe steht als eigene Zeile ueber dem
1555 * Text - im Verlauf ist sie das Einzige, was die Meldungen auseinanderhaelt.
1556 */
1557 .meldungsverlauf {
1558 display: flex;
1559 flex-direction: column;
1560 gap: 8px;
1561 padding: 0;
1562 margin: 0;
1563 list-style: none;
1564 }
1565
1566 .meldungsverlauf .meldung {
1567 flex-direction: column;
1568 gap: 2px;
1569 box-shadow: none;
1570 }
1571
1572 .meldungsverlauf .meldung strong {
1573 font-size: 0.75rem;
1574 color: var(--text-gedaempft);
1575 }
1576
1577 /*
1578 * 24 Bildpunkte im Quadrat sind das Mindestmass fuer ein Ziel, das getroffen
1579 * werden soll (WCAG 2.5.8); das Kreuz kam mit seinem Polster auf rund 20x21.
1580 * Es ist der einzige Weg, eine stehengebliebene Warnung wegzuraeumen.
1581 */
1582 .meldung-schliessen {
1583 min-width: 24px;
1584 min-height: 24px;
1585 padding: 0 4px;
1586 margin-left: auto;
1587 font-size: 1.125rem;
1588 line-height: 1;
1589 justify-content: center;
1590 }
1591
1592 .dialog-hintergrund {
1593 position: fixed;
1594 inset: 0;
1595 z-index: 300;
1596 display: flex;
1597 align-items: center;
1598 justify-content: center;
1599 padding: 20px;
1600 background: rgb(9 12 18 / 55%);
1601 }
1602
1603 .dialog {
1604 width: 100%;
1605 max-width: 480px;
1606 max-height: calc(100vh - 40px);
1607 padding: 18px 20px;
1608 overflow: auto;
1609 background: var(--flaeche);
1610 border-radius: var(--radius);
1611 box-shadow: var(--schatten-hoch);
1612 }
1613
1614 .dialog-gross {
1615 max-width: 900px;
1616 }
1617
1618 .dialog-kopf {
1619 display: flex;
1620 gap: 10px;
1621 align-items: center;
1622 margin-bottom: 12px;
1623 }
1624
1625 .dialog-schliessen {
1626 margin-left: auto;
1627 font-size: 1.25rem;
1628 line-height: 1;
1629 }
1630
1631 .dialog-text {
1632 color: var(--text-gedaempft);
1633 white-space: pre-line;
1634 }
1635
1636 .dialog-inhalt {
1637 display: flex;
1638 flex-direction: column;
1639 gap: 12px;
1640 }
1641
1642 .dialog-aktionen {
1643 display: flex;
1644 gap: 8px;
1645 justify-content: flex-end;
1646 margin-top: 16px;
1647 }
1648
1649 /* --- Sonstiges ------------------------------------------------------------ */
1650
1651 .hinweisbalken {
1652 display: flex;
1653 gap: 10px;
1654 align-items: flex-start;
1655 padding: 10px 12px;
1656 border: 1px solid var(--rand);
1657 border-left: 4px solid var(--hinweis);
1658 border-radius: var(--radius-klein);
1659 }
1660
1661 .hinweisbalken-warnung {
1662 background: var(--warnung-flaeche);
1663 border-left-color: var(--warnung);
1664 }
1665
1666 .hinweisbalken-fehler {
1667 background: var(--fehler-flaeche);
1668 border-left-color: var(--fehler);
1669 }
1670
1671 .marke {
1672 display: inline-block;
1673 padding: 1px 7px;
1674 font-size: 0.75rem;
1675 font-weight: 600;
1676 border: 1px solid var(--rand-stark);
1677 border-radius: 9px;
1678 }
1679
1680 /* Lageplan */
1681
1682 .lageplan-anordnung {
1683 display: grid;
1684 grid-template-columns: minmax(0, 3fr) minmax(300px, 1fr);
1685 gap: 14px;
1686 align-items: start;
1687 }
1688
1689 @media (width <= 1100px) {
1690 .lageplan-anordnung {
1691 grid-template-columns: 1fr;
1692 }
1693 }
1694
1695 .lageplan-rahmen {
1696 overflow: hidden;
1697 background: var(--flaeche);
1698 border: 1px solid var(--rand);
1699 border-radius: var(--radius);
1700 }
1701
1702 .lageplan-leinwand {
1703 display: block;
1704 cursor: crosshair;
1705 }
1706
1707 /*
1708 * Fokusanzeige der Zeichenflaeche.
1709 *
1710 * Die globale zweifarbige Anzeige traegt hier nicht: Ihr heller Aussenring
1711 * liegt ausserhalb des Inhaltskastens und wird von der `overflow: hidden` des
1712 * Rahmens weggeschnitten. Uebrig blieb eine einfarbige Linie in der
1713 * Akzentfarbe, nach innen versetzt - und die liegt ueber einem Luftbild auf
1714 * beliebigem Untergrund. WCAG 1.4.11 fordert 3:1 gegenueber der Umgebung; ueber
1715 * einem Orthophoto ist das mit einer einzigen Farbe nicht zuzusichern.
1716 *
1717 * Deshalb zwei Ringe INNERHALB der Flaeche, hell gegen dunkel. Welcher von
1718 * beiden gerade traegt, haengt vom Bild ab - einer davon traegt immer. Der
1719 * Schatten liegt innen (`inset`) und wird deshalb nicht abgeschnitten.
1720 */
1721 .lageplan-leinwand:focus-visible {
1722 outline: 2px solid var(--akzent);
1723 outline-offset: -2px;
1724 box-shadow:
1725 inset 0 0 0 4px #ffffff,
1726 inset 0 0 0 6px #10151f;
1727 }
1728
1729 .lageplan-seite {
1730 display: flex;
1731 flex-direction: column;
1732 gap: 12px;
1733 }
1734
1735 /*
1736 * Haltlinien- und Fahrlinientabelle stehen unter der Zeichenflaeche.
1737 *
1738 * In der Seitenleiste hatten sie rund 300 Bildpunkte. Die Fahrlinientabelle
1739 * fuehrt aber acht Spalten, darunter zwei Auswahlfelder mit Namen wie
1740 * "Zufahrt Nord geradeaus" - davon blieb "Zuf" uebrig. Ueber die volle Breite
1741 * sind beide lesbar und nebeneinander vergleichbar.
1742 */
1743 .lageplan-tabellen {
1744 display: grid;
1745 grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);
1746 gap: 12px;
1747 align-items: start;
1748 margin-top: 12px;
1749 }
1750
1751 @media (width <= 1100px) {
1752 .lageplan-tabellen {
1753 grid-template-columns: 1fr;
1754 }
1755 }
1756
1757 .lageplan-werkzeuge {
1758 display: flex;
1759 flex-wrap: wrap;
1760 gap: 6px;
1761 }
1762
1763 /*
1764 * Zeilenzustaende schlagen die Ueberfahr-Einfaerbung.
1765 *
1766 * `tbody tr:hover td` hat drei Typen und eine Pseudoklasse, also (0,1,3);
1767 * `.lageplan-aktiv td` kam auf (0,1,1) und verlor. Sobald der Zeiger auf der
1768 * Zeile stand, verschwand damit genau die Auskunft, die sie traegt: WELCHE
1769 * Haltlinie gerade in der Zeichnung hervorgehoben ist und WELCHER Weg vom
1770 * gemessenen Wert abweicht. Wer mit der Maus die Liste entlangfaehrt, bekam
1771 * die Zeile unter dem Zeiger als einzige ohne Zustand zu sehen.
1772 *
1773 * Mit `tbody tr.…` stehen beide Regeln auf (0,1,3); die spaetere gewinnt, und
1774 * das sind diese hier. Die Hover-Einfaerbung bleibt fuer alle uebrigen Zeilen.
1775 */
1776 tbody tr.lageplan-aktiv td {
1777 background: var(--akzent-hell);
1778 }
1779
1780 tbody tr.lageplan-abweichung td {
1781 background: var(--warnung-flaeche);
1782 }
1783
1784 /* Naechster Arbeitsschritt */
1785
1786 /*
1787 * Steht UNTER der Ansicht und richtet sich nach ihr - siehe .ansicht.
1788 *
1789 * Die Form ist die eines Abschlusses und nicht die eines Hinweises: eine
1790 * Trennlinie nach oben statt einer Farbkante links. Solange die Fuehrung oben
1791 * stand, teilte sie Bauform und - in der Fehlerstufe - auch die Farbe mit den
1792 * Hinweisbalken der Ansichten; derselbe Platz und dieselbe Farbe fuer zwei
1793 * verschiedene Dinge. Der Platz oben gehoert jetzt allein dem, was JETZT und
1794 * HIER gilt.
1795 */
1796 .fuehrung-halter {
1797 margin: 24px 0 0;
1798 }
1799
1800 .fuehrung {
1801 display: flex;
1802 gap: 14px;
1803 align-items: center;
1804 padding: 16px 2px 2px;
1805 border-top: 1px solid var(--rand);
1806 }
1807
1808 /*
1809 * Die Dringlichkeit faerbt die Marke, nicht die Flaeche.
1810 *
1811 * Eine getoente Flaeche unter der Ansicht laese sich wieder mit einem
1812 * Hinweisbalken verwechseln - und ein fehlender Raeumweg gehoert ohnehin
1813 * zuerst in den Pruefbericht und an das Abzeichen seiner Ansicht, nicht in
1814 * einen Wegweiser.
1815 */
1816 .fuehrung-fehler .fuehrung-marke {
1817 background: var(--warnung);
1818 }
1819
1820 .fuehrung-fertig .fuehrung-marke {
1821 background: var(--erfolg);
1822 }
1823
1824 .fuehrung-text {
1825 min-width: 0;
1826 }
1827
1828 .fuehrung-text strong {
1829 display: flex;
1830 flex-wrap: wrap;
1831 gap: 8px;
1832 align-items: baseline;
1833 }
1834
1835 .fuehrung-marke {
1836 padding: 1px 7px;
1837 font-size: 0.75rem;
1838 font-weight: 700;
1839 color: var(--text-invers);
1840 text-transform: uppercase;
1841 letter-spacing: 0.03em;
1842 background: var(--akzent);
1843 border-radius: 9px;
1844 }
1845
1846 .fuehrung-text p {
1847 max-width: 92ch;
1848 margin: 3px 0 0;
1849 font-size: 0.8125rem;
1850 color: var(--text-gedaempft);
1851 }
1852
1853 .fuehrung > .knopf {
1854 flex-shrink: 0;
1855 margin-left: auto;
1856 }
1857
1858 /*
1859 * Die Marke "als Naechstes dran" in der Navigationsleiste.
1860 *
1861 * Ein Punkt in der Akzentfarbe, kein zweites Abzeichen: Das Abzeichen daneben
1862 * zaehlt Beanstandungen, und zwei zaehlende Zeichen an einem Eintrag waeren
1863 * nicht auseinanderzuhalten. Die Farbe allein traegt die Aussage nicht - der
1864 * ausgeschriebene Text "als Nächstes dran" steht fuer die Sprachausgabe
1865 * daneben, und die halbfette Beschriftung zeigt es auch ohne Farbe.
1866 */
1867 .nav-naechster {
1868 flex-shrink: 0;
1869 margin-left: 4px;
1870 font-size: 0.7rem;
1871 line-height: 1;
1872 color: var(--akzent);
1873 }
1874
1875 .nav-knopf-naechster .nav-beschriftung {
1876 font-weight: 600;
1877 }
1878
1879 /*
1880 * Der Haken "erledigt".
1881 *
1882 * In der Erfolgsfarbe und deutlich zurueckhaltender als die Marke daneben: Er
1883 * ist die schwaechste der drei Aussagen am Eintrag - was erledigt ist, braucht
1884 * keine Aufmerksamkeit mehr. Farbe traegt ihn nicht allein; das Zeichen selbst
1885 * ist eines, und der ausgeschriebene Zusatz steht fuer die Sprachausgabe
1886 * daneben.
1887 */
1888 .nav-fertig {
1889 flex-shrink: 0;
1890 margin-left: 4px;
1891 font-size: 0.75rem;
1892 line-height: 1;
1893 color: var(--erfolg);
1894 }
1895
1896 /* Die beiden Verweise im "Über"-Fenster - nebeneinander, mit Abstand darum. */
1897 .ueber-verweise {
1898 display: flex;
1899 flex-wrap: wrap;
1900 gap: 8px;
1901 margin: 10px 0 0;
1902 }
1903
1904 .assistent-erklaerung {
1905 max-width: 80ch;
1906 padding: 10px 12px;
1907 color: var(--text);
1908 background: var(--flaeche-gedaempft);
1909 border-radius: var(--radius-klein);
1910 }
1911
1912 /* Hilfe */
1913
1914 /*
1915 * Hilfeknopf.
1916 *
1917 * 24 Bildpunkte im Quadrat sind das Mindestmass fuer ein Ziel, das mit dem
1918 * Finger oder mit zittriger Hand getroffen werden soll (WCAG 2.5.8). Der Knopf
1919 * steht in Spaltenkoepfen dicht neben der Beschriftung und in Feldkoepfen dicht
1920 * neben dem Feldnamen - bei 18 Bildpunkten trifft ihn dort niemand
1921 * zuverlaessig, und wer danebengreift, oeffnet stattdessen die Sortierung oder
1922 * setzt den Fokus ins Feld.
1923 *
1924 * justify-content ist noetig, weil .hilfe-knopf von .knopf 'display:
1925 * inline-flex' erbt: ohne waagerechte Zentrierung klebt das Fragezeichen im
1926 * groesseren Kreis am linken Rand.
1927 */
1928 .hilfe-knopf {
1929 width: 24px;
1930 height: 24px;
1931 padding: 0;
1932 margin-left: 5px;
1933 font-size: 0.75rem;
1934 font-weight: 700;
1935 line-height: 1;
1936 color: var(--akzent);
1937 vertical-align: middle;
1938 background: var(--akzent-hell);
1939 border: 1px solid transparent;
1940 border-radius: 50%;
1941 justify-content: center;
1942 }
1943
1944 .hilfe-knopf:hover:not(:disabled) {
1945 color: var(--akzent-text);
1946 background: var(--akzent);
1947 border-color: var(--akzent);
1948 }
1949
1950 th .hilfe-knopf {
1951 margin-left: 4px;
1952 }
1953
1954 .hilfe-kurz {
1955 padding: 10px 12px;
1956 font-size: 0.9375rem;
1957 background: var(--akzent-hell);
1958 border-radius: var(--radius-klein);
1959 }
1960
1961 .hilfe-abschnitt h3 {
1962 margin-bottom: 2px;
1963 font-size: 0.8125rem;
1964 color: var(--text-gedaempft);
1965 text-transform: uppercase;
1966 letter-spacing: 0.03em;
1967 }
1968
1969 .hilfe-abschnitt p {
1970 max-width: 80ch;
1971 margin: 0;
1972 /* Absaetze und Aufzaehlungen aus dem Hilfetext sichtbar machen. */
1973 white-space: pre-line;
1974 }
1975
1976 .hilfe-warnung {
1977 padding: 8px 12px;
1978 background: var(--warnung-flaeche);
1979 border-left: 3px solid var(--warnung);
1980 border-radius: var(--radius-klein);
1981 }
1982
1983 .hilfe-verweise {
1984 padding-top: 10px;
1985 border-top: 1px solid var(--rand);
1986 }
1987
1988 .hilfe-verweis {
1989 color: var(--akzent);
1990 text-decoration: underline;
1991 }
1992
1993 .glossar-liste {
1994 display: flex;
1995 flex-direction: column;
1996 gap: 2px;
1997 max-height: 52vh;
1998 overflow-y: auto;
1999 }
2000
2001 .glossar-eintrag {
2002 padding: 8px 10px;
2003 border-bottom: 1px solid var(--rand);
2004 }
2005
2006 .glossar-eintrag:hover {
2007 background: var(--flaeche-gedaempft);
2008 }
2009
2010 .glossar-kopf {
2011 display: flex;
2012 gap: 8px;
2013 align-items: center;
2014 }
2015
2016 .glossar-kopf .knopf {
2017 margin-left: auto;
2018 }
2019
2020 .glossar-eintrag p {
2021 margin: 2px 0 0;
2022 font-size: 0.8125rem;
2023 color: var(--text-gedaempft);
2024 }
2025
2026 /* Herkunft der Kennwerte */
2027
2028 .marke-gesichert {
2029 color: var(--erfolg);
2030 background: var(--erfolg-flaeche);
2031 border-color: var(--erfolg);
2032 }
2033
2034 .marke-abzugleichen {
2035 color: var(--warnung);
2036 background: var(--warnung-flaeche);
2037 border-color: var(--warnung);
2038 }
2039
2040 .marke-fachliteratur {
2041 color: var(--hinweis);
2042 background: var(--hinweis-flaeche);
2043 border-color: var(--hinweis);
2044 }
2045
2046 .herkunft {
2047 padding: 8px 10px;
2048 margin-top: 10px;
2049 background: var(--flaeche-gedaempft);
2050 border: 1px solid var(--rand);
2051 border-radius: var(--radius-klein);
2052 }
2053
2054 .herkunft > summary {
2055 cursor: pointer;
2056 list-style: revert;
2057 }
2058
2059 .herkunft > summary::marker {
2060 color: var(--text-gedaempft);
2061 }
2062
2063 .herkunft-inhalt {
2064 padding-top: 8px;
2065 margin-top: 8px;
2066 border-top: 1px solid var(--rand);
2067 }
2068
2069 .herkunft-inhalt p {
2070 max-width: 90ch;
2071 }
2072
2073 .farbpunkt {
2074 display: inline-block;
2075 width: 11px;
2076 height: 11px;
2077 margin-right: 6px;
2078 vertical-align: -1px;
2079 border: 1px solid rgb(0 0 0 / 25%);
2080 border-radius: 2px;
2081 }
2082
2083 .tastenkuerzel {
2084 padding: 1px 5px;
2085 font-family: var(--schrift-fest);
2086 font-size: 0.75rem;
2087 background: var(--flaeche-gedaempft);
2088 border: 1px solid var(--rand-stark);
2089 border-radius: 3px;
2090 }
2091
2092 /* Schmale Fenster: die Navigation rueckt ueber den Inhalt. */
2093 @media (width <= 900px) {
2094 .anwendung {
2095 grid-template-columns: 1fr;
2096 grid-template-areas:
2097 'kopf'
2098 'nav'
2099 'inhalt'
2100 'leiste';
2101 /* Auch im schmalen Fenster darf die Fusszeile umbrechen und mitwachsen. */
2102 grid-template-rows: auto auto 1fr minmax(var(--leiste-hoehe), auto);
2103 }
2104
2105 .nav {
2106 display: flex;
2107 gap: 4px;
2108 align-items: center;
2109 overflow-x: auto;
2110 border-right: none;
2111 border-bottom: 1px solid var(--rand);
2112 }
2113
2114 /*
2115 * Auch die Gruppenlisten laufen quer. Ohne diese Regel stuenden die
2116 * Eintraege jeder Gruppe wieder untereinander, und die Navigationsleiste
2117 * waere im schmalen Fenster so hoch wie die ganze Anwendung.
2118 */
2119 .nav-liste {
2120 display: flex;
2121 flex-shrink: 0;
2122 gap: 4px;
2123 }
2124
2125 .nav-gruppe {
2126 flex-shrink: 0;
2127 margin: 0;
2128 white-space: nowrap;
2129 }
2130
2131 .nav-knopf {
2132 width: auto;
2133 white-space: nowrap;
2134 }
2135 }
2136
2137 @media print {
2138 .kopf,
2139 .nav,
2140 .leiste,
2141 .meldungen,
2142 .abschnitt-aktionen {
2143 display: none !important;
2144 }
2145
2146 .anwendung {
2147 display: block;
2148 height: auto;
2149 }
2150
2151 .inhalt {
2152 padding: 0;
2153 overflow: visible;
2154 }
2155
2156 body {
2157 overflow: visible;
2158 background: #fff;
2159 }
2160 }