/* =================================================================== Creator Workspace - Anmeldeseite ------------------------------------------------------------------- Grundsatz: dunkel und ruhig. Die Farben stammen aus dem Motiv, sind aber bewusst entsättigt - Neon als Stimmung, nicht als Blendung. Kein reines Weiss auf Schwarz, keine harten Kanten, keine Blinker. =================================================================== */ :root { --tinte: #05070d; --glas: rgba(10, 14, 23, 0.74); --glas-tief: rgba(6, 9, 16, 0.86); /* Die Flaeche jeder Kachel, Karte und Spalte -- an EINER Stelle. Vorher stand in jeder Datei ein eigener Wert zwischen .02 und .032 WEISS, also praktisch durchsichtig. Solange der Hintergrund fast schwarz war, fiel das nicht auf. Seit die Buehnen hell sind, kam das Bild mitten durch den Text. Jetzt eine deckende dunkle Flaeche: Der Hintergrund bleibt sichtbar, aber DAZWISCHEN -- nicht hinter der Schrift. Genau das macht den Unterschied zwischen "hat einen Hintergrund" und "ist unlesbar". Wer die Kacheln durchsichtiger oder dichter will, aendert nur diese eine Zeile. */ --flaeche: rgba(9, 13, 22, 0.78); --rand: rgba(150, 186, 220, 0.16); --rand-hell: rgba(150, 186, 220, 0.30); --text: #dbe4ef; /* kein reines Weiss - schont die Augen */ --text-leise: #94a5bb; /* Von #6d7d92 auf #75859a angehoben (01.09.2026). Aufgefallen erst, als die Buehne im Hintergrund dazukam und der Kontrast an echten BILDPUNKTEN gemessen wurde statt an der Farbangabe: Der leiseste Grauton lag bei 4,43:1 -- knapp unter den geforderten 4,5:1. Das war schon vorher so, nur hatte es nie jemand nachgerechnet. Jetzt 4,95:1 auf dem hellsten Untergrund, 5,35:1 auf reiner Tinte. Immer noch deutlich leiser als der Haupttext, aber lesbar -- und das gilt jetzt fuer JEDE Seite, nicht nur fuer die mit dem Hintergrundbild. */ /* 07.09.2026: #75859a -> #7f8fa6. Der alte Wert war am 01.09. gegen die DAMALIGE Buehne gemessen und lag dort bei 4,95:1. Seit die Hintergruende Kontrast, Saettigung und eine Vignette statt eines flachen Schleiers bekommen haben, sind sie heller -- und derselbe Ton fiel auf 4,50:1, also genau auf die Grenze. Gemessen von pruef-buehne an echten Bildpunkten, nicht an der Farbangabe. Das ist der Preis dafuer, dass das Motiv jetzt zu sehen ist: Wer den Hintergrund heller macht, muss die leiseste Schrift nachziehen. Die Alternative waere gewesen, das Bild wieder zuzudecken -- dann haette man den Aufwand auch lassen koennen. */ --text-still: #7f8fa6; --akzent: #3fbdf5; /* aus dem Neon des Motivs, entsättigt */ --akzent-tief: #1f7fb0; --violett: #8a76ff; --warn: #ff9aa2; /* weiches Rot statt Signalrot */ --radius: 18px; --radius-klein: 12px; --schatten: 0 24px 60px -20px rgba(0, 0, 0, 0.75); --tempo: .22s cubic-bezier(.4, 0, .2, 1); } *, *::before, *::after { box-sizing: border-box; } /* `color-scheme: dark` ist der eigentliche Schalter für alles, was der Browser selbst zeichnet und was CSS nicht erreicht: die aufgeklappte Liste eines bleibt im Dokument -- es haelt den Wert und macht jedes vorhandene `feld.value` weiter richtig. Es wird nur unsichtbar gemacht; sichtbar ist der Knopf darueber. Bewusst NICHT display:none: Ein so verstecktes Feld faellt aus der Formularpruefung des Browsers heraus, und `required` wuerde stumm nicht mehr greifen. =================================================================== */ .wahl2 { position: relative; display: block; } .wahl2__echt { position: absolute; inset: 0; opacity: 0; pointer-events: none; /* Nur ein Pixel gross, damit ein Fehlerhinweis des Browsers noch am richtigen Ort erscheint. */ width: 1px; height: 1px; } .wahl2__knopf { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; padding: 10px 12px; cursor: pointer; background: linear-gradient(#141c28, #101722); border: 1px solid var(--rand); border-radius: var(--radius-klein); color: var(--text); font: inherit; text-align: left; transition: border-color .16s ease, background .16s ease; } .wahl2__knopf:hover:not([disabled]) { border-color: rgba(255, 255, 255, .24); background: linear-gradient(#18212f, #141b27); } .wahl2__knopf:focus-visible, .wahl2__knopf[aria-expanded="true"] { outline: none; border-color: rgba(63, 189, 245, .65); box-shadow: 0 0 0 3px rgba(63, 189, 245, .16); } .wahl2__knopf[disabled] { opacity: .5; cursor: default; } .wahl2__knopf[data-leer="ja"] .wahl2__text { color: var(--text-still); } .wahl2__text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .wahl2__pfeil { width: 16px; height: 16px; flex: none; fill: none; stroke: var(--text-still); stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; transition: transform .18s ease; } .wahl2__knopf[aria-expanded="true"] .wahl2__pfeil { transform: rotate(180deg); } /* Die Liste haengt am Fenster, nicht am Elternelement -- in einer Karte mit overflow: hidden waere sie sonst abgeschnitten. */ .wahl2__liste { position: fixed; z-index: 90; min-width: 180px; max-width: min(420px, calc(100vw - 24px)); overflow-y: auto; padding: 5px; /* Am Ende der Liste NICHT weiterrollen: Ohne das gibt der Browser das Scrollen an die Seite weiter (Scroll-Verkettung), die Seite bewegt sich -- und genau daran schliesst die Liste zu Recht. Damit waere der Fehler von oben zur Haelfte zurueck. */ overscroll-behavior: contain; background: #0d1420; border: 1px solid rgba(63, 189, 245, .3); border-radius: 11px; box-shadow: 0 18px 44px -16px rgba(0, 0, 0, .85); } .wahl2__gruppe { margin: 7px 8px 3px; font-size: .68rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--akzent); } .wahl2__gruppe:first-child { margin-top: 3px; } .wahl2__eintrag { display: block; width: 100%; padding: 8px 11px; cursor: pointer; background: transparent; border: 0; border-radius: 7px; color: var(--text-leise); font: inherit; font-size: .88rem; text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .wahl2__eintrag:hover:not([disabled]) { background: rgba(255, 255, 255, .06); color: var(--text); } .wahl2__eintrag:focus-visible { outline: none; background: rgba(63, 189, 245, .16); color: #fff; } .wahl2__eintrag[data-an="ja"] { color: #fff; font-weight: 600; background: rgba(63, 189, 245, .12); } .wahl2__eintrag[disabled], .wahl2__eintrag[data-aus="ja"] { color: var(--text-still); cursor: default; } /* ---------- Suchen und selbst eintragen (02.09.2026) -------------------- Das Suchfeld sitzt fest oben in der Liste, die Eintraege scrollen darunter weg -- sonst waere es beim Scrollen weg, und man wuesste nicht mehr, wonach gerade gefiltert wird. */ .wahl2__suche { display: block; width: 100%; margin: 0 0 5px; padding: 8px 11px; box-sizing: border-box; background: rgba(255, 255, 255, .04); border: 1px solid var(--rand); border-radius: 8px; color: var(--text); font: inherit; font-size: .88rem; } .wahl2__suche::placeholder { color: var(--text-still); } .wahl2__suche:focus-visible { outline: none; border-color: rgba(63, 189, 245, .6); box-shadow: 0 0 0 3px rgba(63, 189, 245, .14); } /* Nur die Eintraege scrollen, nicht das Suchfeld mit. */ .wahl2__zeilen { max-height: min(46vh, 320px); overflow-y: auto; } /* Der getippte Name als eigener Eintrag. Gedeckt abgesetzt, nicht grell -- er ist eine Moeglichkeit, keine Warnung. */ .wahl2__eintrag--eigen { color: #e8c07a; border: 1px dashed rgba(216, 161, 58, .45); margin-bottom: 4px; } .wahl2__eintrag--eigen:hover:not([disabled]) { background: rgba(216, 161, 58, .12); color: #f4dcb0; } .wahl2__leer { margin: 0; padding: 9px 11px; color: var(--text-still); font-size: .82rem; } /* Steht ein freier Name im Feld, sagt der Rand es leise mit. */ .wahl2__knopf[data-extern="ja"] { border-color: color-mix(in srgb, #d8a13a 45%, var(--rand)); } .wahl2__hinweis { margin: 6px 0 0; font-size: .78rem; line-height: 1.45; color: var(--text-leise); } .wahl2__hinweis::before { content: "↯"; margin-right: 6px; color: #d8a13a; } @media (prefers-reduced-motion: reduce) { .wahl2__knopf, .wahl2__pfeil { transition: none; } } @media (forced-colors: active) { /* Ohne Farben traegt der gestrichelte Rand die Unterscheidung. */ .wahl2__eintrag--eigen { border: 1px dashed CanvasText; } .wahl2__knopf[data-extern="ja"] { border: 2px solid CanvasText; } } /* =================================================================== Schalter (31.08.2026). Lag zuerst in wissen.css -- und fehlte prompt auf der Automationen- Seite, wo er als nacktes Kaestchen erschien. Genau derselbe Fehler wie damals bei .knopf-still: Ein gemeinsamer Baustein in einer Seiten-Datei fehlt irgendwann dort, wo die Datei nicht geladen wird. =================================================================== */ /* ---------- Schalter „besonders wichtig“ --------------------------------- Ein Kästchen von 17 Pixeln ist auf dem Handy kaum zu treffen und sagt nicht, was passiert. Der Schalter ist groß, zeigt seinen Zustand und erklärt sich in einer Zeile. */ .schalter { display: flex; align-items: flex-start; gap: 14px; margin-top: 18px; padding: 14px 16px; cursor: pointer; border: 1px solid var(--rand); border-radius: var(--radius); background: var(--flaeche); transition: border-color .18s ease, background .18s ease; } .schalter:hover { border-color: rgba(255, 255, 255, .2); } .schalter input { position: absolute; opacity: 0; width: 0; height: 0; } .schalter__gleis { flex: none; position: relative; width: 42px; height: 24px; margin-top: 1px; border-radius: 999px; background: rgba(255, 255, 255, .1); border: 1px solid var(--rand); transition: background .2s ease, border-color .2s ease; } .schalter__punkt { position: absolute; left: 3px; top: 3px; width: 16px; height: 16px; border-radius: 50%; background: var(--text-still); transition: transform .2s ease, background .2s ease; } .schalter input:checked + .schalter__gleis { background: rgba(232, 192, 125, .3); border-color: rgba(232, 192, 125, .6); } .schalter input:checked + .schalter__gleis .schalter__punkt { transform: translateX(18px); background: #e8c07d; } .schalter input:focus-visible + .schalter__gleis { box-shadow: 0 0 0 3px rgba(232, 192, 125, .28); } .schalter:has(input:checked) { border-color: rgba(232, 192, 125, .35); background: rgba(232, 192, 125, .05); } .schalter__text { display: grid; gap: 2px; font-size: .88rem; } .schalter__text .leise { font-size: .79rem; } /* ===================================================================== MATERIAL — die ganze Oberfläche auf einer Sprache (03.09.2026) Die Kachelzeichen sind Körper geworden. Alles andere war noch flach, und das fiel dadurch erst richtig auf: ein plastisches Zeichen neben einem gemalten Knopf sieht nicht nach "teilweise gut" aus, sondern nach Versehen. Deshalb gelten ab hier für JEDES Bauteil dieselben drei Regeln -- dieselben, nach denen auch die Zeichen gebaut sind: 1. LICHT VON OBEN. Eine helle Kante an der Oberkante, in der Mitte am stärksten, nach aussen auslaufend. Echtes Licht auf einer Kante sieht so aus; eine durchgehend gleich helle Linie ist ein Strich. 2. TIEFE NACH UNTEN. Ein Schatten, der nach unten versetzt liegt -- wie bei jedem Gegenstand, der auf etwas liegt. Ohne ihn klebt ein Element auf der Seite, statt darauf zu liegen. 3. VERLAUF STATT FLÄCHE. Oben eine Spur heller als unten. Kaum zu sehen, aber ohne ihn bleibt jede Fläche tot. Und eine vierte, die nur für Bedienbares gilt: 4. WAS MAN DRÜCKT, GEHT HINEIN. Beim Klick kehrt sich die Wölbung um: Licht nach unten, Schatten nach oben. Das ist der Unterschied zwischen "es passiert etwas" und "ich habe etwas gedrückt". Alles bleibt gedeckt. Diese Bauteile stehen zu Dutzenden auf einer Seite -- was einzeln beeindruckt, blendet im Dutzend. ===================================================================== */ /* ---------- 1. Knöpfe: Körper statt Fläche ---------------------------- */ .knopf, .knopf-still, .schritt, .abmelden, .stufe-knopf, .suche-knopf, .suche-zu, .todo__weg, .karte__stift { box-shadow: inset 0 1px 0 rgba(255, 255, 255, .09), inset 0 -2px 5px -3px rgba(0, 0, 0, .6), 0 3px 8px -5px rgba(0, 0, 0, .8); } .knopf:hover, .knopf-still:hover, .schritt:hover:not([disabled]), .abmelden:hover, .stufe-knopf:hover, .suche-knopf:hover, .suche-zu:hover, .todo__weg:hover, .karte__stift:hover { box-shadow: inset 0 1px 0 rgba(255, 255, 255, .14), inset 0 -2px 5px -3px rgba(0, 0, 0, .6), 0 8px 20px -9px color-mix(in srgb, var(--f) 85%, transparent), inset 0 0 22px -14px var(--f); } /* Gedrückt: die Wölbung kehrt sich um. */ .knopf:active, .knopf-still:active, .schritt:active:not([disabled]), .abmelden:active, .stufe-knopf:active, .suche-knopf:active, .suche-zu:active, .todo__weg:active, .karte__stift:active { transform: translateY(1px); box-shadow: inset 0 2px 6px -2px rgba(0, 0, 0, .75), inset 0 -1px 0 rgba(255, 255, 255, .07); } /* ---------- 2. Eingabefelder: vertieft statt aufgesetzt ---------------- */ .neu input, .neu select, .neu textarea, .wahl2__knopf, .wahl2__suche, .betreuung__wahl, .code-feld { box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .75), inset 0 1px 0 rgba(255, 255, 255, .05); } /* Ein Feld, in das man schreibt, ist eine Mulde -- kein Knopf. Deshalb liegt das Licht hier UNTEN und der Schatten oben: genau umgekehrt. */ .neu input:focus, .neu select:focus, .neu textarea:focus, .wahl2__suche:focus, .betreuung__wahl:focus { box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, .75), 0 0 0 3px rgba(63, 189, 245, .16); } /* ---------- 3. Marken und Zähler: kleine Plaketten --------------------- */ .marke, .marke-still, .marke-rolle, .marke-art, .marke-fehlt, .stufe__zahl, .gruppe__zahl, .k-chip, .kk__marken > * { box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 2px 5px -4px rgba(0, 0, 0, .9); } /* ---------- 4. Hinweisflächen: Licht auf der Oberkante ----------------- */ .leer-hinweis, .hinweis, .kk__notiz, .call-raum, .code-kasten { position: relative; box-shadow: inset 0 1px 0 rgba(255, 255, 255, .06), 0 8px 22px -16px rgba(0, 0, 0, .9); } .leer-hinweis::after, .call-raum::after, .code-kasten::after { content: ""; position: absolute; top: 0; left: 18%; right: 18%; height: 1px; background: linear-gradient(90deg, transparent, color-mix(in srgb, var(--ton, var(--akzent)) 70%, #fff), transparent); opacity: .5; pointer-events: none; } /* ---------- 5. Überschriften: Gewicht statt Größe ---------------------- */ /* Ein sehr weicher dunkler Schatten unter der Schrift. Er ändert die Farbe nicht (die Kontrastprüfung misst weiter dasselbe), gibt der Zeile aber eine Kante gegen den Hintergrund -- Text auf einem Foto wirkt dadurch aufgelegt statt hineingemischt. */ .titel, .gruppe__name, .stufe__titel, .kk__name, h1, h2 { text-shadow: 0 1px 2px rgba(0, 0, 0, .55); } /* Die kleinen Schilder darüber: mehr Abstand zwischen den Buchstaben, damit sie als Beschriftung gelesen werden und nicht als Wort. */ .feldschild, .kk__schild, .gruppe__unter { text-shadow: 0 1px 1px rgba(0, 0, 0, .4); } @media (prefers-reduced-motion: reduce) { .knopf:active, .knopf-still:active, .schritt:active, .abmelden:active, .stufe-knopf:active { transform: none; } } @media (forced-colors: active) { /* Im Kontrastmodus trägt allein die Kante. Schatten und Lichtsäume würden dort zu grauen Flecken. */ .knopf, .knopf-still, .schritt, .abmelden, .stufe-knopf, .marke, .marke-rolle, .leer-hinweis, .hinweis, .code-kasten, .neu input, .neu select, .neu textarea, .wahl2__knopf { box-shadow: none; } .leer-hinweis::after, .call-raum::after, .code-kasten::after { display: none; } .titel, .gruppe__name, h1, h2, .feldschild { text-shadow: none; } } /* ===================================================================== DIE KARTE SITZT IN DER TAFEL (06.09.2026) Wunsch Filipe: "integriere die zugangskachel links nach rechts und passe sie perfekt an damit sie in dem neuen bild rechts perfekt und die vorgemachte kachel passt." Im neuen Motiv steht rechts eine leere Tafel mit Neonrahmen. Die Anmeldekarte gehoert dort hinein -- und "hinein" heisst hier wirklich hinein, nicht ungefaehr in die Gegend. --------------------------------------------------------------------- DAS PROBLEM, DAS MAN LEICHT UEBERSIEHT Das Bild liegt mit `object-fit: cover` unter der Seite. Je nach Fensterform schneidet der Browser oben und unten etwas ab -- oder links und rechts. Ein Wert wie `left: 58 %` bezieht sich aber auf das FENSTER, nicht auf das Bild. Sobald jemand das Fenster schmaler zieht, wandert die gemalte Tafel unter der Karte weg, und die Karte steht daneben. Auf genau einer Bildschirmgroesse saehe es perfekt aus und ueberall sonst falsch. Deshalb rechnet `.tafel-anker` die Cover-Geometrie noch einmal nach: Breite = max(100vw, 100svh * Bildseitenverhaeltnis) Hoehe = max(100svh, 100vw / Bildseitenverhaeltnis) Das ist exakt die Formel, nach der auch der Browser das Bild aufzieht. Der Anker ist damit deckungsgleich mit dem Bild -- und Prozentwerte darin sind Prozent DES BILDES. --------------------------------------------------------------------- DIE VIER ZAHLEN SIND GEMESSEN, NICHT GESCHAETZT tools/gate-bauen.mjs sucht den Rahmen im Quellbild: vom Mittelpunkt der Tafel nach aussen, bis es hell oder farbig wird. Zwei fruehere Anlaeufe standen daneben und haben sich selbst verraten -- der erste fand den Mond und die Spiegelungen, der zweite die halbe Bildhoehe, weil oberhalb der Tafel alles genauso schwarz ist. Die Begruendung steht dort im Quelltext. Wer das Bild austauscht, laesst das Werkzeug neu laufen und traegt die vier Zeilen hier ein. Sie stehen bewusst als eigene Groessen und nicht verstreut in den Regeln: So ist es EIN Handgriff. ===================================================================== */ body.gate { --gate-b: 1647; /* Masse des Quellbildes */ --gate-h: 955; /* Gemessen von tools/gate-bauen.mjs, danach EINMAL nachjustiert -- und der Grund gehoert dazu, sonst sieht es nach Willkuer aus: Die Suche laeuft vom Tafelinneren nach aussen und haelt beim ersten farbigen Punkt an. Der linke Rand des Rahmens glueht im Motiv aber viel breiter als der rechte (rot gegen duennes Blau) -- sie haelt links also frueher an. Im Bildschirmfoto bei 1280 px waren es links 44 px Luft und rechts 12: die Karte sass 16 px zu weit rechts, und genau so sah sie auch aus. Korrigiert um 1,1 % nach links und 0,7 % nach unten, danach im Bildschirmfoto bei 1280, 1440 und 1920 nachgesehen. Die Rohwerte der Messung stehen daneben, damit man den Unterschied sieht. gemessen hier */ /* 07.09.2026 -- Wunsch Filipe: "so dass der komplette von der kachel vom hintergrund bild komplett bedeckt ist." Bis hierher sass die Karte MIT ABSTAND in der Tafel: Der gemalte Rahmen blieb rundum sichtbar, und dazwischen schimmerte die leere schwarze Flaeche durch. Das sah aus wie ein Bild in einem Rahmen -- zwei Dinge. Gewollt ist EINS: Die Karte IST die Tafel, ihr Rand liegt genau auf der Innenkante des Neonrahmens. Deshalb wird jetzt bis an die Kante gegangen, plus einen halben Prozentpunkt darueber hinaus: Der Rahmen ist im Bild weich (er glueht), und eine Karte, die genau an der Messkante endet, laesst dort einen dunklen Saum stehen. Ein halber Prozentpunkt Ueberlappung schiebt ihre Kante unter das Glühen -- man sieht nur noch Rahmen und Karte, nichts dazwischen. */ --tafel-links: 57.00%; --tafel-oben: 13.00%; --tafel-breite: 36.60%; --tafel-hoehe: 63.70%; } /* Vorgabe: Der Anker tut nichts. Er wird erst dort zur Schablone, wo die Tafel im Bild auch wirklich zu sehen ist (siehe unten). So bleibt das bisherige Verhalten auf schmalen Geraeten unangetastet. */ .tafel-anker { display: contents; } /* --------------------------------------------------------------------- NUR WO DIE TAFEL AUCH HINPASST. Drei Bedingungen, jede mit Grund: min-width 1100px darunter ist die Tafel im Ausschnitt zu schmal min-height 620px darunter muesste die Karte unter 12 px schrumpfen min-aspect 7/5 bei hohen Fenstern schneidet cover die Tafel an Trifft eine nicht zu, gilt weiter die alte Anordnung (Karte unten mittig, Hochformat-Motiv). Lieber eine ehrliche zweite Anordnung als eine erzwungene erste, die niemand mehr lesen kann. --------------------------------------------------------------------- */ @media (min-width: 1100px) and (min-height: 620px) and (min-aspect-ratio: 7/5) { body.gate { align-items: flex-start; } .tafel-anker { display: block; position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%); width: max(100vw, calc(100svh * var(--gate-b) / var(--gate-h))); height: max(100svh, calc(100vw * var(--gate-h) / var(--gate-b))); /* WORTGLEICH die Verwandlung des Bildes -- sonst liegt der Anker um drei Prozent daneben, und genau das war beim ersten Versuch der Fall: Der Rahmen war 1978 px breit, der Anker 1920. */ transform: translate(-50%, -50%) scale(1.03) translate3d(var(--parallax-x, 0px), var(--parallax-y, 0px), 0); z-index: 1; /* Der Anker selbst ist nur eine Schablone -- Klicks gehen durch ihn hindurch, sonst laege eine unsichtbare Flaeche ueber dem ganzen Bild. */ pointer-events: none; /* Damit die Karte ihre Schriftgroesse an der HOEHE der Tafel ausrichten kann (cqh weiter unten). */ container-type: size; } .tafel { position: absolute; pointer-events: auto; left: var(--tafel-links); width: var(--tafel-breite); /* DIE KARTE IST DIE TAFEL, nicht ein Kaestchen darin. Sie nimmt deren Rechteck ein und zentriert ihren Inhalt darin. Der erste Versuch setzte `top: Mitte` und `translateY(-50%)` -- und die Karte hing 300 px unter dem Bildschirmrand. Grund: Auf `.tafel` liegt die Einblend-Animation `auftauchen`, deren Endbild `transform: none` ist. Eine Animation mit `both` gewinnt gegen die Regel; mein translateY war damit wirkungslos. Zwei Wege, dasselbe Element zu verschieben, vertragen sich nicht -- also gar keine Verschiebung, sondern ein Kasten mit Hoehe. */ top: var(--tafel-oben); height: var(--tafel-hoehe); display: flex; flex-direction: column; justify-content: center; margin: 0; /* ALLES SKALIERT MIT DER TAFEL. 1 cqh ist ein Prozent der Ankerhoehe -- also des BILDES. Wird das Fenster kleiner, wird die Tafel kleiner, und die Karte darin genauso. Nach unten bei 12 px abgefangen: Darunter ist es keine Anmeldemaske mehr, sondern ein Bild von einer. */ /* 1,50 statt 1,59: Bei 1280x800 ist die Tafel 512 px hoch, der Karteninhalt bei 1,59 aber 536 -- gemessen, nicht geschaetzt. 24 px Ueberstand sieht man an einem Neonrahmen sofort. */ font-size: clamp(12px, 1.50cqh, 16px); padding: 1.75em 1.6em 1.4em; /* Die Tafel im Bild ist schon dunkel und hat ihren eigenen Rahmen. Die Karte legt sich deshalb NUR noch als leichter Schleier darueber, statt einen zweiten Kasten mit zweitem Rand zu bauen -- zwei Rahmen ineinander saehen nach Versehen aus. */ background: rgba(6, 9, 16, .58); border-color: rgba(150, 186, 220, .10); box-shadow: none; backdrop-filter: blur(9px) saturate(112%); -webkit-backdrop-filter: blur(9px) saturate(112%); } /* Die Lichtkante entfaellt -- der Neonrahmen des Bildes macht das bereits, und zwar besser. */ .tafel__kante { display: none; } /* ---- Alles Innere in em, damit es mitskaliert ---------------------- Die Karte traegt eine eigene Schriftgroesse; rem wuerde sich weiterhin am Dokument orientieren und die Abstaende blieben stehen, waehrend die Schrift schrumpft. Genau daran erkennt man eine schlecht skalierte Oberflaeche. */ .tafel .marke { font-size: .74em; margin-bottom: .5em; } .tafel .titel { font-size: 1.85em; margin-bottom: .3em; } .tafel .unterzeile { font-size: .92em; margin-bottom: 1.15em; } .tafel .feldschild { font-size: .76em; margin-bottom: .6em; } .tafel .rollen { margin-bottom: 1.1em; } .tafel .rolle { padding: .62em .85em; margin-bottom: .42em; gap: .8em; } .tafel .rolle__zeichen { width: 1.32em; height: 1.32em; } .tafel .rolle__name { font-size: .94em; } .tafel .rolle__zusatz { font-size: .79em; } .tafel #code { padding: .72em 2.7em .72em .9em; } .tafel .feld__auge { width: 2.2em; height: 2.2em; padding: .5em; right: .35em; } .tafel .knopf { margin-top: .75em; padding: .7em 1.1em; font-size: .88em; width: 100%; } .tafel .hinweis, .tafel .fehler { font-size: .82em; margin-top: .5em; } .tafel .fuss { margin-top: 1.1em; padding-top: .8em; font-size: .76em; } /* ---- Der Schleier ------------------------------------------------ Er verlief bisher von links dunkel nach rechts klar -- dort stand die Karte. Jetzt ist es andersherum, und beide Seiten haben eine Aufgabe: links das Logo (soll leuchten), rechts die Tafel (soll ruhig sein). Also nur noch ein sanftes Abdunkeln ueber allem, etwas mehr auf der rechten Haelfte, und ein Hauch Vignette. Kein harter Verlauf mehr -- der haette quer durch das Motiv geschnitten. */ .buehne__schleier { background: linear-gradient(96deg, rgba(3, 5, 10, 0.30) 0%, rgba(3, 5, 10, 0.20) 30%, rgba(3, 5, 10, 0.16) 48%, rgba(3, 5, 10, 0.26) 66%, rgba(3, 5, 10, 0.34) 100%), radial-gradient(130% 100% at 50% 120%, rgba(0, 0, 0, .34), transparent 62%); } /* Das Motiv darf heller bleiben: Die Karte bringt jetzt ihren eigenen Untergrund mit, und das Bild ist der Grund, warum die Seite gut aussieht. */ .buehne__bild { filter: saturate(1) brightness(.97); } } /* Sehr breite Schirme: Die Tafel waechst mit dem Bild, die Schrift ist aber bei 16 px gedeckelt. Damit die Karte darin nicht verloren wirkt, bekommt sie dort etwas mehr Innenabstand. */ @media (min-width: 1700px) and (min-height: 900px) { .tafel { padding: 2.2em 2em 1.8em; } } /* Dieselbe Koernung wie auf der Startseite -- sie steht dort in start.css, und die Anmeldeseite laedt start.css nicht. Ein SVG- Filter als Adresse: keine Datei, keine zusaetzliche Anfrage. */ :root { --koernung: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='r'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23r)' opacity='0.55'/%3E%3C/svg%3E"); } /* ===================================================================== DIE KARTE ALS BILDSCHIRM IM RAHMEN (07.09.2026) Wunsch Filipe: "veränder auch die kachel. mach sie viel geiler und viel krasser. mit allen infos die da sind aber mach sie richtig hoch profissionel, hochwertig und ultra geil aber so dass der komplette von der kachel vom hintergrund bild komplett bedeckt ist." --------------------------------------------------------------------- DIE IDEE Im Motiv steht ein leerer Rahmen mit Neonkante -- rot oben links, blau unten rechts. Bisher lag darin eine Karte mit eigenem Rand: zwei Rahmen ineinander, und dazwischen schwarze Leere. Das liest sich als "Bild an einer Wand". Gewollt ist ein GERÄT: Der Rahmen im Bild ist das Gehäuse, die Karte ist der eingeschaltete Bildschirm darin. Ein Bildschirm hat drei Eigenschaften, die ein Kasten nicht hat, und alle drei sind hier gebaut: 1. ER LEUCHTET VON INNEN. Nicht gleichmäßig -- oben mehr, weil dort die Anzeige beginnt. Ein schwacher Schein in der Rahmenfarbe kriecht von den Kanten herein, so wie Licht aus einem Panel in sein Gehäuse fällt. 2. ER HAT EINE SCHEIBE. Über allem liegt eine sehr schwache, diagonale Spiegelung -- die Glasscheibe davor. Sie ist der Unterschied zwischen "Fläche mit Farbe" und "etwas hinter Glas". 3. ER HAT STRUKTUR. Dieselbe Körnung wie die Kacheln der Startseite (siehe start.css). Ohne sie bleibt jeder Verlauf zu glatt für eine echte Oberfläche. Die Rollen-Knöpfe werden dabei zu TASTEN: Materialstärke oben hell, unten dunkel, beim Drücken sinken sie ein. Die gewählte Taste ist nicht nur eingefärbt, sondern beleuchtet -- sie hat einen Lichtrand nach innen, als läge eine Diode darunter. --------------------------------------------------------------------- WAS DABEI NICHT VERLOREN GEHT Alle Angaben bleiben, wie sie waren: die vier Rollen mit ihren Beschreibungen, das Codefeld mit dem Auge, der Hinweis, welche Rolle gewählt ist, und die Fußzeile zur Verschlüsselung. "Hochwertiger" heißt hier nicht "weniger drin" -- eine Anmeldemaske, die etwas verschweigt, ist keine bessere, sondern eine unvollständige. ===================================================================== */ @media (min-width: 1100px) and (min-height: 620px) and (min-aspect-ratio: 7/5) { .tafel { /* KEIN EIGENER RAHMEN MEHR. Das Gehäuse ist im Bild; ein zweiter Rand daneben wäre genau der Doppelrahmen, der weg soll. Was bleibt, ist eine hauchfeine Innenkante -- die Fuge zwischen Scheibe und Gehäuse. */ border: 0; border-radius: 22px; background: /* Der Schein von den Kanten herein, in den Farben des Rahmens: rot oben links, blau unten rechts. Er ist das, was die Karte mit dem Bild verbindet, statt sie davorzusetzen. */ radial-gradient(120% 90% at 4% 0%, rgba(224, 66, 66, .13), transparent 58%), radial-gradient(120% 90% at 98% 100%, rgba(58, 150, 235, .15), transparent 60%), /* Die Anzeige selbst: oben eine Spur heller. */ linear-gradient(178deg, rgba(14, 20, 32, .80), rgba(6, 9, 16, .88) 62%); backdrop-filter: blur(26px) saturate(128%); -webkit-backdrop-filter: blur(26px) saturate(128%); box-shadow: /* Die Fuge: innen ein feiner heller Strich oben, dunkel unten. */ inset 0 1px 0 rgba(255, 255, 255, .09), inset 0 -1px 0 rgba(0, 0, 0, .5), /* Und ein sehr weicher Schein nach innen, damit die Kante nicht hart abbricht, sondern ins Gehäuse übergeht. */ inset 0 0 44px -18px rgba(0, 0, 0, .9); overflow: hidden; } /* DIE SCHEIBE. Ein einziger, sehr weicher Streifen von links oben -- kaum zu sehen, aber ohne ihn wirkt die Fläche wie Papier. */ .tafel::after { content: ""; position: absolute; inset: 0; z-index: 0; pointer-events: none; border-radius: inherit; background: linear-gradient(122deg, rgba(255, 255, 255, .07) 0%, rgba(255, 255, 255, .018) 14%, rgba(255, 255, 255, 0) 32%), var(--koernung); background-size: auto, 140px 140px; opacity: .9; } /* Der Inhalt liegt über der Scheibe -- Schrift durch eine Spiegelung zu lesen wäre anstrengend. */ .tafel > * { position: relative; z-index: 1; } /* ---- Die Rollen als Tasten ---------------------------------------- */ .tafel .rolle { background: linear-gradient(180deg, rgba(255, 255, 255, .055), rgba(255, 255, 255, .012)); border: 1px solid rgba(150, 186, 220, .13); border-radius: 13px; box-shadow: inset 0 1px 0 rgba(255, 255, 255, .09), inset 0 -1px 0 rgba(0, 0, 0, .38), 0 1px 2px rgba(0, 0, 0, .35); transition: border-color var(--tempo), background var(--tempo), box-shadow var(--tempo), transform .09s ease; } .tafel .rolle:hover { background: linear-gradient(180deg, rgba(255, 255, 255, .085), rgba(255, 255, 255, .022)); border-color: rgba(150, 186, 220, .24); } /* Beim Drücken sinkt die Taste ein: Der Schatten unter ihr verschwindet, der innere kommt von oben. Genau das macht ein echter Knopf. */ .tafel .rolle:active { transform: translateY(1px); box-shadow: inset 0 2px 4px rgba(0, 0, 0, .5); } /* DIE GEWÄHLTE TASTE IST BELEUCHTET, nicht nur eingefärbt. Der Lichtrand nach innen liest sich wie eine Diode darunter -- und er sagt deutlicher als jede Farbe, welche gerade aktiv ist. */ .tafel .rolle[aria-checked="true"] { background: linear-gradient(180deg, color-mix(in srgb, var(--akzent) 22%, transparent), color-mix(in srgb, var(--violett) 13%, transparent)); border-color: color-mix(in srgb, var(--akzent) 62%, transparent); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .16), inset 0 0 20px -8px color-mix(in srgb, var(--akzent) 90%, transparent), 0 0 20px -10px color-mix(in srgb, var(--akzent) 75%, transparent); } /* ---- Das Codefeld: eine eingelassene Rinne ------------------------- */ .tafel #code { background: rgba(0, 0, 0, .34); border-color: rgba(150, 186, 220, .14); border-radius: 12px; /* Eingelassen statt aufgesetzt: Schatten von oben INNEN. Das ist dasselbe Licht wie überall, nur eine Vertiefung statt einer Erhebung -- und deshalb erkennt man sofort, dass man hier hineinschreibt. */ box-shadow: inset 0 2px 5px -2px rgba(0, 0, 0, .7), inset 0 -1px 0 rgba(255, 255, 255, .05); } .tafel #code:focus { background: rgba(0, 0, 0, .28); box-shadow: inset 0 2px 5px -2px rgba(0, 0, 0, .7), 0 0 0 3px color-mix(in srgb, var(--akzent) 22%, transparent); } /* ---- Der Anmelde-Knopf: die Haupttaste ----------------------------- */ .tafel .knopf { border-radius: 12px; box-shadow: inset 0 1px 0 rgba(255, 255, 255, .14), inset 0 -1px 0 rgba(0, 0, 0, .35), 0 6px 18px -10px color-mix(in srgb, var(--akzent) 85%, transparent); } .tafel .knopf:active { transform: translateY(1px); } /* ---- Der Kopf bekommt Luft nach unten ------------------------------ */ /* Eine feine Trennlinie unter dem Titel: Sie gliedert die Karte in "wer sind wir" und "was tust du hier", ohne ein Wort dafür zu brauchen. */ .tafel .unterzeile { padding-bottom: 1em; border-bottom: 1px solid rgba(150, 186, 220, .10); margin-bottom: 1.1em; } @media (prefers-reduced-motion: reduce) { .tafel .rolle:active, .tafel .knopf:active { transform: none; } } } /* Auf schmalen Geräten liegt die Karte VOR dem Bild statt darin -- dort bleibt der eigene Rahmen richtig, denn es gibt kein Gehäuse, in das sie sich einfügen könnte. Nur Körnung und Tastenwirkung übernimmt sie: Die gehören zum Material, nicht zur Anordnung. */ @media (max-width: 1099px), (max-height: 619px), (max-aspect-ratio: 7/5) { .tafel .rolle:active { transform: translateY(1px); } .tafel .rolle[aria-checked="true"] { box-shadow: inset 0 1px 0 rgba(255, 255, 255, .14), inset 0 0 18px -8px color-mix(in srgb, var(--akzent) 85%, transparent); } }